@actioneer/ads 0.5.9 → 0.7.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 (116) hide show
  1. package/components/ai-elements/agent-trace.d.ts +2 -2
  2. package/components/ai-elements/agent-trace.js +163 -104
  3. package/components/ai-elements/chain-of-thought.d.ts +2 -2
  4. package/components/ai-elements/chain-of-thought.js +1 -1
  5. package/components/ai-elements/index.d.ts +0 -5
  6. package/components/ai-elements/inline-citation.js +1 -1
  7. package/components/alert.d.ts +6 -6
  8. package/components/alert.js +89 -53
  9. package/components/answer-sources.d.ts +2 -6
  10. package/components/answer-sources.js +58 -60
  11. package/components/answer.d.ts +5 -0
  12. package/components/answer.js +311 -271
  13. package/components/assistant-ui/composer-harness.js +11 -14
  14. package/components/assistant-ui/composer.d.ts +3 -1
  15. package/components/assistant-ui/composer.js +148 -144
  16. package/components/assistant-ui/index.d.ts +0 -3
  17. package/components/assistant-ui/thread-context.d.ts +3 -1
  18. package/components/assistant-ui/thread.js +50 -42
  19. package/components/avatar.js +42 -42
  20. package/components/badge.d.ts +5 -6
  21. package/components/badge.js +13 -76
  22. package/components/body-page-header.d.ts +15 -0
  23. package/components/body-page-header.js +24 -0
  24. package/components/brand-loader.d.ts +0 -3
  25. package/components/brand-loader.js +10 -32
  26. package/components/breadcrumbs.d.ts +1 -8
  27. package/components/breadcrumbs.js +65 -78
  28. package/components/button.d.ts +1 -1
  29. package/components/button.js +55 -49
  30. package/components/card.js +19 -18
  31. package/components/chart.js +526 -503
  32. package/components/chip.d.ts +13 -1
  33. package/components/chip.js +93 -80
  34. package/components/collection-header.d.ts +17 -0
  35. package/components/collection-header.js +31 -0
  36. package/components/connector-card.d.ts +6 -6
  37. package/components/connector-card.js +31 -32
  38. package/components/date-range-picker.d.ts +26 -0
  39. package/components/date-range-picker.js +223 -0
  40. package/components/drawer.d.ts +19 -3
  41. package/components/drawer.js +143 -116
  42. package/components/dropdown.d.ts +1 -2
  43. package/components/dropdown.js +88 -89
  44. package/components/field.js +39 -34
  45. package/components/file-dropzone.js +1 -1
  46. package/components/index.d.ts +5 -4
  47. package/components/index.js +501 -546
  48. package/components/infinite-canvas.js +24 -24
  49. package/components/input-field.d.ts +18 -3
  50. package/components/input-field.js +88 -72
  51. package/components/input.js +16 -15
  52. package/components/modal.d.ts +31 -3
  53. package/components/modal.js +243 -169
  54. package/components/number-field.js +45 -42
  55. package/components/page-body.d.ts +12 -0
  56. package/components/page-body.js +18 -0
  57. package/components/pagination.js +36 -36
  58. package/components/panel.js +31 -28
  59. package/components/select.d.ts +21 -0
  60. package/components/select.js +189 -148
  61. package/components/setting-row.d.ts +6 -5
  62. package/components/setting-row.js +33 -32
  63. package/components/sidebar.d.ts +2 -0
  64. package/components/sidebar.js +165 -155
  65. package/components/skeleton.js +8 -7
  66. package/components/slider.js +1 -1
  67. package/components/surface-loader.d.ts +11 -0
  68. package/components/surface-loader.js +35 -0
  69. package/components/table.d.ts +16 -10
  70. package/components/table.js +426 -410
  71. package/components/tabs.d.ts +2 -0
  72. package/components/tabs.js +159 -294
  73. package/components/textarea.js +9 -9
  74. package/components/toast.d.ts +1 -1
  75. package/components/toast.js +181 -118
  76. package/components/tree.d.ts +5 -1
  77. package/components/tree.js +96 -63
  78. package/components/typography.d.ts +4 -4
  79. package/components/typography.js +13 -13
  80. package/components/ui/button.d.ts +1 -1
  81. package/components/ui/dialog.js +33 -33
  82. package/components/viz-charts.js +186 -183
  83. package/demo/components/add-to-artifact.js +8 -10
  84. package/fonts.css +2 -0
  85. package/lib/cn.js +11 -4
  86. package/lib/icons.d.ts +4 -0
  87. package/lib/icons.js +107 -106
  88. package/lib/interactive.d.ts +1 -1
  89. package/llms.txt +115 -152
  90. package/manifest.json +13730 -1084
  91. package/package.json +4 -2
  92. package/styles.css +365 -225
  93. package/theme.css +315 -176
  94. package/components/agent-icon.d.ts +0 -76
  95. package/components/agent-icon.js +0 -265
  96. package/components/ai-elements/queue.d.ts +0 -60
  97. package/components/ai-elements/queue.js +0 -193
  98. package/components/ai-elements/speech-input.d.ts +0 -16
  99. package/components/ai-elements/speech-input.js +0 -151
  100. package/components/ai-elements/task-progress.d.ts +0 -41
  101. package/components/ai-elements/task-progress.js +0 -224
  102. package/components/ai-elements/task.d.ts +0 -39
  103. package/components/ai-elements/task.js +0 -105
  104. package/components/ai-elements/voice.d.ts +0 -90
  105. package/components/ai-elements/voice.js +0 -496
  106. package/components/assistant-ui/follow-up-suggestions.d.ts +0 -11
  107. package/components/assistant-ui/follow-up-suggestions.js +0 -72
  108. package/components/assistant-ui/suggestions.d.ts +0 -7
  109. package/components/assistant-ui/suggestions.js +0 -19
  110. package/components/assistant-ui/voice.d.ts +0 -18
  111. package/components/link.d.ts +0 -14
  112. package/components/link.js +0 -72
  113. package/components/navbar.d.ts +0 -15
  114. package/components/navbar.js +0 -68
  115. package/components/pixel-icon.d.ts +0 -37
  116. package/components/pixel-icon.js +0 -859
package/styles.css CHANGED
@@ -5,6 +5,8 @@
5
5
  @import "tw-animate-css";
6
6
 
7
7
  /* ---- Aribau Grotesk ---- */
