diff --git a/blocks/roster_grid.ninjatpl b/blocks/roster_grid.ninjatpl index c2f279d..1429edf 100644 --- a/blocks/roster_grid.ninjatpl +++ b/blocks/roster_grid.ninjatpl @@ -4,7 +4,7 @@ {% if eyebrow %}

{{ eyebrow }}

{% endif %} {% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} -
+
{% for member in members %}
{% if member.avatar %}{% img member.avatar alt=member.name class="h-full w-full object-cover" %}{% else %}{% endif %} diff --git a/manifest.yaml b/manifest.yaml index 4274d8d..03225af 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -294,14 +294,14 @@ css: z-index: 1; } .hud-frame::before { - top: -1px; - left: -1px; + top: 0; + left: 0; border-top: 2px solid hsl(var(--primary)); border-left: 2px solid hsl(var(--primary)); } .hud-frame::after { - bottom: -1px; - right: -1px; + bottom: 0; + right: 0; border-bottom: 2px solid hsl(var(--accent)); border-right: 2px solid hsl(var(--accent)); } @@ -351,6 +351,77 @@ css: linear-gradient(to bottom, transparent, hsl(var(--background) / 0.6)); } + /* --- Responsive layout utilities (theme-owned, media-query driven) ---- */ + /* The host Tailwind build does NOT reliably compile responsive utility + variants (sm:/md:/lg:grid-cols-*, min-h-screen, arbitrary values) that + appear only in this theme's templates, so multi-column grids collapse + to a single column at every width and heroes lose their min-height. + Drive the load-bearing responsive layout from explicit CSS instead. + Layout only — no colour literals (colours stay on semantic tokens). */ + + .cp-grid { display: grid; gap: 1.5rem; grid-template-columns: minmax(0, 1fr); } + .cp-grid.cp-g-none { gap: 0; } + .cp-grid.cp-g-tight { gap: 1rem; } + .cp-grid.cp-g-wide { gap: 2rem; } + .cp-grid.cp-g-xl { gap: 2.5rem; } + .cp-grid.cp-m2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + @media (min-width: 640px) { + .cp-grid.cp-s2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + } + @media (min-width: 768px) { + .cp-grid.cp-md2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .cp-grid.cp-md3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .cp-grid.cp-md4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + } + @media (min-width: 1024px) { + .cp-grid.cp-lg2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .cp-grid.cp-lg3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + .cp-grid.cp-lg4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } + .cp-grid.cp-lg5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } + } + .cp-span2 { grid-column: span 2; } + @media (min-width: 1024px) { .cp-lg-span1 { grid-column: span 1; } } + + /* Masonry column-count (gallery) with the same reliability guarantee. */ + .cp-cols { column-gap: 1rem; } + .cp-cols.cp-c2 { columns: 2; } + @media (min-width: 768px) { + .cp-cols.cp-md-c2 { columns: 2; } + .cp-cols.cp-md-c3 { columns: 3; } + .cp-cols.cp-md-c4 { columns: 4; } + } + + /* Two-column content split (rich-section, hours-location) + article aside. */ + .cp-split { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); } + @media (min-width: 768px) { + .cp-split.cp-split-md { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4rem; } + } + .cp-article-grid { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); } + @media (min-width: 1024px) { + .cp-article-grid { grid-template-columns: minmax(0, 1fr) 260px; } + } + + /* --- Hero heights (bounded; host drops min-h-screen / arbitrary vh) ---- */ + /* Capped so a sparse hero never balloons into an empty neon void, while a + populated hero still reads full-bleed. */ + .cp-hero-tall { min-height: clamp(32rem, 82vh, 50rem); } + .cp-hero-mid { min-height: clamp(28rem, 70vh, 44rem); } + .cp-hero-short { min-height: clamp(20rem, 50vh, 30rem); } + .cp-hero-auto { min-height: 22rem; } + .cp-hero-split { min-height: clamp(20rem, 46vh, 28rem); } + + /* Vertical-timeline connector line (arbitrary before:* utilities dropped). */ + .cp-timeline { position: relative; } + .cp-timeline::before { + content: ""; + position: absolute; + left: 1rem; + top: 0.5rem; + width: 1px; + height: calc(100% - 1rem); + background: hsl(var(--primary) / 0.5); + } + /* --- Reduced motion: kill all motion --------------------- */ @media (prefers-reduced-motion: reduce) { diff --git a/templates/cyberpunk/article.ninjatpl b/templates/cyberpunk/article.ninjatpl index 0812832..dc73894 100644 --- a/templates/cyberpunk/article.ninjatpl +++ b/templates/cyberpunk/article.ninjatpl @@ -5,7 +5,7 @@ {{ admin_banner_html|safe }}
{{ slots.header|safe }}
-
+
{{ slots.main|safe }}
{% if slots.aside %}{% endif %}
diff --git a/templates/overrides/cyberpunk/blog-hero.ninjatpl b/templates/overrides/cyberpunk/blog-hero.ninjatpl index b4578be..c92b02f 100644 --- a/templates/overrides/cyberpunk/blog-hero.ninjatpl +++ b/templates/overrides/cyberpunk/blog-hero.ninjatpl @@ -7,7 +7,7 @@ {% if subtitle %}

{{ subtitle }}

{% endif %}
{% if posts %} -
+
{% for post in posts %}
{% if post.featured_image_url %}{% img post.featured_image_url alt=post.title class="aspect-video h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" %}{% endif %} diff --git a/templates/overrides/cyberpunk/contact-card.ninjatpl b/templates/overrides/cyberpunk/contact-card.ninjatpl index be0d7b3..0517a66 100644 --- a/templates/overrides/cyberpunk/contact-card.ninjatpl +++ b/templates/overrides/cyberpunk/contact-card.ninjatpl @@ -3,7 +3,7 @@
{% if heading %}

{{ heading }}

{% endif %} {% if description %}

{{ description }}

{% endif %} -
+
{% for channel in channels %}
{% if channel.icon %}{% endif %} diff --git a/templates/overrides/cyberpunk/event-list.ninjatpl b/templates/overrides/cyberpunk/event-list.ninjatpl index 01c4ded..30f5480 100644 --- a/templates/overrides/cyberpunk/event-list.ninjatpl +++ b/templates/overrides/cyberpunk/event-list.ninjatpl @@ -4,7 +4,7 @@ {% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} {% if layout == "cards" %} -
+
{% for event in events %}{% if not (hidePast and event.past) %}
{% if event.media %}
{% img event.media alt=event.title class="h-full w-full object-cover" %}
{% endif %} diff --git a/templates/overrides/cyberpunk/feature-grid.ninjatpl b/templates/overrides/cyberpunk/feature-grid.ninjatpl index 3a16038..b01336f 100644 --- a/templates/overrides/cyberpunk/feature-grid.ninjatpl +++ b/templates/overrides/cyberpunk/feature-grid.ninjatpl @@ -5,7 +5,7 @@ {% if eyebrow %}

{{ eyebrow }}

{% endif %} {% if heading %}

{{ heading }}

{% endif %} {% if intro %}

{{ intro }}

{% endif %} -
+
{% for item in items %}
{% if item.icon %}
{% endif %} diff --git a/templates/overrides/cyberpunk/featured-posts.ninjatpl b/templates/overrides/cyberpunk/featured-posts.ninjatpl index efd5af9..49767ed 100644 --- a/templates/overrides/cyberpunk/featured-posts.ninjatpl +++ b/templates/overrides/cyberpunk/featured-posts.ninjatpl @@ -3,7 +3,7 @@
{% if heading %}

{{ heading }}

{% endif %} -
+
{% for post in posts %}
{{ legalbar() }} {% else %} -
-
+
+
{% if logo %}{{ companyName }}{% elif companyName %}{{ companyName }}{% endif %} {% if tagline %}

{{ tagline }}

{% endif %} {% if address or email or phone %}
{% if address %}
{{ address }}
{% endif %}{% if email %}{% endif %}{% if phone %}{% endif %}
{% endif %} {{ sociallinks("mt-5") }}
{% for col in columns %}

{{ col.header }}

{% endfor %} -{% if showNewsletter %}
{{ newsletter() }}
{% endif %} +{% if showNewsletter %}
{{ newsletter() }}
{% endif %}
{{ legalbar() }} {% endif %} diff --git a/templates/overrides/cyberpunk/gallery.ninjatpl b/templates/overrides/cyberpunk/gallery.ninjatpl index 75b2f61..8e0261d 100644 --- a/templates/overrides/cyberpunk/gallery.ninjatpl +++ b/templates/overrides/cyberpunk/gallery.ninjatpl @@ -1,5 +1,5 @@ {# gallery cyberpunk override: neon-edged tiles. Lightbox script + data-bn-* attributes + {% img %} preserved byte-for-byte. #} -{% with layout=layout|default:"grid" gap=gap|default:"md" cols=columns|default:3 %}{% if lightbox %}