@actioneer/ads 0.7.0 → 1.0.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.
- package/DESIGN.md +597 -0
- package/components/ai-elements/agent-trace.js +1 -1
- package/components/alert.js +3 -3
- package/components/answer.js +2 -2
- package/components/assistant-ui/action-bar.js +1 -1
- package/components/assistant-ui/attachment.js +12 -12
- package/components/assistant-ui/badge.js +18 -18
- package/components/assistant-ui/composer-harness.js +5 -4
- package/components/assistant-ui/composer-trigger-popover.js +9 -9
- package/components/assistant-ui/composer.js +32 -32
- package/components/assistant-ui/directive-text.js +5 -5
- package/components/assistant-ui/image.js +61 -61
- package/components/assistant-ui/markdown-text.js +7 -7
- package/components/assistant-ui/message-timing.js +1 -1
- package/components/assistant-ui/selection-toolbar.js +7 -7
- package/components/assistant-ui/sources.js +1 -1
- package/components/avatar.d.ts +1 -1
- package/components/avatar.js +35 -35
- package/components/body-page-header.d.ts +1 -1
- package/components/body-page-header.js +1 -1
- package/components/chart.js +1 -1
- package/components/chip.js +8 -8
- package/components/divider.js +25 -25
- package/components/drawer.d.ts +2 -14
- package/components/drawer.js +103 -109
- package/components/field.js +9 -9
- package/components/index.d.ts +1 -0
- package/components/index.js +466 -465
- package/components/infinite-canvas.js +1 -1
- package/components/input.js +21 -19
- package/components/modal.js +26 -26
- package/components/page-body.js +6 -6
- package/components/page-header.js +1 -1
- package/components/pagination.js +1 -1
- package/components/pixel-blast-svg.js +71 -73
- package/components/search-disclosure.d.ts +18 -0
- package/components/search-disclosure.js +106 -0
- package/components/sidebar.js +60 -53
- package/components/table.d.ts +1 -1
- package/components/table.js +73 -74
- package/components/tabs.js +68 -59
- package/components/tree.js +17 -17
- package/components/typography.d.ts +1 -1
- package/components/typography.js +1 -1
- package/components/ui/button.d.ts +1 -1
- package/components/ui/button.js +4 -4
- package/components/ui/dialog.js +23 -23
- package/components/viz-charts.js +36 -36
- package/demo/components/add-to-artifact.js +3 -2
- package/lib/cn.js +7 -7
- package/lib/icons.d.ts +4 -0
- package/lib/icons.js +105 -104
- package/llms.txt +52 -49
- package/manifest.json +258 -235
- package/package.json +2 -1
- package/styles.css +171 -153
- package/theme.css +162 -140
package/DESIGN.md
ADDED
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Actioneer Design System
|
|
3
|
+
description: ADS 1.0 — the React 19 + Tailwind v4 library every Actioneer product builds from
|
|
4
|
+
colors:
|
|
5
|
+
action-primary: "#398457"
|
|
6
|
+
action-primary-hover: "#2b7348"
|
|
7
|
+
action-primary-text: "#1f623b"
|
|
8
|
+
action-primary-soft: "#e2efe5"
|
|
9
|
+
action-primary-foreground: "#ffffff"
|
|
10
|
+
field-focus: "#5c9c73"
|
|
11
|
+
brand: "#20201e"
|
|
12
|
+
brand-hover: "#4b4b47"
|
|
13
|
+
brand-text: "#20201e"
|
|
14
|
+
brand-foreground: "#ffffff"
|
|
15
|
+
success: "#516923"
|
|
16
|
+
success-foreground: "#ffffff"
|
|
17
|
+
warning: "#f79009"
|
|
18
|
+
warning-foreground: "#20201e"
|
|
19
|
+
danger: "#d92d20"
|
|
20
|
+
danger-foreground: "#ffffff"
|
|
21
|
+
info: "#1570ef"
|
|
22
|
+
info-foreground: "#ffffff"
|
|
23
|
+
background: "#f1f1ef"
|
|
24
|
+
foreground: "#20201e"
|
|
25
|
+
surface: "#ececea"
|
|
26
|
+
surface-foreground: "#20201e"
|
|
27
|
+
elevated: "#ffffff"
|
|
28
|
+
card: "#ffffff"
|
|
29
|
+
card-foreground: "#20201e"
|
|
30
|
+
muted: "#e5e5e2"
|
|
31
|
+
muted-foreground: "#4b4b47"
|
|
32
|
+
fill: "#ececea"
|
|
33
|
+
fill-foreground: "#20201e"
|
|
34
|
+
accent: "#dcdcd8"
|
|
35
|
+
accent-foreground: "#20201e"
|
|
36
|
+
on-white-primary: "#20201e"
|
|
37
|
+
on-white-secondary: "#4b4b47"
|
|
38
|
+
on-white-tertiary: "#777771"
|
|
39
|
+
on-warm-grey-primary: "#20201e"
|
|
40
|
+
on-warm-grey-secondary: "#4b4b47"
|
|
41
|
+
on-warm-grey-tertiary: "#777771"
|
|
42
|
+
primary: "#20201e"
|
|
43
|
+
secondary: "#4b4b47"
|
|
44
|
+
tertiary: "color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))"
|
|
45
|
+
border: "#e5e5e2"
|
|
46
|
+
border-primary: "#dcdcd8"
|
|
47
|
+
border-secondary: "#e5e5e2"
|
|
48
|
+
border-tertiary: "#ececea"
|
|
49
|
+
border-strong: "#dcdcd8"
|
|
50
|
+
input: "#e5e5e2"
|
|
51
|
+
menu-stroke: "#e5e5e2"
|
|
52
|
+
toast-stroke: "#e5e5e2"
|
|
53
|
+
tree-stroke: "#e5e5e2"
|
|
54
|
+
specimen-stroke: "#ececea"
|
|
55
|
+
table-shell: "#ffffff"
|
|
56
|
+
table-stroke: "#ececea"
|
|
57
|
+
table-header-foreground: "color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))"
|
|
58
|
+
artifact-canvas: "color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white))"
|
|
59
|
+
ring: "color-mix(in srgb, var(--color-wg12) 50%, transparent)"
|
|
60
|
+
overlay: "color-mix(in srgb, var(--color-wg12) 50%, transparent)"
|
|
61
|
+
typography:
|
|
62
|
+
display:
|
|
63
|
+
fontFamily: "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif"
|
|
64
|
+
fontSize: "24px"
|
|
65
|
+
fontWeight: 500
|
|
66
|
+
lineHeight: "32px"
|
|
67
|
+
title:
|
|
68
|
+
fontFamily: "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif"
|
|
69
|
+
fontSize: "18px"
|
|
70
|
+
fontWeight: 500
|
|
71
|
+
lineHeight: "24px"
|
|
72
|
+
headline:
|
|
73
|
+
fontFamily: "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif"
|
|
74
|
+
fontSize: "16px"
|
|
75
|
+
fontWeight: 500
|
|
76
|
+
lineHeight: "22px"
|
|
77
|
+
body:
|
|
78
|
+
fontFamily: "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif"
|
|
79
|
+
fontSize: "14px"
|
|
80
|
+
fontWeight: 400
|
|
81
|
+
lineHeight: "20px"
|
|
82
|
+
label:
|
|
83
|
+
fontFamily: "\"Aribau Grotesk\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif"
|
|
84
|
+
fontSize: "12px"
|
|
85
|
+
fontWeight: 400
|
|
86
|
+
lineHeight: "16px"
|
|
87
|
+
mono:
|
|
88
|
+
fontFamily: "\"JetBrains Mono Variable\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", \"Courier New\", monospace"
|
|
89
|
+
fontSize: "12px"
|
|
90
|
+
fontWeight: 400
|
|
91
|
+
lineHeight: "16px"
|
|
92
|
+
rounded:
|
|
93
|
+
xs: "2px"
|
|
94
|
+
sm: "4px"
|
|
95
|
+
md: "6px"
|
|
96
|
+
lg: "8px"
|
|
97
|
+
xl: "8px"
|
|
98
|
+
full: "9999px"
|
|
99
|
+
spacing:
|
|
100
|
+
xs: "4px"
|
|
101
|
+
sm: "8px"
|
|
102
|
+
md: "12px"
|
|
103
|
+
lg: "16px"
|
|
104
|
+
xl: "20px"
|
|
105
|
+
2xl: "24px"
|
|
106
|
+
components:
|
|
107
|
+
button-primary:
|
|
108
|
+
backgroundColor: "{colors.action-primary}"
|
|
109
|
+
textColor: "{colors.action-primary-foreground}"
|
|
110
|
+
rounded: "{rounded.md}"
|
|
111
|
+
height: "32px"
|
|
112
|
+
padding: "0 14px"
|
|
113
|
+
typography: "{typography.body}"
|
|
114
|
+
button-primary-hover:
|
|
115
|
+
backgroundColor: "{colors.action-primary-hover}"
|
|
116
|
+
textColor: "{colors.action-primary-foreground}"
|
|
117
|
+
button-outline:
|
|
118
|
+
backgroundColor: "transparent"
|
|
119
|
+
textColor: "{colors.foreground}"
|
|
120
|
+
rounded: "{rounded.md}"
|
|
121
|
+
height: "32px"
|
|
122
|
+
padding: "0 14px"
|
|
123
|
+
button-ghost:
|
|
124
|
+
backgroundColor: "transparent"
|
|
125
|
+
textColor: "{colors.foreground}"
|
|
126
|
+
rounded: "{rounded.md}"
|
|
127
|
+
height: "32px"
|
|
128
|
+
padding: "0 14px"
|
|
129
|
+
input:
|
|
130
|
+
backgroundColor: "{colors.elevated}"
|
|
131
|
+
textColor: "{colors.foreground}"
|
|
132
|
+
rounded: "{rounded.md}"
|
|
133
|
+
height: "32px"
|
|
134
|
+
padding: "0 12px"
|
|
135
|
+
typography: "{typography.label}"
|
|
136
|
+
input-lg:
|
|
137
|
+
backgroundColor: "{colors.elevated}"
|
|
138
|
+
textColor: "{colors.foreground}"
|
|
139
|
+
rounded: "{rounded.md}"
|
|
140
|
+
height: "44px"
|
|
141
|
+
padding: "0 12px"
|
|
142
|
+
typography: "{typography.body}"
|
|
143
|
+
card:
|
|
144
|
+
backgroundColor: "{colors.card}"
|
|
145
|
+
textColor: "{colors.card-foreground}"
|
|
146
|
+
rounded: "{rounded.xl}"
|
|
147
|
+
padding: "20px"
|
|
148
|
+
chip-solid:
|
|
149
|
+
backgroundColor: "{colors.background}"
|
|
150
|
+
textColor: "{colors.muted-foreground}"
|
|
151
|
+
rounded: "{rounded.sm}"
|
|
152
|
+
height: "24px"
|
|
153
|
+
padding: "0 8px"
|
|
154
|
+
typography: "{typography.label}"
|
|
155
|
+
sidebar-item:
|
|
156
|
+
backgroundColor: "transparent"
|
|
157
|
+
textColor: "{colors.foreground}"
|
|
158
|
+
rounded: "{rounded.md}"
|
|
159
|
+
height: "36px"
|
|
160
|
+
padding: "0 12px"
|
|
161
|
+
typography: "{typography.body}"
|
|
162
|
+
sidebar-item-active:
|
|
163
|
+
backgroundColor: "{colors.card}"
|
|
164
|
+
textColor: "{colors.foreground}"
|
|
165
|
+
panel:
|
|
166
|
+
backgroundColor: "{colors.card}"
|
|
167
|
+
textColor: "{colors.card-foreground}"
|
|
168
|
+
rounded: "{rounded.lg}"
|
|
169
|
+
padding: "16px"
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
# Design System: Actioneer Design System
|
|
173
|
+
|
|
174
|
+
<!-- Generated by `npm run design` from ads-manifest.json + src/styles/theme.css + TASTE.md. Do not edit by hand: edit the token, the principle, or TASTE.md and regenerate. -->
|
|
175
|
+
|
|
176
|
+
## Overview
|
|
177
|
+
|
|
178
|
+
**Creative North Star: "Colour and motion are spent like money"**
|
|
179
|
+
|
|
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
|
+
|
|
182
|
+
ADS 1.0.0 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
|
+
|
|
184
|
+
The ground is warm grey and the ink is warm near-black. One hue is spent by default, the Studio green 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 green and runs every action on ink.
|
|
185
|
+
|
|
186
|
+
**Key characteristics:**
|
|
187
|
+
- Warm-grey canvas, white sheet, quiet tiles. Every surface belongs to exactly one plane
|
|
188
|
+
- One typeface at two real weights on a 5-step ladder (24px / 18px / 16px / 14px / 12px), with mono reserved for literal code
|
|
189
|
+
- Fills and elevation separate surfaces roughly 75/25 against strokes
|
|
190
|
+
- Every surface defaults to `shadow-0`; elevation means "you can act on this"
|
|
191
|
+
- Radius runs 2px / 4px / 6px / 8px / 8px, with a pill reserved for chips and avatars
|
|
192
|
+
|
|
193
|
+
## Colors
|
|
194
|
+
|
|
195
|
+
A warm neutral ground with one CTA hue and four semantic signals. Every value below is the resolved token from `src/styles/theme.css`.
|
|
196
|
+
|
|
197
|
+
### Primary
|
|
198
|
+
|
|
199
|
+
The one place a hue is spent by default: the Studio green CTA family.
|
|
200
|
+
|
|
201
|
+
**Primary CTA role — restrained Studio green, used sparingly.**
|
|
202
|
+
|
|
203
|
+
- **action-primary** (`--color-action-primary`, #398457) `bg-action-primary`
|
|
204
|
+
- **action-primary-hover** (`--color-action-primary-hover`, #2b7348) `bg-action-primary-hover`
|
|
205
|
+
- **action-primary-text** (`--color-action-primary-text`, #1f623b) `text-action-primary-text`
|
|
206
|
+
- **action-primary-soft** (`--color-action-primary-soft`, #e2efe5) `bg-action-primary-soft`
|
|
207
|
+
- **action-primary-foreground** (`--color-action-primary-foreground`, #ffffff) `text-action-primary-foreground`
|
|
208
|
+
- **field-focus** (`--color-field-focus`, #5c9c73) `bg-field-focus`
|
|
209
|
+
|
|
210
|
+
### Secondary
|
|
211
|
+
|
|
212
|
+
The neutral-ink action role kept as a compatibility API.
|
|
213
|
+
|
|
214
|
+
**Compatibility action role — neutral ink, never a colored primary hue.**
|
|
215
|
+
|
|
216
|
+
- **brand** (`--color-brand`, #20201e) `bg-brand`
|
|
217
|
+
- **brand-hover** (`--color-brand-hover`, #4b4b47) `bg-brand-hover`
|
|
218
|
+
- **brand-text** (`--color-brand-text`, #20201e) `text-brand-text`
|
|
219
|
+
- **brand-foreground** (`--color-brand-foreground`, #ffffff) `text-brand-foreground`
|
|
220
|
+
|
|
221
|
+
### Tertiary
|
|
222
|
+
|
|
223
|
+
Semantic status. These four carry meaning and are never identity.
|
|
224
|
+
|
|
225
|
+
**Lichen success-700 clears AA on White and both success soft fills; success-600 is reserved for non-text marks because its 3.73:1 contrast on White does not clear body-text AA.**
|
|
226
|
+
|
|
227
|
+
- **success** (`--color-success`, #516923) `bg-success`
|
|
228
|
+
- **success-foreground** (`--color-success-foreground`, #ffffff) `text-success-foreground`
|
|
229
|
+
|
|
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
|
+
|
|
232
|
+
- **warning** (`--color-warning`, #f79009) `bg-warning`
|
|
233
|
+
- **warning-foreground** (`--color-warning-foreground`, #20201e) `text-warning-foreground`
|
|
234
|
+
|
|
235
|
+
**Danger and info: solid semantic fills carrying white foregrounds.**
|
|
236
|
+
|
|
237
|
+
- **danger** (`--color-danger`, #d92d20) `bg-danger`
|
|
238
|
+
- **danger-foreground** (`--color-danger-foreground`, #ffffff) `text-danger-foreground`
|
|
239
|
+
- **info** (`--color-info`, #1570ef) `bg-info`
|
|
240
|
+
- **info-foreground** (`--color-info-foreground`, #ffffff) `text-info-foreground`
|
|
241
|
+
|
|
242
|
+
### Neutral
|
|
243
|
+
|
|
244
|
+
The warm-grey ground everything else stands on.
|
|
245
|
+
|
|
246
|
+
**The shell canvas and its ink: the ground between top-level panels.**
|
|
247
|
+
|
|
248
|
+
- **background** (`--color-background`, #f1f1ef) `bg-background`
|
|
249
|
+
- **foreground** (`--color-foreground`, #20201e) `text-foreground`
|
|
250
|
+
|
|
251
|
+
**One continuous recess inside a white surface, never a screen-level ground.**
|
|
252
|
+
|
|
253
|
+
- **surface** (`--color-surface`, #ececea) `bg-surface`
|
|
254
|
+
- **surface-foreground** (`--color-surface-foreground`, #20201e) `text-surface-foreground`
|
|
255
|
+
- **elevated** (`--color-elevated`, #ffffff) `bg-elevated`
|
|
256
|
+
|
|
257
|
+
**The white working plane that sits on the canvas, and the specimen hairline.**
|
|
258
|
+
|
|
259
|
+
- **card** (`--color-card`, #ffffff) `bg-card`
|
|
260
|
+
- **card-foreground** (`--color-card-foreground`, #20201e) `text-card-foreground`
|
|
261
|
+
|
|
262
|
+
**The hover and row-state wash: interaction, not a default item background.**
|
|
263
|
+
|
|
264
|
+
- **muted** (`--color-muted`, #e5e5e2) `bg-muted`
|
|
265
|
+
- **muted-foreground** (`--color-muted-foreground`, #4b4b47) `text-muted-foreground`
|
|
266
|
+
|
|
267
|
+
**Quiet fill — avatars, chips, and disabled controls.**
|
|
268
|
+
|
|
269
|
+
- **fill** (`--color-fill`, #ececea) `bg-fill`
|
|
270
|
+
- **fill-foreground** (`--color-fill-foreground`, #20201e) `text-fill-foreground`
|
|
271
|
+
|
|
272
|
+
**The active and selected wash, one step above hover.**
|
|
273
|
+
|
|
274
|
+
- **accent** (`--color-accent`, #dcdcd8) `bg-accent`
|
|
275
|
+
- **accent-foreground** (`--color-accent-foreground`, #20201e) `text-accent-foreground`
|
|
276
|
+
|
|
277
|
+
**Contextual text hierarchies — three accessible levels per surface.**
|
|
278
|
+
|
|
279
|
+
- **on-white-primary** (`--color-on-white-primary`, #20201e) `bg-on-white-primary`
|
|
280
|
+
- **on-white-secondary** (`--color-on-white-secondary`, #4b4b47) `bg-on-white-secondary`
|
|
281
|
+
- **on-white-tertiary** (`--color-on-white-tertiary`, #777771) `bg-on-white-tertiary`
|
|
282
|
+
- **on-warm-grey-primary** (`--color-on-warm-grey-primary`, #20201e) `bg-on-warm-grey-primary`
|
|
283
|
+
- **on-warm-grey-secondary** (`--color-on-warm-grey-secondary`, #4b4b47) `bg-on-warm-grey-secondary`
|
|
284
|
+
- **on-warm-grey-tertiary** (`--color-on-warm-grey-tertiary`, #777771) `bg-on-warm-grey-tertiary`
|
|
285
|
+
|
|
286
|
+
**Context-free compatibility aliases remain conservative.**
|
|
287
|
+
|
|
288
|
+
- **primary** (`--color-primary`, #20201e) `bg-primary`
|
|
289
|
+
- **secondary** (`--color-secondary`, #4b4b47) `bg-secondary`
|
|
290
|
+
- **tertiary** (`--color-tertiary`, color-mix(in srgb, var(--color-wg10) 80%, var(--color-wg11))) `bg-tertiary`
|
|
291
|
+
|
|
292
|
+
**The neutral stroke ladder: every 1px UI border stays within WG3 to WG5.**
|
|
293
|
+
|
|
294
|
+
- **border** (`--color-border`, #e5e5e2) `bg-border`
|
|
295
|
+
- **border-primary** (`--color-border-primary`, #dcdcd8) `bg-border-primary`
|
|
296
|
+
- **border-secondary** (`--color-border-secondary`, #e5e5e2) `bg-border-secondary`
|
|
297
|
+
- **border-tertiary** (`--color-border-tertiary`, #ececea) `bg-border-tertiary`
|
|
298
|
+
- **border-strong** (`--color-border-strong`, #dcdcd8) `bg-border-strong`
|
|
299
|
+
- **input** (`--color-input`, #e5e5e2) `bg-input`
|
|
300
|
+
- **menu-stroke** (`--color-menu-stroke`, #e5e5e2) `bg-menu-stroke`
|
|
301
|
+
- **toast-stroke** (`--color-toast-stroke`, #e5e5e2) `bg-toast-stroke`
|
|
302
|
+
- **tree-stroke** (`--color-tree-stroke`, #e5e5e2) `bg-tree-stroke`
|
|
303
|
+
|
|
304
|
+
**The white working plane that sits on the canvas, and the specimen hairline.**
|
|
305
|
+
|
|
306
|
+
- **specimen-stroke** (`--color-specimen-stroke`, #ececea) `bg-specimen-stroke`
|
|
307
|
+
|
|
308
|
+
**Table surfaces: the white tray, its hairlines, and header ink.**
|
|
309
|
+
|
|
310
|
+
- **table-shell** (`--color-table-shell`, #ffffff) `bg-table-shell`
|
|
311
|
+
- **table-stroke** (`--color-table-stroke`, #ececea) `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`
|
|
313
|
+
|
|
314
|
+
**The artifact sheet: white warmed by a trace of the brand mark.**
|
|
315
|
+
|
|
316
|
+
- **artifact-canvas** (`--color-artifact-canvas`, color-mix(in srgb, var(--color-brand-mark) 7%, var(--color-white))) `bg-artifact-canvas`
|
|
317
|
+
|
|
318
|
+
**Focus ring and scrim, both translucent warm ink.**
|
|
319
|
+
|
|
320
|
+
- **ring** (`--color-ring`, color-mix(in srgb, var(--color-wg12) 50%, transparent)) `ring-ring`
|
|
321
|
+
- **overlay** (`--color-overlay`, color-mix(in srgb, var(--color-wg12) 50%, transparent)) `bg-overlay`
|
|
322
|
+
|
|
323
|
+
### Named rules
|
|
324
|
+
|
|
325
|
+
**The Fills Over Strokes Rule.** Delineate SURFACES (cards, panels, sidebars, page regions) with color contrast, elevation, and spacing — not borders. Keep no more than two persistent neutral layers in one composition: panels establish hierarchy; embedded items express state. Aim for ~75% shadow/fill, 25% strokes: form controls and floating menus keep a subtle border so they read as interactive; surfaces do not.
|
|
326
|
+
|
|
327
|
+
## Typography
|
|
328
|
+
|
|
329
|
+
**Display font:** Aribau Grotesk
|
|
330
|
+
**Body font:** Aribau Grotesk
|
|
331
|
+
**Mono font:** JetBrains Mono Variable
|
|
332
|
+
|
|
333
|
+
**Character:** one grotesk doing everything at two real weights. Hierarchy comes from size, ink strength and spacing. There is no second family and no heavy weight to reach for.
|
|
334
|
+
|
|
335
|
+
### Hierarchy
|
|
336
|
+
|
|
337
|
+
- **Display** (500, 24px / 32px): page-level moments only.
|
|
338
|
+
- **Title** (500, 18px / 24px): page titles.
|
|
339
|
+
- **Headline** (500, 16px / 22px): emphasized body and section headings.
|
|
340
|
+
- **Body** (400, 14px / 20px): the default, all reading text and control labels.
|
|
341
|
+
- **Label** (400, 12px / 16px): the floor: captions, secondary text, table cells.
|
|
342
|
+
- **Mono** (400, 12px / 16px): literal source code, and nothing else.
|
|
343
|
+
|
|
344
|
+
### Named rules
|
|
345
|
+
|
|
346
|
+
**The One Face Rule.** One face (Aribau Grotesk), two real weights, a five-step ladder.
|
|
347
|
+
|
|
348
|
+
**The 12px Floor Rule.** Nothing renders below `--text-s` (12px). Density comes from spacing and layout, never from shrinking type.
|
|
349
|
+
|
|
350
|
+
## Layout
|
|
351
|
+
|
|
352
|
+
The shell owns the frame and screens own their content. ADS targets landscape tablet (1024), laptop (1440) and wide display (1920+); phone and portrait are out of scope. Components adapt to their container, not to the viewport, so the same component works in a 320px panel and a 1200px sheet.
|
|
353
|
+
|
|
354
|
+
### Named rules
|
|
355
|
+
|
|
356
|
+
**The Shell Owns the Frame Rule.** The demo shell applies the screen frame (inset on top/right/bottom, flush-left against the sidebar). Screens never add their own outer padding — a screen's root is flex h-full flex-col and fills the frame with Panel(s).
|
|
357
|
+
|
|
358
|
+
**The One Thing Per Screen 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.
|
|
359
|
+
|
|
360
|
+
**The Container, Not Viewport Rule.** ADS targets landscape tablet (1024) → laptop (1440) → wide display (1920+); phone/portrait is out of scope. Components adapt to their CONTAINER via container queries; shells and pages decide pane widths through width tokens. Design against under-utilization, not cramping.
|
|
361
|
+
|
|
362
|
+
## Elevation & Depth
|
|
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.
|
|
365
|
+
|
|
366
|
+
### Shadow vocabulary
|
|
367
|
+
|
|
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`
|
|
376
|
+
- **table-smudge-left** (`--shadow-table-smudge-left`): `8px 0 24px -14px rgb(32 32 32 / 0.05)`
|
|
377
|
+
- **table-smudge-right** (`--shadow-table-smudge-right`): `-8px 0 24px -14px rgb(32 32 32 / 0.05)`
|
|
378
|
+
|
|
379
|
+
### Named rules
|
|
380
|
+
|
|
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.
|
|
382
|
+
|
|
383
|
+
## Shapes
|
|
384
|
+
|
|
385
|
+
Soft geometry on a 5-step ladder: `xs` 2px, `sm` 4px, `md` 6px, `lg` 8px, `xl` 8px, plus a pill at `full` (9999px) for chips and avatars. Tailwind's larger aliases (`2xl`, `3xl`) collapse onto the top step, so a stray `rounded-3xl` cannot exceed it.
|
|
386
|
+
|
|
387
|
+
### Named rules
|
|
388
|
+
|
|
389
|
+
**The Square Status Dots Rule.** Indicator/status dots (Badge & Chip dot variants, ConnectionStatus, chart legend swatches, presence/pulse dots) are square — rounded-dot (2px), echoing the growth-mark's square cells — never round.
|
|
390
|
+
|
|
391
|
+
## Components
|
|
392
|
+
|
|
393
|
+
The catalog is the contract: 323 components, 10 hooks and 98 utilities behind one barrel (`@actioneer/ads`). Import exact, unaliased names. Native elements are for semantic structure only: `<div>`, `<form>`, `<main>`, `<section>`. Never recreate a visual control.
|
|
394
|
+
|
|
395
|
+
### Sourcing a component
|
|
396
|
+
|
|
397
|
+
The components documented below are specimens chosen to show how tokens land on real controls. They are not the inventory. Walk this ladder in order and stop at the first step that answers.
|
|
398
|
+
|
|
399
|
+
1. **Use the ADS export.** Import the exact, unaliased name from the barrel. Enumerate the catalog before deciding something is missing: the `ads` MCP server (`search_components`, `get_component`) and `ads-manifest.json` both list every export with its family and props.
|
|
400
|
+
2. **Compose ADS exports.** If the pattern is only layout or content arrangement, build it from components that already ship rather than adding a primitive.
|
|
401
|
+
3. **Fall back to shadcn/ui.** When the barrel genuinely has no primitive, vendor one with `npx shadcn add` using the repo's `components.json` (style `new-york`, Radix base, `cssVariables: true`). It lands in `src/components/ui`, imports `cn` from `@/lib/utils`, and its lucide icons are swapped for aliased `@/lib/icons` imports. The shadcn-compat aliases in `theme.css` already map shadcn's colour roles onto ADS tokens, so a vendored Sidebar or Popover inherits the palette instead of shadcn's greys — do not restyle it by hand.
|
|
402
|
+
4. **Promote it, only when asked.** Moving a vendored component into the public barrel is library work: it needs an explicit request, the right family, an exact exported name, and documentation.
|
|
403
|
+
|
|
404
|
+
Hand-rolling a visual control, or importing a UI library at a call site, is never a step on this ladder.
|
|
405
|
+
|
|
406
|
+
### Primary Button
|
|
407
|
+
|
|
408
|
+
- **Export:** `Button`
|
|
409
|
+
- **Character:** variant="solid". The one action a screen wants, in Studio green.
|
|
410
|
+
- **Background:** {colors.action-primary}
|
|
411
|
+
- **Text:** {colors.action-primary-foreground}
|
|
412
|
+
- **Radius:** {rounded.md}
|
|
413
|
+
- **Height:** 32px
|
|
414
|
+
- **Padding:** 0 14px
|
|
415
|
+
- **Type:** {typography.body}
|
|
416
|
+
|
|
417
|
+
### Primary Button (hover)
|
|
418
|
+
|
|
419
|
+
- **Export:** `Button`
|
|
420
|
+
- **Character:** Hover and active share one deeper green. No separate active shade.
|
|
421
|
+
- **Background:** {colors.action-primary-hover}
|
|
422
|
+
- **Text:** {colors.action-primary-foreground}
|
|
423
|
+
|
|
424
|
+
### Outline Button
|
|
425
|
+
|
|
426
|
+
- **Export:** `Button`
|
|
427
|
+
- **Character:** variant="outline". A hairline at rest; hover borrows the green tint rather than filling.
|
|
428
|
+
- **Background:** transparent
|
|
429
|
+
- **Text:** {colors.foreground}
|
|
430
|
+
- **Radius:** {rounded.md}
|
|
431
|
+
- **Height:** 32px
|
|
432
|
+
- **Padding:** 0 14px
|
|
433
|
+
|
|
434
|
+
### Ghost Button
|
|
435
|
+
|
|
436
|
+
- **Export:** `Button`
|
|
437
|
+
- **Character:** variant="ghost". No chrome until a pointer arrives, then the soft green wash.
|
|
438
|
+
- **Background:** transparent
|
|
439
|
+
- **Text:** {colors.foreground}
|
|
440
|
+
- **Radius:** {rounded.md}
|
|
441
|
+
- **Height:** 32px
|
|
442
|
+
- **Padding:** 0 14px
|
|
443
|
+
|
|
444
|
+
### Text Input
|
|
445
|
+
|
|
446
|
+
- **Export:** `Input`
|
|
447
|
+
- **Character:** size="md". Elevated fill, one subtle stroke so it reads as interactive, recessed inner glow.
|
|
448
|
+
- **Background:** {colors.elevated}
|
|
449
|
+
- **Text:** {colors.foreground}
|
|
450
|
+
- **Radius:** {rounded.md}
|
|
451
|
+
- **Height:** 32px
|
|
452
|
+
- **Padding:** 0 12px
|
|
453
|
+
- **Type:** {typography.label}
|
|
454
|
+
|
|
455
|
+
### Text Input (lg)
|
|
456
|
+
|
|
457
|
+
- **Export:** `Input`
|
|
458
|
+
- **Character:** size="lg". The 44px register for standalone forms.
|
|
459
|
+
- **Background:** {colors.elevated}
|
|
460
|
+
- **Text:** {colors.foreground}
|
|
461
|
+
- **Radius:** {rounded.md}
|
|
462
|
+
- **Height:** 44px
|
|
463
|
+
- **Padding:** 0 12px
|
|
464
|
+
- **Type:** {typography.body}
|
|
465
|
+
|
|
466
|
+
### Card
|
|
467
|
+
|
|
468
|
+
- **Export:** `Card`
|
|
469
|
+
- **Character:** A working plane on the warm-grey ground. No border, radius at the 12px step.
|
|
470
|
+
- **Background:** {colors.card}
|
|
471
|
+
- **Text:** {colors.card-foreground}
|
|
472
|
+
- **Radius:** {rounded.xl}
|
|
473
|
+
- **Padding:** 20px
|
|
474
|
+
|
|
475
|
+
### Chip
|
|
476
|
+
|
|
477
|
+
- **Export:** `Chip`
|
|
478
|
+
- **Character:** The quiet register. Colour variants swap the fill through the semantic ramp and are the only routine colour outside charts.
|
|
479
|
+
- **Background:** {colors.background}
|
|
480
|
+
- **Text:** {colors.muted-foreground}
|
|
481
|
+
- **Radius:** {rounded.sm}
|
|
482
|
+
- **Height:** 24px
|
|
483
|
+
- **Padding:** 0 8px
|
|
484
|
+
- **Type:** {typography.label}
|
|
485
|
+
|
|
486
|
+
### Sidebar Item
|
|
487
|
+
|
|
488
|
+
- **Export:** `SidebarItem`
|
|
489
|
+
- **Character:** The rail's navigation row. Active takes the white card fill and a WG4 edge, and its icon switches to the filled weight.
|
|
490
|
+
- **Background:** transparent
|
|
491
|
+
- **Text:** {colors.foreground}
|
|
492
|
+
- **Radius:** {rounded.md}
|
|
493
|
+
- **Height:** 36px
|
|
494
|
+
- **Padding:** 0 12px
|
|
495
|
+
- **Type:** {typography.body}
|
|
496
|
+
|
|
497
|
+
### Sidebar Item (active)
|
|
498
|
+
|
|
499
|
+
- **Export:** `SidebarItem`
|
|
500
|
+
- **Character:** isActive. The row lifts onto the white plane; the icon renders at weight="fill".
|
|
501
|
+
- **Background:** {colors.card}
|
|
502
|
+
- **Text:** {colors.foreground}
|
|
503
|
+
|
|
504
|
+
### Panel
|
|
505
|
+
|
|
506
|
+
- **Export:** `Panel`
|
|
507
|
+
- **Character:** The editor plane: header with title and toolbar, scrolling body, footer on a translucent recess.
|
|
508
|
+
- **Background:** {colors.card}
|
|
509
|
+
- **Text:** {colors.card-foreground}
|
|
510
|
+
- **Radius:** {rounded.lg}
|
|
511
|
+
- **Padding:** 16px
|
|
512
|
+
|
|
513
|
+
### Named rules
|
|
514
|
+
|
|
515
|
+
**The Motion Follows the Interaction Rule.** Component motion follows the closest Animate UI interaction pattern, using role-specific presets defined in src/lib/motion.ts and exported from the ADS root barrel. Direct manipulation stays immediate, small CSS feedback stays local, and reduced motion is respected everywhere. Enforced by `npm run lint:ads`.
|
|
516
|
+
|
|
517
|
+
**The One Icon Language Rule.** All icons come from Phosphor Icons at the regular weight — the stroke-led icon language of ADS. Components import named icons from the @/lib/icons registry — never from an icon package directly — so swapping the underlying set touches one file. Enforced by `npm run lint:ads`.
|
|
518
|
+
|
|
519
|
+
**The ADS First Rule.** Every UI decision stays synchronized with ADS. Search the full catalog before deciding a component is missing, and use the exact exported name from the public barrel. When the barrel genuinely has no primitive, the sanctioned fallback is a shadcn/ui component vendored into src/components/ui through the repo's components.json recipe — never a hand-rolled control and never a UI library imported at a call site. Enforced by `npm run lint:ads`.
|
|
520
|
+
|
|
521
|
+
**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
|
+
|
|
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.
|
|
524
|
+
|
|
525
|
+
## Do's and Don'ts
|
|
526
|
+
|
|
527
|
+
Every line below is a `do` or `dont` recorded on a principle in `ads-manifest.json`.
|
|
528
|
+
|
|
529
|
+
### Do:
|
|
530
|
+
|
|
531
|
+
- **Do** establish hierarchy with at most two persistent layers: bg-background for the screen ground and bg-card/bg-elevated for the primary surface. *(fills-over-strokes)*
|
|
532
|
+
- **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
|
+
- **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
|
+
- **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)*
|
|
538
|
+
- **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
|
+
- **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
|
+
- **Do** keep sliders, drag-resize, scrolling, and other pointer-following interactions immediate; motion begins after the committed value or destination changes. *(motion-follows-guide)*
|
|
541
|
+
- **Do** give pressable elements local active feedback (text/link exempt); start entrances ≥ scale 0.95 with opacity. *(motion-follows-guide)*
|
|
542
|
+
- **Do** wrap Motion components in MotionConfig reducedMotion='user'; keep useful opacity/color feedback and drop spatial movement. *(motion-follows-guide)*
|
|
543
|
+
- **Do** import icons from the @/lib/icons registry; wrap a new Phosphor component with createIcon there before using it. *(icons-phosphor-regular)*
|
|
544
|
+
- **Do** let icons default to size='1em' so they scale with text; size with a size prop or size-* class. *(icons-phosphor-regular)*
|
|
545
|
+
- **Do** render weight='fill' for the active or selected state, and weight='bold' for the rare heavier stroke. *(icons-phosphor-regular)*
|
|
546
|
+
- **Do** make a screen root flex h-full flex-col and fill the frame with Panel(s). *(shell-owns-the-frame)*
|
|
547
|
+
- **Do** let one place (the shell) own the inset so every screen aligns to the rail. *(shell-owns-the-frame)*
|
|
548
|
+
- **Do** use rounded-dot for every indicator/status dot. *(square-status-dots)*
|
|
549
|
+
- **Do** use an existing ADS component by its exact exported name from the package barrel; compose existing components for layout-only patterns. *(ads-first)*
|
|
550
|
+
- **Do** search the whole catalog before concluding a component is missing — the documented specimens are a sample, not the inventory. *(ads-first)*
|
|
551
|
+
- **Do** fall back to shadcn/ui when the barrel has no primitive: vendor it with npx shadcn add into src/components/ui, import cn from @/lib/utils, and swap its lucide icons for @/lib/icons. *(ads-first)*
|
|
552
|
+
- **Do** let a vendored shadcn component inherit the ADS palette through the shadcn-compat aliases in theme.css rather than restyling it by hand. *(ads-first)*
|
|
553
|
+
- **Do** ask the user before promoting a vendored component into the public barrel; only an explicit request authorizes new library work. *(ads-first)*
|
|
554
|
+
- **Do** when authorized, add the component to the right family, export its exact name through the barrel, and document it. *(ads-first)*
|
|
555
|
+
- **Do** prefer more, smaller steps over dense ones; ask one thing at a time. *(minimal-information)*
|
|
556
|
+
- **Do** derive instead of asking whenever possible (a name from a work email, the company from its domain). *(minimal-information)*
|
|
557
|
+
- **Do** prefer clear text-only buttons; add an icon only when it communicates essential meaning the label cannot carry alone, or for a compact conventional icon-only control. *(minimal-information)*
|
|
558
|
+
- **Do** render multi-step flows full-screen — a single content container that holds the inputs and its own Back/Continue is fine. *(minimal-information)*
|
|
559
|
+
- **Do** use @container on the pane and @lg:/@xl: variants on children inside components. *(responsive-container-fluid)*
|
|
560
|
+
- **Do** set pane widths in shells/pages through width tokens (thread-max-width, sidebar-width, aside-width, connector-card-min/-max). *(responsive-container-fluid)*
|
|
561
|
+
- **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
|
+
- **Do** use PageHeader with onBack so the left arrow is anchored directly before the title. *(leading-back-navigation)*
|
|
563
|
+
- **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)*
|
|
565
|
+
- **Do** on constrained containers, stack tabs first and search second while preserving their relationship. *(tabs-search-opposed)*
|
|
566
|
+
|
|
567
|
+
### Don't:
|
|
568
|
+
|
|
569
|
+
- **Don't** add a border to a surface to separate or group it — use fill/elevation/spacing instead. *(fills-over-strokes)*
|
|
570
|
+
- **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
|
+
- **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)*
|
|
576
|
+
- **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
|
+
- **Don't** override or duplicate the motion already shipped inside an imported ADS component. *(motion-follows-guide)*
|
|
578
|
+
- **Don't** animate keyboard-initiated or 100×/day actions (e.g. a command-palette toggle). *(motion-follows-guide)*
|
|
579
|
+
- **Don't** add motion to a component only because it is visible; static structure and decorative chrome stay still. *(motion-follows-guide)*
|
|
580
|
+
- **Don't** import from an icon package directly, or install a second icon set. *(icons-phosphor-regular)*
|
|
581
|
+
- **Don't** leave an active nav item's icon at the regular stroke weight. *(icons-phosphor-regular)*
|
|
582
|
+
- **Don't** add outer padding on a screen, leaving a tinted-canvas gap on the left. *(shell-owns-the-frame)*
|
|
583
|
+
- **Don't** use rounded-full on an indicator dot (the one exception is a Radio control's inner dot). *(square-status-dots)*
|
|
584
|
+
- **Don't** deep-import, alias, default/namespace-import, or hand-roll a local copy of a component. *(ads-first)*
|
|
585
|
+
- **Don't** import a visual component directly from the web or an npm UI library at a call site. *(ads-first)*
|
|
586
|
+
- **Don't** reach for the shadcn fallback before searching the catalog, or install a second component library beside it. *(ads-first)*
|
|
587
|
+
- **Don't** add section eyebrows above a title that already names the screen, or helper text that restates the obvious / duplicates a disabled button's meaning. *(minimal-information)*
|
|
588
|
+
- **Don't** add any header description unless the user explicitly requested supporting copy for that page, section, panel, modal, dialog, drawer, or popover. *(minimal-information)*
|
|
589
|
+
- **Don't** decorate a labeled button with a redundant leading or trailing icon. *(minimal-information)*
|
|
590
|
+
- **Don't** nest panel/step-rail chrome inside a multi-step flow. *(minimal-information)*
|
|
591
|
+
- **Don't** use sm:/md: viewport variants inside src/components, or hardcode a pane width there. *(responsive-container-fluid)*
|
|
592
|
+
- **Don't** cap a grid at a hard column count so it stops growing on wide displays. *(responsive-container-fluid)*
|
|
593
|
+
- **Don't** place Back on the right side of a page header. *(leading-back-navigation)*
|
|
594
|
+
- **Don't** render a redundant visible Back label when the standard left arrow and accessible label are sufficient. *(leading-back-navigation)*
|
|
595
|
+
- **Don't** stretch the tab track to fill the space between its labels and the search field. *(tabs-search-opposed)*
|
|
596
|
+
- **Don't** put a scoped search field on a separate row above its tabs when both controls fit side by side. *(tabs-search-opposed)*
|
|
597
|
+
- **Don't** place search before tabs in the reading or keyboard order. *(tabs-search-opposed)*
|
|
@@ -278,7 +278,7 @@ const $e = ({
|
|
|
278
278
|
O.title,
|
|
279
279
|
" —",
|
|
280
280
|
" ",
|
|
281
|
-
/* @__PURE__ */ t("span", { className: "tabular-nums text-
|
|
281
|
+
/* @__PURE__ */ t("span", { className: "tabular-nums text-muted-foreground", children: k(n) })
|
|
282
282
|
] }),
|
|
283
283
|
/* @__PURE__ */ t(re, { className: "text-base leading-6", children: O.detail })
|
|
284
284
|
] }),
|
package/components/alert.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Info as p, WarningCircle as C, Warning as I, CheckCircle as R, Close as
|
|
|
7
7
|
import { cn as d } from "../lib/cn.js";
|
|
8
8
|
import { springOverlay as z } from "../lib/motion.js";
|
|
9
9
|
const D = A(
|
|
10
|
-
"relative flex w-full items-start gap-4 overflow-hidden rounded-2xl border border-border bg-
|
|
10
|
+
"relative flex w-full items-start gap-4 overflow-hidden rounded-2xl border border-border bg-card p-4 shadow-[var(--shadow-200)]",
|
|
11
11
|
{
|
|
12
12
|
variants: {
|
|
13
13
|
variant: {
|
|
@@ -47,7 +47,7 @@ const D = A(
|
|
|
47
47
|
return o ? null : /* @__PURE__ */ e(E, { reducedMotion: "user", children: /* @__PURE__ */ e(
|
|
48
48
|
g.div,
|
|
49
49
|
{
|
|
50
|
-
initial: { opacity:
|
|
50
|
+
initial: { opacity: 1, x: 32 },
|
|
51
51
|
animate: i ? { opacity: 0, x: -32 } : { opacity: 1, x: 0 },
|
|
52
52
|
transition: i ? { duration: 0.18, ease: "easeIn" } : z,
|
|
53
53
|
onAnimationComplete: y,
|
|
@@ -76,7 +76,7 @@ const D = A(
|
|
|
76
76
|
children: /* @__PURE__ */ e(j, { "aria-hidden": !0 })
|
|
77
77
|
}
|
|
78
78
|
),
|
|
79
|
-
a > 0 && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "absolute inset-x-0 bottom-0 h-0.5 bg-
|
|
79
|
+
a > 0 && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "absolute inset-x-0 bottom-0 h-0.5 bg-wg3", children: /* @__PURE__ */ e(
|
|
80
80
|
g.span,
|
|
81
81
|
{
|
|
82
82
|
className: "block size-full origin-left bg-(--alert-accent)",
|
package/components/answer.js
CHANGED
|
@@ -531,7 +531,7 @@ function k({ signal: a }) {
|
|
|
531
531
|
T,
|
|
532
532
|
{
|
|
533
533
|
variant: J(a.tone),
|
|
534
|
-
className: "border border-
|
|
534
|
+
className: "border border-wg3 bg-card",
|
|
535
535
|
children: [
|
|
536
536
|
/* @__PURE__ */ t(O, { children: a.label ?? "Takeaway" }),
|
|
537
537
|
/* @__PURE__ */ t(L, { className: "text-base leading-6", children: a.text })
|
|
@@ -873,7 +873,7 @@ const re = p.forwardRef(({ spec: a, onFollowUp: l, onOptionSelect: c, onSourceSe
|
|
|
873
873
|
] }) }),
|
|
874
874
|
/* @__PURE__ */ t("tbody", { children: a.rows.map((r) => {
|
|
875
875
|
const i = r.values[0].detail === r.values[1].detail ? r.values[0].detail : void 0, s = r.description ?? i;
|
|
876
|
-
return /* @__PURE__ */ n("tr", { className: "[&>*]:bg-
|
|
876
|
+
return /* @__PURE__ */ n("tr", { className: "[&>*]:bg-wg2", children: [
|
|
877
877
|
/* @__PURE__ */ n(
|
|
878
878
|
"th",
|
|
879
879
|
{
|
|
@@ -56,7 +56,7 @@ const z = ({ open: s, onOpenChange: i }) => {
|
|
|
56
56
|
side: "bottom",
|
|
57
57
|
align: "start",
|
|
58
58
|
sideOffset: 6,
|
|
59
|
-
className: "aui-action-bar-more-content bg-popover/95 text-popover-foreground data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1.5 shadow-
|
|
59
|
+
className: "aui-action-bar-more-content bg-popover/95 text-popover-foreground data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1.5 shadow-300 backdrop-blur-sm",
|
|
60
60
|
children: [
|
|
61
61
|
/* @__PURE__ */ t(
|
|
62
62
|
n.Item,
|