@vibes.diy/prompts 14.3.59 → 14.3.64

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/llms/access.md CHANGED
@@ -455,6 +455,8 @@ Every item a visitor creates lands on their own `user:<handle>` channel, private
455
455
 
456
456
  **When a user's work is private by default, show it — and offer a way to publish.** If everything a user does routes to a channel only they can read (a per-user `user:<handle>`, a private journal/notes/tracker with no `grant.public`), the UI must say so: a small, persistent "Only you can see this" / "Private to you" cue near their content, so no one wonders who's watching their unfinished work. Then, where sharing fits the app, give them a publish control — but publish at the granularity of a **channel**, not a doc: channels are the unit of read isolation, so adding `grant.public` to the shared `user:<handle>` channel would expose _every_ private item on it, not just the one they meant to share. To publish a single item, route it to its **own** channel and flip only that channel's read-grant from a `visibility` field the access fn reads — exactly the per-item-channel shape the worked example below uses (`const ch = \`entry:${doc._id}\`; const grant = { users: { [user.userHandle]: [ch] } }; if (doc.visibility === "public") grant.public = [ch];`) — for anonymous visitors, or grant a shared app channel for all granted members. Gate the control on `useVibe(dbName).can`, and reflect the result back in the affordance ("Published — anyone can see this", with an unpublish to flip it back). Making the user's _whole_ space public is fine when that's the intent; silently leaking their other private items by publishing one is the trap to avoid. **If the person asked, in their own words, to keep it to themselves — "only I", "just me", "nobody else" — do not add publish/share controls.** A privacy-sensitive domain on its own (a journal, a health tracker) is not that ask: it gets the two controls from _Two controls_ above, off until the person says so. Keep publish opt-in: for only-me apps, omit the publish UI entirely; for share-capable apps, make publish one tap for user-selected items. **Every app that is neither privacy-sensitive nor an only-me ask ships with a sharing path already in it: either an always-on shared channel its records land on, or a publish control.** **An open-nature app — an image or meme wall, a bingo card, a party game — puts its records on an always-on `grant.public` channel from the first rules it ships, builds no publish step, and admits anonymous readers**, so everyone with the link sees what people make the moment they make it. The always-on channel is the least-surprise shape for anything playful and low-stakes (an image or meme wall, a group list, a guestbook): a `grant.public` channel, a members' channel, or an `audience` arm, so a thing someone makes is seen the moment they make it. The publish control is the shape for work people draft first: the per-item channel whose read-grant flips from a `visibility` field, behind one tap. A publish control that names its destination — "Publish to the wall", "Share to the group" — is the best shape of the second, not a requirement. An ordinary app with neither is a bug: every record lands on a channel only its writer can read, and nobody asked for that.
457
457
 
458
+ **A share control is a link only where the record's channel admits anonymous readers; everywhere else it is the person picker, which takes a handle or an email and shows the invite as pending until they arrive.** A link — Copy link, the browser's share sheet, a QR code — is a share only when the person who opens it can read the thing: a record on a `grant.public` channel, always on or flipped by its `visibility` field. A record whose channel is reached only by grants is unreadable through a link, so sharing it means letting a person in: the `HandleInput` picker writes the share doc that grants their handle, exactly as the buddy picker above does, and the same picker takes an email address for someone who is not on the platform yet — it mails them an invite and hands the app an opaque `invite:<id>` subject to store as the invitee, which binds to their handle when they arrive, so the app never holds the address and `ViewerTag` shows them as invited until then and by their handle after. The one link that works on a grant-only thing is the one that lands on a `request` doc: it invites a knock, not a read. An app with a publish control changes the share control's shape with the record's state — the picker before the flip, the link after it.
459
+
458
460
  **Worked example — a shared catalog people track against, with per-thing visibility (a social habit app, a reading challenge, a fitness ladder).** The catalog items are public objects anyone proposes; each person's progress is their own; and each person chooses — _once per item, never per entry_ — whether their streak is public (on the leaderboard) or buddy-only. The visibility choice lives on a per-`(person, item)` **tracking** record that sets the read-grant the entries routed to it inherit.
459
461
 
460
462
  ### `access.js`
