@actioneer/ads 0.5.5 → 0.5.7

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 (41) hide show
  1. package/components/agent-icon.js +3 -2
  2. package/components/ai-elements/chain-of-thought-icon.d.ts +10 -12
  3. package/components/ai-elements/chain-of-thought-icon.js +341 -201
  4. package/components/ai-elements/chain-of-thought.d.ts +1 -1
  5. package/components/answer-sources.d.ts +42 -0
  6. package/components/answer-sources.js +111 -0
  7. package/components/answer.d.ts +1 -0
  8. package/components/answer.js +665 -671
  9. package/components/assistant-ui/answer-tool-ui.js +11 -7
  10. package/components/assistant-ui/attachment.js +39 -39
  11. package/components/assistant-ui/composer-harness.js +5 -4
  12. package/components/assistant-ui/follow-up-suggestions.d.ts +5 -1
  13. package/components/assistant-ui/follow-up-suggestions.js +47 -19
  14. package/components/assistant-ui/thread-context.d.ts +2 -0
  15. package/components/assistant-ui/thread.js +41 -40
  16. package/components/avatar.js +14 -14
  17. package/components/dropdown.d.ts +1 -1
  18. package/components/dropdown.js +1 -1
  19. package/components/empty-state.d.ts +4 -4
  20. package/components/field.js +16 -16
  21. package/components/index.d.ts +1 -0
  22. package/components/index.js +414 -408
  23. package/components/infinite-canvas.js +1 -1
  24. package/components/pixel-icon.d.ts +3 -1
  25. package/components/pixel-icon.js +294 -214
  26. package/components/segmented.d.ts +4 -1
  27. package/components/segmented.js +9 -8
  28. package/components/sidebar.d.ts +2 -2
  29. package/components/switch.js +22 -4
  30. package/components/table.d.ts +15 -7
  31. package/components/table.js +313 -199
  32. package/components/textarea.js +1 -2
  33. package/components/tooltip.js +1 -1
  34. package/components/ui/tooltip.js +5 -5
  35. package/lib/icons.d.ts +8 -0
  36. package/lib/icons.js +103 -101
  37. package/llms.txt +18 -7
  38. package/manifest.json +125 -13
  39. package/package.json +1 -1
  40. package/styles.css +42 -47
  41. package/theme.css +24 -45
package/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "importPath": "@actioneer/ads",
5
5
  "styleImport": "@import \"@actioneer/ads/styles.css\";",
6
6
  "families": [
@@ -16,9 +16,9 @@
16
16
  "Chat"
17
17
  ],
18
18
  "counts": {
19
- "total": 782,
20
- "component": 352,
21
- "type": 342,
19
+ "total": 792,
20
+ "component": 357,
21
+ "type": 347,
22
22
  "hook": 10,
23
23
  "util": 78
24
24
  },
@@ -148,7 +148,7 @@
148
148
  "text-brand",
149
149
  "border-brand"
150
150
  ],
151
- "description": "Brand (Sage green) — used for solid fills / primary actions, not body text"
151
+ "description": "Compatibility action role — neutral ink, never a colored primary hue."
152
152
  },
153
153
  {
154
154
  "name": "--color-brand-foreground",
@@ -157,7 +157,7 @@
157
157
  "text-brand-foreground",
158
158
  "bg-brand-foreground"
159
159
  ],
160
- "description": "Brand (Sage green) — used for solid fills / primary actions, not body text"
160
+ "description": "Compatibility action role — neutral ink, never a colored primary hue."
161
161
  },
162
162
  {
163
163
  "name": "--color-brand-hover",
@@ -167,7 +167,7 @@
167
167
  "text-brand-hover",
168
168
  "border-brand-hover"
169
169
  ],
170
- "description": "Brand (Sage green) — used for solid fills / primary actions, not body text"
170
+ "description": "Compatibility action role — neutral ink, never a colored primary hue."
171
171
  },
172
172
  {
173
173
  "name": "--color-brand-text",
@@ -177,7 +177,7 @@
177
177
  "text-brand-text",
178
178
  "border-brand-text"
179
179
  ],
