@actioneer/ads 1.0.2 → 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 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: "#398457"
6
- action-primary-hover: "#2b7348"
7
- action-primary-text: "#1f623b"
8
- action-primary-soft: "#e2efe5"
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: "#5c9c73"
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.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.
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 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.
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 green CTA family.
199
+ The one place a hue is spent by default: the Studio teal CTA family.
200
200
 
201
- **Primary CTA role — restrained Studio green, used sparingly.**
201
+ **Primary CTA role — restrained Studio teal, used sparingly.**
202
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`
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`, #5c9c73) `bg-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 green.
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}
@@ -98,7 +98,7 @@ const S = t.forwardRef(({ className: n, ...r }, s) => /* @__PURE__ */ e(
98
98
  "p",
99
99
  {
100
100
  ref: s,
101
- className: d("text-xs font-normal leading-6 text-(--alert-accent)", n),
101
+ className: d("text-s font-normal leading-6 text-(--alert-accent)", n),
102
102
  ...r
103
103
  }
104
104
  ));
@@ -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 m = {
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(t) {
16
- const e = t.trim().split(/\s+/).filter(Boolean);
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 g = [
20
- "bg-g9 text-action-primary-foreground",
21
- "bg-g10 text-action-primary-foreground",
22
- "bg-g11 text-action-primary-foreground",
23
- "bg-g4 text-g12"
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(t) {
26
- const e = Array.from(t).reduce(
27
- (r, i) => r + i.charCodeAt(0),
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 g[e % g.length];
30
+ return m[e % m.length];
31
31
  }
32
32
  const N = f.forwardRef(
33
- ({ className: t, src: e, name: r, size: i = "md", radius: o = "full", ...a }, d) => {
34
- const l = r ? v(r) : "";
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": r,
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 green ramp.
44
- e || !r ? "bg-fill text-fill-foreground" : y(r),
45
- m[i],
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
- t
47
+ r
48
48
  ),
49
49
  ...a,
50
50
  children: e ? /* @__PURE__ */ n(
51
51
  "img",
52
52
  {
53
53
  src: e,
54
- alt: r ?? "",
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: t, max: e, size: r = "md", radius: i = "full", children: o, ...a }, d) => {
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", t),
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
- m[r],
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-g12!",
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-g12! [&_svg]:size-4", children: r }),
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-g12! [&_svg]:size-4", children: n })
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(
@@ -18,7 +18,7 @@ const N = {
18
18
  type: s,
19
19
  ...c
20
20
  }, m) => {
21
- const [i, p] = l.useState(!1), n = s === "password", r = u ?? (n ? /* @__PURE__ */ e(
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), t = /* @__PURE__ */ e(
30
+ ) : void 0), n = /* @__PURE__ */ e(
31
31
  "input",
32
32
  {
33
33
  ref: m,
34
- type: n && i ? "text" : s,
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 ? t : (
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 G12 green while the
52
- // control is focused. Important keeps focus green while still hovered.
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-g12! [&_svg]:size-4", children: o }),
55
- t,
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-g12! [&_svg]:size-4", children: r })
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
  }
@@ -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-green option interaction treatment;
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>>;
@@ -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-g12!",
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 green, used sparingly.
39
- - `action-primary-foreground` — Primary CTA role — restrained Studio green, used sparingly.
40
- - `action-primary-hover` — Primary CTA role — restrained Studio green, used sparingly.
41
- - `action-primary-text` — Primary CTA role — restrained Studio green, used sparingly.
42
- - `action-primary-soft` — Primary CTA role — restrained Studio green, used sparingly.
43
- - `field-focus` — Primary CTA role — restrained Studio green, used sparingly.
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.2",
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 green, used sparingly."
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 green, used sparingly."
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 green, used sparingly."
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 green, used sparingly."
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 green, used sparingly."
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 green, used sparingly."
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 green primary CTA; use for the one primary action on a screen, keeping green to roughly 5–10% of the UI.",
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 green primary CTA; use for the one primary action on a screen, keeping green to roughly 5–10% of the UI."
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actioneer/ads",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Actioneer Design System 1.0 — React 19 + Tailwind v4 component library.",
5
5
  "type": "module",
6
6
  "sideEffects": [
package/styles.css CHANGED
@@ -39,7 +39,7 @@
39
39
  /*
40
40
  * ============================================================
41
41
  * ADS 1.0 — Design Tokens
42
- * Palette: warm greys + product green
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
- G1…G12 = Green · WG1…WG12 = Warm Grey.
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-g1: #f7f9f7;
101
- --color-g2: #eef5f0;
102
- --color-g3: #e2efe5;
103
- --color-g4: #cce4d2;
104
- --color-g5: #b4d8be;
105
- --color-g6: #9bcbaa;
106
- --color-g7: #7db78f;
107
- --color-g8: #5c9c73;
108
- --color-g9: #398457;
109
- --color-g10: #2b7348;
110
- --color-g11: #1f623b;
111
- --color-g12: #183c28;
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-g1);
145
- --color-green-100: var(--color-g2);
146
- --color-green-200: var(--color-g3);
147
- --color-green-300: var(--color-g4);
148
- --color-green-400: var(--color-g5);
149
- --color-green-500: var(--color-g6);
150
- --color-green-600: var(--color-g7);
151
- --color-green-700: var(--color-g8);
152
- --color-green-800: var(--color-g9);
153
- --color-green-850: var(--color-g10);
154
- --color-green-900: var(--color-g11);
155
- --color-green-950: var(--color-g12);
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 green, used sparingly. */
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 green is deliberately isolated to the primary CTA role (roughly
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-g9);
518
+ --action-primary: var(--color-t9);
504
519
  --action-primary-foreground: var(--color-white);
505
- --action-primary-hover: var(--color-g10);
506
- --action-primary-text: var(--color-g11);
507
- --action-primary-soft: var(--color-g3);
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-g8); /* subtle green focused-control edge */
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; G2-G8 concentrate focus at the prompt. */
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-g8) 22%, transparent) 0 0.75px,
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-g3) 88%, transparent) 0%,
688
- color-mix(in oklab, var(--color-g2) 48%, transparent) 38%,
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-g8);
700
- box-shadow: 0 0 0 3px var(--color-g4), var(--shadow-300);
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 green
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
- G1…G12 = Green · WG1…WG12 = Warm Grey.
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-g1: #f7f9f7;
70
- --color-g2: #eef5f0;
71
- --color-g3: #e2efe5;
72
- --color-g4: #cce4d2;
73
- --color-g5: #b4d8be;
74
- --color-g6: #9bcbaa;
75
- --color-g7: #7db78f;
76
- --color-g8: #5c9c73;
77
- --color-g9: #398457;
78
- --color-g10: #2b7348;
79
- --color-g11: #1f623b;
80
- --color-g12: #183c28;
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-g1);
114
- --color-green-100: var(--color-g2);
115
- --color-green-200: var(--color-g3);
116
- --color-green-300: var(--color-g4);
117
- --color-green-400: var(--color-g5);
118
- --color-green-500: var(--color-g6);
119
- --color-green-600: var(--color-g7);
120
- --color-green-700: var(--color-g8);
121
- --color-green-800: var(--color-g9);
122
- --color-green-850: var(--color-g10);
123
- --color-green-900: var(--color-g11);
124
- --color-green-950: var(--color-g12);
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 green, used sparingly. */
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 green is deliberately isolated to the primary CTA role (roughly
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-g9);
487
+ --action-primary: var(--color-t9);
473
488
  --action-primary-foreground: var(--color-white);
474
- --action-primary-hover: var(--color-g10);
475
- --action-primary-text: var(--color-g11);
476
- --action-primary-soft: var(--color-g3);
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-g8); /* subtle green focused-control edge */
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