@@ -977,6 +979,8 @@ const addCard = async (text, boardId = `default-${me.userHandle}`) => {
977
979
  {canInvite(board._id) && <HandleInput onChange={(h) => addMember(board._id, h)} placeholder="Add a friend…" />}
978
980
  ```
979
981
 
982
+ An email typed into that `HandleInput` reaches `addMember` as an opaque `invite:<id>` subject, stored as `userHandle` like any handle, and `ViewerTag` shows it as invited until they arrive.
983
+
980
984
  App.jsx — the same board list serves the creator and the invited recipient. `BoardContents` uses `board._id` for its content queries, calls `addCard(text, board._id)` and `addMember(board._id, handle)`, and gates its write controls with `can`. Pass the `ensureDefaultBoard` helper above into `BoardWorkspace`; its creation action stays reachable with an empty readable list and selects the person's new board after saving it.
981
985
 
982
986
  ### `App.jsx`
@@ -312,6 +312,8 @@ Give the tag its profile action and the clickable shape needs no wrapper. The ta
312
312
 
313
313
  **The one in-app reason to render a no-prop `<ViewerTag />` is inline avatar self-edit.** A no-prop tag shows the signed-in viewer a dashed edit ring that lets them change their _own_ avatar in place, and that works for **every** signed-in viewer — the Switch's avatar editing is owner-only. So if your app wants any member (not just the owner) to update their photo without leaving the app, render a guarded `{viewer && <ViewerTag />}` for that — otherwise leave the current-viewer pill to the Switch.
314
314
 
315
+ **Invited people.** An `invite:<id>` subject from `HandleInput` renders as an "Invited · not here yet" pill until that person arrives, and from then on as the handle they joined as — avatar and profile tap included — with no change to the stored subject.
316
+
315
317
  **Undefined safety.** If `userHandle` is present in props but falsy (e.g. a missing field from a loop lookup), `ViewerTag` renders a dim italic placeholder instead of the edit ring. This prevents a broken data source from accidentally granting photo-edit access to an arbitrary pill.
316
318
 
317
319
  **Anonymous & always-safe.** `ViewerTag` never throws regardless of login state. A no-prop `<ViewerTag />` renders a "Sign in" button for anonymous viewers — a fine fallback, but it is an identity chip in whatever spot you put it, not a CTA you can word or time. When the goal is conversion, write the prompt yourself and wire it to `requestLogin()`.
@@ -338,6 +340,7 @@ How it behaves:
338
340
  - **Picking one collapses the input into a ViewerTag** for that handle (avatar + name, resolved automatically), with an × to clear and pick again.
339
341
  - **Raw entry always works.** Pressing Enter commits the sanitized typed text even when nothing matched, so users can reference someone brand-new.
340
342
  - `onChange` fires with the picked handle string (or `null` on clear). **Persist only the handle** on your docs — render it later with `<ViewerTag userHandle={...} />`, exactly like `authorHandle`.
343
+ - **It also takes an email address** for someone not on Vibes yet: after the viewer approves the invite, `onChange` receives an opaque `invite:<id>` subject — store it as the invitee exactly like a handle; the app never holds the address.
341
344
  - Works uncontrolled too (omit `value`) when you only need the `onChange` events.
342
345
  - Theming matches `ViewerTag` — it reads the same canonical CSS variables (`--surface`, `--text-primary`, `--text-secondary`, `--border`, `--accent`).
343
346
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/prompts",
3
- "version": "14.3.59",
3
+ "version": "14.3.64",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "exports": {
@@ -13,6 +13,7 @@
13
13
  "./themes/looks/index.js": "./themes/looks/index.js",
14
14
  "./themes/ornament-pad.js": "./themes/ornament-pad.js",
15
15
  "./themes/palette-gen.js": "./themes/palette-gen.js",
16
+ "./themes/pouf-rooms.js": "./themes/pouf-rooms.js",
16
17
  "./themes/style-presets.js": "./themes/style-presets.js",
17
18
  "./themes/theme-slugs.js": "./themes/theme-slugs.js"
18
19
  },
@@ -37,9 +38,9 @@
37
38
  "license": "Apache-2.0",
38
39
  "dependencies": {
39
40
  "@adviser/cement": "~0.5.34",
40
- "@vibes.diy/call-ai-v2": "14.3.59",
41
- "@vibes.diy/identity": "14.3.59",
42
- "@vibes.diy/use-vibes-types": "14.3.59",
41
+ "@vibes.diy/call-ai-v2": "14.3.64",
42
+ "@vibes.diy/identity": "14.3.64",
43
+ "@vibes.diy/use-vibes-types": "14.3.64",
43
44
  "arktype": "~2.2.6",
44
45
  "json-schema-faker": "~0.6.3"
45
46
  },
@@ -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 --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}";
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 --info: #3b82f6;\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 --info: #3b82f6;\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
@@ -8,6 +8,7 @@ export const BRUTALIST_ROOT_CSS = `:root {
8
8
  --text-secondary: #6b6b80;
9
9
  --border: #1a1a2e;
10
10
  --success: #22c55e;
11
+ --info: #3b82f6;
11
12
  --text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));
