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