bullframe.css 5.1.0 → 6.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 (117) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +1 -1
  3. package/README.md +34 -458
  4. package/dist/css/bullframe-classless-dark.css +1270 -909
  5. package/dist/css/bullframe-classless-dark.css.map +1 -1
  6. package/dist/css/bullframe-classless-dark.min.css +1 -3
  7. package/dist/css/bullframe-classless-dark.min.css.map +1 -1
  8. package/dist/css/bullframe-classless-system-default.css +1339 -899
  9. package/dist/css/bullframe-classless-system-default.css.map +1 -1
  10. package/dist/css/bullframe-classless-system-default.min.css +1 -3
  11. package/dist/css/bullframe-classless-system-default.min.css.map +1 -1
  12. package/dist/css/bullframe-classless.css +1098 -713
  13. package/dist/css/bullframe-classless.css.map +1 -1
  14. package/dist/css/bullframe-classless.min.css +1 -3
  15. package/dist/css/bullframe-classless.min.css.map +1 -1
  16. package/dist/css/bullframe-dark.css +2105 -1541
  17. package/dist/css/bullframe-dark.css.map +1 -1
  18. package/dist/css/bullframe-dark.min.css +1 -3
  19. package/dist/css/bullframe-dark.min.css.map +1 -1
  20. package/dist/css/bullframe-system-default.css +2107 -1529
  21. package/dist/css/bullframe-system-default.css.map +1 -1
  22. package/dist/css/bullframe-system-default.min.css +1 -3
  23. package/dist/css/bullframe-system-default.min.css.map +1 -1
  24. package/dist/css/bullframe-utilities.css +766 -490
  25. package/dist/css/bullframe-utilities.css.map +1 -1
  26. package/dist/css/bullframe-utilities.min.css +1 -2
  27. package/dist/css/bullframe-utilities.min.css.map +1 -1
  28. package/dist/css/bullframe.css +1900 -1310
  29. package/dist/css/bullframe.css.map +1 -1
  30. package/dist/css/bullframe.min.css +1 -3
  31. package/dist/css/bullframe.min.css.map +1 -1
  32. package/package.json +70 -28
  33. package/.browserslistrc +0 -3
  34. package/.editorconfig +0 -15
  35. package/.htmlhintrc +0 -12
  36. package/.prettierignore +0 -1
  37. package/.stylelintignore +0 -3
  38. package/.stylelintrc.json +0 -26
  39. package/dist/apple-touch-icon.png +0 -0
  40. package/dist/css/bullframe-classless-dark-prefers.css +0 -1280
  41. package/dist/css/bullframe-classless-dark-prefers.css.map +0 -1
  42. package/dist/css/bullframe-classless-dark-prefers.min.css +0 -3
  43. package/dist/css/bullframe-classless-dark-prefers.min.css.map +0 -1
  44. package/dist/css/bullframe-dark-prefers.css +0 -2296
  45. package/dist/css/bullframe-dark-prefers.css.map +0 -1
  46. package/dist/css/bullframe-dark-prefers.min.css +0 -3
  47. package/dist/css/bullframe-dark-prefers.min.css.map +0 -1
  48. package/dist/docs/demo/index.html +0 -1154
  49. package/dist/favicon-16x16.png +0 -0
  50. package/dist/favicon-32x32.png +0 -0
  51. package/dist/favicon.ico +0 -0
  52. package/dist/index.css +0 -1
  53. package/dist/index.js.map +0 -1
  54. package/dist/placeholder-img-800x400.jpg +0 -0
  55. package/dist/video-poster.png +0 -0
  56. package/prettier.config.js +0 -26
  57. package/src/scss/bullframe-classless-dark-prefers.scss +0 -2
  58. package/src/scss/bullframe-classless-dark.scss +0 -2
  59. package/src/scss/bullframe-classless-system-default.scss +0 -2
  60. package/src/scss/bullframe-classless.scss +0 -49
  61. package/src/scss/bullframe-dark-prefers.scss +0 -2
  62. package/src/scss/bullframe-dark.scss +0 -2
  63. package/src/scss/bullframe-system-default.scss +0 -2
  64. package/src/scss/bullframe-utilities.scss +0 -21
  65. package/src/scss/bullframe.scss +0 -49
  66. package/src/scss/custom/_author-styles.scss +0 -5
  67. package/src/scss/forms/_forms-normalization.scss +0 -300
  68. package/src/scss/forms/_forms-styling-radio-checkbox.scss +0 -81
  69. package/src/scss/forms/_forms-styling-range.scss +0 -106
  70. package/src/scss/forms/_forms-styling-select.scss +0 -58
  71. package/src/scss/forms/_forms-styling.scss +0 -118
  72. package/src/scss/miscellaneous/_misc-accessibility.scss +0 -36
  73. package/src/scss/miscellaneous/_misc-anchors.scss +0 -37
  74. package/src/scss/miscellaneous/_misc-embedded-content.scss +0 -117
  75. package/src/scss/miscellaneous/_misc-focus.scss +0 -80
  76. package/src/scss/miscellaneous/_misc-interactive.scss +0 -48
  77. package/src/scss/miscellaneous/_misc-layout.scss +0 -30
  78. package/src/scss/miscellaneous/_misc-lists.scss +0 -53
  79. package/src/scss/miscellaneous/_misc-scrolling.scss +0 -5
  80. package/src/scss/miscellaneous/_misc-shame.scss +0 -37
  81. package/src/scss/miscellaneous/_misc-tables.scss +0 -53
  82. package/src/scss/mixins/_mixin-dark-prefers.scss +0 -413
  83. package/src/scss/mixins/_mixin-dark.scss +0 -415
  84. package/src/scss/mixins/_mixin-grid-flex.scss +0 -80
  85. package/src/scss/mixins/_mixin-layout.scss +0 -42
  86. package/src/scss/mixins/_mixin-texts.scss +0 -37
  87. package/src/scss/typography/_typography-blockquotes.scss +0 -28
  88. package/src/scss/typography/_typography-headings.scss +0 -45
  89. package/src/scss/typography/_typography-html-body.scss +0 -75
  90. package/src/scss/typography/_typography-misc.scss +0 -90
  91. package/src/scss/typography/_typography-monospaced-elements.scss +0 -59
  92. package/src/scss/utilities/_utility-buttons.scss +0 -73
  93. package/src/scss/utilities/_utility-debugging.scss +0 -31
  94. package/src/scss/utilities/_utility-embeds.scss +0 -34
  95. package/src/scss/utilities/_utility-filters.scss +0 -21
  96. package/src/scss/utilities/_utility-form-states.scss +0 -89
  97. package/src/scss/utilities/_utility-global-dark-classless.scss +0 -3
  98. package/src/scss/utilities/_utility-global-dark-prefers-classless.scss +0 -3
  99. package/src/scss/utilities/_utility-global-dark-prefers.scss +0 -3
  100. package/src/scss/utilities/_utility-global-dark-scrollbars.scss +0 -34
  101. package/src/scss/utilities/_utility-global-dark.scss +0 -4
  102. package/src/scss/utilities/_utility-global-system-default-classless.scss +0 -3
  103. package/src/scss/utilities/_utility-global-system-default.scss +0 -3
  104. package/src/scss/utilities/_utility-grid-system.scss +0 -140
  105. package/src/scss/utilities/_utility-layout.scss +0 -187
  106. package/src/scss/utilities/_utility-lists.scss +0 -17
  107. package/src/scss/utilities/_utility-print.scss +0 -101
  108. package/src/scss/utilities/_utility-reduced-motion.scss +0 -29
  109. package/src/scss/utilities/_utility-spacing.scss +0 -148
  110. package/src/scss/utilities/_utility-tables.scss +0 -34
  111. package/src/scss/utilities/_utility-texts.scss +0 -225
  112. package/src/scss/utilities/_utility-z-index.scss +0 -83
  113. package/src/scss/variables/_variables-breakpoints.scss +0 -6
  114. package/src/scss/variables/_variables-colors.scss +0 -34
  115. package/src/scss/variables/_variables-spacing.scss +0 -24
  116. package/src/scss/variables/_variables-texts.scss +0 -8
  117. package/vite.config.js +0 -148
