@rubytech/create-maxy-code 0.1.17 → 0.1.19
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/dist/__tests__/cdp-port-no-silent-fallback.test.js +2 -2
- package/dist/__tests__/onboarding-state-readback.test.js +61 -0
- package/dist/index.js +42 -0
- package/dist/onboarding-readback.js +27 -0
- package/package.json +2 -2
- package/payload/platform/config/brand-registry.json +4 -4
- package/payload/platform/config/brand.json +4 -4
- package/payload/platform/plugins/cloudflare/scripts/reset-tunnel.sh +1 -1
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +1 -1
- package/payload/platform/plugins/docs/references/deployment.md +25 -2
- package/payload/platform/scripts/installer-device-verify.sh +2 -2
- package/payload/platform/scripts/redact-install-logs.sh +2 -2
- package/payload/platform/scripts/seed-neo4j.sh +35 -0
- package/payload/platform/scripts/verify-skill-tool-surface.sh +1 -1
- package/payload/platform/scripts/vnc.sh +2 -2
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/brand-design/SKILL.md +1 -1
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/make-brochure/SKILL.md +9 -9
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/SKILL.md +7 -7
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/build.md +5 -5
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/copy.md +3 -3
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/images.md +1 -1
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/{page-landing.md → index-landing.md} +14 -14
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/{page.html → index.html} +4 -4
- package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/placeholders.md +6 -6
- package/payload/server/package.json +1 -1
- package/payload/server/public/assets/{Checkbox-nrf4ISU0.js → Checkbox-BmlrSRF8.js} +1 -1
- package/payload/server/public/assets/{admin-BctPxbjB.js → admin-Drvl0Okz.js} +53 -53
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DZI73ap7.js → architectureDiagram-Q4EWVU46-DU8MnqOj.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BQQz9YNZ.js → blockDiagram-DXYQGD6D-DwBZc1na.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-gl8-XVLH.js → c4Diagram-AHTNJAMY-C9ZHreVX.js} +1 -1
- package/payload/server/public/assets/channel-Boz4UHN2.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-839etdKR.js → chunk-336JU56O-DNXqHk42.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-hyvaLE5p.js → chunk-426QAEUC-DOLKkQGn.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DEIYWdpd.js → chunk-4TB4RGXK-l8iZx-gQ.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-zWevOyjc.js → chunk-5FUZZQ4R-DQwRtUdO.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-CL9KWSZH.js → chunk-5PVQY5BW-CvvoBJnn.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-D91vGp64.js → chunk-EDXVE4YY-DV1J4-LR.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-DApK4iuk.js → chunk-ENJZ2VHE-Co6qpIQl.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-BOjV-nTe.js → chunk-ICPOFSXX-9v9O_mwr.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-D3Cv5Z_Z.js → chunk-OYMX7WX6-D2X1NuKZ.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-C92E-iRU.js → chunk-U2HBQHQK-DmqWEsN2.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-DohG6qWK.js → chunk-X2U36JSP-C0b2a6Bq.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-CyeLVSjf.js → chunk-YZCP3GAM-BdBAquWg.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-D7R-lONY.js → chunk-ZZ45TVLE-C1AFspLM.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-CRA6E97A.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VnieTvEm.js +1 -0
- package/payload/server/public/assets/clone-6YhZHo8b.js +1 -0
- package/payload/server/public/assets/{dagre-DjhovTZd.js → dagre-7eiQzAHj.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-DFeRlQuy.js → dagre-KV5264BT-a88ylEXY.js} +1 -1
- package/payload/server/public/assets/data-Dq_if_B4.js +1 -0
- package/payload/server/public/assets/{device-url-actions-CE3A1UDw.js → device-url-actions-_s-UgHa3.js} +1 -1
- package/payload/server/public/assets/{diagram-5BDNPKRD-DsmRGnVL.js → diagram-5BDNPKRD-XuINnSy-.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-CVSK-mLR.js → diagram-G4DWMVQ6-B93iSQ8a.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DMN94Pe-.js → diagram-MMDJMWI5-Gcoj967k.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-DaD4mLMc.js → diagram-TYMM5635-C2BKnsAF.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BUkZ2Iq1.js → erDiagram-SMLLAGMA-DwbOuflI.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-DW8DX_ge.js → flowDiagram-DWJPFMVM-CEExhdxC.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DWaRL6__.js → ganttDiagram-T4ZO3ILL-kYNYeUK-.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BaPTFtVx.js → gitGraphDiagram-UUTBAWPF-D3X2eJPE.js} +1 -1
- package/payload/server/public/assets/graph-CNFkzAKU.js +1 -0
- package/payload/server/public/assets/{graph-labels-BRtJE9AE.js → graph-labels-C6ZZPglH.js} +1 -1
- package/payload/server/public/assets/{graphlib-BUhb3hPU.js → graphlib-_S6i_Jn2.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-Ch6CE3GO.js → infoDiagram-42DDH7IO-CQx0vDcC.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DApFr2KO.js → ishikawaDiagram-UXIWVN3A-0eZUgqUP.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-D72xl-VA.js → journeyDiagram-VCZTEJTY-D-B2Kd_J.js} +1 -1
- package/payload/server/public/assets/jsx-runtime-CtqEPPN5.css +1 -0
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-TuAvkCJU.js → kanban-definition-6JOO6SKY-BmLn-OEz.js} +1 -1
- package/payload/server/public/assets/{line-Cr3lHgh8.js → line-h25nWPBw.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-BvbEd4_6.js → mermaid-parser.core-CXXeaSZi.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-CSIEcw1L.js → mermaid.core-BjFfgEHL.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CNLvqgk-.js → mindmap-definition-QFDTVHPH-Dql4ILoK.js} +1 -1
- package/payload/server/public/assets/{page-B_80xGrM.js → page-CdWWweCx.js} +1 -1
- package/payload/server/public/assets/{page-BcnqM490.js → page-D20UnO_r.js} +1 -1
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CSOsdFn6.js → pieDiagram-DEJITSTG-nYaoTCKZ.js} +1 -1
- package/payload/server/public/assets/{public-DGrCAqZN.js → public-CXgyLdJU.js} +3 -3
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-Bsxz9S58.js → quadrantDiagram-34T5L4WZ-XG8xivm9.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-BZRrlQlh.js → requirementDiagram-MS252O5E-C2GzfT-6.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C-W-Az7g.js → sankeyDiagram-XADWPNL6-3aI78p2X.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DCZPAj4-.js → sequenceDiagram-FGHM5R23-CvaNRYuS.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C3wODMGb.js → stateDiagram-FHFEXIEX-DHT2Zyvj.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-YmtuS9BN.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-TRzSKinM.js → timeline-definition-GMOUNBTQ-DqPjDUku.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DSKZVM8N.js → vennDiagram-DHZGUBPP-lQB1LgjH.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BRXL08eb.js → wardleyDiagram-NUSXRM2D-sxSMxkwm.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CgWMOf0l.js → xychartDiagram-5P7HB3ND-4-dvvfSD.js} +1 -1
- package/payload/server/public/brand-constants.json +1 -1
- package/payload/server/public/brand-defaults.css +1 -1
- package/payload/server/public/data.html +5 -5
- package/payload/server/public/graph.html +6 -6
- package/payload/server/public/index.html +8 -8
- package/payload/server/public/public.html +5 -5
- package/payload/server/server.js +91 -6
- package/payload/server/public/assets/channel-BIMyzzFT.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BAfXNwa9.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D5bE1GaW.js +0 -1
- package/payload/server/public/assets/clone-DOH_suVb.js +0 -1
- package/payload/server/public/assets/data-DzTaKq-r.js +0 -1
- package/payload/server/public/assets/graph-dgoq2zvY.js +0 -1
- package/payload/server/public/assets/jsx-runtime-BgXAk35j.css +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Ch6qbhpm.js +0 -1
- /package/payload/server/public/assets/{jsx-runtime-Bz7aoCi7.js → jsx-runtime-BSJRynxp.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Page — companion property landing page (`
|
|
1
|
+
# Page — companion property landing page (`index.html`)
|
|
2
2
|
|
|
3
|
-
The web bundle includes a **single-page property landing site** at `output/web/
|
|
3
|
+
The web bundle includes a **single-page property landing site** at `output/web/index.html`. The brochure is a folio for download; the landing page is the "for sale" web page a property micro-site or a portal page links to. They share the same web-tier images in `images/` but present the property differently — the brochure as an editorial document; the landing page as a continuous, scrollable web page.
|
|
4
4
|
|
|
5
|
-
The landing page is **mandatory in the web bundle**. A property-brochure run that ships the brochure web bundle without `
|
|
5
|
+
The landing page is **mandatory in the web bundle**. A property-brochure run that ships the brochure web bundle without `index.html` is incomplete.
|
|
6
6
|
|
|
7
|
-
## Canonical reference — `references/
|
|
7
|
+
## Canonical reference — `references/index.html` is the only starting point
|
|
8
8
|
|
|
9
|
-
`references/
|
|
9
|
+
`references/index.html` ships with this skill alongside `references/template.html`. It is the **only** acceptable starting point for the landing page, exactly as `template.html` is the only acceptable starting point for the brochure. Every property-brochure run that produces a web bundle MUST start by copying `references/index.html` to `<property_dir>/output/web/index.html` and substituting the markers — never re-build the file from scratch from the prose in this reference.
|
|
10
10
|
|
|
11
11
|
The subsections below describe **why** the canonical is the way it is. They are **not** instructions to rebuild it. If the canonical file already encodes a rule (e.g. drop cap on the first paragraph of every body-block, the 3-slide Ken-Burns rotator with reduced-motion fallback, the hamburger drawer with full nav set on mobile), copying the canonical IS following the rule. The reference file's leading comment block lists the editorial decisions baked in — read it once before any substitution.
|
|
12
12
|
|
|
@@ -14,12 +14,12 @@ The subsections below describe **why** the canonical is the way it is. They are
|
|
|
14
14
|
|
|
15
15
|
Per the same logic as the brochure's *Forbidden template sources*, do **not** start the landing page from any of:
|
|
16
16
|
|
|
17
|
-
- A sibling property's rendered `output/web/
|
|
18
|
-
- A previous version of `references/
|
|
17
|
+
- A sibling property's rendered `output/web/index.html` (will inherit that property's hand-tuned text + image refs)
|
|
18
|
+
- A previous version of `references/index.html` cached anywhere outside the live skill folder
|
|
19
19
|
- The prose alone, hand-copying CSS/markup blocks from the section descriptions below
|
|
20
20
|
- A "modern landing page generator" or any tool that produces a layout from scratch
|
|
21
21
|
|
|
22
|
-
A run that reconstructs
|
|
22
|
+
A run that reconstructs index.html from prose, even if the result *looks* close to the canonical, drifts every brochure cycle. The dropcap, the rotator timing, the `BRAND-SLUG-logo-dark.png` filename pattern, the sub-nav scroll behaviour, the drawer markup — all of it lives literally in `references/index.html`. Copy it.
|
|
23
23
|
|
|
24
24
|
## How to populate
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ Two steps:
|
|
|
27
27
|
|
|
28
28
|
1. **Bulk-substitute literal placeholders** (one find/replace pass each):
|
|
29
29
|
- `PROPERTY-SLUG` → property slug (e.g. `warblers-lodge`). Rewrites every image src (`PROPERTY-SLUG-NN.webp`, `PROPERTY-SLUG-floorplan.png`, `PROPERTY-SLUG-hero-N-<role>.webp`) and the in-bundle PDF link (`PROPERTY-SLUG-brochure.pdf`).
|
|
30
|
-
- `BRAND-SLUG` → brand slug (e.g. `rossmargetts`). Rewrites the brand logo path (`BRAND-SLUG-logo-dark.png` — the dark-art variant on the warm-paper top nav). The
|
|
30
|
+
- `BRAND-SLUG` → brand slug (e.g. `rossmargetts`). Rewrites the brand logo path (`BRAND-SLUG-logo-dark.png` — the dark-art variant on the warm-paper top nav). The index.html canonical only uses the dark variant; the light variant is brochure-only.
|
|
31
31
|
|
|
32
32
|
2. **Substitute each `<!-- REPLACE: ... -->` block** with property-specific copy drawn from the seller brief and `property.json`. Walk the file top-to-bottom: `<title>`, meta description, top-nav utility links, drawer nav + foot, sticky sub-nav left/right, hero info-card (tag, title, address, price, meta, four spec cells, three link slots, CTA mailto subject), three hero slides + alt text, six body-block sections (Story, The Home, Bedrooms, The Garden, The Area — eyebrow + h2 + paragraphs), six photo grids (four cells each, 4:3 cover), floor-plan section meta, key-facts grid (~15 rows), CTA strip, footer.
|
|
33
33
|
|
|
@@ -77,7 +77,7 @@ If the property has no kitchen/garden distinction (e.g. an apartment), substitut
|
|
|
77
77
|
|
|
78
78
|
The hero shows each image **fullscreen at viewport scale**, with a 1.05–1.20× Ken-Burns transform on top. That means a body-tier 1300 px @ q82 webp will visibly soften at typical desktop and Retina viewports. The hero needs its own encode tier:
|
|
79
79
|
|
|
80
|
-
| Setting | Body tier (rest of `
|
|
80
|
+
| Setting | Body tier (rest of `index.html`) | **Hero tier** |
|
|
81
81
|
|---|---|---|
|
|
82
82
|
| Long edge | 1300 px (hero) / 1100 px (story) / 800 px (thumb) | **source resolution** (no `-resize`) — typically 1536–1600 px |
|
|
83
83
|
| Quality | q82 / q80 / q76 | **q88** |
|
|
@@ -198,7 +198,7 @@ Some viewers find subtle continuous motion uncomfortable. The `@media (prefers-r
|
|
|
198
198
|
The page has two image tiers:
|
|
199
199
|
|
|
200
200
|
1. **Hero rotator** — three dedicated `<slug>-hero-1-main.webp`, `<slug>-hero-2-<role>.webp`, `<slug>-hero-3-<role>.webp` files at source resolution and q88. See **Hero — rotating Ken-Burns stage** above. These are *additional* files; they don't replace the body-tier images even when sourced from the same originals — the body-tier `<slug>-03.webp` is still used in the photo grids.
|
|
201
|
-
2. **Body photo grids** — `<slug>-NN.webp` at the body-tier (1300/1100/800 px @ q82/80/76) — the same images the brochure HTML references. Both `brochure.html` and `
|
|
201
|
+
2. **Body photo grids** — `<slug>-NN.webp` at the body-tier (1300/1100/800 px @ q82/80/76) — the same images the brochure HTML references. Both `brochure.html` and `index.html` resolve them to the same file under `output/web/images/`.
|
|
202
202
|
|
|
203
203
|
Distribute every brochure image across the photo grids — typically 24–28 unique images across 6 grids of 4. If the count doesn't divide cleanly (e.g. 23 images for 6 grids of 4 = 24 cells), reuse the cover hero in the final cell as a closing visual.
|
|
204
204
|
|
|
@@ -361,10 +361,10 @@ When testing at mobile widths, screenshot at three viewports: **390 × 844** (iP
|
|
|
361
361
|
|
|
362
362
|
## Bundling and smoke-test
|
|
363
363
|
|
|
364
|
-
`
|
|
364
|
+
`index.html` is included in `<slug>-web.zip` automatically (the zip command zips everything in `output/web/`). After zipping, the smoke-test must include both `brochure.html` AND `index.html`:
|
|
365
365
|
|
|
366
366
|
```bash
|
|
367
|
-
for f in brochure.html
|
|
367
|
+
for f in brochure.html index.html cover-print.jpg images/<slug>-01.webp images/<brand>-logo-dark.png <slug>-brochure.pdf; do
|
|
368
368
|
echo "$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8765/$f) $f"
|
|
369
369
|
done
|
|
370
370
|
```
|
|
@@ -373,4 +373,4 @@ Both pages must return 200 and render correctly. The landing page should not exh
|
|
|
373
373
|
|
|
374
374
|
## When to regenerate
|
|
375
375
|
|
|
376
|
-
`
|
|
376
|
+
`index.html` is regenerated whenever the brochure's image set changes (new photos, swapped slot assignments) or whenever the brochure's chapter copy materially changes (the landing page mirrors the brochure's narrative). Cosmetic CSS-only changes to the brochure don't require a landing-page regenerate. The landing page is *not* part of the canonical print archive — it lives only in `output/web/` and the zip.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
════════════════════════════════════════════════════════════════════════════
|
|
3
|
-
COMPANION LANDING PAGE —
|
|
3
|
+
COMPANION LANDING PAGE — index.html · canonical reference template
|
|
4
4
|
════════════════════════════════════════════════════════════════════════════
|
|
5
5
|
|
|
6
6
|
This file is the canonical starting point for the property micro-site that
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
─────────────────────
|
|
14
14
|
Every property-specific value in this file is a {{ token }} placeholder.
|
|
15
15
|
There is no exemplar copy left to accidentally inherit. After substitution,
|
|
16
|
-
`grep "{{" output/web/
|
|
16
|
+
`grep "{{" output/web/index.html` must return ZERO matches — any remaining
|
|
17
17
|
{{ x }} is a bug.
|
|
18
18
|
|
|
19
19
|
The full token list (with source field, format, length, voice) lives in
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Contract:
|
|
25
25
|
|
|
26
|
-
1. Copy this file to <property>/output/web/
|
|
26
|
+
1. Copy this file to <property>/output/web/index.html.
|
|
27
27
|
2. Substitute every {{ placeholder }} token from the master placeholders.md.
|
|
28
28
|
3. Update <title>, meta description, OG/Twitter image refs.
|
|
29
29
|
4. If a section does not apply (e.g. property has no garden complex), follow
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
- Mobile collapse: top-nav → hamburger drawer at ≤960px; hero stacks at
|
|
41
41
|
≤760px; hero aspect 5/4 at ≤440px.
|
|
42
42
|
- Type system: Cormorant Garamond (display) + Lora (body serif) + Inter
|
|
43
|
-
(UI labels). DO NOT swap these per-brand — the
|
|
43
|
+
(UI labels). DO NOT swap these per-brand — the index.html register is
|
|
44
44
|
tuned to the canonical premium tier; brand identity lives in the logo,
|
|
45
45
|
copy and brand-specific colour accents that may be added via :root
|
|
46
46
|
overrides if needed (rare).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Placeholders — the substitution contract
|
|
2
2
|
|
|
3
|
-
`template.html` and `
|
|
3
|
+
`template.html` and `index.html` are pure placeholder templates: every property-specific value is a `{{ token }}` token. There is no exemplar copy left to accidentally inherit. After rendering, `grep "{{" output/brochure.html` (and `output/web/index.html`) MUST return **zero matches**. Any remaining `{{ x }}` is a substitution bug.
|
|
4
4
|
|
|
5
5
|
This file is the substitution contract — the exhaustive list of every token used across both templates, what fills it, what format it takes, and what voice the copy tokens need. Style and composition guidance lives in `copy.md` (and is referenced inline from each `<!-- REPLACE: ... -->` comment in the templates). The two files are complementary: this one says **what** each token is; `copy.md` says **how** the copy should read.
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ Worked examples below quote the validated Sparrows Farm reference brochure at `/
|
|
|
11
11
|
1. Open the seller brief at `<property_dir>/seller-brief.md` and `<property_dir>/property.json` side-by-side.
|
|
12
12
|
2. Walk the categories below top-to-bottom — common tokens first (identity, brand, agent, listing, specs), then chapter-by-chapter editorial copy.
|
|
13
13
|
3. For each token, write the substitution into a single dict / map keyed by token name. The substitution step at the end of `property-brochure` reads the map and rewrites both files in one pass.
|
|
14
|
-
4. Run the **completion check**: `grep -c "{{" output/brochure.html output/web/
|
|
14
|
+
4. Run the **completion check**: `grep -c "{{" output/brochure.html output/web/index.html`. Both files must return `0`. If any token is unsubstituted, it is a defect — the brochure is not shippable until every `{{ x }}` is gone.
|
|
15
15
|
|
|
16
16
|
## Category 1 — Property identity
|
|
17
17
|
|
|
@@ -46,7 +46,7 @@ From the brand pack at `<brand_dir>/{description.md, DESIGN.md}` and `property.j
|
|
|
46
46
|
| `{{ brand_name }}` | `description.md` first line | Title Case | "Muvin", "Beacons Real Estate". |
|
|
47
47
|
| `{{ brand_town }}` | `description.md` officials block | Title Case | Branch town. |
|
|
48
48
|
| `{{ brand_county }}` | `description.md` officials block | Title Case | |
|
|
49
|
-
| `{{ brand_year }}` | Current year | YYYY | Used in the
|
|
49
|
+
| `{{ brand_year }}` | Current year | YYYY | Used in the index.html footer copyright. |
|
|
50
50
|
| `{{ office_address_line_1 }}` | `description.md` registered office line | "25 Bell Street" | Street, first line of the postal address. |
|
|
51
51
|
| `{{ office_address_line_2 }}` | `description.md` registered office line | "Sawbridgeworth, Hertfordshire CM21 9AR" | Locality + county + postcode. |
|
|
52
52
|
| `{{ office_phone }}` | `property.json -> agent.phone` | Display format | "01873 377 575". |
|
|
@@ -208,7 +208,7 @@ Every `{{ mi_* }}` token corresponds to a Material Information row. Mark unknown
|
|
|
208
208
|
| `{{ backpage_headline }}` | "Arrange a viewing of <em>{{ property_name }}</em>" — canonical phrasing. |
|
|
209
209
|
| `{{ backpage_tagline }}` | 25-45 words. Mirrors but does not duplicate the cover/opener. Close with "Best understood in person." or equivalent clincher. |
|
|
210
210
|
|
|
211
|
-
## Category 9 —
|
|
211
|
+
## Category 9 — index.html (landing) editorial copy
|
|
212
212
|
|
|
213
213
|
The landing page mirrors the brochure's content but in a continuous-scroll form. Tokens are prefixed `landing_*` to avoid name collisions with the brochure tokens. Sections:
|
|
214
214
|
|
|
@@ -235,7 +235,7 @@ The substitution step that runs `property-brochure` should end with this verific
|
|
|
235
235
|
|
|
236
236
|
```bash
|
|
237
237
|
PROP=<property_dir>
|
|
238
|
-
remaining=$(grep -c '{{' "$PROP/output/brochure.html" "$PROP/output/web/
|
|
238
|
+
remaining=$(grep -c '{{' "$PROP/output/brochure.html" "$PROP/output/web/index.html" 2>/dev/null | awk -F: '{s+=$2} END {print s}')
|
|
239
239
|
if [ "$remaining" -gt 0 ]; then
|
|
240
240
|
echo "DEFECT: $remaining unsubstituted {{ tokens }} remain — see grep '{{' output/"
|
|
241
241
|
exit 1
|
|
@@ -247,4 +247,4 @@ A brochure with any `{{ x }}` remaining in the rendered output is shipped broken
|
|
|
247
247
|
|
|
248
248
|
## Adding a new token
|
|
249
249
|
|
|
250
|
-
If a property has a feature the canonical placeholder set doesn't cover (e.g. an annexe with separate utility, a wine cellar, a moat — they exist), do not invent a new token in the templates without also adding the entry here. The substitution contract is what catches the bug; an unlisted token gets silently ignored by the substitution step and the brochure ships with `{{ wine_cellar }}` literal in the body. Either reuse an existing token, or add the new one to this file AND to template.html/
|
|
250
|
+
If a property has a feature the canonical placeholder set doesn't cover (e.g. an annexe with separate utility, a wine cellar, a moat — they exist), do not invent a new token in the templates without also adding the entry here. The substitution contract is what catches the bug; an unlisted token gets silently ignored by the substitution step and the brochure ships with `{{ wine_cellar }}` literal in the body. Either reuse an existing token, or add the new one to this file AND to template.html/index.html before rendering.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-
|
|
1
|
+
import{t as e}from"./jsx-runtime-BSJRynxp.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};
|