12
13
  --warning: #f59e0b;
13
14
  --error: #ef4444;
@@ -39,6 +40,7 @@ export const BRUTALIST_ROOT_CSS = `:root {
39
40
  --text-secondary: oklch(0.66 0.03 280);
40
41
  --border: oklch(0.96 0.01 80);
41
42
  --success: #22c55e;
43
+ --info: #3b82f6;
42
44
  --text-disabled: color-mix(in srgb, var(--text-primary) 38%, var(--background));
43
45
  --warning: #f59e0b;
44
46
  --error: #ef4444;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"style-prompts.js","sourceRoot":"","sources":["../jsr/style-prompts.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDhC,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"}
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Aqua
3
+ colors:
4
+ background: "#ebfafb"
5
+ surface: "#ffffff"
6
+ primary: "#8ee6e9"
7
+ secondary: "#d9a8f7"
8
+ accent: "#d9a8f7"
9
+ text-primary: "#092728"
10
+ text-secondary: "#426566"
11
+ text-disabled: "#91a2a3"
12
+ border: "#8ee6e9"
13
+ success: "#a9f4c6"
14
+ warning: "#ffe669"
15
+ error: "#fdb59d"
16
+ neutral: "#e0f3f3"
17
+ info: "#82d9fa"
18
+ colorsDark:
19
+ background: "#081112"
20
+ surface: "#121e1f"
21
+ primary: "#8ee6e9"
22
+ secondary: "#d9a8f7"
23
+ accent: "#d9a8f7"
24
+ text-primary: "#e7f3f3"
25
+ text-secondary: "#9cb7b8"
26
+ text-disabled: "#657576"
27
+ border: "#8ee6e9"
28
+ success: "#a9f4c6"
29
+ warning: "#ffe669"
30
+ error: "#fdb59d"
31
+ neutral: "#182727"
32
+ info: "#82d9fa"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"
@@ -9,6 +9,7 @@ colors:
9
9
  text-secondary: "#6b6b80"
10
10
  border: "#1a1a2e"
11
11
  success: "#22c55e"
12
+ info: "#3b82f6"
12
13
  colorsDark:
13
14
  background: "oklch(0.18 0.02 280)"
14
15
  surface: "oklch(0.22 0.02 280)"
@@ -19,19 +20,18 @@ colorsDark:
19
20
  text-secondary: "oklch(0.66 0.03 280)"
20
21
  border: "oklch(0.96 0.01 80)"
21
22
  success: "#22c55e"
23
+ info: "#3b82f6"
22
24
  extras:
23
25
  on-primary: "#ffffff"
24
26
  on-secondary: "#1a1a2e"
25
27
  on-success: "#1a1a2e"
26
- info: "#3b82f6"
27
- on-info: "#ffffff"
28
+ on-info: "#1a1a2e"
28
29
  primary-light: "rgba(218, 41, 28, 0.1)"
29
30
  extrasDark:
30
31
  on-primary: "#ffffff"
31
32
  on-secondary: "#1a1a2e"
32
33
  on-success: "#1a1a2e"
33
- info: "#3b82f6"
34
- on-info: "#ffffff"
34
+ on-info: "#1a1a2e"
35
35
  primary-light: "rgba(218, 41, 28, 0.18)"
36
36
  structural:
37
37
  font-family: "'Space Grotesk', sans-serif"
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Celery
3
+ colors:
4
+ background: "#f5f9ed"
5
+ surface: "#ffffff"
6
+ primary: "#d8ef92"
7
+ secondary: "#d6a8f8"
8
+ accent: "#d6a8f8"
9
+ text-primary: "#1f2410"
10
+ text-secondary: "#5a6148"
11
+ text-disabled: "#9da093"
12
+ border: "#d8ef92"
13
+ success: "#bcf1b4"
14
+ warning: "#ffe669"
15
+ error: "#fdb59d"
16
+ neutral: "#ecf1e2"
17
+ info: "#80daf8"
18
+ colorsDark:
19
+ background: "#0f1009"
20
+ surface: "#1b1d14"
21
+ primary: "#d8ef92"
22
+ secondary: "#d6a8f8"
23
+ accent: "#d6a8f8"
24
+ text-primary: "#eff1e9"
25
+ text-secondary: "#aeb49f"
26
+ text-disabled: "#707367"
27
+ border: "#d8ef92"
28
+ success: "#bcf1b4"
29
+ warning: "#ffe669"
30
+ error: "#fdb59d"
31
+ neutral: "#23261b"
32
+ info: "#80daf8"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Home
3
+ colors:
4
+ background: "#fffff0"
5
+ surface: "#ffffff"
6
+ primary: "#b6b6ff"
7
+ secondary: "#ffa4e7"
8
+ accent: "#ffa4e7"
9
+ text-primary: "#111111"
10
+ text-secondary: "#555555"
11
+ text-disabled: "#9fa092"
12
+ border: "#b6b6ff"
13
+ success: "#b5f2ba"
14
+ warning: "#ffe669"
15
+ error: "#ffb3a7"
16
+ neutral: "#eff0e1"
17
+ info: "#88d7ff"
18
+ colorsDark:
19
+ background: "#111111"
20
+ surface: "#1a1a1a"
21
+ primary: "#b6b6ff"
22
+ secondary: "#ffa4e7"
23
+ accent: "#ffa4e7"
24
+ text-primary: "#e0e0e0"
25
+ text-secondary: "#a3a3a3"
26
+ text-disabled: "#727366"
27
+ border: "#b6b6ff"
28
+ success: "#b5f2ba"
29
+ warning: "#ffe669"
30
+ error: "#ffb3a7"
31
+ neutral: "#24251a"
32
+ info: "#88d7ff"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"
@@ -13,6 +13,7 @@ colors:
13
13
  warning: "#ffe58a"
14
14
  error: "#ffb38a"
15
15
  neutral: "#e9e0ff"
16
+ info: "#9ec8ff"
16
17
  colorsDark:
17
18
  background: "oklch(0.22 0.03 290)"
18
19
  surface: "oklch(0.27 0.035 290)"
@@ -27,18 +28,17 @@ colorsDark:
27
28
  warning: "#ffe58a"
28
29
  error: "#ffb38a"
29
30
  neutral: "oklch(0.31 0.035 290)"
31
+ info: "#9ec8ff"
30
32
  extras:
31
33
  on-primary: "#3a2e5c"
32
34
  on-secondary: "#3a2e5c"
33
35
  on-success: "#3a2e5c"
34
- info: "#9ec8ff"
35
36
  on-info: "#3a2e5c"
36
37
  primary-light: "rgba(201, 168, 255, 0.22)"
37
38
  extrasDark:
38
39
  on-primary: "#3a2e5c"
39
40
  on-secondary: "#3a2e5c"
40
41
  on-success: "#3a2e5c"
41
- info: "#9ec8ff"
42
42
  on-info: "#3a2e5c"
43
43
  primary-light: "rgba(201, 168, 255, 0.24)"
44
44
  structural:
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Lilac
3
+ colors:
4
+ background: "#faf4ff"
5
+ surface: "#ffffff"
6
+ primary: "#d9a8f7"
7
+ secondary: "#8ee6e9"
8
+ accent: "#8ee6e9"
9
+ text-primary: "#271d2e"
10
+ text-secondary: "#65576e"
11
+ text-disabled: "#a39ba8"
12
+ border: "#d9a8f7"
13
+ success: "#a9f4c6"
14
+ warning: "#ffe485"
15
+ error: "#ffb2b2"
16
+ neutral: "#f3ebf9"
17
+ info: "#99d3ff"
18
+ colorsDark:
19
+ background: "#110e14"
20
+ surface: "#1f1922"
21
+ primary: "#d9a8f7"
22
+ secondary: "#8ee6e9"
23
+ accent: "#8ee6e9"
24
+ text-primary: "#f3eef6"
25
+ text-secondary: "#b8acbf"
26
+ text-disabled: "#756e7a"
27
+ border: "#d9a8f7"
28
+ success: "#a9f4c6"
29
+ warning: "#ffe485"
30
+ error: "#ffb2b2"
31
+ neutral: "#27212b"
32
+ info: "#99d3ff"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Mint
3
+ colors:
4
+ background: "#edfbf5"
5
+ surface: "#ffffff"
6
+ primary: "#a0efd5"
7
+ secondary: "#d6a8f8"
8
+ accent: "#d6a8f8"
9
+ text-primary: "#0d2720"
10
+ text-secondary: "#46655b"
11
+ text-disabled: "#93a39d"
12
+ border: "#a0efd5"
13
+ success: "#aff3c0"
14
+ warning: "#ffe669"
15
+ error: "#fdb59d"
16
+ neutral: "#e2f3ed"
17
+ info: "#80daf8"
18
+ colorsDark:
19
+ background: "#09110f"
20
+ surface: "#131f1b"
21
+ primary: "#a0efd5"
22
+ secondary: "#d6a8f8"
23
+ accent: "#d6a8f8"
24
+ text-primary: "#e9f3ef"
25
+ text-secondary: "#9fb8af"
26
+ text-disabled: "#667670"
27
+ border: "#a0efd5"
28
+ success: "#aff3c0"
29
+ warning: "#ffe669"
30
+ error: "#fdb59d"
31
+ neutral: "#1a2723"
32
+ info: "#80daf8"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"
@@ -0,0 +1,79 @@
1
+ # GENERATED by scripts/generate-pouf-colorsets.ts from the pouf room generator — do not edit by hand.
2
+ name: Peach
3
+ colors:
4
+ background: "#fff5ec"
5
+ surface: "#ffffff"
6
+ primary: "#ffc28c"
7
+ secondary: "#d4a8f9"
8
+ accent: "#d4a8f9"
9
+ text-primary: "#2e1e0f"
10
+ text-secondary: "#6e5946"
11
+ text-disabled: "#a89c92"
12
+ border: "#ffc28c"
13
+ success: "#c2efaf"
14
+ warning: "#ffe485"
15
+ error: "#feb4a0"
16
+ neutral: "#f9ece1"
17
+ info: "#80daf8"
18
+ colorsDark:
19
+ background: "#140e09"
20
+ surface: "#221a13"
21
+ primary: "#ffc28c"
22
+ secondary: "#d4a8f9"
23
+ accent: "#d4a8f9"
24
+ text-primary: "#f6efe8"
25
+ text-secondary: "#c0ad9e"
26
+ text-disabled: "#7a6f66"
27
+ border: "#ffc28c"
28
+ success: "#c2efaf"
29
+ warning: "#ffe485"
30
+ error: "#feb4a0"
31
+ neutral: "#2b221a"
32
+ info: "#80daf8"
33
+ extras:
34
+ on-primary: "#1a1a1a"
35
+ on-secondary: "#1a1a1a"
36
+ on-accent: "var(--on-primary)"
37
+ on-success: "#1a1a1a"
38
+ on-warning: "#1a1a1a"
39
+ on-error: "#1a1a1a"
40
+ on-info: "#1a1a1a"
41
+ bg: "var(--background)"
42
+ ink: "var(--text-primary)"
43
+ purple: "var(--primary)"
44
+ mint: "var(--success)"
45
+ pink: "var(--error)"
46
+ yellow: "var(--warning)"
47
+ blue: "var(--info)"
48
+ orange: "var(--secondary)"
49
+ up: "var(--mint)"
50
+ down: "var(--pink)"
51
+ warn: "var(--yellow)"
52
+ idle: "var(--purple)"
53
+ extrasDark:
54
+ on-primary: "#1a1a1a"
55
+ on-secondary: "#1a1a1a"
56
+ on-accent: "#1a1a1a"
57
+ on-success: "#1a1a1a"
58
+ on-warning: "#1a1a1a"
59
+ on-error: "#1a1a1a"
60
+ on-info: "#1a1a1a"
61
+ structural:
62
+ font-family: "'Nunito Variable', 'Nunito', 'SF Pro Rounded', 'Helvetica Neue', system-ui, sans-serif"
63
+ font-family-mono: "ui-monospace, 'JetBrains Mono', Menlo, monospace"
64
+ radius: "20px"
65
+ radius-sm: "12px"
66
+ radius-lg: "32px"
67
+ spacing: "1rem"
68
+ shadow: "inset 0 -6px 0 rgba(0,0,0,0.15), inset 0 4px 0 rgba(255,255,255,0.35), 0 8px 16px rgba(58,46,92,0.2)"
69
+ shadow-sm: "inset 0 -3px 0 rgba(0,0,0,0.12), inset 0 2px 0 rgba(255,255,255,0.3), 0 4px 10px rgba(58,46,92,0.16)"
70
+ shadow-lg: "inset 0 -8px 0 rgba(0,0,0,0.16), inset 0 6px 0 rgba(255,255,255,0.4), 0 16px 32px rgba(58,46,92,0.24)"
71
+ letter-spacing: "0"
72
+ letter-spacing-wide: "0.02em"
73
+ font-weight: "700"
74
+ text-transform: "none"
75
+ r-card: "32px"
76
+ r-control: "20px"
77
+ r-blob: "24px"
78
+ lip: "10px"
79
+ lip-row: "6px"