180
- "description": "Brand (Sage green) — used for solid fills / primary actions, not body text"
180
+ "description": "Compatibility action role — neutral ink, never a colored primary hue."
181
181
  },
182
182
  {
183
183
  "name": "--color-fill",
@@ -2068,6 +2068,63 @@
2068
2068
  "kind"
2069
2069
  ]
2070
2070
  },
2071
+ {
2072
+ "name": "AnswerSourceChip",
2073
+ "family": "Data display",
2074
+ "kind": "component",
2075
+ "importPath": "@actioneer/ads",
2076
+ "module": "answer-sources",
2077
+ "description": "Use the blue connector/source chip inside AnswerSources to open only the referenced nodes represented by that chip in the shell's inspector.",
2078
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/sources",
2079
+ "props": [
2080
+ "icon",
2081
+ "count",
2082
+ "children"
2083
+ ]
2084
+ },
2085
+ {
2086
+ "name": "AnswerSourceInspector",
2087
+ "family": "Data display",
2088
+ "kind": "component",
2089
+ "importPath": "@actioneer/ads",
2090
+ "module": "answer-sources",
2091
+ "description": "Render as a separate white shell-level panel beside the answer when a source chip is selected; close and unmount it when the selection clears.",
2092
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/sources",
2093
+ "props": [
2094
+ "description",
2095
+ "title",
2096
+ "children"
2097
+ ]
2098
+ },
2099
+ {
2100
+ "name": "AnswerSourceItem",
2101
+ "family": "Data display",
2102
+ "kind": "component",
2103
+ "importPath": "@actioneer/ads",
2104
+ "module": "answer-sources",
2105
+ "description": "Use as an outlined clickable row inside AnswerSourceInspector for one referenced table or node, including its parent source, read state, and optional status.",
2106
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/sources",
2107
+ "props": [
2108
+ "name",
2109
+ "source",
2110
+ "description",
2111
+ "status",
2112
+ "icon"
2113
+ ]
2114
+ },
2115
+ {
2116
+ "name": "AnswerSources",
2117
+ "family": "Data display",
2118
+ "kind": "component",
2119
+ "importPath": "@actioneer/ads",
2120
+ "module": "answer-sources",
2121
+ "description": "Place immediately above an answer's follow-up questions to summarize the referenced nodes and group them into clickable AnswerSourceChips.",
2122
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/sources",
2123
+ "props": [
2124
+ "count",
2125
+ "label"
2126
+ ]
2127
+ },
2071
2128
  {
2072
2129
  "name": "AreaChart",
2073
2130
  "family": "Data display",
@@ -3042,6 +3099,7 @@
3042
3099
  "actionColumnWidth",
3043
3100
  "sortDescriptor",
3044
3101
  "onSortChange",
3102
+ "allowsSorting",
3045
3103
  "isStatic"
3046
3104
  ]
3047
3105
  },
@@ -3086,7 +3144,8 @@
3086
3144
  "showcaseUrl": "https://ads.actioneer.dev/#/table",
3087
3145
  "props": [
3088
3146
  "align",
3089
- "sticky"
3147
+ "sticky",
3148
+ "sortValue"
3090
3149
  ]
3091
3150
  },
3092
3151
  {
@@ -3099,7 +3158,9 @@
3099
3158
  "props": [
3100
3159
  "align",
3101
3160
  "sticky",
3102
- "sortKey"
3161
+ "sortKey",
3162
+ "allowsSorting",
3163
+ "_sortColumnIndex"
3103
3164
  ]
3104
3165
  },
3105
3166
  {
@@ -3466,6 +3527,34 @@
3466
3527
  "importPath": "@actioneer/ads",
3467
3528
  "module": "answer"
3468
3529
  },