8
+ @import "@fontsource-variable/jetbrains-mono/wght.css";
9
+
8
10
  /* Aribau Grotesk — ADS UI typeface.
9
11
  TWO physical faces, both served compressed (woff2):
10
12
  • Regular → `font-normal` (weight 100–499)
@@ -37,7 +39,8 @@
37
39
  /*
38
40
  * ============================================================
39
41
  * ADS 1.0 — Design Tokens
40
- * Palette: Ink neutrals · Typeface: Aribau Grotesk
42
+ * Palette: soft neutral greys + product green
43
+ * Typeface: Aribau Grotesk
41
44
  * ============================================================
42
45
  */
43
46
  @theme {
@@ -48,91 +51,166 @@
48
51
  --font-sans: "Aribau Grotesk", ui-sans-serif, system-ui, -apple-system,
49
52
  "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
50
53
 
51
- /* Source code only (CodeBlock, inline Code). ADS ships no mono webfont —
52
- this resolves to the reader's platform mono, which is what a developer
53
- already reads code in. Never use it for UI copy or data. */
54
- --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
55
- "Liberation Mono", "Courier New", monospace;
56
-
57
- /* ---- Type scale ---- base = 15px (0.9375rem). Root stays 16px so the
58
- spacing grid is unaffected; only text sizes are anchored to 15px. */
59
- /* SIX sizes only — a deliberately small ladder (captions → display).
60
- Don't reintroduce 2xs/3xl/4xl or in-between steps; if a size feels
61
- missing, the answer is weight/color, not a new size. */
62
- --text-xs: 0.8125rem; /* 13px — the FLOOR: captions, secondary text, table cells, keycaps */
63
- --text-xs--line-height: 1.125rem;
64
- /* text-sm is aliased to text-xs (both 13px). The scale is intentionally
65
- 13 · 15 · 17 · 21 · 26 with no in-between tier — keeping the token
66
- pointed at 13px stops any stray `text-sm` from falling back to
67
- Tailwind's default 14px, which would land off the scale. */
68
- --text-sm: 0.8125rem;
69
- --text-sm--line-height: 1.125rem;
70
- --text-base: 0.9375rem; /* 15px — BASE body */
71
- --text-base--line-height: 1.375rem;
72
- --text-lg: 1.0625rem; /* 17px — emphasized body, section headings */
73
- --text-lg--line-height: 1.5rem;
74
- --text-xl: 1.3125rem; /* 21px — page titles */
75
- --text-xl--line-height: 1.75rem;
76
- --text-2xl: 1.625rem; /* 26px — display */
77
- --text-2xl--line-height: 2rem;
78
-
79
- /* ---- Neutral ramp — a role-based neutral Gray 12-step light scale. Every
80
- channel is equal, so the product stays neutral with no Sand/Sage cast.
81
- The light surface steps retain subtle spacing; the solid/text end is
82
- perceptually widened so adjacent swatches and UI roles stay distinct.
83
- Each step owns a role — 50/100 =
84
- backgrounds, 200/300/400 = interactive component fills, 500/600/700 =
85
- borders & separators, 800/850 = solid, 900/950 = accessible text. The
86
- `ink` name is retained as the stable ADS API. ---- */
87
- --color-ink-50: #fcfcfc; /* 1 · background */
88
- --color-ink-100: #f9f9f9; /* 2 · background */
89
- --color-ink-150: #f5f5f5; /* canvas */
90
- --color-ink-200: #f0f0f0; /* 3 · interactive */
91
- --color-ink-300: #e8e8e8; /* 4 · interactive */
92
- --color-ink-400: #e0e0e0; /* 5 · interactive */
93
- --color-ink-500: #d9d9d9; /* 6 · border */
94
- --color-ink-600: #cecece; /* 7 · border */
95
- --color-ink-700: #bbbbbb; /* 8 · border */
96
- --color-ink-800: #8d8d8d; /* 9 · solid */
97
- --color-ink-850: #737373; /* 10 · solid */
98
- --color-ink-900: #555555; /* 11 · accessible text */
99
- --color-ink-950: #202020; /* 12 · accessible text */
54
+ /* Source code only (CodeBlock, inline Code). JetBrains Mono is bundled so
55
+ code renders consistently across platforms. Never use it for UI copy or
56
+ ordinary data. */
57
+ --font-mono: "JetBrains Mono Variable", ui-monospace, SFMono-Regular,
58
+ "SF Mono", Menlo, Consolas, "Liberation Mono", "Courier New", monospace;
59
+
60
+ /* ---- Type scale ---- five canonical steps: S · M · L · XL · 2XL.
61
+ Root stays 16px so spacing is unaffected. */
62
+ --text-s: 0.8125rem; /* 13px · captions, secondary text, table cells */
63
+ --text-s--line-height: 1.125rem; /* 18px */
64
+ --text-m: 0.9375rem; /* 15px · default body */
65
+ --text-m--line-height: 1.375rem; /* 22px */
66
+ --text-l: 1.1875rem; /* 19px · emphasized body, section headings */
67
+ --text-l--line-height: 1.625rem; /* 26px */
68
+ --text-xl: 1.5625rem; /* 25px · page titles */
69
+ --text-xl--line-height: 2rem; /* 32px */
70
+ --text-2xl: 1.9375rem; /* 31px · display */
71
+ --text-2xl--line-height: 2.375rem; /* 38px */
72
+
73
+ /* Compatibility aliases keep existing ADS consumers on the new scale. */
74
+ --text-xs: var(--text-s);
75
+ --text-xs--line-height: var(--text-s--line-height);
76
+ --text-sm: var(--text-s);
77
+ --text-sm--line-height: var(--text-s--line-height);
78
+ --text-base: var(--text-m);
79
+ --text-base--line-height: var(--text-m--line-height);
80
+ --text-lg: var(--text-l);
81
+ --text-lg--line-height: var(--text-l--line-height);
82
+
83
+ /* ---- Foundation palette ----
84
+ Canonical primitive names:
85
+ G1…G12 = Green · NG1…NG12 = Neutral Grey.
86
+ Each ramp progresses from light backgrounds and interactive fills through
87
+ supporting tones to solid colors and accessible text. Neutral UI borders
88
+ are intentionally restricted to NG3–NG5. ---- */
89
+ --color-g1: #f7f9f7;
90
+ --color-g2: #eef5f0;
91
+ --color-g3: #e2efe5;
92
+ --color-g4: #cce4d2;
93
+ --color-g5: #b4d8be;
94
+ --color-g6: #9bcbaa;
95
+ --color-g7: #7db78f;
96
+ --color-g8: #5c9c73;
97
+ --color-g9: #398457;
98
+ --color-g10: #2b7348;
99
+ --color-g11: #1f623b;
100
+ --color-g12: #183c28;
101
+
102
+ --color-ng1: #fafafa;
103
+ --color-ng2: #f6f6f6;
104
+ --color-ng3: #f1f1f1;
105
+ --color-ng4: #ececec;
106
+ --color-ng5: #e6e6e6;
107
+ --color-ng6: #dedede;
108
+ --color-ng7: #d4d4d4;
109
+ --color-ng8: #bdbdbd;
110
+ --color-ng9: #868686;
111
+ --color-ng10: #7c7b7b;
112
+ --color-ng11: #5e5d5d;
113
+ --color-ng12: #202020;
114
+
115
+ /* Deprecated Warm Grey names now resolve to Neutral Grey. Keep these
116
+ aliases so existing consumer utilities continue to render safely. */
117
+ --color-wg1: var(--color-ng1);
118
+ --color-wg2: var(--color-ng2);
119
+ --color-wg3: var(--color-ng3);
120
+ --color-wg4: var(--color-ng4);
121
+ --color-wg5: var(--color-ng5);
122
+ --color-wg6: var(--color-ng6);
123
+ --color-wg7: var(--color-ng7);
124
+ --color-wg8: var(--color-ng8);
125
+ --color-wg9: var(--color-ng9);
126
+ --color-wg10: var(--color-ng10);
127
+ --color-wg11: var(--color-ng11);
128
+ --color-wg12: var(--color-ng12);
129
+
130
+ --color-white: #ffffff;
131
+
132
+ /* Compatibility aliases preserve the existing ADS utility/API surface. */
133
+ --color-green-50: var(--color-g1);
134
+ --color-green-100: var(--color-g2);
135
+ --color-green-200: var(--color-g3);
136
+ --color-green-300: var(--color-g4);
137
+ --color-green-400: var(--color-g5);
138
+ --color-green-500: var(--color-g6);
139
+ --color-green-600: var(--color-g7);
140
+ --color-green-700: var(--color-g8);
141
+ --color-green-800: var(--color-g9);
142
+ --color-green-850: var(--color-g10);
143
+ --color-green-900: var(--color-g11);
144
+ --color-green-950: var(--color-g12);
145
+
146
+ --color-grey-50: var(--color-ng1);
147
+ --color-grey-100: var(--color-ng2);
148
+ --color-grey-200: var(--color-ng3);
149
+ --color-grey-300: var(--color-ng4);
150
+ --color-grey-400: var(--color-ng5);
151
+ --color-grey-500: var(--color-ng6);
152
+ --color-grey-600: var(--color-ng7);
153
+ --color-grey-700: var(--color-ng8);
154
+ --color-grey-800: var(--color-ng9);
155
+ --color-grey-850: var(--color-ng10);
156
+ --color-grey-900: var(--color-ng11);
157
+ --color-grey-950: var(--color-ng12);
158
+
159
+ --color-ink-50: var(--color-ng1);
160
+ --color-ink-100: var(--color-ng2);
161
+ --color-ink-200: var(--color-ng3);
162
+ --color-ink-300: var(--color-ng4);
163
+ --color-ink-400: var(--color-ng5);
164
+ --color-ink-500: var(--color-ng6);
165
+ --color-ink-600: var(--color-ng7);
166
+ --color-ink-700: var(--color-ng8);
167
+ --color-ink-800: var(--color-ng9);
168
+ --color-ink-850: var(--color-ng10);
169
+ --color-ink-900: var(--color-ng11);
170
+ --color-ink-950: var(--color-ng12);
100
171
 
101
172
  /* ---- Semantic accent ramps ---- */
102
- /* Success stays a semantic state color, never a product-primary hue. */
103
- --color-success-50: #ecfdf5;
104
- --color-success-100: #d1fae5;
105
- --color-success-500: #10b981;
106
- --color-success-600: #059669;
107
- --color-success-700: #047857;
173
+ /* Success uses the lichen lime family and stays status-only. The original
174
+ soft/base/deep anchors map to 50/500/600; 100 and 400 bridge the soft fill
175
+ and base, while 700 deepens the family enough for AA text on White. */
176
+ --color-success-50: #e4efcf;
177
+ --color-success-100: #d4e5b5;
178
+ --color-success-300: #c4dc9b;
179
+ --color-success-400: #b4d281;
180
+ --color-success-500: #a3c765;
181
+ --color-success-600: #6e8f30;
182
+ --color-success-700: #516923;
108
183
 
109
184
  --color-warning-50: #fffaeb;
110
185
  --color-warning-100: #fef0c7;
186
+ --color-warning-300: #f9d68f;
187
+ --color-warning-400: #f4bc57;
111
188
  --color-warning-500: #f79009;
112
189
  --color-warning-600: #dc6803;
113
190
  --color-warning-700: #b54708;
114
191
 
115
192
  --color-danger-50: #fef3f2;
116
193
  --color-danger-100: #fee4e2;
194
+ --color-danger-300: #f8bab5;
195
+ --color-danger-400: #f18f87;
117
196
  --color-danger-500: #f04438;
118
197
  --color-danger-600: #d92d20;
119
198
  --color-danger-700: #b42318;
120
199
 
121
200
  --color-info-50: #eff8ff;
122
201
  --color-info-100: #d1e9ff;
202
+ --color-info-300: #a7d3f8;
203
+ --color-info-400: #7dbdf1;
123
204
  --color-info-500: #2e90fa;
124
205
  --color-info-600: #1570ef;
125
206
  --color-info-700: #175cd3;
126
207
 
127
- /* ---- Data-viz accents ---- three small ramps for charts & illustration.
208
+ /* ---- Data-viz accents ---- two small ramps for charts & illustration.
128
209
  deep = text/lines · base = fills · soft = backgrounds. Separate from the
129
210
  semantic status ramps above; these carry data, not product identity. */
130
211
  --color-cyan-soft: #c7efe9; /* Cyan — vivid cool contrast; 2nd series, links */
131
212
  --color-cyan-base: #12b5a5;
132
213
  --color-cyan-deep: #0a7e82;
133
- --color-lime-soft: #e4efcf; /* Lichen lime — energetic pop from the mark */
134
- --color-lime-base: #a3c765;
135
- --color-lime-deep: #6e8f30;
136
214
  --color-amber-soft: #fce6c0; /* Amber — warm pop; highlights, "new" */
137
215
  --color-amber-base: #f3a72e;
138
216
  --color-amber-deep: #b57414;
@@ -140,18 +218,21 @@
140
218
  /* Demo logo indigo — source for artifact canvas wash. */
141
219
  --color-brand-mark: #2e1065;
142
220
 
143
- /* ---- Radii ---- FOUR values, assigned by element scale and role.
144
- 2px = micro details; 4px = compact controls; 8px = standard controls
145
- and floating UI; 16px = cards and large surfaces. The repeated aliases
146
- keep the familiar Tailwind role names while capping surfaces at 16px. */
221
+ /* ---- Radii ---- five canonical steps: XS · S · M · L · XL.
222
+ M (6px) is the default corner radius. */
147
223
  --radius-xs: 0.125rem; /* 2px · micro details */
148
- --radius-sm: 0.25rem; /* 4px · compact controls */
149
- --radius-md: 0.5rem; /* 8px · standard controls */
150
- --radius-lg: 0.5rem; /* 8px · menus and panels */
151
- --radius-xl: 1rem; /* 16px · cards and surfaces */
152
- --radius-2xl: 1rem; /* 16px · large surfaces */
153
- --radius-3xl: 1rem; /* 16px · capped compatibility alias */
154
- --radius-4xl: 1rem; /* 16px · capped compatibility alias */
224
+ --radius-s: 0.25rem; /* 4px · compact controls */
225
+ --radius-m: 0.375rem; /* 6px · default controls and surfaces */
226
+ --radius-l: 0.5rem; /* 8px · menus and cards */
227
+ --radius-xl: 0.75rem; /* 12px · large panels and feature surfaces */
228
+
229
+ /* Compatibility aliases preserve existing ADS utilities. */
230
+ --radius-sm: var(--radius-s);
231
+ --radius-md: var(--radius-m);
232
+ --radius-lg: var(--radius-l);
233
+ --radius-2xl: var(--radius-xl);
234
+ --radius-3xl: var(--radius-xl);
235
+ --radius-4xl: var(--radius-xl);
155
236
  /* Shape-only exception for avatars, icon buttons, progress tracks, chips,
156
237
  and badges. It is not part of the corner-radius scale. */
157
238
  --radius-full: 9999px;
@@ -161,30 +242,37 @@
161
242
  convention). */
