luckiest-co 1.0.13 → 1.0.15
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/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/luckiest-ab-testing/SKILL.md +1 -1
- package/skills/luckiest-ad-creative/SKILL.md +1 -1
- package/skills/luckiest-ads/SKILL.md +1 -1
- package/skills/luckiest-advisors/SKILL.md +1 -1
- package/skills/luckiest-aeo-grader/SKILL.md +1 -1
- package/skills/luckiest-ai-seo/SKILL.md +1 -1
- package/skills/luckiest-analytics/SKILL.md +1 -1
- package/skills/luckiest-aso/SKILL.md +1 -1
- package/skills/luckiest-churn-prevention/SKILL.md +1 -1
- package/skills/luckiest-co-marketing/SKILL.md +1 -1
- package/skills/luckiest-coder/SKILL.md +1 -1
- package/skills/luckiest-coder-brainstorming/SKILL.md +1 -1
- package/skills/luckiest-coder-consistency/SKILL.md +1 -1
- package/skills/luckiest-coder-constitution/SKILL.md +1 -1
- package/skills/luckiest-coder-debugging/SKILL.md +1 -1
- package/skills/luckiest-coder-dispatching-parallel-agents/SKILL.md +1 -1
- package/skills/luckiest-coder-executing-plans/SKILL.md +1 -1
- package/skills/luckiest-coder-finishing-a-branch/SKILL.md +1 -1
- package/skills/luckiest-coder-git-worktrees/SKILL.md +1 -1
- package/skills/luckiest-coder-guard/SKILL.md +1 -1
- package/skills/luckiest-coder-qa/SKILL.md +1 -1
- package/skills/luckiest-coder-receiving-code-review/SKILL.md +1 -1
- package/skills/luckiest-coder-requesting-code-review/SKILL.md +1 -1
- package/skills/luckiest-coder-shipping/SKILL.md +1 -1
- package/skills/luckiest-coder-subagent-driven-development/SKILL.md +1 -1
- package/skills/luckiest-coder-tdd/SKILL.md +1 -1
- package/skills/luckiest-coder-verification/SKILL.md +1 -1
- package/skills/luckiest-coder-writing-plans/SKILL.md +1 -1
- package/skills/luckiest-coder-writing-skills/SKILL.md +1 -1
- package/skills/luckiest-cold-email/SKILL.md +1 -1
- package/skills/luckiest-community-marketing/SKILL.md +1 -1
- package/skills/luckiest-competitor-profiling/SKILL.md +1 -1
- package/skills/luckiest-competitors/SKILL.md +1 -1
- package/skills/luckiest-content-strategy/SKILL.md +1 -1
- package/skills/luckiest-copy-editing/SKILL.md +1 -1
- package/skills/luckiest-copywriting/SKILL.md +1 -1
- package/skills/luckiest-cro/SKILL.md +1 -1
- package/skills/luckiest-customer-research/SKILL.md +1 -1
- package/skills/luckiest-directory-submissions/SKILL.md +1 -1
- package/skills/luckiest-emails/SKILL.md +1 -1
- package/skills/luckiest-extract-design-system/SKILL.md +1 -1
- package/skills/luckiest-free-tools/SKILL.md +1 -1
- package/skills/luckiest-image/SKILL.md +1 -1
- package/skills/luckiest-launch/SKILL.md +1 -1
- package/skills/luckiest-lead-magnets/SKILL.md +1 -1
- package/skills/luckiest-marketing-ideas/SKILL.md +1 -1
- package/skills/luckiest-marketing-plan/SKILL.md +1 -1
- package/skills/luckiest-marketing-psychology/SKILL.md +1 -1
- package/skills/luckiest-model-router/SKILL.md +1 -1
- package/skills/luckiest-offers/SKILL.md +1 -1
- package/skills/luckiest-onboarding/SKILL.md +1 -1
- package/skills/luckiest-paywalls/SKILL.md +1 -1
- package/skills/luckiest-popups/SKILL.md +1 -1
- package/skills/luckiest-pricing/SKILL.md +1 -1
- package/skills/luckiest-product-marketing/SKILL.md +1 -1
- package/skills/luckiest-programmatic-seo/SKILL.md +1 -1
- package/skills/luckiest-prompt-rewrite/SKILL.md +1 -1
- package/skills/luckiest-prospecting/SKILL.md +1 -1
- package/skills/luckiest-public-relations/SKILL.md +1 -1
- package/skills/luckiest-referrals/SKILL.md +1 -1
- package/skills/luckiest-revops/SKILL.md +1 -1
- package/skills/luckiest-sales-enablement/SKILL.md +1 -1
- package/skills/luckiest-schema/SKILL.md +1 -1
- package/skills/luckiest-seo-audit/SKILL.md +1 -1
- package/skills/luckiest-session-handoff/SKILL.md +1 -1
- package/skills/luckiest-signup/SKILL.md +1 -1
- package/skills/luckiest-site-architecture/SKILL.md +1 -1
- package/skills/luckiest-sms/SKILL.md +1 -1
- package/skills/luckiest-social/SKILL.md +1 -1
- package/skills/luckiest-thinker/SKILL.md +1 -1
- package/skills/luckiest-trends/SKILL.md +1 -1
- package/skills/luckiest-video/SKILL.md +1 -1
- package/skills/luckiest-website-cloner/ATTRIBUTION.md +29 -0
- package/skills/luckiest-website-cloner/CHANGELOG.md +8 -0
- package/skills/luckiest-website-cloner/LICENSE +21 -0
- package/skills/luckiest-website-cloner/SKILL.md +289 -0
- package/skills/luckiest-website-cloner/references/builtin-browser-recipes.md +74 -0
- package/skills/luckiest-website-cloner/references/compositing.md +65 -0
- package/skills/luckiest-website-cloner/references/fidelity-fast-path.md +92 -0
- package/skills/luckiest-website-cloner/references/playwright-cli-recipes.md +68 -0
- package/skills/luckiest-website-cloner/references/teardown.md +142 -0
- package/skills/luckiest-website-cloner/references/visual-qa.md +102 -0
- package/skills/luckiest-website-cloner/scripts/build-bundle.cjs +12 -0
- package/skills/luckiest-website-cloner/scripts/motion-probe.js +423 -0
- package/skills/luckiest-website-cloner/scripts/surface-map.js +392 -0
- package/skills/luckiest-website-cloner/scripts/tokens-probe.js +178 -0
- package/skills/luckiest-website-cloner-dom/ATTRIBUTION.md +4 -0
- package/skills/luckiest-website-cloner-dom/CHANGELOG.md +8 -0
- package/skills/luckiest-website-cloner-dom/LICENSE +21 -0
- package/skills/luckiest-website-cloner-dom/SKILL.md +170 -0
- package/skills/luckiest-website-cloner-dom/references/asset-resolution.md +93 -0
- package/skills/luckiest-website-cloner-dom/references/interaction-fingerprints.md +85 -0
- package/skills/luckiest-website-cloner-remix/ATTRIBUTION.md +4 -0
- package/skills/luckiest-website-cloner-remix/CHANGELOG.md +8 -0
- package/skills/luckiest-website-cloner-remix/LICENSE +21 -0
- package/skills/luckiest-website-cloner-remix/SKILL.md +202 -0
- package/skills/luckiest-website-cloner-remix/references/directions.md +82 -0
- package/skills/luckiest-website-cloner-remix/references/reskin.md +84 -0
- package/skills/luckiest-website-cloner-remix/references/tweak-panel.md +72 -0
- package/skills/luckiest-website-cloner-remix/scripts/apply-overrides.cjs +105 -0
- package/skills/luckiest-website-cloner-remix/scripts/gallery.cjs +71 -0
- package/skills/luckiest-website-cloner-remix/scripts/tokenize-css.cjs +127 -0
- package/skills/luckiest-website-cloner-remix/scripts/tweak-panel.js +169 -0
- package/skills/luckiest-website-cloner-shaders/ATTRIBUTION.md +11 -0
- package/skills/luckiest-website-cloner-shaders/CHANGELOG.md +8 -0
- package/skills/luckiest-website-cloner-shaders/LICENSE +21 -0
- package/skills/luckiest-website-cloner-shaders/SKILL.md +129 -0
- package/skills/luckiest-website-cloner-shaders/references/capture-backends.md +89 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/SKILL.md +123 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/capture-backends.md +201 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/evidence-policy.md +93 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/operating-contract.md +82 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/qa-failure-policy.md +100 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/recon-kernel.md +206 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/replay-policy.md +145 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/shaders-com.md +212 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/source-analysis.md +112 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/surface-discovery.md +113 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/target-lock.md +205 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/three-shader-reconstruction.md +155 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/tool-capability-matrix.md +57 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/references/unicorn-studio.md +387 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/scripts/fetch-rendered-dom.mjs +178 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/scripts/scan-bundle.sh +80 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/extraction-report.md +41 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/known-gaps.md +14 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/qa-report.md +74 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/replay-manifest.json +147 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/run-state.json +75 -0
- package/skills/luckiest-website-cloner-shaders/vendor/web-shader-extractor/templates/scout-card.json +106 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: luckiest-website-cloner-dom
|
|
3
|
+
description: >-
|
|
4
|
+
Extract and rebuild the DOM/CSS layer of a web page — layout, typography,
|
|
5
|
+
colors, spacing, real content, assets, and normal interactions — into clean
|
|
6
|
+
components, section by section, from exact getComputedStyle() values rather
|
|
7
|
+
than guesses. This is the DOM/CSS track: it deliberately does NOT handle
|
|
8
|
+
WebGL/WebGPU/canvas shader surfaces (those go to luckiest-website-cloner-shaders). Usually
|
|
9
|
+
driven by the luckiest-website-cloner coordinator, but can be used directly when the user
|
|
10
|
+
wants to rebuild a page's markup/styling and there are no GPU-rendered
|
|
11
|
+
effects. Trigger on "rebuild this section", "extract the CSS/layout", "clone
|
|
12
|
+
the markup and styling of this page", or the DOM half of a full site clone.
|
|
13
|
+
argument-hint: "<url> | <output-dir with surface-map.json + ROUTING.md>"
|
|
14
|
+
user-invocable: false
|
|
15
|
+
license: MIT. See ATTRIBUTION.md
|
|
16
|
+
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
|
|
17
|
+
metadata:
|
|
18
|
+
version: "1.0.0"
|
|
19
|
+
listing_id: luckiest-website-cloner-dom
|
|
20
|
+
author: luckiest
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
# DOM Clone
|
|
24
|
+
|
|
25
|
+
Rebuild the DOM/CSS layer of a page as clean components whose every value is
|
|
26
|
+
**measured, not estimated**. The difference between a clone that reads as
|
|
27
|
+
"pixel-perfect" and one that reads as "AI slop" is almost entirely whether the
|
|
28
|
+
spacing, type scale, and colors are the site's real computed values or an
|
|
29
|
+
approximation. So the whole method is built to remove guessing.
|
|
30
|
+
|
|
31
|
+
**Scope boundary — read this first.** This track handles DOM/CSS only. Any
|
|
32
|
+
`<canvas>` painting WebGL/WebGPU/2D pixels is invisible to `getComputedStyle()`
|
|
33
|
+
and belongs to `luckiest-website-cloner-shaders`. When you meet a GPU surface (the surface map
|
|
34
|
+
tags them, or you see a `<canvas>` you can't style your way into), do NOT rebuild
|
|
35
|
+
it — leave a **placeholder mount** (below) and move on. Rebuilding a shader as
|
|
36
|
+
HTML is the classic failure that makes a clone look empty.
|
|
37
|
+
|
|
38
|
+
## Inputs
|
|
39
|
+
|
|
40
|
+
- Driven by luckiest-website-cloner: you get an output dir containing `surface-map.json` and
|
|
41
|
+
`ROUTING.md`. Build only the sections routed to the DOM track; leave mounts for
|
|
42
|
+
GPU surfaces.
|
|
43
|
+
- Standalone: you get a URL. Do a quick recon first (screenshots + the interaction
|
|
44
|
+
sweep below). If you spot GPU `<canvas>` surfaces, tell the user those need the
|
|
45
|
+
luckiest-website-cloner-shaders track and build the DOM around them.
|
|
46
|
+
|
|
47
|
+
Requires a browser MCP (Chrome/Playwright/Puppeteer). Keep large extraction
|
|
48
|
+
artifacts in the output dir, not the conversation.
|
|
49
|
+
|
|
50
|
+
## The method: extract → spec → build → verify
|
|
51
|
+
|
|
52
|
+
### 1. Foundation first (sequential, do it yourself)
|
|
53
|
+
|
|
54
|
+
Nothing can be built until the shared ground exists, because every later
|
|
55
|
+
component depends on it:
|
|
56
|
+
|
|
57
|
+
- **Design tokens** — run `../luckiest-website-cloner/scripts/tokens-probe.js`
|
|
58
|
+
(`tokensProbe()`) at 1440/768/390 if the coordinator hasn't already left
|
|
59
|
+
`tokens-*.json` in the output dir. Its frequency-ranked palette, type scale,
|
|
60
|
+
spacing, radii, shadows, and `:root` custom props ARE the tokens — write them
|
|
61
|
+
as CSS variables / Tailwind theme, keeping the site's own `--names` when it
|
|
62
|
+
has them. Colors and fonts wrong here poison every component.
|
|
63
|
+
- **Motion params** — likewise take `motion.json` (`../luckiest-website-cloner/scripts/
|
|
64
|
+
motion-probe.js`) as the source for every GSAP/ScrollTrigger/Lenis/WAAPI
|
|
65
|
+
value a spec needs. A spec that says `scrub: 1.2, start: "top top", end:
|
|
66
|
+
"+=200%"` came from the runtime; one that says "scrubs on scroll" is a guess.
|
|
67
|
+
- **Fonts** — identify actual `font-family` on headings/body/labels; wire up the
|
|
68
|
+
same families (self-hosted or Google) so metrics match.
|
|
69
|
+
- **Global assets** — favicons, logos, and site-wide images to the project.
|
|
70
|
+
Resolve each through the asset ladder in `references/asset-resolution.md`:
|
|
71
|
+
download the REAL file first; only fall back to reconstructing, generating
|
|
72
|
+
(Higgsfield, for decorative assets — never brand identity), or a placeholder,
|
|
73
|
+
and label which tier was used. This keeps the clone honest about what's real.
|
|
74
|
+
- **Global behaviors** — smooth-scroll library (Lenis/Locomotive), scroll-snap,
|
|
75
|
+
global keyframes. See `references/interaction-fingerprints.md` to detect and
|
|
76
|
+
reproduce these; they change how sections must be built.
|
|
77
|
+
|
|
78
|
+
Verify the empty shell builds before going further.
|
|
79
|
+
|
|
80
|
+
### 2. Extract each section with exact values
|
|
81
|
+
|
|
82
|
+
For each DOM section top-to-bottom, use the browser to capture — don't hand-
|
|
83
|
+
measure:
|
|
84
|
+
|
|
85
|
+
- A section screenshot (for the builder's reference and later QA).
|
|
86
|
+
- **Computed styles** for every meaningful element via `getComputedStyle()` —
|
|
87
|
+
real px/color/weight values, not "looks like `text-lg`".
|
|
88
|
+
- **Real content** — verbatim text, alt text, and every image/`<img>`/background
|
|
89
|
+
image in the section, including **layered/overlay** images (a hero is often a
|
|
90
|
+
background + a foreground mockup + an icon; miss the overlay and it looks bare).
|
|
91
|
+
Resolve each asset through `references/asset-resolution.md` (REAL → RECONSTRUCT
|
|
92
|
+
→ GENERATE → PLACEHOLDER), tagging any that couldn't be downloaded.
|
|
93
|
+
- **All states, not just the default** — for tabs/accordions click each and
|
|
94
|
+
record per-state content; for scroll- or hover-triggered changes, capture the
|
|
95
|
+
before AND after computed styles and the transition (duration/easing) plus the
|
|
96
|
+
exact trigger. See `references/interaction-fingerprints.md`.
|
|
97
|
+
|
|
98
|
+
### 3. Write a spec file — the contract
|
|
99
|
+
|
|
100
|
+
Write one spec per section to `<output>/specs/<section>.spec.md` BEFORE building.
|
|
101
|
+
This is the contract between measurement and construction: the builder works from
|
|
102
|
+
the spec, not from its memory of a browser session, so it can't drift into
|
|
103
|
+
guessing. A spec has: target file, screenshot path, **interaction model**
|
|
104
|
+
(static / click / scroll / hover / time), exact computed styles per element,
|
|
105
|
+
per-state content, assets with local paths, verbatim text, and responsive
|
|
106
|
+
behavior at 1440 / 768 / 390. If a builder would have to invent any value, the
|
|
107
|
+
spec isn't done yet.
|
|
108
|
+
|
|
109
|
+
For GPU surfaces in this section, the spec says only: **placeholder mount** — a
|
|
110
|
+
positioned empty container with the id, size, z-index, and pointer-events from
|
|
111
|
+
the surface map, for luckiest-website-cloner-shaders to fill later. Nothing more.
|
|
112
|
+
|
|
113
|
+
### 4. Build — size agents to the model, not to dogma
|
|
114
|
+
|
|
115
|
+
Dispatch builders that each receive their spec inline (never "go read the spec").
|
|
116
|
+
On agent granularity: splitting a page into many tiny builders is a choice for
|
|
117
|
+
**speed and edit-isolation**, not a fidelity requirement — a capable model holds
|
|
118
|
+
a whole section's spec fine. So prefer **one builder per section** by default,
|
|
119
|
+
and split further only when a section contains genuinely independent pieces
|
|
120
|
+
(three distinct card variants, separate interactive widgets) that benefit from
|
|
121
|
+
parallel isolation. Over-splitting just adds merge and coordination cost.
|
|
122
|
+
|
|
123
|
+
If builders run in parallel and might touch shared files, isolate them (git
|
|
124
|
+
worktrees or separate output subtrees) and merge with the section topology in
|
|
125
|
+
hand. Each builder verifies its own typecheck/build before finishing.
|
|
126
|
+
|
|
127
|
+
### 5. Verify with a real diff
|
|
128
|
+
|
|
129
|
+
After assembly, run an automated pixel diff (Playwright `toHaveScreenshot()`),
|
|
130
|
+
original vs clone, at all three breakpoints — **masking any GPU placeholder
|
|
131
|
+
regions** so their emptiness/animation doesn't dominate the result. Tune
|
|
132
|
+
`maxDiffPixelRatio` rather than demanding zero diff (anti-aliasing causes false
|
|
133
|
+
positives). For each real discrepancy, decide: was the spec value wrong
|
|
134
|
+
(re-extract, fix spec) or did the builder ignore a correct spec (fix component)?
|
|
135
|
+
Fix at the source, not with a compensating fudge.
|
|
136
|
+
|
|
137
|
+
## Output
|
|
138
|
+
|
|
139
|
+
- `site/` (or the coordinator's chosen substrate) with styled sections + mounts
|
|
140
|
+
- `specs/*.spec.md` — one per section, the audit trail
|
|
141
|
+
- Downloaded assets under the project's public dir
|
|
142
|
+
- QA diff results per breakpoint + list of placeholder mounts left for GPU track
|
|
143
|
+
|
|
144
|
+
## What not to do
|
|
145
|
+
|
|
146
|
+
- Don't clone from a screenshot; extract the real DOM/CSS/content.
|
|
147
|
+
- Don't rebuild a `<canvas>` shader/3D effect as HTML — leave a mount.
|
|
148
|
+
- Don't approximate a computed value you could have measured.
|
|
149
|
+
- Don't freeze a `<video>` or animated SVG to a static image — re-embed / keep it.
|
|
150
|
+
- Don't build a click-based UI when the original is scroll-driven; settle the
|
|
151
|
+
interaction model before building (it's a rewrite, not a tweak, to change later).
|
|
152
|
+
|
|
153
|
+
## Guardrails
|
|
154
|
+
|
|
155
|
+
Clone for migration, for recovering your own lost source, or for learning how a
|
|
156
|
+
build works. Do not use it to pass off someone else's brand or design as your
|
|
157
|
+
own, for phishing or impersonation, or against a site whose terms forbid
|
|
158
|
+
reproduction. Logos, brand assets, and copy belong to their owners.
|
|
159
|
+
|
|
160
|
+
Stop and ask the user before continuing if any of these are true:
|
|
161
|
+
|
|
162
|
+
- The target looks like it exists to be impersonated: a bank or wallet login, a
|
|
163
|
+
checkout, an account or password page.
|
|
164
|
+
- The page is behind a login, a paywall, or a bot wall. Never supply
|
|
165
|
+
credentials, cookies, session tokens, or a stored browser profile to get past
|
|
166
|
+
one, and never work around the block.
|
|
167
|
+
- The page holds personal data about real people.
|
|
168
|
+
|
|
169
|
+
Capture only what renders publicly. Do not read or copy credentials, cookies,
|
|
170
|
+
local storage, or session storage from the target.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Asset resolution ladder
|
|
2
|
+
|
|
3
|
+
A clone needs the page's images, videos, textures, and icons. Some you can just
|
|
4
|
+
download; some are blocked (cross-origin, DRM, auth-walled); some you *shouldn't*
|
|
5
|
+
copy at all (a brand's logo in a learning clone). This ladder decides, per asset,
|
|
6
|
+
how to resolve it — and keeps the result honest about which tier was used.
|
|
7
|
+
|
|
8
|
+
The governing rule: **a faithful clone wants the REAL asset.** Generating a
|
|
9
|
+
lookalike is a fallback, never the default, and is gated by what the asset *is*.
|
|
10
|
+
A generated hero-background texture raises completeness; a generated logo lowers
|
|
11
|
+
fidelity AND copies brand identity. So gate by role, not by convenience.
|
|
12
|
+
|
|
13
|
+
## The four tiers (label every asset with the one used)
|
|
14
|
+
|
|
15
|
+
1. **REAL** — download the actual file to the project (`<img src>`, `<video>`,
|
|
16
|
+
background-image, source-set). Default. Highest fidelity. Always try first.
|
|
17
|
+
2. **RECONSTRUCT** — rebuild it yourself when it's cheaply rebuildable: an inline
|
|
18
|
+
SVG you can extract, a CSS gradient, a canvas/WebGL effect (hand to
|
|
19
|
+
luckiest-website-cloner-shaders). Faithful and license-clean.
|
|
20
|
+
3. **GENERATE** — synthesize a substitute via the Higgsfield MCP. Only when 1 and
|
|
21
|
+
2 both fail or are disallowed. Label the asset `GENERATED` and log it in
|
|
22
|
+
`known-gaps.md`. Never let a generated asset be reported as REAL.
|
|
23
|
+
4. **PLACEHOLDER** — a solid block, blurhash, or captured poster frame, when
|
|
24
|
+
generation isn't wanted or the asset is identity/content (below).
|
|
25
|
+
|
|
26
|
+
## Gate by role — the decision that matters
|
|
27
|
+
|
|
28
|
+
**Decorative / demo assets → GENERATE is appropriate** when REAL/RECONSTRUCT fail:
|
|
29
|
+
- hero or section **background video/image** that's blocked or heavy
|
|
30
|
+
- ambient **textures**, noise maps, gradient meshes, particle sprites
|
|
31
|
+
- a **poster frame** for a shader/canvas that couldn't be reconstructed
|
|
32
|
+
- filler **product/UI mockups** in a demo where exact content doesn't matter
|
|
33
|
+
|
|
34
|
+
**Identity / content assets → NEVER generate. REAL-or-PLACEHOLDER only:**
|
|
35
|
+
- **logos**, wordmarks, brand icons
|
|
36
|
+
- real **UI screenshots** / product imagery that carries meaning
|
|
37
|
+
- **photos of real people**, testimonials, author avatars
|
|
38
|
+
- anything where a generated substitute would misrepresent the original
|
|
39
|
+
|
|
40
|
+
Generating identity assets makes the clone *less* faithful and copies brand
|
|
41
|
+
identity — both wrong. If you can't get the real one, use a neutral placeholder
|
|
42
|
+
and note it.
|
|
43
|
+
|
|
44
|
+
## Special case: composited live-UI mocks (the download trap)
|
|
45
|
+
|
|
46
|
+
The most common asset mistake on modern product sites: a hero or feature visual
|
|
47
|
+
that *looks* like one image is actually a **live UI composited in HTML over a
|
|
48
|
+
static background image** — a fake app window, code panel, or dashboard layered
|
|
49
|
+
on a painterly/gradient wallpaper. If you naively download the background image
|
|
50
|
+
(tier 1 REAL), you get an empty wallpaper with none of the UI, because the UI was
|
|
51
|
+
never in that file. Worse, sites often **reuse the same wallpaper** across several
|
|
52
|
+
feature blocks, so an nth-image match lands on the wrong block's background.
|
|
53
|
+
|
|
54
|
+
How to handle it:
|
|
55
|
+
|
|
56
|
+
- **Recognize it:** the region contains real DOM (text nodes, buttons, code) on
|
|
57
|
+
top of an `<img>`/background whose natural size ≈ the whole region and whose
|
|
58
|
+
content is just texture. If getComputedStyle sees real child elements over an
|
|
59
|
+
image, it's composited — not a flat asset.
|
|
60
|
+
- **Capture, don't download:** screenshot the composited region as a whole
|
|
61
|
+
(Playwright `clip` at the region's box) → tier is CAPTURED, not REAL. This is
|
|
62
|
+
the faithful static representation of a live composition.
|
|
63
|
+
- **Reused-wallpaper guard:** don't trust "the nth `<img>`" to identify the
|
|
64
|
+
block — capture by the region's own bounding box at the scroll offset where it's
|
|
65
|
+
fully visible (see the scroll-pinned note in `interaction-fingerprints.md`).
|
|
66
|
+
|
|
67
|
+
Label these CAPTURED in the report so it's clear the pixels are a snapshot of a
|
|
68
|
+
live composition, not a downloaded source asset.
|
|
69
|
+
|
|
70
|
+
## Calling Higgsfield (tier 3)
|
|
71
|
+
|
|
72
|
+
Match the tool to the asset. Follow the creative-direction rule: for anything
|
|
73
|
+
non-trivial, propose 2–3 directions and get a pick before burning credits.
|
|
74
|
+
|
|
75
|
+
- **Image** (texture, background, mockup) → `generate_image` (GPT Image 2 for
|
|
76
|
+
design/text-in-image; Nano Banana for reference-driven). Feed it the surface's
|
|
77
|
+
role, palette (from design tokens), and aspect/size from the surface map.
|
|
78
|
+
- **Video** (hero background loop) → `generate_video` (Seedance for generic
|
|
79
|
+
motion). Match duration/aspect/muted-loop to the original `<video>` element.
|
|
80
|
+
- **Import a specific asset you found but can't hotlink** → `media_import_url`.
|
|
81
|
+
- **Cutout / transparent** → `remove_background`.
|
|
82
|
+
|
|
83
|
+
Write generated assets into the project's asset dir with a filename tagged
|
|
84
|
+
`-generated` and record in `known-gaps.md`: original URL (if any), why REAL/
|
|
85
|
+
RECONSTRUCT failed, the prompt used, and the tier. This keeps the clone auditable
|
|
86
|
+
and the fidelity claim honest.
|
|
87
|
+
|
|
88
|
+
## Reporting
|
|
89
|
+
|
|
90
|
+
In the completion report, break assets down by tier: N REAL, N RECONSTRUCT, N
|
|
91
|
+
GENERATED, N PLACEHOLDER. A clone that's 90% REAL with 3 clearly-labeled
|
|
92
|
+
GENERATED decorative textures is honest and complete. A clone silently padded
|
|
93
|
+
with generated brand assets is neither.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Interaction fingerprints
|
|
2
|
+
|
|
3
|
+
The most expensive mistake when rebuilding a section is getting its **control
|
|
4
|
+
model** wrong — building click-switched tabs when the original auto-switches on
|
|
5
|
+
scroll, or static CSS when the original runs a smooth-scroll library. Fixing it
|
|
6
|
+
later is a rewrite, not a tweak, because it changes the component's whole
|
|
7
|
+
structure. So identify the mechanism during extraction, from concrete signatures,
|
|
8
|
+
not from how it looks.
|
|
9
|
+
|
|
10
|
+
## Determine the model by observing, in this order
|
|
11
|
+
|
|
12
|
+
1. **Scroll first, don't click.** Slowly scroll the section. If content changes,
|
|
13
|
+
panels swap, or a sidebar's active item advances on its own as you scroll,
|
|
14
|
+
it's **scroll-driven** (IntersectionObserver / scroll timeline / sticky). Note
|
|
15
|
+
the trigger (scroll position or intersection ratio).
|
|
16
|
+
2. **Then click.** If nothing changes on scroll, test clicks — real tabs/pills
|
|
17
|
+
that swap content on click.
|
|
18
|
+
3. **Then hover.** Record hover state changes (color/scale/shadow) with their
|
|
19
|
+
transition duration + easing.
|
|
20
|
+
|
|
21
|
+
Record the verdict explicitly in the spec: `INTERACTION MODEL: scroll-driven
|
|
22
|
+
(IntersectionObserver)` etc.
|
|
23
|
+
|
|
24
|
+
## Smooth-scroll libraries
|
|
25
|
+
|
|
26
|
+
Native browser scrolling feels different from a lerp-smoothed library; users spot
|
|
27
|
+
it instantly, so a clone must reproduce the same scroll feel. Detect by
|
|
28
|
+
signature:
|
|
29
|
+
|
|
30
|
+
- **Lenis** (the dominant current library) — a `Lenis` runtime global, a `lenis`
|
|
31
|
+
class on `<html>`, and/or `data-lenis*` attributes (e.g. `data-lenis-prevent`).
|
|
32
|
+
It smooths the browser's own native scroll (so sticky/anchor/accessibility keep
|
|
33
|
+
working) rather than transform-hijacking the page — reproduce it by adding Lenis
|
|
34
|
+
with matching lerp/duration, not by faking scroll with transforms.
|
|
35
|
+
- **Locomotive Scroll** — `data-scroll`, `data-scroll-container`,
|
|
36
|
+
`data-scroll-section`, `data-scroll-speed` attributes. Current versions are
|
|
37
|
+
built on top of Lenis, so a Locomotive page often shows Lenis signatures too;
|
|
38
|
+
reproduce with Locomotive (or Lenis + the same `data-scroll-speed` parallax).
|
|
39
|
+
|
|
40
|
+
The surface-map script already reports these under `scroll`. Trust that as the
|
|
41
|
+
first pass, then confirm the feel.
|
|
42
|
+
|
|
43
|
+
## Scroll-driven CSS animations
|
|
44
|
+
|
|
45
|
+
Modern sites increasingly drive animations off scroll/view progress instead of
|
|
46
|
+
time, with no JS. Their fingerprint is CSS: `animation-timeline` set to something
|
|
47
|
+
other than `auto`, plus `scroll-timeline-name` / `view-timeline-name` (and their
|
|
48
|
+
`-axis` / `-inset`). When present, rebuild with the same scroll/view timeline —
|
|
49
|
+
don't approximate it with a JS scroll listener, which will feel and perform
|
|
50
|
+
differently.
|
|
51
|
+
|
|
52
|
+
## Behaviors to catch (illustrative, not exhaustive)
|
|
53
|
+
|
|
54
|
+
- Navbar that shrinks / gains a shadow / changes background past a scroll
|
|
55
|
+
threshold — capture styles at position 0 and past the trigger; diff them.
|
|
56
|
+
- Elements that animate into view on entering the viewport (fade-up, stagger).
|
|
57
|
+
- Sticky sidebars whose active item auto-changes as content scrolls (Intersection
|
|
58
|
+
Observer, NOT click handlers) — the classic scroll-vs-click trap.
|
|
59
|
+
- Parallax layers moving at different rates than scroll.
|
|
60
|
+
- Auto-playing carousels / cycling content (time-driven).
|
|
61
|
+
- Section-to-section theme flips (dark↔light) tied to scroll.
|
|
62
|
+
|
|
63
|
+
For any stateful element, extract **every** state's content and styles plus the
|
|
64
|
+
transition between them — a clone that only captures the load-time state looks
|
|
65
|
+
broken the moment the user interacts with it.
|
|
66
|
+
|
|
67
|
+
## Capturing assets inside scroll-pinned / sticky sequences
|
|
68
|
+
|
|
69
|
+
A common modern pattern: a tall feature section where a sticky column stays fixed
|
|
70
|
+
while paired content scrolls, swapping the visible mock per feature (`position:
|
|
71
|
+
sticky` + IntersectionObserver). Two traps when capturing the paired visual:
|
|
72
|
+
|
|
73
|
+
- **Don't trust "the nth image."** These sequences frequently reuse one
|
|
74
|
+
background/wallpaper image across every block, so an nth-`<img>` selector lands
|
|
75
|
+
on the wrong block's asset. Identify the block by its own container's bounding
|
|
76
|
+
box, not by image index.
|
|
77
|
+
- **Capture at the paired scroll offset.** The correct mock for feature N is only
|
|
78
|
+
fully composited/visible when the section is scrolled to N's active range.
|
|
79
|
+
Scroll to that offset first, then clip the region — capturing at scroll 0 gives
|
|
80
|
+
you the first (or an empty) frame. Record the offset in the spec so the capture
|
|
81
|
+
is reproducible.
|
|
82
|
+
|
|
83
|
+
If you only need a static clone, one clean full-row capture at the right offset is
|
|
84
|
+
enough; if you're rebuilding the pin behavior, also record the trigger ranges per
|
|
85
|
+
block (which one is active at which scroll position).
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
First Luckiest edition of `luckiest-website-cloner-remix`. Renamed from the upstream site-clone
|
|
6
|
+
collection, guardrails added to every entry point, recipes added for running the
|
|
7
|
+
probes from an in-app browser pane, frontmatter normalized to the Luckiest
|
|
8
|
+
package format. See ATTRIBUTION.md.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chase Hannegan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: luckiest-website-cloner-remix
|
|
3
|
+
description: >-
|
|
4
|
+
Turn a cloned (or any measured) website into YOUR site: re-skin it with your
|
|
5
|
+
brand, copy, and assets; generate three deliberately different design
|
|
6
|
+
directions as token/motion/shader overrides and render them side by side;
|
|
7
|
+
then put a live tweak panel on the direction you pick. This is the step after
|
|
8
|
+
/luckiest-website-cloner — it consumes the clone's TEARDOWN.md, tokens-*.json, motion.json,
|
|
9
|
+
and site/ and never re-probes. Use when the user says "/remix", "remix this
|
|
10
|
+
clone", "make this mine", "re-skin this", "give me three versions of this
|
|
11
|
+
site", "variations of this design", "add a tweak panel", "let me tune the
|
|
12
|
+
colors/spacing/motion", or has just approved a clone and wants to move from
|
|
13
|
+
copying to owning. NOT for cloning (use /luckiest-website-cloner) and NOT for building a
|
|
14
|
+
site from scratch.
|
|
15
|
+
argument-hint: "<clone-dir or site-dir> [--phase reskin|directions|panel]"
|
|
16
|
+
user-invocable: true
|
|
17
|
+
license: MIT. See ATTRIBUTION.md
|
|
18
|
+
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion
|
|
19
|
+
metadata:
|
|
20
|
+
version: "1.0.0"
|
|
21
|
+
listing_id: luckiest-website-cloner-remix
|
|
22
|
+
author: luckiest
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# Remix Site
|
|
26
|
+
|
|
27
|
+
A clone is a **measured design system plus a proven structure**. The teardown
|
|
28
|
+
already enumerated every knob — palette, type scale, spacing rhythm, motion
|
|
29
|
+
params, shader props, section order. Remixing means changing what flows
|
|
30
|
+
through those knobs, in three phases that each **stop for the user's call**
|
|
31
|
+
(unlike `/luckiest-website-cloner`, which runs autonomously):
|
|
32
|
+
|
|
33
|
+
1. **Re-skin** — swap the three things that make it *theirs*: copy, brand, hero
|
|
34
|
+
assets. Output: a de-branded template. Non-negotiable and first.
|
|
35
|
+
2. **Directions** — three deliberately different combinations of the big forks
|
|
36
|
+
(palette mood × type pairing × hero treatment × motion personality), rendered
|
|
37
|
+
side by side. The user picks one.
|
|
38
|
+
3. **Tweak panel** — the chosen direction's 10–15 real knobs made live in the
|
|
39
|
+
page, with permalink state. Not 80 sliders; the ones they'll keep turning.
|
|
40
|
+
|
|
41
|
+
`--phase` runs a single phase (e.g. a second re-skin for another client, or a
|
|
42
|
+
panel on a site that never came from the cloner).
|
|
43
|
+
|
|
44
|
+
## Inputs (the luckiest-website-cloner contract)
|
|
45
|
+
|
|
46
|
+
Resolve `$ARGUMENTS` to a directory and look for:
|
|
47
|
+
|
|
48
|
+
| File | Used for |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `TEARDOWN.md` | stack, effects table, assets table, known gaps |
|
|
51
|
+
| `tokens-*.json` | the measured design system — the knob list |
|
|
52
|
+
| `motion.json` | exact animation params — the motion knobs |
|
|
53
|
+
| `surface-map.json` | which regions are GPU (shader knobs live here) |
|
|
54
|
+
| `site/` | the rebuilt project (Vite/Next) |
|
|
55
|
+
| `assets/` or `site/public/assets/` | original assets, tiered |
|
|
56
|
+
|
|
57
|
+
If only `site/` exists (not a clone), run `tokens-probe.js` and
|
|
58
|
+
`motion-probe.js` from `../luckiest-website-cloner/scripts/` against the dev server once to
|
|
59
|
+
produce the JSON — then proceed. Never re-probe when the JSON is present.
|
|
60
|
+
|
|
61
|
+
## Phase 0 — Tokenize (mechanical, do it before anything)
|
|
62
|
+
|
|
63
|
+
The clone's CSS is full of literal values (`#1f3bff`, `32.04px`). Nothing can be
|
|
64
|
+
varied until those literals become variables. Run:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
node scripts/tokenize-css.cjs <site>/src/<site>.css <tokens-1440.json> <site>/src
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
It rewrites the stylesheet so every measured token value goes through
|
|
71
|
+
`var(--rx-<role>, <original>)` and writes `remix-tokens.css` (the defaults). If
|
|
72
|
+
the site already exposes its own `--vars` (Nuxt/Vue sites often do), the script
|
|
73
|
+
aliases those instead of inventing new names — keep the site's vocabulary.
|
|
74
|
+
|
|
75
|
+
Route motion through a config too: the clone's behavior JS should read from
|
|
76
|
+
`window.__remix.motion` (seeded from `motion.json` → `remix-motion.js`), and
|
|
77
|
+
shader mounts from `window.__remix.shaders`. If the builder hard-coded them,
|
|
78
|
+
hoist now. This is the one code change remix makes to the clone — everything
|
|
79
|
+
after is data.
|
|
80
|
+
|
|
81
|
+
Verify the site still renders identically (`qa/diff.mjs` against itself before
|
|
82
|
+
/after: must be 0%). **Show the user the knob list** (`remix/knobs.json`) and
|
|
83
|
+
stop: "These are the N things we can turn. Re-skin next?"
|
|
84
|
+
|
|
85
|
+
## Phase 1 — Re-skin
|
|
86
|
+
|
|
87
|
+
Ask for, in one batch: **brand** (name, logo file or "generate a placeholder
|
|
88
|
+
mark", primary + accent colors or "derive from logo"), **copy** (a doc/URL to
|
|
89
|
+
pull from, bullet points to expand, or "placeholder in their structure"), and
|
|
90
|
+
**hero/section assets** (files, or "generate").
|
|
91
|
+
|
|
92
|
+
Then:
|
|
93
|
+
- **Copy** — replace every text node section by section, keeping the
|
|
94
|
+
original's *shape* (eyebrow / headline / sub / CTA / card counts). Headline
|
|
95
|
+
lengths matter for layout: match ±20% characters or the hero reflows. Note
|
|
96
|
+
any overflow in the report.
|
|
97
|
+
- **Brand** — logo into the header/footer slots; primary/accent into
|
|
98
|
+
`remix-tokens.css`; favicon/OG.
|
|
99
|
+
- **Assets** — resolve through `../luckiest-website-cloner-dom/references/asset-resolution.md`
|
|
100
|
+
with the roles flipped: the original's REAL assets are now the thing to
|
|
101
|
+
*remove*. Decorative (hero background, textures, ambient imagery) →
|
|
102
|
+
GENERATE via Higgsfield using the original's composition as the brief (aspect,
|
|
103
|
+
subject placement, mood) — see `references/reskin.md` for the brief
|
|
104
|
+
template. Identity (their logo, their people, their product shots) → must be
|
|
105
|
+
replaced, never kept. Fonts: if the original's are commercially licensed,
|
|
106
|
+
swap to an open pairing with matching metrics (`references/reskin.md` has
|
|
107
|
+
the lookup); if open, keep.
|
|
108
|
+
- **Remove** analytics, their API endpoints, their links.
|
|
109
|
+
|
|
110
|
+
Render, screenshot the hero + two sections, **stop**: "This is the template
|
|
111
|
+
with your brand. Directions next?"
|
|
112
|
+
|
|
113
|
+
## Phase 2 — Three directions
|
|
114
|
+
|
|
115
|
+
**Ask first, one batch, before touching anything** (this is the question that
|
|
116
|
+
decides whether the directions are coats of paint or actually different sites):
|
|
117
|
+
|
|
118
|
+
1. **Amplitude** — *subtle* / *medium* / *big*?
|
|
119
|
+
| | moves | layer |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| subtle | palette, accent, motion timing, shader colors | `overrides.json` only |
|
|
122
|
+
| medium | + surface (radius/border/shadow), density (spacing ×), type scale + weights, grain | + `patch.css` |
|
|
123
|
+
| big | + hero treatment (photo → type-only / GPU-led / engraving), layout (grid ↔ editorial ↔ bento), section order, nav style, own hero asset per direction | + `patch.js` + generated assets |
|
|
124
|
+
If unsure, recommend **medium** — subtle reads as "same site, different coat"
|
|
125
|
+
side by side; big costs generations.
|
|
126
|
+
2. **Anchors** — "any aesthetics in mind?" *none* / *describe it* / *reference
|
|
127
|
+
sites or images* / *pull from my taste library* (`/taste-vault`). With none:
|
|
128
|
+
nearest-legit / opposite / wildcard from `references/directions.md`. With
|
|
129
|
+
anchors: one direction per anchor, built *toward* it, and say which fork each
|
|
130
|
+
anchor maps to so the user sees the translation.
|
|
131
|
+
|
|
132
|
+
Not five. Five converge; three deliberately different forks give a real choice.
|
|
133
|
+
Each direction is **data + an optional patch layer**, scoped to
|
|
134
|
+
`:root[data-rx="<slug>"]` so directions never collide:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
remix/directions/<slug>.json
|
|
138
|
+
{ "name": "...", "thesis": "one line",
|
|
139
|
+
"tokens": { "--rx-accent": "#…", "--rx-font-display": "…", "--rx-space-unit": "…" },
|
|
140
|
+
"motion": { "reveal": { "y": 22, "duration": 0.7, "ease": [.16,1,.3,1] }, "stagger": 0.08 },
|
|
141
|
+
"shaders": { "hero": { "colorFront": "#…", "intensity": 0.5 } },
|
|
142
|
+
"assets": { "hero-bg": "generated/<slug>-hero.jpg" } }
|
|
143
|
+
remix/directions/<slug>.patch.css (medium+) surface / density / type scale under :root[data-rx="<slug>"]
|
|
144
|
+
remix/directions/<slug>.patch.js (big) structural: hero variant, section order, layout classes
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
`apply-overrides.cjs` picks up `<slug>.patch.css` / `.patch.js` next to the
|
|
148
|
+
JSON automatically. Patches must be **additive and scoped** — never edit the
|
|
149
|
+
base HTML/CSS for a direction, or the other two break.
|
|
150
|
+
|
|
151
|
+
Derive the three from the original's *axes*, not from taste alone — see
|
|
152
|
+
`references/directions.md` for the fork table (palette mood, type pairing, hero
|
|
153
|
+
treatment, density, motion personality) and the rule that each direction must
|
|
154
|
+
differ on **at least three** forks. If the user has a taste library
|
|
155
|
+
(`/taste-vault` or reference images), pull the directions from there. Generate
|
|
156
|
+
per-direction hero assets only for the decorative layer.
|
|
157
|
+
|
|
158
|
+
Apply each with `node scripts/apply-overrides.cjs <site> remix/directions/<slug>.json`
|
|
159
|
+
(writes `remix-tokens.<slug>.css` + `remix-motion.<slug>.js`; the site loads
|
|
160
|
+
the active set via `?rx=<slug>`). Then `node scripts/gallery.cjs <site>` writes
|
|
161
|
+
`<site>/directions.html`: all directions **live side by side in iframes** (real
|
|
162
|
+
shaders + motion), synced scroll, click-a-name fullscreen, and a *pick* button
|
|
163
|
+
that stores the choice in `localStorage.rx-pick`. Open it in the user's browser
|
|
164
|
+
(this is the deliverable — not a static contact sheet), and also render
|
|
165
|
+
`remix/directions.jpg` for the report. **Stop** with the URL and one line per
|
|
166
|
+
direction: thesis + what changed. The user picks (read `rx-pick` or ask).
|
|
167
|
+
|
|
168
|
+
## Phase 3 — Tweak panel
|
|
169
|
+
|
|
170
|
+
On the pick only. Choose **10–15 knobs** from `knobs.json` — the ones that
|
|
171
|
+
matter for *this* direction (accent, display font size base, section spacing
|
|
172
|
+
unit, radius, reveal distance/duration/ease, stagger, shader intensity/colors,
|
|
173
|
+
hero gradient angle, grain opacity). Write `remix/panel.json`
|
|
174
|
+
(`references/tweak-panel.md` has the schema: type, range, step, default, CSS
|
|
175
|
+
var or motion/shader path) and inject `scripts/tweak-panel.js` into the site.
|
|
176
|
+
|
|
177
|
+
The panel: fixed, collapsible, grouped (Color / Type / Space / Motion / GPU),
|
|
178
|
+
writes CSS vars live, pokes `window.__remix` for motion/shader knobs and
|
|
179
|
+
re-renders the affected mount, serializes state into `#rx=` so a URL is a
|
|
180
|
+
permalink, and has Copy JSON / Reset / Export-as-direction. Keyboard: `` ` ``
|
|
181
|
+
toggles it. It is **dev-only** — stripped from the production build.
|
|
182
|
+
|
|
183
|
+
Verify: every knob visibly changes the page, permalink round-trips, reset
|
|
184
|
+
returns to the direction's defaults. Screenshot with the panel open.
|
|
185
|
+
|
|
186
|
+
## Completion report
|
|
187
|
+
|
|
188
|
+
- Template: what was replaced (copy sections, brand slots, assets by tier —
|
|
189
|
+
GENERATED assets listed), fonts kept/swapped and why
|
|
190
|
+
- Directions: the contact sheet + the three theses + which was picked
|
|
191
|
+
- Panel: knob list, permalink example
|
|
192
|
+
- Still theirs: anything structural you kept verbatim that the user should
|
|
193
|
+
know about (section order, interaction patterns) — a remix is legitimate
|
|
194
|
+
because the *expression* is new; say plainly what the skeleton still owes
|
|
195
|
+
to the original
|
|
196
|
+
|
|
197
|
+
## Guardrails
|
|
198
|
+
|
|
199
|
+
Phase 1 is mandatory before anything ships: no remix leaves with the
|
|
200
|
+
original's logo, copy, people, product imagery, or licensed fonts. If the user
|
|
201
|
+
asks to skip re-skinning and just "change the colors", say why that's still
|
|
202
|
+
their site and do Phase 1 first.
|