@actioneer/ads 1.0.3 → 1.0.4
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 +15 -15
- package/components/avatar.js +23 -23
- package/components/date-range-picker.js +1 -1
- package/components/input-field.js +2 -2
- package/components/input.js +9 -9
- package/components/select.d.ts +1 -1
- package/components/select.js +1 -1
- package/llms.txt +6 -6
- package/manifest.json +9 -9
- package/package.json +1 -1
- package/styles.css +54 -39
- package/theme.css +48 -33
package/DESIGN.md
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
name: Actioneer Design System
|
|
3
3
|
description: ADS 1.0 — the React 19 + Tailwind v4 library every Actioneer product builds from
|
|
4
4
|
colors:
|
|
5
|
-
action-primary: "#
|
|
6
|
-
action-primary-hover: "#
|
|
7
|
-
action-primary-text: "#
|
|
8
|
-
action-primary-soft: "#
|
|
5
|
+
action-primary: "#1c8379"
|
|
6
|
+
action-primary-hover: "#017369"
|
|
7
|
+
action-primary-text: "#016159"
|
|
8
|
+
action-primary-soft: "#dfefec"
|
|
9
9
|
action-primary-foreground: "#ffffff"
|
|
10
|
-
field-focus: "#
|
|
10
|
+
field-focus: "#4c9b92"
|
|
11
11
|
brand: "#20201e"
|
|
12
12
|
brand-hover: "#4b4b47"
|
|
13
13
|
brand-text: "#20201e"
|
|
@@ -179,9 +179,9 @@ components:
|
|
|
179
179
|
|
|
180
180
|
TASTE.md puts it in one line: On a quiet, neutral ground, colour and motion are spent like money — rarely, deliberately, and only where the eye should go.
|
|
181
181
|
|
|
182
|
-
ADS 1.0.
|
|
182
|
+
ADS 1.0.4 is a library first and a look second. 323 components across 10 families (Primitives / utilities, Foundations, Form controls, Overlays, Data display, Feedback, Navigation, Layout, AI Elements, Chat) ship from one barrel, and every product that consumes them inherits the judgment encoded in 56 semantic tokens and 11 principles rather than re-deciding it per screen.
|
|
183
183
|
|
|
184
|
-
The ground is warm grey and the ink is warm near-black. One hue is spent by default, the Studio
|
|
184
|
+
The ground is warm grey and the ink is warm near-black. One hue is spent by default, the Studio teal CTA family, and four more carry semantic status. Everything else stays neutral. A consumer product may narrow that further, and one already does: Baby Sentinel drops the teal and runs every action on ink.
|
|
185
185
|
|
|
186
186
|
**Key characteristics:**
|
|
187
187
|
- Warm-grey canvas, white sheet, quiet tiles. Every surface belongs to exactly one plane
|
|
@@ -196,16 +196,16 @@ A warm neutral ground with one CTA hue and four semantic signals. Every value be
|
|
|
196
196
|
|
|
197
197
|
### Primary
|
|
198
198
|
|
|
199
|
-
The one place a hue is spent by default: the Studio
|
|
199
|
+
The one place a hue is spent by default: the Studio teal CTA family.
|
|
200
200
|
|
|
201
|
-
**Primary CTA role — restrained Studio
|
|
201
|
+
**Primary CTA role — restrained Studio teal, used sparingly.**
|
|
202
202
|
|
|
203
|
-
- **action-primary** (`--color-action-primary`, #
|
|
204
|
-
- **action-primary-hover** (`--color-action-primary-hover`, #
|
|
205
|
-
- **action-primary-text** (`--color-action-primary-text`, #
|
|
206
|
-
- **action-primary-soft** (`--color-action-primary-soft`, #
|
|
203
|
+
- **action-primary** (`--color-action-primary`, #1c8379) `bg-action-primary`
|
|
204
|
+
- **action-primary-hover** (`--color-action-primary-hover`, #017369) `bg-action-primary-hover`
|
|
205
|
+
- **action-primary-text** (`--color-action-primary-text`, #016159) `text-action-primary-text`
|
|
206
|
+
- **action-primary-soft** (`--color-action-primary-soft`, #dfefec) `bg-action-primary-soft`
|
|
207
207
|
- **action-primary-foreground** (`--color-action-primary-foreground`, #ffffff) `text-action-primary-foreground`
|
|
208
|
-
- **field-focus** (`--color-field-focus`, #
|
|
208
|
+
- **field-focus** (`--color-field-focus`, #4c9b92) `bg-field-focus`
|
|
209
209
|
|
|
210
210
|
### Secondary
|
|
211
211
|
|
|
@@ -406,7 +406,7 @@ Hand-rolling a visual control, or importing a UI library at a call site, is neve
|
|
|
406
406
|
### Primary Button
|
|
407
407
|
|
|
408
408
|
- **Export:** `Button`
|
|
409
|
-
- **Character:** variant="solid". The one action a screen wants, in Studio
|
|
409
|
+
- **Character:** variant="solid". The one action a screen wants, in Studio teal.
|
|
410
410
|
- **Background:** {colors.action-primary}
|
|
411
411
|
- **Text:** {colors.action-primary-foreground}
|
|
412
412
|
- **Radius:** {rounded.md}
|
package/components/avatar.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as n, jsxs as b } from "react/jsx-runtime";
|
|
3
3
|
import * as f from "react";
|
|
4
4
|
import { cn as s } from "../lib/cn.js";
|
|
5
|
-
const
|
|
5
|
+
const g = {
|
|
6
6
|
xs: "size-5 text-xs",
|
|
7
7
|
sm: "size-8 text-xs",
|
|
8
8
|
md: "size-10 text-xs",
|
|
@@ -12,46 +12,46 @@ const m = {
|
|
|
12
12
|
full: "rounded-full",
|
|
13
13
|
lg: "rounded-lg"
|
|
14
14
|
};
|
|
15
|
-
function v(
|
|
16
|
-
const e =
|
|
15
|
+
function v(r) {
|
|
16
|
+
const e = r.trim().split(/\s+/).filter(Boolean);
|
|
17
17
|
return e.length === 0 ? "" : e.length === 1 ? e[0].slice(0, 2).toUpperCase() : (e[0][0] + e[e.length - 1][0]).toUpperCase();
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
"bg-
|
|
21
|
-
"bg-
|
|
22
|
-
"bg-
|
|
23
|
-
"bg-
|
|
19
|
+
const m = [
|
|
20
|
+
"bg-t9 text-action-primary-foreground",
|
|
21
|
+
"bg-t10 text-action-primary-foreground",
|
|
22
|
+
"bg-t11 text-action-primary-foreground",
|
|
23
|
+
"bg-t4 text-t12"
|
|
24
24
|
];
|
|
25
|
-
function y(
|
|
26
|
-
const e = Array.from(
|
|
27
|
-
(
|
|
25
|
+
function y(r) {
|
|
26
|
+
const e = Array.from(r).reduce(
|
|
27
|
+
(t, i) => t + i.charCodeAt(0),
|
|
28
28
|
0
|
|
29
29
|
);
|
|
30
|
-
return
|
|
30
|
+
return m[e % m.length];
|
|
31
31
|
}
|
|
32
32
|
const N = f.forwardRef(
|
|
33
|
-
({ className:
|
|
34
|
-
const l =
|
|
33
|
+
({ className: r, src: e, name: t, size: i = "md", radius: o = "full", ...a }, d) => {
|
|
34
|
+
const l = t ? v(t) : "";
|
|
35
35
|
return /* @__PURE__ */ n(
|
|
36
36
|
"span",
|
|
37
37
|
{
|
|
38
38
|
ref: d,
|
|
39
39
|
role: "img",
|
|
40
|
-
"aria-label":
|
|
40
|
+
"aria-label": t,
|
|
41
41
|
className: s(
|
|
42
42
|
"relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden font-normal",
|
|
43
|
-
// Images sit on the neutral fill; initials use the ADS
|
|
44
|
-
e || !
|
|
45
|
-
|
|
43
|
+
// Images sit on the neutral fill; initials use the ADS teal ramp.
|
|
44
|
+
e || !t ? "bg-fill text-fill-foreground" : y(t),
|
|
45
|
+
g[i],
|
|
46
46
|
p[o],
|
|
47
|
-
|
|
47
|
+
r
|
|
48
48
|
),
|
|
49
49
|
...a,
|
|
50
50
|
children: e ? /* @__PURE__ */ n(
|
|
51
51
|
"img",
|
|
52
52
|
{
|
|
53
53
|
src: e,
|
|
54
|
-
alt:
|
|
54
|
+
alt: t ?? "",
|
|
55
55
|
className: "size-full object-cover"
|
|
56
56
|
}
|
|
57
57
|
) : /* @__PURE__ */ n("span", { "aria-hidden": !0, children: l })
|
|
@@ -61,13 +61,13 @@ const N = f.forwardRef(
|
|
|
61
61
|
);
|
|
62
62
|
N.displayName = "Avatar";
|
|
63
63
|
const A = f.forwardRef(
|
|
64
|
-
({ className:
|
|
64
|
+
({ className: r, max: e, size: t = "md", radius: i = "full", children: o, ...a }, d) => {
|
|
65
65
|
const l = f.Children.toArray(o), c = typeof e == "number" ? l.length - e : 0, h = typeof e == "number" ? l.slice(0, e) : l;
|
|
66
66
|
return /* @__PURE__ */ b(
|
|
67
67
|
"div",
|
|
68
68
|
{
|
|
69
69
|
ref: d,
|
|
70
|
-
className: s("flex items-center",
|
|
70
|
+
className: s("flex items-center", r),
|
|
71
71
|
...a,
|
|
72
72
|
children: [
|
|
73
73
|
h.map((x, u) => /* @__PURE__ */ n(
|
|
@@ -89,7 +89,7 @@ const A = f.forwardRef(
|
|
|
89
89
|
className: s(
|
|
90
90
|
"relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden font-normal",
|
|
91
91
|
"bg-muted text-muted-foreground",
|
|
92
|
-
|
|
92
|
+
g[t],
|
|
93
93
|
p[i]
|
|
94
94
|
),
|
|
95
95
|
children: /* @__PURE__ */ n("span", { "aria-hidden": !0, children: `+${c}` })
|
|
@@ -144,7 +144,7 @@ function se({
|
|
|
144
144
|
className: o(
|
|
145
145
|
"ml-auto inline-flex shrink-0 cursor-pointer items-center justify-center border border-transparent text-muted-foreground outline-none",
|
|
146
146
|
"transition-[background,color,transform] duration-150 ease-out",
|
|
147
|
-
"group-hover/field:text-foreground group-focus-within/field:text-
|
|
147
|
+
"group-hover/field:text-foreground group-focus-within/field:text-t12!",
|
|
148
148
|
"hover:bg-action-primary-soft hover:text-action-primary-text!",
|
|
149
149
|
"data-[pressed]:scale-[0.97] data-[pressed]:bg-action-primary-soft data-[pressed]:text-action-primary-text!",
|
|
150
150
|
"motion-reduce:data-[pressed]:scale-100",
|
|
@@ -85,9 +85,9 @@ const U = i.forwardRef(
|
|
|
85
85
|
), z = r || n ? (
|
|
86
86
|
// group/field: adornment icons follow the field's interactive states.
|
|
87
87
|
/* @__PURE__ */ C("div", { className: "group/field relative w-full", children: [
|
|
88
|
-
r && /* @__PURE__ */ t("span", { className: "pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-
|
|
88
|
+
r && /* @__PURE__ */ t("span", { className: "pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-t12! [&_svg]:size-4", children: r }),
|
|
89
89
|
k,
|
|
90
|
-
n && /* @__PURE__ */ t("span", { className: "absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-
|
|
90
|
+
n && /* @__PURE__ */ t("span", { className: "absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-t12! [&_svg]:size-4", children: n })
|
|
91
91
|
] })
|
|
92
92
|
) : k;
|
|
93
93
|
return !v && !d && !o && !m ? z : /* @__PURE__ */ t(
|
package/components/input.js
CHANGED
|
@@ -18,7 +18,7 @@ const N = {
|
|
|
18
18
|
type: s,
|
|
19
19
|
...c
|
|
20
20
|
}, m) => {
|
|
21
|
-
const [i, p] = l.useState(!1),
|
|
21
|
+
const [i, p] = l.useState(!1), t = s === "password", r = u ?? (t ? /* @__PURE__ */ e(
|
|
22
22
|
"button",
|
|
23
23
|
{
|
|
24
24
|
type: "button",
|
|
@@ -27,11 +27,11 @@ const N = {
|
|
|
27
27
|
className: "-mr-1 flex items-center rounded-xs p-1 outline-none transition-colors hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring",
|
|
28
28
|
children: i ? /* @__PURE__ */ e(x, {}) : /* @__PURE__ */ e(w, {})
|
|
29
29
|
}
|
|
30
|
-
) : void 0),
|
|
30
|
+
) : void 0), n = /* @__PURE__ */ e(
|
|
31
31
|
"input",
|
|
32
32
|
{
|
|
33
33
|
ref: m,
|
|
34
|
-
type:
|
|
34
|
+
type: t && i ? "text" : s,
|
|
35
35
|
"aria-invalid": f || void 0,
|
|
36
36
|
className: h(
|
|
37
37
|
b,
|
|
@@ -46,14 +46,14 @@ const N = {
|
|
|
46
46
|
...c
|
|
47
47
|
}
|
|
48
48
|
);
|
|
49
|
-
return !o && !r ?
|
|
49
|
+
return !o && !r ? n : (
|
|
50
50
|
// group/field: adornment icons follow the field's interactive states —
|
|
51
|
-
// muted at rest, readable on hover, and
|
|
52
|
-
// control is focused. Important keeps focus
|
|
51
|
+
// muted at rest, readable on hover, and T12 teal while the
|
|
52
|
+
// control is focused. Important keeps focus teal while still hovered.
|
|
53
53
|
/* @__PURE__ */ v("div", { className: "group/field relative w-full", children: [
|
|
54
|
-
o && /* @__PURE__ */ e("span", { className: "pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-
|
|
55
|
-
|
|
56
|
-
r && /* @__PURE__ */ e("span", { className: "absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-
|
|
54
|
+
o && /* @__PURE__ */ e("span", { className: "pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-t12! [&_svg]:size-4", children: o }),
|
|
55
|
+
n,
|
|
56
|
+
r && /* @__PURE__ */ e("span", { className: "absolute inset-y-0 right-0 flex items-center pr-3 text-muted-foreground transition-colors duration-150 group-hover/field:text-foreground group-focus-within/field:text-t12! [&_svg]:size-4", children: r })
|
|
57
57
|
] })
|
|
58
58
|
);
|
|
59
59
|
}
|
package/components/select.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export interface DropdownOptionsProps {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* DropdownOptions — the reusable options surface composed by Select.
|
|
27
|
-
* It owns listbox semantics and the brand-
|
|
27
|
+
* It owns listbox semantics and the brand-teal option interaction treatment;
|
|
28
28
|
* positioning and open/closed state stay with the parent Select.
|
|
29
29
|
*/
|
|
30
30
|
export declare const DropdownOptions: React.ForwardRefExoticComponent<DropdownOptionsProps & React.RefAttributes<HTMLUListElement>>;
|
package/components/select.js
CHANGED
|
@@ -254,7 +254,7 @@ const re = n.forwardRef(
|
|
|
254
254
|
{
|
|
255
255
|
className: b(
|
|
256
256
|
"size-4 text-muted-foreground transition-[color,transform] duration-150 ease-out motion-reduce:transition-none",
|
|
257
|
-
"group-hover/select:text-foreground group-focus/select:text-
|
|
257
|
+
"group-hover/select:text-foreground group-focus/select:text-t12!",
|
|
258
258
|
r && "rotate-180"
|
|
259
259
|
),
|
|
260
260
|
"aria-hidden": !0
|
package/llms.txt
CHANGED
|
@@ -35,12 +35,12 @@ Reference semantic roles, never raw color/dimension literals (ads-lint rejects l
|
|
|
35
35
|
- `card` — The white working plane that sits on the canvas, and the specimen hairline.
|
|
36
36
|
- `card-foreground` — The white working plane that sits on the canvas, and the specimen hairline.
|
|
37
37
|
- `specimen-stroke` — The white working plane that sits on the canvas, and the specimen hairline.
|
|
38
|
-
- `action-primary` — Primary CTA role — restrained Studio
|
|
39
|
-
- `action-primary-foreground` — Primary CTA role — restrained Studio
|
|
40
|
-
- `action-primary-hover` — Primary CTA role — restrained Studio
|
|
41
|
-
- `action-primary-text` — Primary CTA role — restrained Studio
|
|
42
|
-
- `action-primary-soft` — Primary CTA role — restrained Studio
|
|
43
|
-
- `field-focus` — Primary CTA role — restrained Studio
|
|
38
|
+
- `action-primary` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
39
|
+
- `action-primary-foreground` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
40
|
+
- `action-primary-hover` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
41
|
+
- `action-primary-text` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
42
|
+
- `action-primary-soft` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
43
|
+
- `field-focus` — Primary CTA role — restrained Studio teal, used sparingly.
|
|
44
44
|
- `brand` — Compatibility action role — neutral ink, never a colored primary hue.
|
|
45
45
|
- `brand-foreground` — Compatibility action role — neutral ink, never a colored primary hue.
|
|
46
46
|
- `brand-hover` — Compatibility action role — neutral ink, never a colored primary hue.
|
package/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actioneer/ads",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"importPath": "@actioneer/ads",
|
|
5
5
|
"styleImport": "@import \"@actioneer/ads/styles.css\";",
|
|
6
6
|
"families": [
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"text-action-primary",
|
|
219
219
|
"border-action-primary"
|
|
220
220
|
],
|
|
221
|
-
"description": "Primary CTA role — restrained Studio
|
|
221
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
222
222
|
},
|
|
223
223
|
{
|
|
224
224
|
"name": "--color-action-primary-foreground",
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
"text-action-primary-foreground",
|
|
228
228
|
"bg-action-primary-foreground"
|
|
229
229
|
],
|
|
230
|
-
"description": "Primary CTA role — restrained Studio
|
|
230
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
"name": "--color-action-primary-hover",
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
"text-action-primary-hover",
|
|
238
238
|
"border-action-primary-hover"
|
|
239
239
|
],
|
|
240
|
-
"description": "Primary CTA role — restrained Studio
|
|
240
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
241
241
|
},
|
|
242
242
|
{
|
|
243
243
|
"name": "--color-action-primary-text",
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
"text-action-primary-text",
|
|
248
248
|
"border-action-primary-text"
|
|
249
249
|
],
|
|
250
|
-
"description": "Primary CTA role — restrained Studio
|
|
250
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
253
|
"name": "--color-action-primary-soft",
|
|
@@ -257,7 +257,7 @@
|
|
|
257
257
|
"text-action-primary-soft",
|
|
258
258
|
"border-action-primary-soft"
|
|
259
259
|
],
|
|
260
|
-
"description": "Primary CTA role — restrained Studio
|
|
260
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
261
261
|
},
|
|
262
262
|
{
|
|
263
263
|
"name": "--color-field-focus",
|
|
@@ -267,7 +267,7 @@
|
|
|
267
267
|
"text-field-focus",
|
|
268
268
|
"border-field-focus"
|
|
269
269
|
],
|
|
270
|
-
"description": "Primary CTA role — restrained Studio
|
|
270
|
+
"description": "Primary CTA role — restrained Studio teal, used sparingly."
|
|
271
271
|
},
|
|
272
272
|
{
|
|
273
273
|
"name": "--color-brand",
|
|
@@ -799,7 +799,7 @@
|
|
|
799
799
|
],
|
|
800
800
|
"default": "solid",
|
|
801
801
|
"options": {
|
|
802
|
-
"solid": "The restrained
|
|
802
|
+
"solid": "The restrained teal primary CTA; use for the one primary action on a screen, keeping teal to roughly 5–10% of the UI.",
|
|
803
803
|
"secondary": "A standalone neutral action that must still read as a real button (e.g. Cancel beside Save) — more emphasis than outline or ghost.",
|
|
804
804
|
"outline": "Unfilled with a visible border, lighter than secondary but still clearly a button.",
|
|
805
805
|
"ghost": "Unfilled and borderless — the lowest-emphasis button chrome short of link.",
|
|
@@ -9669,7 +9669,7 @@
|
|
|
9669
9669
|
"required": false,
|
|
9670
9670
|
"derived": true,
|
|
9671
9671
|
"isDefault": true,
|
|
9672
|
-
"description": "The restrained
|
|
9672
|
+
"description": "The restrained teal primary CTA; use for the one primary action on a screen, keeping teal to roughly 5–10% of the UI."
|
|
9673
9673
|
},
|
|
9674
9674
|
{
|
|
9675
9675
|
"id": "state:Button:variant=secondary",
|
package/package.json
CHANGED
package/styles.css
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
/*
|
|
40
40
|
* ============================================================
|
|
41
41
|
* ADS 1.0 — Design Tokens
|
|
42
|
-
* Palette: warm greys + product
|
|
42
|
+
* Palette: warm greys + product teal
|
|
43
43
|
* Typeface: Aribau Grotesk
|
|
44
44
|
* ============================================================
|
|
45
45
|
*/
|
|
@@ -93,22 +93,22 @@
|
|
|
93
93
|
|
|
94
94
|
/* ---- Foundation palette ----
|
|
95
95
|
Canonical primitive names:
|
|
96
|
-
|
|
96
|
+
T1…T12 = Teal · WG1…WG12 = Warm Grey.
|
|
97
97
|
Each ramp progresses from light backgrounds and interactive fills through
|
|
98
98
|
supporting tones to solid colors and accessible text. Neutral UI borders
|
|
99
99
|
are intentionally restricted to WG3–WG5. ---- */
|
|
100
|
-
--color-
|
|
101
|
-
--color-
|
|
102
|
-
--color-
|
|
103
|
-
--color-
|
|
104
|
-
--color-
|
|
105
|
-
--color-
|
|
106
|
-
--color-
|
|
107
|
-
--color-
|
|
108
|
-
--color-
|
|
109
|
-
--color-
|
|
110
|
-
--color-
|
|
111
|
-
--color-
|
|
100
|
+
--color-t1: #f6f9f9;
|
|
101
|
+
--color-t2: #edf5f4;
|
|
102
|
+
--color-t3: #dfefec;
|
|
103
|
+
--color-t4: #c7e4df;
|
|
104
|
+
--color-t5: #add8d1;
|
|
105
|
+
--color-t6: #91cbc2;
|
|
106
|
+
--color-t7: #6fb7ad;
|
|
107
|
+
--color-t8: #4c9b92;
|
|
108
|
+
--color-t9: #1c8379;
|
|
109
|
+
--color-t10: #017369;
|
|
110
|
+
--color-t11: #016159;
|
|
111
|
+
--color-t12: #0f3c37;
|
|
112
112
|
|
|
113
113
|
--color-wg1: #f5f5f3;
|
|
114
114
|
--color-wg2: #f1f1ef;
|
|
@@ -138,21 +138,36 @@
|
|
|
138
138
|
--color-ng11: var(--color-wg11);
|
|
139
139
|
--color-ng12: var(--color-wg12);
|
|
140
140
|
|
|
141
|
+
/* Deprecated Green names resolve step-for-step to the canonical Teal ramp.
|
|
142
|
+
Keep these aliases so existing consumer utilities (`bg-g9`) still render. */
|
|
143
|
+
--color-g1: var(--color-t1);
|
|
144
|
+
--color-g2: var(--color-t2);
|
|
145
|
+
--color-g3: var(--color-t3);
|
|
146
|
+
--color-g4: var(--color-t4);
|
|
147
|
+
--color-g5: var(--color-t5);
|
|
148
|
+
--color-g6: var(--color-t6);
|
|
149
|
+
--color-g7: var(--color-t7);
|
|
150
|
+
--color-g8: var(--color-t8);
|
|
151
|
+
--color-g9: var(--color-t9);
|
|
152
|
+
--color-g10: var(--color-t10);
|
|
153
|
+
--color-g11: var(--color-t11);
|
|
154
|
+
--color-g12: var(--color-t12);
|
|
155
|
+
|
|
141
156
|
--color-white: #ffffff;
|
|
142
157
|
|
|
143
158
|
/* Compatibility aliases preserve the existing ADS utility/API surface. */
|
|
144
|
-
--color-green-50: var(--color-
|
|
145
|
-
--color-green-100: var(--color-
|
|
146
|
-
--color-green-200: var(--color-
|
|
147
|
-
--color-green-300: var(--color-
|
|
148
|
-
--color-green-400: var(--color-
|
|
149
|
-
--color-green-500: var(--color-
|
|
150
|
-
--color-green-600: var(--color-
|
|
151
|
-
--color-green-700: var(--color-
|
|
152
|
-
--color-green-800: var(--color-
|
|
153
|
-
--color-green-850: var(--color-
|
|
154
|
-
--color-green-900: var(--color-
|
|
155
|
-
--color-green-950: var(--color-
|
|
159
|
+
--color-green-50: var(--color-t1);
|
|
160
|
+
--color-green-100: var(--color-t2);
|
|
161
|
+
--color-green-200: var(--color-t3);
|
|
162
|
+
--color-green-300: var(--color-t4);
|
|
163
|
+
--color-green-400: var(--color-t5);
|
|
164
|
+
--color-green-500: var(--color-t6);
|
|
165
|
+
--color-green-600: var(--color-t7);
|
|
166
|
+
--color-green-700: var(--color-t8);
|
|
167
|
+
--color-green-800: var(--color-t9);
|
|
168
|
+
--color-green-850: var(--color-t10);
|
|
169
|
+
--color-green-900: var(--color-t11);
|
|
170
|
+
--color-green-950: var(--color-t12);
|
|
156
171
|
|
|
157
172
|
--color-grey-50: var(--color-wg1);
|
|
158
173
|
--color-grey-100: var(--color-wg2);
|
|
@@ -380,7 +395,7 @@
|
|
|
380
395
|
--color-card-foreground: var(--card-foreground);
|
|
381
396
|
--color-specimen-stroke: var(--specimen-stroke);
|
|
382
397
|
|
|
383
|
-
/* Primary CTA role — restrained Studio
|
|
398
|
+
/* Primary CTA role — restrained Studio teal, used sparingly. */
|
|
384
399
|
--color-action-primary: var(--action-primary);
|
|
385
400
|
--color-action-primary-foreground: var(--action-primary-foreground);
|
|
386
401
|
--color-action-primary-hover: var(--action-primary-hover);
|
|
@@ -497,14 +512,14 @@
|
|
|
497
512
|
--card: var(--color-white); /* pure white base */
|
|
498
513
|
--card-foreground: var(--color-wg12);
|
|
499
514
|
|
|
500
|
-
/* Studio
|
|
515
|
+
/* Studio teal is deliberately isolated to the primary CTA role (roughly
|
|
501
516
|
5–10% of a screen). Selection controls keep using neutral `brand` below,
|
|
502
517
|
so tabs, switches, radios, and progress never inherit CTA color. */
|
|
503
|
-
--action-primary: var(--color-
|
|
518
|
+
--action-primary: var(--color-t9);
|
|
504
519
|
--action-primary-foreground: var(--color-white);
|
|
505
|
-
--action-primary-hover: var(--color-
|
|
506
|
-
--action-primary-text: var(--color-
|
|
507
|
-
--action-primary-soft: var(--color-
|
|
520
|
+
--action-primary-hover: var(--color-t10);
|
|
521
|
+
--action-primary-text: var(--color-t11);
|
|
522
|
+
--action-primary-soft: var(--color-t3);
|
|
508
523
|
|
|
509
524
|
/* Neutral action role. The `brand` name remains as a compatibility API,
|
|
510
525
|
and shared selection/control states intentionally remain achromatic. */
|
|
@@ -538,7 +553,7 @@
|
|
|
538
553
|
--menu-stroke: var(--color-wg4); /* dropdown edge + separator */
|
|
539
554
|
--toast-stroke: var(--color-wg4); /* toast card edge */
|
|
540
555
|
--tree-stroke: var(--color-wg4); /* tree connector rail + elbows */
|
|
541
|
-
--field-focus: var(--color-
|
|
556
|
+
--field-focus: var(--color-t8); /* subtle teal focused-control edge */
|
|
542
557
|
|
|
543
558
|
/* Ripple — the appearance wash that radiates from a floating surface's
|
|
544
559
|
origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
|
|
@@ -670,12 +685,12 @@
|
|
|
670
685
|
}
|
|
671
686
|
|
|
672
687
|
/* Ask landing: Hex's hierarchy translated into ADS tokens. The same quiet
|
|
673
|
-
texture spans the complete canvas;
|
|
688
|
+
texture spans the complete canvas; T2-T8 concentrate focus at the prompt. */
|
|
674
689
|
.ask-empty-state {
|
|
675
690
|
background-color: var(--color-white);
|
|
676
691
|
background-image: radial-gradient(
|
|
677
692
|
circle,
|
|
678
|
-
color-mix(in oklab, var(--color-
|
|
693
|
+
color-mix(in oklab, var(--color-t8) 22%, transparent) 0 0.75px,
|
|
679
694
|
transparent 0.9px
|
|
680
695
|
);
|
|
681
696
|
background-size: 12px 12px;
|
|
@@ -684,8 +699,8 @@
|
|
|
684
699
|
.ask-empty-hero-pattern {
|
|
685
700
|
background-image: radial-gradient(
|
|
686
701
|
ellipse at 50% 52%,
|
|
687
|
-
color-mix(in oklab, var(--color-
|
|
688
|
-
color-mix(in oklab, var(--color-
|
|
702
|
+
color-mix(in oklab, var(--color-t3) 88%, transparent) 0%,
|
|
703
|
+
color-mix(in oklab, var(--color-t2) 48%, transparent) 38%,
|
|
689
704
|
transparent 68%
|
|
690
705
|
);
|
|
691
706
|
}
|
|
@@ -696,8 +711,8 @@
|
|
|
696
711
|
}
|
|
697
712
|
|
|
698
713
|
.ask-empty-composer:focus-within [data-slot="aui_composer-shell"] {
|
|
699
|
-
border-color: var(--color-
|
|
700
|
-
box-shadow: 0 0 0 3px var(--color-
|
|
714
|
+
border-color: var(--color-t8);
|
|
715
|
+
box-shadow: 0 0 0 3px var(--color-t4), var(--shadow-300);
|
|
701
716
|
}
|
|
702
717
|
|
|
703
718
|
.ask-section-label {
|
package/theme.css
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/*
|
|
9
9
|
* ============================================================
|
|
10
10
|
* ADS 1.0 — Design Tokens
|
|
11
|
-
* Palette: warm greys + product
|
|
11
|
+
* Palette: warm greys + product teal
|
|
12
12
|
* Typeface: Aribau Grotesk
|
|
13
13
|
* ============================================================
|
|
14
14
|
*/
|
|
@@ -62,22 +62,22 @@
|
|
|
62
62
|
|
|
63
63
|
/* ---- Foundation palette ----
|
|
64
64
|
Canonical primitive names:
|
|
65
|
-
|
|
65
|
+
T1…T12 = Teal · WG1…WG12 = Warm Grey.
|
|
66
66
|
Each ramp progresses from light backgrounds and interactive fills through
|
|
67
67
|
supporting tones to solid colors and accessible text. Neutral UI borders
|
|
68
68
|
are intentionally restricted to WG3–WG5. ---- */
|
|
69
|
-
--color-
|
|
70
|
-
--color-
|
|
71
|
-
--color-
|
|
72
|
-
--color-
|
|
73
|
-
--color-
|
|
74
|
-
--color-
|
|
75
|
-
--color-
|
|
76
|
-
--color-
|
|
77
|
-
--color-
|
|
78
|
-
--color-
|
|
79
|
-
--color-
|
|
80
|
-
--color-
|
|
69
|
+
--color-t1: #f6f9f9;
|
|
70
|
+
--color-t2: #edf5f4;
|
|
71
|
+
--color-t3: #dfefec;
|
|
72
|
+
--color-t4: #c7e4df;
|
|
73
|
+
--color-t5: #add8d1;
|
|
74
|
+
--color-t6: #91cbc2;
|
|
75
|
+
--color-t7: #6fb7ad;
|
|
76
|
+
--color-t8: #4c9b92;
|
|
77
|
+
--color-t9: #1c8379;
|
|
78
|
+
--color-t10: #017369;
|
|
79
|
+
--color-t11: #016159;
|
|
80
|
+
--color-t12: #0f3c37;
|
|
81
81
|
|
|
82
82
|
--color-wg1: #f5f5f3;
|
|
83
83
|
--color-wg2: #f1f1ef;
|
|
@@ -107,21 +107,36 @@
|
|
|
107
107
|
--color-ng11: var(--color-wg11);
|
|
108
108
|
--color-ng12: var(--color-wg12);
|
|
109
109
|
|
|
110
|
+
/* Deprecated Green names resolve step-for-step to the canonical Teal ramp.
|
|
111
|
+
Keep these aliases so existing consumer utilities (`bg-g9`) still render. */
|
|
112
|
+
--color-g1: var(--color-t1);
|
|
113
|
+
--color-g2: var(--color-t2);
|
|
114
|
+
--color-g3: var(--color-t3);
|
|
115
|
+
--color-g4: var(--color-t4);
|
|
116
|
+
--color-g5: var(--color-t5);
|
|
117
|
+
--color-g6: var(--color-t6);
|
|
118
|
+
--color-g7: var(--color-t7);
|
|
119
|
+
--color-g8: var(--color-t8);
|
|
120
|
+
--color-g9: var(--color-t9);
|
|
121
|
+
--color-g10: var(--color-t10);
|
|
122
|
+
--color-g11: var(--color-t11);
|
|
123
|
+
--color-g12: var(--color-t12);
|
|
124
|
+
|
|
110
125
|
--color-white: #ffffff;
|
|
111
126
|
|
|
112
127
|
/* Compatibility aliases preserve the existing ADS utility/API surface. */
|
|
113
|
-
--color-green-50: var(--color-
|
|
114
|
-
--color-green-100: var(--color-
|
|
115
|
-
--color-green-200: var(--color-
|
|
116
|
-
--color-green-300: var(--color-
|
|
117
|
-
--color-green-400: var(--color-
|
|
118
|
-
--color-green-500: var(--color-
|
|
119
|
-
--color-green-600: var(--color-
|
|
120
|
-
--color-green-700: var(--color-
|
|
121
|
-
--color-green-800: var(--color-
|
|
122
|
-
--color-green-850: var(--color-
|
|
123
|
-
--color-green-900: var(--color-
|
|
124
|
-
--color-green-950: var(--color-
|
|
128
|
+
--color-green-50: var(--color-t1);
|
|
129
|
+
--color-green-100: var(--color-t2);
|
|
130
|
+
--color-green-200: var(--color-t3);
|
|
131
|
+
--color-green-300: var(--color-t4);
|
|
132
|
+
--color-green-400: var(--color-t5);
|
|
133
|
+
--color-green-500: var(--color-t6);
|
|
134
|
+
--color-green-600: var(--color-t7);
|
|
135
|
+
--color-green-700: var(--color-t8);
|
|
136
|
+
--color-green-800: var(--color-t9);
|
|
137
|
+
--color-green-850: var(--color-t10);
|
|
138
|
+
--color-green-900: var(--color-t11);
|
|
139
|
+
--color-green-950: var(--color-t12);
|
|
125
140
|
|
|
126
141
|
--color-grey-50: var(--color-wg1);
|
|
127
142
|
--color-grey-100: var(--color-wg2);
|
|
@@ -349,7 +364,7 @@
|
|
|
349
364
|
--color-card-foreground: var(--card-foreground);
|
|
350
365
|
--color-specimen-stroke: var(--specimen-stroke);
|
|
351
366
|
|
|
352
|
-
/* Primary CTA role — restrained Studio
|
|
367
|
+
/* Primary CTA role — restrained Studio teal, used sparingly. */
|
|
353
368
|
--color-action-primary: var(--action-primary);
|
|
354
369
|
--color-action-primary-foreground: var(--action-primary-foreground);
|
|
355
370
|
--color-action-primary-hover: var(--action-primary-hover);
|
|
@@ -466,14 +481,14 @@
|
|
|
466
481
|
--card: var(--color-white); /* pure white base */
|
|
467
482
|
--card-foreground: var(--color-wg12);
|
|
468
483
|
|
|
469
|
-
/* Studio
|
|
484
|
+
/* Studio teal is deliberately isolated to the primary CTA role (roughly
|
|
470
485
|
5–10% of a screen). Selection controls keep using neutral `brand` below,
|
|
471
486
|
so tabs, switches, radios, and progress never inherit CTA color. */
|
|
472
|
-
--action-primary: var(--color-
|
|
487
|
+
--action-primary: var(--color-t9);
|
|
473
488
|
--action-primary-foreground: var(--color-white);
|
|
474
|
-
--action-primary-hover: var(--color-
|
|
475
|
-
--action-primary-text: var(--color-
|
|
476
|
-
--action-primary-soft: var(--color-
|
|
489
|
+
--action-primary-hover: var(--color-t10);
|
|
490
|
+
--action-primary-text: var(--color-t11);
|
|
491
|
+
--action-primary-soft: var(--color-t3);
|
|
477
492
|
|
|
478
493
|
/* Neutral action role. The `brand` name remains as a compatibility API,
|
|
479
494
|
and shared selection/control states intentionally remain achromatic. */
|
|
@@ -507,7 +522,7 @@
|
|
|
507
522
|
--menu-stroke: var(--color-wg4); /* dropdown edge + separator */
|
|
508
523
|
--toast-stroke: var(--color-wg4); /* toast card edge */
|
|
509
524
|
--tree-stroke: var(--color-wg4); /* tree connector rail + elbows */
|
|
510
|
-
--field-focus: var(--color-
|
|
525
|
+
--field-focus: var(--color-t8); /* subtle teal focused-control edge */
|
|
511
526
|
|
|
512
527
|
/* Ripple — the appearance wash that radiates from a floating surface's
|
|
513
528
|
origin corner as it opens (Dropdown/Popover/Select/Modal…). A soft ink
|