@actioneer/ads 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/DESIGN.md +597 -0
  2. package/components/ai-elements/agent-trace.d.ts +2 -2
  3. package/components/ai-elements/agent-trace.js +164 -105
  4. package/components/ai-elements/chain-of-thought.d.ts +2 -2
  5. package/components/ai-elements/chain-of-thought.js +1 -1
  6. package/components/ai-elements/index.d.ts +0 -5
  7. package/components/ai-elements/inline-citation.js +1 -1
  8. package/components/alert.d.ts +6 -6
  9. package/components/alert.js +89 -53
  10. package/components/answer-sources.d.ts +2 -6
  11. package/components/answer-sources.js +58 -60
  12. package/components/answer.d.ts +5 -0
  13. package/components/answer.js +311 -271
  14. package/components/assistant-ui/action-bar.js +1 -1
  15. package/components/assistant-ui/attachment.js +11 -11
  16. package/components/assistant-ui/badge.js +18 -18
  17. package/components/assistant-ui/composer-harness.js +15 -20
  18. package/components/assistant-ui/composer-trigger-popover.js +9 -9
  19. package/components/assistant-ui/composer.d.ts +3 -1
  20. package/components/assistant-ui/composer.js +148 -144
  21. package/components/assistant-ui/image.js +61 -61
  22. package/components/assistant-ui/index.d.ts +0 -3
  23. package/components/assistant-ui/message-timing.js +1 -1
  24. package/components/assistant-ui/selection-toolbar.js +7 -7
  25. package/components/assistant-ui/thread-context.d.ts +3 -1
  26. package/components/assistant-ui/thread.js +50 -42
  27. package/components/avatar.js +42 -42
  28. package/components/badge.d.ts +5 -6
  29. package/components/badge.js +13 -76
  30. package/components/body-page-header.d.ts +15 -0
  31. package/components/body-page-header.js +24 -0
  32. package/components/brand-loader.d.ts +0 -3
  33. package/components/brand-loader.js +10 -32
  34. package/components/breadcrumbs.d.ts +0 -7
  35. package/components/breadcrumbs.js +54 -71
  36. package/components/button.d.ts +1 -1
  37. package/components/button.js +55 -49
  38. package/components/chart.js +298 -296
  39. package/components/chip.d.ts +13 -1
  40. package/components/chip.js +93 -80
  41. package/components/collection-header.d.ts +17 -0
  42. package/components/collection-header.js +31 -0
  43. package/components/connector-card.d.ts +6 -6
  44. package/components/connector-card.js +31 -32
  45. package/components/date-range-picker.d.ts +2 -1
  46. package/components/date-range-picker.js +158 -122
  47. package/components/divider.js +25 -25
  48. package/components/drawer.d.ts +6 -2
  49. package/components/drawer.js +61 -58
  50. package/components/dropdown.d.ts +1 -2
  51. package/components/dropdown.js +88 -89
  52. package/components/field.js +41 -36
  53. package/components/file-dropzone.js +1 -1
  54. package/components/index.d.ts +4 -4
  55. package/components/index.js +501 -549
  56. package/components/infinite-canvas.js +24 -24
  57. package/components/input-field.d.ts +18 -3
  58. package/components/input-field.js +88 -72
  59. package/components/input.js +32 -29
  60. package/components/modal.d.ts +31 -3
  61. package/components/modal.js +244 -170
  62. package/components/number-field.js +45 -42
  63. package/components/page-body.d.ts +12 -0
  64. package/components/page-body.js +18 -0
  65. package/components/pagination.js +36 -36
  66. package/components/pixel-blast-svg.js +71 -73
  67. package/components/select.d.ts +21 -0
  68. package/components/select.js +189 -148
  69. package/components/setting-row.d.ts +6 -5
  70. package/components/setting-row.js +33 -32
  71. package/components/sidebar.d.ts +2 -0
  72. package/components/sidebar.js +151 -141
  73. package/components/skeleton.js +8 -7
  74. package/components/slider.js +1 -1
  75. package/components/surface-loader.d.ts +11 -0
  76. package/components/surface-loader.js +35 -0
  77. package/components/table.d.ts +16 -10
  78. package/components/table.js +427 -412
  79. package/components/tabs.d.ts +2 -0
  80. package/components/tabs.js +160 -295
  81. package/components/textarea.js +9 -9
  82. package/components/toast.d.ts +1 -1
  83. package/components/toast.js +181 -118
  84. package/components/tree.d.ts +5 -1
  85. package/components/tree.js +54 -49
  86. package/components/typography.d.ts +4 -4
  87. package/components/typography.js +13 -13
  88. package/components/ui/button.d.ts +1 -1
  89. package/components/ui/button.js +4 -4
  90. package/components/ui/dialog.js +25 -25
  91. package/demo/components/add-to-artifact.js +6 -10
  92. package/lib/cn.js +11 -4
  93. package/lib/icons.d.ts +4 -0
  94. package/lib/icons.js +103 -102
  95. package/lib/interactive.d.ts +1 -1
  96. package/llms.txt +132 -188
  97. package/manifest.json +1719 -2831
  98. package/package.json +2 -2
  99. package/styles.css +362 -233
  100. package/theme.css +312 -177
  101. package/components/agent-icon.d.ts +0 -76
  102. package/components/agent-icon.js +0 -265
  103. package/components/ai-elements/queue.d.ts +0 -60
  104. package/components/ai-elements/queue.js +0 -193
  105. package/components/ai-elements/speech-input.d.ts +0 -16
  106. package/components/ai-elements/speech-input.js +0 -151
  107. package/components/ai-elements/task-progress.d.ts +0 -41
  108. package/components/ai-elements/task-progress.js +0 -224
  109. package/components/ai-elements/task.d.ts +0 -39
  110. package/components/ai-elements/task.js +0 -105
  111. package/components/ai-elements/voice.d.ts +0 -90
  112. package/components/ai-elements/voice.js +0 -496
  113. package/components/assistant-ui/follow-up-suggestions.d.ts +0 -11
  114. package/components/assistant-ui/follow-up-suggestions.js +0 -72
  115. package/components/assistant-ui/suggestions.d.ts +0 -7
  116. package/components/assistant-ui/suggestions.js +0 -19
  117. package/components/assistant-ui/voice.d.ts +0 -18
  118. package/components/link.d.ts +0 -14
  119. package/components/link.js +0 -72
  120. package/components/navbar.d.ts +0 -15
  121. package/components/navbar.js +0 -68
  122. package/components/pixel-icon.d.ts +0 -37
  123. package/components/pixel-icon.js +0 -859
