@sky.ui/mcp 0.0.1 → 0.0.2
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 +191 -182
- package/data/chart-api-sections.json +4184 -4184
- package/data/reactivity-readme-snapshot.json +1 -1
- package/data/theme-authoring-contract.json +598 -598
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +40 -29
- package/dist/catalog.js.map +1 -1
- package/dist/cem.d.ts +1 -1
- package/dist/cem.d.ts.map +1 -1
- package/dist/cem.js +5 -11
- package/dist/cem.js.map +1 -1
- package/dist/docs-read.js +6 -6
- package/dist/docs.js +4 -4
- package/dist/framework-wrappers.d.ts.map +1 -1
- package/dist/framework-wrappers.js +4 -8
- package/dist/framework-wrappers.js.map +1 -1
- package/dist/mcp-runtime-status.js +2 -2
- package/dist/package-resolve.d.ts +10 -0
- package/dist/package-resolve.d.ts.map +1 -0
- package/dist/package-resolve.js +87 -0
- package/dist/package-resolve.js.map +1 -0
- package/dist/reactivity-info.d.ts.map +1 -1
- package/dist/reactivity-info.js +4 -11
- package/dist/reactivity-info.js.map +1 -1
- package/dist/server.js +4 -4
- package/dist/source-read.d.ts.map +1 -1
- package/dist/source-read.js +6 -10
- package/dist/source-read.js.map +1 -1
- package/dist/utils-suggestion-grounding.d.ts.map +1 -1
- package/dist/utils-suggestion-grounding.js +4 -11
- package/dist/utils-suggestion-grounding.js.map +1 -1
- package/docs/agent-recipe-example-site.md +91 -91
- package/docs/ai-design-mcp-blueprint.md +75 -75
- package/docs/cross-model-mcp-playbook.md +127 -127
- package/docs/example-site-and-mcp-training.md +82 -82
- package/docs/mcp-capability-status.md +51 -51
- package/docs/mcp-tooling-roadmap.md +36 -36
- package/docs/sky-chart-option-api.md +47 -47
- package/docs/starter-prompt.md +17 -17
- package/docs/theme-config-guide.md +178 -178
- package/docs/utils-usage-guide.md +112 -110
- package/docs/vue-wrapper-v-model.md +36 -36
- package/package.json +72 -63
|
@@ -1,598 +1,598 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": "1.0",
|
|
3
|
-
"themeProperty": "userTheme",
|
|
4
|
-
"typescriptType": "Partial<import(\"@sky.ui/core/sky-theme-provider\").ThemeConfig> or inline Partial<ThemeConfig>",
|
|
5
|
-
"providerElement": "sky-theme-provider",
|
|
6
|
-
"mergeRules": {
|
|
7
|
-
"strategy": "deepMergePerMode",
|
|
8
|
-
"description": "userTheme.light is deep-merged with defaultTheme.light; userTheme.dark with defaultTheme.dark. Omitted keys keep package defaults. Active mode (light|dark) selects which ThemeModeConfig is expanded into --sky-* variables."
|
|
9
|
-
},
|
|
10
|
-
"agentWorkflow": [
|
|
11
|
-
"1) Parse the user's goals (e.g. brand color, calmer background, dense UI, rounder cards).",
|
|
12
|
-
"2) Map phrases to `fields[].id` using `naturalLanguageHooks` and `intentRouters` below.",
|
|
13
|
-
"3) Build a single JSON object: `{ \"light\": { ...ThemeModeConfig partial }, \"dark\": { ... } }` — only include keys the user changed.",
|
|
14
|
-
"4) Set `userTheme` on `sky-theme-provider` (or pass from `sky-theme-generator` `value` / `theme-change`).",
|
|
15
|
-
"5) Call get_theme with operation variables to list emitted `--sky-*` names; never invent new token names—only `userTheme` values change."
|
|
16
|
-
],
|
|
17
|
-
"fields": [
|
|
18
|
-
{
|
|
19
|
-
"id": "color_background",
|
|
20
|
-
"group": "color",
|
|
21
|
-
"label": "Canvas / app background",
|
|
22
|
-
"summary": "Base page or shell background. Drives the main surface behind content.",
|
|
23
|
-
"paths": { "light": "light.color.background", "dark": "dark.color.background" },
|
|
24
|
-
"naturalLanguageHooks": [
|
|
25
|
-
"background",
|
|
26
|
-
"canvas",
|
|
27
|
-
"page color",
|
|
28
|
-
"app background",
|
|
29
|
-
"whiter",
|
|
30
|
-
"darker backdrop",
|
|
31
|
-
"softer background"
|
|
32
|
-
],
|
|
33
|
-
"valueKind": "css_color",
|
|
34
|
-
"emitsVariables": ["--sky-background-color"],
|
|
35
|
-
"examplePatch": {
|
|
36
|
-
"light": { "color": { "background": "#f4f6f8" } },
|
|
37
|
-
"dark": { "color": { "background": "#0c0e12" } }
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"id": "color_foreground",
|
|
42
|
-
"group": "color",
|
|
43
|
-
"label": "Default text / foreground",
|
|
44
|
-
"summary": "Primary body and UI text color. Many secondary text tokens are mixed from this.",
|
|
45
|
-
"paths": { "light": "light.color.foreground", "dark": "dark.color.foreground" },
|
|
46
|
-
"naturalLanguageHooks": [
|
|
47
|
-
"text color",
|
|
48
|
-
"body text",
|
|
49
|
-
"default text",
|
|
50
|
-
"readability",
|
|
51
|
-
"foreground",
|
|
52
|
-
"primary text"
|
|
53
|
-
],
|
|
54
|
-
"valueKind": "css_color",
|
|
55
|
-
"emitsVariables": ["--sky-text-primary", "--sky-text-secondary" ],
|
|
56
|
-
"examplePatch": {
|
|
57
|
-
"light": { "color": { "foreground": "#0f172a" } },
|
|
58
|
-
"dark": { "color": { "foreground": "#e8eaef" } }
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"id": "color_active",
|
|
63
|
-
"group": "color",
|
|
64
|
-
"label": "Brand / active / primary accent",
|
|
65
|
-
"summary": "Main interactive and brand color: links, primary buttons, focus ring base, active-* semantic scale.",
|
|
66
|
-
"paths": { "light": "light.color.active", "dark": "dark.color.active" },
|
|
67
|
-
"naturalLanguageHooks": [
|
|
68
|
-
"brand",
|
|
69
|
-
"primary",
|
|
70
|
-
"accent",
|
|
71
|
-
"CTA",
|
|
72
|
-
"link color",
|
|
73
|
-
"active color",
|
|
74
|
-
"button color",
|
|
75
|
-
"main color",
|
|
76
|
-
"corporate"
|
|
77
|
-
],
|
|
78
|
-
"valueKind": "css_color",
|
|
79
|
-
"emitsVariables": [
|
|
80
|
-
"--sky-active-primary",
|
|
81
|
-
"--sky-active-*",
|
|
82
|
-
"--sky-focus-ring",
|
|
83
|
-
"--sky-ring-active-*"
|
|
84
|
-
],
|
|
85
|
-
"examplePatch": {
|
|
86
|
-
"light": { "color": { "active": "#0a6cff" } },
|
|
87
|
-
"dark": { "color": { "active": "#4b9aff" } }
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"id": "color_success",
|
|
92
|
-
"group": "color",
|
|
93
|
-
"label": "Success / positive",
|
|
94
|
-
"summary": "Confirms, completed states, safe actions.",
|
|
95
|
-
"paths": { "light": "light.color.success", "dark": "dark.color.success" },
|
|
96
|
-
"naturalLanguageHooks": ["success", "ok", "positive", "green", "completed", "check"],
|
|
97
|
-
"valueKind": "css_color",
|
|
98
|
-
"emitsVariables": ["--sky-success-primary", "--sky-success-*"],
|
|
99
|
-
"examplePatch": {
|
|
100
|
-
"light": { "color": { "success": "#16a34a" } },
|
|
101
|
-
"dark": { "color": { "success": "#4ade80" } }
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
"id": "color_warning",
|
|
106
|
-
"group": "color",
|
|
107
|
-
"label": "Warning / caution",
|
|
108
|
-
"summary": "Non-fatal issues, needs attention without panic.",
|
|
109
|
-
"paths": { "light": "light.color.warning", "dark": "dark.color.warning" },
|
|
110
|
-
"naturalLanguageHooks": ["warning", "caution", "amber", "yellow", "attn"],
|
|
111
|
-
"valueKind": "css_color",
|
|
112
|
-
"emitsVariables": ["--sky-warning-primary", "--sky-warning-*"],
|
|
113
|
-
"examplePatch": {
|
|
114
|
-
"light": { "color": { "warning": "#d97706" } },
|
|
115
|
-
"dark": { "color": { "warning": "#fbbf24" } }
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
"id": "color_danger",
|
|
120
|
-
"group": "color",
|
|
121
|
-
"label": "Danger / destructive / error",
|
|
122
|
-
"summary": "Errors, delete, irreversible or critical actions.",
|
|
123
|
-
"paths": { "light": "light.color.danger", "dark": "dark.color.danger" },
|
|
124
|
-
"naturalLanguageHooks": [
|
|
125
|
-
"danger",
|
|
126
|
-
"error",
|
|
127
|
-
"red",
|
|
128
|
-
"delete",
|
|
129
|
-
"destructive",
|
|
130
|
-
"alert"
|
|
131
|
-
],
|
|
132
|
-
"valueKind": "css_color",
|
|
133
|
-
"emitsVariables": ["--sky-danger-primary", "--sky-danger-*"],
|
|
134
|
-
"examplePatch": {
|
|
135
|
-
"light": { "color": { "danger": "#dc2626" } },
|
|
136
|
-
"dark": { "color": { "danger": "#f87171" } }
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
"id": "color_info",
|
|
141
|
-
"group": "color",
|
|
142
|
-
"label": "Informational accent",
|
|
143
|
-
"summary": "Neutral information emphasis (banners, tips), distinct from brand active.",
|
|
144
|
-
"paths": { "light": "light.color.info", "dark": "dark.color.info" },
|
|
145
|
-
"naturalLanguageHooks": ["info", "tip", "informational", "note", "blue help"],
|
|
146
|
-
"valueKind": "css_color",
|
|
147
|
-
"emitsVariables": ["--sky-info-primary", "--sky-info-*"],
|
|
148
|
-
"examplePatch": {
|
|
149
|
-
"light": { "color": { "info": "#0284c7" } },
|
|
150
|
-
"dark": { "color": { "info": "#38bdf8" } }
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
"id": "glass",
|
|
155
|
-
"group": "surface",
|
|
156
|
-
"label": "Translucent glass / frosted surface",
|
|
157
|
-
"summary": "Frosted panels, chips, floating surfaces: base tint (baseColor), optional explicit secondary/tertiary shades, and opacity steps (primary→solid). Not full-screen modals (see overlay).",
|
|
158
|
-
"pathRoot": { "light": "light.glass", "dark": "dark.glass" },
|
|
159
|
-
"naturalLanguageHooks": [
|
|
160
|
-
"frosted",
|
|
161
|
-
"glass",
|
|
162
|
-
"translucent",
|
|
163
|
-
"card blur",
|
|
164
|
-
"frosted panel",
|
|
165
|
-
"surface tint",
|
|
166
|
-
"frosted UI"
|
|
167
|
-
],
|
|
168
|
-
"valueKind": "glass_config",
|
|
169
|
-
"emitsVariables": [
|
|
170
|
-
"--sky-glass-primary",
|
|
171
|
-
"--sky-glass-secondary",
|
|
172
|
-
"--sky-glass-tertiary",
|
|
173
|
-
"--sky-glass-solid"
|
|
174
|
-
],
|
|
175
|
-
"examplePatch": {
|
|
176
|
-
"light": { "glass": { "baseColor": "#e8ecf2", "opacities": { "primary": 0.5, "secondary": 0.5, "tertiary": 0.5, "solid": 1 } } },
|
|
177
|
-
"dark": { "glass": { "baseColor": "#1a1f2a", "opacities": { "primary": 0.45, "secondary": 0.45, "tertiary": 0.45, "solid": 1 } } }
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
"id": "glass_surface_sheen",
|
|
182
|
-
"group": "surface",
|
|
183
|
-
"label": "Vertical glass sheen (gradient)",
|
|
184
|
-
"summary": "Top/bottom multipliers for large hero or panel `sky-glass-surface` vertical gradient. Optional: omit for flat glass only.",
|
|
185
|
-
"pathRoot": { "light": "light.glassSurface", "dark": "dark.glassSurface" },
|
|
186
|
-
"naturalLanguageHooks": ["gradient surface", "sheen", "hero", "tall panel glass", "glassy header"],
|
|
187
|
-
"valueKind": "object_top_bottom",
|
|
188
|
-
"emitsVariables": ["--sky-glass-surface"],
|
|
189
|
-
"examplePatch": {
|
|
190
|
-
"light": { "glassSurface": { "top": 0.18, "bottom": 0.05 } },
|
|
191
|
-
"dark": { "glassSurface": { "top": 0.2, "bottom": 0.04 } }
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
"id": "glass_hover",
|
|
196
|
-
"group": "surface",
|
|
197
|
-
"label": "Hover wash on surfaces",
|
|
198
|
-
"summary": "A dark/neutral color with opacity ladder for pointer-hover overlays on cards/tiles. Not a replacement for glass base.",
|
|
199
|
-
"pathRoot": { "light": "light.glassHover", "dark": "dark.glassHover" },
|
|
200
|
-
"naturalLanguageHooks": [
|
|
201
|
-
"hover on card",
|
|
202
|
-
"hover states",
|
|
203
|
-
"rollover",
|
|
204
|
-
"button hover wash",
|
|
205
|
-
"darker on hover"
|
|
206
|
-
],
|
|
207
|
-
"valueKind": "hover_overlay_config",
|
|
208
|
-
"emitsVariables": ["--sky-hover-primary", "--sky-hover-secondary", "--sky-hover-tertiary", "--sky-hover-solid"],
|
|
209
|
-
"examplePatch": {
|
|
210
|
-
"light": { "glassHover": { "color": "#000000", "opacity": { "primary": 0.06, "secondary": 0.09, "tertiary": 0.12, "solid": 1 } } }
|
|
211
|
-
}
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
"id": "overlay",
|
|
215
|
-
"group": "overlay",
|
|
216
|
-
"label": "Scrim / modal / sheet backdrop",
|
|
217
|
-
"summary": "Full-screen or pane tint above content. Higher opacity than glass; used for modals, drawers, focus traps.",
|
|
218
|
-
"pathRoot": { "light": "light.overlay", "dark": "dark.overlay" },
|
|
219
|
-
"naturalLanguageHooks": [
|
|
220
|
-
"modal backdrop",
|
|
221
|
-
"overlay",
|
|
222
|
-
"scrim",
|
|
223
|
-
"dim the page",
|
|
224
|
-
"drawer underlay",
|
|
225
|
-
"screen tint"
|
|
226
|
-
],
|
|
227
|
-
"valueKind": "overlay_config",
|
|
228
|
-
"emitsVariables": ["--sky-overlay-primary", "--sky-overlay-*"],
|
|
229
|
-
"examplePatch": {
|
|
230
|
-
"light": { "overlay": { "color": "#0f172a", "opacities": { "primary": 0.55, "secondary": 0.4, "tertiary": 0.2, "solid": 1 } } }
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
"id": "font_sans",
|
|
235
|
-
"group": "typography",
|
|
236
|
-
"label": "Default UI font (sans) stack",
|
|
237
|
-
"summary": "Applies to body and most UI; feeds semantic `sky-text-*` role shorthands.",
|
|
238
|
-
"paths": { "light": "light.fontFamily", "dark": "dark.fontFamily" },
|
|
239
|
-
"naturalLanguageHooks": ["font", "typeface", "sans", "Poppins", "Inter", "system font", "branding type"],
|
|
240
|
-
"valueKind": "font_stack",
|
|
241
|
-
"emitsVariables": ["--sky-font", "--sky-font-sans", "--sky-text-body"],
|
|
242
|
-
"examplePatch": {
|
|
243
|
-
"light": { "fontFamily": "'Inter', 'Segoe UI', system-ui, sans-serif" }
|
|
244
|
-
}
|
|
245
|
-
},
|
|
246
|
-
{
|
|
247
|
-
"id": "font_mono",
|
|
248
|
-
"group": "typography",
|
|
249
|
-
"label": "Monospace / code font stack",
|
|
250
|
-
"summary": "For code, data, and monospace presets (sky-font-mono-*).",
|
|
251
|
-
"paths": { "light": "light.fontFamilyMono", "dark": "dark.fontFamilyMono" },
|
|
252
|
-
"naturalLanguageHooks": [
|
|
253
|
-
"monospace",
|
|
254
|
-
"code font",
|
|
255
|
-
"Fira",
|
|
256
|
-
"JetBrains",
|
|
257
|
-
"terminal"
|
|
258
|
-
],
|
|
259
|
-
"valueKind": "font_stack_optional",
|
|
260
|
-
"emitsVariables": ["--sky-font-mono", "--sky-font-mono-*"],
|
|
261
|
-
"examplePatch": {
|
|
262
|
-
"light": { "fontFamilyMono": "ui-monospace, 'Cascadia Code', monospace" }
|
|
263
|
-
}
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
"id": "font_size_scale",
|
|
267
|
-
"group": "typography",
|
|
268
|
-
"label": "Font size scale (record)",
|
|
269
|
-
"summary": "Map xs, sm, … 6xl to any CSS font-size. Drives `sky-font-size-*` and presets. Override individual keys, not the whole object unless you replace the scale entirely.",
|
|
270
|
-
"pathRoot": { "light": "light.fontSize", "dark": "dark.fontSize" },
|
|
271
|
-
"naturalLanguageHooks": [
|
|
272
|
-
"bigger type",
|
|
273
|
-
"larger text",
|
|
274
|
-
"type scale",
|
|
275
|
-
"heading sizes",
|
|
276
|
-
"compact text",
|
|
277
|
-
"tighter typography"
|
|
278
|
-
],
|
|
279
|
-
"valueKind": "record_font_sizes",
|
|
280
|
-
"emitsVariables": ["--sky-font-size-*", "--sky-text-*"],
|
|
281
|
-
"examplePatch": {
|
|
282
|
-
"light": { "fontSize": { "md": "0.95rem", "lg": "1.125rem" } }
|
|
283
|
-
}
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
"id": "line_height_scale",
|
|
287
|
-
"group": "typography",
|
|
288
|
-
"label": "Line height scale (record)",
|
|
289
|
-
"summary": "Tight, snug, normal, relaxed, loose. Feeds `sky-line-height-*` and role shorthands.",
|
|
290
|
-
"pathRoot": { "light": "light.lineHeight", "dark": "dark.lineHeight" },
|
|
291
|
-
"naturalLanguageHooks": ["tighter lines", "line height", "looser lines", "leading"],
|
|
292
|
-
"valueKind": "record_line_heights",
|
|
293
|
-
"emitsVariables": ["--sky-line-height-*"],
|
|
294
|
-
"examplePatch": {
|
|
295
|
-
"light": { "lineHeight": { "normal": "1.5", "relaxed": "1.65" } }
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
"id": "font_weight_scale",
|
|
300
|
-
"group": "typography",
|
|
301
|
-
"label": "Font weight scale (record)",
|
|
302
|
-
"summary": "Named weights: thin, light, normal, medium, semibold, bold, extrabold. Used in role and preset composition.",
|
|
303
|
-
"pathRoot": { "light": "light.fontWeight", "dark": "dark.fontWeight" },
|
|
304
|
-
"naturalLanguageHooks": ["bolder", "heavier", "light weight", "weight scale"],
|
|
305
|
-
"valueKind": "record_weights",
|
|
306
|
-
"emitsVariables": ["--sky-font-weight-*"],
|
|
307
|
-
"examplePatch": {
|
|
308
|
-
"light": { "fontWeight": { "semibold": "650" } }
|
|
309
|
-
}
|
|
310
|
-
},
|
|
311
|
-
{
|
|
312
|
-
"id": "letter_spacing_scale",
|
|
313
|
-
"group": "typography",
|
|
314
|
-
"label": "Letter spacing (record)",
|
|
315
|
-
"summary": "Tighter, tight, normal, wide, wider – tracking for titles vs body.",
|
|
316
|
-
"pathRoot": { "light": "light.letterSpacing", "dark": "dark.letterSpacing" },
|
|
317
|
-
"naturalLanguageHooks": ["letter spacing", "tracking", "wide text"],
|
|
318
|
-
"valueKind": "record_letter_spacing",
|
|
319
|
-
"emitsVariables": ["--sky-letter-spacing-*"],
|
|
320
|
-
"examplePatch": {
|
|
321
|
-
"light": { "letterSpacing": { "tight": "-0.02em" } }
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
{
|
|
325
|
-
"id": "spacing_scale",
|
|
326
|
-
"group": "density",
|
|
327
|
-
"label": "Spacing / density (record of lengths)",
|
|
328
|
-
"summary": "Numeric scale keys (0, 1, 2, 4, …) become `--sky-space-{key}`; padding and gaps. Reduce values for dense admin UIs; increase for marketing/open layouts.",
|
|
329
|
-
"pathRoot": { "light": "light.spacing", "dark": "dark.spacing" },
|
|
330
|
-
"naturalLanguageHooks": [
|
|
331
|
-
"denser",
|
|
332
|
-
"compact",
|
|
333
|
-
"more padding",
|
|
334
|
-
"tighter layout",
|
|
335
|
-
"gaps",
|
|
336
|
-
"spacing scale",
|
|
337
|
-
"air",
|
|
338
|
-
"more whitespace"
|
|
339
|
-
],
|
|
340
|
-
"valueKind": "record_css_lengths",
|
|
341
|
-
"emitsVariables": ["--sky-space-0", "--sky-space-2" ],
|
|
342
|
-
"examplePatch": {
|
|
343
|
-
"light": { "spacing": { "2": "0.45rem", "3": "0.65rem", "4": "0.9rem" } }
|
|
344
|
-
}
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"id": "radius_scale",
|
|
348
|
-
"group": "shape",
|
|
349
|
-
"label": "Border radius (record)",
|
|
350
|
-
"summary": "primary, secondary, tertiary, full — corners of cards, buttons, inputs, chips.",
|
|
351
|
-
"pathRoot": { "light": "light.radius", "dark": "dark.radius" },
|
|
352
|
-
"naturalLanguageHooks": [
|
|
353
|
-
"rounded",
|
|
354
|
-
"corner",
|
|
355
|
-
"border radius",
|
|
356
|
-
"pill",
|
|
357
|
-
"sharp edges",
|
|
358
|
-
"squared"
|
|
359
|
-
],
|
|
360
|
-
"valueKind": "record_radii",
|
|
361
|
-
"emitsVariables": ["--sky-radius-primary", "--sky-radius-*" ],
|
|
362
|
-
"examplePatch": {
|
|
363
|
-
"light": { "radius": { "primary": "10px", "secondary": "6px" } }
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
{
|
|
367
|
-
"id": "box_shadow",
|
|
368
|
-
"group": "shape",
|
|
369
|
-
"label": "Box shadow (record)",
|
|
370
|
-
"summary": "primary, secondary, tertiary, inset, hover — card elevation, inputs, modals. Values are full CSS box-shadow strings.",
|
|
371
|
-
"pathRoot": { "light": "light.boxshadow", "dark": "dark.boxshadow" },
|
|
372
|
-
"naturalLanguageHooks": ["elevation", "drop shadow", "card shadow", "depth", "skeuomorph"],
|
|
373
|
-
"valueKind": "record_css_shadows",
|
|
374
|
-
"emitsVariables": ["--sky-box-shadow-*"],
|
|
375
|
-
"examplePatch": {
|
|
376
|
-
"light": { "boxshadow": { "primary": "0 1px 3px rgba(15, 23, 42, 0.08)" } }
|
|
377
|
-
}
|
|
378
|
-
},
|
|
379
|
-
{
|
|
380
|
-
"id": "blur",
|
|
381
|
-
"group": "effects",
|
|
382
|
-
"label": "Blur tier (background blur)",
|
|
383
|
-
"summary": "primary, secondary, tertiary; emitted as `blur(value)` in `--sky-blur-*` for glass and backdrop effects.",
|
|
384
|
-
"pathRoot": { "light": "light.blur", "dark": "dark.blur" },
|
|
385
|
-
"naturalLanguageHooks": ["frosted blur", "background blur", "strength of blur", "frosting"],
|
|
386
|
-
"valueKind": "record_length_blur",
|
|
387
|
-
"emitsVariables": ["--sky-blur-primary", "--sky-blur-*" ],
|
|
388
|
-
"examplePatch": {
|
|
389
|
-
"light": { "blur": { "primary": "12px" } }
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
{
|
|
393
|
-
"id": "brightness_tiers",
|
|
394
|
-
"group": "effects",
|
|
395
|
-
"label": "Brightness (image/effect filter tiers)",
|
|
396
|
-
"summary": "CSS `brightness()` multipliers. Often used on media or decorative layers, not raw text colors.",
|
|
397
|
-
"pathRoot": { "light": "light.brightness", "dark": "dark.brightness" },
|
|
398
|
-
"naturalLanguageHooks": ["brighter", "dimmer image", "brightness", "exposure effect"],
|
|
399
|
-
"valueKind": "record_filter",
|
|
400
|
-
"emitsVariables": ["--sky-brightness-primary", "--sky-brightness-*" ],
|
|
401
|
-
"examplePatch": { "light": { "brightness": { "primary": "1" } } }
|
|
402
|
-
},
|
|
403
|
-
{
|
|
404
|
-
"id": "saturation_tiers",
|
|
405
|
-
"group": "effects",
|
|
406
|
-
"label": "Saturation (filter tiers)",
|
|
407
|
-
"summary": "CSS `saturate()`; decorative or hero imagery, not for semantic status colors (use `color.*` instead).",
|
|
408
|
-
"pathRoot": { "light": "light.saturation", "dark": "dark.saturation" },
|
|
409
|
-
"naturalLanguageHooks": [
|
|
410
|
-
"more vibrant",
|
|
411
|
-
"vivid",
|
|
412
|
-
"desaturate",
|
|
413
|
-
"saturation effect"
|
|
414
|
-
],
|
|
415
|
-
"valueKind": "record_filter",
|
|
416
|
-
"emitsVariables": ["--sky-saturation-primary", "--sky-saturation-*" ],
|
|
417
|
-
"examplePatch": { "light": { "saturation": { "primary": "1" } } }
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
"id": "border_tiers",
|
|
421
|
-
"group": "shape",
|
|
422
|
-
"label": "Border (full CSS value, record)",
|
|
423
|
-
"summary": "primary, secondary, tertiary — each value is a complete `border` shorthand for strokes around surfaces and controls.",
|
|
424
|
-
"pathRoot": { "light": "light.border", "dark": "dark.border" },
|
|
425
|
-
"naturalLanguageHooks": [
|
|
426
|
-
"border style",
|
|
427
|
-
"outlines",
|
|
428
|
-
"hairline",
|
|
429
|
-
"stroke on cards"
|
|
430
|
-
],
|
|
431
|
-
"valueKind": "record_css_border",
|
|
432
|
-
"emitsVariables": ["--sky-border-primary", "--sky-border-*" ],
|
|
433
|
-
"examplePatch": {
|
|
434
|
-
"light": { "border": { "primary": "1px solid color-mix(in oklch, #0f172a 15%, transparent)" } }
|
|
435
|
-
}
|
|
436
|
-
},
|
|
437
|
-
{
|
|
438
|
-
"id": "separator",
|
|
439
|
-
"group": "shape",
|
|
440
|
-
"label": "Divider / list separator (hairline)",
|
|
441
|
-
"summary": "One color; feeds `--sky-border-light` (solid RGBA) for 1px separators between list rows or section breaks.",
|
|
442
|
-
"paths": { "light": "light.separator", "dark": "dark.separator" },
|
|
443
|
-
"naturalLanguageHooks": [
|
|
444
|
-
"divider",
|
|
445
|
-
"separator",
|
|
446
|
-
"list line",
|
|
447
|
-
"row divider"
|
|
448
|
-
],
|
|
449
|
-
"valueKind": "css_color",
|
|
450
|
-
"emitsVariables": ["--sky-border-light"],
|
|
451
|
-
"examplePatch": {
|
|
452
|
-
"light": { "separator": "rgba(15, 23, 42, 0.12)" },
|
|
453
|
-
"dark": { "separator": "rgba(255, 255, 255, 0.1)" }
|
|
454
|
-
}
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
"id": "motion",
|
|
458
|
-
"group": "motion",
|
|
459
|
-
"label": "Durations and easing (object)",
|
|
460
|
-
"summary": "motion.duration: instant, fast, normal, slow. motion.ease: default, in, out, inOut, bounce. Drives `sky-transition-*` and duration/ease tokens.",
|
|
461
|
-
"pathRoot": { "light": "light.motion", "dark": "dark.motion" },
|
|
462
|
-
"naturalLanguageHooks": [
|
|
463
|
-
"animation speed",
|
|
464
|
-
"snappier",
|
|
465
|
-
"faster transition",
|
|
466
|
-
"easing",
|
|
467
|
-
"motion"
|
|
468
|
-
],
|
|
469
|
-
"valueKind": "motion_config",
|
|
470
|
-
"emitsVariables": [
|
|
471
|
-
"--sky-duration-*",
|
|
472
|
-
"--sky-ease-*",
|
|
473
|
-
"--sky-transition-default"
|
|
474
|
-
],
|
|
475
|
-
"examplePatch": {
|
|
476
|
-
"light": { "motion": { "duration": { "fast": "100ms" }, "ease": { "default": "cubic-bezier(0.2,0,0,1)" } } }
|
|
477
|
-
}
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
"id": "z_index",
|
|
481
|
-
"group": "stacking",
|
|
482
|
-
"label": "Z-index scale (stacking order)",
|
|
483
|
-
"summary": "Named levels: base, dropdown, sticky, fixed, modal, popover, toast, max. Emitted as unitless `sky-z-*` numbers (not arbitrary z-index in components).",
|
|
484
|
-
"pathRoot": { "light": "light.zIndex", "dark": "dark.zIndex" },
|
|
485
|
-
"naturalLanguageHooks": [
|
|
486
|
-
"modal on top",
|
|
487
|
-
"dropdown layer",
|
|
488
|
-
"tooltip above",
|
|
489
|
-
"z-index"
|
|
490
|
-
],
|
|
491
|
-
"valueKind": "record_integers",
|
|
492
|
-
"emitsVariables": ["--sky-z-base", "--sky-z-modal" ],
|
|
493
|
-
"examplePatch": {
|
|
494
|
-
"light": { "zIndex": { "modal": 10000, "popover": 10050 } }
|
|
495
|
-
}
|
|
496
|
-
},
|
|
497
|
-
{
|
|
498
|
-
"id": "opacity_ui",
|
|
499
|
-
"group": "opacity",
|
|
500
|
-
"label": "UI opacity (disabled, muted, subtle)",
|
|
501
|
-
"summary": "0–1 multipliers for disabled controls and de-emphasized text or icons — not the same as glass/overlay opacities.",
|
|
502
|
-
"pathRoot": { "light": "light.opacity", "dark": "dark.opacity" },
|
|
503
|
-
"naturalLanguageHooks": [
|
|
504
|
-
"disabled look",
|
|
505
|
-
"faded",
|
|
506
|
-
"muted",
|
|
507
|
-
"subtle opacity"
|
|
508
|
-
],
|
|
509
|
-
"valueKind": "record_0_1",
|
|
510
|
-
"emitsVariables": ["--sky-opacity-disabled", "--sky-opacity-*" ],
|
|
511
|
-
"examplePatch": { "light": { "opacity": { "disabled": 0.4, "muted": 0.6 } } }
|
|
512
|
-
}
|
|
513
|
-
],
|
|
514
|
-
"recipeTemplates": [
|
|
515
|
-
{
|
|
516
|
-
"id": "brand_rollup",
|
|
517
|
-
"intent": "User gives one brand hex for both light and dark primary accent.",
|
|
518
|
-
"placeholderKeys": ["primaryHex", "lightPrimaryHex", "darkPrimaryHex"],
|
|
519
|
-
"patchTemplate": {
|
|
520
|
-
"light": { "color": { "active": "<lightPrimaryHex or primaryHex>" } },
|
|
521
|
-
"dark": { "color": { "active": "<darkPrimaryHex or primaryHex>" } }
|
|
522
|
-
}
|
|
523
|
-
},
|
|
524
|
-
{
|
|
525
|
-
"id": "calm_surface",
|
|
526
|
-
"intent": "Softer glass + lighter overlay for less harsh surfaces.",
|
|
527
|
-
"placeholderKeys": [],
|
|
528
|
-
"patchTemplate": {
|
|
529
|
-
"light": { "glass": { "opacities": { "primary": 0.38, "secondary": 0.38, "tertiary": 0.38, "solid": 1 } } },
|
|
530
|
-
"dark": { "overlay": { "opacities": { "primary": 0.45, "secondary": 0.3, "tertiary": 0.15, "solid": 1 } } }
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
],
|
|
534
|
-
"intentRouters": [
|
|
535
|
-
{
|
|
536
|
-
"phrases": [
|
|
537
|
-
"more padding",
|
|
538
|
-
"wider",
|
|
539
|
-
"airy",
|
|
540
|
-
"breathe",
|
|
541
|
-
"looser layout",
|
|
542
|
-
"more space between"
|
|
543
|
-
],
|
|
544
|
-
"fieldIds": ["spacing_scale"],
|
|
545
|
-
"agentHint": "Increase selected keys in `light.spacing` and `dark.spacing` (e.g. 2,3,4) a few points or rem steps."
|
|
546
|
-
},
|
|
547
|
-
{
|
|
548
|
-
"phrases": [
|
|
549
|
-
"tighter",
|
|
550
|
-
"denser",
|
|
551
|
-
"data-dense",
|
|
552
|
-
"compact",
|
|
553
|
-
"admin"
|
|
554
|
-
],
|
|
555
|
-
"fieldIds": ["spacing_scale", "font_size_scale", "line_height_scale"],
|
|
556
|
-
"agentHint": "Slightly lower spacing and optionally fontSize.md/lg; ensure contrast still holds."
|
|
557
|
-
},
|
|
558
|
-
{
|
|
559
|
-
"phrases": [
|
|
560
|
-
"frosted",
|
|
561
|
-
"frosting",
|
|
562
|
-
"frosted glass"
|
|
563
|
-
],
|
|
564
|
-
"fieldIds": ["glass", "glass_surface_sheen", "blur"],
|
|
565
|
-
"agentHint": "Tune `glass` base and opacities; optionally `glassSurface` top/bottom; align `blur` tiers for backdrop strength."
|
|
566
|
-
},
|
|
567
|
-
{
|
|
568
|
-
"phrases": [
|
|
569
|
-
"modals",
|
|
570
|
-
"backdrop",
|
|
571
|
-
"scrim"
|
|
572
|
-
],
|
|
573
|
-
"fieldIds": ["overlay", "z_index", "box_shadow"],
|
|
574
|
-
"agentHint": "Prefer `overlay` for full-screen tints; raise `zIndex.modal` if things stack wrong."
|
|
575
|
-
},
|
|
576
|
-
{
|
|
577
|
-
"phrases": [
|
|
578
|
-
"on-hover",
|
|
579
|
-
"on hover"
|
|
580
|
-
],
|
|
581
|
-
"fieldIds": ["glass_hover", "motion", "box_shadow"],
|
|
582
|
-
"agentHint": "Adjust `glassHover` opacity; motion duration for snappy feel."
|
|
583
|
-
},
|
|
584
|
-
{
|
|
585
|
-
"phrases": [
|
|
586
|
-
"rebrand",
|
|
587
|
-
"brand",
|
|
588
|
-
"company color"
|
|
589
|
-
],
|
|
590
|
-
"fieldIds": [
|
|
591
|
-
"color_active",
|
|
592
|
-
"color_background",
|
|
593
|
-
"color_foreground"
|
|
594
|
-
],
|
|
595
|
-
"agentHint": "Set `active` to brand; nudge `background`/`foreground` for contrast. Keep success/warn/danger unless the brand also replaces them."
|
|
596
|
-
}
|
|
597
|
-
]
|
|
598
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0",
|
|
3
|
+
"themeProperty": "userTheme",
|
|
4
|
+
"typescriptType": "Partial<import(\"@sky.ui/core/sky-theme-provider\").ThemeConfig> or inline Partial<ThemeConfig>",
|
|
5
|
+
"providerElement": "sky-theme-provider",
|
|
6
|
+
"mergeRules": {
|
|
7
|
+
"strategy": "deepMergePerMode",
|
|
8
|
+
"description": "userTheme.light is deep-merged with defaultTheme.light; userTheme.dark with defaultTheme.dark. Omitted keys keep package defaults. Active mode (light|dark) selects which ThemeModeConfig is expanded into --sky-* variables."
|
|
9
|
+
},
|
|
10
|
+
"agentWorkflow": [
|
|
11
|
+
"1) Parse the user's goals (e.g. brand color, calmer background, dense UI, rounder cards).",
|
|
12
|
+
"2) Map phrases to `fields[].id` using `naturalLanguageHooks` and `intentRouters` below.",
|
|
13
|
+
"3) Build a single JSON object: `{ \"light\": { ...ThemeModeConfig partial }, \"dark\": { ... } }` — only include keys the user changed.",
|
|
14
|
+
"4) Set `userTheme` on `sky-theme-provider` (or pass from `sky-theme-generator` `value` / `theme-change`).",
|
|
15
|
+
"5) Call get_theme with operation variables to list emitted `--sky-*` names; never invent new token names—only `userTheme` values change."
|
|
16
|
+
],
|
|
17
|
+
"fields": [
|
|
18
|
+
{
|
|
19
|
+
"id": "color_background",
|
|
20
|
+
"group": "color",
|
|
21
|
+
"label": "Canvas / app background",
|
|
22
|
+
"summary": "Base page or shell background. Drives the main surface behind content.",
|
|
23
|
+
"paths": { "light": "light.color.background", "dark": "dark.color.background" },
|
|
24
|
+
"naturalLanguageHooks": [
|
|
25
|
+
"background",
|
|
26
|
+
"canvas",
|
|
27
|
+
"page color",
|
|
28
|
+
"app background",
|
|
29
|
+
"whiter",
|
|
30
|
+
"darker backdrop",
|
|
31
|
+
"softer background"
|
|
32
|
+
],
|
|
33
|
+
"valueKind": "css_color",
|
|
34
|
+
"emitsVariables": ["--sky-background-color"],
|
|
35
|
+
"examplePatch": {
|
|
36
|
+
"light": { "color": { "background": "#f4f6f8" } },
|
|
37
|
+
"dark": { "color": { "background": "#0c0e12" } }
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "color_foreground",
|
|
42
|
+
"group": "color",
|
|
43
|
+
"label": "Default text / foreground",
|
|
44
|
+
"summary": "Primary body and UI text color. Many secondary text tokens are mixed from this.",
|
|
45
|
+
"paths": { "light": "light.color.foreground", "dark": "dark.color.foreground" },
|
|
46
|
+
"naturalLanguageHooks": [
|
|
47
|
+
"text color",
|
|
48
|
+
"body text",
|
|
49
|
+
"default text",
|
|
50
|
+
"readability",
|
|
51
|
+
"foreground",
|
|
52
|
+
"primary text"
|
|
53
|
+
],
|
|
54
|
+
"valueKind": "css_color",
|
|
55
|
+
"emitsVariables": ["--sky-text-primary", "--sky-text-secondary" ],
|
|
56
|
+
"examplePatch": {
|
|
57
|
+
"light": { "color": { "foreground": "#0f172a" } },
|
|
58
|
+
"dark": { "color": { "foreground": "#e8eaef" } }
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "color_active",
|
|
63
|
+
"group": "color",
|
|
64
|
+
"label": "Brand / active / primary accent",
|
|
65
|
+
"summary": "Main interactive and brand color: links, primary buttons, focus ring base, active-* semantic scale.",
|
|
66
|
+
"paths": { "light": "light.color.active", "dark": "dark.color.active" },
|
|
67
|
+
"naturalLanguageHooks": [
|
|
68
|
+
"brand",
|
|
69
|
+
"primary",
|
|
70
|
+
"accent",
|
|
71
|
+
"CTA",
|
|
72
|
+
"link color",
|
|
73
|
+
"active color",
|
|
74
|
+
"button color",
|
|
75
|
+
"main color",
|
|
76
|
+
"corporate"
|
|
77
|
+
],
|
|
78
|
+
"valueKind": "css_color",
|
|
79
|
+
"emitsVariables": [
|
|
80
|
+
"--sky-active-primary",
|
|
81
|
+
"--sky-active-*",
|
|
82
|
+
"--sky-focus-ring",
|
|
83
|
+
"--sky-ring-active-*"
|
|
84
|
+
],
|
|
85
|
+
"examplePatch": {
|
|
86
|
+
"light": { "color": { "active": "#0a6cff" } },
|
|
87
|
+
"dark": { "color": { "active": "#4b9aff" } }
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "color_success",
|
|
92
|
+
"group": "color",
|
|
93
|
+
"label": "Success / positive",
|
|
94
|
+
"summary": "Confirms, completed states, safe actions.",
|
|
95
|
+
"paths": { "light": "light.color.success", "dark": "dark.color.success" },
|
|
96
|
+
"naturalLanguageHooks": ["success", "ok", "positive", "green", "completed", "check"],
|
|
97
|
+
"valueKind": "css_color",
|
|
98
|
+
"emitsVariables": ["--sky-success-primary", "--sky-success-*"],
|
|
99
|
+
"examplePatch": {
|
|
100
|
+
"light": { "color": { "success": "#16a34a" } },
|
|
101
|
+
"dark": { "color": { "success": "#4ade80" } }
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "color_warning",
|
|
106
|
+
"group": "color",
|
|
107
|
+
"label": "Warning / caution",
|
|
108
|
+
"summary": "Non-fatal issues, needs attention without panic.",
|
|
109
|
+
"paths": { "light": "light.color.warning", "dark": "dark.color.warning" },
|
|
110
|
+
"naturalLanguageHooks": ["warning", "caution", "amber", "yellow", "attn"],
|
|
111
|
+
"valueKind": "css_color",
|
|
112
|
+
"emitsVariables": ["--sky-warning-primary", "--sky-warning-*"],
|
|
113
|
+
"examplePatch": {
|
|
114
|
+
"light": { "color": { "warning": "#d97706" } },
|
|
115
|
+
"dark": { "color": { "warning": "#fbbf24" } }
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "color_danger",
|
|
120
|
+
"group": "color",
|
|
121
|
+
"label": "Danger / destructive / error",
|
|
122
|
+
"summary": "Errors, delete, irreversible or critical actions.",
|
|
123
|
+
"paths": { "light": "light.color.danger", "dark": "dark.color.danger" },
|
|
124
|
+
"naturalLanguageHooks": [
|
|
125
|
+
"danger",
|
|
126
|
+
"error",
|
|
127
|
+
"red",
|
|
128
|
+
"delete",
|
|
129
|
+
"destructive",
|
|
130
|
+
"alert"
|
|
131
|
+
],
|
|
132
|
+
"valueKind": "css_color",
|
|
133
|
+
"emitsVariables": ["--sky-danger-primary", "--sky-danger-*"],
|
|
134
|
+
"examplePatch": {
|
|
135
|
+
"light": { "color": { "danger": "#dc2626" } },
|
|
136
|
+
"dark": { "color": { "danger": "#f87171" } }
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "color_info",
|
|
141
|
+
"group": "color",
|
|
142
|
+
"label": "Informational accent",
|
|
143
|
+
"summary": "Neutral information emphasis (banners, tips), distinct from brand active.",
|
|
144
|
+
"paths": { "light": "light.color.info", "dark": "dark.color.info" },
|
|
145
|
+
"naturalLanguageHooks": ["info", "tip", "informational", "note", "blue help"],
|
|
146
|
+
"valueKind": "css_color",
|
|
147
|
+
"emitsVariables": ["--sky-info-primary", "--sky-info-*"],
|
|
148
|
+
"examplePatch": {
|
|
149
|
+
"light": { "color": { "info": "#0284c7" } },
|
|
150
|
+
"dark": { "color": { "info": "#38bdf8" } }
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "glass",
|
|
155
|
+
"group": "surface",
|
|
156
|
+
"label": "Translucent glass / frosted surface",
|
|
157
|
+
"summary": "Frosted panels, chips, floating surfaces: base tint (baseColor), optional explicit secondary/tertiary shades, and opacity steps (primary→solid). Not full-screen modals (see overlay).",
|
|
158
|
+
"pathRoot": { "light": "light.glass", "dark": "dark.glass" },
|
|
159
|
+
"naturalLanguageHooks": [
|
|
160
|
+
"frosted",
|
|
161
|
+
"glass",
|
|
162
|
+
"translucent",
|
|
163
|
+
"card blur",
|
|
164
|
+
"frosted panel",
|
|
165
|
+
"surface tint",
|
|
166
|
+
"frosted UI"
|
|
167
|
+
],
|
|
168
|
+
"valueKind": "glass_config",
|
|
169
|
+
"emitsVariables": [
|
|
170
|
+
"--sky-glass-primary",
|
|
171
|
+
"--sky-glass-secondary",
|
|
172
|
+
"--sky-glass-tertiary",
|
|
173
|
+
"--sky-glass-solid"
|
|
174
|
+
],
|
|
175
|
+
"examplePatch": {
|
|
176
|
+
"light": { "glass": { "baseColor": "#e8ecf2", "opacities": { "primary": 0.5, "secondary": 0.5, "tertiary": 0.5, "solid": 1 } } },
|
|
177
|
+
"dark": { "glass": { "baseColor": "#1a1f2a", "opacities": { "primary": 0.45, "secondary": 0.45, "tertiary": 0.45, "solid": 1 } } }
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "glass_surface_sheen",
|
|
182
|
+
"group": "surface",
|
|
183
|
+
"label": "Vertical glass sheen (gradient)",
|
|
184
|
+
"summary": "Top/bottom multipliers for large hero or panel `sky-glass-surface` vertical gradient. Optional: omit for flat glass only.",
|
|
185
|
+
"pathRoot": { "light": "light.glassSurface", "dark": "dark.glassSurface" },
|
|
186
|
+
"naturalLanguageHooks": ["gradient surface", "sheen", "hero", "tall panel glass", "glassy header"],
|
|
187
|
+
"valueKind": "object_top_bottom",
|
|
188
|
+
"emitsVariables": ["--sky-glass-surface"],
|
|
189
|
+
"examplePatch": {
|
|
190
|
+
"light": { "glassSurface": { "top": 0.18, "bottom": 0.05 } },
|
|
191
|
+
"dark": { "glassSurface": { "top": 0.2, "bottom": 0.04 } }
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"id": "glass_hover",
|
|
196
|
+
"group": "surface",
|
|
197
|
+
"label": "Hover wash on surfaces",
|
|
198
|
+
"summary": "A dark/neutral color with opacity ladder for pointer-hover overlays on cards/tiles. Not a replacement for glass base.",
|
|
199
|
+
"pathRoot": { "light": "light.glassHover", "dark": "dark.glassHover" },
|
|
200
|
+
"naturalLanguageHooks": [
|
|
201
|
+
"hover on card",
|
|
202
|
+
"hover states",
|
|
203
|
+
"rollover",
|
|
204
|
+
"button hover wash",
|
|
205
|
+
"darker on hover"
|
|
206
|
+
],
|
|
207
|
+
"valueKind": "hover_overlay_config",
|
|
208
|
+
"emitsVariables": ["--sky-hover-primary", "--sky-hover-secondary", "--sky-hover-tertiary", "--sky-hover-solid"],
|
|
209
|
+
"examplePatch": {
|
|
210
|
+
"light": { "glassHover": { "color": "#000000", "opacity": { "primary": 0.06, "secondary": 0.09, "tertiary": 0.12, "solid": 1 } } }
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "overlay",
|
|
215
|
+
"group": "overlay",
|
|
216
|
+
"label": "Scrim / modal / sheet backdrop",
|
|
217
|
+
"summary": "Full-screen or pane tint above content. Higher opacity than glass; used for modals, drawers, focus traps.",
|
|
218
|
+
"pathRoot": { "light": "light.overlay", "dark": "dark.overlay" },
|
|
219
|
+
"naturalLanguageHooks": [
|
|
220
|
+
"modal backdrop",
|
|
221
|
+
"overlay",
|
|
222
|
+
"scrim",
|
|
223
|
+
"dim the page",
|
|
224
|
+
"drawer underlay",
|
|
225
|
+
"screen tint"
|
|
226
|
+
],
|
|
227
|
+
"valueKind": "overlay_config",
|
|
228
|
+
"emitsVariables": ["--sky-overlay-primary", "--sky-overlay-*"],
|
|
229
|
+
"examplePatch": {
|
|
230
|
+
"light": { "overlay": { "color": "#0f172a", "opacities": { "primary": 0.55, "secondary": 0.4, "tertiary": 0.2, "solid": 1 } } }
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"id": "font_sans",
|
|
235
|
+
"group": "typography",
|
|
236
|
+
"label": "Default UI font (sans) stack",
|
|
237
|
+
"summary": "Applies to body and most UI; feeds semantic `sky-text-*` role shorthands.",
|
|
238
|
+
"paths": { "light": "light.fontFamily", "dark": "dark.fontFamily" },
|
|
239
|
+
"naturalLanguageHooks": ["font", "typeface", "sans", "Poppins", "Inter", "system font", "branding type"],
|
|
240
|
+
"valueKind": "font_stack",
|
|
241
|
+
"emitsVariables": ["--sky-font", "--sky-font-sans", "--sky-text-body"],
|
|
242
|
+
"examplePatch": {
|
|
243
|
+
"light": { "fontFamily": "'Inter', 'Segoe UI', system-ui, sans-serif" }
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "font_mono",
|
|
248
|
+
"group": "typography",
|
|
249
|
+
"label": "Monospace / code font stack",
|
|
250
|
+
"summary": "For code, data, and monospace presets (sky-font-mono-*).",
|
|
251
|
+
"paths": { "light": "light.fontFamilyMono", "dark": "dark.fontFamilyMono" },
|
|
252
|
+
"naturalLanguageHooks": [
|
|
253
|
+
"monospace",
|
|
254
|
+
"code font",
|
|
255
|
+
"Fira",
|
|
256
|
+
"JetBrains",
|
|
257
|
+
"terminal"
|
|
258
|
+
],
|
|
259
|
+
"valueKind": "font_stack_optional",
|
|
260
|
+
"emitsVariables": ["--sky-font-mono", "--sky-font-mono-*"],
|
|
261
|
+
"examplePatch": {
|
|
262
|
+
"light": { "fontFamilyMono": "ui-monospace, 'Cascadia Code', monospace" }
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"id": "font_size_scale",
|
|
267
|
+
"group": "typography",
|
|
268
|
+
"label": "Font size scale (record)",
|
|
269
|
+
"summary": "Map xs, sm, … 6xl to any CSS font-size. Drives `sky-font-size-*` and presets. Override individual keys, not the whole object unless you replace the scale entirely.",
|
|
270
|
+
"pathRoot": { "light": "light.fontSize", "dark": "dark.fontSize" },
|
|
271
|
+
"naturalLanguageHooks": [
|
|
272
|
+
"bigger type",
|
|
273
|
+
"larger text",
|
|
274
|
+
"type scale",
|
|
275
|
+
"heading sizes",
|
|
276
|
+
"compact text",
|
|
277
|
+
"tighter typography"
|
|
278
|
+
],
|
|
279
|
+
"valueKind": "record_font_sizes",
|
|
280
|
+
"emitsVariables": ["--sky-font-size-*", "--sky-text-*"],
|
|
281
|
+
"examplePatch": {
|
|
282
|
+
"light": { "fontSize": { "md": "0.95rem", "lg": "1.125rem" } }
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"id": "line_height_scale",
|
|
287
|
+
"group": "typography",
|
|
288
|
+
"label": "Line height scale (record)",
|
|
289
|
+
"summary": "Tight, snug, normal, relaxed, loose. Feeds `sky-line-height-*` and role shorthands.",
|
|
290
|
+
"pathRoot": { "light": "light.lineHeight", "dark": "dark.lineHeight" },
|
|
291
|
+
"naturalLanguageHooks": ["tighter lines", "line height", "looser lines", "leading"],
|
|
292
|
+
"valueKind": "record_line_heights",
|
|
293
|
+
"emitsVariables": ["--sky-line-height-*"],
|
|
294
|
+
"examplePatch": {
|
|
295
|
+
"light": { "lineHeight": { "normal": "1.5", "relaxed": "1.65" } }
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"id": "font_weight_scale",
|
|
300
|
+
"group": "typography",
|
|
301
|
+
"label": "Font weight scale (record)",
|
|
302
|
+
"summary": "Named weights: thin, light, normal, medium, semibold, bold, extrabold. Used in role and preset composition.",
|
|
303
|
+
"pathRoot": { "light": "light.fontWeight", "dark": "dark.fontWeight" },
|
|
304
|
+
"naturalLanguageHooks": ["bolder", "heavier", "light weight", "weight scale"],
|
|
305
|
+
"valueKind": "record_weights",
|
|
306
|
+
"emitsVariables": ["--sky-font-weight-*"],
|
|
307
|
+
"examplePatch": {
|
|
308
|
+
"light": { "fontWeight": { "semibold": "650" } }
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"id": "letter_spacing_scale",
|
|
313
|
+
"group": "typography",
|
|
314
|
+
"label": "Letter spacing (record)",
|
|
315
|
+
"summary": "Tighter, tight, normal, wide, wider – tracking for titles vs body.",
|
|
316
|
+
"pathRoot": { "light": "light.letterSpacing", "dark": "dark.letterSpacing" },
|
|
317
|
+
"naturalLanguageHooks": ["letter spacing", "tracking", "wide text"],
|
|
318
|
+
"valueKind": "record_letter_spacing",
|
|
319
|
+
"emitsVariables": ["--sky-letter-spacing-*"],
|
|
320
|
+
"examplePatch": {
|
|
321
|
+
"light": { "letterSpacing": { "tight": "-0.02em" } }
|
|
322
|
+
}
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"id": "spacing_scale",
|
|
326
|
+
"group": "density",
|
|
327
|
+
"label": "Spacing / density (record of lengths)",
|
|
328
|
+
"summary": "Numeric scale keys (0, 1, 2, 4, …) become `--sky-space-{key}`; padding and gaps. Reduce values for dense admin UIs; increase for marketing/open layouts.",
|
|
329
|
+
"pathRoot": { "light": "light.spacing", "dark": "dark.spacing" },
|
|
330
|
+
"naturalLanguageHooks": [
|
|
331
|
+
"denser",
|
|
332
|
+
"compact",
|
|
333
|
+
"more padding",
|
|
334
|
+
"tighter layout",
|
|
335
|
+
"gaps",
|
|
336
|
+
"spacing scale",
|
|
337
|
+
"air",
|
|
338
|
+
"more whitespace"
|
|
339
|
+
],
|
|
340
|
+
"valueKind": "record_css_lengths",
|
|
341
|
+
"emitsVariables": ["--sky-space-0", "--sky-space-2" ],
|
|
342
|
+
"examplePatch": {
|
|
343
|
+
"light": { "spacing": { "2": "0.45rem", "3": "0.65rem", "4": "0.9rem" } }
|
|
344
|
+
}
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"id": "radius_scale",
|
|
348
|
+
"group": "shape",
|
|
349
|
+
"label": "Border radius (record)",
|
|
350
|
+
"summary": "primary, secondary, tertiary, full — corners of cards, buttons, inputs, chips.",
|
|
351
|
+
"pathRoot": { "light": "light.radius", "dark": "dark.radius" },
|
|
352
|
+
"naturalLanguageHooks": [
|
|
353
|
+
"rounded",
|
|
354
|
+
"corner",
|
|
355
|
+
"border radius",
|
|
356
|
+
"pill",
|
|
357
|
+
"sharp edges",
|
|
358
|
+
"squared"
|
|
359
|
+
],
|
|
360
|
+
"valueKind": "record_radii",
|
|
361
|
+
"emitsVariables": ["--sky-radius-primary", "--sky-radius-*" ],
|
|
362
|
+
"examplePatch": {
|
|
363
|
+
"light": { "radius": { "primary": "10px", "secondary": "6px" } }
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"id": "box_shadow",
|
|
368
|
+
"group": "shape",
|
|
369
|
+
"label": "Box shadow (record)",
|
|
370
|
+
"summary": "primary, secondary, tertiary, inset, hover — card elevation, inputs, modals. Values are full CSS box-shadow strings.",
|
|
371
|
+
"pathRoot": { "light": "light.boxshadow", "dark": "dark.boxshadow" },
|
|
372
|
+
"naturalLanguageHooks": ["elevation", "drop shadow", "card shadow", "depth", "skeuomorph"],
|
|
373
|
+
"valueKind": "record_css_shadows",
|
|
374
|
+
"emitsVariables": ["--sky-box-shadow-*"],
|
|
375
|
+
"examplePatch": {
|
|
376
|
+
"light": { "boxshadow": { "primary": "0 1px 3px rgba(15, 23, 42, 0.08)" } }
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"id": "blur",
|
|
381
|
+
"group": "effects",
|
|
382
|
+
"label": "Blur tier (background blur)",
|
|
383
|
+
"summary": "primary, secondary, tertiary; emitted as `blur(value)` in `--sky-blur-*` for glass and backdrop effects.",
|
|
384
|
+
"pathRoot": { "light": "light.blur", "dark": "dark.blur" },
|
|
385
|
+
"naturalLanguageHooks": ["frosted blur", "background blur", "strength of blur", "frosting"],
|
|
386
|
+
"valueKind": "record_length_blur",
|
|
387
|
+
"emitsVariables": ["--sky-blur-primary", "--sky-blur-*" ],
|
|
388
|
+
"examplePatch": {
|
|
389
|
+
"light": { "blur": { "primary": "12px" } }
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"id": "brightness_tiers",
|
|
394
|
+
"group": "effects",
|
|
395
|
+
"label": "Brightness (image/effect filter tiers)",
|
|
396
|
+
"summary": "CSS `brightness()` multipliers. Often used on media or decorative layers, not raw text colors.",
|
|
397
|
+
"pathRoot": { "light": "light.brightness", "dark": "dark.brightness" },
|
|
398
|
+
"naturalLanguageHooks": ["brighter", "dimmer image", "brightness", "exposure effect"],
|
|
399
|
+
"valueKind": "record_filter",
|
|
400
|
+
"emitsVariables": ["--sky-brightness-primary", "--sky-brightness-*" ],
|
|
401
|
+
"examplePatch": { "light": { "brightness": { "primary": "1" } } }
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"id": "saturation_tiers",
|
|
405
|
+
"group": "effects",
|
|
406
|
+
"label": "Saturation (filter tiers)",
|
|
407
|
+
"summary": "CSS `saturate()`; decorative or hero imagery, not for semantic status colors (use `color.*` instead).",
|
|
408
|
+
"pathRoot": { "light": "light.saturation", "dark": "dark.saturation" },
|
|
409
|
+
"naturalLanguageHooks": [
|
|
410
|
+
"more vibrant",
|
|
411
|
+
"vivid",
|
|
412
|
+
"desaturate",
|
|
413
|
+
"saturation effect"
|
|
414
|
+
],
|
|
415
|
+
"valueKind": "record_filter",
|
|
416
|
+
"emitsVariables": ["--sky-saturation-primary", "--sky-saturation-*" ],
|
|
417
|
+
"examplePatch": { "light": { "saturation": { "primary": "1" } } }
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"id": "border_tiers",
|
|
421
|
+
"group": "shape",
|
|
422
|
+
"label": "Border (full CSS value, record)",
|
|
423
|
+
"summary": "primary, secondary, tertiary — each value is a complete `border` shorthand for strokes around surfaces and controls.",
|
|
424
|
+
"pathRoot": { "light": "light.border", "dark": "dark.border" },
|
|
425
|
+
"naturalLanguageHooks": [
|
|
426
|
+
"border style",
|
|
427
|
+
"outlines",
|
|
428
|
+
"hairline",
|
|
429
|
+
"stroke on cards"
|
|
430
|
+
],
|
|
431
|
+
"valueKind": "record_css_border",
|
|
432
|
+
"emitsVariables": ["--sky-border-primary", "--sky-border-*" ],
|
|
433
|
+
"examplePatch": {
|
|
434
|
+
"light": { "border": { "primary": "1px solid color-mix(in oklch, #0f172a 15%, transparent)" } }
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"id": "separator",
|
|
439
|
+
"group": "shape",
|
|
440
|
+
"label": "Divider / list separator (hairline)",
|
|
441
|
+
"summary": "One color; feeds `--sky-border-light` (solid RGBA) for 1px separators between list rows or section breaks.",
|
|
442
|
+
"paths": { "light": "light.separator", "dark": "dark.separator" },
|
|
443
|
+
"naturalLanguageHooks": [
|
|
444
|
+
"divider",
|
|
445
|
+
"separator",
|
|
446
|
+
"list line",
|
|
447
|
+
"row divider"
|
|
448
|
+
],
|
|
449
|
+
"valueKind": "css_color",
|
|
450
|
+
"emitsVariables": ["--sky-border-light"],
|
|
451
|
+
"examplePatch": {
|
|
452
|
+
"light": { "separator": "rgba(15, 23, 42, 0.12)" },
|
|
453
|
+
"dark": { "separator": "rgba(255, 255, 255, 0.1)" }
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"id": "motion",
|
|
458
|
+
"group": "motion",
|
|
459
|
+
"label": "Durations and easing (object)",
|
|
460
|
+
"summary": "motion.duration: instant, fast, normal, slow. motion.ease: default, in, out, inOut, bounce. Drives `sky-transition-*` and duration/ease tokens.",
|
|
461
|
+
"pathRoot": { "light": "light.motion", "dark": "dark.motion" },
|
|
462
|
+
"naturalLanguageHooks": [
|
|
463
|
+
"animation speed",
|
|
464
|
+
"snappier",
|
|
465
|
+
"faster transition",
|
|
466
|
+
"easing",
|
|
467
|
+
"motion"
|
|
468
|
+
],
|
|
469
|
+
"valueKind": "motion_config",
|
|
470
|
+
"emitsVariables": [
|
|
471
|
+
"--sky-duration-*",
|
|
472
|
+
"--sky-ease-*",
|
|
473
|
+
"--sky-transition-default"
|
|
474
|
+
],
|
|
475
|
+
"examplePatch": {
|
|
476
|
+
"light": { "motion": { "duration": { "fast": "100ms" }, "ease": { "default": "cubic-bezier(0.2,0,0,1)" } } }
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"id": "z_index",
|
|
481
|
+
"group": "stacking",
|
|
482
|
+
"label": "Z-index scale (stacking order)",
|
|
483
|
+
"summary": "Named levels: base, dropdown, sticky, fixed, modal, popover, toast, max. Emitted as unitless `sky-z-*` numbers (not arbitrary z-index in components).",
|
|
484
|
+
"pathRoot": { "light": "light.zIndex", "dark": "dark.zIndex" },
|
|
485
|
+
"naturalLanguageHooks": [
|
|
486
|
+
"modal on top",
|
|
487
|
+
"dropdown layer",
|
|
488
|
+
"tooltip above",
|
|
489
|
+
"z-index"
|
|
490
|
+
],
|
|
491
|
+
"valueKind": "record_integers",
|
|
492
|
+
"emitsVariables": ["--sky-z-base", "--sky-z-modal" ],
|
|
493
|
+
"examplePatch": {
|
|
494
|
+
"light": { "zIndex": { "modal": 10000, "popover": 10050 } }
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
{
|
|
498
|
+
"id": "opacity_ui",
|
|
499
|
+
"group": "opacity",
|
|
500
|
+
"label": "UI opacity (disabled, muted, subtle)",
|
|
501
|
+
"summary": "0–1 multipliers for disabled controls and de-emphasized text or icons — not the same as glass/overlay opacities.",
|
|
502
|
+
"pathRoot": { "light": "light.opacity", "dark": "dark.opacity" },
|
|
503
|
+
"naturalLanguageHooks": [
|
|
504
|
+
"disabled look",
|
|
505
|
+
"faded",
|
|
506
|
+
"muted",
|
|
507
|
+
"subtle opacity"
|
|
508
|
+
],
|
|
509
|
+
"valueKind": "record_0_1",
|
|
510
|
+
"emitsVariables": ["--sky-opacity-disabled", "--sky-opacity-*" ],
|
|
511
|
+
"examplePatch": { "light": { "opacity": { "disabled": 0.4, "muted": 0.6 } } }
|
|
512
|
+
}
|
|
513
|
+
],
|
|
514
|
+
"recipeTemplates": [
|
|
515
|
+
{
|
|
516
|
+
"id": "brand_rollup",
|
|
517
|
+
"intent": "User gives one brand hex for both light and dark primary accent.",
|
|
518
|
+
"placeholderKeys": ["primaryHex", "lightPrimaryHex", "darkPrimaryHex"],
|
|
519
|
+
"patchTemplate": {
|
|
520
|
+
"light": { "color": { "active": "<lightPrimaryHex or primaryHex>" } },
|
|
521
|
+
"dark": { "color": { "active": "<darkPrimaryHex or primaryHex>" } }
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
"id": "calm_surface",
|
|
526
|
+
"intent": "Softer glass + lighter overlay for less harsh surfaces.",
|
|
527
|
+
"placeholderKeys": [],
|
|
528
|
+
"patchTemplate": {
|
|
529
|
+
"light": { "glass": { "opacities": { "primary": 0.38, "secondary": 0.38, "tertiary": 0.38, "solid": 1 } } },
|
|
530
|
+
"dark": { "overlay": { "opacities": { "primary": 0.45, "secondary": 0.3, "tertiary": 0.15, "solid": 1 } } }
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
],
|
|
534
|
+
"intentRouters": [
|
|
535
|
+
{
|
|
536
|
+
"phrases": [
|
|
537
|
+
"more padding",
|
|
538
|
+
"wider",
|
|
539
|
+
"airy",
|
|
540
|
+
"breathe",
|
|
541
|
+
"looser layout",
|
|
542
|
+
"more space between"
|
|
543
|
+
],
|
|
544
|
+
"fieldIds": ["spacing_scale"],
|
|
545
|
+
"agentHint": "Increase selected keys in `light.spacing` and `dark.spacing` (e.g. 2,3,4) a few points or rem steps."
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"phrases": [
|
|
549
|
+
"tighter",
|
|
550
|
+
"denser",
|
|
551
|
+
"data-dense",
|
|
552
|
+
"compact",
|
|
553
|
+
"admin"
|
|
554
|
+
],
|
|
555
|
+
"fieldIds": ["spacing_scale", "font_size_scale", "line_height_scale"],
|
|
556
|
+
"agentHint": "Slightly lower spacing and optionally fontSize.md/lg; ensure contrast still holds."
|
|
557
|
+
},
|
|
558
|
+
{
|
|
559
|
+
"phrases": [
|
|
560
|
+
"frosted",
|
|
561
|
+
"frosting",
|
|
562
|
+
"frosted glass"
|
|
563
|
+
],
|
|
564
|
+
"fieldIds": ["glass", "glass_surface_sheen", "blur"],
|
|
565
|
+
"agentHint": "Tune `glass` base and opacities; optionally `glassSurface` top/bottom; align `blur` tiers for backdrop strength."
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"phrases": [
|
|
569
|
+
"modals",
|
|
570
|
+
"backdrop",
|
|
571
|
+
"scrim"
|
|
572
|
+
],
|
|
573
|
+
"fieldIds": ["overlay", "z_index", "box_shadow"],
|
|
574
|
+
"agentHint": "Prefer `overlay` for full-screen tints; raise `zIndex.modal` if things stack wrong."
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"phrases": [
|
|
578
|
+
"on-hover",
|
|
579
|
+
"on hover"
|
|
580
|
+
],
|
|
581
|
+
"fieldIds": ["glass_hover", "motion", "box_shadow"],
|
|
582
|
+
"agentHint": "Adjust `glassHover` opacity; motion duration for snappy feel."
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"phrases": [
|
|
586
|
+
"rebrand",
|
|
587
|
+
"brand",
|
|
588
|
+
"company color"
|
|
589
|
+
],
|
|
590
|
+
"fieldIds": [
|
|
591
|
+
"color_active",
|
|
592
|
+
"color_background",
|
|
593
|
+
"color_foreground"
|
|
594
|
+
],
|
|
595
|
+
"agentHint": "Set `active` to brand; nudge `background`/`foreground` for contrast. Keep success/warn/danger unless the brand also replaces them."
|
|
596
|
+
}
|
|
597
|
+
]
|
|
598
|
+
}
|