@phantompixeldev/retrocss 3.0.1 → 3.1.1

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/MIGRATION.md CHANGED
@@ -1,3 +1,56 @@
1
+ # Migrating to RetroCSS 3.x
2
+
3
+ ## 3.1 — keyboard access, OS dark mode, and the rest of the radius token
4
+
5
+ Additive. Nothing was renamed and no class removed; existing markup keeps
6
+ working, because the fixes are applied by the JavaScript at init time rather
7
+ than by requiring new HTML. Three things are worth knowing:
8
+
9
+ **Dark mode now follows the operating system.** Previously the default was a
10
+ hardcoded `light`, so a visitor whose system was set to dark got a light page
11
+ until they found the toggle — on a framework that ships a full dark theme. Now
12
+ an explicit choice (anything stored under `retro-theme`) still wins; only when
13
+ there is none does `prefers-color-scheme` decide. To keep the old behaviour,
14
+ store a theme yourself before `RetroCSS.init()`:
15
+
16
+ ```js
17
+ localStorage.setItem('retro-theme', 'light');
18
+ ```
19
+
20
+ The palette itself is applied in CSS, so there is **no theme flash**: the dark
21
+ tokens are emitted both for `[data-theme="dark"]` and, under
22
+ `@media (prefers-color-scheme: dark)`, for `:root:not([data-theme="light"])`.
23
+ A dark-OS visitor is painted dark before a line of JavaScript runs.
24
+
25
+ Two consequences:
26
+
27
+ - `applyTheme('light')` now writes `data-theme="light"` instead of *removing*
28
+ the attribute. It has to: on a dark OS the attribute is the only thing that
29
+ can hold a deliberate light choice in place. If you keyed any CSS off
30
+ `:root:not([data-theme])` to mean "light", match `[data-theme="light"]`
31
+ instead.
32
+ - To also cover a *stored* choice that differs from the OS — the one case CSS
33
+ cannot see — add the inline `<head>` snippet documented in the README. Every
34
+ page in this repo now ships it.
35
+
36
+ **`--retro-border-radius` now reaches the whole framework.** 3.0.1 wired 31
37
+ components to the token; the core chrome — card, button, badge, nav, progress,
38
+ alert, input, checkbox, accordion — still hardcoded `0`, so setting the token
39
+ rounded dropdowns but left buttons square. All of it follows the token now. The
40
+ default is unchanged (the token is `0`); but if you had already set
41
+ `--retro-border-radius`, more of the framework will round than before.
42
+
43
+ **Interactive components gained roles and keyboard handling.** Rating stars are
44
+ a `radiogroup` of `radio`s, carousel dots are `button`s with `aria-current`,
45
+ tooltips appear on focus and carry `aria-describedby`, tag removes are
46
+ `button`s, and tabs use a roving tabindex. If you styled any of these by tag
47
+ name (`span.retro-tag-remove`, `div.retro-carousel-dot`), switch to the class —
48
+ newly generated ones are `<button>`. If you hid a file input with
49
+ `.retro-hidden`, switch to `.retro-sr-only`: `display: none` removes it from the
50
+ tab order, leaving no keyboard route to the file picker.
51
+
52
+ ---
53
+
1
54
  # Migrating to RetroCSS 3.0
2
55
 
3
56
  3.0 is a visual release. Nothing was renamed and no class was removed, but two
package/README.md CHANGED
@@ -183,9 +183,32 @@ sidebar, tabs, pagination and the file uploader:
183
183
  :root { --retro-border-radius: 4px; }
