@astryxdesign/theme-stone 0.7.4-canary.b25f95e → 0.7.4-canary.eccc6ee

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/README.md CHANGED
@@ -23,14 +23,51 @@ function App() {
23
23
 
24
24
  ### Import paths
25
25
 
26
- | Path | Use case |
27
- | ---------------------------- | ------------------------------------------------------ |
28
- | `@astryxdesign/theme-stone` | Source build (StyleX compilation via `@astryxdesign/build`) |
29
- | `@astryxdesign/theme-stone/built` | Pre-built dist (Tailwind, plain CSS, or no build step) |
30
- | `@astryxdesign/theme-stone/theme.css` | Pre-built CSS file (import in your stylesheet) |
26
+ | Path | Use case |
27
+ | ------------------------------------- | ----------------------------------------------------------- |
28
+ | `@astryxdesign/theme-stone` | Source build (StyleX compilation via `@astryxdesign/build`) |
29
+ | `@astryxdesign/theme-stone/built` | Pre-built dist (Tailwind, plain CSS, or no build step) |
30
+ | `@astryxdesign/theme-stone/theme.css` | Pre-built CSS file (import in your stylesheet) |
31
31
 
32
32
  If you're using `@astryxdesign/build` for StyleX source compilation, import from the bare path. Otherwise, use `/built`.
33
33
 
34
+ ## Approved palette
35
+
36
+ Stone keeps its generation request in `palette.config.json`, the reviewed
37
+ `astryx-oklch-v1` output in `src/stonePalettes.generated.ts`, and the detached
38
+ generation receipt beside it. `stonePaletteRefs.generated.ts` provides the
39
+ small runtime projection consumed by the maintained theme.
40
+
41
+ The palette preserves Stone's exact configured neutral and pastel anchors while
42
+ generating separate light and dark ramps. Green, Yellow, Teal, and Cyan use
43
+ reviewed re-seeded midtones rather than preserving their released compatibility
44
+ ramp values. The complete palette remains available for authoring and audits; the
45
+ runtime theme imports only the selected stops in
46
+ `stonePaletteRefs.generated.ts`.
47
+
48
+ Use semantic theme tokens in components. Stone's theme source maps those roles
49
+ to named palette stops; components never read raw palette values directly. The
50
+ prebuilt theme and CSS contain resolved values. Changing the generated palette
51
+ must include the regenerated receipt, selected-reference module, token diff,
52
+ tests, and visual review. Keep `stoneTheme.ts` and the CLI template copy
53
+ synchronized when changing a mapping.
54
+
55
+ The bare package export preserves the original `stonePalettes.family[stop]`,
56
+ `stonePalettes.family.hue`, and `stonePalettes.family.chroma` shape. The generated
57
+ light and dark ramps are private authoring artifacts used by the maintained theme,
58
+ tests, and review tooling rather than an expanded public palette API:
59
+
60
+ ```ts
61
+ import {stonePalettes} from '@astryxdesign/theme-stone';
62
+
63
+ const existingSharedRampValue = stonePalettes.orange[90];
64
+ ```
65
+
66
+ The palette is an authoring and audit reference, not a component styling API,
67
+ chart-color API, or accessibility guarantee. Components should read semantic
68
+ tokens, charts should use the data-visualization color API, and every custom
69
+ foreground/background pair still needs contextual contrast verification.
70
+
34
71
  ### CSS import
35
72
 
36
73
  Add the theme CSS to your stylesheet:
package/dist/source.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { stoneTheme, stonePalettes } from './stoneTheme';
1
+ export { stonePalettes, stoneTheme } from './stoneTheme';
2
2
  export { stoneIconRegistry } from './icons';
3
3
  //# sourceMappingURL=source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC"}
package/dist/source.js CHANGED
@@ -68,58 +68,88 @@ var stoneIconRegistry = {
68
68
  microphone: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Mic, { ...iconProps })
69
69
  };
70
70
 
