@actioneer/ads 0.5.3 → 0.5.5

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 (95) hide show
  1. package/components/accordion.js +15 -15
  2. package/components/agent-icon.d.ts +64 -0
  3. package/components/agent-icon.js +251 -0
  4. package/components/ai-elements/agent-trace.d.ts +8 -1
  5. package/components/ai-elements/agent-trace.js +164 -129
  6. package/components/ai-elements/chain-of-thought-icon.d.ts +42 -0
  7. package/components/ai-elements/chain-of-thought-icon.js +283 -0
  8. package/components/ai-elements/chain-of-thought.js +7 -7
  9. package/components/ai-elements/chart.js +38 -35
  10. package/components/ai-elements/index.d.ts +1 -0
  11. package/components/ai-elements/inline-citation.js +40 -40
  12. package/components/ai-elements/message.js +5 -5
  13. package/components/ai-elements/queue.js +1 -1
  14. package/components/ai-elements/research-activity.d.ts +2 -0
  15. package/components/ai-elements/research-activity.js +79 -81
  16. package/components/ai-elements/task-progress.js +2 -2
  17. package/components/ai-elements/tool.d.ts +4 -2
  18. package/components/ai-elements/tool.js +74 -54
  19. package/components/ai-elements/transcript.js +1 -1
  20. package/components/alert.js +1 -1
  21. package/components/answer.d.ts +2643 -311
  22. package/components/answer.js +1836 -425
  23. package/components/assistant-ui/answer-tool-ui.js +23 -28
  24. package/components/assistant-ui/chain-of-thought.d.ts +7 -2
  25. package/components/assistant-ui/composer-harness.js +20 -16
  26. package/components/assistant-ui/reasoning.js +35 -31
  27. package/components/assistant-ui/tool-fallback.js +125 -122
  28. package/components/assistant-ui/tool-group.d.ts +3 -1
  29. package/components/assistant-ui/tool-group.js +48 -43
  30. package/components/audio-waveform.js +14 -14
  31. package/components/autocomplete.js +52 -48
  32. package/components/avatar.js +58 -44
  33. package/components/badge.js +3 -3
  34. package/components/brand-texture.js +1 -1
  35. package/components/breadcrumbs.d.ts +27 -1
  36. package/components/breadcrumbs.js +94 -42
  37. package/components/button.js +15 -15
  38. package/components/carousel.js +10 -10
  39. package/components/chart.d.ts +14 -0
  40. package/components/chart.js +747 -614
  41. package/components/chip.js +3 -3
  42. package/components/code-block.d.ts +39 -17
  43. package/components/code-block.js +153 -104
  44. package/components/command-palette.js +27 -25
  45. package/components/connector-card.js +2 -2
  46. package/components/dropdown.js +65 -61
  47. package/components/empty-state.js +15 -15
  48. package/components/field.js +23 -23
  49. package/components/index.d.ts +5 -0
  50. package/components/index.js +523 -470
  51. package/components/infinite-canvas.js +60 -60
  52. package/components/kbd.js +6 -6
  53. package/components/link.js +6 -6
  54. package/components/modal.js +22 -20
  55. package/components/page-header.js +1 -1
  56. package/components/pagination.js +22 -22
  57. package/components/pixel-blast-svg.js +1 -1
  58. package/components/pixel-icon.d.ts +31 -0
  59. package/components/pixel-icon.js +733 -0
  60. package/components/popover.js +46 -42
  61. package/components/ripple.d.ts +29 -0
  62. package/components/ripple.js +17 -0
  63. package/components/segmented.js +24 -23
  64. package/components/select.js +71 -67
  65. package/components/selection-action-bar.js +22 -22
  66. package/components/sidebar.d.ts +11 -3
  67. package/components/sidebar.js +161 -148
  68. package/components/stepper.d.ts +2 -0
  69. package/components/stepper.js +80 -43
  70. package/components/table.d.ts +7 -0
  71. package/components/table.js +223 -155
  72. package/components/tabs.d.ts +3 -1
  73. package/components/tabs.js +165 -144
  74. package/components/textarea.js +10 -8
  75. package/components/toast.js +48 -46
  76. package/components/tooltip.js +61 -59
  77. package/components/tree.js +44 -41
  78. package/components/typography.d.ts +1 -1
  79. package/components/typography.js +25 -25
  80. package/components/viz-charts.d.ts +62 -0
  81. package/components/viz-charts.js +408 -0
  82. package/fonts/aribau-grotesk-500.otf +0 -0
  83. package/fonts/aribau-grotesk-600.woff2 +0 -0
  84. package/fonts.css +6 -4
  85. package/lib/icons.d.ts +411 -402
  86. package/lib/icons.js +109 -107
  87. package/lib/viz-format.d.ts +25 -0
  88. package/lib/viz-format.js +40 -0
  89. package/llms.txt +111 -8
  90. package/manifest.json +1096 -58
  91. package/package.json +5 -5
  92. package/styles.css +226 -96
  93. package/theme.css +220 -92
  94. package/fonts/aribau-grotesk-400.otf +0 -0
  95. package/fonts/aribau-grotesk-700.otf +0 -0