3530
+ {
3531
+ "name": "AnswerSourceChipProps",
3532
+ "family": "Data display",
3533
+ "kind": "type",
3534
+ "importPath": "@actioneer/ads",
3535
+ "module": "answer-sources"
3536
+ },
3537
+ {
3538
+ "name": "AnswerSourceInspectorProps",
3539
+ "family": "Data display",
3540
+ "kind": "type",
3541
+ "importPath": "@actioneer/ads",
3542
+ "module": "answer-sources"
3543
+ },
3544
+ {
3545
+ "name": "AnswerSourceItemProps",
3546
+ "family": "Data display",
3547
+ "kind": "type",
3548
+ "importPath": "@actioneer/ads",
3549
+ "module": "answer-sources"
3550
+ },
3551
+ {
3552
+ "name": "AnswerSourcesProps",
3553
+ "family": "Data display",
3554
+ "kind": "type",
3555
+ "importPath": "@actioneer/ads",
3556
+ "module": "answer-sources"
3557
+ },
3469
3558
  {
3470
3559
  "name": "AnswerSpec",
3471
3560
  "family": "Data display",
@@ -4766,6 +4855,7 @@
4766
4855
  "mask",
4767
4856
  "motion",
4768
4857
  "motionMode",
4858
+ "interactionColor",
4769
4859
  "hero"
4770
4860
  ]
4771
4861
  },
@@ -5090,7 +5180,7 @@
5090
5180
  "kind": "component",
5091
5181
  "importPath": "@actioneer/ads",
5092
5182
  "module": "sidebar",
5093
- "description": "Use as the app's left navigation rail — compose it from SidebarHeader/SidebarBrand, SidebarNav (sections of SidebarItems), optional SidebarHistory, and a SidebarFooter with SidebarAccount, with an opt-in collapsed icon-rail mode (⌘B/Ctrl-B) that every sub-part reads automatically.",
5183
+ "description": "Use as the app's left navigation rail. The canonical Actioneer shell composes SidebarBrand with persistent header actions, SidebarAction above grouped SidebarItems, optional attention counts and SidebarHistory, then SidebarAccount in a pinned footer. Its opt-in collapsed icon-rail mode (⌘B/Ctrl-B) is shared automatically by every sub-part.",
5094
5184
  "showcaseUrl": "https://ads.actioneer.dev/#/sidebar",
5095
5185
  "props": [
5096
5186
  "collapsed",
@@ -7649,6 +7739,17 @@
7649
7739
  "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export.",
7650
7740
  "showcaseUrl": "https://ads.actioneer.dev/#/demo/ask"
7651
7741
  },
7742
+ {
7743
+ "name": "FollowUpQuestion",
7744
+ "family": "Chat",
7745
+ "kind": "component",
7746
+ "importPath": "@actioneer/ads",
7747
+ "module": "follow-up-suggestions",
7748
+ "vendored": true,
7749
+ "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export.",
7750
+ "description": "Use for the two or three full-width next-question rows that close a structured answer, immediately after its source strip; show the exact prompt that clicking will send.",
7751
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/follow-up-suggestions"
7752
+ },
7652
7753
  {
7653
7754
  "name": "FollowUpSuggestion",
7654
7755
  "family": "Chat",
@@ -7657,7 +7758,8 @@
7657
7758
  "module": "follow-up-suggestions",
7658
7759
  "vendored": true,
7659
7760
  "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export.",
7660
- "showcaseUrl": "https://ads.actioneer.dev/#/demo/ask"
7761
+ "description": "Use only for compact runtime suggestion chips above the composer; use FollowUpQuestion for the larger answer-ending question rows.",
7762
+ "showcaseUrl": "https://ads.actioneer.dev/#/ai/follow-up-suggestions"
7661
7763
  },
7662
7764
  {
7663
7765
  "name": "Image",
@@ -8184,6 +8286,15 @@
8184
8286
  "vendored": true,
8185
8287
  "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export."
8186
8288
  },
