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