# Magazine Bold theme — codeless .bnp manifest (Theme Fleet Wave A, WO-TF-021).
# Synthesized into manifest.pb by `ninja plugin build` (no plugin.wasm).
#
# Persona: a streetwear label / fashion-drop publication. Print-cover energy
# translated to drops and lookbooks — massive condensed uppercase headlines
# (Archivo Black), duotone imagery, grid-breaking overlap, mono datelines and
# fluoro accent slabs. Newsprint-plus-voltage by day, ink-black-plus-fluoro by
# night. Colour ALWAYS via hsl(var(--token)); font families ALWAYS via
# var(--font-heading|body|mono, <fallback>). No literal colours, no hardcoded
# families. Motion tier MID: JS effects (marquee, scroll reveal, duotone hover),
# no canvas, prefers-reduced-motion honored with static fallbacks.
theme_presets: presets.json
bundled_fonts: fonts.json
master_pages: master_pages.json

# Icon packs referenced by theme templates (static: lucide + simple-icons;
# dynamic defaults resolve to lucide, e.g. the divider's `lucide:diamond`).
# Declared so /icons/<pack>.svg is materialized on fresh installs — without it
# the sprite can 404 and every sprite icon renders invisible.
required_icon_packs: [lucide, simple-icons]

system_templates:
  - key: magazine-bold
    title: Magazine Bold
    description: "A streetwear label's cover-story chrome: massive condensed uppercase headlines, duotone imagery, grid-breaking overlap and fluoro accent slabs. Built for fashion drops, lookbooks and culture publications."

page_templates:
  - system: magazine-bold
    key: default
    title: Default
    description: "Standard page: masthead, single reading column, colophon footer."
    slots: [header, main, footer]
  - system: magazine-bold
    key: full-width
    title: Full Bleed
    description: "Edge-to-edge for lookbooks, cover images and photo essays."
    slots: [header, main, footer]
  - system: magazine-bold
    key: landing
    title: Cover / Drop
    description: "Cover-story stack: masthead, lead drop, river of stories, colophon."
    slots: [masthead, lead, river, footer]
  - system: magazine-bold
    key: article
    title: Feature
    description: "Long-form feature: byline, drop-cap opener, reading column with a marginalia rail."
    slots: [header, byline, main, marginalia, footer]
  - system: magazine-bold
    key: blog-index
    title: Archive
    description: "Drop archive: masthead, featured drop, and a river of stories."
    slots: [header, featured, main, footer]
  - system: magazine-bold
    key: contact
    title: Studio
    description: "Contact layout with an optional aside for stockists, hours and location."
    slots: [header, main, aside, footer]
  - system: magazine-bold
    key: auth
    title: Members
    description: "Centred members shell with wordmark and a fluoro rule."
    slots: [main, footer]