8289
+ {
8290
+ "name": "FollowUpQuestionProps",
8291
+ "family": "Chat",
8292
+ "kind": "type",
8293
+ "importPath": "@actioneer/ads",
8294
+ "module": "follow-up-suggestions",
8295
+ "vendored": true,
8296
+ "note": "Vendored assistant-ui component. Props follow upstream assistant-ui, not ADS conventions; the chat family needs an <AssistantRuntimeProvider> (chat runtime) and a <TooltipProvider> ancestor. Import from \"@actioneer/ads\" like any ADS export."
8297
+ },
8187
8298
  {
8188
8299
  "name": "FollowUpSuggestionProps",
8189
8300
  "family": "Chat",
@@ -8682,7 +8793,7 @@
8682
8793
  "id": "minimal-information",
8683
8794
  "number": 8,
8684
8795
  "title": "Minimal information per screen",
8685
- "rule": "A screen carries ONLY what the user needs to move forward: one title, at most one short supporting line, the inputs, one primary action. Never maximalist. Promote the one message that matters typographically instead of appending muted fine print.",
8796
+ "rule": "A screen carries ONLY what the user needs to move forward: one title, the inputs, one primary action. Page, section, panel, modal, dialog, drawer, and popover headers are title-only by default; add a description only when the user explicitly asks for one. Never maximalist.",
8686
8797
  "do": [
8687
8798
  "Prefer more, smaller steps over dense ones; ask one thing at a time.",
8688
8799
  "Derive instead of asking whenever possible (a name from a work email, the company from its domain).",
@@ -8690,6 +8801,7 @@
8690
8801
  ],
8691
8802
  "dont": [
8692
8803
  "Add section eyebrows above a title that already names the screen, or helper text that restates the obvious / duplicates a disabled button's meaning.",
8804
+ "Add any header description unless the user explicitly requested supporting copy for that page, section, panel, modal, dialog, drawer, or popover.",
8693
8805
  "Nest panel/step-rail chrome inside a multi-step flow."
8694
8806
  ],
8695
8807
  "enforcedByLint": false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "description": "Actioneer Design System 1.0 — React 19 + Tailwind v4 component library.",
5
5
  "type": "module",
6
6
  "sideEffects": [
package/styles.css CHANGED
@@ -31,7 +31,7 @@
31
31
  /*
32
32
  * ============================================================
33
33
  * ADS 1.0 — Design Tokens
34
- * Brand: Sage (green) · Neutrals: brand-palette grey · Typeface: Aribau Grotesk
34
+ * Palette: Ink neutrals · Typeface: Aribau Grotesk
35
35
  * ============================================================
36
36
  */
37
37
  @theme {
@@ -89,29 +89,8 @@
89
89
  --color-ink-900: #636461; /* 11 · accessible text */
90
90
  --color-ink-950: #1f1f1c; /* 12 · accessible text */
91
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 */
111
-
112
92
  /* ---- Semantic accent ramps ---- */
113
- /* Success — shifted cooler (emerald/teal) so positive states stay clearly
114
- distinct from the warm Sage brand green. */
93
+ /* Success stays a semantic state color, never a product-primary hue. */
115
94
  --color-success-50: #ecfdf5;
116
95
  --color-success-100: #d1fae5;
117
96
  --color-success-500: #10b981;
@@ -138,7 +117,7 @@
138
117
 
139
118
  /* ---- Data-viz accents ---- three small ramps for charts & illustration.
140
119
  deep = text/lines · base = fills · soft = backgrounds. Separate from the
141
- semantic status ramps above; these are the "focal data" companions to Sage. */
120
+ semantic status ramps above; these carry data, not product identity. */
142
121
  --color-cyan-soft: #c7efe9; /* Cyan — vivid cool contrast; 2nd series, links */
143
122
  --color-cyan-base: #12b5a5;
144
123
  --color-cyan-deep: #0a7e82;
@@ -149,15 +128,15 @@
149
128
  --color-amber-base: #f3a72e;
150
129
  --color-amber-deep: #b57414;
151
130
 
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) */
160
- --radius-full: 9999px;
131
+ /* ---- Radii ---- TWO values only: 2px and 4px. Compact roles resolve to
132
+ 2px; every surface and formerly pill-shaped role resolves to 4px. */
133
+ --radius-xs: 0.125rem; /* 2px */
134
+ --radius-sm: 0.125rem; /* 2px */
135
+ --radius-md: 0.25rem; /* 4px */
136
+ --radius-lg: 0.25rem; /* 4px */
137
+ --radius-xl: 0.25rem; /* 4px */
138
+ --radius-2xl: 0.25rem; /* 4px */
139
+ --radius-full: 0.25rem; /* 4px */
161
140
  /* Status/indicator dots are SQUARE with a hair of softening — echoing the
162
141
  growth-mark's square cells. Never render an indicator dot as a circle
163
142
  (`rounded-full`); radio controls are the one exception (control
@@ -302,7 +281,7 @@
302
281
  --color-card: var(--card);
303
282
  --color-card-foreground: var(--card-foreground);
304
283
 
305
- /* Brand (Sage green) — used for solid fills / primary actions, not body text */
284
+ /* Compatibility action role — neutral ink, never a colored primary hue. */
306
285
  --color-brand: var(--brand);
307
286
  --color-brand-foreground: var(--brand-foreground);
308
287
  --color-brand-hover: var(--brand-hover);
@@ -361,10 +340,9 @@
361
340
 
362
341
  /* ---- Theme (light only) ---- */
363
342
  :root {
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. */
343
+ /* Every neutral semantic token below points INTO the ink primitive scale.
344
+ Only pure white (#ffffff) stays literal: it is a base surface, not a
345
+ neutral scale step. */
368
346
  --background: var(--color-ink-100); /* step 2 · canvas */
369
347
  --foreground: var(--color-ink-950); /* step 12 */
370
348
 
@@ -384,11 +362,12 @@
384
362
  --card: #ffffff; /* pure white base */
385
363
  --card-foreground: var(--color-ink-950);
386
364
 
387
- /* Sage brand (green) — solid role. brand = sage step 9, hover = step 10. */
388
- --brand: var(--color-sage-800); /* step 9 · solid */
365
+ /* Neutral action role. The `brand` name remains as a compatibility API,
366
+ but the product has no colored primary palette. */
367
+ --brand: var(--color-ink-950); /* darkest action ink */
389
368
  --brand-foreground: #ffffff;
390
- --brand-hover: var(--color-sage-900); /* step 10 · hover */
391
- --brand-text: var(--color-sage-850); /* step 11 · accessible green text/links */
369
+ --brand-hover: var(--color-ink-900); /* lighter hover lift */
370
+ --brand-text: var(--color-ink-950); /* action text / links */
392
371
 
393
372
  /* Table interaction fills are pre-composited and opaque. Sticky edge cells
394
373
  therefore cover horizontally scrolled content while preserving the
@@ -413,7 +392,7 @@
413
392
  --input: var(--border-primary); /* form-control edge */
414
393
 
415
394
  /* Ripple — the appearance wash that radiates from a floating surface's
416
- origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft brand
395
+ origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
417
396
  tint that expands + fades once on mount; see the `.ads-ripple` layer and
418
397
  the `Ripple` component. Duration stays in the sub-300ms UI band. */
419
398
  --ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
@@ -424,7 +403,7 @@
424
403
  bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
425
404
  true hairline. Explicit `border-2`+ widths are unaffected. */
426
405
  --stroke-width: 0.5px;
427
- --ring: color-mix(in srgb, var(--color-sage-800) 50%, transparent); /* brand @ 50% */
406
+ --ring: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink @ 50% */
428
407
  --overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
429
408
 
430
409
  /* Functional / domain tokens — named for their RENDER role, pointing into
@@ -445,7 +424,7 @@
445
424
  /* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
446
425
  (or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
447
426
  palette instead of shadcn's grey/black defaults. The sidebar reads as the
448
- neutral canvas; its active item takes Sage. A consumer that had
427
+ neutral canvas; its active item takes action ink. A consumer that had
449
428
  hard-coded these can now delete its overrides and inherit from here. */
450
429
  --sidebar: var(--surface);
451
430
  --sidebar-foreground: var(--foreground);
@@ -530,6 +509,22 @@
530
509
  display: none;
531
510
  }
532
511
 
512
+ /* Artifact widgets are positioned by GridStack; ADS cards own the visible
513
+ surface while the library content wrapper only clips during interaction.
514
+ The subtle elevation lives on the wrapper (not the inner card) because the
515
+ wrapper's own `overflow: hidden` would clip a shadow drawn on its child. */
516
+ .artifact-grid-stack > .grid-stack-item > .grid-stack-item-content {
517
+ overflow: hidden;
518
+ border-radius: var(--radius-lg);
519
+ box-shadow: var(--shadow-elevation);
520
+ }
521
+
522
+ .artifact-grid-stack > .grid-stack-placeholder > .placeholder-content {
523
+ border: 1px dashed var(--color-border-strong);
524
+ border-radius: var(--radius-sm);
525
+ background: var(--color-muted);
526
+ }
527
+
533
528
  /* BrandTexture entrance (src/components/brand-texture.tsx): a radial bloom —
534
529
  the halftone reveals from the centre out to the corners (clip-path circle)
535
530
  while gently scaling up to rest. `from{}`-only keyframe, so it settles into
@@ -718,7 +713,7 @@
718
713
  }
719
714
  ::-webkit-scrollbar-thumb {
720
715
  background: var(--border-strong);
721
- border-radius: 9999px;
716
+ border-radius: var(--radius-lg);
722
717
  border: 2px solid var(--background);
723
718
  }
724
719
  ::-webkit-scrollbar-thumb:hover {
@@ -1009,7 +1004,7 @@
1009
1004
  width: 1rem;
1010
1005
  border-bottom: 1px solid var(--border-strong);
1011
1006
  border-left: 1px solid var(--border-strong);
1012
- border-bottom-left-radius: 9px;
1007
+ border-bottom-left-radius: var(--radius-lg);
1013
1008
  }
1014
1009
  /* Let the consumer's Tailwind discover the classes ADS components use. */
1015
1010
  @source "./**/*.{js,mjs}";
package/theme.css CHANGED
@@ -2,7 +2,7 @@
2
2
  /*
3
3
  * ============================================================
4
4
  * ADS 1.0 — Design Tokens
5
- * Brand: Sage (green) · Neutrals: brand-palette grey · Typeface: Aribau Grotesk
5
+ * Palette: Ink neutrals · Typeface: Aribau Grotesk
6
6
  * ============================================================
7
7
  */
8
8
  @theme {
@@ -60,29 +60,8 @@
60
60
  --color-ink-900: #636461; /* 11 · accessible text */
61
61
  --color-ink-950: #1f1f1c; /* 12 · accessible text */
62
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 */
82
-
83
63
  /* ---- Semantic accent ramps ---- */
84
- /* Success — shifted cooler (emerald/teal) so positive states stay clearly
85
- distinct from the warm Sage brand green. */
64
+ /* Success stays a semantic state color, never a product-primary hue. */
86
65
  --color-success-50: #ecfdf5;
87
66
  --color-success-100: #d1fae5;
88
67
  --color-success-500: #10b981;
@@ -109,7 +88,7 @@
109
88
 
110
89
  /* ---- Data-viz accents ---- three small ramps for charts & illustration.
111
90
  deep = text/lines · base = fills · soft = backgrounds. Separate from the
112
- semantic status ramps above; these are the "focal data" companions to Sage. */
91
+ semantic status ramps above; these carry data, not product identity. */
113
92
  --color-cyan-soft: #c7efe9; /* Cyan — vivid cool contrast; 2nd series, links */
114
93
  --color-cyan-base: #12b5a5;
115
94
  --color-cyan-deep: #0a7e82;
@@ -120,15 +99,15 @@
120
99
  --color-amber-base: #f3a72e;
121
100
  --color-amber-deep: #b57414;
122
101
 
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) */
131
- --radius-full: 9999px;
102
+ /* ---- Radii ---- TWO values only: 2px and 4px. Compact roles resolve to
103
+ 2px; every surface and formerly pill-shaped role resolves to 4px. */
104
+ --radius-xs: 0.125rem; /* 2px */
105
+ --radius-sm: 0.125rem; /* 2px */
106
+ --radius-md: 0.25rem; /* 4px */
107
+ --radius-lg: 0.25rem; /* 4px */
108
+ --radius-xl: 0.25rem; /* 4px */
109
+ --radius-2xl: 0.25rem; /* 4px */
110
+ --radius-full: 0.25rem; /* 4px */
132
111
  /* Status/indicator dots are SQUARE with a hair of softening — echoing the
133
112
  growth-mark's square cells. Never render an indicator dot as a circle
134
113
  (`rounded-full`); radio controls are the one exception (control
@@ -273,7 +252,7 @@
273
252
  --color-card: var(--card);
274
253
  --color-card-foreground: var(--card-foreground);
275
254
 
276
- /* Brand (Sage green) — used for solid fills / primary actions, not body text */
255
+ /* Compatibility action role — neutral ink, never a colored primary hue. */
277
256
  --color-brand: var(--brand);
278
257
  --color-brand-foreground: var(--brand-foreground);
279
258
  --color-brand-hover: var(--brand-hover);
@@ -332,10 +311,9 @@
332
311
 
333
312
  /* ---- Theme (light only) ---- */
334
313
  :root {
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. */
314
+ /* Every neutral semantic token below points INTO the ink primitive scale.
315
+ Only pure white (#ffffff) stays literal: it is a base surface, not a
316
+ neutral scale step. */
339
317
  --background: var(--color-ink-100); /* step 2 · canvas */
340
318
  --foreground: var(--color-ink-950); /* step 12 */
341
319
 
@@ -355,11 +333,12 @@
355
333
  --card: #ffffff; /* pure white base */
356
334
  --card-foreground: var(--color-ink-950);
357
335
 
358
- /* Sage brand (green) — solid role. brand = sage step 9, hover = step 10. */
359
- --brand: var(--color-sage-800); /* step 9 · solid */
336
+ /* Neutral action role. The `brand` name remains as a compatibility API,
337
+ but the product has no colored primary palette. */
338
+ --brand: var(--color-ink-950); /* darkest action ink */
360
339
  --brand-foreground: #ffffff;
361
- --brand-hover: var(--color-sage-900); /* step 10 · hover */
362
- --brand-text: var(--color-sage-850); /* step 11 · accessible green text/links */
340
+ --brand-hover: var(--color-ink-900); /* lighter hover lift */
341
+ --brand-text: var(--color-ink-950); /* action text / links */
363
342
 
364
343
  /* Table interaction fills are pre-composited and opaque. Sticky edge cells
365
344
  therefore cover horizontally scrolled content while preserving the
@@ -384,7 +363,7 @@
384
363
  --input: var(--border-primary); /* form-control edge */
385
364
 
386
365
  /* Ripple — the appearance wash that radiates from a floating surface's
387
- origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft brand
366
+ origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
388
367
  tint that expands + fades once on mount; see the `.ads-ripple` layer and
389
368
  the `Ripple` component. Duration stays in the sub-300ms UI band. */
390
369
  --ripple-tint: color-mix(in srgb, var(--brand) 20%, transparent);
@@ -395,7 +374,7 @@
395
374
  bottom of this file, so every `border`/`border-t|r|b|l|x|y` reads as a
396
375
  true hairline. Explicit `border-2`+ widths are unaffected. */
397
376
  --stroke-width: 0.5px;
398
- --ring: color-mix(in srgb, var(--color-sage-800) 50%, transparent); /* brand @ 50% */
377
+ --ring: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink @ 50% */
399
378
  --overlay: color-mix(in srgb, var(--color-ink-950) 50%, transparent); /* ink-950 @ 50% */
400
379
 
401
380
  /* Functional / domain tokens — named for their RENDER role, pointing into
@@ -416,7 +395,7 @@
416
395
  /* shadcn-compat raw surfaces — so a downstream shadcn Sidebar / Popover
417
396
  (or an inline `var(--sidebar)` / `var(--popover)`) resolves to the ADS
418
397
  palette instead of shadcn's grey/black defaults. The sidebar reads as the
419
- neutral canvas; its active item takes Sage. A consumer that had
398
+ neutral canvas; its active item takes action ink. A consumer that had
420
399
  hard-coded these can now delete its overrides and inherit from here. */
421
400
  --sidebar: var(--surface);
422
401
  --sidebar-foreground: var(--foreground);