diff --git a/blocks/cover_story.ninjatpl b/blocks/cover_story.ninjatpl index bf9c791..2195d71 100644 --- a/blocks/cover_story.ninjatpl +++ b/blocks/cover_story.ninjatpl @@ -1,23 +1,30 @@ {# cover_story (magazine-bold) — asymmetric cover: mono folio kicker, massive condensed headline, deck, duotone cover image, shop/read CTA. Fields: kicker, headline (richtext), deck (richtext), image (media), link, linkLabel. Image via {% img %} (media filter not registered in block render path). MID motion: mb-reveal + duotone hover, reduced-motion safe. #} -
+
{% if kicker %}
{{ kicker }}
{% endif %}

{% if headline %}{{ headline|safe }}{% else %}Cover story{% endif %}

-
{% if deck %}
{{ deck|safe }}
{% endif %}
+
{% if deck %}
{{ deck|safe }}
{% endif %}
- {% if image %}
{% img image alt="" class="h-full w-full object-cover" layout="hero" %}
{% endif %} - {% if link %}{% endif %} + {% if image %}
{% img image alt="" class="h-full w-full object-cover" layout="hero" %}
{% endif %} + {% if link %}{% endif %}
diff --git a/blocks/drop_calendar.ninjatpl b/blocks/drop_calendar.ninjatpl index 838a6c4..a1be06d 100644 --- a/blocks/drop_calendar.ninjatpl +++ b/blocks/drop_calendar.ninjatpl @@ -1,5 +1,5 @@ {# drop_calendar (magazine-bold) — dated list of drops: mono datelines, condensed names, a status tag. Fields: heading, intro, drops[].date/.name/.detail/.status(live|soon|sold)/.link/.linkLabel. Static, no motion. #} -
+
{% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} diff --git a/blocks/lookbook.ninjatpl b/blocks/lookbook.ninjatpl index 6da4b68..77d078a 100644 --- a/blocks/lookbook.ninjatpl +++ b/blocks/lookbook.ninjatpl @@ -1,10 +1,10 @@ {# lookbook (magazine-bold) — grid of duotone look frames with mono numbering, captions and optional shop links. Fields: heading, intro, looks[].image/.caption/.credit/.link/.linkLabel. Image via {% img %} (media filter not registered in block render path). MID motion: duotone hover + mb-reveal, reduced-motion safe. #} -
+
{% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} {% if looks %} -
+
{% for look in looks %}
{% if look.image %}
{% img look.image alt=look.caption|default:"" class="h-full w-full object-cover" %}
{% endif %} @@ -22,3 +22,21 @@ {% else %}
No looks yet.
{% endif %}
+ diff --git a/manifest.yaml b/manifest.yaml index 8b67dbd..1664020 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -359,10 +359,12 @@ css: /* --- Display size utilities (folio / deck / kicker) --- */ .text-folio { font-family: var(--font-heading, "Archivo Black", "Arial Black", sans-serif); - font-size: clamp(72px, 16vw, 220px); + 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; } .text-deck { font-family: var(--font-body, "Inter", system-ui, sans-serif); @@ -390,6 +392,26 @@ css: .mb-frame-half, .mb-frame-full, .mb-frame-tall { grid-column: 1 / -1; grid-row: auto; } } + /* --- Guaranteed responsive helpers — host Tailwind JIT does NOT reliably scan + * theme .ninjatpl files, so any layout-critical responsive rule lives here as + * literal CSS (always emitted) instead of interpolated/utility classes that + * could be dropped (grids that then never collapse on mobile). --- */ + .mb-river { + max-width: 64rem; + margin-left: auto; margin-right: auto; + padding-left: 1rem; padding-right: 1rem; + } + .mb-grid-resp { display: grid; grid-template-columns: 1fr; gap: 1.5rem; } + @media (min-width: 640px) { + .mb-grid-resp.mb-cols-2, .mb-grid-resp.mb-cols-3, .mb-grid-resp.mb-cols-4 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + @media (min-width: 1024px) { + .mb-grid-resp.mb-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .mb-grid-resp.mb-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + } + /* --- Color-block accent panel --- */ .colorblock-accent { background-color: hsl(var(--accent)); color: hsl(var(--accent-foreground)); } @@ -412,13 +434,16 @@ css: .mb-duotone:hover::after { opacity: 0.55; } } - /* --- Scroll reveal (MID motion; static fallback) --- */ - .mb-reveal { opacity: 0; transform: translateY(16px); transition: opacity 500ms ease, transform 500ms ease; } - .mb-reveal.mb-in { opacity: 1; transform: none; } + /* --- 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 { opacity: 1; transform: none; transition: none; } + .mb-reveal, .mb-reveal.mb-armed { opacity: 1; transform: none; transition: none; } } - .no-js .mb-reveal { opacity: 1; transform: none; } /* --- Marquee ticker (MID motion; paused on hover; static fallback) --- */ .mb-marquee { overflow: hidden; white-space: nowrap; } diff --git a/templates/magazine-bold/landing.ninjatpl b/templates/magazine-bold/landing.ninjatpl index cb744fc..9f03b55 100644 --- a/templates/magazine-bold/landing.ninjatpl +++ b/templates/magazine-bold/landing.ninjatpl @@ -4,9 +4,9 @@ {{ admin_banner_html|safe }} {% if slots.masthead %}
{{ slots.masthead|safe }}
{% endif %} -
- {% if slots.lead %}
{{ slots.lead|safe }}
{% endif %} - {% if slots.river %}

{{ slots.river|safe }}
{% endif %} +
+ {% if slots.lead %}
{{ slots.lead|safe }}
{% endif %} + {% if slots.river %}

{{ slots.river|safe }}
{% endif %}
{% if slots.footer %}
{{ slots.footer|safe }}
{% endif %} {{ body_end_html|safe }} diff --git a/templates/overrides/magazine-bold/card.ninjatpl b/templates/overrides/magazine-bold/card.ninjatpl index c8b60ae..72a3e6e 100644 --- a/templates/overrides/magazine-bold/card.ninjatpl +++ b/templates/overrides/magazine-bold/card.ninjatpl @@ -1,4 +1,4 @@ {# card override — magazine-bold hairline panel; accent border on hover, fluoro link. Fields mirror builtin: layout, link, media, title, text, linkLabel. Media via {% img %}. #} {% with layout=layout|default:"vertical" %} - + {% endwith %} diff --git a/templates/overrides/magazine-bold/hero.ninjatpl b/templates/overrides/magazine-bold/hero.ninjatpl index 5e43209..e19371b 100644 --- a/templates/overrides/magazine-bold/hero.ninjatpl +++ b/templates/overrides/magazine-bold/hero.ninjatpl @@ -21,13 +21,13 @@
{% endif %} {% if trustLogos %}

Acclaim

-
{% for logo in trustLogos %}{% if logo.url %}{% img logo.image alt=logo.alt class="h-8 w-auto" %}{% else %}{% img logo.image alt=logo.alt class="h-8 w-auto opacity-60" %}{% endif %}{% endfor %}
+
{% for logo in trustLogos %}{% if logo.image %}{% if logo.url %}{% img logo.image alt=logo.alt class="h-8 w-auto" %}{% else %}{% img logo.image alt=logo.alt class="h-8 w-auto opacity-60" %}{% endif %}{% endif %}{% endfor %}
{% endif %} {% endmacro %} {% if variant == "split" %} -
-
{% if hasImage %}{% img backgroundImage alt=headlineText class="absolute inset-0 h-full w-full object-cover" layout="hero" %}{% endif %}
-
{{ herocontent("left") }}
+
+{% if hasImage %}
{% img backgroundImage alt=headlineText class="absolute inset-0 h-full w-full object-cover" layout="hero" %}
{% endif %} +
{{ herocontent("left") }}
{% else %} {% set align = "center" %} diff --git a/templates/overrides/magazine-bold/image.ninjatpl b/templates/overrides/magazine-bold/image.ninjatpl index 06a6c38..77dd1d9 100644 --- a/templates/overrides/magazine-bold/image.ninjatpl +++ b/templates/overrides/magazine-bold/image.ninjatpl @@ -1,11 +1,11 @@ {# image override — plain magazine-bold plate, no ornament frame. Fields mirror builtin: src, alt, caption, size, align, aspectRatio, objectFit. Media resolved via {% img %} (media filter is not registered in the block render path). #} {% with size=size|default:"full" align=align|default:"center" objectFit=objectFit|default:"cover" %}
-
+ {% if src %}
{% if objectFit == "contain" %}{% img src alt=alt class="w-full h-full object-contain" layout=size %}{% elif objectFit == "fill" %}{% img src alt=alt class="w-full h-full object-fill" layout=size %}{% elif objectFit == "none" %}{% img src alt=alt class="w-full h-full object-none" layout=size %}{% else %}{% img src alt=alt class="w-full h-full object-cover" layout=size %}{% endif %}
-
+
{% endif %} {% if caption %}
{{ caption }}
{% endif %}
{% endwith %} diff --git a/templates/overrides/magazine-bold/logo-strip.ninjatpl b/templates/overrides/magazine-bold/logo-strip.ninjatpl index 1c7c306..cf088e7 100644 --- a/templates/overrides/magazine-bold/logo-strip.ninjatpl +++ b/templates/overrides/magazine-bold/logo-strip.ninjatpl @@ -3,11 +3,11 @@ {% if heading %}

{{ heading }}

{% endif %}
- {% for logo in logos %} + {% for logo in logos %}{% if logo.image %} {% if logo.url %}{% endif %} {% img logo.image alt=logo.alt class="h-8 w-auto object-contain" %} {% if logo.url %}{% endif %} - {% endfor %} + {% endif %}{% endfor %}
diff --git a/templates/overrides/magazine-bold/newsletter-signup.ninjatpl b/templates/overrides/magazine-bold/newsletter-signup.ninjatpl index 3393863..e648f14 100644 --- a/templates/overrides/magazine-bold/newsletter-signup.ninjatpl +++ b/templates/overrides/magazine-bold/newsletter-signup.ninjatpl @@ -1,10 +1,10 @@ {# newsletter-signup (magazine-bold) — the {% signup_form %} tag carries the #} {# untouchable subscribe wiring (/api/lists/subscribe HTMX post + honeypot); #} {# this template wraps it in a quiet mb-panel — no loud filled band. #} -
+
-
-
+
+
{% if title %}

{{ title }}

{% endif %} {% if description %}

{{ description }}

{% endif %}
{% signup_form list=listSlug source=source submit=submitText success_message=successMessage placeholder=placeholder %}
diff --git a/templates/overrides/magazine-bold/stats.ninjatpl b/templates/overrides/magazine-bold/stats.ninjatpl index 6e5a655..48568c0 100644 --- a/templates/overrides/magazine-bold/stats.ninjatpl +++ b/templates/overrides/magazine-bold/stats.ninjatpl @@ -2,7 +2,7 @@
{% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} -
+
{% for item in items %}
{% if item.prefix %}{{ item.prefix }}{% endif %}{{ item.value }}{% if item.suffix %}{{ item.suffix }}{% endif %}
diff --git a/templates/overrides/magazine-bold/video-embed.ninjatpl b/templates/overrides/magazine-bold/video-embed.ninjatpl index 6a9d683..ae04c8e 100644 --- a/templates/overrides/magazine-bold/video-embed.ninjatpl +++ b/templates/overrides/magazine-bold/video-embed.ninjatpl @@ -1,5 +1,5 @@ {# video-embed override — magazine-bold hairline frame; fluoro play medallion. Fields + facade JS mirror builtin verbatim: aspect, url, media, poster, title, caption. #} -{% with aspect=aspect|default:"16:9" %}
{% if caption %}
{{ caption }}
{% endif %}