The host public CSS is a render-driven JIT (`@import "tailwindcss" source(none)`); a runtime-installed codeless theme lives in data/plugins, which is in NO @source glob, so its .ninjatpl utility classes only compile if a built-in emits the exact string or the class is safelisted. Non- safelisted families were silently dropping on a fresh provision, causing: feature-grid rendering full-width instead of 3 columns (lg:grid-cols-3 absent), card/section content crammed against borders (p-* shorthand absent), and touching grid items (gap-6 absent). - manifest.yaml: add a "layout guarantee layer" of raw CSS scoped to .brutalist-page (compiled unconditionally via input_css_append) defining grid-cols/col-span/columns + all sm/md/lg responsive variants, p-* shorthand, gap-*, space-y-*, aspect-*, object-*, w/h-full. Deterministic columns on desktop AND 1-col collapse on mobile via real media queries. - manifest.yaml: cut excessive .bru-section padding (6rem->4rem desktop, 4rem->2.75rem mobile) to remove the oversized dead bands between sections. - project_ledger: was a bare <section> with no wrap -> rendered full-bleed (rows touched the viewport edges). Wrap in bru-section + bru-wrap; add an optional heading field (parity with changelog/spec_sheet). - navbar: move mobile drawer + overlay geometry (fixed/top/right/h-full/ w-80/max-w-[85vw]/inset-0/z) into the inline <style> so the non-safelisted positioning classes can't leave the drawer unpositioned; display stays on safelisted flex/md:hidden. Neutral rgba scrim. - image: guard empty src so absent media collapses instead of an empty bordered box (empty-media graceful state). Persona (concrete, chunky borders, hard offset shadows, candy accents) unchanged. No .reveal/scroll-hide pattern in this theme. Version not bumped. make build, ninja plugin verify, and check-safety all exit 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7 lines
1.0 KiB
Plaintext
7 lines
1.0 KiB
Plaintext
<section class="bru-section bg-background text-foreground" data-block="brutalist:project_ledger">
|
|
<div class="bru-wrap">
|
|
{% if heading %}<h2 class="bru-kicker mb-8" style="font-size:clamp(1.5rem,4vw,2.75rem)">{{ heading }}</h2>{% endif %}
|
|
{% if not rows %}<p class="brutalist-mono" style="padding: 1rem 0; color: hsl(var(--muted-foreground));">No projects listed.</p>{% else %}<ol style="list-style: none; padding: 0; margin: 0;">{% for row in rows %}<li class="brutalist-ledger-row"><span class="ledger-no">{{ row.no }}</span><span class="ledger-year">{{ row.year }}</span><span class="ledger-client">{% if row.link %}<a href="{{ row.link }}" style="color: inherit; text-decoration: none;">{{ row.client }}</a>{% else %}{{ row.client }}{% endif %}</span><span class="ledger-role">{{ row.role }}</span><span class="ledger-arrow">{% if row.link %}<a href="{{ row.link }}" aria-label="View project" style="color: inherit; text-decoration: none;">→</a>{% endif %}</span></li>{% endfor %}</ol>{% endif %}
|
|
</div>
|
|
</section>
|