@vibes.diy/prompts 14.3.114 → 14.3.115

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/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from "./json-docs.js";
6
6
  export * from "./view-state.js";
7
7
  export * from "./style-prompts.js";
8
8
  export * from "./restyle.js";
9
+ export * from "./look-restyle.js";
9
10
  export * from "./themes/index.js";
10
11
  export * from "./themes/looks/index.js";
11
12
  export { parseContent } from "./segment-parser.js";
package/index.js CHANGED
@@ -6,6 +6,7 @@ export * from "./json-docs.js";
6
6
  export * from "./view-state.js";
7
7
  export * from "./style-prompts.js";
8
8
  export * from "./restyle.js";
9
+ export * from "./look-restyle.js";
9
10
  export * from "./themes/index.js";
10
11
  export * from "./themes/looks/index.js";
11
12
  export { parseContent } from "./segment-parser.js";
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvG,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAI7F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAwB,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvG,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAI7F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAwB,MAAM,iBAAiB,CAAC"}
package/llms/image-gen.md CHANGED
@@ -34,20 +34,21 @@ and `.file()` for a transformation input, so a ref you have in hand is ready to
34
34
  straight to `images`. Ordinary host records hold the app's own data; the image hook
35
35
  supplies the associated generated output.
36
36
 
37
- For example, refining a saved pottery illustration keeps its original ID and uses its
38
- actual output as the input to a separate result ID:
37
+ For example, refining a saved pottery illustration reads its actual output and saves the
38
+ result on another persisted host record. Supply `vessel` and `glazedVessel` from this
39
+ database; create a fresh saved result record for each deliberate new attempt:
39
40
 