71
+ // src/stonePaletteRefs.generated.ts
72
+ var stonePaletteRefs = {
73
+ green: {
74
+ light: { 30: "#354f31", 55: "#609757", 85: "#bfdfbb", 90: "#d2eccf" },
75
+ dark: { 25: "#2f412c", 35: "#3e5d38", 70: "#90ba8a", 80: "#b3d0af", 90: "#d5e9d2" }
76
+ },
77
+ yellow: {
78
+ light: { 30: "#524818", 40: "#736419", 55: "#a08c36", 85: "#e7d3a4", 90: "#f4e1b7" },
79
+ dark: { 25: "#433b1b", 35: "#615620", 70: "#c2af6e", 80: "#d9c794", 90: "#f1e1b9" }
80
+ },
81
+ red: {
82
+ light: { 30: "#603c37", 40: "#745752", 60: "#a98984", 85: "#f0cac4", 90: "#fbdad4" },
83
+ dark: { 25: "#50332e", 35: "#684a45", 70: "#c6a29c", 80: "#e0bdb8", 90: "#f7dbd7" }
84
+ },
85
+ purple: {
86
+ light: { 30: "#4c405b", 40: "#635a70", 85: "#d9cfea", 90: "#e7def5" },
87
+ dark: { 25: "#3f374c", 35: "#574e64", 70: "#b0a5c0", 90: "#e6def3" }
88
+ },
89
+ teal: {
90
+ light: { 30: "#2c4f44", 40: "#40675c", 85: "#c3dbd2", 90: "#d4e8e1" },
91
+ dark: { 25: "#274239", 35: "#3a5b50", 70: "#94b3a9", 90: "#d6e7e1" }
92
+ },
93
+ neutral: {
94
+ light: { 0: "#000000", 15: "#25252a", 30: "#46464e", 40: "#5f5f64", 55: "#848489", 85: "#d4d3dd", 90: "#e2e2e8", 95: "#f0f0f7", 100: "#ffffff" },
95
+ dark: { 0: "#000000", 5: "#101018", 10: "#1b1b21", 15: "#25252a", 20: "#302f36", 25: "#3a3a42", 35: "#525159", 40: "#5e5e64", 65: "#9d9ea5", 70: "#ababb3", 90: "#e2e2e8", 95: "#f0f0f9", 100: "#ffffff" }
96
+ },
97
+ orange: {
98
+ dark: { 25: "#4e3522", 35: "#684c34", 70: "#c9a382", 90: "#ffdcbb" },
99
+ light: { 30: "#5e3f27", 85: "#f2cdaa", 90: "#ffdcbb" }
100
+ },
101
+ blue: {
102
+ light: { 30: "#344861", 40: "#516074", 85: "#c2d6f1", 90: "#d3e4fc" },
103
+ dark: { 25: "#2c3c52", 35: "#445469", 70: "#9aadc7", 90: "#d5e4f8" }
104
+ },
105
+ cyan: {
106
+ light: { 30: "#264d57", 85: "#badbe4", 90: "#cbe9f0" },
107
+ dark: { 25: "#234048", 35: "#345761", 90: "#cfe8ee" }
108
+ },
109
+ pink: {
110
+ light: { 30: "#5a3c4f", 85: "#e9cadc", 90: "#f5d9ea" },
111
+ dark: { 25: "#4b3242", 35: "#624a59", 90: "#f2dbe8" }
112
+ }
113
+ };
114
+
71
115
  // src/stoneTheme.ts
116
+ var { blue, cyan, green, neutral, orange, pink, purple, red, teal, yellow } = stonePaletteRefs;
117
+ var lightDark = (light, dark) => `light-dark(${light}, ${dark})`;
118
+ var withAlpha = (color, alpha) => `${color}${alpha}`;
72
119
  var INPUT_STATUS_VARS = {
73
120
  "status:success": {
74
- "--color-success": "light-dark(#7f977e, #99b298)"
75
- // Green T60 / T70
121
+ "--color-success": lightDark(green.light[55], green.dark[70])
76
122
  },
77
123
  "status:warning": {
78
- "--color-warning": "light-dark(#9f8f68, #bbaa81)"
79
- // Yellow T60 / T70
124
+ "--color-warning": lightDark(yellow.light[55], yellow.dark[70])
80
125
  },
81
126
  "status:error": {
82
- "--color-error": "light-dark(#a58b86, #c0a5a1)"
83
- // Red T60 / T70
127
+ "--color-error": lightDark(red.light[60], red.dark[70])
84
128
  }
85
129
  };
