@actioneer/ads 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +21 -0
  2. package/bin/ads-init.mjs +314 -0
  3. package/components/accordion.d.ts +13 -0
  4. package/components/accordion.js +91 -0
  5. package/components/agents-ui/agent-audio-visualizer-aura.d.ts +11 -0
  6. package/components/agents-ui/agent-audio-visualizer-aura.js +277 -0
  7. package/components/agents-ui/agent-audio-visualizer-wave.d.ts +12 -0
  8. package/components/agents-ui/agent-audio-visualizer-wave.js +203 -0
  9. package/components/agents-ui/react-shader-toy.d.ts +87 -0
  10. package/components/agents-ui/react-shader-toy.js +531 -0
  11. package/components/ai-elements/chain-of-thought.d.ts +30 -0
  12. package/components/ai-elements/chain-of-thought.js +182 -0
  13. package/components/ai-elements/index.d.ts +11 -0
  14. package/components/ai-elements/inline-citation.d.ts +44 -0
  15. package/components/ai-elements/inline-citation.js +314 -0
  16. package/components/ai-elements/message.d.ts +96 -0
  17. package/components/ai-elements/message.js +308 -0
  18. package/components/ai-elements/queue.d.ts +60 -0
  19. package/components/ai-elements/queue.js +193 -0
  20. package/components/ai-elements/reasoning.d.ts +26 -0
  21. package/components/ai-elements/reasoning.js +131 -0
  22. package/components/ai-elements/shimmer.d.ts +25 -0
  23. package/components/ai-elements/shimmer.js +44 -0
  24. package/components/ai-elements/speech-input.d.ts +16 -0
  25. package/components/ai-elements/speech-input.js +151 -0
  26. package/components/ai-elements/task-progress.d.ts +41 -0
  27. package/components/ai-elements/task-progress.js +211 -0
  28. package/components/ai-elements/task.d.ts +35 -0
  29. package/components/ai-elements/task.js +73 -0
  30. package/components/ai-elements/tool.d.ts +53 -0
  31. package/components/ai-elements/tool.js +116 -0
  32. package/components/ai-elements/voice.d.ts +74 -0
  33. package/components/ai-elements/voice.js +875 -0
  34. package/components/alert.d.ts +21 -0
  35. package/components/alert.js +76 -0
  36. package/components/answer.d.ts +984 -0
  37. package/components/answer.js +543 -0
  38. package/components/assistant-ui/action-bar.d.ts +3 -0
  39. package/components/assistant-ui/action-bar.js +57 -0
  40. package/components/assistant-ui/answer-tool-ui.d.ts +5 -0
  41. package/components/assistant-ui/answer-tool-ui.js +42 -0
  42. package/components/assistant-ui/attachment.d.ts +50 -0
  43. package/components/assistant-ui/attachment.js +353 -0
  44. package/components/assistant-ui/badge.d.ts +11 -0
  45. package/components/assistant-ui/badge.js +54 -0
  46. package/components/assistant-ui/branch-picker.d.ts +3 -0
  47. package/components/assistant-ui/branch-picker.js +36 -0
  48. package/components/assistant-ui/chain-of-thought.d.ts +46 -0
  49. package/components/assistant-ui/composer-add-context.d.ts +50 -0
  50. package/components/assistant-ui/composer-add-context.js +209 -0
  51. package/components/assistant-ui/composer-deep-research.d.ts +16 -0
  52. package/components/assistant-ui/composer-deep-research.js +38 -0
  53. package/components/assistant-ui/composer-harness.d.ts +18 -0
  54. package/components/assistant-ui/composer-harness.js +186 -0
  55. package/components/assistant-ui/composer-trigger-popover.d.ts +47 -0
  56. package/components/assistant-ui/composer-trigger-popover.js +147 -0
  57. package/components/assistant-ui/composer.d.ts +8 -0
  58. package/components/assistant-ui/composer.js +276 -0
  59. package/components/assistant-ui/directive-text.d.ts +16 -0
  60. package/components/assistant-ui/directive-text.js +40 -0
  61. package/components/assistant-ui/error.d.ts +6 -0
  62. package/components/assistant-ui/error.js +39 -0
  63. package/components/assistant-ui/file.d.ts +37 -0
  64. package/components/assistant-ui/file.js +159 -0
  65. package/components/assistant-ui/follow-up-suggestions.d.ts +7 -0
  66. package/components/assistant-ui/follow-up-suggestions.js +44 -0
  67. package/components/assistant-ui/image.d.ts +46 -0
  68. package/components/assistant-ui/image.js +351 -0
  69. package/components/assistant-ui/index.d.ts +28 -0
  70. package/components/assistant-ui/markdown-text.d.ts +1 -0
  71. package/components/assistant-ui/markdown-text.js +242 -0
  72. package/components/assistant-ui/message-timing.d.ts +25 -0
  73. package/components/assistant-ui/message-timing.js +56 -0
  74. package/components/assistant-ui/message.d.ts +4 -0
  75. package/components/assistant-ui/message.js +159 -0
  76. package/components/assistant-ui/primitives.d.ts +2 -0
  77. package/components/assistant-ui/quote.d.ts +37 -0
  78. package/components/assistant-ui/quote.js +150 -0
  79. package/components/assistant-ui/reasoning.d.ts +44 -0
  80. package/components/assistant-ui/reasoning.js +261 -0
  81. package/components/assistant-ui/selection-toolbar.d.ts +29 -0
  82. package/components/assistant-ui/selection-toolbar.js +91 -0
  83. package/components/assistant-ui/smart-message-text.d.ts +15 -0
  84. package/components/assistant-ui/smart-message-text.js +29 -0
  85. package/components/assistant-ui/sources.d.ts +17 -0
  86. package/components/assistant-ui/sources.js +121 -0
  87. package/components/assistant-ui/suggestions.d.ts +7 -0
  88. package/components/assistant-ui/suggestions.js +19 -0
  89. package/components/assistant-ui/thread-context.d.ts +37 -0
  90. package/components/assistant-ui/thread-context.js +8 -0
  91. package/components/assistant-ui/thread.d.ts +5 -0
  92. package/components/assistant-ui/thread.js +77 -0
  93. package/components/assistant-ui/tool-fallback.d.ts +36 -0
  94. package/components/assistant-ui/tool-fallback.js +428 -0
  95. package/components/assistant-ui/tool-group.d.ts +33 -0
  96. package/components/assistant-ui/tool-group.js +173 -0
  97. package/components/assistant-ui/tooltip-icon-button.d.ts +7 -0
  98. package/components/assistant-ui/tooltip-icon-button.js +31 -0
  99. package/components/assistant-ui/voice.d.ts +18 -0
  100. package/components/autocomplete.d.ts +18 -0
  101. package/components/autocomplete.js +162 -0
  102. package/components/avatar.d.ts +26 -0
  103. package/components/avatar.js +92 -0
  104. package/components/badge.d.ts +10 -0
  105. package/components/badge.js +83 -0
  106. package/components/brand-loader.d.ts +16 -0
  107. package/components/brand-loader.js +64 -0
  108. package/components/breadcrumbs.d.ts +8 -0
  109. package/components/breadcrumbs.js +58 -0
  110. package/components/button.d.ts +13 -0
  111. package/components/button.js +100 -0
  112. package/components/card.d.ts +19 -0
  113. package/components/card.js +82 -0
  114. package/components/carousel.d.ts +31 -0
  115. package/components/carousel.js +351 -0
  116. package/components/chart.d.ts +165 -0
  117. package/components/chart.js +841 -0
  118. package/components/checkbox.d.ts +13 -0
  119. package/components/checkbox.js +84 -0
  120. package/components/chip.d.ts +13 -0
  121. package/components/chip.js +112 -0
  122. package/components/collapsible.d.ts +5 -0
  123. package/components/collapsible.js +31 -0
  124. package/components/connector-card.d.ts +62 -0
  125. package/components/connector-card.js +154 -0
  126. package/components/divider.d.ts +23 -0
  127. package/components/divider.js +69 -0
  128. package/components/drawer.d.ts +45 -0
  129. package/components/drawer.js +234 -0
  130. package/components/dropdown.d.ts +33 -0
  131. package/components/dropdown.js +198 -0
  132. package/components/empty-state.d.ts +8 -0
  133. package/components/empty-state.js +30 -0
  134. package/components/field.d.ts +20 -0
  135. package/components/field.js +74 -0
  136. package/components/index.d.ts +56 -0
  137. package/components/index.js +444 -0
  138. package/components/input-field.d.ts +22 -0
  139. package/components/input-field.js +91 -0
  140. package/components/input.d.ts +8 -0
  141. package/components/input.js +61 -0
  142. package/components/kbd.d.ts +6 -0
  143. package/components/kbd.js +26 -0
  144. package/components/link.d.ts +14 -0
  145. package/components/link.js +72 -0
  146. package/components/modal.d.ts +18 -0
  147. package/components/modal.js +156 -0
  148. package/components/navbar.d.ts +15 -0
  149. package/components/navbar.js +68 -0
  150. package/components/number-field.d.ts +11 -0
  151. package/components/number-field.js +89 -0
  152. package/components/pagination.d.ts +28 -0
  153. package/components/pagination.js +179 -0
  154. package/components/panel.d.ts +14 -0
  155. package/components/panel.js +71 -0
  156. package/components/pixel-blast-svg.d.ts +22 -0
  157. package/components/pixel-blast-svg.js +154 -0
  158. package/components/popover.d.ts +20 -0
  159. package/components/popover.js +101 -0
  160. package/components/progress-circle.d.ts +11 -0
  161. package/components/progress-circle.js +75 -0
  162. package/components/progress.d.ts +22 -0
  163. package/components/progress.js +66 -0
  164. package/components/radio.d.ts +16 -0
  165. package/components/radio.js +101 -0
  166. package/components/segmented.d.ts +16 -0
  167. package/components/segmented.js +103 -0
  168. package/components/select.d.ts +28 -0
  169. package/components/select.js +180 -0
  170. package/components/selection-action-bar.d.ts +11 -0
  171. package/components/selection-action-bar.js +59 -0
  172. package/components/sidebar.d.ts +118 -0
  173. package/components/sidebar.js +375 -0
  174. package/components/skeleton.d.ts +6 -0
  175. package/components/skeleton.js +26 -0
  176. package/components/slider.d.ts +11 -0
  177. package/components/slider.js +62 -0
  178. package/components/spinner.d.ts +11 -0
  179. package/components/spinner.js +62 -0
  180. package/components/switch.d.ts +7 -0
  181. package/components/switch.js +61 -0
  182. package/components/table.d.ts +59 -0
  183. package/components/table.js +254 -0
  184. package/components/tabs.d.ts +29 -0
  185. package/components/tabs.js +371 -0
  186. package/components/textarea.d.ts +5 -0
  187. package/components/textarea.js +24 -0
  188. package/components/timeline.d.ts +7 -0
  189. package/components/timeline.js +47 -0
  190. package/components/toast.d.ts +74 -0
  191. package/components/toast.js +211 -0
  192. package/components/tooltip.d.ts +11 -0
  193. package/components/tooltip.js +143 -0
  194. package/components/tree.d.ts +42 -0
  195. package/components/tree.js +86 -0
  196. package/components/typography.d.ts +33 -0
  197. package/components/typography.js +65 -0
  198. package/components/ui/avatar.d.ts +11 -0
  199. package/components/ui/avatar.js +56 -0
  200. package/components/ui/button.d.ts +10 -0
  201. package/components/ui/button.js +57 -0
  202. package/components/ui/collapsible.d.ts +5 -0
  203. package/components/ui/collapsible.js +35 -0
  204. package/components/ui/dialog.d.ts +17 -0
  205. package/components/ui/dialog.js +93 -0
  206. package/components/ui/tabs.d.ts +22 -0
  207. package/components/ui/tooltip.d.ts +7 -0
  208. package/components/ui/tooltip.js +56 -0
  209. package/fonts/aribau-grotesk-400.otf +0 -0
  210. package/fonts/aribau-grotesk-700.otf +0 -0
  211. package/fonts.css +21 -0
  212. package/hooks/agents-ui/use-agent-audio-visualizer-aura.d.ts +8 -0
  213. package/hooks/agents-ui/use-agent-audio-visualizer-aura.js +62 -0
  214. package/hooks/agents-ui/use-agent-audio-visualizer-wave.d.ts +7 -0
  215. package/hooks/agents-ui/use-agent-audio-visualizer-wave.js +60 -0
  216. package/hooks/agents-ui/voice-visualizer-types.d.ts +9 -0
  217. package/lib/cn.d.ts +3 -0
  218. package/lib/cn.js +9 -0
  219. package/lib/icons.d.ts +378 -0
  220. package/lib/icons.js +119 -0
  221. package/lib/interactive.d.ts +24 -0
  222. package/lib/interactive.js +36 -0
  223. package/lib/motion.d.ts +58 -0
  224. package/lib/motion.js +70 -0
  225. package/lib/router.d.ts +3 -0
  226. package/lib/utils.d.ts +6 -0
  227. package/llms.txt +537 -0
  228. package/manifest.json +5085 -0
  229. package/package.json +60 -0
  230. package/styles.css +653 -0
  231. package/theme.css +273 -0