package/theme.css CHANGED
@@ -8,7 +8,7 @@
8
8
  /*
9
9
  * ============================================================
10
10
  * ADS 1.0 — Design Tokens
11
- * Palette: Warm stone Studio neutrals + restrained green CTA
11
+ * Palette: warm greys + product green
12
12
  * Typeface: Aribau Grotesk
13
13
  * ============================================================
14
14
  */
@@ -26,86 +26,160 @@
26
26
  --font-mono: "JetBrains Mono Variable", ui-monospace, SFMono-Regular,
27
27
  "SF Mono", Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
28
28
 
29
- /* ---- Type scale ---- base = 15px (0.9375rem). Root stays 16px so the
30
- spacing grid is unaffected; only text sizes are anchored to 15px. */
31
- /* SIX sizes only — a deliberately small ladder (captions → display).
32
- Don't reintroduce 2xs/3xl/4xl or in-between steps; if a size feels
33
- missing, the answer is weight/color, not a new size. */
34
- --text-xs: 0.8125rem; /* 13px — the FLOOR: captions, secondary text, table cells, keycaps */
35
- --text-xs--line-height: 1.125rem;
36
- /* text-sm is aliased to text-xs (both 13px). The scale is intentionally
37
- 13 · 15 · 17 · 21 · 26 with no in-between tier — keeping the token
38
- pointed at 13px stops any stray `text-sm` from falling back to
39
- Tailwind's default 14px, which would land off the scale. */
40
- --text-sm: 0.8125rem;
41
- --text-sm--line-height: 1.125rem;
42
- --text-base: 0.9375rem; /* 15px — BASE body */
43
- --text-base--line-height: 1.375rem;
44
- --text-lg: 1.0625rem; /* 17px — emphasized body, section headings */
45
- --text-lg--line-height: 1.5rem;
46
- --text-xl: 1.3125rem; /* 21px — page titles */
47
- --text-xl--line-height: 1.75rem;
48
- --text-2xl: 1.625rem; /* 26px — display */
49
- --text-2xl--line-height: 2rem;
50
-
51
- /* ---- Warm ink ramp — a role-based 12-step light scale sampled from the
52
- Actioneer product UI. A restrained red/yellow bias gives canvases and
53
- fills an ivory/stone character instead of equal-channel grey. The light
54
- surface steps retain subtle spacing; the solid/text end is perceptually
55
- widened so adjacent swatches and UI roles stay distinct.
56
- Each step owns a role — 50/100 =
57
- backgrounds, 200/300/400 = interactive component fills, 500/600/700 =
58
- borders & separators, 800/850 = solid, 900/950 = accessible text. The
59
- `ink` name is retained as the stable ADS API. ---- */
60
- --color-ink-50: #fdfcf8; /* 1 · background */
61
- --color-ink-100: #f9f8f3; /* 2 · background */
62
- --color-ink-150: #f6f6f1; /* canvas */
63
- --color-ink-200: #f0efeb; /* 3 · interactive */
64
- --color-ink-300: #e8e7e2; /* 4 · interactive */
65
- --color-ink-400: #deded9; /* 5 · interactive */
66
- --color-ink-500: #d5d4cf; /* 6 · border */
67
- --color-ink-600: #c9c8c2; /* 7 · border */
68
- --color-ink-700: #b7b6b0; /* 8 · border */
69
- --color-ink-800: #8d8c86; /* 9 · solid */
70
- --color-ink-850: #70706a; /* 10 · solid */
71
- --color-ink-900: #444440; /* 11 · accessible text */
72
- --color-ink-950: #171714; /* 12 · accessible text */
29
+ /* ---- Type scale ---- five canonical steps: S · M · L · XL · 2XL.
30
+ Root stays 16px so spacing is unaffected. */
31
+ --text-s: 0.8125rem; /* 13px · captions, secondary text, table cells */
32
+ --text-s--line-height: 1.125rem; /* 18px */
33
+ --text-m: 0.9375rem; /* 15px · default body */
34
+ --text-m--line-height: 1.375rem; /* 22px */
35
+ --text-l: 1.1875rem; /* 19px · emphasized body, section headings */
36
+ --text-l--line-height: 1.625rem; /* 26px */
37
+ --text-xl: 1.5625rem; /* 25px · page titles */
38
+ --text-xl--line-height: 2rem; /* 32px */
39
+ --text-2xl: 1.9375rem; /* 31px · display */
40
+ --text-2xl--line-height: 2.375rem; /* 38px */
41
+
42
+ /* Compatibility aliases keep existing ADS consumers on the new scale. */
43
+ --text-xs: var(--text-s);
44
+ --text-xs--line-height: var(--text-s--line-height);
45
+ --text-sm: var(--text-s);
46
+ --text-sm--line-height: var(--text-s--line-height);
47
+ --text-base: var(--text-m);
48
+ --text-base--line-height: var(--text-m--line-height);
49
+ --text-lg: var(--text-l);
50
+ --text-lg--line-height: var(--text-l--line-height);
51
+
52
+ /* ---- Foundation palette ----
53
+ Canonical primitive names:
54
+ G1…G12 = Green · WG1…WG12 = Warm Grey.
55
+ Each ramp progresses from light backgrounds and interactive fills through
56
+ supporting tones to solid colors and accessible text. Neutral UI borders
57
+ are intentionally restricted to WG3–WG5. ---- */
58
+ --color-g1: #f7f9f7;
59
+ --color-g2: #eef5f0;
60
+ --color-g3: #e2efe5;
61
+ --color-g4: #cce4d2;
62
+ --color-g5: #b4d8be;
63
+ --color-g6: #9bcbaa;
64
+ --color-g7: #7db78f;
65
+ --color-g8: #5c9c73;
66
+ --color-g9: #398457;
67
+ --color-g10: #2b7348;
68
+ --color-g11: #1f623b;
69
+ --color-g12: #183c28;
70
+
71
+ --color-wg1: #f5f5f3;
72
+ --color-wg2: #f1f1ef;
73
+ --color-wg3: #ececea;
74
+ --color-wg4: #e5e5e2;
75
+ --color-wg5: #dcdcd8;
76
+ --color-wg6: #d1d1cc;
77
+ --color-wg7: #c2c2bc;
78
+ --color-wg8: #a6a69f;
79
+ --color-wg9: #777771;
80
+ --color-wg10: #686863;
81
+ --color-wg11: #4b4b47;
82
+ --color-wg12: #20201e;
83
+
84
+ /* Deprecated Neutral Grey names resolve to the canonical Warm Grey ramp.
85
+ Keep these aliases so existing consumer utilities continue to render. */
86
+ --color-ng1: var(--color-wg1);
87
+ --color-ng2: var(--color-wg2);
88
+ --color-ng3: var(--color-wg3);
89
+ --color-ng4: var(--color-wg4);
90
+ --color-ng5: var(--color-wg5);
91
+ --color-ng6: var(--color-wg6);
92
+ --color-ng7: var(--color-wg7);
93
+ --color-ng8: var(--color-wg8);
94
+ --color-ng9: var(--color-wg9);
95
+ --color-ng10: var(--color-wg10);
96
+ --color-ng11: var(--color-wg11);
97
+ --color-ng12: var(--color-wg12);
98
+
99
+ --color-white: #ffffff;
100
+
101
+ /* Compatibility aliases preserve the existing ADS utility/API surface. */
102
+ --color-green-50: var(--color-g1);
103
+ --color-green-100: var(--color-g2);
104
+ --color-green-200: var(--color-g3);
105
+ --color-green-300: var(--color-g4);
106
+ --color-green-400: var(--color-g5);
107
+ --color-green-500: var(--color-g6);
108
+ --color-green-600: var(--color-g7);
109
+ --color-green-700: var(--color-g8);
110
+ --color-green-800: var(--color-g9);
111
+ --color-green-850: var(--color-g10);
112
+ --color-green-900: var(--color-g11);
113
+ --color-green-950: var(--color-g12);
114
+
115
+ --color-grey-50: var(--color-wg1);
116
+ --color-grey-100: var(--color-wg2);
117
+ --color-grey-200: var(--color-wg3);
118
+ --color-grey-300: var(--color-wg4);
119
+ --color-grey-400: var(--color-wg5);
120
+ --color-grey-500: var(--color-wg6);
121
+ --color-grey-600: var(--color-wg7);
122
+ --color-grey-700: var(--color-wg8);
123
+ --color-grey-800: var(--color-wg9);
124
+ --color-grey-850: var(--color-wg10);
125
+ --color-grey-900: var(--color-wg11);
126
+ --color-grey-950: var(--color-wg12);
127
+
128
+ --color-ink-50: var(--color-wg1);
129
+ --color-ink-100: var(--color-wg2);
130
+ --color-ink-200: var(--color-wg3);
131
+ --color-ink-300: var(--color-wg4);
132
+ --color-ink-400: var(--color-wg5);
133
+ --color-ink-500: var(--color-wg6);
134
+ --color-ink-600: var(--color-wg7);
135
+ --color-ink-700: var(--color-wg8);
136
+ --color-ink-800: var(--color-wg9);
137
+ --color-ink-850: var(--color-wg10);
138
+ --color-ink-900: var(--color-wg11);
139
+ --color-ink-950: var(--color-wg12);
73
140
 