@@ -1,5 +1,80 @@
1
- /* ! Bullframe CSS v5.1.0 | MIT License | https://github.com/marcop135/bullframe.css */
2
- @charset "UTF-8";
1
+ /* ! Bullframe CSS v6.0.0 | MIT License | https://github.com/marcop135/bullframe.css */
2
+
3
+ /* Classless build: semantic element styles only (no .bf-* utilities). */
4
+
5
+ /* Variables */
6
+ /* Design tokens (--bf-*). Shared by every build variant.
7
+ * Override on :root (or a scope) to theme without rebuilding. */
8
+
9
+ :root {
10
+ /* Neutrals */
11
+ --bf-white: rgb(255 255 255);
12
+ --bf-light: rgb(240 240 240);
13
+ --bf-gray-light-extra: rgb(233 233 233);
14
+ --bf-gray-light: rgb(204 204 204);
15
+ --bf-gray: rgb(153 153 153);
16
+ --bf-gray-dark: rgb(102 102 102);
17
+ --bf-gray-dark-extra: rgb(51 51 51);
18
+ --bf-dark: rgb(34 34 34);
19
+ --bf-dark-extra: rgb(17 17 17);
20
+ --bf-black: rgb(0 0 0);
21
+
22
+ /* Highlight / mark */
23
+ --bf-yellow-light: rgb(255 255 153);
24
+ --bf-yellow: rgb(255 255 0);
25
+ --bf-orange: rgb(255 165 0);
26
+
27
+ /* Accent: WCAG AA on white (links 4.5:1) and white-on-blue buttons (4.5:1) */
28
+ --bf-blue: rgb(0 86 179);
29
+ --bf-blue-light: rgb(0 65 135);
30
+ --bf-blue-light-extra: rgb(190 216 254);
31
+
32
+ /* Invalid / error */
33
+ --bf-red: rgb(255 0 0);
34
+
35
+ /* Dark-mode surfaces (used by utility-global-dark*.css) */
36
+ --bf-dark-bg: rgb(28 28 28);
37
+ --bf-dark-link: rgb(77 165 255);
38
+ --bf-dark-link-hover: rgb(77 165 255);
39
+ --bf-dark-border-focus: rgb(26 140 255);
40
+ --bf-dark-shadow-focus: rgb(3 102 214 / 50%);
41
+ --bf-dark-mark-bg: rgb(230 230 0);
42
+ --bf-dark-ins-bg: rgb(255 255 200);
43
+ --bf-dark-button-hover: rgb(184 184 184);
44
+ --bf-dark-button-shadow: rgb(255 255 255 / 45%);
45
+ --bf-dark-invalid: rgb(255 38 38);
46
+
47
+ /* Spacing scale + grid gutter */
48
+ --bf-spacing-sm: 0.25rem;
49
+ --bf-spacing-md: 0.5rem;
50
+ --bf-spacing-lg: 1rem;
51
+ --bf-spacing-xl: 2rem;
52
+ --bf-spacing-xxl: 3rem;
53
+ --bf-spacing-grid-gutter: 1.5rem;
54
+
55
+ /* Type */
56
+ --bf-font-sans-serif:
57
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
58
+ 'Helvetica Neue', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
59
+ 'Segoe UI Symbol', 'Noto Color Emoji';
60
+ --bf-font-serif: Georgia, Times, 'Times New Roman', serif;
61
+ --bf-font-monospace:
62
+ SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
63
+ --bf-body-font-size-rem: 1.6rem;
64
+ --bf-body-line-height: 1.5;
65
+
66
+ /* Breakpoint tokens (documentation / tooling; media queries use literal px below) */
67
+ --bf-breakpoint-xs: 0;
68
+ --bf-breakpoint-sm: 576px;
69
+ --bf-breakpoint-md: 768px;
70
+ --bf-breakpoint-lg: 992px;
71
+ --bf-breakpoint-xl: 1200px;
72
+ --bf-breakpoint-xxl: 1400px;
73
+ }
74
+
75
+ /* Layout */
76
+ /* Border-box and HTML5 block elements. */
77
+
3
78
  *,
4
79
  *::before,