86
130
  var stoneSyntax = (0, import_theme.defineSyntaxTheme)({
87
131
  name: "astryx-stone",
88
132
  tokens: {
89
- keyword: ["#645a72", "#b2a7c1"],
90
- // Purple T40 / T70
91
- string: ["#4e6357", "#9bb19a"],
92
- // Teal T40 / Green T70
93
- comment: ["#5e5e5e", "#ababb0"],
94
- // Stone Neutral T40 / T70
95
- number: ["#755752", "#bea792"],
96
- // Red T40 / Orange T70
97
- function: ["#506072", "#99adc6"],
98
- // Blue T40 / T70
99
- type: ["#645a72", "#b2a7c1"],
100
- // Purple T40 / T70
101
- variable: ["#5e5e5e", "#ababb0"],
102
- // Stone Neutral T40 / T70
103
- operator: ["#5e5e5e", "#ababb0"],
104
- // Stone Neutral T40 / T70
105
- constant: ["#755752", "#bea792"],
106
- // Red T40 / Orange T70
107
- tag: ["#775751", "#c7a39d"],
108
- // Red T40 / T70
109
- attribute: ["#79693f", "#b6aa90"],
110
- // Yellow T45 / T70
111
- property: ["#4e6357", "#94b2a0"],
112
- // Teal T40 / T70
113
- punctuation: ["#5e5e5e", "#ababb0"],
114
- // Stone Neutral T40 / T70
115
- background: ["#f3f3f5", "#171719"],
116
- // Diff rows: the muted green/red at 25% in light and 20% in dark keep
117
- // every token at or above 4.5:1 on the tint; the markers are the tinted
118
- // text tokens (8.1:1 light, 8.8:1 dark on their tints).
119
- added: ["#d0e9ce40", "#b4cdb233"],
120
- removed: ["#f9dcd740", "#dcc0bc33"],
121
- "added-marker": ["#374c36", "#d0e9ce"],
122
- "removed-marker": ["#58413e", "#f9dcd7"]
133
+ keyword: [purple.light[40], purple.dark[70]],
134
+ string: [teal.light[40], green.dark[70]],
135
+ comment: [neutral.light[40], neutral.dark[70]],
136
+ number: [red.light[40], orange.dark[70]],
137
+ function: [blue.light[40], blue.dark[70]],
138
+ type: [purple.light[40], purple.dark[70]],
139
+ variable: [neutral.light[40], neutral.dark[70]],
140
+ operator: [neutral.light[40], neutral.dark[70]],
141
+ constant: [red.light[40], orange.dark[70]],
142
+ tag: [red.light[40], red.dark[70]],
143
+ attribute: [yellow.light[40], yellow.dark[70]],
144
+ property: [teal.light[40], teal.dark[70]],
145
+ punctuation: [neutral.light[40], neutral.dark[70]],
146
+ background: [neutral.light[95], neutral.dark[5]],
147
+ // Translucent diff rows retain each token's contrast while the opaque
148
+ // markers carry the same Green and Red families as their row tint.
149
+ added: [withAlpha(green.light[90], "40"), withAlpha(green.dark[80], "33")],
150
+ removed: [withAlpha(red.light[90], "40"), withAlpha(red.dark[80], "33")],
151
+ "added-marker": [green.light[30], green.dark[90]],
152
+ "removed-marker": [red.light[30], red.dark[90]]
123
153
  }
124
154
  });
