@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.
- package/LICENSE +21 -0
- package/bin/ads-init.mjs +314 -0
- package/components/accordion.d.ts +13 -0
- package/components/accordion.js +91 -0
- package/components/agents-ui/agent-audio-visualizer-aura.d.ts +11 -0
- package/components/agents-ui/agent-audio-visualizer-aura.js +277 -0
- package/components/agents-ui/agent-audio-visualizer-wave.d.ts +12 -0
- package/components/agents-ui/agent-audio-visualizer-wave.js +203 -0
- package/components/agents-ui/react-shader-toy.d.ts +87 -0
- package/components/agents-ui/react-shader-toy.js +531 -0
- package/components/ai-elements/chain-of-thought.d.ts +30 -0
- package/components/ai-elements/chain-of-thought.js +182 -0
- package/components/ai-elements/index.d.ts +11 -0
- package/components/ai-elements/inline-citation.d.ts +44 -0
- package/components/ai-elements/inline-citation.js +314 -0
- package/components/ai-elements/message.d.ts +96 -0
- package/components/ai-elements/message.js +308 -0
- package/components/ai-elements/queue.d.ts +60 -0
- package/components/ai-elements/queue.js +193 -0
- package/components/ai-elements/reasoning.d.ts +26 -0
- package/components/ai-elements/reasoning.js +131 -0
- package/components/ai-elements/shimmer.d.ts +25 -0
- package/components/ai-elements/shimmer.js +44 -0
- package/components/ai-elements/speech-input.d.ts +16 -0
- package/components/ai-elements/speech-input.js +151 -0
- package/components/ai-elements/task-progress.d.ts +41 -0
- package/components/ai-elements/task-progress.js +211 -0
- package/components/ai-elements/task.d.ts +35 -0
- package/components/ai-elements/task.js +73 -0
- package/components/ai-elements/tool.d.ts +53 -0
- package/components/ai-elements/tool.js +116 -0
- package/components/ai-elements/voice.d.ts +74 -0
- package/components/ai-elements/voice.js +875 -0
- package/components/alert.d.ts +21 -0
- package/components/alert.js +76 -0
- package/components/answer.d.ts +984 -0
- package/components/answer.js +543 -0
- package/components/assistant-ui/action-bar.d.ts +3 -0
- package/components/assistant-ui/action-bar.js +57 -0
- package/components/assistant-ui/answer-tool-ui.d.ts +5 -0
- package/components/assistant-ui/answer-tool-ui.js +42 -0
- package/components/assistant-ui/attachment.d.ts +50 -0
- package/components/assistant-ui/attachment.js +353 -0
- package/components/assistant-ui/badge.d.ts +11 -0
- package/components/assistant-ui/badge.js +54 -0
- package/components/assistant-ui/branch-picker.d.ts +3 -0
- package/components/assistant-ui/branch-picker.js +36 -0
- package/components/assistant-ui/chain-of-thought.d.ts +46 -0
- package/components/assistant-ui/composer-add-context.d.ts +50 -0
- package/components/assistant-ui/composer-add-context.js +209 -0
- package/components/assistant-ui/composer-deep-research.d.ts +16 -0
- package/components/assistant-ui/composer-deep-research.js +38 -0
- package/components/assistant-ui/composer-harness.d.ts +18 -0
- package/components/assistant-ui/composer-harness.js +186 -0
- package/components/assistant-ui/composer-trigger-popover.d.ts +47 -0
- package/components/assistant-ui/composer-trigger-popover.js +147 -0
- package/components/assistant-ui/composer.d.ts +8 -0
- package/components/assistant-ui/composer.js +276 -0
- package/components/assistant-ui/directive-text.d.ts +16 -0
- package/components/assistant-ui/directive-text.js +40 -0
- package/components/assistant-ui/error.d.ts +6 -0
- package/components/assistant-ui/error.js +39 -0
- package/components/assistant-ui/file.d.ts +37 -0
- package/components/assistant-ui/file.js +159 -0
- package/components/assistant-ui/follow-up-suggestions.d.ts +7 -0
- package/components/assistant-ui/follow-up-suggestions.js +44 -0
- package/components/assistant-ui/image.d.ts +46 -0
- package/components/assistant-ui/image.js +351 -0
- package/components/assistant-ui/index.d.ts +28 -0
- package/components/assistant-ui/markdown-text.d.ts +1 -0
- package/components/assistant-ui/markdown-text.js +242 -0
- package/components/assistant-ui/message-timing.d.ts +25 -0
- package/components/assistant-ui/message-timing.js +56 -0
- package/components/assistant-ui/message.d.ts +4 -0
- package/components/assistant-ui/message.js +159 -0
- package/components/assistant-ui/primitives.d.ts +2 -0
- package/components/assistant-ui/quote.d.ts +37 -0
- package/components/assistant-ui/quote.js +150 -0
- package/components/assistant-ui/reasoning.d.ts +44 -0
- package/components/assistant-ui/reasoning.js +261 -0
- package/components/assistant-ui/selection-toolbar.d.ts +29 -0
- package/components/assistant-ui/selection-toolbar.js +91 -0
- package/components/assistant-ui/smart-message-text.d.ts +15 -0
- package/components/assistant-ui/smart-message-text.js +29 -0
- package/components/assistant-ui/sources.d.ts +17 -0
- package/components/assistant-ui/sources.js +121 -0
- package/components/assistant-ui/suggestions.d.ts +7 -0
- package/components/assistant-ui/suggestions.js +19 -0
- package/components/assistant-ui/thread-context.d.ts +37 -0
- package/components/assistant-ui/thread-context.js +8 -0
- package/components/assistant-ui/thread.d.ts +5 -0
- package/components/assistant-ui/thread.js +77 -0
- package/components/assistant-ui/tool-fallback.d.ts +36 -0
- package/components/assistant-ui/tool-fallback.js +428 -0
- package/components/assistant-ui/tool-group.d.ts +33 -0
- package/components/assistant-ui/tool-group.js +173 -0
- package/components/assistant-ui/tooltip-icon-button.d.ts +7 -0
- package/components/assistant-ui/tooltip-icon-button.js +31 -0
- package/components/assistant-ui/voice.d.ts +18 -0
- package/components/autocomplete.d.ts +18 -0
- package/components/autocomplete.js +162 -0
- package/components/avatar.d.ts +26 -0
- package/components/avatar.js +92 -0
- package/components/badge.d.ts +10 -0
- package/components/badge.js +83 -0
- package/components/brand-loader.d.ts +16 -0
- package/components/brand-loader.js +64 -0
- package/components/breadcrumbs.d.ts +8 -0
- package/components/breadcrumbs.js +58 -0
- package/components/button.d.ts +13 -0
- package/components/button.js +100 -0
- package/components/card.d.ts +19 -0
- package/components/card.js +82 -0
- package/components/carousel.d.ts +31 -0
- package/components/carousel.js +351 -0
- package/components/chart.d.ts +165 -0
- package/components/chart.js +841 -0
- package/components/checkbox.d.ts +13 -0
- package/components/checkbox.js +84 -0
- package/components/chip.d.ts +13 -0
- package/components/chip.js +112 -0
- package/components/collapsible.d.ts +5 -0
- package/components/collapsible.js +31 -0
- package/components/connector-card.d.ts +62 -0
- package/components/connector-card.js +154 -0
- package/components/divider.d.ts +23 -0
- package/components/divider.js +69 -0
- package/components/drawer.d.ts +45 -0
- package/components/drawer.js +234 -0
- package/components/dropdown.d.ts +33 -0
- package/components/dropdown.js +198 -0
- package/components/empty-state.d.ts +8 -0
- package/components/empty-state.js +30 -0
- package/components/field.d.ts +20 -0
- package/components/field.js +74 -0
- package/components/index.d.ts +56 -0
- package/components/index.js +444 -0
- package/components/input-field.d.ts +22 -0
- package/components/input-field.js +91 -0
- package/components/input.d.ts +8 -0
- package/components/input.js +61 -0
- package/components/kbd.d.ts +6 -0
- package/components/kbd.js +26 -0
- package/components/link.d.ts +14 -0
- package/components/link.js +72 -0
- package/components/modal.d.ts +18 -0
- package/components/modal.js +156 -0
- package/components/navbar.d.ts +15 -0
- package/components/navbar.js +68 -0
- package/components/number-field.d.ts +11 -0
- package/components/number-field.js +89 -0
- package/components/pagination.d.ts +28 -0
- package/components/pagination.js +179 -0
- package/components/panel.d.ts +14 -0
- package/components/panel.js +71 -0
- package/components/pixel-blast-svg.d.ts +22 -0
- package/components/pixel-blast-svg.js +154 -0
- package/components/popover.d.ts +20 -0
- package/components/popover.js +101 -0
- package/components/progress-circle.d.ts +11 -0
- package/components/progress-circle.js +75 -0
- package/components/progress.d.ts +22 -0
- package/components/progress.js +66 -0
- package/components/radio.d.ts +16 -0
- package/components/radio.js +101 -0
- package/components/segmented.d.ts +16 -0
- package/components/segmented.js +103 -0
- package/components/select.d.ts +28 -0
- package/components/select.js +180 -0
- package/components/selection-action-bar.d.ts +11 -0
- package/components/selection-action-bar.js +59 -0
- package/components/sidebar.d.ts +118 -0
- package/components/sidebar.js +375 -0
- package/components/skeleton.d.ts +6 -0
- package/components/skeleton.js +26 -0
- package/components/slider.d.ts +11 -0
- package/components/slider.js +62 -0
- package/components/spinner.d.ts +11 -0
- package/components/spinner.js +62 -0
- package/components/switch.d.ts +7 -0
- package/components/switch.js +61 -0
- package/components/table.d.ts +59 -0
- package/components/table.js +254 -0
- package/components/tabs.d.ts +29 -0
- package/components/tabs.js +371 -0
- package/components/textarea.d.ts +5 -0
- package/components/textarea.js +24 -0
- package/components/timeline.d.ts +7 -0
- package/components/timeline.js +47 -0
- package/components/toast.d.ts +74 -0
- package/components/toast.js +211 -0
- package/components/tooltip.d.ts +11 -0
- package/components/tooltip.js +143 -0
- package/components/tree.d.ts +42 -0
- package/components/tree.js +86 -0
- package/components/typography.d.ts +33 -0
- package/components/typography.js +65 -0
- package/components/ui/avatar.d.ts +11 -0
- package/components/ui/avatar.js +56 -0
- package/components/ui/button.d.ts +10 -0
- package/components/ui/button.js +57 -0
- package/components/ui/collapsible.d.ts +5 -0
- package/components/ui/collapsible.js +35 -0
- package/components/ui/dialog.d.ts +17 -0
- package/components/ui/dialog.js +93 -0
- package/components/ui/tabs.d.ts +22 -0
- package/components/ui/tooltip.d.ts +7 -0
- package/components/ui/tooltip.js +56 -0
- package/fonts/aribau-grotesk-400.otf +0 -0
- package/fonts/aribau-grotesk-700.otf +0 -0
- package/fonts.css +21 -0
- package/hooks/agents-ui/use-agent-audio-visualizer-aura.d.ts +8 -0
- package/hooks/agents-ui/use-agent-audio-visualizer-aura.js +62 -0
- package/hooks/agents-ui/use-agent-audio-visualizer-wave.d.ts +7 -0
- package/hooks/agents-ui/use-agent-audio-visualizer-wave.js +60 -0
- package/hooks/agents-ui/voice-visualizer-types.d.ts +9 -0
- package/lib/cn.d.ts +3 -0
- package/lib/cn.js +9 -0
- package/lib/icons.d.ts +378 -0
- package/lib/icons.js +119 -0
- package/lib/interactive.d.ts +24 -0
- package/lib/interactive.js +36 -0
- package/lib/motion.d.ts +58 -0
- package/lib/motion.js +70 -0
- package/lib/router.d.ts +3 -0
- package/lib/utils.d.ts +6 -0
- package/llms.txt +537 -0
- package/manifest.json +5085 -0
- package/package.json +60 -0
- package/styles.css +653 -0
- 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}";
|