+
+
-
-
- {% if logo_url %} {% endif %}
+ |
+ $ from: {{ site_name }}
+ {% if logo_url %} {% else %}{{ site_name }} {% endif %}
|
- | {{ body|safe }} |
+ {{ body|safe }} |
- | |
+
|
- |
- {% if site_url %} {{ site_url }} {% endif %}
- {% if unsubscribe_url %}[esc] unsubscribe {% else %}[esc] unsubscribe {% endif %}
+ |
+ {% if site_url %} {{ site_url }} {% endif %}
+ {% if support_email %}{{ support_email }} {% endif %}
+ {% if unsubscribe_url %}[esc] unsubscribe {% else %}[esc] unsubscribe {% endif %}
|
diff --git a/templates/overrides/cyberpunk/announcement-bar.ninjatpl b/templates/overrides/cyberpunk/announcement-bar.ninjatpl
new file mode 100644
index 0000000..3b4111e
--- /dev/null
+++ b/templates/overrides/cyberpunk/announcement-bar.ninjatpl
@@ -0,0 +1,21 @@
+{# announcement_bar (WO-TF-006): dismissable banner; dismissal persists in localStorage keyed by a content hash (variant + slugified message) so it reappears when the message changes; no-JS fallback is a static non-dismissable strip. Cyberpunk override: mono broadcast readout — data-* + script preserved. #}
+{% set anncls = "bg-primary/10 text-foreground" %}
+{% if variant == "promo" %}{% set anncls = "bg-primary text-primary-foreground" %}{% elif variant == "alert" %}{% set anncls = "bg-destructive text-destructive-foreground" %}{% endif %}
+
+
+ {{ message }}{% if linkText and linkUrl %} {{ linkText }}{% endif %}
+{% if dismissable %} {% endif %}
+
+
+{% if dismissable %}{% endif %}
diff --git a/templates/overrides/cyberpunk/audio-embed.ninjatpl b/templates/overrides/cyberpunk/audio-embed.ninjatpl
new file mode 100644
index 0000000..3eb5487
--- /dev/null
+++ b/templates/overrides/cyberpunk/audio-embed.ninjatpl
@@ -0,0 +1,16 @@
+{# audio-embed cyberpunk 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 %}
diff --git a/templates/overrides/cyberpunk/auth-form.ninjatpl b/templates/overrides/cyberpunk/auth-form.ninjatpl
new file mode 100644
index 0000000..943c9c2
--- /dev/null
+++ b/templates/overrides/cyberpunk/auth-form.ninjatpl
@@ -0,0 +1,77 @@
+{# auth-form cyberpunk override — reproduces the builtin's security-critical wiring: hardcoded HTMX endpoints /api/auth/login + /api/auth/register (target #auth-message), /forgot-password link, OAuth start URLs gated on context.site.*, and the exact Cap widget markup when captchaEnabled. Only the chrome is themed. #}
+{% if context.isPublicLoggedIn %}
+
+ Session active as {{ context.publicUsername }}
+ My Account
+
+{% else %}
+{% set loginActive = "border-primary text-primary" %}
+{% set registerActive = "border-transparent text-muted-foreground" %}
+{% set loginHidden = "" %}
+{% set registerHidden = "hidden" %}
+{% if default_tab == "register" %}{% set loginActive = "border-transparent text-muted-foreground" %}{% set registerActive = "border-primary text-primary" %}{% set loginHidden = "hidden" %}{% set registerHidden = "" %}{% endif %}
+{% set tabbase = "flex-1 py-2 text-center cyberpunk-mono text-sm font-medium uppercase tracking-wider border-b-2 transition-colors" %}
+{% macro captcha() %}
+
+
+{% endmacro %}
+{% macro social() %}{% if show_social != false and (context.site.google_oauth_client_id or context.site.facebook_app_id) %}{% endif %}{% endmacro %}
+
+
+
+
+
+
+
+
+
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/auth-status.ninjatpl b/templates/overrides/cyberpunk/auth-status.ninjatpl
new file mode 100644
index 0000000..e47758b
--- /dev/null
+++ b/templates/overrides/cyberpunk/auth-status.ninjatpl
@@ -0,0 +1,36 @@
+{# auth-status cyberpunk override — reproduces the builtin's hardcoded wiring: /login + /login?tab=register when logged out; /account, /account/reviews, and hx-post /api/auth/logout dropdown when logged in; hx-post /api/auth/resend-verification banner when unverified. State from context.*. #}
+{% if not context.isPublicLoggedIn %}
+
+{% else %}
+{% if not context.publicEmailVerified %}
+ Verify your email address.
+ {% endif %}
+
+
+
+
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/author-bio-hero.ninjatpl b/templates/overrides/cyberpunk/author-bio-hero.ninjatpl
new file mode 100644
index 0000000..77f0183
--- /dev/null
+++ b/templates/overrides/cyberpunk/author-bio-hero.ninjatpl
@@ -0,0 +1,22 @@
+{# author-bio-hero (cyberpunk override) — author-page header from the `authors` provider. #}
+{% if author %}
+
+
+
+{% if showAvatar and author.avatar_url %} {% img author.avatar_url alt=author.display_name class="h-full w-full object-cover" %} {% endif %}
+ {{ author.display_name }}
+{% if author.job_title or author.company %} {{ author.job_title }}{% if author.job_title and author.company %} · {% endif %}{{ author.company }} {% endif %}
+{% if author.bio %} {{ author.bio }} {% endif %}
+
+{% if showPostCount %}{{ author.post_count|default:0 }} post{% if author.post_count != 1 %}s{% endif %}{% endif %}
+{% 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 %}
+ {% endif %}
+
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/author-bio.ninjatpl b/templates/overrides/cyberpunk/author-bio.ninjatpl
new file mode 100644
index 0000000..d149bc2
--- /dev/null
+++ b/templates/overrides/cyberpunk/author-bio.ninjatpl
@@ -0,0 +1,13 @@
+{# author-bio (cyberpunk override) — byline card sourced from the `post` provider's author_* fields. #}
+{% if post.author_name %}
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/blog-hero.ninjatpl b/templates/overrides/cyberpunk/blog-hero.ninjatpl
new file mode 100644
index 0000000..b4578be
--- /dev/null
+++ b/templates/overrides/cyberpunk/blog-hero.ninjatpl
@@ -0,0 +1,24 @@
+{# blog-hero (cyberpunk override) — blog-index header + featured posts from the `posts` provider. #}
+
+
+
+
+{% if title %} {{ title }}{% endif %}
+{% if subtitle %} {{ subtitle }} {% endif %}
+
+{% if posts %}
+
+{% endif %}
+
+
diff --git a/templates/overrides/cyberpunk/breadcrumbs.ninjatpl b/templates/overrides/cyberpunk/breadcrumbs.ninjatpl
new file mode 100644
index 0000000..2fade5c
--- /dev/null
+++ b/templates/overrides/cyberpunk/breadcrumbs.ninjatpl
@@ -0,0 +1,15 @@
+{# breadcrumbs (cyberpunk override) — trail from the `breadcrumbs` provider (page ancestry). #}
+{# showHome prepends a Home link; separator is text ("/") for default or a chevron #}
+{# for the arrows template. The trailing is_current item renders as plain text. #}
+{% set arrows = template == "arrows" %}
+
diff --git a/templates/overrides/cyberpunk/button.ninjatpl b/templates/overrides/cyberpunk/button.ninjatpl
index 9863560..29d281a 100644
--- a/templates/overrides/cyberpunk/button.ninjatpl
+++ b/templates/overrides/cyberpunk/button.ninjatpl
@@ -1 +1,2 @@
-{% if variant == "secondary" %}{{ label|default:'Button' }} _{% elif variant == "ghost" %}{{ label|default:'Button' }} _{% else %}{{ label|default:'Button' }} _{% endif %}
+{# cyberpunk button — keep {% button %} tag intact; cyberpunk chrome on hugging wrapper #}
+{% with align=align|default:"left" %}{% if newTab %}{% button style|default:"primary" text=label|default:"Learn more" href=link|default:"#" size=size|default:"md" icon=icon|default:"" icon_position=iconPosition|default:"left" target="_blank" %}{% else %}{% button style|default:"primary" text=label|default:"Learn more" href=link|default:"#" size=size|default:"md" icon=icon|default:"" icon_position=iconPosition|default:"left" %}{% endif %} {% endwith %}
diff --git a/templates/overrides/cyberpunk/card.ninjatpl b/templates/overrides/cyberpunk/card.ninjatpl
index 44af74e..680ec77 100644
--- a/templates/overrides/cyberpunk/card.ninjatpl
+++ b/templates/overrides/cyberpunk/card.ninjatpl
@@ -1 +1,2 @@
-{% if href %}{% if media %} {% endif %}{% if title %}{{ title }}{% endif %}{% if body %}{{ body|safe }} {% endif %}{% else %}{% if media %} {% endif %}{% if title %}{{ title }}{% endif %}{% if body %}{{ body|safe }} {% endif %}{% endif %}
+{# cyberpunk 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 %}
diff --git a/templates/overrides/cyberpunk/category-list.ninjatpl b/templates/overrides/cyberpunk/category-list.ninjatpl
new file mode 100644
index 0000000..86e0893
--- /dev/null
+++ b/templates/overrides/cyberpunk/category-list.ninjatpl
@@ -0,0 +1,18 @@
+{# category-list (cyberpunk override) — from the `categories` provider. list or pills. #}
+{% set pills = style == "pills" %}
+
+{% if heading %}{{ heading }}{% endif %}
+{% if pills %}
+
+{% else %}
+
+{% endif %}
+
diff --git a/templates/overrides/cyberpunk/contact-card.ninjatpl b/templates/overrides/cyberpunk/contact-card.ninjatpl
new file mode 100644
index 0000000..be0d7b3
--- /dev/null
+++ b/templates/overrides/cyberpunk/contact-card.ninjatpl
@@ -0,0 +1,18 @@
+{# contact-card cyberpunk override: neon channel panels. All field reads + control flow preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if description %} {{ description }} {% endif %}
+
+ {% for channel in channels %}
+
+ {% if channel.icon %} {% endif %}
+
+ {% if channel.label %} {{ channel.label }} {% endif %}
+ {% if channel.value %} {% endif %}
+
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/contact-form.ninjatpl b/templates/overrides/cyberpunk/contact-form.ninjatpl
new file mode 100644
index 0000000..d5fb7fe
--- /dev/null
+++ b/templates/overrides/cyberpunk/contact-form.ninjatpl
@@ -0,0 +1,40 @@
+{# contact-form cyberpunk override: terminal console chrome. The {% form %} block, honeypot, field loop, form.submitted/errors reads and _block_id/bid submit wiring are preserved byte-for-byte — only presentational classes change. #}
+{% with bid=_block_id|default:context.blockId %}
+
+
+ {% if form.submitted %}
+
+
+ {{ form.message|default:successMessage|default:"Thanks — your message has been sent." }}
+
+ {% else %}
+ {% if heading %} {{ heading }}{% endif %}
+ {% if description %} {{ description }} {% endif %}
+ {% if form.errors._form %} {{ form.errors._form }} {% endif %}
+ {% with formAction="/api/blocks/"|add:bid|add:"/submit" formTarget="#contact-form-"|add:bid %}
+ {% form action=formAction hx_target=formTarget hx_swap="outerHTML" class="mt-8 grid grid-cols-1 gap-5 sm:grid-cols-2" %}
+ {% for field in fields %}
+
+ {% if field.label %}{% endif %}
+ {% if field.type == "textarea" %}
+
+ {% elif field.type == "select" %}
+
+ {% else %}
+
+ {% endif %}
+
+ {% endfor %}
+
+
+
+
+ {% endform %}
+ {% endwith %}
+ {% endif %}
+
+
+{% endwith %}
diff --git a/templates/overrides/cyberpunk/countdown.ninjatpl b/templates/overrides/cyberpunk/countdown.ninjatpl
new file mode 100644
index 0000000..0b2719f
--- /dev/null
+++ b/templates/overrides/cyberpunk/countdown.ninjatpl
@@ -0,0 +1,50 @@
+{# countdown cyberpunk override: neon HUD digit boxes, glitch heading. Timer script + data attributes preserved byte-for-byte. #}
+
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+
+ --{{ labelDays|default:"Days" }}
+ --{{ labelHours|default:"Hours" }}
+ --{{ labelMinutes|default:"Minutes" }}
+ --{{ labelSeconds|default:"Seconds" }}
+
+
+ {{ expiredMessage|default:"This has started." }}
+ {% if expiredUrl and expiredLabel %} {{ expiredLabel }}{% endif %}
+
+
+
+
+
+
diff --git a/templates/overrides/cyberpunk/cta.ninjatpl b/templates/overrides/cyberpunk/cta.ninjatpl
new file mode 100644
index 0000000..6ef2c14
--- /dev/null
+++ b/templates/overrides/cyberpunk/cta.ninjatpl
@@ -0,0 +1,16 @@
+{# cta cyberpunk override: scanline overlay, glitch heading, clip-cut rgb-split CTAs. All field reads preserved. #}
+
+
+
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if text %} {{ text }} {% endif %}
+
+
+
+
+
diff --git a/templates/overrides/cyberpunk/divider.ninjatpl b/templates/overrides/cyberpunk/divider.ninjatpl
new file mode 100644
index 0000000..649c84c
--- /dev/null
+++ b/templates/overrides/cyberpunk/divider.ninjatpl
@@ -0,0 +1,2 @@
+{# cyberpunk divider — neon gradient rule / primary-tinted variants #}
+{% with variant=variant|default:"line" weight=weight|default:"thin" width=width|default:"full" %}{% if variant == "ornament" %}::{{ icon|default:"lucide:asterisk" }}:md text-primary:: {% elif variant == "spacer-rule" %} {% else %} {% endif %}{% endwith %}
diff --git a/templates/overrides/cyberpunk/event-list.ninjatpl b/templates/overrides/cyberpunk/event-list.ninjatpl
new file mode 100644
index 0000000..01c4ded
--- /dev/null
+++ b/templates/overrides/cyberpunk/event-list.ninjatpl
@@ -0,0 +1,41 @@
+{# event-list cyberpunk override: neon cards, mono datetime. All field reads + control flow preserved. #}
+
+
+ {% 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 %}
+
+ {% if event.timezone %} {{ event.timezone }}{% endif %}
+ {{ event.title }}
+ {% if event.venue %} {{ event.venue }} {% endif %}
+ {% if event.description %} {{ event.description }} {% endif %}
+ {% if event.link %} {{ event.linkLabel|default:"Details" }}{% endif %}
+
+
+ {% endif %}{% endfor %}
+
+ {% else %}
+
+ {% for event in events %}{% if not (hidePast and event.past) %}
+ -
+
+
+ {% if event.end %} to {{ event.end }} {% endif %}
+ {% if event.timezone %} {{ event.timezone }} {% endif %}
+
+
+ {{ event.title }}
+ {% if event.venue %} {{ event.venue }} {% endif %}
+ {% if event.description %} {{ event.description }} {% endif %}
+
+ {% if event.link %}{{ event.linkLabel|default:"Details" }}{% endif %}
+
+ {% endif %}{% endfor %}
+
+ {% endif %}
+
+
diff --git a/templates/overrides/cyberpunk/faq.ninjatpl b/templates/overrides/cyberpunk/faq.ninjatpl
new file mode 100644
index 0000000..8b90ef6
--- /dev/null
+++ b/templates/overrides/cyberpunk/faq.ninjatpl
@@ -0,0 +1,18 @@
+{# faq cyberpunk override: glitch heading, neon-tinted dividers, display questions. Chevron svg, {% for %}, and answer prose preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for item in items %}
+
+
+ {{ item.question }}
+
+
+ {{ item.answer|safe }}
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/feature-grid.ninjatpl b/templates/overrides/cyberpunk/feature-grid.ninjatpl
new file mode 100644
index 0000000..3a16038
--- /dev/null
+++ b/templates/overrides/cyberpunk/feature-grid.ninjatpl
@@ -0,0 +1,19 @@
+{# feature_grid cyberpunk override: scanline hero overlay, mono eyebrow, glitch heading, neon HUD cards. All field reads + control flow preserved. #}
+
+
+
+ {% if eyebrow %} {{ eyebrow }} {% endif %}
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for item in items %}
+
+ {% 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 %}
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/featured-posts.ninjatpl b/templates/overrides/cyberpunk/featured-posts.ninjatpl
new file mode 100644
index 0000000..efd5af9
--- /dev/null
+++ b/templates/overrides/cyberpunk/featured-posts.ninjatpl
@@ -0,0 +1,23 @@
+{# featured-posts (cyberpunk override) — grid of cards from the `posts` provider #}
+{# (params: limit, featured=true). Neon HUD card: image, title, excerpt, meta. #}
+
+
+{% if heading %} {{ heading }}{% endif %}
+
+
+
diff --git a/templates/overrides/cyberpunk/footer.ninjatpl b/templates/overrides/cyberpunk/footer.ninjatpl
new file mode 100644
index 0000000..1fd7a77
--- /dev/null
+++ b/templates/overrides/cyberpunk/footer.ninjatpl
@@ -0,0 +1,39 @@
+{# footer (WO-TF-006): layouts columns|minimal|centered; menu columns, legal bar, and social row from the `footer_menus` provider; newsletter section reuses the {% signup_form %} core (no duplicated form). Cyberpunk override: mono column headers, neon top rule, display wordmark. #}
+{% set fl = layout %}
+{% if not fl %}{% if template == "centered" %}{% set fl = "centered" %}{% else %}{% set fl = "columns" %}{% endif %}{% endif %}
+{% set fbg = backgroundColor|default:"bg-muted/50" %}
+{% macro sociallinks(cls) %}{% if social_items %}{% endif %}{% endmacro %}
+{% macro newsletter() %}{% if showNewsletter %}{{ newsletterTitle|default:"Stay in the loop" }}{% if newsletterDescription %} {{ newsletterDescription }} {% endif %} {% signup_form list=newsletterListSlug|default:"main" source="footer" submit=newsletterButtonText|default:"Subscribe" %} {% endif %}{% endmacro %}
+{% macro legalbar() %}{% if copyright %}© {{ copyright }}{% else %}© {{ companyName }}{% endif %} {% if legal_items %} {% endif %} {% endmacro %}
+
diff --git a/templates/overrides/cyberpunk/gallery.ninjatpl b/templates/overrides/cyberpunk/gallery.ninjatpl
new file mode 100644
index 0000000..75b2f61
--- /dev/null
+++ b/templates/overrides/cyberpunk/gallery.ninjatpl
@@ -0,0 +1,52 @@
+{# 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 %}{% endif %}{% endwith %}
diff --git a/templates/overrides/cyberpunk/heading.ninjatpl b/templates/overrides/cyberpunk/heading.ninjatpl
index ad837c4..7e5640a 100644
--- a/templates/overrides/cyberpunk/heading.ninjatpl
+++ b/templates/overrides/cyberpunk/heading.ninjatpl
@@ -1 +1,7 @@
-{% if level|integer == 1 %}{{ text }}{% elif level|integer == 2 %}{{ text }}{% elif level|integer == 3 %}{{ text }}{% elif level|integer == 4 %}{{ text }}{% elif level|integer == 5 %}{{ text }}{% elif level|integer == 6 %}{{ text }}{% else %}{{ text }}{% endif %}
+{# cyberpunk heading — cyberpunk-display everywhere; glitch on h1/h2 only #}
+{% if level == 1 %}{{ text }}
+{% elif level == 3 %}{{ text }}
+{% elif level == 4 %}{{ text }}
+{% elif level == 5 %}{{ text }}
+{% elif level == 6 %}{{ text }}
+{% else %}{{ text }}{% endif %}
diff --git a/templates/overrides/cyberpunk/hero.ninjatpl b/templates/overrides/cyberpunk/hero.ninjatpl
new file mode 100644
index 0000000..32c2bff
--- /dev/null
+++ b/templates/overrides/cyberpunk/hero.ninjatpl
@@ -0,0 +1,95 @@
+{# hero cyberpunk override (GO-BIG showpiece): canvas digital-rain background, glitch headline, scanline overlay. All builtin field reads + macro + branch structure preserved. The rain shows when there is no backgroundImage; it lazy-inits on view, honors prefers-reduced-motion, degrades to a static neon gradient with JS off, and is dependency-free. #}
+{% 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 pText = ctaPrimary.text %}
+{% set pUrl = ctaPrimary.url %}
+{% set sText = ctaSecondary.text %}
+{% set sUrl = ctaSecondary.url %}
+{% set variant = template|default:"centered" %}
+{% set hasImage = backgroundImage %}
+{% set showOverlay = hasImage and overlayColor != "none" and overlayColor != "" %}
+{% macro herocontent(align) %}
+{% if eyebrowText %}{{ eyebrowText }} _{% endif %}
+{% if headlineText %}{{ headlineText }}{% endif %}
+{% if subText %}{{ subText }}{% endif %}
+{% if descText %}{{ descText }} {% endif %}
+{% if pText or sText %}{% endif %}
+{% if trustLogos %}{% endif %}
+{% endmacro %}
+{% if variant == "split" %}
+
+{% else %}
+{% set align = "center" %}
+{% if variant == "left-aligned" %}{% set align = "left" %}{% endif %}
+
+{% 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/cyberpunk/hours-location.ninjatpl b/templates/overrides/cyberpunk/hours-location.ninjatpl
new file mode 100644
index 0000000..1454d11
--- /dev/null
+++ b/templates/overrides/cyberpunk/hours-location.ninjatpl
@@ -0,0 +1,31 @@
+{# hours-location cyberpunk override: mono readout table, neon map panel. Map lazy-load button + inline handler preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+
+
+ {% if hours %}
+
+
+ {% for row in hours %}
+
+ | {{ row.day }} |
+ {% if row.closed %}Closed{% else %}{{ row.hours }}{% endif %} |
+
+ {% endfor %}
+
+
+ {% endif %}
+ {% if specialHoursNote %} {{ specialHoursNote }} {% endif %}
+ {% if address %} {% endif %}
+ {% if phone %} {% endif %}
+ {% if directionsUrl %} Get directions{% endif %}
+
+ {% if mapEmbedUrl %}
+
+
+
+ {% endif %}
+
+
+
diff --git a/templates/overrides/cyberpunk/image.ninjatpl b/templates/overrides/cyberpunk/image.ninjatpl
new file mode 100644
index 0000000..5514639
--- /dev/null
+++ b/templates/overrides/cyberpunk/image.ninjatpl
@@ -0,0 +1,2 @@
+{# cyberpunk image — cyan neon-edge frame, mono caption; all size/fit branches preserved #}
+{% with size=size|default:"full" align=align|default:"center" aspectRatio=aspectRatio|default:"auto" objectFit=objectFit|default:"cover" rounded=rounded|default:"lg" shadow=shadow|default:"none" %}{% 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 %} {% if caption %}{{ caption }}{% endif %}{% endwith %}
diff --git a/templates/overrides/cyberpunk/logo-strip.ninjatpl b/templates/overrides/cyberpunk/logo-strip.ninjatpl
new file mode 100644
index 0000000..99f79bd
--- /dev/null
+++ b/templates/overrides/cyberpunk/logo-strip.ninjatpl
@@ -0,0 +1,16 @@
+{# logo_strip cyberpunk override: mono kicker. Marquee classes, {% img %}, and keyframes {% endif %}
diff --git a/templates/overrides/cyberpunk/menu-list.ninjatpl b/templates/overrides/cyberpunk/menu-list.ninjatpl
new file mode 100644
index 0000000..a9aa3ca
--- /dev/null
+++ b/templates/overrides/cyberpunk/menu-list.ninjatpl
@@ -0,0 +1,30 @@
+{# menu-list cyberpunk override: mono price readouts, neon section rules. All field reads + control flow preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for section in sections %}
+
+ {% endfor %}
+
+ {% if footnote %} {{ footnote }} {% endif %}
+
+
diff --git a/templates/overrides/cyberpunk/navbar.ninjatpl b/templates/overrides/cyberpunk/navbar.ninjatpl
new file mode 100644
index 0000000..5afa813
--- /dev/null
+++ b/templates/overrides/cyberpunk/navbar.ninjatpl
@@ -0,0 +1,104 @@
+{# navbar (WO-TF-005): variants standard|centered-logo|split|transparent-over-hero; sticky none|sticky|shrink-on-scroll; dependency-free off-canvas drawer (pure-CSS baseline + progressive-JS focus-trap/Escape/scroll-lock); menu data from the `menus` provider. Cyberpunk override: mono nav links, neon dropdown panels, clip-cut CTA — drawer ids/style/script/data-bn-* preserved byte-for-byte. #}
+{% set nv = variant %}
+{% if not nv %}{% if template == "centered" %}{% set nv = "centered-logo" %}{% elif template == "transparent" %}{% set nv = "transparent-over-hero" %}{% else %}{% set nv = "standard" %}{% endif %}{% endif %}
+{% set sb = stickyBehavior %}
+{% if not sb %}{% if sticky %}{% set sb = "sticky" %}{% else %}{% set sb = "none" %}{% endif %}{% endif %}
+{% set use_mega = megaMenu or template == "mega" %}
+{% set is_transparent = nv == "transparent-over-hero" %}
+{% set cta_text = cta.text|default:ctaLabel %}
+{% set cta_url = cta.url|default:ctaUrl %}
+{% set bg = backgroundColor|default:"bg-background" %}
+{% macro navlink(item) %}{{ item.label }}{% endmacro %}
+{% macro dropdown(item) %}
+
+{% if use_mega %} {% for child in item.children %} {% endfor %}
+{% else %} {% for child in item.children %}{% if child.item_type == "header" %} {{ child.label }} {% else %} {{ child.label }}{% endif %}{% endfor %} {% endif %}
+ {% endmacro %}
+{% macro brand(size) %}{% if logoType == "text" and logoText.text %}{{ logoText.text }}{% elif logo %} {% elif companyName %}{{ companyName }}{% endif %}{% endmacro %}
+{% macro ctabtn(extra) %}{% if cta_text %}{% endif %}{% endmacro %}
+
+
+
diff --git a/templates/overrides/cyberpunk/newsletter-signup.ninjatpl b/templates/overrides/cyberpunk/newsletter-signup.ninjatpl
new file mode 100644
index 0000000..28d5dc8
--- /dev/null
+++ b/templates/overrides/cyberpunk/newsletter-signup.ninjatpl
@@ -0,0 +1,12 @@
+{# newsletter-signup (cyberpunk override) — the {% signup_form %} tag carries the #}
+{# untouchable subscribe wiring (/api/lists/subscribe HTMX post + honeypot); #}
+{# this template supplies only the cyberpunk chrome around it. #}
+
+
+
+{% 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/cyberpunk/page-suggestions.ninjatpl b/templates/overrides/cyberpunk/page-suggestions.ninjatpl
new file mode 100644
index 0000000..a46366b
--- /dev/null
+++ b/templates/overrides/cyberpunk/page-suggestions.ninjatpl
@@ -0,0 +1,13 @@
+{# page-suggestions cyberpunk override — themed 404. NOTE: the builtin builds its "did you mean" list from a Postgres full-text query (SearchSimilarPages), which a codeless template cannot run — so this override renders the on-theme 404 console (title / message / requested path / home CTA) without the dynamic suggestion list. Recorded as a known deviation in WO-TF-015. Content fields honored: title, emptyMessage. #}
+
+
+
+ Error 404 _
+ {{ title|default:"Signal lost" }}
+ {{ emptyMessage|default:"That route returned nothing. The page moved, shipped, or never existed." }}
+ {% if context.path %} requested: {{ context.path }} {% endif %}
+
+
+
diff --git a/templates/overrides/cyberpunk/password-reset-form.ninjatpl b/templates/overrides/cyberpunk/password-reset-form.ninjatpl
new file mode 100644
index 0000000..dff8822
--- /dev/null
+++ b/templates/overrides/cyberpunk/password-reset-form.ninjatpl
@@ -0,0 +1,13 @@
+{# password-reset-form cyberpunk override — reproduces the builtin's hardcoded wiring: hx-post /api/auth/request-password-reset (target #reset-message), back-to-login link /login. Only the chrome is themed. #}
+
+
+
+ Reset Password
+ Enter your email address and we will send you a link to reset your password.
+
+ Back to login
+
+
diff --git a/templates/overrides/cyberpunk/popular-posts.ninjatpl b/templates/overrides/cyberpunk/popular-posts.ninjatpl
new file mode 100644
index 0000000..1f21c33
--- /dev/null
+++ b/templates/overrides/cyberpunk/popular-posts.ninjatpl
@@ -0,0 +1,16 @@
+{# popular-posts (cyberpunk override) — compact ranked list from the `posts` provider. #}
+
+{% if heading %}{{ heading }}{% endif %}
+
+{% for post in posts %}
+-
+{% if showRank %}{{ forloop.Counter }}{% endif %}
+{% if showThumbnail and post.featured_image_url %}{% img post.featured_image_url alt=post.title class="h-full w-full object-cover" %}{% endif %}
+
+
+{% if post.published_at %} {{ post.published_at|date:"M j, Y" }} {% endif %}
+
+
+{% endfor %}
+
+
diff --git a/templates/overrides/cyberpunk/post-hero.ninjatpl b/templates/overrides/cyberpunk/post-hero.ninjatpl
new file mode 100644
index 0000000..3d720a9
--- /dev/null
+++ b/templates/overrides/cyberpunk/post-hero.ninjatpl
@@ -0,0 +1,23 @@
+{# post-hero (cyberpunk override) — current post from the `post` provider. When the post #}
+{# has a featured image it becomes an overlaid banner; otherwise a clean text hero. #}
+{% set center = align != "left" %}
+{% if post.featured_image_url %}
+
+{% img post.featured_image_url alt=post.featured_image_alt class="h-full w-full object-cover" layout="hero" %}
+
+
+ {{ post.title }}
+{% if showExcerpt and post.excerpt %} {{ post.excerpt }} {% endif %}
+{% if showMeta %} {% if post.author_name %}{{ post.author_name }}{% endif %}{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}{% if post.reading_time %}{{ post.reading_time }} min read{% endif %} {% endif %}
+
+
+{% else %}
+
+
+
+ {{ post.title }}
+{% if showExcerpt and post.excerpt %} {{ post.excerpt }} {% endif %}
+{% if showMeta %} {% if post.author_name %}{{ post.author_name }}{% endif %}{% if post.published_at %}{{ post.published_at|date:"F j, Y" }}{% endif %}{% if post.reading_time %}{{ post.reading_time }} min read{% endif %} {% endif %}
+
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/post-metadata.ninjatpl b/templates/overrides/cyberpunk/post-metadata.ninjatpl
new file mode 100644
index 0000000..7da423b
--- /dev/null
+++ b/templates/overrides/cyberpunk/post-metadata.ninjatpl
@@ -0,0 +1,9 @@
+{# post-metadata (cyberpunk override) — author/date/reading-time row from the `post` provider. #}
+{% if post %}
+
+{% if showAuthor and post.author_name %} {% if showAvatar and post.author_avatar %}{% img post.author_avatar alt=post.author_name class="h-7 w-7 rounded-full border border-primary/40 object-cover" %}{% endif %}{{ post.author_name }}{% endif %}
+{% if showDate and post.published_at %} {% endif %}
+{% if showReadingTime and post.reading_time %} {{ post.reading_time }} min read{% endif %}
+{% if post.categories %} {% for cat in post.categories %}{{ cat.name }}{% endfor %}{% endif %}
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/pricing.ninjatpl b/templates/overrides/cyberpunk/pricing.ninjatpl
new file mode 100644
index 0000000..c722830
--- /dev/null
+++ b/templates/overrides/cyberpunk/pricing.ninjatpl
@@ -0,0 +1,26 @@
+{# pricing cyberpunk override: scanline overlay, glitch heading, HUD neon tier panels (magenta highlight / cyan standard), clip-cut CTAs. Field reads + control flow preserved. #}
+
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for tier in tiers %}
+
+ {% if tier.badge %} {{ tier.badge }}{% endif %}
+ {{ tier.name }}
+
+ {% if currency %}{{ currency }}{% else %}${% endif %}{{ tier.price }}
+ {% if tier.period %}{{ tier.period }}{% endif %}
+
+ {% if tier.description %} {{ tier.description }} {% endif %}
+ {% if tier.features %}
+ {% for feature in tier.features %}- {{ feature }}
{% endfor %}
+ {% endif %}
+ {% if tier.ctaUrl and tier.ctaLabel %} {{ tier.ctaLabel }}{% endif %}
+
+ {% endfor %}
+
+ {% if billingNote %} {{ billingNote }} {% endif %}
+
+
diff --git a/templates/overrides/cyberpunk/quote.ninjatpl b/templates/overrides/cyberpunk/quote.ninjatpl
new file mode 100644
index 0000000..767f83e
--- /dev/null
+++ b/templates/overrides/cyberpunk/quote.ninjatpl
@@ -0,0 +1,2 @@
+{# cyberpunk quote — dashed neon left border; cyberpunk-display for pull; mono figcaption #}
+{% with style=style|default:"block" align=align|default:"left" %}{{ quote|safe }} {% if attribution or role or cite %}{% if attribution %}{{ attribution }}{% endif %}{% if role %}{{ role }}{% endif %}{% if cite %}Source{% endif %}{% endif %}{% endwith %}
diff --git a/templates/overrides/cyberpunk/related-posts.ninjatpl b/templates/overrides/cyberpunk/related-posts.ninjatpl
new file mode 100644
index 0000000..c15df8c
--- /dev/null
+++ b/templates/overrides/cyberpunk/related-posts.ninjatpl
@@ -0,0 +1,17 @@
+{# related-posts (cyberpunk override) — grid from the `posts` provider. #}
+{% if posts %}
+
+
+ {{ heading|default:"Related posts" }}
+
+
+
+{% endif %}
diff --git a/templates/overrides/cyberpunk/rich-section.ninjatpl b/templates/overrides/cyberpunk/rich-section.ninjatpl
new file mode 100644
index 0000000..bb76fb8
--- /dev/null
+++ b/templates/overrides/cyberpunk/rich-section.ninjatpl
@@ -0,0 +1,14 @@
+{# rich_section cyberpunk override: mono eyebrow, glitch heading, HUD-framed media, clip-cut CTA. Field reads + {% img %} preserved. #}
+
diff --git a/templates/overrides/cyberpunk/rich-text.ninjatpl b/templates/overrides/cyberpunk/rich-text.ninjatpl
new file mode 100644
index 0000000..b7b7847
--- /dev/null
+++ b/templates/overrides/cyberpunk/rich-text.ninjatpl
@@ -0,0 +1,2 @@
+{# cyberpunk rich-text — body font via cyberpunk-prose #}
+{% if html %}{{ html|safe }}{% endif %}
diff --git a/templates/overrides/cyberpunk/sidebar-nav.ninjatpl b/templates/overrides/cyberpunk/sidebar-nav.ninjatpl
new file mode 100644
index 0000000..c1e3f36
--- /dev/null
+++ b/templates/overrides/cyberpunk/sidebar-nav.ninjatpl
@@ -0,0 +1,15 @@
+{# sidebar-nav (cyberpunk override) — vertical menu from the `menus` provider. Variants #}
+{# default | compact. highlight-current carried as a progressive-enhancement #}
+{# script keyed on data-bn-sidebar-link (marks the anchor matching location.pathname). #}
+{% set compact = template == "compact" %}
+
+{% if title %}{{ title }}{% endif %}
+
+
+{% if highlightCurrent %}{% endif %}
diff --git a/templates/overrides/cyberpunk/social-links.ninjatpl b/templates/overrides/cyberpunk/social-links.ninjatpl
new file mode 100644
index 0000000..ada49e8
--- /dev/null
+++ b/templates/overrides/cyberpunk/social-links.ninjatpl
@@ -0,0 +1,14 @@
+{# cyberpunk social-links — mono label, sharp neon-bordered chips; icon sprites preserved #}
+
+ {% if heading %} {{ heading }} {% endif %}
+
+
diff --git a/templates/overrides/cyberpunk/stats.ninjatpl b/templates/overrides/cyberpunk/stats.ninjatpl
new file mode 100644
index 0000000..256c0c6
--- /dev/null
+++ b/templates/overrides/cyberpunk/stats.ninjatpl
@@ -0,0 +1,50 @@
+{# stats cyberpunk override: scanline overlay, glitch heading, HUD stat tiles, mono labels. data-stats + countUp script/attrs preserved byte-for-byte. #}
+
+
+
+ {% 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 %}
+ {% if item.label %}- {{ item.label }}
{% endif %}
+
+ {% endfor %}
+
+
+
+{% if countUp %}{% endif %}
diff --git a/templates/overrides/cyberpunk/team.ninjatpl b/templates/overrides/cyberpunk/team.ninjatpl
new file mode 100644
index 0000000..d270185
--- /dev/null
+++ b/templates/overrides/cyberpunk/team.ninjatpl
@@ -0,0 +1,22 @@
+{# team cyberpunk override: glitch heading, dashed-neon HUD member panels (lime), mono roles. {% img %} + social icon svgs + control flow preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for member in members %}
+
+ {% if member.photo %} {% img member.photo alt=member.name class="h-full w-full object-cover" %}{% endif %}
+
+ {% if member.name %} {{ member.name }}{% endif %}
+ {% 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 %}
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/testimonial.ninjatpl b/templates/overrides/cyberpunk/testimonial.ninjatpl
new file mode 100644
index 0000000..fa01a49
--- /dev/null
+++ b/templates/overrides/cyberpunk/testimonial.ninjatpl
@@ -0,0 +1,27 @@
+{# testimonial cyberpunk override: glitch heading, dashed-neon HUD quote cards. Rating svgs, {% img %}, and control flow preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+
+ {% for q in quotes %}
+
+ {% if q.rating %}
+
+
+
+
+
+ {% endif %}
+ {% if q.quote %}“{{ q.quote }}”{% endif %}
+
+ {% if q.avatar %}{% img q.avatar alt=q.name class="h-full w-full object-cover" %}{% endif %}
+
+ {% if q.name %}{{ q.name }}{% endif %}
+ {% if q.role %}{{ q.role }}{% endif %}
+
+
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/text.ninjatpl b/templates/overrides/cyberpunk/text.ninjatpl
index e897a38..42b9406 100644
--- a/templates/overrides/cyberpunk/text.ninjatpl
+++ b/templates/overrides/cyberpunk/text.ninjatpl
@@ -1 +1,2 @@
-{{ text|safe }}
+{# cyberpunk text — body font via cyberpunk-prose #}
+{{ text|safe }}
diff --git a/templates/overrides/cyberpunk/timeline.ninjatpl b/templates/overrides/cyberpunk/timeline.ninjatpl
new file mode 100644
index 0000000..01b6065
--- /dev/null
+++ b/templates/overrides/cyberpunk/timeline.ninjatpl
@@ -0,0 +1,22 @@
+{# timeline cyberpunk override: glitch heading, mono step labels, neon markers. All field reads + control flow preserved. #}
+
+
+ {% if heading %} {{ heading }}{% endif %}
+ {% if intro %} {{ intro }} {% endif %}
+
+ {% for step in steps %}
+ -
+
+ {% if marker == "numbered" %}{{ forloop.counter }}{% elif marker == "dot" %}{% else %}{% endif %}
+
+
+ {% if step.label %} {{ step.label }} {% endif %}
+ {% if step.title %} {{ step.title }}{% endif %}
+ {% if step.text %} {{ step.text }} {% endif %}
+ {% if step.media %} {% img step.media alt=step.title class="w-full h-auto object-cover" %} {% endif %}
+
+
+ {% endfor %}
+
+
+
diff --git a/templates/overrides/cyberpunk/utility-bar.ninjatpl b/templates/overrides/cyberpunk/utility-bar.ninjatpl
new file mode 100644
index 0000000..6154011
--- /dev/null
+++ b/templates/overrides/cyberpunk/utility-bar.ninjatpl
@@ -0,0 +1,10 @@
+{# 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. Cyberpunk 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 %}
+
+
+ {% for it in leftItems %}{{ ubitem(it) }}{% endfor %}
+ {% for it in rightItems %}{{ ubitem(it) }}{% endfor %}
+
+
diff --git a/templates/overrides/cyberpunk/video-embed.ninjatpl b/templates/overrides/cyberpunk/video-embed.ninjatpl
new file mode 100644
index 0000000..0a11ad1
--- /dev/null
+++ b/templates/overrides/cyberpunk/video-embed.ninjatpl
@@ -0,0 +1,23 @@
+{# video-embed cyberpunk 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 %}{% endwith %}
|