40
41
  ```jsx
41
42
  import { ImgGen, useImgGen } from "use-vibes";
42
43
 
43
- function GlazingPreview({ database }) {
44
- const { document: original, pending, error } = useImgGen({ _id: "vessel-original", database });
44
+ function GlazingPreview({ database, vessel, glazedVessel }) {
45
+ const { document: original, pending, error } = useImgGen({ _id: vessel._id, database });
45
46
  const version = original?.versions?.[original.currentVersion ?? 0];
46
47
  const source = version?.id ? original?._files?.[version.id] : undefined;
47
48
  const sourceReady = source !== undefined;
48
49
  return <section>
49
- <ImgGen _id="vessel-original" database={database} showControls={false} />
50
- {sourceReady ? <ImgGen _id="vessel-glazed" database={database}
50
+ <ImgGen _id={vessel._id} database={database} showControls={false} />
51
+ {sourceReady ? <ImgGen _id={glazedVessel._id} database={database}
51
52
  prompt="Add a blue glaze while preserving this vessel's shape and composition"
52
53
  images={[source]} /> : <p>{error ? error.message : pending ? "Loading saved source…" : "Source image unavailable"}</p>}
53
54
  </section>;
@@ -96,7 +97,7 @@ Do **not** set `model` for img2img: when an input image is present the platform
96
97
 
97
98
  ## Restyling a Captured Photo
98
99
 
99
- A photo booth, a style camera or an avatar-from-a-selfie app keeps the camera frame on the shot's own record and gives every styled result its own `_id` (bump it to start a fresh attempt). The styled picture's frame is simply `<ImgGen>`, shown at full size: ImgGen paints the saved result when there is one, and otherwise its own progress bar, its own message when a picture needs another try, and — in the Vibes iPhone app — the **Create with Image Playground** button that a picture started by the camera (rather than a tap) waits on. The person sees each of those right in the frame. Your own words about the shot sit beside or below the frame.
100
+ A photo booth, a style camera or an avatar-from-a-selfie app saves the camera frame and style prompt on the shot's own record, then uses that record's `_id` for its styled result. Save a fresh shot record with its source frame and style prompt for each deliberate new attempt. The styled picture's frame is simply `<ImgGen>`, shown at full size: ImgGen paints the saved result when there is one, and otherwise its own progress bar, its own message when a picture needs another try, and — in the Vibes iPhone app — the **Create with Image Playground** button that a picture started by the camera (rather than a tap) waits on. The person sees each of those right in the frame. Your own words about the shot sit beside or below the frame.
100
101
 
101
102
  Mount that same `<ImgGen>` wherever an unstyled shot is shown in full — the fresh-capture card and the detail view — so a shot saved in one visit styles the next time it opens. Gallery tiles read the saved result through `useImgGen` and show the original until it arrives.
102
103
 
@@ -104,14 +105,14 @@ Mount that same `<ImgGen>` wherever an unstyled shot is shown in full — the fr
104
105
  import { ImgGen, useImgGen } from "use-vibes";
105
106
 
106
107
  function StyledShot({ shot, database }) {
107
- const { document: styled } = useImgGen({ _id: shot.styledId, database });
108
+ const { document: styled } = useImgGen({ _id: shot._id, database });
108
109
  const version = styled?.versions?.[styled.currentVersion ?? 0];
109
110
  const ready = Boolean(version?.id && styled?._files?.[version.id]);
110
111
  return (
111
112
  <figure>
112
113
  <div className="aspect-square w-full overflow-hidden rounded-md">
113
114
  {shot._files?.original && (
114
- <ImgGen _id={shot.styledId} database={database} prompt={shot.prompt}
115
+ <ImgGen _id={shot._id} database={database} prompt={shot.prompt}
115
116
  images={[shot._files.original]} alt={`${shot.style} version`} className="h-full w-full object-contain" />
116
117
  )}
117
118
  </div>
@@ -123,7 +124,7 @@ function StyledShot({ shot, database }) {
123
124
 
124
125
  ## Loading a Specific Doc
125
126
 
126
- Load a previously generated image by `_id` — if the doc has a `prompt` but no `_files` yet, the component generates one: `<ImgGen _id="my-image-id" database={database} />`
127
+ Load a previously generated image with its saved host record's `_id`: `<ImgGen _id={doc._id} database={database} />`. A literal such as `_id="my-image-id"` refers to a host record already saved under that exact `_id` in this database. If the host has a `prompt` but no stored image yet, the component generates one.
127
128
 
128
129
  ## Illustrations That Are Part of an Item's Identity
129
130
 
@@ -188,7 +189,7 @@ function Gallery() {
188
189
 
189
190
  ## Caching and Versions
190
191
 
191
- - Same prompt produces a deterministic `_id` (hash-based), so results are cached across reloads.
192
+ - The `_id` is always the host record's own `_id`. Store the character, card or audition record first, then pass its `_id` to every portrait of that record, including list cards and detail sheets. Its stored versions are shared across mounts and reloads.
192
193
  - Each image has a regenerate button that appends a new version (writes a new `_files.v<N>` entry).
193
194
  - Prev / next controls navigate between stored versions.
194
195
  - In the Vibes iPhone app, on iPhones with Apple Intelligence, pictures come from Apple's Image Playground, free. A picture started by a tap — ↻, or a button that shows the `<ImgGen>` — opens Image Playground with its prompt (and the `images` input picture, for an edit), and the image the person confirms is saved as a version like any other. A picture that starts on its own shows a **Create with Image Playground** button that does the same. Your code stays the same, and everywhere else pictures are made as usual. Passing `model` keeps that picture on the platform's cloud generation.
@@ -220,20 +221,43 @@ Your `access.js` governs your app's own records — the story, the hat, the roas
220
221
 
221
222
  Every `<ImgGen>` draws with the app's default image model. `listModels({ kind: "image" })` (from `call-ai`, beside `callAI`) returns the image models this app can use, the app's own choice first, and each entry's `id` goes straight into the `model` prop: `<ImgGen prompt="An astronaut riding a horse" model={m.id} />`. The entry with `isDefault: true` is the one ImgGen uses when `model` is left out; with `images` present the default is the platform's image-edit model instead, so img2img leaves `model` out (see above). When the app's maker saved their own provider key, it covers the image model they chose in settings; other models run on the person's credits. The callAI skill's "Choosing a model" section lists every field.
222
223
 
223
- To compare image models, call `listModels({ kind: "image" })` and render one `<ImgGen>` per entry with `model={m.id}`. Every picture shares one prompt, each card is labelled with `m.name`, and each `_id` pairs the prompt with the model so a reload shows the saved pictures:
224
+ To compare image models, call `listModels({ kind: "image" })` and render one `<ImgGen>` per entry with `model={m.id}`. Every picture shares one prompt, each card is labelled with `m.name`, and each picture uses its stored audition record's `_id` so a reload shows the saved pictures. Each click saves one new record per model, with its prompt and model choice:
224
225
 
225
226
  ### `App.jsx`
226
227
  ```jsx
