@vibes.diy/prompts 14.1.41 → 14.1.48

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.
Files changed (55) hide show
  1. package/generation-variety.d.ts +16 -3
  2. package/generation-variety.js +27 -25
  3. package/generation-variety.js.map +1 -1
  4. package/index.d.ts +1 -0
  5. package/index.js +1 -0
  6. package/index.js.map +1 -1
  7. package/llms/access.md +3 -1
  8. package/llms/backend.md +5 -5
  9. package/llms/create-vibe.md +2 -2
  10. package/llms/fireproof.initial.md +24 -24
  11. package/llms/fireproof.md +24 -24
  12. package/llms/p5.md +6 -7
  13. package/llms/three-js.md +32 -41
  14. package/llms/use-viewer.initial.md +2 -2
  15. package/llms/use-viewer.md +2 -2
  16. package/llms/webxr.md +5 -5
  17. package/package.json +6 -4
  18. package/prompts.d.ts +4 -0
  19. package/prompts.js +47 -16
  20. package/prompts.js.map +1 -1
  21. package/style-prompts.js +1 -1
  22. package/system-prompt-initial-oneshot.md +10 -9
  23. package/system-prompt-initial.md +10 -9
  24. package/system-prompt.md +34 -28
  25. package/themes/color-math.d.ts +42 -0
  26. package/themes/color-math.js +184 -0
  27. package/themes/color-math.js.map +1 -0
  28. package/themes/colors/house.yaml +57 -0
  29. package/themes/colors/mesh.yaml +0 -1
  30. package/themes/colors/orbit.yaml +0 -1
  31. package/themes/colors/rift.yaml +0 -1
  32. package/themes/colorsets-bundle.js +64 -3
  33. package/themes/colorsets-bundle.js.map +1 -1
  34. package/themes/colorsets.d.ts +16 -0
  35. package/themes/colorsets.js +202 -24
  36. package/themes/colorsets.js.map +1 -1
  37. package/themes/fonts.d.ts +1 -0
  38. package/themes/fonts.js +23 -0
  39. package/themes/fonts.js.map +1 -1
  40. package/themes/house.md +174 -0
  41. package/themes/index.d.ts +1 -1
  42. package/themes/index.js +8 -1
  43. package/themes/index.js.map +1 -1
  44. package/themes/looks/house/brief.md +45 -0
  45. package/themes/looks/house/variety.d.ts +3 -0
  46. package/themes/looks/house/variety.js +35 -0
  47. package/themes/looks/house/variety.js.map +1 -0
  48. package/themes/looks/index.d.ts +15 -0
  49. package/themes/looks/index.js +68 -0
  50. package/themes/looks/index.js.map +1 -0
  51. package/themes/palette-gen.d.ts +1 -39
  52. package/themes/palette-gen.js +7 -181
  53. package/themes/palette-gen.js.map +1 -1
  54. package/themes/style-presets.js +10 -0
  55. package/themes/style-presets.js.map +1 -1
package/themes/fonts.js CHANGED
@@ -17,6 +17,12 @@ export const VIBE_FONTS = [
17
17
  family: `'DM Sans', ${SYSTEM_STACK}`,
18
18
  importUrl: "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap",
19
19
  },
