From 02a84ab31e9b414f6633703fadeafdc710a54de5 Mon Sep 17 00:00:00 2001 From: Alex Dunmow Date: Sun, 5 Jul 2026 10:57:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(cyberpunk):=20Wave=20A=20build=20=E2=80=94?= =?UTF-8?q?=2049=20builtin=20overrides,=207=20templates,=20canvas=20hero,?= =?UTF-8?q?=20seed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WO-TF-015 (game-studio / hacker-collective persona, GO-BIG motion). - Overrides: all 49 mandatory builtin keys in templates/overrides/cyberpunk/ (dashed keys), each restyled to neon-HUD chrome preserving builtin field reads + scripts. Legacy button/card/heading/text reconciled to new field names (label/link/style, text/media). Auth surface (auth-form, auth-status, password-reset-form) reproduces the builtin hardcoded HTMX endpoints + Cap widget verbatim. page-suggestions ships themed 404 chrome. - Page templates: 7 (default, full-width, landing, article, blog-index, contact, auth), dual-mode via theme_mode, scanline overlay chrome. - Hero override: dependency-free canvas digital-rain showpiece — lazy-init via IntersectionObserver, prefers-reduced-motion honored, static neon gradient no-JS fallback, token-derived colors only. - Blocks: deleted 6 builtin-duplicating theme blocks (now overrides); kept code_neon (+ copy handler); added persona blocks glitch_hero, roster_grid, patch_notes with schemas + sample data. - Presets: 5 (neon-noir, acid-rain, toxic-bloom, hotline, ghost-protocol), all 19 tokens, light+dark both tuned. - Fonts: bundled OFL woff2 (Orbitron, Share Tech Mono, Inter latin subsets) in assets/fonts + fonts.json + LICENSES; all font-family via CSS vars. - Email: preset-aware email-safe wrapper (tables, inline styles, colors.*). - Master pages + demo seed (home, about, blog+3 posts, contact with data-table + row_inserted email-admins workflow, login). - manifest CSS: hud-frame, clip-cut, cyberpunk-eyebrow, canvas-rain utils. - plugin.mod + manifest required_icon_packs = [lucide, simple-icons]. make build + verify exit 0; check-safety exit 0. Co-Authored-By: Claude Opus 4.8 --- RECOMMENDED_FONTS.md | 53 +-- RECOMMENDED_ICONS.md | 24 ++ assets/fonts/LICENSES.md | 21 ++ assets/fonts/inter-latin.woff2 | Bin 0 -> 48256 bytes assets/fonts/orbitron-latin.woff2 | Bin 0 -> 11800 bytes assets/fonts/share-tech-mono-latin.woff2 | Bin 0 -> 13500 bytes blocks/blocks.yaml | 64 ++-- blocks/code_neon.ninjatpl | 13 +- blocks/code_neon.sample.json | 5 + blocks/cta_terminal.ninjatpl | 1 - blocks/cta_terminal.schema.json | 34 -- blocks/feature_card_neon.ninjatpl | 1 - blocks/feature_card_neon.schema.json | 34 -- blocks/footer_grid.ninjatpl | 1 - blocks/footer_grid.schema.json | 52 --- blocks/glitch_hero.ninjatpl | 19 + blocks/glitch_hero.sample.json | 14 + blocks/glitch_hero.schema.json | 29 ++ blocks/hero_glitch.ninjatpl | 1 - blocks/hero_glitch.schema.json | 54 --- blocks/navbar_terminal.ninjatpl | 1 - blocks/navbar_terminal.schema.json | 29 -- blocks/patch_notes.ninjatpl | 21 ++ blocks/patch_notes.sample.json | 32 ++ blocks/patch_notes.schema.json | 37 ++ blocks/roster_grid.ninjatpl | 23 ++ blocks/roster_grid.sample.json | 13 + blocks/roster_grid.schema.json | 28 ++ blocks/stats_glow.ninjatpl | 1 - blocks/stats_glow.schema.json | 38 -- fonts.json | 29 +- manifest.yaml | 336 ++++++++++++------ master_pages.json | 35 +- plugin.mod | 1 + presets.json | 100 ++++++ seed/seed.json | 219 ++++++++++++ seed/workflows.json | 19 + templates/cyberpunk/article.ninjatpl | 11 +- templates/cyberpunk/auth.ninjatpl | 14 + templates/cyberpunk/blog-index.ninjatpl | 12 + templates/cyberpunk/contact.ninjatpl | 12 + templates/cyberpunk/default.ninjatpl | 6 +- templates/cyberpunk/full-width.ninjatpl | 6 +- templates/cyberpunk/landing.ninjatpl | 9 +- templates/email/cyberpunk.ninjatpl | 50 +-- .../cyberpunk/announcement-bar.ninjatpl | 21 ++ .../overrides/cyberpunk/audio-embed.ninjatpl | 16 + .../overrides/cyberpunk/auth-form.ninjatpl | 77 ++++ .../overrides/cyberpunk/auth-status.ninjatpl | 36 ++ .../cyberpunk/author-bio-hero.ninjatpl | 22 ++ .../overrides/cyberpunk/author-bio.ninjatpl | 13 + .../overrides/cyberpunk/blog-hero.ninjatpl | 24 ++ .../overrides/cyberpunk/breadcrumbs.ninjatpl | 15 + templates/overrides/cyberpunk/button.ninjatpl | 3 +- templates/overrides/cyberpunk/card.ninjatpl | 3 +- .../cyberpunk/category-list.ninjatpl | 18 + .../overrides/cyberpunk/contact-card.ninjatpl | 18 + .../overrides/cyberpunk/contact-form.ninjatpl | 40 +++ .../overrides/cyberpunk/countdown.ninjatpl | 50 +++ templates/overrides/cyberpunk/cta.ninjatpl | 16 + .../overrides/cyberpunk/divider.ninjatpl | 2 + .../overrides/cyberpunk/event-list.ninjatpl | 41 +++ templates/overrides/cyberpunk/faq.ninjatpl | 18 + .../overrides/cyberpunk/feature-grid.ninjatpl | 19 + .../cyberpunk/featured-posts.ninjatpl | 23 ++ templates/overrides/cyberpunk/footer.ninjatpl | 39 ++ .../overrides/cyberpunk/gallery.ninjatpl | 52 +++ .../overrides/cyberpunk/heading.ninjatpl | 8 +- templates/overrides/cyberpunk/hero.ninjatpl | 95 +++++ .../cyberpunk/hours-location.ninjatpl | 31 ++ templates/overrides/cyberpunk/image.ninjatpl | 2 + .../overrides/cyberpunk/logo-strip.ninjatpl | 16 + .../overrides/cyberpunk/menu-list.ninjatpl | 30 ++ templates/overrides/cyberpunk/navbar.ninjatpl | 104 ++++++ .../cyberpunk/newsletter-signup.ninjatpl | 12 + .../cyberpunk/page-suggestions.ninjatpl | 13 + .../cyberpunk/password-reset-form.ninjatpl | 13 + .../cyberpunk/popular-posts.ninjatpl | 16 + .../overrides/cyberpunk/post-hero.ninjatpl | 23 ++ .../cyberpunk/post-metadata.ninjatpl | 9 + .../overrides/cyberpunk/pricing.ninjatpl | 26 ++ templates/overrides/cyberpunk/quote.ninjatpl | 2 + .../cyberpunk/related-posts.ninjatpl | 17 + .../overrides/cyberpunk/rich-section.ninjatpl | 14 + .../overrides/cyberpunk/rich-text.ninjatpl | 2 + .../overrides/cyberpunk/sidebar-nav.ninjatpl | 15 + .../overrides/cyberpunk/social-links.ninjatpl | 14 + templates/overrides/cyberpunk/stats.ninjatpl | 50 +++ templates/overrides/cyberpunk/team.ninjatpl | 22 ++ .../overrides/cyberpunk/testimonial.ninjatpl | 27 ++ templates/overrides/cyberpunk/text.ninjatpl | 3 +- .../overrides/cyberpunk/timeline.ninjatpl | 22 ++ .../overrides/cyberpunk/utility-bar.ninjatpl | 10 + .../overrides/cyberpunk/video-embed.ninjatpl | 23 ++ 94 files changed, 2195 insertions(+), 492 deletions(-) create mode 100644 RECOMMENDED_ICONS.md create mode 100644 assets/fonts/LICENSES.md create mode 100644 assets/fonts/inter-latin.woff2 create mode 100644 assets/fonts/orbitron-latin.woff2 create mode 100644 assets/fonts/share-tech-mono-latin.woff2 create mode 100644 blocks/code_neon.sample.json delete mode 100644 blocks/cta_terminal.ninjatpl delete mode 100644 blocks/cta_terminal.schema.json delete mode 100644 blocks/feature_card_neon.ninjatpl delete mode 100644 blocks/feature_card_neon.schema.json delete mode 100644 blocks/footer_grid.ninjatpl delete mode 100644 blocks/footer_grid.schema.json create mode 100644 blocks/glitch_hero.ninjatpl create mode 100644 blocks/glitch_hero.sample.json create mode 100644 blocks/glitch_hero.schema.json delete mode 100644 blocks/hero_glitch.ninjatpl delete mode 100644 blocks/hero_glitch.schema.json delete mode 100644 blocks/navbar_terminal.ninjatpl delete mode 100644 blocks/navbar_terminal.schema.json create mode 100644 blocks/patch_notes.ninjatpl create mode 100644 blocks/patch_notes.sample.json create mode 100644 blocks/patch_notes.schema.json create mode 100644 blocks/roster_grid.ninjatpl create mode 100644 blocks/roster_grid.sample.json create mode 100644 blocks/roster_grid.schema.json delete mode 100644 blocks/stats_glow.ninjatpl delete mode 100644 blocks/stats_glow.schema.json create mode 100644 seed/seed.json create mode 100644 seed/workflows.json create mode 100644 templates/cyberpunk/auth.ninjatpl create mode 100644 templates/cyberpunk/blog-index.ninjatpl create mode 100644 templates/cyberpunk/contact.ninjatpl create mode 100644 templates/overrides/cyberpunk/announcement-bar.ninjatpl create mode 100644 templates/overrides/cyberpunk/audio-embed.ninjatpl create mode 100644 templates/overrides/cyberpunk/auth-form.ninjatpl create mode 100644 templates/overrides/cyberpunk/auth-status.ninjatpl create mode 100644 templates/overrides/cyberpunk/author-bio-hero.ninjatpl create mode 100644 templates/overrides/cyberpunk/author-bio.ninjatpl create mode 100644 templates/overrides/cyberpunk/blog-hero.ninjatpl create mode 100644 templates/overrides/cyberpunk/breadcrumbs.ninjatpl create mode 100644 templates/overrides/cyberpunk/category-list.ninjatpl create mode 100644 templates/overrides/cyberpunk/contact-card.ninjatpl create mode 100644 templates/overrides/cyberpunk/contact-form.ninjatpl create mode 100644 templates/overrides/cyberpunk/countdown.ninjatpl create mode 100644 templates/overrides/cyberpunk/cta.ninjatpl create mode 100644 templates/overrides/cyberpunk/divider.ninjatpl create mode 100644 templates/overrides/cyberpunk/event-list.ninjatpl create mode 100644 templates/overrides/cyberpunk/faq.ninjatpl create mode 100644 templates/overrides/cyberpunk/feature-grid.ninjatpl create mode 100644 templates/overrides/cyberpunk/featured-posts.ninjatpl create mode 100644 templates/overrides/cyberpunk/footer.ninjatpl create mode 100644 templates/overrides/cyberpunk/gallery.ninjatpl create mode 100644 templates/overrides/cyberpunk/hero.ninjatpl create mode 100644 templates/overrides/cyberpunk/hours-location.ninjatpl create mode 100644 templates/overrides/cyberpunk/image.ninjatpl create mode 100644 templates/overrides/cyberpunk/logo-strip.ninjatpl create mode 100644 templates/overrides/cyberpunk/menu-list.ninjatpl create mode 100644 templates/overrides/cyberpunk/navbar.ninjatpl create mode 100644 templates/overrides/cyberpunk/newsletter-signup.ninjatpl create mode 100644 templates/overrides/cyberpunk/page-suggestions.ninjatpl create mode 100644 templates/overrides/cyberpunk/password-reset-form.ninjatpl create mode 100644 templates/overrides/cyberpunk/popular-posts.ninjatpl create mode 100644 templates/overrides/cyberpunk/post-hero.ninjatpl create mode 100644 templates/overrides/cyberpunk/post-metadata.ninjatpl create mode 100644 templates/overrides/cyberpunk/pricing.ninjatpl create mode 100644 templates/overrides/cyberpunk/quote.ninjatpl create mode 100644 templates/overrides/cyberpunk/related-posts.ninjatpl create mode 100644 templates/overrides/cyberpunk/rich-section.ninjatpl create mode 100644 templates/overrides/cyberpunk/rich-text.ninjatpl create mode 100644 templates/overrides/cyberpunk/sidebar-nav.ninjatpl create mode 100644 templates/overrides/cyberpunk/social-links.ninjatpl create mode 100644 templates/overrides/cyberpunk/stats.ninjatpl create mode 100644 templates/overrides/cyberpunk/team.ninjatpl create mode 100644 templates/overrides/cyberpunk/testimonial.ninjatpl create mode 100644 templates/overrides/cyberpunk/timeline.ninjatpl create mode 100644 templates/overrides/cyberpunk/utility-bar.ninjatpl create mode 100644 templates/overrides/cyberpunk/video-embed.ninjatpl diff --git a/RECOMMENDED_FONTS.md b/RECOMMENDED_FONTS.md index 318404f..794a275 100644 --- a/RECOMMENDED_FONTS.md +++ b/RECOMMENDED_FONTS.md @@ -1,33 +1,40 @@ # Recommended fonts — Cyberpunk -This theme ships `fonts.json = []` per the wave-1 fonts policy -(`themes/docs/FONTS.md`). No `.woff2` files are bundled inside the `.so`. +This theme **bundles** three OFL (SIL Open Font License 1.1) latin-subset webfonts in +`assets/fonts/` and declares them in `fonts.json`. On install they become +`source=template` rows in the `fonts` table, so their `@font-face` declarations are +auto-emitted and they are selectable in the admin typography picker. No manual font setup +is required to get the intended look. -To get the intended aesthetic from spec §5, the site admin should add the -three families below from the Google Fonts picker in the typography panel. - -| Slot | Recommended | Source | One-line how-to | +| Slot | Bundled family | File | Fallback stack (before assignment) | |---|---|---|---| -| Heading (`--font-heading`) | Space Grotesk | `google:Space Grotesk` | Open the typography panel, pick **Space Grotesk** from the Google Fonts tab, assign to **Heading**. | -| Body (`--font-body`) | Inter | `google:Inter` | Open the typography panel, pick **Inter** from the Google Fonts tab, assign to **Body**. | -| Mono (`--font-mono`) | JetBrains Mono | `google:JetBrains Mono` | Open the typography panel, pick **JetBrains Mono** from the Google Fonts tab, assign to **Mono**. | +| Heading (`--font-heading`) | **Orbitron** | `fonts/orbitron-latin.woff2` | `"Orbitron", system-ui, -apple-system, "Segoe UI", sans-serif` | +| Mono (`--font-mono`) | **Share Tech Mono** | `fonts/share-tech-mono-latin.woff2` | `"Share Tech Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace` | +| Body (`--font-body`) | **Inter** | `fonts/inter-latin.woff2` | `"Inter", system-ui, -apple-system, "Segoe UI", sans-serif` | -## Fallback stacks +## How the theme consumes them -Before the admin picks anything, the theme falls back to the following stacks -(declared via the CSS variables in `assets/css/cyberpunk.css`): +Every `font-family` in the theme flows through a CSS variable with a bundled-family +fallback — nothing is hardcoded, so the admin picker always wins: -- `--font-heading` → `"Space Grotesk", system-ui, -apple-system, "Segoe UI", sans-serif` -- `--font-body` → `"Inter", system-ui, -apple-system, "Segoe UI", sans-serif` -- `--font-mono` → `"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace` +- `.cyberpunk-display` -> `var(--font-heading, "Orbitron", ...)` — display headings, glitch H1/H2. +- `.cyberpunk-mono` -> `var(--font-mono, "Share Tech Mono", ...)` — readouts, labels, prices, code. +- `.cyberpunk-body` / `.cyberpunk-prose` -> `var(--font-body, "Inter", ...)` — body copy. -These fallbacks intentionally lead with the same family the picker would -deliver, so the page already looks close to the intended aesthetic on systems -that happen to have the font installed. +## To assign (optional) -## Why not bundle them? +Open the typography panel and assign **Orbitron -> Heading**, **Share Tech Mono -> Mono**, +**Inter -> Body**. All three appear in the picker under the theme's bundled fonts. If you +prefer alternates, **Rajdhani** (OFL) is a lighter display alternative to Orbitron, and +**JetBrains Mono** (OFL) a more legible mono — both are in the curated Google Fonts tab. -All three are OFL-clean and could be bundled in a future pass. For wave 1 we -ship no `.woff2` to keep the `.so` small and to keep font management in the -hands of the site admin (overrides + uploads stay routed through the picker, -not the theme). +## Alternate direction + +The locked WO-TF-015 direction pairs Orbitron (display) with Share Tech Mono (readouts) +and Inter (body). Rajdhani may be swapped in for Orbitron where a condensed, less +geometric display face reads better at long headline lengths. + +## Licensing + +All three are OFL 1.1 and cleared for redistribution inside this artifact. Details and +attribution: `assets/fonts/LICENSES.md`. diff --git a/RECOMMENDED_ICONS.md b/RECOMMENDED_ICONS.md new file mode 100644 index 0000000..814fdf8 --- /dev/null +++ b/RECOMMENDED_ICONS.md @@ -0,0 +1,24 @@ +# Recommended icons — Cyberpunk + +Icons render through the CMS sprite pipeline: `` +(or the `::pack:name:size::` shorthand). The theme's overrides reference two bundled packs. + +## Required packs + +Declared in `plugin.mod` as `required_icon_packs = ["lucide", "simple-icons"]` +(forward-declared — the loader does not yet auto-install; install manually until it does). + +| Pack | Used for | Install | +|---|---|---| +| **lucide** | UI glyphs the builtin/override templates use: `arrow-right`, `check`, `chevron-down`, `chevron-left`, `chevron-right`, `x`, `star`, `flag`, `navigation`, `map-pin`, `download`, `play`, `asterisk`, `globe` | Ships bundled with the CMS — no action needed. | +| **simple-icons** | Author/social brand glyphs: `x` (Twitter), `linkedin`, `github` | Ships bundled with the CMS — no action needed. | + +Both packs ship bundled with the CMS, so a fresh instance renders every override icon with +no manual step. If you author blocks that reference other packs (e.g. `tabler`, `phosphor`), +install them from `/admin/icons` (Browse -> install -> enable) before activation. + +## Note + +Icon values in block content are stored as `"pack:name"` strings and split with +`|split:":"|first` / `|last`. Never inline raw SVG path data for content icons — that +bypasses the sprite system and the admin pack manager. diff --git a/assets/fonts/LICENSES.md b/assets/fonts/LICENSES.md new file mode 100644 index 0000000..7930f9c --- /dev/null +++ b/assets/fonts/LICENSES.md @@ -0,0 +1,21 @@ +# Bundled font licenses — Cyberpunk theme + +All three families are bundled as latin-subset `.woff2` and are licensed under the +SIL Open Font License 1.1 (OFL). Redistribution inside this theme artifact is permitted. + +| File | Family | License | Source | +|---|---|---|---| +| `orbitron-latin.woff2` | Orbitron (variable, wght 500–900) | OFL 1.1 | Google Fonts (fonts.gstatic.com, v35), latin subset | +| `share-tech-mono-latin.woff2` | Share Tech Mono (400) | OFL 1.1 | Google Fonts (fonts.gstatic.com, v16), latin subset | +| `inter-latin.woff2` | Inter (variable, wght 400–700) | OFL 1.1 | Google Fonts (fonts.gstatic.com, v20), latin subset | + +OFL 1.1 full text: https://openfontlicense.org + +- Orbitron © The Orbitron Project Authors (Matt McInerney). +- Share Tech Mono © Carrois Apostrophe. +- Inter © The Inter Project Authors (Rasmus Andersson). + +These are the Google-hosted latin subsets (Latin + Latin-1 punctuation), chosen to keep +the bundle small (~73 KB total). They cover English content; sites needing extended Latin, +Cyrillic, Greek, or Vietnamese glyphs should assign the full family from the admin Google +Fonts picker instead. diff --git a/assets/fonts/inter-latin.woff2 b/assets/fonts/inter-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d15208de03cd1ad7c5199f0a0ce915fe841e4722 GIT binary patch literal 48256 zcmY(qQ;;}L&?GpvJ@Xsewr$(CZQHhO+qP}nHuwMC-frAwKU8*AMD|NXKXg{R$%!%o z00R7nZhrvO{{rAX{(l_wf9L)u|NjS8sP4bOMq%s~dp>bh0mUc_KAHc5E|@-_lCpqu zfGim)KnN?HH6jF5Ko@^N0Sa_D8~}Y_HZLG65HWB(1_(ZAC@pva2n@KE(@cV3_rJN@ zn;~mU`I0RJ|H+Cb#jiShU^cg6`%XnS7bCbgg;C{t9iDca{lng-mFvI%FegiD6m8pN z`_JD$G)3d@FJGZEOKh?vwFPSdW*2cc0wYxVV2D{tb@kF9Yg_0c?AmFTV}z(AIX2o% zbRV=fRtM}F;{$;rLcW}5?IlE|+b1%2-cvuD&UoawY`)@_X=c6RC(2%7q(kw8_;ocFmVabMzd#!`S#lF4}TNR1HVRdk&j$3c@!VLD?fRP8wTo&;#< z^>TZjk^$};QGy^-M1Xk%!mBnDHKrXwS7bP`v?pB3BdhmGchcQ{0boVeg;WVyqG2f; zY|1^n9u#lk&o#A9`t9rP_ixW`DD#QLQcmKQ$YKdgI~OjhE_{n8(pf-)GRUueoVcnv z$G7Tj(K8P3Wn(zmbquoXvEiRH@(mi_3jsYl+P+XFu2Di$qk6jMI=#UO{J$P(Ny9pC?Wz3Reo4FL?m`Cxd8oPci-6PtOleSE|_=_gHmg_&wdmz@LO8Qxp6rie?9yykM=cb*R2=4msGM zyaX^JNU>pmu{KJT{s0D%X!JHlP>g`xuz7+3V4$%DFs0}pJkb+T*ciuGS}7PzI=uoP z8HKf(;a6Ffm?R~?mZZ#*a`_Tkg&|`)J}<{DZxhpr@z7D}Pf^LC6CWbgmTgy;U2QaS zN^P%7OkpBE0Wm@tzqtIz1KZW#F)@FZf*rU&;GXHPz1oYmXG}OUpekb0h&Q61WKx;lXIUZ3L(l7M?(DVvqz!wbpx|_Q z_+M`KSy`*&O5bOl(`6eJr!q%BTs`pld=W6a4RKW-0H^v)>Vhl=&i;x8+cOC72p!zh z+iOb?6w1Cn`4J|a3VZ)rv=O#--vXby8Ken84ax!F>TdS5|`#IG001Vf{0? zk)InKeD2+tZ%&ldUj_k_aEd6TFs1MBP^r*j_?_*tDN?3|lGo4eE?nN($6noD$FSU^ zX{uj#a1Wc40-i;@b`z^0!Q7>Lv0{b0d2tt_v9*~pIR?iDbPPRAqF>zL8~ zTj`5Jyn-Z!z2a~Uy(x`UMQ~96-`}29rrX=+Rk2!zwaHDk-zdR7 z88wy=gejX2Q4iV7(o%}`?B=Sw{lQjKQ!t>_^-My~7ohti)$qngzx$^>sB)R4!s)a6 zZztTV%_ir^-&*fVjthK(thnK>c{ZGrTf0@b*E84SUM4h;(oymAl zgx>`4AnjyeQmcO>z`YSh=)=83Nv9o9v;Q8_0_DwbF5j30SAn4^MQRJ~a$t)oDD?wh zTW8xG0qcOZxP|(#%K#cIjbuJ;Y1g7Q_aMbDFmf^GEI~3q5(?7TSDcf@ROJJ00 zHJz8%1Jb#HL#C{-^5i^p*Vs#2mr3%1!QL&0*;y*#2EL+jV6gzP({8B69SA)B4&FAI zfbg&{p;&xk=b0Nx)-y&{MbMn%pVvRI^MK-x?$;?^t)PsfM(;6PbdE{-SRshkb%nrS z`PeQ!D+?JG*G*gfl|4WOf4sl(*%$Q42Dv}3XQBQ#gj0PiaxE6+Bgp4zs`459=P86} ze86Z?G<_fx08(M#e$m4~tSPi)HtlupWcrxMdhX78!O(ib(|TlYgEEjIT8WUAiC~M3 z!b|)RmxsbjWKjVScIPn4B9tKTIrA#U265APjv+zu%)N&S+wGE}$XdW{Dp$A(&&MW7)+d@!BM5pJZGT z`J7|{nx(%k39o0?nP?;bihzskYV!%IKEm6FhS85$cGgS-)6Mip`Rpux!o9185wC~+ zxcM2;7%&{TQUgNeXANpyEV&B}kWt~zj?c^mm)v10Pfomt3BIv92+}}8`9Q;b7_q@6 z1uqMtaO@JI$WbCEl*mE`EOaA1?5HXb%32vi2?r!O$tCmCsX`6vC^Hq0R&i*>Y`TyW zE+G+T6s2hgM??$%bm^p|Me;;%^PVsz?!Fuk(+$eB;Z)0Nf|RL>JTwv&5rP!usYbJn zu|d`(8ue9ycfa7;{LvRT6@GN%#N^bJw(dydvf!xJt} zRPt1rH0pZaCo6a7RoS_TkPVoD_XOKT)%v~d>tRL-j>biSMWW*t#dkl&F<8{9YTr9U zLYP_lmq&nnU(ZXK?x=ZBgRX9nhRqWCk3Are?z@E5$dn?$1BLr5l;FRIbw)q?LW)M; zm3ZmUYdVcDUlW6QX&rHMu8~9g@oe6vLLOadrx{6jmWY*|Yv?)E>1-t@LrpSACCk0) zw!a#vin{a{-j9t$-QGUh?enz~DJgxcDl&A%pCV2tv{z^Hi-)zHi`T7%HK8%nWS2V@6^F`g=EWY|*W`q)TbBYbqt$IjXcRrZWI7BV$Rmi(;jywUr> zQANO4BMD1kQ-Y3Fm4O$wioxXv&E0rS915#9j~Rjl6w&!{XqH0Z(^!P8 z5Nr4VK{gF6>cV`R3UN^5JjSMk>ik=nnu6qP?fIahU|g%_U7PbsI~y!DmJ(5%l@d6s zv#DlPP{?-M+trwZ^7_cb?n(X3i?O}${IAJvdNkYIX_JWa3a=D4R6>Q)a2qo<8!>U4 zLD9B`ksaIDy4PTh2)4+H%L6ugw)$JIrD*;l6IXSFta7%Sxyv)Jw$4g^J73wM4QvsR zCrpLHtyGcFl0yeCmNuKc9=P+i-w{dPS(FGZsvX0#VjnS!O;$>|$L3lJC+(YIBaZ1H zQtsql1ETsIH8r?ulNV%-wQIb5ZpeTC^%oOLcgT8YuezbCGK-`UJ4^ji*()!f5U>_U zn(64p`NTsvM&U@J**&P%+IKXYWhxjOu9T%v(FIkSpq)``TAw2HuJ_!HAT~D+U$M>( zNZqb^-_5f+$@`$}aEmt@nWcN_MY$(?Tt>gbbG8RfHB_ zJG=^2B(wBivHgl;cSy}9G zny_v6g)cY<0ri@ZruGd&f}C}aWD-Pe=EC9YSfc>#sPVAX(#;14R9f4snq0SuSL;t$ z;ua5UYn}OO8rkcmh{Vz;7e7tj0ezaH_eTbr)UcP+QrOL0ZtoggZwxAw3!K}D6j+NR zQX=|SrosJb)0&aGq8OTa4PzRVhLjBKY@$usD9ysfM!4L%Sz993`Jit^702e2mk5jU z3akwQ{^i8W6STs#9YVRJP4E)`+Sm6#1k2#$PL>8@uIk#W-R8A5Z%jrL9&M?X-w!_y zKInGdHkZ{QYxAc%rts^NrKJeieGBZA`4siAdx`n)7IUsP=mAlgBp1I(nFi8GMtACn zDfTNnbed)Av}P+Un#WCrg7fFJ&IiDZ_S|$qj+#6Z;)L9# zfMhFywxd!h90NV-MyxUWmS5sDC;%CF&WsR~0h3R4k{e#B$k>&7v%7dCCf^2x>vRTDj#RiL6|_c3r0j6Q=w*zmcPNW0hU; zKHPmI63sT8Jms$S1Lz}fIH~QEJvt91hYmvA7450dg5Pl*o!jtEc@CUVrhhhe_4hGf zNdm|m5;=x5c3b}_>dU;Zf#1~NYJyGRN-u?}IU| z0#Xc+xJGn^xxqd}x#|PMw|4-u?HkJG!i`AT;cq7CE#8ZWPvlH;Pvt%jmd#;3#Cek_ zGuU}7VS1l=WG^$Gh=BVcp_-(WDW#Wmn7=cQsb%Co&_I1^c;5 zg|rnwhr=r85iq7*s%;)PH2zN++fhREv3>VmUA(vg2i*#o>k555--j|}d69O!uE9km zn>NR?X(|fv;=V|H7(Up5;PlhJjmFl1-5k&}7h0g5IYL3zMUcct$1aCajZj<9pAe-^ zO>M0p5AOv#ZiR7bkvQ(b;HNXx<5)+kz|`HaLY|6d#4^f>fXivR|E+%6NPchhq}B+M ztARuTCuAG=*5tboz2XpQ01ISlsv4=>k3%Vev`_MLfIDRU05Af}r<~0f@+Ti< zAp7;e?OSUCiDIL&X?-h1`dMZ6N=t{7I>8EN$qyIcgi&bY{XEp8AqMUZ8qdYa3DpjxSoIK{q2@i7>MCZ(!R100F=&DG{r5cyJTP zs8#ZS9$F0XhGX%#5{*pEgCIp(yF^l39O55+#qSL=$SQe{yMP}<8ZV*u52TQ{zTxjv z9<*SKZsv3S=oa@N!d*Mp)1ELyG?5{qOJJpiUm5C?URc&Yrfx zU11^;N^f*l;y62G>!c{B?*FcweD*9Kb+9*%=%U=w4N|-_a{=sU2Cwl`NxIsSzv6bo z?_RT0)zNP6&JJQUzg245a<1f$jgbd1!3q_hsjbkbL!0T7gYL$(;$;y#D+cS1!t-L=ClH~jGnT~jOurKzl zC*$n#w)?K+hNB{8VD6w35(Q;w3G}c#Q3HlzR2HoVXgIhUYl<`*rxN8&Gw(EK+$X9n<0WC${ae8Zq zS(j72{eF4n3;9(a(}G2e)}VQu%3dmXWrl54lI8t(YHzqT6e^ zn!5uKFg;d{9#WwCwW*qjSPh<8iIqA#$4qBfR@n}mUAxqVfXFb<{u$ATe>B|N^OZ}i(nxgYk`)kE5{!zhKq%o zm{8_;nyOvLIP&^C5|Lo;(3Th>%r6D=u@bG^z;;w#krph@W=|%|s-|=0T$h!%y0y`e zf7ocLy4Got3yw+nK+#8lPw)DIK=h0t;er7Ug!<^K2GTN6$tU1vghEOhzar4YEjX;WAvyhIdGoScwym$cK;+cT^3wgg0rWSE{eY1+6Ke8RRqd$PQvjpBq%MPld4fdGwS8j@gvL=uR_o!+R@c=+NmifqGa=>86>8N|p`W@K zp-F$sO;G1C2g712183y1?<}ys2U&{LKtATqj!uzmJFe%(Qii-Bk05-!J)a*Q27QT$ zI%Sf%*L{VF^yD3OB7iy>LYuA zyWPN1`+HTo-yCBcKiAsfo6`;_cYm`PI|`{!1`-?)6vqWSRtoTr%|-?=3q~Mm^WahBx#TOO@zRps-c)nK|?fI4cax4 zE?L1$j$m)}3;%UPXeF-QWal5z|83t3B(6xaJs}Oi_NMT(9}M`zen4xnmf4-jJK28~ z39Nv(ZS`CI+{4yrO7UEYLKZnPxV>aRCXaUp@uF;-zmZ(y{M}Kj${xAwEuQ*%$?eesc_w3jpQBQVGOZ?mC1`3E^+R_}=!iMx!re;u?O*>9=0%@^Jdk8^Kr$wl+o0^g*2zg=QzBUZLw7 z(P(L3t;5W*!B(R^tP}e~yzbli+L`6XxlgiD=e;J$vs>Y^(*Kde3*GiaYow(3vv2rf9#Oq((-z<#oD56=V z`WgXGEtNa&#eRkF_ob$(O_q3T$QH9Sx~jap&D8Q#E3zD>D{VV@;2H1rHmWpNW}F1k zJWIox*;lfNtG5z%#kw6LZCB=T*;P?fKXYYx<+#h_0!FpZwru6F(_oP_(5wfPYZwQ; z@Urj9O{ZzUQUSi28`gV9SUTLj$-7fq1FdVO%X3<0>vUQ*9mA7Rv#d+|d#iJqRwYAc zeFIgl>Md<1uU1gb1WdI*l)8!uYGn%8By9QXJlHKnm*F|YXp_%mI&#G^8eH6m+Z_vA)PtARZs(s%7~n~q-nazMLj zyTSuh%S}&uErENEB2qhPbX^Ys+$0its=Q+=;F$F zTgO$e)4HM>t9bLjT%cPdc8xcNxeP5UVe;b~nsDX2=m|c;?wh+8@hs{4K-j(D3oGN0 zF?o;O6RYBp@mJ-&jzqB)h)W&Vyj5T7Hd+Oov5PP=BUovrO_o;#3Q^%P;cW%@*OMSx z3*PKU5h|F$?c`>|w5+z?i(=leby-~1Ivo-`Q@@0>p1wW=JPuhL@qr z>AF1ylfky}8GUZQ?f(VwgzL2Fvaw_s+py(U6L7=pb34*kU^rl;(Hpq)Z;TzSP$Yn) z)whG+47Q$x4)JRiHQ6ZJSRk#GQeurRfpykFT?@&1y@>*&ERAl!tj<((0GHcxUhazH zz$|2gJ2&iNEjb?8Wf~ zZJ>EWm%*QQ_Xh!NRReSf5AIJqmx^yBU>P(9_2fXTD{+Xr*Z`{B+gA-5-u@_P`fuT_ z0KauCG5r-wmdf-AD;-B9cQG+u^vIm>#Uw@0sN=y^RZ#O<B^iL=W2wjRcLF-^A-;|^rb{y zqL4{n4JYqZOVfc{@I5$E@Q+Kn*TOPoD_l4<^f?=00@xAR|`M3Q!8PcWS6hKokKx#Jbn3xeK z!}j3yciU@jSD?YX&t*=lMp7axdH%Jvqak~0ds|m(@!@^mDR7xFXVX1c9%=(VF*-#m@Sd%t{X|Si}y^@gk6@PkZvOf_v^pnbHtvklw=uZ5+Hk zXu=xOu2@q+#VFSI4gM4LhsFK+gZV%t1m#nThZVXg5A*NRX6WI@zBxHkuLH1QDZb1R zCuc;jLAOD$LD`777J(ylOK5|*boJ5|$w$2tDs2v{T94q}yP4uGV20Ntt1E>x8|DhL z!(8e@-HVyZA;i$$>)q&L=r7?JJl?<}v;!kMOQgvH4#7p%tzCf>z3r483oP4#$3AS| z_F7zhc@IFhjkkiAW$u{F7Ik#oLG0izb3jb!0Y5XHL|eOw+1)2pbH5FR*4b{t4~x~l z!`*M;!MXOoW=T9r$L4AH8#iL(g6`JNaEKS1y^!5M0ol5lk|2^}es(_i&V__)p4!B0 zJqe`wi2wSNgROu7rVcg6A0_u5O6M1CI!v+;Tz4vRcNf40kq;EaPdZ_MmJ-ZGE1IAV zNY#vNmBuedm>xGQc&0%QFe{P??UI3!nmNSS;+N15BQ~sIbTHn4HsJ~I}IVkD?K;7ERdEdDCq9$sjflWL<6y)l3nTR@czdNCJ_G2a%Wuk-%7bb!?i8+juRW z9DS+gNq3^-S--;OI(C|BLwJ5_hPvklyY;URKo5}Tp+roqkCeQxGx$W%v zfObE+c#}oH2QZ8?gJ;iKmFF%X;7GBdCZZyoApUD@bNokQ1wRu*<|#`%hK(fabH9Zft34Vq;}?w|{iZV>uO z>23nHM!!Vacg^HQVrFs4IWwh?m_S?=P?=FTcAhK%S&n7N#9n1Kufe{D%DqZ&5!%US z*gmqB&!v;z`=VMe??K&9tsLb66mXi?qiggM;TxL$;Qy9GrVKqp1;6j?jSZT(*BPd2 z&iOV&=5E%;e;8jJ++00jaOyW8ano#rydo%)t-47%0xDaq6M=OaTWSDE=>2`~F}?uP zzIppigJw*t*k&00o=yNiodahbaDA|*LGsih-n7iRNk)ZFA^)(H_y<fc0Uv?U;nUwAHnPqBN8FLI0(y`l`2Cda+-&R^HqVY7Ea zhLd(txXQtFwr$~YgA_cc_pImfWbsiU^WD$j{w=Bj)<;Nmhj5^v0e;|*MWc+jy;@*R!+9yS=*w;&$4|x%$~4h;Gi{yK@_*#;VMb!k!reN=g-olGk*V zq%k>ZC}9mH@=Ob@f>&lQOQHVYWLx>P%$M+C+inq1rmImrqxQH6HOi{KTO|UfXXR;U(-AW{z zB~ZYiE=g&LrOD|DCQ53Grph`CK~FmXbpu5dh>VJy7N4A$nvfF3U8E!*efPt#kXeX3 zbd>uRh~9H-Qs=&6)um)rR}glK;xSsBUtS!orVxX5q!XSAt{Av)J?PvQq;y{+)p}BKt;LQpWd$0r8Zyl- zuFfwJU7IK_cmd`qBwO-cx%)f{A*qTGk=m~&VoaozjiFQK(n-8B~#pzviqSp)v7R8$#+9{Rwr z7+HBq#nq{Au<3e?+E7%PU3i2>P?>asIZp9+yu9OGBBCObvZScj3(DO&q9U$ZAeYe? zR|br|#2SNl&m}8V)+M4q=X(;#WFdO9I^X0(!1na@yyY|WSuX7Z+T%N9^Igr!R2R+l zi0(WzW3ICM5bJ zi9$Gn#j^@(@Yux8JPdhRxJBjuhp?!Xcs4Ilw&!fpc1ckX5FViud_!A6EsulHIWymv zSKS6G5a!3Up@fVD+rH}8tYd{s$s$F&CR6+0-(1tvGPm{hcETW9!)36SJmdue*lnW2aN|y= z>JMIEGx5x*815ZUCElK&J~BaR7N8?Ua8x)w2lk6XIGDM(sBA!C@euv~c|){xwe>Xh zHMa7yIhLj@tu3xDuP>m0$KWGsIJq)0C26s`wgkN|$O}Mc>iGLdk%>C8?I9YX@g|l< zhD%fRv{mU$V^|7n!w$C0qmf*e)~!PAGpP=8c#h>)++2iM^Ta znU3JO&mHJ8)Czlr`b0_4E*l!900m3(I4UWBoWFxnFGC4x1(p)3v(68OU<0Fy?z=WWO&pP@hl)Dm3|vjccA<4a%zbiIY?Qc9(9Xi7Z( zwXM;r$8yW8TQ}rui#CVI$zpdmiCHWVgC_f&tg6C*@M0q=TSl;A&r+3nc;z^}N$}XV z{j=3khu#yEnpZJ+dzRB|U8?^Lb?F5*8OVrW!IIOO@_c?gj>uc-Jcse@gd2$Lu+Yrb zEfs0kXw!rYla{Uv9Yc;ImbSMh-Uxrf2ydTPD4OzFDn!R8*B*Kmnu<))AdV4vmk|5L zMN>gaRp3W4M6=KS3La1(Cjv3l3&19D7>VFPb*=YrZQ{W;f;misTFE$S>X;f#qpHRD z3D@C@iYID-HXISHCQ*0d2@<>r1K_}^2ZS_9=&+N86Fo5s+8F^oG5OOI7d>&X$(bnz z(%CCD`>r-p+XgQM9n($j^#ZH*S~p`ksB$&kIVUtsZYMKk2M*x2!1*W(}M6x48(F-gSaz z(X{)FhRTiSC)R^Ri~%_wJbIq#AZ^HrFe+yd8B#J!tH|Rlw?HXQ@1unOBw&N>lS)}6 zja&?!XwFo7qYL-NW%g+D2fs6rb7rkP-}L3Pf9p5gg8L4DTa4`#vnsSp2^>(IE1)jJ zcSp)6nmPZ*x@|d83#NPUX>*aOJw8T%r38txuHfwjQ2@Aj4S11wX_mQvd5#a_D0hE- z?at|`04oFF@cjyz`9!7ZSG*c2r;Yr5OK&)OV;CLaAc3baf2fDy{ry{Ff70lNith@o zO2H!(-O9s$$kQlE3A6M0M1jvS3{G83-V9>czHRu9_hi|;{h$)%614TVn-)(% zvV&9DkmA$K>8JyS8=C$b$71YA%vQYI@s6hOTINI)x}e7i1CEha%48aaN+J1yU`t*m z8$77D^}zg|vNGkmWUup)RQMQtwpZjhx-GYW_lHrldCJ*5dUHU~40M#*Vaj{%dyHYj z$W33^TftOrmxvutJ?h~^54h?ugNlC;q>u;}QtMcNod4f!%UE|$J3NmWZpI2?+q&5h zA<1X|d9ssCwRkyWBAgw4JM?4?aYiYwR&>8FWm8DDJp{^sxj5;!_5oh#kBKo)(_$j{ zfp&!x5Ef|*%+}JKC6k6KH+6s$AADD>#;@+d@!XL)wdwPwShGIAz__Of;Hb&(VT;=9 za4zqVs2sQ7WVw@b!87*P@*!#ZLdY%R6uA+WrDWv0oob48NyRB`SGVN{EH?*#4kb|aXi zAP_@nWRH34DNIS$284$ZG#NCe%%F{=QS+i$Y6`?qRKb17NV3v-0(NGvc?qXcn2lo> zIj{K~TbG)t>^o_)OuNhmr($pY)no=%jK4H|$#Cqt%-`zhDz&fWYD!cI+6duDBnk0> z<0KJHiI91|4AW!+PxFGzCu~#nE%iC5%JdmxsB!#UM3^O!Sjt1@0xyFz583M6!ytvr3|Pj4mBnwB^4D^L_`7!BmjimKXRST)+rA&O6t|`>1k;d z6%}FOU}6aX{)SXTCMKq)ZB(+%%F4>{a0rP+0RMkbwf}AYA3*(|5ovs<|HA+d{xAC< zg7ICf;hh(exGtfBX&~!~LV*WOLvgJ5az-j%{pQrI1}jP7fI=5^WMX#xC!+hy_uD7Z zSyfTi#gby80CIKewcaG7;ACTaou2l6U1G_hKJO zj>2=w{0*Op$fK!Df%*jP8{V8744`%IB`fYBt#UNr?MwJTAUp;b4K=xDdM|V zI?4zMuSH*~)+8ARa}l3{B!rI$^iMD#Owb)0=Yw6varoXy>?fqLG=>wBRI~R*s!FMJ zz9?1te63Qm!$8Neau_j!|2V&hke?_J9GbFtZhvoX;9wMD2+@FBT|d7cGU(go1y?6} zE4O#vwCah=SALY}tGQf-QqXZxI0FEQdiT9xfk0?nL6Z31NF*kko|avCA4H&CjAY2^ zjk#Q@O0mPRgRw-RmP2pXuE!Ulj*wZ`CA@N9QCWZd=v6~NA%Ng+ZNvwiZUkZf2-Pj* z9TJgHI2>Uh5EL4XIz8}zAehe|00as}O!gn-JoYvURq=Hl>7=9h1CEb{a&rm^XkVD6 zHd;C&2i2TN#SRRtswmjKdT-GwI)Gdqz^+?arro_;;qY-^E~7R3r*4#WPA<&8x9J`v z;%vp*b#{B)F$rrg6LCl<^I~18o!g`ug-R)o%7X-(x{SeVQpQr@-%F%i`-`1`82mSB zH++#tA3y<8-6UQ$?3~3MfbQ-RZ$jYtfMeKP+QkT0kP{tU7%7=Ni~MYB`}_zDRtO6X zFGom7mMawg%_}&ffVvi4GdJMiw5mMz`%RyYMu$Vxvzho|;=cldVZcG{Xj-h0mlPnG zpknIXa_39IU#k;p03kdBAj^XdFoPm);-{Ap4`Sh~x8Uo4L9Eh5*n11Nwh(7r5t(>F zE4uS4x;7KT9Pa!yg-8S|1+A$nJ7cUQs*woi7Z9LFu3ZOX4l$A zH#IOZ5_7VDy01JOv=^NxfW+s+Km-XfsNI1?;i+*HhCVzzR~{fk7(x;R5yoIH-aBbF zglSr0i@r2$t8EFfuf3yw1;K+5#{&5XG|PgRSM$%=L|Wso>=SNH-l@92RBAmrvX(Uw zEhZe9DC;_7UD1i_l}{=bEFWCQIY7iN61>du9inqjN%IP(!j1LjiVgCqA5(p@-ybkJ zwTOLw8e};mKM9ihgn+4>`EDnq!L~oWUkV7vRT*<@iSVtPn-e{M!MgaQK=wsm@V(c% zpiT1de&0Oh{~3N365^9mmBM@cU6uJ+8;$xkx>M1+bmz3Yf~I}Twcb6RSe`y|(uB|R z-G9FD`Y5w|+cEV@yYL*sH)|tpw!iY)=}fIEN}#IXTRVRIO~gZgJ!7-{>ATK*rQw@! zmlB5X^O`s>J!&_MBN$3bMYg#%)6ftT{@Y~I3Ewr&u4m776<#rb&EZa3;` zq2-{Vz5ZwB5~sHZ{$ioBq-?h9sMvAY?EHIyHVb z$jJJBhW9)i!dr89X-TTl-|I!>7vxEoqOD)^Y(>zC(dx>w_2|>T4K%Cb<4R$=TS)0* zqGR_;u1@Rm>AOdKCfb>ql?eANv;D5@&2ZEAGBk>!&avZd30Rw2ow-AvB&oF*`^W5X zS-H*@3-^9AaYoK7(q;MeRow{356H@w0$TazN))ijR4sj&{s)vA(+?=hf_l91yFzO1 zC0JWtC;yajcy8jZ{#}|HIyx>&s9O59;6p2;jCJ4{Gf_#AsmTEH~1Yybs zg+#R*C$Yk0;x&ysESaNHFs6yN(n%+%OOyLiy2=&L<(%1GO*=wBtt>~CXCFKSo-jEO z930So-|R{DKku`SK_?;g<*!O0zE|**wkxo*RFb19oR$mefxksEg{iJfwBOsh{};gL zus^_``URIT6yza{qoV9>^^s_|qLiA}ZfE;4JPzqyL*|R0Sp7wGBLcKKuOf=O_!>l| zkvcI+Qus20MFAkK`B124hTpWb6_^ijSE8U_tzcT}=9*QL2#C@9!DxoQCR=fQQaG{7 zUBI)Eo6w_{a4NcBKfX9#B5#`>$dkM_(8vw?pef0x7A;U(BqTq9qrOe6gY^puGrA=e zT2zoX!;ob0y7!GG31MSAXeSZqeloO+lY(naoA|sc4Dv39PNc2?htS9X?q5i=w0s|d z2NL1*xsDk~HpR3%;A&ohIwZx}J%`DvVYVFc8Gnse<{8AEs*ok9M0GLy_(mFqL<_rg zR%(eH8r@lz+f5y|x^U^$N!%+`8brJa5X7fB%Dvk@L;tVxSHfBIi&f(mPEM!K@%ZWy zvzFXOLv)JfXp8)t@0+yEt#lmk(>vW$8qW=YV`>Rz-{P`{>0%@Av~{cR#_jZ?;iqG9 zG)L)XyP3>i+TRb^uKT2(+{>F1ERW2P6D^;e@tN}}YHl~YG$Zqc<57O(T` zktAQuxs+os?Tr_sFX2_$qc7!$8Kqz8@0p_?!OwrsNyezA;L|ecdj0?Qa{=aX^F8(6 zZGh2$fX^kg+G{1QlwV48G<-z#wz@?7#vy{3dcW_@$?4H@$fbJ`C#20x$AvD3E`~yg zBHMq>&oJD)$u+n+GBRxW`f$D-U)#!lzc23m?!&US`o72JzAsK==YDV6{`{?Db|U=( zn2`TIZvJlB-|MpAaejAe+FW(~j$?`5u(|BL*B-9qt~nasj(5u5vNxPw`#QBgMYNX;^4n;M*8}aBW@ZD{~P$UBnFU|zR$}kxx{1=H9Nr*+GvCu zbETfGu|Yq?^TBBV+FyW=KqV-RAmciTQp6&Z2j}@!FvAm|DX*cs0R$A ztNA{^k%P&G@;!G;X$3)ZzxGj5nLz6Q`a_wJ*hlPGq!7_Eq2R+6v{rV9Seym`6qpCq z+7jCP__yY^`&n|gy;7WOgh7fWzR2A5oHN4YZHlw*C0YdsDY`^>&Nw5n2YmbcGB&15 z3-jJuN0!%@ajl*zn`+6V8wZ{;iC5BMmB4%OGr%pBFe7VtZS1rfvC=yqV#63&I+`gK zqYH3KYM<1u!A>*gNIE-u;-FAF_<1au^iYv9SDkp49tuL;pOA%=!Z309W9a|mUr2si zW_oHKtKk_=1q9ruwC;31FzP3ycO2%06Q{Q>L1ckH2gv(-ab(eYJ4Q=aOoxp(lS9Ot z`M1ywzc#-5ehI7Q_f5MAOLOO9T{v%r%bwk%yD;+e>hgm`|G6@Us`(%|QjQh2bLfeC zB}L#_hBu)VB^-`@+(8O;y1*8%Vfi)$wilx$Q(bW^#M>5pID3A5%KIJutZ$tFrBh^1 z-mf*9-XPUySz(iJJjN)_fpUE&-G6y0fBsDfPHKt;R zTls#^vQ@3@p@*BU;CwG%bs1lm9SaGA2Kkxe?%YKn;~U0+ z)_JpH(!d40zoWzb99^$0I2Vd8!srF=6-0oDcssETX^@W&a%OE5f(*O`4QEE%dpz4H zdt$BI&+$EzV|C=3JvO%e!D?eK;0g6}hc?RGuMSLq2RADGScx<#DhoZ-VN=XD}GUAU}~m6#oA^~fe1YU}=K5eB+THdLhcCv)$ zbyrexw@%vFL8dtAfu%rSsBxOnS>juutcJ5a^QFHG$IYEO%ZEXo>!5iCN3}S*7=Vsr zfW)1EF2t0TNqnK;Z`V_0+xDDtLX#{iS16y8F_#%t2qfzmwpf5HQbtJYa0@19yl+lbLe*Pzl|KmJG$M@H*syIzL-*XRTN~vw z{zLfOcC}c%W@4RJDG!#1VwFDN(z;i_^EbB>8Ce=&Ers(A+W4P!ldpMe5UcsQbMe}J z_M#^KLFPzI9b)@&n@$YEdjAM>noeVTi?1NwSY*sgU?8S(jX)?AWvGRHl7Pl+Pkwc6 zeLsq8umjhSD0|#mt(4cwa@gUOPz1j8Lk%}gnQY7VAm9G)8eP#D?_%7y{_eHVEe|wt ztoipkj=t(tUZwO)c@{ZPWITOw7lo!&)2p!$c0W&h_*Ud=v3{^1%^=-i zj}{?RJpj`8>oaci#QNP2+V1P3Gd8O9p8CA!TY1^((Knu+GD5NkKZU$H~!1u#oG zxx$g+(RncW7R!#Lj_me2SHq1r)IS*c+nJ;#X2BufMmgxXNk$%=ODGS%>dT$upSTm; zGH>Mf0`|K}G1)wCSrs%fnzGhO5R~ykOe>#nd*_V|k-hc}_7iP`Tq6FXtGJtK7;9`5 z@|B8i{RS7YaE`oq>r@lBriBFEOO^1rO&FMC5SzIzgsR)tj6&6&QkxPf(+k5_ZjEWx zO2A#!+rQ!#4Z3~kpbeZxu{P3(Gx7~3A%wWD5Qktf3eB54|1BVS>*x(Mg<~m{af{*|3m65Gn1>MFK2?yx6gQ5T_)*Lyjt zZ|s=Z*Gcm95uo7sAk;JB5?%qBG}I{L$Jk_n;M`=c)MDA<7;^{rp9&^W}l zo=`V|xY>4Gn=Mm7U@YR#1D`BDrNRf{hNkt6Up7B9u}ij8YN|DBG||@b!DP)S1KdX% zZYRa)l>;*6QDS1u>JxwDAsiC&4vYrmal(Oh`{1j^3^6s`6f&f;M6jz_k6)!G*xcNP z7>(SF+QRdn zi3ok%s!O}4m(qS8Ce>-TkUSA7?x+xTz{jT{A6Yh!+(~UqFcu~ji>o@!Qsx1iPfS>m4CMzRz|he35Gs562|g|(0Wem30U4ZyI?urs}t z4EpvXXAqNd_Y`<%8#SE=s28{-+Qu%!!+zK(;c9^C^1H9kFjzcx1zBb)DU=Po{xKTC zYDh#c!hApS+tKe1)*CAVdY9;uU#r5CsKU%;(E=41J}X_fOr z_J3Z$@V>mq^X1Y|NG1wWt-JsIJtl~JUSm3AqTkmUAX9Ho#R*C;oAi+c6Hpm(4d%PR z5G0x9(?rZr&?)hxLtIL61>X_JJldZ(g14+2=Oel2-_H}5y&fy>Dvfasg5VmX?Ae0) zY`KX8yfwH?3TrRI@~z(i9+T$Em!8QYb~8ORB?I@X8TEM%=$|dOjH;2wZmZ=GPNppe zz$@LdryLIxpX&d#%f=asi1a&W(g=F;UfP!?RU6#qzvf-|_Lo?q0ii8pXJN>L_cJ)i zIA1o2{4W4GK*qm>S7v|O(rUBceYNgg_uA{a-+sy6%Yn!16t=dt`XN@YJNESxsVt1q z(StLN`JtT1`MSElKm@KaeKXuNvmM>ooHgS%R-kC?`^@EYk9xjy2Q-GoF7{79x-i!D zYbV&0>LntSb#F9{oABn@$A~lATiuO>C@R9D&U6!5{Hz@tVtq1x&*{w$2b2QUy10&P zZz}WCnMIczeQy_U3jW_fCV$V z1i6WX0sBB^dh?ISak6)xM_C;|>>cOFqg5=0Ry+ovw8`#{^`+MB?P*Xg8t2+$F@0)J zrjoXN4QIP*vo~$A9GgKGb|5!>$?nv%4ZwdR`g2@Tl-5VJ%>JT#hl8H+L|Yhe+iqX} zAdt$)ZIA!EVYt`ZpZpI*3P0KS|Hj7eNTt=6wNzF=uuLQOORpYEVbq%L3*$?gUI{Y1}6vm!ihyRBi8*I^TzfqlM(cG6^F0aYIpJ3-Gf2=231jsQR zz5n(CsOQ-O@%>jmwD-4vy4_y~j5#seUe42Ww2!ufX<%$vv+t55elkOZQfEfO*FrE$ zYdC@fx!Flm_fy8>`-G#-nm8h{u!bl~>BQ4YBZx9`oL19B0lr_TIrk%jQ6D}IM!6rI zlU_h{6iKEnWV7ZZQcfmSvn^74yRvZk+-%YE+geSe#x;{dlA9A}*GVN)9mN-rK=V$& z;LxX<+@&*9a`5V*5k-IbJ?O+i((AW9l<+Bgu>lwxW`VIm!bxiTuf5vezyHVWivOmj z|NMVsEwcjn(JarqkM>2q|ET9-+tE4270iKB$)rWvf;EmPO`(^&Q_F8^3zyH&78&2I ztS*|9NEWm;$9u!NkM1{L*CM8OwgOTyn_jLL(hF>y+qBtYadz~|W7;gON>`sFU%QO{fvN85p}yg8gCy zvHreweoMSlj)QF8{h=}2N$wy%W!*h&4vY=Qnckq;sMJUUS!0RzuJ^3ima%BLIH$*I zE7RaC@htOcw8gKpF)CeBu|(y^jHmU)`T37>R1T%dnXz#td&Ryb<=)MJr~Ay|%xnTd z9Xp6E+`24t#qni2R|fC{PJ$tBh@NvhIvDlwgRPX2 zxD?ndc#jQI9z6xy>*&Ik{wy$QC+l6BX}Oq+g%G<;SwoT?4g>dNiVl z!$Xuc;G? zUj)YPv%uILWYpu!s~bM=zCC*(P1rjYt5S`|#`LCLn7zHb;q$U;z#WbUoRV)K(*6xR z>Kr&rjT~QcczFO^(ufVGA!nM`;T>A-_n6UbAoRPwwRO%mw`jft`L49UJGMIPSx9ZT z|H`!%51DFSSg$cWT(flCHrnfsvd+~?<7Qw|&A*4icBdRfonyl02c4lln6Oy?=>Lr^ z6dfV*!Q2bIZDLy2I$7ZFFH`Q{&h_Jdbh{VghVW;XD*-p&5taSG`idto28bqm7Rm30C);R=F*`?t_)oLD3yL^wj~<4{m8B!&LF^ zOc61!2))~Zyeh%8(Cn1ka%_MoIelVo*0$pOd;V%J=e1eN)F@Ys(E@rlV$8?s1seD*A7qQ4Tb2+7&rG4 zk5jd-3?`gY#!XDDB4gF)Sd4#M62LEC2)$#O#9rdqX9=M*aw4j?f_LXjO7R$hx8=wv zFg8qYgLt9%#kh>x8@ha>iOIaBH|lyjQ){!av$=B2vDyqtvMw2WM6Jf1td+2RGK5g4 z!3sGm(WdQ1L-Eq#vEpU%&!#qdgPVfFmRaM6eUJI!u+ZpD!PyOR%*pIb%!!7aY*>sP zKFE)FV#wEu5GBuJG`WL>jqYY$-qOj5e50E>T}Cku&9{SWn+C>)(GkndSV0M%+L@%2 z;7+R5*dw~+WJzrX=9oMeJ6o3xa%{TZH54rw9xgC`wzG{l98z1xyt$W{*tV1zoQWQ+ z6p6(R@kH~>!+W?%NJRcBJ>s*TSx|fk2iy~ddz$x{EeOBI@k^T!bU4!z=C}LCWfvxq zMZXN;Jo>ynZsb?Mld>>S)!T|A)gZ&&F{;dHsZ|DF@2#nM56@L2u1 znZu>prd(PvCQ<|1Uz!$zRX2n)qaZa>-$c!D>UE&txJ-a;dhGD9`|+}MmKg+KY?ubd z2J<1u;-Ym2fR(eM5PJ9gje$Rj>-h1Cicq|&b(fXW)`FR;Y(?v%fV>WGLYJ8eeDJXyZh7*=+drfD#Z2Uq9;nu=EP^Vo#TM%#|ty37epmR z=L9)J`Rbxki4&yJY+_-LBJJoxYDG_9kG!TjO}e|OymT-cpMr6+=>U%UT;(n++U* zQ;Iy<>H9gICA}p{wc)rN1_PH@3r{KmVY!w3t=<{Dt(Goktq-g7zwT?#`*LZQnx)>( zW~tU}i7x;3(X|0KUab!M{^zY_3iSN6>i^@F%^fMaI9yMX5I$3rpPgDGL60TJ?-;6) z0M=cwLYog(XhY{#?z}w^7!-Ol`t;1GXMp(GXPN_RKx`~mZQcsADTf(!J5^vN?<52` zSK+Fl(k<6N4nRhp504}^5?Kx{ElabQ0%`j*)&T$0aemF5q z>Ihez(q#N~1z#JH%}-CF~>OF5|POtd8u9`tXtJvpPB@y+{I@IlXVE3RvI2 zb=hxcdV1c?6tKU2YbU#@-kuD79o6LIEY(zBmtn|y>gw5(RFfQVy*cZlfcRTxU7v@nduR-;jB)}adJ`Cl_Nnk$*|@1f%4lgp1Xy5Ed^VwQYOUgg zb-b=zA?wy~|D85fXK|~1DJ3_HiXJuS3ST_awi!i(!^Qgj(dO6A5&Y^57t=Fl(Yb*f zfu8~y#b~J)2>A6}W~(5Y)}rG8z2EpN+26i(*l)aVXH@YPBC%OZS$%R&BXPWr-E$}3 zu3GT)&E1`rKYeFz>6%zoY@*^-lIu>su*EA)Uj&5m;?3Lb1awrZ(`M%Wv=&dk&~<0> zi@aEIl|yB#GaYRg1KU(A%q@ba!e#9voM^&>&BN>66f+qT2LpWGA@VVDfh_W@=0)Js0S8@o_-IbP=eJ1gOO2i z7R=wYl!$KiaI1#k#|{d4Kx8%j%n6F-S64$@5~9$qh;2L-2MbTk2u6pd`{I&~8MDg@ z6=SCain7_n)Crj~bx0KQTP@x(nYWsARs1A+)9Nbdt^_vPO@to?F3t=_dGX21ylTbx z-Am`hspC7sw~=vQ$HChAviUeMqR z5A{2L!l4M=V~+COyS%6eH$0^7``xN=1T160tk;4kFWeNNaWW|H?q}ZT0#~1>hzGAye zV7n`9?cOY0aAelqVXNm`>%min`gUyBVDxj1MyquV+!m?}?g+aF1l|z5=pIa^sss6_ zi)4$%rNlU`&d*y=%NI+Fjm<)l!*{Y)aQ>>YV8uaIUzn@Bd>LD!F7(SvNj$t%E4X|W zcwlWeFaN`(%YY5RlVDZz{`UsvlmkNpCav%K2Ks>6Bekr; z0-a~LM+rYASwk-#xF$>Y?hUHp1jQ03=-MkJQNGtI=(MsHl5jX+!=-yR0Gnyh?fhwi zA5S#iZamkjZ|4BD;Z?hqV}lW1QRtEf3s+gun|MBd8blga=G5tHtkg|uNGznm;OVa3 zs$N*>$6a?sB&0tp6WmE*95!Qg5||9F3>5jmVo59gmB{RDlrO9~jfv`7L$ z8BW8Jf4W3qd7OhwRLor(B!N@_Cn1F|TtbL+AOyh^q2_x#(4(MNm|&BJ1|>psZ+Xhk zxAqgSe&j#=0~{$e4O=~kD_q|+>A2#jni-9&!%TXtS? zI<+$AM zRVr4wOQpQ9QSk}?F;ez#S;fCs&DJ=Qoq`AtSX^Et9;Yz&c$QoUA&i@f(suW9Q}Pz%m8`zX4lBjtqQa`9 zLse4KSRGkb`$)m9=Y(60%FyPpGoA@qmw>IvrjlXTIZMJQkZPS~$ zH%4bzJuF~{3Xf^yMYjoJqIb9PV+49We|O06+w^70t^lT=A2R^zb*4Y*EdN%A2GCa! zmLIrX%dQHcNg1(8;{Be?mDH8-ChzQ)p*h4TP7*q_)5V@B6EwP!0`qJo5hy9&t2bv= zX(Eoer;n!<79LAWK3!gFR2)iO z&y-N0WmIZFc^Z|;NSSgPHCO422Z(!Zd%$+t_Y*E`r>!g(C-hbq6fplW)X`zPyJY!( zc_dw0-&Abg@q^6f;&6g!fM9zjEn{`uS4wYGYNdwzs*Yo;&r`YMfAjPAk{yVQudxz! zy4mtmB$+W%8a3E25*M&;efLk17@8Xv9-J*EVwO4~VJIoJ{_?@z?ui5Lt$J4nQFKz0 zD3u)<=tsZ@IIZtNxCoQ{r6D^)GLvu!W0&v6WIK+(Fs^!pV5WP@vqjU9ZksVDF4%Q{ zV{Qy*AYARRkN*btL8G1{yI0;TX}eYcRwR@aFin5{^{`b?OaunUjR@+M9ja>7PgkTk zSRez5;%ItkTjq)x9oW>JAK$TEn6d;jZj>k0!;BF2URtqWB0+YT5mU+TK4*LU5zc&T%- zO-mv)R8|w3Nc1nc%~e%|dayCU)APW=Rr4*KU1}gnH+R8@u)KW;0Y3gegL^aD)j6tN z4*2R)lvnCJ>O#!wYubO*-R=~AjYcItDVHbaBL0=lSfr_AJmoYV6k_EQQ2@8xYH;$H7X7iMeSK# zuZ7ieJ3uL4P!mE*Li%lEVz(bz)s9RI+kuNy2h(YVFkD@mq-Rps?#=#kD`(&EMhSE(%Mm$O`Z5v{JW90hvy9fnF zF$^h)(#elaa&ip6I+kUXrUcEkG0Ye%-HdvT+!!kv5dB=bATog=V2BOBl66ZvL9bRI z?GBtrnpnLSU%s?18vxgr`r4_?&fd=6e%GdhJ!Le|OVEX0$Omaa;?5Kc7zqqPWcpks z1JdT*je3pTeW_X1oJ(0sX_kMZ9(aRvI-r09!l*12i9fq_wg7oh=c=awx@38d)aiD1 znQcQ;OzF~I+7r;@#Fh$sQ|?)i`(#JAw|8MWydL4@)V?eB7r0C(4f*e2R&+AV~^ z`qi*Ct2Cu7{_iTY&X3`4*=y;(oss|dxjFFSQJY(V&{0mftYdara%sZfN(i_ix5qPM zRMP>*R(=?apCUAezAntIECtMStpXx@(?1d&043euFF6NmbB!iey)zklZ?bBtZWLHp z_TckSSSeQG*)fBUR1jnfQiWa^*yo{8JU&oE{PUkkV43)(3R~5E+ES;`MNqcDRuTum z9($@Hc-Yx_D41dQa;a}r+)_S?&dsFf1D}`Q*SptW)$1%S{%Ha7mi-CzCSkA%t?5;r z_`AftI2>QfMJ?TY93k0L$l=@r>>k{24Pk3J46x0dqYFK?9cz=GaZgQgi$o;qj^Tby?c!J%)1C8fdJ64i&$fd{!Lu&-)Lj{Yptn&Pb2pG)n4HA zI-c>T|3QNNy1VnY_Y-;5*I7Wnt_v?Tv~p!b3G!h4**|Dz1Xo%&0}pG0Dwz7ucq2@! zyA$nkhjwu!I&wP*4SBQp-C5-`XkRgnCK7qH$EqkS3fZ7p;sbkw9c|yLr2|_R zX=620Ef%zA`891Sg6hhp`mEGs?AbXkG_rH2X#VSJ#jZT!*^N-jZoT0M{~ie#@q1Oj zP>mLD07K!4DF@PIdRqv>HDDAF?Lf6Yoc6Si>TDeS;Rt1*rsB`SPzRyWb{4-o|9K15 zH(0~P9gnyRvLx-VX_k%Wn1FGb6+8-r0>vCcDCOm0AVe$&EtXehpk3N&6a7?Y#`K5o z;y`hb{`9x{FB20DIO+1N&b^Jp$dex&h-x(YVh5`ALDf}`QO7Ti?F})AuWRiJ(Jp+d zy;l>B9bG&1m6!EC$9qQrFR7#M}$^4xwK&nUOQ^T%rzbXa!X|xdy?Q68sZA!h@ zzpQLp66%J|F1Xat`bo~R!9irt_ZMVgy&{tTYQpl6hh&TM+~G3k394a*>M^ZtcmS1J z<7-S$Scp8?v>hJ;!owkPa*!y)IxZWU*gvd*>>gaf{wt!OO=EAPu@*W(UQ2tHFV=M> zZJFu&!(cHJJ3?WMif$2C_Z#m(B-FeDikfIq1kSE*Feks&kZ&@uYFNq__YZs0i`h_z zy4aE(#_N71(n!6Z9?oe`+xQ@*Zn|&z&{l)&V zR}rj0USGm@4R9#5q-knK;z%E5=9E6lni8I2mc|@~`SZaKtz9S5*5M8}J}5u?5FJ#H zL*3&jTCtv6J4HZfS01i)Q?|e#9|v8lFI1ydn0>|q@eu*&kX_#iofCdrI>j8vD&6*| zMoNtm!nl(#CGAYs=7AZ`Jm5Q;^a2;@(JhCp;frLWJ7Md2sCrc3V)u6%w64xtmF8_M&-Tyl!^VsNLTCG}7kKmGn>iokpdWyb!mD!LM_?33X@cIml%y4|-dJTa zfLS(HSd`^fE|KQWGS_!qa9|2gDz; zazL?zN*q$^urf!KJK8G_#`VhklF#dDD~iWo++G}h%WFFCuXjCTF{V+M9!+$5pX?uL z0dKIeg%CXO&?ApM@zgWVz0m4qk?2)k)){u#kO}K8;Bx)acISWX+CPfA`q)%3+&KSE zW8#SMbyS$|`2F~+RNvnI8z|JZ-(@{#-I#}EMXFLw$Bjs*n3Dj*m2xYf08 zRnlF9*hd)F30pze%9fUN-&l)KCY>7G($a}zajwmF1U{_c+&Q}IKQ0_@OLOx$= zSSLTp90W&r1kpX<8fYL&a;5vB2l(K{@QM>LQB;0$SM6oCW5?nha;!4fa!YJ6A=-25#x@(}^bG#Zh%^wU*S z@G9Dx7!uLYI2npSDIb(_QBPmK^>8%lm3u3G38c&x){am)XdPkR=mu-SmzFi}M(8sT z7xFG6zrgF6k4ywP>YK+jmWpB%jkioqPJ1bhB9gUJWD9H zun0626fGIF$Pwtq5q=5G-n6PiNY~~}78S1yZV$v{Mnl3F84{zG>-)9Z@=}q~D&mi% z?fdgbisXZAJV0CF5foJf1&8z4Tw7ObFxmxB{9#!(cwUa^)z%n@ewmhVbr+yHUqlcv zXY`X=ABdYLyP1M@<%=k4{wcm)6 zWOF<-Axwro08>LLLkDbv0g&!|fsKmj(E9V;E{^+Mq?{SUjd~O2TeXTzgIgZ$K#b6$ z_#ZK0u|@V=kFGhw544=9im<}+wVZsufY;tvq7995Lx60e9@%;(-5pI9)GdD2Ad-F< zbqbbPHo>8{=r-3|jv_(|5hl7-S9PDGpFUBqbv6U^ZGxVU3K}q)(F30E)t1pRSOFNp zTZn?KzynQd2jH1~BJ5e(lqgzGSVa`zlLRo-Hh{-MB|BRBejm;85*{{O{1Zk&sSxf} zD~w|93-_}j$&kt&<;5j?rui8{vP#(tZm&(crs+zd{a!Wvc|#NnXr1PO-Znw+MFsQifM3fO_*=Oh zwfG-u^}+pU zY13z`W&fj{<7s2(Q@I04_vsJT_c;u(KZJ!f23O2KD$a?X2Q3}~btt#@PZor)jK~K& z-LtEso8uVi;p)Nl-|_G4=l9kv=d11C3fiAJ-bK{3+?houWZiXqP78J%Te@ujN1a;` zirHhp3Ego6=!+XjzKes~MpB4yYor!V;vPY5FsQTqJmUI^pGC&4D$l>YV&V1fi!i^W$8WX8(HL9&e}t37i0$66WJ%(KXQ|G zw(FeNrLFrY|68%jf?^@CkXYnf)L67x^jb_?oL2mzc%=BC_>VHR475a9=2>bicUm5_ zoVGko{i4KLv8@uV2CNQSomDO>pQ>QiSZkJbg0QI|hrBdr`U9aP{Oi$>H?lCu-&YT;*Ni}&!W5TAvoUwP?V;f}?t<28ZGj5;r zuDBx?<-|_z%3au{-RV)!sBI>1rg?_unEf{UUG}fIQS)$=YeFldn^_6W)pAl;V`{RPI#g^xevHPIS(4Ryk{&>z(z^UCtxU z$DA)(Z&{yPzgUI)4;!dq309$lQ{X`gD4+tAV22Q7pcl}Wf8!nhdpt6}Jo)zIuJ7|@ zUf^^6$CV!jXcz)H@ParkI85RF76rwTHY zkCJqeBx=N5G{qbbqadb7b?l2hk&TsfBu{!sHR)`^Q#=)OW_g~=lqH{JK~B#*bI)qu z>g}r+2?YNNVf~K=ED!JvNDL^3;-F∾Na#*TBTU(!jF?9zmR-!C*+RdvGrd0&{`| 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 literal 0 HcmV?d00001 diff --git a/blocks/blocks.yaml b/blocks/blocks.yaml index becb7b9..9b56b9b 100644 --- a/blocks/blocks.yaml +++ b/blocks/blocks.yaml @@ -1,48 +1,38 @@ -# Cyberpunk theme block definitions (codeless .bnp, WO-WZ-021). +# Cyberpunk theme persona block definitions (codeless .bnp, WO-TF-015). # Keys are fully qualified (cyberpunk:) because the codeless loader # registers definitions verbatim — there is no PluginBlockRegistry prefixing # in the codeless path (unlike the wasm/templ path). The qualified keys match -# the hardcoded data-block attributes and the master_pages.json references. +# the data-block attributes and the master_pages.json / seed references. +# +# Builtin-duplicating blocks (hero, cta, navbar, footer, feature grid, stats) +# are NOT theme blocks — they are template overrides in +# templates/overrides/cyberpunk/. Only true persona furniture lives here. blocks: - - key: cyberpunk:hero_glitch - title: Glitch Hero - description: RGB-split H1, neon CTA, optional scanline overlay toggle. + - key: cyberpunk:glitch_hero + title: Glitch Boot Hero + description: Terminal boot-console hero — glitch headline, typed boot lines, neon CTAs. Persona furniture (distinct from the builtin hero override). category: layout - schema: hero_glitch.schema.json - template: hero_glitch.ninjatpl - - key: cyberpunk:cta_terminal - title: Terminal CTA - description: Faux $ prompt with blinking caret and copy button. + schema: glitch_hero.schema.json + template: glitch_hero.ninjatpl + sample_data: glitch_hero.sample.json + - key: cyberpunk:roster_grid + title: Roster Grid + description: Crew / studio roster — neon HUD cards with handle, role, and status dot. category: layout - schema: cta_terminal.schema.json - template: cta_terminal.ninjatpl - - key: cyberpunk:navbar_terminal - title: Terminal Navbar - description: Mono-spaced navbar with $ command prefix and optional status dot. - category: navigation - schema: navbar_terminal.schema.json - template: navbar_terminal.ninjatpl - - key: cyberpunk:footer_grid - title: Grid Footer - description: Mono columns, build-hash + uptime status pill. - category: navigation - schema: footer_grid.schema.json - template: footer_grid.ninjatpl - - key: cyberpunk:feature_card_neon - title: Neon Feature Card - description: Single feature card with per-card neon edge glow (magenta/cyan/lime). - category: layout - schema: feature_card_neon.schema.json - template: feature_card_neon.ninjatpl - - key: cyberpunk:stats_glow - title: Glow Stats - description: Big mono numerals with neon accent underline. - category: display - schema: stats_glow.schema.json - template: stats_glow.ninjatpl + schema: roster_grid.schema.json + template: roster_grid.ninjatpl + sample_data: roster_grid.sample.json + - key: cyberpunk:patch_notes + title: Patch Notes + description: Changelog feed — versioned entries with tag chips and a mono item list. + category: content + schema: patch_notes.schema.json + template: patch_notes.ninjatpl + sample_data: patch_notes.sample.json - key: cyberpunk:code_neon title: Code Block - description: Server-rendered code block with neon edge and optional copy button. + description: Server-rendered code block with language label, neon edge, and a copy button. category: content schema: code_neon.schema.json template: code_neon.ninjatpl + sample_data: code_neon.sample.json diff --git a/blocks/code_neon.ninjatpl b/blocks/code_neon.ninjatpl index 32685d8..04254f4 100644 --- a/blocks/code_neon.ninjatpl +++ b/blocks/code_neon.ninjatpl @@ -1 +1,12 @@ -
{{ language|default:'text' }}{% if copy != false and copy != "false" and copy != "off" and copy != "no" and copy != "0" and copy != "" %} {% endif %}
{{ code }}
+
{{ language|default:'text' }}{% if copy != false and copy != "false" and copy != "off" and copy != "no" and copy != "0" and copy != "" %} {% endif %}
{{ code }}
diff --git a/blocks/code_neon.sample.json b/blocks/code_neon.sample.json new file mode 100644 index 0000000..34ab777 --- /dev/null +++ b/blocks/code_neon.sample.json @@ -0,0 +1,5 @@ +{ + "language": "bash", + "code": "npm install @neon-forge/sdk\nnpx neon-forge init my-game\nnpx neon-forge ship --stage prod", + "copy": "on" +} diff --git a/blocks/cta_terminal.ninjatpl b/blocks/cta_terminal.ninjatpl deleted file mode 100644 index 9b8d474..0000000 --- a/blocks/cta_terminal.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{{ prompt|default:'$ npm i your-thing' }}
{% if button|default:'Copy' %}{{ button|default:'Copy' }}{% endif %}
diff --git a/blocks/cta_terminal.schema.json b/blocks/cta_terminal.schema.json deleted file mode 100644 index 65f2730..0000000 --- a/blocks/cta_terminal.schema.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Terminal CTA", - "description": "Faux $ prompt strip with blinking caret and optional copy-to-clipboard.", - "type": "object", - "properties": { - "prompt": { - "type": "string", - "title": "Prompt", - "description": "The command text following the $ glyph (e.g. npm i your-thing)", - "x-editor": "text" - }, - "button": { - "type": "string", - "title": "Button label", - "description": "Label for the action button (e.g. Copy)", - "x-editor": "text" - }, - "href": { - "type": "string", - "title": "Button URL", - "description": "Optional URL the button points at when copy is off", - "x-editor": "link" - }, - "copyable": { - "type": "string", - "title": "Copy to clipboard", - "description": "When 'on' the button copies the prompt text instead of navigating", - "x-editor": "select", - "enum": ["on", "off"], - "default": "on" - } - } -} diff --git a/blocks/feature_card_neon.ninjatpl b/blocks/feature_card_neon.ninjatpl deleted file mode 100644 index a8adae3..0000000 --- a/blocks/feature_card_neon.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if icon %}
{% endif %}

