code wiki / _hdl_build / nx_kit2.nx
nx_kit2.nx source
↩ module page · 336 lines · 35613 B
1// nx_kit2.nx -- ALTERNATE S-class design systems so archetypes stop looking alike. Two COMPLETE, distinct
2// visual languages (own stylesheet + own layout grammar + own components), NOT the nx_sclass_kit reskinned:
3// ke_* = "The Dispatch" -- an editorial / newspaper design (warm paper, double-rule masthead, serif display,
4// drop-cap two-column lead, ruled article list). Used for BLOG/magazine.
5// kg_* = "Exposure" -- a dark, full-bleed gallery (near-black, thin huge type, edge-to-edge tile grid with
6// per-tile generative gradients + hover captions). Used for GALLERY + PORTFOLIO.
7// Both ship ADA by construction (skip-link, lang, <main id=main>, viewport, AAA contrast, reduced-motion) and
8// zero JS / zero third-party CSS. Pure emit functions (no syscalls -> composable by any emitter). license_tier: ORIGINAL
9
10func k2_puts(buf: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var i: i64=0; while s[i]!=(0 as u8){buf[o]=s[i]; o=o+1; i=i+1} return o }
11func k2_catn(buf: *u8, off: i64, v: i64) -> i64 {
12 var m: i64=v; var oo: i64=off
13 if m<0 { buf[oo]=45 as u8; oo=oo+1; m=0-m }
14 var nd: i64=1; var t: i64=m
15 while t>=10 { nd=nd+1; t=t/10 }
16 var i: i64=nd-1
17 while i>=0 { buf[oo+i]=(48+(m%10)) as u8; m=m/10; i=i-1 }
18 return oo+nd
19}
20
21// ============================ EDITORIAL ("The Dispatch") ============================
22func ke_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
23 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>" as *u8)
24 o = k2_puts(buf, o, title)
25 o = k2_puts(buf, o, "</title><style>" as *u8)
26 o = k2_puts(buf, o, "body{margin:0;background:#F7F3EA;color:#1A1712;font:18px/1.7 Georgia,'Times New Roman',serif}.wrap{max-width:1080px;margin:0 auto;padding:0 28px}a{color:inherit}" as *u8)
27 o = k2_puts(buf, o, ".skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#9B3B26;color:#fff;padding:10px 14px}:focus-visible{outline:3px solid #9B3B26;outline-offset:2px}" as *u8)
28 o = k2_puts(buf, o, ".mast{text-align:center;padding:40px 0 16px;border-bottom:3px double #C9BEA9}.mast .np{font-size:clamp(2.4rem,7vw,4.2rem);font-weight:700;font-variant:small-caps;letter-spacing:.03em;margin:0}.mast .dl{margin-top:8px;font:italic .82rem/1 Georgia,serif;color:#6E6455;letter-spacing:.24em;text-transform:uppercase}.mast nav{margin-top:14px;font:700 .74rem/1 system-ui,sans-serif;letter-spacing:.14em;text-transform:uppercase}.mast nav a{color:#9B3B26;text-decoration:none;margin:0 12px}" as *u8)
29 o = k2_puts(buf, o, ".lead{padding:46px 0;border-bottom:1px solid #D8CFC0}.lead .kick{font:700 .78rem/1 system-ui,sans-serif;letter-spacing:.22em;text-transform:uppercase;color:#9B3B26}.lead h1{font-size:clamp(2.1rem,5.4vw,3.8rem);line-height:1.05;margin:.3em 0 .2em;font-weight:800}.lead .deck{font-size:1.3rem;color:#4A4235;font-style:italic;max-width:42ch}.lead .by{margin:16px 0 22px;font:700 .76rem/1 system-ui,sans-serif;letter-spacing:.14em;text-transform:uppercase;color:#6E6455}" as *u8)
30 o = k2_puts(buf, o, ".body{columns:2;column-gap:40px;text-align:justify}.body p{margin:0 0 1em}.body p:first-of-type::first-letter{font-size:3.4em;float:left;line-height:.72;padding:.02em .1em 0 0;font-weight:800;color:#9B3B26}@media(max-width:720px){.body{columns:1}}" as *u8)
31 o = k2_puts(buf, o, ".more{padding:44px 0}.more h2{font:700 1rem/1 system-ui,sans-serif;letter-spacing:.2em;text-transform:uppercase;border-bottom:2px solid #1A1712;padding-bottom:8px;margin:0 0 26px}.grid{display:grid;grid-template-columns:1fr 1fr;gap:34px}@media(max-width:720px){.grid{grid-template-columns:1fr}}.art{border-top:1px solid #D8CFC0;padding-top:16px}.art h3{font-size:1.5rem;margin:0 0 .3em;line-height:1.15}.art .dek{color:#4A4235;margin:0 0 .5em}.art .m{font:700 .72rem/1 system-ui,sans-serif;letter-spacing:.12em;text-transform:uppercase;color:#9B3B26}" as *u8)
32 o = k2_puts(buf, o, ".sub{background:#1A1712;color:#F7F3EA;text-align:center;padding:54px 28px}.sub h2{font-size:clamp(1.7rem,4vw,2.5rem);margin:0 0 .3em}.sub p{color:#C9BEA9;max-width:46ch;margin:0 auto 20px}.sub a{display:inline-block;border:1px solid #F7F3EA;padding:12px 26px;text-decoration:none;letter-spacing:.1em;text-transform:uppercase;font:700 .82rem system-ui,sans-serif}" as *u8)
33 o = k2_puts(buf, o, "footer{padding:28px 0;border-top:3px double #C9BEA9;text-align:center;color:#6E6455;font:italic .9rem Georgia,serif}</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a>" as *u8)
34 o = k2_puts(buf, o, "<header class=\"mast\"><div class=\"wrap\"><p class=\"np\">" as *u8)
35 o = k2_puts(buf, o, brand)
36 o = k2_puts(buf, o, "</p><p class=\"dl\">A Nishi Publication</p><nav><a href=\"/factory/\">The Gallery</a><a href=\"/\">nishifamily.com</a></nav></div></header><main id=\"main\">" as *u8)
37 return o
38}
39func ke_lead(buf: *u8, off: i64, kick: *u8, headline: *u8, deck: *u8, byline: *u8, body: *u8) -> i64 {
40 var o: i64 = k2_puts(buf, off, "<article class=\"lead\"><div class=\"wrap\"><p class=\"kick\">" as *u8)
41 o = k2_puts(buf, o, kick); o = k2_puts(buf, o, "</p><h1>" as *u8); o = k2_puts(buf, o, headline)
42 o = k2_puts(buf, o, "</h1><p class=\"deck\">" as *u8); o = k2_puts(buf, o, deck)
43 o = k2_puts(buf, o, "</p><p class=\"by\">" as *u8); o = k2_puts(buf, o, byline)
44 o = k2_puts(buf, o, "</p><div class=\"body\">" as *u8); o = k2_puts(buf, o, body)
45 o = k2_puts(buf, o, "</div></div></article>" as *u8)
46 return o
47}
48func ke_more_open(buf: *u8, off: i64, label: *u8) -> i64 {
49 var o: i64 = k2_puts(buf, off, "<section class=\"more\"><div class=\"wrap\"><h2>" as *u8)
50 o = k2_puts(buf, o, label); o = k2_puts(buf, o, "</h2><div class=\"grid\">" as *u8)
51 return o
52}
53func ke_item(buf: *u8, off: i64, headline: *u8, dek: *u8, meta: *u8) -> i64 {
54 var o: i64 = k2_puts(buf, off, "<article class=\"art\"><p class=\"m\">" as *u8)
55 o = k2_puts(buf, o, meta); o = k2_puts(buf, o, "</p><h3>" as *u8); o = k2_puts(buf, o, headline)
56 o = k2_puts(buf, o, "</h3><p class=\"dek\">" as *u8); o = k2_puts(buf, o, dek); o = k2_puts(buf, o, "</p></article>" as *u8)
57 return o
58}
59func ke_more_close(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "</div></div></section>" as *u8) }
60func ke_sub(buf: *u8, off: i64, h2: *u8, p: *u8, label: *u8, href: *u8) -> i64 {
61 var o: i64 = k2_puts(buf, off, "<section class=\"sub\"><h2>" as *u8)
62 o = k2_puts(buf, o, h2); o = k2_puts(buf, o, "</h2><p>" as *u8); o = k2_puts(buf, o, p)
63 o = k2_puts(buf, o, "</p><a href=\"" as *u8); o = k2_puts(buf, o, href); o = k2_puts(buf, o, "\">" as *u8)
64 o = k2_puts(buf, o, label); o = k2_puts(buf, o, "</a></section>" as *u8)
65 return o
66}
67func ke_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
68 var o: i64 = k2_puts(buf, off, "</main><footer><div class=\"wrap\">" as *u8)
69 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
70 o = k2_puts(buf, o, " · Set sovereign on Nishi</div></footer></body></html>" as *u8)
71 return o
72}
73
74// ============================ GALLERY ("Exposure") ============================
75func kg_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
76 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta name=\"color-scheme\" content=\"dark\"><title>" as *u8)
77 o = k2_puts(buf, o, title)
78 o = k2_puts(buf, o, "</title><style>" as *u8)
79 o = k2_puts(buf, o, "body{margin:0;background:#0B0B0D;color:#F5F5F7;font:16px/1.6 system-ui,-apple-system,'Segoe UI',sans-serif;-webkit-font-smoothing:antialiased}a{color:inherit}" as *u8)
80 o = k2_puts(buf, o, ".skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#E8B15A;color:#0B0B0D;padding:10px 14px}:focus-visible{outline:2px solid #E8B15A;outline-offset:3px}" as *u8)
81 o = k2_puts(buf, o, ".bar{display:flex;justify-content:space-between;align-items:center;padding:20px 28px;position:sticky;top:0;background:rgba(11,11,13,.72);backdrop-filter:blur(8px);z-index:5;border-bottom:1px solid #17171C}.bar .b{font-weight:700;letter-spacing:.3em;text-transform:uppercase;font-size:.86rem}.bar a{color:#8A8A94;text-decoration:none;letter-spacing:.18em;text-transform:uppercase;font-size:.7rem}.bar a:hover{color:#E8B15A}" as *u8)
82 o = k2_puts(buf, o, ".hd{padding:74px 28px 40px;max-width:1500px;margin:0 auto}.hd .k{color:#E8B15A;letter-spacing:.34em;text-transform:uppercase;font-size:.74rem;font-weight:600}.hd h1{font-size:clamp(2.6rem,9vw,7rem);font-weight:200;letter-spacing:-.02em;line-height:.96;margin:.16em 0}.hd .s{color:#8A8A94;max-width:54ch;font-size:1.1rem}" as *u8)
83 o = k2_puts(buf, o, ".gr{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:4px;padding:0 4px 44px}.tile{position:relative;aspect-ratio:4/5;overflow:hidden;display:flex;align-items:flex-end;text-decoration:none;color:#fff}.tile::after{content:\"\";position:absolute;inset:0;background:linear-gradient(0deg,rgba(0,0,0,.7),transparent 58%);z-index:1}.tile .cap{position:relative;z-index:2;padding:20px;transform:translateY(10px);opacity:.82;transition:transform .34s,opacity .34s}.tile:hover .cap{transform:none;opacity:1}.tile .cap b{display:block;font-size:1.18rem;font-weight:600}.tile .cap span{color:rgba(255,255,255,.72);font-size:.86rem}" as *u8)
84 o = k2_puts(buf, o, ".cta{text-align:center;padding:82px 28px}.cta h2{font-size:clamp(2rem,5vw,3.2rem);font-weight:200;margin:0 0 .3em}.cta p{color:#8A8A94;max-width:48ch;margin:0 auto 26px}.cta a{color:#0B0B0D;background:#E8B15A;padding:14px 30px;text-decoration:none;font-weight:600;letter-spacing:.03em;border-radius:2px}footer{padding:32px 28px;color:#5A5A64;font-size:.8rem;border-top:1px solid #17171C;text-align:center}@media(prefers-reduced-motion:reduce){.tile .cap{transition:none}}" as *u8)
85 o = k2_puts(buf, o, "</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a><header class=\"bar\"><span class=\"b\">" as *u8)
86 o = k2_puts(buf, o, brand)
87 o = k2_puts(buf, o, "</span><a href=\"/factory/\">All archetypes</a></header><main id=\"main\">" as *u8)
88 return o
89}
90func kg_head(buf: *u8, off: i64, kick: *u8, big: *u8, sub: *u8) -> i64 {
91 var o: i64 = k2_puts(buf, off, "<section class=\"hd\"><p class=\"k\">" as *u8)
92 o = k2_puts(buf, o, kick); o = k2_puts(buf, o, "</p><h1>" as *u8); o = k2_puts(buf, o, big)
93 o = k2_puts(buf, o, "</h1><p class=\"s\">" as *u8); o = k2_puts(buf, o, sub); o = k2_puts(buf, o, "</p></section>" as *u8)
94 return o
95}
96func kg_grid_open(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "<section class=\"gr\">" as *u8) }
97// one tile; generative gradient from idx so the grid reads as distinct works
98func kg_tile(buf: *u8, off: i64, idx: i64, cap: *u8, sub: *u8) -> i64 {
99 let h1: i64 = (idx * 47) % 360
100 let h2: i64 = (idx * 47 + 46) % 360
101 var o: i64 = k2_puts(buf, off, "<a class=\"tile\" href=\"/factory/\" style=\"background:linear-gradient(135deg,hsl(" as *u8)
102 o = k2_catn(buf, o, h1); o = k2_puts(buf, o, "deg 44% 32%),hsl(" as *u8)
103 o = k2_catn(buf, o, h2); o = k2_puts(buf, o, "deg 58% 16%))\"><span class=\"cap\"><b>" as *u8)
104 o = k2_puts(buf, o, cap); o = k2_puts(buf, o, "</b><span>" as *u8); o = k2_puts(buf, o, sub)
105 o = k2_puts(buf, o, "</span></span></a>" as *u8)
106 return o
107}
108func kg_grid_close(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "</section>" as *u8) }
109func kg_cta(buf: *u8, off: i64, h2: *u8, p: *u8, label: *u8, href: *u8) -> i64 {
110 var o: i64 = k2_puts(buf, off, "<section class=\"cta\"><h2>" as *u8)
111 o = k2_puts(buf, o, h2); o = k2_puts(buf, o, "</h2><p>" as *u8); o = k2_puts(buf, o, p)
112 o = k2_puts(buf, o, "</p><a href=\"" as *u8); o = k2_puts(buf, o, href); o = k2_puts(buf, o, "\">" as *u8)
113 o = k2_puts(buf, o, label); o = k2_puts(buf, o, "</a></section>" as *u8)
114 return o
115}
116func kg_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
117 var o: i64 = k2_puts(buf, off, "</main><footer>" as *u8)
118 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
119 o = k2_puts(buf, o, " · Sovereign on Nishi, 0 JS</footer></body></html>" as *u8)
120 return o
121}
122
123// ============================ SHOP ("Market") ============================
124func ks_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
125 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>" as *u8)
126 o = k2_puts(buf, o, title)
127 o = k2_puts(buf, o, "</title><style>" as *u8)
128 o = k2_puts(buf, o, "body{margin:0;background:#F4F5F7;color:#14181F;font:15px/1.55 system-ui,-apple-system,'Segoe UI',sans-serif}a{color:inherit}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#12B886;color:#04120C;padding:10px 14px}:focus-visible{outline:3px solid #12B886;outline-offset:2px}" as *u8)
129 o = k2_puts(buf, o, ".util{display:flex;align-items:center;gap:16px;background:#0E1116;color:#fff;padding:12px 24px;position:sticky;top:0;z-index:6}.util .b{font-weight:800;font-size:1.14rem;text-decoration:none}.util form{flex:1;display:flex;max-width:560px}.util input{flex:1;border:0;border-radius:8px 0 0 8px;padding:11px 14px;font:inherit}.util .go{border:0;background:#12B886;color:#04120C;font-weight:700;padding:0 18px;border-radius:0 8px 8px 0;cursor:pointer}.util .cart{background:#1C2230;padding:9px 15px;border-radius:999px;font-weight:600;text-decoration:none;white-space:nowrap}" as *u8)
130 o = k2_puts(buf, o, ".chips{display:flex;gap:8px;flex-wrap:wrap;padding:13px 24px;background:#fff;border-bottom:1px solid #E6E8EC}.chips a{background:#F0F2F5;padding:7px 14px;border-radius:999px;font-size:.82rem;font-weight:600;text-decoration:none;color:#3A4250}.chips a:first-child{background:#14181F;color:#fff}" as *u8)
131 o = k2_puts(buf, o, ".promo{background:linear-gradient(100deg,#0E7C5A,#12B886);color:#fff;margin:16px 24px;border-radius:16px;padding:24px 28px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px}.promo h2{margin:0;font-size:1.5rem}.promo p{margin:0;opacity:.92}" as *u8)
132 o = k2_puts(buf, o, ".pgh{padding:10px 24px 0;font-size:1.15rem;font-weight:800}.pg{display:grid;grid-template-columns:repeat(auto-fill,minmax(214px,1fr));gap:16px;padding:14px 24px 30px}.pc{background:#fff;border:1px solid #E6E8EC;border-radius:14px;overflow:hidden;display:flex;flex-direction:column}.pc .im{aspect-ratio:1/1;display:block}.pc .in{padding:14px;display:flex;flex-direction:column;gap:5px;flex:1}.pc h3{margin:0;font-size:1rem}.pc .d{color:#5A6273;font-size:.83rem;flex:1}.pc .row{display:flex;justify-content:space-between;align-items:center;margin-top:8px}.pc .pr{font-weight:800;font-size:1.06rem}.pc .add{border:0;background:#14181F;color:#fff;border-radius:8px;padding:8px 12px;font:600 .82rem system-ui,sans-serif;cursor:pointer}.pc .add:hover{background:#12B886;color:#04120C}" as *u8)
133 o = k2_puts(buf, o, ".tr{display:flex;gap:26px;justify-content:center;flex-wrap:wrap;padding:26px;background:#fff;border-top:1px solid #E6E8EC;color:#3A4250;font-size:.9rem}.tr b{color:#14181F}footer{padding:24px;text-align:center;color:#7A8290;font-size:.82rem}</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a>" as *u8)
134 o = k2_puts(buf, o, "<header class=\"util\"><a class=\"b\" href=\"/factory/\">" as *u8)
135 o = k2_puts(buf, o, brand)
136 o = k2_puts(buf, o, "</a><form role=\"search\" method=\"get\" action=\"/search\"><input type=\"search\" aria-label=\"Search products\" placeholder=\"Search the shop\"><button class=\"go\" type=\"submit\">Search</button></form><a class=\"cart\" href=\"/cart\">Cart · 3</a></header><nav class=\"chips\"><a href=\"/\">All</a><a href=\"/\">New</a><a href=\"/\">Home</a><a href=\"/\">Kitchen</a><a href=\"/\">Apparel</a><a href=\"/\">Gifts</a></nav><main id=\"main\">" as *u8)
137 return o
138}
139func ks_promo(buf: *u8, off: i64, h2: *u8, p: *u8) -> i64 {
140 var o: i64 = k2_puts(buf, off, "<section class=\"promo\"><div><h2>" as *u8)
141 o = k2_puts(buf, o, h2); o = k2_puts(buf, o, "</h2><p>" as *u8); o = k2_puts(buf, o, p)
142 o = k2_puts(buf, o, "</p></div><a class=\"cart\" href=\"/\" style=\"background:#04120C\">Shop the sale</a></section>" as *u8)
143 return o
144}
145func ks_grid_open(buf: *u8, off: i64, h2: *u8) -> i64 {
146 var o: i64 = k2_puts(buf, off, "<h2 class=\"pgh\">" as *u8)
147 o = k2_puts(buf, o, h2); o = k2_puts(buf, o, "</h2><section class=\"pg\" id=\"products\">" as *u8)
148 return o
149}
150func ks_prod(buf: *u8, off: i64, idx: i64, name: *u8, desc: *u8, price: *u8) -> i64 {
151 let h1: i64 = (idx * 53 + 20) % 360
152 let h2: i64 = (idx * 53 + 60) % 360
153 var o: i64 = k2_puts(buf, off, "<article class=\"pc\"><span class=\"im\" style=\"background:linear-gradient(135deg,hsl(" as *u8)
154 o = k2_catn(buf, o, h1); o = k2_puts(buf, o, "deg 42% 80%),hsl(" as *u8)
155 o = k2_catn(buf, o, h2); o = k2_puts(buf, o, "deg 46% 62%))\"></span><div class=\"in\"><h3>" as *u8)
156 o = k2_puts(buf, o, name); o = k2_puts(buf, o, "</h3><p class=\"d\">" as *u8); o = k2_puts(buf, o, desc)
157 o = k2_puts(buf, o, "</p><div class=\"row\"><span class=\"pr\">" as *u8); o = k2_puts(buf, o, price)
158 o = k2_puts(buf, o, "</span><button class=\"add\">Add to cart</button></div></div></article>" as *u8)
159 return o
160}
161func ks_grid_close(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "</section>" as *u8) }
162func ks_trust(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8) -> i64 {
163 var o: i64 = k2_puts(buf, off, "<section class=\"tr\"><span><b>Free shipping</b> " as *u8)
164 o = k2_puts(buf, o, a); o = k2_puts(buf, o, "</span><span><b>Easy returns</b> " as *u8)
165 o = k2_puts(buf, o, b); o = k2_puts(buf, o, "</span><span><b>Secure checkout</b> " as *u8)
166 o = k2_puts(buf, o, c); o = k2_puts(buf, o, "</span></section>" as *u8)
167 return o
168}
169func ks_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
170 var o: i64 = k2_puts(buf, off, "</main><footer>" as *u8)
171 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
172 o = k2_puts(buf, o, " · Sovereign checkout on Nishi, 0 trackers</footer></body></html>" as *u8)
173 return o
174}
175
176// ============================ SOCIAL FEED ("Circle") ============================
177func kf_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
178 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>" as *u8)
179 o = k2_puts(buf, o, title)
180 o = k2_puts(buf, o, "</title><style>" as *u8)
181 o = k2_puts(buf, o, "body{margin:0;background:#F0F2F5;color:#1B1F27;font:15px/1.5 system-ui,-apple-system,'Segoe UI',sans-serif}a{color:inherit}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#3B6FE0;color:#fff;padding:10px 14px}:focus-visible{outline:3px solid #3B6FE0;outline-offset:2px}" as *u8)
182 o = k2_puts(buf, o, ".top{background:#fff;border-bottom:1px solid #E3E6EC;padding:12px 20px;display:flex;gap:14px;align-items:center;position:sticky;top:0;z-index:5}.top .b{font-weight:800;color:#3B6FE0;font-size:1.2rem;text-decoration:none}.top input{flex:1;max-width:340px;background:#F0F2F5;border:0;border-radius:999px;padding:10px 16px;font:inherit}.top a.n{color:#5A6273;text-decoration:none;font-weight:600;font-size:.88rem}" as *u8)
183 o = k2_puts(buf, o, ".lay{display:grid;grid-template-columns:220px minmax(0,600px) 300px;gap:22px;max-width:1180px;margin:22px auto;padding:0 18px;align-items:start}@media(max-width:980px){.lay{grid-template-columns:minmax(0,1fr)}.rail,.aside{display:none}}" as *u8)
184 o = k2_puts(buf, o, ".rail{position:sticky;top:76px}.rail a{display:flex;gap:12px;align-items:center;padding:11px 14px;border-radius:10px;text-decoration:none;font-weight:600;color:#3A4250}.rail a:hover{background:#E7EBF2}.rail a.on{background:#fff;color:#3B6FE0;box-shadow:0 1px 2px rgba(20,24,31,.08)}.dot2{width:10px;height:10px;border-radius:3px;background:linear-gradient(135deg,#3B6FE0,#7B4FE0);flex:none}" as *u8)
185 o = k2_puts(buf, o, ".card{background:#fff;border-radius:14px;box-shadow:0 1px 2px rgba(20,24,31,.07);margin-bottom:16px}.comp{padding:14px 16px;display:flex;gap:12px;align-items:center}.comp input{flex:1;background:#F0F2F5;border:0;border-radius:999px;padding:12px 16px;font:inherit}.comp button{border:0;background:#3B6FE0;color:#fff;border-radius:999px;padding:11px 18px;font:600 .88rem system-ui,sans-serif;cursor:pointer}" as *u8)
186 o = k2_puts(buf, o, ".av{width:42px;height:42px;border-radius:50%;flex:none}.post{padding:16px}.ph{display:flex;gap:11px;align-items:center;margin-bottom:10px}.ph b{display:block;font-size:.95rem}.ph span{color:#7A8290;font-size:.8rem}.pt{font-size:.98rem;margin:0 0 12px}.acts{display:flex;gap:6px;border-top:1px solid #EEF0F4;padding-top:8px}.acts button{flex:1;border:0;background:none;padding:9px;border-radius:8px;font:600 .85rem system-ui,sans-serif;color:#5A6273;cursor:pointer}.acts button:hover{background:#F0F2F5}" as *u8)
187 o = k2_puts(buf, o, ".aside{position:sticky;top:76px}.aside .card{padding:16px}.aside h2{font-size:.95rem;margin:0 0 12px;color:#5A6273}.wrow{display:flex;gap:11px;align-items:center;padding:8px 0}.wrow b{flex:1;font-size:.9rem}.wrow button{border:1px solid #3B6FE0;background:#fff;color:#3B6FE0;border-radius:999px;padding:6px 14px;font:600 .8rem system-ui,sans-serif;cursor:pointer}footer{max-width:1180px;margin:0 auto;padding:18px;color:#8A92A0;font-size:.78rem;text-align:center}@media(prefers-reduced-motion:reduce){*{transition:none}}" as *u8)
188 o = k2_puts(buf, o, "</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a><header class=\"top\"><a class=\"b\" href=\"/factory/\">" as *u8)
189 o = k2_puts(buf, o, brand)
190 o = k2_puts(buf, o, "</a><input type=\"search\" aria-label=\"Search\" placeholder=\"Search the community\"><a class=\"n\" href=\"/factory/\">All archetypes</a></header><div class=\"lay\"><nav class=\"rail\" aria-label=\"Primary\"><a class=\"on\" href=\"/\"><span class=\"dot2\"></span>Home</a><a href=\"/\"><span class=\"dot2\"></span>Explore</a><a href=\"/\"><span class=\"dot2\"></span>Groups</a><a href=\"/\"><span class=\"dot2\"></span>Messages</a><a href=\"/\"><span class=\"dot2\"></span>Profile</a></nav><main id=\"main\">" as *u8)
191 return o
192}
193func kf_av(buf: *u8, off: i64, idx: i64) -> i64 {
194 let h1: i64 = (idx * 71 + 10) % 360
195 let h2: i64 = (idx * 71 + 70) % 360
196 var o: i64 = k2_puts(buf, off, "<span class=\"av\" style=\"background:linear-gradient(135deg,hsl(" as *u8)
197 o = k2_catn(buf, o, h1); o = k2_puts(buf, o, "deg 60% 62%),hsl(" as *u8)
198 o = k2_catn(buf, o, h2); o = k2_puts(buf, o, "deg 55% 45%))\"></span>" as *u8)
199 return o
200}
201func kf_composer(buf: *u8, off: i64, placeholder: *u8) -> i64 {
202 var o: i64 = k2_puts(buf, off, "<div class=\"card comp\">" as *u8)
203 o = kf_av(buf, o, 0)
204 o = k2_puts(buf, o, "<input aria-label=\"Write a post\" placeholder=\"" as *u8)
205 o = k2_puts(buf, o, placeholder)
206 o = k2_puts(buf, o, "\"><button>Share</button></div>" as *u8)
207 return o
208}
209func kf_post(buf: *u8, off: i64, idx: i64, author: *u8, meta: *u8, text: *u8) -> i64 {
210 var o: i64 = k2_puts(buf, off, "<article class=\"card post\"><div class=\"ph\">" as *u8)
211 o = kf_av(buf, o, idx)
212 o = k2_puts(buf, o, "<div><b>" as *u8); o = k2_puts(buf, o, author)
213 o = k2_puts(buf, o, "</b><span>" as *u8); o = k2_puts(buf, o, meta)
214 o = k2_puts(buf, o, "</span></div></div><p class=\"pt\">" as *u8); o = k2_puts(buf, o, text)
215 o = k2_puts(buf, o, "</p><div class=\"acts\"><button>Like</button><button>Reply</button><button>Share</button></div></article>" as *u8)
216 return o
217}
218func kf_aside_open(buf: *u8, off: i64, about: *u8) -> i64 {
219 var o: i64 = k2_puts(buf, off, "</main><aside class=\"aside\"><div class=\"card\"><h2>About this space</h2><p style=\"margin:0;font-size:.9rem;color:#3A4250\">" as *u8)
220 o = k2_puts(buf, o, about)
221 o = k2_puts(buf, o, "</p></div><div class=\"card\"><h2>Who to follow</h2>" as *u8)
222 return o
223}
224func kf_follow(buf: *u8, off: i64, idx: i64, name: *u8) -> i64 {
225 var o: i64 = k2_puts(buf, off, "<div class=\"wrow\">" as *u8)
226 o = kf_av(buf, o, idx + 9)
227 o = k2_puts(buf, o, "<b>" as *u8); o = k2_puts(buf, o, name)
228 o = k2_puts(buf, o, "</b><button>Follow</button></div>" as *u8)
229 return o
230}
231func kf_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
232 var o: i64 = k2_puts(buf, off, "</div></aside></div><footer>" as *u8)
233 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
234 o = k2_puts(buf, o, " · No ads, no tracking, you own your data</footer></body></html>" as *u8)
235 return o
236}
237
238// ============================ MEDIA STREAMER ("Marquee") ============================
239func km_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
240 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><meta name=\"color-scheme\" content=\"dark\"><title>" as *u8)
241 o = k2_puts(buf, o, title)
242 o = k2_puts(buf, o, "</title><style>" as *u8)
243 o = k2_puts(buf, o, "body{margin:0;background:#101017;color:#F2F2F6;font:15px/1.5 system-ui,-apple-system,'Segoe UI',sans-serif}a{color:inherit}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#E33F5A;color:#fff;padding:10px 14px}:focus-visible{outline:3px solid #E33F5A;outline-offset:2px}" as *u8)
244 o = k2_puts(buf, o, ".nav{display:flex;gap:20px;align-items:center;padding:16px 34px;position:absolute;inset:0 0 auto;z-index:4}.nav .b{font-weight:900;letter-spacing:.06em;color:#E33F5A;font-size:1.25rem;text-decoration:none}.nav a.l{color:#C9C9D4;text-decoration:none;font-size:.86rem;font-weight:600}" as *u8)
245 o = k2_puts(buf, o, ".bill{position:relative;padding:130px 34px 60px;background:linear-gradient(115deg,#2A0F1E 0%,#101017 62%),linear-gradient(0deg,#101017,transparent 40%)}.bill .k{color:#E33F5A;font-weight:700;letter-spacing:.3em;text-transform:uppercase;font-size:.72rem}.bill h1{font-size:clamp(2.6rem,7vw,5.2rem);font-weight:900;margin:.12em 0;letter-spacing:-.02em;max-width:14ch;line-height:1}.bill .meta{color:#9A9AA8;font-size:.9rem;margin:0 0 14px}.bill .sub{color:#C9C9D4;max-width:52ch;margin:0 0 24px}.bill .row{display:flex;gap:12px;flex-wrap:wrap}.bill a.play{background:#fff;color:#101017;font-weight:800;padding:13px 30px;border-radius:6px;text-decoration:none}.bill a.info{background:rgba(255,255,255,.14);color:#fff;font-weight:600;padding:13px 24px;border-radius:6px;text-decoration:none}" as *u8)
246 o = k2_puts(buf, o, ".shelf{padding:26px 0 8px 34px}.shelf h2{font-size:1.15rem;margin:0 0 14px;font-weight:700}.strip{display:flex;gap:12px;overflow-x:auto;padding:0 34px 22px 0;scroll-snap-type:x mandatory}.pc2{flex:0 0 172px;scroll-snap-align:start;text-decoration:none}.pc2 .po{aspect-ratio:2/3;border-radius:10px;display:block;box-shadow:0 10px 26px -14px rgba(0,0,0,.9)}.pc2 b{display:block;margin:9px 2px 1px;font-size:.9rem;font-weight:600}.pc2 span{color:#9A9AA8;font-size:.78rem;margin:0 2px}" as *u8)
247 o = k2_puts(buf, o, "footer{padding:30px 34px;color:#6E6E7C;font-size:.8rem;border-top:1px solid #1D1D26;margin-top:26px}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a><nav class=\"nav\"><a class=\"b\" href=\"/factory/\">" as *u8)
248 o = k2_puts(buf, o, brand)
249 o = k2_puts(buf, o, "</a><a class=\"l\" href=\"/\">Home</a><a class=\"l\" href=\"/\">Library</a><a class=\"l\" href=\"/factory/\">All archetypes</a></nav><main id=\"main\">" as *u8)
250 return o
251}
252func km_billboard(buf: *u8, off: i64, kick: *u8, title: *u8, meta: *u8, sub: *u8, play: *u8) -> i64 {
253 var o: i64 = k2_puts(buf, off, "<section class=\"bill\"><p class=\"k\">" as *u8)
254 o = k2_puts(buf, o, kick); o = k2_puts(buf, o, "</p><h1>" as *u8); o = k2_puts(buf, o, title)
255 o = k2_puts(buf, o, "</h1><p class=\"meta\">" as *u8); o = k2_puts(buf, o, meta)
256 o = k2_puts(buf, o, "</p><p class=\"sub\">" as *u8); o = k2_puts(buf, o, sub)
257 o = k2_puts(buf, o, "</p><div class=\"row\"><a class=\"play\" href=\"/\">" as *u8); o = k2_puts(buf, o, play)
258 o = k2_puts(buf, o, "</a><a class=\"info\" href=\"/factory/\">More info</a></div></section>" as *u8)
259 return o
260}
261func km_shelf_open(buf: *u8, off: i64, label: *u8) -> i64 {
262 var o: i64 = k2_puts(buf, off, "<section class=\"shelf\"><h2>" as *u8)
263 o = k2_puts(buf, o, label); o = k2_puts(buf, o, "</h2><div class=\"strip\">" as *u8)
264 return o
265}
266func km_poster(buf: *u8, off: i64, idx: i64, name: *u8, sub: *u8) -> i64 {
267 let h1: i64 = (idx * 59 + 210) % 360
268 let h2: i64 = (idx * 59 + 275) % 360
269 var o: i64 = k2_puts(buf, off, "<a class=\"pc2\" href=\"/\"><span class=\"po\" style=\"background:linear-gradient(160deg,hsl(" as *u8)
270 o = k2_catn(buf, o, h1); o = k2_puts(buf, o, "deg 48% 34%),hsl(" as *u8)
271 o = k2_catn(buf, o, h2); o = k2_puts(buf, o, "deg 60% 14%))\"></span><b>" as *u8)
272 o = k2_puts(buf, o, name); o = k2_puts(buf, o, "</b><span>" as *u8); o = k2_puts(buf, o, sub)
273 o = k2_puts(buf, o, "</span></a>" as *u8)
274 return o
275}
276func km_shelf_close(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "</div></section>" as *u8) }
277func km_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
278 var o: i64 = k2_puts(buf, off, "</main><footer>" as *u8)
279 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
280 o = k2_puts(buf, o, " · Your library, streamed sovereign -- zero ads</footer></body></html>" as *u8)
281 return o
282}
283
284// ============================ HUB DASHBOARD ("Deck") ============================
285func kd_open(buf: *u8, off: i64, title: *u8, brand: *u8) -> i64 {
286 var o: i64 = k2_puts(buf, off, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>" as *u8)
287 o = k2_puts(buf, o, title)
288 o = k2_puts(buf, o, "</title><style>" as *u8)
289 o = k2_puts(buf, o, "body{margin:0;background:linear-gradient(180deg,#E9EFF8,#F5F8FC 340px);min-height:100vh;color:#17202E;font:15px/1.55 system-ui,-apple-system,'Segoe UI',sans-serif}a{color:inherit}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:16px;top:16px;background:#17202E;color:#fff;padding:10px 14px}:focus-visible{outline:3px solid #2E5AAC;outline-offset:2px}" as *u8)
290 o = k2_puts(buf, o, ".wrap{max-width:1060px;margin:0 auto;padding:0 26px}.top{display:flex;justify-content:space-between;align-items:center;padding:20px 0}.top .b{font-weight:800;letter-spacing:.02em;text-decoration:none}.top a.l{color:#51607A;font-size:.86rem;text-decoration:none;font-weight:600}" as *u8)
291 o = k2_puts(buf, o, ".greet{padding:34px 0 8px}.greet h1{font-size:clamp(1.9rem,4.6vw,3rem);margin:0;font-weight:800;letter-spacing:-.01em}.greet p{color:#51607A;margin:8px 0 0;max-width:56ch}.sr{margin:22px 0 30px}.sr form{display:flex;max-width:520px;background:#fff;border-radius:14px;box-shadow:0 6px 24px -12px rgba(23,32,46,.25);overflow:hidden}.sr input{flex:1;border:0;padding:15px 18px;font:inherit}.sr button{border:0;background:#17202E;color:#fff;padding:0 22px;font:600 .9rem system-ui,sans-serif;cursor:pointer}" as *u8)
292 o = k2_puts(buf, o, ".deck{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px;padding-bottom:26px}.tileD{background:#fff;border-radius:18px;padding:20px;text-decoration:none;box-shadow:0 2px 6px rgba(23,32,46,.06);transition:transform .16s,box-shadow .16s;display:block}.tileD:hover{transform:translateY(-3px);box-shadow:0 14px 30px -14px rgba(23,32,46,.35)}.ic2{width:46px;height:46px;border-radius:13px;display:grid;place-items:center;color:#fff;font-weight:800;font-size:1.15rem;margin-bottom:13px}.tileD b{display:block;font-size:1.02rem;margin-bottom:4px}.tileD span{color:#51607A;font-size:.84rem}" as *u8)
293 o = k2_puts(buf, o, ".strip2{display:flex;gap:22px;flex-wrap:wrap;background:#17202E;color:#B9C6DC;border-radius:18px;padding:18px 24px;margin-bottom:30px;font-size:.86rem}.strip2 b{color:#fff}footer{padding:22px 0 30px;color:#7A879C;font-size:.8rem}@media(prefers-reduced-motion:reduce){.tileD{transition:none}.tileD:hover{transform:none}}" as *u8)
294 o = k2_puts(buf, o, "</style></head><body><a class=\"skip-link\" href=\"#main\">Skip to content</a><div class=\"wrap\"><header class=\"top\"><a class=\"b\" href=\"/factory/\">" as *u8)
295 o = k2_puts(buf, o, brand)
296 o = k2_puts(buf, o, "</a><a class=\"l\" href=\"/factory/\">All archetypes</a></header><main id=\"main\">" as *u8)
297 return o
298}
299func kd_greet(buf: *u8, off: i64, h1: *u8, sub: *u8) -> i64 {
300 var o: i64 = k2_puts(buf, off, "<section class=\"greet\"><h1>" as *u8)
301 o = k2_puts(buf, o, h1); o = k2_puts(buf, o, "</h1><p>" as *u8); o = k2_puts(buf, o, sub)
302 o = k2_puts(buf, o, "</p></section><div class=\"sr\"><form role=\"search\" method=\"get\" action=\"/search\"><input type=\"search\" aria-label=\"Search everything\" placeholder=\"Search apps, wiki, media, everything\"><button type=\"submit\">Search</button></form></div>" as *u8)
303 return o
304}
305func kd_deck_open(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "<section class=\"deck\">" as *u8) }
306func kd_tile(buf: *u8, off: i64, idx: i64, name: *u8, blurb: *u8, href: *u8) -> i64 {
307 let h1: i64 = (idx * 61 + 180) % 360
308 let h2: i64 = (idx * 61 + 235) % 360
309 var o: i64 = k2_puts(buf, off, "<a class=\"tileD\" href=\"" as *u8)
310 o = k2_puts(buf, o, href)
311 o = k2_puts(buf, o, "\"><span class=\"ic2\" style=\"background:linear-gradient(135deg,hsl(" as *u8)
312 o = k2_catn(buf, o, h1); o = k2_puts(buf, o, "deg 55% 44%),hsl(" as *u8)
313 o = k2_catn(buf, o, h2); o = k2_puts(buf, o, "deg 60% 30%))\">" as *u8)
314 // icon letter = first char of the app name
315 let fl: *u8 = sys_mmap(4)
316 fl[0] = name[0]; fl[1] = 0 as u8
317 o = k2_puts(buf, o, fl)
318 o = k2_puts(buf, o, "</span><b>" as *u8); o = k2_puts(buf, o, name)
319 o = k2_puts(buf, o, "</b><span>" as *u8); o = k2_puts(buf, o, blurb)
320 o = k2_puts(buf, o, "</span></a>" as *u8)
321 return o
322}
323func kd_deck_close(buf: *u8, off: i64) -> i64 { return k2_puts(buf, off, "</section>" as *u8) }
324func kd_strip(buf: *u8, off: i64, a: *u8, b: *u8, c: *u8) -> i64 {
325 var o: i64 = k2_puts(buf, off, "<section class=\"strip2\"><span><b>Private by construction</b> · " as *u8)
326 o = k2_puts(buf, o, a); o = k2_puts(buf, o, "</span><span><b>Self-healing</b> · " as *u8)
327 o = k2_puts(buf, o, b); o = k2_puts(buf, o, "</span><span><b>Every screen</b> · " as *u8)
328 o = k2_puts(buf, o, c); o = k2_puts(buf, o, "</span></section>" as *u8)
329 return o
330}
331func kd_close(buf: *u8, off: i64, brand: *u8, note: *u8) -> i64 {
332 var o: i64 = k2_puts(buf, off, "</main><footer>" as *u8)
333 o = k2_puts(buf, o, brand); o = k2_puts(buf, o, " · " as *u8); o = k2_puts(buf, o, note)
334 o = k2_puts(buf, o, "</footer></div></body></html>" as *u8)
335 return o
336}