74
141
  /* ---- Semantic accent ramps ---- */
75
- /* Success stays a semantic state color, never a product-primary hue. */
76
- --color-success-50: #ecfdf5;
77
- --color-success-100: #d1fae5;
78
- --color-success-500: #10b981;
79
- --color-success-600: #059669;
80
- --color-success-700: #047857;
142
+ /* Success uses the lichen lime family and stays status-only. The original
143
+ soft/base/deep anchors map to 50/500/600; 100 and 400 bridge the soft fill
144
+ and base, while 700 deepens the family enough for AA text on White. */
145
+ --color-success-50: #e4efcf;
146
+ --color-success-100: #d4e5b5;
147
+ --color-success-300: #c4dc9b;
148
+ --color-success-400: #b4d281;
149
+ --color-success-500: #a3c765;
150
+ --color-success-600: #6e8f30;
151
+ --color-success-700: #516923;
81
152
 
82
153
  --color-warning-50: #fffaeb;
83
154
  --color-warning-100: #fef0c7;
155
+ --color-warning-300: #f9d68f;
156
+ --color-warning-400: #f4bc57;
84
157
  --color-warning-500: #f79009;
85
158
  --color-warning-600: #dc6803;
86
159
  --color-warning-700: #b54708;
87
160
 
88
161
  --color-danger-50: #fef3f2;
89
162
  --color-danger-100: #fee4e2;
163
+ --color-danger-300: #f8bab5;
164
+ --color-danger-400: #f18f87;
90
165
  --color-danger-500: #f04438;
91
166
  --color-danger-600: #d92d20;
92
167
  --color-danger-700: #b42318;
93
168
 
94
169
  --color-info-50: #eff8ff;
95
170
  --color-info-100: #d1e9ff;