162
243
  --radius-dot: 2px;
163
244
 
164
- /* ---- Elevation ---- ONE soft token (Claude-panel style).
165
- Delineate surfaces with fill color first; add this to gently lift them.
166
- The ambient drop sits close (y4, blur16) at low opacity and uses neutral
167
- ink — never a cool slate tint that would reintroduce a color cast. */
168
- --shadow-elevation: 0 0 0 1px rgb(32 32 32 / 0.03),
169
- 0 1px 2px 0 rgb(32 32 32 / 0.04),
170
- 0 4px 16px -6px rgb(32 32 32 / 0.06);
245
+ /* ---- Elevation ---- Shopify-inspired 0–600 ladder, recolored with NG12.
246
+ Geometry and opacity increase together; static surfaces remain at 0. */
247
+ --shadow-0: none;
248
+ --shadow-100: 0 1px 0 0 rgb(32 32 32 / 0.07);
249
+ --shadow-200: 0 3px 1px -1px rgb(32 32 32 / 0.07);
250
+ --shadow-300: 0 4px 6px -2px rgb(32 32 32 / 0.2);
251
+ --shadow-400: 0 8px 16px -4px rgb(32 32 32 / 0.22);
252
+ --shadow-500: 0 12px 20px -8px rgb(32 32 32 / 0.24);
253
+ --shadow-600: 0 20px 20px -8px rgb(32 32 32 / 0.28);
254
+
255
+ /* Compatibility hook stays flat. Apply a numbered level only when the user
256
+ explicitly requests elevation for a named surface. */
257
+ --shadow-elevation: var(--shadow-0);
171
258
 