{{ title|default:'Feature' }}

{% if body %}
{{ body|safe }}
{% endif %}
diff --git a/blocks/feature_card_neon.schema.json b/blocks/feature_card_neon.schema.json deleted file mode 100644 index 7feebf4..0000000 --- a/blocks/feature_card_neon.schema.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Neon Feature Card", - "description": "Single feature card with icon, title, body and per-card neon edge glow.", - "type": "object", - "properties": { - "icon": { - "type": "string", - "title": "Icon", - "description": "Media reference for the feature icon", - "x-editor": "media" - }, - "title": { - "type": "string", - "title": "Title", - "description": "Card heading", - "x-editor": "text" - }, - "body": { - "type": "string", - "title": "Body", - "description": "Supporting rich text", - "x-editor": "richtext" - }, - "accent": { - "type": "string", - "title": "Accent", - "description": "Neon edge colour: magenta, cyan or lime", - "x-editor": "select", - "enum": ["magenta", "cyan", "lime"], - "default": "magenta" - } - } -} diff --git a/blocks/footer_grid.ninjatpl b/blocks/footer_grid.ninjatpl deleted file mode 100644 index f86f66f..0000000 --- a/blocks/footer_grid.ninjatpl +++ /dev/null @@ -1 +0,0 @@ - diff --git a/blocks/footer_grid.schema.json b/blocks/footer_grid.schema.json deleted file mode 100644 index e751dcd..0000000 --- a/blocks/footer_grid.schema.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Grid Footer", - "description": "Multi-column footer with mono column titles, optional status pill, and a build-hash readout.", - "type": "object", - "properties": { - "showStatus": { - "type": "string", - "title": "Show status pill", - "description": "Display the OK/uptime status pill at the bottom right", - "x-editor": "select", - "enum": ["on", "off"], - "default": "on" - }, - "buildHash": { - "type": "string", - "title": "Build hash", - "description": "Short build hash or version readout (e.g. 'a1b2c3' or 'auto')", - "x-editor": "text" - }, - "columns": { - "type": "array", - "title": "Columns", - "description": "Footer columns with links", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string", - "title": "Column title", - "x-editor": "text" - }, - "links": { - "type": "array", - "title": "Links", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "label": { "type": "string", "title": "Label", "x-editor": "text" }, - "href": { "type": "string", "title": "Href", "x-editor": "text" } - } - } - } - } - } - } - } -} diff --git a/blocks/glitch_hero.ninjatpl b/blocks/glitch_hero.ninjatpl new file mode 100644 index 0000000..d2d4219 --- /dev/null +++ b/blocks/glitch_hero.ninjatpl @@ -0,0 +1,19 @@ +{# cyberpunk:glitch_hero — persona boot-console hero. Terminal boot lines, glitch wordmark, neon CTAs. No canvas (the builtin hero override owns the digital-rain showpiece). #} +
+ +
+
+ {% if bootLines %}
+ {% for line in bootLines %}
$ {{ line.text }}
{% endfor %} +
$ _
+
{% endif %} + {% if eyebrow %}

{{ eyebrow }}

{% endif %} + {% if headline %}

{{ headline }}

{% endif %} + {% if subhead %}

{{ subhead }}

{% endif %} + {% if primaryLabel or secondaryLabel %}
+ {% if primaryLabel and primaryUrl %}{{ primaryLabel }}{% endif %} + {% if secondaryLabel and secondaryUrl %}{{ secondaryLabel }}{% endif %} +
{% endif %} +
+
+
diff --git a/blocks/glitch_hero.sample.json b/blocks/glitch_hero.sample.json new file mode 100644 index 0000000..35d4038 --- /dev/null +++ b/blocks/glitch_hero.sample.json @@ -0,0 +1,14 @@ +{ + "eyebrow": "Build 2.049.0", + "headline": "Ship the impossible", + "subhead": "A game studio and the tools that ship it. Engine, live ops, and a build farm that never sleeps.", + "primaryLabel": "Get the SDK", + "primaryUrl": "/contact", + "secondaryLabel": "Read the docs", + "secondaryUrl": "/blog", + "bootLines": [ + { "text": "init neon-forge core ... ok" }, + { "text": "mount render pipeline ... ok" }, + { "text": "link shader cache ... ok" } + ] +} diff --git a/blocks/glitch_hero.schema.json b/blocks/glitch_hero.schema.json new file mode 100644 index 0000000..d9f286c --- /dev/null +++ b/blocks/glitch_hero.schema.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Glitch Boot Hero", + "description": "Terminal boot-console hero with a glitch wordmark and neon CTAs.", + "type": "object", + "properties": { + "eyebrow": { "type": "string", "title": "Eyebrow", "x-editor": "text" }, + "headline": { "type": "string", "title": "Headline", "x-editor": "text" }, + "subhead": { "type": "string", "title": "Subheadline", "x-editor": "textarea" }, + "primaryLabel": { "type": "string", "title": "Primary button label", "x-editor": "text" }, + "primaryUrl": { "type": "string", "title": "Primary button URL", "x-editor": "link" }, + "secondaryLabel": { "type": "string", "title": "Secondary button label", "x-editor": "text" }, + "secondaryUrl": { "type": "string", "title": "Secondary button URL", "x-editor": "link" }, + "bootLines": { + "type": "array", + "title": "Boot lines", + "description": "Faux terminal boot lines shown above the headline", + "default": [], + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "text": { "type": "string", "title": "Line", "x-editor": "text" } + } + } + }, + "class": { "type": "string", "title": "CSS Classes", "x-editor": "text" } + } +} diff --git a/blocks/hero_glitch.ninjatpl b/blocks/hero_glitch.ninjatpl deleted file mode 100644 index 48ec8fa..0000000 --- a/blocks/hero_glitch.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if scanlines != false and scanlines != "false" and scanlines != "off" and scanlines != "no" and scanlines != "0" and scanlines != "" %}{% endif %}
{% if eyebrow %}

{{ eyebrow }}

{% endif %}

{{ headline|default:'// hero headline' }}

{% if sub %}

{{ sub }}

{% endif %}
{% if cta.label %}{{ cta.label }} {% endif %}{% if secondaryCta.label %}{{ secondaryCta.label }}{% endif %}
diff --git a/blocks/hero_glitch.schema.json b/blocks/hero_glitch.schema.json deleted file mode 100644 index eecd597..0000000 --- a/blocks/hero_glitch.schema.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Glitch Hero", - "description": "Cyberpunk hero section with RGB-split H1, eyebrow, sub, primary + secondary CTAs and an optional scanline overlay.", - "type": "object", - "properties": { - "eyebrow": { - "type": "string", - "title": "Eyebrow", - "description": "Short mono caps label above the headline (e.g. NEW)", - "x-editor": "text" - }, - "headline": { - "type": "string", - "title": "Headline", - "description": "Main H1; rendered with RGB-split glitch text-shadow", - "x-editor": "text" - }, - "sub": { - "type": "string", - "title": "Sub", - "description": "Supporting paragraph beneath the headline", - "x-editor": "textarea" - }, - "cta": { - "type": "object", - "title": "Primary CTA", - "description": "Primary call to action {label, href}", - "x-editor": "link", - "properties": { - "label": { "type": "string", "title": "Label", "x-editor": "text" }, - "href": { "type": "string", "title": "Href", "x-editor": "text" } - } - }, - "secondaryCta": { - "type": "object", - "title": "Secondary CTA", - "description": "Optional secondary call to action {label, href}", - "x-editor": "link", - "properties": { - "label": { "type": "string", "title": "Label", "x-editor": "text" }, - "href": { "type": "string", "title": "Href", "x-editor": "text" } - } - }, - "scanlines": { - "type": "string", - "title": "Scanlines", - "description": "Toggle the 4% scanline overlay inside the hero section", - "x-editor": "select", - "enum": ["on", "off"], - "default": "on" - } - } -} diff --git a/blocks/navbar_terminal.ninjatpl b/blocks/navbar_terminal.ninjatpl deleted file mode 100644 index edda2c2..0000000 --- a/blocks/navbar_terminal.ninjatpl +++ /dev/null @@ -1 +0,0 @@ - diff --git a/blocks/navbar_terminal.schema.json b/blocks/navbar_terminal.schema.json deleted file mode 100644 index 29b3154..0000000 --- a/blocks/navbar_terminal.schema.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Terminal Navbar", - "description": "Replaces the built-in navbar with a mono-spaced $ prompt navbar, optional status dot, and a tap-friendly mobile menu toggle.", - "type": "object", - "properties": { - "menuName": { - "type": "string", - "title": "Menu", - "description": "Slug of the CMS menu to render (e.g. 'main')", - "x-editor": "menu-select" - }, - "commandPrefix": { - "type": "string", - "title": "Command prefix", - "description": "Leading prompt characters (default '~/')", - "x-editor": "text", - "default": "~/" - }, - "statusDot": { - "type": "string", - "title": "Status dot", - "description": "Show a glowing status indicator (uptime hint)", - "x-editor": "select", - "enum": ["on", "off"], - "default": "on" - } - } -} diff --git a/blocks/patch_notes.ninjatpl b/blocks/patch_notes.ninjatpl new file mode 100644 index 0000000..3bd4261 --- /dev/null +++ b/blocks/patch_notes.ninjatpl @@ -0,0 +1,21 @@ +{# cyberpunk:patch_notes — changelog feed. Versioned entries with tag chip + mono item list. #} +
+
+ {% if heading %}

{{ heading }}

{% endif %} + {% if intro %}

{{ intro }}

{% endif %} +
    + {% for entry in entries %} +
  1. +
    + {% if entry.version %}{{ entry.version }}{% endif %} + {% if entry.tag %}{{ entry.tag }}{% endif %} + {% if entry.date %}{{ entry.date }}{% endif %} +
    + {% if entry.items %}
      + {% for item in entry.items %}
    • +{{ item.text }}
    • {% endfor %} +
    {% endif %} +
  2. + {% endfor %} +
+
+
diff --git a/blocks/patch_notes.sample.json b/blocks/patch_notes.sample.json new file mode 100644 index 0000000..4317225 --- /dev/null +++ b/blocks/patch_notes.sample.json @@ -0,0 +1,32 @@ +{ + "heading": "Patch notes", + "intro": "What changed, build by build.", + "entries": [ + { + "version": "v2.049.0", + "date": "2049.04.01", + "tag": "FEATURE", + "items": [ + { "text": "New render path: volumetric neon fog on all night maps." }, + { "text": "Build farm now caches shaders across branches." } + ] + }, + { + "version": "v2.048.3", + "date": "2049.03.18", + "tag": "FIX", + "items": [ + { "text": "Fixed a stall when hot-reloading materials." }, + { "text": "Netcode: reduced desync on 200ms links." } + ] + }, + { + "version": "v2.048.0", + "date": "2049.03.02", + "tag": "BALANCE", + "items": [ + { "text": "Tuned dash cooldown from 4s to 3.2s." } + ] + } + ] +} diff --git a/blocks/patch_notes.schema.json b/blocks/patch_notes.schema.json new file mode 100644 index 0000000..f1b7e00 --- /dev/null +++ b/blocks/patch_notes.schema.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Patch Notes", + "description": "Changelog feed of versioned entries with tag chips.", + "type": "object", + "properties": { + "heading": { "type": "string", "title": "Heading", "x-editor": "text" }, + "intro": { "type": "string", "title": "Intro", "x-editor": "textarea" }, + "entries": { + "type": "array", + "title": "Entries", + "default": [], + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "version": { "type": "string", "title": "Version", "description": "e.g. v2.049.0", "x-editor": "text" }, + "date": { "type": "string", "title": "Date", "x-editor": "text" }, + "tag": { "type": "string", "title": "Tag", "description": "e.g. FEATURE / FIX / BALANCE", "x-editor": "text" }, + "items": { + "type": "array", + "title": "Items", + "default": [], + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "text": { "type": "string", "title": "Line", "x-editor": "text" } + } + } + } + } + } + }, + "class": { "type": "string", "title": "CSS Classes", "x-editor": "text" } + } +} diff --git a/blocks/roster_grid.ninjatpl b/blocks/roster_grid.ninjatpl new file mode 100644 index 0000000..c2f279d --- /dev/null +++ b/blocks/roster_grid.ninjatpl @@ -0,0 +1,23 @@ +{# cyberpunk:roster_grid — crew / studio roster. Neon HUD cards with handle, role, status dot. #} +
+
+ {% 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 %} +
+ {% if member.name %}

{{ member.name }}

{% endif %} + {% if member.handle %}

{{ member.handle }}

{% endif %} +

+ {% if member.status %}{% endif %} + {% if member.role %}{{ member.role }}{% endif %} +

+
+
+ {% endfor %} +
+
+
diff --git a/blocks/roster_grid.sample.json b/blocks/roster_grid.sample.json new file mode 100644 index 0000000..cd6ace5 --- /dev/null +++ b/blocks/roster_grid.sample.json @@ -0,0 +1,13 @@ +{ + "eyebrow": "The crew", + "heading": "Who ships this", + "intro": "A small team that builds the engine, the game, and the pipeline in between.", + "members": [ + { "name": "Nova Reyes", "handle": "@nova", "role": "Engine lead", "status": true }, + { "name": "Kai Okafor", "handle": "@kaisdf", "role": "Graphics", "status": true }, + { "name": "Sable Lin", "handle": "@sable", "role": "Live ops", "status": false }, + { "name": "Juno Vale", "handle": "@juno", "role": "Gameplay", "status": true }, + { "name": "Rin Castellano", "handle": "@rin", "role": "Tools", "status": true }, + { "name": "Ash Mori", "handle": "@ash", "role": "Netcode", "status": false } + ] +} diff --git a/blocks/roster_grid.schema.json b/blocks/roster_grid.schema.json new file mode 100644 index 0000000..c5375c6 --- /dev/null +++ b/blocks/roster_grid.schema.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Roster Grid", + "description": "Crew / studio roster of neon HUD cards.", + "type": "object", + "properties": { + "eyebrow": { "type": "string", "title": "Eyebrow", "x-editor": "text" }, + "heading": { "type": "string", "title": "Heading", "x-editor": "text" }, + "intro": { "type": "string", "title": "Intro", "x-editor": "textarea" }, + "members": { + "type": "array", + "title": "Members", + "default": [], + "x-editor": "collection", + "items": { + "type": "object", + "properties": { + "name": { "type": "string", "title": "Name", "x-editor": "text" }, + "handle": { "type": "string", "title": "Handle", "description": "e.g. @nova", "x-editor": "text" }, + "role": { "type": "string", "title": "Role", "x-editor": "text" }, + "avatar": { "type": "string", "title": "Avatar", "x-editor": "media" }, + "status": { "type": "boolean", "title": "Show online dot", "default": true, "x-editor": "checkbox" } + } + } + }, + "class": { "type": "string", "title": "CSS Classes", "x-editor": "text" } + } +} diff --git a/blocks/stats_glow.ninjatpl b/blocks/stats_glow.ninjatpl deleted file mode 100644 index 046faa0..0000000 --- a/blocks/stats_glow.ninjatpl +++ /dev/null @@ -1 +0,0 @@ -
{% if items %}
{% for stat in items %}
{{ stat.value }}{% if stat.suffix %} {{ stat.suffix }}{% endif %}
{{ stat.label }}
{% endfor %}
{% else %}
// add items to render stats
{% endif %}
diff --git a/blocks/stats_glow.schema.json b/blocks/stats_glow.schema.json deleted file mode 100644 index 81f4304..0000000 --- a/blocks/stats_glow.schema.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Glow Stats", - "description": "Big mono numerals with accent underline and short labels.", - "type": "object", - "properties": { - "items": { - "type": "array", - "title": "Items", - "description": "Stats to display", - "default": [], - "x-editor": "collection", - "items": { - "type": "object", - "properties": { - "value": { - "type": "string", - "title": "Value", - "description": "Big numeric or string value (e.g. 99.99)", - "x-editor": "text" - }, - "label": { - "type": "string", - "title": "Label", - "description": "Short uppercase caption beneath the value", - "x-editor": "text" - }, - "suffix": { - "type": "string", - "title": "Suffix", - "description": "Trailing unit or symbol (e.g. % or ms), accent-coloured", - "x-editor": "text" - } - } - } - } - } -} diff --git a/fonts.json b/fonts.json index fe51488..b0027fd 100644 --- a/fonts.json +++ b/fonts.json @@ -1 +1,28 @@ -[] +[ + { + "name": "Orbitron", + "family": "Orbitron", + "variants": [ + { "weight": "500", "style": "normal", "file": "fonts/orbitron-latin.woff2" }, + { "weight": "700", "style": "normal", "file": "fonts/orbitron-latin.woff2" }, + { "weight": "900", "style": "normal", "file": "fonts/orbitron-latin.woff2" } + ] + }, + { + "name": "Share Tech Mono", + "family": "Share Tech Mono", + "variants": [ + { "weight": "400", "style": "normal", "file": "fonts/share-tech-mono-latin.woff2" } + ] + }, + { + "name": "Inter", + "family": "Inter", + "variants": [ + { "weight": "400", "style": "normal", "file": "fonts/inter-latin.woff2" }, + { "weight": "500", "style": "normal", "file": "fonts/inter-latin.woff2" }, + { "weight": "600", "style": "normal", "file": "fonts/inter-latin.woff2" }, + { "weight": "700", "style": "normal", "file": "fonts/inter-latin.woff2" } + ] + } +] diff --git a/manifest.yaml b/manifest.yaml index 2f01fd7..4274d8d 100644 --- a/manifest.yaml +++ b/manifest.yaml @@ -1,41 +1,110 @@ -# Cyberpunk theme — codeless .bnp manifest (WO-WZ-021 Phase B). +# Cyberpunk theme — codeless .bnp manifest (WO-TF-015, Wave A). # Synthesized into manifest.pb by `ninja plugin build` (no plugin.wasm). theme_presets: presets.json bundled_fonts: fonts.json master_pages: master_pages.json +required_icon_packs: ["lucide", "simple-icons"] system_templates: - key: cyberpunk title: Cyberpunk - description: "Neon-on-black BlockNinja theme with glitch motifs, monospace accents, and magenta/cyan/lime tri-accent palette for SaaS, dev tools, and crypto." + description: "Neon-on-black game-studio / hacker-collective theme — RGB-split glitch, CRT scanlines, HUD brackets, angled clip cuts, and a canvas digital-rain hero." page_templates: - system: cyberpunk key: default title: Default - description: "Standard dark page with scanline overlay, sticky terminal-style header" + description: "Standard dark page with scanline overlay and a sticky terminal-style header" slots: [header, main, footer] - - system: cyberpunk - key: landing - title: Landing - description: "Hero with glitch H1, neon CTA, feature grid, social proof, footer" - slots: [hero, features, cta, footer] - - system: cyberpunk - key: article - title: Article - description: "Mono-metadata header, prose column, code-friendly aside" - slots: [header, main, aside, footer] - system: cyberpunk key: full-width title: Full Width description: "Edge-to-edge dashboard / showcase layout, no max-width" slots: [header, main, footer] + - system: cyberpunk + key: landing + title: Landing + description: "Canvas digital-rain hero, neon feature grid, glowing CTA, footer" + slots: [header, main, footer] + - system: cyberpunk + key: article + title: Article + description: "Mono-metadata header, prose column, HUD-framed aside" + slots: [header, main, aside, footer] + - system: cyberpunk + key: blog-index + title: Blog Index + description: "Patch-notes feed layout with neon post cards and sidebar" + slots: [header, main, footer] + - system: cyberpunk + key: contact + title: Contact + description: "Terminal contact console — form panel plus HUD contact card" + slots: [header, main, footer] + - system: cyberpunk + key: auth + title: Auth + description: "Centered neon auth console for login / register / reset" + slots: [header, main, footer] +# All 49 mandatory-tier builtin overrides (OVERRIDE-CONTRACT §1), dashed keys. template_overrides: + # Chrome (4) + - { template: cyberpunk, block: navbar } + - { template: cyberpunk, block: footer } + - { template: cyberpunk, block: utility-bar } + - { template: cyberpunk, block: announcement-bar } + # Marketing (12) + - { template: cyberpunk, block: hero } + - { template: cyberpunk, block: feature-grid } + - { template: cyberpunk, block: rich-section } + - { template: cyberpunk, block: stats } + - { template: cyberpunk, block: testimonial } + - { template: cyberpunk, block: logo-strip } + - { template: cyberpunk, block: pricing } + - { template: cyberpunk, block: team } + - { template: cyberpunk, block: faq } + - { template: cyberpunk, block: timeline } + - { template: cyberpunk, block: cta } + - { template: cyberpunk, block: countdown } + # Primitives (11) - { template: cyberpunk, block: heading } - { template: cyberpunk, block: text } + - { template: cyberpunk, block: rich-text } + - { template: cyberpunk, block: image } + - { template: cyberpunk, block: quote } + - { template: cyberpunk, block: divider } - { template: cyberpunk, block: button } - { template: cyberpunk, block: card } + - { template: cyberpunk, block: gallery } + - { template: cyberpunk, block: video-embed } + - { template: cyberpunk, block: audio-embed } + # Commerce / local (6) + - { template: cyberpunk, block: menu-list } + - { template: cyberpunk, block: event-list } + - { template: cyberpunk, block: contact-form } + - { template: cyberpunk, block: contact-card } + - { template: cyberpunk, block: hours-location } + - { template: cyberpunk, block: social-links } + # Blog family (12) + - { template: cyberpunk, block: blog-hero } + - { template: cyberpunk, block: featured-posts } + - { template: cyberpunk, block: related-posts } + - { template: cyberpunk, block: popular-posts } + - { template: cyberpunk, block: category-list } + - { template: cyberpunk, block: post-hero } + - { template: cyberpunk, block: post-metadata } + - { template: cyberpunk, block: author-bio } + - { template: cyberpunk, block: author-bio-hero } + - { template: cyberpunk, block: newsletter-signup } + - { template: cyberpunk, block: breadcrumbs } + - { template: cyberpunk, block: sidebar-nav } + # Auth surface (3) + - { template: cyberpunk, block: auth-form } + - { template: cyberpunk, block: password-reset-form } + - { template: cyberpunk, block: auth-status } + # System (1) + - { template: cyberpunk, block: page-suggestions } email_wrappers: - cyberpunk @@ -43,51 +112,65 @@ email_wrappers: css: input_css_append: | /* ============================================================ - Cyberpunk — Neon-on-black BlockNinja theme - Scanlines / glitch / RGB-split / caret-blink / neon-edge utilities. + Cyberpunk — Neon-on-black game-studio / hacker-collective theme + (WO-TF-015). Scanlines / glitch / RGB-split / caret-blink / + neon-edge / HUD-bracket / clip-cut / digital-rain utilities. All colours consume the host shadcn HSL tokens via hsl(var(--token)). No hardcoded hex / rgb / named colours. ============================================================ */ - - /* --- Typography fallbacks --------------------------------- */ - + + /* --- Typography ------------------------------------------- */ + /* Families flow through the admin-bound CSS variables; the fallback + leads with the bundled OFL family so the intended look survives + before the admin assigns a slot. @font-face for the bundled + families is auto-emitted from fonts.json (source=template rows). */ + .cyberpunk-body { font-family: var(--font-body, "Inter", system-ui, -apple-system, "Segoe UI", sans-serif); } - + .cyberpunk-mono, - .cyberpunk-mono *, .cyberpunk-mono code, pre.cyberpunk-mono, code.cyberpunk-mono { - font-family: var(--font-mono, "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace); + font-family: var(--font-mono, "Share Tech Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace); } - + .cyberpunk-display { - font-family: var(--font-heading, "Space Grotesk", system-ui, -apple-system, "Segoe UI", sans-serif); - letter-spacing: -0.01em; + font-family: var(--font-heading, "Orbitron", system-ui, -apple-system, "Segoe UI", sans-serif); + letter-spacing: 0.01em; } - + .cyberpunk-prose, .cyberpunk-prose p, .cyberpunk-prose li { font-family: var(--font-body, "Inter", system-ui, sans-serif); line-height: 1.75; } - + + /* Eyebrow / kicker: mono, uppercase, wide-tracked accent readout. Carries + enough on its own that it is never a silent no-op when used alone. */ + .cyberpunk-eyebrow { + font-family: var(--font-mono, "Share Tech Mono", ui-monospace, monospace); + text-transform: uppercase; + letter-spacing: 0.2em; + font-size: 0.75rem; + color: hsl(var(--accent)); + } + .cyberpunk-prose code { color: hsl(var(--accent)); background-color: hsl(var(--muted)); padding: 0.125rem 0.375rem; border-radius: 0.25rem; - font-family: var(--font-mono, "JetBrains Mono", ui-monospace, monospace); + font-family: var(--font-mono, "Share Tech Mono", ui-monospace, monospace); font-size: 0.875em; } - + /* --- Scanlines -------------------------------------------- */ - + .scanlines { - opacity: 0.04; + opacity: 0.05; background-image: linear-gradient( to bottom, hsl(var(--foreground)) 0px, @@ -98,14 +181,14 @@ css: background-size: 100% 3px; animation: scanline-drift 6s linear infinite; } - + @keyframes scanline-drift { 0% { background-position: 0 0; } 100% { background-position: 0 3px; } } - - /* --- Glitch (RGB-split text-shadow) on H1/H2 -------------- */ - + + /* --- Glitch (RGB-split text-shadow) on big headings ------- */ + .glitch { position: relative; text-shadow: @@ -113,55 +196,37 @@ css: 2px 0 hsl(var(--accent)); animation: glitch-x 3.6s steps(1, end) infinite; } - + @keyframes glitch-x { 0%, 92%, 100% { - text-shadow: - -2px 0 hsl(var(--primary)), - 2px 0 hsl(var(--accent)); + text-shadow: -2px 0 hsl(var(--primary)), 2px 0 hsl(var(--accent)); } 93% { - text-shadow: - -3px 0 hsl(var(--primary)), - 3px 0 hsl(var(--accent)), - 0 1px hsl(var(--accent)); + text-shadow: -3px 0 hsl(var(--primary)), 3px 0 hsl(var(--accent)), 0 1px hsl(var(--accent)); } 95% { - text-shadow: - -1px 0 hsl(var(--accent)), - 4px 0 hsl(var(--primary)); + text-shadow: -1px 0 hsl(var(--accent)), 4px 0 hsl(var(--primary)); } 97% { - text-shadow: - -2px 0 hsl(var(--primary)), - 2px 0 hsl(var(--accent)); + text-shadow: -2px 0 hsl(var(--primary)), 2px 0 hsl(var(--accent)); } } - + /* --- RGB-split hover/focus/active on primary buttons ------ */ - + .rgb-split { transition: transform 120ms ease, box-shadow 120ms ease; } - .rgb-split:hover, .rgb-split:focus-visible { - box-shadow: - -2px 0 0 hsl(var(--primary)), - 2px 0 0 hsl(var(--accent)); + box-shadow: -2px 0 0 hsl(var(--primary)), 2px 0 0 hsl(var(--accent)); transform: translateY(-1px); } - - /* Touch tap-flash fallback (iOS strips :hover after touchend) */ .cyberpunk-btn:active, .rgb-split:active, button.cyberpunk-btn:active { - box-shadow: - -2px 0 0 hsl(var(--primary)), - 2px 0 0 hsl(var(--accent)); + box-shadow: -2px 0 0 hsl(var(--primary)), 2px 0 0 hsl(var(--accent)); } - - /* :focus-visible ring uses the ring token, not browser default */ .cyberpunk-btn:focus-visible, .cyberpunk-btn-ghost:focus-visible, button:focus-visible, @@ -169,109 +234,144 @@ css: outline: 2px solid hsl(var(--ring)); outline-offset: 2px; } - + /* --- Caret blink ------------------------------------------ */ - + .caret-blink { display: inline-block; animation: caret 1.05s steps(2, end) infinite; } - @keyframes caret { - 0%, 50% { opacity: 1; } + 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } - - /* --- Neon edge utilities (magenta / cyan / lime) ---------- */ - + + /* --- Neon edge utilities (magenta / cyan / lime channels) - */ + /* --primary is the lead accent, --accent the secondary, --ring + the third neon channel (present in every preset). */ + .neon-edge-magenta { - box-shadow: - 0 0 0 1px hsl(var(--primary) / 0.4), - 0 0 18px hsl(var(--primary) / 0.25); + box-shadow: 0 0 0 1px hsl(var(--primary) / 0.4), 0 0 18px hsl(var(--primary) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-magenta:hover, .neon-edge-magenta:focus-within { - box-shadow: - 0 0 0 1px hsl(var(--primary) / 0.85), - 0 0 28px hsl(var(--primary) / 0.45); + box-shadow: 0 0 0 1px hsl(var(--primary) / 0.85), 0 0 28px hsl(var(--primary) / 0.42); transform: translateY(-1px); } - .neon-edge-cyan { - box-shadow: - 0 0 0 1px hsl(var(--accent) / 0.4), - 0 0 18px hsl(var(--accent) / 0.25); + box-shadow: 0 0 0 1px hsl(var(--accent) / 0.4), 0 0 18px hsl(var(--accent) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-cyan:hover, .neon-edge-cyan:focus-within { - box-shadow: - 0 0 0 1px hsl(var(--accent) / 0.85), - 0 0 28px hsl(var(--accent) / 0.45); + box-shadow: 0 0 0 1px hsl(var(--accent) / 0.85), 0 0 28px hsl(var(--accent) / 0.42); transform: translateY(-1px); } - .neon-edge-lime { - /* Lime accent is the toxic-bloom primary; magenta-noir uses the primary - token. We reuse --ring as a third neon channel so this utility renders - visibly across all three presets. */ - box-shadow: - 0 0 0 1px hsl(var(--ring) / 0.4), - 0 0 18px hsl(var(--ring) / 0.25); + box-shadow: 0 0 0 1px hsl(var(--ring) / 0.4), 0 0 18px hsl(var(--ring) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-lime:hover, .neon-edge-lime:focus-within { - box-shadow: - 0 0 0 1px hsl(var(--ring) / 0.85), - 0 0 28px hsl(var(--ring) / 0.45); + box-shadow: 0 0 0 1px hsl(var(--ring) / 0.85), 0 0 28px hsl(var(--ring) / 0.42); transform: translateY(-1px); } - - /* --- Card override dashed border --------------------------- */ - - .cyberpunk-card { + + /* --- HUD corner brackets ---------------------------------- */ + /* Draw two L-brackets (top-left, bottom-right) around any panel. */ + + .hud-frame { position: relative; } - - /* --- Status pill / dot animation -------------------------- */ - + .hud-frame::before, + .hud-frame::after { + content: ""; + position: absolute; + width: 14px; + height: 14px; + pointer-events: none; + z-index: 1; + } + .hud-frame::before { + top: -1px; + left: -1px; + border-top: 2px solid hsl(var(--primary)); + border-left: 2px solid hsl(var(--primary)); + } + .hud-frame::after { + bottom: -1px; + right: -1px; + border-bottom: 2px solid hsl(var(--accent)); + border-right: 2px solid hsl(var(--accent)); + } + + /* --- Angled clip-path cut (arcade panel silhouette) ------- */ + + .clip-cut { + clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 10px, 100% 100%, 10px 100%, 0 calc(100% - 10px)); + } + + /* --- Status pill / dot pulse ------------------------------ */ + .cyberpunk-status-dot { animation: cyberpunk-pulse 2.2s ease-in-out infinite; } - @keyframes cyberpunk-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } - - /* --- Reduced motion: disable glitch, caret, scanline ------ */ - + + /* --- Digital-rain canvas showpiece (hero override only) --- */ + /* The lazy-inits from the hero's inline script. This block + styles the container + the static no-JS neon fallback layer. */ + + .cyberpunk-rain-wrap { + position: absolute; + inset: 0; + overflow: hidden; + pointer-events: none; + } + .cyberpunk-rain-canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; + opacity: 0.5; + } + /* Static fallback: a neon vertical-gradient wash shown until (or instead + of) the canvas. Tokens only. */ + .cyberpunk-rain-fallback { + position: absolute; + inset: 0; + background: + radial-gradient(120% 80% at 50% 0%, hsl(var(--primary) / 0.18), transparent 60%), + radial-gradient(120% 80% at 100% 100%, hsl(var(--accent) / 0.16), transparent 55%), + linear-gradient(to bottom, transparent, hsl(var(--background) / 0.6)); + } + + /* --- Reduced motion: kill all motion --------------------- */ + @media (prefers-reduced-motion: reduce) { .glitch, .caret-blink, .scanlines, - .cyberpunk-status-dot { + .cyberpunk-status-dot, + .cyberpunk-rain-canvas { animation: none !important; animation-duration: 0.01ms !important; } - .glitch { - text-shadow: none; - } - .scanlines { - opacity: 0; - } + .glitch { text-shadow: none; } + .scanlines { opacity: 0; } + .cyberpunk-rain-canvas { display: none; } .rgb-split:hover, - .rgb-split:focus-visible { - transform: none; - } + .rgb-split:focus-visible { transform: none; } } - - /* --- High-contrast: kill scanlines ------------------------ */ - + + /* --- High-contrast: kill scanlines + rain ---------------- */ + @media (prefers-contrast: more) { - .scanlines { - display: none; - } + .scanlines, + .cyberpunk-rain-canvas { display: none; } } diff --git a/master_pages.json b/master_pages.json index ea7776b..b4c2c7f 100644 --- a/master_pages.json +++ b/master_pages.json @@ -1,33 +1,22 @@ [ { - "key": "cyberpunk:default-master", - "title": "Cyberpunk Default Master", - "page_templates": ["default", "article"], + "key": "cyberpunk:site-master", + "title": "Cyberpunk Site Master", + "page_templates": ["default", "full-width", "landing", "article", "blog-index", "contact"], "blocks": [ - { "block_key": "cyberpunk:navbar_terminal", "title": "Top Nav", "content": { "menuName": "main", "commandPrefix": "~/" }, "slot": "header", "sort_order": 0 }, - { "block_key": "slot", "title": "Main Slot", "content": { "slotName": "main", "placeholder": "// content" }, "slot": "main", "sort_order": 0 }, - { "block_key": "cyberpunk:footer_grid", "title": "Site Footer", "content": { "showStatus": true, "buildHash": "auto" }, "slot": "footer", "sort_order": 0 } + { "block_key": "navbar", "title": "Terminal Navbar", "content": { "menuName": "main", "logoType": "text", "logoText": { "text": "NEON//FORGE" }, "companyName": "Neon Forge", "stickyBehavior": "sticky", "cta": { "text": "Get the SDK", "url": "/contact" } }, "slot": "header", "sort_order": 0 }, + { "block_key": "slot", "title": "Main Content", "content": { "slotName": "main", "placeholder": "// page content" }, "slot": "main", "sort_order": 0 }, + { "block_key": "footer", "title": "Grid Footer", "content": { "layout": "columns", "companyName": "Neon Forge", "tagline": "We build games and the tools that ship them.", "copyright": "Neon Forge Collective" }, "slot": "footer", "sort_order": 0 } ] }, { - "key": "cyberpunk:landing-master", - "title": "Cyberpunk Landing Master", - "page_templates": ["landing"], + "key": "cyberpunk:auth-master", + "title": "Cyberpunk Auth Master", + "page_templates": ["auth"], "blocks": [ - { "block_key": "cyberpunk:hero_glitch", "title": "Glitch Hero", "content": { "eyebrow": "NEW", "headline": "Ship like it's 2049", "cta": { "label": "Get the SDK", "href": "#" } }, "slot": "hero", "sort_order": 0 }, - { "block_key": "slot", "title": "Features Slot", "content": { "slotName": "features" }, "slot": "features", "sort_order": 0 }, - { "block_key": "cyberpunk:cta_terminal", "title": "CTA Strip", "content": { "prompt": "$ npm i your-thing", "button": "Copy" }, "slot": "cta", "sort_order": 0 }, - { "block_key": "cyberpunk:footer_grid", "title": "Site Footer", "content": { "showStatus": true }, "slot": "footer", "sort_order": 0 } - ] - }, - { - "key": "cyberpunk:full-master", - "title": "Cyberpunk Full Master", - "page_templates": ["full-width"], - "blocks": [ - { "block_key": "cyberpunk:navbar_terminal", "title": "Top Nav", "content": { "menuName": "main" }, "slot": "header", "sort_order": 0 }, - { "block_key": "slot", "title": "Main Slot", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 }, - { "block_key": "cyberpunk:footer_grid", "title": "Site Footer", "content": { "showStatus": false }, "slot": "footer", "sort_order": 0 } + { "block_key": "navbar", "title": "Terminal Navbar", "content": { "menuName": "main", "logoType": "text", "logoText": { "text": "NEON//FORGE" }, "companyName": "Neon Forge" }, "slot": "header", "sort_order": 0 }, + { "block_key": "slot", "title": "Auth Console", "content": { "slotName": "main" }, "slot": "main", "sort_order": 0 }, + { "block_key": "footer", "title": "Grid Footer", "content": { "layout": "minimal", "companyName": "Neon Forge", "tagline": "We build games and the tools that ship them.", "copyright": "Neon Forge Collective" }, "slot": "footer", "sort_order": 0 } ] } ] diff --git a/plugin.mod b/plugin.mod index a7dcebd..c753f16 100644 --- a/plugin.mod +++ b/plugin.mod @@ -7,3 +7,4 @@ description = "Neon-on-black BlockNinja theme with glitch motifs, monospace acce kind = "theme" categories = ["templates"] tags = ["dark", "neon", "glitch", "monospace", "saas", "developer", "tech", "crypto", "fintech"] +required_icon_packs = ["lucide", "simple-icons"] diff --git a/presets.json b/presets.json index 8ea197f..842ff5f 100644 --- a/presets.json +++ b/presets.json @@ -148,5 +148,105 @@ "ring": "90 100% 55%" } } + }, + { + "id": "hotline", + "name": "Hotline", + "description": "Sunset pink over teal — vaporwave arcade at dusk", + "theme": { + "mode": "both", + "lightColors": { + "background": "30 40% 97%", + "foreground": "300 30% 12%", + "card": "30 35% 99%", + "cardForeground": "300 30% 12%", + "popover": "30 35% 99%", + "popoverForeground": "300 30% 12%", + "primary": "330 95% 55%", + "primaryForeground": "0 0% 100%", + "secondary": "30 35% 92%", + "secondaryForeground": "300 30% 12%", + "muted": "30 25% 94%", + "mutedForeground": "300 15% 40%", + "accent": "170 85% 40%", + "accentForeground": "0 0% 100%", + "destructive": "0 90% 55%", + "destructiveForeground": "0 0% 100%", + "border": "30 30% 87%", + "input": "30 30% 87%", + "ring": "330 95% 55%" + }, + "darkColors": { + "background": "285 35% 7%", + "foreground": "20 40% 94%", + "card": "285 38% 10%", + "cardForeground": "20 40% 94%", + "popover": "285 38% 10%", + "popoverForeground": "20 40% 94%", + "primary": "330 100% 64%", + "primaryForeground": "285 35% 7%", + "secondary": "285 30% 15%", + "secondaryForeground": "20 40% 94%", + "muted": "285 28% 13%", + "mutedForeground": "20 25% 66%", + "accent": "170 90% 55%", + "accentForeground": "285 35% 7%", + "destructive": "0 95% 62%", + "destructiveForeground": "285 35% 7%", + "border": "300 35% 20%", + "input": "300 35% 18%", + "ring": "330 100% 64%" + } + } + }, + { + "id": "ghost-protocol", + "name": "Ghost Protocol", + "description": "Monochrome terminal — white phosphor on black, restrained neon", + "theme": { + "mode": "both", + "lightColors": { + "background": "0 0% 98%", + "foreground": "0 0% 8%", + "card": "0 0% 100%", + "cardForeground": "0 0% 8%", + "popover": "0 0% 100%", + "popoverForeground": "0 0% 8%", + "primary": "0 0% 12%", + "primaryForeground": "0 0% 98%", + "secondary": "0 0% 92%", + "secondaryForeground": "0 0% 8%", + "muted": "0 0% 94%", + "mutedForeground": "0 0% 38%", + "accent": "160 90% 38%", + "accentForeground": "0 0% 100%", + "destructive": "0 85% 50%", + "destructiveForeground": "0 0% 100%", + "border": "0 0% 86%", + "input": "0 0% 86%", + "ring": "160 90% 38%" + }, + "darkColors": { + "background": "0 0% 4%", + "foreground": "150 15% 92%", + "card": "0 0% 7%", + "cardForeground": "150 15% 92%", + "popover": "0 0% 7%", + "popoverForeground": "150 15% 92%", + "primary": "150 90% 60%", + "primaryForeground": "0 0% 4%", + "secondary": "0 0% 12%", + "secondaryForeground": "150 15% 92%", + "muted": "0 0% 10%", + "mutedForeground": "150 8% 62%", + "accent": "150 100% 66%", + "accentForeground": "0 0% 4%", + "destructive": "0 95% 62%", + "destructiveForeground": "0 0% 4%", + "border": "150 15% 16%", + "input": "150 15% 14%", + "ring": "150 90% 60%" + } + } } ] diff --git a/seed/seed.json b/seed/seed.json new file mode 100644 index 0000000..426b51b --- /dev/null +++ b/seed/seed.json @@ -0,0 +1,219 @@ +{ + "demo": true, + "settings": { + "merge": { + "companyName": "Neon Forge", + "tagline": "We build games and the tools that ship them." + } + }, + "data_tables": [ + { + "key": "contact_submissions", + "name": "Contact Enquiries", + "description": "Seeded contact-form submissions for the Neon Forge 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": "studio", "label": "Studio", "type": "text", "required": false }, + { "key": "message", "label": "Message", "type": "text", "required": true } + ] + } + ], + "pages": [ + { + "slug": "/", + "title": "Neon Forge", + "template_key": "landing", + "blocks": [ + { + "block_key": "hero", + "title": "Hero", + "slot": "main", + "sort_order": 1, + "content": { + "template": "centered", + "minHeight": "screen", + "eyebrow": "Build 2.049", + "headline": "Ship the impossible", + "subheadline": "A game studio and the tools that ship it.", + "description": "We build a rendering engine, live ops, and a build farm that never sleeps. Then we make games on top of it.", + "ctaPrimary": { "text": "Get the SDK", "url": "/contact" }, + "ctaSecondary": { "text": "Read the devlog", "url": "/blog" } + } + }, + { + "block_key": "feature-grid", + "title": "What we ship", + "slot": "main", + "sort_order": 2, + "content": { + "eyebrow": "The stack", + "heading": "One pipeline, end to end", + "intro": "Engine, tooling, and live service. Built in house, shipped together.", + "layout": "card", + "columns": 3, + "items": [ + { "icon": "lucide:cpu", "title": "Render engine", "text": "Neon lighting, volumetric fog, and a deferred path tuned for night maps." }, + { "icon": "lucide:terminal", "title": "Build farm", "text": "Shader caching across branches. Green builds in minutes, not hours." }, + { "icon": "lucide:radio", "title": "Live ops", "text": "Ship events, patch balance, and roll back without a redeploy." } + ] + } + }, + { + "block_key": "cyberpunk:roster_grid", + "title": "The crew", + "slot": "main", + "sort_order": 3, + "content": { + "eyebrow": "The crew", + "heading": "Who ships this", + "intro": "A small team that builds the engine, the game, and the pipeline in between.", + "members": [ + { "name": "Nova Reyes", "handle": "@nova", "role": "Engine lead", "status": true }, + { "name": "Kai Okafor", "handle": "@kaisdf", "role": "Graphics", "status": true }, + { "name": "Sable Lin", "handle": "@sable", "role": "Live ops", "status": false }, + { "name": "Juno Vale", "handle": "@juno", "role": "Gameplay", "status": true }, + { "name": "Rin Castellano", "handle": "@rin", "role": "Tools", "status": true }, + { "name": "Ash Mori", "handle": "@ash", "role": "Netcode", "status": false } + ] + } + }, + { + "block_key": "cyberpunk:patch_notes", + "title": "Patch notes", + "slot": "main", + "sort_order": 4, + "content": { + "heading": "Patch notes", + "intro": "What changed, build by build.", + "entries": [ + { "version": "v2.049.0", "date": "2049.04.01", "tag": "FEATURE", "items": [ { "text": "Volumetric neon fog on all night maps." }, { "text": "Build farm caches shaders across branches." } ] }, + { "version": "v2.048.3", "date": "2049.03.18", "tag": "FIX", "items": [ { "text": "Fixed a stall when hot-reloading materials." }, { "text": "Reduced desync on high-latency links." } ] }, + { "version": "v2.048.0", "date": "2049.03.02", "tag": "BALANCE", "items": [ { "text": "Tuned dash cooldown from 4s to 3.2s." } ] } + ] + } + }, + { + "block_key": "cta", + "title": "CTA", + "slot": "main", + "sort_order": 5, + "content": { + "background": "band", + "heading": "Start building tonight", + "text": "Grab the SDK and ship your first build before the coffee runs out.", + "primaryLabel": "Get the SDK", + "primaryUrl": "/contact" + } + } + ] + }, + { + "slug": "/about", + "title": "The studio", + "template_key": "default", + "blocks": [ + { "block_key": "heading", "title": "Heading", "slot": "main", "sort_order": 1, "content": { "text": "The studio", "level": 1 } }, + { "block_key": "rich-text", "title": "Story", "slot": "main", "sort_order": 2, "content": { "html": "

Neon Forge started as a build tool for a game that shipped late. The tool outlived the game. We kept building it, then built more games to prove it out.

Now we run both. The engine and live service on one side, the games that stress test them on the other. Everything we make, we run in production first.

" } }, + { "block_key": "cyberpunk:code_neon", "title": "Quickstart", "slot": "main", "sort_order": 3, "content": { "language": "bash", "code": "npm install @neon-forge/sdk\nnpx neon-forge init my-game\nnpx neon-forge ship --stage prod", "copy": "on" } }, + { "block_key": "divider", "title": "Divider", "slot": "main", "sort_order": 4, "content": { "variant": "line", "weight": "medium" } }, + { "block_key": "quote", "title": "Quote", "slot": "main", "sort_order": 5, "content": { "style": "pull", "quote": "Build the tool. Ship the game. Repeat.", "attribution": "The studio" } } + ] + }, + { + "slug": "/blog", + "title": "Devlog", + "template_key": "blog-index", + "blocks": [ + { "block_key": "card", "title": "Post: Rain", "slot": "main", "sort_order": 1, "content": { "layout": "vertical", "title": "Making it rain", "text": "

How we built a dependency-free digital-rain effect that stays smooth at 60 fps.

", "link": "/blog/making-it-rain", "linkLabel": "Read on" } }, + { "block_key": "card", "title": "Post: Shaders", "slot": "main", "sort_order": 2, "content": { "layout": "vertical", "title": "Caching shaders across branches", "text": "

Green builds in minutes. What we changed in the build farm and why.

", "link": "/blog/caching-shaders", "linkLabel": "Read on" } }, + { "block_key": "card", "title": "Post: Netcode", "slot": "main", "sort_order": 3, "content": { "layout": "vertical", "title": "Netcode on bad links", "text": "

Cutting desync on 200ms connections without rewriting the sim.

", "link": "/blog/netcode-bad-links", "linkLabel": "Read on" } } + ] + }, + { + "slug": "/blog/making-it-rain", + "title": "Making it rain", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Making it rain", "level": 1 } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

The hero on our home page runs a digital-rain canvas. No libraries, no images, just a small script that draws falling glyphs.

The trick is to fade the last frame instead of clearing it. That leaves a trail. Cap the frame rate and it stays cheap, even on a laptop.

" } } + ] + }, + { + "slug": "/blog/caching-shaders", + "title": "Caching shaders across branches", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Caching shaders across branches", "level": 1 } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