171
+ --color-info-300: #a7d3f8;
172
+ --color-info-400: #7dbdf1;
96
173
  --color-info-500: #2e90fa;
97
174
  --color-info-600: #1570ef;
98
175
  --color-info-700: #175cd3;
99
176
 
100
- /* ---- Data-viz accents ---- three small ramps for charts & illustration.
177
+ /* ---- Data-viz accents ---- two small ramps for charts & illustration.
101
178
  deep = text/lines · base = fills · soft = backgrounds. Separate from the
102
179
  semantic status ramps above; these carry data, not product identity. */
103
180
  --color-cyan-soft: #c7efe9; /* Cyan — vivid cool contrast; 2nd series, links */
104
181
  --color-cyan-base: #12b5a5;
105
182
  --color-cyan-deep: #0a7e82;
106
- --color-lime-soft: #e4efcf; /* Lichen lime — energetic pop from the mark */
107
- --color-lime-base: #a3c765;
108
- --color-lime-deep: #6e8f30;
109
183
  --color-amber-soft: #fce6c0; /* Amber — warm pop; highlights, "new" */
110
184
  --color-amber-base: #f3a72e;
111
185
  --color-amber-deep: #b57414;
@@ -113,18 +187,21 @@
113
187
  /* Demo logo indigo — source for artifact canvas wash. */
114
188
  --color-brand-mark: #2e1065;
115
189
 
116
- /* ---- Radii ---- FOUR restrained values, assigned by element scale.
117
- 2px = micro details; 4px = compact controls; 6px = standard controls;
118
- 8px = menus, cards, panels, and large surfaces. Repeated aliases keep the
119
- familiar Tailwind role names while capping every surface at 8px. */
190
+ /* ---- Radii ---- five canonical steps: XS · S · M · L · XL.
191
+ M (6px) is the default corner radius. */
120
192
  --radius-xs: 0.125rem; /* 2px · micro details */
121
- --radius-sm: 0.25rem; /* 4px · compact controls */
122
- --radius-md: 0.375rem; /* 6px · standard controls */
123
- --radius-lg: 0.5rem; /* 8px · menus and panels */
124
- --radius-xl: 0.5rem; /* 8px · cards and surfaces */
125
- --radius-2xl: 0.5rem; /* 8px · large surfaces */
126
- --radius-3xl: 0.5rem; /* 8px · capped compatibility alias */
127
- --radius-4xl: 0.5rem; /* 8px · capped compatibility alias */
193
+ --radius-s: 0.25rem; /* 4px · compact controls */
194
+ --radius-m: 0.375rem; /* 6px · default controls and surfaces */
195
+ --radius-l: 0.5rem; /* 8px · menus and cards */
196
+ --radius-xl: 0.75rem; /* 12px · large panels and feature surfaces */
197
+
198
+ /* Compatibility aliases preserve existing ADS utilities. */
199
+ --radius-sm: var(--radius-s);
200
+ --radius-md: var(--radius-m);
201
+ --radius-lg: var(--radius-l);
202
+ --radius-2xl: var(--radius-xl);
203
+ --radius-3xl: var(--radius-xl);
204
+ --radius-4xl: var(--radius-xl);
128
205
  /* Shape-only exception for avatars, icon buttons, progress tracks, chips,
129
206
  and badges. It is not part of the corner-radius scale. */
130
207
  --radius-full: 9999px;
@@ -134,32 +211,40 @@
134
211
  convention). */
135
212
  --radius-dot: 2px;
136
213
 
137
- /* ---- Elevation ---- ONE restrained Studio token.
138
- Delineate surfaces with fill color first; add this only to lift something
139
- actionable. A close contact shadow anchors the surface while the large
140
- negative spread keeps the ambient shadow soft, quiet, and borderless. */
141
- --shadow-elevation: 0 1px 2px rgb(23 23 20 / 0.05),
142
- 0 8px 20px -16px rgb(23 23 20 / 0.16);
214
+ /* ---- Elevation ---- Shopify-inspired 0–600 ladder, recolored with WG12.
215
+ Geometry and opacity increase together; static surfaces remain at 0. */
216
+ --shadow-0: none;
217
+ --shadow-100: 0 1px 0 0 rgb(32 32 32 / 0.07);
218
+ --shadow-200: 0 3px 1px -1px rgb(32 32 32 / 0.07);
219
+ --shadow-300: 0 4px 6px -2px rgb(32 32 32 / 0.2);
220
+ --shadow-400: 0 8px 16px -4px rgb(32 32 32 / 0.22);
221
+ --shadow-500: 0 12px 20px -8px rgb(32 32 32 / 0.24);
222
+ --shadow-600: 0 20px 20px -8px rgb(32 32 32 / 0.28);
223
+
224
+ /* Compatibility hook stays flat. Apply a numbered level only when the user
225
+ explicitly requests elevation for a named surface. */
226
+ --shadow-elevation: var(--shadow-0);
143
227
 