172
259
  /* Pinned-table-column smudges — whisper-soft directional casts shown only
173
260
  while content is hidden behind a sticky column (Table is scroll-aware).
174
- Deep negative spread keeps the edge feathered; the tint is neutral ink. */
261
+ Deep negative spread keeps the edge feathered; the tint is neutral grey. */
175
262
  --shadow-table-smudge-left: 8px 0 24px -14px rgb(32 32 32 / 0.05);
176
263
  --shadow-table-smudge-right: -8px 0 24px -14px rgb(32 32 32 / 0.05);
177
264
 
178
- /* ---- CTA inner glow ---- luminous inset highlight for primary buttons
179
- (adapted from the "AI button" Figma): a crisp top-edge catch plus a soft
180
- inner glow from the top and bottom, so a solid CTA reads as lit from within. */
181
- --inner-glow-cta: inset 0 1px 0 0 rgb(255 255 255 / 0.25),
182
- inset 0 10px 22px -10px rgb(255 255 255 / 0.28),
183
- inset 0 -10px 22px -10px rgb(255 255 255 / 0.16);
184
- /* Light-fill sibling — the same lit-from-within read for secondary/soft
185
- buttons (white catch reads on gray fills at higher opacity). */
186
- --inner-glow-fill: inset 0 1px 0 0 rgb(255 255 255 / 0.7),
187
- inset 0 8px 16px -8px rgb(255 255 255 / 0.45);
265
+ /* ---- Button inset depth ---- Polaris-inspired stacked inner edges. The
266
+ lower contact line, quiet inner outline, and half-pixel top catch make
267
+ solid actions feel tactile without adding a decorative outer border. */
268
+ --inner-glow-cta: inset 0 -1px 0 1px rgb(32 32 32 / 0.22),
269
+ inset 0 0 0 1px rgb(32 32 32 / 0.12),
270
+ inset 0 0.5px 0 1.5px rgb(255 255 255 / 0.28);
271
+ /* Compatibility treatment for explicitly raised light fills. Its visible
272
+ edge is entirely inset, so it keeps a transparent outer border. */
273
+ --inner-glow-fill: inset 0 -1px 0 0 var(--border-primary),
274
+ inset 0 0 0 1px rgb(32 32 32 / 0.1),
275
+ inset 0 0.5px 0 1.5px rgb(255 255 255 / 0.86);
188
276
  /* Text fields — a whisper of inset depth so the writing surface reads
189
277
  recessed into the page (persists through hover/focus/invalid). */
190
278
  --inner-glow-field: inset 0 1px 2px 0 rgb(32 32 32 / 0.06);
@@ -196,7 +284,7 @@
196
284
  --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
197
285
  --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
198
286
  --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
199
- --sidebar-navigation-text-size: var(--text-base); /* 15px — sidebar actions, items, history, and account text */
287
+ --sidebar-navigation-text-size: var(--text-m); /* 15px — sidebar actions, items, history, and account text */
200
288
  --sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