184
184
  ```
185
185
 
186
- The core chrome card, button, badge, table, input, modal stays square
187
- regardless, and `.retro-rounded` / `-lg` / `-full` still round one element at a
188
- time.
186
+ `.retro-rounded` / `-lg` / `-full` still round one element at a time. Two
187
+ components keep their shape on purpose: `.retro-nav-pills` and `.retro-tag`.
188
+ Tables stay square because `border-collapse: collapse` — what merges their cell
189
+ borders into a single hairline — makes every engine ignore `border-radius`.
190
+
191
+ Dark mode follows the operating system when the visitor has expressed no
192
+ preference of their own. The moment they use a `.retro-theme-toggle`, that
193
+ choice is stored and outranks the OS from then on.
194
+
195
+ This is done in CSS, not script — the dark palette is emitted both for
196
+ `[data-theme="dark"]` and under `@media (prefers-color-scheme: dark)` for
197
+ `:root:not([data-theme="light"])` — so a dark-OS visitor gets the right colours
198
+ on the very first paint, with no flash, even before the bundle loads.
199
+
200
+ The one case CSS cannot see is a *stored* choice that differs from the OS.
201
+ Add this to your `<head>` to cover it. It must be inline: an external or
202
+ `defer`red script runs after the first paint, which is the whole problem.
203
+
204
+ ```html
205
+ <script>
206
+ try {
207
+ var retroTheme = localStorage.getItem('retro-theme');
208
+ if (retroTheme) document.documentElement.setAttribute('data-theme', retroTheme);
209
+ } catch (e) {}
210
+ </script>
211
+ ```
189
212
 
190
213
  > **Upgrading?** See [MIGRATION.md](MIGRATION.md). No class has ever been
191
214
  > renamed, but 3.0 raises the body text to 16px and drops the `!important` from
@@ -229,8 +252,13 @@ That proves the *tokens* are sound. `npm run check:pages` proves the *pages*
229
252
  are: it renders every page in the repo in real Chromium, in both themes, at
230
253
  1200/980/760/420/360px, and fails on a console error, horizontal overflow, a
231
254
  missing or duplicated `<h1>`, any rendered text below AA against the surface
232
- actually painted behind it, or an input glyph off its field's centre line. Both
233
- run in CI on every push.
255
+ actually painted behind it, or an input glyph off its field's centre line.
256
+
257
+ Neither can see whether a control can be *reached*, so `npm run check:keyboard`
258
+ asserts that too: every control the framework drives from script is in the tab
259
+ order and carries an accessible name, roving-tabindex groups expose exactly one
260
+ tab stop, and every tooltip appears on focus and not only on hover. All four
261
+ gates run in CI on every push.
234
262
 
235
263
  Beyond colour:
236
264
 
@@ -248,8 +276,19 @@ Beyond colour:
248
276
  neutralised, with the looping text effects switched off outright.
249
277
  - **Sortable tables are operable.** `.retro-table-sortable` headers are
250
278
  focusable, sort on Enter and Space as well as click, and carry `aria-sort`.
279
+ Add `data-sort="none"` to a column that should not sort.
280
+ - **Rating stars are a radiogroup.** Tab reaches the group, Arrow keys move and
281
+ set the value, Home/End jump to the ends, and each star reports `aria-checked`.
282
+ - **Carousels are keyboard-driven.** Dots are real buttons with labels and
283
+ `aria-current`; Left/Right arrows move between slides once focus is inside.
284
+ - **Tooltips appear on focus,** not only on hover, are dismissible with Escape,
285
+ and are wired to their trigger with `aria-describedby` (WCAG 1.4.13).
286
+ - **Tabs use a roving tabindex.** Tab steps over the tablist into the panel;
287
+ Arrow keys, Home and End move between tabs.
251
288
  - **`.retro-sr-only`** labels icon-only controls; `.retro-sr-only-focusable`
252
- gives you a skip link.
289
+ gives you a skip link. Use it — not `.retro-hidden` — to hide a real form
290
+ control you still want reachable, such as a styled `<input type="file">`:
291
+ `display: none` takes it out of the tab order entirely.
253
292
 
254
293
  ```html
255
294
  <button class="retro-btn">💾<span class="retro-sr-only">Save</span></button>
@@ -289,13 +328,16 @@ npm run watch
289
328
  Run the gates:
290
329
 
291
330
  ```bash
292
- npm run check:a11y && npm run check:radius && npm run check:pages
331
+ npm run check:a11y && npm run check:radius && npm run check:pages && npm run check:keyboard
293
332
  ```
294
333
 
