@actioneer/ads 1.0.7 → 1.0.8

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 (71) hide show
  1. package/DESIGN.md +80 -86
  2. package/README.md +6 -0
  3. package/components/ai-elements/chart.js +20 -20
  4. package/components/ai-elements/inline-citation.js +50 -50
  5. package/components/ai-elements/message.js +1 -1
  6. package/components/ai-elements/tool.js +5 -5
  7. package/components/alert.d.ts +3 -2
  8. package/components/alert.js +25 -25
  9. package/components/answer.js +1 -1
  10. package/components/assistant-ui/action-bar.js +1 -1
  11. package/components/assistant-ui/attachment.js +68 -49
  12. package/components/assistant-ui/composer-add-context.js +1 -1
  13. package/components/assistant-ui/composer-trigger-popover.js +1 -1
  14. package/components/assistant-ui/composer.js +13 -13
  15. package/components/assistant-ui/message-timing.js +6 -6
  16. package/components/assistant-ui/selection-toolbar.js +5 -5
  17. package/components/assistant-ui/sources.js +15 -15
  18. package/components/assistant-ui/tooltip-icon-button.js +18 -14
  19. package/components/audio-waveform.d.ts +21 -8
  20. package/components/audio-waveform.js +371 -94
  21. package/components/autocomplete.js +9 -9
  22. package/components/breadcrumbs.js +32 -38
  23. package/components/button.js +83 -73
  24. package/components/card.js +1 -1
  25. package/components/chart.js +732 -673
  26. package/components/chip.js +37 -35
  27. package/components/command-palette.js +12 -12
  28. package/components/connector-card.d.ts +1 -2
  29. package/components/connector-card.js +17 -17
  30. package/components/date-range-picker.js +1 -2
  31. package/components/drawer.js +9 -10
  32. package/components/dropdown.js +1 -1
  33. package/components/empty-state.d.ts +2 -0
  34. package/components/empty-state.js +17 -15
  35. package/components/field.js +9 -10
  36. package/components/file-dropzone.d.ts +6 -3
  37. package/components/file-dropzone.js +72 -60
  38. package/components/infinite-canvas.js +9 -9
  39. package/components/modal.js +1 -1
  40. package/components/page-body.js +8 -8
  41. package/components/popover.js +11 -11
  42. package/components/progress-circle.d.ts +1 -1
  43. package/components/progress-circle.js +57 -48
  44. package/components/segmented.d.ts +1 -0
  45. package/components/segmented.js +34 -36
  46. package/components/select.js +2 -2
  47. package/components/selection-action-bar.js +32 -31
  48. package/components/setting-row.js +10 -10
  49. package/components/slider.js +5 -5
  50. package/components/stepper.d.ts +1 -1
  51. package/components/stepper.js +1 -1
  52. package/components/switch.js +10 -10
  53. package/components/table.d.ts +2 -2
  54. package/components/table.js +177 -170
  55. package/components/tabs.js +41 -35
  56. package/components/timeline.js +3 -3
  57. package/components/toast.js +53 -56
  58. package/components/ui/button.js +4 -4
  59. package/components/ui/dialog.js +1 -1
  60. package/components/viz-charts.js +263 -221
  61. package/examples/README.md +30 -0
  62. package/examples/agents-screen.tsx +477 -0
  63. package/examples/settings-screen.tsx +90 -0
  64. package/examples/workspace-header.tsx +71 -0
  65. package/lib/icons.d.ts +8 -0
  66. package/lib/icons.js +171 -118
  67. package/llms.txt +14 -14
  68. package/manifest.json +77 -48
  69. package/package.json +1 -1
  70. package/styles.css +55 -68
  71. package/theme.css +50 -59
package/DESIGN.md CHANGED
@@ -15,46 +15,46 @@ colors:
15
15
  success: "#2d6b22"
16
16
  success-foreground: "#ffffff"
17
17
  warning: "#f79009"
18
- warning-foreground: "#21201d"
18
+ warning-foreground: "#202020"
19
19
  danger: "#d92d20"
20
20
  danger-foreground: "#ffffff"
21
21
  info: "#1570ef"
22
22
  info-foreground: "#ffffff"
23
- background: "#f3f1e9"
24
- foreground: "#21201d"
25
- surface: "#efece3"
26
- surface-foreground: "#21201d"
23
+ background: "#f6f6f6"
24
+ foreground: "#202020"
25
+ surface: "#f1f1f1"
26
+ surface-foreground: "#202020"
27
27
  elevated: "#ffffff"