Every branch used to recompile the whole shader set. That is minutes per build, times every push.

We keyed the cache on the shader source, not the branch. Two branches that share a shader now share the compile. Builds got short again.

" } } + ] + }, + { + "slug": "/blog/netcode-bad-links", + "title": "Netcode on bad links", + "template_key": "article", + "parent_slug": "/blog", + "blocks": [ + { "block_key": "heading", "title": "Title", "slot": "main", "sort_order": 1, "content": { "text": "Netcode on bad links", "level": 1 } }, + { "block_key": "rich-text", "title": "Body", "slot": "main", "sort_order": 2, "content": { "html": "

Players on slow connections kept desyncing. Rewriting the simulation was off the table.

We added client prediction with a short rollback window. The client guesses, the server corrects, and the gap closes before anyone notices.

" } } + ] + }, + { + "slug": "/contact", + "title": "Contact", + "template_key": "contact", + "blocks": [ + { + "block_key": "contact-form", + "title": "Contact form", + "slot": "main", + "sort_order": 1, + "content": { + "heading": "Request access", + "description": "Tell us what you are building. We reply within one business day.", + "submitLabel": "Request access", + "successMessage": "Message received. We will reply within one business day.", + "fields": [ + { "name": "name", "label": "Your name", "type": "text", "required": true, "width": "half" }, + { "name": "email", "label": "Email", "type": "email", "required": true, "width": "half" }, + { "name": "studio", "label": "Studio", "type": "text", "required": false, "width": "full" }, + { "name": "message", "label": "What are you building", "type": "textarea", "required": true, "width": "full" } + ], + "formConfig": { "enabled": true, "captchaEnabled": false, "targetTable": "contact_submissions" } + } + }, + { + "block_key": "contact-card", + "title": "Reach us", + "slot": "main", + "sort_order": 2, + "content": { + "heading": "Other ways in", + "columns": 3, + "channels": [ + { "icon": "lucide:mail", "label": "Email", "value": "crew@neonforge.dev", "link": "mailto:crew@neonforge.dev" }, + { "icon": "simple-icons:github", "label": "Source", "value": "github.com/neon-forge", "link": "https://github.com/neon-forge" }, + { "icon": "lucide:message-square", "label": "Discord", "value": "Join the build channel", "link": "#" } + ] + } + } + ] + }, + { + "slug": "/login", + "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 } } + ] + } + ], + "menu_items": [ + { "menu": "main", "label": "Home", "page_slug": "/", "sort_order": 1 }, + { "menu": "main", "label": "Studio", "page_slug": "/about", "sort_order": 2 }, + { "menu": "main", "label": "Devlog", "page_slug": "/blog", "sort_order": 3 }, + { "menu": "main", "label": "Contact", "page_slug": "/contact", "sort_order": 4 } + ] +} diff --git a/seed/workflows.json b/seed/workflows.json new file mode 100644 index 0000000..c277456 --- /dev/null +++ b/seed/workflows.json @@ -0,0 +1,19 @@ +{ + "workflows": [ + { + "key": "contact_notify_admins", + "name": "Contact enquiry to admins", + "description": "On a contact-form submission, email the site admins.", + "enabled": true, + "trigger": { "type": "row_inserted", "table": "contact_submissions" }, + "steps": [ + { + "type": "email", + "name": "Email admins", + "template": "Form Submission Notification", + "recipients": { "mode": "admins", "scope": "all" } + } + ] + } + ] +} diff --git a/templates/cyberpunk/article.ninjatpl b/templates/cyberpunk/article.ninjatpl index f29971e..0812832 100644 --- a/templates/cyberpunk/article.ninjatpl +++ b/templates/cyberpunk/article.ninjatpl @@ -1,11 +1,14 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }} -
{{ slots.header|safe }}
-
{{ slots.main|safe }}
+
{{ slots.header|safe }}
+
+
{{ slots.main|safe }}
+ {% if slots.aside %}{% endif %} +
{{ slots.footer|safe }}
{{ body_end_html|safe }} diff --git a/templates/cyberpunk/auth.ninjatpl b/templates/cyberpunk/auth.ninjatpl new file mode 100644 index 0000000..de8b871 --- /dev/null +++ b/templates/cyberpunk/auth.ninjatpl @@ -0,0 +1,14 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + +
{{ slots.header|safe }}
+
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// auth console

