Contents
About This Report
Report Parameters
Contexts
No contexts were selected, so all contexts were included by default.
Sites
The following sites were included:
- https://sites.wons.bt
(If no sites were selected, all sites were included by default.)
An included site must also be within one of the included contexts for its data to be included in the report.
Risk levels
Included: High, Medium, Low, Informational
Excluded: None
Confidence levels
Included: User Confirmed, High, Medium, Low
Excluded: User Confirmed, High, Medium, Low, False Positive
Summaries
Alert Counts by Risk and Confidence
| Confidence | ||||||
|---|---|---|---|---|---|---|
| User Confirmed | High | Medium | Low | Total | ||
| Risk | High | 0 (0.0%) |
0 (0.0%) |
0 (0.0%) |
0 (0.0%) |
0 (0.0%) |
| Medium | 0 (0.0%) |
1 (6.7%) |
1 (6.7%) |
0 (0.0%) |
2 (13.3%) |
|
| Low | 0 (0.0%) |
2 (13.3%) |
1 (6.7%) |
1 (6.7%) |
4 (26.7%) |
|
| Informational | 0 (0.0%) |
2 (13.3%) |
5 (33.3%) |
2 (13.3%) |
9 (60.0%) |
|
| Total | 0 (0.0%) |
5 (33.3%) |
7 (46.7%) |
3 (20.0%) |
15 (100%) |
|
Alert Counts by Site and Risk
| Risk | |||||
|---|---|---|---|---|---|
|
High (= High) |
Medium (>= Medium) |
Low (>= Low) |
Informational (>= Informational) |
||
| Site | https://sites.wons.bt | 0 (0) |
2 (2) |
4 (6) |
9 (15) |
Alert Counts by Alert Type
| Alert type | Risk | Count |
|---|---|---|
| Content Security Policy (CSP) Header Not Set | Medium | 5 (33.3%) |
| Cross-Domain Misconfiguration | Medium | 5 (33.3%) |
| Cookie Without Secure Flag | Low | 5 (33.3%) |
| Server Leaks Version Information via "Server" HTTP Response Header Field | Low | 5 (33.3%) |
| Strict-Transport-Security Header Not Set | Low | 5 (33.3%) |
| Timestamp Disclosure - Unix | Low | 5 (33.3%) |
| Authentication Request Identified | Informational | 2 (13.3%) |
| Content Security Policy (CSP) Report-Only Header Found | Informational | 5 (33.3%) |
| Information Disclosure - Sensitive Information in URL | Informational | 3 (20.0%) |
| Information Disclosure - Suspicious Comments | Informational | 17 (113.3%) |
| Modern Web Application | Informational | 5 (33.3%) |
| Re-examine Cache-control Directives | Informational | 5 (33.3%) |
| Session Management Response Identified | Informational | 19 (126.7%) |
| User Agent Fuzzer | Informational | 5 (33.3%) |
| User Controllable HTML Element Attribute (Potential XSS) | Informational | 14 (93.3%) |
| Total | 15 |
Insights
| Level | Reason | Site | Description | Statistic |
|---|---|---|---|---|
|
Low
|
Warning
|
ZAP warnings logged - see the zap.log file for details
|
82
|
|
|
Low
|
Exceeded High
|
https://sites.wons.bt
|
Percentage of responses with status code 4xx
|
96 %
|
|
Info
|
Informational
|
Percentage of network failures
|
1 %
|
|
|
Info
|
Informational
|
http://sites.wons.bt
|
Percentage of responses with status code 3xx
|
100 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of responses with status code 2xx
|
3 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of responses with status code 3xx
|
1 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type application/json
|
40 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type font/woff2
|
6 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type image/png
|
1 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type text/css
|
1 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type text/html
|
44 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with content type text/javascript
|
3 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with method GET
|
84 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of endpoints with method POST
|
15 %
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Count of total endpoints
|
65
|
|
Info
|
Informational
|
https://sites.wons.bt
|
Percentage of slow responses
|
2 %
|
Alerts
-
Risk=Medium, Confidence=High (1)
-
https://sites.wons.bt (1)
-
Content Security Policy (CSP) Header Not Set (1)
GET https://sites.wons.bt
Alert tags Alert description Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware. CSP provides a set of standard HTTP headers that allow website owners to declare approved sources of content that browsers should be allowed to load on that page — covered types are JavaScript, CSS, HTML frames, fonts, images and embeddable objects such as Java applets, ActiveX, audio and video files.
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Solution Ensure that your web server, application server, load balancer, etc. is configured to set the Content-Security-Policy header.
-
-
-
Risk=Medium, Confidence=Medium (1)
-
https://sites.wons.bt (1)
-
Cross-Domain Misconfiguration (1)
GET https://sites.wons.bt/fonts/Manrope-500-latin.woff2
Alert tags Alert description Web browser data loading may be possible, due to a Cross Origin Resource Sharing (CORS) misconfiguration on the web server.
Other info The CORS misconfiguration on the web server permits cross-domain read requests from arbitrary third party domains, using unauthenticated APIs on this domain. Web browser implementations do not permit arbitrary third parties to read the response from authenticated APIs, however. This reduces the risk somewhat. This misconfiguration could be used by an attacker to access data that is available in an unauthenticated manner, but which uses some other form of security, such as IP address white-listing.
Request Request line and header section (362 bytes)
GET https://sites.wons.bt/fonts/Manrope-500-latin.woff2 HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache referer: https://sites.wons.bt Cookie: wons_csrf=1Y4cjMPvEjgL5Xwfltaq.fc44d6636ac21d80d0dbec2084f3cab7Request body (0 bytes)
Response Status line and header section (809 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:43:00 GMT Content-Type: font/woff2 Content-Length: 24576 Connection: keep-alive Accept-Ranges: bytes Access-Control-Allow-Origin: * Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-aC5vcfsAnYUWCd27MnALEQ' Cross-Origin-Resource-Policy: cross-origin Last-Modified: Sun, 26 Jul 2026 11:29:26 GMT Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=blockResponse body (24576 bytes)
wOF2 ` ñÐ _ PÕ\ ?HVAR.`?STAT f/j ]2 0R6$` &W#Ý'·ôfU v9óf#j·*¨ñlÍæqÂÝ"ûÿÿ2 Ù¦Öª¾®ù*i&ØètUա³;QRevy¢v*nØØèïÒØò|7K$&îy®"¯¤°Ì[úÜä@ztb4$=¦V®9Ë[H#¯þ>á=4ì`¡ìP-cÁë;éõá#âÉÅ5CNò£?Ír¸cräüÞMÿ2uWkǶËÎíéyà896ç?v»íþcÚüóÞ %ÑÍñPDDB¾ !#7Abp·ÛCRº àyÐÿÎM23_Z¬ìàj+VD öª¿/ðßÿ~ßûsUÕs.¿¾D1NYÅéµw§ÃÆÅKt@:ìâ¢>Üÿ7û}ν¹¹ 7Â%\B!!BÄF¡<Kjô_Æ"ETdHÀÏ8Ëç8?c3ÏQêb¥.o)u*Z¤H)"â/R7C°Í'f¡"fODq ¢M!QQÓßæâ·7ÖÂmÿ¿(?¿¯ösðÀ¿õ8Û¥f@o.A´L fCaØ Í@j̲ú·òD?>ݬNMIÞwG× °Ï¬1^ØÔ¨·ñó¯Ì-h°Y.Pé,¼øøóðb3¼Ôã¥8=®Iñ¸}[óko%J@\óKëÓB©eÿ+Mb5RGù #®08¨ò$¹Ý?4ÒN ÚÁº,i=YTOBA EyÒ¿Û÷QòOý=;˶ӳ øh·fBl<¡Ìâ=w_¨J¢æo6lël¦¹ü357\ýÅFãèÑÿßW-Ûw aTØl¦Â¬ä(ɱ<Û9¢±{ÿ=üL FDàDH H?@êPôäÇ )'p"eͦø 3`ÚE*LÈι 9µ)Ô²jÊ)ÊuçÒmH§·ëÞeå\T¶tiøR¾"ôõÆH¤Õi¾ýÞ];½ÄÏFÿÖR»ï¿"H n¦@jת9g64ùM¬À6j[]VIªrVEWÖh`£«d láS ´Xâa$(=þ\ÿ̤`c<²QCÑÿûê9¬ånÑ¿¦!{m8dqÄ â÷Uÿú²ßÞbö£½G4 æ$s^p©CæÌ¶|Zi-g6äÈëKE´[¼4weÂûx4.ö?2·¶s/Hm{²ÁáOw2NÎÅ1#bÿYØ3˺ ØRì, `ÍA>ÚmAÄf$üÓ¯A¯~3ð ÍEf}²EZÎê×]MqïÄW9#hªú9½-Ê£+ªÐ|´S¦W¢¿ÐP¹þFÔÂQÈÑôÊòëÐâÍêvkþM ÿU£*ÊUOQ´5Qw´ñßcÅQûÔ£zâfóõÍ@]&)ÛÒ\ëUKè¸GôuµÏ8Á©¦×ϧ¯cøÑWÔqZIö!Y^S×ý4^ÖGðRýÜÝ¡¾òDZ Pì$þøtClàa ¬ùnÁ V¨Ï³S {üÄ>ªYIt«ê¹ CKÌ»a/Ê®~JY¼äWÆ b»ùÝëÊ©» ÍPW0) UÇÍÌ÷vP³îó},.±4Ç)«Ô§ ÕL6ïÈ.üä68¶B¹jÚt³í°aR®j9U!ܱó]k5bM1W¼Ì0X°ë4?ËWªÕ4ÌKÿäYYÕU5(ìÆ6¶zã¯@"og"}@ñõ >Ö0±s4³Ê}p¶hë*&ù¶CwÈßÀâÞTlØ)LØ´Ò$P·È=Æ7þHðdPwyö#sçÏfþþ´äG£ëU"6«ßu±oæC7À]D$h)ÑøD®°¥I~,ªð±sÕOr´v 'Q©U v ý=pµ¬è=ôÁP³T'v9EcÖÉa;DÃÍ|Ï¢ç5¸¤z âçðÝú6Åæê2óc;ĵBâJÊâ{ÅI8ÁRÓLú¯3'ËrZeV(²R=¿}ÿA>pOÛ=×{lÂÛ @t h%BÃ=a)Ò`ó 2¤ºÕ.ÌafÅÉîKÆÂJh\ryMXÊ&=`>7Ê¢°òÒøÂÈEÄ*I±â-«ø-G{WeR{/L+·B¬°ÀJÈZÅZ'½õe6Jas_ɶØð¡1¶5aV:íaz;$ÙåI îé4Ç|¬Êy¨J8è¢8è²8Wèª8×èº87<1S¤â;£ÒAé+Õ¸°'3!É`n ÊÎìbbR1J#D@»©8°6K¤¬<5wÙl(Y ²ïg.ª3u梻ó¸°Çb1¼&OEf,±ñ,вN³¬ÑÅÛ(¥MÛìÚ¬`P ±ôÊÔ£d¤qÑód4$£! ¬³¹Æ0Â.ûî@N©P2g'Î3ìjòZXs«®ª#ä}{Ê%¶-¥¡l(U¥È×$ Á9è[r$ÏMysM¤pHWSwêL**p ñðù;£[º®åe¸ð %Ø O¢ZLÃÈ$;Çj^vYx}þUÑrPÕâh,H¦ÖòY{4f±T®«¿`_î9ÏÞ|Ë·ÝÎ &9ýà(;¢sø<.]vÕu½úüW¿¯Ý3è±Iq<Ý XÜâå-|³JVQÅû¬f Ö³Q§gÞ¥Ý÷2Ltèc !4"©»Üç|)ó©^ì`W±¯×¡LAÌ,qóÕïRlUôù°§» ÷ÃÎÍ·B¡Á(¯Ðt2ÈÄÀ,LÊîyäÞ$'ïãÍFÿÎkÃÅÄQ÷C0aÁ&| ÚÝ! ¥«'î ü: ®K9 B#º_;%åu¸ÍäùàÛ\Û÷qúà0À¤é/ ȼ¡*¶xñy9+ ¬_l½ëtÐt1ݪe³Yõïë) Mp Óë9ýeÁj߸@z bv B#Rð}ÝÇàÙàtÕÚaîÞN¯¤ÏQðà Äu¼Ì?í @ìé @| `D û¸@:ö¹nq: oõ¿ê´2¯9 úÓí_CÇ Ý`ïo3rÏ»Ôä>¤×¼xóþü¶aáAsq³ÚaÇGÔ¥ÀkùC@^gTø=é^`g (¡6¦/7Ö¤RaþÝ<¨p ¤ÚB@"BèàM©JóI`,Ä÷Ü,ÆÏ2ôW"«¨â}V³×{ø`W±¯ã *]èK\á7&Ðפ õ¦Õû¯Ìsè¤E&t¦ãBhD7?=B!"^|¾½xÛÒs,ÇqO@¾þfD)æËÓP@o×Ôx*KIõiÓ\NmA[·G±öy xvî§eÃ}WñQJh;wÝ^ËuxXaÉÂ%SKdËÓl×csõýÌ6lÓn²÷kÓÖ¡é"Ñev^Ô>× ¶¥ ¬>¯âËÍ.Ë/»ñ_s@DÐÀ 1B¨s1³4ÓþP©ÒUÚʯ2/%þÆÑDÍ9 vÁÝKû·1ÈU×\wÃM_ò{\tÉeW¸ï¡GC-IþoùþhÍDâ÷ÊÚצBü,8ç¡|Nô¼ÛþCöaq>1b´k¯úmÃÅt"J5©,9.QäxôÅÙø]4E Ãê °ywù ?ê!¯ö ÷y®ë\n¶Öa¿³&Ûb%f31hD§tH[U*ÔD¸¥S±f4¬q¨@Ò·bwC+«rf0OoÔ[~=ÈA1Îâye¨5 Î:ÊHXó÷Ím¾¢ÎÃT6|gëaí\EØì$¤TÛòävÿÐ]e8;<¦RdЮO(âÕª!Q!õ÷pV+ ´HÜײZVjµ¶D C¹?ÄöÁõ¦g¨äg×Q@íÁCjk3¶eöF÷û·#¹ cP-ó^ ¢tþY¨ø×âò?W_^Ú'ãÕà2ÿÒÄð·K&Õ-רÕx¥Îj]<dÇâÕ:¬ºøk6 @9V×¹I{¡¹oº.7˦µ7tëèVÍhÝ Õj³qºtwÍVGéòÈ2Tàü½xöY@ÑÂuHîgSì÷7Vë1沩+K*sÑõÆuÒqiIôèW×nܸ]pp®ÅnaA÷}ë µØYVÄÿPyÅMÐèåøºÊKnT*.=nwÁ5Óc±=>È ÊÓDÓ¦q¶ %Ôçf12R½1ÒOÙkÆ 3`¯+E%"Ç.Ià!Øfª)Éíë=;·õ«-µC^º!_ßf=z}gê2ö9Õk ªù»~NÑITÓù)&ÂÐ¥ SØIg¿#ÞBº |«¤Ìä@.?4Ó:ö«¨·Q×m~~ñÿ3d\ÕQ$Y£hý騾¡±©¹Eµ [ì°ÇGpÆWÜpÇOãopøà?NàO "$B%2áDIÑÄK¨Ð à ÂñpIDH& TÒH'LE6b$äKùP")¡2Ê© *ª©¡Vz 5iÖ¢Uv:ué&Ó£W~ 6â¤QcÞsÊiÑCD¯¦OÛOèõ GßÌÃë¨í¨ýã¸srË8·<NñúÏi~g4aÒiçvÁ".»,aÖy-YtEÊ´«V¯eÖÖ76·¶Ì^ß¹»hÂpD¦P1gÁkGìÙ:ÊÑAôëke ®_ËãSñµ¨y¿~[åØV.¤Ý^/ÞaßsÔê´©æ[Úò(ÇqYÉýH²÷XÍÆûiWªÒ¨k[%¿FMÔ_®Ïü;\àöá{í ñM[éKT"åKÅÁ«Ëuë¶N":¤FMêÚV°°Ó÷kâ¸ý,dêòoèo)cc.7÷r«Kleº\SkõÛÁ]ÖYÇ;¶3 ×QÅèÂû`L =R¦Ö <p¶ f®#ô4ô.°'nÜ)¢ÞÀt Qç`Ðwv84ü  ^º4Ù6s E; ¿RgǯòBÙOíi6mÒôQºIÖ=.ýß `¸@+;Ðã ¹sj@.¾XB jøÚÇ-Û ¥![±r ÀU « Yf${zOpÙÄÑÞ;Ú{ Äíª\d)QsØ}å)HdË×(Z4GïØe»k§VhUZV§ÍÐÚµËG¬Sÿ÷HÿQ=]|ôHhKEmu·¼Ë.-§UèùÊðw @´êZàçóyÛàk ÷Ç»â³qA\Æ~ûK¬ýq4@Û Ý Ûtz±ïtûÔ >$<¼9'£=&Ns䯶 g¿ô±2¬xJ Ôi¤ÐÒ12Í,el1»Ë>sJÄÈ_×?4v ߻ʼ·Ñhõ6Øh³-Ãò6üc¶ÝÅÄÀ%ÓFýÓO($CBØmÀ_FñÃ>¦M,3@g³Ï}ÿ``4 #ÑDqäb)$á$RJ!M£ã§OüíÏNMÏ,=V_õú¿ÁÄ0_ãÉr%ü=·Ólµ!×0òL»î¹3øï-UÀ¤Äqy'¹ ö#(úf4á-7ÐlDlyæ ²þ? ø8 %þrïGó"Lå] ´2 ·Ð;@Â@ú; ý Ï Àil¸Ì«p2¦ÈD]¼Ü%âøÎT 6b¿øgÔO¥ ófÁ_t®B+ïÙPõ:D¢uX ñáÊj±W.Ç÷ëD)"à§5úð};Q¾ÌBGkJÜ9YG"y3Øzð̨P E7Q¤]+V"A$ì8 e8?nÇ)C&Óü:ÈX§5£¦òêEÐ" 3Äî&µèÓÇ*LÁª±bç'Da`×b4:MóNgdÔcJ«Ñ]¦Ô Al²uN©wtXRÆÅ wµÇç²qá Í£Ç)µî0sDc,C?g,âfC£q<ÆÖ7ã\O¢³¸|tÑp×!RÄõÁÏa%±×§W+k³Õf$0㺴(sYà8ä^9pÏíà+êã'\³*÷ÿÞ¦Án_n¥Hí*+âÆQOÂVJõÞ:¾zûh£uPê5RBLz¨ëÉï¡Ô«áÿÝ ·rD¿d8'BsfJ¹ Fº¨`öEË9« µC¥_JÔ$$îÏ}Uú!há ®©x#ÚÉZG$8#åGµ±h¹°_JÓß+Öø.ÿãç/zü'XþÑrîÄÜufýeÿ[îxÈ^wò׺l#CÕ¿R|ðú¥Ñ ¤N©ZÉÃïsnIoHhD±Ôeÿ -·lKXmajKi*üÞA2r*þìvþªvâ8±#СÕÈë_¨Ò?TNy#¤LÈa±« z覧ßÈ«ó ¯ª®BùFì¥òôÿzÖ´²x±Ä6Êo¿è"<b¨]æÍ¯¨åûV¡ý®äò÷ÒËÒô4ÖÃÖ%OÐ&®§Ý±kbíznfªu¸ Ùr¹.R®º[LY1êªØ²³÷<SjάózÞXfòIfÙÌ ·(= wq²rhM&jJ´L\7ºMHßP±R7ÀWZ ãdê4?>¦Z~\L:fNÌG!)¾Óæ<@K´Y£Õ-WÚzitô°´MÈ\HM£8¥1¥xQ²êuSFýØ`½Æ.\Ê;º U<ãLA¡¢8Ö·" áÒz>ÓaýPÉ?DYh}Àm^ ù¬¸BF¸Ô ¡í§aRKÄcJ|PRXËÍ7æ`v"mÓ\¢#Ü ÞB(Æ|l'jM$ÓÔc*¬FU&üÁAµã²q¥JϾùo"FçˤNídê Hìíâú50UHÁã·²"²&½¢«igß*dw¾¦9E©¸ ÎdÂ[ éÑ}GþºªJNEÀuä¢=u22}4ÚO. 9»RS9jÒÙ®T§hDƽáõ¦Ý³gxlôgÝ N"§èTÔur0g¥5åøG¾ºÂ¿&9Ç8½!ógùoù cPLÍ¢r#mmt$¯2/Åÿfsb¨Ël[mÙë¾h+ª&{Æ=#È^.ª´ÇðäøÓN·½%Ñ;V. kÏï\ÝSJáõ0 yÝ>|¾éRÁ5s¯böîÀì'e ùÚ%7sÐÎr#¦×æ/0ÝÄ<¡ÄüÅ#IzýlOc2ÚiñAwÉA© 7YL+D¼ºèm/USzÞX½}ÎîÃ@¿^JÇíUð5É¿ö¤¯&ç# |µãüae±O¤"qå¤Erf¸Úñ%-á1'Wí MÎÈ#,£ÂIwbãÍ%'B"Nt¯Ê-f¨v2L%éÚÁÚsU¿ij{¨AYÈ®V 5üÎ6f&a¥)ï^y:°³cO4F|¶éf ¤²{¶²A46àx\ÿÕ_Ê ¼ÆJÁ³X ½z{r-;ïCù±&{eî0hi_Ǹò¢æçó¯ÒºýcOâ1cçUnÉ5 øñ,¾Öc66ñÖBN7¸~ZúÂWwNÿîÏ|º*ëTO ¾°¶ñF ¤<jòۧÕuÄùYTÊP7gü6A_UEõ[~·YTãÑk>½kq×/~4®LþUÚiŧ:°ÈTÝU¥ªÊe>1)\~o ú¾> z>?qsO?ÇA"y;ª/a¾ 27øKú(%Ôý©ç¡Þ/OÜü§Êº¸ üÚö0fñ>ô½mõZtÊ&Ù7²Im`jìðÆ ØÜPåèÈUG5£B×éHüôt'½&ÖÃNº\d W½aævÓ>¡t-´Ü1µr3ém ìâSµyvZÉã 7·´.$ë}âw¶'fí[Y|îõGĪ ($3ETè©\ÀJ>lÁÉÖ}ã\+)ü'£_úFéáäé6{Å:þí½²N»ËÚïê={U÷FÖ9áï%ËöõTYY%À:cË)jWËêºøÔ³ øËcÉÿr¾cn@k~i]8ßËzFiYoÕQyn;³ h[2Ù§¥îÙ#dâ<æXÏ·'½©InYLEÜ ðEE;=´J 7:C¹ÉGë.¡1²p±8õ¥¤ 06l{ŪOei~ CKme´pä½v!ÔkTè2çºw½ô µÛfAeÓ³h0^fÃ%Õn@ÒLËârúeѳÞñ§Ì#£à®g Q,E*r÷ÉÃJ }âhØ#s?éËQkT>öûÎSAìú#7x.nãrÏ|ä?>`"c&µô`r^ôýèÓjòQàGòÕÚ/Ú;I{þºzÙ=GµüD-Î3#LÃEßè³ã:Hu8+¸í<"ªf´ßú#+xúcgyä>UJ#öâ¶sí¡ãa93¹¢ê%BDZNu,¯èñL5@®"êî©©U ]¯LWËTÔBFóÛ£Af[@IBª+Z²B/êxý¹½%³J¾à5ý!© )5±|ît>èÒ!û9ìxùUPÓÞ|y }þjÚ1_q³ _RÛCÅS·4 å. ãÉ¥$<ÉÀûXîbO¼çæW¼kÌï¼pÙâmcx˪bS¼)p´Üà~ùnñº<Àb·\RDý ȤÉqÝO=×ÔÞÞ6XÈá³ ÅOðbz![ZÑÜÿw¦÷ñÓ6Ã+úÜæzJ%nÓÙ÷\ÔY¿ISÔWaïÐ+¢¡ÎgæçÀÞÞÇÆz³}pæf{ã|4,»ÅÀK6áDpsÿÑÃìçO°|,¾F÷½f(³p;¢¹KÔhnhLrcôNûKgûHÑåqùè æzAç¿,fÝJ*©nE ÙÍè3pnAgüc «Ñ¸¨ áJ¶}p·ÛÒí¹KW~eçÂ9#\îoô{´æXJ½TÞ[u\Ç<1¿*£ÊhæWüUÂ=gë{\QúòÉúog*\77*\äëO^z\fëãcÀ¥ûVWÑú¶nª¶X³Eô]è7fK¤^E gÏæ#|O}¸áùÁºiîäVì¥ ÆÑÏd$²µ$SNßÿ#Ón1@ràï³|U:.ìÆ[±O=u¢ÙnEw^Ø eË9h´%< C}iÌëÉ%ûT½ÙCÕüÊ{º×üFhVØæ¯'äë¿-T¸Çâë/ûÈåZøØE]k«ÊUcEHÎ eÓ!0Qs Ú{u¨·ð¦ RNí4°Gý.Å7=ûêånw#É4_$èúÝaLSßÛ_."ÖùÛMªHâà/"QÝáÁavæí¬í¯J¯¯zZÿ$õ¬ÿé§&RtpÓõÝ'ì^`îàCÅÇÖñi¸Ï®@áo¤1;`ß@Þc2å¶¥~ëÈ+\¶·+\ÿ8³¹ð<3æPË8ÉÞVµ/`ïÄ¡Vn^ÙnÊ5ÿ<9ÜäÙþ#6þåöâÎãGïdü`ìò!ÔL=Ãs3íbú±Øp¹ éóWWt_ÒµóÒüºi4bböK¿Ô½2þpl)§Dar"Ü þä6-`0Ê([JåQm¤£×B3@ö©Ó9¨ò&ÊeÂLM$fg÷£ktþ+Åö/td8ηÆ/µßND¾·#Ë&Åmûþÿ߯ޤzR"q)ôx'Av¬Q1aæS,ÜÑõ {K·¡),9}]/Mj ³xMøëNñ\s \Æl]Â[,ÒR¨Zg'þlêúez 67ÅotLzGDLz78§áÔÔæÀÍÀµØYo§2»®ROòrÅ ÷§ÇÈ;]E¹Q Ëü¶7GÚg³(Ø1¹b¡ìTPHÎwn8Hþz¶²~©n½.=á¼Ö¦Ýþí~ði:æe@òüÙÉít`5·¦:zô;Rº¹w;Þ°ö¶s%ÑÁ.¦zMÁ$zeSx6_ï±Ùûú»¯llµÎZV& l?[Ú/³<QÏ÷sÌw>ùîQtsZ+§¤ÖìlèÎ}Sº KæGycEåáÀÎà;åGÆÂo¦ßøÝø=fÕTÜàt´ùãd÷ ËÐïå1©Ñ°~¸V=.ÍZxz¯¾K_IdïÿoWH0ù°/1FünR:2zg CíËùÉ¥c[µòrø¼çÅuµ+å×JðDG~]Í<1 ¤®Éúõ YÙ7Ñ£RYêÈ*.íb»#æ J%JtÒFvúo÷¥WUl ,jØhÔªêóí«ú9¥gûÙe¿"+H #Û*LÎÀ½¾áÞÛC"ÄøT¶ÂCl qJô\ÕB ó°£þ|¾º®Z^ÁzÞÕÁ<×@Ìä3Y.P8¡°÷îdbènÏJ«`#¿¼õl9û9B¦ðâê~É%§fCª{Ñ S¬yUÖ=³Ãüp([aj\¸=Ô;|¯Ofþ"TØîfÔÈ»îb=WÌB5íy;.Ôü£+ÅÍþ¾Ä!7HFL"¦~zDHOuÇ«Þ<nRS¥ª"fÂûì£ìgÕ_-LÿrÈfîÝùíþÄÇ?_QØV¸ÿǽ©Ðò¦±)D,Ä<l+yg*~½èªnqÍoï]¾öàÿ¯üMx«Ê¿(ÌØöó Ó æAàð[`a5#c¾I1gUíÔ¸µ?/XÎøç@Ù¨FÞl/]×pé©OäÇçÈu^AÿÅrizr#ãr¶yé½Sbâã ·qÿ?ÀÓ®Ï:³IïüÌn_±`Å!u_HÈ©ÇÁ´öPfÃ;±^öåMA ½Õ-Ye7S^¸~]1âAÛ²µÅ§ÚJñÐú5,» èølÏ¿ÿß NRZ'Häa«¿×÷ù1u«ä5ïe/tÊ¡é¨Ú²¨nÞÃÂÆ+~úpOQ.¨áõ?ñ:¿ùôý³Ý£RÂÓù6J£y«óÉâ{Wß3>îPçxÖ9:]Q=¶Øi!äOÍð²ÆcR'k_Ý"q;kc)ÕWßI{´1/zóòÂwïNM¾èÉ{7p8ÊN3öµ}rSéNÛ¹ ö³îÃu`/sTÆvZ«Øvºd$ÀRn"ï#l:e LM?âmNO3§'O¶4b2C69OÓuf\¦J3̳¡ú{Ñu ÄÅÑöÊWo;*´ú`jÚÝêHû_¢î)Ñã:mq ½êØèR×2¥¨$A=£{jÉ ¢/ý<bÖÌÔ6MÛ+éé_ªûc£ûN:ÉãBS#X ç#K®ÄI;UÚzy×ê{ò|Ö/Bæ_c1éxËè1ÂÐn<Õ³ðÝÏDØñ½Ó}oV·Á½ß2<Ô̦Ê,W=#^+õ:41©Õ[pÁ-/ÌZJ7¹^èHîLºþê;°á×=¥RA2"Åäÿáÿd¦MøesÚ À å=/ºbçøu¨Äx`·3U¦ìÒ/!3¦òZ¯ÛyLYa±ö&S§øHWÍ5®Ï1|yÅpû ÷Õ f¦1Ý7ò½_ïØë@ .Y- K=&ïeVÕËÀí³°yÌL'Ï´ÑÚ1æÚd«Ã6ÁÏ/t:Üâ´È}Öèhî¹}ãSlý®ýô+HÎÞ\Û¥ò*ýWNJà% á1׫ô³ z<Òå#h¬OÎ¥&D ±éYqº/~È `Fö¢¦9QµBëÀÄØÞÚ 0ÐeíãÕ5]ï·®ªé8] !-7>.f0)9i¯8½¹§»=ûSåÏê"!hÇW|íÒ^NÇ7@ÇËø¸ÿÌíIJ©¾¼V@Äîïæï=°+ýQÂHHJHÉK¹c7)ec ,ÐL½Ñ9Ö·»tc2#ᦧLO§¤¦ÓgR`Eéí[%Õ·ÊnÒb §UdBð&k1¬¬ÃE»®(ä)ñ©s+×nMº¤£ú¤Dú³´u'í@ÂÀÓû;ùÀÜkZ(òìëRâ xc .y,¦à2¯a - qO ³óÏç³ó$çγ ³qñÌã./àÏ\öÿ#0¶Ó ÕÕ?k¬¯{þ¬dc'¨®Ï¬±öÙã>456d;yq.sòÏIç³Ä¿I¿è èj¬óÆFÎyè|Ná41çO!8´nºÀÒb.¸aêw2r6ë{ºyº×6ìç.rvU\Z½SoZ1ìÙÿ°§>ws7£ñÞõå©Ù+òñqh³SY7ök×JOlݰ߽bæ_4~2öûÉ'üóÎc;êWR¾ÜÑ/í4Z'À¥uuÐ8æ÷ØÏÒüA'?ünÕÎ ° Bif@z[;Aá×ÖójkùüÚÚÇ˽>&¦E¿ãIô¿ô4 «¬Gï³¼g(VhÇ3¼øw!½¤¡Ñ'¬Øì¢R?ßÇGBZLm}$^]Gñ5eøDʲ+l© M9_hÆE¡Â²È$&&K y&âÑñAÕ/qTfN`8ßʯ¯IçäT:G]]#~´³NW¦ÆêëGq"ªë¸Aéé'É'îEÛ|ôyÜ$Ãóÿ±Kü#èM7|çtzk\FÌv:c>jSø©Ë.ªÍÅ«Y_Ãûº6dxÌ{ú?Õà¥7D°QJç'¶&c¼¡¬)¨)ö×ÄÀ*®neRQZKbPâÅ© IÙÉ\®$9)!7}B¥vr$J~ñôës|½äHÿÐôp?Û«ëÕ4, oô¥ÙàSX=kJð©$m¢^«%gVR5KÒ ÒHáÁà§ZXËÜHäà® oáàüO¡RÖ?tQ'Á$dôóÍá1µ®¡xHrnU¸<cr§p]ú.µ±a®u?øÉ)±2Hoâÿeì(Ó$l eÒ´8cO%Ó"Ó×Û©UokÖÅðéTt s«ÿ¤#Ï$WÞ²³þÏÚæ_kËCëO@î²_Öëç×pÊøá8X\ÆÄd4÷ãcPУõÖµñOV0ës;î^0d\L+ï%S¸ÚÎÑq!WÅ]VÙÝÖh¯U{ ¡X4Mpéhy6ÛìEÅ~·¨i1/øàâó|ò¦}ØÅ xÆ´_nMIz4à'hx&=pm8ìòræ Ýct»¥-bïÈÜRïû`È vã-`wsóÝqØy 2n x(K{ñÄ2t¹c ùöj¨´ÆÀ#@SG¼Ûü÷Çá¤4u»5!NxWC-ØÚ"Þ ½@`\;¦4¬®¥6yâßK&ýTzd©&µ^yÌeæâgU"(¸¤ªVúlºÓi2`¾hX¢»wr^ ï\ ÿH<G©(=4 `î$ºüHv]2s»d¬Æ&É&/c'ÈLånrbØ^TdËøùÝbpjÑÿtU&+¸)ÞÕUÉ®øËIÀÐÿb¿Ê~æÂ¤Â¬àh¿µOå"¼Ø¬úa[á}Lé íÆú·@²-¾LõÐ.KĦÉdYK õȦÖÓCVªÍæÕ«~Óׯ¯3æµ=qÆ`÷/¿YZ¼_R^vófqdïÝ,/)Úß/ýúÛ±ÂßZë@õ§ðS$9æsø99×~Ø»l\LѶéÿyqéµþܺúSn|ÎyyòýäG-j¶¦0ÿôyvh2×ÈJ¬iwÁ°g¼úÎÈ*¤¥\ùCÝ>âÅÏû¨èÍáM¨[äÝs2ø ý~¦ÜuûfÓï³ën j[x¨í¯µ-Ì>_@þrGü¨T¿ÞÜ$OÀîεRL<»;£ GåyH¡ãQØï«ãT½¿Â÷Åé|£É±©)ø9Jf]m·çq±¢öw#{äPh¡ð_|= a%ôzÞèß#Û%£ð¢Ü^®ª2¼6åÈWäîÍst ÄÐ_gèìE¼ ">{ 8·cvO!ÞÄ×?s9Ü»Ë?m²Ò×õvÓ¦S¦ÒSÓ¦§Sïéää©ôtOÆTFtUTTUt40p*ÉeâzìFÜ=]TJ·#Â^°8LÙDÂ^Øé¬ÿ]û#À×~<¦wçvîÄPkç¾qñêQå¹âÔ´.Í®V¤Õ&èÓØbKp$TN ¡åe$ ±ÕÇÌl³¤d¥ûÆú*ÒT¨?Ï|Ïø3W~óCM[æO.þÙqíeô8 Áf¤p4nJ /1h²½p;lB4 ;÷¹p}Ln»(3eíê$6ôÙà|ýBbmÆ%h¿4ºÉ*´æÄ}R·ü7G|ͽ¬¶zyõÔâ$1tÇ(U¤ô&pGó³ Née:ÚV,äàÁz"ex~Z 3RL?/&Î3çå@é /`¹køj#SÛÔáÛ£ b"¨1ï<óø;ÊYB¦0!%·fÙ¯Tà8±\£"Ì&I"Í:ÉV¨ \ì"¿ê \Ñ %·SËÔÖáEí®QU^Ñ -¤5O¸oU»ÿÊÚÚÊú«[upÆPôè¬{sóvM¦,Ð%ZF"¢¬µ/ó@.ÉèöFíús·ß^½ç@`(fUa5/=Äá×gkLkhÄ;iè ÷+ðffxÏ«*yOF¼²ê¹ÐÁ{Ùði)á55á)ÉáóÀÀPæuÏ|rJø&+!ZÊÌXÊe,ReAË\´Ì%ü¾®ïØÁ?ààSÇ>K§Lμ7ÿßÊÖß´øÖû!Ê åB|O%{x@ jÁ¨1 ¦ÿÀPpþé\C¼uÏÉÐÃWo'Îó÷þÒo¹=ÜzÇ!̨ÿ{0ñæÈÆAÓwóHÓÅðä 7/²ñðýgaý:ûýo}Vßlwüû}¯·7_>×öç«S_XÇ« xm|ÖñûkÖg컵.ì·Ýý¼abVûB¿@ ð7D@/TY²¶«ÚÔÚÈß2ùj ¶¥¥ÅmVw)&üå¢fÛØ\ÑÕb=IÙ³oµ~ï1ë÷íîÞ¿5ÀêOt@Oí ð3ßÐ~Ìþ±½ÍþWûqûÿÙO´ýNN«Ñ!oiTe CûY@nì×dÐ_ú ÷M1åFN¿\=¶¶Ëjïfö«ÿ»®QµOؾ·`°1ÕUÚT»êAçUÈ_êlSëJ>Güh ty TÜ^°u9}/ºt¬BÔ_*ÿb="¾BtÏ"þß±µ8_^H³5 ÄòB£{òRxÕ@:ÆÔº[èåÆÀKbê+§byÜHmÞN¼X»¢_-´ÀÕÊ$aëA²{)ÚÉdù<²$ÉETÒ8VÐãûs´>ÿ{ºÊ[hø)ÿ ¼ÖÊ»À:qko2p¤¼ÐáèH)NÞ0ÂF+ ~ í1k©/Mâ\k9ÿ;¹ïÒd¸Rí"ë³V :<ÝÔÁqe7z÷úÔºUoÔXoJé½ÍÌd±@'ª&<tÚ4,Ñfõ^ÔíÞíMôÛÁ1ZÑà<g qþ¦]XþSéßN=oNç¡@À ðÁ pò¬Ö¬Ët²Uª:«)3ÚûVg¿°ûÔîØ¨k}®/ðeðí¾ß?ñ+~ÛÇÈmãýøUô&ZàH ©%L=i:gç@þW¾eñÚò§rºÜ(ÊtUÖ¬º½^4öáâ=þv&qͪgÌÍuóÒùÁùyï¤/¶-þºèX_ô--,^-)iúÒ¶t/¶<¿ÊòWVZîÎ1 ή®n¢îiÝïô4ôðz"½Szôéëë»éèsô¥úýúóúkúëú7ô¿ÕÿÍÀÅ Ô ÅàÁÁsCCC;C¶¡ÌpÎðµÑq#Ìè¥2@¡QÖ(''Ê Cõ¡N¢&Pó¨Ôû¨-Ô6ê6ê#c¤±³±¯1ߏոñMãLTMÂLÊLZLnübzÂlÊ7Vv¾B»£ÃÐ èbôz½ÞA,@ÔY¹IÊ{9Á<MBøaIR*iDj´!Âwb3|ü¤`<`äteákúçÌD:êîé-³ù¶Tq+ÛÝõlÑzl¥jed ±ò°"ZM[Yã¬gmül*lFmÎÙlÙܵyhóÖæÈVÉÖÐÖÁ6ζжÊvÔv°?A*`@ðßr»³G8Ã)òyò.àØk7ãlÓã|Wð~óMÊØ".ôòCßé3ï¬pJ4¹Zkë±EÖÖݦ¶ÄxËËuf^qÊt$¿ÓÍ1/ Áï{N2]GaHÒ¼AöPc(J,NÛüfóLéÏjÍ;ñöD3Î:ÏóÕP-|Úy©]Ñ´?J½Ò£ûðO0@.ø½Ptâª×HÆ vSóüPEQC1qc©0:Æä¹8 Ýù´îÌKO[<Om )¿ºm·T²ñpd=ûÇòiÎ_K ¤ÑäTW8º´Í¨]>Ù±K¤¾¡±®ãåïõFÓ<³+) p~71N6l¼'X¿$OPþô#GÎ84} ùçâAÐw¾¦ë+ßLÀs®c7B¬ì¼ªºïì=vó.TQ½¶Q×Õú*ì_ôÀ8µyIÉ,Ƹ`mu}Çb¼¿WCôüÃ߸$\Yð3F¯&Ì:71T8×jYj¼Y¿6[UÑàÂr̾Ð{÷< ï1#;@!F¬j$nÁ<½KîÏ/¹* rÆ1Éqrs'ä½ñ|ü¢lêXÌí¾b:ärßHOJUz}&Sìôþ«0®±/MiI\¦¯Dcä§J79±Ïu åI ¬qV©P«Á?`G¡Ûá£Aïw!èéGàÀÛëäÈK&ÎîGÊõ1M¡²»¸6PóZpÞ¶(&/ç,V²×¦¬Y-¶ùïçR{gô â#4!ã p¥AÍÁå æV&ü ÛÏÄÃ;\ùÛçô1(dÔª r^¿6ΦpÅKYB£R6a|)mi tj(¨feÄKúÄ;òócó#² Ýd;ï(¼/Ü©_÷ß| Î×ÍÏSt´GïÅ <©}»>/kûÇ 5 ^,§aW,VÏëG-,¬Ã¼v·LÁÓ»%FèÇ¿40æ§©^L2>·>Ç.Üv oð«À`R9FEÄIà88D¦t)óA¬íoH¼~.åwJÝw¸P³+õ\#r¾h`ÂH -vÃ;¡ºöDßãä bi÷ßthÃ^"[ÁKݱÀaEWëÔ3|òbH5tÈiÑXØÅçòA Ýz) 7^X[²mÆ4æ# ØúÍæàXEevµç uîB²$ÒX1i*§ììú¶¨÷ý°ì>µ=úoqdö i|Îy ïã '( hªÚy²â®i|+liªPÂÛ M]ɳ-~qaöôùrs,ndôÐÞ(]öÔ!y6TCfpdAVKÌX »¢óYòZ³4'Üg¾¦Ëdx*.Ì-;©.,9ÑDçSìµÉVýþE'ý ¨Yª¥MàüUºæøÕbjD7µ´U²Ü[YîóÒ¯bbQ¡Ä3ÿÛÆX¢zµ: äçAP-uçÑÿ¼Aã¢ýèý¸æmMeÿ±-<"À Êgoö¾hÿ¿Où;,@jãîÅ©õ|Z¿×û¦Éı2,Ý¡hÈýjR]ÆgX ®+îû+#×N5è6íð³ÆÙÌ<?oÐelTåÎ< PûÌåzÅFörA¬hø)2ÔNCBmôóò¥é¥i ÉéÂÓÒÀ´Î&ë@è!%Y³ÍFìA¿,¡(ñ3§\ÕÏo¥4þ%¦ug2;¨ýÖúET~ÍoA4hf[¾ó(¡9-AÁNµîYµua¶£K¼çÖÖ+UýÒÜ<»ÊìeùR}[ Nk8¥4Ä~Æ×õGhñún"[Ê?Z÷BÛ1"¯¤¡"@¿ºÏºøðËÁNºcíRûУ|Ñ:άý3å÷è¹tÔoM¦¢Qi ¡jg¡ºæ´skãg8Ó+©P(V+Çõ'Ã"¡Ý«Ó°;-d5<îߢÃTÏ1X®Áè¸bß"X M+ØÆpî®=éµêFx·ÀJ¦]î:|ÕW1ºUFT¨!j6ùÑ¡òweÒHf <0ë$Üw9}ßàÄYjÁ $|æb»#ê·Èÿoã ^á ®Ì<x@ªY=RÁeEMct')ûQ<ølÊ}PÇÓQÈiú÷nÆ|I¥@U5Ü!C@p°Ý½9®3ÎOuJt½ÂBD KÙ,!@±zµXèQf<0;îÍqdö| ÷6ÄÖhÿ¡3¨Ý¢ÐâØTÇg95Ý· ¢ uN$hS*GÝåî¸ ¹>ï>ÛÂÏÂÅLmI5©s Ôq«/R/qR§qV< 8øzÍ &mÖÜ×ÕCjf©Ëx,±¿nlëAÀÚ5ê?WymÎsÞI¨dÌÐ5¢7^-LüÍ2dÃÞÇÜ5èר° w<¦¬ØÓ(qewÓ'g*^4gy]½5ÓQ¹2½Õ§â±pOÙÕM/Åè°¸ýï+Û²Xkuºr.vGª9o¾=Çlr#A Ô+é\F§éù£Kc¤jØÏÞesG+A¯¬¾Ð´½ûöð>³ÌI_n?I<}{[W§ZµÝÝQѯíW´mú×F³fØo+jCªe (·"iÞòV"£i?¿aým,u9³9 üþkÜ%¶$7ôCÓv?ÇÒðÃy¿+Çe_øÆÆh/á·ß³rJܯýk5qi/FÔ©¸nò5ܼ5ö9îÆ½ñLëômZåíÖÄAnQ×@@ÜûïP4²$ÍÛ!!Âæ¾Ó1ù|d&D仯h3>Ò=Ø>ê<|@ÄUmÉÙô(ÚêÖÆ4ÉÌÄ1¿Û®¼yôºÛ@Ï{;>Ô¹eÿêùøá7aLJþB½ÚzêäÄû¤Þ9èeVkÎ6qPÉ8Ëëk)Ìê¤òW0Ëvë¬e¢¯Í5ào ijmlhW¼Å¾À)åå7ûP#/qTxÂ(Y?_VûñÃQ'kfá¿Áwßz\+ ðæ#íÂÈoùtµFÊ/Q«¿)»Ûº=#gÞïï¶ÉcISßÀó&Õë%ÖðË*¯?ÚÇ\ÎkA´~{*ÂGö{Çí¯8¶)ü?UcjÔæ>u+R±»Î1hXÔþ>Ãç×d Pq¼Ùºh]S^ʳâ²Ü(fùh'÷ÿì*áÏ3à c à1z*$öû+úvçT:7wÔ¥pp´GÈ|m´êÿqrh³l±ª*b?ß²±µòFdí (íµüm÷-ÿ³±Ø[W.Àkó-§óÝVÕ4«p4¡Öy?Â4ÁÁ !®ôé[ÌELþ#G¯Ö\DqíÔ$Õý¡f]ÐÓýìCÈAl cãÚðÿþûCì¯Ô¸Æq×(±N×eÏ'Ì·Õf'NßÚ1k*R1 :ÅýG+Ìí-Ø`_(¸nmáJô¥ñ|ëU}¿¯ïÁaÍE3ºõ,øu´çÎÏr~!Ks öÓqû©ÏLh\Óª#¥=ª i ï Þéã F ´^nsqo¦ëå¼ÓÈNãRS÷iØ0Û#|^Õè[aNG@·õÞF]Ö´ÕL ¹|Iõbî~K5½Áê á´UdÈQ4E9*´¼ÑX qaÅ9= ÉßQP\o O,!ÅütÃ|^|im|nFÎþ|þ:&î:Ýcx¶BÕòWhè×élWçc¯àíhâw±åª,+¨zm¹nhQ?nheºA,Ó¬sBåÜkîêò]°>ÖKZúÝm |Îò3|H0ìá~éÕíAÂüÞ !þµÁj¯Ú-°1Ý,+¼-ÉùU{Öþc>÷$ËnPXøøDgÇléaNL´ïÝýÙT(Æ~òã úÕ¸D>FÉ È¨*DKæ½K fdö9lÒm¨ug®KºLd3®ûc¦D}À õ¶ü÷sÁwr7ËeÏM(Ö_Û·Ëþysr.pþhêRei^¾Íb2º£DRz%ß:m@ùÕÍKú~,¢5ðnAn¨ï»°õêBð³[Kµâ;kÅÆê÷ô{Ó,kØä&¨z&ÎgÎÙ IÕñüé,¥T^o·<ú,O=³ØÅqW(¬ÛçH^j÷ж̧ãuÆì¹¶âPÁó¦ öã íÈÊÆ¨Êø$pïò5BïJäâ7ílÙ}oÎYÃ'û[!ñÛwz¹ªÔiÖgìiÃË,C<OvØô¨Í[{{µBþh¿óº½8%ïí).ì+ÅhÏáÉIÁ FD#9¬`C:S÷óø£ªPVÅãÊ1Þt²n?k:Øi±÷Ë-¦1ïUI;"S!ft*|ó1ét"U];â¾uù þ×f9éèCúÀöÚáeÏü8C'/©µ» [ÂGE{[ÎÛâ>rÜàL0¥M»öÖB×>FuJµÜ@$õí°ïÒxj[4g&0xk1( \²ëv²ñÁíª)p7'<ÈïüñÿkÁÈW+ `Å×óXv0ûPqzmW°ìRÒë»F³¯ÃsïWÁR^˺֨ßõîzï`¿uEQQ²©ü³«& öOv¸dÝm³Ê\díç Aâ¬×!é( aZ3â>úÖ+hºs²Ü£X lËK¯LælðøHÊCåÄmV÷uta) ·3ÂvFÓAN,Ô8¸¿9&ÿWêzÁ Ï«lÞZ\ÅEF£w^~K~\Y-Xh* põ®¸1r§«äshå}®ªV×QC Øx'C¦y6²Q妹"_ÁõÎïeDM½z÷ütÄÏÒ~BAb.ðZ±kÿ6Ï~rmäÒõÑD:?Idzja<ß`"³çRS7ä÷dL V7HôŤ}sþüù 54´£7±| ´ZÉøÒåÅÔâÂòbk,ÀñI0¨K$*éôòýsæ¨àæSãø¹òi9ôÔ';Qø_¢46TÍ!·ÎSyf˼e«&@õ[TçÒØ¹^«¨×üpÔ©Vÿý}g&rmây7Rÿ ßSÛ<ÝÌêYÜFê¸SÞQ@²¤U-Êé2[UCPÜSó®xV KÛAH\A R;@Pc}qïÞè}¢yw2 1b¤Ý×&ÞÑ]§CFwÔmÝóThÇ ª© ä\ºg¦:ʱßç_ëÚÀÛZ5j) Ï)´bÁ:y¸øQ1yq¹Eâµ<t'ª(£îÚêì*\lÛ£ ÜÌz:n&Ök'Ò æcáÙé³è¦M+È.»<Û©sjÀõDH°kP7· EñfÇ:ö9#¨ ÷]B×"¹Ï=J»ÌÈÍRÃSw¢RKªB&'¢cÚÇL$:÷ú/à2þæÏ(;øÍ-¤Æ@dÅ»æ¥÷Z©Ç ÔZ]à.ZÄÌP¦?oÑ)©¤Áç²Z+}cìÀ}>ê`¶N`¯ºÞæéÓa%JáÈNËxÛ (cps!)=ÚßÒµígµB]2±H¯Rtq5ÂQR-q>fróÂbÅdbNgô Ï=µ/tÕnFÚâu|(ú 1MÂ;n¦p îVòvKwòj&s]0ÙLÉÈ)KÖ8¸;Èt'ù¶ýZ·õ0Pi¿F}kvjz!e# ¡n¨NkìÈ£9¯H¼® Âe}§øE\?ÃïVad|¬òI8 1ÏcáÛFJ Æ\Fº®séu§Iã:!Êò÷ô«Rê0[fzÔÃfâGLrQô8°þKù¦Àáz¡1VîîÓaÅéû6K0Ê7=2î¨Ó¸¸N:ÌãsÓü ãSåsµß¼cû{ËÌt Íi>Ê»G)·ý|Yc_¢5øv÷´3ÚÙ*ñ 3gD¦«Ý§#ú¤±EòxdÖªÚÂ:æ³EÞÛìê ø¼ÿ ¾_ú~êûïϾ?ù¾{ÕÐi³VÉåãfâ×U78Á}Û#Çëí¯¡±BµzC·.%±?ËîÃòðhððû±âÈb`÷Qö~¦zaÝ_Vù@ ~;þ|\{à@þÓ¶DÜäñï8æÉiFÖö®ðý½ïs¾oø>ì[v¤é<ö· 1sñÐÒJZì˱«÷qO'ÇÉvyˤæÀͰçb<ÁÊ ¨VN@ºc¬hx¬JC~¬´øá½*=aÀLþ`+oÄàÁbí:î5Í(h.$Ý9ÅzØÑ\0Ë·]Þ¼[ÆâLïûÂá;uÑѰÁ%Ï÷. ':w4«ÝÅFFWüø}(ýã^ÚÞtíX>:9Í&pÁ³ûO¨uYÓ 1á¹ Zâ;Êá?èÒél=G.N~N3S,©·¥&Uá8ZÌ©Îs>ÒeÆh99ntèeµo+ø3-üQ:5NëÒÜâ£Vpê.öùL*_DðAC´7@ê~ë¯éûÑèîAâ;H1¬v&õ8FYÕÒç4ç(¼.e=ºY*¬pI r1cÐ bevÂ/ÏXþÈöeß´×ëM`?"à¿ ¯c(Ôü¨¥Qº/÷dùxEV¬ôÄI1G,Édo¨ÙVùdªelb;è¾Éi¼bîz(¹@ì¤bðpAHcÚíå¼DiìÃÀtH¥X¦QÒ¡!§ý2vn¹&˾u¥ ü ¿g^ ºá>G{Y38ÃüfÞ bLZÁFÿ$âߤ¯ Ò¥¯'ügg*Ê*h _l8Æ&;Yâ6'&Ìú«31Qhl¶qÐ+¸¼æO\º8ûQz®ôvz Ìj×+»nAøËÌ.¹ILÞq5¹>u ©Qìhál¤¥¢xô íSØ:Îð¶îøwþS4îÌ' æP/øì=Úõ&Z w¡è/f¦¡d@0#àLLZh?#Wz»BǨÙIâ {*£GLQhêÆy;pÒ 5gÊv(aÀÝïæ|Îðk"VÃuþ(»0áUàéÿhZæÿ(6ü«æf¶%«A²ÂðN¨ @sb£I@;í¢6¥CÕëé·<ÇÄj¹sjô5'¢ÌkAáìp£5·à/¯ô·õ= dÚlîÒ©y{·á{¤ùruÖUô88ÉiüYT*I_Ûéöp>ÊéÙkUô Fþ0'^}æ#É/O¹85=įgS@»`¶?T'nM^×gxJOv<µ 9,ZC0@õ¬ìxïë¡C½Qû[Ä´áà>N±v²ië^,gnÚúæ×´2q×#ä¡|kqôÎ;þ³33ýw'²FõI%ÁÄÏ¡7÷»#M+Ùv¤î¼ßl¦"ëXbwé,ÝÛ; JÚó®M±GÂàhÊQ*ѳK.±]úF¢µ.A_Ïq.½E³c qA ×ÅÏF¼wúõ(4ݨ · ràax.DZè¬ÁÚ%.µÁ_bý&ó¾ÖÌAÙÚêȼâäÑgìÒÁ3·Éç+Î?-ìÑeâ%Úzii0n%cOóñIÃonØü«ËÊüÉ.:y*µÄ¶kGØÙbå*ÿ±°YÓ¶öYÅÅ«8þE>¥Ö"y1ln©d ¡oéñÊo7H0nM¼eñ´A {¯&x ÃÈGs¹°4vtmÚò-ýÂâIüöÕßdL ࿱ÐòwUã1ÊKód ÏÓ* ìün×Êh¬ã&$âü=³Åßt+ÇåWß°O3óØl]¯¸{äÏCâ§îSOÑpÔ¸fw(^îÙ\xüb|Ú>ý¨-2g1.Þ`^Éê÷Òó¨8ßDã8Ϫs«Á+éºm¶ëP)Ú£wï÷½Th¤Èø&]½Ä5S":- ûµ¥ëáýHqyµvyt»%wnaû&¶?ÂZåaoDòØq«~ýt¶3çØXýMAÌü¥|=æ+j¥ü°¹ÒT`I ºÂIÞÃÓ|Pw5·ªN5__Ö b÷U°AV}öWd~@ Ópxn^®òWÑömÊ2¶íÉÙÖ¾sÞ@7}Ï*vÐ,WGÌVS J´@>ªÅ4wµr9×"G~×ß¡(Á<Ú¦²vXÆÇDÝÄé¢H#TÛðèÏ]C6èÁĬ6\( >!çn 7gTä ® ¾^4)g>áåÁ~ä÷¤j|§UGZê#¾&;ø,ãñ}*ÐÍ-ÞoC^c¹9ö.ZDõÕl§û'´ßÖäzÃbf¿t*l/22æ÷ âs¼²Ê0{ áëÚ±ÏÝêRgÆÏv$?Oý`tL_YðN?GÝ.Qǹ;c³ÏS¼%Sg©c,Cû±rèBì×ÇLÕ@WÔ+o7.§ÄCíyAý± oòÑAðx^µöîñkëfÚw°Íu?j0)çdðýélZ<~ÄJ»BÑ< {Éã8¨@Ñ."(éyözÞrb3ì]¬%âÌ]>1±ÚÅï&ìçwlû©¢5;¯PÞMßéu"S¢uuÀï÷CMh:û)ÄÍÃ9ÁÉY7ü`í¿Õ'wQÀîN»`¹YÛR#îï«ñÛõY}¾+ÝÛ¦P÷¼H©4ÎñÍ/ioænÖ µÆ?¸å#ÌÕÙúÝÆÜý=Æy¾|VÎϲâѹ:Ó87vâ0äÌw¶UL dØ· ¯ÁHõÚVb.3þMÞ1æ[P6E8Ë&yræáÅÝt0`õ °]Û9`¡XÖ9_¬üî£{©tjÿeJã%±W«JÚÉ.Pg¼eG°ÙDz+D<¥¬µú½!uü{¿k8gä^0[âx1)è 1ÿ0*:! ©÷S§Ï2mìLÔaÄuT'Ø®ï_=ìäÈG Ìq/Ýį'½}%Á#óÞÇVêeÌó¾ÏðbiªþB}ê|¼ Ô%*Ý !lðn¬1¨lwsEªPG<l/è×R^ÿ¼7^AèC¼O d¯¾Q³vû{[-r&Kic^ )Üï<$Õè_¯s9ÎJpâ .|wãáÏ¥|À«÷ õÞ|hYi:WYÃSAúhn´=N££ý¿¹dpt<Ð\"a .^AÕ#øïÿn·!êÙöð:ÔÖ¹YÍì¨Þ$hצÿ¡DY&ï´Í©6_ú«]<ö©4 ýª¼EËIz6.äüä)%4þpnñPê'Z# Ío@8ýfãÐ,Y3q-¤óïËR2FU¬üùX+A¸Â»85Çm±¬è-ùwúN}¥k6%8BDMìæ~»bWBù}Y¥@ucÿpu6ZnT vÅ(<vM§áÖ(vYmÇLÏsß¹´bzGgÕé?¶êN,é7éÙöPè«ã¤ÀCdAø¤i¨ïA43}Rwj«¾ÓáÈËYziïÓ}5p¥DWd£ ô ;¦aïCv«ÕÖoëùØ7r÷LÊÃãÿ>r«M']C£Ø°b@ ßJ¨»Ç§ó=ÉD%¼Z&¥";oÝNÉn;XÝÈÆ5¶.ï![?Ûl^äΫǶ¨é-Íh¥Q£[+PKÿ/îÙoîïÇô÷Øô%BºØ`À1ÖCðâi©R«PÙç8=®§' ¤CÇ (2Ü!Zr IÝ åÔíX& èg9áq¡Ï/§8èÝnÖM÷ÃK?=4bW°®~d}ß T¯¤G2ÿ9Èeþ(¨^Ox«HŽkT¥é<¯A CØÐàd&´jËo5\zq/3>âËÄtR½6!Ê<Ç©ëáiúø`Jm]^«V6òZ6º@½;í}¾ðüÜÞê$&QÇÞÖ.3ñè74]ã°[¬¾Ôª¢»YÏ~.ò\§Çj8¡ãvÒ|¸ëØ£W(GEaèh1vôØeôùaêÕÏÎÉÁåKwÝ-UOÖØd2nÜT0bz °Rã.9KOTv?jjÜõ·ðn×§4ðz)ºa4É«O;þz ÿÍ]*µV ÍJ×ébde¤&¦åT£ÀT¹f娦8üí5}sÙ Séõi:óøëU4ÅíÙ*qèe±*ÛþV¡åÈ»U{sô/}cqÆh Îçæx|N ¦>9mææ®E{{ã²'xyKõÖ5µê¥8|9è©Ò%IðôʶZÉbI.ÌöÐíHØýòetó;o^ú¼99©±MÖ5ÌJÿ`p}.a,»Ýæð#£rZܧ/í¤aÁÙY ßNtEÊ)ø [MNw=>老ççü¤Ö^ ær¾@TÜ éèr½47Ñ©[d[½4¼IqpCrOäéæ`Ò«ì.ð0ÑôIÈ@ì1÷IÞ°§ÜÈßÄ&M~XÔE1º8vâÃ).ßpñÍj®øÁÊÞ¢æö )ûçG1ùï æü7äÉâh¥ ó8òyTÞóLc"òh'趤ûy|Jþý³6 's:äc'÷]g@ÉRùßÖs+4Æ[E4eJíµi}3$éW y}ö¿ýêÓU·;þ a pïy² Àýµ~:Îÿ Ç¢Z @`lS]⣠hë-AêïÅhåt«Cãï¯A2Ôã¹ÆÀ¶ª4&:êí®¡²ý9 í»9ZPS«ò¤ÌZÇÆº ?®j ÐY3ëªÖ ÜêÎpYþ]Jÿ!1EÛ^ '¶¶I>³î ©9ðwMx´\ ÐôìLãÔØÄøÊc¤.¿·ôìÂOhc+m>®ü íñO<b¼ò'dn#KUëÑ«vQ=ô}: [_bhoÏ(ñf{+CC-lù1þò·äÄBøvÅ¡<rúVB ð·Pë!õ»öÚ¯¤8CçÚ²ãÐ8jFaκ{*8XóT92 ¿T5å-ùÌ4n¢¾³ÄÅ+ÕÿßJ uM>3®ÃNRWÔ¶kû!Ékê$Pó-P{pLº:õ:Rw½¯ZĹÝ×)ÀÝ6SÜG=:Í1rÏ5 rÚÕ×dõë8×l§ÄÅÛɶßé¢¸Ü á#Èç ÑYm`êâRX"mØH=«Èøn 5 !µ«UFTr0ñï<kCÁL L6-NZ5í FBÅУ«swj5éÂÄ ð+ðn&ëal»ßÌC·ð²Q0lºÒI>4+B+@+ ñê¼' }$D5[ Z3ÞAô¹ æ=M'i' ʺ ¶»²F `ÖbÃIiF?È]EN%²¨%:1 V-; pt!?¼ûGH£@®<ÜÂ*$XºuÏáNBdÓ±~ëE$f Ë(cõ+h:!)3^X4®oi¿-£# ׿9á[(MÑT:{¡,Nß½¹ xPÅ0Xj/;WKow§+[û3DY1ùtÞÒY ±ô)èZzy÷£c¨Ô²Ô4 *JM¯¥c 2! ²Æ¤RN«R%T ,IKâ&Kô:)'þ:½¾£Àú·2ûR-§Yé±³Oçð5Ç7Ýv³ë»î¹?B·K?ÉëCx wu û=ï±»]ØC=æwÂ?à[¡«ËCb"Y®pßÎü1pßÕRÅJ²ÆûöEIS®L Jå&«eøÄÄÒÆÆQ¶®f\p]¨¾¢[É9ï Dèöy(ø£[ãF"Çâí_¨$AR$CrÅJ¡8±R â(¤V²4JV©Ò)Mz¥+C2ÐeÝ+a±diü?¦U9fÜ>%( 3KFeÉDF¥*-³²eÑå Ï\ÎÆUóËEta5jÓqòdS¾ì¨Çåe!{(âDê©I*Å/|¤ '.踵H-&È~BIð}`4^½Å!µ~.쾯Ýõ rÄ%k¯÷¶¢´pÒÿï;ÏøËÌo¤é iXë¢}Âê*nIúz¯©«¼Ö_åî½åôMS7ß~kõb£"¼êmO,\ôË¿uúMÞÈz8gµ0¡L¤²c;±S;³s»°K»Z§«* ÐK;á$;·»´«ôÝ_C~Ûs3¤Z[zðúMÜDÙqÿ¢oçûÝQÙqú¡ðÈ7s£[¶³Z'þOIýqb ´]z¯ë\ɦ?ª½P¡w ¤}\»«wº[ÐEi:PìYð¾YºÙqÛ±FJ"pç¿tjëfc¬P3Ïh ÍNYûsñéT£DTcîFYü4Í7Ìós=?ìå¡l}üRK9×íºr«È|½iâQÖ¸³ÖÖ×uEvidence Access-Control-Allow-Origin: *Solution Ensure that sensitive data is not available in an unauthenticated manner (using IP address white-listing, for instance).
Configure the "Access-Control-Allow-Origin" HTTP header to a more restrictive set of domains, or remove all CORS headers entirely, to allow the web browser to enforce the Same Origin Policy (SOP) in a more restrictive manner.
-
-
-
Risk=Low, Confidence=High (2)
-
https://sites.wons.bt (2)
-
Server Leaks Version Information via "Server" HTTP Response Header Field (1)
GET https://sites.wons.bt/robots.txt
Alert tags Alert description The web/application server is leaking version information via the "Server" HTTP response header. Access to such information may facilitate attackers identifying other vulnerabilities your web/application server is subject to.
Request Request line and header section (238 bytes)
GET https://sites.wons.bt/robots.txt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (675 bytes)
HTTP/1.1 404 Not Found Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:55 GMT Content-Type: application/json Content-Length: 53 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-oaclCQ8M1f-x-KHc7aztyg' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=blockResponse body (53 bytes)
{"data":{},"message":"File not found.","status":404}Evidence nginx/1.18.0 (Ubuntu)Solution Ensure that your web server, application server, load balancer, etc. is configured to suppress the "Server" header or provide generic details.
-
Strict-Transport-Security Header Not Set (1)
GET https://sites.wons.bt/robots.txt
Alert tags Alert description HTTP Strict Transport Security (HSTS) is a web security policy mechanism whereby a web server declares that complying user agents (such as a web browser) are to interact with it using only secure HTTPS connections (i.e. HTTP layered over TLS/SSL). HSTS is an IETF standards track protocol and is specified in RFC 6797.
Request Request line and header section (238 bytes)
GET https://sites.wons.bt/robots.txt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (675 bytes)
HTTP/1.1 404 Not Found Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:55 GMT Content-Type: application/json Content-Length: 53 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-oaclCQ8M1f-x-KHc7aztyg' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=blockResponse body (53 bytes)
{"data":{},"message":"File not found.","status":404}Solution Ensure that your web server, application server, load balancer, etc. is configured to enforce Strict-Transport-Security.
-
-
-
Risk=Low, Confidence=Medium (1)
-
https://sites.wons.bt (1)
-
Cookie Without Secure Flag (1)
GET https://sites.wons.bt
Alert tags Alert description A cookie has been set without the secure flag, which means that the cookie can be accessed via unencrypted connections.
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Parameter wons_csrfEvidence Set-Cookie: wons_csrfSolution Whenever a cookie contains sensitive information or is a session token, then it should always be passed using an encrypted channel. Ensure that the secure flag is set for cookies containing such sensitive information.
-
-
-
Risk=Low, Confidence=Low (1)
-
https://sites.wons.bt (1)
-
Timestamp Disclosure - Unix (1)
GET https://sites.wons.bt
Alert tags Alert description A timestamp was disclosed by the application/web server. - Unix
Other info 1786819373, which evaluates to: 2026-08-15 18:42:53.
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Evidence 1786819373Solution Manually confirm that the timestamp data is not sensitive, and that the data cannot be aggregated to disclose exploitable patterns.
-
-
-
Risk=Informational, Confidence=High (2)
-
https://sites.wons.bt (2)
-
Authentication Request Identified (1)
POST https://sites.wons.bt/login
Alert tags Alert description The given request has been identified as an authentication request. The 'Other Info' field contains a set of key=value lines which identify any relevant fields. If the request is in a context which has an Authentication Method set to "Auto-Detect" then this rule will change the authentication to match the request identified.
Other info userParam=email
userValue=zaproxy@example.com
passwordParam=password
referer=https://sites.wons.bt/login
csrfToken=_csrf
Request Request line and header section (415 bytes)
POST https://sites.wons.bt/login HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache content-type: application/x-www-form-urlencoded referer: https://sites.wons.bt/login content-length: 122 Cookie: wons_csrf=U7ygdlDsPzGNhVUsgcCr.b490804661bdf6603f4969db6e01cc20Request body (122 bytes)
_csrf=gdXNiyc9N0Iig9LmNb9i.410b60267cd34827dae322d24fae8397&redirect=%2Fdashboard&email=zaproxy%40example.com&password=ZAPResponse Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:43:01 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce--dfIRmMUKdxxdZ_IMFxwHg' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=gRIK3HGIJxR68sM4Q5EL.0bff81a10721e56aa8625ebccba60dfa; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 37735Response body (37735 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=15157ee1095e4f8c742bc1da69f09539af2e5d4352b7e6b482ba536ba1eca3c9"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="-dfIRmMUKdxxdZ_IMFxwHg"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=""> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=7dc31ec4adb92d96d6c8b18d088022bd6bcbe729e1f8df03b1464f0e898df278" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=d1130a192b644701a7c6e6df17d509a8cf23ec32719638866f0909b1e51063b8" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="auth bleed"> <div class="auth-grid band-inner"> <div class="auth-copy"> <span class="auth-kicker">Welcome back</span> <h1 class="auth-title">Sign in</h1> <p class="auth-lede"> Your site keeps serving while you edit. Changes go live on the next visit — there is nothing to publish and nothing to rebuild. </p> <ul class="auth-points"> <li>Your pages, photos and details, in forms</li> <li>Switch theme without losing a word</li> <li>Invoices and renewals in one place</li> </ul> </div> <div class="auth-card"> <form method="post"> <input type="hidden" name="_csrf" value="gRIK3HGIJxR68sM4Q5EL.0bff81a10721e56aa8625ebccba60dfa"> <input type="hidden" name="redirect" value="/dashboard"> <label class="field"> <span class="lbl">Email</span> <input type="email" name="email" value="zaproxy@example.com" placeholder="you@yourdomain.bt" required autofocus autocomplete="email"> </label> <label class="field"> <span class="lbl">Password<span class="hint"><a class="auth-link" href="/forgot-password">Forgot?</a></span></span> <input type="password" name="password" required autocomplete="current-password"> <span class="err">That email and password combination did not match.</span> </label> <button class="btn btn-accent btn-block btn-lg" type="submit">Open my dashboard</button> </form> <p class="auth-alt"> No workspace yet? <a class="auth-link" href="/signup">Create one</a> </p> </div> </div> </section> <style> .auth { background: var(--band); color: var(--band-fg); min-height: min(90svh, 760px); display: flex; align-items: center; padding: calc(var(--nav-h) + 2.4rem) 0 clamp(2.4rem, 6vw, 4rem); } .auth-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); gap: clamp(1.8rem, 6vw, 5rem); align-items: center; width: 100%; } .auth-kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .auth-kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .7; } .auth .auth-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 7.5vw, 6rem); line-height: .94; color: #fff; margin: .9rem 0 1.1rem; } .auth-lede { max-width: 42ch; color: var(--band-muted); font-size: 1.02rem; line-height: 1.6; margin: 0; } .auth-points { list-style: none; margin: 1.8rem 0 0; padding: 0; display: grid; gap: .55rem; } .auth-points li { display: flex; gap: .65rem; align-items: baseline; font-size: .93rem; color: rgba(255,255,255,.78); } .auth-points li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } .auth-card { background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: var(--r-2xl); padding: clamp(1.5rem, 3.4vw, 2.4rem); box-shadow: 0 50px 100px -50px rgba(0,0,0,.85); } .auth-card .field:last-of-type { margin-bottom: 1.4rem; } .auth-link { color: var(--emerald-deep); font-weight: 600; } :root[data-theme="dark"] .auth-link { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .auth-link { color: var(--emerald); } } .auth-alt { margin: 1.2rem 0 0; text-align: center; font-size: .88rem; color: var(--muted); } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } @media (max-width: 900px) { .auth { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .auth-grid { grid-template-columns: 1fr; gap: 2rem; } .auth-points { display: none; } } </style> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="-dfIRmMUKdxxdZ_IMFxwHg"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> </body> </html>Parameter emailEvidence passwordSolution This is an informational alert rather than a vulnerability and so there is nothing to fix.
-
Content Security Policy (CSP) Report-Only Header Found (1)
GET https://sites.wons.bt
Alert tags Alert description The response contained a Content-Security-Policy-Report-Only header, this may indicate a work-in-progress implementation, or an oversight in promoting pre-Prod to Prod, etc.
Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross Site Scripting (XSS) and data injection attacks. These attacks are used for everything from data theft to site defacement or distribution of malware. CSP provides a set of standard HTTP headers that allow website owners to declare approved sources of content that browsers should be allowed to load on that page — covered types are JavaScript, CSS, HTML frames, fonts, images and embeddable objects such as Java applets, ActiveX, audio and video files.
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Solution Ensure that your web server, application server, load balancer, etc. is configured to set the Content-Security-Policy header.
-
-
-
Risk=Informational, Confidence=Medium (5)
-
https://sites.wons.bt (5)
-
Information Disclosure - Sensitive Information in URL (1)
GET https://sites.wons.bt/signup?email=zaproxy%40example.com
Alert tags Alert description The request appeared to contain sensitive information leaked in the URL. This can violate PCI and most organizational compliance policies. You can configure the list of strings for this check to add or remove values specific to your environment.
Other info The URL contains email address(es).
Request Request line and header section (367 bytes)
GET https://sites.wons.bt/signup?email=zaproxy%40example.com HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache referer: https://sites.wons.bt Cookie: wons_csrf=1Y4cjMPvEjgL5Xwfltaq.fc44d6636ac21d80d0dbec2084f3cab7Request body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:43:01 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-GQq--xxvo0PYRMzufvLMsg' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=U7ygdlDsPzGNhVUsgcCr.b490804661bdf6603f4969db6e01cc20; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 41335Response body (41335 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Create your site workspace — WONS Sites</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=15157ee1095e4f8c742bc1da69f09539af2e5d4352b7e6b482ba536ba1eca3c9"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="GQq--xxvo0PYRMzufvLMsg"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=7dc31ec4adb92d96d6c8b18d088022bd6bcbe729e1f8df03b1464f0e898df278" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819381&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=d1130a192b644701a7c6e6df17d509a8cf23ec32719638866f0909b1e51063b8" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="auth bleed"> <div class="auth-grid band-inner"> <div class="auth-copy"> <span class="auth-kicker">Step 2 of 4</span> <h1 class="auth-title">Create your<br>workspace</h1> <p class="auth-lede"> Your content lives here. Your site keeps living wherever it is hosted today, reading everything from one address. </p> <div class="progress progress-band" role="progressbar" aria-valuenow="12" aria-valuemin="0" aria-valuemax="100"> <i style="width:12%"></i> </div> <ol class="steps"> <li class=""><b>1</b>Choose a plan</li> <li class=""><b>2</b>Create your workspace</li> <li class=""><b>3</b>Add your content</li> <li class=""><b>4</b>Point your domain</li> </ol> <div class="auth-cols"> <div> <span class="auth-h">What you get today</span> <ul class="auth-points"> <li>A dashboard for every word and image on your site</li> <li>One API your existing host reads — no migration</li> <li>Themes you can switch without a rebuild</li> <li>Images stripped of location data, served through expiring links</li> </ul> </div> <div> <span class="auth-h">Right after this</span> <div class="auth-next"><b>01</b><span>Name your site and claim the domain it will serve</span></div> <div class="auth-next"><b>02</b><span>Fill in the pages you already have — we start you with a template</span></div> <div class="auth-next"><b>03</b><span>Download one file for your host, and you are live</span></div> </div> </div> </div> <div class="auth-card"> <form method="post"> <input type="hidden" name="_csrf" value="U7ygdlDsPzGNhVUsgcCr.b490804661bdf6603f4969db6e01cc20"> <input type="hidden" name="plan" value=""> <label class="field"> <span class="lbl">Organisation<span class="hint">Shown as your site name</span></span> <input type="text" name="organisation" value="" placeholder="Dragon View Hotel" required autofocus> </label> <label class="field"> <span class="lbl">Work email</span> <input type="email" name="email" value="" placeholder="you@yourdomain.bt" required> </label> <label class="field"> <span class="lbl">Password<span class="hint">At least 10 characters</span></span> <input type="password" name="password" required minlength="10" autocomplete="new-password"> </label> <button class="btn btn-accent btn-block btn-lg" type="submit">Create my workspace</button> <p class="auth-fine">Free while you set it up. No card, no charge until you go live.</p> </form> <p class="auth-alt"> Already have a workspace? <a class="auth-link" href="/login">Sign in</a> </p> </div> </div> </section> <style> .auth { background: var(--band); color: var(--band-fg); min-height: min(100svh, 940px); display: flex; align-items: center; padding: calc(var(--nav-h) + 2.4rem) 0 clamp(2.4rem, 6vw, 4rem); } .auth-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); gap: clamp(1.8rem, 5vw, 4rem); align-items: center; width: 100%; } .auth-kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .auth-kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .7; } .auth .auth-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.4rem, 5.6vw, 4.4rem); line-height: .96; color: #fff; margin: .9rem 0 1rem; } .auth-lede { max-width: 44ch; color: var(--band-muted); font-size: 1rem; line-height: 1.6; margin: 0 0 1.6rem; } .progress-band { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.16); } .steps { list-style: none; margin: .8rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem 1rem; font-size: .8rem; color: rgba(255,255,255,.5); } .steps li { display: flex; align-items: center; gap: .4rem; } .steps li b { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.18); font-size: .68rem; font-weight: 700; color: rgba(255,255,255,.6); } .steps li.done { color: var(--emerald); } .steps li.done b { background: var(--emerald); border-color: var(--emerald); color: #06120d; } .auth-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 1.6rem; margin-top: 2rem; padding-top: 1.6rem; border-top: 1px solid rgba(255,255,255,.14); } .auth-h { display: block; margin-bottom: .7rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: #6f7a75; } .auth-points { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; } .auth-points li { display: flex; gap: .6rem; align-items: baseline; font-size: .88rem; line-height: 1.45; color: rgba(255,255,255,.76); } .auth-points li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } .auth-next { display: flex; gap: .7rem; align-items: flex-start; font-size: .88rem; line-height: 1.45; color: rgba(255,255,255,.76); margin-bottom: .5rem; } .auth-next b { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; color: var(--emerald); padding-top: .22rem; } .auth-card { background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: var(--r-2xl); padding: clamp(1.5rem, 3.4vw, 2.4rem); box-shadow: 0 50px 100px -50px rgba(0,0,0,.85); } .auth-card .field:last-of-type { margin-bottom: 1.4rem; } .auth-fine { margin: .9rem 0 0; text-align: center; font-size: .8rem; color: var(--faint); } .auth-alt { margin: 1.2rem 0 0; text-align: center; font-size: .88rem; color: var(--muted); } .auth-link { color: var(--emerald-deep); font-weight: 600; } :root[data-theme="dark"] .auth-link { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .auth-link { color: var(--emerald); } } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } @media (max-width: 980px) { .auth { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .auth-grid { grid-template-columns: 1fr; gap: 2rem; } .auth-copy { order: 2; } .auth-card { order: 1; } } @media (max-width: 620px) { .auth-cols { grid-template-columns: 1fr; } } </style> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="GQq--xxvo0PYRMzufvLMsg"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="GQq--xxvo0PYRMzufvLMsg">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Parameter emailEvidence zaproxy@example.comSolution Do not pass sensitive information in URIs.
-
Information Disclosure - Suspicious Comments (1)
GET https://sites.wons.bt/theme-preview/vantage
Alert tags Alert description The response appears to contain suspicious comments which may help an attacker.
Other info The following pattern was used: \bFROM\b and was detected 2 times, the first in likely comment: "/*
Vantage — renderer.
Dark-first tech: glassy sticky header, radial hero glow, glow-ring hover
state on cards and media. ", see evidence field for the suspicious comment/snippet.
Request Request line and header section (355 bytes)
GET https://sites.wons.bt/theme-preview/vantage HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache referer: https://sites.wons.bt/ Cookie: wons_csrf=Emdv3uHo88D7XA2AtzQz.8d4ecc91c708b367dc6749814a1ba91dRequest body (0 bytes)
Response Status line and header section (680 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:43:04 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-bqTNI6bgGpKtuvaVH7p_sw' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 108293Response body (108293 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=1280"> <title>Vantage — preview</title> <meta name="robots" content="noindex,nofollow"> <style> @import url("/fonts/fonts.css"); /* Vantage — dark-first tech and professional services. Near-black surfaces, teal/cyan accent, soft colour-glow shadows instead of plain drop shadows, crisp 8-12px corners. Dark values below are FALLBACKS — applyBranding() overwrites them from the customer's palette (including a full light mode) at runtime. Signature: a persistent right-edge quick-link rail alongside the top nav, hero eyebrows that type themselves out with a blinking cursor, a scan-line light sweep across cards on hover, and stat values that tick up in monospace the first time they scroll into view. The hero itself sits inside a console/terminal window frame (.vg-console) so the theme reads as unmistakably "dev tool" from the very first pixel, before any scroll or hover — the rail is now a grouped, bordered panel for the same reason. */ :root { --vg-bg: #0b0d10; --vg-surface: #12161b; --vg-surface-2: #171c22; --vg-card: #141920; --vg-ink: #e7edf3; --vg-muted: #9aa7b4; --vg-subtle: #66717d; --vg-line: #232a32; --vg-line-strong: #313a44; --vg-primary: #2dd4bf; --vg-primary-h: #23b8a5; --vg-on-primary: #04211d; --vg-secondary: #161d3a; --vg-accent: #22d3ee; --vg-focus: #38bdf8; --vg-overlay: rgba(4, 7, 10, .82); --vg-link: #67e8f9; --vg-success: #34d399; --vg-warning: #fbbf24; --vg-danger: #f87171; --vg-heading: "Space Grotesk", "Segoe UI", sans-serif; --vg-body: "Manrope", "Segoe UI", sans-serif; --vg-radius-sm: 8px; --vg-radius: 12px; --vg-radius-lg: 18px; --vg-shadow: 0 1px 0 rgba(0, 0, 0, .4), 0 20px 46px rgba(0, 0, 0, .5); --vg-shadow-lg: 0 30px 80px rgba(0, 0, 0, .6); --vg-glow: 0 0 0 1px color-mix(in srgb, var(--vg-primary) 30%, transparent), 0 0 32px color-mix(in srgb, var(--vg-primary) 20%, transparent); --vg-maxw: 1220px; --vg-measure: 68ch; --vg-bleed: clamp(1.1rem, 5vw, 4rem); --vg-section: clamp(4rem, 2vw, 8rem); --vg-header-h: 76px; } * { box-sizing: border-box; } html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } body { margin: 0; min-width: 320px; background: radial-gradient(circle at 12% -6%, color-mix(in srgb, var(--vg-primary) 12%, transparent), transparent 34rem), radial-gradient(circle at 92% 0%, color-mix(in srgb, var(--vg-accent) 8%, transparent), transparent 30rem), var(--vg-bg); color: var(--vg-ink); font-family: var(--vg-body); font-size: 16.5px; line-height: 1.68; letter-spacing: -.003em; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } body.vg-nav-open { overflow: hidden; } button, input, select, textarea { font: inherit; } button { color: inherit; background: none; } img { display: block; max-width: 100%; height: auto; } a { color: inherit; text-decoration: none; } p { margin: 0 0 1.1rem; } h1, h2, h3, h4 { margin: 0; font-family: var(--vg-heading); line-height: 1.08; letter-spacing: -.02em; font-weight: 600; text-wrap: balance; } h1 { font-size: clamp(2.6rem, 3.4vw, 5.6rem); font-weight: 620; letter-spacing: -.03em; } h2 { font-size: clamp(1.9rem, 2.6vw, 3.5rem); font-weight: 610; letter-spacing: -.025em; } h3 { font-size: clamp(1.1rem, 1vw, 1.35rem); font-weight: 600; } h4 { font-size: .95rem; font-weight: 650; letter-spacing: -.01em; } ::selection { background: color-mix(in srgb, var(--vg-primary) 40%, transparent); color: var(--vg-ink); } :focus-visible { outline: 2px solid var(--vg-focus); outline-offset: 3px; border-radius: 4px; } .vg-wrap { width: 100%; max-width: var(--vg-maxw); margin: 0 auto; padding-inline: var(--vg-bleed); } .vg-skip { position: fixed; z-index: 999; left: 1rem; top: 1rem; transform: translateY(-180%); padding: .75rem 1rem; border-radius: var(--vg-radius-sm); background: var(--vg-primary); color: var(--vg-on-primary); font-weight: 700; transition: transform .2s; } .vg-skip:focus { transform: translateY(0); } .vg-eyebrow { display: inline-flex; align-items: center; gap: .6rem; color: var(--vg-accent); font-family: var(--vg-heading); font-size: .74rem; font-weight: 640; letter-spacing: .16em; text-transform: uppercase; } .vg-eyebrow::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: currentColor; box-shadow: 0 0 10px currentColor; } .vg-lede { max-width: 56ch; color: var(--vg-muted); font-size: clamp(1.04rem, 1.4vw, 1.24rem); line-height: 1.6; } /* typing eyebrow */ .vg-type-cursor { display: inline-block; width: 2px; height: .9em; margin-left: 3px; background: currentColor; vertical-align: -.12em; animation: vg-blink 1s step-end infinite; } @keyframes vg-blink { 50% { opacity: 0; } } /* announcement */ .vg-announce { position: relative; z-index: 60; display: flex; justify-content: center; align-items: center; gap: .85rem; flex-wrap: wrap; padding: .68rem var(--vg-bleed); background: var(--vg-secondary); color: var(--vg-ink); border-bottom: 1px solid var(--vg-line); font-size: .84rem; } .vg-announce a { color: var(--vg-accent); font-weight: 700; } .vg-announce a:hover { text-decoration: underline; text-underline-offset: 4px; } /* header */ .vg-header { position: sticky; top: 0; z-index: 50; border-bottom: 1px solid var(--vg-line); background: color-mix(in srgb, var(--vg-bg) 78%, transparent); backdrop-filter: blur(16px) saturate(1.3); -webkit-backdrop-filter: blur(16px) saturate(1.3); } .vg-header-row { min-height: var(--vg-header-h); display: flex; align-items: center; gap: 1.4rem; } .vg-brand { display: inline-flex; align-items: center; min-width: 160px; } .vg-brand img { width: auto; height: 34px; max-width: 220px; } .vg-brand .vg-wordmark { font-family: var(--vg-heading); font-weight: 660; font-size: 1.2rem; letter-spacing: -.02em; } .vg-brand .vg-wordmark::before { content: ""; display: inline-block; width: 9px; height: 9px; margin-right: .55rem; border-radius: 2px; background: var(--vg-primary); box-shadow: 0 0 12px color-mix(in srgb, var(--vg-primary) 70%, transparent); } .vg-nav { display: flex; align-items: center; gap: .1rem; margin-left: auto; } .vg-nav-item { position: relative; } .vg-nav-link { display: inline-flex; align-items: center; gap: .35rem; min-height: 42px; padding: .55rem .75rem; border-radius: var(--vg-radius-sm); color: var(--vg-muted); font-size: .89rem; font-weight: 560; transition: color .16s, background .16s; } .vg-nav-link:hover, .vg-nav-link.is-active { color: var(--vg-ink); background: var(--vg-surface); } .vg-nav-link.is-active { box-shadow: inset 0 -2px 0 var(--vg-primary); } .vg-nav-caret { font-size: .65rem; opacity: .7; transition: transform .18s; } .vg-nav-item:hover .vg-nav-caret, .vg-nav-item:focus-within .vg-nav-caret { transform: rotate(180deg); } .vg-nav-sub { position: absolute; left: 0; top: calc(100% + .5rem); min-width: 220px; padding: .5rem; border: 1px solid var(--vg-line); border-radius: var(--vg-radius); background: var(--vg-card); box-shadow: var(--vg-shadow-lg); opacity: 0; visibility: hidden; transform: translateY(-6px); transition: .16s ease; } .vg-nav-item:hover .vg-nav-sub, .vg-nav-item:focus-within .vg-nav-sub { opacity: 1; visibility: visible; transform: translateY(0); } .vg-nav-sub a { display: block; padding: .65rem .7rem; border-radius: 8px; color: var(--vg-muted); font-size: .88rem; font-weight: 560; } .vg-nav-sub a:hover, .vg-nav-sub a.is-active { color: var(--vg-ink); background: var(--vg-surface-2); } .vg-nav-cta { margin-left: .5rem; background: var(--vg-primary); color: var(--vg-on-primary) !important; font-weight: 680; box-shadow: var(--vg-glow); } .vg-nav-cta:hover { background: var(--vg-primary-h) !important; color: var(--vg-on-primary) !important; } .vg-header-actions { display: flex; align-items: center; gap: .4rem; } .vg-mode, .vg-burger { width: 40px; height: 40px; display: inline-grid; place-items: center; border: 1px solid var(--vg-line); border-radius: var(--vg-radius-sm); cursor: pointer; color: var(--vg-ink); transition: border-color .16s, background .16s; } .vg-mode:hover, .vg-burger:hover { border-color: var(--vg-line-strong); background: var(--vg-surface); } .vg-burger { display: none; position: relative; } .vg-burger span { position: absolute; width: 16px; height: 1.5px; border-radius: 2px; background: currentColor; transition: .2s; } .vg-burger span:nth-child(1) { transform: translateY(-5px); } .vg-burger span:nth-child(3) { transform: translateY(5px); } .vg-header.is-open .vg-burger span:nth-child(1) { transform: rotate(45deg); } .vg-header.is-open .vg-burger span:nth-child(2) { opacity: 0; } .vg-header.is-open .vg-burger span:nth-child(3) { transform: rotate(-45deg); } /* quick-link rail — secondary jump surface, additive to the top nav. Wrapped in its own bordered/tinted panel (not just floating icons) so it reads as a distinct piece of chrome even in a small, non-interactive screenshot. */ .vg-rail { position: fixed; z-index: 55; right: 1.1rem; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: .5rem; padding: .55rem; border-radius: 999px; border: 1px solid var(--vg-line-strong); background: color-mix(in srgb, var(--vg-card) 84%, transparent); backdrop-filter: blur(14px) saturate(1.2); -webkit-backdrop-filter: blur(14px) saturate(1.2); box-shadow: var(--vg-shadow); } .vg-rail-item { position: relative; width: 38px; height: 38px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--vg-line); border-radius: 50%; background: color-mix(in srgb, var(--vg-surface) 88%, transparent); color: var(--vg-muted); cursor: pointer; transition: color .16s, border-color .16s, background .16s, transform .16s; } .vg-rail-item:hover, .vg-rail-item:focus-visible, .vg-rail-item.is-active { color: var(--vg-on-primary); background: var(--vg-primary); border-color: var(--vg-primary); box-shadow: var(--vg-glow); transform: translateX(-2px); } .vg-rail-dot { font-family: var(--vg-heading); font-size: .72rem; font-weight: 700; line-height: 1; } .vg-rail-up { width: 12px; height: 12px; } .vg-rail-tip { position: absolute; right: calc(100% + .6rem); top: 50%; transform: translateY(-50%) translateX(4px); padding: .4rem .65rem; border-radius: var(--vg-radius-sm); white-space: nowrap; background: var(--vg-card); border: 1px solid var(--vg-line); color: var(--vg-ink); font-size: .78rem; font-weight: 560; box-shadow: var(--vg-shadow); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .15s ease, transform .15s ease; } .vg-rail-item:hover .vg-rail-tip, .vg-rail-item:focus-visible .vg-rail-tip { opacity: 1; visibility: visible; transform: translateY(-50%) translateX(0); } /* hero */ .vg-hero { position: relative; overflow: clip; padding: clamp(2.4rem, 2vw, 5.5rem) 0 clamp(3rem, 2vw, 5.5rem); } .vg-hero::before { content: ""; position: absolute; left: 50%; top: -20%; width: 60vw; max-width: 900px; aspect-ratio: 1; background: radial-gradient(circle, color-mix(in srgb, var(--vg-primary) 16%, transparent), transparent 70%); transform: translateX(-50%); pointer-events: none; } /* console/terminal window frame around the hero — the theme's at-rest signature, visible before any scroll, hover or animation completes. */ .vg-console { position: relative; z-index: 1; border: 1px solid var(--vg-line-strong); border-radius: var(--vg-radius-lg); background: color-mix(in srgb, var(--vg-card) 92%, transparent); box-shadow: var(--vg-shadow-lg); overflow: hidden; } .vg-console-bar { display: flex; align-items: center; gap: .4rem; padding: .65rem .95rem; border-bottom: 1px solid var(--vg-line); background: var(--vg-surface); } .vg-console-dot { width: 9px; height: 9px; border-radius: 50%; flex: none; } .vg-console-dot-a { background: var(--vg-danger); } .vg-console-dot-b { background: var(--vg-warning); } .vg-console-dot-c { background: var(--vg-success); } .vg-console-label { margin-left: .5rem; color: var(--vg-subtle); font-family: ui-monospace, "SF Mono", "Space Grotesk", Menlo, Consolas, monospace; font-size: .76rem; letter-spacing: .01em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .vg-console-body { padding: clamp(1.9rem, 5vw, 3.6rem); } .vg-hero-grid { position: relative; display: grid; grid-template-columns: minmax(0, .96fr) minmax(340px, 1.04fr); gap: clamp(2.5rem, 6vw, 5.5rem); align-items: center; } .vg-hero-grid.vg-single { grid-template-columns: 1fr; max-width: 820px; } .vg-hero h1 { max-width: 12ch; margin: 1.2rem 0 1.3rem; } .vg-hero .vg-lede { color: var(--vg-ink); opacity: .82; } .vg-hero-desc { max-width: 52ch; margin-top: 1rem; color: var(--vg-muted); font-size: 1rem; } .vg-actions { display: flex; flex-wrap: wrap; gap: .65rem; margin-top: 1.9rem; } .vg-hero-media { position: relative; } .vg-hero-media img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--vg-radius-lg); border: 1px solid var(--vg-line); box-shadow: var(--vg-shadow-lg); } .vg-hero-media::after { content: ""; position: absolute; inset: -1px; border-radius: var(--vg-radius-lg); box-shadow: var(--vg-glow); pointer-events: none; } .vg-btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; min-height: 46px; padding: .78rem 1.25rem; border: 1px solid transparent; border-radius: var(--vg-radius-sm); cursor: pointer; font-family: var(--vg-heading); font-size: .9rem; font-weight: 600; letter-spacing: -.005em; transition: transform .15s, background .16s, border-color .16s, box-shadow .16s; } .vg-btn:hover { transform: translateY(-1px); } .vg-btn:active { transform: translateY(0); } .vg-btn-primary { background: var(--vg-primary); color: var(--vg-on-primary); box-shadow: var(--vg-glow); } .vg-btn-primary:hover { background: var(--vg-primary-h); } .vg-btn-secondary { border-color: var(--vg-line-strong); background: var(--vg-surface); color: var(--vg-ink); } .vg-btn-secondary:hover { border-color: var(--vg-primary); color: var(--vg-primary); } .vg-btn-text { min-height: auto; padding: .3rem 0; border-radius: 0; color: var(--vg-accent); } .vg-btn-text:hover { transform: none; color: var(--vg-link); } .vg-icon { flex: none; transition: transform .16s; } .vg-btn:hover .vg-icon, .vg-more:hover .vg-icon { transform: translateX(3px); } /* sections */ .vg-section { padding: var(--vg-section) 0; } .vg-section.alt { background: var(--vg-surface); border-block: 1px solid var(--vg-line); } .vg-section-head { max-width: 740px; margin-bottom: clamp(2rem, 5vw, 3.6rem); } .vg-section-head .vg-eyebrow { margin-bottom: .9rem; } .vg-section-head h2 { margin-bottom: .9rem; } .vg-section-actions { margin-top: clamp(1.8rem, 4vw, 2.8rem); } /* stats */ .vg-stats-section { padding: 0 0 var(--vg-section); } .vg-stats { display: grid; grid-template-columns: repeat(var(--vg-cols, 4), minmax(0, 1fr)); border: 1px solid var(--vg-line); border-radius: var(--vg-radius-lg); overflow: hidden; background: var(--vg-card); } .vg-stat { padding: clamp(1.4rem, 3vw, 2.1rem); border-right: 1px solid var(--vg-line); } .vg-stat:last-child { border-right: 0; } .vg-stat-value { font-family: var(--vg-heading); font-size: clamp(2rem, 3.6vw, 3.4rem); font-weight: 640; line-height: 1; letter-spacing: -.03em; color: var(--vg-primary); text-shadow: 0 0 24px color-mix(in srgb, var(--vg-primary) 35%, transparent); } .vg-stat-num { font-family: ui-monospace, "SF Mono", "Space Grotesk", Menlo, Consolas, monospace; font-variant-numeric: tabular-nums; } .vg-stat-label { margin-top: .6rem; color: var(--vg-muted); font-size: .84rem; font-weight: 560; } /* split */ .vg-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, .92fr); gap: clamp(2.5rem, 7vw, 6.5rem); align-items: center; } .vg-split.reverse .vg-split-copy { order: 2; } .vg-split-copy .vg-rich { color: var(--vg-muted); } .vg-split-media img { width: 100%; aspect-ratio: 5 / 4; object-fit: cover; border-radius: var(--vg-radius-lg); border: 1px solid var(--vg-line); box-shadow: var(--vg-shadow); } /* cards */ .vg-grid { display: grid; grid-template-columns: repeat(var(--vg-cols, 3), minmax(0, 1fr)); gap: clamp(1rem, 2.2vw, 1.4rem); } .vg-card { position: relative; display: flex; flex-direction: column; min-height: 100%; overflow: hidden; border: 1px solid var(--vg-line); border-radius: var(--vg-radius); background: var(--vg-card); transition: transform .2s, border-color .2s, box-shadow .2s; } .vg-card:hover { transform: translateY(-4px); border-color: color-mix(in srgb, var(--vg-primary) 45%, var(--vg-line)); box-shadow: var(--vg-glow); } .vg-card-media { display: block; overflow: hidden; background: var(--vg-surface-2); } .vg-card-media img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; transition: transform .4s ease; } .vg-card:hover .vg-card-media img { transform: scale(1.03); } .vg-card-body { position: relative; z-index: 3; display: flex; flex-direction: column; flex: 1; padding: 1.35rem 1.35rem 1.4rem; } /* scan-line sweep — sci-fi console hover, stays behind card copy (z-index 3) */ .vg-card::after, .vg-gallery figure::after, .vg-quote-card::after { content: ""; position: absolute; left: 0; right: 0; top: -30%; height: 30%; z-index: 2; background: linear-gradient(180deg, transparent, color-mix(in srgb, var(--vg-primary) 55%, transparent), transparent); opacity: 0; transform: translateY(-20%); pointer-events: none; transition: opacity .25s ease, transform .7s ease; } .vg-card:hover::after, .vg-card:focus-within::after, .vg-gallery figure:hover::after, .vg-gallery figure:focus-within::after, .vg-quote-card:hover::after, .vg-quote-card:focus-within::after { opacity: .85; transform: translateY(430%); } .vg-card h3 { margin-bottom: .5rem; } .vg-card p { margin: 0; color: var(--vg-muted); font-size: .93rem; line-height: 1.6; } .vg-card-meta { display: flex; flex-wrap: wrap; gap: .4rem .7rem; margin-bottom: .8rem; color: var(--vg-subtle); font-size: .7rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; } .vg-card-price { margin-top: .85rem; font-family: var(--vg-heading); font-size: 1.02rem; font-weight: 640; color: var(--vg-primary); } .vg-more { display: inline-flex; align-items: center; gap: .35rem; margin-top: auto; padding-top: 1.1rem; color: var(--vg-accent); font-size: .87rem; font-weight: 650; } .vg-card-icon { width: 40px; height: 40px; display: grid; place-items: center; margin-bottom: 1.15rem; border-radius: var(--vg-radius-sm); background: var(--vg-surface-2); color: var(--vg-primary); } .vg-card.no-media .vg-card-body { padding: 1.6rem; } /* gallery */ .vg-gallery { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: clamp(.8rem, 2vw, 1.3rem); } .vg-gallery figure { grid-column: span 4; margin: 0; overflow: hidden; border: 1px solid var(--vg-line); border-radius: var(--vg-radius); background: var(--vg-card); transition: transform .2s, box-shadow .2s; } .vg-gallery figure:nth-child(1), .vg-gallery figure:nth-child(5) { grid-column: span 7; } .vg-gallery figure:nth-child(2), .vg-gallery figure:nth-child(6) { grid-column: span 5; } .vg-gallery figure:hover { transform: translateY(-3px); box-shadow: var(--vg-glow); } .vg-gallery-button { display: block; width: 100%; padding: 0; border: 0; background: transparent; text-align: left; cursor: zoom-in; } .vg-gallery img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; transition: transform .4s; } .vg-gallery figure:nth-child(1) img, .vg-gallery figure:nth-child(5) img { aspect-ratio: 16 / 10; } .vg-gallery figure:hover img { transform: scale(1.02); } .vg-gallery figcaption { position: relative; z-index: 3; padding: 1.1rem 1.2rem 1.25rem; } .vg-fig-title { font-family: var(--vg-heading); font-weight: 620; } .vg-fig-sub { margin-top: .2rem; color: var(--vg-muted); font-size: .9rem; } .vg-meta { margin-top: .5rem; color: var(--vg-subtle); font-size: .68rem; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; } /* people */ .vg-people { display: grid; grid-template-columns: repeat(var(--vg-cols, 4), minmax(0, 1fr)); gap: clamp(1rem, 2vw, 1.4rem); } .vg-person-image { overflow: hidden; border-radius: var(--vg-radius); border: 1px solid var(--vg-line); background: var(--vg-surface-2); } .vg-person img { width: 100%; aspect-ratio: 1; object-fit: cover; transition: transform .3s; } .vg-person:hover img { transform: scale(1.03); } .vg-person h3 { margin-top: .95rem; margin-bottom: .2rem; } .vg-person .vg-role { color: var(--vg-muted); font-size: .89rem; } /* rich content */ .vg-rich { max-width: var(--vg-measure); font-size: 1.03rem; } .vg-rich > :first-child { margin-top: 0; } .vg-rich h2, .vg-rich h3, .vg-rich h4 { margin-top: 2.1rem; margin-bottom: .7rem; } .vg-rich p, .vg-rich li { color: color-mix(in srgb, var(--vg-ink) 82%, var(--vg-muted)); } .vg-rich ul, .vg-rich ol { margin: 0 0 1.35rem; padding-left: 1.2rem; } .vg-rich li { margin: .4rem 0; } .vg-rich blockquote { margin: 2rem 0; padding: .2rem 0 .2rem 1.35rem; border-left: 2px solid var(--vg-primary); font-family: var(--vg-heading); font-size: clamp(1.2rem, 2vw, 1.55rem); line-height: 1.42; } .vg-rich img { width: 100%; margin: 1.9rem 0; border-radius: var(--vg-radius); border: 1px solid var(--vg-line); } .vg-rich a { color: var(--vg-link); text-decoration: underline; text-underline-offset: 3px; } .vg-rich hr { border: 0; border-top: 1px solid var(--vg-line); margin: 2.2rem 0; } /* testimonials */ .vg-testimonials { display: grid; grid-template-columns: repeat(var(--vg-cols, 2), minmax(0, 1fr)); gap: 1.15rem; } .vg-quote-card { position: relative; overflow: hidden; padding: clamp(1.5rem, 3.5vw, 2.3rem); border: 1px solid var(--vg-line); border-radius: var(--vg-radius-lg); background: var(--vg-card); } .vg-quote-card > * { position: relative; z-index: 3; } .vg-quote-mark { color: var(--vg-primary); font-family: var(--vg-heading); font-size: 3rem; line-height: .6; } .vg-quote-card blockquote { margin: 1rem 0 1.5rem; font-family: var(--vg-heading); font-size: clamp(1.15rem, 1.8vw, 1.4rem); line-height: 1.4; } .vg-quote-name { font-weight: 640; } .vg-quote-detail { color: var(--vg-muted); font-size: .87rem; } /* CTA */ .vg-cta-band { position: relative; overflow: hidden; display: flex; align-items: center; justify-content: space-between; gap: 2rem; flex-wrap: wrap; padding: clamp(2.2rem, 6vw, 4.2rem); border-radius: var(--vg-radius-lg); background: var(--vg-secondary); border: 1px solid var(--vg-line-strong); color: var(--vg-ink); } .vg-cta-band::before { content: ""; position: absolute; right: -80px; top: -140px; width: 320px; height: 320px; background: radial-gradient(circle, color-mix(in srgb, var(--vg-accent) 30%, transparent), transparent 70%); } .vg-cta-band > * { position: relative; z-index: 1; } .vg-cta-band-copy { max-width: 700px; } .vg-cta-band .vg-eyebrow { margin-bottom: .9rem; } .vg-cta-band h2 { max-width: 16ch; margin-bottom: .7rem; } .vg-cta-band p { max-width: 52ch; margin: 0; color: var(--vg-muted); } /* page header and collection header */ .vg-page-head { padding: clamp(3.4rem, 8vw, 6.6rem) 0 clamp(2.8rem, 7vw, 5.4rem); } .vg-page-head-grid { display: grid; grid-template-columns: minmax(0, .8fr) minmax(360px, 1.2fr); gap: clamp(2.5rem, 6vw, 5rem); align-items: end; } .vg-page-head h1 { margin: 1.1rem 0 1.1rem; max-width: 14ch; } .vg-page-banner img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border-radius: var(--vg-radius-lg); border: 1px solid var(--vg-line); } .vg-breadcrumbs { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: 1rem; color: var(--vg-subtle); font-size: .81rem; } .vg-breadcrumbs a:hover { color: var(--vg-accent); } /* detail */ .vg-detail-hero { padding: clamp(2.6rem, 2vw, 5.4rem) 0 clamp(3rem, 2vw, 6rem); } .vg-detail-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(360px, 1.1fr); gap: clamp(2.5rem, 6vw, 5.5rem); align-items: center; } .vg-detail-hero h1 { margin: .85rem 0 1rem; max-width: 13ch; } .vg-detail-hero img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--vg-radius-lg); border: 1px solid var(--vg-line); box-shadow: var(--vg-shadow); } .vg-detail-meta { display: flex; flex-wrap: wrap; gap: .55rem; margin-top: 1.1rem; } .vg-detail-meta span { padding: .4rem .65rem; border: 1px solid var(--vg-line); border-radius: var(--vg-radius-sm); color: var(--vg-muted); font-size: .77rem; font-weight: 620; } .vg-detail-body { display: grid; grid-template-columns: minmax(0, 1fr) minmax(240px, .38fr); gap: clamp(2.5rem, 7vw, 5.5rem); } .vg-detail-aside { align-self: start; position: sticky; top: calc(var(--vg-header-h) + 1.4rem); padding: 1.35rem; border: 1px solid var(--vg-line); border-radius: var(--vg-radius); background: var(--vg-card); } .vg-detail-aside h3 { margin-bottom: .85rem; } .vg-specs { margin: 0; } .vg-specs div { padding: .68rem 0; border-bottom: 1px solid var(--vg-line); } .vg-specs div:last-child { border-bottom: 0; } .vg-specs dt { color: var(--vg-subtle); font-size: .7rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; } .vg-specs dd { margin: .18rem 0 0; color: var(--vg-ink); } .vg-detail-gallery { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: .95rem; margin-top: 2.3rem; } .vg-detail-gallery img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--vg-radius); border: 1px solid var(--vg-line); } /* contact */ .vg-contact-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.1rem; } .vg-contact-card { padding: 1.5rem; border: 1px solid var(--vg-line); border-radius: var(--vg-radius); background: var(--vg-card); } .vg-contact-card h3 { margin-bottom: .95rem; } .vg-contact-card dl { margin: 0; } .vg-contact-card dt { margin-top: .85rem; color: var(--vg-subtle); font-size: .7rem; font-weight: 700; letter-spacing: .09em; text-transform: uppercase; } .vg-contact-card dt:first-child { margin-top: 0; } .vg-contact-card dd { margin: .2rem 0 0; color: var(--vg-muted); } .vg-contact-card a:hover { color: var(--vg-accent); } .vg-hours { width: 100%; border-collapse: collapse; } .vg-hours td { padding: .58rem 0; border-bottom: 1px solid var(--vg-line); color: var(--vg-muted); } .vg-hours td:last-child { text-align: right; } /* form */ .vg-form-shell { display: grid; grid-template-columns: minmax(0, .55fr) minmax(0, 1fr); gap: clamp(2rem, 6vw, 5.5rem); } .vg-form-copy .vg-section-head { position: sticky; top: calc(var(--vg-header-h) + 1.4rem); } .vg-form { padding: clamp(1.4rem, 3.5vw, 2.3rem); border: 1px solid var(--vg-line); border-radius: var(--vg-radius-lg); background: var(--vg-card); } .vg-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.1rem; } .vg-field { display: flex; flex-direction: column; gap: .42rem; } .vg-field.full { grid-column: 1 / -1; } .vg-field label { font-size: .83rem; font-weight: 640; } .vg-required { color: var(--vg-primary); } .vg-field input, .vg-field select, .vg-field textarea { width: 100%; border: 1px solid var(--vg-line-strong); border-radius: var(--vg-radius-sm); background: var(--vg-bg); color: var(--vg-ink); padding: .8rem .85rem; transition: border-color .16s, box-shadow .16s; } .vg-field textarea { min-height: 140px; resize: vertical; } .vg-field input::placeholder, .vg-field textarea::placeholder { color: var(--vg-subtle); } .vg-field input:focus, .vg-field select:focus, .vg-field textarea:focus { border-color: var(--vg-focus); box-shadow: 0 0 0 3px color-mix(in srgb, var(--vg-focus) 24%, transparent); outline: none; } .vg-form-footer { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; margin-top: 1.2rem; } .vg-form-note { margin: 0; color: var(--vg-subtle); font-size: .81rem; } .vg-form-status { margin-top: 1rem; padding: .8rem 1rem; border-radius: var(--vg-radius-sm); background: var(--vg-surface); color: var(--vg-muted); border: 1px solid var(--vg-line); } /* footer */ .vg-footer { padding: clamp(3.6rem, 8vw, 6.4rem) 0 1.9rem; border-top: 1px solid var(--vg-line); background: var(--vg-surface); } .vg-footer-grid { display: grid; grid-template-columns: minmax(260px, 1.5fr) repeat(var(--vg-fcols, 2), minmax(150px, 1fr)); gap: clamp(2rem, 5vw, 4.5rem); } .vg-footer-logo { width: auto; height: 32px; max-width: 220px; margin-bottom: .9rem; } .vg-footer p { max-width: 36ch; color: var(--vg-muted); font-size: .92rem; } .vg-footer h4 { margin-bottom: .9rem; color: var(--vg-accent); font-size: .7rem; letter-spacing: .13em; text-transform: uppercase; } .vg-footer a { display: block; padding: .24rem 0; color: var(--vg-muted); font-size: .9rem; } .vg-footer a:hover { color: var(--vg-ink); } .vg-footer-bottom { display: flex; justify-content: space-between; align-items: center; gap: 1rem; flex-wrap: wrap; margin-top: clamp(2.6rem, 6vw, 4.5rem); padding-top: 1.3rem; border-top: 1px solid var(--vg-line); color: var(--vg-subtle); font-size: .81rem; } .vg-social { display: flex; gap: .5rem; } .vg-social a { width: 38px; height: 38px; display: grid; place-items: center; padding: 0; border: 1px solid var(--vg-line); border-radius: var(--vg-radius-sm); } .vg-social a:hover { border-color: var(--vg-primary); color: var(--vg-primary); } /* states, lightbox, toast */ .vg-loading, .vg-state { min-height: 70vh; display: grid; place-items: center; padding: 3rem 1.5rem; text-align: center; } .vg-state-box { max-width: 600px; } .vg-state-box h1 { margin: 1rem 0; } .vg-state-box p { color: var(--vg-muted); } .vg-spinner { width: 30px; height: 30px; margin: 0 auto 1rem; border: 2px solid var(--vg-line); border-top-color: var(--vg-primary); border-radius: 50%; animation: vg-spin .75s linear infinite; } @keyframes vg-spin { to { transform: rotate(360deg); } } [hidden] { display: none !important; } .vg-toast { position: fixed; z-index: 120; right: 1rem; bottom: 1rem; max-width: 340px; padding: .85rem 1rem; border: 1px solid var(--vg-line); border-radius: var(--vg-radius-sm); background: var(--vg-card); box-shadow: var(--vg-shadow-lg); color: var(--vg-ink); } .vg-lightbox { position: fixed; z-index: 100; inset: 0; display: grid; place-items: center; padding: clamp(1rem, 4vw, 3rem); background: var(--vg-overlay); } .vg-lightbox-stage { max-width: min(1200px, 92vw); max-height: 88vh; } .vg-lightbox-stage img { max-height: 82vh; border-radius: var(--vg-radius); box-shadow: var(--vg-shadow-lg); } .vg-lightbox-stage p { margin: .65rem 0 0; color: var(--vg-ink); text-align: center; } .vg-lightbox-close { position: absolute; right: 1rem; top: 1rem; width: 46px; height: 46px; border: 1px solid var(--vg-line-strong); border-radius: var(--vg-radius-sm); background: var(--vg-card); color: var(--vg-ink); font-size: 1.7rem; cursor: pointer; } /* asset placeholder */ .vg-placeholder { display: flex; align-items: center; justify-content: center; background: var(--vg-surface-2); border: 1px dashed var(--vg-line-strong); border-radius: var(--vg-radius); color: var(--vg-subtle); min-height: 120px; } /* noscript */ .vg-noscript { background: var(--vg-bg); } /* reveal */ .vg-reveal { opacity: 0; transform: translateY(16px); transition: opacity .55s ease, transform .55s ease; } .vg-reveal.is-in { opacity: 1; transform: none; } @media (max-width: 1050px) { .vg-nav-link { padding-inline: .58rem; } .vg-hero-grid, .vg-page-head-grid, .vg-detail-grid { grid-template-columns: 1fr 1fr; } .vg-contact-grid { grid-template-columns: repeat(2, minmax(0,1fr)); } } @media (max-width: 900px) { :root { --vg-header-h: 68px; } .vg-brand { min-width: 0; } .vg-burger { display: inline-grid; } .vg-rail { display: none; } .vg-nav { position: fixed; inset: var(--vg-header-h) 0 auto 0; max-height: calc(100vh - var(--vg-header-h)); overflow: auto; display: none; flex-direction: column; align-items: stretch; gap: .2rem; margin: 0; padding: 1rem var(--vg-bleed) 1.4rem; border-bottom: 1px solid var(--vg-line); background: var(--vg-bg); box-shadow: var(--vg-shadow-lg); } .vg-header.is-open .vg-nav { display: flex; } .vg-nav-link { width: 100%; justify-content: space-between; border-radius: var(--vg-radius-sm); padding: .75rem .85rem; } .vg-nav-cta { margin: .5rem 0 0; justify-content: center; } .vg-nav-sub { position: static; display: block; min-width: 0; margin: .2rem 0 .4rem 1rem; padding: 0 0 0 .8rem; border: 0; border-left: 1px solid var(--vg-line); border-radius: 0; background: transparent; box-shadow: none; opacity: 1; visibility: visible; transform: none; } .vg-hero-grid, .vg-page-head-grid, .vg-detail-grid, .vg-split, .vg-form-shell { grid-template-columns: 1fr; } .vg-hero h1 { max-width: 13ch; } .vg-detail-body { grid-template-columns: 1fr; } .vg-detail-aside { position: static; } .vg-form-copy .vg-section-head { position: static; } .vg-footer-grid { grid-template-columns: 1.2fr 1fr 1fr; } } @media (max-width: 720px) { body { font-size: 15.5px; } .vg-hero { padding-top: 3rem; } .vg-stats { grid-template-columns: repeat(2, minmax(0,1fr)); } .vg-stat:nth-child(2) { border-right: 0; } .vg-stat:nth-child(-n+2) { border-bottom: 1px solid var(--vg-line); } .vg-grid, .vg-people { --vg-cols: 2 !important; } .vg-gallery figure, .vg-gallery figure:nth-child(n) { grid-column: span 6; } .vg-gallery img, .vg-gallery figure:nth-child(n) img { aspect-ratio: 4 / 3; } .vg-testimonials { --vg-cols: 1 !important; } .vg-contact-grid { grid-template-columns: 1fr; } .vg-form-grid { grid-template-columns: 1fr; } .vg-field.full { grid-column: auto; } .vg-footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .vg-grid, .vg-people { --vg-cols: 1 !important; } .vg-gallery { display: block; } .vg-gallery figure { margin-bottom: .9rem; } .vg-stats { grid-template-columns: 1fr; } .vg-stat { border-right: 0; border-bottom: 1px solid var(--vg-line); } .vg-stat:last-child { border-bottom: 0; } .vg-detail-gallery { grid-template-columns: 1fr; } .vg-footer-grid { grid-template-columns: 1fr; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; } .vg-reveal { opacity: 1; transform: none; } .vg-type-cursor { animation: none; opacity: .55; } .vg-card::after, .vg-gallery figure::after, .vg-quote-card::after { display: none; } } </style> <style>html{scrollbar-width:none}::-webkit-scrollbar{display:none}</style> </head> <body> <div id="wons-site"><!-- vantage theme shell. Injected into the mount element before hydration. --> <p><a class="vg-skip" href="#main-content">Skip to content</a></p> <div class="vg-loading" role="status" data-region="loading" aria-live="polite"> <div class="vg-spinner" aria-hidden="true"> </div> <p>Loading the site…</p> </div> <div hidden="" data-region="site"> <div class="vg-announce-wrap" data-region="announce"> </div> <header class="vg-header" data-region="header"> <div class="vg-wrap vg-header-row"><nav class="vg-nav" data-region="nav" aria-label="Primary navigation"></nav> <div class="vg-header-actions"><button class="vg-mode" type="button" data-action="mode" aria-label="Switch colour mode"> <span data-region="mode-icon" aria-hidden="true">◐</span> </button> <button class="vg-burger" type="button" data-action="menu" aria-label="Open navigation" aria-expanded="false"> </button></div> </div> </header><main id="main-content" tabindex="-1" data-region="main"></main><footer class="vg-footer" data-region="footer"></footer></div> <div class="vg-state vg-maintenance" hidden="" data-region="maintenance"> <div class="vg-state-box"><span class="vg-eyebrow">Temporarily unavailable</span> <h1 data-region="maintenance-title">Site under maintenance</h1> <p data-region="maintenance-message"> </p> </div> </div> <div class="vg-state vg-error" hidden="" data-region="error"> <div class="vg-state-box"><span class="vg-eyebrow">Loading error</span> <h1>We could not load this site</h1> <p>Please refresh the page in a moment.</p> </div> </div> <div class="vg-toast" role="status" hidden="" data-region="toast" aria-live="polite"> </div> <div class="vg-lightbox" role="dialog" hidden="" data-region="lightbox" aria-modal="true" aria-label="Image preview"><button class="vg-lightbox-close" type="button" data-action="lightbox-close" aria-label="Close image preview">×</button> <div class="vg-lightbox-stage" data-region="lightbox-stage"> </div> </div> <noscript> <div class="vg-state vg-noscript"> <div class="vg-state-box"> <h1>JavaScript is required</h1> <p>This site builds its pages in the browser. Please enable JavaScript to read it.</p> </div> </div> </noscript></div> <script>window.WONS_SITE={api:"",domain:"preview",mount:"#wons-site",basePath:"/theme-preview/vantage",payload:{"schema_version":"1.0.0","status":"published","site":{"id":"demo","name":"Norbu & Daughters","legal_name":"Norbu & Daughters Private Limited","tagline":"A shop, a kitchen and a room upstairs","description":"A sample site, filled in the way a real one is: a few pages, a short list of what is on offer, and the details people actually ring up to ask for.","site_url":"https://example.bt","status":"published","default_language":"en","languages":["en"],"timezone":"Asia/Thimphu"},"branding":{"logos":{},"favicon":null,"theme":{"default_mode":"light","allow_mode_switch":true,"palette_source":"theme","modes":{"light":{"colors":{}},"dark":{"colors":{}}}}},"seo":{"default_title":"Norbu & Daughters","default_description":"A shop, a kitchen and a room upstairs.","robots":{"index":false,"follow":false}},"contact":{"emails":[{"label":"Enquiries","value":"hello@example.bt"}],"phones":[{"label":"Shop","value":"+975 2 000 000"}],"addresses":[{"label":"Shop","line_1":"Norzin Lam","line_2":"Opposite the clock tower","city":"Thimphu","state":null,"postal_code":"11001","country":"Bhutan","coordinates":{"latitude":null,"longitude":null}}],"social_links":[{"platform":"instagram","label":"Instagram","url":"https://example.bt"}],"business_hours":[{"days":["monday","tuesday","wednesday","thursday","friday"],"opens":"09:00","closes":"18:00"}]},"navigation":{"primary":{"label":"Primary navigation","items":[{"id":"n-home","label":"Home","target":{"type":"page","ref":"home"},"children":[]},{"id":"n-about","label":"About","target":{"type":"page","ref":"about"},"children":[]},{"id":"n-services","label":"What we do","target":{"type":"collection","ref":"services"},"children":[]},{"id":"n-contact","label":"Contact","target":{"type":"page","ref":"contact"},"children":[]}]},"footer":{"label":"Explore","items":[{"id":"f-about","label":"About","target":{"type":"page","ref":"about"},"children":[]},{"id":"f-services","label":"What we do","target":{"type":"collection","ref":"services"},"children":[]},{"id":"f-contact","label":"Contact","target":{"type":"page","ref":"contact"},"children":[]}]},"utility":{"label":"Utility navigation","items":[]}},"global_regions":{"announcement":{"enabled":true,"sections":[{"id":"ann","type":"announcement","data":{"message":"Open through Losar — the kitchen closes at four.","link_label":"See the hours","target":{"type":"page","ref":"contact"}}}]},"header":{"sections":[{"id":"hdr","type":"site_header","data":{"navigation":"navigation:primary"}}]},"footer":{"sections":[{"id":"f-id","type":"site_identity","data":{"description":"A shop, a kitchen and a room upstairs. Thimphu, since 1998."}},{"id":"f-nav","type":"navigation","data":{"navigation":"navigation:footer"}},{"id":"f-contact","type":"contact","data":{"source":"site:contact"}},{"id":"f-legal","type":"legal","data":{"copyright":"© {year} Norbu & Daughters. All rights reserved.","links":[]}}]}},"pages":[{"id":"home","title":"Home","slug":"home","path":"/","status":"published","template":"standard","language":"en","sections":[{"id":"hero","type":"hero","variant":"split","layout":{"alignment":"left","width":"wide"},"heading":{"eyebrow":"Thimphu, since 1998","title":"A shop, a kitchen and a room upstairs","subtitle":"Open six days a week","description":"Everything on this page is ordinary content typed into a form — a heading, a few lines, a list and a photograph. The design around it is the theme."},"media":{"primary":"asset:hero"},"actions":[{"label":"See what we do","style":"primary","icon":"arrow-right","target":{"type":"collection","ref":"services"}},{"label":"Find us","style":"text","target":{"type":"page","ref":"contact"}}]},{"id":"intro","type":"split_content","heading":{"eyebrow":"About","title":"Three rooms and a courtyard"},"media":{"primary":"asset:room"},"content":[{"type":"paragraph","text":"The shop came first, then the kitchen behind it, then the room upstairs when there were more of us than chairs."},{"type":"paragraph","text":"We change the menu when the vegetables change, which is more often than a website usually allows."}],"actions":[{"label":"Read more","style":"secondary","target":{"type":"page","ref":"about"}}]},{"id":"svc","type":"collection","heading":{"eyebrow":"What we do","title":"Four things, done properly"},"source":{"collection":"services","limit":4,"sort":{"field":"order","direction":"ascending"}}},{"id":"stats","type":"stats","heading":{"title":"Twenty-eight years of it"},"data":{"items":[{"label":"Years open","value":"28"},{"label":"Seats","value":"34"},{"label":"Suppliers","value":"12"},{"label":"Days a week","value":"6"}]}},{"id":"quotes","type":"testimonials","heading":{"eyebrow":"In their words","title":"What people say"},"data":{"items":[{"quote":"The only place in town where the menu is right on a Tuesday.","name":"Dechen","detail":"Thimphu"},{"quote":"We booked the upstairs room for eleven people and nobody had to stand.","name":"Karma","detail":"Paro"}]}},{"id":"cta","type":"call_to_action","heading":{"title":"Come by, or ring first","description":"The kitchen stops at four on a Saturday."},"actions":[{"label":"Contact us","style":"primary","target":{"type":"page","ref":"contact"}}]}]},{"id":"about","title":"About","slug":"about","path":"/about","status":"published","template":"standard","language":"en","sections":[{"id":"ab-h","type":"page_header","heading":{"eyebrow":"About","title":"Three rooms and a courtyard"}},{"id":"ab-t","type":"rich_text","content":[{"type":"paragraph","text":"The shop came first, then the kitchen behind it, then the room upstairs."},{"type":"paragraph","text":"This page exists so the preview has somewhere to go when you press a link."}]}]},{"id":"contact","title":"Contact","slug":"contact","path":"/contact","status":"published","template":"standard","language":"en","sections":[{"id":"ct-h","type":"page_header","heading":{"eyebrow":"Contact","title":"Find us"}},{"id":"ct-c","type":"contact"}]}],"collections":{"services":{"id":"services","label":"What we do","singular_label":"Service","item_type":"service","description":"The four things worth listing.","routing":{"index_path":"/what-we-do","item_path":"/what-we-do/{slug}"},"items":[{"id":"s-shop","type":"service","title":"The shop","slug":"the-shop","status":"published","order":1,"summary":"Dry goods, tea and whatever came up from Phuentsholing this week.","body":[{"type":"paragraph","text":"Open from nine."}],"media":{"featured":"asset:shop","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"Front room"},"extensions":{}},{"id":"s-kitchen","type":"service","title":"The kitchen","slug":"the-kitchen","status":"published","order":2,"summary":"One menu, rewritten when the vegetables change.","body":[{"type":"paragraph","text":"Lunch and an early dinner."}],"media":{"featured":"asset:kitchen","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"Behind the shop"},"extensions":{}},{"id":"s-room","type":"service","title":"The room upstairs","slug":"the-room-upstairs","status":"published","order":3,"summary":"Fourteen seats, one long table, booked by the evening.","body":[{"type":"paragraph","text":"Ring ahead."}],"media":{"featured":"asset:room","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"First floor"},"extensions":{}},{"id":"s-orders","type":"service","title":"Standing orders","slug":"standing-orders","status":"published","order":4,"summary":"The same box, the same day, every week.","body":[{"type":"paragraph","text":"Set it once."}],"media":{"featured":"asset:shop","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"By arrangement"},"extensions":{}}]}},"taxonomies":{"categories":[],"tags":[]},"assets":{"hero":{"id":"hero","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e7e5e1%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23cfccc6%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cfccc6%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cfccc6%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":45}}},"room":{"id":"room","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e3e4e2%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23c9ccc8%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23c9ccc8%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23c9ccc8%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}},"shop":{"id":"shop","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e8e6e2%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23d2cfc9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23d2cfc9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23d2cfc9%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}},"kitchen":{"id":"kitchen","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e5e6e4%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23cbcec9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cbcec9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cbcec9%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}}},"forms":{},"redirects":[],"extensions":{},"generated_at":"2026-08-10T07:31:48.313Z"}};</script> <script> /* Vantage — renderer. Dark-first tech: glassy sticky header, radial hero glow, glow-ring hover state on cards and media. applyBranding() still reads whichever mode the payload has active — dark is only this theme's CSS fallback identity. Signature interaction: renderRail() fills a persistent right-edge quick-link rail alongside the top nav; typeEyebrows() types out the hero eyebrow with a blinking cursor on every render (budgeted to finish well under half a second, so a screenshot taken shortly after load reliably catches it complete); animateStats() ticks stat values up from zero in monospace the first time they scroll into view; the scan-line hover sweep on cards/gallery figures/quote cards is pure CSS (see theme.css). RENDERERS.hero frames its content in a console/terminal window (.vg-console) — three status dots plus a monospace label built from the real site domain/name — so the theme is recognisable at first paint, not just on interaction. Contract: WONS_SITE_THEME_SKILLS.md. boot.js injects theme.html into the mount element, sets window.WONS_SITE, then appends this file. No site data lives here. */ (function () { "use strict"; var CONFIG = window.WONS_SITE || {}; var root = document.querySelector(CONFIG.mount || "#wons-site"); if (!root) return; var DATA = null; var CURRENT_MODE = "dark"; var BASE = String(CONFIG.basePath || "").replace(/\/+$/, ""); var toastTimer = null; function el(name) { return root.querySelector('[data-region="' + name + '"]'); } function show(node, visible) { if (node) node.hidden = !visible; } function html(node, markup) { if (node) node.innerHTML = markup; } function esc(value) { return String(value == null ? "" : value).replace(/[&<>"']/g, function (char) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[char]; }); } function textWithBreaks(value) { return esc(value).replace(/\n/g, "<br>"); } function get(path, fallback) { var current = DATA; String(path || "").split(".").forEach(function (part) { if (current != null) current = current[part]; }); return current == null ? fallback : current; } function normalizePath(path) { var value = String(path || "/").split("?")[0].split("#")[0]; if (BASE && value.indexOf(BASE) === 0) value = value.slice(BASE.length) || "/"; value = value.replace(/\/index\.(html?|php)$/i, "") || "/"; if (value.charAt(0) !== "/") value = "/" + value; value = value.replace(/\/{2,}/g, "/").replace(/\/+$/, "") || "/"; return value; } function toHref(path) { var value = String(path || "/"); if (value.charAt(0) !== "/") value = "/" + value; return (BASE || "") + value; } function currentPath() { return normalizePath(location.pathname); } function storageGet(key) { try { return window.localStorage ? window.localStorage.getItem(key) : null; } catch (error) { return null; } } function storageSet(key, value) { try { if (window.localStorage) window.localStorage.setItem(key, value); } catch (error) { /* storage can be blocked */ } } function asset(ref) { if (!ref) return null; if (typeof ref === "object" && ref.src) return ref; if (typeof ref !== "string") return null; if (ref.indexOf("asset:") === 0) return (DATA.assets || {})[ref.slice(6)] || null; if (/^(https?:)?\/\//.test(ref) || ref.indexOf("data:") === 0 || ref.indexOf("/") === 0 || ref.indexOf("assets/") === 0) { return { src: ref, alt: "" }; } return null; } function focalStyle(found) { var focal = found && found.metadata && found.metadata.focal_point; if (!focal) return ""; return ' style="object-position:' + Number(focal.x) + '% ' + Number(focal.y) + '%"'; } function assetImg(ref, alt, className, eager) { var found = asset(ref); if (!found || !found.src) return ""; return '<img src="' + esc(found.src) + '" alt="' + esc(alt || found.alt || "") + '"' + (className ? ' class="' + esc(className) + '"' : "") + (found.width ? ' width="' + esc(found.width) + '"' : "") + (found.height ? ' height="' + esc(found.height) + '"' : "") + (eager ? ' loading="eager" fetchpriority="high" decoding="async"' : ' loading="lazy" decoding="async"') + focalStyle(found) + ">"; } function pageById(id) { return (DATA.pages || []).filter(function (page) { return page.id === id; })[0] || null; } function pageByPath(path) { var clean = normalizePath(path); return (DATA.pages || []).filter(function (page) { return page.status !== "draft" && normalizePath(page.path || "/") === clean; })[0] || null; } function collectionById(id) { return (DATA.collections || {})[id] || null; } function collectionItem(collection, ref) { if (!collection) return null; return (collection.items || []).filter(function (item) { return item.id === ref || item.slug === ref; })[0] || null; } function publishedItems(collection, limit, sort) { var items = ((collection && collection.items) || []).filter(function (item) { return item.status !== "draft" && item.status !== "archived"; }).slice(); var field = (sort && sort.field) || (typeof sort === "string" ? sort : "order"); var descending = sort && sort.direction === "descending"; function fieldValue(item, path) { var value = item; String(path).split(".").forEach(function (part) { if (value != null) value = value[part]; }); return value; } items.sort(function (left, right) { var a = fieldValue(left, field), b = fieldValue(right, field); if (a == null && b == null) return 0; if (a == null) return 1; if (b == null) return -1; if (typeof a === "number" || typeof b === "number") return (descending ? -1 : 1) * (Number(a) - Number(b)); return (descending ? -1 : 1) * String(a).localeCompare(String(b)); }); return limit ? items.slice(0, limit) : items; } function collectionFromSource(source) { var key = null; if (typeof source === "string") key = source.replace(/^collection:/, ""); else if (source) key = source.collection || source.ref; return key ? collectionById(key) : null; } function patternMatch(pattern, path) { if (!pattern || pattern.indexOf("{slug}") < 0) return null; var escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace("\\{slug\\}", "([^/]+)"); var match = normalizePath(path).match(new RegExp("^" + escaped.replace(/\/$/, "") + "$")); return match ? decodeURIComponent(match[1]) : null; } function resolveRoute(path) { var clean = normalizePath(path); var redirect = (DATA.redirects || []).filter(function (rule) { return normalizePath(rule.from) === clean; })[0]; if (redirect) return { kind: "redirect", path: normalizePath(redirect.to) }; var page = pageByPath(clean); if (page) return { kind: "page", page: page, path: clean }; var collections = DATA.collections || {}; var keys = Object.keys(collections); for (var i = 0; i < keys.length; i += 1) { var collection = collections[keys[i]]; var routing = collection.routing || {}; if (routing.index_path && normalizePath(routing.index_path) === clean) { return { kind: "collection", collection: collection, path: clean }; } var slug = patternMatch(routing.item_path, clean); if (slug) { var item = collectionItem(collection, slug); if (item && item.status !== "draft" && item.status !== "archived") { return { kind: "item", collection: collection, item: item, path: clean }; } } } return { kind: "not-found", path: clean }; } function linkFor(target) { if (!target) return { href: "#", external: false }; if (target.type === "url") return { href: target.url || "#", external: !!target.new_window }; if (target.type === "email") return { href: "mailto:" + (target.value || target.email || ""), external: true }; if (target.type === "phone") return { href: "tel:" + (target.value || target.phone || ""), external: true }; if (target.type === "page") { var page = pageById(target.ref); return { href: toHref(page ? page.path : "/"), external: false }; } if (target.type === "collection") { var collection = collectionById(target.ref); return { href: toHref(collection && collection.routing ? collection.routing.index_path : "/"), external: false }; } if (target.type === "collection_item") { var parent = collectionById(target.collection); var item = collectionItem(parent, target.ref); var pattern = parent && parent.routing && parent.routing.item_path; return { href: toHref(pattern && item ? pattern.replace("{slug}", item.slug || item.id) : "/"), external: false }; } return { href: target.url || "#", external: false }; } var ICONS = { "arrow-right": "M13.2 4.8 20.4 12l-7.2 7.2-1.4-1.4L17 13H4v-2h13l-5.2-4.8z", "chevron-right": "M8.6 5.6 10 4.2l7.8 7.8-7.8 7.8-1.4-1.4L14.9 12z", "phone": "M7 2h3l1.5 5-2 1.5a12 12 0 0 0 6 6l1.5-2 5 1.5v3a2 2 0 0 1-2 2A17 17 0 0 1 5 6a2 2 0 0 1 2-4z", "mail": "M3 5h18a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1zm1.4 2 7.6 6 7.6-6H4.4z", "map-pin": "M12 22s7-6.7 7-12a7 7 0 1 0-14 0c0 5.3 7 12 7 12zm0-9a3 3 0 1 1 0-6 3 3 0 0 1 0 6z", "calendar": "M7 2h2v2h6V2h2v2h3a1 1 0 0 1 1 1v3H2V5a1 1 0 0 1 1-1h3zM2 10h20v11a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z", "clock": "M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm1 5v5.4l4 2.3-1 1.7L11 13V7z", "download": "M11 3h2v10.2l3.6-3.6 1.4 1.4-6 6-6-6 1.4-1.4L11 13.2zM4 19h16v2H4z", "external": "M14 3h7v7h-2V6.4l-8.3 8.3-1.4-1.4L17.6 5H14zM5 5h6v2H7v10h10v-4h2v6H5z", "check": "M9.5 17.5 4 12l1.4-1.4 4.1 4.1 9.1-9.1L20 7z", "plus": "M11 3h2v8h8v2h-8v8h-2v-8H3v-2h8z", "bag": "M7 7V6a5 5 0 0 1 10 0v1h3l1 14H3L4 7zm2 0h6V6a3 3 0 0 0-6 0z" }; function iconSvg(name, size) { var path = ICONS[String(name || "").toLowerCase()]; if (!path) return ""; size = size || 16; return '<svg class="vg-icon" viewBox="0 0 24 24" width="' + size + '" height="' + size + '" fill="currentColor" aria-hidden="true"><path d="' + path + '"/></svg>'; } function anchor(label, target, className, icon) { var link = linkFor(target); return '<a href="' + esc(link.href) + '"' + (className ? ' class="' + esc(className) + '"' : "") + (link.external ? ' target="_blank" rel="noopener"' : "") + ">" + esc(label) + iconSvg(icon) + "</a>"; } function actionClass(action, index) { if (action.style === "text") return "vg-btn vg-btn-text"; if (action.style === "secondary" || index > 0) return "vg-btn vg-btn-secondary"; return "vg-btn vg-btn-primary"; } function actionRow(actions, className) { if (!actions || !actions.length) return ""; return '<div class="' + (className || "vg-actions") + '">' + actions.map(function (action, index) { return anchor(action.label, action.target, actionClass(action, index), action.icon); }).join("") + "</div>"; } function formatDate(value) { if (!value) return ""; var date = new Date(value); if (isNaN(date.getTime())) return String(value); try { return new Intl.DateTimeFormat("en-GB", { day: "numeric", month: "long", year: "numeric" }).format(date); } catch (error) { return date.toDateString(); } } function contactValue(entry) { return entry ? String(entry.value || entry.address || entry.number || "") : ""; } function addressLine(entry) { if (!entry) return ""; return [entry.line_1 || entry.street, entry.line_2, entry.city, entry.state, entry.postal_code, entry.country].filter(Boolean).join(", "); } function hoursDays(entry) { var days = entry && entry.days; if (!Array.isArray(days) || !days.length) return entry ? (entry.day || entry.label || "") : ""; var short = days.map(function (day) { return day.charAt(0).toUpperCase() + day.slice(1, 3); }); return days.length > 2 ? short[0] + "–" + short[short.length - 1] : short.join(", "); } function columnsFor(count) { if (count <= 1) return 1; if (count === 2) return 2; if (count === 4) return 4; return 3; } function applyFavicon(ref) { var found = asset(ref); if (!found || !found.src) return; var existing = document.querySelectorAll('link[rel~="icon"]'); for (var i = 0; i < existing.length; i += 1) existing[i].parentNode.removeChild(existing[i]); var link = document.createElement("link"); link.rel = "icon"; if (found.mime_type) link.type = found.mime_type; link.href = found.src; document.head.appendChild(link); } function applyBranding(mode) { var branding = DATA.branding || {}; var theme = branding.theme || {}; var available = theme.modes || {}; var preferred = mode || storageGet(get("site.id", "site") + ":mode") || theme.default_mode || "dark"; if (preferred === "system") preferred = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; if (!available[preferred]) preferred = available.dark ? "dark" : (available.light ? "light" : Object.keys(available)[0] || "dark"); CURRENT_MODE = preferred; var palette = (available[preferred] || {}).colors || {}; var brand = branding.brand_colors || {}; var map = { "--vg-bg": palette.background, "--vg-surface": palette.surface, "--vg-surface-2": palette.surface_alt, "--vg-card": palette.surface_elevated, "--vg-ink": palette.text, "--vg-muted": palette.text_muted, "--vg-subtle": palette.text_subtle, "--vg-line": palette.border, "--vg-line-strong": palette.border_strong, "--vg-primary": palette.primary || brand.primary, "--vg-primary-h": palette.primary_hover || palette.primary_active || brand.primary, "--vg-on-primary": palette.primary_contrast, "--vg-secondary": palette.secondary || brand.secondary, "--vg-accent": palette.accent || brand.accent, "--vg-focus": palette.focus, "--vg-overlay": palette.overlay, "--vg-link": palette.link, "--vg-success": palette.success, "--vg-warning": palette.warning, "--vg-danger": palette.danger }; Object.keys(map).forEach(function (name) { if (map[name]) document.documentElement.style.setProperty(name, map[name]); }); var fonts = branding.fonts || {}; if (fonts.heading) document.documentElement.style.setProperty("--vg-heading", fonts.heading); if (fonts.body) document.documentElement.style.setProperty("--vg-body", fonts.body); var radii = theme.radii || {}; if (radii.small) document.documentElement.style.setProperty("--vg-radius-sm", radii.small); if (radii.medium) document.documentElement.style.setProperty("--vg-radius", radii.medium); if (radii.large) document.documentElement.style.setProperty("--vg-radius-lg", radii.large); document.documentElement.dataset.theme = preferred; var metaTheme = document.querySelector('meta[name="theme-color"]'); if (metaTheme && palette.background) metaTheme.setAttribute("content", palette.background); var icon = el("mode-icon"); if (icon) icon.textContent = preferred === "dark" ? "☀" : "◐"; applyFavicon(branding.favicon); } function applySeo(title, description, imageRef) { var seo = DATA.seo || {}; var rawTitle = title || seo.default_title || get("site.name", ""); var template = seo.title_template || "{{title}}"; document.title = template.indexOf("{{title}}") >= 0 ? template.replace("{{title}}", rawTitle) : (template.indexOf("%s") >= 0 ? template.replace("%s", rawTitle) : rawTitle); function setMeta(name, content, property) { if (!content) return; var selector = property ? 'meta[property="' + name + '"]' : 'meta[name="' + name + '"]'; var node = document.querySelector(selector) || document.createElement("meta"); node.setAttribute(property ? "property" : "name", name); node.setAttribute("content", content); if (!node.parentNode) document.head.appendChild(node); } var desc = description || seo.default_description || get("site.description", ""); setMeta("description", desc, false); setMeta("og:title", document.title, true); setMeta("og:description", desc, true); var image = asset(imageRef || seo.default_image); if (image) setMeta("og:image", image.src, true); } function navIsActive(target, path) { var href = normalizePath(linkFor(target).href); if (href === "/") return path === "/"; return path === href || path.indexOf(href + "/") === 0; } function renderNavItem(item, path) { var link = linkFor(item.target); var active = navIsActive(item.target, path); var children = item.children || []; return '<div class="vg-nav-item">' + '<a class="vg-nav-link' + (active ? " is-active" : "") + '" href="' + esc(link.href) + '"' + (link.external ? ' target="_blank" rel="noopener"' : "") + ' aria-current="' + (active ? "page" : "false") + '">' + esc(item.label) + (children.length ? '<span class="vg-nav-caret" aria-hidden="true">▾</span>' : "") + "</a>" + (children.length ? '<div class="vg-nav-sub">' + children.map(function (child) { var childLink = linkFor(child.target); var childActive = navIsActive(child.target, path); return '<a href="' + esc(childLink.href) + '" class="' + (childActive ? "is-active" : "") + '"' + (childLink.external ? ' target="_blank" rel="noopener"' : "") + ">" + esc(child.label) + "</a>"; }).join("") + "</div>" : "") + "</div>"; } function navList(ref) { var key = String(ref || "").replace(/^navigation:/, ""); return ((DATA.navigation || {})[key] || {}).items || []; } function renderHeader() { var branding = DATA.branding || {}; var logo = asset((branding.logos || {}).primary); html(el("brand"), logo ? assetImg((branding.logos || {}).primary, get("site.name", "")) : '<span class="vg-wordmark">' + esc(get("site.name", "")) + "</span>"); var path = currentPath(); var primary = get("navigation.primary.items", []); var utility = get("navigation.utility.items", []); var markup = primary.map(function (item) { return renderNavItem(item, path); }).join(""); utility.forEach(function (item) { var link = linkFor(item.target); markup += '<a class="vg-nav-link vg-nav-cta' + (navIsActive(item.target, path) ? " is-active" : "") + '" href="' + esc(link.href) + '">' + esc(item.label) + "</a>"; }); html(el("nav"), markup); var allowMode = !!get("branding.theme.allow_mode_switch", false); var modeButton = root.querySelector('[data-action="mode"]'); if (modeButton) modeButton.hidden = !allowMode; var announcement = get("global_regions.announcement", null); if (announcement && announcement.enabled && (announcement.sections || []).length) { var first = announcement.sections[0]; var data = first.data || {}; var heading = first.heading || {}; var message = data.message || data.text || heading.title || heading.subtitle || ""; var linkMarkup = data.target && data.link_label ? anchor(data.link_label, data.target) : ""; html(el("announce"), message ? '<div class="vg-announce"><span>' + esc(message) + "</span>" + linkMarkup + "</div>" : ""); } else html(el("announce"), ""); renderRail(path); } // Persistent right-edge quick-link rail — additive to the top nav, not a // replacement. Monogram buttons for the first few primary nav items, plus // a fixed "back to top" button. Re-rendered alongside the header on every // route change so its active state tracks the current page. function renderRail(path) { var rail = el("rail"); if (!rail) return; path = path || currentPath(); var items = get("navigation.primary.items", []).slice(0, 5); var markup = items.map(function (item) { var link = linkFor(item.target); var active = navIsActive(item.target, path); var letter = String(item.label || "?").trim().charAt(0).toUpperCase() || "?"; return '<a class="vg-rail-item' + (active ? " is-active" : "") + '" href="' + esc(link.href) + '"' + (link.external ? ' target="_blank" rel="noopener"' : "") + ' aria-label="' + esc(item.label || "Link") + '">' + '<span class="vg-rail-dot" aria-hidden="true">' + esc(letter) + '</span>' + '<span class="vg-rail-tip">' + esc(item.label || "") + "</span></a>"; }).join(""); markup += '<button type="button" class="vg-rail-item" data-action="totop" aria-label="Back to top">' + '<svg class="vg-rail-up" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 4l8 8-1.4 1.4L13 7.8V20h-2V7.8l-5.6 5.6L4 12z"/></svg>' + '<span class="vg-rail-tip">Back to top</span></button>'; html(rail, markup); } var SOCIAL_PATHS = { instagram: "M12 2.2c3.2 0 3.6 0 4.9.07 1.2.05 1.8.25 2.2.42.6.22 1 .48 1.4.9.4.4.7.8.9 1.4.2.4.4 1 .4 2.2.1 1.3.1 1.7.1 4.9s0 3.6-.1 4.9c0 1.2-.2 1.8-.4 2.2-.2.6-.5 1-.9 1.4-.4.4-.8.7-1.4.9-.4.2-1 .4-2.2.4-1.3.1-1.7.1-4.9.1s-3.6 0-4.9-.1c-1.2 0-1.8-.2-2.2-.4-.6-.2-1-.5-1.4-.9-.4-.4-.7-.8-.9-1.4-.2-.4-.4-1-.4-2.2C2.2 15.6 2.2 15.2 2.2 12s0-3.6.1-4.9c0-1.2.2-1.8.4-2.2.2-.6.5-1 .9-1.4.4-.4.8-.7 1.4-.9.4-.2 1-.4 2.2-.4C8.4 2.2 8.8 2.2 12 2.2zm0 3.2A6.6 6.6 0 1 0 18.6 12 6.6 6.6 0 0 0 12 5.4zm0 10.9A4.3 4.3 0 1 1 16.3 12 4.3 4.3 0 0 1 12 16.3zm6.9-11.1a1.5 1.5 0 1 1-1.5-1.5 1.5 1.5 0 0 1 1.5 1.5z", facebook: "M13.5 21v-8.2h2.8l.4-3.2h-3.2V7.5c0-.9.3-1.6 1.6-1.6h1.7V3.1A22 22 0 0 0 14.3 3c-2.5 0-4.2 1.5-4.2 4.3v2.3H7.3v3.2h2.8V21h3.4z", linkedin: "M6.9 8.4v11.4H3.1V8.4h3.8zM5 2.9a2.2 2.2 0 1 1 0 4.4 2.2 2.2 0 0 1 0-4.4zM9.3 8.4H13v1.6a4 4 0 0 1 3.6-2c2.6 0 4.4 1.7 4.4 5.3v6.5h-3.8v-5.9c0-1.6-.6-2.6-2-2.6a2.1 2.1 0 0 0-2 1.5 2.7 2.7 0 0 0-.1 1v6h-3.8V8.4z", "x": "M3 3l7.2 9.4L3.4 21h2.3l6.1-7 4.6 7H21l-7.5-9.9L20.3 3H18l-5.6 6.4L8.1 3z" }; function socialIcon(platform) { var path = SOCIAL_PATHS[String(platform || "").toLowerCase()] || "M10.6 13.4a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7l-1.4 1.4 1.4 1.4 1.4-1.4a2 2 0 0 1 2.9 2.9l-2.9 2.8a2 2 0 0 1-2.8 0zM13.4 10.6a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.4-1.4-1.4-1.4-1.4 1.4a2 2 0 0 1-2.9-2.9l2.9-2.8a2 2 0 0 1 2.8 0z"; return '<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" aria-hidden="true"><path d="' + path + '"/></svg>'; } function renderFooter() { var sections = get("global_regions.footer.sections", []); var contentSections = sections.filter(function (section) { return section.type !== "legal"; }); var columns = contentSections.map(function (section) { var data = section.data || {}; if (section.type === "site_identity") { var logoRef = data.logo || get("branding.logos.light", get("branding.logos.primary", "")); return '<div>' + (asset(logoRef) ? assetImg(logoRef, get("site.name", ""), "vg-footer-logo") : "<h3>" + esc(get("site.name", "")) + "</h3>") + "<p>" + esc(data.description || get("site.description", "")) + "</p></div>"; } if (section.type === "navigation") { var group = navList(data.navigation); if (!group.length) return ""; var label = String(data.navigation || "").replace(/^navigation:/, ""); return '<div><h4>' + esc(label.charAt(0).toUpperCase() + label.slice(1) || "Explore") + "</h4>" + group.map(function (item) { return anchor(item.label, item.target); }).join("") + "</div>"; } if (section.type === "contact") { var email = get("contact.emails.0", null), phone = get("contact.phones.0", null), address = get("contact.addresses.0", null); if (!email && !phone && !address) return ""; return '<div><h4>Contact</h4>' + (email ? '<a href="mailto:' + esc(contactValue(email)) + '">' + esc(contactValue(email)) + "</a>" : "") + (phone ? '<a href="tel:' + esc(contactValue(phone)) + '">' + esc(contactValue(phone)) + "</a>" : "") + (address ? "<p>" + esc(addressLine(address)) + "</p>" : "") + "</div>"; } return ""; }).filter(Boolean).join(""); var legal = sections.filter(function (section) { return section.type === "legal"; })[0]; var copyright = legal && legal.data && legal.data.copyright ? legal.data.copyright : "© {year} " + (get("site.legal_name", "") || get("site.name", "")); copyright = String(copyright).replace("{year}", new Date().getFullYear()); var social = get("contact.social_links", []).map(function (link) { return '<a href="' + esc(link.url) + '" target="_blank" rel="noopener" aria-label="' + esc(link.label || link.platform || "Social link") + '">' + socialIcon(link.platform) + "</a>"; }).join(""); html(el("footer"), '<div class="vg-wrap"><div class="vg-footer-grid" style="--vg-fcols:' + Math.max(1, contentSections.filter(Boolean).length || 1) + '">' + columns + '</div><div class="vg-footer-bottom"><span>' + esc(copyright) + '</span><div class="vg-social">' + social + "</div></div></div>"); } function sectionHeading(heading, level) { heading = heading || {}; level = level || "h2"; if (!heading.title && !heading.eyebrow && !heading.subtitle) return ""; return '<div class="vg-section-head">' + (heading.eyebrow ? '<span class="vg-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + (heading.title ? "<" + level + ">" + esc(heading.title) + "</" + level + ">" : "") + (heading.subtitle ? '<p class="vg-lede">' + esc(heading.subtitle) + "</p>" : "") + "</div>"; } function richContent(content) { if (!content) return ""; if (typeof content === "string") return "<p>" + textWithBreaks(content) + "</p>"; if (!Array.isArray(content)) return content.text ? "<p>" + textWithBreaks(content.text) + "</p>" : ""; return content.map(function (node) { if (!node) return ""; if (node.type === "paragraph") return "<p>" + textWithBreaks(node.text) + "</p>"; if (node.type === "heading") { var level = Math.min(Math.max(parseInt(node.level, 10) || 3, 2), 4); return "<h" + level + ">" + esc(node.text) + "</h" + level + ">"; } if (node.type === "list") { var tag = node.ordered ? "ol" : "ul"; return "<" + tag + ">" + (node.items || []).map(function (item) { return "<li>" + esc(typeof item === "string" ? item : item.text) + "</li>"; }).join("") + "</" + tag + ">"; } if (node.type === "quote") return "<blockquote>" + esc(node.text) + "</blockquote>"; if (node.type === "image") return assetImg(node.asset || node.src, node.alt || ""); if (node.type === "divider") return "<hr>"; return node.text ? "<p>" + textWithBreaks(node.text) + "</p>" : ""; }).join(""); } function cardMeta(item) { var attrs = item.attributes || {}; var dates = item.dates || {}; if (item.type === "product") return [attrs.edition, attrs.availability && String(attrs.availability).replace(/_/g, " ")].filter(Boolean); if (item.type === "article") return [formatDate(dates.published_at), attrs.reading_time].filter(Boolean); if (item.type === "project") return [attrs.place, attrs.year, attrs.stage].filter(Boolean); if (item.type === "service") return [attrs.lead_time].filter(Boolean); if (item.type === "person") return [attrs.position].filter(Boolean); return []; } function itemHref(collection, item) { var pattern = collection && collection.routing && collection.routing.item_path; return toHref(pattern ? pattern.replace("{slug}", item.slug || item.id) : "/"); } function itemLabel(item) { if (item.type === "product") return "View item"; if (item.type === "project") return "View project"; if (item.type === "service") return "Explore service"; if (item.type === "person") return "Meet " + String(item.title || "").split(" ")[0]; return "Read more"; } function renderCard(collection, item) { var image = item.media && (item.media.featured || item.media.image || item.media.thumbnail); var attrs = item.attributes || {}; var meta = cardMeta(item); return '<article class="vg-card' + (asset(image) ? "" : " no-media") + '">' + (asset(image) ? '<a class="vg-card-media" href="' + esc(itemHref(collection, item)) + '">' + assetImg(image, item.title) + "</a>" : "") + '<div class="vg-card-body">' + (!asset(image) && attrs.icon ? '<div class="vg-card-icon">' + iconSvg(attrs.icon, 20) + "</div>" : "") + (meta.length ? '<div class="vg-card-meta">' + meta.map(function (value) { return "<span>" + esc(value) + "</span>"; }).join("") + "</div>" : "") + "<h3>" + esc(item.title || "") + "</h3>" + (item.summary ? "<p>" + esc(item.summary) + "</p>" : "") + (attrs.price_display ? '<div class="vg-card-price">' + esc(attrs.price_display) + "</div>" : "") + '<a class="vg-more" href="' + esc(itemHref(collection, item)) + '">' + esc(itemLabel(item)) + iconSvg("arrow-right") + "</a>" + "</div></article>"; } var RENDERERS = { hero: function (section) { var heading = section.heading || {}, media = section.media || {}; var imageRef = media.primary || media.asset || media.image || media.background; var consoleLabel = String(CONFIG.domain || get("site.id", "") || get("site.name", "site")).toLowerCase(); return '<section class="vg-hero"><div class="vg-wrap"><div class="vg-console">' + '<div class="vg-console-bar" aria-hidden="true">' + '<span class="vg-console-dot vg-console-dot-a"></span><span class="vg-console-dot vg-console-dot-b"></span><span class="vg-console-dot vg-console-dot-c"></span>' + '<span class="vg-console-label">' + esc(consoleLabel) + "</span></div>" + '<div class="vg-console-body"><div class="vg-hero-grid' + (asset(imageRef) ? "" : " vg-single") + '">' + '<div>' + (heading.eyebrow ? '<span class="vg-eyebrow vg-type" data-type-text="' + esc(heading.eyebrow) + '"></span>' : "") + "<h1>" + esc(heading.title || get("site.name", "")) + "</h1>" + (heading.subtitle ? '<p class="vg-lede">' + esc(heading.subtitle) + "</p>" : "") + (heading.description ? '<p class="vg-hero-desc">' + esc(heading.description) + "</p>" : "") + actionRow(section.actions) + "</div>" + (asset(imageRef) ? '<div class="vg-hero-media">' + assetImg(imageRef, heading.title, "", true) + "</div>" : "") + "</div></div></div></div></section>"; }, page_header: function (section) { var heading = section.heading || {}, media = section.media || {}; var imageRef = media.primary || media.asset || media.image || media.background; return '<section class="vg-page-head"><div class="vg-wrap"><div class="vg-page-head-grid' + (asset(imageRef) ? "" : " vg-single") + '"><div>' + (heading.eyebrow ? '<span class="vg-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + "<h1>" + esc(heading.title || "") + "</h1>" + (heading.subtitle ? '<p class="vg-lede">' + esc(heading.subtitle) + "</p>" : "") + "</div>" + (asset(imageRef) ? '<div class="vg-page-banner">' + assetImg(imageRef, heading.title, "", true) + "</div>" : "") + "</div></div></section>"; }, rich_text: function (section) { return '<section class="vg-section"><div class="vg-wrap">' + sectionHeading(section.heading) + '<div class="vg-rich">' + richContent(section.content) + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "vg-actions vg-section-actions") : "") + "</div></section>"; }, split_content: function (section, index) { var media = section.media || {}, imageRef = media.primary || media.asset || media.image || media.background; return '<section class="vg-section' + (index % 2 ? " alt" : "") + '"><div class="vg-wrap"><div class="vg-split' + (section.variant === "reverse" ? " reverse" : "") + '">' + '<div class="vg-split-copy">' + sectionHeading(section.heading) + '<div class="vg-rich">' + richContent(section.content) + "</div>" + actionRow(section.actions) + "</div>" + (asset(imageRef) ? '<div class="vg-split-media">' + assetImg(imageRef, (section.heading || {}).title) + "</div>" : "") + "</div></div></section>"; }, stats: function (section) { var items = (section.data || {}).items || []; if (!items.length) return ""; return '<section class="vg-stats-section"><div class="vg-wrap">' + sectionHeading(section.heading) + '<div class="vg-stats" style="--vg-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return '<div class="vg-stat"><div class="vg-stat-value" data-stat-value="' + esc(item.value) + '">' + esc(item.value) + '</div><div class="vg-stat-label">' + esc(item.label) + "</div></div>"; }).join("") + "</div></div></section>"; }, collection: function (section) { var collection = collectionFromSource(section.source); if (!collection) return ""; var limit = section.source && section.source.limit; var items = publishedItems(collection, limit || 6, section.source && section.source.sort); if (!items.length) return ""; return '<section class="vg-section alt"><div class="vg-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="vg-grid" style="--vg-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return renderCard(collection, item); }).join("") + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "vg-actions vg-section-actions") : "") + "</div></section>"; }, gallery: function (section) { var collection = collectionFromSource(section.source); var items = publishedItems(collection, (section.source && section.source.limit) || 12); var allowLightbox = !section.data || section.data.allow_lightbox !== false; if (!items.length) return ""; var figures = items.map(function (item) { var ref = item.media && (item.media.featured || item.media.image); var found = asset(ref); if (!found) return ""; var attrs = item.attributes || {}; var meta = [attrs.place, attrs.year, attrs.stage].filter(Boolean).join(" · "); var imageMarkup = assetImg(ref, item.title); if (allowLightbox) imageMarkup = '<button type="button" class="vg-gallery-button" data-lightbox="' + esc(found.src) + '" data-caption="' + esc(item.title || item.summary || "") + '">' + imageMarkup + "</button>"; else imageMarkup = '<a class="vg-gallery-button" href="' + esc(itemHref(collection, item)) + '">' + imageMarkup + "</a>"; var showCaptions = !section.data || section.data.show_captions !== false; return "<figure>" + imageMarkup + (showCaptions ? "<figcaption>" + (item.title ? '<div class="vg-fig-title">' + esc(item.title) + "</div>" : "") + (item.summary ? '<div class="vg-fig-sub">' + esc(item.summary) + "</div>" : "") + (meta ? '<div class="vg-meta">' + esc(meta) + "</div>" : "") + "</figcaption>" : "") + "</figure>"; }).join(""); return '<section class="vg-section"><div class="vg-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="vg-gallery">' + figures + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "vg-actions vg-section-actions") : "") + "</div></section>"; }, people: function (section) { var collection = collectionFromSource(section.source); var items = publishedItems(collection); if (!items.length) return ""; return '<section class="vg-section"><div class="vg-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="vg-people" style="--vg-cols:' + columnsFor(items.length) + '">' + items.map(function (person) { var role = (person.attributes || {}).position || person.summary || ""; return '<a class="vg-person" href="' + esc(itemHref(collection, person)) + '"><div class="vg-person-image">' + assetImg(person.media && person.media.featured, person.title) + "</div><h3>" + esc(person.title) + '</h3><div class="vg-role">' + esc(role) + "</div></a>"; }).join("") + "</div></div></section>"; }, testimonials: function (section) { var items = (section.data || {}).items || []; if (!items.length) return ""; return '<section class="vg-section alt"><div class="vg-wrap">' + sectionHeading(section.heading) + '<div class="vg-testimonials" style="--vg-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return '<article class="vg-quote-card"><div class="vg-quote-mark">“</div><blockquote>' + esc(item.quote) + '</blockquote><div class="vg-quote-name">' + esc(item.name || "") + '</div><div class="vg-quote-detail">' + esc(item.detail || "") + "</div></article>"; }).join("") + "</div></div></section>"; }, call_to_action: function (section) { var heading = section.heading || {}; return '<section class="vg-section"><div class="vg-wrap"><div class="vg-cta-band"><div class="vg-cta-band-copy">' + (heading.eyebrow ? '<span class="vg-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + "<h2>" + esc(heading.title || "") + "</h2>" + (heading.subtitle ? "<p>" + esc(heading.subtitle) + "</p>" : "") + "</div>" + actionRow(section.actions) + "</div></div></section>"; }, contact: function (section) { var emails = get("contact.emails", []), phones = get("contact.phones", []), addresses = get("contact.addresses", []), hours = get("contact.business_hours", []); return '<section class="vg-section alt"><div class="vg-wrap">' + sectionHeading(section.heading || { title: "Contact" }) + '<div class="vg-contact-grid">' + '<article class="vg-contact-card"><h3>Write or call</h3><dl>' + emails.map(function (entry) { var value = contactValue(entry); return "<dt>" + esc(entry.label || "Email") + '</dt><dd><a href="mailto:' + esc(value) + '">' + esc(value) + "</a></dd>"; }).join("") + phones.map(function (entry) { var value = contactValue(entry); return "<dt>" + esc(entry.label || "Phone") + '</dt><dd><a href="tel:' + esc(value) + '">' + esc(value) + "</a></dd>"; }).join("") + "</dl></article>" + '<article class="vg-contact-card"><h3>Visit</h3><dl>' + addresses.map(function (entry) { return "<dt>" + esc(entry.label || "Address") + "</dt><dd>" + esc(addressLine(entry)) + "</dd>"; }).join("") + "</dl></article>" + '<article class="vg-contact-card"><h3>Opening hours</h3><table class="vg-hours">' + hours.map(function (entry) { return "<tr><td>" + esc(hoursDays(entry)) + "</td><td>" + esc(entry.closed ? "Closed" : (entry.opens || "") + " – " + (entry.closes || "")) + "</td></tr>"; }).join("") + "</table></article></div></div></section>"; }, form: function (section) { var source = section.source || {}; var form = (DATA.forms || {})[source.form || source.ref]; if (!form) return ""; var fields = (form.fields || []).map(function (field) { var id = "field-" + field.id; var full = field.type === "textarea" ? " full" : ""; var required = field.required ? " required" : ""; var requiredMark = field.required ? ' <span class="vg-required" aria-hidden="true">*</span>' : ""; var control = ""; if (field.type === "textarea") { control = '<textarea id="' + esc(id) + '" name="' + esc(field.id) + '" placeholder="' + esc(field.placeholder || "") + '"' + required + "></textarea>"; } else if (field.type === "select") { control = '<select id="' + esc(id) + '" name="' + esc(field.id) + '"' + required + '><option value="">' + esc(field.placeholder || "Select") + "</option>" + (field.options || []).map(function (option) { var value = typeof option === "string" ? option : option.value; var label = typeof option === "string" ? option : option.label; return '<option value="' + esc(value) + '">' + esc(label) + "</option>"; }).join("") + "</select>"; } else { control = '<input id="' + esc(id) + '" name="' + esc(field.id) + '" type="' + esc(field.type || "text") + '" placeholder="' + esc(field.placeholder || "") + '"' + required + ">"; } return '<div class="vg-field' + full + '"><label for="' + esc(id) + '">' + esc(field.label || field.id) + requiredMark + "</label>" + control + "</div>"; }).join(""); return '<section class="vg-section"><div class="vg-wrap"><div class="vg-form-shell"><div class="vg-form-copy">' + sectionHeading(section.heading || { title: form.title, subtitle: form.description }) + '</div><form class="vg-form" data-form-id="' + esc(form.id) + '" action="' + esc(form.action || "") + '" method="' + esc(form.method || "POST") + '"><div class="vg-form-grid">' + fields + '</div><div class="vg-form-footer"><p class="vg-form-note">Fields marked * are required.</p><button class="vg-btn vg-btn-primary" type="submit">' + esc(form.submit_label || "Send") + iconSvg("arrow-right") + '</button></div><div class="vg-form-status" data-form-status hidden></div></form></div></div></section>'; } }; function renderPage(page) { var markup = (page.sections || []).filter(function (section) { return section.enabled !== false; }).map(function (section, index) { var renderer = RENDERERS[section.type]; return renderer ? renderer(section, index) : ""; }).join(""); html(el("main"), markup || emptyState("This page has no published sections.", "/")); var seo = page.seo || {}; applySeo(seo.title || page.title, seo.description, seo.image); } function collectionHeading(collection) { return '<section class="vg-page-head"><div class="vg-wrap"><div class="vg-page-head-grid vg-single"><div>' + '<div class="vg-breadcrumbs"><a href="' + esc(toHref("/")) + '">Home</a><span>/</span><span>' + esc(collection.label) + "</span></div>" + '<span class="vg-eyebrow">Collection</span><h1>' + esc(collection.label || "") + "</h1>" + (collection.description ? '<p class="vg-lede">' + esc(collection.description) + "</p>" : "") + "</div></div></div></section>"; } function renderCollectionPage(collection) { var items = publishedItems(collection); html(el("main"), collectionHeading(collection) + '<section class="vg-section alt"><div class="vg-wrap">' + (items.length ? '<div class="vg-grid" style="--vg-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return renderCard(collection, item); }).join("") + "</div>" : '<p class="vg-lede">Nothing has been published here yet.</p>') + "</div></section>"); applySeo(collection.label, collection.description, items[0] && items[0].media && items[0].media.featured); } function itemMeta(item) { var attrs = item.attributes || {}, dates = item.dates || {}; if (item.type === "project") return [attrs.place, attrs.year, attrs.stage, attrs.area].filter(Boolean); if (item.type === "article") return [formatDate(dates.published_at), attrs.reading_time].filter(Boolean); if (item.type === "service") return [attrs.lead_time, attrs.starting_from].filter(Boolean); if (item.type === "product") return [attrs.price_display, attrs.edition, attrs.availability && String(attrs.availability).replace(/_/g, " ")].filter(Boolean); if (item.type === "person") return [attrs.position, attrs.department].filter(Boolean); return []; } function itemSpecs(item) { var attrs = item.attributes || {}, specs = (attrs.specifications || []).slice(); if (attrs.sku) specs.push({ label: "Reference", value: attrs.sku }); if (attrs.lead_time) specs.push({ label: "Typical timeline", value: attrs.lead_time }); if (attrs.starting_from) specs.push({ label: "Fee guide", value: attrs.starting_from }); if (attrs.area) specs.push({ label: "Area", value: attrs.area }); if (attrs.place) specs.push({ label: "Location", value: attrs.place }); return specs; } function renderItemPage(collection, item) { var image = item.media && item.media.featured; var meta = itemMeta(item); var specs = itemSpecs(item); var gallery = (item.media && item.media.gallery) || []; var related = publishedItems(collection).filter(function (candidate) { return candidate.id !== item.id; }).slice(0, 3); var eyebrow = collection.singular_label || item.type || "Detail"; var body = '<section class="vg-detail-hero"><div class="vg-wrap"><div class="vg-detail-grid"><div>' + '<div class="vg-breadcrumbs"><a href="' + esc(toHref("/")) + '">Home</a><span>/</span><a href="' + esc(toHref((collection.routing && collection.routing.index_path) || "/")) + '">' + esc(collection.label) + "</a><span>/</span><span>" + esc(item.title) + "</span></div>" + '<span class="vg-eyebrow">' + esc(eyebrow) + "</span><h1>" + esc(item.title || "") + "</h1>" + (item.summary ? '<p class="vg-lede">' + esc(item.summary) + "</p>" : "") + (meta.length ? '<div class="vg-detail-meta">' + meta.map(function (value) { return "<span>" + esc(value) + "</span>"; }).join("") + "</div>" : "") + actionRow(item.actions) + "</div>" + (asset(image) ? '<div>' + assetImg(image, item.title, "", true) + "</div>" : "") + "</div></div></section>"; body += '<section class="vg-section alt"><div class="vg-wrap"><div class="vg-detail-body"><div><div class="vg-rich">' + richContent(item.body) + "</div>" + (gallery.length ? '<div class="vg-detail-gallery">' + gallery.map(function (ref) { return assetImg(ref, item.title); }).join("") + "</div>" : "") + "</div>" + (specs.length ? '<aside class="vg-detail-aside"><h3>Details</h3><dl class="vg-specs">' + specs.map(function (spec) { return "<div><dt>" + esc(spec.label) + "</dt><dd>" + esc(spec.value) + "</dd></div>"; }).join("") + "</dl></aside>" : "") + "</div></div></section>"; if (related.length) { body += '<section class="vg-section"><div class="vg-wrap">' + sectionHeading({ eyebrow: "More to explore", title: "Related " + String(collection.label || "items").toLowerCase() }) + '<div class="vg-grid" style="--vg-cols:' + columnsFor(related.length) + '">' + related.map(function (candidate) { return renderCard(collection, candidate); }).join("") + "</div></div></section>"; } html(el("main"), body); applySeo(item.title, item.summary, image); } function notFoundMarkup() { return '<section class="vg-section"><div class="vg-wrap"><span class="vg-eyebrow">404</span><h1>Page not found</h1><p class="vg-lede">The address may be outdated, or the content may no longer be published.</p><div class="vg-actions"><a class="vg-btn vg-btn-primary" href="' + esc(toHref("/")) + '">Back to the homepage</a></div></div></section>'; } function emptyState(message, href) { return '<section class="vg-section"><div class="vg-wrap"><p class="vg-lede">' + esc(message) + '</p><div class="vg-actions"><a class="vg-btn vg-btn-secondary" href="' + esc(toHref(href || "/")) + '">Back to the homepage</a></div></div></section>'; } function renderRoute(route) { if (route.kind === "redirect") { history.replaceState({}, "", toHref(route.path)); route = resolveRoute(route.path); } if (route.kind === "page") renderPage(route.page); else if (route.kind === "collection") renderCollectionPage(route.collection); else if (route.kind === "item") renderItemPage(route.collection, route.item); else { html(el("main"), notFoundMarkup()); applySeo("Page not found", "The requested page could not be found."); } renderHeader(); typeEyebrows(); animateStats(); reveal(); } function showToast(message) { var node = el("toast"); if (!node) return; node.textContent = message; show(node, true); clearTimeout(toastTimer); toastTimer = setTimeout(function () { show(node, false); }, 4200); } function openLightbox(src, caption) { var lightbox = el("lightbox"), stage = el("lightbox-stage"); if (!lightbox || !stage) return; html(stage, '<img src="' + esc(src) + '" alt="' + esc(caption || "") + '">' + (caption ? "<p>" + esc(caption) + "</p>" : "")); show(lightbox, true); document.body.style.overflow = "hidden"; var close = root.querySelector('[data-action="lightbox-close"]'); if (close) close.focus(); } function closeLightbox() { var lightbox = el("lightbox"); if (lightbox && lightbox.hidden) return; show(lightbox, false); document.body.style.overflow = ""; } function handleFormSubmit(formNode) { var config = (DATA.forms || {})[formNode.getAttribute("data-form-id")] || {}; var status = formNode.querySelector("[data-form-status]"); if (!formNode.reportValidity()) return; var formData = new FormData(formNode); var action = config.action || formNode.action || ""; if (action.indexOf("mailto:") === 0) { var lines = []; formData.forEach(function (value, key) { var field = (config.fields || []).filter(function (candidate) { return candidate.id === key; })[0]; lines.push((field ? field.label : key) + ": " + value); }); location.href = "mailto:" + action.slice(7) + "?subject=" + encodeURIComponent("Website enquiry from " + (formData.get("name") || "a visitor")) + "&body=" + encodeURIComponent(lines.join("\n\n")); if (status) { status.textContent = config.success_message || "Your email application should open now."; show(status, true); } return; } if (!action) { if (status) { status.textContent = config.error_message || "No form endpoint is configured."; show(status, true); } return; } var button = formNode.querySelector('button[type="submit"]'); if (button) button.disabled = true; // POST the FormData object itself (no JSON.stringify, no manual Content-Type): // that keeps it a CORS "simple request" so the cross-origin submit doesn't // trigger a preflight the platform's static allow-list can't answer. fetch(action, { method: config.method || "POST", body: formData }).then(function (response) { if (!response.ok) throw new Error("HTTP " + response.status); formNode.reset(); if (status) { status.textContent = config.success_message || "Thank you. Your message has been sent."; show(status, true); } }).catch(function () { if (status) { status.textContent = config.error_message || "The message could not be sent."; show(status, true); } }).finally(function () { if (button) button.disabled = false; }); } function navigate(path, replace) { var clean = normalizePath(path); if (replace) history.replaceState({}, "", toHref(clean)); else history.pushState({}, "", toHref(clean)); renderRoute(resolveRoute(clean)); var header = el("header"); if (header) header.classList.remove("is-open"); document.body.classList.remove("vg-nav-open"); var burger = root.querySelector('[data-action="menu"]'); if (burger) burger.setAttribute("aria-expanded", "false"); window.scrollTo({ top: 0, behavior: "auto" }); var main = el("main"); if (main) main.focus({ preventScroll: true }); } function bindBehaviour() { root.addEventListener("click", function (event) { var burger = event.target.closest && event.target.closest('[data-action="menu"]'); if (burger) { var header = el("header"); var open = header && header.classList.toggle("is-open"); burger.setAttribute("aria-expanded", open ? "true" : "false"); burger.setAttribute("aria-label", open ? "Close navigation" : "Open navigation"); document.body.classList.toggle("vg-nav-open", !!open); return; } var mode = event.target.closest && event.target.closest('[data-action="mode"]'); if (mode) { var next = CURRENT_MODE === "dark" ? "light" : "dark"; storageSet(get("site.id", "site") + ":mode", next); applyBranding(next); showToast(next === "dark" ? "Dark mode enabled" : "Light mode enabled"); return; } var totop = event.target.closest && event.target.closest('[data-action="totop"]'); if (totop) { var reduceMotion = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches; window.scrollTo({ top: 0, behavior: reduceMotion ? "auto" : "smooth" }); return; } var close = event.target.closest && event.target.closest('[data-action="lightbox-close"]'); if (close || event.target === el("lightbox")) { closeLightbox(); return; } var preview = event.target.closest && event.target.closest("[data-lightbox]"); if (preview) { event.preventDefault(); openLightbox(preview.getAttribute("data-lightbox"), preview.getAttribute("data-caption")); return; } var link = event.target.closest && event.target.closest("a[href]"); if (!link || link.target === "_blank" || link.hasAttribute("download")) return; var href = link.getAttribute("href") || ""; if (/^(mailto:|tel:|javascript:|#)/i.test(href)) return; var url = new URL(link.href, location.href); if (url.origin !== location.origin) return; var route = resolveRoute(url.pathname); if (route.kind === "not-found") return; event.preventDefault(); navigate(url.pathname, false); }); root.addEventListener("submit", function (event) { var form = event.target.closest && event.target.closest("form[data-form-id]"); if (!form) return; event.preventDefault(); handleFormSubmit(form); }); window.addEventListener("popstate", function () { renderRoute(resolveRoute(currentPath())); window.scrollTo({ top: 0, behavior: "auto" }); }); document.addEventListener("keydown", function (event) { if (event.key === "Escape") closeLightbox(); }); } // Types out every hero eyebrow (`[data-type-text]`) character by character, // ending on a blinking cursor. The attribute value is the already-esc()'d // payload text; reading it back via getAttribute HTML-decodes it once, and // every character is then appended through textContent — never innerHTML — // so nothing in the customer's string can be parsed as markup mid-type. function typeEyebrows() { var reduceMotion = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches; root.querySelectorAll("[data-type-text]").forEach(function (node) { var text = node.getAttribute("data-type-text") || ""; node.removeAttribute("data-type-text"); node.textContent = ""; var textSpan = document.createElement("span"); var cursorSpan = document.createElement("span"); cursorSpan.className = "vg-type-cursor"; cursorSpan.setAttribute("aria-hidden", "true"); node.appendChild(textSpan); node.appendChild(cursorSpan); if (reduceMotion || !text) { textSpan.textContent = text; return; } var chars = String(text).split(""); // Budgeted to finish well under half a second regardless of eyebrow // length, so a screenshot taken shortly after load reliably lands on // the completed text rather than a partial, truncated-looking string. var perChar = Math.max(5, Math.min(18, 260 / chars.length)); var i = 0; (function tick() { if (i >= chars.length) return; textSpan.textContent += chars[i]; i += 1; setTimeout(tick, perChar); })(); }); } // Ticks each stats value up from zero once it scrolls into view. Only the // leading numeric portion is tweened; a non-numeric value ("N/A") is left // exactly as already rendered. One-shot per element, IntersectionObserver. function animateStats() { if (!("IntersectionObserver" in window)) return; if (window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; var nodes = root.querySelectorAll("[data-stat-value]"); if (!nodes.length) return; var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (!entry.isIntersecting) return; observer.unobserve(entry.target); var raw = entry.target.getAttribute("data-stat-value") || ""; var match = raw.match(/^(-?[\d,]*\.?\d+)/); if (!match) return; var numText = match[1]; var target = parseFloat(numText.replace(/,/g, "")); if (isNaN(target)) return; var suffix = raw.slice(match[1].length); var decimals = (numText.split(".")[1] || "").length; entry.target.innerHTML = '<span class="vg-stat-num">0</span>' + esc(suffix); var numSpan = entry.target.querySelector(".vg-stat-num"); var start = null, duration = 1000; function frame(timestamp) { if (start === null) start = timestamp; var progress = Math.min((timestamp - start) / duration, 1); var eased = 1 - Math.pow(1 - progress, 3); var current = target * eased; numSpan.textContent = decimals ? current.toFixed(decimals) : Math.round(current).toLocaleString(); if (progress < 1) requestAnimationFrame(frame); else numSpan.textContent = decimals ? target.toFixed(decimals) : target.toLocaleString(); } requestAnimationFrame(frame); }); }, { threshold: 0.4 }); nodes.forEach(function (node) { observer.observe(node); }); } function reveal() { if (!("IntersectionObserver" in window)) return; var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("is-in"); observer.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -7% 0px" }); root.querySelectorAll("main > section").forEach(function (section, index) { if (index === 0) return; section.classList.add("vg-reveal"); observer.observe(section); }); } function start(payload) { DATA = payload; show(el("loading"), false); if (!payload || payload.status === "maintenance" || get("site.status", "published") === "maintenance") { var maintenance = (payload && payload.maintenance) || {}; html(el("maintenance-title"), esc(maintenance.headline || "Site under maintenance")); html(el("maintenance-message"), esc(maintenance.message || "Please check back soon.")); show(el("maintenance"), true); document.title = maintenance.headline || "Site under maintenance"; return; } applyBranding(); show(el("site"), true); renderFooter(); renderRoute(resolveRoute(currentPath())); bindBehaviour(); } function fail(error) { if (window.console) console.error(error); show(el("loading"), false); show(el("error"), true); } if (CONFIG.payload) start(CONFIG.payload); else if (CONFIG.api) { fetch(CONFIG.api, { credentials: "omit" }).then(function (response) { if (!response.ok) throw new Error("HTTP " + response.status); return response.json(); }).then(start).catch(fail); } else fail(new Error("No payload or API URL configured.")); })(); </script> </body> </html>Evidence icks stat values up from zero in monospace tSolution Remove all comments that return information that may help an attacker and fix any underlying problems they refer to.
-
Modern Web Application (1)
GET https://sites.wons.bt/theme-preview/signal-grid
Alert tags Alert description The application appears to be a modern web application. If you need to explore it automatically then the Client Spider may well be more effective than the standard one.
Other info A noScript tag has been found, which is an indication that the application works differently with JavaScript enabled compared to when it is not.
Request Request line and header section (358 bytes)
GET https://sites.wons.bt/theme-preview/signal-grid HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache referer: https://sites.wons.bt Cookie: wons_csrf=GAvXjBHcSNzE5JhQCILE.648451ec0314384fdb85fa68844a96f9Request body (0 bytes)
Response Status line and header section (679 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:43:00 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-YFl216N55xX-T3A4Xlnryg' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 89816Response body (89816 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=1280"> <title>Signal Grid — preview</title> <meta name="robots" content="noindex,nofollow"> <style> /* WONS strict renderer structural layer — independent of Aster's visual styles. */ :root{ --a-bg:#0b0b0c;--a-surface:#121214;--a-surface-2:#1a1a1d;--a-card:#121214;--a-muted:#a6a39c;--a-subtle:#777570;--a-line:#ffffff27; --a-line-strong:#ffffff66;--a-primary:#ff2b1a;--a-primary-h:#db1e10; --a-on-primary:#fff;--a-secondary:#080809;--a-accent:#ff2b1a;--a-focus:#fff; --a-heading:Arial,Helvetica,sans-serif;--a-body:Arial,Helvetica,sans-serif; --a-radius-sm:0;--a-radius:0;--a-radius-lg:0;--a-shadow:none;--a-shadow-lg:none; --a-maxw:1500px;--a-measure:66ch;--a-bleed:clamp(1rem,2.4vw,2.25rem); --a-section:clamp(2.75rem,4.8vw,5.25rem);--a-header-h:72px } *{box-sizing:border-box}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%} body{margin:0;min-width:320px;background:var(--a-bg);color:var(--a-ink);font-family:var(--a-body);font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility} body.a-nav-open{overflow:hidden}button,input,select,textarea{font:inherit}button{color:inherit}img{display:block;max-width:100%;height:auto}a{color:inherit;text-decoration:none}p{margin:0 0 1rem} h1,h2,h3,h4{margin:0;font-family:var(--a-heading);line-height:.98;letter-spacing:-.045em;text-wrap:balance} h1{font-size:clamp(3.2rem,7vw,7.1rem)}h2{font-size:clamp(2.2rem,4.5vw,4.9rem)}h3{font-size:clamp(1.08rem,1.6vw,1.45rem)}h4{font-size:.9rem} ::selection{background:var(--a-primary);color:var(--a-on-primary)}:focus-visible{outline:2px solid var(--a-focus);outline-offset:4px} .a-app{overflow:clip}.a-wrap{width:100%;max-width:var(--a-maxw);margin:auto;padding-inline:var(--a-bleed)} .a-skip{position:fixed;z-index:999;left:1rem;top:1rem;transform:translateY(-180%);padding:.7rem 1rem;background:var(--a-ink);color:var(--a-bg)}.a-skip:focus{transform:none} .a-noscript{padding:1rem;text-align:center;background:#7f1d1d;color:#fff} .a-eyebrow,.a-kicker{display:inline-flex;align-items:center;gap:.55rem;color:var(--a-primary);font-size:.67rem;font-weight:700;letter-spacing:.17em;text-transform:uppercase} .a-lede{max-width:58ch;color:var(--a-muted);font-size:clamp(1rem,1.4vw,1.2rem);line-height:1.52} .a-announce{position:relative;z-index:60;display:flex;justify-content:center;gap:.8rem;padding:.55rem var(--a-bleed);background:var(--a-primary);color:var(--a-on-primary);font-size:.74rem} .a-header{position:sticky;top:0;z-index:50;height:var(--a-header-h);border-bottom:1px solid var(--a-line);background:color-mix(in srgb,var(--a-bg) 92%,transparent);backdrop-filter:blur(18px)} .a-header-inner{height:100%;display:flex;align-items:center;gap:1rem}.a-brand{display:inline-flex;align-items:center;margin-right:auto}.a-brand img{height:36px;width:auto;max-width:220px}.a-brand .a-wordmark{font-weight:800} .a-nav{display:flex;align-items:center;gap:.15rem}.a-nav-item{position:relative}.a-nav-link{display:inline-flex;align-items:center;gap:.25rem;padding:.65rem .72rem;color:var(--a-muted);font-size:.77rem;font-weight:650}.a-nav-link:hover,.a-nav-link.is-active{color:var(--a-ink)} .a-nav-caret{font-size:.62rem}.a-nav-sub{position:absolute;left:0;top:calc(100% + .65rem);min-width:220px;padding:.45rem;border:1px solid var(--a-line);background:var(--a-card);box-shadow:0 24px 70px #0008;opacity:0;visibility:hidden;transform:translateY(-5px);transition:.2s} .a-nav-item:hover .a-nav-sub,.a-nav-item:focus-within .a-nav-sub{opacity:1;visibility:visible;transform:none}.a-nav-sub a{display:block;padding:.65rem .7rem;color:var(--a-muted);font-size:.8rem}.a-nav-sub a:hover{background:var(--a-surface-2);color:var(--a-ink)} .a-nav-cta{margin-left:.4rem;}.a-header-actions{order:3;display:flex;gap:.4rem}.a-mode-toggle,.a-burger{width:38px;height:38px;border:1px solid var(--a-line);background:transparent;cursor:pointer}.a-burger{display:none;position:relative}.a-burger span{position:absolute;left:10px;width:17px;height:1px;background:currentColor}.a-burger span:nth-child(1){transform:translateY(-5px)}.a-burger span:nth-child(3){transform:translateY(5px)} .a-header.is-open .a-burger span:nth-child(1){transform:rotate(45deg)}.a-header.is-open .a-burger span:nth-child(2){opacity:0}.a-header.is-open .a-burger span:nth-child(3){transform:rotate(-45deg)} .a-hero{position:relative;isolation:isolate;min-height:min(760px,calc(100svh - var(--a-header-h)));display:grid;align-items:center;padding:clamp(2.2rem,5vw,4.5rem) 0;border-bottom:1px solid var(--a-line)} .a-hero-grid{position:relative;z-index:2;display:grid;grid-template-columns:minmax(0,.86fr) minmax(360px,1.14fr);gap:clamp(1.4rem,3vw,2.7rem);align-items:center}.a-hero-single{grid-template-columns:1fr;max-width:850px}.a-hero h1{margin:.7rem 0 1rem;max-width:10ch}.a-hero .a-lede{color:var(--a-ink);opacity:.82}.a-hero-desc{max-width:55ch;color:var(--a-muted);font-size:.92rem} .a-hero-actions,.a-section-actions{display:flex;flex-wrap:wrap;gap:.65rem;margin-top:1.4rem}.a-hero-media{position:relative}.a-hero-media img{width:100%;height:min(62vh,560px);object-fit:cover} .a-btn{display:inline-flex;align-items:center;justify-content:center;gap:.7rem;min-height:46px;padding:.72rem 1rem;border:1px solid var(--a-line-strong);background:transparent;color:var(--a-ink);cursor:pointer;font-size:.76rem;font-weight:750;letter-spacing:.04em;transition:.2s} .a-btn-primary{background:var(--a-primary);border-color:var(--a-primary);color:var(--a-on-primary)}.a-btn:hover{transform:translateY(-2px)}.a-btn-primary:hover{background:var(--a-primary-h)}.a-btn-secondary:hover,.a-btn-ghost:hover{background:var(--a-ink);color:var(--a-bg)}.a-btn-text{min-height:auto;padding:.3rem 0;border:0;color:var(--a-primary)} .a-icon{flex:none;transition:transform .2s}.a-btn:hover .a-icon,.a-more:hover .a-icon{transform:translateX(4px)} .a-section{padding:var(--a-section) 0;border-bottom:1px solid var(--a-line)}.a-section.alt{background:var(--a-surface)}.a-section-head{display:grid;grid-template-columns:minmax(120px,.32fr) minmax(0,1fr);gap:1rem 2rem;max-width:1050px;margin-bottom:clamp(1.5rem,3vw,2.6rem)}.a-section-head .a-eyebrow{grid-column:1}.a-section-head h2,.a-section-head .a-lede{grid-column:2}.a-section-head .a-lede{margin-top:.15rem} .a-stats-section{padding:4em;border-bottom:1px solid var(--a-line)}.a-stats{display:grid;grid-template-columns:repeat(var(--a-cols,4),1fr);border-left:1px solid var(--a-line)}.a-stat{padding:1.25rem;border-right:1px solid var(--a-line)}.a-stat-value{font-family:var(--a-heading);font-size:clamp(2rem,4vw,4rem);font-weight:650;line-height:1;color:var(--a-primary)}.a-stat-label{margin-top:.45rem;color:var(--a-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em} .a-split{display:grid;grid-template-columns:1fr 1fr;gap:clamp(1.4rem,3vw,2.6rem);align-items:center}.a-split.reverse .a-split-copy{order:2}.a-split-copy .a-section-head{display:block;margin-bottom:1rem}.a-split-copy .a-section-head>*{margin-bottom:.7rem}.a-split-copy .a-rich{color:var(--a-muted)}.a-split-media img{width:100%;aspect-ratio:5/4;object-fit:cover} .a-grid{display:grid;grid-template-columns:repeat(var(--a-cols,3),minmax(0,1fr));gap:1px;background:var(--a-line);border:1px solid var(--a-line)}.a-card{position:relative;display:flex;flex-direction:column;min-height:100%;overflow:hidden;background:var(--a-card);transition:transform .25s,background .25s}.a-card-media{display:block;overflow:hidden;background:var(--a-surface-2)}.a-card-media img{width:100%;aspect-ratio:4/3;object-fit:cover;transition:transform .5s,filter .5s}.a-card:hover .a-card-media img{transform:scale(1.035)}.a-card-body{display:flex;flex:1;flex-direction:column;padding:1rem}.a-card h3{margin:.25rem 0 .5rem}.a-card p{margin:0;color:var(--a-muted);font-size:.83rem}.a-card-meta{display:flex;gap:.4rem .65rem;flex-wrap:wrap;margin-bottom:.45rem;color:var(--a-subtle);font-size:.6rem;letter-spacing:.11em;text-transform:uppercase}.a-card-price{margin-top:.65rem;color:var(--a-primary);font-weight:700}.a-more{display:inline-flex;align-items:center;gap:.3rem;margin-top:auto;padding-top:.8rem;color:var(--a-primary);font-size:.72rem;font-weight:750}.a-card-icon{width:34px;height:34px;display:grid;place-items:center;margin-bottom:.8rem;border:1px solid var(--a-line);color:var(--a-primary)} .a-gallery{display:grid;grid-template-columns:repeat(12,1fr);gap:1px;background:var(--a-line);border:1px solid var(--a-line)}.a-gallery figure{grid-column:span 4;margin:0;background:var(--a-card);overflow:hidden}.a-gallery figure:nth-child(1),.a-gallery figure:nth-child(5){grid-column:span 7}.a-gallery figure:nth-child(2),.a-gallery figure:nth-child(6){grid-column:span 5}.a-gallery-button{display:block;width:100%;padding:0;border:0;background:none;cursor:zoom-in}.a-gallery img{width:100%;aspect-ratio:4/3;object-fit:cover;transition:transform .45s}.a-gallery figure:hover img{transform:scale(1.025)}.a-gallery figcaption{padding:.85rem 1rem}.a-fig-title{font-weight:750}.a-fig-sub{margin-top:.15rem;color:var(--a-muted);font-size:.76rem}.a-meta{margin-top:.35rem;color:var(--a-subtle);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase} .a-people{display:grid;grid-template-columns:repeat(var(--a-cols,4),1fr);gap:1px;background:var(--a-line)}.a-person{background:var(--a-bg);padding:1px}.a-person-image{overflow:hidden}.a-person img{width:100%;aspect-ratio:1;object-fit:cover;transition:transform .4s}.a-person:hover img{transform:scale(1.035)}.a-person h3{margin:.7rem .6rem .15rem}.a-person .role{margin:0 .6rem .7rem;color:var(--a-muted);font-size:.72rem} .a-rich{max-width:var(--a-measure)}.a-rich>*:first-child{margin-top:0}.a-rich h2,.a-rich h3,.a-rich h4{margin:1.6rem 0 .65rem}.a-rich p,.a-rich li{color:color-mix(in srgb,var(--a-ink) 82%,var(--a-muted))}.a-rich ul,.a-rich ol{padding-left:1.25rem}.a-rich blockquote{margin:1.6rem 0;padding:.2rem 0 .2rem 1rem;border-left:3px solid var(--a-primary);font-family:var(--a-heading);font-size:clamp(1.3rem,2.5vw,2rem)}.a-rich img{width:100%;margin:1.4rem 0}.a-rich a{color:var(--a-primary);text-decoration:underline} .a-testimonials{display:grid;grid-template-columns:repeat(var(--a-cols,2),1fr);gap:1px;background:var(--a-line)}.a-quote-card{padding:clamp(1.2rem,2.5vw,2rem);background:var(--a-card)}.a-quote-mark{color:var(--a-primary);font:3rem/1 Georgia,serif}.a-quote-card blockquote{margin:.55rem 0 1.2rem;font-family:var(--a-heading);font-size:clamp(1.25rem,2.2vw,1.85rem);line-height:1.2}.a-quote-name{font-weight:750}.a-quote-detail{color:var(--a-muted);font-size:.72rem} .a-cta-band{position:relative;display:grid;grid-template-columns:1fr auto;gap:1.5rem;align-items:end;padding:clamp(1.5rem,3vw,2.6rem);background:var(--a-secondary);color:var(--a-ink);border:1px solid var(--a-line)}.a-cta-band-copy{max-width:900px}.a-cta-band .a-eyebrow{margin-bottom:.65rem}.a-cta-band h2{max-width:16ch}.a-cta-band p{max-width:55ch;margin:.65rem 0 0;color:var(--a-muted)} .a-page-head,.a-detail-hero{padding:clamp(2.6rem,5vw,5rem) 0;border-bottom:1px solid var(--a-line)}.a-page-head-grid,.a-detail-grid{display:grid;grid-template-columns:.82fr 1.18fr;gap:clamp(1.4rem,3vw,2.8rem);align-items:end}.a-page-head h1,.a-detail-hero h1{max-width:11ch;margin:.65rem 0}.a-page-banner img,.a-detail-hero img{width:100%;aspect-ratio:16/10;object-fit:cover}.a-breadcrumbs{display:flex;gap:.4rem;margin-bottom:.65rem;color:var(--a-subtle);font-size:.68rem}.a-detail-meta{display:flex;gap:.4rem;flex-wrap:wrap;margin-top:.8rem}.a-detail-meta span{padding:.3rem .5rem;border:1px solid var(--a-line);color:var(--a-muted);font-size:.65rem} .a-detail-body{display:grid;grid-template-columns:1fr minmax(230px,.34fr);gap:clamp(1.5rem,4vw,3.5rem)}.a-detail-aside{position:sticky;top:calc(var(--a-header-h) + 1rem);align-self:start;padding:1rem;border:1px solid var(--a-line);background:var(--a-card)}.a-specs{margin:0}.a-specs div{padding:.6rem 0;border-bottom:1px solid var(--a-line)}.a-specs dt{color:var(--a-subtle);font-size:.58rem;letter-spacing:.1em;text-transform:uppercase}.a-specs dd{margin:.15rem 0 0}.a-detail-gallery{display:grid;grid-template-columns:1fr 1fr;gap:1px;margin-top:1.5rem}.a-detail-gallery img{width:100%;aspect-ratio:4/3;object-fit:cover} .a-contact-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--a-line)}.a-contact-card{padding:1rem;background:var(--a-card)}.a-contact-card h3{margin-bottom:.7rem}.a-contact-card dl{margin:0}.a-contact-card dt{margin-top:.65rem;color:var(--a-subtle);font-size:.58rem;text-transform:uppercase;letter-spacing:.1em}.a-contact-card dd{margin:.12rem 0 0;color:var(--a-muted)}.a-hours{width:100%;border-collapse:collapse}.a-hours td{padding:.45rem 0;border-bottom:1px solid var(--a-line);color:var(--a-muted);font-size:.78rem}.a-hours td:last-child{text-align:right} .a-form-shell{display:grid;grid-template-columns:.55fr 1fr;gap:clamp(1.5rem,4vw,3.5rem)}.a-form{padding:1.2rem;border:1px solid var(--a-line);background:var(--a-card)}.a-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:.8rem}.a-field{display:flex;flex-direction:column;gap:.3rem}.a-field.full{grid-column:1/-1}.a-field label{font-size:.68rem;font-weight:750}.a-required{color:var(--a-primary)}.a-field input,.a-field select,.a-field textarea{width:100%;padding:.7rem;border:1px solid var(--a-line-strong);background:var(--a-bg);color:var(--a-ink);outline:0}.a-field textarea{min-height:130px;resize:vertical}.a-field input:focus,.a-field select:focus,.a-field textarea:focus{border-color:var(--a-focus)}.a-form-footer{display:flex;justify-content:space-between;align-items:center;gap:1rem;margin-top:1rem}.a-form-note{margin:0;color:var(--a-subtle);font-size:.67rem}.a-form-status{margin-top:.8rem;padding:.7rem;background:var(--a-surface)} .a-footer{padding:clamp(2.5rem,5vw,4.5rem) 0 1.25rem;background:var(--a-secondary);border-top:1px solid var(--a-line)}.a-footer-grid{display:grid;grid-template-columns:1.4fr repeat(var(--a-fcols,2),1fr);gap:clamp(1.2rem,3vw,3rem)}.a-footer-logo{height:38px;width:auto;max-width:220px;margin-bottom:.7rem}.a-footer p{max-width:38ch;color:var(--a-muted);font-size:.78rem}.a-footer h4{margin-bottom:.6rem;color:var(--a-primary);font-size:.6rem;letter-spacing:.12em;text-transform:uppercase}.a-footer a{display:block;margin:.25rem 0;color:var(--a-muted);font-size:.78rem}.a-social{display:flex;gap:.45rem}.a-footer-bottom{display:flex;justify-content:space-between;gap:1rem;margin-top:2rem;padding-top:1rem;border-top:1px solid var(--a-line);color:var(--a-subtle);font-size:.62rem} .a-maintenance,.a-error,.a-loading{min-height:100vh;display:grid;place-items:center;padding:2rem}.a-state-box{max-width:620px}.a-spinner{width:42px;height:42px;margin:0 0 1rem;border:1px solid var(--a-line);border-top-color:var(--a-primary);border-radius:50%;animation:aSpin .8s linear infinite}.a-toast{position:fixed;z-index:90;right:1rem;bottom:1rem;padding:.7rem 1rem;background:var(--a-ink);color:var(--a-bg);font-size:.75rem}.a-lightbox{position:fixed;inset:0;z-index:100;background:#000e;display:grid;place-items:center;padding:3rem}.a-lightbox-stage img{max-height:82vh;max-width:90vw}.a-lightbox-close{position:absolute;right:1rem;top:1rem;width:40px;height:40px;border:1px solid #fff6;background:#000;color:#fff}.a-reveal{opacity:0;transform:translateY(26px);transition:opacity .65s,transform .65s cubic-bezier(.2,.8,.2,1)}.a-reveal.is-in{opacity:1;transform:none} @keyframes aSpin{to{transform:rotate(360deg)}} @media(max-width:900px){ :root{--a-header-h:64px;--a-bleed:1rem;--a-section:2.75rem}.a-nav{display:none;position:fixed;inset:var(--a-header-h) 0 0;padding:1rem;background:var(--a-bg);overflow:auto}.a-header.is-open .a-nav{display:block}.a-nav-item,.a-nav-link{display:block;width:100%}.a-nav-link{padding:.85rem 0;border-bottom:1px solid var(--a-line)}.a-nav-sub{position:static;display:block;visibility:visible;opacity:1;transform:none;border:0;box-shadow:none;background:transparent}.a-burger{display:block}.a-mode-toggle{display:none} .a-hero{min-height:auto;padding:2.3rem 0}.a-hero-grid,.a-page-head-grid,.a-detail-grid,.a-split,.a-form-shell{grid-template-columns:1fr}.a-split.reverse .a-split-copy{order:0}.a-hero h1{font-size:clamp(3.25rem,8vw,5.7rem)}.a-hero-media img{height:auto;aspect-ratio:4/3}.a-section-head{display:block}.a-section-head>*{margin-bottom:.65rem}.a-grid{grid-template-columns:1fr}.a-gallery figure,.a-gallery figure:nth-child(n){grid-column:span 12}.a-people{grid-template-columns:repeat(2,1fr)}.a-stats{grid-template-columns:repeat(2,1fr)}.a-stat{border-bottom:1px solid var(--a-line)}.a-testimonials,.a-contact-grid{grid-template-columns:1fr}.a-cta-band{grid-template-columns:1fr}.a-detail-body{grid-template-columns:1fr}.a-detail-aside{position:static}.a-footer-grid{grid-template-columns:1fr 1fr}.a-footer-grid>*:first-child{grid-column:1/-1} } @media(max-width:560px){.a-form-grid{grid-template-columns:1fr}.a-field.full{grid-column:auto}.a-people{grid-template-columns:1fr 1fr}.a-footer-grid{grid-template-columns:1fr}.a-footer-grid>*:first-child{grid-column:auto}.a-footer-bottom{display:block}} @media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.a-reveal{opacity:1;transform:none}.a-spinner{animation:none}*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important}} /* SIGNAL GRID — condensed kinetic editorial */ :root{ --a-bg:#0b0b0c;--a-surface:#101011;--a-surface-2:#181819;--a-card:#0d0d0e; --a-ink:#f2efe7;--a-muted:#aaa7a0;--a-subtle:#77746f;--a-line:#f2efe729; --a-line-strong:#f2efe773;--a-primary:#ff2b1a;--a-primary-h:#d91e11; --a-on-primary:#fff;--a-secondary:#070708;--a-accent:#ff2b1a;--a-focus:#ff2b1a; --a-heading:"Arial Narrow","Roboto Condensed",Impact,sans-serif;--a-body:"Helvetica Neue",Arial,sans-serif; --a-maxw:1600px;--a-header-h:68px;--a-section:clamp(2.5rem,4vw,4.25rem) } body{ background: linear-gradient(90deg,transparent calc(100% - 1px),#ffffff0e 0) 0 0/6.25vw 100%, var(--a-bg) } .a-wrap{padding-inline:clamp(1.1rem,1.7vw,1.75rem)} .a-header{background:#0b0b0cf2}.a-header-inner{border-inline:1px solid var(--a-line)} .a-brand{min-width:200px;padding-left:.8rem}.a-brand .a-wordmark{font-family:var(--a-heading);font-size:1.28rem;letter-spacing:-.02em;text-transform:uppercase} .a-brand .a-wordmark::first-letter{color:var(--a-primary)} .a-nav{height:100%;border-left:1px solid var(--a-line)}.a-nav-item{height:100%;display:grid;align-items:center;border-right:1px solid var(--a-line)} .a-nav-link{height:100%;padding-inline:1rem;text-transform:uppercase;letter-spacing:.08em;font-size:.66rem} .a-nav-link:hover,.a-nav-link.is-active{background:var(--a-primary);color:#fff}.a-nav-cta{background:transparent!important} .a-mode-toggle,.a-burger{border:0;border-left:1px solid var(--a-line);color: var(--a-accent);height:100%;width:52px} .a-eyebrow::before{content:"";width:8px;height:8px;background:var(--a-primary)} .a-hero{min-height:700px;max-height:850px;overflow:hidden;padding:1.4rem 0} .a-hero::before{content:"01";position:absolute;left:0;top:17%;padding:.45rem .55rem;border-block:1px solid var(--a-primary);color:var(--a-primary);font:700 .66rem/1 var(--a-body);z-index:3} .a-hero::after{ content:"";position:absolute;right:-7%;top:4%;width:58%;height:88%;z-index:0; background: linear-gradient(135deg,transparent 0 13%,#ffffff15 13.2% 13.5%,transparent 13.7%), linear-gradient(151deg,transparent 0 30%,#d8d8d8 30.2% 36%,#262629 36.2% 48%,#fafafa 48.2% 53%,#5f6064 53.2% 63%,transparent 63.2%), linear-gradient(22deg,transparent 0 40%,#f2efe735 40.2% 40.4%,transparent 40.6%); clip-path:polygon(5% 5%,78% 0,100% 24%,72% 44%,97% 66%,63% 100%,34% 69%,0 83%,20% 46%,0 27%); filter:drop-shadow(0 35px 32px #000);transform:perspective(900px) rotateY(-7deg); animation:signalShard 10s ease-in-out infinite } .a-hero-grid{grid-template-columns:minmax(390px,.78fr) minmax(500px,1.22fr);gap:1.4rem} .a-hero-copy{align-self:center;padding:1rem 0 1rem 2.2rem;border-left:1px solid var(--a-line)} .a-hero h1{font-size:clamp(5rem,4.8vw,9.1rem);line-height:.77;letter-spacing:-.065em;max-width:6.3ch;text-transform:none} .a-hero h1::after{content:".";color:var(--a-primary)} .a-hero .a-lede{max-width:31ch;margin-top:.35rem;font-size:1.05rem} .a-hero-desc{max-width:36ch}.a-hero-media{z-index:2;align-self:stretch;min-height:590px;border-left:1px solid var(--a-line)} .a-hero-media img{height:100%;min-height:590px;filter:grayscale(1) contrast(1.2);mix-blend-mode:lighten;clip-path:polygon(7% 0,100% 0,100% 88%,90% 100%,0 100%,0 8%)} .a-hero-media::after{content:"OBJ_07 / MOTION SURFACE";position:absolute;right:1rem;bottom:1rem;color:var(--a-ink);font:600 .58rem/1.5 monospace;letter-spacing:.08em;white-space:pre} .a-hero-actions{margin-top:1rem}.a-btn{border:0;border-bottom:1px solid var(--a-line-strong);padding:.65rem .1rem;min-height:38px;margin-right:1rem} .a-btn-primary{background:transparent;color:var(--a-primary);border-color:var(--a-primary)}.a-btn-primary:hover{background:transparent;color:#fff} .a-stats{margin-inline:auto;max-width:calc(var(--a-maxw) - 2 * var(--a-bleed));border-top:1px solid var(--a-line)} .a-stat{display:grid;grid-template-columns:auto 1fr;align-items:end;gap:.6rem;padding:.85rem 1rem}.a-stat-value{font-size:2.7rem}.a-stat-label{margin:0 0 .3rem} .a-section{position:relative}.a-section::before{content:attr(data-index);position:absolute;left:1rem;top:1rem;color:var(--a-subtle);font:.6rem monospace} .a-section-head{grid-template-columns:150px minmax(0,760px);margin-bottom:1.4rem}.a-section-head h2{text-transform:uppercase;font-size:clamp(2.6rem,5vw,5.5rem);line-height:.84} .a-grid{grid-template-columns:repeat(var(--a-cols,3),1fr)}.a-card:nth-child(even){background:#f2efe7;color:#111}.a-card:nth-child(even) p,.a-card:nth-child(even) .a-card-meta{color:#555} .a-card-body{min-height:170px;padding:.85rem}.a-card h3{text-transform:uppercase;font-family:var(--a-heading);font-size:1.65rem}.a-card-media img{filter:grayscale(1) contrast(1.1)}.a-card:hover{z-index:2;outline:1px solid var(--a-primary);transform:none}.a-card:hover .a-card-media img{filter:grayscale(0)} .a-card::before{content:counter(signal-card,decimal-leading-zero);counter-increment:signal-card;position:absolute;z-index:2;left:.7rem;top:.55rem;color:var(--a-primary);font:700 .78rem monospace}.a-grid{counter-reset:signal-card} .a-gallery figure:nth-child(even){background:#f2efe7;color:#111}.a-gallery img{filter:grayscale(1)}.a-gallery figure:hover img{filter:grayscale(0)} .a-person img{filter:grayscale(1)}.a-person:hover img{filter:none}.a-quote-card blockquote{font-family:Georgia,serif;font-style:italic}.a-quote-card:nth-child(even){background:var(--a-primary);color:#fff} .a-cta-band{background:var(--a-primary);color:#fff;border:0;clip-path:polygon(0 0,97% 0,100% 28%,100% 100%,0 100%)}.a-cta-band .a-eyebrow,.a-cta-band p{color:#fff}.a-cta-band .a-btn-primary{color:#fff;border-color:#fff} .a-page-head h1,.a-detail-hero h1{text-transform:uppercase;line-height:.82}.a-page-banner img,.a-detail-hero img{filter:grayscale(1);clip-path:polygon(4% 0,100% 0,100% 91%,95% 100%,0 100%,0 7%)} .a-form{border-top:4px solid var(--a-primary)}.a-field input,.a-field select,.a-field textarea{border-width:0 0 1px;background:transparent;padding-left:0} .a-footer-grid{border-inline:1px solid var(--a-line);padding-inline:1rem} @keyframes signalShard{50%{transform:perspective(900px) rotateY(1deg) translateY(-10px)}} @media(max-width:900px){ body{background-size:25vw 100%}.a-brand{padding-left:0;min-width:auto}.a-hero{max-height:none;padding:1.5rem 0}.a-hero::after{width:90%;height:45%;right:-30%;top:48%;opacity:.75}.a-hero-copy{padding-left:.85rem}.a-hero-grid{grid-template-columns:1fr}.a-hero h1{font-size:clamp(4.2rem,20vw,7rem);max-width:6ch}.a-hero-media{min-height:330px;margin-top:.5rem}.a-hero-media img{min-height:330px}.a-section-head{grid-template-columns:1fr}.a-grid{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;background:transparent;border:0}.a-card{min-width:82vw;scroll-snap-align:start;border:1px solid var(--a-line)} } [hidden] { display: none !important; } </style> <style>html{scrollbar-width:none}::-webkit-scrollbar{display:none}</style> </head> <body> <div id="wons-site"><p><a class="a-skip" href="#main-content">Skip to content</a></p> <div id="wons-site" class="a-app"> <div class="a-loading" role="status" data-region="loading" aria-live="polite"> <div> <div class="a-spinner" aria-hidden="true"> </div> <p class="a-lede">Loading the site…</p> </div> </div> <div hidden="" data-region="site"> <div data-region="announce"> </div> <header class="a-header" data-region="header"> <div class="a-wrap a-header-inner"> <div class="a-header-actions"><button class="a-mode-toggle" type="button" aria-label="Switch colour mode" data-action="mode"> <span aria-hidden="true" data-region="mode-icon">◐</span> </button> <button class="a-burger" type="button" aria-label="Open navigation" aria-expanded="false" data-action="menu"> </button></div> <nav class="a-nav" data-region="nav" aria-label="Primary navigation"></nav></div> </header><main id="main-content" tabindex="-1" data-region="main"></main><footer class="a-footer" data-region="footer"></footer></div> <div class="a-maintenance" hidden="" data-region="maintenance"> <div class="a-state-box"><span class="a-eyebrow">Temporarily unavailable</span> <h1 data-region="maintenance-title">Site under maintenance</h1> <p class="a-lede" data-region="maintenance-message"> </p> </div> </div> <div class="a-error" hidden="" data-region="error"> <div class="a-state-box"><span class="a-eyebrow">Loading error</span> <h1>We could not load this site</h1> <p class="a-lede">Check that <code>site-data.json</code> is available, then refresh the page.</p> </div> </div> <div class="a-toast" role="status" hidden="" data-region="toast" aria-live="polite"> </div> <div class="a-lightbox" role="dialog" hidden="" data-region="lightbox" aria-modal="true" aria-label="Image preview"><button class="a-lightbox-close" type="button" data-action="lightbox-close" aria-label="Close image preview">×</button> <div class="a-lightbox-stage" data-region="lightbox-stage"> </div> </div> </div> <noscript> &lt;div class="a-noscript"&gt;This website needs JavaScript to render its JSON content.&lt;/div&gt; </noscript></div> <script>window.WONS_SITE={api:"",domain:"preview",mount:"#wons-site",basePath:"/theme-preview/signal-grid",payload:{"schema_version":"1.0.0","status":"published","site":{"id":"demo","name":"Norbu & Daughters","legal_name":"Norbu & Daughters Private Limited","tagline":"A shop, a kitchen and a room upstairs","description":"A sample site, filled in the way a real one is: a few pages, a short list of what is on offer, and the details people actually ring up to ask for.","site_url":"https://example.bt","status":"published","default_language":"en","languages":["en"],"timezone":"Asia/Thimphu"},"branding":{"logos":{},"favicon":null,"theme":{"default_mode":"light","allow_mode_switch":true,"palette_source":"theme","modes":{"light":{"colors":{}},"dark":{"colors":{}}}}},"seo":{"default_title":"Norbu & Daughters","default_description":"A shop, a kitchen and a room upstairs.","robots":{"index":false,"follow":false}},"contact":{"emails":[{"label":"Enquiries","value":"hello@example.bt"}],"phones":[{"label":"Shop","value":"+975 2 000 000"}],"addresses":[{"label":"Shop","line_1":"Norzin Lam","line_2":"Opposite the clock tower","city":"Thimphu","state":null,"postal_code":"11001","country":"Bhutan","coordinates":{"latitude":null,"longitude":null}}],"social_links":[{"platform":"instagram","label":"Instagram","url":"https://example.bt"}],"business_hours":[{"days":["monday","tuesday","wednesday","thursday","friday"],"opens":"09:00","closes":"18:00"}]},"navigation":{"primary":{"label":"Primary navigation","items":[{"id":"n-home","label":"Home","target":{"type":"page","ref":"home"},"children":[]},{"id":"n-about","label":"About","target":{"type":"page","ref":"about"},"children":[]},{"id":"n-services","label":"What we do","target":{"type":"collection","ref":"services"},"children":[]},{"id":"n-contact","label":"Contact","target":{"type":"page","ref":"contact"},"children":[]}]},"footer":{"label":"Explore","items":[{"id":"f-about","label":"About","target":{"type":"page","ref":"about"},"children":[]},{"id":"f-services","label":"What we do","target":{"type":"collection","ref":"services"},"children":[]},{"id":"f-contact","label":"Contact","target":{"type":"page","ref":"contact"},"children":[]}]},"utility":{"label":"Utility navigation","items":[]}},"global_regions":{"announcement":{"enabled":true,"sections":[{"id":"ann","type":"announcement","data":{"message":"Open through Losar — the kitchen closes at four.","link_label":"See the hours","target":{"type":"page","ref":"contact"}}}]},"header":{"sections":[{"id":"hdr","type":"site_header","data":{"navigation":"navigation:primary"}}]},"footer":{"sections":[{"id":"f-id","type":"site_identity","data":{"description":"A shop, a kitchen and a room upstairs. Thimphu, since 1998."}},{"id":"f-nav","type":"navigation","data":{"navigation":"navigation:footer"}},{"id":"f-contact","type":"contact","data":{"source":"site:contact"}},{"id":"f-legal","type":"legal","data":{"copyright":"© {year} Norbu & Daughters. All rights reserved.","links":[]}}]}},"pages":[{"id":"home","title":"Home","slug":"home","path":"/","status":"published","template":"standard","language":"en","sections":[{"id":"hero","type":"hero","variant":"split","layout":{"alignment":"left","width":"wide"},"heading":{"eyebrow":"Thimphu, since 1998","title":"A shop, a kitchen and a room upstairs","subtitle":"Open six days a week","description":"Everything on this page is ordinary content typed into a form — a heading, a few lines, a list and a photograph. The design around it is the theme."},"media":{"primary":"asset:hero"},"actions":[{"label":"See what we do","style":"primary","icon":"arrow-right","target":{"type":"collection","ref":"services"}},{"label":"Find us","style":"text","target":{"type":"page","ref":"contact"}}]},{"id":"intro","type":"split_content","heading":{"eyebrow":"About","title":"Three rooms and a courtyard"},"media":{"primary":"asset:room"},"content":[{"type":"paragraph","text":"The shop came first, then the kitchen behind it, then the room upstairs when there were more of us than chairs."},{"type":"paragraph","text":"We change the menu when the vegetables change, which is more often than a website usually allows."}],"actions":[{"label":"Read more","style":"secondary","target":{"type":"page","ref":"about"}}]},{"id":"svc","type":"collection","heading":{"eyebrow":"What we do","title":"Four things, done properly"},"source":{"collection":"services","limit":4,"sort":{"field":"order","direction":"ascending"}}},{"id":"stats","type":"stats","heading":{"title":"Twenty-eight years of it"},"data":{"items":[{"label":"Years open","value":"28"},{"label":"Seats","value":"34"},{"label":"Suppliers","value":"12"},{"label":"Days a week","value":"6"}]}},{"id":"quotes","type":"testimonials","heading":{"eyebrow":"In their words","title":"What people say"},"data":{"items":[{"quote":"The only place in town where the menu is right on a Tuesday.","name":"Dechen","detail":"Thimphu"},{"quote":"We booked the upstairs room for eleven people and nobody had to stand.","name":"Karma","detail":"Paro"}]}},{"id":"cta","type":"call_to_action","heading":{"title":"Come by, or ring first","description":"The kitchen stops at four on a Saturday."},"actions":[{"label":"Contact us","style":"primary","target":{"type":"page","ref":"contact"}}]}]},{"id":"about","title":"About","slug":"about","path":"/about","status":"published","template":"standard","language":"en","sections":[{"id":"ab-h","type":"page_header","heading":{"eyebrow":"About","title":"Three rooms and a courtyard"}},{"id":"ab-t","type":"rich_text","content":[{"type":"paragraph","text":"The shop came first, then the kitchen behind it, then the room upstairs."},{"type":"paragraph","text":"This page exists so the preview has somewhere to go when you press a link."}]}]},{"id":"contact","title":"Contact","slug":"contact","path":"/contact","status":"published","template":"standard","language":"en","sections":[{"id":"ct-h","type":"page_header","heading":{"eyebrow":"Contact","title":"Find us"}},{"id":"ct-c","type":"contact"}]}],"collections":{"services":{"id":"services","label":"What we do","singular_label":"Service","item_type":"service","description":"The four things worth listing.","routing":{"index_path":"/what-we-do","item_path":"/what-we-do/{slug}"},"items":[{"id":"s-shop","type":"service","title":"The shop","slug":"the-shop","status":"published","order":1,"summary":"Dry goods, tea and whatever came up from Phuentsholing this week.","body":[{"type":"paragraph","text":"Open from nine."}],"media":{"featured":"asset:shop","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"Front room"},"extensions":{}},{"id":"s-kitchen","type":"service","title":"The kitchen","slug":"the-kitchen","status":"published","order":2,"summary":"One menu, rewritten when the vegetables change.","body":[{"type":"paragraph","text":"Lunch and an early dinner."}],"media":{"featured":"asset:kitchen","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"Behind the shop"},"extensions":{}},{"id":"s-room","type":"service","title":"The room upstairs","slug":"the-room-upstairs","status":"published","order":3,"summary":"Fourteen seats, one long table, booked by the evening.","body":[{"type":"paragraph","text":"Ring ahead."}],"media":{"featured":"asset:room","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"First floor"},"extensions":{}},{"id":"s-orders","type":"service","title":"Standing orders","slug":"standing-orders","status":"published","order":4,"summary":"The same box, the same day, every week.","body":[{"type":"paragraph","text":"Set it once."}],"media":{"featured":"asset:shop","thumbnail":null,"gallery":[]},"actions":[],"taxonomies":{"categories":[],"tags":[]},"dates":{"published_at":"2026-01-04T09:00:00+06:00","updated_at":null},"attributes":{"position":"By arrangement"},"extensions":{}}]}},"taxonomies":{"categories":[],"tags":[]},"assets":{"hero":{"id":"hero","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e7e5e1%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23cfccc6%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cfccc6%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cfccc6%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":45}}},"room":{"id":"room","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e3e4e2%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23c9ccc8%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23c9ccc8%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23c9ccc8%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}},"shop":{"id":"shop","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e8e6e2%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23d2cfc9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23d2cfc9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23d2cfc9%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}},"kitchen":{"id":"kitchen","type":"image","src":"data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201200%20800%22%3E%3Crect%20width%3D%221200%22%20height%3D%22800%22%20fill%3D%22%23e5e6e4%22%2F%3E%3Ccircle%20cx%3D%22880%22%20cy%3D%22250%22%20r%3D%22230%22%20fill%3D%22%23cbcec9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22470%22%20width%3D%22640%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cbcec9%22%2F%3E%3Crect%20x%3D%2290%22%20y%3D%22530%22%20width%3D%22420%22%20height%3D%2226%22%20rx%3D%2213%22%20fill%3D%22%23cbcec9%22%20opacity%3D%22.6%22%2F%3E%3C%2Fsvg%3E","alt":"Placeholder photograph","title":null,"caption":null,"mime_type":"image/svg+xml","width":1200,"height":800,"filesize":null,"metadata":{"focal_point":{"x":50,"y":50}}}},"forms":{},"redirects":[],"extensions":{},"generated_at":"2026-08-10T07:31:45.528Z"}};</script> <script> /* Aster — data-driven static site renderer. No dependencies, no build step. */ (function () { "use strict"; var CONFIG = window.WONS_SITE || {}; var root = document.querySelector(CONFIG.mount || "#wons-site"); if (!root) return; var DATA = null; var CURRENT_MODE = "light"; var BASE = String(CONFIG.basePath || "").replace(/\/+$/, ""); var toastTimer = null; function el(name) { return root.querySelector('[data-region="' + name + '"]'); } function show(node, visible) { if (node) node.hidden = !visible; } function html(node, markup) { if (node) node.innerHTML = markup; } function esc(value) { return String(value == null ? "" : value).replace(/[&<>"']/g, function (char) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[char]; }); } function textWithBreaks(value) { return esc(value).replace(/\n/g, "<br>"); } function get(path, fallback) { var current = DATA; String(path || "").split(".").forEach(function (part) { if (current != null) current = current[part]; }); return current == null ? fallback : current; } function normalizePath(path) { var value = String(path || "/").split("?")[0].split("#")[0]; if (BASE && value.indexOf(BASE) === 0) value = value.slice(BASE.length) || "/"; value = value.replace(/\/index\.(html?|php)$/i, "") || "/"; if (value.charAt(0) !== "/") value = "/" + value; value = value.replace(/\/{2,}/g, "/").replace(/\/+$/, "") || "/"; return value; } function toHref(path) { var value = String(path || "/"); if (value.charAt(0) !== "/") value = "/" + value; return (BASE || "") + value; } function currentPath() { return normalizePath(location.pathname); } function storageGet(key) { try { return window.localStorage ? window.localStorage.getItem(key) : null; } catch (error) { return null; } } function storageSet(key, value) { try { if (window.localStorage) window.localStorage.setItem(key, value); } catch (error) { /* storage can be blocked */ } } function asset(ref) { if (!ref) return null; if (typeof ref === "object" && ref.src) return ref; if (typeof ref !== "string") return null; if (ref.indexOf("asset:") === 0) return (DATA.assets || {})[ref.slice(6)] || null; if (/^(https?:)?\/\//.test(ref) || ref.indexOf("data:") === 0 || ref.indexOf("/") === 0 || ref.indexOf("assets/") === 0) { return { src: ref, alt: "" }; } return null; } function assetImg(ref, alt, className, eager) { var found = asset(ref); if (!found || !found.src) return ""; return '<img src="' + esc(found.src) + '" alt="' + esc(alt || found.alt || "") + '"' + (className ? ' class="' + esc(className) + '"' : "") + (found.width ? ' width="' + esc(found.width) + '"' : "") + (found.height ? ' height="' + esc(found.height) + '"' : "") + (eager ? ' loading="eager" fetchpriority="high" decoding="async"' : ' loading="lazy" decoding="async"') + ">"; } function pageById(id) { return (DATA.pages || []).filter(function (page) { return page.id === id; })[0] || null; } function pageByPath(path) { var clean = normalizePath(path); return (DATA.pages || []).filter(function (page) { return page.status !== "draft" && normalizePath(page.path || "/") === clean; })[0] || null; } function collectionById(id) { return (DATA.collections || {})[id] || null; } function collectionItem(collection, ref) { if (!collection) return null; return (collection.items || []).filter(function (item) { return item.id === ref || item.slug === ref; })[0] || null; } function publishedItems(collection, limit, sort) { var items = ((collection && collection.items) || []).filter(function (item) { return item.status !== "draft" && item.status !== "archived"; }).slice(); var field = (sort && sort.field) || "order"; var descending = sort && sort.direction === "descending"; function fieldValue(item, path) { var value = item; String(path).split(".").forEach(function (part) { if (value != null) value = value[part]; }); return value; } items.sort(function (left, right) { var a = fieldValue(left, field), b = fieldValue(right, field); if (a == null && b == null) return 0; if (a == null) return 1; if (b == null) return -1; if (typeof a === "number" || typeof b === "number") return (descending ? -1 : 1) * (Number(a) - Number(b)); return (descending ? -1 : 1) * String(a).localeCompare(String(b)); }); return limit ? items.slice(0, limit) : items; } function collectionFromSource(source) { var key = null; if (typeof source === "string") key = source.replace(/^collection:/, ""); else if (source) key = source.collection || source.ref; return key ? collectionById(key) : null; } function patternMatch(pattern, path) { if (!pattern || pattern.indexOf("{slug}") < 0) return null; var escaped = pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace("\\{slug\\}", "([^/]+)"); var match = normalizePath(path).match(new RegExp("^" + escaped.replace(/\/$/, "") + "$")); return match ? decodeURIComponent(match[1]) : null; } function resolveRoute(path) { var clean = normalizePath(path); var redirect = (DATA.redirects || []).filter(function (rule) { return normalizePath(rule.from) === clean; })[0]; if (redirect) return { kind: "redirect", path: normalizePath(redirect.to) }; var page = pageByPath(clean); if (page) return { kind: "page", page: page, path: clean }; var collections = DATA.collections || {}; var keys = Object.keys(collections); for (var i = 0; i < keys.length; i += 1) { var collection = collections[keys[i]]; var routing = collection.routing || {}; if (routing.index_path && normalizePath(routing.index_path) === clean) { return { kind: "collection", collection: collection, path: clean }; } var slug = patternMatch(routing.item_path, clean); if (slug) { var item = collectionItem(collection, slug); if (item && item.status !== "draft" && item.status !== "archived") { return { kind: "item", collection: collection, item: item, path: clean }; } } } return { kind: "not-found", path: clean }; } function linkFor(target) { if (!target) return { href: "#", external: false }; if (target.type === "url") return { href: target.url || "#", external: !!target.new_window }; if (target.type === "email") return { href: "mailto:" + (target.value || target.email || ""), external: true }; if (target.type === "phone") return { href: "tel:" + (target.value || target.phone || ""), external: true }; if (target.type === "page") { var page = pageById(target.ref); return { href: toHref(page ? page.path : "/"), external: false }; } if (target.type === "collection") { var collection = collectionById(target.ref); return { href: toHref(collection && collection.routing ? collection.routing.index_path : "/"), external: false }; } if (target.type === "collection_item") { var parent = collectionById(target.collection); var item = collectionItem(parent, target.ref); var pattern = parent && parent.routing && parent.routing.item_path; return { href: toHref(pattern && item ? pattern.replace("{slug}", item.slug || item.id) : "/"), external: false }; } return { href: target.url || "#", external: false }; } var ICONS = { "arrow-right": "M4 12h14M13 6l6 6-6 6", "chevron-right": "M9 5l7 7-7 7", "phone": "M6 3h3l2 5-2.5 1.5a11 11 0 0 0 5 5L15 12l5 2v3a2 2 0 0 1-2.2 2A16 16 0 0 1 4 5.2 2 2 0 0 1 6 3z", "mail": "M3 6h18v12H3zM3 7l9 6 9-6", "map-pin": "M12 21s7-6.3 7-11a7 7 0 1 0-14 0c0 4.7 7 11 7 11z M12 12a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z", "clock": "M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z M12 7v5l3 2", "download": "M12 3v12M7 11l5 5 5-5M4 20h16", "external": "M14 4h6v6M20 4l-9 9M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5", "check": "M4 12.5l5 5L20 6", "plus": "M12 5v14M5 12h14", "plan": "M4 5h16v14H4zM9 5v14M4 11h5M14 5v7h6", "craft": "M4 20l5-5m2-2 7-7 2 2-7 7m-3-1-3-3 3-3 3 3z", "house": "M3 11l9-8 9 8v10h-6v-7H9v7H3z" }; function iconSvg(name, size) { var path = ICONS[String(name || "").toLowerCase()]; if (!path) return ""; size = size || 16; return '<svg class="a-icon" viewBox="0 0 24 24" width="' + size + '" height="' + size + '" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="' + path + '"/></svg>'; } function anchor(label, target, className, icon) { var link = linkFor(target); return '<a href="' + esc(link.href) + '"' + (className ? ' class="' + esc(className) + '"' : "") + (link.external ? ' target="_blank" rel="noopener"' : "") + ">" + esc(label) + iconSvg(icon) + "</a>"; } function actionClass(action, index) { if (action.style === "text") return "a-btn a-btn-text"; if (action.style === "secondary" || index > 0) return "a-btn a-btn-secondary"; return "a-btn a-btn-primary"; } function actionRow(actions, className) { if (!actions || !actions.length) return ""; return '<div class="' + (className || "a-hero-actions") + '">' + actions.map(function (action, index) { return anchor(action.label, action.target, actionClass(action, index), action.icon); }).join("") + "</div>"; } function formatDate(value) { if (!value) return ""; var date = new Date(value); if (isNaN(date.getTime())) return String(value); try { return new Intl.DateTimeFormat("en-GB", { day: "numeric", month: "long", year: "numeric" }).format(date); } catch (error) { return date.toDateString(); } } function contactValue(entry) { return entry ? String(entry.value || entry.address || entry.number || "") : ""; } function addressLine(entry) { if (!entry) return ""; return [entry.line_1 || entry.street, entry.line_2, entry.city, entry.state, entry.postal_code, entry.country].filter(Boolean).join(", "); } function hoursDays(entry) { var days = entry && entry.days; if (!Array.isArray(days) || !days.length) return entry ? (entry.day || entry.label || "") : ""; var short = days.map(function (day) { return day.charAt(0).toUpperCase() + day.slice(1, 3); }); return days.length > 2 ? short[0] + "–" + short[short.length - 1] : short.join(", "); } function columnsFor(count) { if (count <= 1) return 1; if (count === 2) return 2; if (count === 4) return 4; return 3; } function applyBranding(mode) { var branding = DATA.branding || {}; var theme = branding.theme || {}; var available = theme.modes || {}; var preferred = mode || storageGet((get("site.id", "site")) + ":mode") || theme.default_mode || "light"; if (preferred === "system") preferred = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; if (!available[preferred]) preferred = available.light ? "light" : Object.keys(available)[0] || "light"; CURRENT_MODE = preferred; var palette = (available[preferred] || {}).colors || {}; var brand = branding.brand_colors || {}; var map = { "--a-bg": palette.background, "--a-surface": palette.surface, "--a-surface-2": palette.surface_alt, "--a-card": palette.surface_elevated, "--a-ink": palette.text, "--a-muted": palette.text_muted, "--a-subtle": palette.text_subtle, "--a-line": palette.border, "--a-line-strong": palette.border_strong, "--a-primary": palette.primary || brand.primary, "--a-primary-h": palette.primary_hover || brand.primary, "--a-on-primary": palette.primary_contrast, "--a-secondary": palette.secondary || brand.secondary, "--a-accent": palette.accent || brand.accent, "--a-focus": palette.focus, "--a-overlay": palette.overlay }; Object.keys(map).forEach(function (name) { if (map[name]) document.documentElement.style.setProperty(name, map[name]); }); var fonts = branding.fonts || {}; if (fonts.heading) document.documentElement.style.setProperty("--a-heading", fonts.heading); if (fonts.body) document.documentElement.style.setProperty("--a-body", fonts.body); var radii = theme.radii || {}; if (radii.small) document.documentElement.style.setProperty("--a-radius-sm", radii.small); if (radii.medium) document.documentElement.style.setProperty("--a-radius", radii.medium); if (radii.large) document.documentElement.style.setProperty("--a-radius-lg", radii.large); document.documentElement.dataset.theme = preferred; var metaTheme = document.querySelector('meta[name="theme-color"]'); if (metaTheme && palette.background) metaTheme.setAttribute("content", palette.background); var icon = el("mode-icon"); if (icon) icon.textContent = preferred === "dark" ? "☀" : "◐"; var favicon = asset(branding.favicon); if (favicon) { var link = document.querySelector('link[rel="icon"]') || document.createElement("link"); link.rel = "icon"; link.href = favicon.src; document.head.appendChild(link); } } function applySeo(title, description, imageRef) { var seo = DATA.seo || {}; var rawTitle = title || seo.default_title || get("site.name", ""); var template = seo.title_template || "{{title}}"; document.title = template.indexOf("{{title}}") >= 0 ? template.replace("{{title}}", rawTitle) : (template.indexOf("%s") >= 0 ? template.replace("%s", rawTitle) : rawTitle); function setMeta(name, content, property) { if (!content) return; var selector = property ? 'meta[property="' + name + '"]' : 'meta[name="' + name + '"]'; var node = document.querySelector(selector) || document.createElement("meta"); node.setAttribute(property ? "property" : "name", name); node.setAttribute("content", content); if (!node.parentNode) document.head.appendChild(node); } var desc = description || seo.default_description || get("site.description", ""); setMeta("description", desc, false); setMeta("og:title", document.title, true); setMeta("og:description", desc, true); var image = asset(imageRef || seo.default_image); if (image) setMeta("og:image", image.src, true); } function navIsActive(target, path) { var href = normalizePath(linkFor(target).href); if (href === "/") return path === "/"; return path === href || path.indexOf(href + "/") === 0; } function renderNavItem(item, path) { var link = linkFor(item.target); var active = navIsActive(item.target, path); var children = item.children || []; return '<div class="a-nav-item">' + '<a class="a-nav-link' + (active ? " is-active" : "") + '" href="' + esc(link.href) + '"' + (link.external ? ' target="_blank" rel="noopener"' : "") + ' aria-current="' + (active ? "page" : "false") + '">' + esc(item.label) + (children.length ? '<span class="a-nav-caret" aria-hidden="true">▾</span>' : "") + "</a>" + (children.length ? '<div class="a-nav-sub">' + children.map(function (child) { var childLink = linkFor(child.target); var childActive = navIsActive(child.target, path); return '<a href="' + esc(childLink.href) + '" class="' + (childActive ? "is-active" : "") + '"' + (childLink.external ? ' target="_blank" rel="noopener"' : "") + ">" + esc(child.label) + "</a>"; }).join("") + "</div>" : "") + "</div>"; } function renderHeader() { var branding = DATA.branding || {}; var logo = asset((branding.logos || {}).primary); html(el("brand"), logo ? assetImg((branding.logos || {}).primary, get("site.name", "")) : '<span class="a-wordmark">' + esc(get("site.name", "")) + "</span>"); var path = currentPath(); var primary = get("navigation.primary.items", []); var utility = get("navigation.utility.items", []); var markup = primary.map(function (item) { return renderNavItem(item, path); }).join(""); utility.forEach(function (item) { var link = linkFor(item.target); markup += '<a class="a-nav-link a-nav-cta' + (navIsActive(item.target, path) ? " is-active" : "") + '" href="' + esc(link.href) + '">' + esc(item.label) + "</a>"; }); html(el("nav"), markup); var allowMode = !!get("branding.theme.allow_mode_switch", false); var modeButton = root.querySelector('[data-action="mode"]'); if (modeButton) modeButton.hidden = !allowMode; var announcement = get("global_regions.announcement", null); if (announcement && announcement.enabled && (announcement.sections || []).length) { var first = announcement.sections[0]; var data = first.data || {}; var heading = first.heading || {}; var message = data.message || data.text || heading.title || heading.subtitle || ""; var linkMarkup = data.target && data.link_label ? anchor(data.link_label, data.target) : ""; html(el("announce"), '<div class="a-announce"><span>' + esc(message) + "</span>" + linkMarkup + "</div>"); } else html(el("announce"), ""); } var SOCIAL_PATHS = { instagram: "M12 2.2c3.2 0 3.6 0 4.9.07 1.2.05 1.8.25 2.2.42.6.22 1 .48 1.4.9.4.4.7.8.9 1.4.2.4.4 1 .4 2.2.1 1.3.1 1.7.1 4.9s0 3.6-.1 4.9c0 1.2-.2 1.8-.4 2.2-.2.6-.5 1-.9 1.4-.4.4-.8.7-1.4.9-.4.2-1 .4-2.2.4-1.3.1-1.7.1-4.9.1s-3.6 0-4.9-.1c-1.2 0-1.8-.2-2.2-.4-.6-.2-1-.5-1.4-.9-.4-.4-.7-.8-.9-1.4-.2-.4-.4-1-.4-2.2C2.2 15.6 2.2 15.2 2.2 12s0-3.6.1-4.9c0-1.2.2-1.8.4-2.2.2-.6.5-1 .9-1.4.4-.4.8-.7 1.4-.9.4-.2 1-.4 2.2-.4C8.4 2.2 8.8 2.2 12 2.2zm0 3.2A6.6 6.6 0 1 0 18.6 12 6.6 6.6 0 0 0 12 5.4zm0 10.9A4.3 4.3 0 1 1 16.3 12 4.3 4.3 0 0 1 12 16.3zm6.9-11.1a1.5 1.5 0 1 1-1.5-1.5 1.5 1.5 0 0 1 1.5 1.5z", facebook: "M13.5 21v-8.2h2.8l.4-3.2h-3.2V7.5c0-.9.3-1.6 1.6-1.6h1.7V3.1A22 22 0 0 0 14.3 3c-2.5 0-4.2 1.5-4.2 4.3v2.3H7.3v3.2h2.8V21h3.4z", linkedin: "M6.9 8.4v11.4H3.1V8.4h3.8zM5 2.9a2.2 2.2 0 1 1 0 4.4 2.2 2.2 0 0 1 0-4.4zM9.3 8.4H13v1.6a4 4 0 0 1 3.6-2c2.6 0 4.4 1.7 4.4 5.3v6.5h-3.8v-5.9c0-1.6-.6-2.6-2-2.6a2.1 2.1 0 0 0-2 1.5 2.7 2.7 0 0 0-.1 1v6h-3.8V8.4z" }; function socialIcon(platform) { var path = SOCIAL_PATHS[String(platform || "").toLowerCase()] || "M10.6 13.4a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7l-1.4 1.4 1.4 1.4 1.4-1.4a2 2 0 0 1 2.9 2.9l-2.9 2.8a2 2 0 0 1-2.8 0zM13.4 10.6a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.4-1.4-1.4-1.4-1.4 1.4a2 2 0 0 1-2.9-2.9l2.9-2.8a2 2 0 0 1 2.8 0z"; return '<svg viewBox="0 0 24 24" width="17" height="17" fill="currentColor" aria-hidden="true"><path d="' + path + '"/></svg>'; } function renderFooter() { var sections = get("global_regions.footer.sections", []); var contentSections = sections.filter(function (section) { return section.type !== "legal"; }); var columns = contentSections.map(function (section) { var data = section.data || {}; if (section.type === "site_identity") { var logoRef = data.logo || get("branding.logos.light", get("branding.logos.primary", "")); return '<div>' + (asset(logoRef) ? assetImg(logoRef, get("site.name", ""), "a-footer-logo") : "<h3>" + esc(get("site.name", "")) + "</h3>") + "<p>" + esc(data.description || get("site.description", "")) + "</p></div>"; } if (section.type === "navigation") { var key = String(data.navigation || "").replace("navigation:", ""); var group = (DATA.navigation || {})[key] || {}; if (!(group.items || []).length) return ""; return '<div><h4>' + esc(group.label || "Explore") + "</h4>" + group.items.map(function (item) { return anchor(item.label, item.target); }).join("") + "</div>"; } if (section.type === "contact") { var email = get("contact.emails.0", null), phone = get("contact.phones.0", null), address = get("contact.addresses.0", null); return '<div><h4>Contact</h4>' + (email ? '<a href="mailto:' + esc(contactValue(email)) + '">' + esc(contactValue(email)) + "</a>" : "") + (phone ? '<a href="tel:' + esc(contactValue(phone)) + '">' + esc(contactValue(phone)) + "</a>" : "") + (address ? "<p>" + esc(addressLine(address)) + "</p>" : "") + "</div>"; } return ""; }).join(""); var legal = sections.filter(function (section) { return section.type === "legal"; })[0]; var copyright = legal && legal.data && legal.data.copyright ? legal.data.copyright : "© {year} " + (get("site.legal_name", "") || get("site.name", "")); copyright = copyright.replace("{year}", new Date().getFullYear()); var social = get("contact.social_links", []).map(function (link) { return '<a href="' + esc(link.url) + '" target="_blank" rel="noopener" aria-label="' + esc(link.label || link.platform || "Social link") + '">' + socialIcon(link.platform) + "</a>"; }).join(""); html(el("footer"), '<div class="a-wrap"><div class="a-footer-grid" style="--a-fcols:' + Math.max(1, contentSections.length - 1) + '">' + columns + '</div><div class="a-footer-bottom"><span>' + esc(copyright) + '</span><div class="a-social">' + social + "</div></div></div>"); } function sectionHeading(heading, level) { heading = heading || {}; level = level || "h2"; if (!heading.title && !heading.eyebrow && !heading.subtitle) return ""; return '<div class="a-section-head">' + (heading.eyebrow ? '<span class="a-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + (heading.title ? "<" + level + ">" + esc(heading.title) + "</" + level + ">" : "") + (heading.subtitle ? '<p class="a-lede">' + esc(heading.subtitle) + "</p>" : "") + "</div>"; } function richContent(content) { if (!content) return ""; if (typeof content === "string") return "<p>" + textWithBreaks(content) + "</p>"; if (!Array.isArray(content)) return content.text ? "<p>" + textWithBreaks(content.text) + "</p>" : ""; return content.map(function (node) { if (!node) return ""; if (node.type === "paragraph") return "<p>" + textWithBreaks(node.text) + "</p>"; if (node.type === "heading") { var level = Math.min(Math.max(parseInt(node.level, 10) || 3, 2), 4); return "<h" + level + ">" + esc(node.text) + "</h" + level + ">"; } if (node.type === "list") { var tag = node.ordered ? "ol" : "ul"; return "<" + tag + ">" + (node.items || []).map(function (item) { return "<li>" + esc(typeof item === "string" ? item : item.text) + "</li>"; }).join("") + "</" + tag + ">"; } if (node.type === "quote") return "<blockquote>" + esc(node.text) + "</blockquote>"; if (node.type === "image") return assetImg(node.asset || node.src, node.alt || ""); if (node.type === "divider") return "<hr>"; return node.text ? "<p>" + esc(node.text) + "</p>" : ""; }).join(""); } function cardMeta(item) { var attrs = item.attributes || {}; var dates = item.dates || {}; if (item.type === "product") return [attrs.edition, attrs.availability && String(attrs.availability).replace(/_/g, " ")].filter(Boolean); if (item.type === "article") return [formatDate(dates.published_at || dates.published), attrs.reading_time].filter(Boolean); if (item.type === "project") return [attrs.place, attrs.year, attrs.stage].filter(Boolean); if (item.type === "service") return [attrs.lead_time].filter(Boolean); if (item.type === "person") return [attrs.position].filter(Boolean); return []; } function itemHref(collection, item) { var pattern = collection && collection.routing && collection.routing.item_path; return toHref(pattern ? pattern.replace("{slug}", item.slug || item.id) : "/"); } function itemLabel(item) { if (item.type === "product") return "View object"; if (item.type === "project") return "View project"; if (item.type === "service") return "Explore service"; if (item.type === "person") return "Meet " + String(item.title || "").split(" ")[0]; return "Read article"; } function renderCard(collection, item) { var image = item.media && (item.media.featured || item.media.image || item.media.thumbnail); var attrs = item.attributes || {}; var meta = cardMeta(item); return '<article class="a-card' + (image ? "" : " no-media") + '">' + (image ? '<a class="a-card-media" href="' + esc(itemHref(collection, item)) + '">' + assetImg(image, item.title) + "</a>" : "") + '<div class="a-card-body">' + (!image && attrs.icon ? '<div class="a-card-icon">' + iconSvg(attrs.icon, 21) + "</div>" : "") + (meta.length ? '<div class="a-card-meta">' + meta.map(function (value) { return "<span>" + esc(value) + "</span>"; }).join("") + "</div>" : "") + "<h3>" + esc(item.title || "") + "</h3>" + (item.summary ? "<p>" + esc(item.summary) + "</p>" : "") + (attrs.price_display ? '<div class="a-card-price">' + esc(attrs.price_display) + "</div>" : "") + '<a class="a-more" href="' + esc(itemHref(collection, item)) + '">' + esc(itemLabel(item)) + iconSvg("arrow-right") + "</a>" + "</div></article>"; } var RENDERERS = { hero: function (section) { var heading = section.heading || {}, media = section.media || {}; var imageRef = media.primary || media.asset || media.image || media.background; return '<section class="a-hero"><div class="a-wrap"><div class="a-hero-grid' + (asset(imageRef) ? "" : " a-hero-single") + '">' + '<div class="a-hero-copy">' + (heading.eyebrow ? '<span class="a-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + "<h1>" + esc(heading.title || get("site.name", "")) + "</h1>" + (heading.subtitle ? '<p class="a-lede">' + esc(heading.subtitle) + "</p>" : "") + (heading.description ? '<p class="a-hero-desc">' + esc(heading.description) + "</p>" : "") + actionRow(section.actions) + "</div>" + (asset(imageRef) ? '<div class="a-hero-media">' + assetImg(imageRef, heading.title, "", true) + "</div>" : "") + "</div></div></section>"; }, page_header: function (section) { var heading = section.heading || {}, media = section.media || {}; var imageRef = media.primary || media.asset || media.image || media.background; return '<section class="a-page-head"><div class="a-wrap"><div class="a-page-head-grid' + (asset(imageRef) ? "" : " a-hero-single") + '"><div>' + (heading.eyebrow ? '<span class="a-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + "<h1>" + esc(heading.title || "") + "</h1>" + (heading.subtitle ? '<p class="a-lede">' + esc(heading.subtitle) + "</p>" : "") + "</div>" + (asset(imageRef) ? '<div class="a-page-banner">' + assetImg(imageRef, heading.title, "", true) + "</div>" : "") + "</div></div></section>"; }, rich_text: function (section) { return '<section class="a-section"><div class="a-wrap">' + sectionHeading(section.heading) + '<div class="a-rich">' + richContent(section.content) + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "a-hero-actions a-section-actions") : "") + "</div></section>"; }, split_content: function (section, index) { var media = section.media || {}, imageRef = media.primary || media.asset || media.image || media.background; return '<section class="a-section' + (index % 2 ? " alt" : "") + '"><div class="a-wrap"><div class="a-split' + (section.variant === "reverse" ? " reverse" : "") + '">' + '<div class="a-split-copy">' + sectionHeading(section.heading) + '<div class="a-rich">' + richContent(section.content) + "</div>" + actionRow(section.actions) + "</div>" + (asset(imageRef) ? '<div class="a-split-media">' + assetImg(imageRef, (section.heading || {}).title) + "</div>" : "") + "</div></div></section>"; }, stats: function (section) { var items = (section.data || {}).items || []; if (!items.length) return ""; return '<section class="a-stats-section"><div class="a-wrap">' + sectionHeading(section.heading) + '<div class="a-stats" style="--a-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return '<div class="a-stat"><div class="a-stat-value">' + esc(item.value) + '</div><div class="a-stat-label">' + esc(item.label) + "</div></div>"; }).join("") + "</div></div></section>"; }, collection: function (section) { var collection = collectionFromSource(section.source); if (!collection) return ""; var limit = section.source && section.source.limit; var items = publishedItems(collection, limit || 6, section.source && section.source.sort); if (!items.length) return ""; return '<section class="a-section alt"><div class="a-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="a-grid" style="--a-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return renderCard(collection, item); }).join("") + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "a-hero-actions a-section-actions") : "") + "</div></section>"; }, gallery: function (section) { var collection = collectionFromSource(section.source); var items = publishedItems(collection, (section.source && section.source.limit) || 12); var allowLightbox = !section.data || section.data.allow_lightbox !== false; if (!items.length) return ""; var figures = items.map(function (item) { var ref = item.media && (item.media.featured || item.media.image); var found = asset(ref); if (!found) return ""; var attrs = item.attributes || {}; var meta = [attrs.place, attrs.year, attrs.stage].filter(Boolean).join(" · "); var imageMarkup = assetImg(ref, item.title); if (allowLightbox) imageMarkup = '<button type="button" class="a-gallery-button" data-lightbox="' + esc(found.src) + '" data-caption="' + esc(item.title || item.summary || "") + '">' + imageMarkup + "</button>"; else imageMarkup = '<a class="a-gallery-button" href="' + esc(itemHref(collection, item)) + '">' + imageMarkup + "</a>"; return "<figure>" + imageMarkup + "<figcaption>" + (item.title ? '<div class="a-fig-title">' + esc(item.title) + "</div>" : "") + (item.summary ? '<div class="a-fig-sub">' + esc(item.summary) + "</div>" : "") + (meta ? '<div class="a-meta">' + esc(meta) + "</div>" : "") + "</figcaption></figure>"; }).join(""); return '<section class="a-section"><div class="a-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="a-gallery">' + figures + "</div>" + (section.actions && section.actions.length ? actionRow(section.actions, "a-hero-actions a-section-actions") : "") + "</div></section>"; }, people: function (section) { var collection = collectionFromSource(section.source); var items = publishedItems(collection); if (!items.length) return ""; return '<section class="a-section"><div class="a-wrap">' + sectionHeading(section.heading || { title: collection.label, subtitle: collection.description }) + '<div class="a-people" style="--a-cols:' + columnsFor(items.length) + '">' + items.map(function (person) { var role = (person.attributes || {}).position || person.summary || ""; return '<a class="a-person" href="' + esc(itemHref(collection, person)) + '"><div class="a-person-image">' + assetImg(person.media && person.media.featured, person.title) + "</div><h3>" + esc(person.title) + '</h3><div class="role">' + esc(role) + "</div></a>"; }).join("") + "</div></div></section>"; }, testimonials: function (section) { var items = (section.data || {}).items || []; if (!items.length) return ""; return '<section class="a-section alt"><div class="a-wrap">' + sectionHeading(section.heading) + '<div class="a-testimonials" style="--a-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return '<article class="a-quote-card"><div class="a-quote-mark">“</div><blockquote>' + esc(item.quote) + '</blockquote><div class="a-quote-name">' + esc(item.name || "") + '</div><div class="a-quote-detail">' + esc(item.detail || "") + "</div></article>"; }).join("") + "</div></div></section>"; }, call_to_action: function (section) { var heading = section.heading || {}; return '<section class="a-section"><div class="a-wrap"><div class="a-cta-band"><div class="a-cta-band-copy">' + (heading.eyebrow ? '<span class="a-eyebrow">' + esc(heading.eyebrow) + "</span>" : "") + "<h2>" + esc(heading.title || "") + "</h2>" + (heading.subtitle ? "<p>" + esc(heading.subtitle) + "</p>" : "") + "</div>" + actionRow(section.actions) + "</div></div></section>"; }, contact: function (section) { var emails = get("contact.emails", []), phones = get("contact.phones", []), addresses = get("contact.addresses", []), hours = get("contact.business_hours", []); return '<section class="a-section alt"><div class="a-wrap">' + sectionHeading(section.heading || { title: "Contact" }) + '<div class="a-contact-grid">' + '<article class="a-contact-card"><h3>Write or call</h3><dl>' + emails.map(function (entry) { var value = contactValue(entry); return "<dt>" + esc(entry.label || "Email") + '</dt><dd><a href="mailto:' + esc(value) + '">' + esc(value) + "</a></dd>"; }).join("") + phones.map(function (entry) { var value = contactValue(entry); return "<dt>" + esc(entry.label || "Phone") + '</dt><dd><a href="tel:' + esc(value) + '">' + esc(value) + "</a></dd>"; }).join("") + "</dl></article>" + '<article class="a-contact-card"><h3>Visit</h3><dl>' + addresses.map(function (entry) { return "<dt>" + esc(entry.label || "Address") + "</dt><dd>" + esc(addressLine(entry)) + "</dd>"; }).join("") + "</dl></article>" + '<article class="a-contact-card"><h3>Opening hours</h3><table class="a-hours">' + hours.map(function (entry) { return "<tr><td>" + esc(hoursDays(entry)) + "</td><td>" + esc(entry.closed ? "Closed" : (entry.opens || "") + " – " + (entry.closes || "")) + "</td></tr>"; }).join("") + "</table></article></div></div></section>"; }, form: function (section) { var source = section.source || {}; var form = (DATA.forms || {})[source.form || source.ref]; if (!form) return ""; var fields = (form.fields || []).map(function (field) { var id = "field-" + field.id; var full = field.type === "textarea" ? " full" : ""; var required = field.required ? " required" : ""; var requiredMark = field.required ? ' <span class="a-required" aria-hidden="true">*</span>' : ""; var control = ""; if (field.type === "textarea") { control = '<textarea id="' + esc(id) + '" name="' + esc(field.id) + '" placeholder="' + esc(field.placeholder || "") + '"' + required + "></textarea>"; } else if (field.type === "select") { control = '<select id="' + esc(id) + '" name="' + esc(field.id) + '"' + required + '><option value="">' + esc(field.placeholder || "Select") + "</option>" + (field.options || []).map(function (option) { var value = typeof option === "string" ? option : option.value; var label = typeof option === "string" ? option : option.label; return '<option value="' + esc(value) + '">' + esc(label) + "</option>"; }).join("") + "</select>"; } else { control = '<input id="' + esc(id) + '" name="' + esc(field.id) + '" type="' + esc(field.type || "text") + '" placeholder="' + esc(field.placeholder || "") + '"' + required + ">"; } return '<div class="a-field' + full + '"><label for="' + esc(id) + '">' + esc(field.label || field.id) + requiredMark + "</label>" + control + "</div>"; }).join(""); return '<section class="a-section"><div class="a-wrap"><div class="a-form-shell"><div class="a-form-copy">' + sectionHeading(section.heading || { title: form.title, subtitle: form.description }) + '</div><form class="a-form" data-form-id="' + esc(form.id) + '" action="' + esc(form.action || "") + '" method="' + esc(form.method || "POST") + '"><div class="a-form-grid">' + fields + '</div><div class="a-form-footer"><p class="a-form-note">Fields marked * are required.</p><button class="a-btn a-btn-primary" type="submit">' + esc(form.submit_label || "Send") + iconSvg("arrow-right") + '</button></div><div class="a-form-status" data-form-status hidden></div></form></div></div></section>'; } }; function renderPage(page) { var markup = (page.sections || []).filter(function (section) { return section.enabled !== false; }).map(function (section, index) { var renderer = RENDERERS[section.type]; return renderer ? renderer(section, index) : ""; }).join(""); html(el("main"), markup || emptyState("This page has no published sections.", "/")); var seo = page.seo || {}; applySeo(seo.title || page.title, seo.description, seo.image); } function collectionHeading(collection) { return '<section class="a-page-head"><div class="a-wrap"><div class="a-page-head-grid a-hero-single"><div>' + '<div class="a-breadcrumbs"><a href="' + esc(toHref("/")) + '">Home</a><span>/</span><span>' + esc(collection.label) + "</span></div>" + '<span class="a-eyebrow">Collection</span><h1>' + esc(collection.label || "") + "</h1>" + (collection.description ? '<p class="a-lede">' + esc(collection.description) + "</p>" : "") + "</div></div></div></section>"; } function renderCollectionPage(collection) { var items = publishedItems(collection); html(el("main"), collectionHeading(collection) + '<section class="a-section alt"><div class="a-wrap"><div class="a-grid" style="--a-cols:' + columnsFor(items.length) + '">' + items.map(function (item) { return renderCard(collection, item); }).join("") + "</div></div></section>"); applySeo(collection.label, collection.description, items[0] && items[0].media && items[0].media.featured); } function itemMeta(item) { var attrs = item.attributes || {}, dates = item.dates || {}; if (item.type === "project") return [attrs.place, attrs.year, attrs.stage, attrs.area].filter(Boolean); if (item.type === "article") return [formatDate(dates.published_at || dates.published), attrs.reading_time].filter(Boolean); if (item.type === "service") return [attrs.lead_time, attrs.starting_from].filter(Boolean); if (item.type === "product") return [attrs.price_display, attrs.edition, attrs.availability && String(attrs.availability).replace(/_/g, " ")].filter(Boolean); if (item.type === "person") return [attrs.position, attrs.department].filter(Boolean); return []; } function itemSpecs(item) { var attrs = item.attributes || {}, specs = (attrs.specifications || []).slice(); if (attrs.sku) specs.push({ label: "Reference", value: attrs.sku }); if (attrs.lead_time) specs.push({ label: "Typical timeline", value: attrs.lead_time }); if (attrs.starting_from) specs.push({ label: "Fee guide", value: attrs.starting_from }); if (attrs.area) specs.push({ label: "Area", value: attrs.area }); if (attrs.place) specs.push({ label: "Location", value: attrs.place }); return specs; } function renderItemPage(collection, item) { var image = item.media && item.media.featured; var meta = itemMeta(item); var specs = itemSpecs(item); var gallery = item.media && item.media.gallery || []; var related = publishedItems(collection).filter(function (candidate) { return candidate.id !== item.id; }).slice(0, 3); var eyebrow = collection.singular_label || item.type || "Detail"; var body = '<section class="a-detail-hero"><div class="a-wrap"><div class="a-detail-grid"><div>' + '<div class="a-breadcrumbs"><a href="' + esc(toHref("/")) + '">Home</a><span>/</span><a href="' + esc(toHref(collection.routing && collection.routing.index_path || "/")) + '">' + esc(collection.label) + "</a><span>/</span><span>" + esc(item.title) + "</span></div>" + '<span class="a-eyebrow">' + esc(eyebrow) + "</span><h1>" + esc(item.title || "") + "</h1>" + (item.summary ? '<p class="a-lede">' + esc(item.summary) + "</p>" : "") + (meta.length ? '<div class="a-detail-meta">' + meta.map(function (value) { return "<span>" + esc(value) + "</span>"; }).join("") + "</div>" : "") + actionRow(item.actions) + "</div>" + (asset(image) ? '<div>' + assetImg(image, item.title, "", true) + "</div>" : "") + "</div></div></section>"; body += '<section class="a-section alt"><div class="a-wrap"><div class="a-detail-body"><div><div class="a-rich">' + richContent(item.body) + "</div>" + (gallery.length ? '<div class="a-detail-gallery">' + gallery.map(function (ref) { return assetImg(ref, item.title); }).join("") + "</div>" : "") + "</div>" + (specs.length ? '<aside class="a-detail-aside"><h3>Details</h3><dl class="a-specs">' + specs.map(function (spec) { return "<div><dt>" + esc(spec.label) + "</dt><dd>" + esc(spec.value) + "</dd></div>"; }).join("") + "</dl></aside>" : "") + "</div></div></section>"; if (related.length) { body += '<section class="a-section"><div class="a-wrap">' + sectionHeading({ eyebrow: "More to explore", title: "Related " + String(collection.label || "items").toLowerCase() }) + '<div class="a-grid" style="--a-cols:' + columnsFor(related.length) + '">' + related.map(function (candidate) { return renderCard(collection, candidate); }).join("") + "</div></div></section>"; } html(el("main"), body); applySeo(item.title, item.summary, image); } function emptyState(message, href) { return '<section class="a-section"><div class="a-wrap"><span class="a-eyebrow">404</span><h1>Page not found</h1><p class="a-lede">' + esc(message) + '</p><div class="a-hero-actions"><a class="a-btn a-btn-primary" href="' + esc(toHref(href || "/")) + '">Back to the homepage</a></div></div></section>'; } function renderRoute(route) { if (route.kind === "redirect") { history.replaceState({}, "", toHref(route.path)); route = resolveRoute(route.path); } if (route.kind === "page") renderPage(route.page); else if (route.kind === "collection") renderCollectionPage(route.collection); else if (route.kind === "item") renderItemPage(route.collection, route.item); else { html(el("main"), emptyState("The address may be outdated, or the content may no longer be published.", "/")); applySeo("Page not found", "The requested page could not be found."); } renderHeader(); reveal(); } function showToast(message) { var node = el("toast"); if (!node) return; node.textContent = message; show(node, true); clearTimeout(toastTimer); toastTimer = setTimeout(function () { show(node, false); }, 4200); } function openLightbox(src, caption) { var lightbox = el("lightbox"), stage = el("lightbox-stage"); if (!lightbox || !stage) return; html(stage, '<img src="' + esc(src) + '" alt="' + esc(caption || "") + '">' + (caption ? "<p>" + esc(caption) + "</p>" : "")); show(lightbox, true); document.body.style.overflow = "hidden"; var close = root.querySelector('[data-action="lightbox-close"]'); if (close) close.focus(); } function closeLightbox() { show(el("lightbox"), false); document.body.style.overflow = ""; } function handleFormSubmit(formNode) { var id = formNode.getAttribute("data-form-id"); var config = (DATA.forms || {})[id] || {}; var status = formNode.querySelector("[data-form-status]"); if (!formNode.reportValidity()) return; var formData = new FormData(formNode); var entries = []; formData.forEach(function (value, key) { var field = (config.fields || []).filter(function (candidate) { return candidate.id === key; })[0]; entries.push((field ? field.label : key) + ": " + value); }); var action = config.action || formNode.action || ""; if (action.indexOf("mailto:") === 0) { var email = action.slice(7); var subject = "Website enquiry from " + (formData.get("name") || "a visitor"); location.href = "mailto:" + encodeURIComponent(email).replace(/%40/g, "@") + "?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(entries.join("\n\n")); if (status) { status.textContent = config.success_message || "Your email application should open now."; show(status, true); } return; } if (!action) { if (status) { status.textContent = config.error_message || "No form endpoint is configured."; show(status, true); } return; } var button = formNode.querySelector('button[type="submit"]'); if (button) button.disabled = true; fetch(action, { method: config.method || formNode.method || "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(Object.fromEntries(formData.entries())) }).then(function (response) { if (!response.ok) throw new Error("HTTP " + response.status); formNode.reset(); if (status) { status.textContent = config.success_message || "Thank you. Your message has been sent."; show(status, true); } }).catch(function () { if (status) { status.textContent = config.error_message || "The message could not be sent."; show(status, true); } }).finally(function () { if (button) button.disabled = false; }); } function navigate(path, replace) { var clean = normalizePath(path); if (replace) history.replaceState({}, "", toHref(clean)); else history.pushState({}, "", toHref(clean)); renderRoute(resolveRoute(clean)); var header = el("header"); if (header) header.classList.remove("is-open"); document.body.classList.remove("a-nav-open"); var burger = root.querySelector('[data-action="menu"]'); if (burger) burger.setAttribute("aria-expanded", "false"); window.scrollTo({ top: 0, behavior: "auto" }); var main = el("main"); if (main) main.focus({ preventScroll: true }); } function bindBehaviour() { var header = el("header"); var burger = root.querySelector('[data-action="menu"]'); if (burger && header) { burger.addEventListener("click", function () { var open = header.classList.toggle("is-open"); burger.setAttribute("aria-expanded", open ? "true" : "false"); burger.setAttribute("aria-label", open ? "Close navigation" : "Open navigation"); document.body.classList.toggle("a-nav-open", open); }); } var modeButton = root.querySelector('[data-action="mode"]'); if (modeButton) modeButton.addEventListener("click", function () { var next = CURRENT_MODE === "dark" ? "light" : "dark"; storageSet(get("site.id", "site") + ":mode", next); applyBranding(next); showToast(next === "dark" ? "Dark mode enabled" : "Light mode enabled"); }); root.addEventListener("click", function (event) { var close = event.target.closest && event.target.closest('[data-action="lightbox-close"]'); if (close || event.target === el("lightbox")) { closeLightbox(); return; } var preview = event.target.closest && event.target.closest("[data-lightbox]"); if (preview) { event.preventDefault(); openLightbox(preview.getAttribute("data-lightbox"), preview.getAttribute("data-caption")); return; } var link = event.target.closest && event.target.closest("a[href]"); if (!link || link.target === "_blank" || link.hasAttribute("download")) return; var href = link.getAttribute("href") || ""; if (/^(mailto:|tel:|javascript:|#)/i.test(href)) return; var url = new URL(link.href, location.href); if (url.origin !== location.origin) return; var route = resolveRoute(url.pathname); if (route.kind === "not-found") return; event.preventDefault(); navigate(url.pathname, false); }); root.addEventListener("submit", function (event) { var form = event.target.closest && event.target.closest("form[data-form-id]"); if (!form) return; event.preventDefault(); handleFormSubmit(form); }); window.addEventListener("popstate", function () { renderRoute(resolveRoute(currentPath())); window.scrollTo({ top: 0, behavior: "auto" }); }); document.addEventListener("keydown", function (event) { if (event.key === "Escape") closeLightbox(); }); } function reveal() { if (!("IntersectionObserver" in window)) return; var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("is-in"); observer.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -7% 0px" }); root.querySelectorAll("main > section").forEach(function (section, index) { if (index === 0) return; section.classList.add("a-reveal"); observer.observe(section); }); } function start(payload) { DATA = payload; show(el("loading"), false); if (!payload || payload.status === "maintenance" || get("site.status", "published") === "maintenance") { var maintenance = payload && payload.maintenance || {}; html(el("maintenance-title"), esc(maintenance.headline || "Site under maintenance")); html(el("maintenance-message"), esc(maintenance.message || "Please check back soon.")); show(el("maintenance"), true); document.title = maintenance.headline || "Site under maintenance"; return; } applyBranding(); show(el("site"), true); renderFooter(); renderRoute(resolveRoute(currentPath())); bindBehaviour(); } function fail(error) { if (window.console) console.error(error); show(el("loading"), false); show(el("error"), true); } if (CONFIG.payload) start(CONFIG.payload); else if (CONFIG.api) { fetch(CONFIG.api, { credentials: "omit" }).then(function (response) { if (!response.ok) throw new Error("HTTP " + response.status); return response.json(); }).then(start).catch(fail); } else fail(new Error("No payload or API URL configured.")); })(); </script> </body> </html>Evidence <noscript> &lt;div class="a-noscript"&gt;This website needs JavaScript to render its JSON content.&lt;/div&gt; </noscript>Solution This is an informational alert and so no changes are required.
-
Session Management Response Identified (1)
GET https://sites.wons.bt
Alert tags Alert description The given response has been identified as containing a session management token. The 'Other Info' field contains a set of header tokens that can be used in the Header Based Session Management Method. If the request is in a context which has a Session Management Method set to "Auto-Detect" then this rule will change the session management to use the tokens identified.
Other info cookie:wons_csrf
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Parameter wons_csrfEvidence wons_csrfSolution This is an informational alert rather than a vulnerability and so there is nothing to fix.
-
User Agent Fuzzer (1)
GET https://sites.wons.bt/
Alert tags Alert description Check for differences in response based on fuzzed User Agent (eg. mobile sites, access as a Search Engine Crawler). Compares the response statuscode and the hashcode of the response body with the original response.
Request Request line and header section (469 bytes)
GET https://sites.wons.bt/ HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Connection: keep-alive Cookie: wons_csrf=7MjMV85dc1ZdN5x79yOE.3d4f59497ad5fcd3369e9f0c32e5fd5a Upgrade-Insecure-Requests: 1 Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Priority: u=0, iRequest body (0 bytes)
Response Status line and header section (279 bytes)
HTTP/1.1 403 Forbidden Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:48:59 GMT Content-Type: application/json Content-Length: 52 Connection: keep-alive Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Xss-Protection: 1; mode=blockResponse body (52 bytes)
{"data":{},"message":"Access denied.","status":403}Parameter Header User-AgentAttack Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)
-
-
-
Risk=Informational, Confidence=Low (2)
-
https://sites.wons.bt (2)
-
Re-examine Cache-control Directives (1)
GET https://sites.wons.bt
Alert tags Alert description The cache-control header has not been set properly or is missing, allowing the browser and proxies to cache content. For static assets like css, js, or image files this might be intended, however, the resources should be reviewed to ensure that no sensitive content will be cached.
Request Request line and header section (227 bytes)
GET https://sites.wons.bt HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cacheRequest body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:54 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-iB8Q5DnSVjWx_AOLdlto8Q' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=y550JyNiyw54uLkFFzWS.e2ec5c27689fa4cf2714635ce48a4a48; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 81797Response body (81797 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>WONS Sites — your website, edited like a dashboard</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=9821682f6dcdfe2a0cd279db1dd9c9d12d0cc8dda08970ee8913adbff07f2aee"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=3ac7de0667a74e2dd9a505b782187df00961b7c1becb2295ec58ea7be28ed09d" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819373&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=394107603c20e2e16f57f48cc71aeda97460e22e87ebcf8ec27284364a7ea208" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="hero bleed"> <div class="hero-art" aria-hidden="true"> <div class="hero-shot hs-a"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-b"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> <div class="hero-shot hs-c"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" tabindex="-1" scrolling="no" aria-hidden="true" sandbox="allow-scripts"></iframe> </div> </div> <div class="hero-veil" aria-hidden="true"></div> <div class="hero-inner band-inner"> <div class="hero-meta"> <div class="hm"> <span class="hm-k">Plan</span> <span class="hm-v">Free forever</span> <span class="hm-n">No card, nothing to cancel</span> </div> <div class="hm"> <span class="hm-k">Address</span> <span class="hm-v">yourname.sites.wons.bt</span> <span class="hm-n">Included the moment you sign up</span> </div> <div class="hm hm-last"> <span class="hm-k">Themes</span> <span class="hm-v">15 to choose from</span> <span class="hm-n">Switch any time, content stays</span> </div> </div> <div class="hero-body"> <h1 class="hero-title">Build a website.<br>Share your world.</h1> <div class="hero-foot"> <div class="hero-actions"> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <a class="btn btn-outline-band btn-lg" href="#looks">See the themes</a> </div> <p class="hero-note"> For shops, schools, communities, creators and small organisations. No coding, and nothing to buy before you begin. </p> </div> </div> </div> </section> <section class="section reasons" id="why"> <h2 class="d-xl reasons-title rv">Reasons to<br>start today</h2> <div class="reasons-copy rv"> <p> <em>A website you can keep up to date yourself.</em> Most sites go stale because changing one line means calling whoever built it. Here every part of the page is a form — <em>a rate, a menu, an opening hour, a photograph</em> — and the change is live on the next visit. </p> <p> Your content lives here. <em>Your site can stay wherever it is hosted today</em>, reading everything from one address. </p> </div> </section> <section class="section statement"> <p class="d-thin statement-line rv">A brochure site costs<br>Nu. 40,000 – 90,000 to rebuild</p> <div class="range rv"> <span class="range-a">Rebuild</span> <span class="range-arrow" aria-hidden="true"> <svg viewBox="0 0 120 12" preserveAspectRatio="none"><path d="M2 6h108M104 2l7 4-7 4" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg> </span> <span class="range-b">Free</span> <span class="range-tail">to start here</span> </div> </section> <section class="section tilt-section" id="product"> <div class="tilt-head rv"> <span class="kicker">Yours to change</span> <h2>The things that actually go out of date.</h2> </div> <div class="tilt-row" aria-label="Examples of content you edit yourself"> <figure class="tilt-card ct-a"> <span class="tc-field">Room rate</span> <span class="tc-value">Nu. 3,500 / night</span> <figcaption class="tc-note">Before the season turns</figcaption> </figure> <figure class="tilt-card ct-b"> <span class="tc-field">Today's menu</span> <span class="tc-value">Ema datshi, red rice</span> <figcaption class="tc-note">From your phone</figcaption> </figure> <figure class="tilt-card ct-c"> <span class="tc-field">Opening hours</span> <span class="tc-value">Closed for Losar</span> <figcaption class="tc-note">Set it and forget it</figcaption> </figure> <figure class="tilt-card ct-d"> <span class="tc-field">Team</span> <span class="tc-value">Pema — Front desk</span> <figcaption class="tc-note">A new photo when someone joins</figcaption> </figure> <figure class="tilt-card ct-e"> <span class="tc-field">Tour dates</span> <span class="tc-value">Mar 14 – Mar 22</span> <figcaption class="tc-note">Next spring, added early</figcaption> </figure> <figure class="tilt-card ct-f"> <span class="tc-field">Notice</span> <span class="tc-value">Road open again</span> <figcaption class="tc-note">Across the top of every page</figcaption> </figure> </div> </section> <section class="band band-dark bleed" id="how"> <div class="band-inner"> <h2 class="d-lg steps-title">How it goes</h2> <p class="steps-sub">Three screens between an empty account and a site people can read.</p> <div class="steps"> <details class="step" open> <summary class="step-head"> <span class="step-n">01</span> <span class="step-kind">Sign up</span> <span class="step-time">About a minute</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Create your workspace</h3> <div class="step-tags"> <span class="step-tag">Free plan</span><span class="step-tag">No card</span> </div> </div> <div class="step-right"> <p class="step-lede">One form. An organisation name, an email and a password.</p> <p class="step-body">Your workspace is created and you are taken straight into the dashboard. The email confirmation is for account recovery — it does not hold anything up.</p> <a class="btn btn-accent btn-sm" href="/signup">Create a workspace</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">02</span> <span class="step-kind">Fill it in</span> <span class="step-time">As long as you like</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Put your content in</h3> <div class="step-tags"> <span class="step-tag">Forms</span><span class="step-tag">Your images</span> </div> </div> <div class="step-right"> <p class="step-lede">Pages, photos, contact details, opening hours — in forms, not code.</p> <p class="step-body">Photographs are stripped of their location data on upload and served through links that expire, so an address in a camera's metadata never reaches the public site.</p> <a class="btn btn-accent btn-sm" href="#product">See what you can change</a> </div> </div> </details> <details class="step" > <summary class="step-head"> <span class="step-n">03</span> <span class="step-kind">Go live</span> <span class="step-time">One page of instructions</span> <span class="step-chev" aria-hidden="true"> <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 15l6-6 6 6"/></svg> </span> </summary> <div class="step-card"> <div class="step-left"> <h3 class="step-title">Point your site here</h3> <div class="step-tags"> <span class="step-tag">One file</span><span class="step-tag">We help</span> </div> </div> <div class="step-right"> <p class="step-lede">Use the address that comes with the account, or your own domain.</p> <p class="step-body">Dashboard → Install generates one index.html or index.php for your host, with your title, description and social preview already in it. Drop it in place and the site reads everything from here.</p> <a class="btn btn-accent btn-sm" href="/docs">Read the install guide</a> </div> </div> </details> </div> </div> </section> <section class="band band-dark bleed" id="looks"> <div class="band-inner"> <div class="looks-head"> <h2 class="d-lg">Start with a<br>design you love</h2> <div class="looks-aside"> <span class="looks-count">15 themes</span> <p class="looks-note"> Every card below is the theme itself, rendering the same demo site with the same code your own site would run. Nothing here is a screenshot that can drift out of date. </p> </div> </div> <div class="looks"> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/vantage" title="Vantage — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Vantage</h3> <p class="look-tag">Dark-first tech and professional services.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#2dd4bf" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#22d3ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#e7edf3" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0b0d10" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#171c22" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#vantage"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/aster" title="Aster — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Aster</h3> <p class="look-tag">Clean editorial layout for hotels, offices and organisations.</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#5b3428" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#c99b3d" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#1d2422" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#f8f5ee" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#eae2d4" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#aster"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> <article class="look"> <div class="look-shot"> <iframe class="pv" src="/theme-preview/verdant" title="Verdant — preview" loading="lazy" tabindex="-1" scrolling="no" sandbox="allow-scripts"></iframe> </div> <div class="look-meta"> <h3 class="look-name">Verdant</h3> <p class="look-tag">Dark Botanical Luxe Theme</p> <div class="look-swatch"><svg class="swatch-svg" viewBox="0 0 118 18" width="118" height="18" role="presentation" aria-hidden="true" focusable="false"><circle cx="9" cy="9" r="8.25" fill="#c39a4e" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="34" cy="9" r="8.25" fill="#e0b674" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="59" cy="9" r="8.25" fill="#f0e9d8" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="84" cy="9" r="8.25" fill="#0d1712" stroke="rgba(0,0,0,.16)" stroke-width="1"/><circle cx="109" cy="9" r="8.25" fill="#152219" stroke="rgba(0,0,0,.16)" stroke-width="1"/></svg></div> <a class="look-link" href="/themes#verdant"> Look closer <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </div> </article> </div> <div class="looks-foot"> <a class="btn btn-onband" href="/themes"> Browse all 15 themes <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> <span class="looks-more">Switching later never touches what you wrote.</span> </div> </div> </section> <section class="band band-dark bleed band-tight"> <div class="band-inner"> <div class="feat-head"> <h2 class="d-lg">Works with the host<br>you already have</h2> <a class="btn btn-onband" href="/signup">Start your site</a> </div> <div class="feats"> <div class="feat"> <span class="feat-n">01</span> <h3 class="feat-title">Everything in one place</h3> <p class="feat-body">Your pages, photos, menus, opening hours, staff and services. Change them in a form; the site shows the change on the next visit.</p> </div> <div class="feat"> <span class="feat-n">02</span> <h3 class="feat-title">An address, included</h3> <p class="feat-body">Every site gets its own address the moment you create it, so there is nothing to buy before you begin. Bring your own domain later if you want one.</p> </div> <div class="feat"> <span class="feat-n">03</span> <h3 class="feat-title">Themes you can switch</h3> <p class="feat-body">Change how the site looks without touching a word of what you wrote. Your colours, logo and type carry across.</p> </div> <div class="feat"> <span class="feat-n">04</span> <h3 class="feat-title">We help you go live</h3> <p class="feat-body">Already have a domain or a host? Tell us and we will set it up with you. There is one small file to put in place, and we will walk you through it.</p> </div> </div> </div> </section> <section class="band band-paper bleed" id="pricing"> <div class="band-inner"> <div class="price-head"> <h2 class="d-lg">Start free.<br>Pay when it earns it.</h2> <p class="price-sub"> Priced against what a rebuild costs, not against what a page of HTML costs. Every plan keeps the site current instead of shipping it once. </p> </div> <article class="plan-hero"> <div class="plan-hero-main"> <span class="plan-kicker">Free</span> <p class="plan-tagline">Your site online at no cost, supported by adverts.</p> <div class="plan-price">Free<span>forever</span></div> <p class="plan-anchor">No money. Your pages carry adverts instead.</p> <a class="btn btn-onband btn-block btn-lg" href="/signup?plan=free">Choose Free</a> <p class="plan-note">No card. Nothing to cancel.</p> </div> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> </article> <div class="ladder-head"> <h3>Outgrown the adverts?</h3> <p>Paid plans remove them, from Nu. 299 a year.</p> </div> <div class="ladder"> <a class="ladder-item" href="/signup?plan=lifesaver"> <span class="ladder-name">Life Saver</span> <span class="ladder-price">Nu. 299<span>per year</span></span> <span class="ladder-note">Supported by local Ads</span> </a> <a class="ladder-item" href="/signup?plan=starter"> <span class="ladder-name">Starter</span> <span class="ladder-price">Nu. 999<span>per year</span></span> <span class="ladder-note">One site, the essentials.</span> </a> <a class="ladder-item ladder-best" href="/signup?plan=business"> <span class="ladder-name">Business <em>most chosen</em></span> <span class="ladder-price">Nu. 1,599<span>per year</span></span> <span class="ladder-note">More space, Full analytics.</span> </a> <a class="ladder-item" href="/signup?plan=agency"> <span class="ladder-name">Agency</span> <span class="ladder-price">Nu. 2,599<span>per year</span></span> <span class="ladder-note">Triple pack, white-labelled.</span> </a> </div> <details class="compare"> <summary>Compare every plan in full</summary> <div class="compare-grid"> <div class="compare-col"> <span class="plan-kicker">Free</span> <div class="compare-price">Free<span>forever</span></div> <p class="compare-anchor">No money. Your pages carry adverts instead.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Adverts shown on your pages</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=free">Choose Free</a> </div> <div class="compare-col"> <span class="plan-kicker">Life Saver</span> <div class="compare-price">Nu. 299<span>per year</span></div> <p class="compare-anchor">About Nu. 25 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>20 MB assets</li><li>Free themes included</li><li>Your site online, free forever</li><li>Local adverts only</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=lifesaver">Choose Life Saver</a> </div> <div class="compare-col"> <span class="plan-kicker">Starter</span> <div class="compare-price">Nu. 999<span>per year</span></div> <p class="compare-anchor">About Nu. 83 a month to keep your site current.</p> <ul class="plan-list"> <li>1 site, 1 domain</li><li>50 MB assets</li><li>Free themes included</li><li>White-label dashboard</li><li>Email Support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=starter">Start with Starter</a> </div> <div class="compare-col"> <span class="plan-kicker">Business</span> <div class="compare-price">Nu. 1,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 800 per site, for 1 year.</p> <ul class="plan-list"> <li>2 sites, 2 domains</li><li>200 MB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics + priority support</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=business">Choose Business</a> </div> <div class="compare-col"> <span class="plan-kicker">Agency</span> <div class="compare-price">Nu. 2,599<span>per year</span></div> <p class="compare-anchor">Around Nu. 866 per site, for 1 year.</p> <ul class="plan-list"> <li>3 sites, 3 domains</li><li>1 GB assets</li><li>All themes included</li><li>White-label dashboard</li><li>Analytics</li> </ul> <a class="btn btn-ghost btn-sm btn-block" href="/signup?plan=agency">Talk to us</a> </div> </div> </details> </div> </section> <section class="section faq-section" id="questions"> <div class="faq-head rv"> <h2 class="d-lg">Answering the<br>main things</h2> <p class="faq-sub">If yours is not here, write to us — a person in Thimphu answers.</p> </div> <div class="faq rv"> <details class="qa" open> <summary> <span class="qa-q">Do I need to buy a domain?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. Your site gets an address the moment you create it and works straight away. If you would rather use your own domain, you can add it later without starting again — and we will help you point it here.</p> </details> <details class="qa" > <summary> <span class="qa-q">I already have a website. Do I throw it away?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">No. If you like how it looks, it can keep its host and its address and take its content from here instead — one small file changes hands and we set that up with you. If you do not like how it looks, pick a theme.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens when I get stuck?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">You write to us and a person in Thimphu answers. Setting up a domain, moving an old site across, or a theme built for you — those are things we do, not things you are left to work out.</p> </details> <details class="qa" > <summary> <span class="qa-q">Can I change theme after the site is live?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Yes, and it does not touch a word of what you wrote. Content and look are stored separately: the theme is three files served from here, your content is the data behind them. Switch, look at it, switch back if you prefer the old one.</p> </details> <details class="qa" > <summary> <span class="qa-q">What happens if I stop paying?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">The site stays where it is and starts serving its own maintenance page instead of your content, and we email you every day until it is sorted. Nothing is deleted while that is going on — renew and the same pages come straight back.</p> </details> <details class="qa" > <summary> <span class="qa-q">Who can see the images I upload?</span> <span class="qa-sign" aria-hidden="true"></span> </summary> <p class="qa-a">Only people you send to your site. Image files are not reachable by guessing a URL: the site payload carries signed links that expire, and the stored file paths are never published.</p> </details> </div> </section> <section class="section" id="themes"> <div class="maker rv"> <div> <span class="kicker">For designers & developers <span class="pill">soon</span></span> <h3 class="maker-title">Build a theme and sell it here.</h3> <p class="maker-body"> Set your own price, keep most of it, withdraw from your wallet when you like. Not open yet — no submissions and no date promised, but it is being built. </p> </div> </div> </section> <section class="closing rv"> <h2 class="d-xl closing-title">Your idea deserves<br>a beautiful home.</h2> <p class="closing-sub">Your content is already written — put it somewhere you can change it.</p> <a class="btn btn-accent btn-lg" href="/signup">Start free <svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </a> </section> <style> .hero { position: relative; isolation: isolate; overflow: hidden; background: var(--band); color: var(--band-fg); min-height: min(94svh, 820px); display: flex; align-items: stretch; padding: calc(var(--nav-h) + 2.2rem) 0 clamp(2rem, 4vw, 3.2rem); } .hero-inner { display: flex; flex-direction: column; justify-content: space-between; gap: 2rem; width: 100%; } .hero-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; } .hero-shot { position: absolute; width: clamp(320px, 33vw, 560px); aspect-ratio: 16 / 10; border-radius: 20px; overflow: hidden; line-height: 0; box-shadow: 0 60px 120px -40px rgba(0,0,0,.9); border: 1px solid rgba(255,255,255,.10); background: var(--surface); } .hero-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .35)); pointer-events: none; } .hs-a { right: 4%; top: 12%; transform: rotate(4deg); } .hs-b { right: 27%; top: 34%; transform: rotate(-5deg); opacity: .82; } .hs-c { right: 12%; bottom: -6%; transform: rotate(8deg); opacity: .62; } .hero-veil { position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(78deg, var(--band) 30%, rgba(15,16,15,.86) 52%, rgba(15,16,15,.42) 100%), linear-gradient(0deg, var(--band) 2%, rgba(15,16,15,0) 45%); } .hero-inner { position: relative; z-index: 2; } .hero-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.4rem; max-width: 760px; } .hm { display: flex; flex-direction: column; gap: .18rem; padding-left: 1rem; border-left: 1px solid rgba(255,255,255,.18); } .hm-k { font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.5); } .hm-v { font-size: 1.02rem; font-weight: 700; letter-spacing: -.02em; color: #fff; } .hm-n { font-size: .8rem; color: rgba(255,255,255,.55); line-height: 1.4; } .hero .hero-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.9rem, 8.4vw, 7.2rem); line-height: .92; color: #fff; margin: 0 0 1.6rem; } .hero-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; flex-wrap: wrap; } .hero-actions { display: flex; gap: .7rem; flex-wrap: wrap; } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } .hero-note { margin: 0; max-width: 40ch; font-size: .92rem; line-height: 1.55; color: rgba(255,255,255,.62); } @media (max-width: 860px) { .hero { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .hero-meta { grid-template-columns: 1fr 1fr; gap: 1rem; } .hm-last { display: none; } .hero-shot { width: 74vw; } .hs-a { right: -22%; top: 6%; opacity: .5; } .hs-b { right: 2%; top: 30%; opacity: .38; } .hs-c { display: none; } .hero-body { margin-top: 3.5rem; } .hero-veil { background: linear-gradient(180deg, rgba(15,16,15,.94) 0%, rgba(15,16,15,.74) 30%, rgba(15,16,15,.93) 62%, var(--band) 92%); } } @media (max-width: 520px) { .hero-meta { grid-template-columns: 1fr; } .hero-actions .btn { width: 100%; } } .section { padding: clamp(3rem, 7vw, 6rem) 0 0; } .reasons { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr); gap: clamp(1.6rem, 5vw, 4rem); align-items: end; } .reasons-title { margin: 0; } .reasons-copy p { font-size: clamp(1rem, 1.5vw, 1.14rem); line-height: 1.55; color: var(--ink-2); margin: 0 0 1rem; } .reasons-copy p:last-child { margin-bottom: 0; } .reasons-copy em { font-style: normal; color: var(--emerald-deep); } :root[data-theme="dark"] .reasons-copy em { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .reasons-copy em { color: var(--emerald); } } @media (max-width: 900px) { .reasons { grid-template-columns: 1fr; align-items: start; } } .statement { text-align: center; } .statement-line { max-width: 22ch; margin: 0 auto; } .range { display: flex; align-items: center; justify-content: center; gap: clamp(.7rem, 2.4vw, 1.6rem); flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.4rem); font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.8rem, 5vw, 3.6rem); line-height: 1; color: var(--emerald-deep); } :root[data-theme="dark"] .range { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .range { color: var(--emerald); } } .range-a { color: var(--faint); } .range-arrow { display: block; width: clamp(60px, 12vw, 150px); color: currentColor; } .range-arrow svg { display: block; width: 100%; height: 12px; } .range-tail { font-family: var(--mono); font-weight: 500; font-size: .74rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); align-self: center; } .tilt-section { padding-top: clamp(2.2rem, 5vw, 4rem); } .tilt-head { max-width: 40ch; margin-bottom: clamp(1.2rem, 3vw, 2rem); } .tilt-head .kicker { margin-bottom: .9rem; } .tilt-row { display: flex; gap: clamp(.7rem, 1.6vw, 1.2rem); align-items: flex-start; overflow-x: auto; padding: 1.6rem .2rem 2.2rem; scrollbar-width: none; width: calc(100vw - (50vw - 50%)); margin-right: calc(50% - 50vw); } .tilt-row::-webkit-scrollbar { display: none; } .tilt-card { flex: 0 0 auto; width: clamp(190px, 21vw, 250px); margin: 0; display: flex; flex-direction: column; gap: .3rem; background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.1rem 1.15rem 1.2rem; box-shadow: var(--shadow); transition: transform .35s cubic-bezier(.2,.8,.2,1); } .tilt-card:hover { transform: rotate(0deg) translateY(-6px); } .ct-a { transform: rotate(-3deg); } .ct-b { transform: rotate(2.2deg) translateY(14px); } .ct-c { transform: rotate(-1.4deg) translateY(-6px); } .ct-d { transform: rotate(3.4deg) translateY(10px); } .ct-e { transform: rotate(-2.6deg); } .ct-f { transform: rotate(1.6deg) translateY(16px); } .tc-field { font-family: var(--mono); font-size: .66rem; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .tc-value { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: var(--heading); line-height: 1.25; } .tc-note { font-size: .8rem; color: var(--muted); margin: .35rem 0 0; line-height: 1.4; } @media (prefers-reduced-motion: reduce) { .tilt-card { transition: none; } } .band-tight { padding: clamp(2.4rem, 5vw, 4rem) 0; } .steps-title { margin-bottom: .6rem; } .steps-sub { color: var(--band-muted); margin: 0 0 clamp(1.6rem, 4vw, 2.6rem); max-width: 48ch; } .steps { display: grid; gap: .9rem; } .step { border-radius: var(--r-xl); } .step-head { display: flex; align-items: center; gap: 1rem; cursor: pointer; list-style: none; background: var(--emerald-deep); color: #fff; border-radius: var(--r-pill); padding: .85rem 1rem .85rem 1.5rem; } .step-head::-webkit-details-marker { display: none; } .step-n { font-family: var(--mono); font-size: .72rem; letter-spacing: .14em; opacity: .7; } .step-kind { font-size: clamp(1.05rem, 2vw, 1.45rem); font-weight: 800; letter-spacing: -.03em; } .step-time { margin-left: auto; font-size: .84rem; color: rgba(255,255,255,.78); } .step-chev { display: grid; place-items: center; width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; background: rgba(255,255,255,.18); color: #fff; transition: transform .25s ease; } .step:not([open]) .step-chev { transform: rotate(180deg); } .step-card { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); gap: clamp(1.2rem, 3vw, 2.6rem); background: var(--band-card); color: #14170f; border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.2vw, 2.4rem); margin-top: .55rem; } .band-dark .step-card .step-title { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3.6vw, 2.7rem); line-height: 1.02; color: #14170f; margin: 0 0 1rem; } .step-tags { display: flex; flex-wrap: wrap; gap: .4rem; } .step-tag { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase; background: rgba(20,23,15,.08); border: 1px solid rgba(20,23,15,.12); border-radius: var(--r-pill); padding: .3rem .7rem; color: #3c433a; } .step-lede { font-size: 1.02rem; font-weight: 650; color: #14170f; margin: 0 0 .6rem; letter-spacing: -.01em; } .step-body { font-size: .93rem; line-height: 1.6; color: #3c433a; margin: 0 0 1.2rem; } .step-right .btn-accent { background: #14170f; color: #fff; box-shadow: none; } .step-right .btn-accent:hover { background: #2c332a; } @media (max-width: 780px) { .step-card { grid-template-columns: 1fr; } .step-time { display: none; } } .looks-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .85fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .looks-count { font-family: var(--mono); font-size: .72rem; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .looks-note { color: var(--band-muted); font-size: .92rem; line-height: 1.6; margin: .5rem 0 0; } .looks { display: grid; gap: clamp(.8rem, 2vw, 1.2rem); } .look { display: flex; flex-direction: column; background: var(--band-2); border-radius: var(--r-2xl); overflow: hidden; border: 1px solid var(--band-line); transition: border-color .25s ease, transform .25s ease; } .look:hover { border-color: var(--emerald); transform: translateY(-3px); } .look-shot { position: relative; aspect-ratio: 16 / 10; overflow: hidden; background: var(--surface); } .look-shot .pv { position: absolute; top: 0; left: 0; width: 1280px; height: 800px; border: 0; transform-origin: 0 0; transform: scale(var(--pv, .3)); pointer-events: none; } .look-swatch { line-height: 0; margin-top: .3rem; } .look-swatch svg { display: block; } .look-meta { background: #fff; color: #14170f; padding: clamp(1.2rem, 2.4vw, 1.7rem); display: flex; flex-direction: column; gap: .45rem; flex: 1; } .band-dark .look .look-name { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1.02; color: #14170f; margin: 0; } .look-tag { margin: 0; font-size: .95rem; line-height: 1.5; color: #4b534a; max-width: 40ch; } .look-link { display: inline-flex; align-items: center; gap: .45rem; margin-top: auto; padding-top: .6rem; font-size: .88rem; font-weight: 700; color: var(--emerald-deep); } .look:hover .look-link svg { transform: translateX(3px); } .look-link svg { transition: transform .2s ease; } .looks-foot { display: flex; align-items: center; gap: 1.2rem; flex-wrap: wrap; margin-top: clamp(1.4rem, 3vw, 2.2rem); } .looks-more { color: var(--band-muted); font-size: .86rem; } @media (min-width: 760px) { .looks { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } } @media (max-width: 620px) { .looks-head { grid-template-columns: 1fr; } } .feat-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; margin-bottom: clamp(1.6rem, 4vw, 2.6rem); } .feats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(1.2rem, 2.6vw, 2.2rem); } .feat { padding-top: 1.1rem; border-top: 1px solid var(--band-line); } .feat-n { font-family: var(--mono); font-size: .7rem; letter-spacing: .16em; color: var(--emerald); } .feat-title { font-size: 1.05rem; font-weight: 750; letter-spacing: -.02em; color: #fff; margin: .7rem 0 .45rem; } .feat-body { font-size: .88rem; line-height: 1.6; color: var(--band-muted); margin: 0; } @media (max-width: 900px) { .feats { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .feats { grid-template-columns: 1fr; } } .price-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1.2rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.8rem, 4vw, 2.8rem); } .price-sub { margin: 0; color: var(--muted); font-size: .98rem; line-height: 1.6; } .plan-hero { display: grid; grid-template-columns: minmax(0, .85fr) minmax(0, 1.15fr); gap: clamp(1.4rem, 4vw, 3rem); align-items: start; background: var(--emerald-deep); color: #fff; border: 1px solid var(--emerald-deep); border-radius: var(--r-2xl); padding: clamp(1.4rem, 3.4vw, 2.6rem); box-shadow: 0 30px 60px -34px color-mix(in srgb, var(--emerald-deep) 70%, transparent); } .plan-hero-main { display: flex; flex-direction: column; } .plan-kicker { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: rgba(255,255,255,.66); } .plan-tagline { margin: .5rem 0 0; font-size: .95rem; line-height: 1.5; color: rgba(255,255,255,.86); } .plan-price { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.8rem, 6vw, 4.4rem); line-height: 1; margin: .7rem 0 .2rem; color: #fff; } .plan-price span { display: block; font-size: .82rem; font-weight: 500; letter-spacing: 0; color: rgba(255,255,255,.66); margin-top: .4rem; } .plan-anchor { margin: .3rem 0 1.2rem; font-size: .86rem; color: rgba(255,255,255,.72); } .plan-note { margin: .8rem 0 0; text-align: center; font-size: .8rem; color: rgba(255,255,255,.6); } .plan-list { list-style: none; margin: 0; padding: 0; display: grid; gap: .55rem; font-size: .95rem; } .plan-list li { display: flex; gap: .6rem; align-items: baseline; color: rgba(255,255,255,.9); } .plan-list li::before { content: "✓"; color: #fff; font-weight: 700; font-size: .85em; flex-shrink: 0; opacity: .8; } @media (min-width: 900px) { .plan-hero .plan-list { grid-template-columns: 1fr 1fr; gap: .55rem 1.4rem; } } @media (max-width: 780px) { .plan-hero, .price-head { grid-template-columns: 1fr; } } .ladder-head { margin: clamp(2rem, 4.5vw, 3rem) 0 .9rem; } .ladder-head h3 { font-size: 1.15rem; margin: 0; color: var(--heading); } .ladder-head p { margin: .2rem 0 0; font-size: .88rem; color: var(--muted); } .ladder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: .7rem; } .ladder-item { display: grid; gap: .2rem; padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); transition: border-color .18s ease, transform .18s ease; } .ladder-item:hover { border-color: var(--emerald); transform: translateY(-2px); } .ladder-best { border-color: var(--emerald); } .ladder-name { font-weight: 750; font-size: .95rem; color: var(--heading); } .ladder-name em { font-style: normal; font-family: var(--mono); font-size: .6rem; letter-spacing: .09em; text-transform: uppercase; color: var(--emerald-deep); margin-left: .3rem; } .ladder-price { font-family: var(--text); font-weight: 800; font-size: 1.25rem; letter-spacing: -.03em; color: var(--heading); } .ladder-price span { font-weight: 500; font-size: .74rem; letter-spacing: 0; color: var(--faint); margin-left: .35rem; } .ladder-note { font-size: .82rem; line-height: 1.45; color: var(--muted); } .compare { margin-top: 1.4rem; } .compare summary { cursor: pointer; font-size: .9rem; font-weight: 700; color: var(--emerald-deep); padding: .6rem 0; list-style: none; } .compare summary::-webkit-details-marker { display: none; } .compare summary::before { content: "+ "; font-family: var(--mono); } .compare[open] summary::before { content: "− "; } .compare-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: .8rem; margin-top: .9rem; } .compare-col { display: flex; flex-direction: column; padding: 1.2rem; border: 1px solid var(--line); border-radius: var(--r-lg); background: var(--surface); } .compare-price { font-family: var(--text); font-weight: 800; font-size: 1.6rem; letter-spacing: -.035em; color: var(--heading); margin-top: .4rem; } .compare-price span { display: block; font-size: .74rem; font-weight: 500; letter-spacing: 0; color: var(--faint); margin-top: .2rem; } .compare-anchor { margin: .4rem 0 .7rem; font-size: .82rem; color: var(--muted); } .compare-col .plan-list li { color: var(--ink-2); } .compare-col .plan-list li::before { color: var(--emerald); opacity: 1; } .compare-col .plan-kicker { color: var(--faint); } .compare-col .plan-list { margin-bottom: 1rem; font-size: .86rem; } .compare-col .btn { margin-top: auto; } .faq-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, .9fr); gap: clamp(1rem, 4vw, 3rem); align-items: end; margin-bottom: clamp(1.4rem, 3vw, 2.2rem); } .faq-sub { margin: 0; color: var(--muted); } .faq { border-top: 1px solid var(--line); } .qa { border-bottom: 1px solid var(--line); } .qa summary { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; cursor: pointer; list-style: none; padding: 1.3rem 0; } .qa summary::-webkit-details-marker { display: none; } .qa-q { font-size: clamp(1rem, 1.8vw, 1.18rem); font-weight: 750; letter-spacing: -.02em; color: var(--heading); } .qa-sign { position: relative; flex-shrink: 0; width: 34px; height: 34px; border-radius: 50%; border: 1px solid var(--line); background: var(--surface); transition: border-color .2s ease, background .2s ease; } .qa-sign::before, .qa-sign::after { content: ""; position: absolute; left: 50%; top: 50%; background: var(--ink-2); transform: translate(-50%, -50%); transition: opacity .2s ease; } .qa-sign::before { width: 13px; height: 1.6px; } .qa-sign::after { width: 1.6px; height: 13px; } .qa[open] .qa-sign { border-color: var(--emerald); background: var(--emerald-soft); } .qa[open] .qa-sign::after { opacity: 0; } .qa[open] .qa-sign::before { background: var(--emerald-deep); } .qa:hover .qa-sign { border-color: var(--emerald); } .qa-a { margin: 0 0 1.4rem; color: var(--muted); max-width: 74ch; line-height: 1.6; } @media (max-width: 780px) { .faq-head { grid-template-columns: 1fr; align-items: start; } } .maker { display: flex; align-items: center; justify-content: space-between; gap: 1.4rem; flex-wrap: wrap; padding: clamp(1.2rem, 3vw, 1.8rem); border: 1px dashed var(--line); border-radius: var(--r-lg); background: var(--surface-2); } .maker-title { margin: .55rem 0 .3rem; font-size: 1.2rem; } .maker-body { margin: 0; max-width: 56ch; font-size: .88rem; color: var(--muted); } .closing { text-align: center; padding: clamp(3.4rem, 8vw, 6.5rem) 0 clamp(1rem, 3vw, 2rem); } .closing-title { margin: 0 auto; max-width: 18ch; } .closing-sub { margin: 1.1rem auto 1.9rem; max-width: 46ch; color: var(--muted); font-size: 1.02rem; } html.rv-on .rv { opacity: 0; transform: translateY(16px); transition: opacity .6s ease, transform .6s ease; } html.rv-on .rv.in { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { html.rv-on .rv { opacity: 1; transform: none; transition: none; } } </style> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> (function () { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; if (!("IntersectionObserver" in window)) return; document.documentElement.classList.add("rv-on"); var io = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add("in"); io.unobserve(entry.target); } }); }, { rootMargin: "0px 0px -8% 0px", threshold: 0.08 }); document.querySelectorAll(".rv").forEach(function (el) { io.observe(el); }); })(); (function () { var PREVIEW_WIDTH = 1280; var boxes = document.querySelectorAll(".look-shot, .hero-shot"); function fit() { boxes.forEach(function (box) { if (!box.querySelector(".pv")) return; box.style.setProperty("--pv", box.clientWidth / PREVIEW_WIDTH); }); } fit(); window.addEventListener("resize", fit, { passive: true }); if ("ResizeObserver" in window) { var ro = new ResizeObserver(fit); boxes.forEach(function (box) { ro.observe(box); }); } })(); (function () { var steps = Array.prototype.slice.call(document.querySelectorAll(".steps .step")); steps.forEach(function (step) { step.addEventListener("toggle", function () { if (!step.open) return; steps.forEach(function (other) { if (other !== step) other.open = false; }); }); }); })(); </script> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="iB8Q5DnSVjWx_AOLdlto8Q">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Parameter cache-controlSolution For secure content, ensure the cache-control HTTP header is set with "no-cache, no-store, must-revalidate". If an asset should be cached consider setting the directives "public, max-age, immutable".
-
User Controllable HTML Element Attribute (Potential XSS) (1)
GET https://sites.wons.bt/signup?plan=lifesaver
Alert tags Alert description This check looks at user-supplied input in query string parameters and POST data to identify where certain HTML attribute values might be controlled. This provides hot-spot detection for XSS (cross-site scripting) that will require further review by a security analyst to determine exploitability.
Other info User-controlled HTML attribute values were found. Try injecting special characters to see if XSS might be possible. The page at the following URL:
https://sites.wons.bt/signup?plan=lifesaver
appears to include user input in:
a(n) [input] tag [value] attribute
The user input found was:
plan=lifesaver
The user-controlled value was:
lifesaver
Request Request line and header section (354 bytes)
GET https://sites.wons.bt/signup?plan=lifesaver HTTP/1.1 host: sites.wons.bt user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 pragma: no-cache cache-control: no-cache referer: https://sites.wons.bt Cookie: wons_csrf=nuZYRg1eASWdxmwv9zCe.7810b82eecae565becf5b8c149b9ba43Request body (0 bytes)
Response Status line and header section (805 bytes)
HTTP/1.1 200 OK Server: nginx/1.18.0 (Ubuntu) Date: Fri, 14 Aug 2026 18:42:58 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Content-Security-Policy-Report-Only: default-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'nonce-ULzaG9cSiTvmgMkJaMFXBA' Permissions-Policy: camera=(), microphone=(), geolocation=() Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: wons_csrf=bo7C3HBznzofZroi7pP2.875fef2620a865dadb384646bd0bc62e; Path=/; Max-Age=2592000; HttpOnly; SameSite=Lax Vary: Origin X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Xss-Protection: 1; mode=block content-length: 41348Response body (41348 bytes)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Create your site workspace — WONS Sites</title> <meta name="description" content="A website you can keep up to date yourself. Pick a look, fill in your pages, and it is live — no domain to buy, no developer, no rebuilds."> <link rel="icon" href="/__wons/download?a=0&e=1786819378&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfNHZ2NmczbWVkby5wbmc&s=2ed6b63b7d6ff7769a802e61a9e25ed0f6f5767583c686f5718cfc27c8868af1"> <link rel="preload" href="/fonts/Manrope-500-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="preload" href="/fonts/Fraunces-italic-latin.woff2" as="font" type="font/woff2" crossorigin> <link rel="stylesheet" href="/fonts/fonts.css"> <script nonce="ULzaG9cSiTvmgMkJaMFXBA"> (function () { try { var t = localStorage.getItem("wons-sites-theme"); if (t) document.documentElement.setAttribute("data-theme", t); } catch (e) {} })(); </script> <style> :root { --emerald: #0d9d63; --emerald-deep: #077a4b; --emerald-dark: #05603a; --emerald-soft: #e7f6ee; --emerald-line: #c6e8d6; --heading: #1d3b2c; --cta-bg: #1d4d33; --cta-bg-hover: #266040; --cta-fg: #ffffff; --canvas: #fdfcf8; --surface: #ffffff; --surface-2: #f2f6ef; --ink: #22302a; --ink-2: #435248; --muted: #5f6f66; --faint: #8fa096; --line: #e6e9df; --line-soft: #eef1e8; --warn: #b4690e; --warn-soft: #fdf3e4; --bad: #c8372c; --bad-soft: #fdeeec; --ok: var(--emerald); --band: #0f100f; --band-2: #171a18; --band-fg: #ffffff; --band-muted: #9aa39e; --band-line: #2a2f2c; --band-card: #d5dad3; --r-xs: 8px; --r: 12px; --r-lg: 18px; --r-xl: 26px; --r-2xl: 34px; --r-pill: 999px; --shadow-sm: 0 1px 2px rgba(16,30,24,.05); --shadow: 0 1px 2px rgba(16,30,24,.04), 0 12px 28px -18px rgba(16,30,24,.24); --shadow-lg: 0 32px 64px -34px rgba(10,40,28,.40); --ring: 0 0 0 3px rgba(13,157,99,.20); --display: "Fraunces", Georgia, "Times New Roman", serif; --text: "Manrope", ui-sans-serif, system-ui, -apple-system, sans-serif; --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace; --maxw: min(1280px, calc(100vw - 3em)); --nav-h: 68px; color-scheme: light; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } } :root[data-theme="dark"] { --emerald: #2fc98a; --emerald-deep: #21b077; --emerald-dark: #8ce8bf; --emerald-soft: #10281f; --emerald-line: #1d4436; --heading: #eef2f0; --cta-bg: #2fc98a; --cta-bg-hover: #4dd69c; --cta-fg: #06120d; --canvas: #0b0f0e; --surface: #121817; --surface-2: #182120; --ink: #eef2f0; --ink-2: #c3ccc9; --muted: #97a3a0; --faint: #6a7674; --line: #222c2a; --line-soft: #1a2322; --warn: #e0a55a; --warn-soft: #2a2113; --bad: #f0776a; --bad-soft: #2c1613; --shadow-sm: 0 1px 2px rgba(0,0,0,.45); --shadow: 0 1px 2px rgba(0,0,0,.5), 0 14px 32px -20px rgba(0,0,0,.8); --shadow-lg: 0 36px 72px -38px rgba(0,0,0,.9); --ring: 0 0 0 3px rgba(47,201,138,.26); color-scheme: dark; } *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; } body { margin: 0; font-family: var(--text); font-size: 16px; line-height: 1.6; letter-spacing: -.006em; color: var(--ink); background: var(--canvas); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } a { color: inherit; text-decoration: none; } ::selection { background: var(--emerald); color: #fff; } img { max-width: 100%; height: auto; } hr { border: 0; border-top: 1px solid var(--line); margin: 2rem 0; } h1, h2 { font-family: var(--display); margin: 0 0 .6rem; } h3, h4 { font-family: var(--text); margin: 0 0 .6rem; } h1 { font-size: clamp(2.5rem, 5.4vw, 3.9rem); font-weight: 620; line-height: 1.06; letter-spacing: -.015em; color: var(--heading); } h2 { font-size: clamp(1.7rem, 3.4vw, 2.5rem); font-weight: 600; line-height: 1.12; letter-spacing: -.012em; color: var(--heading); } h3 { font-size: 1.16rem; font-weight: 750; line-height: 1.25; letter-spacing: -.015em; color: var(--heading); } h4 { font-size: .98rem; font-weight: 750; letter-spacing: -.01em; } body:not(.app) h1, body:not(.app) h2 { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; } body:not(.app) h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); line-height: .98; } body:not(.app) h2 { font-size: clamp(2rem, 4.4vw, 3.4rem); line-height: 1.02; } body:not(.app) .d-xl, .d-xl { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(3rem, 8.6vw, 7rem); line-height: .92; margin: 0; color: var(--heading); } body:not(.app) .d-lg, .d-lg { font-family: var(--text); font-weight: 800; letter-spacing: -.04em; font-size: clamp(2.2rem, 5vw, 3.9rem); line-height: 1; margin: 0; color: var(--heading); } body:not(.app) .d-thin, .d-thin { font-family: var(--text); font-weight: 300; letter-spacing: -.035em; font-size: clamp(2rem, 5.4vw, 4.2rem); line-height: 1.04; margin: 0; color: var(--heading); } p { margin: 0 0 1rem; } .lede { font-size: clamp(1.02rem, 1.6vw, 1.18rem); line-height: 1.55; color: var(--muted); max-width: 48ch; } .muted { color: var(--muted); } .faint { color: var(--faint); } .tiny { font-size: .82rem; } .label { font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: var(--faint); } .kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .71rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald-deep); } .kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .6; } code { font-family: var(--mono); font-size: .85em; background: var(--surface-2); border: 1px solid var(--line); border-radius: 6px; padding: .08em .4em; color: var(--ink-2); } .shell { min-height: 100vh; display: flex; flex-direction: column; overflow-x: clip; } .wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } .topbar { position: sticky; top: 0; z-index: 60; height: var(--nav-h); display: flex; align-items: center; background: color-mix(in srgb, var(--canvas) 88%, transparent); backdrop-filter: saturate(1.6) blur(14px); -webkit-backdrop-filter: saturate(1.6) blur(14px); border-bottom: 1px solid var(--line); } .topbar .bar { display: flex; align-items: center; gap: 1.4rem; width: 100%; } body:not(.app) .topbar { position: fixed; top: 0; left: 0; right: 0; height: auto; padding: 14px 0; background: none; border: 0; backdrop-filter: none; -webkit-backdrop-filter: none; transition: padding .25s ease; } body:not(.app) .topbar .bar { position: relative; padding: .5rem .55rem .5rem 1.15rem; border-radius: var(--r-pill); background: color-mix(in srgb, var(--surface) 92%, transparent); border: 1px solid var(--line); box-shadow: var(--shadow-sm); backdrop-filter: saturate(1.5) blur(16px); -webkit-backdrop-filter: saturate(1.5) blur(16px); transition: background .25s ease, border-color .25s ease, box-shadow .25s ease; } body.hero-top:not(.app) .topbar .bar { background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .22); box-shadow: none; } body.hero-top:not(.app) .topbar .brand, body.hero-top:not(.app) .topbar .nav a.link, body.hero-top:not(.app) .topbar .nav-actions a.link { color: #fff; } body.hero-top:not(.app) .topbar .nav a.link:hover, body.hero-top:not(.app) .topbar .nav-actions a.link:hover { color: #fff; background: rgba(255,255,255,.16); } body.hero-top:not(.app) .topbar .icon-btn { background: rgba(255,255,255,.14); border-color: rgba(255,255,255,.24); color: #fff; } body.hero-top:not(.app) .topbar .icon-btn:hover { border-color: #fff; color: #fff; } body.hero-top:not(.app) .topbar .brand .mark { box-shadow: none; } body:not(.app) .topbar.stuck { padding: 8px 0; } body.hero-top:not(.app) .topbar.stuck .bar { background: color-mix(in srgb, var(--surface) 94%, transparent); border-color: var(--line); box-shadow: var(--shadow); } body.hero-top:not(.app) .topbar.stuck .brand { color: var(--heading); } body.hero-top:not(.app) .topbar.stuck .nav a.link, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.stuck .nav a.link:hover, body.hero-top:not(.app) .topbar.stuck .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } body.hero-top:not(.app) .topbar.stuck .icon-btn { background: var(--surface); border-color: var(--line); color: var(--muted); } body.hero-top:not(.app) .topbar.stuck .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .brand { display: inline-flex; align-items: center; gap: .6rem; font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); flex-shrink: 0; } .brand .mark { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; background: linear-gradient(145deg, var(--emerald), var(--emerald-dark)); color: #fff; font-size: .82rem; font-weight: 800; letter-spacing: -.02em; box-shadow: 0 6px 14px -6px rgba(7,122,75,.7); } :root[data-theme="dark"] .brand .mark { color: #06120d; } .brand .mark-img { background: none; box-shadow: none; object-fit: contain; border-radius: 7px; } .brand .mark-dark { display: none; } :root[data-theme="dark"] .brand .mark-light { display: none; } :root[data-theme="dark"] .brand .mark-dark { display: block; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .brand .mark-light { display: none; } :root:not([data-theme="light"]) .brand .mark-dark { display: block; } } .nav { display: flex; align-items: center; justify-content: center; gap: .4rem; flex: 1; } .nav a.link, .nav-actions a.link { display: inline-flex; align-items: center; gap: .42rem; padding: .45rem .75rem; border-radius: var(--r-xs); font-size: .93rem; font-weight: 600; color: var(--ink-2); transition: color .15s, background .15s; } .nav a.link:hover, .nav-actions a.link:hover { color: var(--heading); background: var(--surface-2); } .nav a.link.active { color: var(--heading); } .nav-actions { display: flex; align-items: center; gap: .45rem; flex-shrink: 0; } .icon-btn { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface); color: var(--muted); cursor: pointer; font: inherit; font-size: .95rem; padding: 0; transition: border-color .15s, color .15s; } .icon-btn:hover { border-color: var(--emerald); color: var(--emerald-deep); } .theme-toggle .sun { display: none; } .theme-toggle .moon { display: block; } :root[data-theme="dark"] .theme-toggle .sun { display: block; } :root[data-theme="dark"] .theme-toggle .moon { display: none; } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .theme-toggle .sun { display: block; } :root:not([data-theme="light"]) .theme-toggle .moon { display: none; } } #navToggle { display: none; } @media (max-width: 860px) { #navToggle { display: grid; } .nav-actions a.link.nav-login { display: none; } .nav { display: none; position: absolute; top: var(--nav-h); left: 0; right: 0; flex-direction: column; align-items: stretch; gap: .1rem; padding: .8rem clamp(1.1rem, 4vw, 2rem) 1.2rem; background: var(--surface); border-bottom: 1px solid var(--line); box-shadow: var(--shadow-lg); } .topbar.open .nav { display: flex; } body:not(.app) .nav { top: calc(100% + .5rem); left: .25rem; right: .25rem; border: 1px solid var(--line); border-radius: var(--r-lg); padding: .6rem .7rem .8rem; } body.hero-top:not(.app) .topbar.open .nav a.link, body:not(.app) .topbar.open .nav a.link { color: var(--ink-2); } body.hero-top:not(.app) .topbar.open .nav a.link:hover { background: var(--surface-2); color: var(--heading); } } @media (max-width: 620px) { body:not(.app) .topbar .brand { font-size: 0; gap: 0; } body:not(.app) .topbar .brand .mark { font-size: .82rem; } body:not(.app) .topbar .bar { gap: .6rem; padding-left: .55rem; } body:not(.app) .topbar .nav-actions { gap: .35rem; } body:not(.app) .topbar .nav-actions .btn { padding: .5rem .85rem; font-size: .82rem; } body:not(.app) .icon-btn { width: 34px; height: 34px; } } main { flex: 1; padding: clamp(2.2rem, 5vw, 4rem) 0 clamp(3.5rem, 7vw, 5.5rem); } body:not(.app) main { padding-top: calc(var(--nav-h) + clamp(1.4rem, 4vw, 2.6rem)); } body.hero-top:not(.app) main { padding-top: 0; } body.hero-top:not(.app) .flash { margin-top: calc(var(--nav-h) + 1rem); } body.app main { padding: 0; } body.app .wrap { max-width: none; padding: 0; } .bleed { width: 100vw; margin-left: calc(50% - 50vw); } .site-footer { background: var(--band); color: var(--band-fg); padding: clamp(2.4rem, 5vw, 3.6rem) 0 1.2rem; overflow: hidden; } .site-footer .footer-name, .site-footer .footer-sub-head { color: var(--band-fg); } .site-footer .footer-tag, .site-footer .footer-sub-copy, .site-footer .footer-col a { color: var(--band-muted); } .site-footer .label { color: #6f7a75; } .site-footer .footer-col a:hover { color: var(--band-fg); } .site-footer input[type=email] { background: var(--band-2); border-color: var(--band-line); color: var(--band-fg); } .site-footer input[type=email]::placeholder { color: #6f7a75; } .site-footer .sub-btn { background: var(--emerald); color: #06120d; } .site-footer .sub-btn:hover { background: var(--emerald-deep); color: #fff; } .site-footer .footer-base { border-top-color: var(--band-line); color: #6f7a75; } .footer-grid { display: grid; grid-template-columns: 1.4fr .8fr .8fr 1.2fr; gap: 2rem; padding-bottom: clamp(1.4rem, 3vw, 2.2rem); } .footer-name { font-family: var(--text); font-weight: 800; letter-spacing: -.03em; font-size: 1.05rem; color: var(--heading); } .footer-tag { margin: .5rem 0 0; font-size: .88rem; color: var(--muted); max-width: 30ch; } .footer-col .label { display: block; margin-bottom: .7rem; } .footer-col a { display: block; padding: .24rem 0; font-size: .9rem; color: var(--muted); } .footer-col a:hover { color: var(--emerald-deep); } .footer-sub-head { font-size: .95rem; font-weight: 750; color: var(--heading); margin: 0 0 .35rem; } .footer-sub-copy { font-size: .84rem; color: var(--muted); margin: 0 0 .8rem; max-width: 32ch; } .footer-sub { display: flex; gap: .5rem; } .footer-sub input[type=email] { flex: 1; min-width: 0; } .footer-sub .sub-btn { display: grid; place-items: center; width: 46px; flex-shrink: 0; border: 0; border-radius: var(--r); cursor: pointer; background: var(--cta-bg); color: var(--cta-fg); font: inherit; transition: background .15s; } .footer-sub .sub-btn:hover { background: var(--cta-bg-hover); } .footer-base { display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; border-top: 1px solid var(--line-soft); padding-top: 1.2rem; font-family: var(--mono); font-size: .72rem; color: var(--faint); } @media (max-width: 900px) { .footer-grid { grid-template-columns: 1fr 1fr; } } @media (max-width: 520px) { .footer-grid { grid-template-columns: 1fr; gap: 1.4rem; } } .btn { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-family: var(--text); font-weight: 600; font-size: .95rem; line-height: 1; cursor: pointer; white-space: nowrap; text-decoration: none; padding: .78rem 1.3rem; border-radius: var(--r); border: 1px solid transparent; transition: transform .08s, filter .15s, border-color .15s, background .15s, color .15s; } .btn:active { transform: translateY(1px); } .btn-primary { background: var(--ink); color: var(--canvas); } .btn-primary:hover { filter: brightness(1.22); } :root[data-theme="dark"] .btn-primary { background: var(--emerald); color: #06120d; } .btn-accent { background: var(--cta-bg); color: var(--cta-fg); box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); } .btn-accent:hover { background: var(--cta-bg-hover); } .btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--line); box-shadow: var(--shadow-sm); } .btn-ghost:hover { border-color: var(--emerald); color: var(--emerald-deep); } .btn-quiet { background: transparent; color: var(--muted); padding-left: .6rem; padding-right: .6rem; } .btn-quiet:hover { color: var(--ink); } .btn-sm { padding: .5rem .85rem; font-size: .86rem; border-radius: var(--r-xs); } .btn-block { width: 100%; } .btn[disabled] { opacity: .5; cursor: not-allowed; } body:not(.app) .btn { border-radius: var(--r-pill); padding: .88rem 1.6rem; } body:not(.app) .btn-sm { padding: .55rem 1.05rem; font-size: .86rem; } body:not(.app) form button:not([class]) { border-radius: var(--r-pill); } .btn-onband { background: #fff; color: var(--band); } .btn-onband:hover { background: #fff; filter: brightness(.94); } .btn-outline-band { background: transparent; color: #fff; border-color: rgba(255,255,255,.32); } .btn-outline-band:hover { border-color: #fff; background: rgba(255,255,255,.08); } .band { position: relative; padding: clamp(3rem, 7vw, 6rem) 0; } .band-dark + .band-dark { padding-top: 0; } .band-dark { background: var(--band); color: var(--band-fg); } body:not(.app) .band-dark h1, body:not(.app) .band-dark h2, body:not(.app) .band-dark h3, body:not(.app) .band-dark .d-xl, body:not(.app) .band-dark .d-lg, body:not(.app) .band-dark .d-thin { color: var(--band-fg); } .band-dark .muted, .band-dark .lede { color: var(--band-muted); } .band-dark .label { color: #6f7a75; } .band-dark .kicker { color: var(--emerald); } .band-paper { background: var(--surface-2); color: var(--ink); } .band-accent { background: var(--emerald-deep); color: #fff; } body:not(.app) .band-accent h2, body:not(.app) .band-accent h3, body:not(.app) .band-accent .d-lg, body:not(.app) .band-accent .d-xl { color: #fff; } .band-accent .lede, .band-accent .muted { color: rgba(255,255,255,.78); } .band-accent .label, .band-accent .kicker { color: rgba(255,255,255,.66); } .band-accent .kicker::before { background: currentColor; } .band-inner { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(1.1rem, 4vw, 2rem); } form button:not([class]) { display: inline-flex; align-items: center; justify-content: center; gap: .5rem; font: inherit; font-weight: 600; cursor: pointer; color: var(--cta-fg); border: 0; background: var(--cta-bg); border-radius: var(--r); padding: .78rem 1.4rem; box-shadow: 0 14px 28px -16px color-mix(in srgb, var(--cta-bg) 80%, transparent); transition: background .15s, transform .08s; } form button:not([class]):hover { background: var(--cta-bg-hover); } form button:not([class]):active { transform: translateY(1px); } .card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-lg); padding: 1.5rem 1.6rem; box-shadow: var(--shadow); } .card.tight { padding: 1.1rem 1.2rem; } .card.flush { padding: 0; overflow: hidden; } .panel { background: var(--surface-2); border: 1px solid var(--line-soft); border-radius: var(--r); padding: 1.1rem 1.2rem; } .stack > * + * { margin-top: 1.1rem; } .row { display: flex; align-items: center; gap: .8rem; flex-wrap: wrap; } .row-between { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; } .grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } .grid-2 { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); } .center-narrow { max-width: 460px; margin: 0 auto; } .pill { display: inline-flex; align-items: center; gap: .35rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .08em; text-transform: uppercase; padding: .26rem .6rem; border-radius: 999px; background: var(--surface-2); color: var(--muted); border: 1px solid var(--line); } .pill { align-self: flex-start; } .pill.ok { background: var(--emerald-soft); color: var(--emerald-deep); border-color: var(--emerald-line); } .pill.warn { background: var(--warn-soft); color: var(--warn); border-color: color-mix(in srgb, var(--warn) 32%, transparent); } .pill.bad { background: var(--bad-soft); color: var(--bad); border-color: color-mix(in srgb, var(--bad) 30%, transparent); } .dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; } .field { display: block; margin-bottom: 1.05rem; } .field > .lbl { display: flex; align-items: baseline; justify-content: space-between; gap: .8rem; font-size: .88rem; font-weight: 600; margin-bottom: .38rem; } .field > .lbl .hint { font-weight: 400; font-size: .8rem; color: var(--faint); } input[type=text], input[type=email], input[type=password], input[type=url], input[type=number], input[type=date], input[type=search], textarea, select { display: block; width: 100%; font: inherit; font-size: .95rem; color: var(--ink); background: var(--surface); border: 1px solid var(--line); border-radius: var(--r); padding: .72rem .9rem; transition: border-color .15s, box-shadow .15s; } textarea { min-height: 120px; resize: vertical; line-height: 1.55; } input::placeholder, textarea::placeholder { color: var(--faint); } input:focus, textarea:focus, select:focus { outline: 0; border-color: var(--emerald); box-shadow: var(--ring); } input[aria-invalid="true"], textarea[aria-invalid="true"] { border-color: var(--bad); } input[type=checkbox], input[type=radio] { accent-color: var(--emerald); width: auto; } .err { display: block; color: var(--bad); font-size: .84rem; font-weight: 500; margin-top: .35rem; } fieldset { border: 0; margin: 0; padding: 0; } .progress { height: 6px; border-radius: 999px; background: var(--surface-2); overflow: hidden; border: 1px solid var(--line-soft); } .progress > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--emerald), var(--emerald-deep)); } .flash { display: flex; align-items: flex-start; gap: .6rem; background: var(--surface-2); color: var(--ink-2); border: 1px solid var(--line); border-radius: var(--r); padding: .8rem 1.05rem; margin-bottom: 1.4rem; font-weight: 500; font-size: .93rem; animation: flashIn .22s ease; } .flash::before { content: "→"; font-weight: 800; color: var(--muted); } .flash.warn { background: #fdf6e7; color: #8a5a00; border-color: #f0dcae; } :root[data-theme="dark"] .flash.warn { color: #8a5a00; } .flash.warn::before { content: "!"; } .flash.ok { background: #eaf7f0; color: #10633f; border-color: #bfe3d0; } :root[data-theme="dark"] .flash.ok { color: #10633f; } .flash.ok::before { content: "\2713"; color: #10633f; } .flash.error { background: #fdeceb; color: #8c2b22; border-color: #f3c8c4; } :root[data-theme="dark"] .flash.error { color: #8c2b22; } .flash.error::before { content: "\2715"; color: #8c2b22; } @keyframes flashIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } } .auth-centered { text-align: center; padding-top: clamp(.2rem, 2vw, 1rem); } .auth-centered .kicker { justify-content: center; } .auth-centered .lede { margin-left: auto; margin-right: auto; } .auth-centered .card { text-align: left; } .ticks { list-style: none; margin: 1.1rem 0; padding: 0; display: grid; gap: .55rem; font-size: .93rem; } .ticks li { display: flex; gap: .6rem; align-items: baseline; color: var(--ink-2); } .ticks li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } table { width: 100%; border-collapse: collapse; } th, td { text-align: left; padding: .7rem .6rem; font-size: .92rem; } th { font-family: var(--mono); font-size: .68rem; letter-spacing: .1em; text-transform: uppercase; color: var(--faint); font-weight: 500; border-bottom: 1px solid var(--line); } td { border-bottom: 1px solid var(--line-soft); } tr:last-child td { border-bottom: 0; } .page-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); max-width: 58ch; } .page-head .kicker { margin-bottom: .9rem; } .backlink { display: inline-flex; align-items: center; gap: .35rem; color: var(--faint); font-size: .88rem; margin-bottom: .9rem; } .backlink:hover { color: var(--emerald-deep); } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; } } </style> <script src="/__wons/sdk/pocketbase.umd.js"></script><script src="/__wons/sdk/wons.umd.js" data-wons-global="Wons"></script></head> <body class=" hero-top"> <div class="shell"> <header class="topbar" id="topbar"> <div class="wrap"><div class="bar"> <a class="brand" href="/"> <img class="mark mark-img mark-light" src="/__wons/download?a=0&e=1786819378&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfamd1aGFzNnMzcC5wbmc&s=743b059e3bd990dbf388d37c6ab2430dc7b2a03d82f72815fbf95547ffb217c5" alt="" width="30" height="30"> <img class="mark mark-img mark-dark" src="/__wons/download?a=0&e=1786819378&k=cGJjXzQyNjEwMDE0MTQvdWkyZWYwYmF5ZXF6NWExL3dvbnNfZmx5MHF4YXBrOS5wbmc&s=90b82cf9b1cc26c14a76a7ed74d1bd50f21075e7ec6d23f3058d77c343c0f586" alt="" width="30" height="30"> WONS Sites </a> <nav class="nav" id="nav"> <a class="link" href="/#product">Features</a> <a class="link" href="/themes">Themes</a> <a class="link" href="/#pricing">Pricing</a> <a class="link" href="/docs">Docs</a> </nav> <div class="nav-actions"> <a class="link nav-login" href="/login">Log in</a> <a class="btn btn-accent btn-sm" href="/signup">Start Free</a> <button class="icon-btn theme-toggle" id="themeToggle" type="button" aria-label="Toggle dark mode"> <svg class="moon" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <path d="M20.4 14.7A8.7 8.7 0 0 1 9.3 3.6 8.7 8.7 0 1 0 20.4 14.7Z"/> </svg> <svg class="sun" viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"> <circle cx="12" cy="12" r="4.1"/> <path d="M12 2.5v2.2M12 19.3v2.2M4.6 4.6l1.6 1.6M17.8 17.8l1.6 1.6M2.5 12h2.2M19.3 12h2.2M4.6 19.4l1.6-1.6M17.8 6.2l1.6-1.6"/> </svg> </button> <button class="icon-btn" id="navToggle" type="button" aria-label="Toggle menu" aria-expanded="false">☰</button> </div> </div></div> </header> <main> <div class="wrap"> <section class="auth bleed"> <div class="auth-grid band-inner"> <div class="auth-copy"> <span class="auth-kicker">Step 2 of 4</span> <h1 class="auth-title">Create your<br>workspace</h1> <p class="auth-lede"> Your content lives here. Your site keeps living wherever it is hosted today, reading everything from one address. </p> <div class="progress progress-band" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"> <i style="width:25%"></i> </div> <ol class="steps"> <li class="done"><b>1</b>Choose a plan</li> <li class=""><b>2</b>Create your workspace</li> <li class=""><b>3</b>Add your content</li> <li class=""><b>4</b>Point your domain</li> </ol> <div class="auth-cols"> <div> <span class="auth-h">What you get today</span> <ul class="auth-points"> <li>A dashboard for every word and image on your site</li> <li>One API your existing host reads — no migration</li> <li>Themes you can switch without a rebuild</li> <li>Images stripped of location data, served through expiring links</li> </ul> </div> <div> <span class="auth-h">Right after this</span> <div class="auth-next"><b>01</b><span>Name your site and claim the domain it will serve</span></div> <div class="auth-next"><b>02</b><span>Fill in the pages you already have — we start you with a template</span></div> <div class="auth-next"><b>03</b><span>Download one file for your host, and you are live</span></div> </div> </div> </div> <div class="auth-card"> <form method="post"> <input type="hidden" name="_csrf" value="bo7C3HBznzofZroi7pP2.875fef2620a865dadb384646bd0bc62e"> <input type="hidden" name="plan" value="lifesaver"> <label class="field"> <span class="lbl">Organisation<span class="hint">Shown as your site name</span></span> <input type="text" name="organisation" value="" placeholder="Dragon View Hotel" required autofocus> </label> <label class="field"> <span class="lbl">Work email</span> <input type="email" name="email" value="" placeholder="you@yourdomain.bt" required> </label> <label class="field"> <span class="lbl">Password<span class="hint">At least 10 characters</span></span> <input type="password" name="password" required minlength="10" autocomplete="new-password"> </label> <button class="btn btn-accent btn-block btn-lg" type="submit">Create my workspace</button> <p class="auth-fine">Free while you set it up. No card, no charge until you go live.</p> </form> <p class="auth-alt"> Already have a workspace? <a class="auth-link" href="/login">Sign in</a> </p> </div> </div> </section> <style> .auth { background: var(--band); color: var(--band-fg); min-height: min(100svh, 940px); display: flex; align-items: center; padding: calc(var(--nav-h) + 2.4rem) 0 clamp(2.4rem, 6vw, 4rem); } .auth-grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); gap: clamp(1.8rem, 5vw, 4rem); align-items: center; width: 100%; } .auth-kicker { display: inline-flex; align-items: center; gap: .55rem; font-family: var(--mono); font-size: .7rem; font-weight: 500; letter-spacing: .16em; text-transform: uppercase; color: var(--emerald); } .auth-kicker::before { content: ""; width: 20px; height: 1.5px; background: currentColor; opacity: .7; } .auth .auth-title { font-family: var(--text); font-weight: 800; letter-spacing: -.045em; font-size: clamp(2.4rem, 5.6vw, 4.4rem); line-height: .96; color: #fff; margin: .9rem 0 1rem; } .auth-lede { max-width: 44ch; color: var(--band-muted); font-size: 1rem; line-height: 1.6; margin: 0 0 1.6rem; } .progress-band { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.16); } .steps { list-style: none; margin: .8rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .4rem 1rem; font-size: .8rem; color: rgba(255,255,255,.5); } .steps li { display: flex; align-items: center; gap: .4rem; } .steps li b { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.18); font-size: .68rem; font-weight: 700; color: rgba(255,255,255,.6); } .steps li.done { color: var(--emerald); } .steps li.done b { background: var(--emerald); border-color: var(--emerald); color: #06120d; } .auth-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 1.6rem; margin-top: 2rem; padding-top: 1.6rem; border-top: 1px solid rgba(255,255,255,.14); } .auth-h { display: block; margin-bottom: .7rem; font-family: var(--mono); font-size: .68rem; font-weight: 500; letter-spacing: .14em; text-transform: uppercase; color: #6f7a75; } .auth-points { list-style: none; margin: 0; padding: 0; display: grid; gap: .5rem; } .auth-points li { display: flex; gap: .6rem; align-items: baseline; font-size: .88rem; line-height: 1.45; color: rgba(255,255,255,.76); } .auth-points li::before { content: "✓"; color: var(--emerald); font-weight: 700; font-size: .85em; flex-shrink: 0; } .auth-next { display: flex; gap: .7rem; align-items: flex-start; font-size: .88rem; line-height: 1.45; color: rgba(255,255,255,.76); margin-bottom: .5rem; } .auth-next b { font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; color: var(--emerald); padding-top: .22rem; } .auth-card { background: var(--surface); color: var(--ink); border: 1px solid var(--line); border-radius: var(--r-2xl); padding: clamp(1.5rem, 3.4vw, 2.4rem); box-shadow: 0 50px 100px -50px rgba(0,0,0,.85); } .auth-card .field:last-of-type { margin-bottom: 1.4rem; } .auth-fine { margin: .9rem 0 0; text-align: center; font-size: .8rem; color: var(--faint); } .auth-alt { margin: 1.2rem 0 0; text-align: center; font-size: .88rem; color: var(--muted); } .auth-link { color: var(--emerald-deep); font-weight: 600; } :root[data-theme="dark"] .auth-link { color: var(--emerald); } @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .auth-link { color: var(--emerald); } } .btn-lg { padding: 1rem 1.9rem; font-size: 1rem; } @media (max-width: 980px) { .auth { min-height: 0; padding-top: calc(var(--nav-h) + 1.6rem); } .auth-grid { grid-template-columns: 1fr; gap: 2rem; } .auth-copy { order: 2; } .auth-card { order: 1; } } @media (max-width: 620px) { .auth-cols { grid-template-columns: 1fr; } } </style> </div> </main> <footer class="site-footer"> <div class="wrap footer-grid"> <div> <span class="footer-name">WONS Sites</span> <p class="footer-tag">A website you can keep up to date yourself.</p> </div> <nav class="footer-col" aria-label="Product"> <span class="label">Product</span> <a href="/themes">Themes</a> <a href="/#product">What you can change</a> <a href="/#pricing">Pricing</a> <a href="/docs">Docs</a> </nav> <nav class="footer-col" aria-label="Account"> <span class="label">Account</span> <a href="/login">Log in</a> <a href="/signup">Start your site</a> <a href="/dashboard">Dashboard</a> </nav> <div> <p class="footer-sub-head">Start with your email</p> <p class="footer-sub-copy">It takes you straight to sign-up — free plan, no card needed.</p> <form class="footer-sub" action="/signup" method="get"> <input type="email" name="email" placeholder="Your email address" aria-label="Email address"> <button class="sub-btn" type="submit" aria-label="Start your site"> <svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14M13 6l6 6-6 6"/></svg> </button> </form> </div> </div> <div class="wrap footer-base"> <span>© 2026 WONS Sites. All rights reserved.</span> <span>Made by WONS</span> </div> </footer> </div> <script nonce="ULzaG9cSiTvmgMkJaMFXBA"> var themeToggle = document.getElementById("themeToggle"); if (themeToggle) themeToggle.addEventListener("click", function () { var root = document.documentElement; var current = root.getAttribute("data-theme"); var systemDark = window.matchMedia("(prefers-color-scheme: dark)").matches; var next = (current ? current === "dark" : systemDark) ? "light" : "dark"; root.setAttribute("data-theme", next); try { localStorage.setItem("wons-sites-theme", next); } catch (e) {} }); var navToggle = document.getElementById("navToggle"); var topbar = document.getElementById("topbar"); if (navToggle && topbar) navToggle.addEventListener("click", function () { var open = topbar.classList.toggle("open"); navToggle.setAttribute("aria-expanded", open ? "true" : "false"); }); (function () { var bar = document.getElementById("topbar"); if (!bar) return; var mark = function () { bar.classList.toggle("stuck", window.scrollY > 72); }; mark(); window.addEventListener("scroll", mark, { passive: true }); })(); (function () { var path = location.pathname.replace(/\/+$/, "") || "/"; var best = null, bestLen = -1; document.querySelectorAll(".nav a.link").forEach(function (a) { var href = (a.getAttribute("href") || "").replace(/\/+$/, "") || "/"; var match = href === "/" ? path === "/" : (path === href || path.indexOf(href + "/") === 0); if (match && href.length > bestLen) { best = a; bestLen = href.length; } }); if (best) best.classList.add("active"); })(); </script> <script nonce="ULzaG9cSiTvmgMkJaMFXBA">(function(){ var es = new EventSource("/__wons/dev/reload"); es.onmessage = function(){ location.reload() }; // Close the stream the instant the page is left. Without this, each // navigation leaves its SSE connection lingering; a few quick clicks // exhaust the browser's ~6-per-origin HTTP/1.1 connection cap and every // further request (including the next page) stalls until the stale // streams time out. Closing on pagehide frees the slot immediately. window.addEventListener("pagehide", function(){ es.close(); }); })()</script></body> </html>Parameter planSolution Validate all input and sanitize output it before writing to any HTML attributes.
-
-
Appendix
Alert Types
This section contains additional information on the types of alerts in the report.
-
Content Security Policy (CSP) Header Not Set
-
Cross-Domain Misconfiguration
Source raised by a passive scanner (Cross-Domain Misconfiguration) CWE ID 264 WASC ID 14 Reference -
Cookie Without Secure Flag
Source raised by a passive scanner (Cookie Without Secure Flag) CWE ID 614 WASC ID 13 Reference -
Server Leaks Version Information via "Server" HTTP Response Header Field
Source raised by a passive scanner (HTTP Server Response Header) CWE ID 497 WASC ID 13 Reference -
Strict-Transport-Security Header Not Set
Source raised by a passive scanner (Strict-Transport-Security Header) CWE ID 319 WASC ID 15 Reference -
Timestamp Disclosure - Unix
Source raised by a passive scanner (Timestamp Disclosure) CWE ID 497 WASC ID 13 Reference -
Authentication Request Identified
Source raised by a passive scanner (Authentication Request Identified) Reference -
Content Security Policy (CSP) Report-Only Header Found
Source raised by a passive scanner (Content Security Policy (CSP) Header Not Set) CWE ID 693 WASC ID 15 Reference -
Information Disclosure - Sensitive Information in URL
Source raised by a passive scanner (Information Disclosure - Sensitive Information in URL) CWE ID 598 WASC ID 13 -
Information Disclosure - Suspicious Comments
Source raised by a passive scanner (Information Disclosure - Suspicious Comments) CWE ID 615 WASC ID 13 -
Modern Web Application
Source raised by a passive scanner (Modern Web Application) -
Re-examine Cache-control Directives
Source raised by a passive scanner (Re-examine Cache-control Directives) CWE ID 525 WASC ID 13 Reference -
Session Management Response Identified
Source raised by a passive scanner (Session Management Response Identified) Reference -
User Agent Fuzzer
Source raised by an active scanner (User Agent Fuzzer) Reference -
User Controllable HTML Element Attribute (Potential XSS)
Source raised by a passive scanner (User Controllable HTML Element Attribute (Potential XSS)) CWE ID 20 WASC ID 20 Reference
ZAP