125
155
  var SECONDARY_BUTTON = {
@@ -179,184 +209,132 @@ var stoneTheme = (0, import_theme.defineTheme)({
179
209
  motion: { fast: 125, medium: 300, slow: 700, ratio: 0.75 },
180
210
  syntax: stoneSyntax,
181
211
  tokens: {
182
- // =========================================================================
183
- // Colors — warm stone palette
184
- // Core: #28282A, #84848B, #D8D8DB, #f3f3f5, #FFFFFF
185
- // =========================================================================
186
- // Core semantic — all neutrals H=291
187
- // Stone 900 T=16 C=1.4, Stone 500 T=55 C=4, Stone 300 T=86 C=1.6, Stone 100 T=96 C=1
188
- "--color-accent": ["#25252a", "#f3f3f5"],
189
- // light: Stone Neutral T15
190
- "--color-accent-muted": ["#25252a14", "#f3f3f520"],
191
- // light: Stone Neutral T15 · 8% / dark: T96 · 12.5%
192
- "--color-neutral": ["#25252a0f", "#f3f3f51a"],
193
- // light: Stone Neutral T15 · 6% / dark: T96 · 10%
194
- "--color-background-surface": ["#ffffff", "#1b1b1f"],
195
- // dark: Stone Neutral T10
196
- "--color-background-body": ["#f3f3f5", "#111015"],
197
- // dark: Stone Neutral T5
198
- "--color-overlay": ["#25252a80", "#28282acc"],
199
- // light: Stone Neutral T15 · 50% / dark: 80%
200
- "--color-overlay-hover": ["#25252a0d", "#f3f3f50d"],
201
- // light: Stone Neutral T15 · 5% / dark: T96 · 5%
202
- "--color-overlay-pressed": ["#25252a1a", "#f3f3f51a"],
203
- // light: Stone Neutral T15 · 10% / dark: T96 · 10%
204
- "--color-background-muted": ["#e2e2e8", "#3b3b3f"],
205
- // light: Stone Neutral T90
206
- // Text — H=291
207
- "--color-text-primary": ["#25252a", "#f3f3f5"],
208
- // light: Stone Neutral T15
209
- // T40/T70 keeps normal secondary text above AA on every stone surface,
210
- // including the muted and tinted fills that components pair it with.
211
- "--color-text-secondary": ["#5e5e63", "#ababb0"],
212
- // Stone Neutral T40 / T70
213
- "--color-text-disabled": ["#d7d7da", "#5e5e61"],
214
- // T86 C=1.6 / T40 C=2
215
- "--color-text-accent": ["#25252a", "#f3f3f5"],
216
- // light: Stone Neutral T15
217
- "--color-on-dark": "#FFFFFF",
218
- "--color-on-light": ["#25252a", "#28282a"],
219
- // light: Stone Neutral T15
220
- "--color-on-accent": ["#ffffff", "#25252a"],
221
- // dark: Stone Neutral T15
222
- // Text on top of matching status surface (badge fill, banner content).
223
- "--color-on-success": ["#374c36", "#d0e9ce"],
224
- // Green T30 / T90
225
- "--color-on-error": ["#58413e", "#f9dcd7"],
226
- // Red T30 / T90
227
- "--color-on-warning": ["#524622", "#f4e1b7"],
228
- // Yellow T30 / T90
229
- // Icon — H=291
230
- "--color-icon-accent": ["#25252a", "#f3f3f5"],
231
- // light: Stone Neutral T15
232
- "--color-icon-primary": ["#25252a", "#f3f3f5"],
233
- // light: Stone Neutral T15
234
- "--color-icon-secondary": ["#83838a", "#9d9da3"],
235
- // T55 C=4 / T65 C=3
236
- "--color-icon-disabled": ["#d7d7da", "#5e5e61"],
237
- // T86 C=1.6 / T40 C=2
238
- // Surface variants — H=291
239
- "--color-background-card": ["#FFFFFF", "#242325"],
240
- // T14
241
- "--color-background-popover": ["#ffffff", "#25252a"],
242
- // dark: Stone Neutral T15
243
- "--color-background-inverted": ["#25252a", "#f3f3f5"],
244
- // light: Stone Neutral T15
245
- // Status / Sentiment — T50 from palette for icons/borders (visible color)
246
- "--color-success": ["#374c36", "#b4cdb2"],
247
- // Green T30 / T80
248
- "--color-success-muted": ["#d0e9ce", "#b4cdb2"],
249
- // Green T90 / T80
250
- "--color-error": ["#58413e", "#dcc0bc"],
251
- // Red T30 / T80
252
- "--color-error-muted": ["#f9dcd7", "#dcc0bc"],
253
- // Red T90 / T80
254
- "--color-warning": ["#524622", "#d7c59c"],
255
- // Yellow T30 / T80
256
- "--color-warning-muted": ["#f4e1b7", "#d7c59c"],
257
- // Yellow T90 / T80
258
- // Border — H=291
259
- "--color-border": ["#e2e2e8", "#f3f3f51a"],
260
- // light: Stone Neutral T90 / dark: T96 · 10%
261
- "--color-border-emphasized": ["#83838a", "#5e5e61"],
262
- // T55 C=4 / T40 C=2
263
- // Effects — H=291
264
- "--color-skeleton": ["#d4d4da", "#5e5e64"],
265
- // T85 / T40 from H=291 C=3
266
- "--color-shadow": ["#25252a1a", "#0000004d"],
267
- // light: Stone Neutral T15 · 10% / dark: 30%
268
- "--color-tint-hover": ["black", "white"],
212
+ // Core neutrals
213
+ "--color-accent": [neutral.light[15], neutral.dark[95]],
214
+ "--color-accent-muted": [
215
+ withAlpha(neutral.light[15], "14"),
216
+ withAlpha(neutral.dark[95], "20")
217
+ ],
218
+ "--color-neutral": [
219
+ withAlpha(neutral.light[15], "0f"),
220
+ withAlpha(neutral.dark[95], "1a")
221
+ ],
222
+ "--color-background-surface": [neutral.light[100], neutral.dark[10]],
223
+ "--color-background-body": [neutral.light[95], neutral.dark[5]],
224
+ "--color-overlay": [
225
+ withAlpha(neutral.light[15], "80"),
226
+ withAlpha(neutral.dark[15], "cc")
227
+ ],
228
+ "--color-overlay-hover": [
229
+ withAlpha(neutral.light[15], "0d"),
230
+ withAlpha(neutral.dark[95], "0d")
231
+ ],
232
+ "--color-overlay-pressed": [
233
+ withAlpha(neutral.light[15], "1a"),
234
+ withAlpha(neutral.dark[95], "1a")
235
+ ],
236
+ "--color-background-muted": [neutral.light[90], neutral.dark[25]],
237
+ // Text
238
+ "--color-text-primary": [neutral.light[15], neutral.dark[95]],
239
+ // These stops keep normal secondary text readable on Stone's body,
240
+ // muted, and categorical surfaces.
241
+ "--color-text-secondary": [neutral.light[40], neutral.dark[70]],
242
+ "--color-text-disabled": [neutral.light[85], neutral.dark[40]],
243
+ "--color-text-accent": [neutral.light[15], neutral.dark[95]],
244
+ "--color-on-dark": neutral.light[100],
245
+ "--color-on-light": [neutral.light[15], neutral.dark[15]],
246
+ "--color-on-accent": [neutral.light[100], neutral.dark[15]],
247
+ "--color-on-success": [green.light[30], green.dark[90]],
248
+ "--color-on-error": [red.light[30], red.dark[90]],
249
+ "--color-on-warning": [yellow.light[30], yellow.dark[90]],
250
+ // Icon
251
+ "--color-icon-accent": [neutral.light[15], neutral.dark[95]],
252
+ "--color-icon-primary": [neutral.light[15], neutral.dark[95]],
253
+ "--color-icon-secondary": [neutral.light[55], neutral.dark[65]],
254
+ "--color-icon-disabled": [neutral.light[85], neutral.dark[40]],
255
+ // Surface variants
256
+ "--color-background-card": [neutral.light[100], neutral.dark[15]],
257
+ "--color-background-popover": [neutral.light[100], neutral.dark[20]],
258
+ "--color-background-inverted": [neutral.light[15], neutral.dark[95]],
259
+ // Status / sentiment
260
+ "--color-success": [green.light[30], green.dark[80]],
261
+ "--color-success-muted": [green.light[90], green.dark[80]],
262
+ "--color-error": [red.light[30], red.dark[80]],
263
+ "--color-error-muted": [red.light[90], red.dark[80]],
264
+ "--color-warning": [yellow.light[30], yellow.dark[80]],
265
+ "--color-warning-muted": [yellow.light[90], yellow.dark[80]],
266
+ // Border
267
+ "--color-border": [neutral.light[90], withAlpha(neutral.dark[95], "1a")],
268
+ "--color-border-emphasized": [neutral.light[55], neutral.dark[40]],
269
+ // Effects
270
+ "--color-skeleton": [neutral.light[85], neutral.dark[40]],
271
+ "--color-shadow": [
272
+ withAlpha(neutral.light[15], "1a"),
273
+ withAlpha(neutral.dark[0], "4d")
274
+ ],
275
+ "--color-tint-hover": [neutral.light[0], neutral.dark[100]],
269
276
  // Typography override
270
277
  "--text-supporting-size": "12px",
271
- // Categorical hues
272
- // Light: T90 solid bg + T30 text (pastel surface, dark text)
273
- // Dark: T35 solid bg + T90 text — snaps to canonical palette stops
274
- // per theming-infra.mdc §7. T90 dark text is the SAME hex as
275
- // the light-mode bg pastel — clean palette symmetry, ~6–9:1
276
- // contrast on the T35 surface across all hues (passes AA Body).
277
- // Borders: light T85 / dark T25 — one step inward from surface in both
278
- // modes, matching the light-mode T90/T85 spacing.
279
- // Categorical — Blue H=265 C=10
280
- "--color-background-blue": ["#d7e4f5", "#485362"],
281
- // light T90 / dark T35
282
- "--color-border-blue": ["#c9d6e7", "#313c4a"],
283
- // light T85 / dark T25
284
- "--color-icon-blue": ["#3c4856", "#d7e4f5"],
285
- // light T30 / dark T90
286
- "--color-text-blue": ["#3c4856", "#d7e4f5"],
287
- // Categorical — Cyan H=190 C=10
288
- "--color-background-cyan": ["#cce8e5", "#3e5755"],
289
- "--color-border-cyan": ["#bedad7", "#28403e"],
290
- "--color-icon-cyan": ["#334b49", "#cce8e5"],
291
- "--color-text-cyan": ["#334b49", "#cce8e5"],
292
- // Categorical — Gray (pure neutral, C=0). Same T35/T25/T90 pattern from
293
- // the neutral H=291 C=3 ramp.
294
- "--color-background-gray": ["#e2e2e8", "#525257"],
295
- // light: Stone Neutral T90
296
- "--color-border-gray": ["#d4d4da", "#3b3b3f"],
297
- // light: Stone Neutral T85
298
- "--color-icon-gray": ["#46464b", "#e2e2e8"],
299
- // light: Stone Neutral T30
300
- "--color-text-gray": ["#46464b", "#e2e2e8"],
301
- // light: Stone Neutral T30
302
- // Categorical — Green H=142 C=17
303
- "--color-background-green": ["#d0e9ce", "#425841"],
304
- "--color-border-green": ["#c2dbc0", "#2b402b"],
305
- "--color-icon-green": ["#374c36", "#d0e9ce"],
306
- "--color-text-green": ["#374c36", "#d0e9ce"],
307
- // Categorical — Orange H=70 C=22
308
- "--color-background-orange": ["#ffdcbb", "#684d32"],
309
- "--color-border-orange": ["#f1ceae", "#4f361c"],
310
- "--color-icon-orange": ["#5b4227", "#ffdcbb"],
311
- "--color-text-orange": ["#5b4227", "#ffdcbb"],
312
- // Categorical — Pink H=340 C=9
313
- "--color-background-pink": ["#f0dde8", "#5e4e57"],
314
- "--color-border-pink": ["#e2cfda", "#463740"],
315
- "--color-icon-pink": ["#52424c", "#f0dde8"],
316
- "--color-text-pink": ["#52424c", "#f0dde8"],
317
- // Categorical — Purple H=307 C=11
318
- "--color-background-purple": ["#e8dff3", "#564f60"],
319
- "--color-border-purple": ["#d9d1e5", "#3f3949"],
320
- "--color-icon-purple": ["#4b4454", "#e8dff3"],
321
- "--color-text-purple": ["#4b4454", "#e8dff3"],
322
- // Categorical — Red H=33 C=11
323
- "--color-background-red": ["#f9dcd7", "#644d49"],
324
- "--color-border-red": ["#ebcec9", "#4c3633"],
325
- "--color-icon-red": ["#58413e", "#f9dcd7"],
326
- "--color-text-red": ["#58413e", "#f9dcd7"],
327
- // Categorical — Teal H=158 C=9
328
- "--color-background-teal": ["#d4e7dc", "#46564d"],
329
- "--color-border-teal": ["#c6d9ce", "#303f36"],
330
- "--color-icon-teal": ["#3b4a41", "#d4e7dc"],
331
- "--color-text-teal": ["#3b4a41", "#d4e7dc"],
332
- // Categorical — Yellow H=90 C=23
333
- "--color-background-yellow": ["#f4e1b7", "#5e512d"],
334
- "--color-border-yellow": ["#e5d3a9", "#463a18"],
335
- "--color-icon-yellow": ["#524622", "#f4e1b7"],
336
- "--color-text-yellow": ["#524622", "#f4e1b7"],
337
- // =========================================================================
338
- // Radius — clean and subtle
339
- // --radius-none and --radius-full are always fixed and must never be
340
- // scaled by a theme (see defineTheme's radius config docs) — 0 and
341
- // 9999px respectively, matching @astryxdesign/core's own defaults.
342
- // =========================================================================
278
+ // Categorical
279
+ // Light mode pairs pastel stop 90 surfaces with stop 30 foregrounds.
280
+ // Dark mode pairs stop 35 surfaces with stop 90 foregrounds; borders move
281
+ // one step inward in both modes.
282
+ "--color-background-blue": [blue.light[90], blue.dark[35]],
283
+ "--color-border-blue": [blue.light[85], blue.dark[25]],
284
+ "--color-icon-blue": [blue.light[30], blue.dark[90]],
285
+ "--color-text-blue": [blue.light[30], blue.dark[90]],
286
+ "--color-background-cyan": [cyan.light[90], cyan.dark[35]],
287
+ "--color-border-cyan": [cyan.light[85], cyan.dark[25]],
288
+ "--color-icon-cyan": [cyan.light[30], cyan.dark[90]],
289
+ "--color-text-cyan": [cyan.light[30], cyan.dark[90]],
290
+ "--color-background-gray": [neutral.light[90], neutral.dark[35]],
291
+ "--color-border-gray": [neutral.light[85], neutral.dark[25]],
292
+ "--color-icon-gray": [neutral.light[30], neutral.dark[90]],
293
+ "--color-text-gray": [neutral.light[30], neutral.dark[90]],
294
+ "--color-background-green": [green.light[90], green.dark[35]],
295
+ "--color-border-green": [green.light[85], green.dark[25]],
296
+ "--color-icon-green": [green.light[30], green.dark[90]],
297
+ "--color-text-green": [green.light[30], green.dark[90]],
298
+ "--color-background-orange": [orange.light[90], orange.dark[35]],
299
+ "--color-border-orange": [orange.light[85], orange.dark[25]],
300
+ "--color-icon-orange": [orange.light[30], orange.dark[90]],
301
+ "--color-text-orange": [orange.light[30], orange.dark[90]],
302
+ "--color-background-pink": [pink.light[90], pink.dark[35]],
303
+ "--color-border-pink": [pink.light[85], pink.dark[25]],
304
+ "--color-icon-pink": [pink.light[30], pink.dark[90]],
305
+ "--color-text-pink": [pink.light[30], pink.dark[90]],
306
+ "--color-background-purple": [purple.light[90], purple.dark[35]],
307
+ "--color-border-purple": [purple.light[85], purple.dark[25]],
308
+ "--color-icon-purple": [purple.light[30], purple.dark[90]],
309
+ "--color-text-purple": [purple.light[30], purple.dark[90]],
310
+ "--color-background-red": [red.light[90], red.dark[35]],
311
+ "--color-border-red": [red.light[85], red.dark[25]],
312
+ "--color-icon-red": [red.light[30], red.dark[90]],
313
+ "--color-text-red": [red.light[30], red.dark[90]],
314
+ "--color-background-teal": [teal.light[90], teal.dark[35]],
315
+ "--color-border-teal": [teal.light[85], teal.dark[25]],
316
+ "--color-icon-teal": [teal.light[30], teal.dark[90]],
317
+ "--color-text-teal": [teal.light[30], teal.dark[90]],
318
+ "--color-background-yellow": [yellow.light[90], yellow.dark[35]],
319
+ "--color-border-yellow": [yellow.light[85], yellow.dark[25]],
320
+ "--color-icon-yellow": [yellow.light[30], yellow.dark[90]],
321
+ "--color-text-yellow": [yellow.light[30], yellow.dark[90]],
322
+ // Radius
343
323
  "--radius-none": "0px",
344
324
  "--radius-inner": "0.25rem",
345
325
  "--radius-element": "0.5rem",
346
326
  "--radius-container": "0.75rem",
347
327
  "--radius-page": "1.5rem",
348
328
  "--radius-full": "9999px",
349
- // =========================================================================
350
329
  // Shadows
351
- // =========================================================================
352
- "--shadow-low": "0 2px 4px #28282A0D, 0 4px 8px #28282A1A",
353
- "--shadow-med": "0 2px 4px #28282A0D, 0 4px 12px #28282A1A",
354
- "--shadow-high": "0 4px 6px #28282A1A, 0 12px 24px #28282A26",
355
- "--shadow-inset-hover": "inset 0px 0px 0px 2px #28282A30",
356
- "--shadow-inset-selected": "inset 0px 0px 0px 2px #28282A50",
357
- "--shadow-inset-success": "inset 0px 0px 0px 2px #83838a30",
358
- "--shadow-inset-warning": "inset 0px 0px 0px 2px #83838a30",
359
- "--shadow-inset-error": "inset 0px 0px 0px 2px #83838a30"
330
+ "--shadow-low": `0 2px 4px ${withAlpha(neutral.light[15], "0d")}, 0 4px 8px ${withAlpha(neutral.light[15], "1a")}`,
331
+ "--shadow-med": `0 2px 4px ${withAlpha(neutral.light[15], "0d")}, 0 4px 12px ${withAlpha(neutral.light[15], "1a")}`,
332
+ "--shadow-high": `0 4px 6px ${withAlpha(neutral.light[15], "1a")}, 0 12px 24px ${withAlpha(neutral.light[15], "26")}`,
333
+ "--shadow-inset-hover": `inset 0 0 0 2px ${withAlpha(neutral.light[15], "30")}`,
334
+ "--shadow-inset-selected": `inset 0 0 0 2px ${withAlpha(neutral.light[15], "50")}`,
335
+ "--shadow-inset-success": `inset 0 0 0 2px ${withAlpha(neutral.light[55], "30")}`,
336
+ "--shadow-inset-warning": `inset 0 0 0 2px ${withAlpha(neutral.light[55], "30")}`,
337
+ "--shadow-inset-error": `inset 0 0 0 2px ${withAlpha(neutral.light[55], "30")}`
360
338
  },
361
339
  components: {
362
340
  button: {
@@ -369,7 +347,8 @@ var stoneTheme = (0, import_theme.defineTheme)({
369
347
  color: "var(--color-text-red)"
370
348
  }
371
349
  },
372
- // Semantic variants point at categorical hue tokens — single source of truth.
350
+ // Badges, banners, and field status messages share the categorical
351
+ // surfaces and foregrounds so each semantic state has one visual source.
373
352
  badge: {
374
353
  "variant:info": {
375
354
  backgroundColor: "var(--color-background-blue)",
@@ -392,10 +371,8 @@ var stoneTheme = (0, import_theme.defineTheme)({
392
371
  color: "var(--color-text-red)"
393
372
  }
394
373
  },
395
- // StyleX paints the banner surface from @layer priority4 (above
396
- // @layer astryx-theme), so a direct backgroundColor override loses the
397
- // cascade. Redefine the muted token instead so StyleX's var() resolves
398
- // to the categorical bg in our scope.
374
+ // Banner surface declarations live above the theme layer, so redirect the
375
+ // semantic variables here instead of attempting a losing direct fill.
399
376
  banner: {
400
377
  "status:info": {
401
378
  "--color-accent-muted": "var(--color-background-blue)",
@@ -422,45 +399,35 @@ var stoneTheme = (0, import_theme.defineTheme)({
422
399
  "--color-error": "var(--color-text-red)"
423
400
  }
424
401
  },
425
- // Fill: light = T90 (same hex as banner/badge surface — fill reads as
426
- // the same color family as the matching status surface). Dark = T70.
427
- // Hexes from the preview Tonal Palettes ramp. accent (default) +
428
- // indeterminate both route to blue for the in-progress / loading look.
402
+ // Progress fills use the same family as their matching status surface;
403
+ // the darker stop in dark mode keeps the channel visible on dark tracks.
429
404
  "progress-bar-fill": {
430
405
  "variant:accent": {
431
- backgroundColor: "light-dark(#d7e4f5, #a0acbc)"
432
- // Blue T90 / T70
406
+ backgroundColor: lightDark(blue.light[90], blue.dark[70])
433
407
  },
434
408
  "variant:success": {
435
- backgroundColor: "light-dark(#d0e9ce, #9ab298)"
436
- // Green T90 / T70
409
+ backgroundColor: lightDark(green.light[90], green.dark[70])
437
410
  },
438
411
  "variant:warning": {
439
- backgroundColor: "light-dark(#f4e1b7, #bbaa82)"
440
- // Yellow T90 / T70
412
+ backgroundColor: lightDark(yellow.light[90], yellow.dark[70])
441
413
  },
442
414
  "variant:error": {
443
- backgroundColor: "light-dark(#f9dcd7, #c0a5a0)"
444
- // Red T90 / T70
415
+ backgroundColor: lightDark(red.light[90], red.dark[70])
445
416
  }
446
417
  },
447
- // Track default --color-background-muted reads near-body in stone;
448
- // redirect to --color-skeleton so the channel stays visible.
418
+ // The default muted track is too close to Stone's body surface.
449
419
  "progress-bar-track": {
450
420
  base: {
451
421
  backgroundColor: "var(--color-skeleton)"
452
422
  }
453
423
  },
454
- // Switch off-state track reads --color-background-gray by default.
455
- // Redefine it inside the switch scope to --color-skeleton, matching
456
- // the ProgressBar track. The on-state reads --color-accent (unaffected);
457
- // disabled-off also picks up --color-skeleton for consistency.
424
+ // Match the Switch off-state track to the visible ProgressBar track.
458
425
  switch: {
459
426
  base: {
460
427
  "--color-background-gray": "var(--color-skeleton)"
461
428
  }
462
429
  },
463
- // FieldStatus surface matches badge — see badge override above.
430
+ // FieldStatus surfaces match the corresponding badge and banner family.
464
431
  "field-status": {
465
432
  "type:success": {
466
433
  backgroundColor: "var(--color-background-green)"
@@ -472,8 +439,7 @@ var stoneTheme = (0, import_theme.defineTheme)({
472
439
  backgroundColor: "var(--color-background-red)"
473
440
  }
474
441
  },
475
- // Input status borders + icons across all 9 input components share the
476
- // same softer T60/T70 redirection. See INPUT_STATUS_VARS above.
442
+ // Every input status border and icon uses INPUT_STATUS_VARS above.
477
443
  "text-input": INPUT_STATUS_VARS,
478
444
  "text-area": INPUT_STATUS_VARS,
479
445
  "number-input": INPUT_STATUS_VARS,