201
289
  --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
202
290
  --aside-width: 20rem; /* 320px — right-hand panel column */
@@ -210,10 +298,11 @@
210
298
  --thread-max-width: 44rem; /* chat column cap — readable prose measure, all panes */
211
299
  --thread-max-width-wide: 64rem; /* rich-content breakout cap (tables/charts/tool cards) on wide panes; prose keeps --thread-max-width */
212
300
  --composer-bg: var(--elevated); /* pure white composer surface */
213
- --composer-radius: var(--radius-2xl);
301
+ --composer-radius: var(--radius-xl);
214
302
  --composer-padding: 0.5rem;
215
- --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 */
303
+ --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 */
216
304
  --chat-texture-opacity: 0.06; /* welcome-state halftone wash */
305
+ --ask-hero-min-height: 30rem; /* keeps the empty-state prompt visually primary before recent work */
217
306
  }
218
307
 
219
308
  /*
@@ -252,7 +341,15 @@
252
341
  --color-background: var(--background);
253
342
  --color-foreground: var(--foreground);
254
343
 
255
- /* Text hierarchy — three accessible levels (all ≥ AA on --background) */
344
+ /* Contextual text hierarchies — three accessible levels per surface. */
345
+ --color-on-white-primary: var(--text-on-white-primary);
346
+ --color-on-white-secondary: var(--text-on-white-secondary);
347
+ --color-on-white-tertiary: var(--text-on-white-tertiary);
348
+ --color-on-warm-grey-primary: var(--text-on-warm-grey-primary);
349
+ --color-on-warm-grey-secondary: var(--text-on-warm-grey-secondary);
350
+ --color-on-warm-grey-tertiary: var(--text-on-warm-grey-tertiary);
351
+
352
+ /* Context-free compatibility aliases remain conservative. */
256
353
  --color-primary: var(--text-primary);
257
354
  --color-secondary: var(--text-secondary);
258
355
  --color-tertiary: var(--text-tertiary);
@@ -266,6 +363,15 @@
266
363
 
267
364
  --color-card: var(--card);
268
365
  --color-card-foreground: var(--card-foreground);
366
+ --color-specimen-stroke: var(--specimen-stroke);
367
+
368
+ /* Primary CTA role — restrained Studio green, used sparingly. */
369
+ --color-action-primary: var(--action-primary);
370
+ --color-action-primary-foreground: var(--action-primary-foreground);
371
+ --color-action-primary-hover: var(--action-primary-hover);
372
+ --color-action-primary-text: var(--action-primary-text);
373
+ --color-action-primary-soft: var(--action-primary-soft);
374
+ --color-field-focus: var(--field-focus);
269
375
 
270
376
  /* Compatibility action role — neutral ink, never a colored primary hue. */
271
377
  --color-brand: var(--brand);
@@ -273,27 +379,31 @@
273
379
  --color-brand-hover: var(--brand-hover);
274
380
  --color-brand-text: var(--brand-text);
275
381
 
276
- /* Quiet fill — secondary buttons, avatars, chips */
382
+ /* Quiet fill — avatars, chips, and disabled controls */
277
383
  --color-fill: var(--fill);
278
384
  --color-fill-foreground: var(--fill-foreground);
279
385
  --color-table-shell: var(--table-shell);
386
+ --color-table-stroke: var(--table-stroke);
387
+ --color-table-header-foreground: var(--table-header-foreground);
280
388
 
281
389
  --color-artifact-canvas: var(--artifact-canvas);
282
390
 
283
391
  --color-accent: var(--accent);
284
392
  --color-accent-foreground: var(--accent-foreground);
285
393
 
286
- /* success-700 on white = 5.48:1 (600 was 3.77:1, failed AA). */
394
+ /* Lichen success-700 clears AA on White and both success soft fills;
395
+ success-600 is reserved for non-text marks because its 3.73:1 contrast
396
+ on White does not clear body-text AA. */
287
397
  --color-success: var(--color-success-700);
288
- --color-success-foreground: #ffffff;
398
+ --color-success-foreground: var(--color-white);
289
399
  /* Amber-500 fill kept (it IS the caution signal); dark ink foreground
290
400
  instead of white = 6.94:1 (white on amber was 2.35:1, failed even 3:1). */
291
401
  --color-warning: var(--color-warning-500);
292
- --color-warning-foreground: var(--color-ink-950);
402
+ --color-warning-foreground: var(--color-ng12);
293
403
  --color-danger: var(--color-danger-600);
294
- --color-danger-foreground: #ffffff;
404
+ --color-danger-foreground: var(--color-white);
295
405
  --color-info: var(--color-info-600);
296
- --color-info-foreground: #ffffff;
406
+ --color-info-foreground: var(--color-white);
297
407
 
298
408
  --color-border-primary: var(--border-primary);
299
409
  --color-border-secondary: var(--border-secondary);
@@ -301,6 +411,9 @@
301
411
  --color-border: var(--border);
302
412
  --color-border-strong: var(--border-strong);
303
413
  --color-input: var(--input);
414
+ --color-menu-stroke: var(--menu-stroke);
415
+ --color-toast-stroke: var(--toast-stroke);
416
+ --color-tree-stroke: var(--tree-stroke);
304
417
  --color-ring: var(--ring);
305
418
  --color-overlay: var(--overlay);
306
419
 
@@ -312,10 +425,10 @@
312
425
  * shadcn's grey/black defaults. The raw --sidebar-*/--popover values live in
313
426
  * :root below.
314
427
  */
315
- --color-primary-foreground: #ffffff;
316
- --color-secondary-foreground: #ffffff;
428
+ --color-primary-foreground: var(--color-white);
429
+ --color-secondary-foreground: var(--color-white);
317
430
  --color-destructive: var(--color-danger-600);
318
- --color-destructive-foreground: #ffffff;
431
+ --color-destructive-foreground: var(--color-white);
319
432
  --color-popover: var(--popover);
320
433
  --color-popover-foreground: var(--popover-foreground);
321
434
 
@@ -331,62 +444,79 @@
331
444
 
332
445
  /* ---- Theme (light only) ---- */