227
228
  import React, { useEffect, useState } from "react";
228
- import { ImgGen } from "use-vibes";
229
+ import { useFireproof } from "use-fireproof";
230
+ import { ImgGen, useVibe } from "use-vibes";
229
231
  import { listModels } from "call-ai";
230
- import { Button, Card, Field, Grid, Input, Stack, Text } from "@vibes.diy/pouf";
232
+ import { Button, Card, Field, Grid, Input, Skeleton, Stack, Text } from "@vibes.diy/pouf";
233
+
234
+ function AuditionComposer({ database, models }) {
235
+ const { can, me, ready } = useVibe("auditions");
236
+ const [draft, setDraft] = useState("a penguin riding a bicycle");
237
+ const [message, setMessage] = useState("");
238
+ const candidates = models.map((m) => ({
239
+ type: "audition", authorHandle: me?.userHandle, prompt: draft,
240
+ modelId: m.id, modelName: m.name, isDefault: m.isDefault
241
+ }));
242
+ const verdicts = candidates.map((candidate) => can.create(candidate));
243
+ if (!ready || verdicts.some((verdict) => verdict.pending)) return <Skeleton variant="row" />;
244
+ if (verdicts.some((verdict) => !verdict.ok)) return <Text muted>Join this app to save an image audition.</Text>;
245
+ async function drawAudition() {
246
+ await Promise.all(candidates.map((candidate) => database.put(candidate)))
247
+ .catch((error) => setMessage(error.message));
248
+ }
249
+ return <Stack>
250
+ <Field label="Picture">{(id) => <Input id={id} value={draft} onChange={setDraft} />}</Field>
251
+ <Button onClick={drawAudition} disabled={draft.trim().length === 0 || models.length === 0}>Draw it with every model</Button>
252
+ <Text>{message}</Text>
253
+ </Stack>;
254
+ }
231
255
 