144
228
  /* Pinned-table-column smudges — whisper-soft directional casts shown only
145
229
  while content is hidden behind a sticky column (Table is scroll-aware).
146
- Deep negative spread keeps the edge feathered; the tint is warm ink. */
147
- --shadow-table-smudge-left: 8px 0 24px -14px rgb(23 23 20 / 0.05);
148
- --shadow-table-smudge-right: -8px 0 24px -14px rgb(23 23 20 / 0.05);
149
-
150
- /* ---- CTA inner glow ---- luminous inset highlight for primary buttons
151
- (adapted from the "AI button" Figma): a crisp top-edge catch plus a soft
152
- inner glow from the top and bottom, so a solid CTA reads as lit from within. */
153
- --inner-glow-cta: inset 0 1px 0 0 rgb(255 255 255 / 0.25),
154
- inset 0 10px 22px -10px rgb(255 255 255 / 0.28),
155
- inset 0 -10px 22px -10px rgb(255 255 255 / 0.16);
156
- /* Light-fill sibling — the same lit-from-within read for secondary/soft
157
- buttons (white catch reads on gray fills at higher opacity). */
158
- --inner-glow-fill: inset 0 1px 0 0 rgb(255 255 255 / 0.7),
159
- inset 0 8px 16px -8px rgb(255 255 255 / 0.45);
230
+ Deep negative spread keeps the edge feathered; the tint is warm grey. */
231
+ --shadow-table-smudge-left: 8px 0 24px -14px rgb(32 32 32 / 0.05);
232
+ --shadow-table-smudge-right: -8px 0 24px -14px rgb(32 32 32 / 0.05);
233
+
234
+ /* ---- Button inset depth ---- Polaris-inspired stacked inner edges. The
235
+ lower contact line, quiet inner outline, and half-pixel top catch make
236
+ solid actions feel tactile without adding a decorative outer border. */
237
+ --inner-glow-cta: inset 0 -1px 0 1px rgb(32 32 32 / 0.22),
238
+ inset 0 0 0 1px rgb(32 32 32 / 0.12),
239
+ inset 0 0.5px 0 1.5px rgb(255 255 255 / 0.28);
240
+ /* Compatibility treatment for explicitly raised light fills. Its visible
241
+ edge is entirely inset, so it keeps a transparent outer border. */
242
+ --inner-glow-fill: inset 0 -1px 0 0 var(--border-primary),
243
+ inset 0 0 0 1px rgb(32 32 32 / 0.1),
244
+ inset 0 0.5px 0 1.5px rgb(255 255 255 / 0.86);
160
245
  /* Text fields — a whisper of inset depth so the writing surface reads
161
246
  recessed into the page (persists through hover/focus/invalid). */
162
- --inner-glow-field: inset 0 1px 2px 0 rgb(23 23 20 / 0.06);
247
+ --inner-glow-field: inset 0 1px 2px 0 rgb(32 32 32 / 0.06);
163
248
 
164
249
  /* ---- Layout ---- app-frame dimensions (Sidebar / Panel) */
165
250
  --sidebar-width: 15rem; /* 240px — primary nav rail */
@@ -168,7 +253,7 @@
168
253
  --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
169
254
  --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
170
255
  --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
171
- --sidebar-navigation-text-size: var(--text-base); /* 15px — sidebar actions, items, history, and account text */
256
+ --sidebar-navigation-text-size: var(--text-m); /* 15px — sidebar actions, items, history, and account text */
172
257
  --sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
173
258
  --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
174
259
  --aside-width: 20rem; /* 320px — right-hand panel column */
@@ -182,10 +267,11 @@
182
267
  --thread-max-width: 44rem; /* chat column cap — readable prose measure, all panes */
183
268
  --thread-max-width-wide: 64rem; /* rich-content breakout cap (tables/charts/tool cards) on wide panes; prose keeps --thread-max-width */
184
269
  --composer-bg: var(--elevated); /* pure white composer surface */
185
- --composer-radius: var(--radius-2xl);
270
+ --composer-radius: var(--radius-xl);
186
271
  --composer-padding: 0.5rem;
187
- --composer-placeholder-max-h: calc(var(--text-base--line-height) * 2); /* rotating placeholder clamp — two lines of the input's own rhythm, so it can never overlap the accessory row */
272
+ --composer-placeholder-max-h: calc(var(--text-m--line-height) * 2); /* rotating placeholder clamp — two lines of the input's own rhythm, so it can never overlap the accessory row */
188
273
  --chat-texture-opacity: 0.06; /* welcome-state halftone wash */
274
+ --ask-hero-min-height: 30rem; /* keeps the empty-state prompt visually primary before recent work */
189
275
  }
190
276
 
191
277
  /*
@@ -221,28 +307,44 @@
221
307
  * @theme inline exposes them as utilities (bg-background, text-primary, …).
222
308
  */