333
446
  :root {
334
- /* Every neutral semantic token below points INTO the ink primitive scale.
335
- Only pure white (#ffffff) stays literal: it is a base surface, not a
336
- neutral scale step. */
337
- --background: var(--color-ink-100); /* step 2 · canvas */
338
- --foreground: var(--color-ink-950); /* step 12 */
339
-
340
- /* Text levels: primary ink-950, secondary ink-900, tertiary a tuned grey.
341
- All three clear AA (4.5:1) for body copy on every surface they land on.
342
- Tertiary is NOT an ink step: ink-800 (#8d8d8d) was AA-large only (2.7:1
343
- on muted) but is used at 13px in 200+ places, so it is pinned to the
344
- lightest grey that still passes 4.5:1 on bg/card/surface/muted. */
345
- --text-primary: var(--color-ink-950); /* ~16:1 AAA */
346
- --text-secondary: var(--color-ink-900); /* ~7.1:1 AAA */
347
- --text-tertiary: #686868; /* ~4.55:1 AA (min surf) */
348
-
349
- --surface: var(--color-ink-200); /* step 3 · tinted canvas */
350
- --surface-foreground: var(--color-ink-950);
351
- --elevated: #ffffff; /* pure white base */
352
-
353
- --muted: var(--color-ink-300); /* step 4 */
354
- --muted-foreground: var(--color-ink-900);/* step 11 · readable UI text */
355
-
356
- --card: #ffffff; /* pure white base */
357
- --card-foreground: var(--color-ink-950);
447
+ /* Surfaces and achromatic text/actions point into NG; the primary CTA
448
+ points into G. */
449
+ --background: var(--color-ng2); /* step 2 · canvas */
450
+ --foreground: var(--color-ng12); /* step 12 */
451
+
452
+ /* Both surface contexts point directly into the approved NG text steps.
453
+ NG10 is the tertiary/de-emphasis step; it does not clear 4.5:1 for normal
454
+ body text on these surfaces, so reserve it for nonessential content. */
455
+ --text-on-white-primary: var(--color-ng12); /* 16.29:1 · AAA */
456
+ --text-on-white-secondary: var(--color-ng11); /* 6.56:1 · AA */
457
+ --text-on-white-tertiary: var(--color-ng10); /* 4.22:1 */
458
+ --text-on-warm-grey-primary: var(--color-ng12); /* legacy name · neutral canvas */
459
+ --text-on-warm-grey-secondary: var(--color-ng11); /* legacy name · neutral canvas */
460
+ --text-on-warm-grey-tertiary: var(--color-ng10); /* legacy name · neutral canvas */
461
+
462
+ /* Existing context-free utilities remain compatibility aliases. Their
463
+ tertiary value stays conservative across NG2–NG4 and White. */
464
+ --text-primary: var(--color-ng12); /* ~12.5:1 AAA (min surf) */
465
+ --text-secondary: var(--color-ng11); /* ~5.0:1 AA (min surf) */
466
+ --text-tertiary: #625f5c; /* ~4.53:1 AA (min surf) */
467
+
468
+ --surface: var(--color-ng3); /* step 3 · tinted canvas */
469
+ --surface-foreground: var(--color-ng12);
470
+ --elevated: var(--color-white); /* pure white base */
471
+
472
+ --muted: var(--color-ng4); /* step 4 */
473
+ --muted-foreground: var(--color-ng11); /* step 11 · readable UI text */
474
+
475
+ --card: var(--color-white); /* pure white base */
476
+ --card-foreground: var(--color-ng12);
477
+
478
+ /* Studio green is deliberately isolated to the primary CTA role (roughly
479
+ 5–10% of a screen). Selection controls keep using neutral `brand` below,
480
+ so tabs, switches, radios, and progress never inherit CTA color. */
481
+ --action-primary: var(--color-g9);
482
+ --action-primary-foreground: var(--color-white);
483
+ --action-primary-hover: var(--color-g10);
484
+ --action-primary-text: var(--color-g11);
485
+ --action-primary-soft: var(--color-g3);
358
486
 
359
487
  /* Neutral action role. The `brand` name remains as a compatibility API,
360
- but the product has no colored primary palette. */
361
- --brand: var(--color-ink-950); /* darkest action ink */
362
- --brand-foreground: #ffffff;
363
- --brand-hover: var(--color-ink-900); /* lighter hover lift */
364
- --brand-text: var(--color-ink-950); /* action text / links */
365
-
366
- /* Table interaction fills are pre-composited and opaque. Sticky edge cells
367
- therefore cover horizontally scrolled content while preserving the
368
- original quiet bg-card/40-over-muted row hover. */
369
- --table-row-hover: color-mix(in srgb, var(--card) 40%, var(--muted));
370
- --table-row-selected: color-mix(in srgb, var(--card) 10%, var(--muted));
371
-
372
- /* Quiet component fill. Radix step 3 is the first interactive-background
488
+ and shared selection/control states intentionally remain achromatic. */
489
+ --brand: var(--color-ng12); /* darkest neutral action */
490
+ --brand-foreground: var(--color-white);
491
+ --brand-hover: var(--color-ng11); /* lighter hover lift */
492
+ --brand-text: var(--color-ng12); /* action text / links */
493
+
494
+ /* Interactive rows lift one step above the NG1 zebra band. */
495
+ --table-row-hover: var(--color-ng2);
496
+ --table-row-selected: var(--color-ng1);
497
+
498
+ /* Quiet component fill. NG3 is the first interactive-background
373
499
  step, so this remains visible on both white cards and the step-2 canvas. */
374
- --fill: var(--color-ink-200); /* step 3 · default component fill */
375
- --fill-foreground: var(--color-ink-950);
376
-
377
- --accent: var(--color-ink-400); /* step 5 · active / selected wash */
378
- --accent-foreground: var(--color-ink-950);
379
-
380
- /* Borders use consecutive Radix steps 5–7. This avoids the old 3→5→7 jump:
381
- tertiary stays quiet but visible at 0.5px, secondary is the Radix subtle
382
- border step, and primary is the default interactive-control edge. */
383
- --border-primary: var(--color-ink-600); /* step 7 · #cecece · strongest */
384
- --border-secondary: var(--color-ink-500); /* step 6 · #d9d9d9 · default */
385
- --border-tertiary: var(--color-ink-400); /* step 5 · #e0e0e0 · faintest */
500
+ --fill: var(--color-ng3); /* step 3 · default component fill */
501
+ --fill-foreground: var(--color-ng12);
502
+
503
+ --accent: var(--color-ng5); /* step 5 · active / selected wash */
504
+ --accent-foreground: var(--color-ng12);
505
+
506
+ /* Every neutral border stays within the consecutive NG3–NG5 range:
507
+ tertiary is the quietest 1px divider, secondary is the default hairline,
508
+ and primary is the strongest neutral edge. */
509
+ --border-primary: var(--color-ng5); /* step 5 · strongest */
510
+ --border-secondary: var(--color-ng4); /* step 4 · default */
511
+ --border-tertiary: var(--color-ng3); /* step 3 · faintest */
386
512
  /* Legacy aliases point into the scale so existing utilities keep resolving. */
387
513
  --border: var(--border-secondary); /* default hairline / separator */
388
514
  --border-strong: var(--border-primary); /* emphasized / hover / selected */
389
- --input: var(--border-primary); /* form-control edge */
515
+ --input: var(--color-ng4); /* form-control edge */
516
+ --menu-stroke: var(--color-ng4); /* dropdown edge + separator */
517
+ --toast-stroke: var(--color-ng4); /* toast card edge */
518
+ --tree-stroke: var(--color-ng4); /* tree connector rail + elbows */
519
+ --field-focus: var(--color-g8); /* subtle green focused-control edge */
390
520
 
391
521
  /* Ripple — the appearance wash that radiates from a floating surface's
392
522
  origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
@@ -394,29 +524,30 @@
394
524
  the `Ripple` component. */
395
525
  --ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
396
526
 
397
- /* Stroke width — ADS hairlines are 0.5px, not the Tailwind 1px default.
398
- The single-width border utilities are overridden to this token at the
399
- bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
400
- true hairline. Explicit `border-2`+ widths are unaffected. */
401
- --stroke-width: 0.5px;
402
- --ring: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink @ 50% */
403
- --overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
404
-
405
- /* Functional / domain tokens — named for their RENDER role, pointing into
406
- the ink scale. Components pass these into non-CSS renderers (Recharts,
407
- React Flow, the Paper/WebGL texture) so no component carries a raw ink-*
408
- value. Same DS pattern as the data-viz --color-chart-* palette. */
527
+ /* Stroke width — every standard UI border is exactly 1px. */
528
+ --stroke-width: 1px;
529
+ --ring: color-mix(in srgb, var(--color-ng12) 50%, transparent); /* NG12 @ 50% */
530
+ --overlay: color-mix(in srgb, var(--color-ng12) 50%, transparent); /* NG12 @ 50% */
531
+
532
+ /* Functional / domain tokens — named for their render role, pointing into
533
+ the canonical NG palette. Components pass these into non-CSS renderers
534
+ (Recharts, React Flow, the Paper/WebGL texture) so no component carries a
535
+ raw primitive value. Same DS pattern as the data-viz palette. */
409
536
  --chart-axis: var(--border-tertiary); /* axis lines + de-emphasised marks */
410
- --chart-grid: var(--color-ink-200); /* quieter than axes, visible on white */
411
- --chart-track: var(--color-ink-200); /* funnel / progress track */
412
- --chart-context: var(--color-ink-500); /* de-emphasised context series */
537
+ --chart-grid: var(--color-ng3); /* quieter than axes, visible on white */
538
+ --chart-track: var(--color-ng3); /* funnel / progress track */
539
+ --chart-context: var(--color-ng6); /* de-emphasised context series */
540
+ --chart-active-bar-opacity: 0.68; /* hover lightens a bar while preserving its series hue */
413
541
  --canvas-edge: var(--border-secondary);/* infinite-canvas edges / connectors */
414
- --texture-ink: var(--color-ink-950); /* brand-texture / pixel-blast marks */
415
- --table-shell: var(--color-ink-200); /* recessed table tray (lighter than muted) */
542
+ --texture-ink: var(--color-ng12); /* brand-texture / pixel-blast marks */
543
+ --table-shell: var(--color-white); /* simplified single-surface table */
544
+ --table-stroke: var(--color-ng3); /* table outline + row separators */
545
+ --table-header-foreground: var(--color-ng10); /* secondary table heading text */
546
+ --specimen-stroke: var(--color-ng3); /* showcase preview + variant-group frames */
416
547
  --table-scroll-hint: rgb(32 32 32 / 0.04); /* right-edge "more columns" wash */
417
- --surface-inverse: var(--color-ink-950); /* dark hero / inverse surface base */
418
- --surface-inverse-soft: var(--color-ink-900); /* dark hero gradient falloff */
419
- --artifact-canvas: color-mix(in srgb, var(--color-brand-mark) 7%, #ffffff);
548
+ --surface-inverse: var(--color-ng12); /* dark hero / inverse surface base */
549
+ --surface-inverse-soft: var(--color-ng11);/* dark hero gradient falloff */
550
+ --artifact-canvas: color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white));
420
551
 