package/theme.css CHANGED
@@ -2,7 +2,7 @@
2
2
  /*
3
3
  * ============================================================
4
4
  * ADS 1.0 — Design Tokens
5
- * Brand: Sage (green) · Neutrals: warm greige · Typeface: Aribau Grotesk
5
+ * Brand: Sage (green) · Neutrals: brand-palette grey · Typeface: Aribau Grotesk
6
6
  * ============================================================
7
7
  */
8
8
  @theme {
@@ -40,35 +40,45 @@
40
40
  --text-2xl: 1.625rem; /* 26px — display */
41
41
  --text-2xl--line-height: 2rem;
42
42
 
43
- /* ---- Neutral ramp — warm greige (the workhorse: backgrounds, surfaces,
44
- text, borders). Kept a touch warm so it sits with Sage without turning
45
- green — one family, not colour plus grey. The `ink` name is retained so
46
- every existing reference resolves; the values are now greige. ---- */
47
- --color-ink-50: #f2f2ed;
48
- --color-ink-100: #e7e7e1;
49
- --color-ink-200: #d8d7cf;
50
- --color-ink-300: #c7c6be;
51
- --color-ink-400: #a8a79e;
52
- --color-ink-500: #8c8c84;
53
- --color-ink-600: #6b6b63;
54
- --color-ink-700: #4a4a44;
55
- --color-ink-800: #33322e;
56
- --color-ink-900: #26251f;
57
- --color-ink-950: #1a1a17;
58
-
59
- /* ---- Brand ramp — Sage (one green hue: brand, primary actions, focal
60
- data). 600 is the primary. On a white/greige ground, colour earns its
61
- place — the eye always knows where to look. ---- */
62
- --color-sage-50: #eff5ea;
63
- --color-sage-100: #dde8cf;
64
- --color-sage-200: #a9ce86;
65
- --color-sage-300: #8abb6a;
66
- --color-sage-400: #6da24e;
67
- --color-sage-500: #548c41;
68
- --color-sage-600: #3f7a34;
69
- --color-sage-700: #2c5724;
70
- --color-sage-800: #254a1d;
71
- --color-sage-900: #1e3a16;
43
+ /* ---- Neutral ramp — the full 12-step brand palette grey (light section,
44
+ solid row). A Radix-style scale: each step owns a role — 50/100 =
45
+ backgrounds, 200/300/400 = interactive component fills, 500/600/700 =
46
+ borders & separators, 800/850 = solid, 900/950 = accessible text. All 12
47
+ values are present (the earlier 11-step cut is restored: #82827f is
48
+ ink-850). The `ink` name is retained so every existing reference resolves;
49
+ the semantic tokens below are re-derived from these roles. ---- */
50
+ --color-ink-50: #fdfdfc; /* 1 · background */
51
+ --color-ink-100: #f9f9f8; /* 2 · background */
52
+ --color-ink-200: #f0f0ef; /* 3 · interactive */
53
+ --color-ink-300: #e8e8e7; /* 4 · interactive */
54
+ --color-ink-400: #e1e1e0; /* 5 · interactive */
55
+ --color-ink-500: #d9d9d8; /* 6 · border */
56
+ --color-ink-600: #cececd; /* 7 · border */
57
+ --color-ink-700: #bbbbb9; /* 8 · border */
58
+ --color-ink-800: #8c8c89; /* 9 · solid */
59
+ --color-ink-850: #82827f; /* 10 · solid */
60
+ --color-ink-900: #636461; /* 11 · accessible text */
61
+ --color-ink-950: #1f1f1c; /* 12 · accessible text */
62
+
63
+ /* ---- Brand ramp — the full 12-step Sage green (light section, solid row),
64
+ same Radix roles as the neutral ramp. All 12 present: sage-850 (#417c36,
65
+ step 11 = the accessible green text tone) and sage-950 (#273d23, step 12)
66
+ are restored. The interactive brand (--brand #3f7a34) is step 9 (solid);
67
+ its hover is step 10 (#316c26). NOTE: steps 9–12 are not a pure lightness
68
+ ramp (Radix convention) — the Tailwind name order differs from role
69
+ order, so read the role comment, not the number. ---- */
70
+ --color-sage-50: #fbfefb; /* 1 · background */
71
+ --color-sage-100: #f6fbf5; /* 2 · background */
72
+ --color-sage-200: #e9f7e6; /* 3 · interactive */
73
+ --color-sage-300: #dbf1d6; /* 4 · interactive */
74
+ --color-sage-400: #cae8c5; /* 5 · interactive */
75
+ --color-sage-500: #b6dcaf; /* 6 · border */
76
+ --color-sage-600: #9ccc93; /* 7 · border */
77
+ --color-sage-700: #77b76b; /* 8 · border */
78
+ --color-sage-800: #3f7a34; /* 9 · solid (brand) */
79
+ --color-sage-900: #316c26; /* 10 · solid (hover) */
80
+ --color-sage-850: #417c36; /* 11 · accessible text */
81
+ --color-sage-950: #273d23; /* 12 · accessible text */
72
82
 
73
83
  /* ---- Semantic accent ramps ---- */
74
84
  /* Success — shifted cooler (emerald/teal) so positive states stay clearly
@@ -110,13 +120,14 @@
110
120
  --color-amber-base: #f3a72e;
111
121
  --color-amber-deep: #b57414;
112
122
 
113
- /* ---- Radii ---- */
114
- --radius-xs: 0.25rem;
115
- --radius-sm: 0.375rem;
116
- --radius-md: 0.5rem;
117
- --radius-lg: 0.625rem;
118
- --radius-xl: 0.875rem;
119
- --radius-2xl: 1.25rem;
123
+ /* ---- Radii ---- FIVE steps only: 2 · 4 · 8 · 16 · 24 (px), plus `full`
124
+ for pills/circles. xs aliases sm (4px); 2xl aliases xl (24px). */
125
+ --radius-xs: 0.25rem; /* 4px */
126
+ --radius-sm: 0.25rem; /* 4px */
127
+ --radius-md: 0.5rem; /* 8px */
128
+ --radius-lg: 1rem; /* 16px */
129
+ --radius-xl: 1.5rem; /* 24px */
130
+ --radius-2xl: 1.5rem; /* 24px (alias xl) */
120
131
  --radius-full: 9999px;
121
132
  /* Status/indicator dots are SQUARE with a hair of softening — echoing the
122
133
  growth-mark's square cells. Never render an indicator dot as a circle
@@ -125,10 +136,21 @@
125
136
  --radius-dot: 2px;
126
137
 
127
138
  /* ---- Elevation ---- ONE soft token (Claude-panel style).
128
- Delineate surfaces with fill color first; add this to gently lift them. */
129
- --shadow-elevation: 0 0 0 1px rgb(10 10 11 / 0.03),
130
- 0 1px 2px 0 rgb(10 10 11 / 0.04),
131
- 0 8px 28px -8px rgb(10 10 11 / 0.09);
139
+ Delineate surfaces with fill color first; add this to gently lift them.
140
+ Tuned quieter (2026-07-30): the ambient drop sits closer (y8→y4,
141
+ blur28→16) at lower opacity (9%→6%) with a faint COOL slate tint
142
+ (rgb 15 23 42, not near-black) — a hard, offset-heavy black drop read
143
+ "cheap" and floated small controls (switch thumb, tab pill). */
144
+ --shadow-elevation: 0 0 0 1px rgb(15 23 42 / 0.03),
145
+ 0 1px 2px 0 rgb(15 23 42 / 0.04),
146
+ 0 4px 16px -6px rgb(15 23 42 / 0.06);
147
+
148
+ /* Pinned-table-column smudges — whisper-soft directional casts shown only
149
+ while content is hidden behind a sticky column (Table is scroll-aware).
150
+ Deep negative spread keeps the edge feathered; same cool slate tint as
151
+ the elevation token. */
152
+ --shadow-table-smudge-left: 8px 0 24px -14px rgb(15 23 42 / 0.05);
153
+ --shadow-table-smudge-right: -8px 0 24px -14px rgb(15 23 42 / 0.05);
132
154
 
133
155
  /* ---- CTA inner glow ---- luminous inset highlight for primary buttons
134
156
  (adapted from the "AI button" Figma): a crisp top-edge catch plus a soft
@@ -180,7 +202,7 @@
180
202
  --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
181
203
  --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
182
204
  --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
183
- --sidebar-navigation-text-size: 0.8125rem; /* 13px — sidebar actions, items, history, and account text */
205
+ --sidebar-navigation-text-size: var(--text-base); /* 15px — sidebar actions, items, history, and account text */
184
206
  --sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
185
207
  --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
186
208
  --aside-width: 20rem; /* 320px — right-hand panel column */
@@ -193,7 +215,7 @@
193
215
  /* ---- Chat (Ask Actioneer / assistant-ui) ---- */
194
216
  --thread-max-width: 44rem; /* chat column cap — readable prose measure, all panes */
195
217
  --thread-max-width-wide: 64rem; /* rich-content breakout cap (tables/charts/tool cards) on wide panes; prose keeps --thread-max-width */
196
- --composer-bg: color-mix(in oklab, var(--muted) 30%, var(--background));
218
+ --composer-bg: var(--elevated); /* pure white composer surface */
197
219
  --composer-radius: var(--radius-2xl);
198
220
  --composer-padding: 0.5rem;
199
221
  --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 */
@@ -206,21 +228,26 @@
206
228
  * every comparison series survives production builds.
207
229
  */
208
230
  :root {
209
- /* Data-series palette — NO GREEN (user-mandated): green implies "good /
210
- growing" even when the numbers fall, so data series must stay
211
- valence-neutral. Cyan deep leads as the focal/primary series; amber,
212
- ink and the remaining non-green accents extend, with a mid ink for a
213
- sixth series. Sage/lime stay OUT of charts — green is
214
- reserved for genuinely semantic success (badges, deltas the caller has
215
- judged positive). Explicit hexes (not var()) so every series survives
216
- @theme pruning, since chart colours are referenced from SVG prop
217
- strings. */
218
- --color-chart-1: #0a7e82; /* cyan deep — primary / focal series */
219
- --color-chart-2: #f3a72e; /* amber base */
220
- --color-chart-3: #26251f; /* ink 900 */
221
- --color-chart-4: #12b5a5; /* cyan base */
222
- --color-chart-5: #b57414; /* amber deep */
223
- --color-chart-6: #8c8c84; /* ink 500 — extended series */
231
+ /* Data-series palette — its OWN palette, separate from the brand ramps, in
232
+ the editorial multi-series idiom (distinct, saturated hues that stay
233
+ apart at 1.5px stroke and at dot size).
234
+
235
+ NEITHER GREEN NOR RED (user-mandated): both carry verdicts — green reads
236
+ "good" and red reads "bad" even when the series is just a named entity,
237
+ so a category key must never imply one. Green/red stay reserved for
238
+ genuinely semantic states (success badges, danger alerts, a delta the
239
+ CALLER has judged). Blue leads as the focal series; purple, orange, cyan
240
+ and amber extend; grey closes as the sixth and doubles as the
241
+ de-emphasis tone.
242
+
243
+ Explicit hexes (not var()) so every series survives @theme pruning,
244
+ since chart colours are referenced from SVG prop strings. */
245
+ --color-chart-1: #3d9aa4; /* teal — primary / focal (the right edge of the brand set) */
246
+ --color-chart-2: #f7d06b; /* golden yellow — the warm 2nd series */
247
+ --color-chart-3: #52496e; /* muted purple */
248
+ --color-chart-4: #2d6f8a; /* deep teal-blue */
249
+ --color-chart-5: #232149; /* navy ink */
250
+ --color-chart-6: #8c8c84; /* grey — extended series + de-emphasis tone */
224
251
  }
225
252
 
226
253
  /*
@@ -250,10 +277,12 @@
250
277
  --color-brand: var(--brand);
251
278
  --color-brand-foreground: var(--brand-foreground);
252
279
  --color-brand-hover: var(--brand-hover);
280
+ --color-brand-text: var(--brand-text);
253
281
 
254
282
  /* Quiet fill — secondary buttons, avatars, chips */
255
283
  --color-fill: var(--fill);
256
284
  --color-fill-foreground: var(--fill-foreground);
285
+ --color-table-shell: var(--table-shell);
257
286
 
258
287
  --color-accent: var(--accent);
259
288
  --color-accent-foreground: var(--accent-foreground);
@@ -267,6 +296,9 @@
267
296
  --color-info: var(--color-info-600);
268
297
  --color-info-foreground: #ffffff;
269
298
 
299
+ --color-border-primary: var(--border-primary);
300
+ --color-border-secondary: var(--border-secondary);
301
+ --color-border-tertiary: var(--border-tertiary);
270
302
  --color-border: var(--border);
271
303
  --color-border-strong: var(--border-strong);
272
304
  --color-input: var(--input);
@@ -281,7 +313,7 @@
281
313
  * shadcn's grey/black defaults. The raw --sidebar-*/--popover values live in
282
314
  * :root below.
283
315
  */
284
- --color-primary-foreground: var(--brand-foreground);
316
+ --color-primary-foreground: #ffffff;
285
317
  --color-secondary-foreground: #ffffff;
286
318
  --color-destructive: var(--color-danger-600);
287
319
  --color-destructive-foreground: #ffffff;
@@ -300,28 +332,34 @@
300
332
 
301
333
  /* ---- Theme (light only) ---- */
302
334
  :root {
303
- --background: #f7f7f3;
304
- --foreground: #1a1a17;
305
-
306
- /* Text hierarchy — accessible on the warm greige canvas */
307
- --text-primary: #1a1a17; /* ~17:1 AAA */
308
- --text-secondary: #4a4a44; /* ~8.5:1 AAA */
309
- --text-tertiary: #6b6b63; /* ~4.8:1 AA */
310
-
311
- --surface: #f2f2ed; /* warm greige — the tinted canvas */
312
- --surface-foreground: #33322e;
313
- --elevated: #ffffff;
314
-
315
- --muted: #e7e7e1;
316
- --muted-foreground: #6b6b63;
317
-
318
- --card: #ffffff;
319
- --card-foreground: #1a1a17;
320
-
321
- /* Sage brand (green) — primary actions, focal moments */
322
- --brand: #3f7a34;
335
+ /* Every semantic token below points INTO a primitive scale step
336
+ (var(--color-ink-*) / var(--color-sage-*)) — the 12-step scales are the
337
+ single source of truth. Only pure white (#ffffff) stays literal: it is a
338
+ base surface, not a neutral scale step. */
339
+ --background: var(--color-ink-100); /* step 2 · canvas */
340
+ --foreground: var(--color-ink-950); /* step 12 */
341
+
342
+ /* Text levels: primary ink-950, secondary ink-900, tertiary ink-800.
343
+ Primary + secondary clear AA for body copy; tertiary is AA-large only. */
344
+ --text-primary: var(--color-ink-950); /* ~16:1 AAA */
345
+ --text-secondary: var(--color-ink-900); /* ~5.3:1 AA */
346
+ --text-tertiary: var(--color-ink-800); /* ~3:1 AA-large */
347
+
348
+ --surface: var(--color-ink-200); /* step 3 · tinted canvas */
349
+ --surface-foreground: var(--color-ink-950);
350
+ --elevated: #ffffff; /* pure white base */
351
+
352
+ --muted: var(--color-ink-300); /* step 4 */
353
+ --muted-foreground: var(--color-ink-900);/* step 11 · readable UI text */
354
+
355
+ --card: #ffffff; /* pure white base */
356
+ --card-foreground: var(--color-ink-950);
357
+
358
+ /* Sage brand (green) — solid role. brand = sage step 9, hover = step 10. */
359
+ --brand: var(--color-sage-800); /* step 9 · solid */
323
360
  --brand-foreground: #ffffff;
324
- --brand-hover: #2c5724;
361
+ --brand-hover: var(--color-sage-900); /* step 10 · hover */
362
+ --brand-text: var(--color-sage-850); /* step 11 · accessible green text/links */
325
363
 
326
364
  /* Table interaction fills are pre-composited and opaque. Sticky edge cells
327
365
  therefore cover horizontally scrolled content while preserving the
@@ -330,22 +368,55 @@
330
368
  --table-row-selected: color-mix(in srgb, var(--card) 10%, var(--muted));
331
369
 
332
370
  /* Quiet fill */
333
- --fill: #e7e7e1;
334
- --fill-foreground: #1a1a17;
335
-
336
- --accent: #edece6;
337
- --accent-foreground: #1a1a17;
338
-
339
- --border: #e7e7e1;
340
- --border-strong: #c7c6be;
341
- --input: #c7c6be;
342
- --ring: rgb(63 122 52 / 0.5);
343
- --overlay: rgb(26 26 23 / 0.5);
371
+ --fill: var(--color-ink-50); /* step 1 · lightest recessed fill */
372
+ --fill-foreground: var(--color-ink-950);
373
+
374
+ --accent: var(--color-ink-200); /* step 3 */
375
+ --accent-foreground: var(--color-ink-950);
376
+
377
+ /* Borders — a three-level scale, primary (strongest) → tertiary (faintest). */
378
+ --border-primary: var(--color-ink-600); /* #cececd · strongest */
379
+ --border-secondary: var(--color-ink-400); /* #e1e1e0 · default */
380
+ --border-tertiary: var(--color-ink-200); /* #f0f0ef · faintest */
381
+ /* Legacy aliases point into the scale so existing utilities keep resolving. */
382
+ --border: var(--border-secondary); /* default hairline / separator */
383
+ --border-strong: var(--border-primary); /* emphasized / hover / selected */
384
+ --input: var(--border-primary); /* form-control edge */
385
+
386
+ /* Ripple — the appearance wash that radiates from a floating surface's
387
+ origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft brand
388
+ tint that expands + fades once on mount; see the `.ads-ripple` layer and
389
+ the `Ripple` component. Duration stays in the sub-300ms UI band. */
390
+ --ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
391
+ --ripple-duration: 300ms;
392
+
393
+ /* Stroke width — ADS hairlines are 0.5px, not the Tailwind 1px default.
394
+ The single-width border utilities are overridden to this token at the
395
+ bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
396
+ true hairline. Explicit `border-2`+ widths are unaffected. */
397
+ --stroke-width: 0.5px;
398
+ --ring: color-mix(in srgb, var(--color-sage-800) 50%, transparent); /* brand @ 50% */
399
+ --overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
400
+
401
+ /* Functional / domain tokens — named for their RENDER role, pointing into
402
+ the ink scale. Components pass these into non-CSS renderers (Recharts,
403
+ React Flow, the Paper/WebGL texture) so no component carries a raw ink-*
404
+ value. Same DS pattern as the data-viz --color-chart-* palette. */
405
+ --chart-axis: var(--color-ink-200); /* axis lines + de-emphasised marks */
406
+ --chart-grid: var(--color-ink-50); /* gridlines */
407
+ --chart-track: var(--color-ink-100); /* funnel / progress track */
408
+ --chart-context: var(--color-ink-300); /* de-emphasised context series */
409
+ --canvas-edge: var(--color-ink-300); /* infinite-canvas edges / connectors */
410
+ --texture-ink: var(--color-ink-950); /* brand-texture / pixel-blast marks */
411
+ --table-shell: var(--color-ink-200); /* recessed table tray (lighter than muted) */
412
+ --table-scroll-hint: rgb(15 23 42 / 0.04); /* right-edge "more columns" wash */
413
+ --surface-inverse: var(--color-ink-950); /* dark hero / inverse surface base */
414
+ --surface-inverse-soft: var(--color-ink-900); /* dark hero gradient falloff */
344
415
 
345
416
  /* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
346
417
  (or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
347
418
  palette instead of shadcn's grey/black defaults. The sidebar reads as the
348
- warm greige canvas; its active item takes Sage. A consumer that had
419
+ neutral canvas; its active item takes Sage. A consumer that had
349
420
  hard-coded these can now delete its overrides and inherit from here. */
350
421
  --sidebar: var(--surface);
351
422
  --sidebar-foreground: var(--foreground);
@@ -358,3 +429,60 @@
358
429
  --popover: var(--elevated);
359
430
  --popover-foreground: var(--foreground);
360
431
  }
432
+
433
+ /*
434
+ * ============================================================
435
+ * Hairline strokes — ADS strokes are 0.5px, not 1px (principle 1).
436
+ * Override Tailwind's single-width border utilities to the
437
+ * --stroke-width token. Authored after `}
438
+ .border-t { border-top-width: var(--stroke-width); }
439
+ .border-r { border-right-width: var(--stroke-width); }
440
+ .border-b { border-bottom-width: var(--stroke-width); }
441
+ .border-l { border-left-width: var(--stroke-width); }
442
+ .border-x { border-inline-start-width: var(--stroke-width); border-inline-end-width: var(--stroke-width); }
443
+ .border-y { border-block-start-width: var(--stroke-width); border-block-end-width: var(--stroke-width); }
444
+ }
445
+
446
+ /*
447
+ * ============================================================
448
+ * Ripple — appearance wash for floating surfaces (principle 3).
449
+ * A soft brand tint that expands from the panel's origin corner
450
+ * and fades, once, as the surface mounts. Rendered by the
451
+ * `Ripple` component as an absolute, pointer-events-none layer
452
+ * clipped to the panel radius. Honours reduced-motion.
453
+ * ============================================================
454
+ */
455
+ @keyframes ads-ripple-wave {
456
+ 0% { opacity: 0.6; transform: scale(0.15); }
457
+ 100% { opacity: 0; transform: scale(1.08); }
458
+ }
459
+ .ads-ripple {
460
+ position: absolute;
461
+ inset: 0;
462
+ z-index: -1;
463
+ border-radius: inherit;
464
+ overflow: hidden;
465
+ pointer-events: none;
466
+ transform-origin: var(--ripple-origin, center);
467
+ background: radial-gradient(125% 125% at var(--ripple-origin, center), var(--ripple-tint), transparent 62%);
468
+ animation: ads-ripple-wave var(--ripple-duration, 300ms) var(--ease-out) forwards;
469
+ will-change: transform, opacity;
470
+ }
471
+ @media (prefers-reduced-motion: reduce) {
472
+ .ads-ripple { animation: none; opacity: 0; }
473
+ }
474
+
475
+ /*
476
+ * ============================================================
477
+ * primary-foreground utility backfill.
478
+ * Tailwind emits `text/bg-secondary-foreground` but NOT the
479
+ * `primary-foreground` companion (its base `--color-primary` is the ADS
480
+ * text-hierarchy token, which collides with the generated `primary` color),
481
+ * so the vendored shadcn button's icon rendered invisible (dark-on-dark) on
482
+ * `bg-primary`. Define the two utilities explicitly against white.
483
+ * ============================================================
484
+ */
485
+ @layer utilities {
486
+ .text-primary-foreground { color: #ffffff; }
487
+ .bg-primary-foreground { background-color: #ffffff; }
488
+ }
Binary file
Binary file