223
309
  @theme inline {
310
+ /* The shell canvas and its ink: the ground between top-level panels. */
224
311
  --color-background: var(--background);
225
312
  --color-foreground: var(--foreground);
226
313
 
227
- /* Text hierarchy — three accessible levels (all ≥ AA on --background) */
314
+ /* Contextual text hierarchies — three accessible levels per surface. */
315
+ --color-on-white-primary: var(--text-on-white-primary);
316
+ --color-on-white-secondary: var(--text-on-white-secondary);
317
+ --color-on-white-tertiary: var(--text-on-white-tertiary);
318
+ --color-on-warm-grey-primary: var(--text-on-warm-grey-primary);
319
+ --color-on-warm-grey-secondary: var(--text-on-warm-grey-secondary);
320
+ --color-on-warm-grey-tertiary: var(--text-on-warm-grey-tertiary);
321
+
322
+ /* Context-free compatibility aliases remain conservative. */
228
323
  --color-primary: var(--text-primary);
229
324
  --color-secondary: var(--text-secondary);
230
325
  --color-tertiary: var(--text-tertiary);
231
326
 
327
+ /* One continuous recess inside a white surface, never a screen-level ground. */
232
328
  --color-surface: var(--surface);
233
329
  --color-surface-foreground: var(--surface-foreground);
234
330
  --color-elevated: var(--elevated);
235
331
 
332
+ /* The hover and row-state wash: interaction, not a default item background. */
236
333
  --color-muted: var(--muted);
237
334
  --color-muted-foreground: var(--muted-foreground);
238
335
 
336
+ /* The white working plane that sits on the canvas, and the specimen hairline. */
239
337
  --color-card: var(--card);
240
338
  --color-card-foreground: var(--card-foreground);
339
+ --color-specimen-stroke: var(--specimen-stroke);
241
340
 
242
341
  /* Primary CTA role — restrained Studio green, used sparingly. */
243
342
  --color-action-primary: var(--action-primary);
244
343
  --color-action-primary-foreground: var(--action-primary-foreground);
245
344
  --color-action-primary-hover: var(--action-primary-hover);
345
+ --color-action-primary-text: var(--action-primary-text);
346
+ --color-action-primary-soft: var(--action-primary-soft);
347
+ --color-field-focus: var(--field-focus);
246
348
 
247
349
  /* Compatibility action role — neutral ink, never a colored primary hue. */
248
350
  --color-brand: var(--brand);
@@ -250,34 +352,47 @@
250
352
  --color-brand-hover: var(--brand-hover);
251
353
  --color-brand-text: var(--brand-text);
252
354
 
253
- /* Quiet fill — secondary buttons, avatars, chips */
355
+ /* Quiet fill — avatars, chips, and disabled controls */
254
356
  --color-fill: var(--fill);
255
357
  --color-fill-foreground: var(--fill-foreground);
358
+ /* Table surfaces: the white tray, its hairlines, and header ink. */
256
359
  --color-table-shell: var(--table-shell);
360
+ --color-table-stroke: var(--table-stroke);
361
+ --color-table-header-foreground: var(--table-header-foreground);
257
362
 
363
+ /* The artifact sheet: white warmed by a trace of the brand mark. */
258
364
  --color-artifact-canvas: var(--artifact-canvas);
259
365
 
366
+ /* The active and selected wash, one step above hover. */
260
367
  --color-accent: var(--accent);
261
368
  --color-accent-foreground: var(--accent-foreground);
262
369
 
263
- /* success-700 on white = 5.48:1 (600 was 3.77:1, failed AA). */
370
+ /* Lichen success-700 clears AA on White and both success soft fills;
371
+ success-600 is reserved for non-text marks because its 3.73:1 contrast
372
+ on White does not clear body-text AA. */
264
373
  --color-success: var(--color-success-700);
265
- --color-success-foreground: #ffffff;
374
+ --color-success-foreground: var(--color-white);
266
375
  /* Amber-500 fill kept (it IS the caution signal); dark ink foreground
267
376
  instead of white = 6.94:1 (white on amber was 2.35:1, failed even 3:1). */
268
377
  --color-warning: var(--color-warning-500);
269
- --color-warning-foreground: var(--color-ink-950);
378
+ --color-warning-foreground: var(--color-wg12);
379
+ /* Danger and info: solid semantic fills carrying white foregrounds. */
270
380
  --color-danger: var(--color-danger-600);
271
- --color-danger-foreground: #ffffff;
381
+ --color-danger-foreground: var(--color-white);
272
382
  --color-info: var(--color-info-600);
273
- --color-info-foreground: #ffffff;
383
+ --color-info-foreground: var(--color-white);
274
384
 
385
+ /* The neutral stroke ladder: every 1px UI border stays within WG3 to WG5. */
275
386
  --color-border-primary: var(--border-primary);
276
387
  --color-border-secondary: var(--border-secondary);
277
388
  --color-border-tertiary: var(--border-tertiary);
278
389
  --color-border: var(--border);
279
390
  --color-border-strong: var(--border-strong);
280
391
  --color-input: var(--input);
392
+ --color-menu-stroke: var(--menu-stroke);
393
+ --color-toast-stroke: var(--toast-stroke);
394
+ --color-tree-stroke: var(--tree-stroke);
395
+ /* Focus ring and scrim, both translucent warm ink. */
281
396
  --color-ring: var(--ring);
282
397
  --color-overlay: var(--overlay);
283
398
 
@@ -289,10 +404,10 @@
289
404
  * shadcn's grey/black defaults. The raw --sidebar-*/--popover values live in
290
405
  * :root below.
291
406
  */
292
- --color-primary-foreground: #ffffff;
293
- --color-secondary-foreground: #ffffff;
407
+ --color-primary-foreground: var(--color-white);
408
+ --color-secondary-foreground: var(--color-white);
294
409
  --color-destructive: var(--color-danger-600);
295
- --color-destructive-foreground: #ffffff;
410
+ --color-destructive-foreground: var(--color-white);
296
411
  --color-popover: var(--popover);
297
412
  --color-popover-foreground: var(--popover-foreground);
298
413
 
@@ -308,69 +423,78 @@
308
423
 
309
424
  /* ---- Theme (light only) ---- */
310
425
  :root {
311
- /* Every warm-neutral semantic token below points INTO the ink primitive scale.
312
- Only pure white (#ffffff) stays literal: it is a base surface, not a
313
- neutral scale step. */
314
- --background: var(--color-ink-100); /* step 2 · canvas */
315
- --foreground: var(--color-ink-950); /* step 12 */
316
-
317
- /* Text levels: primary ink-950, secondary ink-900, tertiary a tuned grey.
318
- All three clear AA (4.5:1) for body copy on every surface they land on.
319
- Tertiary is NOT an ink step: ink-850 (#70706a) falls below AA on muted
320
- but is used at 13px in 200+ places, so it is pinned to the
321
- lightest grey that still passes 4.5:1 on bg/card/surface/muted. */
322
- --text-primary: var(--color-ink-950); /* ~14.5:1 AAA (min surf) */
323
- --text-secondary: var(--color-ink-900); /* ~7.9:1 AAA (min surf) */
324
- --text-tertiary: #686863; /* ~4.52:1 AA (min surf) */
325
-
326
- --surface: var(--color-ink-200); /* step 3 · tinted canvas */
327
- --surface-foreground: var(--color-ink-950);
328
- --elevated: #ffffff; /* pure white base */
329
-
330
- --muted: var(--color-ink-300); /* step 4 */
331
- --muted-foreground: var(--color-ink-900);/* step 11 · readable UI text */
332
-
333
- --card: #ffffff; /* pure white base */
334
- --card-foreground: var(--color-ink-950);
426
+ /* Surfaces and achromatic text/actions point into WG; the primary CTA
427
+ points into G. */
428
+ --background: var(--color-wg2); /* step 2 · canvas */
429
+ --foreground: var(--color-wg12); /* step 12 */
430
+
431
+ /* Both surface contexts point directly into the approved WG text steps.
432
+ WG10 is the tertiary/de-emphasis step and clears AA on White and WG2. */
433
+ --text-on-white-primary: var(--color-wg12); /* 16.32:1 · AAA */
434
+ --text-on-white-secondary: var(--color-wg11); /* 8.76:1 · AAA */
435
+ --text-on-white-tertiary: var(--color-wg10); /* 5.60:1 · AA */
436
+ --text-on-warm-grey-primary: var(--color-wg12); /* 14.43:1 on WG2 · AAA */
437
+ --text-on-warm-grey-secondary: var(--color-wg11); /* 7.75:1 on WG2 · AAA */
438
+ --text-on-warm-grey-tertiary: var(--color-wg10); /* 4.95:1 on WG2 · AA */
439
+
440
+ /* Existing context-free utilities remain compatibility aliases. Their
441
+ tertiary value stays conservative across WG2–WG4 and White. */
442
+ --text-primary: var(--color-wg12); /* 12.93:1 AAA (WG4 min surf) */
443
+ --text-secondary: var(--color-wg11); /* 6.94:1 AA (WG4 min surf) */
444
+ --text-tertiary: color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11)); /* 4.86:1 AA (WG4) */
445
+
446
+ --surface: var(--color-wg3); /* step 3 · tinted canvas */
447
+ --surface-foreground: var(--color-wg12);
448
+ --elevated: var(--color-white); /* pure white base */
449
+
450
+ --muted: var(--color-wg4); /* step 4 */
451
+ --muted-foreground: var(--color-wg11); /* step 11 · readable UI text */
452
+
453
+ --card: var(--color-white); /* pure white base */
454
+ --card-foreground: var(--color-wg12);
335
455
 