package/styles.css ADDED
@@ -0,0 +1,653 @@
1
+ /* @actioneer/ads — generated by scripts/build-lib-styles.mjs. Do not edit. */
2
+ /* Must be @import'd into the SAME CSS graph as `@import "tailwindcss"` so
3
+ @theme/@source are processed; importing it standalone leaves tokens unset. */
4
+ @import "tw-shimmer";
5
+ @import "tw-animate-css";
6
+
7
+ /* ---- Aribau Grotesk ---- */
8
+ /* Aribau Grotesk — ADS 1.0 brand typeface.
9
+ Two weights only: Regular (400) and Bold (700).
10
+ The weight RANGES fold Tailwind's intermediate utilities onto these two
11
+ physical files: `font-normal`/`font-medium` → Regular, `font-semibold`/`font-bold` → Bold.
12
+ `font-synthesis-weight: none` (set in index.css) prevents faux weights. */
13
+ @font-face {
14
+ font-family: "Aribau Grotesk";
15
+ src: url("./fonts/aribau-grotesk-400.otf") format("opentype");
16
+ font-weight: 100 500;
17
+ font-style: normal;
18
+ font-display: swap;
19
+ }
20
+ @font-face {
21
+ font-family: "Aribau Grotesk";
22
+ src: url("./fonts/aribau-grotesk-700.otf") format("opentype");
23
+ font-weight: 600 900;
24
+ font-style: normal;
25
+ font-display: swap;
26
+ }
27
+
28
+ /* ---- Design tokens ---- */
29
+ /*
30
+ * ============================================================
31
+ * ADS 1.0 — Design Tokens
32
+ * Brand: BLACK · Typeface: Aribau Grotesk (Regular + Bold)
33
+ * ============================================================
34
+ */
35
+ @theme {
36
+ /* ---- Typography ----
37
+ One typeface only. No monospace font — numeric/code contexts use
38
+ Aribau Grotesk with `tabular-nums` for aligned figures. */
39
+ --font-sans: "Aribau Grotesk", ui-sans-serif, system-ui, -apple-system,
40
+ "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
41
+
42
+ /* ---- Type scale ---- base = 13px (0.8125rem). Root stays 16px so the
43
+ spacing grid is unaffected; only text sizes are anchored to 13px. */
44
+ /* SIX sizes only — a deliberately small ladder (captions → display).
45
+ Don't reintroduce 2xs/3xl/4xl or in-between steps; if a size feels
46
+ missing, the answer is weight/color, not a new size. */
47
+ --text-xs: 0.6875rem; /* 11px — captions, secondary text, table cells, keycaps */
48
+ --text-xs--line-height: 1rem;
49
+ /* text-sm is aliased to text-xs (both 11px). The scale is intentionally
50
+ 11 · 13 · 15 · 21 · 26 with no 12px tier — but keeping the token pointed
51
+ at 11px stops any stray `text-sm` from falling back to Tailwind's
52
+ default 14px, which would land off the scale entirely. */
53
+ --text-sm: 0.6875rem;
54
+ --text-sm--line-height: 1rem;
55
+ --text-base: 0.8125rem; /* 13px — BASE body */
56
+ --text-base--line-height: 1.25rem;
57
+ --text-lg: 0.9375rem; /* 15px — emphasized body, section headings */
58
+ --text-lg--line-height: 1.375rem;
59
+ --text-xl: 1.3125rem; /* 21px — page titles */
60
+ --text-xl--line-height: 1.75rem;
61
+ --text-2xl: 1.625rem; /* 26px — display */
62
+ --text-2xl--line-height: 2rem;
63
+
64
+ /* ---- Ink scale (the black brand ramp) ---- */
65
+ --color-ink-50: #f6f6f7;
66
+ --color-ink-100: #ececed;
67
+ --color-ink-200: #d9d9dc;
68
+ --color-ink-300: #b8b8bd;
69
+ --color-ink-400: #8f8f96;
70
+ --color-ink-500: #6e6e75;
71
+ --color-ink-600: #55555b;
72
+ --color-ink-700: #3f3f44;
73
+ --color-ink-800: #262629;
74
+ --color-ink-900: #161618;
75
+ --color-ink-950: #0a0a0b;
76
+
77
+ /* ---- Semantic accent ramps ---- */
78
+ --color-success-50: #f0fdf4;
79
+ --color-success-100: #dcfce7;
80
+ --color-success-500: #22c55e;
81
+ --color-success-600: #16a34a;
82
+ --color-success-700: #15803d;
83
+
84
+ --color-warning-50: #fffaeb;
85
+ --color-warning-100: #fef0c7;
86
+ --color-warning-500: #f79009;
87
+ --color-warning-600: #dc6803;
88
+ --color-warning-700: #b54708;
89
+
90
+ --color-danger-50: #fef3f2;
91
+ --color-danger-100: #fee4e2;
92
+ --color-danger-500: #f04438;
93
+ --color-danger-600: #d92d20;
94
+ --color-danger-700: #b42318;
95
+
96
+ --color-info-50: #eff8ff;
97
+ --color-info-100: #d1e9ff;
98
+ --color-info-500: #2e90fa;
99
+ --color-info-600: #1570ef;
100
+ --color-info-700: #175cd3;
101
+
102
+ /* ---- Radii ---- */
103
+ --radius-xs: 0.25rem;
104
+ --radius-sm: 0.375rem;
105
+ --radius-md: 0.5rem;
106
+ --radius-lg: 0.625rem;
107
+ --radius-xl: 0.875rem;
108
+ --radius-2xl: 1.25rem;
109
+ --radius-full: 9999px;
110
+ /* Status/indicator dots are SQUARE with a hair of softening — echoing the
111
+ growth-mark's square cells. Never render an indicator dot as a circle
112
+ (`rounded-full`); radio controls are the one exception (control
113
+ convention). */
114
+ --radius-dot: 2px;
115
+
116
+ /* ---- Elevation ---- ONE soft token (Claude-panel style).
117
+ Delineate surfaces with fill color first; add this to gently lift them. */
118
+ --shadow-elevation: 0 0 0 1px rgb(10 10 11 / 0.03),
119
+ 0 1px 2px 0 rgb(10 10 11 / 0.05),
120
+ 0 8px 24px -6px rgb(10 10 11 / 0.12);
121
+
122
+ /* ---- CTA inner glow ---- luminous inset highlight for primary buttons
123
+ (adapted from the "AI button" Figma): a crisp top-edge catch plus a soft
124
+ inner glow from the top and bottom, so a solid CTA reads as lit from within. */
125
+ --inner-glow-cta: inset 0 1px 0 0 rgb(255 255 255 / 0.25),
126
+ inset 0 10px 22px -10px rgb(255 255 255 / 0.28),
127
+ inset 0 -10px 22px -10px rgb(255 255 255 / 0.16);
128
+ /* Light-fill sibling — the same lit-from-within read for secondary/soft
129
+ buttons (white catch reads on gray fills at higher opacity). */
130
+ --inner-glow-fill: inset 0 1px 0 0 rgb(255 255 255 / 0.7),
131
+ inset 0 8px 16px -8px rgb(255 255 255 / 0.45);
132
+ /* Text fields — a whisper of inset depth so the writing surface reads
133
+ recessed into the page (persists through hover/focus/invalid). */
134
+ --inner-glow-field: inset 0 1px 2px 0 rgb(10 10 11 / 0.06);
135
+
136
+ /* ---- Motion ---- strong custom curves; the built-in CSS easings are too
137
+ weak. Declared here so the `ease-out` / `ease-in-out` utilities resolve
138
+ to these system-wide. JS mirror: src/lib/motion.ts — keep in sync. */
139
+ --ease-out: cubic-bezier(0.23, 1, 0.32, 1); /* entrances, exits, presses */
140
+ --ease-in-out: cubic-bezier(0.77, 0, 0.175, 1); /* on-screen movement / morphs */
141
+ --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1); /* iOS-like drawer slide */
142
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* playful overshoot (rare) */
143
+
144
+ /* Durations — every animation/transition timing flows from these.
145
+ UI animations stay under 300ms; exits run faster than enters. */
146
+ --duration-fast: 0.15s; /* menu / popover / tooltip enter */
147
+ --duration-normal: 0.2s; /* state transitions */
148
+ --duration-spin: 0.8s; /* rotation loops (spinner) */
149
+ --duration-pulse: 1.5s; /* breathing / shimmer loops */
150
+ --duration-bloom: 0.9s; /* ambient reveals (chat texture bloom, curtain wipe) */
151
+ --duration-brand-loader: 3.4s; /* BrandLoader flicker loop */
152
+
153
+ /* Entrance-choreography beats — staggered delays for sequenced arrivals
154
+ (e.g. chat welcome: mark → greeting → composer). */
155
+ --stagger-1: 0.2s;
156
+ --stagger-2: 0.3s;
157
+ --stagger-3: 0.42s;
158
+
159
+ /* Press feedback — every pressable element scales down on :active */
160
+ --scale-press: 0.97;
161
+
162
+ /* ---- Layout ---- app-frame dimensions (Sidebar / Panel) */
163
+ --sidebar-width: 15rem; /* 240px — primary nav rail */
164
+ --sidebar-width-sm: 3.5rem; /* 56px — collapsed icon rail */
165
+ --sidebar-header: 4rem; /* 64px — brand / header row height */
166
+ --sidebar-item: 2rem; /* 32px — collapsed rail hit target (square) */
167
+ --sidebar-logo: 1.25rem; /* 20px — brand mark, centered in a --sidebar-item square */
168
+ --sidebar-text-indent: 2.375rem; /* px-3 + icon size-4 + gap-2.5 — history rows align to nav-item text */
169
+ --panel-header-height: 2.75rem; /* 44px — Panel / toolbar header */
170
+ --aside-width: 20rem; /* 320px — right-hand panel column */
171
+
172
+ /* ---- Component sizing ---- */
173
+ --card-padding: 1.25rem; /* 20px — inner padding for cards */
174
+ --connector-card-max: 30rem; /* 480px — max column width for connector-card grids (cap; no min) */
175
+ --connector-card-min: 20rem; /* 320px — min column width for auto-fill connector-card grids (cards stretch to 1fr; column count follows the container) */
176
+
177
+ /* ---- Chat (Ask Actioneer / assistant-ui) ---- */
178
+ --thread-max-width: 44rem; /* chat column cap — readable prose measure, all panes */
179
+ --thread-max-width-wide: 64rem; /* rich-content breakout cap (tables/charts/tool cards) on wide panes; prose keeps --thread-max-width */
180
+ --composer-bg: color-mix(in oklab, var(--muted) 30%, var(--background));
181
+ --composer-radius: var(--radius-2xl);
182
+ --composer-padding: 0.5rem;
183
+ --chat-texture-opacity: 0.06; /* welcome-state halftone wash */
184
+ }
185
+
186
+ /*
187
+ * Chart tokens are referenced from SVG prop strings, which Tailwind cannot
188
+ * discover while pruning @theme variables. Keep this palette explicit so
189
+ * every comparison series survives production builds.
190
+ */
191
+ :root {
192
+ --color-chart-1: var(--color-ink-950);
193
+ --color-chart-2: var(--color-ink-400);
194
+ --color-chart-3: var(--color-ink-300);
195
+ --color-chart-4: var(--color-info-500);
196
+ --color-chart-5: var(--color-warning-500);
197
+ --color-chart-6: var(--color-success-500);
198
+ }
199
+
200
+ /*
201
+ * Semantic role tokens — mapped through CSS vars.
202
+ * @theme inline exposes them as utilities (bg-background, text-primary, …).
203
+ */
204
+ @theme inline {
205
+ --color-background: var(--background);
206
+ --color-foreground: var(--foreground);
207
+
208
+ /* Text hierarchy — three accessible levels (all ≥ AA on --background) */
209
+ --color-primary: var(--text-primary);
210
+ --color-secondary: var(--text-secondary);
211
+ --color-tertiary: var(--text-tertiary);
212
+
213
+ --color-surface: var(--surface);
214
+ --color-surface-foreground: var(--surface-foreground);
215
+ --color-elevated: var(--elevated);
216
+
217
+ --color-muted: var(--muted);
218
+ --color-muted-foreground: var(--muted-foreground);
219
+
220
+ --color-card: var(--card);
221
+ --color-card-foreground: var(--card-foreground);
222
+
223
+ /* Brand (black) — used for solid fills, not body text */
224
+ --color-brand: var(--brand);
225
+ --color-brand-foreground: var(--brand-foreground);
226
+ --color-brand-hover: var(--brand-hover);
227
+
228
+ /* Quiet fill — secondary buttons, avatars, chips */
229
+ --color-fill: var(--fill);
230
+ --color-fill-foreground: var(--fill-foreground);
231
+
232
+ --color-accent: var(--accent);
233
+ --color-accent-foreground: var(--accent-foreground);
234
+
235
+ --color-success: var(--color-success-600);
236
+ --color-success-foreground: #ffffff;
237
+ --color-warning: var(--color-warning-500);
238
+ --color-warning-foreground: #ffffff;
239
+ --color-danger: var(--color-danger-600);
240
+ --color-danger-foreground: #ffffff;
241
+ --color-info: var(--color-info-600);
242
+ --color-info-foreground: #ffffff;
243
+
244
+ --color-border: var(--border);
245
+ --color-border-strong: var(--border-strong);
246
+ --color-input: var(--input);
247
+ --color-ring: var(--ring);
248
+ --color-overlay: var(--overlay);
249
+
250
+ /*
251
+ * shadcn-compat aliases — consumed ONLY by the vendored chat components
252
+ * (src/components/ui, src/components/assistant-ui). ADS UI never uses
253
+ * these; they map shadcn's expected roles onto ADS tokens.
254
+ */
255
+ --color-primary-foreground: var(--brand-foreground);
256
+ --color-secondary-foreground: #ffffff;
257
+ --color-destructive: var(--color-danger-600);
258
+ --color-destructive-foreground: #ffffff;
259
+ --color-popover: var(--elevated);
260
+ --color-popover-foreground: var(--foreground);
261
+ }
262
+
263
+ /* ---- Theme (light only) ---- */
264
+ :root {
265
+ --background: #ffffff;
266
+ --foreground: #0a0a0b;
267
+
268
+ /* Text hierarchy — accessible on #ffffff */
269
+ --text-primary: #0a0a0b; /* ~20:1 AAA */
270
+ --text-secondary: #52525b; /* ~7.6:1 AAA */
271
+ --text-tertiary: #6e6e75; /* ~5.2:1 AA */
272
+
273
+ --surface: #f6f6f7;
274
+ --surface-foreground: #262629;
275
+ --elevated: #ffffff;
276
+
277
+ --muted: #f6f6f7;
278
+ --muted-foreground: #6e6e75;
279
+
280
+ --card: #ffffff;
281
+ --card-foreground: #0a0a0b;
282
+
283
+ /* BLACK brand */
284
+ --brand: #0a0a0b;
285
+ --brand-foreground: #ffffff;
286
+ --brand-hover: #262629;
287
+
288
+ /* Quiet fill */
289
+ --fill: #ececed;
290
+ --fill-foreground: #161618;
291
+
292
+ --accent: #f6f6f7;
293
+ --accent-foreground: #161618;
294
+
295
+ --border: #ececed;
296
+ --border-strong: #d9d9dc;
297
+ --input: #d9d9dc;
298
+ --ring: rgb(10 10 11 / 0.35);
299
+ --overlay: rgb(10 10 11 / 0.5);
300
+ }
301
+ /* ---- Base, keyframes & component helpers ---- */
302
+ /* Hide scrollbars app-wide but keep scrollability. The demo UI is filled
303
+ and borderless by design — visible scrollbar tracks read as decorative
304
+ noise. Wheel/trackpad/keyboard scrolling still works because we only
305
+ suppress the *rendered* scrollbar, not overflow behaviour. */
306
+ * {
307
+ scrollbar-width: none; /* Firefox */
308
+ -ms-overflow-style: none; /* legacy Edge / IE */
309
+ }
310
+ *::-webkit-scrollbar { /* WebKit / Blink */
311
+ width: 0;
312
+ height: 0;
313
+ display: none;
314
+ }
315
+
316
+ /* Ask Actioneer texture entrance: a radial bloom — the halftone reveals from
317
+ the centre out to the corners (clip-path circle) while gently scaling up to
318
+ rest. `from{}`-only keyframe, so it settles into the element's own opacity. */
319
+ @keyframes chat-texture-reveal {
320
+ from {
321
+ clip-path: circle(10% at 50% 50%);
322
+ opacity: 0;
323
+ scale: 0.94;
324
+ }
325
+ to {
326
+ clip-path: circle(102% at 50% 50%);
327
+ }
328
+ }
329
+ .chat-texture-reveal {
330
+ animation: chat-texture-reveal var(--duration-bloom) var(--ease-out) both;
331
+ }
332
+
333
+ /* Paper's WebGL shader owns the halftone animation. The canvas is bounded to
334
+ this isolated layer and the component stops its render loop when hidden. */
335
+ .pixel-blast-svg {
336
+ position: relative;
337
+ width: 100%;
338
+ height: 100%;
339
+ overflow: hidden;
340
+ contain: strict;
341
+ isolation: isolate;
342
+ }
343
+ .pixel-blast-svg canvas {
344
+ image-rendering: pixelated;
345
+ }
346
+
347
+ /* Voice call surface: audio changes the duration, not the color or opacity.
348
+ Silence keeps a slow ambient drift; speech accelerates the same neutral
349
+ field without introducing flashing status colors. */
350
+ @keyframes voice-surface-drift {
351
+ 0% {
352
+ transform: translate3d(-3%, -2%, 0) rotate(0deg) scale(1.02);
353
+ }
354
+ 35% {
355
+ transform: translate3d(4%, -1%, 0) rotate(4deg) scale(1.08);
356
+ }
357
+ 70% {
358
+ transform: translate3d(1%, 4%, 0) rotate(-3deg) scale(1.04);
359
+ }
360
+ 100% {
361
+ transform: translate3d(-3%, -2%, 0) rotate(0deg) scale(1.02);
362
+ }
363
+ }
364
+ .voice-surface-drift {
365
+ animation-name: voice-surface-drift;
366
+ animation-timing-function: linear;
367
+ animation-iteration-count: infinite;
368
+ will-change: transform;
369
+ }
370
+ .voice-surface-drift-reverse {
371
+ animation-direction: reverse;
372
+ }
373
+ @media (prefers-reduced-motion: reduce) {
374
+ .chat-texture-reveal {
375
+ animation: none;
376
+ }
377
+ .voice-surface-drift {
378
+ animation: none;
379
+ }
380
+ }
381
+
382
+ /* Ask Actioneer texture exit — cloud lift. When the conversation starts the
383
+ halftone dissolves from the BOTTOM upward (a soft mask band sweeps up
384
+ through it) while the whole layer drifts up and fades — cloud cover
385
+ breaking and rising, not a curtain covering it. The mask rests fully
386
+ opaque (element aligned with the black end of an oversized gradient), and
387
+ the lifted state slides the element to the transparent end. */
388
+ .chat-texture-lift {
389
+ mask-image: linear-gradient(to top, transparent 0%, transparent 42%, black 58%, black 100%);
390
+ -webkit-mask-image: linear-gradient(to top, transparent 0%, transparent 42%, black 58%, black 100%);
391
+ mask-repeat: no-repeat;
392
+ -webkit-mask-repeat: no-repeat;
393
+ mask-size: 100% 240%;
394
+ -webkit-mask-size: 100% 240%;
395
+ mask-position: 0% 0%;
396
+ -webkit-mask-position: 0% 0%;
397
+ transition:
398
+ mask-position 1s var(--ease-out),
399
+ -webkit-mask-position 1s var(--ease-out),
400
+ translate 1s var(--ease-out),
401
+ opacity 1s var(--ease-out);
402
+ }
403
+ .chat-texture-lifted {
404
+ mask-position: 0% 100%;
405
+ -webkit-mask-position: 0% 100%;
406
+ translate: 0 -3.5rem;
407
+ }
408
+ @media (prefers-reduced-motion: reduce) {
409
+ .chat-texture-lift {
410
+ transition: opacity var(--duration-normal) var(--ease-out);
411
+ }
412
+ .chat-texture-lifted {
413
+ mask-position: 0% 0%;
414
+ -webkit-mask-position: 0% 0%;
415
+ translate: none;
416
+ }
417
+ }
418
+
419
+ /* BrandLoader (src/components/brand-loader.tsx): each cell of the growth mark
420
+ flickers on like a neon tube — hard cuts (steps(1)): off → on with a
421
+ stutter → hold → off — on a staggered loop. fill-mode backwards keeps a
422
+ cell dark through its delay, so the mark builds up cell by cell. */
423
+ @keyframes brand-flicker {
424
+ 0% {
425
+ opacity: 0;
426
+ }
427
+ 6% {
428
+ opacity: 1;
429
+ }
430
+ 9% {
431
+ opacity: 0.15;
432
+ }
433
+ 12% {
434
+ opacity: 1;
435
+ }
436
+ 15% {
437
+ opacity: 0.35;
438
+ }
439
+ 18%,
440
+ 82% {
441
+ opacity: 1;
442
+ }
443
+ 90%,
444
+ 100% {
445
+ opacity: 0;
446
+ }
447
+ }
448
+ .brand-loader-cell {
449
+ animation: brand-flicker var(--duration-brand-loader) steps(1) infinite backwards;
450
+ }
451
+ @media (prefers-reduced-motion: reduce) {
452
+ .brand-loader-cell {
453
+ animation: none; /* static full-opacity mark */
454
+ }
455
+ }
456
+
457
+ @layer base {
458
+ * {
459
+ border-color: var(--border);
460
+ }
461
+
462
+ html {
463
+ -webkit-font-smoothing: antialiased;
464
+ -moz-osx-font-smoothing: grayscale;
465
+ text-rendering: optimizeLegibility;
466
+ }
467
+
468
+ body {
469
+ margin: 0;
470
+ background-color: var(--background);
471
+ color: var(--foreground);
472
+ font-family: var(--font-sans);
473
+ font-size: var(--text-base); /* 13px base */
474
+ font-feature-settings: "cv01", "ss01";
475
+ font-synthesis-weight: none;
476
+ }
477
+
478
+ /* One typeface only: neutralize the browser's default monospace on
479
+ code/kbd/samp/pre so they render in Aribau Grotesk like everything else. */
480
+ code,
481
+ kbd,
482
+ samp,
483
+ pre {
484
+ font-family: inherit;
485
+ }
486
+
487
+ /* Consistent focus ring across the system */
488
+ :focus-visible {
489
+ outline: none;
490
+ }
491
+
492
+ ::selection {
493
+ background: color-mix(in srgb, var(--brand) 22%, transparent);
494
+ }
495
+
496
+ /* Custom scrollbar for showcase surfaces */
497
+ ::-webkit-scrollbar {
498
+ width: 10px;
499
+ height: 10px;
500
+ }
501
+ ::-webkit-scrollbar-thumb {
502
+ background: var(--border-strong);
503
+ border-radius: 9999px;
504
+ border: 2px solid var(--background);
505
+ }
506
+ ::-webkit-scrollbar-thumb:hover {
507
+ background: var(--muted-foreground);
508
+ }
509
+ }
510
+
511
+ /* Reusable keyframes for loops (spinner / skeleton / progress). Overlay
512
+ enter/exit animation lives in Motion via src/lib/motion.ts — transitions
513
+ over keyframes, so rapid open/close retargets instead of restarting. */
514
+ @keyframes ads-spin {
515
+ to { transform: rotate(360deg); }
516
+ }
517
+ /* Spinner head — the arc GROWS from ~zero to cover the entire squircle
518
+ (100% of the perimeter), then SHRINKS back to nothing, while the parent
519
+ <g> keeps sweeping at a constant rate. Net effect: the head traces the
520
+ whole shape (so users see the full squircle drawn), then unwinds. Perimeter
521
+ is 60u.
522
+ • 0% — hairline head (length 1) at the top.
523
+ • 50% — full ring (length 60, no gap): the entire shape is covered.
524
+ • 100%— hairline head again, but its origin has advanced a full loop.
525
+ The dashoffset ramps continuously so the tail chases the head at half the
526
+ speed of the group's rotation, giving that classic Material breathing feel.
527
+ */
528
+ @keyframes ads-spin-head {
529
+ 0% { stroke-dasharray: 1 59; stroke-dashoffset: 0; }
530
+ 50% { stroke-dasharray: 60 0; stroke-dashoffset: -30; }
531
+ 100% { stroke-dasharray: 1 59; stroke-dashoffset: -60; }
532
+ }
533
+ @keyframes ads-shimmer {
534
+ 100% { transform: translateX(100%); }
535
+ }
536
+ @keyframes ads-indeterminate {
537
+ 0% { transform: translate3d(-100%, 0, 0); }
538
+ 60%, 100% { transform: translate3d(250%, 0, 0); }
539
+ }
540
+ /*
541
+ * Interactive border — a reusable primitive (see src/lib/interactive.ts).
542
+ * Any bordered element opts in with `.ads-interactive` + a trigger class; the
543
+ * border snaps to a solid 100% brand-black stroke on hover and focus — no
544
+ * halo, no elevation, no pulse (a shadow on a form control reads as
545
+ * actionable-surface elevation, which controls must not claim).
546
+ * Behaviour stays tunable through the CSS custom properties.
547
+ */
548
+ @layer components {
549
+ .ads-interactive {
550
+ /* — customizable knobs (overridden by the cva variants / inline vars) — */
551
+ --glow: var(--brand);
552
+ --glow-strength: 12%;
553
+ --glow-blur: 12px;
554
+ --glow-spread: 2px;
555
+ --glow-border-rest: var(--border);
556
+ --glow-border-hover: var(--brand);
557
+ --glow-border-active: var(--foreground);
558
+ /* Optional persistent inset (e.g. the field inner glow) — hosts opt in
559
+ via [--glow-inset:var(--inner-glow-field)]; carried through every
560
+ state below so hover/focus/invalid never strip it. */
561
+ --glow-inset: 0 0 #0000;
562
+
563
+ border-color: var(--glow-border-rest);
564
+ box-shadow: var(--glow-inset);
565
+ transition:
566
+ color var(--duration-normal) var(--ease-out),
567
+ border-color var(--duration-normal) var(--ease-out),
568
+ box-shadow var(--duration-normal) var(--ease-out);
569
+ }
570
+
571
+ /* Hover: the same solid brand-black stroke as focus — one consistent
572
+ "this is interactive" signal, no halo shadow. */
573
+ .ads-interactive.ads-on-hover:hover:not(:disabled):not([aria-invalid="true"]) {
574
+ border-color: var(--glow-border-hover);
575
+ box-shadow: var(--glow-inset);
576
+ }
577
+
578
+ /* Focus / focus-within: solid brand-black 1px stroke, no glow, no pulse.
579
+ Kept plain so form fields read as "this is where I'm typing" without
580
+ the heartbeat animation that came before. */
581
+ .ads-interactive.ads-on-focus:focus:not(:disabled):not([aria-invalid="true"]),
582
+ .ads-interactive.ads-on-focus:focus-visible:not(:disabled):not([aria-invalid="true"]),
583
+ .ads-interactive.ads-on-within:focus-within:not([aria-invalid="true"]) {
584
+ border-color: var(--brand);
585
+ box-shadow: var(--glow-inset);
586
+ }
587
+
588
+ /* .ads-animate is intentionally a no-op on focus/hover — the previous
589
+ ads-glow-pulse read as an unwanted heartbeat. Keep the selector matched
590
+ so consumers passing the class don't need code changes. */
591
+
592
+ /* Invalid state (form fields) */
593
+ .ads-interactive[aria-invalid="true"] {
594
+ border-color: var(--color-danger-600);
595
+ box-shadow: 0 0 0 3px var(--color-danger-100);
596
+ }
597
+ }
598
+
599
+ /* ads-glow-pulse removed — focus is now a plain solid stroke, no animation. */
600
+
601
+ /* Respect reduced-motion */
602
+ @media (prefers-reduced-motion: reduce) {
603
+ .ads-interactive {
604
+ animation: none !important;
605
+ }
606
+ }
607
+
608
+ /* Growth-mark hover blip — the brand film's cell dim/shrink loop, played
609
+ only while a wrapping `group/brand` link is hovered (rest = solid mark).
610
+ Per-cell stagger arrives via --blip-delay from BrandMark. */
611
+ @keyframes ads-mark-blip {
612
+ 0% { opacity: 1; transform: scale(1); }
613
+ 22% { opacity: 0.16; transform: scale(0.78); }
614
+ 100% { opacity: 0.16; transform: scale(0.78); }
615
+ }
616
+ .ads-mark-cell {
617
+ transform-box: fill-box;
618
+ transform-origin: center;
619
+ }
620
+ .group\/brand:hover .ads-mark-cell {
621
+ animation: ads-mark-blip 1.9s linear infinite;
622
+ animation-delay: var(--blip-delay, 0s);
623
+ }
624
+ @media (prefers-reduced-motion: reduce) {
625
+ .group\/brand:hover .ads-mark-cell {
626
+ animation: none;
627
+ }
628
+ }
629
+
630
+ /* Row-flash — a transient brand tint on a table row when the app jumps to
631
+ it (e.g. clicking a flagged column in an issue card scrolls its row into
632
+ view and briefly highlights it so the eye can lock on). Painted on cells
633
+ because border-separate tables don't render <tr> backgrounds. */
634
+ @keyframes ads-row-flash {
635
+ 0% {
636
+ background-color: color-mix(in oklab, var(--brand) 14%, transparent);
637
+ }
638
+ 100% {
639
+ background-color: transparent;
640
+ }
641
+ }
642
+
643
+ .ads-row-flash > td {
644
+ animation: ads-row-flash 1.6s var(--ease-out) forwards;
645
+ }
646
+
647
+ @media (prefers-reduced-motion: reduce) {
648
+ .ads-row-flash > td {
649
+ animation: none !important;
650
+ }
651
+ }
652
+ /* Let the consumer's Tailwind discover the classes ADS components use. */
653
+ @source "./**/*.{js,mjs}";