@buttonschool/create-wireframe 0.1.0 → 0.1.2

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/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Button School
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md CHANGED
@@ -10,12 +10,20 @@ cd my-app
10
10
  pnpm dev
11
11
  ```
12
12
 
13
+ Or with npm or yarn: `npm create @buttonschool/wireframe my-app` / `yarn create @buttonschool/wireframe my-app`. The CLI runs the matching install command (pnpm, npm, or yarn). Then `pnpm build` and `pnpm preview` (or `npm run build` / `npm run preview`) to build and preview production.
14
+
13
15
  ## What’s included
14
16
 
15
17
  - **Vite** – dev server with HMR, `pnpm dev` / `pnpm build` / `pnpm preview`
18
+ - **Two-page starter** – Start (small word game, Spelling Bee–style) and token showcase; CSS is linked from HTML (`<link>` in each page’s head); every root-level `.html` file is automatically a page (add a file and a nav link, no config change)
16
19
  - **Design tokens** – `src/kit/tokens.css`: grayscale palette, semantic color aliases, spacing scale, border radius, typography (Comic Neue)
17
20
  - **Comic Neue** – via [@fontsource/comic-neue](https://fontsource.org/fonts/comic-neue) (OFL-1.1)
18
21
  - **Lucide** – dependency only; [Lucide icons](https://lucide.dev) – import and render as SVG as needed
19
22
  - **AGENTS.md** – short instructions for AI/code-gen (tokens location, dev server, icons)
23
+ - **Accessibility** – starter includes basic a11y: live regions, current-page marking on nav, and visually hidden labels where needed; extend as you build.
20
24
 
21
25
  First version: tokens + font + icons only, no component CSS. Not opinionated; add your own structure.
26
+
27
+ ## License
28
+
29
+ ISC.
package/index.js CHANGED
@@ -8,6 +8,14 @@ import { spawn } from "child_process";
8
8
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
9
  const templateDir = join(__dirname, "template");
10
10
 
11
+ function getPackageManager() {
12
+ const execPath = process.env.npm_execpath || "";
13
+ const userAgent = process.env.npm_config_user_agent || "";
14
+ if (execPath.includes("pnpm") || userAgent.startsWith("pnpm/")) return "pnpm";
15
+ if (execPath.includes("yarn") || userAgent.startsWith("yarn/")) return "yarn";
16
+ return "npm";
17
+ }
18
+
11
19
  const projectName = process.argv[2];
12
20
  if (!projectName) {
13
21
  console.error("Usage: pnpm create @buttonschool/wireframe <project-name>");
@@ -27,12 +35,17 @@ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
27
35
  pkg.name = projectName;
28
36
  writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
29
37
 
30
- const child = spawn("pnpm", ["install"], {
38
+ const pm = getPackageManager();
39
+ const installCmd = pm === "pnpm" ? "pnpm" : pm === "yarn" ? "yarn" : "npm";
40
+ const installArgs = pm === "npm" ? ["install"] : ["install"];
41
+ const devCmd = pm === "pnpm" ? "pnpm dev" : pm === "yarn" ? "yarn dev" : "npm run dev";
42
+
43
+ const child = spawn(installCmd, installArgs, {
31
44
  cwd: targetDir,
32
45
  stdio: "inherit",
33
46
  shell: true,
34
47
  });
35
48
  child.on("close", (code) => {
36
49
  if (code !== 0) process.exit(code);
37
- console.log(`\nDone. Run:\n cd ${projectName}\n pnpm dev\n`);
50
+ console.log(`\nDone. Run:\n cd ${projectName}\n ${devCmd}\n`);
38
51
  });
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "@buttonschool/create-wireframe",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Scaffold a Vite-based wireframe prototype with tokens, Comic Neue, and Lucide",
5
5
  "type": "module",
6
6
  "bin": "index.js",
7
7
  "files": [
8
8
  "template",
9
- "index.js"
9
+ "index.js",
10
+ "LICENSE"
10
11
  ],
12
+ "license": "ISC",
11
13
  "engines": {
12
14
  "node": ">=18"
13
15
  },
@@ -0,0 +1,8 @@
1
+ root = true
2
+
3
+ [*]
4
+ indent_style = space
5
+ indent_size = 2
6
+ end_of_line = lf
7
+ charset = utf-8
8
+ trim_trailing_whitespace = true
@@ -2,10 +2,16 @@
2
2
 
3
3
  This is a **wireframe prototype** scaffold. Stack: **Vite** (vanilla JS), design tokens, **Comic Neue** font, and **Lucide** icons. Keep structure minimal; suitable for code-gen and rapid iteration.
4
4
 
5
+ The project starts with **two HTML pages**: **Start** (`index.html`) has a small word game (Spelling Bee–style); **Tokens** (`tokens.html`) showcases the design tokens. Both share a nav linking to each other. Styles are linked from each page’s `<head>` via `<link rel="stylesheet" href="/src/styles/main.css">`. Prefer writing markup in HTML files and using JS only for behavior. To add a page: add a new `.html` file at the project root and add a link to it in the nav; no need to edit Vite config (every root-level HTML file is automatically a page).
6
+
7
+ ## Styles
8
+
9
+ Styles are organized under `src/styles/`: `main.css` (orchestration), `base.css`, `layout.css`, `components/` (e.g. nav, button), and `pages/` (home, tokens-showcase). To remove or add a page or component, edit the corresponding file and the `@import` list in `styles/main.css`.
10
+
5
11
  ## Tokens
6
12
 
7
13
  - **Location:** `src/kit/tokens.css`
8
- - **Usage:** CSS custom properties on `:root` with `--wire-*` prefix: colors (grayscale + semantic aliases), spacing (`--wire-space-*`), radius (`--wire-radius-*`), typography (`--wire-font-family`, `--wire-line-height`). Use them in your CSS, e.g. `color: var(--wire-text-primary);`, `padding: var(--wire-space-md);`.
14
+ - **Usage:** CSS custom properties on `:root` with `--wire-*` prefix: colors (grayscale + semantic aliases), spacing (`--wire-space-*`), radius (`--wire-radius-*`), typography (`--wire-font-family`, `--wire-line-height`), font sizes (`--wire-text-xs` through `--wire-text-2xl`, plus semantic aliases like `--wire-text-body`, `--wire-text-heading`, `--wire-text-subheading`, `--wire-text-caption`, `--wire-text-label`), and sizing (`--wire-size-icon-sm`, `--wire-size-icon-md`, `--wire-size-icon-lg`, `--wire-size-avatar-sm`, `--wire-size-avatar-md`, `--wire-size-avatar-lg`). Use them in your CSS, e.g. `color: var(--wire-text-primary);`, `padding: var(--wire-space-md);`, `font-size: var(--wire-text-body);`, `width: var(--wire-size-icon-md); height: var(--wire-size-icon-md);`.
9
15
 
10
16
  ## Dev server
11
17
 
@@ -13,4 +19,8 @@ This is a **wireframe prototype** scaffold. Stack: **Vite** (vanilla JS), design
13
19
 
14
20
  ## Icons
15
21
 
16
- - **Lucide** is installed. Import icons and render as SVG (e.g. use the `lucide` package API or copy SVGs from [Lucide](https://lucide.dev)). Prefer semantic icon names; keep icons consistent with wireframe style.
22
+ - **Lucide** is installed. Import icons and render as SVG (e.g. use the `lucide` package API or copy SVGs from [Lucide](https://lucide.dev)). Prefer semantic icon names; keep icons consistent with wireframe style. Example: the Start page uses `data-lucide="crown"` in the HTML and `createIcons({ icons: { Crown } })` from `lucide` in JS to render the crown icon.
23
+
24
+ ## Accessibility
25
+
26
+ The starter includes basic a11y: `aria-live` for dynamic feedback, `aria-current="page"` on the nav, and `.visually-hidden` for labels. Extend with focus management, landmarks, and ARIA as needed.
@@ -3,10 +3,34 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="stylesheet" href="/src/styles/main.css" />
6
7
  <title>Wireframe</title>
7
8
  </head>
8
9
  <body>
9
- <div id="app"></div>
10
+ <nav class="site-nav">
11
+ <a href="/" aria-current="page">Start</a>
12
+ <a href="/tokens.html">Tokens</a>
13
+ </nav>
14
+ <main class="game-area">
15
+ <p class="bee-score" aria-live="polite"><i data-lucide="crown" class="bee-score-icon" aria-hidden="true"></i><span class="bee-score-value">0</span><span class="bee-score-label visually-hidden"> points</span></p>
16
+ <div class="bee-honeycomb" aria-hidden="true"></div>
17
+ <div class="bee-input-row">
18
+ <label for="bee-word" class="visually-hidden">Your word</label>
19
+ <input
20
+ type="text"
21
+ id="bee-word"
22
+ class="bee-input"
23
+ placeholder="Enter a word"
24
+ autocomplete="off"
25
+ autocapitalize="off"
26
+ maxlength="15"
27
+ />
28
+ <button type="button" class="bee-submit">Guess</button>
29
+ </div>
30
+ <p class="bee-feedback" aria-live="polite"></p>
31
+ <h2 class="bee-found-heading">Found words</h2>
32
+ <ul class="bee-found-list" aria-live="polite"></ul>
33
+ </main>
10
34
  <script type="module" src="/src/main.js"></script>
11
35
  </body>
12
36
  </html>
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Spelling Bee clone – pangram WIREFRAME.
3
+ * Letters: W, I, R, E, F, A, M. Center letter E (required in every word).
4
+ */
5
+
6
+ import { createIcons, Crown } from "lucide";
7
+
8
+ const LETTERS = ["W", "I", "R", "E", "F", "A", "M"];
9
+ const CENTER_LETTER = "E";
10
+ const MIN_LENGTH = 4;
11
+ const STORAGE_KEY = "wireframe-bee-found";
12
+
13
+ const WORD_LIST = new Set([
14
+ "aerie",
15
+ "aerier",
16
+ "afar",
17
+ "afear",
18
+ "affair",
19
+ "affirm",
20
+ "affirmer",
21
+ "afire",
22
+ "aimer",
23
+ "airer",
24
+ "airfare",
25
+ "airframe",
26
+ "airier",
27
+ "area",
28
+ "arear",
29
+ "aria",
30
+ "arrear",
31
+ "aware",
32
+ "awarer",
33
+ "eerie",
34
+ "eerier",
35
+ "emir",
36
+ "ewer",
37
+ "faerie",
38
+ "fair",
39
+ "fairer",
40
+ "fame",
41
+ "fare",
42
+ "farer",
43
+ "farm",
44
+ "farmer",
45
+ "farmwife",
46
+ "farrier",
47
+ "fear",
48
+ "fearer",
49
+ "femme",
50
+ "ferm",
51
+ "fermi",
52
+ "fewer",
53
+ "fief",
54
+ "fierier",
55
+ "fife",
56
+ "fifer",
57
+ "fire",
58
+ "firearm",
59
+ "firer",
60
+ "firm",
61
+ "firmer",
62
+ "firmware",
63
+ "frame",
64
+ "framer",
65
+ "free",
66
+ "freer",
67
+ "freeware",
68
+ "friar",
69
+ "frier",
70
+ "iffier",
71
+ "imam",
72
+ "mafia",
73
+ "maim",
74
+ "maimer",
75
+ "mama",
76
+ "mamma",
77
+ "mare",
78
+ "marm",
79
+ "marrer",
80
+ "marrier",
81
+ "meme",
82
+ "mere",
83
+ "merer",
84
+ "merrier",
85
+ "miff",
86
+ "miffier",
87
+ "mime",
88
+ "mimer",
89
+ "mire",
90
+ "raffia",
91
+ "rammer",
92
+ "rare",
93
+ "rarefier",
94
+ "rarer",
95
+ "rawer",
96
+ "reaffirm",
97
+ "ream",
98
+ "reamer",
99
+ "rear",
100
+ "rearer",
101
+ "rearm",
102
+ "reef",
103
+ "reefer",
104
+ "refer",
105
+ "referee",
106
+ "referrer",
107
+ "refire",
108
+ "reframe",
109
+ "reifier",
110
+ "rewarm",
111
+ "rewear",
112
+ "rewire",
113
+ "rife",
114
+ "riff",
115
+ "riffraff",
116
+ "rime",
117
+ "rimer",
118
+ "rimfire",
119
+ "rimmer",
120
+ "wafer",
121
+ "waif",
122
+ "ware",
123
+ "warfare",
124
+ "warfarer",
125
+ "warier",
126
+ "warm",
127
+ "warmer",
128
+ "wear",
129
+ "wearer",
130
+ "wearier",
131
+ "weer",
132
+ "weir",
133
+ "were",
134
+ "wife",
135
+ "wire",
136
+ "wireframe",
137
+ "wirer",
138
+ "wirier",
139
+ "wrier",
140
+ ]);
141
+
142
+ function isPangram(word) {
143
+ const lower = word.toLowerCase();
144
+ return LETTERS.every((letter) => lower.includes(letter.toLowerCase()));
145
+ }
146
+
147
+ function usesOnlyLetters(word) {
148
+ const allowed = new Set(LETTERS.map((l) => l.toLowerCase()));
149
+ return [...word.toLowerCase()].every((ch) => allowed.has(ch));
150
+ }
151
+
152
+ function hasCenterLetter(word) {
153
+ return word.toLowerCase().includes(CENTER_LETTER.toLowerCase());
154
+ }
155
+
156
+ function scoreWord(word) {
157
+ const len = word.length;
158
+ if (len < MIN_LENGTH) return 0;
159
+ let pts = len === 4 ? 1 : len === 5 ? 2 : len === 6 ? 3 : 4;
160
+ if (isPangram(word)) pts += 7;
161
+ return pts;
162
+ }
163
+
164
+ function validate(word) {
165
+ const w = word.trim().toLowerCase();
166
+ if (!w) return { ok: false, message: "" };
167
+ if (w.length < MIN_LENGTH) return { ok: false, message: "Too short." };
168
+ if (!hasCenterLetter(w)) return { ok: false, message: "Missing center letter." };
169
+ if (!usesOnlyLetters(w)) return { ok: false, message: "Invalid letters." };
170
+ if (!WORD_LIST.has(w)) return { ok: false, message: "Not in word list." };
171
+ return { ok: true, word: w };
172
+ }
173
+
174
+ function init() {
175
+ createIcons({ icons: { Crown } });
176
+
177
+ const area = document.querySelector(".game-area");
178
+ if (!area) return;
179
+
180
+ const scoreEl = area.querySelector(".bee-score");
181
+ const honeycombEl = area.querySelector(".bee-honeycomb");
182
+ const inputEl = area.querySelector(".bee-input");
183
+ const submitBtn = area.querySelector(".bee-submit");
184
+ const feedbackEl = area.querySelector(".bee-feedback");
185
+ const foundListEl = area.querySelector(".bee-found-list");
186
+
187
+ if (!scoreEl || !honeycombEl || !inputEl || !submitBtn || !feedbackEl || !foundListEl) return;
188
+
189
+ const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || "[]");
190
+ const loaded = Array.isArray(saved)
191
+ ? saved.filter((w) => typeof w === "string" && WORD_LIST.has(w.toLowerCase()))
192
+ : [];
193
+ const foundOrdered = [...new Set(loaded)];
194
+ const found = new Set(foundOrdered);
195
+ let totalScore = foundOrdered.reduce((sum, w) => sum + scoreWord(w), 0);
196
+
197
+ function setFeedback(text, success = false, error = false) {
198
+ feedbackEl.textContent = text;
199
+ feedbackEl.classList.toggle("bee-feedback--success", success);
200
+ feedbackEl.classList.toggle("bee-feedback--error", error);
201
+ }
202
+
203
+ function updateScore() {
204
+ const val = scoreEl.querySelector(".bee-score-value");
205
+ if (val) val.textContent = totalScore;
206
+ }
207
+
208
+ function saveFound() {
209
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(foundOrdered));
210
+ }
211
+
212
+ function renderFoundWords() {
213
+ foundListEl.innerHTML = "";
214
+ const sorted = [...foundOrdered].sort((a, b) => a.localeCompare(b));
215
+ sorted.forEach((word) => {
216
+ const li = document.createElement("li");
217
+ li.textContent = word;
218
+ if (isPangram(word)) li.classList.add("bee-pangram");
219
+ foundListEl.appendChild(li);
220
+ });
221
+ }
222
+
223
+ function submitWord() {
224
+ const raw = inputEl.value;
225
+ const result = validate(raw);
226
+ if (!result.ok) {
227
+ setFeedback(result.message || "Try again.", false, true);
228
+ return;
229
+ }
230
+ const { word } = result;
231
+ if (found.has(word)) {
232
+ setFeedback("Already found.", false, true);
233
+ return;
234
+ }
235
+ foundOrdered.push(word);
236
+ found.add(word);
237
+ totalScore += scoreWord(word);
238
+ saveFound();
239
+ setFeedback(isPangram(word) ? "Pangram!" : "Good!", true, false);
240
+ inputEl.value = "";
241
+ inputEl.focus();
242
+ updateScore();
243
+ renderFoundWords();
244
+ }
245
+
246
+ submitBtn.addEventListener("click", submitWord);
247
+ inputEl.addEventListener("keydown", (e) => {
248
+ if (e.key === "Enter") submitWord();
249
+ });
250
+
251
+ honeycombEl.innerHTML = "";
252
+ const outer = LETTERS.filter((l) => l !== CENTER_LETTER);
253
+ const centerNode = document.createElement("span");
254
+ centerNode.className = "bee-letter bee-letter--center";
255
+ centerNode.textContent = CENTER_LETTER;
256
+ centerNode.setAttribute("aria-hidden", "true");
257
+ honeycombEl.appendChild(centerNode);
258
+ outer.forEach((letter) => {
259
+ const span = document.createElement("span");
260
+ span.className = "bee-letter";
261
+ span.textContent = letter;
262
+ span.setAttribute("aria-hidden", "true");
263
+ honeycombEl.appendChild(span);
264
+ });
265
+
266
+ updateScore();
267
+ renderFoundWords();
268
+ setFeedback("Make words with the letters. Use the center letter in every word.");
269
+ }
270
+
271
+ init();
@@ -29,7 +29,24 @@
29
29
  --wire-font-weight-bold: 700;
30
30
  --wire-line-height: 1.4;
31
31
 
32
+ /* Type scale (rem), adapted from AUI wireframe kit */
33
+ --wire-text-2xs: 0.625rem;
34
+ --wire-text-xs: 0.75rem;
35
+ --wire-text-sm: 0.875rem;
36
+ --wire-text-base: 1rem;
37
+ --wire-text-lg: 1.125rem;
38
+ --wire-text-xl: 1.25rem;
39
+ --wire-text-2xl: 1.5rem;
40
+
41
+ /* Semantic type aliases */
42
+ --wire-text-body: var(--wire-text-sm);
43
+ --wire-text-caption: var(--wire-text-xs);
44
+ --wire-text-label: var(--wire-text-2xs);
45
+ --wire-text-heading: var(--wire-text-2xl);
46
+ --wire-text-subheading: var(--wire-text-xl);
47
+
32
48
  /* Spacing scale */
49
+ --wire-space-2xs: 2px;
33
50
  --wire-space-xs: 4px;
34
51
  --wire-space-sm: 8px;
35
52
  --wire-space-md: 12px;
@@ -43,4 +60,12 @@
43
60
  --wire-radius-md: 6px;
44
61
  --wire-radius-lg: 8px;
45
62
  --wire-radius-full: 50%;
63
+
64
+ /* Sizing – icons (square) and avatars (diameter) */
65
+ --wire-size-icon-sm: 1rem;
66
+ --wire-size-icon-md: 1.25rem;
67
+ --wire-size-icon-lg: 1.5rem;
68
+ --wire-size-avatar-sm: 1.5rem;
69
+ --wire-size-avatar-md: 2rem;
70
+ --wire-size-avatar-lg: 2.5rem;
46
71
  }
@@ -1,6 +1 @@
1
- import "./style.css";
2
-
3
- document.querySelector("#app").innerHTML = `
4
- <h1>Wireframe</h1>
5
- <p>Edit <code>src/main.js</code> and save. Vite will hot-reload.</p>
6
- `;
1
+ import "./game.js";
@@ -1,13 +1,13 @@
1
- @import "./kit/tokens.css";
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ }
2
6
 
3
7
  body {
8
+ margin: 0;
4
9
  font-family: var(--wire-font-family);
5
10
  line-height: var(--wire-line-height);
6
11
  color: var(--wire-text-primary);
7
- background-color: var(--wire-surface);
8
- margin: 0;
9
- }
10
-
11
- #app {
12
- padding: var(--wire-space-xl);
12
+ background-color: var(--wire-bg);
13
13
  }
@@ -0,0 +1,21 @@
1
+ .site-nav {
2
+ display: flex;
3
+ gap: var(--wire-space-lg);
4
+ padding: var(--wire-space-md) var(--wire-space-xl);
5
+ border-bottom: 2px solid var(--wire-border-light);
6
+ background-color: var(--wire-surface);
7
+ }
8
+
9
+ .site-nav a {
10
+ color: var(--wire-text-secondary);
11
+ text-decoration: none;
12
+ }
13
+
14
+ .site-nav a:hover {
15
+ color: var(--wire-text-primary);
16
+ }
17
+
18
+ .site-nav a[aria-current="page"] {
19
+ color: var(--wire-text-primary);
20
+ font-weight: var(--wire-font-weight-bold);
21
+ }
@@ -0,0 +1,5 @@
1
+ main {
2
+ max-width: 60ch;
3
+ margin: 0 auto;
4
+ padding: var(--wire-space-xl);
5
+ }
@@ -0,0 +1,6 @@
1
+ @import "../kit/tokens.css";
2
+ @import "base.css";
3
+ @import "layout.css";
4
+ @import "components/nav.css";
5
+ @import "pages/start.css";
6
+ @import "pages/tokens-showcase.css";
@@ -0,0 +1,226 @@
1
+ /* Start page – Spelling Bee game */
2
+
3
+ .visually-hidden {
4
+ position: absolute;
5
+ inline-size: 1px;
6
+ block-size: 1px;
7
+ padding: 0;
8
+ margin: -1px;
9
+ overflow: hidden;
10
+ clip: rect(0, 0, 0, 0);
11
+ white-space: nowrap;
12
+ border: 0;
13
+ }
14
+
15
+ .game-area {
16
+ max-inline-size: 36rem;
17
+ margin-inline: auto;
18
+ }
19
+
20
+ .game-area .bee-score {
21
+ display: flex;
22
+ justify-content: flex-end;
23
+ align-items: center;
24
+ gap: var(--wire-space-sm);
25
+ font-size: var(--wire-text-xl);
26
+ margin-block-end: var(--wire-space-lg);
27
+ }
28
+
29
+ .game-area .bee-score-icon {
30
+ width: var(--wire-size-icon-md);
31
+ height: var(--wire-size-icon-md);
32
+ flex-shrink: 0;
33
+ color: var(--wire-text-muted);
34
+ }
35
+
36
+ .game-area .bee-score-value {
37
+ font-weight: var(--wire-font-weight-bold);
38
+ }
39
+
40
+ .game-area .bee-score-label {
41
+ font-size: var(--wire-text-body);
42
+ font-weight: var(--wire-font-weight-normal);
43
+ color: var(--wire-text-muted);
44
+ }
45
+
46
+ /* Honeycomb: 7 letters, pointy-top hexes via ::before, absolute positioning */
47
+ .bee-honeycomb {
48
+ --width: 3.25em;
49
+ --height: calc(var(--width) * 0.8660254);
50
+ --gap: var(--wire-space-xs);
51
+ position: relative;
52
+ height: calc(3 * var(--height) + 2 * var(--gap));
53
+ width: calc(2.5 * var(--width) + 2 * 1.1547 * var(--gap));
54
+ margin-block-end: var(--wire-space-2xl);
55
+ margin-inline: auto;
56
+ }
57
+
58
+ /* DOM order: 1=E(center), 2=W, 3=I, 4=R, 5=F, 6=A, 7=M */
59
+ .bee-honeycomb .bee-letter:nth-child(2) {
60
+ transform: translate(0, calc(-1 * var(--height) - var(--gap)));
61
+ }
62
+ .bee-honeycomb .bee-letter:nth-child(3) {
63
+ transform: translate(
64
+ calc(0.75 * var(--width) + 1.1547 * var(--gap)),
65
+ calc(-0.5 * var(--height) - 0.5 * var(--gap))
66
+ );
67
+ }
68
+ .bee-honeycomb .bee-letter:nth-child(4) {
69
+ transform: translate(
70
+ calc(0.75 * var(--width) + 1.1547 * var(--gap)),
71
+ calc(0.5 * var(--height) + 0.5 * var(--gap))
72
+ );
73
+ }
74
+ .bee-honeycomb .bee-letter:nth-child(5) {
75
+ transform: translate(
76
+ calc(-0.75 * var(--width) - 1.1547 * var(--gap)),
77
+ calc(-0.5 * var(--height) - 0.5 * var(--gap))
78
+ );
79
+ }
80
+ .bee-honeycomb .bee-letter:nth-child(6) {
81
+ transform: translate(
82
+ calc(-0.75 * var(--width) - 1.1547 * var(--gap)),
83
+ calc(0.5 * var(--height) + 0.5 * var(--gap))
84
+ );
85
+ }
86
+ .bee-honeycomb .bee-letter:nth-child(7) {
87
+ transform: translate(0, calc(var(--height) + var(--gap)));
88
+ }
89
+
90
+ .bee-letter {
91
+ --bee-hex: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
92
+ position: absolute;
93
+ left: 50%;
94
+ top: 50%;
95
+ width: var(--width);
96
+ height: var(--height);
97
+ margin-left: calc(-0.5 * var(--width));
98
+ margin-top: calc(-0.5 * var(--height));
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ font-family: inherit;
103
+ font-size: var(--wire-text-xl);
104
+ font-weight: var(--wire-font-weight-bold);
105
+ color: var(--wire-text-primary);
106
+ }
107
+
108
+ .bee-letter::before {
109
+ content: "";
110
+ position: absolute;
111
+ inset: 2px;
112
+ z-index: -1;
113
+ background-color: var(--wire-white);
114
+ clip-path: var(--bee-hex);
115
+ -webkit-clip-path: var(--bee-hex);
116
+ }
117
+
118
+ .bee-letter::after {
119
+ content: "";
120
+ position: absolute;
121
+ inset: 0;
122
+ z-index: -2;
123
+ background-color: var(--wire-black);
124
+ clip-path: var(--bee-hex);
125
+ -webkit-clip-path: var(--bee-hex);
126
+ }
127
+
128
+ .bee-letter.bee-letter--center {
129
+ color: var(--wire-white);
130
+ z-index: 1;
131
+ }
132
+
133
+ .bee-letter.bee-letter--center::before {
134
+ background-color: var(--wire-dark);
135
+ }
136
+
137
+ /* Word input row */
138
+ .bee-input-row {
139
+ display: flex;
140
+ gap: var(--wire-space-sm);
141
+ margin-block-end: var(--wire-space-md);
142
+ }
143
+
144
+ .bee-input {
145
+ flex: 1;
146
+ min-inline-size: 0;
147
+ padding: var(--wire-space-md) var(--wire-space-lg);
148
+ font-family: inherit;
149
+ font-size: var(--wire-text-body);
150
+ color: var(--wire-text-primary);
151
+ background-color: var(--wire-surface);
152
+ border: 2px solid var(--wire-border);
153
+ border-radius: var(--wire-radius-lg);
154
+ }
155
+
156
+ .bee-input::placeholder {
157
+ color: var(--wire-text-placeholder);
158
+ }
159
+
160
+ .bee-input:focus {
161
+ outline: none;
162
+ border-color: var(--wire-dark);
163
+ }
164
+
165
+ .bee-submit {
166
+ padding: var(--wire-space-md) var(--wire-space-xl);
167
+ font-family: inherit;
168
+ font-size: var(--wire-text-body);
169
+ font-weight: var(--wire-font-weight-bold);
170
+ color: var(--wire-white);
171
+ background-color: var(--wire-dark);
172
+ border: 2px solid var(--wire-dark);
173
+ border-radius: var(--wire-radius-lg);
174
+ cursor: pointer;
175
+ }
176
+
177
+ .bee-submit:hover {
178
+ background-color: var(--wire-black);
179
+ border-color: var(--wire-black);
180
+ }
181
+
182
+ /* Feedback message */
183
+ .bee-feedback {
184
+ min-block-size: 1.5em;
185
+ margin-block-end: var(--wire-space-lg);
186
+ font-size: var(--wire-text-body);
187
+ color: var(--wire-text-secondary);
188
+ }
189
+
190
+ .bee-feedback.bee-feedback--success {
191
+ color: var(--wire-text-primary);
192
+ font-weight: var(--wire-font-weight-bold);
193
+ }
194
+
195
+ .bee-feedback.bee-feedback--error {
196
+ color: var(--wire-text-primary);
197
+ }
198
+
199
+ /* Found words list */
200
+ .bee-found-heading {
201
+ font-size: var(--wire-text-sm);
202
+ font-weight: var(--wire-font-weight-bold);
203
+ color: var(--wire-text-muted);
204
+ margin-block-end: var(--wire-space-sm);
205
+ }
206
+
207
+ .bee-found-list {
208
+ display: flex;
209
+ flex-wrap: wrap;
210
+ gap: var(--wire-space-xs) var(--wire-space-lg);
211
+ font-size: var(--wire-text-body);
212
+ color: var(--wire-text-secondary);
213
+ list-style: none;
214
+ padding: 0;
215
+ margin: 0;
216
+ }
217
+
218
+ .bee-found-list li {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: var(--wire-space-xs);
222
+ }
223
+
224
+ .bee-found-list .bee-pangram {
225
+ font-weight: var(--wire-font-weight-bold);
226
+ }
@@ -0,0 +1,222 @@
1
+ .token-showcase-intro {
2
+ margin-block-end: var(--wire-space-2xl);
3
+ color: var(--wire-text-muted);
4
+ }
5
+
6
+ .token-showcase code {
7
+ padding: var(--wire-space-2xs) var(--wire-space-xs);
8
+ background-color: var(--wire-surface-alt);
9
+ border-radius: var(--wire-radius-sm);
10
+ font-size: var(--wire-text-sm);
11
+ }
12
+
13
+ .showcase-section {
14
+ margin-block-end: var(--wire-space-3xl);
15
+ }
16
+
17
+ .showcase-section h2 {
18
+ font-size: var(--wire-text-subheading);
19
+ margin-block-end: var(--wire-space-md);
20
+ color: var(--wire-text-secondary);
21
+ }
22
+
23
+ .showcase-section h3 {
24
+ font-size: var(--wire-text-base);
25
+ font-weight: var(--wire-font-weight-bold);
26
+ margin-block: var(--wire-space-lg) var(--wire-space-sm);
27
+ color: var(--wire-text-secondary);
28
+ }
29
+
30
+ .text-muted {
31
+ color: var(--wire-text-muted);
32
+ font-size: var(--wire-text-sm);
33
+ margin-block-start: var(--wire-space-md);
34
+ }
35
+
36
+ .colors-two-col {
37
+ display: grid;
38
+ grid-template-columns: 1fr;
39
+ gap: var(--wire-space-2xl);
40
+ }
41
+
42
+ @media (min-width: 600px) {
43
+ .colors-two-col {
44
+ grid-template-columns: 1fr 1fr;
45
+ }
46
+ }
47
+
48
+ .colors-two-col .swatches {
49
+ margin: 0;
50
+ }
51
+
52
+ .swatches {
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--wire-space-sm);
56
+ }
57
+
58
+ .swatch {
59
+ display: flex;
60
+ flex-direction: row;
61
+ align-items: center;
62
+ gap: var(--wire-space-md);
63
+ margin: 0;
64
+ }
65
+
66
+ .swatch .swatch-sample {
67
+ width: 3rem;
68
+ height: 3rem;
69
+ aspect-ratio: 1;
70
+ border-radius: var(--wire-radius-md);
71
+ flex-shrink: 0;
72
+ border: 1px solid var(--wire-dark);
73
+ }
74
+
75
+ .swatch figcaption {
76
+ font-size: var(--wire-text-xs);
77
+ color: var(--wire-text-muted);
78
+ }
79
+
80
+ .spacing-demos {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: var(--wire-space-sm);
84
+ }
85
+
86
+ .spacing-figure {
87
+ margin: 0;
88
+ display: flex;
89
+ flex-direction: row;
90
+ align-items: center;
91
+ gap: var(--wire-space-md);
92
+ }
93
+
94
+ .spacing-figure .spacing-visual {
95
+ display: flex;
96
+ align-items: center;
97
+ flex-shrink: 0;
98
+ }
99
+
100
+ .spacing-figure .spacing-block {
101
+ width: 2rem;
102
+ height: 2rem;
103
+ aspect-ratio: 1;
104
+ background-color: var(--wire-dark);
105
+ border-radius: var(--wire-radius-sm);
106
+ flex-shrink: 0;
107
+ }
108
+
109
+ .spacing-figure figcaption {
110
+ font-size: var(--wire-text-xs);
111
+ color: var(--wire-text-muted);
112
+ }
113
+
114
+ .typography-two-col {
115
+ display: grid;
116
+ grid-template-columns: 1fr;
117
+ gap: var(--wire-space-2xl);
118
+ }
119
+
120
+ @media (min-width: 600px) {
121
+ .typography-two-col {
122
+ grid-template-columns: 1fr 1fr;
123
+ }
124
+ }
125
+
126
+ .sizing-two-col {
127
+ display: grid;
128
+ grid-template-columns: 1fr;
129
+ gap: var(--wire-space-2xl);
130
+ }
131
+
132
+ @media (min-width: 600px) {
133
+ .sizing-two-col {
134
+ grid-template-columns: 1fr 1fr;
135
+ }
136
+ }
137
+
138
+ .sizing-demos {
139
+ display: flex;
140
+ flex-direction: column;
141
+ gap: var(--wire-space-sm);
142
+ }
143
+
144
+ .sizing-subsection {
145
+ margin: 0;
146
+ }
147
+
148
+ .sizing-figure {
149
+ margin: 0;
150
+ display: flex;
151
+ flex-direction: row;
152
+ align-items: center;
153
+ gap: var(--wire-space-md);
154
+ }
155
+
156
+ .sizing-figure .icon-sample {
157
+ background-color: var(--wire-mid);
158
+ border-radius: var(--wire-radius-sm);
159
+ flex-shrink: 0;
160
+ }
161
+
162
+ .sizing-figure .avatar-sample {
163
+ background-color: var(--wire-dark);
164
+ border-radius: var(--wire-radius-full);
165
+ flex-shrink: 0;
166
+ }
167
+
168
+ .sizing-figure figcaption {
169
+ font-size: var(--wire-text-xs);
170
+ color: var(--wire-text-muted);
171
+ }
172
+
173
+ .radius-demos {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: var(--wire-space-sm);
177
+ }
178
+
179
+ .radius-figure {
180
+ margin: 0;
181
+ display: flex;
182
+ flex-direction: row;
183
+ align-items: center;
184
+ gap: var(--wire-space-md);
185
+ }
186
+
187
+ .radius-figure .radius-sample {
188
+ width: 3rem;
189
+ height: 3rem;
190
+ aspect-ratio: 1;
191
+ background-color: var(--wire-dark);
192
+ color: var(--wire-white);
193
+ font-size: var(--wire-text-xs);
194
+ display: flex;
195
+ align-items: center;
196
+ justify-content: center;
197
+ flex-shrink: 0;
198
+ }
199
+
200
+ .radius-figure figcaption {
201
+ font-size: var(--wire-text-xs);
202
+ color: var(--wire-text-muted);
203
+ }
204
+
205
+ .type-sample {
206
+ margin-block-end: var(--wire-space-sm);
207
+ }
208
+
209
+ .type-scale-heading {
210
+ font-size: var(--wire-text-base);
211
+ font-weight: var(--wire-font-weight-bold);
212
+ margin-block: var(--wire-space-lg) var(--wire-space-sm);
213
+ color: var(--wire-text-secondary);
214
+ }
215
+
216
+ .type-scale-line {
217
+ margin-block-end: var(--wire-space-xs);
218
+ }
219
+
220
+ .type-scale-line:last-of-type {
221
+ margin-block-end: 0;
222
+ }
@@ -0,0 +1,243 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="stylesheet" href="/src/styles/main.css" />
7
+ <title>Tokens – Wireframe</title>
8
+ </head>
9
+ <body>
10
+ <nav class="site-nav">
11
+ <a href="/">Start</a>
12
+ <a href="/tokens.html" aria-current="page">Tokens</a>
13
+ </nav>
14
+ <main class="token-showcase">
15
+ <h1>Design tokens</h1>
16
+ <p class="token-showcase-intro">This page shows the wireframe kit tokens. Use them in your CSS with <code>var(--wire-*)</code>.</p>
17
+
18
+ <section class="showcase-section">
19
+ <h2>Colors</h2>
20
+ <div class="colors-two-col">
21
+ <div>
22
+ <h3>Base colors</h3>
23
+ <div class="swatches">
24
+ <figure class="swatch">
25
+ <div class="swatch-sample" style="background-color: var(--wire-black);"></div>
26
+ <figcaption><code>--wire-black</code></figcaption>
27
+ </figure>
28
+ <figure class="swatch">
29
+ <div class="swatch-sample" style="background-color: var(--wire-dark);"></div>
30
+ <figcaption><code>--wire-dark</code></figcaption>
31
+ </figure>
32
+ <figure class="swatch">
33
+ <div class="swatch-sample" style="background-color: var(--wire-mid);"></div>
34
+ <figcaption><code>--wire-mid</code></figcaption>
35
+ </figure>
36
+ <figure class="swatch">
37
+ <div class="swatch-sample" style="background-color: var(--wire-light);"></div>
38
+ <figcaption><code>--wire-light</code></figcaption>
39
+ </figure>
40
+ <figure class="swatch">
41
+ <div class="swatch-sample" style="background-color: var(--wire-lighter);"></div>
42
+ <figcaption><code>--wire-lighter</code></figcaption>
43
+ </figure>
44
+ <figure class="swatch">
45
+ <div class="swatch-sample" style="background-color: var(--wire-bg);"></div>
46
+ <figcaption><code>--wire-bg</code></figcaption>
47
+ </figure>
48
+ <figure class="swatch">
49
+ <div class="swatch-sample" style="background-color: var(--wire-white);"></div>
50
+ <figcaption><code>--wire-white</code></figcaption>
51
+ </figure>
52
+ </div>
53
+ </div>
54
+ <div>
55
+ <h3>Semantic colors</h3>
56
+ <div class="swatches">
57
+ <figure class="swatch">
58
+ <div class="swatch-sample" style="background-color: var(--wire-text-primary);"></div>
59
+ <figcaption><code>--wire-text-primary</code></figcaption>
60
+ </figure>
61
+ <figure class="swatch">
62
+ <div class="swatch-sample" style="background-color: var(--wire-text-secondary);"></div>
63
+ <figcaption><code>--wire-text-secondary</code></figcaption>
64
+ </figure>
65
+ <figure class="swatch">
66
+ <div class="swatch-sample" style="background-color: var(--wire-text-muted);"></div>
67
+ <figcaption><code>--wire-text-muted</code></figcaption>
68
+ </figure>
69
+ <figure class="swatch">
70
+ <div class="swatch-sample" style="background-color: var(--wire-text-placeholder);"></div>
71
+ <figcaption><code>--wire-text-placeholder</code></figcaption>
72
+ </figure>
73
+ <figure class="swatch">
74
+ <div class="swatch-sample" style="background-color: var(--wire-surface);"></div>
75
+ <figcaption><code>--wire-surface</code></figcaption>
76
+ </figure>
77
+ <figure class="swatch">
78
+ <div class="swatch-sample" style="background-color: var(--wire-surface-alt);"></div>
79
+ <figcaption><code>--wire-surface-alt</code></figcaption>
80
+ </figure>
81
+ <figure class="swatch">
82
+ <div class="swatch-sample" style="background-color: var(--wire-border);"></div>
83
+ <figcaption><code>--wire-border</code></figcaption>
84
+ </figure>
85
+ <figure class="swatch">
86
+ <div class="swatch-sample" style="background-color: var(--wire-border-light);"></div>
87
+ <figcaption><code>--wire-border-light</code></figcaption>
88
+ </figure>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </section>
93
+
94
+ <section class="showcase-section">
95
+ <h2>Spacing</h2>
96
+ <p class="text-muted">Gap between the two blocks is the token value.</p>
97
+ <div class="spacing-demos">
98
+ <figure class="spacing-figure">
99
+ <div class="spacing-visual" style="gap: var(--wire-space-xs);">
100
+ <div class="spacing-block"></div>
101
+ <div class="spacing-block"></div>
102
+ </div>
103
+ <figcaption><code>--wire-space-xs</code></figcaption>
104
+ </figure>
105
+ <figure class="spacing-figure">
106
+ <div class="spacing-visual" style="gap: var(--wire-space-sm);">
107
+ <div class="spacing-block"></div>
108
+ <div class="spacing-block"></div>
109
+ </div>
110
+ <figcaption><code>--wire-space-sm</code></figcaption>
111
+ </figure>
112
+ <figure class="spacing-figure">
113
+ <div class="spacing-visual" style="gap: var(--wire-space-md);">
114
+ <div class="spacing-block"></div>
115
+ <div class="spacing-block"></div>
116
+ </div>
117
+ <figcaption><code>--wire-space-md</code></figcaption>
118
+ </figure>
119
+ <figure class="spacing-figure">
120
+ <div class="spacing-visual" style="gap: var(--wire-space-lg);">
121
+ <div class="spacing-block"></div>
122
+ <div class="spacing-block"></div>
123
+ </div>
124
+ <figcaption><code>--wire-space-lg</code></figcaption>
125
+ </figure>
126
+ <figure class="spacing-figure">
127
+ <div class="spacing-visual" style="gap: var(--wire-space-xl);">
128
+ <div class="spacing-block"></div>
129
+ <div class="spacing-block"></div>
130
+ </div>
131
+ <figcaption><code>--wire-space-xl</code></figcaption>
132
+ </figure>
133
+ <figure class="spacing-figure">
134
+ <div class="spacing-visual" style="gap: var(--wire-space-2xl);">
135
+ <div class="spacing-block"></div>
136
+ <div class="spacing-block"></div>
137
+ </div>
138
+ <figcaption><code>--wire-space-2xl</code></figcaption>
139
+ </figure>
140
+ <figure class="spacing-figure">
141
+ <div class="spacing-visual" style="gap: var(--wire-space-3xl);">
142
+ <div class="spacing-block"></div>
143
+ <div class="spacing-block"></div>
144
+ </div>
145
+ <figcaption><code>--wire-space-3xl</code></figcaption>
146
+ </figure>
147
+ </div>
148
+ </section>
149
+
150
+ <section class="showcase-section">
151
+ <h2>Typography</h2>
152
+ <p class="type-sample" style="font-weight: var(--wire-font-weight-normal);">Comic Neue, normal weight (400).</p>
153
+ <p class="type-sample" style="font-weight: var(--wire-font-weight-bold);">Comic Neue, bold (700).</p>
154
+ <div class="typography-two-col">
155
+ <div>
156
+ <h3 class="type-scale-heading">Type scale</h3>
157
+ <div class="type-scale">
158
+ <p class="type-scale-line" style="font-size: var(--wire-text-2xs);">Sample text <code>--wire-text-2xs</code></p>
159
+ <p class="type-scale-line" style="font-size: var(--wire-text-xs);">Sample text <code>--wire-text-xs</code></p>
160
+ <p class="type-scale-line" style="font-size: var(--wire-text-sm);">Sample text <code>--wire-text-sm</code></p>
161
+ <p class="type-scale-line" style="font-size: var(--wire-text-base);">Sample text <code>--wire-text-base</code></p>
162
+ <p class="type-scale-line" style="font-size: var(--wire-text-lg);">Sample text <code>--wire-text-lg</code></p>
163
+ <p class="type-scale-line" style="font-size: var(--wire-text-xl);">Sample text <code>--wire-text-xl</code></p>
164
+ <p class="type-scale-line" style="font-size: var(--wire-text-2xl);">Sample text <code>--wire-text-2xl</code></p>
165
+ </div>
166
+ </div>
167
+ <div>
168
+ <h3 class="type-scale-heading">Semantic type</h3>
169
+ <div class="type-scale">
170
+ <p class="type-scale-line" style="font-size: var(--wire-text-body);">Body text <code>--wire-text-body</code></p>
171
+ <p class="type-scale-line" style="font-size: var(--wire-text-heading);">Heading <code>--wire-text-heading</code></p>
172
+ <p class="type-scale-line" style="font-size: var(--wire-text-subheading);">Subheading <code>--wire-text-subheading</code></p>
173
+ <p class="type-scale-line" style="font-size: var(--wire-text-caption);">Caption <code>--wire-text-caption</code></p>
174
+ <p class="type-scale-line" style="font-size: var(--wire-text-label);">Label <code>--wire-text-label</code></p>
175
+ </div>
176
+ </div>
177
+ </div>
178
+ </section>
179
+
180
+ <section class="showcase-section">
181
+ <h2>Border radius</h2>
182
+ <div class="radius-demos">
183
+ <figure class="radius-figure">
184
+ <div class="radius-sample" style="border-radius: var(--wire-radius-sm);">sm</div>
185
+ <figcaption><code>--wire-radius-sm</code></figcaption>
186
+ </figure>
187
+ <figure class="radius-figure">
188
+ <div class="radius-sample" style="border-radius: var(--wire-radius-md);">md</div>
189
+ <figcaption><code>--wire-radius-md</code></figcaption>
190
+ </figure>
191
+ <figure class="radius-figure">
192
+ <div class="radius-sample" style="border-radius: var(--wire-radius-lg);">lg</div>
193
+ <figcaption><code>--wire-radius-lg</code></figcaption>
194
+ </figure>
195
+ <figure class="radius-figure">
196
+ <div class="radius-sample" style="border-radius: var(--wire-radius-full);">full</div>
197
+ <figcaption><code>--wire-radius-full</code></figcaption>
198
+ </figure>
199
+ </div>
200
+ </section>
201
+
202
+ <section class="showcase-section">
203
+ <h2>Sizing</h2>
204
+ <div class="sizing-two-col">
205
+ <div class="sizing-subsection">
206
+ <h3>Icon sizes</h3>
207
+ <div class="sizing-demos">
208
+ <figure class="sizing-figure">
209
+ <div class="icon-sample" style="width: var(--wire-size-icon-sm); height: var(--wire-size-icon-sm);"></div>
210
+ <figcaption><code>--wire-size-icon-sm</code></figcaption>
211
+ </figure>
212
+ <figure class="sizing-figure">
213
+ <div class="icon-sample" style="width: var(--wire-size-icon-md); height: var(--wire-size-icon-md);"></div>
214
+ <figcaption><code>--wire-size-icon-md</code></figcaption>
215
+ </figure>
216
+ <figure class="sizing-figure">
217
+ <div class="icon-sample" style="width: var(--wire-size-icon-lg); height: var(--wire-size-icon-lg);"></div>
218
+ <figcaption><code>--wire-size-icon-lg</code></figcaption>
219
+ </figure>
220
+ </div>
221
+ </div>
222
+ <div class="sizing-subsection">
223
+ <h3>Avatar sizes</h3>
224
+ <div class="sizing-demos">
225
+ <figure class="sizing-figure">
226
+ <div class="avatar-sample" style="width: var(--wire-size-avatar-sm); height: var(--wire-size-avatar-sm);"></div>
227
+ <figcaption><code>--wire-size-avatar-sm</code></figcaption>
228
+ </figure>
229
+ <figure class="sizing-figure">
230
+ <div class="avatar-sample" style="width: var(--wire-size-avatar-md); height: var(--wire-size-avatar-md);"></div>
231
+ <figcaption><code>--wire-size-avatar-md</code></figcaption>
232
+ </figure>
233
+ <figure class="sizing-figure">
234
+ <div class="avatar-sample" style="width: var(--wire-size-avatar-lg); height: var(--wire-size-avatar-lg);"></div>
235
+ <figcaption><code>--wire-size-avatar-lg</code></figcaption>
236
+ </figure>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </section>
241
+ </main>
242
+ </body>
243
+ </html>
@@ -1,3 +1,15 @@
1
+ import { readdirSync } from "fs";
2
+ import { resolve } from "path";
1
3
  import { defineConfig } from "vite";
2
4
 
3
- export default defineConfig({});
5
+ const root = __dirname;
6
+ const htmlFiles = readdirSync(root).filter((f) => f.endsWith(".html"));
7
+ const input = Object.fromEntries(
8
+ htmlFiles.map((f) => [f.replace(/\.html$/, ""), resolve(root, f)])
9
+ );
10
+
11
+ export default defineConfig({
12
+ build: {
13
+ rollupOptions: { input },
14
+ },
15
+ });