@gemboss/website-ui 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +191 -0
- package/CHANGELOG.md +47 -0
- package/README.md +118 -2
- package/bin/gemboss-website.mjs +78 -0
- package/bin/lib/check.mjs +695 -0
- package/bin/lib/gap.mjs +189 -0
- package/bin/lib/init.mjs +99 -0
- package/bin/lib/upgrade.mjs +155 -0
- package/bin/lib/util.mjs +147 -0
- package/css/base.css +107 -0
- package/css/components.css +324 -0
- package/css/footer.css +53 -0
- package/css/header.css +231 -0
- package/css/layout.css +59 -0
- package/css/prose.css +119 -0
- package/css/sections.css +173 -0
- package/css/tokens.css +200 -0
- package/demo/index.html +703 -0
- package/demo/theme-example.html +133 -0
- package/docs/components.md +407 -0
- package/docs/markup-contract.md +148 -0
- package/docs/philosophy.md +69 -0
- package/docs/theming.md +96 -0
- package/js/website.js +186 -0
- package/package.json +50 -4
- package/skill/SKILL.md +49 -0
- package/system.json +122 -0
- package/templates/footer.html +40 -0
- package/templates/header.html +60 -0
- package/templates/page.html +134 -0
- package/templates/sections/cta.html +15 -0
- package/templates/sections/faq.html +24 -0
- package/templates/sections/features.html +32 -0
- package/templates/sections/hero.html +27 -0
- package/templates/sections/logos.html +15 -0
- package/templates/sections/pricing.html +51 -0
- package/templates/sections/prose.html +36 -0
- package/templates/sections/quote.html +13 -0
- package/templates/sections/showcase.html +25 -0
- package/templates/sections/split.html +27 -0
- package/templates/sections/stats.html +26 -0
- package/templates/sections/steps.html +17 -0
- package/website.css +1274 -0
- package/website.min.css +1 -0
package/system.json
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "The GemBoss website system in one file. css/tokens.css, the docs and `gemboss-website check` all read these values: change a value here, never in one of them alone. Values measured on gemboss.ai and the GemBoss dashboard (DESIGN-LANGUAGE.md of gemboss-www, 15/10/2026).",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"color": {
|
|
5
|
+
"light": {
|
|
6
|
+
"bg": "#ffffff",
|
|
7
|
+
"bg-soft": "#f2f3f5",
|
|
8
|
+
"surface": "#ffffff",
|
|
9
|
+
"ink": "#1b1c1e",
|
|
10
|
+
"ink-2": "#3b3d42",
|
|
11
|
+
"muted": "#686b71",
|
|
12
|
+
"line": "#e5e7ea",
|
|
13
|
+
"line-strong": "#d5d8dd",
|
|
14
|
+
"action": "#1b1c1e",
|
|
15
|
+
"action-hover": "#000000",
|
|
16
|
+
"on-action": "#ffffff",
|
|
17
|
+
"accent": "#5661f5",
|
|
18
|
+
"accent-strong": "#3a44de",
|
|
19
|
+
"accent-soft": "#eef0fe",
|
|
20
|
+
"on-accent": "#ffffff",
|
|
21
|
+
"success": "#007f5f",
|
|
22
|
+
"success-soft": "#e3f1df",
|
|
23
|
+
"warning": "#9a6700",
|
|
24
|
+
"night": "#0c0e14",
|
|
25
|
+
"night-2": "#141722",
|
|
26
|
+
"on-night": "#e3e4e8",
|
|
27
|
+
"on-night-muted": "#9aa3ff"
|
|
28
|
+
},
|
|
29
|
+
"dark": {
|
|
30
|
+
"bg": "#0d0d12",
|
|
31
|
+
"bg-soft": "#121318",
|
|
32
|
+
"surface": "#16171d",
|
|
33
|
+
"ink": "#e3e4e8",
|
|
34
|
+
"ink-2": "#c4c6cc",
|
|
35
|
+
"muted": "#9a9ca6",
|
|
36
|
+
"line": "#2a2b33",
|
|
37
|
+
"line-strong": "#383944",
|
|
38
|
+
"action": "#f2f3f5",
|
|
39
|
+
"action-hover": "#ffffff",
|
|
40
|
+
"on-action": "#0d0d12",
|
|
41
|
+
"accent": "#7c84ff",
|
|
42
|
+
"accent-strong": "#a3a9ff",
|
|
43
|
+
"accent-soft": "#1f2140",
|
|
44
|
+
"on-accent": "#0d0d12",
|
|
45
|
+
"success": "#34c38f",
|
|
46
|
+
"success-soft": "#132a22",
|
|
47
|
+
"warning": "#e0b341",
|
|
48
|
+
"night": "#0a0b10",
|
|
49
|
+
"night-2": "#12141c",
|
|
50
|
+
"on-night": "#e3e4e8",
|
|
51
|
+
"on-night-muted": "#9aa3ff"
|
|
52
|
+
},
|
|
53
|
+
"wash": {
|
|
54
|
+
"$comment": "Secondary hues. ONE job: the hero wash and illustrations. Never chrome, text, borders or buttons.",
|
|
55
|
+
"pink": "#ff6f5e",
|
|
56
|
+
"violet": "#7c8af7",
|
|
57
|
+
"sky": "#43b0ff",
|
|
58
|
+
"mint": "#1fcf9f"
|
|
59
|
+
},
|
|
60
|
+
"roles": {
|
|
61
|
+
"action": "The thing you click. Ink, not the accent.",
|
|
62
|
+
"accent": "Links, focus rings, active state, a chart line, the 8px label square. Never a button fill, never body text.",
|
|
63
|
+
"success/warning": "State only.",
|
|
64
|
+
"wash": "The hero wash and illustrations only."
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"radius": {
|
|
68
|
+
"scale": [0, 4, 6, 8, 12, 16, 20, 999],
|
|
69
|
+
"action": 8,
|
|
70
|
+
"chip": 999,
|
|
71
|
+
"card": 12,
|
|
72
|
+
"panel": 16
|
|
73
|
+
},
|
|
74
|
+
"shadow": {
|
|
75
|
+
"rest": "0 1px 2px rgba(31,30,29,.04), 0 2px 6px rgba(31,30,29,.06)",
|
|
76
|
+
"sm": "0 1px 2px rgba(31,30,29,.04)",
|
|
77
|
+
"raised": "0 4px 16px rgba(31,30,29,.10)",
|
|
78
|
+
"$comment": "The whole budget for chrome. A card sits; it does not hover. An illustration may light itself."
|
|
79
|
+
},
|
|
80
|
+
"type": {
|
|
81
|
+
"family": "Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif",
|
|
82
|
+
"mono": "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",
|
|
83
|
+
"weights": [400, 500, 600, 650, 700],
|
|
84
|
+
"scale": [11, 12, 13, 14, 16, 18, 20, 22, 24, 30],
|
|
85
|
+
"display_above": 30,
|
|
86
|
+
"display": {
|
|
87
|
+
"h1": "clamp(40px, 4.6vw, 68px)",
|
|
88
|
+
"h2": "clamp(32px, 3.4vw, 52px)",
|
|
89
|
+
"weight": 600,
|
|
90
|
+
"tracking": "-0.03em"
|
|
91
|
+
},
|
|
92
|
+
"heading": { "weight": 650, "tracking": "-0.022em", "line_height": 1.08 },
|
|
93
|
+
"subhead": { "weight": 600 },
|
|
94
|
+
"body": { "size": 18, "line_height": 1.6 },
|
|
95
|
+
"label": { "size": 13, "weight": 500, "case": "sentence", "$comment": "muted, led by the 8px accent square; never uppercase tracking" },
|
|
96
|
+
"button": { "size": 14, "weight": 600, "case": "sentence" }
|
|
97
|
+
},
|
|
98
|
+
"space": {
|
|
99
|
+
"scale": [0, 2, 4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 120],
|
|
100
|
+
"section": "clamp(56px, 38px + 5vw, 110px)",
|
|
101
|
+
"$comment": "4px base; 2px steps only below 8. Section rhythm comes from --space-section; the scale is for everything inside a section."
|
|
102
|
+
},
|
|
103
|
+
"layout": {
|
|
104
|
+
"wrap": 1120,
|
|
105
|
+
"wrap_narrow": 780,
|
|
106
|
+
"gutter": 22,
|
|
107
|
+
"header_height": 64,
|
|
108
|
+
"breakpoints": [480, 768, 1080],
|
|
109
|
+
"test_widths": [320, 390, 768, 1366]
|
|
110
|
+
},
|
|
111
|
+
"control": {
|
|
112
|
+
"button_height": 40,
|
|
113
|
+
"tap_target_min": 44
|
|
114
|
+
},
|
|
115
|
+
"motion": {
|
|
116
|
+
"properties": ["transform", "opacity"],
|
|
117
|
+
"ease": "cubic-bezier(.22,1,.36,1)",
|
|
118
|
+
"reveal_ms": 700,
|
|
119
|
+
"spin_ms": 700,
|
|
120
|
+
"$comment": "Animate transform and opacity only. Everything is still under prefers-reduced-motion (a busy button's ring turns once every spin_ms, as the dashboard's spinner, and stands still as an ellipsis)."
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Footer: one per site, the same on every page. A brand block, three to five link columns, a bottom row.
|
|
3
|
+
Limits: column headings are one or two words in sentence case; four to seven links per column; the bottom row
|
|
4
|
+
holds the copyright, the legal links and the social links, nothing else. Replace every [bracketed] placeholder.
|
|
5
|
+
-->
|
|
6
|
+
<footer class="gw-footer">
|
|
7
|
+
<div class="gw-wrap">
|
|
8
|
+
<div class="gw-footer__grid">
|
|
9
|
+
<div class="gw-footer__brand">
|
|
10
|
+
<a class="gw-brand" href="/"><img class="gw-brand__mark" src="[/logo.svg]" alt="" width="26" height="26"><span class="gw-brand__name">[Brand]</span></a>
|
|
11
|
+
<p>[One sentence on what the brand does for the reader.]</p>
|
|
12
|
+
</div>
|
|
13
|
+
<nav class="gw-footer__col" aria-label="[Column heading]">
|
|
14
|
+
<h2 class="gw-footer__heading">[Column heading]</h2>
|
|
15
|
+
<ul>
|
|
16
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
17
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
18
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
19
|
+
</ul>
|
|
20
|
+
</nav>
|
|
21
|
+
<nav class="gw-footer__col" aria-label="[Column heading]">
|
|
22
|
+
<h2 class="gw-footer__heading">[Column heading]</h2>
|
|
23
|
+
<ul>
|
|
24
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
25
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
26
|
+
</ul>
|
|
27
|
+
</nav>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="gw-footer__bottom">
|
|
30
|
+
<span>© [Year] [Company]. All rights reserved.</span>
|
|
31
|
+
<ul aria-label="Legal">
|
|
32
|
+
<li><a href="[/privacy]">Privacy</a></li>
|
|
33
|
+
<li><a href="[/terms]">Terms</a></li>
|
|
34
|
+
</ul>
|
|
35
|
+
<ul aria-label="Social">
|
|
36
|
+
<li><a href="[https://social profile]" rel="noopener">[Network]</a></li>
|
|
37
|
+
</ul>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</footer>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Header: one per site, the same on every page. Keep it in one partial or component, never copied per page.
|
|
3
|
+
A flat 64px bar with one hairline. Below 1080px the nav and Sign in hide and the menu button opens #gw-mobile-menu,
|
|
4
|
+
which repeats the same links. website.js runs the mega menus, the mobile menu and the theme toggle.
|
|
5
|
+
Limits: at most five top-level items, one .gw-btn (the primary action), one .gw-btn--secondary. Each mega panel:
|
|
6
|
+
two or three columns of four or five links, at most one feature card. The announcement bar is optional: one sentence.
|
|
7
|
+
Replace every [bracketed] placeholder; delete what you do not use.
|
|
8
|
+
-->
|
|
9
|
+
<div class="gw-announce" role="region" aria-label="Announcement">[One sentence of news.] <a href="[link]">[Where the link goes]</a></div>
|
|
10
|
+
<header class="gw-header" data-gw-header>
|
|
11
|
+
<div class="gw-wrap gw-header__bar">
|
|
12
|
+
<a class="gw-brand" href="/"><img class="gw-brand__mark" src="[/logo.svg]" alt="" width="26" height="26"><span class="gw-brand__name">[Brand]</span></a>
|
|
13
|
+
<nav class="gw-nav" aria-label="Main">
|
|
14
|
+
<ul class="gw-nav__list">
|
|
15
|
+
<li class="gw-nav__item">
|
|
16
|
+
<button class="gw-nav__trigger" type="button" aria-expanded="false" aria-controls="gw-mega-product" data-gw-mega="gw-mega-product">[Product menu item]</button>
|
|
17
|
+
<div class="gw-mega" id="gw-mega-product" hidden>
|
|
18
|
+
<div class="gw-wrap gw-mega__grid">
|
|
19
|
+
<div class="gw-mega__col">
|
|
20
|
+
<p class="gw-mega__heading">[Group]</p>
|
|
21
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="3" width="16" height="18" rx="2"/><path d="M8 8h8M8 12h8M8 16h5"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
22
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M7 15l4-4 3 3 5-6"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="gw-mega__col">
|
|
25
|
+
<p class="gw-mega__heading">[Group]</p>
|
|
26
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 11v5M12 8h.01"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
27
|
+
</div>
|
|
28
|
+
<a class="gw-mega__feature" href="[/page]"><b>[Feature title]</b><i>[One line on why to open it]</i><span class="gw-link gw-link--arrow">[Where it goes]</span></a>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</li>
|
|
32
|
+
<li class="gw-nav__item"><a class="gw-nav__link" href="[/pricing]">[Pricing]</a></li>
|
|
33
|
+
</ul>
|
|
34
|
+
</nav>
|
|
35
|
+
<div class="gw-header__actions">
|
|
36
|
+
<button class="gw-theme-toggle" type="button" data-gw-theme-toggle aria-label="Switch to dark theme"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="8"/><path d="M12 4a8 8 0 0 1 0 16z" fill="currentColor"/></svg></button>
|
|
37
|
+
<a class="gw-nav__link gw-header__signin" href="[sign-in URL]">Sign in</a>
|
|
38
|
+
<a class="gw-btn gw-btn--secondary gw-btn--sm" href="[/contact]">[Book a demo]</a>
|
|
39
|
+
<a class="gw-btn gw-btn--sm" href="[sign-up URL]">[Start free]</a>
|
|
40
|
+
<button class="gw-menu-toggle" type="button" aria-expanded="false" aria-controls="gw-mobile-menu" data-gw-menu-toggle aria-label="Open menu"><svg class="gw-menu-toggle__open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg><svg class="gw-menu-toggle__close" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18"/></svg></button>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="gw-mobile-menu" id="gw-mobile-menu" hidden>
|
|
44
|
+
<nav class="gw-wrap" aria-label="Main, mobile">
|
|
45
|
+
<details class="gw-mobile-menu__group">
|
|
46
|
+
<summary>[Product menu item]</summary>
|
|
47
|
+
<ul class="gw-mobile-menu__list">
|
|
48
|
+
<li><a class="gw-mobile-menu__link" href="[/page]">[Page title]</a></li>
|
|
49
|
+
<li><a class="gw-mobile-menu__link" href="[/page]">[Page title]</a></li>
|
|
50
|
+
</ul>
|
|
51
|
+
</details>
|
|
52
|
+
<a class="gw-mobile-menu__top" href="[/pricing]">[Pricing]</a>
|
|
53
|
+
<div class="gw-mobile-menu__actions">
|
|
54
|
+
<a class="gw-btn gw-btn--block" href="[sign-up URL]">[Start free]</a>
|
|
55
|
+
<a class="gw-btn gw-btn--secondary gw-btn--block" href="[/contact]">[Book a demo]</a>
|
|
56
|
+
<a class="gw-mobile-menu__link" href="[sign-in URL]">Sign in</a>
|
|
57
|
+
</div>
|
|
58
|
+
</nav>
|
|
59
|
+
</div>
|
|
60
|
+
</header>
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<!--
|
|
3
|
+
Page skeleton: start every new page from this file.
|
|
4
|
+
Serve website.css and website.js from node_modules/@gemboss/website-ui/ at the [/kit] path below (copy or route them),
|
|
5
|
+
then link the site's own CSS after the kit. Fill the header and footer once, in a shared partial.
|
|
6
|
+
One <h1> per page (in the hero), sections in the order the page needs, then delete every unused part.
|
|
7
|
+
Replace every [bracketed] placeholder. No lorem ipsum, no invented facts.
|
|
8
|
+
-->
|
|
9
|
+
<html lang="en">
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8">
|
|
12
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
13
|
+
<title>[Page title] · [Brand]</title>
|
|
14
|
+
<meta name="description" content="[One sentence, under 160 characters, on what this page offers the reader.]">
|
|
15
|
+
<link rel="icon" href="[/favicon.svg]" type="image/svg+xml">
|
|
16
|
+
<!-- the stored theme, applied before first paint (website.js keeps it in localStorage "gw-theme") -->
|
|
17
|
+
<script>try{var t=localStorage.getItem('gw-theme');if(t==='light'||t==='dark')document.documentElement.setAttribute('data-theme',t)}catch(e){}</script>
|
|
18
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
19
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
20
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;650;700&display=swap">
|
|
21
|
+
<link rel="stylesheet" href="[/kit]/website.css">
|
|
22
|
+
<link rel="stylesheet" href="[/assets]/site.css">
|
|
23
|
+
</head>
|
|
24
|
+
<body class="gw-page">
|
|
25
|
+
<a class="gw-skip" href="#main">Skip to content</a>
|
|
26
|
+
|
|
27
|
+
<div class="gw-announce" role="region" aria-label="Announcement">[One sentence of news.] <a href="[link]">[Where the link goes]</a></div>
|
|
28
|
+
<header class="gw-header" data-gw-header>
|
|
29
|
+
<div class="gw-wrap gw-header__bar">
|
|
30
|
+
<a class="gw-brand" href="/"><img class="gw-brand__mark" src="[/logo.svg]" alt="" width="26" height="26"><span class="gw-brand__name">[Brand]</span></a>
|
|
31
|
+
<nav class="gw-nav" aria-label="Main">
|
|
32
|
+
<ul class="gw-nav__list">
|
|
33
|
+
<li class="gw-nav__item">
|
|
34
|
+
<button class="gw-nav__trigger" type="button" aria-expanded="false" aria-controls="gw-mega-product" data-gw-mega="gw-mega-product">[Product menu item]</button>
|
|
35
|
+
<div class="gw-mega" id="gw-mega-product" hidden>
|
|
36
|
+
<div class="gw-wrap gw-mega__grid">
|
|
37
|
+
<div class="gw-mega__col">
|
|
38
|
+
<p class="gw-mega__heading">[Group]</p>
|
|
39
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="3" width="16" height="18" rx="2"/><path d="M8 8h8M8 12h8M8 16h5"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
40
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M7 15l4-4 3 3 5-6"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="gw-mega__col">
|
|
43
|
+
<p class="gw-mega__heading">[Group]</p>
|
|
44
|
+
<a class="gw-mega__link" href="[/page]"><span class="gw-mega__icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 11v5M12 8h.01"/></svg></span><span><b>[Page title]</b><i>[One line on what it does]</i></span></a>
|
|
45
|
+
</div>
|
|
46
|
+
<a class="gw-mega__feature" href="[/page]"><b>[Feature title]</b><i>[One line on why to open it]</i><span class="gw-link gw-link--arrow">[Where it goes]</span></a>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</li>
|
|
50
|
+
<li class="gw-nav__item"><a class="gw-nav__link" href="[/pricing]">[Pricing]</a></li>
|
|
51
|
+
</ul>
|
|
52
|
+
</nav>
|
|
53
|
+
<div class="gw-header__actions">
|
|
54
|
+
<button class="gw-theme-toggle" type="button" data-gw-theme-toggle aria-label="Switch to dark theme"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true"><circle cx="12" cy="12" r="8"/><path d="M12 4a8 8 0 0 1 0 16z" fill="currentColor"/></svg></button>
|
|
55
|
+
<a class="gw-nav__link gw-header__signin" href="[sign-in URL]">Sign in</a>
|
|
56
|
+
<a class="gw-btn gw-btn--secondary gw-btn--sm" href="[/contact]">[Book a demo]</a>
|
|
57
|
+
<a class="gw-btn gw-btn--sm" href="[sign-up URL]">[Start free]</a>
|
|
58
|
+
<button class="gw-menu-toggle" type="button" aria-expanded="false" aria-controls="gw-mobile-menu" data-gw-menu-toggle aria-label="Open menu"><svg class="gw-menu-toggle__open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M4 7h16M4 12h16M4 17h16"/></svg><svg class="gw-menu-toggle__close" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18"/></svg></button>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="gw-mobile-menu" id="gw-mobile-menu" hidden>
|
|
62
|
+
<nav class="gw-wrap" aria-label="Main, mobile">
|
|
63
|
+
<details class="gw-mobile-menu__group">
|
|
64
|
+
<summary>[Product menu item]</summary>
|
|
65
|
+
<ul class="gw-mobile-menu__list">
|
|
66
|
+
<li><a class="gw-mobile-menu__link" href="[/page]">[Page title]</a></li>
|
|
67
|
+
<li><a class="gw-mobile-menu__link" href="[/page]">[Page title]</a></li>
|
|
68
|
+
</ul>
|
|
69
|
+
</details>
|
|
70
|
+
<a class="gw-mobile-menu__top" href="[/pricing]">[Pricing]</a>
|
|
71
|
+
<div class="gw-mobile-menu__actions">
|
|
72
|
+
<a class="gw-btn gw-btn--block" href="[sign-up URL]">[Start free]</a>
|
|
73
|
+
<a class="gw-btn gw-btn--secondary gw-btn--block" href="[/contact]">[Book a demo]</a>
|
|
74
|
+
<a class="gw-mobile-menu__link" href="[sign-in URL]">Sign in</a>
|
|
75
|
+
</div>
|
|
76
|
+
</nav>
|
|
77
|
+
</div>
|
|
78
|
+
</header>
|
|
79
|
+
|
|
80
|
+
<main id="main">
|
|
81
|
+
<!-- sections from templates/sections/: hero first, then proof, features, a split or showcase, FAQ, CTA -->
|
|
82
|
+
<section class="gw-hero">
|
|
83
|
+
<div class="gw-hero__wash" aria-hidden="true"></div>
|
|
84
|
+
<div class="gw-wrap">
|
|
85
|
+
<p class="gw-label">[Short label]</p>
|
|
86
|
+
<h1><span class="gw-dim">[Muted first sentence.]</span> [Ink second sentence.]</h1>
|
|
87
|
+
<p class="gw-lead">[One or two lines on what it does for the reader.]</p>
|
|
88
|
+
<div class="gw-actions">
|
|
89
|
+
<a class="gw-btn" href="[link]">[Primary action]</a>
|
|
90
|
+
<a class="gw-btn gw-btn--secondary" href="[link]">[Second action]</a>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
</main>
|
|
95
|
+
|
|
96
|
+
<footer class="gw-footer">
|
|
97
|
+
<div class="gw-wrap">
|
|
98
|
+
<div class="gw-footer__grid">
|
|
99
|
+
<div class="gw-footer__brand">
|
|
100
|
+
<a class="gw-brand" href="/"><img class="gw-brand__mark" src="[/logo.svg]" alt="" width="26" height="26"><span class="gw-brand__name">[Brand]</span></a>
|
|
101
|
+
<p>[One sentence on what the brand does for the reader.]</p>
|
|
102
|
+
</div>
|
|
103
|
+
<nav class="gw-footer__col" aria-label="[Column heading]">
|
|
104
|
+
<h2 class="gw-footer__heading">[Column heading]</h2>
|
|
105
|
+
<ul>
|
|
106
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
107
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
108
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
109
|
+
</ul>
|
|
110
|
+
</nav>
|
|
111
|
+
<nav class="gw-footer__col" aria-label="[Column heading]">
|
|
112
|
+
<h2 class="gw-footer__heading">[Column heading]</h2>
|
|
113
|
+
<ul>
|
|
114
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
115
|
+
<li><a href="[/page]">[Page title]</a></li>
|
|
116
|
+
</ul>
|
|
117
|
+
</nav>
|
|
118
|
+
</div>
|
|
119
|
+
<div class="gw-footer__bottom">
|
|
120
|
+
<span>© [Year] [Company]. All rights reserved.</span>
|
|
121
|
+
<ul aria-label="Legal">
|
|
122
|
+
<li><a href="[/privacy]">Privacy</a></li>
|
|
123
|
+
<li><a href="[/terms]">Terms</a></li>
|
|
124
|
+
</ul>
|
|
125
|
+
<ul aria-label="Social">
|
|
126
|
+
<li><a href="[https://social profile]" rel="noopener">[Network]</a></li>
|
|
127
|
+
</ul>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</footer>
|
|
131
|
+
|
|
132
|
+
<script src="[/kit]/website.js" defer></script>
|
|
133
|
+
</body>
|
|
134
|
+
</html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
CTA: the closing call to action, the last section before the footer. One headline, one line, the same primary
|
|
3
|
+
action as the hero. Put it in a night band (the closing CTA does not count toward the three night bands; never right after another night band)
|
|
4
|
+
or in .gw-section--soft. Limits: one .gw-btn and at most one secondary; no forms that collect nothing.
|
|
5
|
+
-->
|
|
6
|
+
<section class="gw-section gw-band--night">
|
|
7
|
+
<div class="gw-wrap gw-cta">
|
|
8
|
+
<h2>[Headline: the outcome, one more time]</h2>
|
|
9
|
+
<p class="gw-lead">[One line on the first step.]</p>
|
|
10
|
+
<div class="gw-actions">
|
|
11
|
+
<a class="gw-btn" href="[link]">[Primary action]</a>
|
|
12
|
+
<a class="gw-btn gw-btn--secondary" href="[link]">[Second action]</a>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
FAQ: the questions a reader really asks before they act, answered in two to four sentences each, with the same
|
|
3
|
+
facts as the rest of the site. Native details/summary: no script. Limits: four to eight questions, questions as
|
|
4
|
+
the reader would ask them, no marketing claims hidden in answers. Mark it up as FAQPage JSON-LD only if every
|
|
5
|
+
answer is visible on the page.
|
|
6
|
+
-->
|
|
7
|
+
<section class="gw-section">
|
|
8
|
+
<div class="gw-wrap gw-wrap--narrow">
|
|
9
|
+
<div class="gw-section__head">
|
|
10
|
+
<p class="gw-label">FAQ</p>
|
|
11
|
+
<h2>[Headline, e.g. Good to know]</h2>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="gw-faq">
|
|
14
|
+
<details class="gw-faq__item">
|
|
15
|
+
<summary>[A question the reader asks?]</summary>
|
|
16
|
+
<p>[The answer in two to four sentences.]</p>
|
|
17
|
+
</details>
|
|
18
|
+
<details class="gw-faq__item">
|
|
19
|
+
<summary>[A question the reader asks?]</summary>
|
|
20
|
+
<p>[The answer.]</p>
|
|
21
|
+
</details>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</section>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Features: what the product does, three to six short items in a grid (.gw-grid--3, or --2 / --4).
|
|
3
|
+
Each: a 20px stroke icon (aria-hidden), a title of two to five words, one or two lines. Say what it does today,
|
|
4
|
+
not a promise. Add .gw-card to each .gw-feature only when the section background is soft and they need a frame.
|
|
5
|
+
Limits: one section head, no buttons inside the items (one action under the grid at most).
|
|
6
|
+
-->
|
|
7
|
+
<section class="gw-section gw-section--soft">
|
|
8
|
+
<div class="gw-wrap">
|
|
9
|
+
<div class="gw-section__head">
|
|
10
|
+
<p class="gw-label">[Short label]</p>
|
|
11
|
+
<h2><span class="gw-dim">[Muted first sentence.]</span> [Ink second sentence.]</h2>
|
|
12
|
+
<p class="gw-lead">[One or two lines.]</p>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="gw-features gw-grid--3">
|
|
15
|
+
<div class="gw-feature">
|
|
16
|
+
<span class="gw-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 4h18l-7 8v6l-4 2v-8z"/></svg></span>
|
|
17
|
+
<h3>[Feature title]</h3>
|
|
18
|
+
<p>[One or two lines on what it does for the reader.]</p>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="gw-feature">
|
|
21
|
+
<span class="gw-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M7 15l4-4 3 3 5-6"/></svg></span>
|
|
22
|
+
<h3>[Feature title]</h3>
|
|
23
|
+
<p>[One or two lines.]</p>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="gw-feature">
|
|
26
|
+
<span class="gw-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg></span>
|
|
27
|
+
<h3>[Feature title]</h3>
|
|
28
|
+
<p>[One or two lines.]</p>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</section>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Hero: the first screen of a page, and the only place for the <h1>. Use once per page, at the top of <main>.
|
|
3
|
+
Variants: .gw-hero--center (centred, for short promises), .gw-hero--compact (subpages: less height, h2-sized h1).
|
|
4
|
+
Add .gw-band--night for a dark hero (it counts as one of the page's three night bands).
|
|
5
|
+
Limits: a short label, a two-part headline (muted first sentence, ink second), at most two lines under it,
|
|
6
|
+
one .gw-btn and one secondary action. The optional window holds a real product screen (img with alt, width, height)
|
|
7
|
+
or a drawn mock-up. Numbers in it that are not real get the caption "Illustrative data." (vi: "Dữ liệu minh hoạ.",
|
|
8
|
+
zh: "示意数据。"); real ones get their source there. Never tuck the hero under the header.
|
|
9
|
+
-->
|
|
10
|
+
<section class="gw-hero">
|
|
11
|
+
<div class="gw-hero__wash" aria-hidden="true"></div>
|
|
12
|
+
<div class="gw-wrap">
|
|
13
|
+
<p class="gw-label">[Short label]</p>
|
|
14
|
+
<h1><span class="gw-dim">[Muted first sentence.]</span> [Ink second sentence.]</h1>
|
|
15
|
+
<p class="gw-lead">[One or two lines on what it does for the reader.]</p>
|
|
16
|
+
<div class="gw-actions">
|
|
17
|
+
<a class="gw-btn" href="[link]">[Primary action]</a>
|
|
18
|
+
<a class="gw-btn gw-btn--secondary" href="[link]">[Second action]</a>
|
|
19
|
+
</div>
|
|
20
|
+
<p class="gw-note">[One short reassurance, e.g. the trial terms. Delete if there is none.]</p>
|
|
21
|
+
<div class="gw-window">
|
|
22
|
+
<div class="gw-window__bar">[Where this screen lives, e.g. the app section]</div>
|
|
23
|
+
<div class="gw-window__body"><img src="[/img/screen.webp]" alt="[What the screen shows]" width="[1200]" height="[750]"></div>
|
|
24
|
+
<p class="gw-window__caption">[Illustrative data. Or the source of the numbers. Delete when the screen shows no numbers.]</p>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</section>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Logos: a proof strip right under the hero. Real customers or partners only, each logo used with permission,
|
|
3
|
+
or the brand's own product wordmarks. Never a made-up brand, never "as seen in" without the source.
|
|
4
|
+
Limits: one short line above, four to eight logos, all at the same height (28px), in their single-colour version.
|
|
5
|
+
-->
|
|
6
|
+
<section class="gw-logos" aria-label="[What these logos are, e.g. Customers]">
|
|
7
|
+
<div class="gw-wrap">
|
|
8
|
+
<p>[One short line, e.g. Trusted by]</p>
|
|
9
|
+
<ul>
|
|
10
|
+
<li><img src="[/img/logo-1.svg]" alt="[Company name]" width="[112]" height="28"></li>
|
|
11
|
+
<li><img src="[/img/logo-2.svg]" alt="[Company name]" width="[112]" height="28"></li>
|
|
12
|
+
<li>[Wordmark as text]</li>
|
|
13
|
+
</ul>
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Pricing: plan cards with the brand's real plan names and prices, exactly as billed. A missing price is [PRICE]
|
|
3
|
+
and a question to the person, never a guess. One plan may be .gw-plan--featured (an accent hairline, never a fill)
|
|
4
|
+
and only that one gets the filled .gw-btn; the others get .gw-btn--secondary.
|
|
5
|
+
Monthly / yearly: the .gw-segmented radio group, only when the brand really bills yearly for less, with the real
|
|
6
|
+
discount in its label. Every price is in the markup twice, data-gw-show="billing:monthly" and
|
|
7
|
+
data-gw-show="billing:yearly" (hidden): the page reads the monthly prices without the script, and website.js
|
|
8
|
+
swaps them on a choice. Under the price, say what is billed ("Billed $470.40 a year"). No yearly billing: delete
|
|
9
|
+
the control and every data-gw-show="billing:yearly" element.
|
|
10
|
+
Limits: two to four plans, four to six lines per plan, the same lines in the same order on every plan.
|
|
11
|
+
-->
|
|
12
|
+
<section class="gw-section">
|
|
13
|
+
<div class="gw-wrap">
|
|
14
|
+
<div class="gw-section__head gw-section__head--center">
|
|
15
|
+
<p class="gw-label">Pricing</p>
|
|
16
|
+
<h2>[Headline about how pricing works]</h2>
|
|
17
|
+
<p class="gw-lead">[One line: trial, billing, what every plan includes.]</p>
|
|
18
|
+
<div class="gw-segmented" role="radiogroup" aria-label="[Billing period]" data-gw-segmented="billing">
|
|
19
|
+
<button type="button" role="radio" aria-checked="true" value="monthly">[Monthly]</button>
|
|
20
|
+
<button type="button" role="radio" aria-checked="false" value="yearly">[Yearly –DISCOUNT%]</button>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="gw-pricing">
|
|
24
|
+
<div class="gw-plan">
|
|
25
|
+
<h3>[Plan]</h3>
|
|
26
|
+
<p>[Who it is for, in one line]</p>
|
|
27
|
+
<p class="gw-plan__price"><span data-gw-show="billing:monthly">[PRICE]</span><span data-gw-show="billing:yearly" hidden>[PRICE A MONTH, BILLED YEARLY]</span> <small>/ month</small></p>
|
|
28
|
+
<p><span data-gw-show="billing:monthly">[Billed monthly]</span><span data-gw-show="billing:yearly" hidden>[Billed $X a year]</span></p>
|
|
29
|
+
<a class="gw-btn gw-btn--secondary gw-btn--block" href="[link]">[Action]</a>
|
|
30
|
+
<ul class="gw-list--check"><li>[What is included]</li><li>[What is included]</li></ul>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="gw-plan gw-plan--featured">
|
|
33
|
+
<span class="gw-badge gw-badge--accent">[Why this one, e.g. Recommended for …]</span>
|
|
34
|
+
<h3>[Plan]</h3>
|
|
35
|
+
<p>[Who it is for]</p>
|
|
36
|
+
<p class="gw-plan__price"><span data-gw-show="billing:monthly">[PRICE]</span><span data-gw-show="billing:yearly" hidden>[PRICE A MONTH, BILLED YEARLY]</span> <small>/ month</small></p>
|
|
37
|
+
<p><span data-gw-show="billing:monthly">[Billed monthly]</span><span data-gw-show="billing:yearly" hidden>[Billed $X a year]</span></p>
|
|
38
|
+
<a class="gw-btn gw-btn--block" href="[link]">[Action]</a>
|
|
39
|
+
<ul class="gw-list--check"><li>[What is included]</li><li>[What is included]</li></ul>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="gw-plan">
|
|
42
|
+
<h3>[Plan]</h3>
|
|
43
|
+
<p>[Who it is for]</p>
|
|
44
|
+
<p class="gw-plan__price"><span data-gw-show="billing:monthly">[PRICE]</span><span data-gw-show="billing:yearly" hidden>[PRICE A MONTH, BILLED YEARLY]</span> <small>/ month</small></p>
|
|
45
|
+
<p><span data-gw-show="billing:monthly">[Billed monthly]</span><span data-gw-show="billing:yearly" hidden>[Billed $X a year]</span></p>
|
|
46
|
+
<a class="gw-btn gw-btn--secondary gw-btn--block" href="[link]">[Action]</a>
|
|
47
|
+
<ul class="gw-list--check"><li>[What is included]</li><li>[What is included]</li></ul>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Prose: a page that is read rather than scanned (a blog post, a docs page, terms, privacy). Put the article's own
|
|
3
|
+
HTML inside .gw-prose as it comes from the CMS or the markdown renderer: no classes needed on its headings,
|
|
4
|
+
paragraphs, lists, quotes, code, tables or images. Add .gw-prose--sm (16px) for docs and legal pages.
|
|
5
|
+
The page's <h1> is the article title: in a .gw-hero--compact above, or as the first child of .gw-prose.
|
|
6
|
+
Limits: one article per page; headings in order (h2, then h3) and never used for size alone; every image with
|
|
7
|
+
alt, width and height; a wide table in the .gw-table wrapper (a bare table scrolls inside its own box too).
|
|
8
|
+
-->
|
|
9
|
+
<section class="gw-section">
|
|
10
|
+
<div class="gw-wrap gw-wrap--narrow">
|
|
11
|
+
<article class="gw-prose">
|
|
12
|
+
<h1>[Article title]</h1>
|
|
13
|
+
<p>[The first paragraph: what the reader will know or be able to do by the end.]</p>
|
|
14
|
+
<h2>[A section of the article]</h2>
|
|
15
|
+
<p>[Paragraphs of two to five sentences. Links go where they say: <a href="[link]">[the setup guide]</a>.]</p>
|
|
16
|
+
<ul>
|
|
17
|
+
<li>[A point, in one or two lines]</li>
|
|
18
|
+
<li>[A point]</li>
|
|
19
|
+
</ul>
|
|
20
|
+
<h3>[A step or a sub-topic]</h3>
|
|
21
|
+
<p>[Inline code for a command or a name the reader types: <code>[npx gemboss-website check]</code>.]</p>
|
|
22
|
+
<pre><code>[a block of code or a config the reader copies]</code></pre>
|
|
23
|
+
<blockquote><p>[A quotation, with its source in the text around it.]</p></blockquote>
|
|
24
|
+
<figure>
|
|
25
|
+
<img src="[/img/article-screen.webp]" alt="[What the picture shows]" width="[1200]" height="[750]" loading="lazy">
|
|
26
|
+
<figcaption>[What to notice in the picture, or where it comes from.]</figcaption>
|
|
27
|
+
</figure>
|
|
28
|
+
<div class="gw-table" role="region" aria-label="[What the table compares]" tabindex="0">
|
|
29
|
+
<table>
|
|
30
|
+
<thead><tr><th scope="col">[Column]</th><th scope="col">[Column]</th></tr></thead>
|
|
31
|
+
<tbody><tr><th scope="row">[Row]</th><td>[Value]</td></tr></tbody>
|
|
32
|
+
</table>
|
|
33
|
+
</div>
|
|
34
|
+
</article>
|
|
35
|
+
</div>
|
|
36
|
+
</section>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Quote: one testimonial from a real customer who agreed to be quoted, word for word, with their real name, role
|
|
3
|
+
and company. Never write a quote for someone, never "a happy customer", never a stock photo as the face.
|
|
4
|
+
No real quote yet? Leave this section out. Limits: one quote per section, under 40 words.
|
|
5
|
+
-->
|
|
6
|
+
<section class="gw-section gw-section--soft">
|
|
7
|
+
<div class="gw-wrap">
|
|
8
|
+
<figure class="gw-quote">
|
|
9
|
+
<blockquote><p>[The customer's exact words.]</p></blockquote>
|
|
10
|
+
<figcaption><b>[Full name]</b>, [role], [company]</figcaption>
|
|
11
|
+
</figure>
|
|
12
|
+
</div>
|
|
13
|
+
</section>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Showcase: a night band with one large product screen and two or three points under it. Use for the one feature
|
|
3
|
+
the page is about. It counts as a night band: at most three per page, never two in a row.
|
|
4
|
+
Limits: centred head (label, h2, two lines), one window (a real screen, or a mock-up whose made-up numbers carry
|
|
5
|
+
the caption "Illustrative data."), two or three points (.gw-features in .gw-grid--3 or --2), at most one action pair.
|
|
6
|
+
-->
|
|
7
|
+
<section class="gw-section gw-band--night gw-showcase">
|
|
8
|
+
<div class="gw-wrap">
|
|
9
|
+
<div class="gw-section__head gw-section__head--center">
|
|
10
|
+
<p class="gw-label">[Short label]</p>
|
|
11
|
+
<h2><span class="gw-dim">[Muted first sentence.]</span> [Ink second sentence.]</h2>
|
|
12
|
+
<p class="gw-lead">[One or two lines.]</p>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="gw-window">
|
|
15
|
+
<div class="gw-window__bar">[Where this screen lives]</div>
|
|
16
|
+
<div class="gw-window__body"><img src="[/img/screen.webp]" alt="[What the screen shows]" width="[1600]" height="[1000]" loading="lazy"></div>
|
|
17
|
+
<p class="gw-window__caption">[Illustrative data. Or the source of the numbers. Delete when the screen shows no numbers.]</p>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="gw-features gw-grid--3">
|
|
20
|
+
<div class="gw-feature"><h3>[Point]</h3><p>[One line.]</p></div>
|
|
21
|
+
<div class="gw-feature"><h3>[Point]</h3><p>[One line.]</p></div>
|
|
22
|
+
<div class="gw-feature"><h3>[Point]</h3><p>[One line.]</p></div>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</section>
|