template_overrides:
  # Chrome (4)
  - { template: magazine-bold, block: navbar }
  - { template: magazine-bold, block: footer }
  - { template: magazine-bold, block: utility-bar }
  - { template: magazine-bold, block: announcement-bar }
  # Marketing (12)
  - { template: magazine-bold, block: hero }
  - { template: magazine-bold, block: feature-grid }
  - { template: magazine-bold, block: rich-section }
  - { template: magazine-bold, block: stats }
  - { template: magazine-bold, block: testimonial }
  - { template: magazine-bold, block: logo-strip }
  - { template: magazine-bold, block: pricing }
  - { template: magazine-bold, block: team }
  - { template: magazine-bold, block: faq }
  - { template: magazine-bold, block: timeline }
  - { template: magazine-bold, block: cta }
  - { template: magazine-bold, block: countdown }
  # Primitives (11)
  - { template: magazine-bold, block: heading }
  - { template: magazine-bold, block: text }
  - { template: magazine-bold, block: rich-text }
  - { template: magazine-bold, block: image }
  - { template: magazine-bold, block: quote }
  - { template: magazine-bold, block: divider }
  - { template: magazine-bold, block: button }
  - { template: magazine-bold, block: card }
  - { template: magazine-bold, block: gallery }
  - { template: magazine-bold, block: video-embed }
  - { template: magazine-bold, block: audio-embed }
  # Commerce / local (6)
  - { template: magazine-bold, block: menu-list }
  - { template: magazine-bold, block: event-list }
  - { template: magazine-bold, block: contact-form }
  - { template: magazine-bold, block: contact-card }
  - { template: magazine-bold, block: hours-location }
  - { template: magazine-bold, block: social-links }
  # Blog family (12)
  - { template: magazine-bold, block: blog-hero }
  - { template: magazine-bold, block: featured-posts }
  - { template: magazine-bold, block: related-posts }
  - { template: magazine-bold, block: popular-posts }
  - { template: magazine-bold, block: category-list }
  - { template: magazine-bold, block: post-hero }
  - { template: magazine-bold, block: post-metadata }
  - { template: magazine-bold, block: author-bio }
  - { template: magazine-bold, block: author-bio-hero }
  - { template: magazine-bold, block: newsletter-signup }
  - { template: magazine-bold, block: breadcrumbs }
  - { template: magazine-bold, block: sidebar-nav }
  # Auth surface (3)
  - { template: magazine-bold, block: auth-form }
  - { template: magazine-bold, block: password-reset-form }
  - { template: magazine-bold, block: auth-status }
  # System (1)
  - { template: magazine-bold, block: page-suggestions }

email_wrappers:
  - magazine-bold