{% endif %}
+
+
{{ slots.footer|safe }}
+ {{ body_end_html|safe }} + + diff --git a/templates/cyberpunk/blog-index.ninjatpl b/templates/cyberpunk/blog-index.ninjatpl new file mode 100644 index 0000000..b49bf7b --- /dev/null +++ b/templates/cyberpunk/blog-index.ninjatpl @@ -0,0 +1,12 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + +
{{ slots.header|safe }}
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// no posts yet

{% endif %}
+
{{ slots.footer|safe }}
+ {{ body_end_html|safe }} + + diff --git a/templates/cyberpunk/contact.ninjatpl b/templates/cyberpunk/contact.ninjatpl new file mode 100644 index 0000000..6f171e7 --- /dev/null +++ b/templates/cyberpunk/contact.ninjatpl @@ -0,0 +1,12 @@ + + +{{ head_html|safe }} + + {{ admin_banner_html|safe }} + +
{{ slots.header|safe }}
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// contact console offline

{% endif %}
+
{{ slots.footer|safe }}
+ {{ body_end_html|safe }} + + diff --git a/templates/cyberpunk/default.ninjatpl b/templates/cyberpunk/default.ninjatpl index 519ee3a..dfe726b 100644 --- a/templates/cyberpunk/default.ninjatpl +++ b/templates/cyberpunk/default.ninjatpl @@ -1,11 +1,11 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }}
{{ slots.header|safe }}
-
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