28
28
  card: "#ffffff"
29
- card-foreground: "#21201d"
30
- muted: "#e8e5db"
31
- muted-foreground: "#4d4b44"
32
- fill: "#efece3"
33
- fill-foreground: "#21201d"
34
- accent: "#dfdcd0"
35
- accent-foreground: "#21201d"
36
- on-white-primary: "#21201d"
37
- on-white-secondary: "#4d4b44"
38
- on-white-tertiary: "#79766a"
39
- on-warm-grey-primary: "#21201d"
40
- on-warm-grey-secondary: "#4d4b44"
41
- on-warm-grey-tertiary: "#79766a"
42
- primary: "#21201d"
43
- secondary: "#4d4b44"
44
- tertiary: "color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))"
45
- border: "#e8e5db"
46
- border-primary: "#dfdcd0"
47
- border-secondary: "#e8e5db"
48
- border-tertiary: "#efece3"
49
- border-strong: "#dfdcd0"
50
- input: "#e8e5db"
51
- menu-stroke: "#e8e5db"
52
- toast-stroke: "#e8e5db"
53
- tree-stroke: "#e8e5db"
54
- specimen-stroke: "#efece3"
29
+ card-foreground: "#202020"
30
+ muted: "#ececec"
31
+ muted-foreground: "#5e5d5d"
32
+ fill: "#f1f1f1"
33
+ fill-foreground: "#202020"
34
+ accent: "#e6e6e6"
35
+ accent-foreground: "#202020"
36
+ on-white-primary: "#202020"
37
+ on-white-secondary: "#5e5d5d"
38
+ on-white-tertiary: "#868686"
39
+ on-warm-grey-primary: "#202020"
40
+ on-warm-grey-secondary: "#5e5d5d"
41
+ on-warm-grey-tertiary: "#868686"
42
+ primary: "#202020"
43
+ secondary: "#5e5d5d"
44
+ tertiary: "color-mix(in srgb, var(--color-wg10) 40%, var(--color-wg11))"
45
+ border: "#ececec"
46
+ border-primary: "#e6e6e6"
47
+ border-secondary: "#ececec"
48
+ border-tertiary: "#f1f1f1"
49
+ border-strong: "#e6e6e6"
50
+ input: "#ececec"
51
+ menu-stroke: "#ececec"
52
+ toast-stroke: "#ececec"
53
+ tree-stroke: "#ececec"
54
+ specimen-stroke: "#f1f1f1"
55
55
  table-shell: "#ffffff"
56
- table-stroke: "#efece3"
57
- table-header-foreground: "color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))"
56
+ table-stroke: "#f1f1f1"
57
+ table-header-foreground: "color-mix(in srgb, var(--color-wg10) 40%, var(--color-wg11))"
58
58
  artifact-canvas: "color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white))"
59
59
  ring: "#1c8379"
60
60
  overlay: "color-mix(in srgb, var(--color-wg12) 50%, transparent)"
@@ -179,7 +179,7 @@ components:
179
179
 
180
180
  TASTE.md puts it in one line: On a quiet, neutral ground, colour and motion are spent like money — rarely, deliberately, and only where the eye should go.
181
181
 
182
- ADS 1.0.7 is a library first and a look second. 323 components across 10 families (Primitives / utilities, Foundations, Form controls, Overlays, Data display, Feedback, Navigation, Layout, AI Elements, Chat) ship from one barrel, and every product that consumes them inherits the judgment encoded in 56 semantic tokens and 11 principles rather than re-deciding it per screen.
182
+ ADS 1.0.8 is a library first and a look second. 323 components across 10 families (Primitives / utilities, Foundations, Form controls, Overlays, Data display, Feedback, Navigation, Layout, AI Elements, Chat) ship from one barrel, and every product that consumes them inherits the judgment encoded in 56 semantic tokens and 11 principles rather than re-deciding it per screen.
183
183
 
184
184
  The ground is warm grey and the ink is warm near-black. One hue is spent by default, the Studio teal CTA family, and four more carry semantic status. Everything else stays neutral. A consumer product may narrow that further, and one already does: Baby Sentinel drops the teal and runs every action on ink.
185
185
 
@@ -230,7 +230,7 @@ Semantic status. These four carry meaning and are never identity.
230
230
  **Amber-500 fill kept (it IS the caution signal); dark ink foreground instead of white = 6.94:1 (white on amber was 2.35:1, failed even 3:1).**