css:
  input_css_append: |
    /* === Magazine Bold theme — utility layer ===
     *
     * Streetwear / fashion-drop identity: massive condensed uppercase headlines,
     * heavy 2px rules, hard square edges, mono datelines and fluoro accent slabs.
     * Colour is ALWAYS consumed via hsl(var(--token)); font families ALWAYS via
     * var(--font-heading|body|mono, <fallback>). No literal colours, no hardcoded
     * families.
     */

    /* Bundled display/body/mono faces. The host does not yet emit @font-face
     * for bundled_fonts (LoadedPlugin.BundledFonts is unconsumed), so the theme
     * declares its own faces against the served artifact paths
     * (/templates/magazine-bold/fonts/...). Presets set typography.fontHeading/
     * body/mono to template:magazine-bold:<Family> so --font-heading|body|mono
     * resolve to these families. Families/weights mirror fonts.json exactly. */
    @font-face { font-family: 'Archivo Black'; src: url('/templates/magazine-bold/fonts/archivo-black-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
    @font-face { font-family: 'Inter'; src: url('/templates/magazine-bold/fonts/inter-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
    @font-face { font-family: 'Inter'; src: url('/templates/magazine-bold/fonts/inter-500.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; }
    @font-face { font-family: 'Inter'; src: url('/templates/magazine-bold/fonts/inter-700.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; }
    @font-face { font-family: 'IBM Plex Mono'; src: url('/templates/magazine-bold/fonts/ibm-plex-mono-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
    @font-face { font-family: 'IBM Plex Mono'; src: url('/templates/magazine-bold/fonts/ibm-plex-mono-500.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; }

    @layer utilities {
      :root {
        --mb-measure: 68ch;
        --mb-rule: 2px solid hsl(var(--foreground));
      }

      /* --- Font slots (consume CMS-managed font variables) --- */
      .font-display { font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif); }
      .font-sans { font-family: var(--font-body, "Inter", system-ui, sans-serif); }
      .font-mono { font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace); }

      /* --- Page widths / reading measures --- */
      .mb-column {
        max-width: var(--mb-measure);
        margin-left: auto; margin-right: auto;
        padding-left: 1rem; padding-right: 1rem;
      }
      .mb-wide {
        max-width: 80rem;
        margin-left: auto; margin-right: auto;
        padding-left: 1rem; padding-right: 1rem;
      }
      .mb-article-grid {
        display: grid;
        grid-template-columns: 1fr;
        gap: 2rem;
        max-width: 84rem;
        margin-left: auto; margin-right: auto;
        padding-left: 1rem; padding-right: 1rem;
      }
      @media (min-width: 1024px) {
        .mb-article-grid { grid-template-columns: minmax(0, 68ch) 18rem; }
      }

      /* --- Prose reading column --- */
      .mb-prose {
        max-width: var(--mb-measure);
        margin-left: auto; margin-right: auto;
        font-family: var(--font-body, "Inter", system-ui, sans-serif);
        color: hsl(var(--foreground));
        line-height: 1.6;
      }
      .mb-prose p { margin: 0 0 1.15em 0; }
      .mb-prose h1, .mb-prose h2, .mb-prose h3, .mb-prose h4 {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        text-transform: uppercase;
        letter-spacing: -0.01em;
        line-height: 1.0;
        color: hsl(var(--foreground));
      }
      .mb-prose a {
        color: hsl(var(--accent));
        text-decoration: underline;
        text-decoration-thickness: 2px;
        text-underline-offset: 2px;
      }
      .mb-prose blockquote {
        font-weight: 500;
        border-left: 4px solid hsl(var(--accent));
        padding-left: 1rem; margin-left: 0;
        color: hsl(var(--foreground));
      }

      /* --- Mono / tracked labels (kickers, eyebrows, meta) --- */
      .mb-caps {
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        text-transform: uppercase;
        letter-spacing: 0.14em;
        font-weight: 500;
        font-size: 0.72rem;
        line-height: 1.35;
      }

      /* --- Display heading (Archivo Black, massive condensed caps) --- */
      .mb-heading {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        text-transform: uppercase;
        letter-spacing: -0.02em;
        line-height: 0.95;
        color: hsl(var(--foreground));
      }
      .mb-underline { position: relative; padding-bottom: 0.28em; }
      .mb-underline::after {
        content: "";
        position: absolute; left: 0; right: 0; bottom: 0;
        height: 4px;
        background: hsl(var(--accent));
      }

      /* --- Heavy rules (bars, not hairlines) --- */
      hr.mb-rule, .mb-rule, .mb-hairline {
        border: 0;
        border-top: var(--mb-rule);
        margin: 0;
      }
      .mb-hairline-top { border-top: var(--mb-rule); }
      .mb-hairline-bottom { border-bottom: var(--mb-rule); }

      /* --- Body text override --- */
      .mb-body {
        font-family: var(--font-body, "Inter", system-ui, sans-serif);
        color: hsl(var(--foreground));
        line-height: 1.6;
      }

      /* --- Inline accent link --- */
      .mb-link {
        color: hsl(var(--accent));
        text-decoration: underline;
        text-decoration-thickness: 2px;
        text-underline-offset: 3px;
        transition: color 120ms ease, text-decoration-color 120ms ease;
      }
      .mb-link:hover, .mb-link:focus-visible { color: hsl(var(--foreground)); }

      /* --- Button — fluoro / ink slab, square, uppercase mono --- */
      .mb-button, .mb-btn {
        display: inline-block;
        padding: 0.7rem 1.4rem;
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        font-size: 0.72rem;
        font-weight: 600;
        text-transform: uppercase;
        letter-spacing: 0.14em;
        background-color: hsl(var(--foreground));
        color: hsl(var(--background));
        border: 2px solid hsl(var(--foreground));
        text-decoration: none;
        cursor: pointer;
        transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
      }
      .mb-button:hover, .mb-button:focus, .mb-btn:hover, .mb-btn:focus {
        background-color: hsl(var(--accent));
        color: hsl(var(--accent-foreground));
        border-color: hsl(var(--accent));
      }
      .mb-button:focus-visible, .mb-btn:focus-visible {
        outline: 2px solid hsl(var(--ring));
        outline-offset: 2px;
      }

      /* --- Panel / card — heavy 2px frame, hard edges, no shadow --- */
      .mb-panel, .mb-card {
        border: 2px solid hsl(var(--foreground));
        background-color: hsl(var(--card));
        transition: border-color 120ms ease, transform 120ms ease;
      }
      .mb-panel:hover, .mb-card:hover { border-color: hsl(var(--accent)); }

      /* --- Form field — heavy border, square, accent focus --- */
      .mb-input {
        width: 100%;
        border: 2px solid hsl(var(--input));
        background-color: hsl(var(--background));
        color: hsl(var(--foreground));
        padding: 0.6rem 0.8rem;
        font-family: var(--font-body, "Inter", system-ui, sans-serif);
        font-size: 0.95rem;
        border-radius: 0;
      }
      .mb-input::placeholder { color: hsl(var(--muted-foreground)); }
      .mb-input:focus {
        outline: none;
        border-color: hsl(var(--accent));
        box-shadow: 0 0 0 2px hsl(var(--accent));
      }

      /* --- Figure / caption --- */
      .mb-figure { margin: 1.5rem 0; }
      .mb-figure img { display: block; width: 100%; height: auto; }
      .mb-figure figcaption {
        margin-top: 0.6rem;
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        font-size: 0.72rem;
        text-transform: uppercase;
        letter-spacing: 0.08em;
        color: hsl(var(--muted-foreground));
      }
      .mb-caption {
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        font-size: 0.72rem;
        line-height: 1.4;
        letter-spacing: 0.04em;
        color: hsl(var(--muted-foreground));
      }

      /* --- Drop cap — oversized Archivo Black accent first letter --- */
      .mb-dropcap p:first-of-type::first-letter {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        color: hsl(var(--accent));
        float: left;
        font-size: 4.4em;
        line-height: 0.72;
        /* Horizontal clearance so wrapped lines (esp. the 3rd) never crowd the
         * cap, plus a little breathing room below it. */
        padding-right: 0.16em;
        padding-top: 0.02em;
        margin-bottom: 0.04em;
      }

      /* --- Marginalia rail (mono side notes, MID motion reveal) --- */
      .mb-marginalia {
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        font-size: 0.75rem;
        line-height: 1.5;
        color: hsl(var(--muted-foreground));
      }
      .mb-marginalia aside {
        margin: 0 0 1.5rem 0;
        padding-left: 0.75rem;
        border-left: var(--mb-rule);
        opacity: 0;
        animation: mb-fade-in 500ms ease forwards;
      }
      @keyframes mb-fade-in { to { opacity: 1; } }
      @media (max-width: 768px) {
        .mb-marginalia {
          margin-top: 1.5rem;
          border-top: var(--mb-rule);
          padding-top: 1rem;
        }
      }

      /* --- Masthead wordmark --- */
      .mb-masthead-wordmark {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        text-transform: uppercase;
        letter-spacing: -0.03em;
        color: hsl(var(--foreground));
      }

      /* --- Display size utilities (folio / deck / kicker) --- */
      .text-folio {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        font-size: clamp(54px, 15vw, 220px);
        line-height: 0.82;
        letter-spacing: -0.04em;
        text-transform: uppercase;
        overflow-wrap: break-word;
        word-break: break-word;
      }
      /* Cover-story headline — CLAMPED so the longest single word fits its
       * reserved 8-of-12 column (~740px at 1440) and never crosses the deck
       * column or bleeds off-viewport. Deliberate grid-breaking scale kept, but
       * bounded: the folio is big, not unbounded. word-break is a last-resort
       * safety net; the clamp keeps whole words within the track. */
      .mb-cover-folio {
        font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif);
        font-size: clamp(2.75rem, 8vw, 8rem);
        line-height: 0.86;
        letter-spacing: -0.035em;
        text-transform: uppercase;
        overflow-wrap: break-word;
        hyphens: none;
      }
      .text-deck {
        font-family: var(--font-body, "Inter", system-ui, sans-serif);
        font-size: clamp(24px, 3vw, 44px);
        line-height: 1.12;
        letter-spacing: -0.01em;
        font-weight: 500;
      }
      .text-kicker {
        font-family: var(--font-mono, "IBM Plex Mono", ui-monospace, monospace);
        font-size: 12px;
        text-transform: uppercase;
        letter-spacing: 0.18em;
        font-weight: 600;
      }

      /* --- Asymmetric editorial grids (persona blocks) --- */
      .mb-grid-12 { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 1.5rem; }
      .mb-photo-grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 1.25rem; }
      .mb-frame-half { grid-column: span 6 / span 6; }
      .mb-frame-full { grid-column: 1 / -1; }
      .mb-frame-tall { grid-column: span 5 / span 5; grid-row: span 2; }
      @media (max-width: 768px) {
        .mb-photo-grid { grid-template-columns: 1fr; }
        .mb-frame-half, .mb-frame-full, .mb-frame-tall { grid-column: 1 / -1; grid-row: auto; }
      }

      /* --- River container (centred max-width column for the story river slot) --- */
      .mb-river {
        max-width: 64rem;
        margin-left: auto; margin-right: auto;
        padding-left: 1rem; padding-right: 1rem;
      }

      /* --- Color-block accent panel --- */
      .colorblock-accent { background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }

      /* --- Full-bleed image --- */
      .mb-fullbleed { width: 100vw; max-width: 100vw; margin-left: 50%; transform: translateX(-50%); }

      /* --- Duotone photo treatment (signature — persona blocks) --- */
      .mb-duotone { position: relative; }
      .mb-duotone img { filter: grayscale(1) contrast(1.15); display: block; width: 100%; height: 100%; object-fit: cover; }
      .mb-duotone::after {
        content: ""; position: absolute; inset: 0;
        background: hsl(var(--accent));
        mix-blend-mode: multiply;
        opacity: 0.55;
        transition: opacity 200ms ease;
        pointer-events: none;
      }
      .mb-duotone:hover::after { opacity: 0.2; }
      @media (prefers-reduced-motion: reduce) {
        .mb-duotone:hover::after { opacity: 0.55; }
      }

      /* --- Scroll reveal (MID motion) — ROBUST: visible by default (no-JS / no-observer
       *     / reduced-motion / un-scrolled full-page capture all show content). JS opts
       *     IN to the hidden-then-reveal animation by adding .mb-armed, and a safety net
       *     force-reveals everything. Never leaves content permanently hidden. --- */
      .mb-reveal { opacity: 1; transform: none; }
      .mb-reveal.mb-armed { opacity: 0; transform: translateY(16px); transition: opacity 500ms ease, transform 500ms ease; }
      .mb-reveal.mb-armed.mb-in { opacity: 1; transform: none; }
      @media (prefers-reduced-motion: reduce) {
        .mb-reveal, .mb-reveal.mb-armed { opacity: 1; transform: none; transition: none; }
      }

      /* --- Marquee ticker (MID motion; paused on hover; static fallback) --- */
      .mb-marquee { overflow: hidden; white-space: nowrap; }
      .mb-marquee-track {
        display: inline-block;
        will-change: transform;
        animation: mb-marquee 22s linear infinite;
      }
      .mb-marquee:hover .mb-marquee-track { animation-play-state: paused; }
      @keyframes mb-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
      @media (prefers-reduced-motion: reduce) {
        .mb-marquee-track { animation: none; }
      }

      /* --- Reading-progress bar (fluoro; scroll-timeline; reduced-motion guard) --- */
      .mb-progress {
        position: sticky; top: 0;
        height: 4px;
        background: hsl(var(--accent));
        transform-origin: 0 50%;
        animation: mb-progress linear both;
        animation-timeline: scroll(root block);
        z-index: 50;
      }
      @keyframes mb-progress { from { transform: scaleX(0); } to { transform: scaleX(1); } }
      @media (prefers-reduced-motion: reduce) {
        .mb-progress { animation: none; transform: scaleX(0); }
      }

      /* --- Per-instance pull-quote accent override (persona quote) --- */
      [data-mb-accent="pink"] { --mb-accent-h: 330; --mb-accent-s: 95%; --mb-accent-l: 58%; }
      [data-mb-accent="blue"] { --mb-accent-h: 220; --mb-accent-s: 100%; --mb-accent-l: 56%; }
      [data-mb-accent="lime"] { --mb-accent-h: 78; --mb-accent-s: 90%; --mb-accent-l: 50%; }
      [data-mb-accent] .mb-quote-bar { background-color: hsl(var(--mb-accent-h) var(--mb-accent-s) var(--mb-accent-l)); }
    }