{% endif %}
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// no content blocks assigned

{% endif %}
{{ slots.footer|safe }}
{{ body_end_html|safe }} diff --git a/templates/cyberpunk/full-width.ninjatpl b/templates/cyberpunk/full-width.ninjatpl index 144ba04..0fb82c0 100644 --- a/templates/cyberpunk/full-width.ninjatpl +++ b/templates/cyberpunk/full-width.ninjatpl @@ -1,11 +1,11 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }}
{{ slots.header|safe }}
-
{% if slots.main %}{{ slots.main|safe }}{% else %}

No content blocks assigned to this page.

{% endif %}
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// no content blocks assigned

{% endif %}
{{ slots.footer|safe }}
{{ body_end_html|safe }} diff --git a/templates/cyberpunk/landing.ninjatpl b/templates/cyberpunk/landing.ninjatpl index b070cc0..91b97de 100644 --- a/templates/cyberpunk/landing.ninjatpl +++ b/templates/cyberpunk/landing.ninjatpl @@ -1,12 +1,11 @@ - + {{ head_html|safe }} - + {{ admin_banner_html|safe }} -
{{ slots.hero|safe }}
-
{{ slots.features|safe }}
-
{{ slots.cta|safe }}
+
{{ slots.header|safe }}
+
{% if slots.main %}{{ slots.main|safe }}{% else %}

// no content blocks assigned

{% endif %}
{{ slots.footer|safe }}
{{ body_end_html|safe }} diff --git a/templates/email/cyberpunk.ninjatpl b/templates/email/cyberpunk.ninjatpl index 44f618b..5228fb4 100644 --- a/templates/email/cyberpunk.ninjatpl +++ b/templates/email/cyberpunk.ninjatpl @@ -5,41 +5,45 @@ + {{ site_name }} + body, table, td, p, a, li, blockquote { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } + table, td { mso-table-lspace: 0pt; mso-table-rspace: 0pt; } + img { -ms-interpolation-mode: bicubic; border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none; } + body { margin: 0 !important; padding: 0 !important; width: 100% !important; } + a[x-apple-data-detectors] { color: inherit !important; text-decoration: none !important; } + @media only screen and (max-width: 620px) { + .email-container { width: 100% !important; max-width: 100% !important; } + .content-padding { padding-left: 24px !important; padding-right: 24px !important; } + } + - - {% if preview_text %}{% else %}{% endif %} - + + {% if preview_text %}
{{ preview_text }}
{% endif %} +
-
- +