336
456
  /* Studio green is deliberately isolated to the primary CTA role (roughly
337
457
  5–10% of a screen). Selection controls keep using neutral `brand` below,
338
458
  so tabs, switches, radios, and progress never inherit CTA color. */
339
- --action-primary: #2f7d5a;
340
- --action-primary-foreground: #ffffff;
341
- --action-primary-hover: #256749;
459
+ --action-primary: var(--color-g9);
460
+ --action-primary-foreground: var(--color-white);
461
+ --action-primary-hover: var(--color-g10);
462
+ --action-primary-text: var(--color-g11);
463
+ --action-primary-soft: var(--color-g3);
342
464
 
343
465
  /* Neutral action role. The `brand` name remains as a compatibility API,
344
466
  and shared selection/control states intentionally remain achromatic. */
345
- --brand: var(--color-ink-950); /* darkest action ink */
346
- --brand-foreground: #ffffff;
347
- --brand-hover: var(--color-ink-900); /* lighter hover lift */
348
- --brand-text: var(--color-ink-950); /* action text / links */
349
-
350
- /* Table interaction fills are pre-composited and opaque. Sticky edge cells
351
- therefore cover horizontally scrolled content while preserving the
352
- original quiet bg-card/40-over-muted row hover. */
353
- --table-row-hover: color-mix(in srgb, var(--card) 40%, var(--muted));
354
- --table-row-selected: color-mix(in srgb, var(--card) 10%, var(--muted));
355
-
356
- /* Quiet component fill. Ink step 3 is the first interactive-background
467
+ --brand: var(--color-wg12); /* darkest neutral action */
468
+ --brand-foreground: var(--color-white);
469
+ --brand-hover: var(--color-wg11); /* lighter hover lift */
470
+ --brand-text: var(--color-wg12); /* action text / links */
471
+
472
+ /* Interactive row hover/focus uses the WG1 highlight wash. */
473
+ --table-row-hover: var(--color-wg2);
474
+ --table-row-selected: var(--color-wg1);
475
+
476
+ /* Quiet component fill. WG3 is the first interactive-background
357
477
  step, so this remains visible on both white cards and the step-2 canvas. */
358
- --fill: var(--color-ink-200); /* step 3 · default component fill */
359
- --fill-foreground: var(--color-ink-950);
360
-
361
- --accent: var(--color-ink-400); /* step 5 · active / selected wash */
362
- --accent-foreground: var(--color-ink-950);
363
-
364
- /* Borders use consecutive ink steps 5–7. This avoids the old 3→5→7 jump:
365
- tertiary stays quiet but visible at 0.5px, secondary is the subtle
366
- border step, and primary is the default interactive-control edge. */
367
- --border-primary: var(--color-ink-600); /* step 7 · #c9c8c2 · strongest */
368
- --border-secondary: var(--color-ink-500); /* step 6 · #d5d4cf · default */
369
- --border-tertiary: var(--color-ink-400); /* step 5 · #deded9 · faintest */
478
+ --fill: var(--color-wg3); /* step 3 · default component fill */
479
+ --fill-foreground: var(--color-wg12);
480
+
481
+ --accent: var(--color-wg5); /* step 5 · active / selected wash */
482
+ --accent-foreground: var(--color-wg12);
483
+
484
+ /* Every neutral border stays within the consecutive WG3–WG5 range:
485
+ tertiary is the quietest 1px divider, secondary is the default hairline,
486
+ and primary is the strongest neutral edge. */
487
+ --border-primary: var(--color-wg5); /* step 5 · strongest */
488
+ --border-secondary: var(--color-wg4); /* step 4 · default */
489
+ --border-tertiary: var(--color-wg3); /* step 3 · faintest */
370
490
  /* Legacy aliases point into the scale so existing utilities keep resolving. */
371
491
  --border: var(--border-secondary); /* default hairline / separator */
372
492
  --border-strong: var(--border-primary); /* emphasized / hover / selected */
