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