231
231
 
232
232
  - **warning** (`--color-warning`, #f79009) `bg-warning`
233
- - **warning-foreground** (`--color-warning-foreground`, #21201d) `text-warning-foreground`
233
+ - **warning-foreground** (`--color-warning-foreground`, #202020) `text-warning-foreground`
234
234
 
235
235
  **Danger and info: solid semantic fills carrying white foregrounds.**
236
236
 
@@ -245,77 +245,77 @@ The warm-grey ground everything else stands on.
245
245
 
246
246
  **The shell canvas and its ink: the ground between top-level panels.**
247
247
 
248
- - **background** (`--color-background`, #f3f1e9) `bg-background`
249
- - **foreground** (`--color-foreground`, #21201d) `text-foreground`
248
+ - **background** (`--color-background`, #f6f6f6) `bg-background`
249
+ - **foreground** (`--color-foreground`, #202020) `text-foreground`
250
250
 
251
251
  **One continuous recess inside a white surface, never a screen-level ground.**
252
252
 
253
- - **surface** (`--color-surface`, #efece3) `bg-surface`
254
- - **surface-foreground** (`--color-surface-foreground`, #21201d) `text-surface-foreground`
253
+ - **surface** (`--color-surface`, #f1f1f1) `bg-surface`
254
+ - **surface-foreground** (`--color-surface-foreground`, #202020) `text-surface-foreground`
255
255
  - **elevated** (`--color-elevated`, #ffffff) `bg-elevated`
256
256
 
257
257
  **The white working plane that sits on the canvas, and the specimen hairline.**
258
258
 
259
259
  - **card** (`--color-card`, #ffffff) `bg-card`
260
- - **card-foreground** (`--color-card-foreground`, #21201d) `text-card-foreground`
260
+ - **card-foreground** (`--color-card-foreground`, #202020) `text-card-foreground`
261
261
 
262
262
  **The hover and row-state wash: interaction, not a default item background.**
263
263
 
264
- - **muted** (`--color-muted`, #e8e5db) `bg-muted`
265
- - **muted-foreground** (`--color-muted-foreground`, #4d4b44) `text-muted-foreground`
264
+ - **muted** (`--color-muted`, #ececec) `bg-muted`
265
+ - **muted-foreground** (`--color-muted-foreground`, #5e5d5d) `text-muted-foreground`
266
266
 
267
267
  **Quiet fill — avatars, chips, and disabled controls.**
268
268
 
269
- - **fill** (`--color-fill`, #efece3) `bg-fill`
270
- - **fill-foreground** (`--color-fill-foreground`, #21201d) `text-fill-foreground`
269
+ - **fill** (`--color-fill`, #f1f1f1) `bg-fill`
270
+ - **fill-foreground** (`--color-fill-foreground`, #202020) `text-fill-foreground`
271
271
 
272
272
  **The active and selected wash, one step above hover.**
273
273
 
274
- - **accent** (`--color-accent`, #dfdcd0) `bg-accent`
275
- - **accent-foreground** (`--color-accent-foreground`, #21201d) `text-accent-foreground`
274
+ - **accent** (`--color-accent`, #e6e6e6) `bg-accent`
275
+ - **accent-foreground** (`--color-accent-foreground`, #202020) `text-accent-foreground`
276
276
 
277
277
  **Contextual text hierarchies — three accessible levels per surface.**
278
278
 
279
- - **on-white-primary** (`--color-on-white-primary`, #21201d) `bg-on-white-primary`
280
- - **on-white-secondary** (`--color-on-white-secondary`, #4d4b44) `bg-on-white-secondary`
281
- - **on-white-tertiary** (`--color-on-white-tertiary`, #79766a) `bg-on-white-tertiary`
282
- - **on-warm-grey-primary** (`--color-on-warm-grey-primary`, #21201d) `bg-on-warm-grey-primary`
283
- - **on-warm-grey-secondary** (`--color-on-warm-grey-secondary`, #4d4b44) `bg-on-warm-grey-secondary`
284
- - **on-warm-grey-tertiary** (`--color-on-warm-grey-tertiary`, #79766a) `bg-on-warm-grey-tertiary`
279
+ - **on-white-primary** (`--color-on-white-primary`, #202020) `bg-on-white-primary`
280
+ - **on-white-secondary** (`--color-on-white-secondary`, #5e5d5d) `bg-on-white-secondary`
281
+ - **on-white-tertiary** (`--color-on-white-tertiary`, #868686) `bg-on-white-tertiary`
282
+ - **on-warm-grey-primary** (`--color-on-warm-grey-primary`, #202020) `bg-on-warm-grey-primary`
283
+ - **on-warm-grey-secondary** (`--color-on-warm-grey-secondary`, #5e5d5d) `bg-on-warm-grey-secondary`
284
+ - **on-warm-grey-tertiary** (`--color-on-warm-grey-tertiary`, #868686) `bg-on-warm-grey-tertiary`
285
285
 
286
286
  **Context-free compatibility aliases remain conservative.**
287
287
 
288
- - **primary** (`--color-primary`, #21201d) `bg-primary`
289
- - **secondary** (`--color-secondary`, #4d4b44) `bg-secondary`
290
- - **tertiary** (`--color-tertiary`, color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))) `bg-tertiary`
288
+ - **primary** (`--color-primary`, #202020) `bg-primary`
289
+ - **secondary** (`--color-secondary`, #5e5d5d) `bg-secondary`
290
+ - **tertiary** (`--color-tertiary`, color-mix(in srgb, var(--color-wg10) 40%, var(--color-wg11))) `bg-tertiary`
291
291
 
292
292
  **The neutral stroke ladder: every 1px UI border stays within WG3 to WG5.**
293
293
 
294
- - **border** (`--color-border`, #e8e5db) `bg-border`
295
- - **border-primary** (`--color-border-primary`, #dfdcd0) `bg-border-primary`
296
- - **border-secondary** (`--color-border-secondary`, #e8e5db) `bg-border-secondary`
297
- - **border-tertiary** (`--color-border-tertiary`, #efece3) `bg-border-tertiary`
298
- - **border-strong** (`--color-border-strong`, #dfdcd0) `bg-border-strong`
299
- - **input** (`--color-input`, #e8e5db) `bg-input`
300
- - **menu-stroke** (`--color-menu-stroke`, #e8e5db) `bg-menu-stroke`
301
- - **toast-stroke** (`--color-toast-stroke`, #e8e5db) `bg-toast-stroke`
302
- - **tree-stroke** (`--color-tree-stroke`, #e8e5db) `bg-tree-stroke`
294
+ - **border** (`--color-border`, #ececec) `bg-border`
295
+ - **border-primary** (`--color-border-primary`, #e6e6e6) `bg-border-primary`
296
+ - **border-secondary** (`--color-border-secondary`, #ececec) `bg-border-secondary`
297
+ - **border-tertiary** (`--color-border-tertiary`, #f1f1f1) `bg-border-tertiary`
298
+ - **border-strong** (`--color-border-strong`, #e6e6e6) `bg-border-strong`
299
+ - **input** (`--color-input`, #ececec) `bg-input`
300
+ - **menu-stroke** (`--color-menu-stroke`, #ececec) `bg-menu-stroke`
301
+ - **toast-stroke** (`--color-toast-stroke`, #ececec) `bg-toast-stroke`
302
+ - **tree-stroke** (`--color-tree-stroke`, #ececec) `bg-tree-stroke`
303
303
 
304
304
  **The white working plane that sits on the canvas, and the specimen hairline.**
305
305
 
306
- - **specimen-stroke** (`--color-specimen-stroke`, #efece3) `bg-specimen-stroke`
306
+ - **specimen-stroke** (`--color-specimen-stroke`, #f1f1f1) `bg-specimen-stroke`
307
307
 
308
308
  **Table surfaces: the white tray, its hairlines, and header ink.**
309
309
 
310
310
  - **table-shell** (`--color-table-shell`, #ffffff) `bg-table-shell`
311
- - **table-stroke** (`--color-table-stroke`, #efece3) `bg-table-stroke`
312
- - **table-header-foreground** (`--color-table-header-foreground`, color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))) `text-table-header-foreground`
311
+ - **table-stroke** (`--color-table-stroke`, #f1f1f1) `bg-table-stroke`
312
+ - **table-header-foreground** (`--color-table-header-foreground`, color-mix(in srgb, var(--color-wg10) 40%, var(--color-wg11))) `text-table-header-foreground`
313
313
 
314
314
  **The artifact sheet: white warmed by a trace of the brand mark.**
315
315
 
316
316
  - **artifact-canvas** (`--color-artifact-canvas`, color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white))) `bg-artifact-canvas`
317
317
 
318
- **Focus ring and scrim, both translucent warm ink.**
318
+ **Focus ring and scrim, both translucent neutral ink.**
319
319
 
320
320
  - **ring** (`--color-ring`, #1c8379) `ring-ring`
321
321
  - **overlay** (`--color-overlay`, color-mix(in srgb, var(--color-wg12) 50%, transparent)) `bg-overlay`
@@ -361,24 +361,19 @@ The shell owns the frame and screens own their content. ADS targets landscape ta
361
361
 
362
362
  ## Elevation & Depth
363
363
 
364
- Flat by default with tonal layering. Depth comes from the plane system, warm grey behind and white in front. `--shadow-elevation` aliases `--shadow-0`, which is `none`: a surface earns a shadow only when someone asks for one by name.
364
+ Flat by default with tonal layering. Depth comes from the plane system, warm grey behind and white in front. Five shadows only: `--shadow-0` (flat, every in-page surface), `--shadow-float` (toasts, toolbars, composer dock), `--shadow-overlay` (modals, dialogs, overlay drawers), and the two table scroll-hint smudges.
365
365
 
366
366
  ### Shadow vocabulary
367
367
 
368
368
  - **0** (`--shadow-0`): `none`
369
- - **100** (`--shadow-100`): `0 1px 0 0 rgb(32 32 32 / 0.07)`
370
- - **200** (`--shadow-200`): `0 3px 1px -1px rgb(32 32 32 / 0.07)`
371
- - **300** (`--shadow-300`): `0 4px 6px -2px rgb(32 32 32 / 0.2)`
372
- - **400** (`--shadow-400`): `0 8px 16px -4px rgb(32 32 32 / 0.22)`
373
- - **500** (`--shadow-500`): `0 12px 20px -8px rgb(32 32 32 / 0.24)`
374
- - **600** (`--shadow-600`): `0 20px 20px -8px rgb(32 32 32 / 0.28)`
375
- - **elevation** (`--shadow-elevation`): `none`
369
+ - **float** (`--shadow-float`): `0 0 0 1px rgb(32 32 32 / 0.04), 0 2px 4px rgb(32 32 32 / 0.04), 0 8px 20px -4px rgb(32 32 32 / 0.10)`
370
+ - **overlay** (`--shadow-overlay`): `0 0 0 1px rgb(32 32 32 / 0.04), 0 4px 8px rgb(32 32 32 / 0.04), 0 16px 36px -8px rgb(32 32 32 / 0.14)`
376
371
  - **table-smudge-left** (`--shadow-table-smudge-left`): `8px 0 24px -14px rgb(32 32 32 / 0.05)`
377
372
  - **table-smudge-right** (`--shadow-table-smudge-right`): `-8px 0 24px -14px rgb(32 32 32 / 0.05)`
378
373
 
379
374
  ### Named rules
380
375
 
381
- **The Elevation Is Actionability Rule.** Every surface defaults to shadow-0. Use the numbered elevation ladder only when the user explicitly requests a shadow for the named surface; the legacy shadow-elevation hook remains flat.
376
+ **The Elevation Is Actionability Rule.** ADS has five shadow tokens: shadow-0 (flat, the default), shadow-float, shadow-overlay, and the two table scroll-hint smudges. Only a layer that floats above the page may carry float or overlay; everything in the page is flat.
382
377
 
383
378
  ## Shapes
384
379
 
@@ -520,7 +515,7 @@ Hand-rolling a visual control, or importing a UI library at a call site, is neve
520
515
 
521
516
  **The Back Leads Rule.** A page-level Back control sits immediately before the page title in the leading header cluster. It is icon-only with an accessible label and never appears on the right with forward/page actions.
522
517
 
523
- **The Tabs Lead, Search Trails Rule.** When tabs and a search field control the same content, they share one responsive control row: the tab track hugs its labels at the leading edge and search sits at the trailing edge. Stack only when the container cannot fit both.
518
+ **The Tabs Lead, Search Trails Rule.** When tabs and a search field control the same content, they share one responsive control row: the tab list leads with its triggers left-aligned at their natural width over a baseline that fades from WG3 to transparent, and search sits at the trailing edge. Stack only when the container cannot fit both.
524
519
 
525
520
  ## Do's and Don'ts
526
521
 
@@ -532,9 +527,9 @@ Every line below is a `do` or `dont` recorded on a principle in `ads-manifest.js
532
527
  - **Do** inside a white Panel or Card, keep rows and items transparent at rest; group them with spacing or inset dividers, use bg-muted for hover/selection, and reserve bg-surface for one continuous semantic recess such as an editor or table tray. *(fills-over-strokes)*
533
528
  - **Do** use border-border for outline buttons and lightweight action rows; reserve border-input for form controls (input, select, textarea, checkbox, radio, segmented-control track) and floating menus (dropdown, popover, listboxes). *(fills-over-strokes)*
534
529
  - **Do** keep strokes on focus rings, the outline Button/Badge/Chip variants, Kbd, Divider, the Tree connector rail, and functional color swatches. *(fills-over-strokes)*
535
- - **Do** keep controls, cards, menus, overlays, panels, and other surfaces at shadow-0 unless the user specifically requests elevation. *(elevation-is-actionability)*
536
- - **Do** when requested, use shadow-100 for controls, shadow-200 for raised surfaces and pressable cards, shadow-300 for menus, popovers, listboxes, and toasts, and shadow-400 for dialogs and overlay drawers. *(elevation-is-actionability)*
537
- - **Do** reserve shadow-500 and shadow-600 for rare higher stacked layers; the legacy shadow-elevation hook resolves to shadow-0. *(elevation-is-actionability)*
530
+ - **Do** keep cards, panels, chips, buttons, tabs, fields, thumbs, and other in-page surfaces at shadow-0; separate them with fill, border, or spacing. *(elevation-is-actionability)*
531
+ - **Do** use shadow-float for floating layers that sit over content: toasts, toolbars, the chat composer dock, and any menu or popover that needs lift beyond its border. *(elevation-is-actionability)*
532
+ - **Do** use shadow-overlay for modals, dialogs, and overlay drawers, so a dialog always reads above a menu. *(elevation-is-actionability)*
538
533
  - **Do** treat motion as part of every ADS component import: preserve the component's built-in motion, and import any composition-level preset from the ADS root barrel. *(motion-follows-guide)*
539
534
  - **Do** map the component family before choosing motion: tabs/segments use control; checkbox/radio/switch use selection; menus use highlight; popovers/tooltips use overlay; modal/drawer use dialog/sheet; accordion/collapsible use disclosure; progress, carousel, and sidebar use their matching presets. *(motion-follows-guide)*
540
535
  - **Do** keep sliders, drag-resize, scrolling, and other pointer-following interactions immediate; motion begins after the committed value or destination changes. *(motion-follows-guide)*
@@ -561,7 +556,7 @@ Every line below is a `do` or `dont` recorded on a principle in `ads-manifest.js
561
556
  - **Do** cap prose at its measure; let tables/charts/tool cards break out wider. Use auto-fill + minmax(min, 1fr) for grids. *(responsive-container-fluid)*
562
557
  - **Do** use PageHeader with onBack so the left arrow is anchored directly before the title. *(leading-back-navigation)*
563
558
  - **Do** reserve the trailing header area for forward or page-level actions such as Add, Save, or Share. *(leading-back-navigation)*
564
- - **Do** keep the horizontal TabList content-width, then place the scoped search field opposite it in the same toolbar. *(tabs-search-opposed)*
559
+ - **Do** keep tab triggers left-aligned at their natural width, then place the scoped search field opposite them in the same toolbar. *(tabs-search-opposed)*
565
560
  - **Do** on constrained containers, stack tabs first and search second while preserving their relationship. *(tabs-search-opposed)*
566
561
 
567
562
  ### Don't:
@@ -569,10 +564,9 @@ Every line below is a `do` or `dont` recorded on a principle in `ads-manifest.js
569
564
  - **Don't** add a border to a surface to separate or group it — use fill/elevation/spacing instead. *(fills-over-strokes)*
570
565
  - **Don't** alternate persistent neutral fills inside one panel (for example white Panel → grey item → white child); flatten the item or promote the recess to the container. *(fills-over-strokes)*
571
566
  - **Don't** give a filled control no stroke on the tinted canvas — it disappears; it needs a crisp edge. *(fills-over-strokes)*
572
- - **Don't** infer permission to use a shadow from actionability, floating placement, or component type. *(elevation-is-actionability)*
573
- - **Don't** use raw shadow values or legacy named shadow utilities. *(elevation-is-actionability)*
574
- - **Don't** put a shadow on a non-interactive surface for decoration. *(elevation-is-actionability)*
575
- - **Don't** use shadow-500 or shadow-600 as a routine default. *(elevation-is-actionability)*
567
+ - **Don't** put a shadow on an in-page surface for decoration or to signal that it is clickable. *(elevation-is-actionability)*
568
+ - **Don't** use raw shadow values, inset glows, or the removed numbered levels and elevation hook. *(elevation-is-actionability)*
569
+ - **Don't** invent a third floating level; stack order comes from float vs overlay. *(elevation-is-actionability)*
576
570
  - **Don't** invent raw spring values inside a component, recreate a global duration/easing token scale, use an unbounded all-property transition, or start an entrance at scale zero. *(motion-follows-guide)*
577
571
  - **Don't** override or duplicate the motion already shipped inside an imported ADS component. *(motion-follows-guide)*
578
572
  - **Don't** animate keyboard-initiated or 100×/day actions (e.g. a command-palette toggle). *(motion-follows-guide)*
package/README.md CHANGED
@@ -156,6 +156,12 @@ Reference the semantic tokens (e.g. `bg-brand`, `text-muted-foreground`,
156
156
  `border-input`, `ring-ring`) rather than raw values; the full token list is in
157
157
  `manifest.json` under `tokens`.
158
158
 
159
+ **Sample screens:** full screens built only from ADS exports ship as readable
160
+ source in `node_modules/@actioneer/ads/examples/` (`AgentsScreen`,
161
+ `SettingsScreen`, `WorkspaceHeaderScreen`). Open them to see how components are
162
+ meant to be composed, or copy one into your app and swap in your own data; the
163
+ folder's `README.md` lists what each one shows.
164
+
159
165
  Shared motion presets are named exports from `@actioneer/ads`. Components already
160
166
  include their own interaction motion; use the exported presets for additional
161
167
  application state changes.
@@ -8,7 +8,7 @@ import { Collapsible as V, CollapsibleTrigger as W, CollapsibleContent as E } fr
8
8
  import { Skeleton as x } from "../skeleton.js";
9
9
  import { Spinner as v } from "../spinner.js";
10
10
  import { Database as O, ChevronDown as P, WarningCircle as S, Refresh as F, CloseCircle as G } from "../../lib/icons.js";
11
- import { cn as l } from "../../lib/cn.js";
11
+ import { cn as s } from "../../lib/cn.js";
12
12
  const H = M(
13
13
  // An ARTIFACT card, not a work-trace row: the chart is a produced object,
14
14
  // so it reads like an attachment (contained hairline card + filled icon
@@ -91,7 +91,7 @@ function Z({
91
91
  progress: r,
92
92
  errorContent: i,
93
93
  onRetry: o,
94
- children: s
94
+ children: l
95
95
  }) {
96
96
  return t === "error" ? /* @__PURE__ */ a(
97
97
  "div",
@@ -138,11 +138,11 @@ function Z({
138
138
  ),
139
139
  /* @__PURE__ */ e("span", { children: U(r) ?? "Receiving chart data" })
140
140
  ] }),
141
- /* @__PURE__ */ e("div", { className: "min-h-40", children: s ?? /* @__PURE__ */ e(x, { className: "h-40 w-full" }) })
141
+ /* @__PURE__ */ e("div", { className: "min-h-40", children: l ?? /* @__PURE__ */ e(x, { className: "h-40 w-full" }) })
142
142
  ] }) : t !== "ready" ? /* @__PURE__ */ e(Y, { status: t }) : (
143
143
  // The ready chart draws itself in left→right (the reveal wipe) instead of
144
144
  // popping after the loading state — data entrance, not chrome.
145
- /* @__PURE__ */ e("div", { className: "ads-reveal ads-reveal-wipe min-h-40", "data-slot": "ai-chart-visual", children: s })
145
+ /* @__PURE__ */ e("div", { className: "ads-reveal ads-reveal-wipe min-h-40", "data-slot": "ai-chart-visual", children: l })
146
146
  );
147
147
  }
148
148
  const ee = g.forwardRef(
@@ -151,7 +151,7 @@ const ee = g.forwardRef(
151
151
  status: r,
152
152
  title: i,
153
153
  tag: o,
154
- source: s,
154
+ source: l,
155
155
  progress: c,
156
156
  elapsed: y,
157
157
  meta: d,
@@ -164,13 +164,13 @@ const ee = g.forwardRef(
164
164
  onRetry: w,
165
165
  children: k,
166
166
  role: A = "group",
167
- "aria-label": z,
168
- "aria-describedby": R,
169
- "aria-busy": j,
167
+ "aria-label": R,
168
+ "aria-describedby": j,
169
+ "aria-busy": z,
170
170
  ...I
171
171
  }, $) => {
172
172
  const n = r ?? "ready", B = n === "querying" || n === "partial" || n === "rendering", m = d !== void 0 ? d : X(n, c, y), q = K[n], f = g.useId(), p = n === "ready" && u != null, D = [
173
- R,
173
+ j,
174
174
  p ? f : void 0
175
175
  ].filter(Boolean).join(" ") || void 0;
176
176
  return /* @__PURE__ */ a(
@@ -181,11 +181,11 @@ const ee = g.forwardRef(
181
181
  defaultOpen: N,
182
182
  onOpenChange: C,
183
183
  role: A,
184
- "aria-label": z ?? (typeof i == "string" ? i : "AI chart evidence"),
184
+ "aria-label": R ?? (typeof i == "string" ? i : "AI chart evidence"),
185
185
  "aria-describedby": D,
186
186
  "data-slot": "ai-chart",
187
187
  "data-status": n,
188
- className: l(H({ status: n }), t),
188
+ className: s(H({ status: n }), t),
189
189
  ...I,
190
190
  children: [
191
191
  /* @__PURE__ */ e(
@@ -203,7 +203,7 @@ const ee = g.forwardRef(
203
203
  "button",
204
204
  {
205
205
  type: "button",
206
- className: l(
206
+ className: s(
207
207
  "group/ai-chart-trigger flex w-full items-center gap-2.5 px-2.5 py-2 text-left",
208
208
  "outline-none transition-[background,color,transform] duration-150 ease-out hover:bg-fill active:scale-[0.97] motion-reduce:active:scale-100",
209
209
  "focus-visible:ring-3 focus-visible:ring-inset focus-visible:ring-ring motion-reduce:transition-none"
@@ -213,7 +213,7 @@ const ee = g.forwardRef(
213
213
  "span",
214
214
  {
215
215
  "aria-hidden": !0,
216
- className: "grid size-8 shrink-0 place-items-center rounded-md bg-surface",
216
+ className: "grid h-8 w-5 shrink-0 place-items-center",
217
217
  children: /* @__PURE__ */ e(O, { "data-slot": "ai-chart-icon", className: "size-4" })
218
218
  }
219
219
  ),
@@ -248,7 +248,7 @@ const ee = g.forwardRef(
248
248
  /* @__PURE__ */ a(
249
249
  E,
250
250
  {
251
- className: l(
251
+ className: s(
252
252
  "overflow-hidden px-2.5 pb-2.5 outline-none",
253
253
  "data-[state=closed]:pointer-events-none"
254
254
  ),
@@ -257,7 +257,7 @@ const ee = g.forwardRef(
257
257
  "div",
258
258
  {
259
259
  "data-slot": "ai-chart-body",
260
- "aria-busy": j ?? (B || void 0),
260
+ "aria-busy": z ?? (B || void 0),
261
261
  children: /* @__PURE__ */ e(
262
262
  Z,
263
263
  {
@@ -270,7 +270,7 @@ const ee = g.forwardRef(
270
270
  )
271
271
  }
272
272
  ),
273
- s && /* @__PURE__ */ e(
273
+ l && /* @__PURE__ */ e(
274
274
  "div",
275
275
  {
276
276
  className: "mt-2 text-xs text-tertiary",
@@ -280,16 +280,16 @@ const ee = g.forwardRef(
280
280
  {
281
281
  type: "button",
282
282
  className: "rounded-sm text-left text-s outline-none transition-colors duration-150 ease-out hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring motion-reduce:transition-none",
283
- "aria-label": `Open source ${s}`,
284
- onClick: () => h(s),
283
+ "aria-label": `Open source ${l}`,
284
+ onClick: () => h(l),
285
285
  children: [
286
286
  "from ",
287
- /* @__PURE__ */ e("span", { className: "font-normal tabular-nums", children: s })
287
+ /* @__PURE__ */ e("span", { className: "font-normal tabular-nums", children: l })
288
288
  ]
289
289
  }
290
290
  ) : /* @__PURE__ */ a("p", { children: [
291
291
  "from ",
292
- /* @__PURE__ */ e("span", { className: "font-normal tabular-nums", children: s })
292
+ /* @__PURE__ */ e("span", { className: "font-normal tabular-nums", children: l })
293
293
  ] })
294
294
  }
295
295
  )