@bubltec/uiux 0.0.0-stage → 0.0.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.
Files changed (49) hide show
  1. package/dist/button.d.ts +20 -0
  2. package/dist/button.d.ts.map +1 -0
  3. package/dist/button.js +15 -0
  4. package/dist/button.js.map +1 -0
  5. package/dist/chrome.d.ts +36 -0
  6. package/dist/chrome.d.ts.map +1 -0
  7. package/dist/chrome.js +48 -0
  8. package/dist/chrome.js.map +1 -0
  9. package/dist/cx.d.ts +2 -0
  10. package/dist/cx.d.ts.map +1 -0
  11. package/dist/cx.js +4 -0
  12. package/dist/cx.js.map +1 -0
  13. package/dist/form.d.ts +59 -0
  14. package/dist/form.d.ts.map +1 -0
  15. package/dist/form.js +39 -0
  16. package/dist/form.js.map +1 -0
  17. package/dist/icons.d.ts +8 -0
  18. package/dist/icons.d.ts.map +1 -0
  19. package/dist/icons.js +7 -0
  20. package/dist/icons.js.map +1 -0
  21. package/dist/index.d.ts +11 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +11 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/overlay.d.ts +33 -0
  26. package/dist/overlay.d.ts.map +1 -0
  27. package/dist/overlay.js +61 -0
  28. package/dist/overlay.js.map +1 -0
  29. package/dist/page-window.d.ts +4 -0
  30. package/dist/page-window.d.ts.map +1 -0
  31. package/dist/page-window.js +14 -0
  32. package/dist/page-window.js.map +1 -0
  33. package/dist/status.d.ts +18 -0
  34. package/dist/status.d.ts.map +1 -0
  35. package/dist/status.js +17 -0
  36. package/dist/status.js.map +1 -0
  37. package/dist/surface.d.ts +15 -0
  38. package/dist/surface.d.ts.map +1 -0
  39. package/dist/surface.js +12 -0
  40. package/dist/surface.js.map +1 -0
  41. package/dist/text.d.ts +15 -0
  42. package/dist/text.d.ts.map +1 -0
  43. package/dist/text.js +8 -0
  44. package/dist/text.js.map +1 -0
  45. package/package.json +53 -4
  46. package/src/theme.css +571 -0
  47. package/src/themes/nes.css +49 -0
  48. package/src/themes/paw.css +66 -0
  49. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,QAAA,MAAM,GAAG;aAAK,OAAO,EAAE,IAAI;aAAE,KAAK,EAAE,IAAI;aAAE,KAAK,EAAE,GAAG;aAAE,IAAI,EAAE,GAAG;aAAE,KAAK,EAAE,GAAG;CAAW,CAAC;AACvF,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,GAAG,CAAC;AAE3C,wBAAgB,IAAI,CAAC,EAAE,OAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,+BAOrJ"}
