返回 CodeWhale
tokens.rs
根目录 / crates / palette / src / tokens.rs
1 //! Color token constants — RGB tuples and semantic `Color` roles.
2
3 use ratatui::style::Color;
4
5 // Codewhale Whale palette. Semantic colors own state, never decoration alone.
6 pub const WHALE_BG_RGB: (u8, u8, u8) = (7, 12, 29); // #070C1D Ink field
7 pub const WHALE_CHROME_RGB: (u8, u8, u8) = (12, 21, 49); // #0C1531 Navy chrome
8 pub const WHALE_PANEL_RGB: (u8, u8, u8) = (16, 28, 64); // #101C40 Panel surface
9 pub const WHALE_COMPOSER_RGB: (u8, u8, u8) = (20, 35, 82); // #142352 Stage plate (brand navy)
10 pub const WHALE_ELEVATED_RGB: (u8, u8, u8) = (26, 44, 99); // #1A2C63 Raised
11 pub const WHALE_SELECTION_RGB: (u8, u8, u8) = (35, 45, 65); // #232D41 Quiet selection surface
12 pub const WHALE_TEXT_BODY_RGB: (u8, u8, u8) = (246, 242, 232); // #F6F2E8 Whale Ivory
13 pub const WHALE_TEXT_SOFT_RGB: (u8, u8, u8) = (182, 192, 212); // #B6C0D4
14 pub const WHALE_TEXT_MUTED_RGB: (u8, u8, u8) = (147, 160, 184); // #93A0B8
15 pub const WHALE_TEXT_HINT_RGB: (u8, u8, u8) = (138, 153, 179); // #8A99B3 — AA hint on the ink field
16 /// Blue Stage grammar: the interaction blue is the primary accent and the
17 /// Info ink; it has exactly one name. Signal Gold is reserved for the whale
18 /// mark and human-attention roles ([`WHALE_HUMAN_RGB`]), never for general
19 /// interaction.
20 pub const WHALE_ACTION_RGB: (u8, u8, u8) = (106, 166, 220); // #6AA6DC Ombre sky — owns interaction on dark
21 // No TUI consumer yet; the web reads these through scripts/export-design-tokens.py
22 // (`--whale-cobalt`, `--whale-ice`), so they are not dead.
23 pub const WHALE_COBALT_RGB: (u8, u8, u8) = (21, 53, 178); // #1535B2 Ombre cobalt — light-mode action
24 pub const WHALE_ICE_RGB: (u8, u8, u8) = (221, 238, 249); // #DDEEF9 Ice — structure on dark
25 pub const WHALE_CYAN_RGB: (u8, u8, u8) = (120, 188, 232); // #78BCE8 Cyan — bounded accents only
26 pub const WHALE_ACCENT_SECONDARY_RGB: (u8, u8, u8) = (79, 209, 197); // #4FD1C5 Seafoam
27 // Whale Teams (Signal Cut, CWC 2026-08-15) identity accents. These two brand
28 // palette entries have no semantic role in the TUI; they exist only so the
29 // Harbor and Echo whale marks carry their exact CWC accent instead of a
30 // borrowed state color. Never use them for status, mode, or permission.
31 pub const WHALE_BRAND_ORANGE_RGB: (u8, u8, u8) = (255, 138, 61); // #FF8A3D Harbor mooring loop
32 pub const WHALE_BRAND_MAGENTA_RGB: (u8, u8, u8) = (240, 78, 184); // #F04EB8 Echo sonar ticks
33 pub const WHALE_HUMAN_RGB: (u8, u8, u8) = (246, 196, 83); // #F6C453 Signal Gold
34 pub const WHALE_WORKING_GREEN_RGB: (u8, u8, u8) = (155, 214, 111); // #9BD66F Working Green
35 pub const WHALE_ERROR_RGB: (u8, u8, u8) = (255, 134, 178); // #FF86B2 Rose danger
36 pub const WHALE_ERROR_HOVER_RGB: (u8, u8, u8) = (255, 156, 194); // #FF9CC2
37 pub const WHALE_ERROR_SURFACE_RGB: (u8, u8, u8) = (43, 21, 34); // #2B1522
38 pub const WHALE_ERROR_BORDER_RGB: (u8, u8, u8) = WHALE_ERROR_RGB;
39 pub const WHALE_ERROR_TEXT_RGB: (u8, u8, u8) = (255, 219, 232); // #FFDBE8
40 pub const WHALE_WARNING_RGB: (u8, u8, u8) = (255, 122, 89); // #FF7A59 Coral warning
41 pub const WHALE_SUCCESS_RGB: (u8, u8, u8) = WHALE_WORKING_GREEN_RGB; // completed / verified
42 pub const WHALE_BORDER_RGB: (u8, u8, u8) = (42, 63, 114); // #2A3F72, sky at 25% on stage
43 pub const WHALE_REASONING_TEXT_RGB: (u8, u8, u8) = (224, 153, 72); // #E09948
44 pub const WHALE_REASONING_SURFACE_RGB: (u8, u8, u8) = (42, 34, 24); // #2A2218
45 pub const WHALE_REASONING_TINT_RGB: (u8, u8, u8) = (22, 36, 74); // #16244A
46
47 // Solarized Light palette RGB tuples
48 pub const SOLARIZED_BASE03_RGB: (u8, u8, u8) = (0x00, 0x2B, 0x36);
49 pub const SOLARIZED_BASE02_RGB: (u8, u8, u8) = (0x07, 0x36, 0x42);
50 pub const SOLARIZED_BASE01_RGB: (u8, u8, u8) = (0x52, 0x66, 0x6D); // lifted for 4.5:1 muted text
51 pub const SOLARIZED_BASE00_RGB: (u8, u8, u8) = (0x65, 0x7B, 0x83);
52 pub const SOLARIZED_BASE0_RGB: (u8, u8, u8) = (0x72, 0x81, 0x82); // lifted for 3:1 hint text
53 pub const SOLARIZED_BASE1_RGB: (u8, u8, u8) = (0x93, 0xA1, 0xA1);
54 pub const SOLARIZED_BASE2_RGB: (u8, u8, u8) = (0xEE, 0xE8, 0xD5);
55 pub const SOLARIZED_BASE3_RGB: (u8, u8, u8) = (0xFD, 0xF6, 0xE3);
56 pub const SOLARIZED_YELLOW_RGB: (u8, u8, u8) = (0xB4, 0x88, 0x00); // lifted for 3:1 on ivory
57 pub const SOLARIZED_ORANGE_RGB: (u8, u8, u8) = (0xCB, 0x4B, 0x16);
58 pub const SOLARIZED_RED_RGB: (u8, u8, u8) = (0xDC, 0x32, 0x2F);
59 pub const SOLARIZED_BLUE_RGB: (u8, u8, u8) = (0x26, 0x8B, 0xD2);
60 pub const SOLARIZED_CYAN_RGB: (u8, u8, u8) = (0x29, 0x9E, 0x96); // lifted for 3:1 on ivory
61 pub const SOLARIZED_GREEN_RGB: (u8, u8, u8) = (0x7F, 0x92, 0x00); // lifted for 3:1 on ivory/diff bg
62 pub const SOLARIZED_PANEL_RGB: (u8, u8, u8) = (0xF0, 0xED, 0xE7);
63 pub const SOLARIZED_ELEVATED_RGB: (u8, u8, u8) = (0xE4, 0xDF, 0xCF);
64 pub const SOLARIZED_SELECT_RGB: (u8, u8, u8) = (0xD6, 0xD2, 0xC9);
65
66 pub const WHALE_DIFF_ADDED_RGB: (u8, u8, u8) = (87, 199, 133); // #57C785
67 pub const WHALE_DIFF_ADDED_BG_RGB: (u8, u8, u8) = (18, 42, 34); // #122A22
68 // Raw colors that are remapped by equality must remain distinct across roles.
69 // These stay in the same perceptual families as action, danger, and human asks
70 // while preserving mode identity for Terminal and community themes.
71 pub const WHALE_DIFF_DELETED_BG_RGB: (u8, u8, u8) = (52, 24, 39); // #341827
72 pub const WHALE_MODE_AGENT_RGB: (u8, u8, u8) = (126, 180, 232); // #7EB4E8
73 pub const WHALE_MODE_YOLO_RGB: (u8, u8, u8) = (255, 112, 160); // #FF70A0
74 pub const WHALE_MODE_PLAN_RGB: (u8, u8, u8) = (185, 220, 236); // #B9DCEC Structural Ice
75 pub const WHALE_MODE_OPERATE_RGB: (u8, u8, u8) = (173, 136, 255); // #AD88FF
76 pub const WHALE_TOOL_LIVE_RGB: (u8, u8, u8) = WHALE_ACCENT_SECONDARY_RGB;
77 pub const WHALE_TOOL_ISSUE_RGB: (u8, u8, u8) = WHALE_ERROR_RGB;
78 pub const WHALE_TOOL_OUTPUT_RGB: (u8, u8, u8) = WHALE_TEXT_SOFT_RGB;
79 pub const WHALE_TOOL_SURFACE_RGB: (u8, u8, u8) = (15, 26, 58); // #0F1A3A
80 pub const WHALE_TOOL_ACTIVE_RGB: (u8, u8, u8) = (24, 44, 94); // #182C5E
81
82 pub const LIGHT_SURFACE_RGB: (u8, u8, u8) = (244, 247, 251); // #F4F7FB
83 pub const LIGHT_PANEL_RGB: (u8, u8, u8) = (255, 253, 248); // #FFFDF8
84 pub const LIGHT_ELEVATED_RGB: (u8, u8, u8) = (232, 238, 248); // #E8EEF8
85 pub const LIGHT_REASONING_RGB: (u8, u8, u8) = (255, 246, 214); // #FFF6D6
86 pub const LIGHT_SUCCESS_RGB: (u8, u8, u8) = (223, 247, 231); // #DFF7E7
87 pub const LIGHT_SUCCESS_FG_RGB: (u8, u8, u8) = (20, 118, 61); // #14763D, readable on every light surface
88 pub const LIGHT_ERROR_RGB: (u8, u8, u8) = (252, 235, 242); // #FCEBF2
89 pub const LIGHT_TEXT_BODY_RGB: (u8, u8, u8) = (20, 33, 58); // #14213A
90 pub const LIGHT_TEXT_MUTED_RGB: (u8, u8, u8) = (91, 103, 128); // #5B6780
91 pub const LIGHT_TEXT_HINT_RGB: (u8, u8, u8) = (95, 107, 129); // #5F6B81
92 pub const LIGHT_TEXT_SOFT_RGB: (u8, u8, u8) = (69, 81, 104); // #455168
93 pub const LIGHT_ACTION_RGB: (u8, u8, u8) = (21, 53, 178); // #1535B2 Ombre cobalt
94 pub const LIGHT_LIVE_RGB: (u8, u8, u8) = (8, 118, 109); // #08766D
95 pub const LIGHT_HUMAN_RGB: (u8, u8, u8) = (122, 85, 0); // #7A5500
96 pub const LIGHT_WARNING_RGB: (u8, u8, u8) = (169, 71, 36); // #A94724
97 pub const LIGHT_DANGER_RGB: (u8, u8, u8) = (180, 35, 90); // #B4235A
98 // Mode shades stay in their parent semantic families while remaining distinct
99 // inputs to the render backend. A `Cell` carries only a `Color`, so reusing the
100 // exact action/human/danger value here would erase the mode role before ANSI
101 // adaptation can preserve it.
102 pub const LIGHT_MODE_AGENT_RGB: (u8, u8, u8) = (22, 54, 178); // #1636B2
103 pub const LIGHT_MODE_YOLO_RGB: (u8, u8, u8) = (181, 35, 90); // #B5235A
104 pub const LIGHT_MODE_PLAN_RGB: (u8, u8, u8) = (52, 92, 128); // #345C80 Structural steel-blue
105 pub const LIGHT_OPERATE_RGB: (u8, u8, u8) = (112, 71, 184); // #7047B8
106
107 // Solarized Light palette colors
108 pub const SOLARIZED_TEXT_DIM: Color = Color::Rgb(
109 SOLARIZED_BASE00_RGB.0,
110 SOLARIZED_BASE00_RGB.1,
111 SOLARIZED_BASE00_RGB.2,
112 );
113 pub const SOLARIZED_TEXT_HINT: Color = Color::Rgb(
114 SOLARIZED_BASE0_RGB.0,
115 SOLARIZED_BASE0_RGB.1,
116 SOLARIZED_BASE0_RGB.2,
117 );
118 pub const SOLARIZED_TEXT_MUTED: Color = Color::Rgb(
119 SOLARIZED_BASE01_RGB.0,
120 SOLARIZED_BASE01_RGB.1,
121 SOLARIZED_BASE01_RGB.2,
122 );
123 pub const SOLARIZED_TEXT_BODY: Color = Color::Rgb(
124 SOLARIZED_BASE03_RGB.0,
125 SOLARIZED_BASE03_RGB.1,
126 SOLARIZED_BASE03_RGB.2,
127 );
128 pub const SOLARIZED_TEXT_SOFT: Color = Color::Rgb(
129 SOLARIZED_BASE02_RGB.0,
130 SOLARIZED_BASE02_RGB.1,
131 SOLARIZED_BASE02_RGB.2,
132 );
133 pub const SOLARIZED_BORDER: Color = Color::Rgb(
134 SOLARIZED_BASE1_RGB.0,
135 SOLARIZED_BASE1_RGB.1,
136 SOLARIZED_BASE1_RGB.2,
137 );
138 pub const SOLARIZED_BLUE: Color = Color::Rgb(
139 SOLARIZED_BLUE_RGB.0,
140 SOLARIZED_BLUE_RGB.1,
141 SOLARIZED_BLUE_RGB.2,
142 );
143 pub const SOLARIZED_CYAN: Color = Color::Rgb(
144 SOLARIZED_CYAN_RGB.0,
145 SOLARIZED_CYAN_RGB.1,
146 SOLARIZED_CYAN_RGB.2,
147 );
148 pub const SOLARIZED_RED: Color = Color::Rgb(
149 SOLARIZED_RED_RGB.0,
150 SOLARIZED_RED_RGB.1,
151 SOLARIZED_RED_RGB.2,
152 );
153 pub const SOLARIZED_ORANGE: Color = Color::Rgb(
154 SOLARIZED_ORANGE_RGB.0,
155 SOLARIZED_ORANGE_RGB.1,
156 SOLARIZED_ORANGE_RGB.2,
157 );
158 pub const SOLARIZED_YELLOW: Color = Color::Rgb(
159 SOLARIZED_YELLOW_RGB.0,
160 SOLARIZED_YELLOW_RGB.1,
161 SOLARIZED_YELLOW_RGB.2,
162 );
163 pub const SOLARIZED_GREEN: Color = Color::Rgb(
164 SOLARIZED_GREEN_RGB.0,
165 SOLARIZED_GREEN_RGB.1,
166 SOLARIZED_GREEN_RGB.2,
167 );
168 pub const SOLARIZED_SURFACE: Color = Color::Rgb(
169 SOLARIZED_BASE3_RGB.0,
170 SOLARIZED_BASE3_RGB.1,
171 SOLARIZED_BASE3_RGB.2,
172 );
173 pub const SOLARIZED_PANEL: Color = Color::Rgb(
174 SOLARIZED_PANEL_RGB.0,
175 SOLARIZED_PANEL_RGB.1,
176 SOLARIZED_PANEL_RGB.2,
177 );
178 pub const SOLARIZED_ELEVATED: Color = Color::Rgb(
179 SOLARIZED_ELEVATED_RGB.0,
180 SOLARIZED_ELEVATED_RGB.1,
181 SOLARIZED_ELEVATED_RGB.2,
182 );
183 pub const SOLARIZED_SELECT_BG: Color = Color::Rgb(
184 SOLARIZED_SELECT_RGB.0,
185 SOLARIZED_SELECT_RGB.1,
186 SOLARIZED_SELECT_RGB.2,
187 );
188 pub const SOLARIZED_DIFF_ADDED_BG: Color = Color::Rgb(0xEA, 0xF2, 0xE0);
189 pub const SOLARIZED_ERROR_SURFACE: Color = Color::Rgb(0xFD, 0xEE, 0xEB);
190 /// Same tone as the error surface; kept as a distinct alias for diff context.
191 pub const SOLARIZED_DIFF_DELETED_BG: Color = SOLARIZED_ERROR_SURFACE;
192 pub const SOLARIZED_ERROR_TEXT: Color = Color::Rgb(0x8B, 0x00, 0x00);
193 pub const SOLARIZED_ERROR_HOVER: Color = Color::Rgb(0xE0, 0x55, 0x52);
194 pub const SOLARIZED_COMPOSER: Color = Color::Rgb(
195 SOLARIZED_PANEL_RGB.0,
196 SOLARIZED_PANEL_RGB.1,
197 SOLARIZED_PANEL_RGB.2,
198 );
199
200 pub const LIGHT_BORDER_RGB: (u8, u8, u8) = (169, 184, 207); // #A9B8CF
201 pub const LIGHT_SELECTION_RGB: (u8, u8, u8) = (238, 246, 255); // #EEF6FF
202 pub const GRAYSCALE_SURFACE_RGB: (u8, u8, u8) = (10, 10, 10); // #0A0A0A
203 pub const GRAYSCALE_PANEL_RGB: (u8, u8, u8) = (18, 18, 18); // #121212
204 pub const GRAYSCALE_ELEVATED_RGB: (u8, u8, u8) = (31, 31, 31); // #1F1F1F
205 pub const GRAYSCALE_REASONING_RGB: (u8, u8, u8) = (38, 38, 38); // #262626
206 pub const GRAYSCALE_SUCCESS_RGB: (u8, u8, u8) = (34, 34, 34); // #222222
207 pub const GRAYSCALE_ERROR_RGB: (u8, u8, u8) = (42, 42, 42); // #2A2A2A
208 pub const GRAYSCALE_TEXT_BODY_RGB: (u8, u8, u8) = (236, 236, 236); // #ECECEC
209 pub const GRAYSCALE_TEXT_MUTED_RGB: (u8, u8, u8) = (180, 180, 180); // #B4B4B4
210 pub const GRAYSCALE_TEXT_HINT_RGB: (u8, u8, u8) = (138, 138, 138); // #8A8A8A
211 pub const GRAYSCALE_TEXT_SOFT_RGB: (u8, u8, u8) = (220, 220, 220); // #DCDCDC
212 pub const GRAYSCALE_BORDER_RGB: (u8, u8, u8) = (96, 96, 96); // #606060
213 pub const GRAYSCALE_SELECTION_RGB: (u8, u8, u8) = (62, 62, 62); // #3E3E3E
214
215 pub const MATRIX_SURFACE_RGB: (u8, u8, u8) = (0, 10, 0); // #000A00
216 pub const MATRIX_ELEVATED_RGB: (u8, u8, u8) = (0, 51, 0); // #003300
217 pub const MATRIX_SELECTION_RGB: (u8, u8, u8) = (0, 51, 0); // #003300
218 pub const MATRIX_TEXT_BODY_RGB: (u8, u8, u8) = (136, 255, 136); // #88FF88
219 pub const MATRIX_TEXT_MUTED_RGB: (u8, u8, u8) = (0, 169, 0); // #00A900, lifted for 4.5:1
220 pub const MATRIX_TEXT_HINT_RGB: (u8, u8, u8) = (0, 135, 0); // #008700, lifted for 3:1
221 pub const MATRIX_TEXT_SOFT_RGB: (u8, u8, u8) = (221, 255, 221); // #DDFFDD
222 pub const MATRIX_TEXT_DIM_RGB: (u8, u8, u8) = (0, 108, 0); // #006C00, lifted for 3:1
223 pub const MATRIX_BORDER_RGB: (u8, u8, u8) = (0, 204, 0); // #00CC00
224
225 // Shoreline — the product-client palette, shared with the GPUI desktop.
226 //
227 // Warm charcoal ground and warm paper sheet, one restrained blue, and the
228 // whale's ivory ink on both sides. This is the charcoal alternative to the
229 // terminal's navy "Underwater" default in 0.10.0. The
230 // 0.10.0 action pair uses glacial blue on charcoal and deep ocean blue on
231 // paper. Shared tokens keep the terminal, desktop, and web in one system.
232 //
233 // Every pair audited by `contrast::theme_contrast_violations` clears its
234 // floor: body roles clear 4.5:1 on all four surfaces, hint/dim and the
235 // status roles clear 3:1.
236 pub const SHORELINE_SURFACE_RGB: (u8, u8, u8) = (33, 31, 35); // #211F23 warm charcoal field
237 pub const SHORELINE_PANEL_RGB: (u8, u8, u8) = (43, 40, 46); // #2B282E raised plate
238 pub const SHORELINE_ELEVATED_RGB: (u8, u8, u8) = (53, 49, 58); // #35313A
239 pub const SHORELINE_COMPOSER_RGB: (u8, u8, u8) = (43, 40, 46); // #2B282E
240 pub const SHORELINE_CHROME_RGB: (u8, u8, u8) = (26, 24, 28); // #1A181C recessed chrome
241 pub const SHORELINE_SELECTION_RGB: (u8, u8, u8) = (44, 70, 84); // #2C4654 deep ocean selection
242 pub const SHORELINE_TEXT_BODY_RGB: (u8, u8, u8) = (242, 236, 229); // #F2ECE5
243 pub const SHORELINE_TEXT_SOFT_RGB: (u8, u8, u8) = (217, 210, 220); // #D9D2DC
244 pub const SHORELINE_TEXT_MUTED_RGB: (u8, u8, u8) = (176, 167, 178); // #B0A7B2
245 pub const SHORELINE_TEXT_HINT_RGB: (u8, u8, u8) = (154, 145, 159); // #9A919F
246 pub const SHORELINE_TEXT_DIM_RGB: (u8, u8, u8) = (126, 117, 131); // #7E7583
247 pub const SHORELINE_BORDER_RGB: (u8, u8, u8) = (73, 66, 77); // #49424D
248 pub const SHORELINE_ACTION_RGB: (u8, u8, u8) = (103, 184, 214); // #67B8D6 glacial blue — action and whale identity
249 pub const SHORELINE_LIVE_RGB: (u8, u8, u8) = (127, 214, 198); // #7FD6C6 the live lane
250 pub const SHORELINE_HUMAN_RGB: (u8, u8, u8) = (246, 196, 83); // #F6C453 Signal Gold, the human lane
251 pub const SHORELINE_ERROR_RGB: (u8, u8, u8) = (255, 143, 168); // #FF8FA8
252 pub const SHORELINE_ERROR_HOVER_RGB: (u8, u8, u8) = (255, 166, 187); // #FFA6BB
253 pub const SHORELINE_ERROR_SURFACE_RGB: (u8, u8, u8) = (58, 32, 41); // #3A2029
254 pub const SHORELINE_ERROR_TEXT_RGB: (u8, u8, u8) = (255, 220, 230); // #FFDCE6
255 pub const SHORELINE_WARNING_RGB: (u8, u8, u8) = (240, 168, 104); // #F0A868
256 pub const SHORELINE_SUCCESS_RGB: (u8, u8, u8) = (163, 217, 119); // #A3D977
257 pub const SHORELINE_STATUS_WORKING_RGB: (u8, u8, u8) = SHORELINE_LIVE_RGB;
258 // Mode badges keep the shipped mode ramp: these four are proof-tested distinct
259 // from one another and from every semantic lane, and a mode badge is identity,
260 // not decoration. `mode_agent` must differ from `accent_primary` or
261 // `adapt::theme_semantic_foreground_role` resolves the action lane to a mode
262 // role (`ModeAgent`) before it ever reaches `Action`.
263 pub const SHORELINE_MODE_AGENT_RGB: (u8, u8, u8) = (126, 180, 232); // #7EB4E8
264 pub const SHORELINE_MODE_YOLO_RGB: (u8, u8, u8) = (255, 112, 160); // #FF70A0
265 pub const SHORELINE_MODE_PLAN_RGB: (u8, u8, u8) = (185, 220, 236); // #B9DCEC
266 pub const SHORELINE_MODE_OPERATE_RGB: (u8, u8, u8) = (173, 136, 255); // #AD88FF
267 pub const SHORELINE_DIFF_ADDED_FG_RGB: (u8, u8, u8) = (127, 214, 160); // #7FD6A0
268 pub const SHORELINE_DIFF_ADDED_BG_RGB: (u8, u8, u8) = (30, 44, 37); // #1E2C25
269 pub const SHORELINE_DIFF_DELETED_FG_RGB: (u8, u8, u8) = (255, 154, 171); // #FF9AAB
270 pub const SHORELINE_DIFF_DELETED_BG_RGB: (u8, u8, u8) = (51, 32, 42); // #33202A
271
272 // Shoreline Light — the same system on warm paper.
273 pub const SHORELINE_LIGHT_SURFACE_RGB: (u8, u8, u8) = (245, 240, 233); // #F5F0E9
274 pub const SHORELINE_LIGHT_PANEL_RGB: (u8, u8, u8) = (236, 229, 224); // #ECE5E0
275 pub const SHORELINE_LIGHT_ELEVATED_RGB: (u8, u8, u8) = (255, 252, 247); // #FFFCF7
276 pub const SHORELINE_LIGHT_COMPOSER_RGB: (u8, u8, u8) = (251, 247, 241); // #FBF7F1
277 pub const SHORELINE_LIGHT_CHROME_RGB: (u8, u8, u8) = (237, 231, 224); // #EDE7E0
278 pub const SHORELINE_LIGHT_SELECTION_RGB: (u8, u8, u8) = (201, 224, 231); // #C9E0E7 pale ocean selection
279 pub const SHORELINE_LIGHT_TEXT_BODY_RGB: (u8, u8, u8) = (48, 40, 50); // #302832
280 pub const SHORELINE_LIGHT_TEXT_SOFT_RGB: (u8, u8, u8) = (74, 65, 76); // #4A414C
281 pub const SHORELINE_LIGHT_TEXT_MUTED_RGB: (u8, u8, u8) = (107, 96, 110); // #6B606E
282 pub const SHORELINE_LIGHT_TEXT_HINT_RGB: (u8, u8, u8) = (117, 112, 128); // #757080
283 pub const SHORELINE_LIGHT_TEXT_DIM_RGB: (u8, u8, u8) = (138, 130, 144); // #8A8290
284 pub const SHORELINE_LIGHT_BORDER_RGB: (u8, u8, u8) = (215, 206, 213); // #D7CED5
285 pub const SHORELINE_LIGHT_ACTION_RGB: (u8, u8, u8) = (0, 102, 132); // #006684 deep ocean blue on warm paper
286 pub const SHORELINE_LIGHT_LIVE_RGB: (u8, u8, u8) = (31, 122, 107); // #1F7A6B
287 pub const SHORELINE_LIGHT_HUMAN_RGB: (u8, u8, u8) = (122, 85, 0); // #7A5500 Signal Gold at AA on paper
288 pub const SHORELINE_LIGHT_ERROR_RGB: (u8, u8, u8) = (180, 35, 90); // #B4235A
289 pub const SHORELINE_LIGHT_ERROR_SURFACE_RGB: (u8, u8, u8) = (251, 228, 236); // #FBE4EC
290 pub const SHORELINE_LIGHT_ERROR_TEXT_RGB: (u8, u8, u8) = (122, 18, 53); // #7A1235
291 pub const SHORELINE_LIGHT_WARNING_RGB: (u8, u8, u8) = (143, 85, 20); // #8F5514
292 pub const SHORELINE_LIGHT_SUCCESS_RGB: (u8, u8, u8) = (47, 107, 58); // #2F6B3A
293 pub const SHORELINE_LIGHT_MODE_AGENT_RGB: (u8, u8, u8) = (22, 54, 178); // #1636B2 distinct from LIGHT action
294 pub const SHORELINE_LIGHT_MODE_YOLO_RGB: (u8, u8, u8) = (181, 35, 90); // #B5235A
295 pub const SHORELINE_LIGHT_MODE_PLAN_RGB: (u8, u8, u8) = (52, 92, 128); // #345C80
296 pub const SHORELINE_LIGHT_MODE_OPERATE_RGB: (u8, u8, u8) = (112, 71, 184); // #7047B8
297 pub const SHORELINE_LIGHT_DIFF_ADDED_FG_RGB: (u8, u8, u8) = (31, 107, 69); // #1F6B45
298 pub const SHORELINE_LIGHT_DIFF_ADDED_BG_RGB: (u8, u8, u8) = (226, 242, 230); // #E2F2E6
299 pub const SHORELINE_LIGHT_DIFF_DELETED_FG_RGB: (u8, u8, u8) = (168, 40, 80); // #A82850
300 pub const SHORELINE_LIGHT_DIFF_DELETED_BG_RGB: (u8, u8, u8) = (251, 230, 236); // #FBE6EC
301
302 // Semantic colors
303 pub const BORDER_COLOR_RGB: (u8, u8, u8) = WHALE_BORDER_RGB;
304
305 pub const WHALE_ACTION: Color =
306 Color::Rgb(WHALE_ACTION_RGB.0, WHALE_ACTION_RGB.1, WHALE_ACTION_RGB.2);
307 pub const WHALE_LIVE: Color = Color::Rgb(
308 WHALE_ACCENT_SECONDARY_RGB.0,
309 WHALE_ACCENT_SECONDARY_RGB.1,
310 WHALE_ACCENT_SECONDARY_RGB.2,
311 );
312 pub const WHALE_HUMAN: Color = Color::Rgb(WHALE_HUMAN_RGB.0, WHALE_HUMAN_RGB.1, WHALE_HUMAN_RGB.2);
313 pub const WHALE_BG: Color = Color::Rgb(WHALE_BG_RGB.0, WHALE_BG_RGB.1, WHALE_BG_RGB.2);
314 pub const WHALE_CHROME: Color =
315 Color::Rgb(WHALE_CHROME_RGB.0, WHALE_CHROME_RGB.1, WHALE_CHROME_RGB.2);
316 pub const WHALE_PANEL: Color = Color::Rgb(WHALE_PANEL_RGB.0, WHALE_PANEL_RGB.1, WHALE_PANEL_RGB.2);
317 pub const WHALE_COMPOSER: Color = Color::Rgb(
318 WHALE_COMPOSER_RGB.0,
319 WHALE_COMPOSER_RGB.1,
320 WHALE_COMPOSER_RGB.2,
321 );
322 pub const WHALE_ERROR: Color = Color::Rgb(WHALE_ERROR_RGB.0, WHALE_ERROR_RGB.1, WHALE_ERROR_RGB.2);
323
324 pub const LIGHT_SURFACE: Color = Color::Rgb(
325 LIGHT_SURFACE_RGB.0,
326 LIGHT_SURFACE_RGB.1,
327 LIGHT_SURFACE_RGB.2,
328 );
329 pub const LIGHT_PANEL: Color = Color::Rgb(LIGHT_PANEL_RGB.0, LIGHT_PANEL_RGB.1, LIGHT_PANEL_RGB.2);
330 pub const LIGHT_ELEVATED: Color = Color::Rgb(
331 LIGHT_ELEVATED_RGB.0,
332 LIGHT_ELEVATED_RGB.1,
333 LIGHT_ELEVATED_RGB.2,
334 );
335 pub const LIGHT_REASONING: Color = Color::Rgb(
336 LIGHT_REASONING_RGB.0,
337 LIGHT_REASONING_RGB.1,
338 LIGHT_REASONING_RGB.2,
339 );
340 pub const LIGHT_SUCCESS: Color = Color::Rgb(
341 LIGHT_SUCCESS_RGB.0,
342 LIGHT_SUCCESS_RGB.1,
343 LIGHT_SUCCESS_RGB.2,
344 );
345 pub const LIGHT_SUCCESS_FG: Color = Color::Rgb(
346 LIGHT_SUCCESS_FG_RGB.0,
347 LIGHT_SUCCESS_FG_RGB.1,
348 LIGHT_SUCCESS_FG_RGB.2,
349 );
350 pub const LIGHT_ERROR: Color = Color::Rgb(LIGHT_ERROR_RGB.0, LIGHT_ERROR_RGB.1, LIGHT_ERROR_RGB.2);
351 pub const LIGHT_TEXT_BODY: Color = Color::Rgb(
352 LIGHT_TEXT_BODY_RGB.0,
353 LIGHT_TEXT_BODY_RGB.1,
354 LIGHT_TEXT_BODY_RGB.2,
355 );
356 pub const LIGHT_TEXT_MUTED: Color = Color::Rgb(
357 LIGHT_TEXT_MUTED_RGB.0,
358 LIGHT_TEXT_MUTED_RGB.1,
359 LIGHT_TEXT_MUTED_RGB.2,
360 );
361 pub const LIGHT_TEXT_HINT: Color = Color::Rgb(
362 LIGHT_TEXT_HINT_RGB.0,
363 LIGHT_TEXT_HINT_RGB.1,
364 LIGHT_TEXT_HINT_RGB.2,
365 );
366 pub const LIGHT_TEXT_SOFT: Color = Color::Rgb(
367 LIGHT_TEXT_SOFT_RGB.0,
368 LIGHT_TEXT_SOFT_RGB.1,
369 LIGHT_TEXT_SOFT_RGB.2,
370 );
371 pub const LIGHT_ACTION: Color =
372 Color::Rgb(LIGHT_ACTION_RGB.0, LIGHT_ACTION_RGB.1, LIGHT_ACTION_RGB.2);
373 pub const LIGHT_LIVE: Color = Color::Rgb(LIGHT_LIVE_RGB.0, LIGHT_LIVE_RGB.1, LIGHT_LIVE_RGB.2);
374 pub const LIGHT_HUMAN: Color = Color::Rgb(LIGHT_HUMAN_RGB.0, LIGHT_HUMAN_RGB.1, LIGHT_HUMAN_RGB.2);
375 pub const LIGHT_WARNING: Color = Color::Rgb(
376 LIGHT_WARNING_RGB.0,
377 LIGHT_WARNING_RGB.1,
378 LIGHT_WARNING_RGB.2,
379 );
380 pub const LIGHT_DANGER: Color =
381 Color::Rgb(LIGHT_DANGER_RGB.0, LIGHT_DANGER_RGB.1, LIGHT_DANGER_RGB.2);
382 pub const LIGHT_MODE_AGENT: Color = Color::Rgb(
383 LIGHT_MODE_AGENT_RGB.0,
384 LIGHT_MODE_AGENT_RGB.1,
385 LIGHT_MODE_AGENT_RGB.2,
386 );
387 pub const LIGHT_MODE_YOLO: Color = Color::Rgb(
388 LIGHT_MODE_YOLO_RGB.0,
389 LIGHT_MODE_YOLO_RGB.1,
390 LIGHT_MODE_YOLO_RGB.2,
391 );
392 pub const LIGHT_MODE_PLAN: Color = Color::Rgb(
393 LIGHT_MODE_PLAN_RGB.0,
394 LIGHT_MODE_PLAN_RGB.1,
395 LIGHT_MODE_PLAN_RGB.2,
396 );
397 pub const LIGHT_OPERATE: Color = Color::Rgb(
398 LIGHT_OPERATE_RGB.0,
399 LIGHT_OPERATE_RGB.1,
400 LIGHT_OPERATE_RGB.2,
401 );
402 pub const LIGHT_BORDER: Color =
403 Color::Rgb(LIGHT_BORDER_RGB.0, LIGHT_BORDER_RGB.1, LIGHT_BORDER_RGB.2);
404 pub const LIGHT_SELECTION_BG: Color = Color::Rgb(
405 LIGHT_SELECTION_RGB.0,
406 LIGHT_SELECTION_RGB.1,
407 LIGHT_SELECTION_RGB.2,
408 );
409 pub const GRAYSCALE_SURFACE: Color = Color::Rgb(
410 GRAYSCALE_SURFACE_RGB.0,
411 GRAYSCALE_SURFACE_RGB.1,
412 GRAYSCALE_SURFACE_RGB.2,
413 );
414 pub const GRAYSCALE_PANEL: Color = Color::Rgb(
415 GRAYSCALE_PANEL_RGB.0,
416 GRAYSCALE_PANEL_RGB.1,
417 GRAYSCALE_PANEL_RGB.2,
418 );
419 pub const GRAYSCALE_ELEVATED: Color = Color::Rgb(
420 GRAYSCALE_ELEVATED_RGB.0,
421 GRAYSCALE_ELEVATED_RGB.1,
422 GRAYSCALE_ELEVATED_RGB.2,
423 );
424 pub const GRAYSCALE_REASONING: Color = Color::Rgb(
425 GRAYSCALE_REASONING_RGB.0,
426 GRAYSCALE_REASONING_RGB.1,
427 GRAYSCALE_REASONING_RGB.2,
428 );
429 pub const GRAYSCALE_SUCCESS: Color = Color::Rgb(
430 GRAYSCALE_SUCCESS_RGB.0,
431 GRAYSCALE_SUCCESS_RGB.1,
432 GRAYSCALE_SUCCESS_RGB.2,
433 );
434 pub const GRAYSCALE_ERROR: Color = Color::Rgb(
435 GRAYSCALE_ERROR_RGB.0,
436 GRAYSCALE_ERROR_RGB.1,
437 GRAYSCALE_ERROR_RGB.2,
438 );
439 pub const GRAYSCALE_TEXT_BODY: Color = Color::Rgb(
440 GRAYSCALE_TEXT_BODY_RGB.0,
441 GRAYSCALE_TEXT_BODY_RGB.1,
442 GRAYSCALE_TEXT_BODY_RGB.2,
443 );
444 pub const GRAYSCALE_TEXT_MUTED: Color = Color::Rgb(
445 GRAYSCALE_TEXT_MUTED_RGB.0,
446 GRAYSCALE_TEXT_MUTED_RGB.1,
447 GRAYSCALE_TEXT_MUTED_RGB.2,
448 );
449 pub const GRAYSCALE_TEXT_HINT: Color = Color::Rgb(
450 GRAYSCALE_TEXT_HINT_RGB.0,
451 GRAYSCALE_TEXT_HINT_RGB.1,
452 GRAYSCALE_TEXT_HINT_RGB.2,
453 );
454 pub const GRAYSCALE_TEXT_SOFT: Color = Color::Rgb(
455 GRAYSCALE_TEXT_SOFT_RGB.0,
456 GRAYSCALE_TEXT_SOFT_RGB.1,
457 GRAYSCALE_TEXT_SOFT_RGB.2,
458 );
459 pub const GRAYSCALE_BORDER: Color = Color::Rgb(
460 GRAYSCALE_BORDER_RGB.0,
461 GRAYSCALE_BORDER_RGB.1,
462 GRAYSCALE_BORDER_RGB.2,
463 );
464 pub const GRAYSCALE_SELECTION_BG: Color = Color::Rgb(
465 GRAYSCALE_SELECTION_RGB.0,
466 GRAYSCALE_SELECTION_RGB.1,
467 GRAYSCALE_SELECTION_RGB.2,
468 );
469
470 pub const TEXT_BODY: Color = Color::Rgb(
471 WHALE_TEXT_BODY_RGB.0,
472 WHALE_TEXT_BODY_RGB.1,
473 WHALE_TEXT_BODY_RGB.2,
474 );
475 pub const TEXT_SECONDARY: Color = Color::Rgb(
476 WHALE_TEXT_MUTED_RGB.0,
477 WHALE_TEXT_MUTED_RGB.1,
478 WHALE_TEXT_MUTED_RGB.2,
479 );
480 pub const TEXT_HINT: Color = Color::Rgb(
481 WHALE_TEXT_HINT_RGB.0,
482 WHALE_TEXT_HINT_RGB.1,
483 WHALE_TEXT_HINT_RGB.2,
484 );
485 pub const TEXT_ACCENT: Color = Color::Rgb(
486 WHALE_ACCENT_SECONDARY_RGB.0,
487 WHALE_ACCENT_SECONDARY_RGB.1,
488 WHALE_ACCENT_SECONDARY_RGB.2,
489 );
490 pub const SELECTION_TEXT: Color = Color::Rgb(
491 WHALE_TEXT_BODY_RGB.0,
492 WHALE_TEXT_BODY_RGB.1,
493 WHALE_TEXT_BODY_RGB.2,
494 ); // Ivory — softer than pure white
495 pub const TEXT_SOFT: Color = Color::Rgb(
496 WHALE_TEXT_SOFT_RGB.0,
497 WHALE_TEXT_SOFT_RGB.1,
498 WHALE_TEXT_SOFT_RGB.2,
499 );
500 pub const TEXT_REASONING: Color = Color::Rgb(
501 WHALE_REASONING_TEXT_RGB.0,
502 WHALE_REASONING_TEXT_RGB.1,
503 WHALE_REASONING_TEXT_RGB.2,
504 );
505
506 // Compatibility aliases for existing call sites.
507 pub const TEXT_PRIMARY: Color = TEXT_BODY;
508 pub const TEXT_MUTED: Color = TEXT_SECONDARY;
509 pub const TEXT_DIM: Color = TEXT_HINT;
510 pub const USER_BODY: Color = Color::Rgb(74, 222, 128); // #4ADE80 green
511 pub const LIGHT_USER_BODY: Color = LIGHT_SUCCESS_FG;
512
513 // Compatibility semantic colors for UI theming
514 pub const BORDER_COLOR: Color =
515 Color::Rgb(BORDER_COLOR_RGB.0, BORDER_COLOR_RGB.1, BORDER_COLOR_RGB.2);
516 pub const BACKGROUND_DARK: Color = Color::Rgb(WHALE_BG_RGB.0, WHALE_BG_RGB.1, WHALE_BG_RGB.2);
517 pub const SURFACE_PANEL: Color =
518 Color::Rgb(WHALE_PANEL_RGB.0, WHALE_PANEL_RGB.1, WHALE_PANEL_RGB.2);
519 pub const SURFACE_ELEVATED: Color = Color::Rgb(
520 WHALE_ELEVATED_RGB.0,
521 WHALE_ELEVATED_RGB.1,
522 WHALE_ELEVATED_RGB.2,
523 );
524 pub const SURFACE_REASONING: Color = Color::Rgb(
525 WHALE_REASONING_SURFACE_RGB.0,
526 WHALE_REASONING_SURFACE_RGB.1,
527 WHALE_REASONING_SURFACE_RGB.2,
528 );
529 pub const SURFACE_REASONING_TINT: Color = Color::Rgb(
530 WHALE_REASONING_TINT_RGB.0,
531 WHALE_REASONING_TINT_RGB.1,
532 WHALE_REASONING_TINT_RGB.2,
533 );
534 pub const SURFACE_REASONING_ACTIVE: Color = Color::Rgb(58, 46, 32);
535 pub const SURFACE_TOOL: Color = Color::Rgb(
536 WHALE_TOOL_SURFACE_RGB.0,
537 WHALE_TOOL_SURFACE_RGB.1,
538 WHALE_TOOL_SURFACE_RGB.2,
539 );
540 pub const SURFACE_TOOL_ACTIVE: Color = Color::Rgb(
541 WHALE_TOOL_ACTIVE_RGB.0,
542 WHALE_TOOL_ACTIVE_RGB.1,
543 WHALE_TOOL_ACTIVE_RGB.2,
544 );
545 pub const SURFACE_SUCCESS: Color = Color::Rgb(18, 42, 37); // dark teal tint
546 pub const SURFACE_ERROR: Color = Color::Rgb(
547 WHALE_ERROR_SURFACE_RGB.0,
548 WHALE_ERROR_SURFACE_RGB.1,
549 WHALE_ERROR_SURFACE_RGB.2,
550 );
551 pub const DIFF_ADDED_BG: Color = Color::Rgb(
552 WHALE_DIFF_ADDED_BG_RGB.0,
553 WHALE_DIFF_ADDED_BG_RGB.1,
554 WHALE_DIFF_ADDED_BG_RGB.2,
555 );
556 pub const DIFF_DELETED_BG: Color = Color::Rgb(
557 WHALE_DIFF_DELETED_BG_RGB.0,
558 WHALE_DIFF_DELETED_BG_RGB.1,
559 WHALE_DIFF_DELETED_BG_RGB.2,
560 );
561 pub const DIFF_ADDED: Color = Color::Rgb(
562 WHALE_DIFF_ADDED_RGB.0,
563 WHALE_DIFF_ADDED_RGB.1,
564 WHALE_DIFF_ADDED_RGB.2,
565 );
566 pub const ACCENT_REASONING_LIVE: Color = Color::Rgb(
567 WHALE_REASONING_TEXT_RGB.0,
568 WHALE_REASONING_TEXT_RGB.1,
569 WHALE_REASONING_TEXT_RGB.2,
570 );
571 pub const ACCENT_TOOL_LIVE: Color = Color::Rgb(
572 WHALE_TOOL_LIVE_RGB.0,
573 WHALE_TOOL_LIVE_RGB.1,
574 WHALE_TOOL_LIVE_RGB.2,
575 );
576 pub const ACCENT_TOOL_ISSUE: Color = Color::Rgb(
577 WHALE_TOOL_ISSUE_RGB.0,
578 WHALE_TOOL_ISSUE_RGB.1,
579 WHALE_TOOL_ISSUE_RGB.2,
580 );
581 pub const TEXT_TOOL_OUTPUT: Color = Color::Rgb(
582 WHALE_TOOL_OUTPUT_RGB.0,
583 WHALE_TOOL_OUTPUT_RGB.1,
584 WHALE_TOOL_OUTPUT_RGB.2,
585 );
586
587 // Legacy status colors - keep for backward compatibility
588 pub const STATUS_SUCCESS: Color = Color::Rgb(
589 WHALE_SUCCESS_RGB.0,
590 WHALE_SUCCESS_RGB.1,
591 WHALE_SUCCESS_RGB.2,
592 );
593 pub const STATUS_WARNING: Color = Color::Rgb(
594 WHALE_WARNING_RGB.0,
595 WHALE_WARNING_RGB.1,
596 WHALE_WARNING_RGB.2,
597 );
598 pub const STATUS_ERROR: Color = Color::Rgb(WHALE_ERROR_RGB.0, WHALE_ERROR_RGB.1, WHALE_ERROR_RGB.2);
599
600 // Mode-specific accent colors for mode badges
601 pub const MODE_AGENT: Color = Color::Rgb(
602 WHALE_MODE_AGENT_RGB.0,
603 WHALE_MODE_AGENT_RGB.1,
604 WHALE_MODE_AGENT_RGB.2,
605 );
606 pub const MODE_YOLO: Color = Color::Rgb(
607 WHALE_MODE_YOLO_RGB.0,
608 WHALE_MODE_YOLO_RGB.1,
609 WHALE_MODE_YOLO_RGB.2,
610 );
611 pub const MODE_PLAN: Color = Color::Rgb(
612 WHALE_MODE_PLAN_RGB.0,
613 WHALE_MODE_PLAN_RGB.1,
614 WHALE_MODE_PLAN_RGB.2,
615 );
616 pub const MODE_OPERATE: Color = Color::Rgb(
617 WHALE_MODE_OPERATE_RGB.0,
618 WHALE_MODE_OPERATE_RGB.1,
619 WHALE_MODE_OPERATE_RGB.2,
620 );
621
622 pub const SELECTION_BG: Color = Color::Rgb(
623 WHALE_SELECTION_RGB.0,
624 WHALE_SELECTION_RGB.1,
625 WHALE_SELECTION_RGB.2,
626 );
627 pub const COMPOSER_BG: Color = WHALE_COMPOSER;
628
628 lines RUST