295
334
  `check:a11y` gates the tokens (every `var(--retro-*)` resolves, every
296
335
  text/surface pair clears WCAG AA), `check:radius` gates the shape (nothing
297
- hardcodes a corner behind `--retro-border-radius`), and `check:pages` gates the
298
- rendered result across 8 pages × 2 themes × 5 widths.
336
+ hardcodes a corner behind `--retro-border-radius`), `check:pages` gates the
337
+ rendered result across 8 pages × 2 themes × 5 widths — including that the first
338
+ paint is already the right theme with the bundle blocked, so a theme flash fails
339
+ the build — and `check:keyboard` gates operability: that every control can
340
+ actually be reached and used.
299
341
 
300
342
  `check:pages` needs a browser once: `npx playwright install chromium`.
301
343
 
package/dist/retro.css CHANGED
@@ -614,6 +614,185 @@
614
614
  --retro-syntax-attribute: #c8a2e0;
615
615
  }
616
616
 
617
+ @media (prefers-color-scheme: dark) {
618
+ :root:not([data-theme=light]) {
619
+ color-scheme: dark;
620
+ --retro-body-bg: #2b2b2b;
621
+ --retro-bg: #3a3a3a;
622
+ --retro-primary: #4a90e2;
623
+ --retro-primary-rgb: 74, 144, 226;
624
+ --retro-light: #454545;
625
+ --retro-white: #3a3a3a;
626
+ --retro-black: #fff;
627
+ --retro-white-rgb: 58, 58, 58;
628
+ --retro-black-rgb: 255, 255, 255;
629
+ --retro-light-rgb: 69, 69, 69;
630
+ --retro-border-light: #909090;
631
+ --retro-border-medium: #262626;
632
+ --retro-border-dark: #151515;
633
+ --retro-success: #2ecc71;
634
+ --retro-success-rgb: 46, 204, 113;
635
+ --retro-warning: #f39c12;
636
+ --retro-warning-rgb: 243, 156, 18;
637
+ --retro-danger: #e74c3c;
638
+ --retro-danger-rgb: 231, 76, 60;
639
+ --retro-info: #3498db;
640
+ --retro-info-rgb: 52, 152, 219;
641
+ --retro-teal: #1abc9c;
642
+ --retro-teal-rgb: 26, 188, 156;
643
+ --retro-tan: #d4b483;
644
+ --retro-tan-rgb: 212, 180, 131;
645
+ --retro-pink: #e84393;
646
+ --retro-pink-rgb: 232, 67, 147;
647
+ --retro-lime: #00b894;
648
+ --retro-lime-rgb: 0, 184, 148;
649
+ --retro-cyan: #00cec9;
650
+ --retro-cyan-rgb: 0, 206, 201;
651
+ --retro-orange: #e67e22;
652
+ --retro-orange-rgb: 230, 126, 34;
653
+ --retro-brown: #a67c52;
654
+ --retro-brown-rgb: 166, 124, 82;
655
+ --retro-violet: #9b59b6;
656
+ --retro-violet-rgb: 155, 89, 182;
657
+ --retro-gray: #95a5a6;
658
+ --retro-gray-rgb: 149, 165, 166;
659
+ --retro-maroon: #c0392b;
660
+ --retro-maroon-rgb: 192, 57, 43;
661
+ --retro-gold: #f1c40f;
662
+ --retro-gold-rgb: 241, 196, 15;
663
+ --retro-navy: #2c3e50;
664
+ --retro-navy-rgb: 44, 62, 80;
665
+ --retro-olive: #7f8c8d;
666
+ --retro-olive-rgb: 127, 140, 141;
667
+ --retro-silver: #bdc3c7;
668
+ --retro-silver-rgb: 189, 195, 199;
669
+ --retro-box-shadow-subtle: 0 1px 2px rgba(0, 0, 0, 0.3);
670
+ --retro-box-shadow-medium: 0 2px 4px rgba(0, 0, 0, 0.4);
671
+ --retro-card-bg: #3a3a3a;
672
+ --retro-card-header-bg: #1a237e;
673
+ --retro-card-header-text: #fff;
674
+ --retro-card-content-bg: #333333;
675
+ --retro-card-content-text: #f2f2f2;
676
+ --retro-card-footer-bg: #3a3a3a;
677
+ --retro-card-footer-text: #f2f2f2;
678
+ --retro-modal-bg: #3a3a3a;
679
+ --retro-modal-header-bg: #1a237e;
680
+ --retro-modal-header-text: #fff;
681
+ --retro-table-bg: #333333;
682
+ --retro-table-header-bg: #3a3a3a;
683
+ --retro-table-header-text: #f2f2f2;
684
+ --retro-table-striped-bg: #3f3f3f;
685
+ --retro-input-bg: #2e2e2e;
686
+ --retro-input-text: #f2f2f2;
687
+ --retro-sidebar-bg: #333333;
688
+ --retro-sidebar-text: #f2f2f2;
689
+ --retro-dropdown-bg: #3a3a3a;
690
+ --retro-dropdown-text: #f2f2f2;
691
+ --retro-list-bg: #333333;
692
+ --retro-list-text: #f2f2f2;
693
+ --retro-progress-bg: #2e2e2e;
694
+ --retro-progress-bar-bg: #4a90e2;
695
+ --retro-alert-bg: #3a3a3a;
696
+ --retro-alert-text: #f2f2f2;
697
+ --retro-badge-bg: #4a4a4a;
698
+ --retro-badge-text: #fff;
699
+ --retro-toast-bg: #3a3a3a;
700
+ --retro-toast-text: #f2f2f2;
701
+ --retro-primary-text: #8fbaed;
702
+ --retro-success-text: #31d074;
703
+ --retro-danger-text: #f3a29a;
704
+ --retro-warning-text: #f4a72b;
705
+ --retro-info-text: #7ebee8;
706
+ --retro-teal-text: #1cceab;
707
+ --retro-tan-text: #d4b483;
708
+ --retro-pink-text: #f39dc6;
709
+ --retro-lime-text: #00cfa6;
710
+ --retro-cyan-text: #00cec9;
711
+ --retro-orange-text: #eea869;
712
+ --retro-brown-text: #ccb399;
713
+ --retro-violet-text: #ccabda;
714
+ --retro-gray-text: #adb9ba;
715
+ --retro-maroon-text: #e9a69f;
716
+ --retro-gold-text: #f1c40f;
717
+ --retro-navy-text: #a5b9cd; /* fill is 1.41:1 as text -- worst case in the framework */
718
+ --retro-olive-text: #b1b9b9;
719
+ --retro-silver-text: #bdc3c7;
720
+ --retro-primary-fg: #000000;
721
+ --retro-success-fg: #000000;
722
+ --retro-danger-fg: #000000;
723
+ --retro-warning-fg: #000000;
724
+ --retro-info-fg: #000000;
725
+ --retro-teal-fg: #000000;
726
+ --retro-tan-fg: #000000;
727
+ --retro-pink-fg: #000000;
728
+ --retro-lime-fg: #000000;
729
+ --retro-cyan-fg: #000000;
730
+ --retro-orange-fg: #000000;
731
+ --retro-brown-fg: #000000;
732
+ --retro-violet-fg: #ffffff;
733
+ --retro-gray-fg: #000000;
734
+ --retro-maroon-fg: #ffffff;
735
+ --retro-gold-fg: #000000;
736
+ --retro-navy-fg: #ffffff;
737
+ --retro-olive-fg: #000000;
738
+ --retro-silver-fg: #000000;
739
+ --retro-text: #f2f2f2;
740
+ --retro-text-muted: #b8b8b8;
741
+ --retro-text-inverse: #1a1a1a;
742
+ --retro-primary-hover: #76abe9;
743
+ --retro-primary-active: #2378db;
744
+ --retro-success-hover: #54d98c;
745
+ --retro-success-active: #25a25a;
746
+ --retro-danger-hover: #ed7669;
747
+ --retro-danger-active: #e32f1c;
748
+ --retro-warning-hover: #f5b043;
749
+ --retro-warning-active: #c87f0a;
750
+ --retro-info-hover: #5faee3;
751
+ --retro-info-active: #217dbb;
752
+ --retro-teal-hover: #28e1bd;
753
+ --retro-teal-active: #148f77;
754
+ --retro-tan-hover: #e1cba9;
755
+ --retro-tan-active: #c79d5d;
756
+ --retro-pink-hover: #ee70ad;
757
+ --retro-pink-active: #e21c7c;
758
+ --retro-lime-hover: #00ebbd;
759
+ --retro-lime-active: #008a6f;
760
+ --retro-cyan-hover: #02fff9;
761
+ --retro-cyan-active: #009b97;
762
+ --retro-orange-hover: #eb9950;
763
+ --retro-orange-active: #bf6516;
764
+ --retro-brown-hover: #b99672;
765
+ --retro-brown-active: #956f4a;
766
+ --retro-violet-hover: #9b59b6;
767
+ --retro-violet-active: #804399;
768
+ --retro-gray-hover: #b1bdbd;
769
+ --retro-gray-active: #798d8f;
770
+ --retro-maroon-hover: #d14233;
771
+ --retro-maroon-active: #962d22;
772
+ --retro-gold-hover: #f4d03f;
773
+ --retro-gold-active: #c29d0b;
774
+ --retro-navy-hover: #3e5771;
775
+ --retro-navy-active: #1a242f;
776
+ --retro-olive-hover: #9aa4a5;
777
+ --retro-olive-active: #6d7a7b;
778
+ --retro-silver-hover: #d9dcde;
779
+ --retro-silver-active: #a1aab0;
780
+ --retro-primary-dark: #2378db;
781
+ --retro-gray-100: #454545;
782
+ --retro-shadow-light: #909090;
783
+ --retro-syntax-keyword: #6ba9db;
784
+ --retro-syntax-string: #d0967e;
785
+ --retro-syntax-comment: #8cad6f;
786
+ --retro-syntax-function: #dcdcaa;
787
+ --retro-syntax-number: #b5cea8;
788
+ --retro-syntax-operator: #9cdcfe;
789
+ --retro-syntax-variable: #d4d4d4;
790
+ --retro-syntax-class: #4ec9b0;
791
+ --retro-syntax-property: #9cdcfe;
792
+ --retro-syntax-tag: #6ba9db;
793
+ --retro-syntax-attribute: #c8a2e0;
794
+ }
795
+ }
617
796
  /* Layout Specific Variables */