373
- --input: var(--border-primary); /* form-control edge */
493
+ --input: var(--color-wg4); /* form-control edge */
494
+ --menu-stroke: var(--color-wg4); /* dropdown edge + separator */
495
+ --toast-stroke: var(--color-wg4); /* toast card edge */
496
+ --tree-stroke: var(--color-wg4); /* tree connector rail + elbows */
497
+ --field-focus: var(--color-g8); /* subtle green focused-control edge */
374
498
 
375
499
  /* Ripple — the appearance wash that radiates from a floating surface's
376
500
  origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
@@ -378,29 +502,30 @@
378
502
  the `Ripple` component. */
379
503
  --ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
380
504
 
381
- /* Stroke width — ADS hairlines are 0.5px, not the Tailwind 1px default.
382
- The single-width border utilities are overridden to this token at the
383
- bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
384
- true hairline. Explicit `border-2`+ widths are unaffected. */
385
- --stroke-width: 0.5px;
386
- --ring: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink @ 50% */
387
- --overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
388
-
389
- /* Functional / domain tokens — named for their RENDER role, pointing into
390
- the ink scale. Components pass these into non-CSS renderers (Recharts,
391
- React Flow, the Paper/WebGL texture) so no component carries a raw ink-*
392
- value. Same DS pattern as the data-viz --color-chart-* palette. */
505
+ /* Stroke width — every standard UI border is exactly 1px. */
506
+ --stroke-width: 1px;
507
+ --ring: color-mix(in srgb, var(--color-wg12) 50%, transparent); /* WG12 @ 50% */
508
+ --overlay: color-mix(in srgb, var(--color-wg12) 50%, transparent); /* WG12 @ 50% */
509
+
510
+ /* Functional / domain tokens — named for their render role, pointing into
511
+ the canonical WG palette. Components pass these into non-CSS renderers
512
+ (Recharts, React Flow, the Paper/WebGL texture) so no component carries a
513
+ raw primitive value. Same DS pattern as the data-viz palette. */
393
514
  --chart-axis: var(--border-tertiary); /* axis lines + de-emphasised marks */
394
- --chart-grid: var(--color-ink-200); /* quieter than axes, visible on white */
395
- --chart-track: var(--color-ink-200); /* funnel / progress track */
396
- --chart-context: var(--color-ink-500); /* de-emphasised context series */
515
+ --chart-grid: var(--color-wg3); /* quieter than axes, visible on white */
516
+ --chart-track: var(--color-wg3); /* funnel / progress track */
517
+ --chart-context: var(--color-wg6); /* de-emphasised context series */
518
+ --chart-active-bar-opacity: 0.68; /* hover lightens a bar while preserving its series hue */
397
519
  --canvas-edge: var(--border-secondary);/* infinite-canvas edges / connectors */
398
- --texture-ink: var(--color-ink-950); /* brand-texture / pixel-blast marks */
399
- --table-shell: var(--color-ink-200); /* recessed table tray (lighter than muted) */
400
- --table-scroll-hint: rgb(23 23 20 / 0.04); /* right-edge "more columns" wash */
401
- --surface-inverse: var(--color-ink-950); /* dark hero / inverse surface base */
402
- --surface-inverse-soft: var(--color-ink-900); /* dark hero gradient falloff */
403
- --artifact-canvas: color-mix(in srgb, var(--color-brand-mark) 7%, #ffffff);
520
+ --texture-ink: var(--color-wg12); /* brand-texture / pixel-blast marks */
521
+ --table-shell: var(--color-white); /* simplified single-surface table */
522
+ --table-stroke: var(--color-wg3); /* table outline + row separators */
523
+ --table-header-foreground: var(--color-wg11); /* readable secondary table heading text */
524
+ --specimen-stroke: var(--color-wg3); /* showcase preview + variant-group frames */
525
+ --table-scroll-hint: color-mix(in srgb, var(--color-wg12) 4%, transparent); /* right-edge wash */
526
+ --surface-inverse: var(--color-wg12); /* dark hero / inverse surface base */
527
+ --surface-inverse-soft: var(--color-wg11);/* dark hero gradient falloff */
528
+ --artifact-canvas: color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white));
404
529
 
405
530
  /* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
406
531
  (or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
@@ -421,9 +546,10 @@
421
546
 
422
547
  /*
423
548
  * ============================================================
424
- * Hairline strokes — ADS strokes are 0.5px, not 1px (principle 1).
549
+ * Standard strokes — ADS UI borders are 1px (principle 1).
425
550
  * Override Tailwind's single-width border utilities to the
426
551
  * --stroke-width token. Authored after `}
552
+ .border { border-width: var(--stroke-width); }
427
553
  .border-t { border-top-width: var(--stroke-width); }
428
554
  .border-r { border-right-width: var(--stroke-width); }
429
555
  .border-b { border-bottom-width: var(--stroke-width); }
@@ -445,6 +571,15 @@
445
571
  0% { opacity: 0.6; transform: scale(0.15); }
446
572
  100% { opacity: 0; transform: scale(1.08); }
447
573
  }
574
+
575
+ @keyframes ads-toast-progress {
576
+ from {
577
+ transform: scaleX(1);
578
+ }
579
+ to {
580
+ transform: scaleX(0);
581
+ }
582
+ }
448
583
  .ads-ripple {
449
584
  position: absolute;
450
585
  inset: 0;
@@ -468,10 +603,10 @@
468
603
  * `primary-foreground` companion (its base `--color-primary` is the ADS
469
604
  * text-hierarchy token, which collides with the generated `primary` color),
470
605
  * so the vendored shadcn button's icon rendered invisible (dark-on-dark) on
471
- * `bg-primary`. Define the two utilities explicitly against white.
606
+ * `bg-primary`. Define the two utilities explicitly against White.
472
607
  * ============================================================
473
608
  */
474
609
  @layer utilities {
475
- .text-primary-foreground { color: #ffffff; }
476
- .bg-primary-foreground { background-color: #ffffff; }
610
+ .text-primary-foreground { color: var(--color-white); }
611
+ .bg-primary-foreground { background-color: var(--color-white); }
477
612
  }