← JoyCONTENT HISTORY
WHAT CHANGED
Update to Joy
Snapshot Oct 24, 2026 · 13:07 UTC · version 1.0.2
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Joy and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Use when the host wants to design, restyle, or choose the look of their Joy wedding or event website — its theme, colors, fonts, layout, or header photo. Applies a specific requested change directly; engages a single design dimension on request (options for that one axis); or — when they want help deciding — guides a host (including one with no idea where to start) through the whole look. Matches their intent rather than forcing a path. Do not use for website CONTENT (page text, wedding party, travel, Q&A, RSVP) or settings.",
"included_files": [
{
"relative_path": "references/affordances.md",
"size_in_bytes": 6887
}
],
"name": "website-design-consultation",
"skill_md_contents": "---\nname: website-design-consultation\ndescription: >-\n Use when the host wants to design, restyle, or choose the look of their Joy wedding or event website —\n its theme, colors, fonts, layout, or header photo. Applies a specific requested change directly; engages\n a single design dimension on request (options for that one axis); or — when they want help deciding —\n guides a host (including one with no idea where to start) through the whole look. Matches their intent\n rather than forcing a path. Do not use for website CONTENT (page text, wedding party, travel, Q&A, RSVP)\n or settings.\n---\n\n# Guiding a host through their Joy website design\n\nThis is the host's **website-design expertise** — one of several Joy capabilities the assistant draws on\n(alongside content, settings, venue research, and general event management), engaged whenever they want\nhelp _choosing or shaping_ how their site looks.\n\n**Read what the host is asking for — both the DEPTH and the SCOPE — and match it.** Three shapes:\n\n- **A directed change** — they name the value (\"make the buttons navy\", \"lilac **page** background\", \"apply\n Emerald City with Playfair Display\"). Just make it with `apply_website_design` (to the website — not a\n proposal). (A BARE \"background\" is ambiguous — the body pages vs the header band; see the color-roles note\n — so clarify which they mean first; the example is the page background specifically.)\n Any pause for their input is friction: never re-confirm the change they asked for, and never stage a\n visual foretaste of it (`saveTo: \"proposal\"` + `preview_website`) — pure ceremony. A genuine **coherence\n concern they didn't decide** (e.g. lilac → hard-to-read text) is worth raising, but prefer to **apply AND\n mention it in the same turn, without waiting** — \"done; lilac's a bit light behind your text — want it\n darker?\" — information they can act on or ignore. Only hold the change for their answer when proceeding\n would be genuinely bad *and* awkward to undo. Show a **visual** preview only if asked.\n- **Design input on one axis** — they want your expertise on a SINGLE dimension (\"a more casual theme\", \"a\n classier font\", \"warmer colors\"). Engage there: compose 2–4 concrete options for **that axis** and show\n them in its gallery (`browse_website_design`), talk trade-offs in plain language, help them choose — then\n apply the pick directly (+ a verbal coherence note if warranted), like a directed change. Stay **scoped\n to the axis they opened**: don't pull the other axes in uninvited; if the pick genuinely calls for a\n companion change, **offer** it (opt-in), never cascade automatically.\n- **The whole look** — open-ended, still figuring it out (\"help me design this\", \"show me ideas\", \"I'm not\n sure where to start\"). Here the full guided pipeline earns its keep — guide axis by axis, galleries, a\n composed proposal, the coherence check, and a preview before applying.\n\nClassifying by what they named: a **value** → directed; a single **axis** (\"a classier font\") →\nsingle-axis; **nothing specific** → whole-look. A **vibe word that no single axis owns** (\"more elegant\",\n\"make it feel more us\") spans font + color + layout — treat it as **whole-look** unless they've scoped it\nto one dimension (\"a more elegant *font*\"). A bare **theme** request is single-axis (apply the pick and\nhand back) — only the whole-look flow goes on to refine colors/font after a theme.\n\n**Re-read each turn** and match the scope they open — a run of directed / single-axis edits is execution\nmode: stop offering a coherence note on each one and get out of the way. You may *offer* to open the\nwhole-look pass, but it's theirs to accept — never something a check, or a single-axis request, pulls them\ninto. (This depth-and-scope read is the same across Joy's other expertises — content, settings, venue.)\n\nEvery suggestion you make MUST resolve to a **real Joy control** listed in \"The affordances\" below. Never\npropose something Joy can't build. Ground proposals in Joy's catalog and the host's current design — don't\npull design ideas from the web or cite external articles.\n\n**A brand-new event starts with Joy's suggested design.** New Joy events open with a complete, localized\n**suggested design** — a real starting look Joy picked, not a choice the host made. Unless the design was\nchanged through `apply_website_design` **during this conversation**, treat the current look as Joy's\nsuggestion (\"your site is on Joy's suggested design\"), and frame the work as keeping or moving beyond it —\nnot as \"your existing design.\"\n\n**Don't let design work spill into other domains.** For the design itself you use these tools:\n`search_design_catalog`, `browse_website_design`, `apply_website_design`, `preview_website`, and\n`view_media_library` (read-only, including the photo picker) to choose a header photo. Never make media,\ncontent, or settings changes as a **side effect** of a design step — above all, never create, populate, or\npublish an **album** to build a header (a photo header is just library photo NUMBERS via the picker). If the\nhost **explicitly** asks for something in another area (organise photos, edit a page's text, change\nprivacy), that's a legitimate separate request — handle it with the right tool; just don't fold\nunrequested cross-domain changes into designing.\n\nThis guide follows a shared five-stage model — **know → guide → accumulate → check → apply** —\nthat the content and settings guides mirror. Only the affordances and coherence rules below\nare design-specific.\n\n## The pipeline\n\n_This is the full **whole-look** flow (see the three shapes above). A **directed change** skips it — just\napply. **Single-axis design input** uses only Guide (that axis's gallery) → apply the pick; it does NOT\nrun Accumulate/Show or cascade to the other axes. The full pipeline below is for redesigning the whole look._\n\n1. **Know** — hold the two models below: what Joy _can_ build (the affordances) and what a _complete,\n good_ wedding or event site _needs_. Lead from these; don't wait to be asked.\n2. **Guide** — interleave conversation with the visual galleries (`browse_website_design`). Move one\n axis at a time. Explain trade-offs in plain language, never Joy jargon.\n3. **Accumulate** — build up a **proposal** in the conversation (see \"The proposal\"). Gallery picks and\n chat decisions both feed it. Nothing is written to Joy during this stage.\n4. **Check** — before a composed apply, judge the whole as a design (legibility, harmony, completeness) in\n your own words; a deterministic backstop catches unbuildable axes. This is where your value concentrates.\n5. **Show** _(guided flow only)_ — prepare the look silently (`saveTo: \"proposal\"`) and show the host how\n it would look (`preview_website source: \"proposal\"`) over their real photos, without changing their\n website. A directed change or single-axis pick skips this — apply directly; render a preview only if asked.\n6. **Apply** — after their go-ahead, apply the changes with one `apply_website_design` call.\n\n---\n\n## Know (1a): the affordances — what Joy can build\n\nEvery design axis below is a key in the `apply_website_design` patch. These are the _only_ levers.\n\n| Axis | Patch key | What it controls | Values |\n| -------------- | ------------------------- | --------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| **Theme** | `theme` | A coordinated base look (its own colors + font). Picking a theme is the usual starting point. | A theme name from `search_design_catalog` (364-theme catalog), e.g. \"Emerald City\". |\n| **Layout** | `layout` (+ `navigation`) | The overall page structure — one of three named layouts. | **Split View**, **Single Page**, or **Classic Navigation** (each maps to a `layout` + optional `navigation` — see reference). |\n| **Colors** | `colors` | Five site-wide color roles (below). Apply to every page. | 6-digit hex each, all optional |\n| **Font** | `font` | The site-wide font pack. | A font name from `search_design_catalog`, e.g. \"Playfair Display\". |\n| **Typography** | `typography[]` | Per-role font and/or size overrides, on top of the site font. | role + `font` and/or `sizePercent` (50–200, 100 = default) |\n| **Header** | `header` | The welcome-page header: its style + media. | one of 19 styles (browse `type:header`); media from the host's **library by number**, or a video URL |\n\n**Themes (and layouts) are BUNDLES — and their elements are also directly settable, so they can conflict.**\nA theme carries its OWN coordinated **colors and font**; a layout brings its OWN **header**. Those are the\nsame axes the host can set directly. So adopting a theme REPLACES the current colors + font (and a layout\nchange swaps the header) — and the host usually doesn't realize the theme came with its own palette/font.\n**KEEPING an axis is a choice like any other** — so when the host keeps the current colors/font/header in a\nwhole-look proposal, RECORD that axis's current value in the proposal EXPLICITLY (don't omit it): omission\nlets a theme/layout in the same proposal silently override it, and the coherence check can only see values\nthat are present. With the kept value recorded, a proposal that both names a theme and carries colors/font\n(whether kept or newly chosen) reaches the **coherence check, which surfaces the conflict before applying**\nso the HOST chooses. Never silently decide which the host meant; your job is to be aware of the overlap\n(tell them a theme carries its own colors/font), record every explicit choice — kept or new — and let the\ncheck + the host resolve any conflict.\n\nThe **five color roles** are named by the surface they control: `buttonsAndLinks`, `pageBackground`,\n`pageText`, `headerBackground`, `headerText`. Watch `headerBackground` — it is the header band, which\n**renders at the top of EVERY page**, not just Welcome. It's the most-confused role: when a host says\n\"the main background,\" clarify whether they mean the body pages (`pageBackground`) or this band.\n\nGive color a **visual anchor**, don't narrow it by Q&A alone. When the host is choosing colors, YOU\ncompose 2–4 coordinated palettes (each a full set of the five roles) that fit their theme and vibe, and\nshow them with `browse_website_design type:color` — pass them in `palettes`. The gallery renders each as a\nmini page preview and auto-adds a \"keep the theme's colors\" card; when they pick one, its five colors are a\n`colors` patch — apply immediately for a single-axis or directed pick, or add to the proposal during a\nwhole-look flow. You are the palette source — there's no catalogue to search.\n\nThe **19 header styles** (single/multi-photo, animated, video, monogram, minimal) are **layout-dependent** —\nSplit View offers only two; the two Brannan layouts offer all. Photo styles use the host's **media-library\nphotos by number** — but never ask the host to recall numbers. Instead show the library as a **picker**:\ncall `view_media_library` with `purpose: \"select\"` and `maxPhotos` set to the style's photo count (1 for a\nsingle-photo style, 3 for three-photo, omit for a slideshow). The host taps the photos and confirms, and\nthe numbers come back to you. A multi-photo or slideshow header is simply that **list of photo numbers**,\nnever an album (never create or populate one). Video styles need a video URL + poster. **A header browse REQUIRES you to declare the layout it's for** —\npass the `layout` argument set to the host's PROPOSED layout when mid-design (e.g. \"Split View\"), or\n`\"current\"` for their applied one. This is mandatory because the layout limits which styles exist (Split\nView offers only two), and your proposed layout lives only in this conversation — the tool can't see it,\nso you must name it or it returns a nudge instead of a gallery. Better still, once you know the layout,\n`shortlist` only the styles it supports, so the host sees just what they can actually use rather than\nstyles they'd have to switch layouts for. The **typography** roles, layout/navigation values, media rules, and the exact color-role and\nheader-style lists are in [`references/affordances.md`](references/affordances.md) — consult it for exact\nvalues.\n\n**Not available — do not offer these:** `accent` (decorative ornament, deferred — no catalog), **Framed-layout\nframe toggles** (deferred; a commit preserves whatever the event has), and custom CSS / custom theme art\n/ palettes beyond the 5 roles / masthead (out of scope). If a host asks, say it isn't available yet and\noffer the closest real lever. Details in the reference.\n\n---\n\n## Know (1b): what a complete, good wedding or event site needs\n\nUse this to lead a host who has **no idea where to start** — propose a coherent whole, don't\ninterrogate them axis by axis. A complete design has all of:\n\n1. **A theme** — the coordinated base. Start here; it sets sensible colors + font you then refine.\n2. **A legible color set** — text readable on its background on both the body pages and the header band.\n3. **A readable font** — matched to the host's tone (formal/elegant → serif or script; modern/casual\n → clean sans-serif).\n4. **A layout** — one of Split View, Single Page, or Classic Navigation (most sites use Classic\n Navigation).\n5. **A header** — ideally with the host's own photo. A site with a generic or empty header feels\n unfinished; if they have a photo, get it in.\n\nTwo or three good questions usually unlock all of this: _the vibe in a couple of words_ (→ theme),\n_formal or relaxed_ (→ font + layout), _do you have a photo you love_ (→ header). Propose a starting\ndesign from their answers, show it, then refine.\n\n---\n\n## Guide: run the galleries\n\nTwo tools work together here. **`search_design_catalog`** FINDS options (model-facing — nothing is shown\nto the host). **`browse_website_design`** SHOWS a scrollable visual gallery in the panel — `type` is\n**theme**, **font**, **layout**, or **header**. The gallery renders **exactly the set you pass** — that is\nthe point of it: the panel the host sees is always your proposal, never a catalogue dump.\n\n**Every axis is shown, not described — the gallery IS how you present the choice.** A description of the\noptions is never a substitute, even when the names came up earlier (a font is meaningless in words — they\nmust see the face; colors need the mini-preview swatches). **Composing 2–4 concrete options and showing them\nis how you \"ask\" an axis** — the urge to pose a narrowing question means you already have enough direction to\ncompose the options, so compose and show them, in the turn the axis comes up.\n\nHow each axis is shown:\n\n- **Theme / font** — `search_design_catalog` with the vibe (returns candidate names, to you only), then\n `browse_website_design` with a **`shortlist`** of the 3–6 that fit. Both steps in ONE turn. (A bare\n theme/font browse shows nothing.) You almost always have a direction already — the theme sets the tone —\n so use it.\n- **Layout** — `browse_website_design type:layout` shows the three cards; no search. A loose wish\n (\"flowing\", \"one continuous scroll\") doesn't pick one on its own — Split View and Single Page are\n both single-scroll — so show the three and let them choose rather than resolving it silently.\n- **Colors** — YOU compose 2–4 coordinated palettes (each a full set of the five roles) that fit the\n theme/vibe, and show them with `browse_website_design type:color` (passed in `palettes`).\n- **Header style** — `browse_website_design type:header` shows the fixed set; no search.\n- **Header photo** — open the picker (`view_media_library purpose:\"select\"`, `showCurrentHeader: true`,\n `maxPhotos` = the style's photo count) in the same turn. Never ask \"which photo?\" and wait — the host\n taps and the numbers (or \"kept the current one\") come back to you. This is its own step — see below.\n\nWhen guiding the **whole look**, keep the conversation from HANGING: a complete look spans several axes (see\nthe Know model), so after the host settles one, don't close the turn as if the design were finished.\nAcknowledge the pick, **tell them what's still open**, and keep guiding toward it — showing the next thing\n_you_ judge best or asking one focused question. You shape the flow (which axis comes next, and how); the\nonly rule is that a single gallery pick must never silently end it — never leave a turn that only\n_describes_ a step, with no gallery and no question. (A **single-axis** request DOES stop after the pick —\nsee the three shapes; don't tee up another axis.)\n\n### The header photo is its own step — keep, replace, or upload\n\nThe header photo is a **distinct step**, not a footnote to the header style — and the beat where the tool\ncall is most often dropped, so give it its own turn. When the host settles on a **photo** header style,\n**open the picker in that same turn** — `view_media_library` with `purpose: \"select\"`,\n`showCurrentHeader: true`, and `maxPhotos` = the style's photo count — **before you write anything else**.\nOpening it IS the ask; never say \"here's your library\" or \"pick one below\" without the tool call in the same\nturn (that's the classic failure — describing a picker that never opened).\n\nThe picker shows a **\"keep current\" card** for the photo the host already has, flagged **sample** (a Joy\ndefault) or **theirs** — so all three moves are one tap:\n\n- **Keep it.** Samples are often lovely, and a fresh site ships one in every position — there's no shame in\n keeping it. Tapping \"keep\" carries it forward even when the style changes; you'll hear they kept it, then\n represent the header as `{ style: …, keepCurrentPhoto: true }` (no numbers). That `keepCurrentPhoto: true`\n is load-bearing — it's what satisfies `apply_website_design` AND makes the coherence check accept the kept\n photo; without it, both wrongly say the header still needs one. Then handle it **per scope**: a\n single-axis or directed header change applies that patch now (`apply_website_design`) and stops; a\n whole-look step **records** that header patch in the proposal and carries forward — keeping is a choice\n like any other, so putting `{ style, keepCurrentPhoto: true }` in the proposal (rather than leaving the\n header out) is what stops a layout change in the same proposal from silently resetting it and lets the\n coherence check see it. (If they kept the photo and picked **no new style**, and nothing else changes,\n that's genuinely no change — acknowledge and stop; don't call apply with an empty patch. But in a\n whole-look where a layout is also changing, still record the kept header explicitly so the layout can't\n reset it.)\n- **Replace it.** They tap a library photo (or several) and the numbers come back to you.\n- **Upload.** If the library is empty or nothing fits, the picker's \"Add photos\" button pulls a photo from\n their phone — they don't have to have uploaded one first.\n\nFrame it that way — _\"keep this one, pick another, or add your own\"_ — never as though they must replace it.\nThe photo sits at its **natural late spot** (the header depends on the layout, which comes after\ntheme/color/font); don't drag it earlier.\n\n**Other pages' photos work the same way.** Beyond the welcome header, each page (story, schedule, travel, …)\nhas its own main photo — and each ships a sample too. Setting one goes through `set_website_page_photo`\n(a library number), but you drive it with the **same keep-or-replace picker**: `view_media_library` with\n`purpose: \"select\"`, `showCurrentPagePhoto: \"<page>\"`, and `maxPhotos: 1`. It shows that page's current\nphoto with a one-tap keep; on a replace the number comes back and you call `set_website_page_photo`. Same\nrule as the header — show what's there, offer keep-or-replace, never ask them to recall a number.\n\nNot every page belongs in this flow. **Skip these:**\n- **Registry** and **RSVP** keep Joy's default and can't take a custom photo — if you try anyway,\n `set_website_page_photo` says so plainly; that's expected, so move on, don't retry.\n- **Photos / Moments** — its image is a **full-screen gallery cover**, not a page header. It's a different\n thing from the per-page header photo, so don't offer it here.\n\nMost content pages (welcome, story, schedule, travel, …) and the couple's own custom pages take a header\nphoto fine — those are the ones to walk.\n\nWhen a gallery is shown the host can already see it, so **be additive**: narrate the shortlist in a\nsentence or two and say which one or two you'd lean toward and why — in prose. There is no \"recommended\"\nbadge; the shortlist _is_ your recommendation. Don't relist it as a table.\n\n**Narrow by recommendation, never by hiding real options.** Recommending one or two choices and saying why\nis good guidance. Framing a choice as a menu that leaves out options the host actually has is not — e.g.\noffering \"one photo or photo-free\" for a header when that layout also supports a photo slideshow. A framed\nchoice must reflect what's genuinely available; when in doubt, show the gallery (it's the true set) rather\nthan inventing a narrower either/or that quietly rules real options out.\n\n**Speak the host's language everywhere — including to the tool.** Use the host-facing names: the\n**layout** names (\"Split View\", \"Single Page\", \"Classic Navigation\") and the **header**-style labels\n(\"Photo\", \"Photo Slider\", \"Photo Arch\"). `apply_website_design` now resolves these names server-side,\nso you pass the SAME words to the tool that you say to the host — you never touch the internal codenames\n(`aloha`/`brannan`/`singlePage`/`classic`, `photoArch`, …). And call it the **header** with the host, not\nthe \"header\" (that's design jargon they won't know).\n\n**Plain words — talk about their website and the look, nothing else.** To the host there is just their\nwebsite and a look at what it would become. To SHOW the look, say _\"let me show you what your site would look\nlike with this design.\"_ To APPLY, say _\"I'll apply it to your website\"_ — a directed or single-axis change\njust applies, don't ask first; _\"want me to apply it?\"_ is the **whole-look** confirm, only after you've\nshown the composed design. Those are the terms — their website, the look, applying it.\n\nEach gallery card has one action — **Choose**. A click just tells you the host picked that option (a\nshorthand so they don't have to type it out); it does **not** apply anything. What you do with a pick\ndepends on the scope they opened:\n\n- **Single-axis input** (they asked about just this dimension) → apply the pick now with\n `apply_website_design` (to the website — **not** staged as a proposal), then **stop and hand back to\n them**. Do NOT propose or tee up the next dimension (\"for the next piece, the typography…\"), and don't\n narrate an ongoing design flow — they asked about one axis, not a makeover. At most a single light offer\n (\"want to keep refining, or good here?\"), never a suggestion for what to do next.\n- **Whole-look flow** → add the pick to the **running proposal** and keep guiding the next axis; don't\n apply on the spot — apply comes later, once, after the coherence check and their go-ahead.\n\nEither way, don't bundle in an axis the host hasn't asked for (e.g. inventing a header, a font, or new\nphotos off a theme pick — offer it, don't apply it). (A directed one-off change applies immediately — see\nthe three shapes above.)\n\n---\n\n## Accumulate: the proposal\n\nThe proposal is **a partial `apply_website_design` patch, held here in the conversation** — never a\nserver-side draft. As the host decides, build it up:\n\n```json\n{\n \"theme\": \"Emerald City\",\n \"layout\": \"Split View\",\n \"colors\": { \"pageBackground\": \"#FBF7F0\", \"pageText\": \"#2A2A2A\" },\n \"font\": \"Playfair Display\",\n \"header\": { \"style\": \"Photo\", \"photos\": [2, 5] }\n}\n```\n\n(Layout and header `style` are the **host-facing names** — `apply_website_design` resolves them; header\n`photos` are **library photo numbers**. To keep the photo they already have while setting a photo style,\nuse `\"header\": { \"style\": \"Photo Arch\", \"keepCurrentPhoto\": true }` instead of `photos` — see the\nheader-photo step above.)\n\n\"Add to proposal\" merges one axis in; re-deciding an axis overwrites it. When the host is ready,\n**\"Apply this design\"** sends the accumulated patch in a single `apply_website_design` call. Only the\naxes present are written; everything else is left untouched.\n\n(This same patch-object-in-chat is how the eventual cross-domain proposal works: `{design: {…},\ncontent: {…}}` — apply dispatches one commit per domain.)\n\n---\n\n## Check: coherence (before a composed apply, while guiding)\n\n**This is the WHOLE-LOOK check — the full pass below, ending in showing the proposed design, belongs to a\nwhole-look redesign, not to a directed change or single-axis input.** For those, coherence is a\nverbal note delivered alongside the apply (see the three shapes above) — never the proposed-design view and never\nthe accumulate loop. The pass below is for when you're guiding a composed design.\n\n**This is where your design judgment does the work.** Before committing a composed design, look at it as a\nwhole and say — in your own words — what reads well and what doesn't. You are a capable design critic; use\nthat, don't just defer to a mechanical verdict:\n\n- **Legibility.** Will the text actually be readable on its background (`pageText` on `pageBackground`,\n `headerText` on `headerBackground`, `buttonsAndLinks` on both)? A theme with no color overrides is\n already balanced; the risk is a color the host set by hand (e.g. near-white text on a pale\n background, \"navy links on my navy background\"). If a pairing looks hard to read, say so and offer a fix.\n- **Harmony.** Do theme + font + layout read as one intent? A formal script font on a playful beach theme\n is a mismatch worth flagging.\n- **Completeness.** Is anything important unset for what they want — a photo mentioned but no header style\n carrying it; a \"whole new look\" where only a font changed?\n\nThen there's a **deterministic backstop** you can lean on for the things judgment can't reliably settle —\ncall `design_guide` with the `proposal` to run it. It checks the ground-truth facts, not\ntaste: **buildability** (every axis is a real Joy control — this catches a hallucinated or misremembered\ncontrol, e.g. an `accent` or a made-up theme name) and the **Joy layout quirk** (a `navigation` value only\nrides with a Brannan layout). Treat its result as a safety net under your judgment, not a replacement for\nit. Show the host the proposed design only once your read is good and the backstop is clean.\n\n---\n\n## Show them what it would look like (before you apply)\n\nOnce your read is good and the backstop is clean, **show the host what their website would look like with\nthe proposed design, before you apply it** — so they decide from what they can _see_, not a description.\nShowing it doesn't change their website:\n\n1. **Prepare the look (silently).** Call `apply_website_design` with the full proposal patch **plus\n `saveTo: \"proposal\"`** — this readies the look without changing the website. It's a behind-the-scenes\n step; don't announce it. The only thing you tell the host is the result (step 3).\n2. **Show it.** Call `preview_website` with **`source: \"proposal\"`**. The host sees what their website would\n look like with the proposed theme, colors, and font, **over their own photos** — the truest test of\n whether a theme suits their pictures (revisit a theme that fights the photo; lean into one that lifts it).\n3. **Ask, then apply.** Tell them this is their site with the new design, and **ask whether they'd like you\n to apply it**. If they want changes, revise the proposal and prepare the look again; when they say yes,\n apply the changes (below). Don't just show it and stop, and don't apply until they've said yes.\n\nPresent it simply and positively — it's a look at their site with the proposed design. Don't caveat or\napologize. This Show-then-ask step is for a **whole-look composed design** — **skip it for a directed\nchange or a single-axis pick**; those apply directly (render a preview only if the host asks).\n\n---\n\n## Apply\n\nFor a **whole-look** design, once the host says yes, call `apply_website_design` once with the full\nproposal patch — the default (`saveTo: \"website\"`) applies it to their website. (A **directed change or\nsingle-axis pick** uses the same call immediately — no consent gate — passing only the changed axis; see\nthe three shapes.) It routes each axis to the cheapest correct Joy write\n(single axis → a targeted mutation; multiple → the atomic native bundle). For a **whole-look** apply, then\ncall `preview_website` (the default `source: \"website\"`) so they see the composed result on their site; for\na **directed or single-axis** change, show a preview only if they ask — a small edit doesn't need the\nrender ceremony (see the three shapes, and lines 27 / the Show step). If a partial failure is reported, tell\nthe host exactly what landed and what didn't — the change is applied and reversible.\n\n`apply_website_design` changes the host's website design — the one they see in their Joy editor, and what\nguests see once the site is published. Whether guests can see the site at all is a SEPARATE setting\n(publishing, via `apply_website_settings`); applying a design never publishes an unpublished site.\n"
}SHA-256 of public snapshot: dd0881a411995c67e5ea71b85cc5b8aa4c18a8ba47905a62d57deb9772696eb8