@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.
- package/components/accordion.js +15 -15
- package/components/agent-icon.d.ts +64 -0
- package/components/agent-icon.js +251 -0
- package/components/ai-elements/agent-trace.d.ts +8 -1
- package/components/ai-elements/agent-trace.js +164 -129
- package/components/ai-elements/chain-of-thought-icon.d.ts +42 -0
- package/components/ai-elements/chain-of-thought-icon.js +283 -0
- package/components/ai-elements/chain-of-thought.js +7 -7
- package/components/ai-elements/chart.js +38 -35
- package/components/ai-elements/index.d.ts +1 -0
- package/components/ai-elements/inline-citation.js +40 -40
- package/components/ai-elements/message.js +5 -5
- package/components/ai-elements/queue.js +1 -1
- package/components/ai-elements/research-activity.d.ts +2 -0
- package/components/ai-elements/research-activity.js +79 -81
- package/components/ai-elements/task-progress.js +2 -2
- package/components/ai-elements/tool.d.ts +4 -2
- package/components/ai-elements/tool.js +74 -54
- package/components/ai-elements/transcript.js +1 -1
- package/components/alert.js +1 -1
- package/components/answer.d.ts +2643 -311
- package/components/answer.js +1836 -425
- package/components/assistant-ui/answer-tool-ui.js +23 -28
- package/components/assistant-ui/chain-of-thought.d.ts +7 -2
- package/components/assistant-ui/composer-harness.js +20 -16
- package/components/assistant-ui/reasoning.js +35 -31
- package/components/assistant-ui/tool-fallback.js +125 -122
- package/components/assistant-ui/tool-group.d.ts +3 -1
- package/components/assistant-ui/tool-group.js +48 -43
- package/components/audio-waveform.js +14 -14
- package/components/autocomplete.js +52 -48
- package/components/avatar.js +58 -44
- package/components/badge.js +3 -3
- package/components/brand-texture.js +1 -1
- package/components/breadcrumbs.d.ts +27 -1
- package/components/breadcrumbs.js +94 -42
- package/components/button.js +15 -15
- package/components/carousel.js +10 -10
- package/components/chart.d.ts +14 -0
- package/components/chart.js +747 -614
- package/components/chip.js +3 -3
- package/components/code-block.d.ts +39 -17
- package/components/code-block.js +153 -104
- package/components/command-palette.js +27 -25
- package/components/connector-card.js +2 -2
- package/components/dropdown.js +65 -61
- package/components/empty-state.js +15 -15
- package/components/field.js +23 -23
- package/components/index.d.ts +5 -0
- package/components/index.js +523 -470
- package/components/infinite-canvas.js +60 -60
- package/components/kbd.js +6 -6
- package/components/link.js +6 -6
- package/components/modal.js +22 -20
- package/components/page-header.js +1 -1
- package/components/pagination.js +22 -22
- package/components/pixel-blast-svg.js +1 -1
- package/components/pixel-icon.d.ts +31 -0
- package/components/pixel-icon.js +733 -0
- package/components/popover.js +46 -42
- package/components/ripple.d.ts +29 -0
- package/components/ripple.js +17 -0
- package/components/segmented.js +24 -23
- package/components/select.js +71 -67
- package/components/selection-action-bar.js +22 -22
- package/components/sidebar.d.ts +11 -3
- package/components/sidebar.js +161 -148
- package/components/stepper.d.ts +2 -0
- package/components/stepper.js +80 -43
- package/components/table.d.ts +7 -0
- package/components/table.js +223 -155
- package/components/tabs.d.ts +3 -1
- package/components/tabs.js +165 -144
- package/components/textarea.js +10 -8
- package/components/toast.js +48 -46
- package/components/tooltip.js +61 -59
- package/components/tree.js +44 -41
- package/components/typography.d.ts +1 -1
- package/components/typography.js +25 -25
- package/components/viz-charts.d.ts +62 -0
- package/components/viz-charts.js +408 -0
- package/fonts/aribau-grotesk-500.otf +0 -0
- package/fonts/aribau-grotesk-600.woff2 +0 -0
- package/fonts.css +6 -4
- package/lib/icons.d.ts +411 -402
- package/lib/icons.js +109 -107
- package/lib/viz-format.d.ts +25 -0
- package/lib/viz-format.js +40 -0
- package/llms.txt +111 -8
- package/manifest.json +1096 -58
- package/package.json +5 -5
- package/styles.css +226 -96
- package/theme.css +220 -92
- package/fonts/aribau-grotesk-400.otf +0 -0
- package/fonts/aribau-grotesk-700.otf +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actioneer/ads",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "Actioneer Design System 1.0 — React 19 + Tailwind v4 component library.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -30,20 +30,20 @@
|
|
|
30
30
|
"ads": "./bin/ads-init.mjs"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"react": "^19.
|
|
34
|
-
"react-dom": "^19.
|
|
33
|
+
"react": "^19.2.8",
|
|
34
|
+
"react-dom": "^19.2.8"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@assistant-ui/react": "^0.14.26",
|
|
38
38
|
"@assistant-ui/react-markdown": "^0.14.5",
|
|
39
|
-
"@hugeicons/core-free-icons": "^4.2.2",
|
|
40
|
-
"@hugeicons/react": "^1.1.9",
|
|
41
39
|
"@paper-design/shaders": "^0.0.77",
|
|
42
40
|
"@paper-design/shaders-react": "^0.0.77",
|
|
41
|
+
"@phosphor-icons/react": "^2.1.10",
|
|
43
42
|
"@xyflow/react": "^12.11.2",
|
|
44
43
|
"class-variance-authority": "^0.7.1",
|
|
45
44
|
"clsx": "^2.1.1",
|
|
46
45
|
"motion": "^12.42.2",
|
|
46
|
+
"ogl": "^1.0.11",
|
|
47
47
|
"radix-ui": "^1.6.2",
|
|
48
48
|
"recharts": "^2.15.4",
|
|
49
49
|
"remark-gfm": "^4.0.1",
|
package/styles.css
CHANGED
|
@@ -6,9 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
/* ---- Aribau Grotesk ---- */
|
|
8
8
|
/* Aribau Grotesk — ADS 1.0 brand typeface.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
TWO weights only: Regular (400) and Semibold (600). Use `font-normal` and
|
|
10
|
+
`font-semibold` — there is NO dedicated bold face, so never reach for
|
|
11
|
+
`font-bold` (it would just fold onto the 600 file). The weight RANGES map
|
|
12
|
+
Tailwind's utilities onto the two physical files:
|
|
13
|
+
`font-normal` → Regular (100–500), `font-semibold` → Semibold (600–900).
|
|
12
14
|
`font-synthesis-weight: none` (set in index.css) prevents faux weights. */
|
|
13
15
|
@font-face {
|
|
14
16
|
font-family: "Aribau Grotesk";
|
|
@@ -19,7 +21,7 @@
|
|
|
19
21
|
}
|
|
20
22
|
@font-face {
|
|
21
23
|
font-family: "Aribau Grotesk";
|
|
22
|
-
src: url("./fonts/aribau-grotesk-
|
|
24
|
+
src: url("./fonts/aribau-grotesk-600.woff2") format("woff2");
|
|
23
25
|
font-weight: 600 900;
|
|
24
26
|
font-style: normal;
|
|
25
27
|
font-display: swap;
|
|
@@ -29,7 +31,7 @@
|
|
|
29
31
|
/*
|
|
30
32
|
* ============================================================
|
|
31
33
|
* ADS 1.0 — Design Tokens
|
|
32
|
-
* Brand: Sage (green) · Neutrals:
|
|
34
|
+
* Brand: Sage (green) · Neutrals: brand-palette grey · Typeface: Aribau Grotesk
|
|
33
35
|
* ============================================================
|
|
34
36
|
*/
|
|
35
37
|
@theme {
|
|
@@ -67,35 +69,45 @@
|
|
|
67
69
|
--text-2xl: 1.625rem; /* 26px — display */
|
|
68
70
|
--text-2xl--line-height: 2rem;
|
|
69
71
|
|
|
70
|
-
/* ---- Neutral ramp —
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
--color-ink-
|
|
78
|
-
--color-ink-
|
|
79
|
-
--color-ink-
|
|
80
|
-
--color-ink-
|
|
81
|
-
--color-ink-
|
|
82
|
-
--color-ink-
|
|
83
|
-
--color-ink-
|
|
84
|
-
--color-ink-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
--color-sage-
|
|
98
|
-
--color-sage-
|
|
72
|
+
/* ---- Neutral ramp — the full 12-step brand palette grey (light section,
|
|
73
|
+
solid row). A Radix-style scale: each step owns a role — 50/100 =
|
|
74
|
+
backgrounds, 200/300/400 = interactive component fills, 500/600/700 =
|
|
75
|
+
borders & separators, 800/850 = solid, 900/950 = accessible text. All 12
|
|
76
|
+
values are present (the earlier 11-step cut is restored: #82827f is
|
|
77
|
+
ink-850). The `ink` name is retained so every existing reference resolves;
|
|
78
|
+
the semantic tokens below are re-derived from these roles. ---- */
|
|
79
|
+
--color-ink-50: #fdfdfc; /* 1 · background */
|
|
80
|
+
--color-ink-100: #f9f9f8; /* 2 · background */
|
|
81
|
+
--color-ink-200: #f0f0ef; /* 3 · interactive */
|
|
82
|
+
--color-ink-300: #e8e8e7; /* 4 · interactive */
|
|
83
|
+
--color-ink-400: #e1e1e0; /* 5 · interactive */
|
|
84
|
+
--color-ink-500: #d9d9d8; /* 6 · border */
|
|
85
|
+
--color-ink-600: #cececd; /* 7 · border */
|
|
86
|
+
--color-ink-700: #bbbbb9; /* 8 · border */
|
|
87
|
+
--color-ink-800: #8c8c89; /* 9 · solid */
|
|
88
|
+
--color-ink-850: #82827f; /* 10 · solid */
|
|
89
|
+
--color-ink-900: #636461; /* 11 · accessible text */
|
|
90
|
+
--color-ink-950: #1f1f1c; /* 12 · accessible text */
|
|
91
|
+
|
|
92
|
+
/* ---- Brand ramp — the full 12-step Sage green (light section, solid row),
|
|
93
|
+
same Radix roles as the neutral ramp. All 12 present: sage-850 (#417c36,
|
|
94
|
+
step 11 = the accessible green text tone) and sage-950 (#273d23, step 12)
|
|
95
|
+
are restored. The interactive brand (--brand #3f7a34) is step 9 (solid);
|
|
96
|
+
its hover is step 10 (#316c26). NOTE: steps 9–12 are not a pure lightness
|
|
97
|
+
ramp (Radix convention) — the Tailwind name order differs from role
|
|
98
|
+
order, so read the role comment, not the number. ---- */
|
|
99
|
+
--color-sage-50: #fbfefb; /* 1 · background */
|
|
100
|
+
--color-sage-100: #f6fbf5; /* 2 · background */
|
|
101
|
+
--color-sage-200: #e9f7e6; /* 3 · interactive */
|
|
102
|
+
--color-sage-300: #dbf1d6; /* 4 · interactive */
|
|
103
|
+
--color-sage-400: #cae8c5; /* 5 · interactive */
|
|
104
|
+
--color-sage-500: #b6dcaf; /* 6 · border */
|
|
105
|
+
--color-sage-600: #9ccc93; /* 7 · border */
|
|
106
|
+
--color-sage-700: #77b76b; /* 8 · border */
|
|
107
|
+
--color-sage-800: #3f7a34; /* 9 · solid (brand) */
|
|
108
|
+
--color-sage-900: #316c26; /* 10 · solid (hover) */
|
|
109
|
+
--color-sage-850: #417c36; /* 11 · accessible text */
|
|
110
|
+
--color-sage-950: #273d23; /* 12 · accessible text */
|
|
99
111
|
|
|
100
112
|
/* ---- Semantic accent ramps ---- */
|
|
101
113
|
/* Success — shifted cooler (emerald/teal) so positive states stay clearly
|
|
@@ -137,13 +149,14 @@
|
|
|
137
149
|
--color-amber-base: #f3a72e;
|
|
138
150
|
--color-amber-deep: #b57414;
|
|
139
151
|
|
|
140
|
-
/* ---- Radii ----
|
|
141
|
-
|
|
142
|
-
--radius-
|
|
143
|
-
--radius-
|
|
144
|
-
--radius-
|
|
145
|
-
--radius-
|
|
146
|
-
--radius-
|
|
152
|
+
/* ---- Radii ---- FIVE steps only: 2 · 4 · 8 · 16 · 24 (px), plus `full`
|
|
153
|
+
for pills/circles. xs aliases sm (4px); 2xl aliases xl (24px). */
|
|
154
|
+
--radius-xs: 0.25rem; /* 4px */
|
|
155
|
+
--radius-sm: 0.25rem; /* 4px */
|
|
156
|
+
--radius-md: 0.5rem; /* 8px */
|
|
157
|
+
--radius-lg: 1rem; /* 16px */
|
|
158
|
+
--radius-xl: 1.5rem; /* 24px */
|
|
159
|
+
--radius-2xl: 1.5rem; /* 24px (alias xl) */
|
|
147
160
|
--radius-full: 9999px;
|
|
148
161
|
/* Status/indicator dots are SQUARE with a hair of softening — echoing the
|
|
149
162
|
growth-mark's square cells. Never render an indicator dot as a circle
|
|
@@ -152,10 +165,21 @@
|
|
|
152
165
|
--radius-dot: 2px;
|
|
153
166
|
|
|
154
167
|
/* ---- Elevation ---- ONE soft token (Claude-panel style).
|
|
155
|
-
Delineate surfaces with fill color first; add this to gently lift them.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
Delineate surfaces with fill color first; add this to gently lift them.
|
|
169
|
+
Tuned quieter (2026-07-30): the ambient drop sits closer (y8→y4,
|
|
170
|
+
blur28→16) at lower opacity (9%→6%) with a faint COOL slate tint
|
|
171
|
+
(rgb 15 23 42, not near-black) — a hard, offset-heavy black drop read
|
|
172
|
+
"cheap" and floated small controls (switch thumb, tab pill). */
|
|
173
|
+
--shadow-elevation: 0 0 0 1px rgb(15 23 42 / 0.03),
|
|
174
|
+
0 1px 2px 0 rgb(15 23 42 / 0.04),
|
|
175
|
+
0 4px 16px -6px rgb(15 23 42 / 0.06);
|
|
176
|
+
|
|
177
|
+
/* Pinned-table-column smudges — whisper-soft directional casts shown only
|
|
178
|
+
while content is hidden behind a sticky column (Table is scroll-aware).
|
|
179
|
+
Deep negative spread keeps the edge feathered; same cool slate tint as
|
|
180
|
+
the elevation token. */
|
|
181
|
+
--shadow-table-smudge-left: 8px 0 24px -14px rgb(15 23 42 / 0.05);
|
|
182
|
+
--shadow-table-smudge-right: -8px 0 24px -14px rgb(15 23 42 / 0.05);
|
|
159
183
|
|
|
160
184
|
/* ---- CTA inner glow ---- luminous inset highlight for primary buttons
|
|
161
185
|
(adapted from the "AI button" Figma): a crisp top-edge catch plus a soft
|
|
@@ -207,7 +231,7 @@
|
|
|
207
231
|
--sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
|
|
208
232
|
--sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
|
|
209
233
|
--sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
|
|
210
|
-
--sidebar-navigation-text-size:
|
|
234
|
+
--sidebar-navigation-text-size: var(--text-base); /* 15px — sidebar actions, items, history, and account text */
|
|
211
235
|
--sidebar-section-label-size: 0.8125rem; /* 13px — section and history labels */
|
|
212
236
|
--panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
|
|
213
237
|
--aside-width: 20rem; /* 320px — right-hand panel column */
|
|
@@ -220,7 +244,7 @@
|
|
|
220
244
|
/* ---- Chat (Ask Actioneer / assistant-ui) ---- */
|
|
221
245
|
--thread-max-width: 44rem; /* chat column cap — readable prose measure, all panes */
|
|
222
246
|
--thread-max-width-wide: 64rem; /* rich-content breakout cap (tables/charts/tool cards) on wide panes; prose keeps --thread-max-width */
|
|
223
|
-
--composer-bg:
|
|
247
|
+
--composer-bg: var(--elevated); /* pure white composer surface */
|
|
224
248
|
--composer-radius: var(--radius-2xl);
|
|
225
249
|
--composer-padding: 0.5rem;
|
|
226
250
|
--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 */
|
|
@@ -233,21 +257,26 @@
|
|
|
233
257
|
* every comparison series survives production builds.
|
|
234
258
|
*/
|
|
235
259
|
:root {
|
|
236
|
-
/* Data-series palette —
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
--color-chart-
|
|
260
|
+
/* Data-series palette — its OWN palette, separate from the brand ramps, in
|
|
261
|
+
the editorial multi-series idiom (distinct, saturated hues that stay
|
|
262
|
+
apart at 1.5px stroke and at dot size).
|
|
263
|
+
|
|
264
|
+
NEITHER GREEN NOR RED (user-mandated): both carry verdicts — green reads
|
|
265
|
+
"good" and red reads "bad" even when the series is just a named entity,
|
|
266
|
+
so a category key must never imply one. Green/red stay reserved for
|
|
267
|
+
genuinely semantic states (success badges, danger alerts, a delta the
|
|
268
|
+
CALLER has judged). Blue leads as the focal series; purple, orange, cyan
|
|
269
|
+
and amber extend; grey closes as the sixth and doubles as the
|
|
270
|
+
de-emphasis tone.
|
|
271
|
+
|
|
272
|
+
Explicit hexes (not var()) so every series survives @theme pruning,
|
|
273
|
+
since chart colours are referenced from SVG prop strings. */
|
|
274
|
+
--color-chart-1: #3d9aa4; /* teal — primary / focal (the right edge of the brand set) */
|
|
275
|
+
--color-chart-2: #f7d06b; /* golden yellow — the warm 2nd series */
|
|
276
|
+
--color-chart-3: #52496e; /* muted purple */
|
|
277
|
+
--color-chart-4: #2d6f8a; /* deep teal-blue */
|
|
278
|
+
--color-chart-5: #232149; /* navy ink */
|
|
279
|
+
--color-chart-6: #8c8c84; /* grey — extended series + de-emphasis tone */
|
|
251
280
|
}
|
|
252
281
|
|
|
253
282
|
/*
|
|
@@ -277,10 +306,12 @@
|
|
|
277
306
|
--color-brand: var(--brand);
|
|
278
307
|
--color-brand-foreground: var(--brand-foreground);
|
|
279
308
|
--color-brand-hover: var(--brand-hover);
|
|
309
|
+
--color-brand-text: var(--brand-text);
|
|
280
310
|
|
|
281
311
|
/* Quiet fill — secondary buttons, avatars, chips */
|
|
282
312
|
--color-fill: var(--fill);
|
|
283
313
|
--color-fill-foreground: var(--fill-foreground);
|
|
314
|
+
--color-table-shell: var(--table-shell);
|
|
284
315
|
|
|
285
316
|
--color-accent: var(--accent);
|
|
286
317
|
--color-accent-foreground: var(--accent-foreground);
|
|
@@ -294,6 +325,9 @@
|
|
|
294
325
|
--color-info: var(--color-info-600);
|
|
295
326
|
--color-info-foreground: #ffffff;
|
|
296
327
|
|
|
328
|
+
--color-border-primary: var(--border-primary);
|
|
329
|
+
--color-border-secondary: var(--border-secondary);
|
|
330
|
+
--color-border-tertiary: var(--border-tertiary);
|
|
297
331
|
--color-border: var(--border);
|
|
298
332
|
--color-border-strong: var(--border-strong);
|
|
299
333
|
--color-input: var(--input);
|
|
@@ -308,7 +342,7 @@
|
|
|
308
342
|
* shadcn's grey/black defaults. The raw --sidebar-*/--popover values live in
|
|
309
343
|
* :root below.
|
|
310
344
|
*/
|
|
311
|
-
--color-primary-foreground:
|
|
345
|
+
--color-primary-foreground: #ffffff;
|
|
312
346
|
--color-secondary-foreground: #ffffff;
|
|
313
347
|
--color-destructive: var(--color-danger-600);
|
|
314
348
|
--color-destructive-foreground: #ffffff;
|
|
@@ -327,28 +361,34 @@
|
|
|
327
361
|
|
|
328
362
|
/* ---- Theme (light only) ---- */
|
|
329
363
|
:root {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
--
|
|
335
|
-
--
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
--
|
|
340
|
-
--
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
--
|
|
344
|
-
|
|
345
|
-
--
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
364
|
+
/* Every semantic token below points INTO a primitive scale step
|
|
365
|
+
(var(--color-ink-*) / var(--color-sage-*)) — the 12-step scales are the
|
|
366
|
+
single source of truth. Only pure white (#ffffff) stays literal: it is a
|
|
367
|
+
base surface, not a neutral scale step. */
|
|
368
|
+
--background: var(--color-ink-100); /* step 2 · canvas */
|
|
369
|
+
--foreground: var(--color-ink-950); /* step 12 */
|
|
370
|
+
|
|
371
|
+
/* Text levels: primary ink-950, secondary ink-900, tertiary ink-800.
|
|
372
|
+
Primary + secondary clear AA for body copy; tertiary is AA-large only. */
|
|
373
|
+
--text-primary: var(--color-ink-950); /* ~16:1 AAA */
|
|
374
|
+
--text-secondary: var(--color-ink-900); /* ~5.3:1 AA */
|
|
375
|
+
--text-tertiary: var(--color-ink-800); /* ~3:1 AA-large */
|
|
376
|
+
|
|
377
|
+
--surface: var(--color-ink-200); /* step 3 · tinted canvas */
|
|
378
|
+
--surface-foreground: var(--color-ink-950);
|
|
379
|
+
--elevated: #ffffff; /* pure white base */
|
|
380
|
+
|
|
381
|
+
--muted: var(--color-ink-300); /* step 4 */
|
|
382
|
+
--muted-foreground: var(--color-ink-900);/* step 11 · readable UI text */
|
|
383
|
+
|
|
384
|
+
--card: #ffffff; /* pure white base */
|
|
385
|
+
--card-foreground: var(--color-ink-950);
|
|
386
|
+
|
|
387
|
+
/* Sage brand (green) — solid role. brand = sage step 9, hover = step 10. */
|
|
388
|
+
--brand: var(--color-sage-800); /* step 9 · solid */
|
|
350
389
|
--brand-foreground: #ffffff;
|
|
351
|
-
--brand-hover:
|
|
390
|
+
--brand-hover: var(--color-sage-900); /* step 10 · hover */
|
|
391
|
+
--brand-text: var(--color-sage-850); /* step 11 · accessible green text/links */
|
|
352
392
|
|
|
353
393
|
/* Table interaction fills are pre-composited and opaque. Sticky edge cells
|
|
354
394
|
therefore cover horizontally scrolled content while preserving the
|
|
@@ -357,22 +397,55 @@
|
|
|
357
397
|
--table-row-selected: color-mix(in srgb, var(--card) 10%, var(--muted));
|
|
358
398
|
|
|
359
399
|
/* Quiet fill */
|
|
360
|
-
--fill:
|
|
361
|
-
--fill-foreground:
|
|
362
|
-
|
|
363
|
-
--accent:
|
|
364
|
-
--accent-foreground:
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
--border-
|
|
368
|
-
--
|
|
369
|
-
--
|
|
370
|
-
|
|
400
|
+
--fill: var(--color-ink-50); /* step 1 · lightest recessed fill */
|
|
401
|
+
--fill-foreground: var(--color-ink-950);
|
|
402
|
+
|
|
403
|
+
--accent: var(--color-ink-200); /* step 3 */
|
|
404
|
+
--accent-foreground: var(--color-ink-950);
|
|
405
|
+
|
|
406
|
+
/* Borders — a three-level scale, primary (strongest) → tertiary (faintest). */
|
|
407
|
+
--border-primary: var(--color-ink-600); /* #cececd · strongest */
|
|
408
|
+
--border-secondary: var(--color-ink-400); /* #e1e1e0 · default */
|
|
409
|
+
--border-tertiary: var(--color-ink-200); /* #f0f0ef · faintest */
|
|
410
|
+
/* Legacy aliases point into the scale so existing utilities keep resolving. */
|
|
411
|
+
--border: var(--border-secondary); /* default hairline / separator */
|
|
412
|
+
--border-strong: var(--border-primary); /* emphasized / hover / selected */
|
|
413
|
+
--input: var(--border-primary); /* form-control edge */
|
|
414
|
+
|
|
415
|
+
/* Ripple — the appearance wash that radiates from a floating surface's
|
|
416
|
+
origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft brand
|
|
417
|
+
tint that expands + fades once on mount; see the `.ads-ripple` layer and
|
|
418
|
+
the `Ripple` component. Duration stays in the sub-300ms UI band. */
|
|
419
|
+
--ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
|
|
420
|
+
--ripple-duration: 300ms;
|
|
421
|
+
|
|
422
|
+
/* Stroke width — ADS hairlines are 0.5px, not the Tailwind 1px default.
|
|
423
|
+
The single-width border utilities are overridden to this token at the
|
|
424
|
+
bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
|
|
425
|
+
true hairline. Explicit `border-2`+ widths are unaffected. */
|
|
426
|
+
--stroke-width: 0.5px;
|
|
427
|
+
--ring: color-mix(in srgb, var(--color-sage-800) 50%, transparent); /* brand @ 50% */
|
|
428
|
+
--overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
|
|
429
|
+
|
|
430
|
+
/* Functional / domain tokens — named for their RENDER role, pointing into
|
|
431
|
+
the ink scale. Components pass these into non-CSS renderers (Recharts,
|
|
432
|
+
React Flow, the Paper/WebGL texture) so no component carries a raw ink-*
|
|
433
|
+
value. Same DS pattern as the data-viz --color-chart-* palette. */
|
|
434
|
+
--chart-axis: var(--color-ink-200); /* axis lines + de-emphasised marks */
|
|
435
|
+
--chart-grid: var(--color-ink-50); /* gridlines */
|
|
436
|
+
--chart-track: var(--color-ink-100); /* funnel / progress track */
|
|
437
|
+
--chart-context: var(--color-ink-300); /* de-emphasised context series */
|
|
438
|
+
--canvas-edge: var(--color-ink-300); /* infinite-canvas edges / connectors */
|
|
439
|
+
--texture-ink: var(--color-ink-950); /* brand-texture / pixel-blast marks */
|
|
440
|
+
--table-shell: var(--color-ink-200); /* recessed table tray (lighter than muted) */
|
|
441
|
+
--table-scroll-hint: rgb(15 23 42 / 0.04); /* right-edge "more columns" wash */
|
|
442
|
+
--surface-inverse: var(--color-ink-950); /* dark hero / inverse surface base */
|
|
443
|
+
--surface-inverse-soft: var(--color-ink-900); /* dark hero gradient falloff */
|
|
371
444
|
|
|
372
445
|
/* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
|
|
373
446
|
(or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
|
|
374
447
|
palette instead of shadcn's grey/black defaults. The sidebar reads as the
|
|
375
|
-
|
|
448
|
+
neutral canvas; its active item takes Sage. A consumer that had
|
|
376
449
|
hard-coded these can now delete its overrides and inherit from here. */
|
|
377
450
|
--sidebar: var(--surface);
|
|
378
451
|
--sidebar-foreground: var(--foreground);
|
|
@@ -385,6 +458,63 @@
|
|
|
385
458
|
--popover: var(--elevated);
|
|
386
459
|
--popover-foreground: var(--foreground);
|
|
387
460
|
}
|
|
461
|
+
|
|
462
|
+
/*
|
|
463
|
+
* ============================================================
|
|
464
|
+
* Hairline strokes — ADS strokes are 0.5px, not 1px (principle 1).
|
|
465
|
+
* Override Tailwind's single-width border utilities to the
|
|
466
|
+
* --stroke-width token. Authored after `}
|
|
467
|
+
.border-t { border-top-width: var(--stroke-width); }
|
|
468
|
+
.border-r { border-right-width: var(--stroke-width); }
|
|
469
|
+
.border-b { border-bottom-width: var(--stroke-width); }
|
|
470
|
+
.border-l { border-left-width: var(--stroke-width); }
|
|
471
|
+
.border-x { border-inline-start-width: var(--stroke-width); border-inline-end-width: var(--stroke-width); }
|
|
472
|
+
.border-y { border-block-start-width: var(--stroke-width); border-block-end-width: var(--stroke-width); }
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/*
|
|
476
|
+
* ============================================================
|
|
477
|
+
* Ripple — appearance wash for floating surfaces (principle 3).
|
|
478
|
+
* A soft brand tint that expands from the panel's origin corner
|
|
479
|
+
* and fades, once, as the surface mounts. Rendered by the
|
|
480
|
+
* `Ripple` component as an absolute, pointer-events-none layer
|
|
481
|
+
* clipped to the panel radius. Honours reduced-motion.
|
|
482
|
+
* ============================================================
|
|
483
|
+
*/
|
|
484
|
+
@keyframes ads-ripple-wave {
|
|
485
|
+
0% { opacity: 0.6; transform: scale(0.15); }
|
|
486
|
+
100% { opacity: 0; transform: scale(1.08); }
|
|
487
|
+
}
|
|
488
|
+
.ads-ripple {
|
|
489
|
+
position: absolute;
|
|
490
|
+
inset: 0;
|
|
491
|
+
z-index: -1;
|
|
492
|
+
border-radius: inherit;
|
|
493
|
+
overflow: hidden;
|
|
494
|
+
pointer-events: none;
|
|
495
|
+
transform-origin: var(--ripple-origin, center);
|
|
496
|
+
background: radial-gradient(125% 125% at var(--ripple-origin, center), var(--ripple-tint), transparent 62%);
|
|
497
|
+
animation: ads-ripple-wave var(--ripple-duration, 300ms) var(--ease-out) forwards;
|
|
498
|
+
will-change: transform, opacity;
|
|
499
|
+
}
|
|
500
|
+
@media (prefers-reduced-motion: reduce) {
|
|
501
|
+
.ads-ripple { animation: none; opacity: 0; }
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/*
|
|
505
|
+
* ============================================================
|
|
506
|
+
* primary-foreground utility backfill.
|
|
507
|
+
* Tailwind emits `text/bg-secondary-foreground` but NOT the
|
|
508
|
+
* `primary-foreground` companion (its base `--color-primary` is the ADS
|
|
509
|
+
* text-hierarchy token, which collides with the generated `primary` color),
|
|
510
|
+
* so the vendored shadcn button's icon rendered invisible (dark-on-dark) on
|
|
511
|
+
* `bg-primary`. Define the two utilities explicitly against white.
|
|
512
|
+
* ============================================================
|
|
513
|
+
*/
|
|
514
|
+
@layer utilities {
|
|
515
|
+
.text-primary-foreground { color: #ffffff; }
|
|
516
|
+
.bg-primary-foreground { background-color: #ffffff; }
|
|
517
|
+
}
|
|
388
518
|
/* ---- Base, keyframes & component helpers ---- */
|
|
389
519
|
/* Hide scrollbars app-wide but keep scrollability. The demo UI is filled
|
|
390
520
|
and borderless by design — visible scrollbar tracks read as decorative
|