20
+ {
21
+ slug: "nunito",
22
+ label: "Nunito",
23
+ family: `'Nunito', ${SYSTEM_STACK}`,
24
+ importUrl: "https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap",
25
+ },
20
26
  {
21
27
  slug: "space-grotesk",
22
28
  label: "Space Grotesk",
@@ -77,4 +83,21 @@ const BY_SLUG = new Map(VIBE_FONTS.map((f) => [f.slug, f]));
77
83
  export function getVibeFont(slug) {
78
84
  return slug === undefined ? undefined : BY_SLUG.get(slug);
79
85
  }
86
+ function primaryFamily(stack) {
87
+ return /['"]([^'"]+)['"]/.exec(stack)?.[1];
88
+ }
89
+ const BY_PRIMARY_FAMILY = new Map(VIBE_FONTS.flatMap((f) => {
90
+ const primary = f.importUrl === undefined ? undefined : primaryFamily(f.family);
91
+ return primary === undefined ? [] : [[primary, f]];
92
+ }));
93
+ export function getVibeFontByFamily(stack) {
94
+ if (stack === undefined)
95
+ return undefined;
96
+ for (const match of stack.matchAll(/['"]([^'"]+)['"]/g)) {
97
+ const font = BY_PRIMARY_FAMILY.get(match[1]);
98
+ if (font !== undefined)
99
+ return font;
100
+ }
101
+ return undefined;
102
+ }
80
103
  //# sourceMappingURL=fonts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../jsr/themes/fonts.ts"],"names":[],"mappings":"AA4BA,MAAM,YAAY,GAAG,qFAAqF,CAAC;AAE3G,MAAM,CAAC,MAAM,UAAU,GAAwB;IAC7C;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,YAAY;KACrB;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,YAAY,YAAY,EAAE;QAClC,SAAS,EAAE,8EAA8E;KAC1F;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,cAAc,YAAY,EAAE;QACpC,SAAS,EAAE,gFAAgF;KAC5F;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,oBAAoB,YAAY,EAAE;QAC1C,SAAS,EAAE,sFAAsF;KAClG;IACD;QACE,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,eAAe,YAAY,EAAE;QACrC,SAAS,EAAE,iFAAiF;KAC7F;IACD;QACE,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,iBAAiB,YAAY,EAAE;QACvC,SAAS,EAAE,kEAAkE;KAC9E;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,kBAAkB;QACzB,MAAM,EAAE,uDAAuD;QAC/D,SAAS,EAAE,yFAAyF;KACrG;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,2CAA2C;QACnD,SAAS,EAAE,6EAA6E;KACzF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,cAAc;QACrB,MAAM,EAAE,qDAAqD;QAC7D,SAAS,EAAE,uFAAuF;KACnG;IACD;QACE,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,gDAAgD;KACzD;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,kDAAkD;QAC1D,SAAS,EAAE,uFAAuF;QAClG,IAAI,EAAE,IAAI;KACX;IACD;QACE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,yCAAyC;QACjD,SAAS,EAAE,6DAA6D;QACxE,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF,MAAM,OAAO,GAAkC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAG3F,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../jsr/themes/fonts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ ---
2
+ name: House
3
+ typography:
4
+ h1:
5
+ fontFamily: Nunito Variable
6
+ fontSize: 2rem
7
+ fontWeight: "800"
8
+ lineHeight: 2.4rem
9
+ letterSpacing: 0em
10
+ h2:
11
+ fontFamily: Nunito Variable
12
+ fontSize: 1.5rem
13
+ fontWeight: "700"
14
+ lineHeight: 2rem
15
+ letterSpacing: 0em
16
+ body-md:
17
+ fontFamily: Nunito Variable
18
+ fontSize: 1rem
19
+ fontWeight: "500"
20
+ lineHeight: 1.6rem
21
+ letterSpacing: 0em
22
+ label-caps:
23
+ fontFamily: Nunito Variable
24
+ fontSize: 0.8125rem
25
+ fontWeight: "700"
26
+ lineHeight: 1.25rem
27
+ letterSpacing: 0.02em
28
+ mono:
29
+ fontFamily: JetBrains Mono
30
+ fontSize: 0.9375rem
31
+ fontWeight: "500"
32
+ lineHeight: 1.5rem
33
+ letterSpacing: 0em
34
+ rounded:
35
+ sm: 12px
36
+ DEFAULT: 20px
37
+ md: 20px
38
+ lg: 32px
39
+ spacing:
40
+ unit: 8px
41
+ sm: 8px
42
+ md: 16px
43
+ lg: 24px
44
+ xl: 48px
45
+ container-max: 960px
46
+ gutter: 20px
47
+ components:
48
+ button-primary:
49
+ backgroundColor: "{colors.primary}"
50
+ textColor: "{colors.on-primary}"
51
+ typography: "{typography.label-caps}"
52
+ rounded: "{rounded.md}"
53
+ padding: 14px
54
+ height: 48px
55
+ button-primary-hover:
56
+ backgroundColor: "{colors.primary}"
57
+ button-secondary:
58
+ backgroundColor: "{colors.secondary}"
59
+ textColor: "{colors.on-secondary}"
60
+ typography: "{typography.label-caps}"
61
+ rounded: "{rounded.md}"
62
+ padding: 14px
63
+ height: 48px
64
+ button-ghost:
65
+ backgroundColor: "{colors.card-background}"
66
+ textColor: "{colors.text}"
67
+ typography: "{typography.label-caps}"
68
+ rounded: "{rounded.md}"
69
+ padding: 14px
70
+ height: 48px
71
+ card:
72
+ backgroundColor: "{colors.card-background}"
73
+ textColor: "{colors.text}"
74
+ rounded: "{rounded.lg}"
75
+ padding: "{spacing.lg}"
76
+ input-field:
77
+ backgroundColor: "{colors.card-background}"
78
+ textColor: "{colors.text}"
79
+ typography: "{typography.body-md}"
80
+ rounded: "{rounded.md}"
81
+ padding: 14px
82
+ badge-active:
83
+ backgroundColor: "{colors.success}"
84
+ textColor: "{colors.on-success}"
85
+ typography: "{typography.label-caps}"
86
+ rounded: "{rounded.sm}"
87
+ padding: 6px
88
+ badge-pending:
89
+ backgroundColor: "{colors.secondary}"
90
+ textColor: "{colors.on-secondary}"
91
+ typography: "{typography.label-caps}"
92
+ rounded: "{rounded.sm}"
93
+ padding: 6px
94
+ ---
95
+
96
+ ## Brand & Style
97
+
98
+ House. A pillowy, pastel design system: soft cushion surfaces, generous rounding, saturated pastel fills carrying dark ink, and round bold typography. The mood is warm and tactile — furniture, not chrome. Every raised thing reads as something you could press: an inner highlight along its top edge, an inner shadow along its floor, and a soft cast beneath it. Never hard offset shadows, never hairline corners, never white text on a pastel fill.
99
+
100
+ The theme **respects the visitor's system color scheme**: light is canonical (lavender paper canvas, white cards floating on it, deep violet ink), and a dark variant auto-applies on `prefers-color-scheme: dark` (deep violet canvas, near-white ink, the same pastel accents). Apply via a `@media (prefers-color-scheme: dark)` block — never hard-code one mode only.
101
+
102
+ ## Colors
103
+
104
+ The palette is a lavender page with pastel fills and one ink that carries every piece of text. Read the exact values from the `colors` and `colorsDark` frontmatter blocks — the prose below describes roles, not literal values.
105
+
106
+ - **Primary (`{{primary}}`):** Primary actions and hero accents. Always uses `on-primary` for text on top — dark ink, never white.
107
+ - **Secondary (`{{secondary}}`):** Highlights, hover fills, playful accents. Always uses `on-secondary` for text.
108
+ - **Success (`{{success}}`):** Active/success states, confirmations, toggle-on. Uses `on-success` for text.
109
+ - **Info (`{{info}}`):** Informational accents and quiet callouts. Uses `on-info` for text.
110
+ - **Background (`{{background}}`):** The lavender page. Never white in light mode — it is what makes the cards float.
111
+ - **Card Background (`{{card-background}}`):** Solid card surfaces sitting on the page. Keep them untinted.
112
+ - **Text (`{{text}}`):** Primary ink, used on both the page and on every pastel fill.
113
+ - **Muted (`{{muted}}`):** Secondary labels, metadata, captions.
114
+
115
+ Pastels are FILLS, not text colors. A pastel used as type on the page fails contrast; the same pastel as a block behind the ink reads clearly.
116
+
117
+ ## Typography
118
+
119
+ One typeface, two weights of attitude.
120
+
121
+ - **Nunito Variable** is the typeface for all text, headings, labels and buttons. Headings are round and heavy (700-800) with neutral tracking. Labels are sentence case at 700 — never uppercase, never wide tracking.
122
+ - Body text never drops below the base size. Small type is a density choice the page does not need.
123
+ - **JetBrains Mono** is used only for numbers and tabular data.
124
+ - Load from Google Fonts with `display=optional`. No other external dependencies.
125
+
126
+ ## Layout & Spacing
127
+
128
+ A single centered column, max-width 960px, with generous gutters. Cards sit in a loose grid with real air between them; list rows use a tighter cushion scale inside one card rather than a card each.
129
+
130
+ Spacing is based on an 8px unit, with sections separated generously.
131
+
132
+ ## Elevation & Depth
133
+
134
+ Elevation is a CUSHION, never an offset block. Every raised surface layers three parts: an inner highlight along the top edge, an inner shadow along the floor, and a soft cast below. Read the three steps from the `shadow`, `shadow-sm` and `shadow-lg` structural tokens and use them via `var(--vibes-shadow)`, `var(--vibes-shadow-sm)` and `var(--vibes-shadow-lg)`.
135
+
136
+ - **Small:** chips, badges, inline controls.
137
+ - **Default:** cards, buttons, inputs.
138
+ - **Large:** modals, hero cushions, empty states.
139
+ - **Pressed:** drop the cast and translate the element down 2px — the cushion squashes rather than slamming.
140
+
141
+ ## Shapes
142
+
143
+ Generous rounding everywhere: 20px on controls, 32px on cards, 12px on the smallest chips. Nothing is square. Borders are quiet — a 1px line in the border token, or none at all where the fill already separates the surfaces.
144
+
145
+ ## Components
146
+
147
+ ### Action Elements
148
+
149
+ Buttons are chunky: 48px tall, 20px radius, a pastel fill with ink text and the cushion shadow. Primary uses `primary` + `on-primary`; secondary uses `secondary` + `on-secondary`; ghost uses `card-background` with no cast until hover. Press translates down 2px and drops the cast. Transitions resolve in 0.15s.
150
+
151
+ ### Containers & Surfaces
152
+
153
+ Cards are solid `card-background` with a 32px radius and the default cushion. Keep card backgrounds untinted — the color comes from the content, not the container. One accent per view: a single pastel does the pointing, the rest of the surface stays quiet.
154
+
155
+ ### Inputs & Selection
156
+
157
+ Inputs use the card surface, a 20px radius, 14px padding, and a soft inner floor shadow so they read as recessed rather than raised. Focus lifts the ring to the primary token. Checkboxes and toggles are rounded cushions with a pastel fill when on.
158
+
159
+ ### Tables
160
+
161
+ Full-bleed inside a card. Headers are sentence-case labels in the muted token; rows are separated by generous padding rather than rules. Numeric columns use JetBrains Mono. Row hover fills with the neutral token.
162
+
163
+ ## Do's and Don'ts
164
+
165
+ - DO give every raised surface the cushion shadow trio
166
+ - DO put dark ink on every pastel fill
167
+ - DO keep the page lavender so white cards float on it
168
+ - DO use one accent per view and let the rest stay quiet
169
+ - DO keep labels sentence case at a readable size
170
+ - DON'T use hard offset shadows
171
+ - DON'T put white text on a pastel fill
172
+ - DON'T use square or near-square corners
173
+ - DON'T tint card surfaces toward the accents
174
+ - DON'T shrink body text below the base size
package/themes/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export declare const curatedThemes: VibesTheme[];
10
10
  export declare function getThemeCatalogNames(): ReadonlySet<string>;
11
11
  export declare function getThemeBySlug(slug: string): VibesTheme | undefined;
12
12
  export declare function getColorsetCatalogNames(): ReadonlySet<string>;
13
- export { CANONICAL_STRUCTURAL, CANONICAL_TOKENS, TOKEN_ALIASES, composeDesignMd, cssVarName, deriveCanonical, deriveStructural, parseColorsetYaml, renderRootCssBlock, type CanonicalStructuralToken, type CanonicalToken, type Colorset, } from "./colorsets.js";
13
+ export { CANONICAL_STRUCTURAL, CANONICAL_TOKENS, TOKEN_ALIASES, composeDesignMd, cssVarName, deriveCanonical, deriveStructural, parseColorsetYaml, renderLookTokenDisciplineBlock, renderRootCssBlock, type CanonicalStructuralToken, type CanonicalToken, type Colorset, } from "./colorsets.js";
14
14
  export declare function parseDesignMd(content: string, slug?: string): VibesTheme;
15
15
  export * from "./palette-gen.js";
16
16
  export * from "./fonts.js";
package/themes/index.js CHANGED
@@ -103,6 +103,13 @@ export const vibesThemes = [
103
103
  bodyFont: "'Cinzel', serif",
104
104
  },
105
105
  { slug: "hearth", name: "Hearth Sim", accentColor: "oklch(0.38 0.17 295)", bgColor: "#fff", bodyFont: "'Nunito', sans-serif" },
106
+ {
107
+ slug: "house",
108
+ name: "House",
109
+ accentColor: "#c9a8ff",
110
+ bgColor: "#f0e9ff",
111
+ bodyFont: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif",
112
+ },
106
113
  {
107
114
  slug: "industrial",
108
115
  name: "Industrial",
@@ -257,7 +264,7 @@ const colorsetCatalogNames = new Set(vibesThemes.map((t) => t.slug));
257
264
  export function getColorsetCatalogNames() {
258
265
  return colorsetCatalogNames;
259
266
  }
260
- export { CANONICAL_STRUCTURAL, CANONICAL_TOKENS, TOKEN_ALIASES, composeDesignMd, cssVarName, deriveCanonical, deriveStructural, parseColorsetYaml, renderRootCssBlock, } from "./colorsets.js";
267
+ export { CANONICAL_STRUCTURAL, CANONICAL_TOKENS, TOKEN_ALIASES, composeDesignMd, cssVarName, deriveCanonical, deriveStructural, parseColorsetYaml, renderLookTokenDisciplineBlock, renderRootCssBlock, } from "./colorsets.js";
261
268
  export function parseDesignMd(content, slug) {
262
269
  const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
263
270
  const frontmatter = fmMatch ? fmMatch[1] : "";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/themes/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/themes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ The house look is a room made of cushions. Every surface is a soft, pillowy object resting on a pale page: puffed along its top edge, settled along its floor, casting a gentle shadow onto the paper beneath it. Nothing is flat, nothing is hard-edged, nothing shouts. The mood is calm, generous and tactile — a screen you want to press. Build all of it from plain utility classes, because this theme already backs them with its own values: `bg-background` is the page, `bg-card text-card-foreground` is every floating cushion, `shadow-md` carries the cushion, `rounded-lg` keeps the corners soft, `font-sans` is the app's face, and the pastel fills — `bg-primary`, `bg-secondary`, `bg-accent` — do the colouring. Each of those utilities resolves to this theme's own `var(--…)` token at paint time, so you never have to spell a token yourself.
2
+
3
+ ## Composition
4
+
5
+ Inside whatever shape the layout archetype gives you, give the page real air — `gap-6` between siblings and about twice that between sections, taking every number from the spacing scale (`p-4`, `p-6`, `gap-4`, `mt-8`, `space-y-6`). Cards sit in a loose grid and are allowed to be large: two or three across on a wide screen, one on a phone, and they never touch. List rows use the same cushion shape on a tighter scale — `p-3` rather than `p-6`, `rounded-md` rather than `rounded-lg`, `shadow-sm` rather than `shadow-md` — but they stay distinct raised objects, never a strip cut by dividers. An empty state is a single big cushion with one round heading and one chunky `bg-primary text-primary-foreground` control, not a stranded line of small grey text. Group by whitespace rather than by rules: a divider is the last resort, and `border-border` appears only where two cushions would otherwise blur into one another.
6
+
7
+ ## Typography
8
+
9
+ Put `font-sans` once on the app's root element and never name a face again — every child inherits it. Headings are round, bold and short: reach for `font-bold` and let a heading sit large enough (`text-2xl`, `text-3xl`) to read as a friendly announcement rather than a system label. Body copy stays at `text-base` or above and never shrinks to fit; if a card is crowded, cut content, not type. Set words in `text-foreground` on the page and `text-card-foreground` inside a cushion, and reach for `text-muted-foreground` only for genuine metadata — a timestamp, a count, the helper line under a field. Uppercase tracking belongs to a different look entirely: no caps-and-spacing labels, no hairline weights, no all-lowercase affectation. A number in a stat earns size and weight, never a second colour.
10
+
11
+ ## Surfaces and tone
12
+
13
+ A cushion is three things at once: an inner highlight along its top edge, an inner shadow along its floor, and a soft cast beneath it onto the page. `shadow-md` already carries that whole recipe — put it on every raised surface and let it do the work. `shadow-lg` is for the one object that must float above everything else, `shadow-sm` for chips and rows. Cards are `bg-card` and stay untinted. The pastel roles are FILLS, not text colours: a filled control, a badge, a selected tab, a progress bar. Whatever the fill, its label is ink: every `bg-*` in this theme has a matching `text-*-foreground`, states included, because a pale foreground on a pastel fill is the fastest way to fail contrast in this palette. Spend one accent per view: let `bg-primary` mark the action that matters and keep `bg-secondary` and `bg-accent` rare. Controls are chunky and answer a press by sinking — `active:translate-y-px active:shadow-sm` — fast enough to feel like a key bottoming out rather than a fade.
14
+
15
+ ## Components
16
+
17
+ The app's chrome is BUILT from the look's component package, never rebuilt by hand: `import { Button, Card, CardHeader, CardTitle, CardContent, Input, Textarea, Label, Badge, Tabs, Separator, Skeleton, Table, Progress, cn } from "@vibes.diy/look";` and, for anything that floats over the page, `import { Dialog, Sheet, Popover, Select, DropdownMenu, Tooltip } from "@vibes.diy/look/overlay";`. Both bare specifiers resolve in the sandbox's import map — nothing to install. Hand-rolling one of them is a defect: they already carry the cushion recipe, the corner and the ink-on-pastel rule. A person is never a plain element: a person is `useViewer()`'s `<ViewerTag userHandle={...} />`, and picking a person is its `<HandleInput />` — `Input` is for text that is not a person. `Separator` is the one permitted divider and `Progress` the only bar. Everything else the package does not cover is a plain element you style by hand.
18
+
19
+ A look component never takes a `c.*` entry and never a styling utility: `c.*` entries are for plain elements, and a component's `className` is a placement string or nothing — sizing (`w-full`, `min-w-0`, `h-10`), margin (`mt-4`, `mx-auto`), flex and grid placement (`flex-1`, `shrink-0`, `col-span-2`), display and position (`hidden md:block`, `relative`, `z-10`) and overflow. To change how one looks, pass its props: `Button` takes `variant` (`default`, `secondary`, `destructive`, `outline`, `ghost`) and `size` (`sm`, `default`, `lg`, `icon`), and `Badge` takes `variant` (`default`, `secondary`, `destructive`, `outline`).
20
+
21
+ ## DO
22
+
23
+ - Float every card on `bg-card text-card-foreground` and let the `bg-background` page carry the colour underneath it.
24
+ - Give each raised object `shadow-md` and `rounded-lg` so it reads as a cushion and not a panel.
25
+ - Pair every pastel fill with its ink — `bg-primary text-primary-foreground`, and the same shape for `secondary`, `accent`, `destructive`, `success`, `warning` and `neutral`; a switched-off word is `text-disabled-foreground`.
26
+ - Spend one accent per view and let `bg-primary` mark the single action that matters most.
27
+ - Make controls chunky and let them sink on press with `active:translate-y-px active:shadow-sm`.
28
+ - Keep metadata in `text-muted-foreground` and leave every other word in `text-foreground` or `text-card-foreground`.
29
+ - Scale list rows down with `rounded-md`, `p-3` and `shadow-sm` while keeping them raised, separate objects.
30
+ - Set `font-sans` once on the root element and let every child inherit the face.
31
+ - Render a person with `<ViewerTag userHandle={...} />` and pick one with `<HandleInput />`.
32
+
33
+ ## DON'T
34
+
35
+ - Do not write an arbitrary-value class such as `bg-[var(--surface)]`, `rounded-[…]`, `shadow-[…]` or `p-[var(--vibes-spacing)]` — the plain utilities above already resolve to this theme.
36
+ - Do not put `p-*`, `px-*`, `bg-*`, `text-*`, `border-*`, `rounded-*`, `shadow-*`, `gap-*` or `hover:*` on a `@vibes.diy/look` component's `className`; only placement classes belong there.
37
+ - Do not reach for `className` where a prop does the job — a `Button` changes with `variant` and `size`, and a component with no such prop gets a plain `div` wrapper that carries the styling.
38
+ - Do not write an inline `style` attribute.
39
+ - Do not write a `:root` block or redefine any `var(--…)` the app already ships.
40
+ - Do not name a literal colour, size, shadow or font stack anywhere — every value arrives through a utility this theme backs.
41
+ - Do not put pale or white type on a pastel fill; this palette is built for ink on pastel.
42
+ - Do not separate content with hard borders, hairline dividers or sharp corners when air will do it.
43
+ - Do not use uppercase tracking, hairline weights, or body type below `text-base`.
44
+ - Do not tint a card toward an accent, stack two strong fills in one view, or reach for a gradient.
45
+ - Do not hand a look component a `c.*` entry; `c` styles plain elements.
@@ -0,0 +1,3 @@
1
+ import type { LookVarietyDialect } from "../../../generation-variety.js";
2
+ export declare const HOUSE_EXCLUDED_FLOURISHES: readonly string[];
3
+ export declare const HOUSE_VARIETY: LookVarietyDialect;
@@ -0,0 +1,35 @@
1
+ export const HOUSE_EXCLUDED_FLOURISHES = [
2
+ "caps-label",
3
+ "inset-divider",
4
+ "bold-stroke",
5
+ "signal-bar",
6
+ "mono-numerals",
7
+ "press-slam",
8
+ ];
9
+ const ARCHETYPES = {
10
+ "single-column-feed": "One generous centred column at every width, newest first. The compose control sits at the top of the column, inside its own cushion, where a thumb reaches it; entries stack below as separate raised cards with `gap-6` between them. Cap the column at a comfortable max width and centre it on a wide screen — never split it into side-by-side columns, and never let two entries touch.",
11
+ "card-grid": "A loose grid of large cushions: one column on a phone, two or three only from `sm:`/`lg:` up, with `gap-6` between them so the page shows through. Every card reads completely on its own at one-column width — never let a card lean on the card beside it to make sense — and no card is tinted toward an accent to stand out from its neighbours.",
12
+ "stacked-sections": "One scrolling page of clearly labelled sections read top to bottom, most important first, each with a round bold heading and about `mt-8` of air before the next. Sections are full width on a phone and may pair up only from `lg:`. Air is what separates them: nothing hidden behind horizontal scroll, and no rule drawn across the page to do a gap's job.",
13
+ "list-detail-sheet": "A scrolling list of rows on the tighter cushion scale — `p-3`, `rounded-md`, `shadow-sm`, still distinct raised objects — and selecting one floats its detail over the list as a full-screen sheet with an obvious close control at its top. That sheet is the package's `Sheet` from the overlay entry, never a hand-rolled panel. The sheet is the one object allowed to float above everything else. The detail may sit beside the list only from `lg:` up, never a permanently split two-pane view on a small screen.",
14
+ "tab-shell": "Two to four top-level areas behind a fixed bottom bar within thumb reach, each area a single scrolling column of cushions. The switch is the package's `Tabs`, never a hand-rolled strip of buttons. The bar rests on the page as its own raised surface, and the selected tab is where this view spends its one accent. If the app genuinely has only one top-level area, drop the bar and build that column — never invent filler tabs to justify the shell.",
15
+ };
16
+ const FLOURISHES = {
17
+ "hover-lift": "A cushion answers a pointer by rising a hair off the page: `hover:-translate-y-px`, keeping its resting `shadow-md`, settling back on leave in well under 200ms. It is the lift that reads, not a change of depth. Hover is decoration only — every affordance stays complete and reachable with no pointer in the room. Put the class on the plain `div` that wraps the cushion, never on a component's own `className`.",
18
+ "accent-rule": "Every section heading is preceded by a short soft bar in `bg-accent` — `h-1 w-8 rounded-full` — sitting immediately above or before the heading text. Same bar, same place, every heading: a bar that wanders is noise, and once the others have one the heading without it looks broken. It is a mark, not a rule across the page. Unless the layout above already spends the accent on a selected tab, this bar is where the accent goes — and either way the single action that matters most still wears `bg-primary`.",
19
+ "signal-states": 'Status is carried by the four signal roles and by nothing else, identically everywhere in the app: `success` for done, `warning` for pending, `destructive` for failed, `accent` for informational or selected. Carry it as a small round mark beside the words — `size-2 rounded-full bg-success` immediately before the status word — and leave the words themselves in `text-foreground` or `text-card-foreground` on their own cushion. Where a pill genuinely reads better, a `Badge` may carry it — but only in the states the package actually has a variant for: `variant="destructive"` for failed, `variant="secondary"` or `variant="outline"` for a neutral tag; there is no success or warning variant, so those two keep the round mark rather than asking for a pill nothing can fill. Never invent a fifth status colour, never let one state wear two colours in two views, and never set type straight onto a signal fill except in that fill\'s own `text-*-foreground` ink.',
20
+ "slab-heading": "Headings come in a strict two-step ladder and nothing more: this view's ONE top-level heading, then sub-headings exactly one step down from it, every one of them flush to the left edge of its cushion so the reader's eye tracks a single vertical line down the page. Never two headings at the same weight in one view, and never a third step — a hierarchy the reader has to work out is not a hierarchy. The ladder is per VIEW, so a sheet or a tab opens with a top-level heading of its own rather than inheriting the page's.",
21
+ "focus-halo": "Every focusable control takes a visible `focus-visible:ring-2 focus-visible:ring-ring`, clearly distinct from the soft edge it rests on, so a keyboard gets the clarity a pointer gets for free. EVERY control, not a chosen few, and never `outline-none` without putting a ring back. The package's own controls already carry this — match it on anything you build from a plain element.",
22
+ "item-stagger": "Cushions entering any repeated list or grid fade and rise into place over at most 200ms, staggered slightly by index so the set arrives like a dealt hand rather than a dropped one — then settle and stay still. It is classes on the plain wrapper element each cushion sits in, never on a look component and never a `c.*` entry: `transition-all duration-200 ease-out starting:opacity-0 starting:translate-y-1`, plus one bucketed delay chosen by index, `['delay-0', 'delay-75', 'delay-150', 'delay-200', 'delay-300'][Math.min(i, 4)]`. the CSS @starting-style rule makes it entry-only by construction, so there is no state to hold and nothing to clean up — never an inline `style` and never a `<style>` tag. Entry only: nothing loops, nothing pulses, and nothing moves while someone is trying to read it.",
23
+ "quiet-metadata": "Metadata gets a LINE OF ITS OWN, beneath the thing it describes and never trailing it: a timestamp, an author, a count or a source sits under the primary line, so the primary line is the only thing on its row and one glance takes it whole. That placement is the rule everywhere the app repeats a row or a cushion — a single item with its metadata tucked inline breaks the column the others make. Body copy itself never drops a step to buy the room: if a cushion is crowded, cut content. The restraint is the effect — the primary line only reads as loud because everything around it agreed to be quiet.",
24
+ };
25
+ export const HOUSE_VARIETY = {
26
+ excludedFlourishes: HOUSE_EXCLUDED_FLOURISHES,
27
+ archetypeGuidance: ARCHETYPES,
28
+ flourishGuidance: FLOURISHES,
29
+ framing: {
30
+ archetypeCoda: "This is THIS app's structural shape, built out of the cushions the look brief describes and grouped by air rather than by rules. Build the whole app inside this one shape: do not blend two archetypes, and do not fall back to a desktop shape that a phone then has to recover from.",
31
+ flourishIntro: "These are this app's ornamental touches, drawn for it and written in the look's own voice. Apply each one everywhere its affordance occurs, with no exceptions and no half-measures — a touch applied to three of five places does not read as restraint, it reads as a bug:",
32
+ flourishCoda: "These touches ride BESIDE the look brief above, never instead of it. Where a touch and the brief speak about the same element, the brief still governs: its cushion recipe, its ink-on-pastel pairing, its one-accent-per-view budget and its rule about what a component's `className` may carry all hold, and a touch only ever adds to them. Every mechanic above is a plain utility this theme already backs — never a literal colour, size, shadow or font stack, and never an arbitrary-value class such as `shadow-[var(--vibes-shadow)]`, because the owner restyles the whole app by swapping token values and anything frozen into a hover or focus state survives that invisibly. Where a touch styles something the component package owns, put the class on the plain `div` that wraps it, never on the component's own `className`.",
33
+ },
34
+ };
35
+ //# sourceMappingURL=variety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variety.js","sourceRoot":"","sources":["../../../../jsr/themes/looks/house/variety.ts"],"names":[],"mappings":"AA+FA,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,YAAY;IACZ,eAAe;IACf,aAAa;IACb,YAAY;IACZ,eAAe;IACf,YAAY;CACb,CAAC;AAEF,MAAM,UAAU,GAAqC;IACnD,oBAAoB,EAClB,8XAA8X;IAChY,WAAW,EACT,sVAAsV;IACxV,kBAAkB,EAChB,iWAAiW;IACnW,mBAAmB,EACjB,2fAA2f;IAC7f,WAAW,EACT,gcAAgc;CACnc,CAAC;AAEF,MAAM,UAAU,GAAqC;IACnD,YAAY,EACV,2ZAA2Z;IAC7Z,aAAa,EACX,2fAA2f;IAC7f,eAAe,EACb,i8BAAi8B;IACn8B,cAAc,EACZ,0gBAA0gB;IAC5gB,YAAY,EACV,8XAA8X;IAChY,cAAc,EACZ,iyBAAiyB;IACnyB,gBAAgB,EACd,2lBAA2lB;CAC9lB,CAAC;AAOF,MAAM,CAAC,MAAM,aAAa,GAAuB;IAC/C,kBAAkB,EAAE,yBAAyB;IAC7C,iBAAiB,EAAE,UAAU;IAC7B,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE;QACP,aAAa,EACX,yRAAyR;QAC3R,aAAa,EACX,8QAA8Q;QAChR,YAAY,EACV,mzBAAmzB;KACtzB;CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type LookVarietyDialect, type VarietyPinCheck } from "../../generation-variety.js";
2
+ export interface LookChecklistItem {
3
+ readonly id: string;
4
+ readonly text: string;
5
+ }
6
+ export declare const LOOK_SLUGS_WITH_BRIEF: ReadonlySet<string>;
7
+ export declare function hasLookBrief(slug: string): boolean;
8
+ export declare function LOOK_BRIEF_ASSET_PATH(slug: string): string;
9
+ export declare function renderLookBrief(md: string, opts: {
10
+ components: boolean;
11
+ }): string;
12
+ export declare function lookChecklistFor(md: string): readonly LookChecklistItem[];
13
+ export declare function lookVarietyDialect(slug: string): LookVarietyDialect | undefined;
14
+ export declare function lookEligibleFlourishes(slug: string): readonly string[];
15
+ export declare function validateVarietyPinForLook(candidate: unknown, slug: string): VarietyPinCheck;
@@ -0,0 +1,68 @@
1
+ import { FLOURISHES, validateVarietyPin } from "../../generation-variety.js";
2
+ import { HOUSE_VARIETY } from "./house/variety.js";
3
+ export const LOOK_SLUGS_WITH_BRIEF = new Set(["house"]);
4
+ export function hasLookBrief(slug) {
5
+ return LOOK_SLUGS_WITH_BRIEF.has(slug);
6
+ }
7
+ export function LOOK_BRIEF_ASSET_PATH(slug) {
8
+ return `./themes/looks/${slug}/brief.md`;
9
+ }
10
+ const COMPONENTS_HEADING = "## Components";
11
+ const NEXT_SECTION_RE = /^## /m;
12
+ export function renderLookBrief(md, opts) {
13
+ if (opts.components)
14
+ return md;
15
+ const match = /^## Components$/m.exec(md);
16
+ if (!match)
17
+ return md;
18
+ const start = match.index;
19
+ const afterHeading = start + COMPONENTS_HEADING.length;
20
+ const rest = md.slice(afterHeading);
21
+ const next = NEXT_SECTION_RE.exec(rest);
22
+ const end = next ? afterHeading + next.index : md.length;
23
+ return md.slice(0, start) + md.slice(end);
24
+ }
25
+ function sectionBullets(md, headingRe) {
26
+ const match = headingRe.exec(md);
27
+ if (!match)
28
+ return [];
29
+ const rest = md.slice(match.index + match[0].length);
30
+ const next = NEXT_SECTION_RE.exec(rest);
31
+ const section = next ? rest.slice(0, next.index) : rest;
32
+ return section
33
+ .split("\n")
34
+ .filter((line) => line.startsWith("- "))
35
+ .map((line) => line.slice(2).trim());
36
+ }
37
+ export function lookChecklistFor(md) {
38
+ const dos = sectionBullets(md, /^## DO$/m);
39
+ const donts = sectionBullets(md, /^## DON'T$/m);
40
+ return [...dos.map((text, i) => ({ id: `do-${i + 1}`, text })), ...donts.map((text, i) => ({ id: `dont-${i + 1}`, text }))];
41
+ }
42
+ const LOOK_VARIETY_DIALECTS = new Map([["house", HOUSE_VARIETY]]);
43
+ export function lookVarietyDialect(slug) {
44
+ return LOOK_VARIETY_DIALECTS.get(slug);
45
+ }
46
+ export function lookEligibleFlourishes(slug) {
47
+ const dialect = lookVarietyDialect(slug);
48
+ const all = FLOURISHES.map((f) => f.id);
49
+ if (dialect === undefined)
50
+ return all;
51
+ return all.filter((id) => dialect.excludedFlourishes.includes(id) === false);
52
+ }
53
+ export function validateVarietyPinForLook(candidate, slug) {
54
+ const checked = validateVarietyPin(candidate);
55
+ if (checked.ok === false)
56
+ return checked;
57
+ const eligible = lookEligibleFlourishes(slug);
58
+ const ineligible = checked.pin.flourishes.filter((f) => eligible.includes(f) === false);
59
+ if (ineligible.length === 0)
60
+ return checked;
61
+ return {
62
+ ok: false,
63
+ message: `Flourish(es) ${ineligible.map((i) => `"${i}"`).join(", ")} cannot be pinned on the "${slug}" look: ` +
64
+ `its brief either forbids the mechanic or already gives it to every app, so the prompt would not voice it.\n` +
65
+ `Eligible flourishes for "${slug}": ${eligible.join(", ")}`,
66
+ };
67
+ }
68
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../jsr/themes/looks/index.ts"],"names":[],"mappings":"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"}
@@ -1,42 +1,5 @@
1
1
  import { type CanonicalToken } from "./colorsets.js";
2
- export interface Rgb {
3
- r: number;
4
- g: number;
5
- b: number;
6
- a: number;
7
- }
8
- export interface Oklch {
9
- l: number;
10
- c: number;
11
- h: number;
12
- a: number;
13
- }
14
- export declare function oklchToRgbUnclamped(o: Omit<Oklch, "a"> & {
15
- a?: number;
16
- }): Rgb;
17
- export declare function toOklch(rgb: Rgb | undefined): Oklch | undefined;
18
- export declare function gamutMap(o: {
19
- l: number;
20
- c: number;
21
- h: number;
22
- }): {
23
- l: number;
24
- c: number;
25
- h: number;
26
- };
27
- export declare function oklchCss(l: number, c: number, h: number): string;
28
- export declare function parseCssColor(css: string | undefined): Rgb | undefined;
29
- export declare function resolveTokenColor(args: {
30
- css: string | undefined;
31
- tokens: Readonly<Record<string, string>>;
32
- depth?: number;
33
- }): Rgb | undefined;
34
- export declare function composite(fg: Rgb, bg: Rgb): Rgb;
35
- export declare function contrastRatio(fgCss: string | undefined, bgCss: string | undefined): number | undefined;
36
- export declare function contrastOf(args: {
37
- fg: Rgb;
38
- bg: Rgb;
39
- }): number;
2
+ export * from "./color-math.js";
40
3
  export type HueControl = {
41
4
  readonly mode: "derived";
42
5
  } | {
@@ -99,7 +62,6 @@ export interface GeneratedPalette {
99
62
  export declare const CHARACTER_PRESETS: Record<string, PaletteCharacter>;
100
63
  export declare function cuspLightness(hue: number): number;
101
64
  export declare function cuspTarget(hue: number, chroma: number): number;
102
- export declare function bestOnColor(fillCss: string): string;
103
65
  export declare function generatePalette(seed: PaletteSeed): GeneratedPalette;
104
66
  export interface ContrastCheck {
105
67
  mode: PaletteMode;