diff --git a/blocks/discography.ninjatpl b/blocks/discography.ninjatpl index 9860bc4..19bddfd 100644 --- a/blocks/discography.ninjatpl +++ b/blocks/discography.ninjatpl @@ -12,7 +12,7 @@ {% else %}
- {% if release.link %}{% else %}{% endif %} + {% if release.link %}{% else %}{% endif %}
{% endif %}
diff --git a/blocks/waveform_player.ninjatpl b/blocks/waveform_player.ninjatpl index c17cf76..1ad4c55 100644 --- a/blocks/waveform_player.ninjatpl +++ b/blocks/waveform_player.ninjatpl @@ -2,7 +2,7 @@
- {% if coverImage %}{% img coverImage alt=trackTitle class="w-full h-full object-cover" %}{% else %}{% endif %} + {% if coverImage %}{% img coverImage alt=trackTitle class="w-full h-full object-cover" %}{% else %}{% endif %}
@@ -10,7 +10,7 @@ {% if artist %}{{ artist }}{% endif %}
- {% if audioUrl %}{% else %}

No audio source set yet.

{% endif %} + {% if audioUrl %}{% else %}
Side Alive to tape
{% endif %}
diff --git a/manifest.yaml b/manifest.yaml index 31dbd36..0a44a94 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -124,6 +124,15 @@ css: below are HSL triples consumed the same way. No literal hex/rgb. ============================================================ */ + /* --- Bundled display faces (CMS does not emit @font-face for + LoadedPlugin.BundledFonts — dead code; theme-side workaround per + gotham@1.2.0). Served from the extracted .bnp at /templates/y2k/fonts/*. + Presets set typography.fontHeading/body/mono to template:y2k:, + which resolves --font-heading/body/mono to these families. --------- */ + @font-face { font-family: 'Orbitron'; src: url('/templates/y2k/fonts/orbitron-latin.woff2') format('woff2'); font-weight: 400 900; font-style: normal; font-display: swap; } + @font-face { font-family: 'Share Tech Mono'; src: url('/templates/y2k/fonts/share-tech-mono-latin.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } + @font-face { font-family: 'Inter'; src: url('/templates/y2k/fonts/inter-latin.woff2') format('woff2'); font-weight: 400 700; font-style: normal; font-display: swap; } + /* --- Chrome / mesh / bevel channel tokens ----------------- */ :root { --chrome-1: 220 40% 96%; @@ -469,6 +478,19 @@ css: radial-gradient(50% 45% at 50% 80%, hsl(var(--mesh-c) / 0.45), transparent 60%), linear-gradient(to bottom, transparent, hsl(var(--background) / 0.7)); } + /* Hero legibility scrim: a radial wash of the page background behind the + headline. In LIGHT mode --background is near-white so the centre stays + light and dark hero text reads over the bright mesh; in DARK mode + --background is near-black so the centre darkens and light text reads. + One rule fixes contrast in both modes without dulling the showpiece. */ + .y2k-hero-scrim { + z-index: 5; + background-image: radial-gradient( + ellipse 78% 68% at 50% 46%, + hsl(var(--background) / 0.86) 0%, + hsl(var(--background) / 0.5) 46%, + transparent 80%); + } /* --- Reduced motion: kill all motion ---------------------- */ @media (prefers-reduced-motion: reduce) { diff --git a/plugin.mod b/plugin.mod index a7b44ca..3606473 100644 --- a/plugin.mod +++ b/plugin.mod @@ -2,7 +2,7 @@ name = "y2k" display_name = "Y2K" scope = "@themes" -version = "0.3.1" +version = "0.4.0" description = "Millennium-web band theme — liquid-chrome bevels, frosted plastic, gradient mesh, marquees, glitter, a webring, and a canvas metaball hero. Built for musicians and bands." kind = "theme" categories = ["templates"] diff --git a/presets.json b/presets.json index bd370e7..20c6a4f 100644 --- a/presets.json +++ b/presets.json @@ -5,6 +5,13 @@ "description": "Bondi-blue frosted plastic in light, UV magenta rave in dark — the Y2K default", "theme": { "mode": "both", + "typography": { + "fontHeading": "template:y2k:Orbitron", + "fontBody": "template:y2k:Inter", + "fontMono": "template:y2k:Share Tech Mono", + "fontSizeBase": "16", + "lineHeightBase": "1.65" + }, "lightColors": { "background": "205 55% 96%", "foreground": "230 40% 14%", @@ -55,6 +62,13 @@ "description": "Cotton-candy pink plastic in light, hot-pink blacklight in dark", "theme": { "mode": "both", + "typography": { + "fontHeading": "template:y2k:Orbitron", + "fontBody": "template:y2k:Inter", + "fontMono": "template:y2k:Share Tech Mono", + "fontSizeBase": "16", + "lineHeightBase": "1.65" + }, "lightColors": { "background": "330 60% 97%", "foreground": "320 35% 16%", @@ -105,6 +119,13 @@ "description": "Frosted lime soda in light, radioactive green rave in dark", "theme": { "mode": "both", + "typography": { + "fontHeading": "template:y2k:Orbitron", + "fontBody": "template:y2k:Inter", + "fontMono": "template:y2k:Share Tech Mono", + "fontSizeBase": "16", + "lineHeightBase": "1.65" + }, "lightColors": { "background": "150 45% 96%", "foreground": "170 35% 12%", @@ -155,6 +176,13 @@ "description": "Brushed-silver chrome in light, restrained slate blacklight in dark", "theme": { "mode": "both", + "typography": { + "fontHeading": "template:y2k:Orbitron", + "fontBody": "template:y2k:Inter", + "fontMono": "template:y2k:Share Tech Mono", + "fontSizeBase": "16", + "lineHeightBase": "1.65" + }, "lightColors": { "background": "220 18% 95%", "foreground": "225 25% 14%", @@ -205,6 +233,13 @@ "description": "Translucent tangerine iMac in light, sunset-orange rave in dark", "theme": { "mode": "both", + "typography": { + "fontHeading": "template:y2k:Orbitron", + "fontBody": "template:y2k:Inter", + "fontMono": "template:y2k:Share Tech Mono", + "fontSizeBase": "16", + "lineHeightBase": "1.65" + }, "lightColors": { "background": "35 70% 96%", "foreground": "20 40% 15%", diff --git a/preview.png b/preview.png index e98e36c..d039d01 100644 Binary files a/preview.png and b/preview.png differ diff --git a/screenshots/01-home-light.png b/screenshots/01-home-light.png index e98e36c..c83eb03 100644 Binary files a/screenshots/01-home-light.png and b/screenshots/01-home-light.png differ diff --git a/screenshots/02-home-dark.png b/screenshots/02-home-dark.png index 8f54c37..d039d01 100644 Binary files a/screenshots/02-home-dark.png and b/screenshots/02-home-dark.png differ diff --git a/screenshots/03-about-light.png b/screenshots/03-about-light.png index 2739e38..8ac45d7 100644 Binary files a/screenshots/03-about-light.png and b/screenshots/03-about-light.png differ diff --git a/screenshots/04-about-dark.png b/screenshots/04-about-dark.png index 5a74d95..8c6ff6f 100644 Binary files a/screenshots/04-about-dark.png and b/screenshots/04-about-dark.png differ diff --git a/screenshots/05-blog-tracking-to-tape-light.png b/screenshots/05-blog-tracking-to-tape-light.png index 20aa965..9359e7c 100644 Binary files a/screenshots/05-blog-tracking-to-tape-light.png and b/screenshots/05-blog-tracking-to-tape-light.png differ diff --git a/screenshots/06-blog-tracking-to-tape-dark.png b/screenshots/06-blog-tracking-to-tape-dark.png index d8c3c64..6ae622e 100644 Binary files a/screenshots/06-blog-tracking-to-tape-dark.png and b/screenshots/06-blog-tracking-to-tape-dark.png differ diff --git a/seed/media/abstract-neon.jpg b/seed/media/abstract-neon.jpg new file mode 100644 index 0000000..35735f7 Binary files /dev/null and b/seed/media/abstract-neon.jpg differ diff --git a/seed/media/cassette.jpg b/seed/media/cassette.jpg new file mode 100644 index 0000000..88de20b Binary files /dev/null and b/seed/media/cassette.jpg differ diff --git a/seed/media/chrome-liquid-metal.jpg b/seed/media/chrome-liquid-metal.jpg new file mode 100644 index 0000000..52b8fed Binary files /dev/null and b/seed/media/chrome-liquid-metal.jpg differ diff --git a/seed/media/chrome-metallic.jpg b/seed/media/chrome-metallic.jpg new file mode 100644 index 0000000..c321f82 Binary files /dev/null and b/seed/media/chrome-metallic.jpg differ diff --git a/seed/media/holographic-foil.jpg b/seed/media/holographic-foil.jpg new file mode 100644 index 0000000..6aba33a Binary files /dev/null and b/seed/media/holographic-foil.jpg differ diff --git a/seed/media/neon-rave.jpg b/seed/media/neon-rave.jpg new file mode 100644 index 0000000..c587288 Binary files /dev/null and b/seed/media/neon-rave.jpg differ diff --git a/seed/seed.json b/seed/seed.json index 1dfbfa5..39c36c8 100644 --- a/seed/seed.json +++ b/seed/seed.json @@ -6,16 +6,74 @@ "tagline": "A four-piece from the frosted end of the millennium." } }, + "media": [ + { + "id": "b7c0de00-0000-4000-8000-000000000001", + "file": "media/chrome-liquid-metal.jpg", + "alt": "Liquid chrome poured into a mirror-bright abstract surface", + "folder": "Chrome Static" + }, + { + "id": "b7c0de00-0000-4000-8000-000000000002", + "file": "media/holographic-foil.jpg", + "alt": "Rainbow holographic foil catching the light", + "folder": "Chrome Static" + }, + { + "id": "b7c0de00-0000-4000-8000-000000000003", + "file": "media/abstract-neon.jpg", + "alt": "Abstract neon light trails in magenta and cyan", + "folder": "Chrome Static" + }, + { + "id": "b7c0de00-0000-4000-8000-000000000004", + "file": "media/cassette.jpg", + "alt": "A worn audio cassette tape on a plain background", + "folder": "Chrome Static" + }, + { + "id": "b7c0de00-0000-4000-8000-000000000005", + "file": "media/neon-rave.jpg", + "alt": "Blurred neon rave lights in the dark", + "folder": "Chrome Static" + }, + { + "id": "b7c0de00-0000-4000-8000-000000000006", + "file": "media/chrome-metallic.jpg", + "alt": "Brushed metallic chrome texture, wide crop", + "folder": "Chrome Static" + } + ], "data_tables": [ { "key": "contact_submissions", "name": "Contact Enquiries", "description": "Seeded contact-form submissions for the Chrome Static demo. A submission becomes a row here and emails the site admins.", "columns": [ - { "key": "name", "label": "Name", "type": "text", "required": true }, - { "key": "email", "label": "Email", "type": "email", "required": true }, - { "key": "subject", "label": "Subject", "type": "text", "required": false }, - { "key": "message", "label": "Message", "type": "text", "required": true } + { + "key": "name", + "label": "Name", + "type": "text", + "required": true + }, + { + "key": "email", + "label": "Email", + "type": "email", + "required": true + }, + { + "key": "subject", + "label": "Subject", + "type": "text", + "required": false + }, + { + "key": "message", + "label": "Message", + "type": "text", + "required": true + } ] } ], @@ -37,8 +95,14 @@ "headline": "Chrome Static", "subheadline": "Four tracks. Recorded live to tape.", "description": "We are a four-piece from Melbourne. We make loud, bright pop for the end of the millennium.", - "ctaPrimary": { "text": "Listen", "url": "#listen" }, - "ctaSecondary": { "text": "See the shows", "url": "#shows" } + "ctaPrimary": { + "text": "Listen", + "url": "#listen" + }, + "ctaSecondary": { + "text": "See the shows", + "url": "#shows" + } } }, { @@ -50,7 +114,7 @@ "trackTitle": "Frosted", "artist": "Chrome Static", "audioUrl": "", - "coverImage": "" + "coverImage": "media:b7c0de00-0000-4000-8000-000000000005" } }, { @@ -61,10 +125,34 @@ "content": { "heading": "Records", "releases": [ - { "title": "Chrome Hearts", "year": "2001", "format": "LP", "cover": "", "link": "#" }, - { "title": "Dial-Up Dreams", "year": "2000", "format": "EP", "cover": "", "link": "#" }, - { "title": "Frosted", "year": "1999", "format": "Single", "cover": "", "link": "#" }, - { "title": "Skyline Demos", "year": "1998", "format": "Cassette", "cover": "", "link": "#" } + { + "title": "Chrome Hearts", + "year": "2001", + "format": "LP", + "cover": "media:b7c0de00-0000-4000-8000-000000000001", + "link": "#" + }, + { + "title": "Dial-Up Dreams", + "year": "2000", + "format": "EP", + "cover": "media:b7c0de00-0000-4000-8000-000000000002", + "link": "#" + }, + { + "title": "Frosted", + "year": "1999", + "format": "Single", + "cover": "media:b7c0de00-0000-4000-8000-000000000003", + "link": "#" + }, + { + "title": "Skyline Demos", + "year": "1998", + "format": "Cassette", + "cover": "media:b7c0de00-0000-4000-8000-000000000004", + "link": "#" + } ] } }, @@ -77,9 +165,27 @@ "heading": "Shows", "intro": "Doors an hour before. All ages unless noted.", "dates": [ - { "date": "Fri 12 Sep", "venue": "The Chrome Room", "city": "Melbourne", "ticketUrl": "#", "soldOut": false }, - { "date": "Sat 13 Sep", "venue": "Rollerdrome", "city": "Sydney", "ticketUrl": "#", "soldOut": true }, - { "date": "Fri 19 Sep", "venue": "Basement 88", "city": "Brisbane", "ticketUrl": "#", "soldOut": false } + { + "date": "Fri 12 Sep", + "venue": "The Chrome Room", + "city": "Melbourne", + "ticketUrl": "#", + "soldOut": false + }, + { + "date": "Sat 13 Sep", + "venue": "Rollerdrome", + "city": "Sydney", + "ticketUrl": "#", + "soldOut": true + }, + { + "date": "Fri 19 Sep", + "venue": "Basement 88", + "city": "Brisbane", + "ticketUrl": "#", + "soldOut": false + } ] } }, @@ -103,21 +209,86 @@ "title": "The band", "template_key": "default", "blocks": [ - { "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "The band", "level": 1 } }, - { "block_key": "rich-text", "title": "Story", "slot": "main", "sort_order": 2, "content": { "html": "

Chrome Static started in a share house with a borrowed drum machine and a broken amp. We kept the sound and fixed the amp.

We record live to tape in one room. What you hear on the record is what we play on the night. Four people, no click track, one take when we can get it.

" } }, - { "block_key": "quote", "title": "Quote", "slot": "main", "sort_order": 3, "content": { "style": "pull", "quote": "Loud, bright, and done in one take.", "attribution": "Chrome Static" } }, - { "block_key": "divider", "title": "Divider", "slot": "main", "sort_order": 4, "content": { "variant": "line", "weight": "medium" } }, + { + "block_key": "image", + "title": "Band image", + "slot": "main", + "sort_order": 1, + "content": { + "src": "media:b7c0de00-0000-4000-8000-000000000006", + "alt": "Brushed metallic chrome texture", + "caption": "Chrome Static — live to tape, one room.", + "size": "full", + "aspectRatio": "wide" + } + }, + { + "block_key": "heading", + "title": "Heading", + "slot": "main", + "sort_order": 2, + "content": { + "text": "The band", + "level": 1 + } + }, + { + "block_key": "rich-text", + "title": "Story", + "slot": "main", + "sort_order": 3, + "content": { + "html": "

Chrome Static started in a share house with a borrowed drum machine and a broken amp. We kept the sound and fixed the amp.

We record live to tape in one room. What you hear on the record is what we play on the night. Four people, no click track, one take when we can get it.

" + } + }, + { + "block_key": "quote", + "title": "Quote", + "slot": "main", + "sort_order": 4, + "content": { + "style": "pull", + "quote": "Loud, bright, and done in one take.", + "attribution": "Chrome Static" + } + }, + { + "block_key": "divider", + "title": "Divider", + "slot": "main", + "sort_order": 5, + "content": { + "variant": "line", + "weight": "medium" + } + }, { "block_key": "y2k:tracklist", "title": "Frosted tracklist", "slot": "main", - "sort_order": 5, + "sort_order": 6, "content": { "tracks": [ - { "title": "Frosted", "duration": "3:12", "url": "" }, - { "title": "Dial Tone", "duration": "2:48", "url": "" }, - { "title": "Silver Static", "duration": "4:01", "url": "" }, - { "title": "Skyline", "duration": "3:35", "url": "" } + { + "title": "Frosted", + "duration": "3:12", + "url": "" + }, + { + "title": "Dial Tone", + "duration": "2:48", + "url": "" + }, + { + "title": "Silver Static", + "duration": "4:01", + "url": "" + }, + { + "title": "Skyline", + "duration": "3:35", + "url": "" + } ] } } @@ -128,9 +299,45 @@ "title": "Journal", "template_key": "blog-index", "blocks": [ - { "block_key": "card", "title": "Post: Tape", "slot": "main", "sort_order": 1, "content": { "layout": "vertical", "title": "Why we still track to tape", "text": "

Tape makes us commit. Here is what that costs and what we get back.

", "link": "/blog/tracking-to-tape", "linkLabel": "Read on" } }, - { "block_key": "card", "title": "Post: Tour", "slot": "main", "sort_order": 2, "content": { "layout": "vertical", "title": "Notes from the September run", "text": "

Three cities in a van. What went right and what broke.

", "link": "/blog/september-run", "linkLabel": "Read on" } }, - { "block_key": "card", "title": "Post: Gear", "slot": "main", "sort_order": 3, "content": { "layout": "vertical", "title": "The one pedal we cannot replace", "text": "

A cheap chorus pedal from 1999. It is the whole sound.

", "link": "/blog/the-chorus-pedal", "linkLabel": "Read on" } } + { + "block_key": "card", + "title": "Post: Tape", + "slot": "main", + "sort_order": 1, + "content": { + "layout": "vertical", + "title": "Why we still track to tape", + "text": "

Tape makes us commit. Here is what that costs and what we get back.

", + "link": "/blog/tracking-to-tape", + "linkLabel": "Read on" + } + }, + { + "block_key": "card", + "title": "Post: Tour", + "slot": "main", + "sort_order": 2, + "content": { + "layout": "vertical", + "title": "Notes from the September run", + "text": "

Three cities in a van. What went right and what broke.

", + "link": "/blog/september-run", + "linkLabel": "Read on" + } + }, + { + "block_key": "card", + "title": "Post: Gear", + "slot": "main", + "sort_order": 3, + "content": { + "layout": "vertical", + "title": "The one pedal we cannot replace", + "text": "

A cheap chorus pedal from 1999. It is the whole sound.

", + "link": "/blog/the-chorus-pedal", + "linkLabel": "Read on" + } + } ] }, { @@ -139,8 +346,25 @@ "template_key": "article", "parent_slug": "/blog", "blocks": [ - { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Why we still track to tape", "level": 1 } }, - { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

Tape does not let you undo. You play it, you keep it, or you play it again. That pressure shows up in the take.

It is slower and it costs more. We think the trade is worth it. The record sounds like a room, not a grid.

" } } + { + "block_key": "heading", + "title": "Title", + "slot": "main", + "sort_order": 1, + "content": { + "text": "Why we still track to tape", + "level": 1 + } + }, + { + "block_key": "rich-text", + "title": "Body", + "slot": "main", + "sort_order": 2, + "content": { + "html": "

Everyone asks why we still bother with tape. The honest answer is that it makes us better — not the sound first, the playing. Tape does not let you undo, so you stop treating a take like a draft and start treating it like a performance.

We tracked Frosted in a converted laundry in Brunswick over four nights in the winter of 1999. One room, one machine, four of us, and whoever wandered in. The reel we used was already half-worn from a demo we would rather forget, which is why side A has a faint ghost of an old chorus under the second verse. We kept it.

The rule was simple. Three takes, then we move on. If a song was not working by the third pass it was the arrangement, not the take, and no amount of punching in was going to save it. That rule cost us two songs and saved us a fortnight.

Digital gives you infinite tries and somehow that makes everyone worse. When you can fix it later, you play like you will fix it later. You lean back. Tape makes you lean in. The only click is your own pulse, and the only quantising is whether the four of you agree on where the beat lands.

There is a cost and we are not going to pretend there isn't. Tape is expensive, editing is a razor blade and a chinagraph pencil, and if the machine eats a reel you have lost the night. We lost one night. The heads needed cleaning and nobody noticed until the playback came back muddy, and by then it was three in the morning and the coffee was gone.

What you get back is a record that sounds like a room instead of a grid. You can hear the walls. You can hear the amp two feet from the kit bleeding into the overheads, and that bleed is the glue that makes four people sound like one band instead of four separate files.

We mix to tape too, which horrifies our engineer friends. The two-track we bounce down to adds a compression you cannot dial in on a plugin — a gentle softening on the transients that takes the ice off the top end. Chrome, without the cuts.

People say tape is nostalgia. Maybe. But nobody accuses a painter of nostalgia for using oil instead of a screen. It is a medium with a grain, and the grain is the point. We are not trying to sound like 1979. We are trying to sound like the four of us in a laundry in 1999, because that is what we are.

If you are thinking about doing it, do it once before you decide. Book a day, bring three songs you know cold, and give yourself three takes each. You will learn more about your band in eight hours than in a year of overdubs.

The next record will be tape as well. We already booked the room — same laundry, new reels — and we will keep whatever ghosts turn up.

" + } + } ] }, { @@ -149,8 +373,25 @@ "template_key": "article", "parent_slug": "/blog", "blocks": [ - { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Notes from the September run", "level": 1 } }, - { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

Three cities, one van, four amps. The van held. One amp did not.

Sydney sold out and Brisbane nearly did. We ate too much servo food and slept in the van outside a Bunnings. We would do it again next week.

" } } + { + "block_key": "heading", + "title": "Title", + "slot": "main", + "sort_order": 1, + "content": { + "text": "Notes from the September run", + "level": 1 + } + }, + { + "block_key": "rich-text", + "title": "Body", + "slot": "main", + "sort_order": 2, + "content": { + "html": "

Three cities, one van, four amps. The van held. One amp did not.

Sydney sold out and Brisbane nearly did. We ate too much servo food and slept in the van outside a Bunnings. We would do it again next week.

" + } + } ] }, { @@ -159,8 +400,25 @@ "template_key": "article", "parent_slug": "/blog", "blocks": [ - { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "The one pedal we cannot replace", "level": 1 } }, - { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

It is a plastic chorus pedal from 1999. It hisses and the knob is loose. It is also the whole guitar sound.

We have tried to replace it twice. Both times the record sounded wrong, so the old one went back on the board.

" } } + { + "block_key": "heading", + "title": "Title", + "slot": "main", + "sort_order": 1, + "content": { + "text": "The one pedal we cannot replace", + "level": 1 + } + }, + { + "block_key": "rich-text", + "title": "Body", + "slot": "main", + "sort_order": 2, + "content": { + "html": "

It is a plastic chorus pedal from 1999. It hisses and the knob is loose. It is also the whole guitar sound.

We have tried to replace it twice. Both times the record sounded wrong, so the old one went back on the board.

" + } + } ] }, { @@ -179,12 +437,40 @@ "submitLabel": "Send", "successMessage": "Thanks. We will get back to you soon.", "fields": [ - { "name": "name", "label": "Your name", "type": "text", "required": true, "width": "half" }, - { "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" }, - { "name": "subject", "label": "Subject", "type": "text", "required": false, "width": "full" }, - { "name": "message", "label": "Message", "type": "textarea", "required": true, "width": "full" } + { + "name": "name", + "label": "Your name", + "type": "text", + "required": true, + "width": "half" + }, + { + "name": "email", + "label": "Email", + "type": "email", + "required": true, + "width": "half" + }, + { + "name": "subject", + "label": "Subject", + "type": "text", + "required": false, + "width": "full" + }, + { + "name": "message", + "label": "Message", + "type": "textarea", + "required": true, + "width": "full" + } ], - "formConfig": { "enabled": true, "captchaEnabled": false, "targetTable": "contact_submissions" } + "formConfig": { + "enabled": true, + "captchaEnabled": false, + "targetTable": "contact_submissions" + } } }, { @@ -196,9 +482,24 @@ "heading": "Other ways in", "columns": 3, "channels": [ - { "icon": "lucide:mail", "label": "Email", "value": "hello@chromestatic.band", "link": "mailto:hello@chromestatic.band" }, - { "icon": "simple-icons:bandcamp", "label": "Bandcamp", "value": "chromestatic.bandcamp.com", "link": "#" }, - { "icon": "simple-icons:instagram", "label": "Instagram", "value": "@chromestatic", "link": "#" } + { + "icon": "lucide:mail", + "label": "Email", + "value": "hello@chromestatic.band", + "link": "mailto:hello@chromestatic.band" + }, + { + "icon": "simple-icons:bandcamp", + "label": "Bandcamp", + "value": "chromestatic.bandcamp.com", + "link": "#" + }, + { + "icon": "simple-icons:instagram", + "label": "Instagram", + "value": "@chromestatic", + "link": "#" + } ] } } @@ -209,14 +510,43 @@ "title": "Sign in", "template_key": "auth", "blocks": [ - { "block_key": "auth-form", "title": "Sign in", "slot": "main", "sort_order": 1, "content": { "default_tab": "login", "show_social": false } } + { + "block_key": "auth-form", + "title": "Sign in", + "slot": "main", + "sort_order": 1, + "content": { + "default_tab": "login", + "show_social": false + } + } ] } ], "menu_items": [ - { "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 }, - { "menu": "main", "label": "The band", "page_slug": "/about", "sort_order": 2 }, - { "menu": "main", "label": "Journal", "page_slug": "/blog", "sort_order": 3 }, - { "menu": "main", "label": "Contact", "page_slug": "/contact", "sort_order": 4 } + { + "menu": "main", + "label": "Home", + "page_slug": "/", + "sort_order": 1 + }, + { + "menu": "main", + "label": "The band", + "page_slug": "/about", + "sort_order": 2 + }, + { + "menu": "main", + "label": "Journal", + "page_slug": "/blog", + "sort_order": 3 + }, + { + "menu": "main", + "label": "Contact", + "page_slug": "/contact", + "sort_order": 4 + } ] } diff --git a/templates/overrides/y2k/audio-embed.ninjatpl b/templates/overrides/y2k/audio-embed.ninjatpl index f9bd0aa..5acb697 100644 --- a/templates/overrides/y2k/audio-embed.ninjatpl +++ b/templates/overrides/y2k/audio-embed.ninjatpl @@ -1,5 +1,5 @@ {# audio-embed y2k override: neon panel, mono meta. Facade script + data-bn-* attributes + {% img %} preserved byte-for-byte. #} -
{% if artwork %}
{% img artwork alt=title|default:"" class="h-full w-full object-cover" %}
{% endif %}
{% if title %}

{{ title }}

{% endif %}{% if artist %}

{{ artist }}

{% endif %}
{% if download %}::lucide:download:sm:: Download{% endif %}
{% endmacro %} {% macro social() %}{% if show_social != false and (context.site.google_oauth_client_id or context.site.facebook_app_id) %}

or
- {% if context.site.google_oauth_client_id %}Continue with Google{% endif %} - {% if context.site.facebook_app_id %}Continue with Facebook{% endif %} + {% if context.site.google_oauth_client_id %}Continue with Google{% endif %} + {% if context.site.facebook_app_id %}Continue with Facebook{% endif %}
{% endif %}{% endmacro %}
diff --git a/templates/overrides/y2k/auth-status.ninjatpl b/templates/overrides/y2k/auth-status.ninjatpl index e1f2258..03d0864 100644 --- a/templates/overrides/y2k/auth-status.ninjatpl +++ b/templates/overrides/y2k/auth-status.ninjatpl @@ -10,7 +10,7 @@
{% endif %}
diff --git a/templates/overrides/y2k/author-bio-hero.ninjatpl b/templates/overrides/y2k/author-bio-hero.ninjatpl index 7ec8b04..425290f 100644 --- a/templates/overrides/y2k/author-bio-hero.ninjatpl +++ b/templates/overrides/y2k/author-bio-hero.ninjatpl @@ -12,10 +12,10 @@ {% if author.location %}{{ author.location }}{% endif %}
{% if showSocial %}
-{% if author.website_url %}{% endif %} -{% if author.twitter_handle %}{% endif %} -{% if author.linkedin_url %}{% endif %} -{% if author.github_url %}{% endif %} +{% if author.website_url %}{% endif %} +{% if author.twitter_handle %}{% endif %} +{% if author.linkedin_url %}{% endif %} +{% if author.github_url %}{% endif %}
{% endif %}
diff --git a/templates/overrides/y2k/card.ninjatpl b/templates/overrides/y2k/card.ninjatpl index 028a246..34dc3ec 100644 --- a/templates/overrides/y2k/card.ninjatpl +++ b/templates/overrides/y2k/card.ninjatpl @@ -1,2 +1,2 @@ {# y2k card — dashed neon panel; fields layout/link/media/title/text/linkLabel #} -{% with layout=layout|default:"vertical" %}
{% if link %}{% endif %}{% if media %}
{% if layout == "horizontal" %}{% img media alt=title|default:"" class="h-full w-full object-cover" %}{% else %}{% img media alt=title|default:"" class="aspect-video h-full w-full object-cover" %}{% endif %}
{% endif %}
{% if title %}

{{ title }}

{% endif %}{% if text %}
{{ text|safe }}
{% endif %}{% if linkLabel and link %}{{ linkLabel }}::lucide:arrow-right:sm::{% endif %}
{% if link %}
{% endif %}
{% endwith %} +{% with layout=layout|default:"vertical" %}
{% if link %}{% endif %}{% if media %}
{% if layout == "horizontal" %}{% img media alt=title|default:"" class="h-full w-full object-cover" %}{% else %}{% img media alt=title|default:"" class="aspect-video h-full w-full object-cover" %}{% endif %}
{% endif %}
{% if title %}

{{ title }}

{% endif %}{% if text %}
{{ text|safe }}
{% endif %}{% if linkLabel and link %}{{ linkLabel }}{% endif %}
{% if link %}
{% endif %}
{% endwith %} diff --git a/templates/overrides/y2k/contact-card.ninjatpl b/templates/overrides/y2k/contact-card.ninjatpl index 2e9d36a..46603cd 100644 --- a/templates/overrides/y2k/contact-card.ninjatpl +++ b/templates/overrides/y2k/contact-card.ninjatpl @@ -6,7 +6,7 @@
{% for channel in channels %}
- {% if channel.icon %}{% endif %} + {% if channel.icon %}{% endif %}
{% if channel.label %}
{{ channel.label }}
{% endif %} {% if channel.value %}
{% if channel.link %}{{ channel.value }}{% else %}{{ channel.value }}{% endif %}
{% endif %} diff --git a/templates/overrides/y2k/contact-form.ninjatpl b/templates/overrides/y2k/contact-form.ninjatpl index 821fb77..d523c8b 100644 --- a/templates/overrides/y2k/contact-form.ninjatpl +++ b/templates/overrides/y2k/contact-form.ninjatpl @@ -4,7 +4,7 @@
{% if form.submitted %}
-
+

{{ form.message|default:successMessage|default:"Thanks — your message has been sent." }}

{% else %} diff --git a/templates/overrides/y2k/countdown.ninjatpl b/templates/overrides/y2k/countdown.ninjatpl index bcc4711..abdb293 100644 --- a/templates/overrides/y2k/countdown.ninjatpl +++ b/templates/overrides/y2k/countdown.ninjatpl @@ -13,7 +13,7 @@
diff --git a/templates/overrides/y2k/cta.ninjatpl b/templates/overrides/y2k/cta.ninjatpl index 325705f..ab377e7 100644 --- a/templates/overrides/y2k/cta.ninjatpl +++ b/templates/overrides/y2k/cta.ninjatpl @@ -8,7 +8,7 @@ {% if text %}

{{ text }}

{% endif %}
- {% if primaryUrl and primaryLabel %}{{ primaryLabel }}{% endif %} + {% if primaryUrl and primaryLabel %}{{ primaryLabel }}{% endif %} {% if secondaryUrl and secondaryLabel %}{{ secondaryLabel }}{% endif %}
diff --git a/templates/overrides/y2k/event-list.ninjatpl b/templates/overrides/y2k/event-list.ninjatpl index acc0a1a..8df5deb 100644 --- a/templates/overrides/y2k/event-list.ninjatpl +++ b/templates/overrides/y2k/event-list.ninjatpl @@ -13,7 +13,7 @@

{{ event.title }}

{% if event.venue %}

{{ event.venue }}

{% endif %} {% if event.description %}

{{ event.description }}

{% endif %} - {% if event.link %}{{ event.linkLabel|default:"Details" }}{% endif %} + {% if event.link %}{{ event.linkLabel|default:"Details" }}{% endif %} {% endif %}{% endfor %} diff --git a/templates/overrides/y2k/faq.ninjatpl b/templates/overrides/y2k/faq.ninjatpl index f37973b..1edfe2e 100644 --- a/templates/overrides/y2k/faq.ninjatpl +++ b/templates/overrides/y2k/faq.ninjatpl @@ -8,7 +8,7 @@
{{ item.question }} - +
{{ item.answer|safe }}
diff --git a/templates/overrides/y2k/feature-grid.ninjatpl b/templates/overrides/y2k/feature-grid.ninjatpl index e54d3e6..d95615a 100644 --- a/templates/overrides/y2k/feature-grid.ninjatpl +++ b/templates/overrides/y2k/feature-grid.ninjatpl @@ -8,10 +8,10 @@
{% for item in items %}
- {% if item.icon %}
{% endif %} + {% if item.icon %}
{% endif %}

{% if item.linkUrl %}{{ item.title }}{% else %}{{ item.title }}{% endif %}

{% if item.text %}

{{ item.text }}

{% endif %} - {% if item.linkUrl and item.linkLabel %}{{ item.linkLabel }}{% endif %} + {% if item.linkUrl and item.linkLabel %}{{ item.linkLabel }}{% endif %}
{% endfor %}
diff --git a/templates/overrides/y2k/hero.ninjatpl b/templates/overrides/y2k/hero.ninjatpl index 4ce0a75..7e1e3fd 100644 --- a/templates/overrides/y2k/hero.ninjatpl +++ b/templates/overrides/y2k/hero.ninjatpl @@ -1,8 +1,8 @@ {# hero y2k override (GO-BIG showpiece): canvas liquid-chrome metaballs behind a beveled chrome headline over a sparkle glitter field. All builtin field reads + macro + branch structure preserved from the frozen hero default. The metaball canvas shows when there is no backgroundImage; it lazy-inits on view, honors prefers-reduced-motion, degrades to a static chrome-mesh gradient with JS off, and is dependency-free (hero/landing only per motion tier). #} -{% set eyebrowText = eyebrow.text|default:eyebrow %} -{% set headlineText = headline.text|default:headline %} -{% set subText = subheadline.text|default:subheadline %} -{% set descText = description.text|default:description %} +{% set eyebrowText = eyebrow|get:"text"|default:eyebrow %} +{% set headlineText = headline|get:"text"|default:headline %} +{% set subText = subheadline|get:"text"|default:subheadline %} +{% set descText = description|get:"text"|default:description %} {% set pText = ctaPrimary.text %} {% set pUrl = ctaPrimary.url %} {% set sText = ctaSecondary.text %} @@ -35,6 +35,7 @@
{% if hasImage %}
{% img backgroundImage alt=headlineText class="h-full w-full object-cover" layout="hero" %}{% if showOverlay %}
{% endif %}
{% else %}
{% endif %} +
{{ herocontent(align) }}
{% endif %} diff --git a/templates/overrides/y2k/hours-location.ninjatpl b/templates/overrides/y2k/hours-location.ninjatpl index d7da77b..8669e51 100644 --- a/templates/overrides/y2k/hours-location.ninjatpl +++ b/templates/overrides/y2k/hours-location.ninjatpl @@ -19,11 +19,11 @@ {% if specialHoursNote %}

{{ specialHoursNote }}

{% endif %} {% if address %}
Address
{{ address }}
{% endif %} {% if phone %}
Phone
{{ phone }}
{% endif %} - {% if directionsUrl %}Get directions{% endif %} + {% if directionsUrl %}Get directions{% endif %} {% if mapEmbedUrl %}
- +
{% endif %} diff --git a/templates/overrides/y2k/page-suggestions.ninjatpl b/templates/overrides/y2k/page-suggestions.ninjatpl index 7e11df3..e672b3f 100644 --- a/templates/overrides/y2k/page-suggestions.ninjatpl +++ b/templates/overrides/y2k/page-suggestions.ninjatpl @@ -7,7 +7,7 @@

{{ emptyMessage|default:"That route returned nothing. The page moved, shipped, or never existed." }}

{% if context.path %}

requested: {{ context.path }}

{% endif %}
- Back to home + Back to home
diff --git a/templates/overrides/y2k/pricing.ninjatpl b/templates/overrides/y2k/pricing.ninjatpl index bb9af2f..f879cb9 100644 --- a/templates/overrides/y2k/pricing.ninjatpl +++ b/templates/overrides/y2k/pricing.ninjatpl @@ -15,7 +15,7 @@

{% if tier.description %}

{{ tier.description }}

{% endif %} {% if tier.features %}{% endif %} {% if tier.ctaUrl and tier.ctaLabel %}{{ tier.ctaLabel }}{% endif %} diff --git a/templates/overrides/y2k/rich-section.ninjatpl b/templates/overrides/y2k/rich-section.ninjatpl index ccd5687..fd1ced5 100644 --- a/templates/overrides/y2k/rich-section.ninjatpl +++ b/templates/overrides/y2k/rich-section.ninjatpl @@ -5,7 +5,7 @@ {% if eyebrow %}

{{ eyebrow }}

{% endif %} {% if heading %}

{{ heading }}

{% endif %} {% if body %}
{{ body|safe }}
{% endif %} - {% if ctaUrl and ctaLabel %}{{ ctaLabel }}{% endif %} + {% if ctaUrl and ctaLabel %}{{ ctaLabel }}{% endif %}
{% if media %}
{% img media alt=mediaAlt class="w-full h-auto object-cover" %}
{% endif %} diff --git a/templates/overrides/y2k/sidebar-nav.ninjatpl b/templates/overrides/y2k/sidebar-nav.ninjatpl index 72c7cee..f5d2e40 100644 --- a/templates/overrides/y2k/sidebar-nav.ninjatpl +++ b/templates/overrides/y2k/sidebar-nav.ninjatpl @@ -6,7 +6,7 @@ {% if title %}

{{ title }}

{% endif %} diff --git a/templates/overrides/y2k/social-links.ninjatpl b/templates/overrides/y2k/social-links.ninjatpl index c7ae79b..d5742b7 100644 --- a/templates/overrides/y2k/social-links.ninjatpl +++ b/templates/overrides/y2k/social-links.ninjatpl @@ -5,7 +5,7 @@ {% for link in links %}{% if link.url %}
  • - {% if link.network %}{% endif %} + {% if link.network %}{% endif %} {% if style == "stack" and link.label %}{{ link.label }}{% endif %}
  • diff --git a/templates/overrides/y2k/team.ninjatpl b/templates/overrides/y2k/team.ninjatpl index 13d883a..038bee8 100644 --- a/templates/overrides/y2k/team.ninjatpl +++ b/templates/overrides/y2k/team.ninjatpl @@ -12,7 +12,7 @@ {% if member.role %}

    {{ member.role }}

    {% endif %} {% if member.bio %}

    {{ member.bio }}

    {% endif %} {% if member.socials %}
    - {% for social in member.socials %}{% if social.url %}{% endif %}{% endfor %} + {% for social in member.socials %}{% if social.url %}{% endif %}{% endfor %}
    {% endif %}
    diff --git a/templates/overrides/y2k/testimonial.ninjatpl b/templates/overrides/y2k/testimonial.ninjatpl index cc6635c..803cbab 100644 --- a/templates/overrides/y2k/testimonial.ninjatpl +++ b/templates/overrides/y2k/testimonial.ninjatpl @@ -6,11 +6,11 @@ {% for q in quotes %}
    {% if q.rating %}
    - - - - - + + + + +
    {% endif %}
    {% if q.quote %}“{{ q.quote }}”{% endif %}
    diff --git a/templates/overrides/y2k/timeline.ninjatpl b/templates/overrides/y2k/timeline.ninjatpl index a78c39d..89b142e 100644 --- a/templates/overrides/y2k/timeline.ninjatpl +++ b/templates/overrides/y2k/timeline.ninjatpl @@ -7,7 +7,7 @@ {% for step in steps %}
  • - {% if marker == "numbered" %}{{ forloop.counter }}{% elif marker == "dot" %}{% else %}{% endif %} + {% if marker == "numbered" %}{{ forloop.counter }}{% elif marker == "dot" %}{% else %}{% endif %}
    {% if step.label %}

    {{ step.label }}

    {% endif %} diff --git a/templates/overrides/y2k/utility-bar.ninjatpl b/templates/overrides/y2k/utility-bar.ninjatpl index 4340e4d..94be0b3 100644 --- a/templates/overrides/y2k/utility-bar.ninjatpl +++ b/templates/overrides/y2k/utility-bar.ninjatpl @@ -1,7 +1,7 @@ {# utility_bar (WO-TF-006): thin top contact strip; left/right item lists {icon,label,link}; icons render through the sprite pipeline via the ::pack:name:: shorthand. Y2K override: mono terminal readout, neon underline. #} {% set ubcls = "bg-muted text-muted-foreground border-b border-primary/30" %} {% if variant == "primary" %}{% set ubcls = "bg-primary text-primary-foreground" %}{% elif variant == "dark" %}{% set ubcls = "bg-foreground text-background" %}{% endif %} -{% macro ubitem(it) %}{% if it.link %}{% if it.icon %}::{{ it.icon }}::{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% else %}{% if it.icon %}::{{ it.icon }}::{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% endif %}{% endmacro %} +{% macro ubitem(it) %}{% if it.link %}{% if it.icon %}{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% else %}{% if it.icon %}{% endif %}{% if it.label %}{{ it.label }}{% endif %}{% endif %}{% endmacro %}
    {% for it in leftItems %}{{ ubitem(it) }}{% endfor %}
    diff --git a/templates/overrides/y2k/video-embed.ninjatpl b/templates/overrides/y2k/video-embed.ninjatpl index ff815c6..3ef58f6 100644 --- a/templates/overrides/y2k/video-embed.ninjatpl +++ b/templates/overrides/y2k/video-embed.ninjatpl @@ -1,5 +1,5 @@ {# video-embed y2k override: neon HUD frame, clip-cut play button. Facade script + data-bn-* attributes + {% img %} preserved byte-for-byte. #} -{% with aspect=aspect|default:"16:9" %}
    {% if caption %}
    {{ caption }}
    {% endif %}