5
80
  *::after {
@@ -26,32 +101,246 @@ template {
26
101
  display: none;
27
102
  }
28
103
 
29
- [hidden] {
104
+ /* [hidden] stays hidden (except until-found). */
105
+ [hidden]:where(:not([hidden='until-found'])) {
30
106
  display: none !important;
31
107
  }
108
+ /* UA+ enhancements (adapted from https://fokus.dev/tools/uaplus/).
109
+ * Light UA improvements; complements Bullframe base styles. */
110
+
111
+ @layer {
112
+ /* Spacing between content and focus outline (enhances focus.css). */
113
+ :focus-visible {
114
+ outline-offset: 3px;
115
+ }
116
+
117
+ /* Disable mobile landscape text inflation on optimized layouts. */
118
+ html {
119
+ -webkit-text-size-adjust: none;
120
+ -moz-text-size-adjust: none;
121
+ text-size-adjust: none;
122
+ }
123
+
124
+ /* Comfortable default root line-height (body still uses --bf-body-line-height). */
125
+ html {
126
+ line-height: 1.5;
127
+ }
128
+
129
+ /* Stable scrollbar gutter avoids layout jump on short pages. */
130
+ html {
131
+ scrollbar-gutter: stable;
132
+ }
133
+
134
+ /* Nested h1 size/margin: match modern UA (Safari still nests sectioning styles). */
135
+ h1 {
136
+ font-size: 2em;
137
+ margin-block: 0.67em;
138
+ }
139
+
140
+ /* abbr[title]: dotted underline + help cursor across engines. */
141
+ abbr[title] {
142
+ cursor: help;
143
+ text-decoration-line: underline;
144
+ text-decoration-style: dotted;
145
+ }
146
+
147
+ /* mark: system Highlight colors under forced-colors. */
148
+ @media (forced-colors: active) {
149
+ mark {
150
+ color: HighlightText;
151
+ background-color: Highlight;
152
+ }
153
+ }
154
+
155
+ /* Embedded media: stay within container block/inline size. */
156
+ audio,
157
+ iframe,
158
+ img,
159
+ svg,
160
+ video {
161
+ max-block-size: 100%;
162
+ max-inline-size: 100%;
163
+ }
164
+
165
+ /* fieldset: avoid min-content overflow from children. */
166
+ fieldset {
167
+ min-inline-size: 0;
168
+ }
169
+
170
+ /* Labels for text-like controls are block; :has() gated for older engines. */
171
+ @supports selector(:has(*)) {
172
+ label:has(+ input:not([type='radio'], [type='checkbox']), select, textarea) {
173
+ display: block;
174
+ }
175
+ }
176
+
177
+ /* Taller default textarea when rows is omitted. */
178
+ textarea:not([rows]) {
179
+ min-block-size: 6em;
180
+ }
181
+
182
+ /* Form controls inherit page font family/size. */
183
+ button,
184
+ input,
185
+ select,
186
+ textarea {
187
+ font-family: inherit;
188
+ font-size: inherit;
189
+ }
190
+
191
+ /* Search: drop WebKit rounded search chrome. */
192
+ [type='search'] {
193
+ -webkit-appearance: textfield;
194
+ }
195
+
196
+ /* iOS only: system border/background for search. */
197
+ @supports (-webkit-touch-callout: none) {
198
+ [type='search'] {
199
+ border: 1px solid -apple-system-secondary-label;
200
+ background-color: canvas;
201
+ }
202
+ }
203
+
204
+ /* Keep tel/url/email/number LTR when a value is present (RTL placeholders stay). */
205
+ input:where([type='tel'], [type='url'], [type='email'], [type='number']):not(
206
+ :-moz-placeholder
207
+ ) {
208
+ direction: ltr;
209
+ }
210
+ input:where([type='tel'], [type='url'], [type='email'], [type='number']):not(
211
+ :placeholder-shown
212
+ ) {
213
+ direction: ltr;
214
+ }
215
+
216
+ /* Tables: collapsed borders + cell padding for scanability. */
217
+ table {
218
+ border: 1px solid currentColor;
219
+ }
220
+
221
+ th,
222
+ td {
223
+ border: 1px solid currentColor;
224
+ padding: 0.25em 0.5em;
225
+ }
226
+
227
+ /* Soft dialog / popover enter transitions (skip when reduced-motion is on). */
228
+ @media (prefers-reduced-motion: no-preference) {
229
+ dialog::backdrop {
230
+ background: rgb(0 0 0 / 0.3);
231
+ }
232
+
233
+ @supports (overlay: auto) {
234
+ dialog,
235
+ [popover],
236
+ dialog::backdrop {
237
+ opacity: 0;
238
+ transition:
239
+ opacity 300ms ease-out,
240
+ display 300ms allow-discrete,
241
+ overlay 300ms allow-discrete;
242
+ }
243
+
244
+ dialog[open],
245
+ :popover-open,
246
+ dialog[open]::backdrop {
247
+ opacity: 1;
248
+ }
249
+
250
+ @starting-style {
251
+ dialog[open],
252
+ :popover-open,
253
+ dialog[open]::backdrop {
254
+ opacity: 0;
255
+ }
256
+ }
257
+ }
258
+ }
259
+
260
+ /* Keep [hidden] hard-hidden except until-found. */
261
+ [hidden]:not([hidden='until-found']) {
262
+ display: none !important;
263
+ }
264
+
265
+ /* Images as blocks (max-width still from embedded-content.css). */
266
+ img {
267
+ display: block;
268
+ }
269
+
270
+ /* summary: pointer on the whole control, not only ::marker. */
271
+ summary {
272
+ cursor: default;
273
+ }
274
+
275
+ /* iframes: no default border. */
276
+ iframe {
277
+ border: none;
278
+ }
279
+
280
+ /* Popovers: anchor near trigger when position-area is supported. */
281
+ @supports (position-area: block-end span-inline-end) {
282
+ [popover] {
283
+ margin: 0;
284
+ position-area: block-end span-inline-end;
285
+ }
286
+ }
287
+ }
288
+
289
+ /* Typography */
290
+ /* Root type and page chrome. */
32
291
 
33
292
  html {
34
293
  -webkit-text-size-adjust: 100%;
35
294
  -moz-text-size-adjust: 100%;
36
295
  text-size-adjust: 100%;
296
+
297
+ /* 62.5% root so 1rem ≈ 10px. */
37
298
  font-size: 62.5%;
38
- color: #222;
39
- font-family: sans-serif;
299
+
300
+ color: var(--bf-dark);
301
+ font-family: system-ui, sans-serif;
40
302
  line-height: 1.15;
41
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
303
+
304
+ /* No tap flash on touch. */
305
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
42
306
  }
43
307
 
44
308
  body {
45
309
  margin: 0;
46
- font-size: 1.6rem;
47
- line-height: 1.5;
310
+ font-size: var(--bf-body-font-size-rem);
311
+ line-height: var(--bf-body-line-height);
48
312
  font-weight: 400;
49
313
  text-align: left;
50
- font-family: BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
314
+
315
+ /* System UI stack (OS-native). */
316
+ font-family:
317
+ /* Safari / iOS (San Francisco) */
318
+ -apple-system,
319
+ /* Chrome < 56 on macOS (San Francisco) */ BlinkMacSystemFont,
320
+ /* Windows */ 'Segoe UI',
321
+ /* Android */ Roboto,
322
+ /* KDE */ Oxygen-Sans,
323
+ /* Ubuntu */ Ubuntu,
324
+ /* GNOME */ Cantarell,
325
+ /* macOS 10.10 and below */ 'Helvetica Neue',
326
+ Helvetica,
327
+ /* Web fallback */ Arial,
328
+ 'Noto Sans',
329
+ sans-serif,
330
+ /* Emoji */ 'Apple Color Emoji',
331
+ 'Segoe UI Emoji',
332
+ 'Segoe UI Symbol',
333
+ 'Noto Color Emoji';
334
+
335
+ /* Ligatures and kerning. */
51
336
  text-rendering: optimizeLegibility;
337
+
338
+ /* Long unbroken strings (e.g. headlines) wrap instead of overflowing. */
52
339
  word-wrap: break-word;
53
- background-color: #fff;
340
+
341
+ background-color: var(--bf-white);
54
342
  }
343
+ /* Heading scale and rhythm. */
55
344
 
56
345
  h1,
57
346
  h2,
@@ -64,7 +353,8 @@ h6 {
64
353
  font-family: inherit;
65
354
  color: inherit;
66
355
  line-height: 1.25;
67
- margin-bottom: 1rem;
356
+ margin-bottom: var(--bf-spacing-lg);
357
+ text-wrap: balance;
68
358
  }
69
359
 
70
360
  h1 {
@@ -92,9 +382,10 @@ h6 {
92
382
  font-size: 16px;
93
383
  font-size: 1.6rem;
94
384
  }
385
+ /* Blockquote and citation. */
95
386
 
96
387
  blockquote {
97
- margin-bottom: 2rem;
388
+ margin: 0 0 var(--bf-spacing-xl);
98
389
  padding-left: 0;
99
390
  font-style: italic;
100
391
  }
@@ -104,56 +395,24 @@ blockquote p {
104
395
  }
105
396
 
106
397
  blockquote small {
107
- color: #999;
398
+ color: var(--bf-gray);
108
399
  display: block;
109
400
  }
110
401
 
111
402
  blockquote small::before {
112
- content: "— ";
403
+ content: '\2014 \00A0';
113
404
  }
114
405
 
115
406
  q {
116
- quotes: "“" "”" "‘" "’";
117
- }
118
-
119
- pre {
120
- margin: 0 0 2rem 0;
121
- display: block;
122
- overflow: auto;
123
- word-break: break-all;
124
- word-wrap: break-word;
125
- white-space: pre;
126
- -webkit-hyphens: none;
127
- hyphens: none;
128
- -ms-overflow-style: auto;
129
- }
130
-
131
- pre,
132
- code,
133
- kbd,
134
- samp {
135
- font-family: Menlo, Consolas, "Roboto Mono", "Ubuntu Monospace", "Noto Mono", "Oxygen Mono", "Liberation Mono", monospace, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
136
- font-size: 0.875em;
137
- }
138
-
139
- code {
140
- word-wrap: break-word;
141
- }
142
-
143
- a > code {
144
- color: inherit;
145
- }
146
-
147
- pre code {
148
- font-size: inherit;
149
- color: inherit;
150
- word-break: normal;
407
+ quotes: '\201C' '\201D' '\2018' '\2019';
151
408
  }
409
+ /* Paragraphs, abbr, mark/ins, emphasis, sub/sup, small, hr. */
152
410
 
153
411
  p {
154
- margin: 0 0 2rem 0;
412
+ margin: 0 0 var(--bf-spacing-xl) 0;
155
413
  }
156
414
 
415
+ /* abbr (Bootstrap 4): dotted underline + help cursor. */
157
416
  abbr[title],
158
417
  abbr[data-original-title] {
159
418
  cursor: help;
@@ -164,16 +423,17 @@ abbr[data-original-title] {
164
423
  }
165
424
 
166
425
  mark {
167
- background-color: #ff0;
168
- color: #000;
426
+ background-color: var(--bf-yellow);
427
+ color: var(--bf-black);
169
428
  }
170
429
 
171
430
  ins {
172
- background-color: #ff9;
173
- color: #000;
431
+ background-color: var(--bf-yellow-light);
432
+ color: var(--bf-black);
174
433
  text-decoration: none;
175
434
  }
176
435
 
436
+ /* Inherit first so Safari does not double-apply bolder, then set bolder. */
177
437
  b,
178
438
  strong {
179
439
  font-weight: inherit;
@@ -181,7 +441,6 @@ strong {
181
441
 
182
442
  b,
183
443
  strong {
184
- /* stylelint-disable-next-line */
185
444
  font-weight: bolder;
186
445
  }
187
446
 
@@ -211,8 +470,11 @@ small {
211
470
  font-size: 80%;
212
471
  }
213
472
 
214
- p:has(small) {
215
- line-height: 1.25;
473
+ /* Tighter leading when a paragraph contains <small>. */
474
+ @supports selector(:has(*)) {
475
+ p:has(small) {
476
+ line-height: 1.25;
477
+ }
216
478
  }
217
479
 
218
480
  hr {
@@ -222,867 +484,990 @@ hr {
222
484
  border-style: solid;
223
485
  border-width: 1px 0 0;
224
486
  color: inherit;
225
- margin: 2rem 0;
487
+ margin: var(--bf-spacing-xl) 0;
226
488
  padding: 0;
227
- overflow: visible;
489
+ overflow: visible; /* Edge: show overflow. */
228
490
  }
491
+ /* pre / code / kbd / samp. */
229
492
 
230
- a {
231
- color: #007bff;
232
- text-decoration: none;
233
- background-color: transparent;
493
+ pre {
494
+ margin: 0 0 var(--bf-spacing-xl) 0;
495
+
496
+ display: block;
497
+ overflow: auto;
498
+ word-break: break-all; /* WebKit */
499
+ word-wrap: break-word;
500
+ white-space: pre;
501
+ hyphens: none;
502
+
503
+ /* Keep scrollbars visible in legacy Edge.
504
+ * https://github.com/twbs/bootstrap/pull/30685 */
505
+ -ms-overflow-style: auto;
234
506
  }
235
- a:hover, a:focus {
236
- text-decoration: underline;
237
- color: #0056b3;
507
+
508
+ pre,
509
+ code,
510
+ kbd,
511
+ samp {
512
+ font-family:
513
+ /* macOS 10.10+ */
514
+ Menlo, Consolas, 'Roboto Mono', 'Ubuntu Monospace', 'Noto Mono', 'Oxygen Mono',
515
+ 'Liberation Mono', monospace, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
516
+ 'Noto Color Emoji';
517
+
518
+ /* Mono faces read large; use a slightly smaller size. */
519
+ font-size: 0.875em;
238
520
  }
239
521
 
240
- a:not([href], [tabindex]) {
241
- color: inherit;
242
- text-decoration: none;
522
+ code {
523
+ word-wrap: break-word;
243
524
  }
244
525
 
245
- a:not([href], [class]),
246
- a:not([href], [class]):hover {
526
+ a > code {
247
527
  color: inherit;
248
- text-decoration: none;
249
528
  }
250
529
 
251
- a:not([href], [tabindex]):focus {
252
- outline: 0;
530
+ pre code {
531
+ font-size: inherit;
532
+ color: inherit;
533
+ word-break: normal;
253
534
  }
254
535
 
255
- :where(:focus:not(:focus-visible)) {
256
- outline: none;
257
- }
536
+ /* Forms */
537
+ /* Form control reset: inheritance, sizing, and UA quirks. */
258
538
 
259
- :where([tabindex="-1"]:focus:not(:focus-visible)) {
260
- outline: 0 !important;
539
+ :where(html input, button, select, optgroup, textarea) {
540
+ color: inherit;
541
+ font-family: inherit;
542
+ font-size: inherit;
543
+ line-height: inherit;
261
544
  }
262
545
 
263
- :where(a:focus, input:focus) {
264
- outline: 2px solid orange;
265
- }
266
-
267
- :where(:focus-visible) {
268
- outline: 2px solid orange;
269
- }
270
-
271
- :where(button,
272
- [type=button],
273
- [type=reset],
274
- [type=submit],
275
- [type=email],
276
- [type=number],
277
- [type=password],
278
- [type=tel],
279
- [type=search],
280
- [type=text],
281
- [type=date],
282
- [type=datetime-local],
283
- [type=month],
284
- [type=time],
285
- [type=week],
286
- [type=url],
287
- [type=radio],
288
- [type=checkbox],
289
- input[list],
290
- select,
291
- textarea):focus {
292
- outline: 0;
546
+ :where(html input, button, [type='radio'], [type='checkbox'], select, optgroup, textarea) {
547
+ margin: 0;
293
548
  }
294
549
 
295
- menu,
296
- ol,
297
- ul,
298
- dl {
299
- margin: 0 0 2rem 0;
300
- padding: 0;
550
+ :where(html input, select, textarea, legend) {
551
+ width: 100%;
301
552
  }
302
553
 
303
- menu ul,
304
- menu ol,
305
- ul ul,
306
- ul ol,
307
- ol ol,
308
- ol ul,
309
- dd {
310
- margin-bottom: 0;
554
+ /* Shrink-to-content controls stay auto-width. */
555
+ :where(
556
+ html label,
557
+ button,
558
+ [type='image'],
559
+ [type='submit'],
560
+ [type='reset'],
561
+ html [type='button'],
562
+ [type='radio'],
563
+ [type='checkbox']
564
+ ) {
565
+ width: auto;
311
566
  }
312
567
 
313
- ul,
314
- ol {
315
- margin-left: 2rem;
568
+ /* inline-block: consistent sizing and vertical-align across engines. */
569
+ :where(
570
+ html input,
571
+ label,
572
+ select,
573
+ textarea,
574
+ button,
575
+ html [type='button'],
576
+ [type='reset'],
577
+ [type='submit'],
578
+ output
579
+ ) {
580
+ display: inline-block;
316
581
  }
317
582
 
318
- nav ol,
319
- nav ul {
320
- list-style: none;
321
- list-style-image: none;
322
- margin-left: 0;
583
+ :where([type='file']) {
584
+ display: block;
585
+ background-color: transparent;
323
586
  }
324
587
 
325
- dt {
326
- font-weight: 700;
588
+ :where(button, html input, select, textarea) {
589
+ background-image: none;
327
590
  }
328
591
 
329
- dd {
330
- margin-left: 0;
592
+ :where(input, select, textarea) {
593
+ vertical-align: baseline;
331
594
  }
332
595
 
333
- nav li::before {
334
- content: "​";
335
- position: absolute;
596
+ :where(form) {
597
+ margin: 0;
336
598
  }
337
599
 
338
- audio,
339
- canvas,
340
- progress,
341
- video {
342
- display: inline-block;
600
+ /* Drop fieldset min-content width so nested grids can shrink. */
601
+ :where(fieldset) {
602
+ border: 0;
603
+ padding: 0;
604
+ margin: 0;
605
+ min-width: 0;
343
606
  }
344
607
 
345
- img,
346
- canvas,
347
- audio,
348
- video,
349
- iframe,
350
- object,
351
- embed {
608
+ :where(legend) {
609
+ display: table; /* Text wrapping in Edge / IE. */
352
610
  max-width: 100%;
611
+ white-space: normal;
612
+ border: 0;
613
+ padding: 0;
614
+ font-weight: 400;
615
+ margin-bottom: var(--bf-spacing-md);
616
+ font-size: inherit;
617
+ line-height: 1.375;
618
+ color: inherit;
353
619
  }
354
620
 
355
- audio,
356
- video,
357
- canvas,
358
- img,
359
- svg {
360
- vertical-align: middle;
621
+ :where(label) {
622
+ font-weight: 400;
623
+ font-size: 90%;
624
+ line-height: 1.375;
625
+ margin-bottom: var(--bf-spacing-md);
361
626
  }
362
627
 
363
- img {
628
+ :where(label input, label select, label textarea) {
629
+ font-size: 110%;
630
+ }
631
+
632
+ ::-webkit-inner-spin-button {
364
633
  height: auto;
365
- border-style: none;
366
634
  }
367
635
 
368
- figure {
369
- margin: 0;
636
+ ::-webkit-datetime-edit-fields-wrapper,
637
+ ::-webkit-datetime-edit-text,
638
+ ::-webkit-datetime-edit-minute,
639
+ ::-webkit-datetime-edit-hour-field,
640
+ ::-webkit-datetime-edit-day-field,
641
+ ::-webkit-datetime-edit-month-field,
642
+ ::-webkit-datetime-edit-year-field {
643
+ padding: 0;
370
644
  }
371
645
 
372
- figure,
373
- figcaption {
374
- display: block;
646
+ ::-webkit-color-swatch-wrapper {
647
+ padding: 0;
375
648
  }
376
649
 
377
- figcaption {
378
- line-height: 1.375;
379
- font-size: 90%;
650
+ :where([type='search']) {
651
+ outline-offset: calc(-1 * var(--bf-spacing-sm));
380
652
  }
381
653
 
382
- video {
383
- height: auto;
654
+ :where(output) {
655
+ vertical-align: middle;
384
656
  }
385
657
 
386
- audio {
387
- width: 100%;
658
+ :where(button, select) {
659
+ text-transform: none;
388
660
  }
389
661
 
390
- audio:not([controls]) {
391
- display: none;
392
- height: 0;
662
+ :where(select) {
663
+ word-wrap: normal;
393
664
  }
394
665
 
395
- svg:not(:root) {
396
- overflow: hidden;
666
+ /* Hide WebKit datalist picker chrome (Bootstrap Reboot 5.2).
667
+ * https://unpkg.com/browse/bootstrap@5.2.0/dist/css/bootstrap-reboot.css */
668
+ :where([list]):not(
669
+ [type='date'],
670
+ [type='datetime-local'],
671
+ [type='month'],
672
+ [type='week'],
673
+ [type='time']
674
+ )::-webkit-calendar-picker-indicator {
675
+ display: none !important;
397
676
  }
398
677
 
399
- svg:not([fill]) {
400
- fill: currentColor;
678
+ :where(optgroup) {
679
+ font-family: inherit;
680
+ font-size: inherit;
681
+ font-style: inherit; /* Families without a 600 face. */
682
+ font-weight: 600;
401
683
  }
402
684
 
403
- progress,
404
- meter {
405
- display: inline-block;
406
- vertical-align: baseline;
407
- width: 100%;
408
- max-width: 100%;
409
- }
410
-
411
- progress[value] {
685
+ /* Reset WebKit / Blink appearance on text-like controls. */
686
+ :where(
687
+ button,
688
+ html [type='button'],
689
+ [type='reset'],
690
+ [type='submit'],
691
+ [type='email'],
692
+ [type='number'],
693
+ [type='text'],
694
+ [type='tel'],
695
+ [type='date'],
696
+ [type='datetime-local'],
697
+ [type='month'],
698
+ [type='week'],
699
+ [type='url'],
700
+ [type='image'],
701
+ [type='password'],
702
+ [type='search'],
703
+ [type='search']::-webkit-search-decoration,
704
+ [type='search']::-webkit-search-cancel-button,
705
+ input[list],
706
+ textarea
707
+ ) {
412
708
  -webkit-appearance: none;
413
- -moz-appearance: none;
414
709
  appearance: none;
415
- border: none;
416
- height: 20px;
417
- height: 2rem;
418
- background: #ccc;
419
- color: #007bff;
420
710
  }
421
711
 
422
- progress[value]::-webkit-progress-bar {
423
- background: #ccc;
712
+ ::file-selector-button {
713
+ font: inherit;
714
+ -webkit-appearance: auto;
715
+ -moz-appearance: auto;
716
+ appearance: auto;
424
717
  }
425
718
 
426
- progress[value]::-webkit-progress-value {
427
- background: #007bff;
719
+ :where(button, input, select, textarea) {
720
+ border-radius: var(--bf-spacing-sm);
428
721
  }
429
722
 
430
- iframe {
431
- border-style: none;
723
+ :where([type='radio']) {
724
+ border-radius: 50%;
432
725
  }
433
726
 
434
- address {
435
- font-style: normal;
436
- margin-bottom: 10px;
437
- margin-bottom: 1rem;
438
- line-height: inherit;
727
+ :where([type='checkbox']) {
728
+ border-radius: var(--bf-spacing-md);
439
729
  }
440
730
 
441
- details > summary:first-of-type {
442
- display: list-item;
731
+ :where([type='radio'], [type='checkbox']) {
732
+ padding: 0;
733
+ background-color: var(--bf-white);
443
734
  }
444
735
 
445
- summary {
446
- cursor: pointer;
447
- font-weight: 700;
448
- word-break: break-all;
736
+ :where([type='range' i]) {
737
+ background-color: transparent;
449
738
  }
450
739
 
451
- dialog {
452
- background-color: #fff;
453
- color: #222;
454
- border: none;
455
- border-radius: 0.25rem;
456
- padding: 20px;
457
- padding: 2rem;
458
- height: -moz-fit-content;
459
- height: fit-content;
460
- min-width: 25rem;
461
- max-width: calc(100vw - 3rem);
462
- }
463
- @media (min-width: 768px) {
464
- dialog {
465
- max-width: 50rem;
466
- }
740
+ :where(select[size], select[multiple]) {
741
+ height: auto;
467
742
  }
468
743
 
469
- dialog[open] {
470
- display: block !important;
744
+ :where(select[multiple]) {
745
+ background-image: none;
471
746
  }
472
747
 
473
- dialog::backdrop {
474
- background: rgba(0, 0, 0, 0.4);
748
+ :where(textarea) {
749
+ height: auto;
750
+ min-height: 60px;
751
+ min-height: 6rem;
752
+ overflow: auto;
753
+ vertical-align: top;
754
+ resize: vertical;
475
755
  }
476
756
 
477
- @media (prefers-reduced-motion: no-preference) {
478
- :root {
479
- scroll-behavior: smooth;
480
- }
481
- }
482
- table {
483
- caption-side: bottom;
484
- max-width: 100%;
485
- border-collapse: collapse;
486
- border-color: currentcolor;
487
- text-indent: 0;
757
+ /* Firefox: strip inner focus padding/border. */
758
+ ::-moz-focus-inner {
759
+ padding: 0;
760
+ border-style: none;
488
761
  }
489
762
 
490
- thead,
491
- tbody,
492
- tfoot,
493
- tr,
494
- td,
495
- th {
496
- border-color: inherit;
497
- border-style: solid;
498
- border-width: 0;
763
+ :where(button, [type='button'], [type='reset'], [type='submit']) {
764
+ line-height: normal;
765
+ text-align: center;
766
+ margin: 0;
767
+ background-clip: padding-box;
768
+ vertical-align: baseline;
769
+ overflow: visible;
770
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
771
+ -webkit-user-select: none;
772
+ -moz-user-select: none;
773
+ user-select: none;
774
+ border: 0;
775
+ background-image: none; /* Firefox mobile */
499
776
  }
500
777
 
501
- thead th {
502
- vertical-align: bottom;
778
+ :where(button, [type='button'], [type='reset'], [type='submit']):hover,
779
+ :where(button, [type='button'], [type='reset'], [type='submit']):active,
780
+ :where(button, [type='button'], [type='reset'], [type='submit']):focus {
781
+ text-decoration: none;
782
+ color: var(--bf-dark);
503
783
  }
504
784
 
505
- th,
506
- td {
507
- vertical-align: top;
785
+ :where(
786
+ button:not(:disabled),
787
+ [type='button']:not(:disabled),
788
+ [type='reset']:not(:disabled),
789
+ [type='submit']:not(:disabled)
790
+ ) {
791
+ cursor: pointer;
508
792
  }
509
793
 
510
- th {
511
- text-align: inherit;
512
- text-align: -webkit-match-parent;
513
- font-weight: 700;
794
+ /* Firefox: input color must not override placeholder color.
795
+ * https://github.com/necolas/normalize.css/issues/150 */
796
+ :where(input::-moz-placeholder, textarea::-moz-placeholder) {
797
+ color: var(--bf-gray-dark);
514
798
  }
515
-
516
- caption {
517
- padding-top: 0.5rem;
518
- padding-bottom: 0.5rem;
519
- color: #999;
520
- text-align: left;
521
- caption-side: bottom;
522
- line-height: 1.375;
523
- font-size: 90%;
799
+ :where(input::placeholder, textarea::placeholder) {
800
+ color: var(--bf-gray-dark);
524
801
  }
525
802
 
526
- /* Accessibility
527
- * ========================================================================== */
528
- /**
529
- * Change the cursor on busy elements in all browsers (opinionated).
530
- */
531
- :where([aria-busy=true i]) {
532
- cursor: progress;
803
+ /* Firefox: modern focus ring on all focusable elements. */
804
+ :-moz-focusring {
805
+ outline: auto;
533
806
  }
534
807
 
535
- /*
536
- * Change the cursor on disabled, not-editable, or otherwise
537
- * inoperable elements in all browsers (opinionated).
538
- */
539
- :where([aria-disabled=true i], [disabled]) {
540
- cursor: not-allowed;
808
+ /* Firefox: drop :-moz-ui-invalid glow; use .bf-invalid for JS validation.
809
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/:-moz-ui-invalid */
810
+ :-moz-ui-invalid {
811
+ box-shadow: none;
541
812
  }
542
-
543
- /*
544
- * Change the display on visually hidden accessible elements
545
- * in all browsers (opinionated).
546
- */
547
- :where([aria-hidden=false i][hidden]) {
548
- display: initial;
813
+ /* Form field and button chrome (borders, focus, disabled). */
814
+
815
+ :where(
816
+ [type='email'],
817
+ [type='number'],
818
+ [type='password'],
819
+ [type='tel'],
820
+ [type='search'],
821
+ [type='text'],
822
+ [type='date'],
823
+ [type='datetime-local'],
824
+ [type='month'],
825
+ [type='week'],
826
+ [type='time'],
827
+ [type='url'],
828
+ input[list],
829
+ select,
830
+ textarea
831
+ ) {
832
+ background-color: var(--bf-white);
833
+ border: 1px solid var(--bf-gray);
834
+ padding: var(--bf-spacing-md) calc(var(--bf-spacing-lg) * 0.75);
835
+ }
836
+
837
+ :where(
838
+ [type='email'],
839
+ [type='number'],
840
+ [type='password'],
841
+ [type='tel'],
842
+ [type='search'],
843
+ [type='text'],
844
+ [type='date'],
845
+ [type='datetime-local'],
846
+ [type='month'],
847
+ [type='week'],
848
+ [type='time'],
849
+ [type='url'],
850
+ input[list],
851
+ select,
852
+ textarea,
853
+ [type='radio'],
854
+ [type='checkbox']
855
+ ):active,
856
+ :where(
857
+ [type='email'],
858
+ [type='number'],
859
+ [type='password'],
860
+ [type='tel'],
861
+ [type='search'],
862
+ [type='text'],
863
+ [type='date'],
864
+ [type='datetime-local'],
865
+ [type='month'],
866
+ [type='week'],
867
+ [type='time'],
868
+ [type='url'],
869
+ input[list],
870
+ select,
871
+ textarea,
872
+ [type='radio'],
873
+ [type='checkbox']
874
+ ):focus {
875
+ transition:
876
+ border 0.2s,
877
+ background-color 0.2s,
878
+ box-shadow 0.2s;
879
+ border-color: var(--bf-blue);
880
+ box-shadow: 0 0 0 3px rgb(0 86 179 / 25%);
881
+ }
882
+
883
+ :where(button, [type='button'], [type='reset'], [type='submit']) {
884
+ color: var(--bf-dark);
885
+ padding: calc(var(--bf-spacing-xl) / 3) calc(calc(var(--bf-spacing-xl) / 3) * 2);
886
+ background: var(--bf-gray-light);
887
+ transition:
888
+ color 0.2s,
889
+ background 0.2s,
890
+ box-shadow 0.2s;
891
+ }
892
+
893
+ :where(button, [type='button'], [type='reset'], [type='submit']):hover,
894
+ :where(button, [type='button'], [type='reset'], [type='submit']):active,
895
+ :where(button, [type='button'], [type='reset'], [type='submit']):focus:not(.bf-disabled):not(
896
+ [aria-disabled='true']
897
+ ) {
898
+ text-decoration: none;
899
+ color: var(--bf-dark);
900
+ background: rgb(184 184 184); /* --bf-gray-light, ~10% darker */
901
+ }
902
+
903
+ :where(button, [type='button'], [type='reset'], [type='submit']):active,
904
+ :where(button, [type='button'], [type='reset'], [type='submit']):focus:not(.bf-disabled):not(
905
+ [aria-disabled='true']
906
+ ) {
907
+ box-shadow: 0 0 0 3px rgb(0 0 0 / 15%);
908
+ }
909
+
910
+ /* Disabled / aria-disabled / fieldset[disabled]. */
911
+ :where(
912
+ fieldset[disabled] button,
913
+ fieldset[disabled] input,
914
+ fieldset[disabled] input::after,
915
+ fieldset[disabled] input::before,
916
+ fieldset[disabled] input:checked,
917
+ fieldset[disabled] select,
918
+ fieldset[disabled] textarea,
919
+ fieldset[disabled] label,
920
+ button[disabled],
921
+ input[disabled],
922
+ input[disabled]::after,
923
+ input[disabled]::before,
924
+ input[disabled]:checked,
925
+ select[disabled],
926
+ textarea[disabled],
927
+ label[disabled],
928
+ button:disabled,
929
+ input:disabled,
930
+ input:disabled::after,
931
+ input:disabled::before,
932
+ input:disabled:checked,
933
+ select:disabled,
934
+ textarea:disabled,
935
+ label:disabled,
936
+ button[aria-disabled='true'],
937
+ input[aria-disabled='true'],
938
+ input[aria-disabled='true']::after,
939
+ input[aria-disabled='true']::before,
940
+ input[aria-disabled='true']:checked,
941
+ select[aria-disabled='true'],
942
+ textarea[aria-disabled='true'],
943
+ label[aria-disabled='true']
944
+ ) {
945
+ cursor: default !important;
946
+ cursor: not-allowed !important;
947
+ pointer-events: none !important;
948
+ -webkit-user-select: none !important;
949
+ -moz-user-select: none !important;
950
+ user-select: none !important;
951
+ box-shadow: none !important;
952
+ outline: none !important;
953
+ opacity: 0.5 !important;
549
954
  }
955
+ /* Select: custom arrow for single-value controls.
956
+ * Skip [size] / [multiple] (native UI differs by engine). Inspired by water.css. */
550
957
 
551
- :where([aria-hidden=false i][hidden]:not(:focus)) {
552
- clip: rect(0, 0, 0, 0);
553
- position: absolute;
958
+ :where(select):not([size], select[multiple]) {
959
+ -webkit-appearance: none;
960
+ -moz-appearance: none;
961
+ appearance: none;
962
+ background: var(--bf-white)
963
+ url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
964
+ no-repeat right 0.85rem center/8px 10px;
965
+ padding-right: calc(var(--bf-spacing-lg) + var(--bf-spacing-lg));
554
966
  }
555
967
 
556
- :where(html input, button, select, optgroup, textarea) {
557
- color: inherit;
558
- font-family: inherit;
559
- font-size: inherit;
560
- line-height: inherit;
968
+ /* RTL: mirror arrow after appearance:none removes the native control. */
969
+ :where(*[dir='rtl']) :where(select):not([size], select[multiple]),
970
+ :where(select[dir='rtl']):not([size], select[multiple]) {
971
+ background-position: left 0.85rem top 50%;
972
+ padding-right: calc(var(--bf-spacing-lg) * 0.75);
973
+ padding-left: calc(var(--bf-spacing-lg) + var(--bf-spacing-lg));
974
+ }
975
+ /* Range: custom thumb/track when appearance:none is supported.
976
+ * CodePen: https://codepen.io/marcop135/pen/JjGrNMx */
977
+
978
+ @supports ((-webkit-appearance: none) or (-moz-appearance: none) or (appearance: none)) {
979
+ :where([type='range']) {
980
+ -webkit-appearance: none;
981
+ -moz-appearance: none;
982
+ appearance: none;
983
+ width: 100%;
984
+ height: 1.4rem;
985
+ }
986
+
987
+ :where([type='range'])::-webkit-slider-thumb {
988
+ border: 0;
989
+ -webkit-appearance: none;
990
+ appearance: none;
991
+
992
+ width: 1.5rem;
993
+ height: 1.5rem;
994
+ margin-top: -0.25rem;
995
+ background-color: var(--bf-blue);
996
+ border-radius: 1.5rem;
997
+ -webkit-transition:
998
+ background-color 0.15s ease-in-out,
999
+ border-color 0.15s ease-in-out,
1000
+ box-shadow 0.15s ease-in-out;
1001
+ transition:
1002
+ background-color 0.15s ease-in-out,
1003
+ border-color 0.15s ease-in-out,
1004
+ box-shadow 0.15s ease-in-out;
1005
+ }
1006
+
1007
+ :where([type='range'])::-webkit-slider-thumb:active {
1008
+ background-color: var(--bf-blue);
1009
+ }
1010
+
1011
+ :where([type='range'])::-moz-range-thumb {
1012
+ border: 0;
1013
+ -moz-appearance: none;
1014
+ appearance: none;
1015
+
1016
+ width: 1.5rem;
1017
+ height: 1.5rem;
1018
+ background-color: var(--bf-blue);
1019
+ border-radius: 1.5rem;
1020
+ -moz-transition:
1021
+ background-color 0.15s ease-in-out,
1022
+ border-color 0.15s ease-in-out,
1023
+ box-shadow 0.15s ease-in-out;
1024
+ transition:
1025
+ background-color 0.15s ease-in-out,
1026
+ border-color 0.15s ease-in-out,
1027
+ box-shadow 0.15s ease-in-out;
1028
+ }
1029
+
1030
+ :where([type='range'])::-moz-range-thumb:active {
1031
+ background-color: var(--bf-blue);
1032
+ }
1033
+
1034
+ :where([type='range'])::-webkit-slider-runnable-track {
1035
+ color: transparent;
1036
+ border-color: transparent;
1037
+
1038
+ width: 100%;
1039
+ height: 0.65rem;
1040
+ cursor: pointer;
1041
+ background-color: var(--bf-gray-light-extra);
1042
+ }
1043
+
1044
+ :where([type='range'])::-moz-range-track {
1045
+ color: transparent;
1046
+ border-color: transparent;
1047
+
1048
+ width: 100%;
1049
+ height: 0.65rem;
1050
+ cursor: pointer;
1051
+ background-color: var(--bf-gray-light-extra);
1052
+ }
1053
+
1054
+ :where([type='range']):focus {
1055
+ outline: none;
1056
+ }
1057
+
1058
+ :where([type='range']):focus::-webkit-slider-thumb {
1059
+ box-shadow:
1060
+ 0 0 0 0.1rem var(--bf-white),
1061
+ 0 0 0 0.2rem rgb(0 123 255 / 25%);
1062
+ }
1063
+
1064
+ :where([type='range']):focus::-moz-range-thumb {
1065
+ box-shadow:
1066
+ 0 0 0 0.1rem var(--bf-white),
1067
+ 0 0 0 0.2rem rgb(0 123 255 / 25%);
1068
+ }
1069
+
1070
+ :where([type='range'])::-moz-focus-outer {
1071
+ border: 0;
1072
+ }
1073
+
1074
+ :where([type='range']):disabled {
1075
+ pointer-events: none;
1076
+ }
1077
+
1078
+ :where([type='range']):disabled::-webkit-slider-thumb {
1079
+ background-color: var(--bf-gray-light);
1080
+ }
1081
+
1082
+ :where([type='range']):disabled::-moz-range-thumb {
1083
+ background-color: var(--bf-gray-light);
1084
+ }
561
1085
  }
562
1086
 
563
- :where(html input,
564
- button,
565
- [type=radio],
566
- [type=checkbox],
567
- select,
568
- optgroup,
569
- textarea) {
570
- margin: 0;
1087
+ /* Miscellaneous */
1088
+ /* Link defaults. --bf-blue meets WCAG AA 4.5:1 on white. */
1089
+
1090
+ a {
1091
+ color: var(--bf-blue);
1092
+ text-decoration: none;
1093
+ background-color: transparent; /* Legacy Edge active background. */
571
1094
  }
572
1095
 
573
- :where(html input, select, textarea, legend) {
574
- width: 100%;
1096
+ a:hover,
1097
+ a:focus {
1098
+ text-decoration: underline;
1099
+ color: var(--bf-blue-light);
575
1100
  }
576
1101
 
577
- :where(html label,
578
- button,
579
- [type=image],
580
- [type=submit],
581
- [type=reset],
582
- html [type=button],
583
- [type=radio],
584
- [type=checkbox]) {
585
- width: auto;
1102
+ /* Non-href anchors inherit text (Bootstrap reboot pattern). */
1103
+ a:not([href], [tabindex]) {
1104
+ color: inherit;
1105
+ text-decoration: none;
586
1106
  }
587
1107
 
588
- :where(html input,
589
- label,
590
- select,
591
- textarea,
592
- button,
593
- html [type=button],
594
- [type=reset],
595
- [type=submit],
596
- output) {
597
- display: inline-block;
1108
+ a:not([href], [class]),
1109
+ a:not([href], [class]):hover {
1110
+ color: inherit;
1111
+ text-decoration: none;
598
1112
  }
599
1113
 
600
- :where([type=file]) {
601
- display: block;
602
- background-color: transparent;
1114
+ a:not([href], [tabindex]):focus {
1115
+ outline: 0;
603
1116
  }
1117
+ /* Keyboard-first focus: orange :focus-visible ring; mute mouse outline.
1118
+ * Text-like controls clear UA outline here; field chrome is in forms/styling.css. */
604
1119
 
605
- :where(button, html input, select, textarea) {
606
- background-image: none;
1120
+ :where(:focus:not(:focus-visible)) {
1121
+ outline: none;
607
1122
  }
608
1123
 
609
- :where(input, select, textarea) {
610
- vertical-align: baseline;
1124
+ /* tabindex="-1" targets should not show a ring on programmatic focus. */
1125
+ :where([tabindex='-1']:focus:not(:focus-visible)) {
1126
+ outline: 0 !important;
611
1127
  }
612
1128
 
613
- :where(form) {
614
- margin: 0;
1129
+ :focus-visible {
1130
+ outline: 0.2rem solid var(--bf-orange);
1131
+ outline-offset: 0.3rem;
1132
+ }
1133
+
1134
+ /* Clear UA outline on text-like controls (styled fields keep their own chrome).
1135
+ * Leave color / range / file alone; they often use custom widgets. */
1136
+ button:focus,
1137
+ [type='button']:focus,
1138
+ [type='reset']:focus,
1139
+ [type='submit']:focus,
1140
+ [type='email']:focus,
1141
+ [type='number']:focus,
1142
+ [type='password']:focus,
1143
+ [type='tel']:focus,
1144
+ [type='search']:focus,
1145
+ [type='text']:focus,
1146
+ [type='date']:focus,
1147
+ [type='datetime-local']:focus,
1148
+ [type='month']:focus,
1149
+ [type='time']:focus,
1150
+ [type='week']:focus,
1151
+ [type='url']:focus,
1152
+ [type='radio']:focus,
1153
+ [type='checkbox']:focus,
1154
+ input[list]:focus,
1155
+ select:focus,
1156
+ textarea:focus,
1157
+ .bf-btn:focus {
1158
+ outline: 0;
615
1159
  }
1160
+ /* List spacing and nav list reset. */
616
1161
 
617
- :where(fieldset) {
618
- border: 0;
1162
+ menu,
1163
+ ol,
1164
+ ul,
1165
+ dl {
1166
+ margin: 0 0 var(--bf-spacing-xl) 0;
619
1167
  padding: 0;
620
- margin: 0;
621
- min-width: 0;
622
1168
  }
623
1169
 
624
- :where(legend) {
625
- display: table;
626
- max-width: 100%;
627
- white-space: normal;
628
- border: 0;
629
- padding: 0;
630
- font-weight: 400;
631
- margin-bottom: 5px;
632
- margin-bottom: 0.5rem;
633
- font-size: inherit;
634
- line-height: 1.375;
635
- color: inherit;
1170
+ menu ul,
1171
+ menu ol,
1172
+ ul ul,
1173
+ ul ol,
1174
+ ol ol,
1175
+ ol ul,
1176
+ dd {
1177
+ margin-bottom: 0;
636
1178
  }
637
1179
 
638
- :where(label) {
639
- font-weight: 400;
640
- font-size: 90%;
641
- line-height: 1.375;
642
- margin-bottom: 5px;
643
- margin-bottom: 0.5rem;
1180
+ ul,
1181
+ ol {
1182
+ margin-left: var(--bf-spacing-xl);
644
1183
  }
645
1184
 
646
- :where(label input, label select, label textarea) {
647
- font-size: 110%;
1185
+ nav ol,
1186
+ nav ul {
1187
+ list-style: none;
1188
+ list-style-image: none;
1189
+ margin-left: 0;
648
1190
  }
649
1191
 
650
- ::-webkit-inner-spin-button {
651
- height: auto;
1192
+ dt {
1193
+ font-weight: 700;
652
1194
  }
653
1195
 
654
- ::-webkit-datetime-edit-fields-wrapper,
655
- ::-webkit-datetime-edit-text,
656
- ::-webkit-datetime-edit-minute,
657
- ::-webkit-datetime-edit-hour-field,
658
- ::-webkit-datetime-edit-day-field,
659
- ::-webkit-datetime-edit-month-field,
660
- ::-webkit-datetime-edit-year-field {
661
- padding: 0;
1196
+ dd {
1197
+ margin-left: 0;
662
1198
  }
663
1199
 
664
- ::-webkit-color-swatch-wrapper {
665
- padding: 0;
1200
+ /* VoiceOver: zero-width space so list-style:none lists stay announced. */
1201
+ nav li::before {
1202
+ content: '\200B';
1203
+ position: absolute;
666
1204
  }
1205
+ /* Media elements, figures, progress/meter, and iframes. */
667
1206
 
668
- :where([type=search]) {
669
- outline-offset: -0.25rem;
1207
+ audio,
1208
+ canvas,
1209
+ progress,
1210
+ video {
1211
+ display: inline-block;
670
1212
  }
671
1213
 
672
- :where(output) {
673
- vertical-align: middle;
1214
+ img,
1215
+ canvas,
1216
+ audio,
1217
+ video,
1218
+ iframe,
1219
+ object,
1220
+ embed {
1221
+ max-width: 100%;
674
1222
  }
675
1223
 
676
- :where(button, select) {
677
- text-transform: none;
1224
+ audio,
1225
+ video,
1226
+ canvas,
1227
+ img,
1228
+ svg {
1229
+ vertical-align: middle;
678
1230
  }
679
1231
 
680
- :where(select) {
681
- word-wrap: normal;
1232
+ img {
1233
+ height: auto;
1234
+ border-style: none;
682
1235
  }
683
1236
 
684
- :where([list]):not([type=date],
685
- [type=datetime-local],
686
- [type=month],
687
- [type=week],
688
- [type=time])::-webkit-calendar-picker-indicator {
689
- display: none !important;
1237
+ figure {
1238
+ margin: 0;
690
1239
  }
691
1240
 
692
- :where(optgroup) {
693
- font-family: inherit;
694
- font-size: inherit;
695
- font-style: inherit;
696
- font-weight: 600;
1241
+ figure,
1242
+ figcaption {
1243
+ display: block;
697
1244
  }
698
1245
 
699
- :where(button,
700
- html [type=button],
701
- [type=reset],
702
- [type=submit],
703
- [type=email],
704
- [type=number],
705
- [type=text],
706
- [type=tel],
707
- [type=date],
708
- [type=datetime-local],
709
- [type=month],
710
- [type=week],
711
- [type=url],
712
- [type=image],
713
- [type=password],
714
- [type=search],
715
- [type=search]::-webkit-search-decoration,
716
- [type=search]::-webkit-search-cancel-button,
717
- input[list],
718
- textarea) {
719
- -webkit-appearance: none;
720
- appearance: none;
1246
+ figcaption {
1247
+ line-height: 1.375;
1248
+ font-size: 90%;
721
1249
  }
722
1250
 
723
- ::file-selector-button {
724
- font: inherit;
725
- -webkit-appearance: auto;
726
- -moz-appearance: auto;
727
- appearance: auto;
1251
+ video {
1252
+ height: auto;
728
1253
  }
729
1254
 
730
- :where(button, input, select, textarea) {
731
- border-radius: 0.25rem;
1255
+ audio {
1256
+ width: 100%;
732
1257
  }
733
1258
 
734
- :where([type=radio]) {
735
- border-radius: 50%;
1259
+ audio:not([controls]) {
1260
+ display: none;
1261
+ height: 0;
736
1262
  }
737
1263
 
738
- :where([type=checkbox]) {
739
- border-radius: 0.5rem;
1264
+ svg:not(:root) {
1265
+ overflow: hidden;
740
1266
  }
741
1267
 
742
- :where([type=radio], [type=checkbox]) {
743
- padding: 0;
744
- background-color: #fff;
1268
+ svg:not([fill]) {
1269
+ fill: currentColor;
745
1270
  }
746
1271
 
747
- :where([type=range i]) {
748
- background-color: transparent;
1272
+ progress,
1273
+ meter {
1274
+ display: inline-block;
1275
+ vertical-align: baseline;
1276
+ width: 100%;
1277
+ max-width: 100%;
749
1278
  }
750
1279
 
751
- :where(select[size], select[multiple]) {
752
- height: auto;
1280
+ /* progress[value] reset (https://css-tricks.com/html5-progress-element/). */
1281
+ progress[value] {
1282
+ -webkit-appearance: none;
1283
+ -moz-appearance: none;
1284
+ appearance: none;
1285
+ border: none; /* Firefox default border. */
1286
+
1287
+ height: 20px;
1288
+ height: 2rem;
1289
+
1290
+ background: var(--bf-gray-light);
1291
+ color: var(--bf-blue); /* Progress fill in IE10+. */
753
1292
  }
754
1293
 
755
- :where(select[multiple]) {
756
- background-image: none;
1294
+ progress[value]::-webkit-progress-bar {
1295
+ background: var(--bf-gray-light);
757
1296
  }
758
1297
 
759
- :where(textarea) {
760
- height: auto;
761
- min-height: 60px;
762
- min-height: 6rem;
763
- overflow: auto;
764
- vertical-align: top;
765
- resize: vertical;
1298
+ progress[value]::-webkit-progress-value {
1299
+ background: var(--bf-blue);
766
1300
  }
767
1301
 
768
- ::-moz-focus-inner {
769
- padding: 0;
1302
+ /* No default border (covers embeds that ignore frameborder="0"). */
1303
+ iframe {
770
1304
  border-style: none;
771
1305
  }
1306
+ /* Address, details/summary, and dialog defaults. */
772
1307
 
773
- :where(button, [type=button], [type=reset], [type=submit]) {
774
- line-height: normal;
775
- text-align: center;
776
- margin: 0;
777
- background-clip: padding-box;
778
- vertical-align: baseline;
779
- overflow: visible;
780
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
781
- -webkit-user-select: none;
782
- -moz-user-select: none;
783
- user-select: none;
784
- border: 0;
785
- background-image: none;
1308
+ address {
1309
+ font-style: normal;
1310
+ margin-bottom: var(--bf-spacing-lg);
1311
+ line-height: inherit;
786
1312
  }
787
- :where(button, [type=button], [type=reset], [type=submit]):hover, :where(button, [type=button], [type=reset], [type=submit]):active, :where(button, [type=button], [type=reset], [type=submit]):focus {
788
- text-decoration: none;
789
- color: #222;
1313
+
1314
+ details > summary:first-of-type {
1315
+ display: list-item;
790
1316
  }
791
1317
 
792
- :where(button:not(:disabled),
793
- [type=button]:not(:disabled),
794
- [type=reset]:not(:disabled),
795
- [type=submit]:not(:disabled)) {
1318
+ summary {
796
1319
  cursor: pointer;
1320
+ font-weight: 700;
1321
+ word-break: break-all;
797
1322
  }
798
1323
 
799
- :where(input::-moz-placeholder, textarea::-moz-placeholder) {
800
- color: #666;
1324
+ dialog {
1325
+ background-color: var(--bf-white);
1326
+ color: var(--bf-dark);
1327
+ border: none;
1328
+ border-radius: var(--bf-spacing-sm);
1329
+ padding: var(--bf-spacing-xl);
1330
+ height: -moz-fit-content;
1331
+ height: fit-content;
1332
+ min-width: min(25rem, 100%);
1333
+ max-width: calc(100vw - (var(--bf-spacing-grid-gutter) * 2));
801
1334
  }
802
1335
 
803
- :where(input::placeholder, textarea::placeholder) {
804
- color: #666;
1336
+ @media (min-width: 768px) {
1337
+ dialog {
1338
+ max-width: 50rem;
1339
+ }
805
1340
  }
806
1341
 
807
- /*
808
- Use the modern Firefox focus style for all focusable elements.
809
- */
810
- :-moz-focusring {
811
- outline: auto;
1342
+ /* Open dialog wins over [hidden] (e.g. <dialog hidden open>). */
1343
+ dialog[open] {
1344
+ display: block !important;
812
1345
  }
813
1346
 
814
- :-moz-ui-invalid {
815
- box-shadow: none;
1347
+ dialog::backdrop {
1348
+ background: rgb(0 0 0 / 40%);
816
1349
  }
1350
+ /* Smooth scrolling when motion is allowed. */
817
1351
 
818
- :where([type=email],
819
- [type=number],
820
- [type=password],
821
- [type=tel],
822
- [type=search],
823
- [type=text],
824
- [type=date],
825
- [type=datetime-local],
826
- [type=month],
827
- [type=week],
828
- [type=time],
829
- [type=url],
830
- input[list],
831
- select,
832
- textarea) {
833
- background-color: #fff;
834
- border: 1px solid #999;
835
- padding: 0.5rem 0.75rem;
836
- }
837
-
838
- :where([type=email],
839
- [type=number],
840
- [type=password],
841
- [type=tel],
842
- [type=search],
843
- [type=text],
844
- [type=date],
845
- [type=datetime-local],
846
- [type=month],
847
- [type=week],
848
- [type=time],
849
- [type=url],
850
- input[list],
851
- select,
852
- textarea,
853
- [type=radio],
854
- [type=checkbox]):active, :where([type=email],
855
- [type=number],
856
- [type=password],
857
- [type=tel],
858
- [type=search],
859
- [type=text],
860
- [type=date],
861
- [type=datetime-local],
862
- [type=month],
863
- [type=week],
864
- [type=time],
865
- [type=url],
866
- input[list],
867
- select,
868
- textarea,
869
- [type=radio],
870
- [type=checkbox]):focus {
871
- transition: border 0.2s, background-color 0.2s, box-shadow 0.2s;
872
- border-color: #007bff;
873
- box-shadow: 0 0 0 3px rgba(0, 86, 179, 0.25);
874
- }
875
-
876
- :where(button, [type=button], [type=reset], [type=submit]) {
877
- color: #222;
878
- padding: 0.6666666667rem 1.3333333333rem;
879
- background: #ccc;
880
- transition: color 0.2s, background 0.2s, box-shadow 0.2s;
881
- }
882
- :where(button, [type=button], [type=reset], [type=submit]):hover, :where(button, [type=button], [type=reset], [type=submit]):active, :where(button, [type=button], [type=reset], [type=submit]):focus {
883
- text-decoration: none;
884
- color: #222;
885
- background: rgb(178.5, 178.5, 178.5);
886
- }
887
- :where(button, [type=button], [type=reset], [type=submit]):active, :where(button, [type=button], [type=reset], [type=submit]):focus {
888
- box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.15);
889
- }
890
-
891
- :where(fieldset[disabled] button,
892
- fieldset[disabled] input,
893
- fieldset[disabled] input::after,
894
- fieldset[disabled] input::before,
895
- fieldset[disabled] input:checked,
896
- fieldset[disabled] select,
897
- fieldset[disabled] textarea,
898
- fieldset[disabled] label,
899
- button[disabled],
900
- input[disabled],
901
- input[disabled]::after,
902
- input[disabled]::before,
903
- input[disabled]:checked,
904
- select[disabled],
905
- textarea[disabled],
906
- label[disabled],
907
- button:disabled,
908
- input:disabled,
909
- input:disabled::after,
910
- input:disabled::before,
911
- input:disabled:checked,
912
- select:disabled,
913
- textarea:disabled,
914
- label:disabled,
915
- button[aria-disabled=true],
916
- input[aria-disabled=true],
917
- input[aria-disabled=true]::after,
918
- input[aria-disabled=true]::before,
919
- input[aria-disabled=true]:checked,
920
- select[aria-disabled=true],
921
- textarea[aria-disabled=true],
922
- label[aria-disabled=true]) {
923
- cursor: default !important;
924
- cursor: not-allowed !important;
925
- pointer-events: none !important;
926
- -webkit-user-select: none !important;
927
- -moz-user-select: none !important;
928
- user-select: none !important;
929
- box-shadow: none !important;
930
- opacity: 0.5 !important;
1352
+ @media (prefers-reduced-motion: no-preference) {
1353
+ :root {
1354
+ scroll-behavior: smooth;
1355
+ }
931
1356
  }
1357
+ /* Table border collapse and cell alignment. */
932
1358
 
933
- :where(select):not([size], select[multiple]) {
934
- -webkit-appearance: none;
935
- -moz-appearance: none;
936
- appearance: none;
937
- background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.85rem center/8px 10px;
938
- padding-right: 2rem;
1359
+ table {
1360
+ caption-side: bottom;
1361
+ max-width: 100%;
1362
+ border-collapse: collapse;
1363
+ border-color: currentcolor; /* Chrome / Safari inheritance. */
1364
+ text-indent: 0; /* Chrome / Safari table indent. */
939
1365
  }
940
1366
 
941
- :where(select)::-ms-expand {
942
- display: none;
1367
+ thead,
1368
+ tbody,
1369
+ tfoot,
1370
+ tr,
1371
+ td,
1372
+ th {
1373
+ border-color: inherit;
1374
+ border-style: solid;
1375
+ border-width: 0;
943
1376
  }
944
1377
 
945
- :where(*[dir=rtl]) :where(select):not([size], select[multiple]),
946
- :where(select[dir=rtl]):not([size], select[multiple]) {
947
- background-position: left 0.85rem top 50%;
948
- padding-right: 0.75rem;
949
- padding-left: 2rem;
1378
+ thead th {
1379
+ vertical-align: bottom;
950
1380
  }
951
1381
 
952
- :where([type=checkbox], [type=radio]) {
953
- -webkit-appearance: none;
954
- -moz-appearance: none;
955
- appearance: none;
956
- height: 1.8rem;
957
- width: 1.8rem;
958
- vertical-align: top;
959
- position: relative;
960
- border: 1px solid/#999;
961
- }
962
- :where([type=checkbox], [type=radio]) + label {
963
- line-height: 1.8rem;
1382
+ th,
1383
+ td {
964
1384
  vertical-align: top;
965
- margin-left: 5px;
966
- margin-left: 0.5rem;
967
- }
968
- *[dir=rtl] :where([type=checkbox], [type=radio]) + label, :where([type=checkbox], [type=radio])[dir=rtl] + label {
969
- margin-left: 0;
970
- margin-right: 5px;
971
- margin-right: 0.5rem;
972
- }
973
- :where([type=checkbox], [type=radio])::after {
974
- content: "";
975
- display: block;
976
- position: absolute;
977
- }
978
- :where([type=checkbox], [type=radio]):checked {
979
- background-color: #007bff;
980
- border-color: #000;
981
1385
  }
982
1386
 
983
- :where([type=radio])::after {
984
- width: 1.8rem;
985
- height: 1.8rem;
986
- left: -0.05rem;
987
- top: -0.05rem;
988
- border-radius: 50%;
989
- background: #fff;
990
- transform: scale(0.35);
1387
+ th {
1388
+ text-align: inherit;
1389
+ text-align: -webkit-match-parent;
1390
+ font-weight: 700;
991
1391
  }
992
1392
 
993
- :where([type=checkbox])::after {
994
- width: 0.6rem;
995
- height: 0.8rem;
996
- border: 2px solid/#fff;
997
- border-top: 0;
998
- border-left: 0;
999
- left: 35%;
1000
- top: 20%;
1001
- transform: rotate(43deg);
1393
+ caption {
1394
+ padding-top: var(--bf-spacing-md);
1395
+ padding-bottom: var(--bf-spacing-md);
1396
+ color: var(--bf-gray);
1397
+ text-align: left;
1398
+ caption-side: bottom;
1399
+ line-height: 1.375;
1400
+ font-size: 90%;
1002
1401
  }
1402
+ /* Accessibility helpers (adapted from sanitize.css). */
1003
1403
 
1004
- :where([type=range]) {
1005
- -webkit-appearance: none;
1006
- -moz-appearance: none;
1007
- appearance: none;
1008
- width: 100%;
1009
- height: 1.4rem;
1404
+ /* Busy: progress cursor. */
1405
+ :where([aria-busy='true' i]) {
1406
+ cursor: progress;
1010
1407
  }
1011
1408
 
1012
- :where([type=range])::-webkit-slider-thumb {
1013
- border: 0;
1014
- -webkit-appearance: none;
1015
- appearance: none;
1016
- width: 1.5rem;
1017
- height: 1.5rem;
1018
- margin-top: -0.25rem;
1019
- background-color: #007bff;
1020
- border-radius: 1.5rem;
1021
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1022
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1023
- }
1024
- :where([type=range])::-webkit-slider-thumb:active {
1025
- background-color: #007bff;
1409
+ /* Disabled / inoperable: not-allowed cursor. */
1410
+ :where([aria-disabled='true' i], [disabled]) {
1411
+ cursor: not-allowed;
1026
1412
  }
1027
1413
 
1028
- :where([type=range])::-moz-range-thumb {
1029
- border: 0;
1030
- -moz-appearance: none;
1031
- appearance: none;
1032
- width: 1.5rem;
1033
- height: 1.5rem;
1034
- background-color: #007bff;
1035
- border-radius: 1.5rem;
1036
- -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1037
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
1038
- }
1039
- :where([type=range])::-moz-range-thumb:active {
1040
- background-color: #007bff;
1041
- }
1042
-
1043
- :where([type=range])::-webkit-slider-runnable-track {
1044
- color: transparent;
1045
- border-color: transparent;
1046
- width: 100%;
1047
- height: 0.65rem;
1048
- cursor: pointer;
1049
- background-color: #e9e9e9;
1414
+ /* aria-hidden="false" on [hidden]: keep in a11y tree when not focused. */
1415
+ :where([aria-hidden='false' i][hidden]) {
1416
+ display: initial;
1050
1417
  }
1051
1418
 
1052
- :where([type=range])::-moz-range-track {
1053
- color: transparent;
1054
- border-color: transparent;
1055
- width: 100%;
1056
- height: 0.65rem;
1057
- cursor: pointer;
1058
- background-color: #e9e9e9;
1419
+ :where([aria-hidden='false' i][hidden]:not(:focus)) {
1420
+ clip: rect(0, 0, 0, 0);
1421
+ position: absolute;
1059
1422
  }
1423
+ /* Preference queries only (prefers-contrast, forced-colors). Additive. */
1060
1424
 
1061
- :where([type=range]):focus {
1062
- outline: none;
1063
- }
1064
- :where([type=range]):focus::-webkit-slider-thumb {
1065
- box-shadow: 0 0 0 0.1rem/#fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
1066
- }
1067
- :where([type=range]):focus::-moz-slider-thumb {
1068
- box-shadow: 0 0 0 0.1rem/#fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
1069
- }
1425
+ /* prefers-contrast: more: underline links, thicker focus, stronger borders (WCAG 1.4.1). */
1426
+ @media (prefers-contrast: more) {
1427
+ a {
1428
+ text-decoration: underline;
1429
+ }
1070
1430
 
1071
- :where([type=range])::-moz-focus-outer {
1072
- border: 0;
1073
- }
1431
+ :focus-visible {
1432
+ outline-width: 0.3rem;
1433
+ outline-offset: 0.4rem;
1434
+ }
1074
1435
 
1075
- :where([type=range]):focus::-moz-range-thumb {
1076
- box-shadow: 0 0 0 0.1rem/#fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
1436
+ [type='email'],
1437
+ [type='number'],
1438
+ [type='password'],
1439
+ [type='tel'],
1440
+ [type='search'],
1441
+ [type='text'],
1442
+ [type='date'],
1443
+ [type='datetime-local'],
1444
+ [type='month'],
1445
+ [type='time'],
1446
+ [type='url'],
1447
+ [type='week'],
1448
+ input[list],
1449
+ select,
1450
+ textarea {
1451
+ border-width: 2px;
1452
+ }
1077
1453
  }
1078
1454
 
1079
- :where([type=range]):disabled {
1080
- pointer-events: none;
1081
- }
1082
- :where([type=range]):disabled::-webkit-slider-thumb {
1083
- background-color: #ccc;
1084
- }
1085
- :where([type=range]):disabled::-moz-slider-thumb {
1086
- background-color: #ccc;
1455
+ /* forced-colors: restore focus via Highlight; underline links; keep button borders. */
1456
+ @media (forced-colors: active) {
1457
+ :focus-visible {
1458
+ outline-color: Highlight;
1459
+ }
1460
+
1461
+ a {
1462
+ text-decoration: underline;
1463
+ }
1464
+
1465
+ /* Keep button borders so disabled/active stay distinguishable. */
1466
+ button,
1467
+ [type='button'],
1468
+ [type='reset'],
1469
+ [type='submit'],
1470
+ .bf-btn {
1471
+ border: 1px solid ButtonText;
1472
+ }
1087
1473
  }
1088
- /*# sourceMappingURL=bullframe-classless.css.map */