421
552
  /* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
422
553
  (or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
@@ -437,9 +568,10 @@
437
568
 
438
569
  /*
439
570
  * ============================================================
440
- * Hairline strokes — ADS strokes are 0.5px, not 1px (principle 1).
571
+ * Standard strokes — ADS UI borders are 1px (principle 1).
441
572
  * Override Tailwind's single-width border utilities to the
442
573
  * --stroke-width token. Authored after `}
574
+ .border { border-width: var(--stroke-width); }
443
575
  .border-t { border-top-width: var(--stroke-width); }
444
576
  .border-r { border-right-width: var(--stroke-width); }
445
577
  .border-b { border-bottom-width: var(--stroke-width); }
@@ -461,6 +593,15 @@
461
593
  0% { opacity: 0.6; transform: scale(0.15); }
462
594
  100% { opacity: 0; transform: scale(1.08); }
463
595
  }
596
+
597
+ @keyframes ads-toast-progress {
598
+ from {
599
+ transform: scaleX(1);
600
+ }
601
+ to {
602
+ transform: scaleX(0);
603
+ }
604
+ }
464
605
  .ads-ripple {
465
606
  position: absolute;
466
607
  inset: 0;
@@ -484,12 +625,12 @@
484
625
  * `primary-foreground` companion (its base `--color-primary` is the ADS
485
626
  * text-hierarchy token, which collides with the generated `primary` color),
486
627
  * so the vendored shadcn button's icon rendered invisible (dark-on-dark) on
487
- * `bg-primary`. Define the two utilities explicitly against white.
628
+ * `bg-primary`. Define the two utilities explicitly against White.
488
629
  * ============================================================
489
630
  */
