diff --git a/RECOMMENDED_FONTS.md b/RECOMMENDED_FONTS.md
index 56eff17..7265416 100644
--- a/RECOMMENDED_FONTS.md
+++ b/RECOMMENDED_FONTS.md
@@ -1,56 +1,44 @@
-# Magazine Bold — Recommended fonts
+# Magazine Bold — fonts
-Per `themes/docs/FONTS.md` (wave-1 policy), this theme ships `fonts.json = []`
-and provides CSS fallback stacks via `--font-heading`, `--font-body`,
-`--font-mono`. The site admin assigns real fonts via the typography settings
-panel; the recommendations below match the spec §5 intent.
+This theme **bundles** a Latin subset of three open-licence (SIL OFL 1.1)
+families, so it looks correct the moment it is activated — no admin setup
+required. The bundled faces are declared in `fonts.json` and land in the
+typography picker as `source=template` rows.
-## Display (heading slot)
+| Slot | Bundled family | Weights / styles | Role |
+|---------|----------------|------------------------|---------------------------------------------------------------|
+| Heading | Archivo Black | 400 normal | Massive condensed uppercase cover headlines and the wordmark |
+| Body | Inter | 400 / 500 / 700 normal | Body copy, decks and UI text |
+| Mono | IBM Plex Mono | 400 / 500 normal | Kickers, datelines, folio numbers, captions and button labels |
-Spec calls for **PP Editorial New** (Regular Italic + Ultralight) at 180–280pt
-for cover-story hits, with **Migra** as a secondary serif drop-in. Both are
-commercial; the open-source picks below render the same italic-display energy.
+The bundled woff2 files and their licence record live in `assets/fonts/`
+(`LICENSES.md`). Every `font-family` in the theme is routed through
+`var(--font-heading, ...)`, `var(--font-body, ...)` and `var(--font-mono, ...)`
+with a fallback stack, so the layout is usable before any font is assigned and
+the admin font picker stays in full control.
-Open-source picks (assign one to **Heading**):
+## Assigning the bundled faces
-- `google:Playfair Display` — the closest open-source approximation of
- PP Editorial New's contrast and italic axis. Open the typography panel,
- pick "Playfair Display" from the Google Fonts tab, assign to Heading.
-- `google:Fraunces` — a more contemporary alternative with optical sizing;
- works well as the secondary serif (`font-serif-sub`).
-- `google:Cormorant Garamond` — slightly higher-contrast classic serif if
- you want a more traditional broadsheet feel.
+1. In the BlockNinja admin, open **Settings → Theme → Typography**.
+2. In the **Bundled** tab, assign **Archivo Black** to the *Heading* slot.
+3. Assign **Inter** to the *Body* slot.
+4. Assign **IBM Plex Mono** to the *Mono* slot.
-Commercial picks (require admin licensing + upload):
+## Optional swaps (Google Fonts tab)
-- `upload:PP Editorial New` — purchase from pangrampangram.com, upload via the
- font picker's "Upload" tab.
-- `upload:Migra` — purchase from pangrampangram.com (Migra is a sibling
- family), upload via the picker.
+The identity is condensed-heavy display + neutral sans body + mono details.
+Any of these drop in via the CSS variables with no template change:
-## Body
+- **Anton** (`google:Anton`) — a taller, more condensed display face for the
+ *Heading* slot; the loudest cover-headline option and the WO's alternate.
+- **Archivo** (`google:Archivo`) — for the *Body* slot if you want the body to
+ echo the display family.
+- **Space Grotesk** (`google:Space Grotesk`) — an alternative body / deck face.
+- **Space Mono** (`google:Space Mono`) — a chunkier mono for the *Mono* slot.
-Spec calls for **Inter** 16–18px with tight leading and generous tracking on
-small-caps kickers. Inter is already in the curated Google Fonts list:
+## Bundling a commercial display face (out of scope for Wave A)
-- `google:Inter` — open the typography panel, pick "Inter" from the Google
- Fonts tab, assign to Body. Aim for weights 400 + 600.
-
-## Mono (captions, folios, metadata only)
-
-Spec calls for **JetBrains Mono** at caption sizes for kickers, folios and
-the colophon strip. Curated:
-
-- `google:JetBrains Mono` — open the typography panel, pick "JetBrains Mono"
- from the Google Fonts tab, assign to Mono. Weight 400 is enough.
-
-Alternates: `google:Space Mono`, `google:IBM Plex Mono`.
-
-## How the theme degrades when nothing is picked
-
-The compiled CSS shipped with this `.so` uses the variables with sensible
-fallbacks so a fresh install still reads like an editorial magazine:
-
-- `--font-heading` falls back to `"Playfair Display", "Cormorant Garamond", Georgia, "Times New Roman", serif`
-- `--font-body` falls back to `"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`
-- `--font-mono` falls back to `"JetBrains Mono", "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace`
+If the brand locks in a licensed display face in place of Archivo Black, licence
+and subset the woff2 set, drop it in `assets/fonts/`, and add the family +
+variants to `fonts.json`. The CSS does not change — the same `var(--font-heading)`
+consumer picks up whichever face an admin assigns.
diff --git a/RECOMMENDED_ICONS.md b/RECOMMENDED_ICONS.md
new file mode 100644
index 0000000..bea1c25
--- /dev/null
+++ b/RECOMMENDED_ICONS.md
@@ -0,0 +1,30 @@
+# Recommended Icons — Magazine Bold
+
+Magazine Bold is a typographic, rule-heavy theme. It leans on condensed
+headlines, mono labels and heavy rules, not iconography, so it references only
+two bundled packs. `plugin.mod` declares them in `required_icon_packs`; until
+the loader auto-installs declared packs, an admin should confirm they are
+enabled before activation.
+
+## Required packs
+
+- **lucide** — ships bundled with the CMS (v0.460). Enabled by default. Used
+ for chrome and UI glyphs (arrows, chevrons, close, check, play, map-pin,
+ navigation, mail, rss, star, flag). If icons render as empty boxes, open
+ `/admin/icons` and confirm **Lucide** is installed and enabled.
+- **simple-icons** — ships bundled with the CMS (v14.0). Used only for brand
+ glyphs in `author-bio-hero`, `author-bio` and `social-links` (x, linkedin,
+ github). Confirm it is enabled at `/admin/icons` if brand marks are blank.
+
+## Icons used by the theme chrome and overrides
+
+All via the sprite pipeline (``
+or the `:::::` shorthand):
+
+`arrow-right`, `chevron-down`, `chevron-left`, `chevron-right`, `x`, `check`,
+`play`, `download`, `map-pin`, `navigation`, `mail`, `rss`, `star`, `flag`,
+`diamond`, `globe` (lucide); `x`, `linkedin`, `github` (simple-icons).
+
+Block content that stores an icon (feature-grid items, social links, contact
+channels) may reference any installed pack as a `pack:name` string; the schemas
+default to `lucide` so the theme renders without extra setup.
diff --git a/assets/fonts/LICENSES.md b/assets/fonts/LICENSES.md
new file mode 100644
index 0000000..966ce9d
--- /dev/null
+++ b/assets/fonts/LICENSES.md
@@ -0,0 +1,17 @@
+# Bundled font licenses
+
+All bundled woff2 files in this directory are latin-subset builds redistributed
+under the SIL Open Font License 1.1 (OFL). No modifications were made beyond
+subsetting to the latin range.
+
+| Family | Files | License | Source |
+|--------|-------|---------|--------|
+| Archivo Black | archivo-black-400.woff2 | SIL OFL 1.1 | Omnibus-Type / Google Fonts |
+| Inter | inter-400.woff2, inter-500.woff2, inter-700.woff2 | SIL OFL 1.1 | Rasmus Andersson / Google Fonts |
+| IBM Plex Mono | ibm-plex-mono-400.woff2, ibm-plex-mono-500.woff2 | SIL OFL 1.1 | IBM / Google Fonts |
+
+Full OFL text: https://openfontlicense.org/. Font-family is still admin-controlled;
+these bundled families appear as `source=template` rows in the fonts picker and
+are consumed only via `var(--font-heading|body|mono, )`. Archivo Black
+drives the condensed display headlines, Inter the body, IBM Plex Mono the
+kickers, datelines and captions.
diff --git a/assets/fonts/archivo-black-400.woff2 b/assets/fonts/archivo-black-400.woff2
new file mode 100644
index 0000000..a88b0b5
Binary files /dev/null and b/assets/fonts/archivo-black-400.woff2 differ
diff --git a/assets/fonts/ibm-plex-mono-400.woff2 b/assets/fonts/ibm-plex-mono-400.woff2
new file mode 100644
index 0000000..0804aaf
Binary files /dev/null and b/assets/fonts/ibm-plex-mono-400.woff2 differ
diff --git a/assets/fonts/ibm-plex-mono-500.woff2 b/assets/fonts/ibm-plex-mono-500.woff2
new file mode 100644
index 0000000..090f82f
Binary files /dev/null and b/assets/fonts/ibm-plex-mono-500.woff2 differ
diff --git a/assets/fonts/inter-400.woff2 b/assets/fonts/inter-400.woff2
new file mode 100644
index 0000000..f15b025
Binary files /dev/null and b/assets/fonts/inter-400.woff2 differ
diff --git a/assets/fonts/inter-500.woff2 b/assets/fonts/inter-500.woff2
new file mode 100644
index 0000000..54f0a59
Binary files /dev/null and b/assets/fonts/inter-500.woff2 differ
diff --git a/assets/fonts/inter-700.woff2 b/assets/fonts/inter-700.woff2
new file mode 100644
index 0000000..a68fb10
Binary files /dev/null and b/assets/fonts/inter-700.woff2 differ
diff --git a/blocks/blocks.yaml b/blocks/blocks.yaml
index 30cc45b..a92cd75 100644
--- a/blocks/blocks.yaml
+++ b/blocks/blocks.yaml
@@ -1,42 +1,34 @@
-# Magazine Bold theme block definitions (codeless .bnp, WO-WZ-021).
-# Keys are fully qualified (magazine-bold:) because the codeless loader
-# registers definitions verbatim — there is no PluginBlockRegistry prefixing
-# in the codeless path (unlike the wasm/templ path). The qualified keys match
-# the hardcoded data-block attributes and the master_pages.json references.
+# Magazine Bold theme block definitions (codeless .bnp, WO-TF-021).
+#
+# These are the theme's TRUE persona blocks — streetwear / fashion-drop
+# furniture with no builtin equivalent. Everything the theme used to ship that
+# duplicated a builtin (masthead, photo essay, pull quote, issue archive,
+# colophon) is now a re-skin OVERRIDE of a builtin (navbar, gallery, quote,
+# post-index, footer) under templates/overrides/magazine-bold/. Keys are fully
+# qualified (magazine-bold:) because the codeless loader registers
+# definitions verbatim.
blocks:
- - key: magazine-bold:masthead
- title: Issue Masthead
- description: Wordmark, issue number and tagline strip — sits at the top of every page.
- category: layout
- schema: masthead.schema.json
- template: masthead.ninjatpl
- key: magazine-bold:cover_story
title: Cover Story
- description: 12-column asymmetric hero with kicker, oversized display headline, deck and cover image.
- category: content
+ description: Asymmetric magazine cover — mono folio kicker, massive condensed headline, deck and a duotone cover image with a shop/read CTA.
+ category: theme
schema: cover_story.schema.json
template: cover_story.ninjatpl
- - key: magazine-bold:photo_essay
- title: Photo Essay
- description: Numbered photo-essay with asymmetric frame spans (half / full / tall) and mono captions.
- category: content
- schema: photo_essay.schema.json
- template: photo_essay.ninjatpl
- - key: magazine-bold:pull_quote
- title: Pull Quote
- description: Color-block pull quote with rotating accent (pink / blue / lime).
- category: content
- schema: pull_quote.schema.json
- template: pull_quote.ninjatpl
- - key: magazine-bold:issue_archive
- title: Issue Archive
- description: Numbered list of back-issues driven by a bucket query.
- category: navigation
- schema: issue_archive.schema.json
- template: issue_archive.ninjatpl
- - key: magazine-bold:colophon
- title: Colophon
- description: Mono caption strip with credits and an optional social row.
- category: layout
- schema: colophon.schema.json
- template: colophon.ninjatpl
+ - key: magazine-bold:lookbook
+ title: Lookbook
+ description: Grid of duotone look frames with mono numbering, captions and optional shop links — the drop's lookbook spread.
+ category: theme
+ schema: lookbook.schema.json
+ template: lookbook.ninjatpl
+ - key: magazine-bold:drop_calendar
+ title: Drop Calendar
+ description: Dated list of upcoming and past drops — mono datelines, condensed names and a live/soon/sold status tag.
+ category: theme
+ schema: drop_calendar.schema.json
+ template: drop_calendar.ninjatpl
+ - key: magazine-bold:credits_ticker
+ title: Credits Ticker
+ description: Marquee strip of credits (photographer, stylist, cast) — MID-motion scroll, paused on hover, static under prefers-reduced-motion.
+ category: theme
+ schema: credits_ticker.schema.json
+ template: credits_ticker.ninjatpl
diff --git a/blocks/colophon.ninjatpl b/blocks/colophon.ninjatpl
deleted file mode 100644
index 7cec6be..0000000
--- a/blocks/colophon.ninjatpl
+++ /dev/null
@@ -1,4 +0,0 @@
-
- {% if credits %}
{{ credits|safe }}
{% endif %}
- {% if showSocial == "true" or showSocial == true %}
Most labels start with a colour card and a factory minimum. We start with a phone call about a roll of cloth that nobody wants. That is the whole method, and it shapes everything after it.
Mills end every season with rolls they cannot sell. Wrong shade, short length, last year's spec. We buy those rolls cheap and we buy them whole. Then we cut a drop around what we actually have.
That means the run is short. A roll makes forty jackets, not four hundred. When it is cut, the pattern retires. The next drop uses a different cloth and looks like a different label, because it is a different cloth.
People ask us to reorder. We cannot, and we would not. The limit is the point.
We do not book models through an agency. We cast the drop on the street it was cut on, and we shoot the people who show up. Here is how the casting went.
We put up one poster outside the print works. It gave a date, a time, and nothing else. On the day, thirty people came by. Some knew the label. Most did not.
We shot everyone in the same set, in the same light, in one colour. No hair, no retouching past the basics. The clothes had to carry the frame, so we let them.
The cast in the lookbook are the people who came. That is the only rule we kept.
The whole drop runs one accent colour. It is on the labels, the site, the poster and the tape on the boxes. There is nothing else, and that is on purpose.
A single colour makes a small label look sure of itself. It also makes the work easy to spot in a feed full of noise. One fluoro hit, black ink, newsprint paper, and you know it is us before you read a word.
Next drop the colour changes. The system stays. One accent, held all the way through, then swapped clean for the next run.