@vibes.diy/prompts 12.2.3 → 12.2.5
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/generation-variety.d.ts +17 -0
- package/generation-variety.js +80 -0
- package/generation-variety.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/llms/backend.md +64 -6
- package/llms/fireproof.md +4 -4
- package/package.json +4 -4
- package/prompts.js +26 -43
- package/prompts.js.map +1 -1
- package/restyle.d.ts +155 -0
- package/restyle.js +254 -0
- package/restyle.js.map +1 -0
- package/settings.d.ts +2 -0
- package/style-prompts.d.ts +1 -1
- package/style-prompts.js +13 -6
- package/style-prompts.js.map +1 -1
- package/system-prompt.md +2 -2
- package/themes/colors/aether.yaml +2 -2
- package/themes/colors/archive.yaml +1 -1
- package/themes/colors/atelier.yaml +1 -1
- package/themes/colors/atlas.yaml +1 -1
- package/themes/colors/broadsheet.yaml +1 -1
- package/themes/colors/brutalist.yaml +8 -5
- package/themes/colors/capsule.yaml +1 -1
- package/themes/colors/carbon.yaml +1 -1
- package/themes/colors/chrono.yaml +1 -1
- package/themes/colors/computer-angel-heaven.yaml +1 -1
- package/themes/colors/console.yaml +1 -1
- package/themes/colors/default.yaml +1 -1
- package/themes/colors/desktop.yaml +1 -1
- package/themes/colors/edge.yaml +1 -1
- package/themes/colors/hearth.yaml +1 -1
- package/themes/colors/industrial.yaml +1 -1
- package/themes/colors/mesh.yaml +1 -1
- package/themes/colors/neomario.yaml +1 -1
- package/themes/colors/neon.yaml +1 -1
- package/themes/colors/orbit.yaml +1 -1
- package/themes/colors/rune.yaml +1 -1
- package/themes/colors/scrapbook.yaml +1 -1
- package/themes/colors/slab.yaml +1 -1
- package/themes/colors/specimen.yaml +1 -1
- package/themes/colors/winter-sports.yaml +1 -1
- package/themes/colors/zine.yaml +1 -1
- package/themes/colorsets-bundle.js +34 -31
- package/themes/colorsets-bundle.js.map +1 -1
- package/themes/colorsets.d.ts +3 -4
- package/themes/colorsets.js +25 -22
- package/themes/colorsets.js.map +1 -1
- package/themes/fonts.d.ts +9 -0
- package/themes/fonts.js +80 -0
- package/themes/fonts.js.map +1 -0
- package/themes/index.d.ts +5 -1
- package/themes/index.js +5 -1
- package/themes/index.js.map +1 -1
- package/themes/ornament-pad.d.ts +27 -0
- package/themes/ornament-pad.js +145 -0
- package/themes/ornament-pad.js.map +1 -0
- package/themes/palette-gen.d.ts +125 -0
- package/themes/palette-gen.js +473 -0
- package/themes/palette-gen.js.map +1 -0
- package/themes/style-presets.d.ts +11 -0
- package/themes/style-presets.js +79 -0
- package/themes/style-presets.js.map +1 -0
package/restyle.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { PAD_DRIVEN_TOKENS } from "./themes/ornament-pad.js";
|
|
2
|
+
import { VIBE_FONTS } from "./themes/fonts.js";
|
|
3
|
+
import { type } from "arktype";
|
|
4
|
+
export const RESTYLE_CUE_WORDS = [
|
|
5
|
+
"restyle",
|
|
6
|
+
"styling",
|
|
7
|
+
"style",
|
|
8
|
+
"look",
|
|
9
|
+
"feel",
|
|
10
|
+
"vibe",
|
|
11
|
+
"theme",
|
|
12
|
+
"palette",
|
|
13
|
+
"colour",
|
|
14
|
+
"colours",
|
|
15
|
+
"color",
|
|
16
|
+
"colors",
|
|
17
|
+
"font",
|
|
18
|
+
"typeface",
|
|
19
|
+
"serious",
|
|
20
|
+
"playful",
|
|
21
|
+
"formal",
|
|
22
|
+
"informal",
|
|
23
|
+
"professional",
|
|
24
|
+
"friendly",
|
|
25
|
+
"calm",
|
|
26
|
+
"loud",
|
|
27
|
+
"quiet",
|
|
28
|
+
"bold",
|
|
29
|
+
"subtle",
|
|
30
|
+
"elegant",
|
|
31
|
+
"refined",
|
|
32
|
+
"punchy",
|
|
33
|
+
"moody",
|
|
34
|
+
"warmer",
|
|
35
|
+
"cooler",
|
|
36
|
+
"softer",
|
|
37
|
+
"harsher",
|
|
38
|
+
"darker",
|
|
39
|
+
"lighter",
|
|
40
|
+
"brighter",
|
|
41
|
+
"duller",
|
|
42
|
+
"tighter",
|
|
43
|
+
"looser",
|
|
44
|
+
"denser",
|
|
45
|
+
"airier",
|
|
46
|
+
"rounder",
|
|
47
|
+
"squarer",
|
|
48
|
+
"contrast",
|
|
49
|
+
"saturated",
|
|
50
|
+
"desaturated",
|
|
51
|
+
"muted",
|
|
52
|
+
"vivid",
|
|
53
|
+
"pastel",
|
|
54
|
+
"monochrome",
|
|
55
|
+
"rounded",
|
|
56
|
+
];
|
|
57
|
+
const PAD_AXES_PARAGRAPH = [
|
|
58
|
+
"Ornament pad — the app's structure, as ONE position on a 2x2 pad. Both axes run -1..+1 and (0,0) is the platform's stock value set.",
|
|
59
|
+
" x: LOOSE (-1) <-> TIGHT (+1) — the spatial budget. Tight compresses: less padding, slightly smaller text, smaller corner radii, smaller shadows (border weight moves the other way, because a compressed layout needs the rule to do more separating).",
|
|
60
|
+
" y: FORMAL (-1) <-> INFORMAL (+1) — the voice. Informal is loud and made-by-hand: hard offset shadows, heavier type, open tracking, squarer corners, and past a threshold uppercase labels. Formal is quiet and refined: diffuse shadows, tight editorial tracking, rounder corners, sentence case.",
|
|
61
|
+
].join("\n");
|
|
62
|
+
const CHARACTER_PARAGRAPH = [
|
|
63
|
+
"Palette character — five scalars, each 0..1:",
|
|
64
|
+
" chroma: 0 = fully grey/achromatic, 1 = as saturated as the gamut allows. 'muted'/'desaturated'/'monochrome' lower it; 'vivid'/'punchy'/'saturated' raise it.",
|
|
65
|
+
" contrast: how far apart surfaces and ink sit. 'bolder'/'harsher'/'higher contrast' raise it; 'softer'/'gentler' lower it.",
|
|
66
|
+
" neutralTint: how much of the hue bleeds into the greys. Raise for warmth/tint, lower for clean neutral greys.",
|
|
67
|
+
" surfaceLift: how far cards/panels separate from the page behind them. Raise for a layered, panelled look; lower for flat.",
|
|
68
|
+
" fillLevel: how solid the filled elements are. Raise for heavy poster fills, lower for outline-and-ink restraint.",
|
|
69
|
+
" scheme: how the secondary/tertiary hues are derived from the primary — one of analogous | split-complementary | triadic | complementary.",
|
|
70
|
+
].join("\n");
|
|
71
|
+
function fontCatalogText() {
|
|
72
|
+
return VIBE_FONTS.map((f) => ` - ${f.slug}: ${f.label}${f.mono === true ? " (monospaced)" : ""}`).join("\n");
|
|
73
|
+
}
|
|
74
|
+
export function makeRestyleRouterMessage(userMessage) {
|
|
75
|
+
return [
|
|
76
|
+
"You are routing one chat message in an app-building tool.",
|
|
77
|
+
"",
|
|
78
|
+
"The tool can adjust an app's APPEARANCE — colors, saturation, contrast, light/dark feel, spacing density, corner rounding, shadow style, text case and tracking, and the font — WITHOUT regenerating any code, because all of those are platform-level style tokens.",
|
|
79
|
+
"Anything else — new or changed features, new UI elements, layout restructuring, copy/wording changes, data or behavior changes, bug fixes — requires regenerating the app's code.",
|
|
80
|
+
"",
|
|
81
|
+
"Answer two independent questions about the message below.",
|
|
82
|
+
"",
|
|
83
|
+
"1. Is EVERY part of this message an appearance-only request that the style tokens above can serve?",
|
|
84
|
+
"2. Does ANY part of this message ask for a functional, structural, content or behavioral change — anything that would need code to be written or edited?",
|
|
85
|
+
"",
|
|
86
|
+
"Be conservative. If the message mixes a look request with a feature request ('add a dark mode toggle', 'make the header sticky and blue'), question 2 is YES. If you are unsure what the user means, question 2 is YES. Adding a control, a button, a mode, a page or a section is a code change even when the user describes it in visual words.",
|
|
87
|
+
"",
|
|
88
|
+
"Message:",
|
|
89
|
+
userMessage,
|
|
90
|
+
].join("\n");
|
|
91
|
+
}
|
|
92
|
+
export const restyleRouterSchema = {
|
|
93
|
+
name: "restyle_route",
|
|
94
|
+
required: ["appearanceOnly", "functionalChange"],
|
|
95
|
+
properties: {
|
|
96
|
+
appearanceOnly: {
|
|
97
|
+
type: "boolean",
|
|
98
|
+
description: "True only when EVERY part of the message is an appearance request the platform's style tokens (colors, saturation, contrast, density, rounding, shadow, text case, font) can serve on their own.",
|
|
99
|
+
},
|
|
100
|
+
functionalChange: {
|
|
101
|
+
type: "boolean",
|
|
102
|
+
description: "True when ANY part of the message asks for a feature, control, element, page, layout restructuring, copy change, data change or behavior change — i.e. anything that needs code written or edited. True when unsure.",
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
export const restyleRouterParsed = type({
|
|
107
|
+
appearanceOnly: "boolean",
|
|
108
|
+
functionalChange: "boolean",
|
|
109
|
+
});
|
|
110
|
+
export function routeFromRestyleAnswer(parsed) {
|
|
111
|
+
return parsed.appearanceOnly === true && parsed.functionalChange === false ? "restyle" : "codegen";
|
|
112
|
+
}
|
|
113
|
+
export function hueWord(h) {
|
|
114
|
+
const n = ((h % 360) + 360) % 360;
|
|
115
|
+
if (n < 15 || n >= 345)
|
|
116
|
+
return "red";
|
|
117
|
+
if (n < 45)
|
|
118
|
+
return "orange";
|
|
119
|
+
if (n < 75)
|
|
120
|
+
return "yellow";
|
|
121
|
+
if (n < 105)
|
|
122
|
+
return "lime";
|
|
123
|
+
if (n < 165)
|
|
124
|
+
return "green";
|
|
125
|
+
if (n < 195)
|
|
126
|
+
return "teal";
|
|
127
|
+
if (n < 255)
|
|
128
|
+
return "blue";
|
|
129
|
+
if (n < 285)
|
|
130
|
+
return "violet";
|
|
131
|
+
if (n < 315)
|
|
132
|
+
return "magenta";
|
|
133
|
+
return "pink";
|
|
134
|
+
}
|
|
135
|
+
function currentText(current) {
|
|
136
|
+
const [base, second, third] = current.hues;
|
|
137
|
+
const control = (c, nr) => {
|
|
138
|
+
if (c === undefined || typeof c === "number" || c.mode === "derived") {
|
|
139
|
+
return ` hue ${nr}: derived from hue 1 by the scheme (not pinned)`;
|
|
140
|
+
}
|
|
141
|
+
return ` hue ${nr}: PINNED at ${Math.round(c.h)} deg (${hueWord(c.h)})`;
|
|
142
|
+
};
|
|
143
|
+
return [
|
|
144
|
+
"Current style:",
|
|
145
|
+
` hue 1 (primary): ${Math.round(base)} deg (${hueWord(base)})`,
|
|
146
|
+
control(second, 2),
|
|
147
|
+
control(third, 3),
|
|
148
|
+
` character: chroma ${current.character.chroma}, contrast ${current.character.contrast}, neutralTint ${current.character.neutralTint}, surfaceLift ${current.character.surfaceLift}, fillLevel ${current.character.fillLevel}, scheme ${current.character.scheme}`,
|
|
149
|
+
` font: ${current.font}`,
|
|
150
|
+
` ornament pad: x ${current.pad.x} (loose..tight), y ${current.pad.y} (formal..informal)`,
|
|
151
|
+
current.pins.length === 0
|
|
152
|
+
? " pinned ornament tokens: none"
|
|
153
|
+
: ` PINNED ornament tokens: ${current.pins.join(", ")} — the owner set these by hand`,
|
|
154
|
+
].join("\n");
|
|
155
|
+
}
|
|
156
|
+
export function makeRestyleMapperMessage({ current, instruction, }) {
|
|
157
|
+
return [
|
|
158
|
+
"You are adjusting the appearance of one app by moving platform style controls. You are NOT writing code and NOT describing code.",
|
|
159
|
+
"",
|
|
160
|
+
PAD_AXES_PARAGRAPH,
|
|
161
|
+
"",
|
|
162
|
+
CHARACTER_PARAGRAPH,
|
|
163
|
+
"",
|
|
164
|
+
"Font — a slug from this catalog, never a family name or a URL:",
|
|
165
|
+
fontCatalogText(),
|
|
166
|
+
"",
|
|
167
|
+
currentText(current),
|
|
168
|
+
"",
|
|
169
|
+
"Instruction from the owner:",
|
|
170
|
+
instruction,
|
|
171
|
+
"",
|
|
172
|
+
"Rules:",
|
|
173
|
+
"- Move only what the instruction actually asks for. A mood word ('more serious', 'playful', 'tighter') moves the pad and the character scalars; it does NOT change the hues or the font.",
|
|
174
|
+
"- Anything marked PINNED above is the owner's explicit choice. Leave it exactly as it is UNLESS the instruction targets that thing specifically — 'change the accent to orange' targets the hues, 'make it more serious' does not.",
|
|
175
|
+
"- List in `targeted` only the groups the instruction genuinely names: `hue` when it asks for particular colors, `font` when it asks about typefaces or lettering, `ornament-pins` when it asks for specific structural values (an exact corner radius, an exact border width). Leave `targeted` empty for a pure mood nudge.",
|
|
176
|
+
"- Nudges are nudges. A single instruction usually moves a scalar by 0.1-0.3 and the pad by 0.2-0.5, not from one extreme to the other.",
|
|
177
|
+
"- Write `description` as ONE short sentence in the owner's own register describing what you changed, e.g. 'Went tighter and more formal, kept your pinned accent.' No control names, no numbers, no code talk.",
|
|
178
|
+
].join("\n");
|
|
179
|
+
}
|
|
180
|
+
export const restyleMapperSchema = {
|
|
181
|
+
name: "restyle_map",
|
|
182
|
+
required: ["hues", "character", "font", "pad", "targeted", "description"],
|
|
183
|
+
properties: {
|
|
184
|
+
hues: {
|
|
185
|
+
type: "array",
|
|
186
|
+
description: "1 to 3 hue controls. The first is the primary hue angle. Repeat the current values unless the instruction targets colors specifically.",
|
|
187
|
+
items: {
|
|
188
|
+
type: "object",
|
|
189
|
+
properties: {
|
|
190
|
+
h: { type: "number", description: "Hue angle in degrees, 0-360." },
|
|
191
|
+
pinned: {
|
|
192
|
+
type: "boolean",
|
|
193
|
+
description: "True to freeze this control at `h`; false to let it follow the scheme from hue 1. The first entry is always a concrete angle and ignores this flag.",
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
character: {
|
|
199
|
+
type: "object",
|
|
200
|
+
description: "The five palette scalars (each 0..1) plus the hue scheme.",
|
|
201
|
+
properties: {
|
|
202
|
+
chroma: { type: "number" },
|
|
203
|
+
contrast: { type: "number" },
|
|
204
|
+
neutralTint: { type: "number" },
|
|
205
|
+
surfaceLift: { type: "number" },
|
|
206
|
+
fillLevel: { type: "number" },
|
|
207
|
+
scheme: { type: "string", description: "analogous | split-complementary | triadic | complementary" },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
font: { type: "string", description: "A font slug from the catalog above. Repeat the current one unless asked to change it." },
|
|
211
|
+
pad: {
|
|
212
|
+
type: "object",
|
|
213
|
+
description: "Ornament pad position. Both axes -1..+1.",
|
|
214
|
+
properties: {
|
|
215
|
+
x: { type: "number", description: "-1 loose .. +1 tight" },
|
|
216
|
+
y: { type: "number", description: "-1 formal .. +1 informal" },
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
targeted: {
|
|
220
|
+
type: "array",
|
|
221
|
+
description: "Which pinned groups the instruction named specifically. Allowed values: hue, font, ornament-pins. Empty for a pure mood nudge.",
|
|
222
|
+
items: { type: "string" },
|
|
223
|
+
},
|
|
224
|
+
description: {
|
|
225
|
+
type: "string",
|
|
226
|
+
description: "One short sentence, in plain language, saying what changed. No control names and no numbers.",
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
export const restyleMapperParsed = type({
|
|
231
|
+
hues: type({ h: "number", "pinned?": "boolean" }).array(),
|
|
232
|
+
character: {
|
|
233
|
+
chroma: "number",
|
|
234
|
+
contrast: "number",
|
|
235
|
+
neutralTint: "number",
|
|
236
|
+
surfaceLift: "number",
|
|
237
|
+
fillLevel: "number",
|
|
238
|
+
scheme: "string",
|
|
239
|
+
},
|
|
240
|
+
font: "string",
|
|
241
|
+
pad: { x: "number", y: "number" },
|
|
242
|
+
"targeted?": type("string").array(),
|
|
243
|
+
description: "string",
|
|
244
|
+
});
|
|
245
|
+
export const RESTYLE_TARGETS = ["hue", "font", "ornament-pins"];
|
|
246
|
+
export function validRestyleTargets(raw) {
|
|
247
|
+
const catalog = RESTYLE_TARGETS;
|
|
248
|
+
return (raw ?? []).filter((t) => catalog.includes(t));
|
|
249
|
+
}
|
|
250
|
+
export function isPadDrivenToken(token) {
|
|
251
|
+
const catalog = PAD_DRIVEN_TOKENS;
|
|
252
|
+
return catalog.includes(token);
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=restyle.js.map
|
package/restyle.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restyle.js","sourceRoot":"","sources":["../jsr/restyle.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAa/B,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAElD,SAAS;IACT,SAAS;IACT,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,UAAU;IAEV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,UAAU;IACV,cAAc;IACd,UAAU;IACV,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IAET,QAAQ;IACR,SAAS;IACT,UAAU;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,UAAU;IACV,WAAW;IACX,aAAa;IACb,OAAO;IACP,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,SAAS;CACV,CAAC;AAUF,MAAM,kBAAkB,GAAG;IACzB,qIAAqI;IACrI,0PAA0P;IAC1P,sSAAsS;CACvS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAOb,MAAM,mBAAmB,GAAG;IAC1B,8CAA8C;IAC9C,gKAAgK;IAChK,6HAA6H;IAC7H,iHAAiH;IACjH,6HAA6H;IAC7H,oHAAoH;IACpH,4IAA4I;CAC7I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAS,eAAe;IACtB,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChH,CAAC;AAUD,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO;QACL,2DAA2D;QAC3D,EAAE;QACF,sQAAsQ;QACtQ,mLAAmL;QACnL,EAAE;QACF,2DAA2D;QAC3D,EAAE;QACF,oGAAoG;QACpG,0JAA0J;QAC1J,EAAE;QACF,mVAAmV;QACnV,EAAE;QACF,UAAU;QACV,WAAW;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;IAChD,UAAU,EAAE;QACV,cAAc,EAAE;YACd,IAAI,EAAE,SAAS;YACf,WAAW,EACT,kMAAkM;SACrM;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,SAAS;YACf,WAAW,EACT,sNAAsN;SACzN;KACF;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;IACtC,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,SAAS;CAC5B,CAAC,CAAC;AASH,MAAM,UAAU,sBAAsB,CAAC,MAA2B;IAChE,OAAO,MAAM,CAAC,cAAc,KAAK,IAAI,IAAI,MAAM,CAAC,gBAAgB,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACrG,CAAC;AA4BD,MAAM,UAAU,OAAO,CAAC,CAAS;IAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC7B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,OAAuB;IAC1C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,CAAgC,EAAE,EAAU,EAAU,EAAE;QACvE,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACrE,OAAO,SAAS,EAAE,iDAAiD,CAAC;QACtE,CAAC;QACD,OAAO,SAAS,EAAE,eAAe,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3E,CAAC,CAAC;IACF,OAAO;QACL,gBAAgB;QAChB,sBAAsB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,GAAG;QAC/D,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACjB,uBAAuB,OAAO,CAAC,SAAS,CAAC,MAAM,cAAc,OAAO,CAAC,SAAS,CAAC,QAAQ,iBAAiB,OAAO,CAAC,SAAS,CAAC,WAAW,iBAAiB,OAAO,CAAC,SAAS,CAAC,WAAW,eAAe,OAAO,CAAC,SAAS,CAAC,SAAS,YAAY,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE;QACnQ,WAAW,OAAO,CAAC,IAAI,EAAE;QACzB,qBAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,sBAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,qBAAqB;QAC1F,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACvB,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC;KACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAUD,MAAM,UAAU,wBAAwB,CAAC,EACvC,OAAO,EACP,WAAW,GAIZ;IACC,OAAO;QACL,kIAAkI;QAClI,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,gEAAgE;QAChE,eAAe,EAAE;QACjB,EAAE;QACF,WAAW,CAAC,OAAO,CAAC;QACpB,EAAE;QACF,6BAA6B;QAC7B,WAAW;QACX,EAAE;QACF,QAAQ;QACR,0LAA0L;QAC1L,oOAAoO;QACpO,8TAA8T;QAC9T,wIAAwI;QACxI,gNAAgN;KACjN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC;IACzE,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,WAAW,EACT,wIAAwI;YAC1I,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;oBAClE,MAAM,EAAE;wBACN,IAAI,EAAE,SAAS;wBACf,WAAW,EACT,qJAAqJ;qBACxJ;iBACF;aACF;SACF;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2DAA2D;YACxE,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC/B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;aACrG;SACF;QACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uFAAuF,EAAE;QAC9H,GAAG,EAAE;YACH,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,0CAA0C;YACvD,UAAU,EAAE;gBACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;gBAC1D,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;aAC/D;SACF;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,OAAO;YACb,WAAW,EACT,gIAAgI;YAClI,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8FAA8F;SAC5G;KACF;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;IACzD,SAAS,EAAE;QACT,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,QAAQ;QACrB,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,QAAQ;KACjB;IACD,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE;IACjC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;IACnC,WAAW,EAAE,QAAQ;CACtB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAU,CAAC;AAIzE,MAAM,UAAU,mBAAmB,CAAC,GAAkC;IACpE,MAAM,OAAO,GAAsB,eAAe,CAAC;IACnD,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAsB,iBAAiB,CAAC;IACrD,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
package/settings.d.ts
CHANGED
package/style-prompts.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export interface StylePrompt {
|
|
|
2
2
|
name: string;
|
|
3
3
|
prompt: string;
|
|
4
4
|
}
|
|
5
|
-
export declare const BRUTALIST_ROOT_CSS = ":root {\n --background: #f5f0e0;\n --surface: #ffffff;\n --primary: #DA291C;\n --secondary: #fedd00;\n --accent: #3b82f6;\n --text-primary: #1a1a2e;\n --text-secondary: #6b6b80;\n --border: #1a1a2e;\n --success: #22c55e;\n --text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));\n --warning: #f59e0b;\n --error: #ef4444;\n --neutral: #6b7280;\n --font-family: 'Space Grotesk', sans-serif;\n --font-family-mono: ui-monospace, 'JetBrains Mono', Menlo, monospace;\n --radius: 4px;\n --radius-sm: 4px;\n --radius-lg: 4px;\n --vibes-spacing: 1rem;\n --font-size-base: 1rem;\n --border-width: 1px;\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --background: oklch(0.18 0.02 280);\n --surface: oklch(0.22 0.02 280);\n --primary: #DA291C;\n --secondary: #fedd00;\n --accent: #3b82f6;\n --text-primary: oklch(0.96 0.01 80);\n --text-secondary: oklch(0.
|
|
5
|
+
export declare const BRUTALIST_ROOT_CSS = ":root {\n --background: #f5f0e0;\n --surface: #ffffff;\n --primary: #DA291C;\n --secondary: #fedd00;\n --accent: #3b82f6;\n --text-primary: #1a1a2e;\n --text-secondary: #6b6b80;\n --border: #1a1a2e;\n --success: #22c55e;\n --text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));\n --warning: #f59e0b;\n --error: #ef4444;\n --neutral: #6b7280;\n --font-family: 'Space Grotesk', sans-serif;\n --font-family-mono: ui-monospace, 'JetBrains Mono', Menlo, monospace;\n --radius: 4px;\n --radius-sm: 4px;\n --radius-lg: 4px;\n --vibes-spacing: 1rem;\n --vibes-shadow: 4px 4px 0 var(--border);\n --vibes-shadow-sm: 3px 3px 0 var(--border);\n --vibes-shadow-lg: 6px 6px 0 var(--border);\n --letter-spacing: -0.02em;\n --letter-spacing-wide: 0.15em;\n --font-weight: 700;\n --text-transform: uppercase;\n --font-size-base: 1rem;\n --border-width: 1px;\n}\n@media (prefers-color-scheme: dark) {\n :root {\n --background: oklch(0.18 0.02 280);\n --surface: oklch(0.22 0.02 280);\n --primary: #DA291C;\n --secondary: #fedd00;\n --accent: #3b82f6;\n --text-primary: oklch(0.96 0.01 80);\n --text-secondary: oklch(0.66 0.03 280);\n --border: oklch(0.96 0.01 80);\n --success: #22c55e;\n --text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));\n --warning: #f59e0b;\n --error: #ef4444;\n --neutral: #6b7280;\n }\n}";
|
|
6
6
|
export declare const stylePrompts: StylePrompt[];
|
|
7
7
|
export declare const DEFAULT_STYLE_NAME: "brutalist web";
|
|
8
8
|
export declare const defaultStylePrompt: string;
|
package/style-prompts.js
CHANGED
|
@@ -18,6 +18,13 @@ export const BRUTALIST_ROOT_CSS = `:root {
|
|
|
18
18
|
--radius-sm: 4px;
|
|
19
19
|
--radius-lg: 4px;
|
|
20
20
|
--vibes-spacing: 1rem;
|
|
21
|
+
--vibes-shadow: 4px 4px 0 var(--border);
|
|
22
|
+
--vibes-shadow-sm: 3px 3px 0 var(--border);
|
|
23
|
+
--vibes-shadow-lg: 6px 6px 0 var(--border);
|
|
24
|
+
--letter-spacing: -0.02em;
|
|
25
|
+
--letter-spacing-wide: 0.15em;
|
|
26
|
+
--font-weight: 700;
|
|
27
|
+
--text-transform: uppercase;
|
|
21
28
|
--font-size-base: 1rem;
|
|
22
29
|
--border-width: 1px;
|
|
23
30
|
}
|
|
@@ -29,7 +36,7 @@ export const BRUTALIST_ROOT_CSS = `:root {
|
|
|
29
36
|
--secondary: #fedd00;
|
|
30
37
|
--accent: #3b82f6;
|
|
31
38
|
--text-primary: oklch(0.96 0.01 80);
|
|
32
|
-
--text-secondary: oklch(0.
|
|
39
|
+
--text-secondary: oklch(0.66 0.03 280);
|
|
33
40
|
--border: oklch(0.96 0.01 80);
|
|
34
41
|
--success: #22c55e;
|
|
35
42
|
--text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));
|
|
@@ -44,18 +51,18 @@ export const stylePrompts = [
|
|
|
44
51
|
prompt: [
|
|
45
52
|
`THEME: Neobrutalist — Neobrutalist Design System. A bold, retro-arcade-inspired neobrutalist theme. Hard edges, chunky black borders, thick offset drop shadows, vivid primary color blocks, and uppercase display typography. The mood is playful and unapologetically loud without leaning on direct IP references — it is "level dashboard" energy: raw, graphic, readable, kinetic.`,
|
|
46
53
|
`COLOR ROLES (canonical tokens — the \`:root\` block at the end is the source of truth): --background warm off-white canvas; --surface pure white cards/nav/inputs; --text-primary near-black ink; --border same as the ink — every stroke is bold; --text-secondary muted labels; --primary vivid red for primary actions/danger; --secondary bright yellow for highlight/hover; --accent blue for informational elements; --success green for success/active states; --warning amber; --error red; --neutral gray. Text ON a colored block reads the on-* tokens with contrast-safe fallbacks: var(--on-primary, #ffffff) on primary/error, var(--on-info, #ffffff) on accent, var(--on-secondary, var(--text-primary)) on secondary, var(--on-success, var(--text-primary)) on success. Never use var(--surface) or var(--background) as a foreground on colored blocks — they flip dark in dark mode while primary/accent stay vivid.`,
|
|
47
|
-
`TOKENS: --radius: 4px (tiny, never pill-shaped). Hard offset shadows
|
|
48
|
-
`TYPOGRAPHY: Primary: "Space Grotesk", sans-serif (400, 500, 600, 700). Mono: "JetBrains Mono", monospace (400, 500, 700) — for stats, numbers, tabular data. Loaded from Google Fonts with display=swap (preceded by <link rel="preconnect"> to fonts.googleapis.com and fonts.gstatic.com so the swap lands fast), no other external deps. Headings are UPPERCASE with tight tracking (-0.02em) and
|
|
49
|
-
`SURFACE & BORDER LANGUAGE: Every primary surface (nav, cards, hero, modal, inputs, buttons) has a solid 3px var(--border) outline and border-radius of 4px. No gradients on strokes, no thin hairlines. Every elevated surface carries a hard offset shadow —
|
|
54
|
+
`TOKENS: --radius: 4px (tiny, never pill-shaped). Hard offset shadows come from the platform's shadow trio, which this theme sets to offsets over the border token — --vibes-shadow-sm (3px 3px 0 var(--border)) for small chips, --vibes-shadow (4px 4px 0 var(--border)) at rest, --vibes-shadow-lg (6px 6px 0 var(--border)) for lift. Reach them with the plain Tailwind utilities shadow-sm / shadow / shadow-lg — the runtime remaps those onto the trio — or with shadow-[var(--vibes-shadow)] when an element needs one named explicitly. Never bake a literal offset like shadow-[4px_4px_0_var(--border)]: a theme swap cannot reach it, so the app would keep this theme's shadows forever. And never define your own --shadow / --shadow-sm / --shadow-lg on :root — those are Tailwind's own engine names (the token is --vibes-shadow, same rule as --vibes-spacing).`,
|
|
55
|
+
`TYPOGRAPHY: Primary: "Space Grotesk", sans-serif (400, 500, 600, 700). Mono: "JetBrains Mono", monospace (400, 500, 700) — for stats, numbers, tabular data. Loaded from Google Fonts with display=swap (preceded by <link rel="preconnect"> to fonts.googleapis.com and fonts.gstatic.com so the swap lands fast), no other external deps. Headings are UPPERCASE with tight tracking and heavy weight — write them as tracking-tight + font-bold, which the runtime remaps onto --letter-spacing (-0.02em here) and --font-weight (700 here); don't freeze the numbers with tracking-[-0.02em] or font-[700]. Section labels: 0.65rem, uppercase, tracking-wide (remapped to --letter-spacing-wide, 0.15em here), muted color. Nav/button labels: 0.7–0.8rem, uppercase, tracking-wide. Where the SHOUTING itself is the theme's choice rather than the content's — display headings, section and nav labels — write [text-transform:var(--text-transform)] instead of the bare uppercase utility, so a quieter theme can calm them down; keep uppercase only where the copy must be capitals whatever the theme.`,
|
|
56
|
+
`SURFACE & BORDER LANGUAGE: Every primary surface (nav, cards, hero, modal, inputs, buttons) has a solid 3px var(--border) outline and border-radius of 4px. No gradients on strokes, no thin hairlines. Every elevated surface carries a hard offset shadow — shadow at rest, shadow-sm for smaller chips, hover:shadow-lg for lift, shadow-lg on modals — all reading the theme's shadow trio, never literal offsets. Shadows are NEVER blurred. Hover pattern: transform: translate(-2px, -2px) combined with the larger hard shadow — gives a "card pops forward" feel. Active/pressed state flips to translate(2px, 2px) with box-shadow: none — the object visibly slams back down. Transitions: 0.15s for micro-interactions, 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) for toggle knobs (slight overshoot).`,
|
|
50
57
|
`LAYOUT: A single centered column, max-width: 920px, padding 3rem 2rem, position: relative; z-index: 10; so it sits above ambient background decorations.`,
|
|
51
58
|
`AMBIENT BACKGROUND: Fixed inset grid: two linear-gradients at 60px × 60px with color-mix(in srgb, var(--text-primary) 4%, transparent) — subtle graph-paper feel. 8 floating geometric blocks (.float-block-1..8) placed across the viewport edges, sizes 25–80px, in var(--primary)/var(--secondary)/var(--success)/var(--accent), some square some circular (border-radius: 50%), opacity 0.15–0.3 so they don't overpower content. 2 floating plus/cross shapes built from ::before/::after pseudo-elements (40×40, arms 10px thick) — var(--border) color, low opacity. 2 floating diamonds — 30×30 var(--secondary) squares with 3px borders, rotated 45deg. Keyframes (all on loops 5–12s, ease-in-out or linear): drift-spin-1, drift-spin-2, drift-bounce, drift-diagonal, drift-zigzag, drift-pulse, drift-diamond. The shapes should drift, not race.`,
|
|
52
|
-
`SECTION COMPOSITION: 1. NAV: Card-style bar with 3px border, shadow, 4px radius. Left: logo = three 12×12 squares (primary/secondary/success) + uppercase brand text. Right: .nav-link pill-looking-but-square chips. 2. HERO: Big bordered card with .hero-accent-bar along the top: a 6px horizontal rainbow split into four equal segments — var(--primary) 0–25%, var(--secondary) 25–50%, var(--success) 50–75%, var(--accent) 75–100%. Big clamped uppercase title with .hero-text-shadow duplicate offset 5px/5px in var(--primary), opacity 0.5. 3. STAT ROW: 4-column grid of .stat-cards (collapses to 2 then 1 on small screens). Each card has colored header bar: child 1 = var(--primary) (on-primary text), 2 = var(--secondary) (ink text), 3 = var(--accent) (on-info text), 4 = var(--success) (ink text). Body shows big mono number + small uppercase unit label. 4. TABLE: Full-bleed inside bordered card. th: 0.6rem uppercase, 2px bottom border. td: 0.82rem, thin separators. Columns 3 & 4 use JetBrains Mono. Row hover fills with var(--secondary) instantly. Badge styles: badge-active (var(--success)), badge-pending (var(--secondary)), badge-locked (var(--neutral)). 5. FORM + CONTROLS GRID: 2-column grid of cards. Left: text input + select + progress bar + primary/secondary buttons. Inputs lift on focus with translate(-2px,-2px) + shadow. Progress bar has repeating striped gradient at -45° in var(--success). Right: checkboxes (22×22, 3px border, var(--success) when checked) + toggles (48×26, 3px border, 4px radius, var(--secondary) when on, knob translates with overshoot) + tag row in four colors. 6. ACTIONS CARD: Flex row with .btn-primary (var(--primary) bg, var(--on-primary, #ffffff) text,
|
|
59
|
+
`SECTION COMPOSITION: 1. NAV: Card-style bar with 3px border, shadow, 4px radius. Left: logo = three 12×12 squares (primary/secondary/success) + uppercase brand text. Right: .nav-link pill-looking-but-square chips. 2. HERO: Big bordered card with .hero-accent-bar along the top: a 6px horizontal rainbow split into four equal segments — var(--primary) 0–25%, var(--secondary) 25–50%, var(--success) 50–75%, var(--accent) 75–100%. Big clamped uppercase title with .hero-text-shadow duplicate offset 5px/5px in var(--primary), opacity 0.5. 3. STAT ROW: 4-column grid of .stat-cards (collapses to 2 then 1 on small screens). Each card has colored header bar: child 1 = var(--primary) (on-primary text), 2 = var(--secondary) (ink text), 3 = var(--accent) (on-info text), 4 = var(--success) (ink text). Body shows big mono number + small uppercase unit label. 4. TABLE: Full-bleed inside bordered card. th: 0.6rem uppercase, 2px bottom border. td: 0.82rem, thin separators. Columns 3 & 4 use JetBrains Mono. Row hover fills with var(--secondary) instantly. Badge styles: badge-active (var(--success)), badge-pending (var(--secondary)), badge-locked (var(--neutral)). 5. FORM + CONTROLS GRID: 2-column grid of cards. Left: text input + select + progress bar + primary/secondary buttons. Inputs lift on focus with translate(-2px,-2px) + shadow. Progress bar has repeating striped gradient at -45° in var(--success). Right: checkboxes (22×22, 3px border, var(--success) when checked) + toggles (48×26, 3px border, 4px radius, var(--secondary) when on, knob translates with overshoot) + tag row in four colors. 6. ACTIONS CARD: Flex row with .btn-primary (var(--primary) bg, var(--on-primary, #ffffff) text, shadow), .btn-secondary (var(--secondary) bg, shadow-sm), .btn-ghost (var(--surface), no shadow, gains hover:shadow-sm). 7. MODAL: Overlay color-mix(in srgb, var(--text-primary) 60%, transparent). Modal card: 3px border, shadow-lg (the theme's deepest hard offset), entry animation modal-pop. .modal-bar: var(--accent) title strip with var(--on-info, #ffffff) text.`,
|
|
53
60
|
`INTERACTION: Nothing eases slowly. All hovers/presses resolve in ≤0.2s. Hover lifts up-and-left; press slams down-and-right. Nothing uses soft blur. Every shadow is a discrete offset block. Rounded corners are tiny (4px) everywhere. Color use: --primary is primary/danger; --secondary is highlight; --success is success/status; --accent is informational; --warning and --error cover alerts. Don't tint surfaces — keep all cards var(--surface) white.`,
|
|
54
61
|
`ACCESSIBILITY: Body text ≥0.82rem, section labels ≥0.6rem. Strong contrast (text on primary → var(--on-primary, #ffffff); on secondary → var(--on-secondary, var(--text-primary)); on success → var(--on-success, var(--text-primary)); on accent → var(--on-info, #ffffff)). The on-* names are palette extras — the fallbacks keep colored blocks readable in both light and dark mode. aria-hidden the decorative .hero-text-shadow.`,
|
|
55
62
|
`RESPONSIVENESS: ≤700px: stat row collapses to 2 columns, form grid to 1 column. ≤500px: nav stacks vertically, stat row to single column.`,
|
|
56
63
|
`FONTS: Use Google Fonts for Space Grotesk (400,500,600,700) and JetBrains Mono (400,500,700). Use display=swap (so text renders immediately in a fallback and upgrades to the real font when it lands, instead of staying invisible) and add <link rel="preconnect" href="https://fonts.googleapis.com"> + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> right before the stylesheet so the connection is warm.`,
|
|
57
64
|
`LOADING STATES: Only a genuinely-network async operation (callAI, fetch) shows a loading state. A database save is local-first — it resolves against the local replica instantly, so it gets NO spinner (apply the change optimistically and let useLiveQuery reconcile; roll back only if the write is rejected on sync). A database read is not a network op either — the first render already has the data, so render an inviting empty-state when there's nothing yet, never a loading spinner. For the network calls that do warrant it, use a useState boolean \`isLoading\`. While the call is in flight: disable the button with \`disabled={isLoading}\`, replace its label with a spinning SVG (a 16x16 circle with 3px stroke, top quarter transparent, CSS animation rotate 0.8s linear infinite), and optionally add a short text like "Loading..." nearby. Pattern: \`setIsLoading(true); try { await callAI(...); } finally { setIsLoading(false); }\`. The spinner should match the theme: 3px stroke in var(--border) color, no blur, sharp edges. Never leave a network-triggering button clickable with no feedback during the call.`,
|
|
58
|
-
`THEME TOKENS — provided by the platform at runtime. The platform injects these canonical color + structural tokens into the served page, so do NOT restate a :root block — just build the UI on the CSS variables via Tailwind bracket notation (bg-[var(--background)], text-[var(--text-primary)], border-[var(--border)], bg-[var(--primary)]). The block below is the REFERENCE for the token names and values, not something to paste in. They are the swap contract: the user can later swap themes and the app restyles instantly — but only for values routed through these variables. Two hard rules: (1) no literal colors for core surfaces/text/actions/borders — never bg-[#hex]/text-[#hex]/border-[#hex]; a swap can't reach a baked-in literal (a genuinely one-off decorative value may be inlined on the element); (2) don't invent bespoke color tokens — a name a future theme won't define can't be swapped. Plain Tailwind
|
|
65
|
+
`THEME TOKENS — provided by the platform at runtime. The platform injects these canonical color + structural tokens into the served page, so do NOT restate a :root block — just build the UI on the CSS variables via Tailwind bracket notation (bg-[var(--background)], text-[var(--text-primary)], border-[var(--border)], bg-[var(--primary)]). The block below is the REFERENCE for the token names and values, not something to paste in. They are the swap contract: the user can later swap themes and the app restyles instantly — but only for values routed through these variables. Two hard rules: (1) no literal colors for core surfaces/text/actions/borders — never bg-[#hex]/text-[#hex]/border-[#hex]; a swap can't reach a baked-in literal (a genuinely one-off decorative value may be inlined on the element); (2) don't invent bespoke color tokens — a name a future theme won't define can't be swapped. Plain Tailwind utilities are fine and are in fact the PREFERRED spelling — the runtime remaps them onto the structural tokens automatically: p-4/gap-2 onto --vibes-spacing, text-lg onto --font-size-base, rounded-md onto --radius, shadow-sm/shadow/shadow-lg onto the --vibes-shadow trio, tracking-tight/tracking-wide onto --letter-spacing and --letter-spacing-wide, font-bold onto --font-weight. An arbitrary-value bracket that freezes a number instead (shadow-[4px_4px_0_var(--border)], tracking-[-0.02em], font-[700], p-[16px]) opts that element OUT of every future theme swap — don't. Two names the runtime reserves: never write a bare --spacing (the spacing token is --vibes-spacing) and never write --shadow/--shadow-sm/--shadow-lg (the shadow tokens are --vibes-shadow, --vibes-shadow-sm, --vibes-shadow-lg); when editing older code that references var(--spacing), rewrite it to var(--vibes-spacing) or a plain spacing utility, and rewrite var(--shadow) the same way to var(--vibes-shadow) or a plain shadow utility. text-transform is the one ornament with no utility remap: read it as [text-transform:var(--text-transform)] where the shouting is the theme's call. Token names are code-only vocabulary — never render a token name (--background, --primary, …) in the app's visible UI copy, headings, or labels.
|
|
59
66
|
|
|
60
67
|
<style>
|
|
61
68
|
${BRUTALIST_ROOT_CSS}
|
package/style-prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-prompts.js","sourceRoot":"","sources":["../jsr/style-prompts.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,kBAAkB,GAAG
|
|
1
|
+
{"version":3,"file":"style-prompts.js","sourceRoot":"","sources":["../jsr/style-prompts.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8ChC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAkB;IAIzC;QACE,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE;YACN,yXAAyX;YACzX,04BAA04B;YAC14B,o1BAAo1B;YACp1B,qjCAAqjC;YACrjC,ixBAAixB;YACjxB,0JAA0J;YAC1J,i0BAAi0B;YACj0B,ihEAAihE;YACjhE,mcAAmc;YACnc,yaAAya;YACza,2IAA2I;YAC3I,waAAwa;YACxa,ylCAAylC;YAKzlC;;;EAGJ,kBAAkB;SACX;YACH,oDAAoD;SACrD,CAAC,IAAI,CAAC,MAAM,CAAC;KACf;IACD;QACE,IAAI,EAAE,SAAS;QACf,MAAM,EACJ,+8BAA+8B;KACl9B;IACD;QACE,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,uBAAuB;KAChC;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,sBAAsB;KAC/B;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,mBAAmB;KAC5B;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,mBAAmB;KAC5B;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,kBAAkB;KAC3B;IACD;QACE,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,qBAAqB;KAC9B;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,0BAA0B;KACnC;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,kBAAkB;KAC3B;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EACJ,orCAAorC;KACvrC;CACF,CAAC;AAGF,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAwB,CAAC;AAG3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;AACnD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;IAC7B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,IAAI,gCAAgC,CAAC,CAAC;IAC7F,CAAC;IACD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAGD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,uBAAuB,kBAAkB,iDAAiD,SAAS,gDAAgD,CACpJ,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC,CAAC,EAAE,CAAC"}
|
package/system-prompt.md
CHANGED
|
@@ -31,7 +31,7 @@ You are an AI assistant tasked with creating React components. You should create
|
|
|
31
31
|
- Use `callAI` to fetch AI, use schema like this: `JSON.parse(await callAI(prompt, { schema: { properties: { todos: { type: 'array', items: { type: 'string' } } } } }))` and save final responses as individual Fireproof documents.
|
|
32
32
|
- Always show loading states during genuinely-network async operations (callAI, fetch): use a useState boolean (e.g. `isLoading`), set it true before the call and false in .finally(). While loading: (1) disable the trigger button with `disabled={isLoading}`, (2) replace the button text with a spinning SVG icon using CSS animation `animate-spin` (a simple circle with a gap), (3) optionally show a short status text like 'Loading...' near the button. Never leave the user clicking a button with no visual feedback. Pattern: `setIsLoading(true); try { await callAI(...); } finally { setIsLoading(false); }`
|
|
33
33
|
- Database reads are not a network operation — never show a loading state or spinner for them. `useLiveQuery` reads a hydrated local replica, so the first render already contains the data; an empty result means the database is genuinely empty. Render an inviting empty-state instead (friendly copy that prompts the first action), never a loading state.
|
|
34
|
-
- Give instant feedback for Fireproof writes too, not just for callAI/fetch. A `database.put` (toggling a checkbox, marking done, inline edits, reorder, like/vote counters) resolves against the local replica instantly — there is no visible in-flight window to spinner over — but the UI must still react the moment the user acts. Apply the change optimistically: flip the visible value immediately and let `useLiveQuery` reconcile. If a synced write is refused, the local optimistic revision converges to the server's version automatically — server-wins, and your code never catches it, so don't `try/catch` writes or hand-roll retry UI. Keep your UI reactive to the store (`useLiveQuery`/`useDocument`) so the converged state shows the truth. When `access.js` provides a reason (`forbidden("…")`) the platform surfaces it to the person; a reason-less refusal
|
|
34
|
+
- Give instant feedback for Fireproof writes too, not just for callAI/fetch. A `database.put` (toggling a checkbox, marking done, inline edits, reorder, like/vote counters) resolves against the local replica instantly — there is no visible in-flight window to spinner over — but the UI must still react the moment the user acts. Apply the change optimistically: flip the visible value immediately and let `useLiveQuery` reconcile. If a synced write is refused, the local optimistic revision converges to the server's version automatically — server-wins, and your code never catches it, so don't `try/catch` writes or hand-roll retry UI. Keep your UI reactive to the store (`useLiveQuery`/`useDocument`) so the converged state shows the truth. When `access.js` provides a reason (`forbidden("…")`) the platform surfaces it to the person; a reason-less refusal converges silently, so don't strip your own UI expecting a popup — gate write surfaces up front with `useVibe(dbName).can`. Transport and offline failures are handled by the built-in queue, so don't hand-roll retry either. Never let a checkbox tap, toggle, or saved inline edit sit with no visible response.
|
|
35
35
|
- For file uploads use drag and drop and store using the `doc._files` API; for AI image generation use `<ImgGen prompt="..." />`
|
|
36
36
|
- Access control is decided by the runtime, not your code. Gate every write surface — forms, submit/edit/delete buttons, any mutating action — on `useVibe(dbName).can`. `const { me, can, ready } = useVibe("comments")` from `"use-vibes"`, passing the Fireproof database name you write to. Show the editor when `can.create(draft).ok` (or `can.edit(doc)` / `can.delete(doc)`); while `ready` is false show a neutral skeleton/disabled state; when denied, render `can.create(draft).reason` as the fallback copy (the sign-in or join prompt). `can.*` runs the app's own `access.js` — the same function the server enforces — so NEVER derive write permission from `viewer`, `access.hasRole()`/`access.hasChannel()`, or document fields. `useViewer()` is identity/display only: `const { ViewerTag } = useViewer()` renders **other** people (`<ViewerTag userHandle={...} />` for comment authors, rosters, "added by" labels). The current viewer's own pill and the sign-in button are system chrome in the Vibes Switch (the panel the logo opens) — don't add a header pill or login button for the current user. Owner-only management UI is gated on `can.*` too (the access.js encodes the owner rule). This applies to every app — the runtime decides sharing, not the prompt. Writes can still be rejected server-side even when `can.*` allows, so keep the optimistic-write + rollback handling. See use-vibe docs.
|
|
37
37
|
- Don't try to generate png or base64 data, use placeholder image APIs instead, like https://picsum.photos/400 where 400 is the square size
|
|
@@ -539,7 +539,7 @@ if (oldDoc === null) {
|
|
|
539
539
|
|
|
540
540
|
The platform predicate `ctx.isImgGenVersionAppend` accepts exactly one legitimate ImgGen version append by a non-author — prior versions/files and all other fields must be unchanged, so a field you didn't anticipate stays author-protected by default. Deletes stay author-only, and a non-author advancing `currentVersion` is the shared-generation display behavior (an app wanting author-only display control must guard `currentVersion` specifically; a private per-user channel no other viewer can reach is exempt).
|
|
541
541
|
|
|
542
|
-
**Public vs private is the owner's
|
|
542
|
+
**Public vs private is the owner's sharing envelope, not your code.** Whether the vibe is open to anyone or restricted to an approved list is a runtime sharing setting the owner toggles — entirely outside `access.js`. Keep `access.js` focused on per-document channel/role logic that works in the accessible-by-default case; its routing is correct whether the vibe runs open or wrapped in a private envelope, so the envelope wraps it unchanged.
|
|
543
543
|
|
|
544
544
|
Example streamed output for a team board app:
|
|
545
545
|
|
|
@@ -4,14 +4,14 @@ colors:
|
|
|
4
4
|
accent: "#cfa562"
|
|
5
5
|
border: "rgba(20, 20, 20, 0.14)"
|
|
6
6
|
background: "#dcbfa6"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
9
9
|
colorsDark:
|
|
10
10
|
accent: "#9d7330"
|
|
11
11
|
border: "rgba(255, 255, 255, 0.18)"
|
|
12
12
|
background: "#593c23"
|
|
13
13
|
text-primary: "rgba(255, 255, 255, 0.92)"
|
|
14
|
-
text-secondary: "rgba(255, 255, 255, 0.
|
|
14
|
+
text-secondary: "rgba(255, 255, 255, 0.7)"
|
|
15
15
|
surface: "rgba(255, 255, 255, 0.04)"
|
|
16
16
|
extras:
|
|
17
17
|
parchment: "#dcbfa6"
|
|
@@ -3,7 +3,7 @@ colors:
|
|
|
3
3
|
background: "oklch(0.95 0.01 70)"
|
|
4
4
|
accent: "oklch(0.35 0.04 50)"
|
|
5
5
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
6
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
6
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
7
7
|
border: "rgba(20, 20, 20, 0.14)"
|
|
8
8
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
9
9
|
colorsDark:
|
|
@@ -5,7 +5,7 @@ colors:
|
|
|
5
5
|
primary: "oklch(0.65 0.18 55)"
|
|
6
6
|
secondary: "oklch(0.60 0.15 40)"
|
|
7
7
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
8
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
8
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
9
9
|
border: "rgba(20, 20, 20, 0.14)"
|
|
10
10
|
accent: "oklch(0.65 0.18 55)"
|
|
11
11
|
colorsDark:
|
package/themes/colors/atlas.yaml
CHANGED
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
5
5
|
primary: "oklch(0.62 0.24 25)"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
border: "rgba(20, 20, 20, 0.14)"
|
|
9
9
|
accent: "oklch(0.62 0.24 25)"
|
|
10
10
|
colorsDark:
|
|
@@ -16,7 +16,7 @@ colorsDark:
|
|
|
16
16
|
secondary: "#fedd00"
|
|
17
17
|
accent: "#3b82f6"
|
|
18
18
|
text-primary: "oklch(0.96 0.01 80)"
|
|
19
|
-
text-secondary: "oklch(0.
|
|
19
|
+
text-secondary: "oklch(0.66 0.03 280)"
|
|
20
20
|
border: "oklch(0.96 0.01 80)"
|
|
21
21
|
success: "#22c55e"
|
|
22
22
|
extras:
|
|
@@ -26,8 +26,6 @@ extras:
|
|
|
26
26
|
info: "#3b82f6"
|
|
27
27
|
on-info: "#ffffff"
|
|
28
28
|
primary-light: "rgba(218, 41, 28, 0.1)"
|
|
29
|
-
shadow: "4px 4px 0 var(--border)"
|
|
30
|
-
shadow-sm: "3px 3px 0 var(--border)"
|
|
31
29
|
extrasDark:
|
|
32
30
|
on-primary: "#ffffff"
|
|
33
31
|
on-secondary: "#1a1a2e"
|
|
@@ -35,8 +33,6 @@ extrasDark:
|
|
|
35
33
|
info: "#3b82f6"
|
|
36
34
|
on-info: "#ffffff"
|
|
37
35
|
primary-light: "rgba(218, 41, 28, 0.18)"
|
|
38
|
-
shadow: "4px 4px 0 var(--border)"
|
|
39
|
-
shadow-sm: "3px 3px 0 var(--border)"
|
|
40
36
|
structural:
|
|
41
37
|
font-family: "'Space Grotesk', sans-serif"
|
|
42
38
|
font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
|
|
@@ -44,3 +40,10 @@ structural:
|
|
|
44
40
|
radius-sm: "4px"
|
|
45
41
|
radius-lg: "4px"
|
|
46
42
|
spacing: "1rem"
|
|
43
|
+
shadow: "4px 4px 0 var(--border)"
|
|
44
|
+
shadow-sm: "3px 3px 0 var(--border)"
|
|
45
|
+
shadow-lg: "6px 6px 0 var(--border)"
|
|
46
|
+
letter-spacing: "-0.02em"
|
|
47
|
+
letter-spacing-wide: "0.15em"
|
|
48
|
+
font-weight: "700"
|
|
49
|
+
text-transform: "uppercase"
|
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
5
5
|
primary: "oklch(0.00 0 0)"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
border: "rgba(20, 20, 20, 0.14)"
|
|
9
9
|
accent: "oklch(0.00 0 0)"
|
|
10
10
|
colorsDark:
|
|
@@ -5,7 +5,7 @@ colors:
|
|
|
5
5
|
accent: "oklch(0.79 0.18 75)"
|
|
6
6
|
text-primary: "rgba(255, 255, 255, 0.92)"
|
|
7
7
|
text-secondary: "rgba(255, 255, 255, 0.55)"
|
|
8
|
-
text-disabled: "oklch(0.
|
|
8
|
+
text-disabled: "oklch(0.55 0.02 261)"
|
|
9
9
|
border: "rgba(255, 255, 255, 0.18)"
|
|
10
10
|
extras:
|
|
11
11
|
accent-amber: "oklch(0.79 0.18 75)"
|
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
primary: "oklch(0.78 0.12 85)"
|
|
5
5
|
secondary: "oklch(0.80 0.06 240)"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
border: "rgba(20, 20, 20, 0.14)"
|
|
9
9
|
success: "oklch(0.75 0.12 155)"
|
|
10
10
|
error: "oklch(0.65 0.18 25)"
|
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
5
5
|
primary: "oklch(0.58 0.20 35)"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
border: "rgba(20, 20, 20, 0.14)"
|
|
9
9
|
accent: "oklch(0.58 0.20 35)"
|
|
10
10
|
colorsDark:
|
|
@@ -11,7 +11,7 @@ colorsDark:
|
|
|
11
11
|
surface: "oklch(0.22 0.04 60)"
|
|
12
12
|
accent: "oklch(0.72 0.18 70)"
|
|
13
13
|
text-primary: "oklch(0.95 0.01 80)"
|
|
14
|
-
text-secondary: "oklch(0.
|
|
14
|
+
text-secondary: "oklch(0.66 0.03 60)"
|
|
15
15
|
border: "oklch(0.35 0.04 60)"
|
|
16
16
|
extras:
|
|
17
17
|
accent-text: "oklch(1.00 0 0)"
|
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
border: "rgba(20, 20, 20, 0.14)"
|
|
5
5
|
background: "#fff"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
9
9
|
colorsDark:
|
|
10
10
|
accent: "oklch(0.89 0.01 250)"
|
package/themes/colors/edge.yaml
CHANGED
|
@@ -7,7 +7,7 @@ colors:
|
|
|
7
7
|
error: "oklch(0.55 0.20 25)"
|
|
8
8
|
accent: "oklch(0.38 0.17 295)"
|
|
9
9
|
background: "#fff"
|
|
10
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
10
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
11
11
|
colorsDark:
|
|
12
12
|
accent: "oklch(0.62 0.17 295)"
|
|
13
13
|
border: "rgba(255, 255, 255, 0.18)"
|
|
@@ -3,7 +3,7 @@ colors:
|
|
|
3
3
|
background: "oklch(0.88 0.01 90)"
|
|
4
4
|
accent: "oklch(0.90 0.20 110)"
|
|
5
5
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
6
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
6
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
7
7
|
border: "rgba(20, 20, 20, 0.14)"
|
|
8
8
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
9
9
|
colorsDark:
|
package/themes/colors/mesh.yaml
CHANGED
|
@@ -3,7 +3,7 @@ colors:
|
|
|
3
3
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
4
4
|
accent: "oklch(0.87 0.28 145)"
|
|
5
5
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
6
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
6
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
7
7
|
border: "rgba(20, 20, 20, 0.14)"
|
|
8
8
|
background: "#fff"
|
|
9
9
|
colorsDark:
|
|
@@ -4,7 +4,7 @@ colors:
|
|
|
4
4
|
surface: "rgba(255, 255, 255, 0.85)"
|
|
5
5
|
accent: "oklch(0.55 0.24 28)"
|
|
6
6
|
text-primary: "rgba(20, 20, 20, 0.92)"
|
|
7
|
-
text-secondary: "rgba(20, 20, 20, 0.
|
|
7
|
+
text-secondary: "rgba(20, 20, 20, 0.66)"
|
|
8
8
|
border: "rgba(20, 20, 20, 0.14)"
|
|
9
9
|
colorsDark:
|
|
10
10
|
accent: "oklch(0.45 0.24 28)"
|