490
631
  @layer utilities {
491
- .text-primary-foreground { color: #ffffff; }
492
- .bg-primary-foreground { background-color: #ffffff; }
632
+ .text-primary-foreground { color: var(--color-white); }
633
+ .bg-primary-foreground { background-color: var(--color-white); }
493
634
  }
494
635
  /* ---- Base, keyframes & component helpers ---- */
495
636
  /* Hide scrollbars app-wide but keep scrollability. The demo UI is filled
@@ -506,6 +647,42 @@
506
647
  display: none;
507
648
  }
508
649
 
650
+ /* Ask landing: Hex's hierarchy translated into ADS tokens. The same quiet
651
+ texture spans the complete canvas; G2-G8 concentrate focus at the prompt. */
652
+ .ask-empty-state {
653
+ background-color: var(--color-white);
654
+ background-image: radial-gradient(
655
+ circle,
656
+ color-mix(in oklab, var(--color-g8) 22%, transparent) 0 0.75px,
657
+ transparent 0.9px
658
+ );
659
+ background-size: 12px 12px;
660
+ }
661
+
662
+ .ask-empty-hero-pattern {
663
+ background-image: radial-gradient(
664
+ ellipse at 50% 52%,
665
+ color-mix(in oklab, var(--color-g3) 88%, transparent) 0%,
666
+ color-mix(in oklab, var(--color-g2) 48%, transparent) 38%,
667
+ transparent 68%
668
+ );
669
+ }
670
+
671
+ .ask-empty-composer [data-slot="aui_composer-shell"] {
672
+ border-color: var(--color-ng4);
673
+ box-shadow: var(--shadow-200);
674
+ }
675
+
676
+ .ask-empty-composer:focus-within [data-slot="aui_composer-shell"] {
677
+ border-color: var(--color-g8);
678
+ box-shadow: 0 0 0 3px var(--color-g4), var(--shadow-300);
679
+ }
680
+
681
+ .ask-section-label {
682
+ font-size: 0.6875rem;
683
+ line-height: 1rem;
684
+ }
685
+
509
686
  /* Artifact widgets are positioned by GridStack; ADS cards own the visible
510
687
  surface while the library content wrapper only clips during interaction.
511
688
  The subtle elevation lives on the wrapper (not the inner card) because the
@@ -636,44 +813,6 @@
636
813
  }
637
814
  }
638
815
 
639
- /* BrandLoader (src/components/brand-loader.tsx): each cell of the growth mark
640
- flickers on like a neon tube — hard cuts (steps(1)): off → on with a
641
- stutter → hold → off — on a staggered loop. fill-mode backwards keeps a
642
- cell dark through its delay, so the mark builds up cell by cell. */
643
- @keyframes brand-flicker {
644
- 0% {
645
- opacity: 0;
646
- }
647
- 6% {
648
- opacity: 1;
649
- }
650
- 9% {
651
- opacity: 0.15;
652
- }
653
- 12% {
654
- opacity: 1;
655
- }
656
- 15% {
657
- opacity: 0.35;
658
- }
659
- 18%,
660
- 82% {
661
- opacity: 1;
662
- }
663
- 90%,
664
- 100% {
665
- opacity: 0;
666
- }
667
- }
668
- .brand-loader-cell {
669
- animation: brand-flicker 3.4s steps(1) infinite backwards;
670
- }
671
- @media (prefers-reduced-motion: reduce) {
672
- .brand-loader-cell {
673
- animation: none; /* static full-opacity mark */
674
- }
675
- }
676
-
677
816
  @layer base {
678
817
  * {
679
818
  border-color: var(--border);
@@ -698,13 +837,14 @@
698
837
  font-synthesis-weight: none;
699
838
  }
700
839
 
701
- /* One typeface only: neutralize the browser's default monospace on
702
- code/kbd/samp/pre so they render in Aribau Grotesk like everything else. */
840
+ /* Literal code uses the bundled mono face, including unclassed semantic
841
+ code elements. UI copy and data remain in Aribau Grotesk. */
703
842
  code,
704
843
  kbd,
705
844
  samp,
706
845
  pre {
707
- font-family: inherit;
846
+ font-family: var(--font-mono);
847
+ font-feature-settings: normal;
708
848
  }
709
849
 
710
850
  /* Consistent focus ring across the system */
@@ -801,8 +941,8 @@
801
941
  /*
802
942
  * Interactive border — a reusable primitive (see src/lib/interactive.ts).
803
943
  * Any bordered element opts in with `.ads-interactive` + a trigger class; the
804
- * border snaps to a solid 100% brand-black stroke on hover and focus — no
805
- * halo, no elevation, no pulse (a shadow on a form control reads as
944
+ * border uses its configured hover and active colors — no halo, no elevation,
945
+ * no pulse (a shadow on a form control reads as
806
946
  * actionable-surface elevation, which controls must not claim).
807
947
  * Behaviour stays tunable through the CSS custom properties.
808
948
  */
@@ -836,13 +976,13 @@
836
976
  box-shadow: var(--glow-inset);
837
977
  }
838
978
 
839
- /* Focus / focus-within: solid brand-black 1px stroke, no glow, no pulse.
979
+ /* Focus / focus-within: configured active stroke, no glow, no pulse.
840
980
  Kept plain so form fields read as "this is where I'm typing" without
841
981
  the heartbeat animation that came before. */
842
982
  .ads-interactive.ads-on-focus:focus:not(:disabled):not([aria-invalid="true"]),
843
983
  .ads-interactive.ads-on-focus:focus-visible:not(:disabled):not([aria-invalid="true"]),
844
984
  .ads-interactive.ads-on-within:focus-within:not([aria-invalid="true"]) {
845
- border-color: var(--brand);
985
+ border-color: var(--glow-border-active);
846
986
  box-shadow: var(--glow-inset);
847
987
  }
848
988
 
@@ -853,7 +993,7 @@
853
993
  /* Invalid state (form fields) */
854
994
  .ads-interactive[aria-invalid="true"] {
855
995
  border-color: var(--color-danger-600);
856
- box-shadow: 0 0 0 3px var(--color-danger-100);
996
+ box-shadow: none;
857
997
  }
858
998
  }
859
999
 
@@ -983,7 +1123,7 @@
983
1123
  position: absolute;
984
1124
  inset-block: 0;
985
1125
  left: 0;
986
- border-left: 1px solid var(--border-strong);
1126
+ border-left: 1px solid var(--tree-stroke);
987
1127
  }
988
1128
  .ads-tree-rail:first-child::before,
989
1129
  .ads-tree-branch:first-child::before {
@@ -1010,8 +1150,8 @@
1010
1150
  top: 0;
1011
1151
  height: var(--tree-elbow, 1.125rem);
1012
1152
  width: 1rem;
1013
- border-bottom: 1px solid var(--border-strong);
1014
- border-left: 1px solid var(--border-strong);
1153
+ border-bottom: 1px solid var(--tree-stroke);
1154
+ border-left: 1px solid var(--tree-stroke);
1015
1155
  border-bottom-left-radius: var(--radius-lg);
1016
1156
  }
1017
1157