232
256
  export default function App() {
257
+ const { database, useLiveQuery } = useFireproof("auditions");
258
+ const { docs } = useLiveQuery("type", { key: "audition" });
233
259
  const [models, setModels] = useState([]);
234
260
  const [message, setMessage] = useState("");
235
- const [draft, setDraft] = useState("a penguin riding a bicycle");
236
- const [prompt, setPrompt] = useState("a penguin riding a bicycle");
237
261
  useEffect(() => {
238
262
  listModels({ kind: "image" })
239
263
  .then(setModels)
@@ -241,14 +265,13 @@ export default function App() {
241
265
  }, []);
242
266
  return (
243
267
  <Stack>
244
- <Field label="Picture">{(id) => <Input id={id} value={draft} onChange={setDraft} />}</Field>
245
- <Button onClick={() => setPrompt(draft)} disabled={draft.trim().length === 0}>Draw it with every model</Button>
268
+ <AuditionComposer database={database} models={models} />
246
269
  <Text>{message}</Text>
247
270
  <Grid cols={3}>
248
- {models.map((m) => (
249
- <Card key={m.id}>
250
- <ImgGen _id={`audition:${prompt}:${m.id}`} prompt={prompt} model={m.id} alt={`${prompt}, drawn by ${m.name}`} />
251
- <Text>{m.isDefault ? `${m.name} · this app's default` : m.name}</Text>
271
+ {docs.map((audition) => (
272
+ <Card key={audition._id}>
273
+ <ImgGen _id={audition._id} database={database} prompt={audition.prompt} model={audition.modelId} alt={`${audition.prompt}, drawn by ${audition.modelName}`} />
274
+ <Text>{audition.isDefault ? `${audition.modelName} · this app's default` : audition.modelName}</Text>
252
275
  </Card>
253
276
  ))}
254
277
  </Grid>
@@ -261,7 +284,7 @@ export default function App() {
261
284
 
262
285
  - `prompt`: text prompt (required unless `_id` is provided)
263
286
  - `images`: array of `File` objects **or stored `_files` refs** for img2img (uses first image; only pass while generating — display stored results via `_id`)
264
- - `_id`: load a specific doc instead of generating
287
+ - `_id`: the host record's `_id`; reads its stored image or saves a new image for that record
265
288
  - `database`: Fireproof db name or instance (default `"ImgGen"`)
266
289
  - `className`, `alt`, `style`: standard image styling
267
290
  - `showControls`: toggle regenerate + version nav (default `true`)
@@ -0,0 +1,49 @@
1
+ export interface LookDirection {
2
+ readonly colorway: string;
3
+ readonly mode: "light" | "dark";
4
+ readonly headingFont: string;
5
+ readonly bodyFont: string;
6
+ }
7
+ export declare const LOOK_DIRECTIONS: readonly LookDirection[];
8
+ export interface LookColours {
9
+ readonly background: string;
10
+ readonly surface: string;
11
+ readonly textPrimary: string;
12
+ readonly textSecondary: string;
13
+ readonly border: string;
14
+ readonly primary: string;
15
+ readonly accent: string;
16
+ }
17
+ export interface ResolvedLookDirection extends LookDirection {
18
+ readonly name: string;
19
+ readonly colours: LookColours;
20
+ }
21
+ export declare function resolveLookDirection(d: LookDirection): ResolvedLookDirection | undefined;
22
+ export interface CurrentLook {
23
+ readonly colorway?: string;
24
+ readonly page?: string;
25
+ readonly accent?: string;
26
+ readonly font?: string;
27
+ }
28
+ export declare function pickLookDirections(current: CurrentLook, count?: number): readonly ResolvedLookDirection[];
29
+ export declare function lookDirectionText(d: ResolvedLookDirection): string;
30
+ export declare const LOOK_STYLE_DIRECTION_LEAD = "Style direction: ";
31
+ export declare const LOOK_PAINT_NOT_TEXT = "The colour values and font names in the style direction are paint for you to use, never words: do not write them, or any word that is not already in the screenshot, anywhere in the image.";
32
+ export declare function lookRestyleRenderPrompt(d: ResolvedLookDirection): string;
33
+ export interface LookPickData {
34
+ readonly colorway: string;
35
+ readonly mode: "light" | "dark";
36
+ readonly headingFont: string;
37
+ readonly bodyFont: string;
38
+ }
39
+ export declare const LOOK_PICK_PREFIX = "Restyle only \u2014 ";
40
+ export declare const LOOK_PICK_DATA_LEAD = "look: ";
41
+ export declare function lookPickFileName(n: number): string;
42
+ export declare function lookPickText(args: {
43
+ readonly name: string;
44
+ readonly data: LookPickData;
45
+ }): string;
46
+ export declare function parseLookPickText(text: string): LookPickData | undefined;
47
+ export declare function isLookPickFileName(name: string): boolean;
48
+ export declare function isLookPickMessage(content: readonly unknown[]): boolean;
49
+ export declare const LOOK_RESTYLE_INSTRUCTION: string;
@@ -0,0 +1,199 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { type } from "arktype";
3
+ import { lazyType } from "@vibes.diy/api-types/lazy-type";
4
+ import { cssToHex } from "./themes/color-math.js";
5
+ import { getVibeFont } from "./themes/fonts.js";
6
+ import { generatePalette } from "./themes/palette-gen.js";
7
+ import { oklabDistance } from "./themes/pouf-rooms.js";
8
+ import { getStylePreset } from "./themes/style-presets.js";
9
+ export const LOOK_DIRECTIONS = [
10
+ { colorway: "atelier", mode: "light", headingFont: "playfair-display", bodyFont: "lora" },
11
+ { colorway: "matrix", mode: "dark", headingFont: "vt323", bodyFont: "vt323" },
12
+ { colorway: "neon", mode: "dark", headingFont: "rajdhani", bodyFont: "rajdhani" },
13
+ { colorway: "brutalist", mode: "light", headingFont: "space-grotesk", bodyFont: "jetbrains-mono" },
14
+ { colorway: "broadsheet", mode: "light", headingFont: "bebas-neue", bodyFont: "helvetica" },
15
+ { colorway: "carbon", mode: "dark", headingFont: "inter", bodyFont: "jetbrains-mono" },
16
+ { colorway: "scrapbook", mode: "light", headingFont: "source-serif-4", bodyFont: "dm-sans" },
17
+ { colorway: "house", mode: "light", headingFont: "nunito", bodyFont: "nunito" },
18
+ { colorway: "peach", mode: "light", headingFont: "nunito", bodyFont: "nunito" },
19
+ { colorway: "lilac", mode: "light", headingFont: "nunito", bodyFont: "dm-sans" },
20
+ { colorway: "rose", mode: "dark", headingFont: "playfair-display", bodyFont: "dm-sans" },
21
+ { colorway: "mint", mode: "light", headingFont: "dm-sans", bodyFont: "dm-sans" },
22
+ { colorway: "aqua", mode: "dark", headingFont: "space-grotesk", bodyFont: "inter" },
23
+ { colorway: "celery", mode: "light", headingFont: "lora", bodyFont: "nunito" },
24
+ { colorway: "periwinkle", mode: "light", headingFont: "inter", bodyFont: "inter" },
25
+ ];
26
+ export function resolveLookDirection(d) {
27
+ const preset = getStylePreset(d.colorway);
28
+ if (preset === undefined)
29
+ return undefined;
30
+ const palette = generatePalette(preset.palette);
31
+ const c = d.mode === "dark" ? palette.dark : palette.light;
32
+ const background = cssToHex(c.background);
33
+ const surface = cssToHex(c.surface) ?? background;
34
+ const textPrimary = cssToHex(c["text-primary"]);
35
+ const textSecondary = cssToHex(c["text-secondary"]) ?? textPrimary;
36
+ const border = cssToHex(c.border) ?? textSecondary;
37
+ const primary = cssToHex(c.primary);
38
+ const accent = cssToHex(c.accent) ?? primary;
39
+ if (background === undefined ||
40
+ surface === undefined ||
41
+ textPrimary === undefined ||
42
+ textSecondary === undefined ||
43
+ border === undefined ||
44
+ primary === undefined ||
45
+ accent === undefined) {
46
+ return undefined;
47
+ }
48
+ return {
49
+ ...d,
50
+ name: preset.label,
51
+ colours: { background, surface, textPrimary, textSecondary, border, primary, accent },
52
+ };
53
+ }
54
+ const WHITE = "#FFFFFF";
55
+ function isDarkPage(hex) {
56
+ return hex !== undefined && oklabDistance(hex, WHITE) > 0.5;
57
+ }
58
+ function distanceFromCurrent(d, current) {
59
+ const page = current.page === undefined ? 0.5 : oklabDistance(d.colours.background, current.page);
60
+ const accent = current.accent === undefined ? 0.25 : oklabDistance(d.colours.accent, current.accent);
61
+ const font = current.font !== undefined && (d.headingFont === current.font || d.bodyFont === current.font) ? 0.15 : 0;
62
+ return page * 2 + accent - font;
63
+ }
64
+ function distanceBetween(a, b) {
65
+ return oklabDistance(a.colours.background, b.colours.background) + oklabDistance(a.colours.accent, b.colours.accent);
66
+ }
67
+ function nextPick(args) {
68
+ let best = 0;
69
+ let bestScore = -Infinity;
70
+ args.left.forEach((d, i) => {
71
+ const spread = args.picked.length === 0 ? 0 : Math.min(...args.picked.map((p) => distanceBetween(d, p)));
72
+ const sameFont = args.picked.some((p) => p.headingFont === d.headingFont) ? 0.2 : 0;
73
+ const score = distanceFromCurrent(d, args.current) + spread * 0.75 - sameFont;
74
+ if (score > bestScore) {
75
+ bestScore = score;
76
+ best = i;
77
+ }
78
+ });
79
+ return best;
80
+ }
81
+ export function pickLookDirections(current, count = 4) {
82
+ const nearWhite = current.page !== undefined && oklabDistance(current.page, WHITE) < 0.05;
83
+ const left = LOOK_DIRECTIONS.filter((d) => d.colorway !== current.colorway)
84
+ .filter((d) => (nearWhite && d.colorway === "broadsheet") === false)
85
+ .map(resolveLookDirection)
86
+ .filter((d) => d !== undefined);
87
+ const picked = [];
88
+ while (picked.length < count && left.length > 0) {
89
+ const [next] = left.splice(nextPick({ left, picked, current }), 1);
90
+ if (next !== undefined)
91
+ picked.push(next);
92
+ }
93
+ const flipTo = isDarkPage(current.page) ? "light" : "dark";
94
+ if (picked.length > 0 && picked.every((d) => d.mode !== flipTo)) {
95
+ const flip = left
96
+ .filter((d) => d.mode === flipTo)
97
+ .sort((a, b) => distanceFromCurrent(b, current) - distanceFromCurrent(a, current))[0];
98
+ if (flip !== undefined)
99
+ picked[picked.length - 1] = flip;
100
+ }
101
+ return picked;
102
+ }
103
+ function fontPhrase(slug) {
104
+ const f = getVibeFont(slug);
105
+ return f === undefined ? slug : `${f.label} (${f.mood})`;
106
+ }
107
+ export function lookDirectionText(d) {
108
+ const c = d.colours;
109
+ const roles = [
110
+ `background ${c.background}`,
111
+ `surface ${c.surface}`,
112
+ `text-primary ${c.textPrimary}`,
113
+ `text-secondary ${c.textSecondary}`,
114
+ `border ${c.border}`,
115
+ `primary ${c.primary}`,
116
+ `accent ${c.accent}`,
117
+ ].join(", ");
118
+ const faces = d.headingFont === d.bodyFont
119
+ ? `every heading, label and line of body text set in ${fontPhrase(d.headingFont)}`
120
+ : `headings set in ${fontPhrase(d.headingFont)}; body text, labels and buttons set in ${fontPhrase(d.bodyFont)}`;
121
+ return `the "${d.name}" colour scheme, ${d.mode} mode — ${roles}; ${faces}`;
122
+ }
123
+ export const LOOK_STYLE_DIRECTION_LEAD = "Style direction: ";
124
+ export const LOOK_PAINT_NOT_TEXT = "The colour values and font names in the style direction are paint for you to use, never words: do not write them, or any word that is not already in the screenshot, anywhere in the image.";
125
+ export function lookRestyleRenderPrompt(d) {
126
+ return `This image is a screenshot of a real, working web app on a phone. Make a new screenshot of the SAME app in a new visual style.
127
+
128
+ This is a change of look, not a change of features.
129
+
130
+ KEEP EXACTLY:
131
+ - every element on screen, in the same position and order, with the same layout and proportions;
132
+ - every word: each heading, label, button text, tab, input placeholder, number, date and list item, spelled exactly as shown;
133
+ - the same count of cards, rows, buttons, tabs, pads and badges;
134
+ - the same icons, emoji and pictures in the same places (they may be restyled).
135
+
136
+ CHANGE ONLY: colour palette, typeface, corner shape, borders, shadows, texture, decoration and light-or-dark.
137
+ Change those boldly: the new look should be unmistakably different at a glance — a new typeface for headings and body, a new background, new colours on every surface and accent, new corner shapes and shadows — while the app underneath stays exactly the same.
138
+
139
+ Output a single flat, straight-on phone screenshot of the restyled app, filling the whole frame. No device frame, no hands, no captions, no annotations, nothing added or removed. The black "VIBES DIY" pill in the bottom-right corner is platform chrome: draw it unchanged.
140
+
141
+ ${LOOK_STYLE_DIRECTION_LEAD}${lookDirectionText(d)}.
142
+ ${LOOK_PAINT_NOT_TEXT}`;
143
+ }
144
+ export const LOOK_PICK_PREFIX = "Restyle only — ";
145
+ export const LOOK_PICK_DATA_LEAD = "look: ";
146
+ export function lookPickFileName(n) {
147
+ return `look-${n}.png`;
148
+ }
149
+ const LOOK_FILE_NAME = /^look-\d+\.png$/;
150
+ export function lookPickText(args) {
151
+ const { data } = args;
152
+ const json = JSON.stringify({
153
+ colorway: data.colorway,
154
+ mode: data.mode,
155
+ headingFont: data.headingFont,
156
+ bodyFont: data.bodyFont,
157
+ });
158
+ return `${LOOK_PICK_PREFIX}keep every feature, screen, label and behaviour exactly as it is, and change only the look to "${args.name}".
159
+ ${LOOK_PICK_DATA_LEAD}${json}
160
+ The attached picture is a mood reference for the colours and surfaces, never content: keep every word of the app as it is.`;
161
+ }
162
+ const lookPickData = lazyType(() => type({
163
+ colorway: "string > 0",
164
+ mode: "'light' | 'dark'",
165
+ headingFont: "string > 0",
166
+ bodyFont: "string > 0",
167
+ }));
168
+ export function parseLookPickText(text) {
169
+ if (text.startsWith(LOOK_PICK_PREFIX) === false)
170
+ return undefined;
171
+ const line = text.split("\n").find((l) => l.startsWith(LOOK_PICK_DATA_LEAD));
172
+ if (line === undefined)
173
+ return undefined;
174
+ const json = exception2Result(() => JSON.parse(line.slice(LOOK_PICK_DATA_LEAD.length)));
175
+ if (json.isErr())
176
+ return undefined;
177
+ const parsed = lookPickData(json.Ok());
178
+ if (parsed instanceof type.errors)
179
+ return undefined;
180
+ return { colorway: parsed.colorway, mode: parsed.mode, headingFont: parsed.headingFont, bodyFont: parsed.bodyFont };
181
+ }
182
+ export function isLookPickFileName(name) {
183
+ return LOOK_FILE_NAME.test(name);
184
+ }
185
+ export function isLookPickMessage(content) {
186
+ return content.some((part) => {
187
+ if (typeof part !== "object" || part === null)
188
+ return false;
189
+ const p = part;
190
+ return p.type === "text" && typeof p.text === "string" && parseLookPickText(p.text) !== undefined;
191
+ });
192
+ }
193
+ export const LOOK_RESTYLE_INSTRUCTION = "New looks. The person picked a new look for their app from the Look tab. Their message opens with " +
194
+ `"${LOOK_PICK_PREFIX.trim()}" and carries the look as data on its "${LOOK_PICK_DATA_LEAD.trim()}" line: a colourway slug, light or dark, ` +
195
+ "and heading and body font slugs from the font catalog. Restyle only: keep every feature, screen, label and behaviour. " +
196
+ "Apply the look with set_app_style, naming that colourway, the mode and both fonts in the instruction. " +
197
+ "The attached picture is a mood reference painted by an image model: read its colours and surfaces, never its words, " +
198
+ "and never rebuild the app from it.";
199
+ //# sourceMappingURL=look-restyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"look-restyle.js","sourceRoot":"","sources":["../jsr/look-restyle.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/prompts",
3
- "version": "14.3.114",
3
+ "version": "14.3.115",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "exports": {
@@ -39,10 +39,10 @@
39
39
  "license": "Apache-2.0",
40
40
  "dependencies": {
41
41
  "@adviser/cement": "~0.5.34",
42
- "@vibes.diy/api-types": "14.3.114",
43
- "@vibes.diy/call-ai-v2": "14.3.114",
44
- "@vibes.diy/identity": "14.3.114",
45
- "@vibes.diy/use-vibes-types": "14.3.114",
42
+ "@vibes.diy/api-types": "14.3.115",
43
+ "@vibes.diy/call-ai-v2": "14.3.115",
44
+ "@vibes.diy/identity": "14.3.115",
45
+ "@vibes.diy/use-vibes-types": "14.3.115",
46
46
  "arktype": "~2.2.6",
47
47
  "json-schema-faker": "~0.6.3"
48
48
  },