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>
58 lines
1.6 KiB
JSON
58 lines
1.6 KiB
JSON
{
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"title": "Project Ledger",
|
|
"description": "Ordered project list on a 12-col grid: number, year, client, role, link",
|
|
"type": "object",
|
|
"properties": {
|
|
"heading": {
|
|
"type": "string",
|
|
"title": "Heading",
|
|
"description": "Optional section heading shown above the ledger",
|
|
"x-editor": "text"
|
|
},
|
|
"rows": {
|
|
"type": "array",
|
|
"title": "Rows",
|
|
"description": "Project rows in display order",
|
|
"default": [],
|
|
"x-editor": "collection",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"no": {
|
|
"type": "string",
|
|
"title": "Number",
|
|
"description": "Two-digit project number e.g. 01",
|
|
"x-editor": "text"
|
|
},
|
|
"year": {
|
|
"type": "string",
|
|
"title": "Year",
|
|
"description": "Year of the project",
|
|
"x-editor": "text"
|
|
},
|
|
"client": {
|
|
"type": "string",
|
|
"title": "Client",
|
|
"description": "Client name",
|
|
"x-editor": "text"
|
|
},
|
|
"role": {
|
|
"type": "string",
|
|
"title": "Role",
|
|
"description": "Discipline / role on the project",
|
|
"x-editor": "text"
|
|
},
|
|
"link": {
|
|
"type": "string",
|
|
"title": "Link",
|
|
"description": "Optional link to the project page",
|
|
"x-editor": "link"
|
|
}
|
|
},
|
|
"required": ["no", "client"]
|
|
}
|
|
}
|
|
}
|
|
}
|