618
797
  /* Component Specific Variables */
619
798
  /* RetroCSS - A Retro-Inspired CSS Framework */
@@ -922,7 +1101,7 @@ h1, h2, h3, h4, h5, h6 {
922
1101
  font-weight: var(--retro-font-weight-bold);
923
1102
  text-align: left;
924
1103
  margin: var(--retro-spacing-lg) 0 var(--retro-spacing-sm);
925
- border-radius: 0;
1104
+ border-radius: var(--retro-border-radius);
926
1105
  box-shadow: none;
927
1106
  letter-spacing: 0;
928
1107
  background: none;
@@ -1559,7 +1738,7 @@ h5, h6 {
1559
1738
  user-select: none;
1560
1739
  padding: var(--retro-spacing-xs) var(--retro-spacing-md);
1561
1740
  border: var(--retro-border-width-thick) solid var(--retro-border-dark);
1562
- border-radius: 0;
1741
+ border-radius: var(--retro-border-radius);
1563
1742
  background: var(--retro-light);
1564
1743
  color: var(--retro-text);
1565
1744
  box-shadow: inset 1px 1px 0 var(--retro-border-light), inset -1px -1px 0 var(--retro-border-dark), 1px 1px 0 var(--retro-border-medium);
@@ -1769,9 +1948,11 @@ h5, h6 {
1769
1948
  box-shadow: inset 1px 1px 0 var(--retro-bg), inset -1px -1px 0 var(--retro-border-medium);
1770
1949
  font-family: var(--retro-font);
1771
1950
  margin-bottom: 24px;
1951
+ border-radius: var(--retro-border-radius);
1772
1952
  position: relative;
1773
1953
  }
1774
1954
  .retro-card-header {
1955
+ border-radius: var(--retro-border-radius) var(--retro-border-radius) 0 0;
1775
1956
  background: var(--retro-card-header-bg);
1776
1957
  color: var(--retro-card-header-text);
1777
1958
  }
@@ -1797,6 +1978,11 @@ h5, h6 {
1797
1978
  }
1798
1979
  .retro-card-content {
1799
1980
  padding: 16px 16px;
1981
+ }
1982
+ .retro-card-content:last-child {
1983
+ border-radius: 0 0 var(--retro-border-radius) var(--retro-border-radius);
1984
+ }
1985
+ .retro-card-content {
1800
1986
  background: var(--retro-card-content-bg);
1801
1987
  border-top: 2px solid var(--retro-card-content-bg);
1802
1988
  font-size: 1rem;
@@ -1811,6 +1997,7 @@ h5, h6 {
1811
1997
  color: var(--retro-card-footer-text);
1812
1998
  padding: 8px 16px;
1813
1999
  font-size: 0.875rem;
2000
+ border-radius: 0 0 var(--retro-border-radius) var(--retro-border-radius);
1814
2001
  text-align: left;
1815
2002
  }
1816
2003
 
@@ -1866,7 +2053,7 @@ h5, h6 {
1866
2053
  color: var(--retro-input-text);
1867
2054
  font-family: var(--retro-font);
1868
2055
  font-size: var(--retro-font-size);
1869
- border-radius: 0 !important;
2056
+ border-radius: var(--retro-border-radius);
1870
2057
  transition: none;
1871
2058
  }
1872
2059
  .retro-input:focus,
@@ -2077,7 +2264,7 @@ input[type=radio].retro-input {
2077
2264
  }
2078
2265
 
2079
2266
  input[type=checkbox].retro-input {
2080
- border-radius: 0;
2267
+ border-radius: var(--retro-border-radius);
2081
2268
  }
2082
2269
 
2083
2270
  input[type=checkbox].retro-input:checked::after {
@@ -2271,7 +2458,7 @@ input[type=radio].retro-input:focus-visible {
2271
2458
 
2272
2459
  /* Checkbox specific styles */
2273
2460
  .retro-checkbox {
2274
- border-radius: 0;
2461
+ border-radius: var(--retro-border-radius);
2275
2462
  }
2276
2463
  .retro-checkbox:checked {
2277
2464
  background: var(--retro-white);
@@ -2476,7 +2663,7 @@ input[type=radio].retro-input:focus-visible {
2476
2663
  border-bottom: 2px solid var(--retro-border-light);
2477
2664
  border-left: 2px solid var(--retro-border-medium);
2478
2665
  border-top: 2px solid var(--retro-border-medium);
2479
- border-radius: 0 !important;
2666
+ border-radius: var(--retro-border-radius);
2480
2667
  font-family: var(--retro-font-heading);
2481
2668
  box-shadow: none;
2482
2669
  margin-bottom: 1.2em;
@@ -2509,7 +2696,7 @@ input[type=radio].retro-input:focus-visible {
2509
2696
  padding: 0.3em 1em 0.2em 1em;
2510
2697
  font-size: var(--retro-font-size-sm);
2511
2698
  font-family: inherit;
2512
- border-radius: 0;
2699
+ border-radius: var(--retro-border-radius);
2513
2700
  box-shadow: none;
2514
2701
  border-top: 2px solid rgba(var(--retro-black-rgb), 0.12);
2515
2702
  background: var(--retro-light);
@@ -2934,12 +3121,14 @@ input[type=radio].retro-input:focus-visible {
2934
3121
  transition: none;
2935
3122
  text-align: left;
2936
3123
  vertical-align: middle;
3124
+ border-radius: var(--retro-border-radius);
2937
3125
  }
2938
3126
  .retro-modal-header {
2939
3127
  display: flex;
2940
3128
  align-items: center;
2941
3129
  justify-content: space-between;
2942
3130
  padding: 8px 24px;
3131
+ border-radius: var(--retro-border-radius) var(--retro-border-radius) 0 0;
2943
3132
  background: var(--retro-modal-header-bg);
2944
3133
  color: var(--retro-modal-header-text);
2945
3134
  }
@@ -3092,7 +3281,7 @@ input[type=radio].retro-input:focus-visible {
3092
3281
  list-style: none;
3093
3282
  background: var(--retro-light);
3094
3283
  border: 2px solid var(--retro-border-dark);
3095
- border-radius: 0;
3284
+ border-radius: var(--retro-border-radius);
3096
3285
  box-shadow: inset 1px 1px 0 var(--retro-border-light), inset -1px -1px 0 var(--retro-border-medium);
3097
3286
  font-family: var(--retro-font);
3098
3287
  transition: none;
@@ -3103,7 +3292,7 @@ input[type=radio].retro-input:focus-visible {
3103
3292
  padding: 8px 16px;
3104
3293
  color: var(--retro-black);
3105
3294
  text-decoration: none;
3106
- border-radius: 0;
3295
+ border-radius: var(--retro-border-radius);
3107
3296
  background: var(--retro-light);
3108
3297
  border-right: 1px solid var(--retro-border-medium);
3109
3298
  font-family: var(--retro-font);
@@ -3203,7 +3392,7 @@ input[type=radio].retro-input:focus-visible {
3203
3392
  display: block;
3204
3393
  border-right: none;
3205
3394
  border-bottom: 1px solid var(--retro-border-medium);
3206
- border-radius: 0;
3395
+ border-radius: var(--retro-border-radius);
3207
3396
  width: 100%;
3208
3397
  }
3209
3398
  .retro-nav-vertical .retro-nav-item:last-child, .retro-nav-vertical .retro-tab:last-child {
@@ -3259,7 +3448,7 @@ input[type=radio].retro-input:focus-visible {
3259
3448
  margin: 0;
3260
3449
  background: var(--retro-light);
3261
3450
  border: 2px solid var(--retro-border-dark);
3262
- border-radius: 0;
3451
+ border-radius: var(--retro-border-radius);
3263
3452
  box-shadow: inset 1px 1px 0 var(--retro-border-light), inset -1px -1px 0 var(--retro-border-medium);
3264
3453
  font-family: var(--retro-font);
3265
3454
  }
@@ -3275,7 +3464,7 @@ input[type=radio].retro-input:focus-visible {
3275
3464
  text-decoration: none;
3276
3465
  background: var(--retro-light);
3277
3466
  border: 2px solid transparent;
3278
- border-radius: 0;
3467
+ border-radius: var(--retro-border-radius);
3279
3468
  text-align: center;
3280
3469
  }
3281
3470
  .retro-nav-toolbar .retro-nav-item:hover, .retro-nav-toolbar .retro-tab:hover {
@@ -3471,7 +3660,7 @@ input[type=radio].retro-input:focus-visible {
3471
3660
  border-bottom: 2px solid var(--retro-border-light);
3472
3661
  border-left: 2px solid var(--retro-border-medium);
3473
3662
  border-top: 2px solid var(--retro-border-medium);
3474
- border-radius: 0;
3663
+ border-radius: var(--retro-border-radius);
3475
3664
  height: 22px;
3476
3665
  position: relative;
3477
3666
  margin: 1em 0;
@@ -3485,7 +3674,7 @@ input[type=radio].retro-input:focus-visible {
3485
3674
  width: 0%;
3486
3675
  transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);
3487
3676
  border-right: 2px solid var(--retro-border-light);
3488
- border-radius: 0;
3677
+ border-radius: var(--retro-border-radius);
3489
3678
  box-shadow: none;
3490
3679
  position: absolute;
3491
3680
  left: 0;
@@ -3547,7 +3736,7 @@ input[type=radio].retro-input:focus-visible {
3547
3736
  color: var(--retro-badge-text);
3548
3737
  background: var(--retro-badge-bg);
3549
3738
  border: 1px solid var(--retro-border-dark);
3550
- border-radius: 0;
3739
+ border-radius: var(--retro-border-radius);
3551
3740
  box-shadow: 0 0 0 2px rgba(var(--retro-white-rgb), 0.1), inset 0 0 6px rgba(var(--retro-black-rgb), 0.8);
3552
3741
  text-shadow: none;
3553
3742
  margin: 0.2em 0.4em 0.2em 0;
@@ -3785,6 +3974,7 @@ input[type=radio].retro-input:focus-visible {
3785
3974
  }
3786
3975
 
3787
3976
  .retro-accordion-item {
3977
+ border-radius: var(--retro-border-radius);
3788
3978
  border: 2px solid var(--retro-border-dark);
3789
3979
  margin-bottom: 0.5rem;
3790
3980
  background-color: var(--retro-bg);
@@ -4030,6 +4220,11 @@ input[type=radio].retro-input:focus-visible {
4030
4220
  margin-bottom: 0;
4031
4221
  }
4032
4222
 
4223
+ .retro-file-input:focus-visible + .retro-file-label {
4224
+ outline: 2px solid var(--retro-primary);
4225
+ outline-offset: 2px;
4226
+ }
4227
+
4033
4228
  .retro-file-filename {
4034
4229
  font-size: var(--retro-font-size);
4035
4230
  color: var(--retro-input-text);
@@ -4517,7 +4712,7 @@ input[type=radio].retro-input:focus-visible {
4517
4712
  margin-left: var(--retro-spacing-lg);
4518
4713
  background: none;
4519
4714
  box-shadow: none;
4520
- border-radius: 0;
4715
+ border-radius: var(--retro-border-radius);
4521
4716
  }
4522
4717
  .retro-list-bordered {
4523
4718
  border: 1px solid var(--retro-border-medium);
@@ -4661,7 +4856,7 @@ dl.retro-list dd {
4661
4856
  color: var(--retro-black);
4662
4857
  border: 2px solid var(--retro-border-dark);
4663
4858
  box-shadow: 2px 2px 0 var(--retro-border-light), -2px -2px 0 var(--retro-border-dark);
4664
- border-radius: 0;
4859
+ border-radius: var(--retro-border-radius);
4665
4860
  width: 32px;
4666
4861
  height: 32px;
4667
4862
  cursor: pointer;
@@ -4700,7 +4895,7 @@ dl.retro-list dd {
4700
4895
  .retro-carousel-dot {
4701
4896
  width: 12px;
4702
4897
  height: 12px;
4703
- border-radius: 0;
4898
+ border-radius: var(--retro-border-radius);
4704
4899
  background: var(--retro-border-medium);
4705
4900
  border: 2px solid var(--retro-border-dark);
4706
4901
  box-shadow: 1px 1px 0 var(--retro-border-light);
@@ -5053,18 +5248,22 @@ input[type=datetime-local].retro-input.retro-input-sm {
5053
5248
  }
5054
5249
 
5055
5250
  .retro-sidebar-group {
5056
- margin: var(--retro-spacing-sm) 0 var(--retro-spacing-xs);
5251
+ margin: 0;
5252
+ padding: var(--retro-spacing-xs) var(--retro-spacing-md);
5057
5253
  font-size: var(--retro-font-size-xs);
5058
5254
  font-weight: var(--retro-font-weight-bold);
5059
5255
  text-transform: uppercase;
5060
- letter-spacing: 0.08em;
5061
5256
  color: var(--retro-text-muted);
5257
+ background: var(--retro-bg);
5062
5258
  border-bottom: 1px solid var(--retro-border-medium);
5063
- padding-bottom: 2px;
5064
5259
  }
5065
5260
 
5066
- .retro-sidebar-section:first-of-type .retro-sidebar-group {
5067
- margin-top: 0;
5261
+ .retro-nav-vertical .retro-sidebar-section {
5262
+ margin-bottom: 0;
5263
+ }
5264
+
5265
+ .retro-nav-vertical .retro-sidebar-section + .retro-sidebar-section .retro-sidebar-group {
5266
+ border-top: 1px solid var(--retro-border-medium);
5068
5267
  }
5069
5268
 
5070
5269
  /* Utilities */