package/dist/text.js ADDED
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cx } from './cx.js';
3
+ const TAG = { display: 'h1', title: 'h2', label: 'p', body: 'p', muted: 'p' };
4
+ export function Text({ variant = 'body', className, children, ...rest }) {
5
+ const Tag = TAG[variant];
6
+ return (_jsx(Tag, { className: cx(`text-${variant}`, variant !== 'body' && variant !== 'muted' && 'pixel', className), ...rest, children: children }));
7
+ }
8
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAW,CAAC;AAGvF,MAAM,UAAU,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAiF;IACpJ,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CACL,KAAC,GAAG,IAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,OAAO,EAAE,EAAE,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,IAAI,OAAO,EAAE,SAAS,CAAC,KAAM,IAAI,YAC7G,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,55 @@
1
1
  {
2
2
  "name": "@bubltec/uiux",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.0.0",
4
+ "description": "Themeable UI components. The NES look is one theme; apps supply their own by setting the same tokens.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "src/theme.css",
14
+ "src/themes",
15
+ "!dist/**/*.spec.*"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.js"
21
+ },
22
+ "./theme.css": "./src/theme.css",
23
+ "./themes/nes.css": "./src/themes/nes.css",
24
+ "./themes/paw.css": "./src/themes/paw.css"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -b",
28
+ "typecheck": "tsc -b --noEmit",
29
+ "lint": "oxlint -c .oxlintrc.json src",
30
+ "test": "vitest run --exclude '**/dist/**'"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/bubltec/uiux"
35
+ },
36
+ "peerDependencies": {
37
+ "react": "^19",
38
+ "react-dom": "^19"
39
+ },
40
+ "devDependencies": {
41
+ "@testing-library/react": "16.3.0",
42
+ "@types/node": "26.6.2",
43
+ "@types/react": "19.3.0",
44
+ "@types/react-dom": "19.3.0",
45
+ "jsdom": "27.0.1",
46
+ "oxlint": "1.85.0",
47
+ "react": "19.3.0",
48
+ "react-dom": "19.3.0",
49
+ "typescript": "7.0.2",
50
+ "vitest": "5.0.1"
51
+ },
52
+ "engines": {
53
+ "node": ">=26"
54
+ }
55
+ }
package/src/theme.css ADDED
@@ -0,0 +1,571 @@
1
+ /*
2
+ * Component classes. Colors, type, radius and border width come from the theme
3
+ * (themes/nes.css or another file that sets the same custom properties).
4
+ * Load a theme before this file.
5
+ */
6
+
7
+ *,
8
+ *::before,
9
+ *::after {
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ html {
14
+ background: var(--bg);
15
+ color: var(--ink);
16
+ font-family: var(--font-body);
17
+ -webkit-font-smoothing: antialiased;
18
+ }
19
+
20
+ body {
21
+ margin: 0;
22
+ min-height: 100dvh;
23
+ background: var(--bg);
24
+ color: var(--ink);
25
+ }
26
+
27
+ ::selection {
28
+ background: var(--focus);
29
+ color: var(--bg);
30
+ }
31
+
32
+ a {
33
+ color: var(--link);
34
+ text-decoration: underline;
35
+ text-decoration-color: var(--line);
36
+ text-underline-offset: 3px;
37
+ }
38
+ a:hover {
39
+ color: var(--ink);
40
+ text-decoration-color: var(--focus);
41
+ }
42
+
43
+ :focus-visible {
44
+ outline: 2px solid var(--focus);
45
+ outline-offset: 2px;
46
+ }
47
+
48
+ .pixel {
49
+ font-family: var(--font-display);
50
+ letter-spacing: 0.02em;
51
+ line-height: 1.6;
52
+ }
53
+
54
+ .label,
55
+ .text-label {
56
+ font-family: var(--font-display);
57
+ font-size: 0.5625rem;
58
+ font-weight: 400;
59
+ color: var(--accent);
60
+ text-transform: uppercase;
61
+ letter-spacing: 0.06em;
62
+ }
63
+
64
+ .text-display {
65
+ font-family: var(--font-display);
66
+ font-size: 0.875rem;
67
+ line-height: 1.6;
68
+ color: var(--ink);
69
+ }
70
+ .text-title {
71
+ font-family: var(--font-display);
72
+ font-size: 0.6875rem;
73
+ line-height: 1.6;
74
+ color: var(--accent);
75
+ }
76
+ .text-body {
77
+ font-size: 1rem;
78
+ line-height: 1.65;
79
+ color: var(--ink);
80
+ }
81
+ .text-muted {
82
+ font-size: 0.875rem;
83
+ line-height: 1.6;
84
+ color: var(--muted);
85
+ }
86
+
87
+ .panel,
88
+ .card {
89
+ border: var(--border) solid var(--line);
90
+ background: var(--surface);
91
+ border-radius: var(--radius);
92
+ color: var(--ink);
93
+ }
94
+
95
+ .btn {
96
+ font-family: var(--font-display);
97
+ font-size: 0.625rem;
98
+ line-height: 1;
99
+ padding: 0.75rem 1rem;
100
+ border: var(--border) solid var(--accent);
101
+ border-radius: var(--radius);
102
+ color: var(--ink);
103
+ background: var(--fill);
104
+ cursor: pointer;
105
+ text-decoration: none;
106
+ display: inline-flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ gap: 0.5rem;
110
+ white-space: nowrap;
111
+ }
112
+ .btn:hover {
113
+ background: var(--fill-hover);
114
+ color: var(--ink);
115
+ }
116
+ .btn:disabled,
117
+ .btn[aria-busy='true'] {
118
+ opacity: 0.5;
119
+ cursor: not-allowed;
120
+ }
121
+ .btn-sm {
122
+ font-size: 0.5rem;
123
+ padding: 0.5rem 0.75rem;
124
+ }
125
+ .btn-lg {
126
+ font-size: 0.75rem;
127
+ padding: 1rem 1.25rem;
128
+ }
129
+ .btn-ghost {
130
+ background: transparent;
131
+ border-color: var(--line);
132
+ }
133
+ .btn-ghost:hover {
134
+ background: var(--fill-hover);
135
+ color: var(--ink);
136
+ }
137
+ .btn-danger {
138
+ background: transparent;
139
+ border-color: var(--danger);
140
+ color: var(--danger);
141
+ }
142
+ .btn-danger:hover {
143
+ background: var(--danger);
144
+ color: var(--bg);
145
+ }
146
+
147
+ .badge {
148
+ font-family: var(--font-display);
149
+ display: inline-block;
150
+ border: var(--border) solid var(--line);
151
+ border-radius: var(--radius);
152
+ padding: 0.125rem 0.375rem;
153
+ font-size: 0.5rem;
154
+ line-height: 1.6;
155
+ color: var(--ink);
156
+ }
157
+ .badge-ok {
158
+ border-color: var(--ok);
159
+ color: var(--ok);
160
+ }
161
+ .badge-warn {
162
+ border-color: var(--warn);
163
+ color: var(--warn);
164
+ }
165
+ .badge-accent {
166
+ border-color: var(--accent);
167
+ color: var(--accent);
168
+ }
169
+ .badge-danger {
170
+ border-color: var(--danger);
171
+ color: var(--danger);
172
+ }
173
+
174
+ .notice {
175
+ border: var(--border) solid var(--line);
176
+ border-radius: var(--radius);
177
+ background: var(--surface);
178
+ color: var(--ink);
179
+ padding: 0.75rem 1rem;
180
+ font-size: 0.875rem;
181
+ }
182
+ .notice-warn {
183
+ border-color: var(--warn);
184
+ background: var(--warn);
185
+ color: var(--bg);
186
+ }
187
+ .notice-error {
188
+ border-color: var(--danger);
189
+ color: var(--ink);
190
+ }
191
+ .notice-error .text-label {
192
+ color: var(--danger);
193
+ }
194
+ .notice-preview {
195
+ background: var(--focus);
196
+ color: var(--bg);
197
+ border: none;
198
+ border-radius: 0;
199
+ font-family: var(--font-display);
200
+ font-size: 0.5625rem;
201
+ }
202
+
203
+ .app-frame {
204
+ margin-inline: auto;
205
+ display: flex;
206
+ min-height: 100dvh;
207
+ max-width: 64rem;
208
+ flex-direction: column;
209
+ padding-inline: 1rem;
210
+ }
211
+ .app-header {
212
+ display: flex;
213
+ flex-wrap: wrap;
214
+ align-items: center;
215
+ justify-content: space-between;
216
+ gap: 1rem;
217
+ border-bottom: var(--border) solid var(--line);
218
+ padding-block: 1.25rem;
219
+ }
220
+ .app-header-sticky {
221
+ position: sticky;
222
+ top: 0;
223
+ z-index: 30;
224
+ background: color-mix(in srgb, var(--bg) 90%, transparent);
225
+ }
226
+ .app-header-brand a {
227
+ text-decoration: none;
228
+ }
229
+ .app-nav {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ align-items: center;
233
+ gap: 0.25rem;
234
+ }
235
+ .app-nav a {
236
+ font-family: var(--font-display);
237
+ padding: 0.25rem 0.5rem;
238
+ font-size: 0.5625rem;
239
+ text-decoration: none;
240
+ color: var(--link);
241
+ }
242
+ .app-nav a[aria-current='page'] {
243
+ background: var(--line);
244
+ color: var(--ink);
245
+ }
246
+ .app-main {
247
+ flex: 1;
248
+ padding-block: 2rem;
249
+ }
250
+ .app-footer {
251
+ display: flex;
252
+ flex-wrap: wrap;
253
+ justify-content: space-between;
254
+ gap: 0.75rem;
255
+ border-top: var(--border) solid var(--fill);
256
+ padding-block: 1.25rem;
257
+ font-size: 0.75rem;
258
+ color: var(--faint, var(--muted));
259
+ }
260
+ .app-section-narrow {
261
+ max-width: 48rem;
262
+ }
263
+
264
+ .stack {
265
+ display: flex;
266
+ flex-direction: column;
267
+ gap: 0.75rem;
268
+ }
269
+ .cluster {
270
+ display: flex;
271
+ flex-wrap: wrap;
272
+ align-items: center;
273
+ gap: 0.5rem;
274
+ }
275
+
276
+ .control,
277
+ input.control,
278
+ textarea.control,
279
+ select.control {
280
+ background: var(--bg);
281
+ color: var(--ink);
282
+ border: var(--border) solid var(--line);
283
+ border-radius: var(--radius);
284
+ padding: 0.5rem 0.625rem;
285
+ width: 100%;
286
+ font: inherit;
287
+ }
288
+ .control:focus,
289
+ input.control:focus,
290
+ textarea.control:focus,
291
+ select.control:focus {
292
+ outline: none;
293
+ border-color: var(--accent);
294
+ }
295
+ .control::placeholder {
296
+ color: var(--faint, var(--muted));
297
+ }
298
+ .control.control-auto,
299
+ select.control.control-auto {
300
+ width: auto;
301
+ }
302
+ input:not([type='checkbox']):not([type='radio']):not([type='file']):not([type='hidden']):not([type='range']),
303
+ textarea,
304
+ select {
305
+ background: var(--bg);
306
+ color: var(--ink);
307
+ border: var(--border) solid var(--line);
308
+ border-radius: var(--radius);
309
+ padding: 0.5rem 0.625rem;
310
+ width: 100%;
311
+ font: inherit;
312
+ }
313
+ input:not([type='checkbox']):not([type='radio']):not([type='file']):not([type='hidden']):focus,
314
+ textarea:focus,
315
+ select:focus {
316
+ outline: none;
317
+ border-color: var(--accent);
318
+ }
319
+ /* Engines that do paint <option> still need a contrasting pair. The theme's
320
+ color-scheme on select is what actually flips the WebKit menu. */
321
+ select option,
322
+ select optgroup {
323
+ background-color: var(--bg);
324
+ color: var(--ink);
325
+ }
326
+ input::placeholder,
327
+ textarea::placeholder {
328
+ color: var(--faint, var(--muted));
329
+ }
330
+ .field {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 0.375rem;
334
+ }
335
+ .field-hint,
336
+ .field-error {
337
+ font-size: 0.75rem;
338
+ }
339
+ .field-hint {
340
+ color: var(--faint, var(--muted));
341
+ }
342
+ .field-error {
343
+ color: var(--danger);
344
+ }
345
+ .field-reserve {
346
+ visibility: hidden;
347
+ }
348
+
349
+ .chips {
350
+ display: flex;
351
+ flex-wrap: wrap;
352
+ align-items: center;
353
+ gap: 0.25rem;
354
+ }
355
+ .chip {
356
+ font-family: var(--font-display);
357
+ border: var(--border) solid var(--fill);
358
+ border-radius: var(--radius);
359
+ background: transparent;
360
+ color: var(--muted);
361
+ padding: 0.25rem 0.375rem;
362
+ font-size: 0.4375rem;
363
+ cursor: pointer;
364
+ }
365
+ .chip[aria-pressed='true'] {
366
+ border-color: var(--focus);
367
+ background: var(--focus);
368
+ color: var(--bg);
369
+ }
370
+
371
+ .switch {
372
+ display: inline-flex;
373
+ align-items: center;
374
+ gap: 0.5rem;
375
+ font-size: 0.875rem;
376
+ cursor: pointer;
377
+ }
378
+ .switch input {
379
+ appearance: none;
380
+ width: 2.25rem;
381
+ height: 1.25rem;
382
+ margin: 0;
383
+ border: var(--border) solid var(--line);
384
+ border-radius: calc(var(--radius) + 999px);
385
+ background: var(--bg);
386
+ position: relative;
387
+ }
388
+ .switch input::after {
389
+ content: '';
390
+ position: absolute;
391
+ top: 1px;
392
+ left: 1px;
393
+ width: 0.85rem;
394
+ height: 0.85rem;
395
+ background: var(--muted);
396
+ }
397
+ .switch input:checked {
398
+ background: var(--fill);
399
+ border-color: var(--accent);
400
+ }
401
+ .switch input:checked::after {
402
+ left: auto;
403
+ right: 1px;
404
+ background: var(--focus);
405
+ }
406
+
407
+ .segmented {
408
+ display: inline-flex;
409
+ gap: 0.25rem;
410
+ padding: 0.25rem;
411
+ border: var(--border) solid var(--line);
412
+ border-radius: var(--radius);
413
+ background: var(--bg);
414
+ }
415
+ .segmented label {
416
+ cursor: pointer;
417
+ padding: 0.375rem 0.75rem;
418
+ font-size: 0.875rem;
419
+ color: var(--muted);
420
+ }
421
+ .segmented label:has(:checked) {
422
+ background: var(--fill);
423
+ color: var(--ink);
424
+ }
425
+ .sr-only {
426
+ position: absolute;
427
+ width: 1px;
428
+ height: 1px;
429
+ padding: 0;
430
+ margin: -1px;
431
+ overflow: hidden;
432
+ clip: rect(0, 0, 0, 0);
433
+ white-space: nowrap;
434
+ border: 0;
435
+ }
436
+
437
+ .dialog {
438
+ border: var(--border) solid var(--line);
439
+ border-radius: var(--radius);
440
+ background: var(--surface);
441
+ color: var(--ink);
442
+ padding: 1.25rem;
443
+ max-width: min(30rem, calc(100vw - 2rem));
444
+ width: 100%;
445
+ }
446
+ .dialog-wide {
447
+ max-width: min(44rem, calc(100vw - 2rem));
448
+ }
449
+ .dialog::backdrop {
450
+ background: color-mix(in srgb, var(--ink) 40%, transparent);
451
+ }
452
+ .dialog-head {
453
+ display: flex;
454
+ align-items: flex-start;
455
+ justify-content: space-between;
456
+ gap: 1rem;
457
+ }
458
+ .dialog-title {
459
+ font-family: var(--font-display);
460
+ font-size: 0.6875rem;
461
+ margin: 0;
462
+ }
463
+ .dialog-desc {
464
+ margin: 0.25rem 0 0;
465
+ color: var(--muted);
466
+ font-size: 0.875rem;
467
+ }
468
+ .dialog-body {
469
+ margin-top: 1.25rem;
470
+ }
471
+
472
+ .drawer {
473
+ border: none;
474
+ border-right: var(--border) solid var(--line);
475
+ background: var(--surface);
476
+ color: var(--ink);
477
+ margin: 0;
478
+ padding: 0;
479
+ height: 100dvh;
480
+ max-height: 100dvh;
481
+ width: min(20rem, calc(100vw - 2rem));
482
+ position: fixed;
483
+ inset: 0 auto 0 0;
484
+ }
485
+ .drawer::backdrop {
486
+ background: color-mix(in srgb, var(--ink) 40%, transparent);
487
+ }
488
+ .drawer-body {
489
+ display: flex;
490
+ flex-direction: column;
491
+ height: 100%;
492
+ padding: 1rem;
493
+ overflow: auto;
494
+ }
495
+
496
+ .tabs {
497
+ display: flex;
498
+ gap: 0.25rem;
499
+ overflow-x: auto;
500
+ border-bottom: var(--border) solid var(--line);
501
+ }
502
+ .tab {
503
+ font-family: var(--font-display);
504
+ font-size: 0.5rem;
505
+ background: transparent;
506
+ border: none;
507
+ border-bottom: var(--border) solid transparent;
508
+ color: var(--muted);
509
+ padding: 0.75rem;
510
+ cursor: pointer;
511
+ }
512
+ .tab[aria-selected='true'] {
513
+ color: var(--ink);
514
+ border-bottom-color: var(--accent);
515
+ }
516
+ .tab-panel {
517
+ padding-top: 1rem;
518
+ }
519
+
520
+ .toasts {
521
+ pointer-events: none;
522
+ position: fixed;
523
+ inset-inline: 0;
524
+ bottom: 1rem;
525
+ z-index: 50;
526
+ display: flex;
527
+ flex-direction: column;
528
+ align-items: center;
529
+ gap: 0.5rem;
530
+ padding-inline: 1rem;
531
+ }
532
+ .toast {
533
+ pointer-events: auto;
534
+ max-width: 28rem;
535
+ border-radius: var(--radius);
536
+ padding: 0.625rem 1rem;
537
+ font-size: 0.875rem;
538
+ background: var(--ink);
539
+ color: var(--bg);
540
+ }
541
+ .toast-error {
542
+ background: var(--danger);
543
+ color: var(--bg);
544
+ }
545
+
546
+ .icon {
547
+ width: 1em;
548
+ height: 1em;
549
+ flex: none;
550
+ display: inline-block;
551
+ }
552
+
553
+ .pager {
554
+ margin-top: 1.5rem;
555
+ display: flex;
556
+ flex-wrap: wrap;
557
+ align-items: center;
558
+ justify-content: space-between;
559
+ gap: 0.75rem;
560
+ }
561
+ .pager-count {
562
+ font-family: var(--font-display);
563
+ font-size: 0.5rem;
564
+ color: var(--faint, var(--muted));
565
+ }
566
+
567
+ @media (min-width: 40rem) {
568
+ .app-frame {
569
+ padding-inline: 1.5rem;
570
+ }
571
+ }
@@ -0,0 +1,49 @@
1
+ /*
2
+ * NES (2C02) colours the 1990s Mega Man games are drawn with.
3
+ * Black stage, Mega Man's blues, the cyan highlight, energy-bar yellow, damage red.
4
+ */
5
+ :root {
6
+ --void: #000000;
7
+ --night: #00003c;
8
+ --deep: #0000bc;
9
+ --mega: #0070ec;
10
+ --sky: #3cbcfc;
11
+ --ice: #a4e4fc;
12
+ --bolt: #f8b800;
13
+ --cream: #fce4a0;
14
+ --hurt: #f83800;
15
+ --snow: #fcfcfc;
16
+ --steel: #bcbcbc;
17
+ --slate: #747474;
18
+
19
+ --bg: var(--void);
20
+ --surface: var(--void);
21
+ --ink: var(--snow);
22
+ --muted: var(--steel);
23
+ --faint: var(--slate);
24
+ --line: var(--mega);
25
+ --accent: var(--sky);
26
+ --accent-ink: var(--snow);
27
+ --danger: var(--hurt);
28
+ --focus: var(--bolt);
29
+ --ok: var(--ice);
30
+ --warn: var(--bolt);
31
+ --fill: var(--deep);
32
+ --fill-hover: var(--mega);
33
+ --link: var(--ice);
34
+ --font-body: ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
35
+ --font-display: 'Press Start 2P', ui-monospace, monospace;
36
+ --radius: 0;
37
+ --border: 2px;
38
+
39
+ color-scheme: dark;
40
+ }
41
+
42
+ /* WebKit (Safari, DuckDuckGo) gives the control its own color-scheme, so the
43
+ one on :root never reaches the native menu. The menu stays light, inherits
44
+ the light text color, and the choices disappear. Chrome draws its own menu. */
45
+ select,
46
+ select optgroup,
47
+ select option {
48
+ color-scheme: dark;
49
+ }