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
+ /* Classless + system dark via prefers-color-scheme (element styles only). */
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,500 +468,227 @@ 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] {
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;
670
- }
671
-
672
- :where(output) {
673
- vertical-align: middle;
674
- }
675
-
676
- :where(button, select) {
677
- text-transform: none;
678
- }
679
-
680
- :where(select) {
681
- word-wrap: normal;
682
- }
683
-
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;
690
- }
691
-
692
- :where(optgroup) {
693
- font-family: inherit;
694
- font-size: inherit;
695
- font-style: inherit;
696
- font-weight: 600;
697
- }
698
-
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) {
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
+ ) {
719
692
  -webkit-appearance: none;
720
693
  appearance: none;
721
694
  }
@@ -728,23 +701,23 @@ textarea) {
728
701
  }
729
702
 
730
703
  :where(button, input, select, textarea) {
731
- border-radius: 0.25rem;
704
+ border-radius: var(--bf-spacing-sm);
732
705
  }
733
706
 
734
- :where([type=radio]) {
707
+ :where([type='radio']) {
735
708
  border-radius: 50%;
736
709
  }
737
710
 
738
- :where([type=checkbox]) {
739
- border-radius: 0.5rem;
711
+ :where([type='checkbox']) {
712
+ border-radius: var(--bf-spacing-md);
740
713
  }
741
714
 
742
- :where([type=radio], [type=checkbox]) {
715
+ :where([type='radio'], [type='checkbox']) {
743
716
  padding: 0;
744
- background-color: #fff;
717
+ background-color: var(--bf-white);
745
718
  }
746
719
 
747
- :where([type=range i]) {
720
+ :where([type='range' i]) {
748
721
  background-color: transparent;
749
722
  }
750
723
 
@@ -765,161 +738,194 @@ textarea) {
765
738
  resize: vertical;
766
739
  }
767
740
 
741
+ /* Firefox: strip inner focus padding/border. */
768
742
  ::-moz-focus-inner {
769
743
  padding: 0;
770
744
  border-style: none;
771
745
  }
772
746
 
773
- :where(button, [type=button], [type=reset], [type=submit]) {
747
+ :where(button, [type='button'], [type='reset'], [type='submit']) {
774
748
  line-height: normal;
775
749
  text-align: center;
776
750
  margin: 0;
777
751
  background-clip: padding-box;
778
752
  vertical-align: baseline;
779
753
  overflow: visible;
780
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
754
+ -webkit-tap-highlight-color: rgb(0 0 0 / 0%);
781
755
  -webkit-user-select: none;
782
756
  -moz-user-select: none;
783
757
  user-select: none;
784
758
  border: 0;
785
- background-image: none;
759
+ background-image: none; /* Firefox mobile */
786
760
  }
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 {
761
+
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 {
788
765
  text-decoration: none;
789
- color: #222;
766
+ color: var(--bf-dark);
790
767
  }
791
768
 
792
- :where(button:not(:disabled),
793
- [type=button]:not(:disabled),
794
- [type=reset]:not(:disabled),
795
- [type=submit]:not(:disabled)) {
769
+ :where(
770
+ button:not(:disabled),
771
+ [type='button']:not(:disabled),
772
+ [type='reset']:not(:disabled),
773
+ [type='submit']:not(:disabled)
774
+ ) {
796
775
  cursor: pointer;
797
776
  }
798
777
 
778
+ /* Firefox: input color must not override placeholder color.
779
+ * https://github.com/necolas/normalize.css/issues/150 */
799
780
  :where(input::-moz-placeholder, textarea::-moz-placeholder) {
800
- color: #666;
781
+ color: var(--bf-gray-dark);
801
782
  }
802
-
803
783
  :where(input::placeholder, textarea::placeholder) {
804
- color: #666;
784
+ color: var(--bf-gray-dark);
805
785
  }
806
786
 
807
- /*
808
- Use the modern Firefox focus style for all focusable elements.
809
- */
787
+ /* Firefox: modern focus ring on all focusable elements. */
810
788
  :-moz-focusring {
811
789
  outline: auto;
812
790
  }
813
791
 
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 */
814
794
  :-moz-ui-invalid {
815
795
  box-shadow: none;
816
796
  }
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 {
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
+ ) {
883
882
  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]) {
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
+ ) {
923
929
  cursor: default !important;
924
930
  cursor: not-allowed !important;
925
931
  pointer-events: none !important;
@@ -927,354 +933,747 @@ label[aria-disabled=true]) {
927
933
  -moz-user-select: none !important;
928
934
  user-select: none !important;
929
935
  box-shadow: none !important;
936
+ outline: none !important;
930
937
  opacity: 0.5 !important;
931
938
  }
939
+ /* Select: custom arrow for single-value controls.
940
+ * Skip [size] / [multiple] (native UI differs by engine). Inspired by water.css. */
932
941
 
933
942
  :where(select):not([size], select[multiple]) {
934
943
  -webkit-appearance: none;
935
944
  -moz-appearance: none;
936
945
  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;
939
- }
940
-
941
- :where(select)::-ms-expand {
942
- display: 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));
943
950
  }
944
951
 
945
- :where(*[dir=rtl]) :where(select):not([size], select[multiple]),
946
- :where(select[dir=rtl]):not([size], select[multiple]) {
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]) {
947
955
  background-position: left 0.85rem top 50%;
948
- padding-right: 0.75rem;
949
- padding-left: 2rem;
950
- }
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
+ }
951
970
 
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;
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);
1068
+ }
1069
+ }
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. */
1078
+ }
1079
+
1080
+ a:hover,
1081
+ a:focus {
1082
+ text-decoration: underline;
1083
+ color: var(--bf-blue-light);
1084
+ }
1085
+
1086
+ /* Non-href anchors inherit text (Bootstrap reboot pattern). */
1087
+ a:not([href], [tabindex]) {
1088
+ color: inherit;
1089
+ text-decoration: none;
1090
+ }
1091
+
1092
+ a:not([href], [class]),
1093
+ a:not([href], [class]):hover {
1094
+ color: inherit;
1095
+ text-decoration: none;
1096
+ }
1097
+
1098
+ a:not([href], [tabindex]):focus {
1099
+ outline: 0;
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. */
1103
+
1104
+ :where(:focus:not(:focus-visible)) {
1105
+ outline: none;
1106
+ }
1107
+
1108
+ /* tabindex="-1" targets should not show a ring on programmatic focus. */
1109
+ :where([tabindex='-1']:focus:not(:focus-visible)) {
1110
+ outline: 0 !important;
1111
+ }
1112
+
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;
1142
+ }
1143
+ /* List spacing and nav list reset. */
1144
+
1145
+ menu,
1146
+ ol,
1147
+ ul,
1148
+ dl {
1149
+ margin: 0 0 var(--bf-spacing-xl) 0;
1150
+ padding: 0;
1151
+ }
1152
+
1153
+ menu ul,
1154
+ menu ol,
1155
+ ul ul,
1156
+ ul ol,
1157
+ ol ol,
1158
+ ol ul,
1159
+ dd {
1160
+ margin-bottom: 0;
1161
+ }
1162
+
1163
+ ul,
1164
+ ol {
1165
+ margin-left: var(--bf-spacing-xl);
1166
+ }
1167
+
1168
+ nav ol,
1169
+ nav ul {
1170
+ list-style: none;
1171
+ margin-left: 0;
1172
+ }
1173
+
1174
+ dt {
1175
+ font-weight: 700;
1176
+ }
1177
+
1178
+ dd {
1179
+ margin-left: 0;
1180
+ }
1181
+
1182
+ /* VoiceOver: zero-width space so list-style:none lists stay announced. */
1183
+ nav li::before {
1184
+ content: '\200B';
976
1185
  position: absolute;
977
1186
  }
978
- :where([type=checkbox], [type=radio]):checked {
979
- background-color: #007bff;
980
- border-color: #000;
1187
+ /* Media elements, figures, progress/meter, and iframes. */
1188
+
1189
+ audio,
1190
+ canvas,
1191
+ progress,
1192
+ video {
1193
+ display: inline-block;
981
1194
  }
982
1195
 
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);
1196
+ img,
1197
+ canvas,
1198
+ audio,
1199
+ video,
1200
+ iframe,
1201
+ object,
1202
+ embed {
1203
+ max-width: 100%;
991
1204
  }
992
1205
 
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);
1206
+ audio,
1207
+ video,
1208
+ canvas,
1209
+ img,
1210
+ svg {
1211
+ vertical-align: middle;
1002
1212
  }
1003
1213
 
1004
- :where([type=range]) {
1005
- -webkit-appearance: none;
1006
- -moz-appearance: none;
1007
- appearance: none;
1008
- width: 100%;
1009
- height: 1.4rem;
1214
+ img {
1215
+ height: auto;
1216
+ border-style: none;
1010
1217
  }
1011
1218
 
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;
1219
+ figure {
1220
+ margin: 0;
1023
1221
  }
1024
- :where([type=range])::-webkit-slider-thumb:active {
1025
- background-color: #007bff;
1222
+
1223
+ figure,
1224
+ figcaption {
1225
+ display: block;
1026
1226
  }
1027
1227
 
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;
1228
+ figcaption {
1229
+ line-height: 1.375;
1230
+ font-size: 90%;
1038
1231
  }
1039
- :where([type=range])::-moz-range-thumb:active {
1040
- background-color: #007bff;
1232
+
1233
+ video {
1234
+ height: auto;
1041
1235
  }
1042
1236
 
1043
- :where([type=range])::-webkit-slider-runnable-track {
1044
- color: transparent;
1045
- border-color: transparent;
1237
+ audio {
1046
1238
  width: 100%;
1047
- height: 0.65rem;
1048
- cursor: pointer;
1049
- background-color: #e9e9e9;
1050
1239
  }
1051
1240
 
1052
- :where([type=range])::-moz-range-track {
1053
- color: transparent;
1054
- border-color: transparent;
1241
+ audio:not([controls]) {
1242
+ display: none;
1243
+ height: 0;
1244
+ }
1245
+
1246
+ svg:not(:root) {
1247
+ overflow: hidden;
1248
+ }
1249
+
1250
+ svg:not([fill]) {
1251
+ fill: currentColor;
1252
+ }
1253
+
1254
+ progress,
1255
+ meter {
1256
+ display: inline-block;
1257
+ vertical-align: baseline;
1055
1258
  width: 100%;
1056
- height: 0.65rem;
1057
- cursor: pointer;
1058
- background-color: #e9e9e9;
1259
+ max-width: 100%;
1059
1260
  }
1060
1261
 
1061
- :where([type=range]):focus {
1062
- outline: none;
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;
1271
+
1272
+ background: var(--bf-gray-light);
1273
+ color: var(--bf-blue); /* Progress fill in IE10+. */
1063
1274
  }
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);
1275
+
1276
+ progress[value]::-webkit-progress-bar {
1277
+ background: var(--bf-gray-light);
1066
1278
  }
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);
1279
+
1280
+ progress[value]::-webkit-progress-value {
1281
+ background: var(--bf-blue);
1069
1282
  }
1070
1283
 
1071
- :where([type=range])::-moz-focus-outer {
1072
- border: 0;
1284
+ /* No default border (covers embeds that ignore frameborder="0"). */
1285
+ iframe {
1286
+ border-style: none;
1073
1287
  }
1288
+ /* Address, details/summary, and dialog defaults. */
1074
1289
 
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);
1290
+ address {
1291
+ font-style: normal;
1292
+ margin-bottom: var(--bf-spacing-lg);
1293
+ line-height: inherit;
1077
1294
  }
1078
1295
 
1079
- :where([type=range]):disabled {
1080
- pointer-events: none;
1296
+ details > summary:first-of-type {
1297
+ display: list-item;
1081
1298
  }
1082
- :where([type=range]):disabled::-webkit-slider-thumb {
1083
- background-color: #ccc;
1299
+
1300
+ summary {
1301
+ cursor: pointer;
1302
+ font-weight: 700;
1303
+ word-break: break-all;
1084
1304
  }
1085
- :where([type=range]):disabled::-moz-slider-thumb {
1086
- background-color: #ccc;
1305
+
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));
1087
1316
  }
1088
1317
 
1089
- @media (prefers-color-scheme: dark) {
1090
- html {
1091
- color: #f0f0f0;
1318
+ @media (min-width: 768px) {
1319
+ dialog {
1320
+ max-width: 50rem;
1092
1321
  }
1093
- body {
1094
- background-color: rgb(36.125, 36.125, 36.125);
1322
+ }
1323
+
1324
+ /* Open dialog wins over [hidden] (e.g. <dialog hidden open>). */
1325
+ dialog[open] {
1326
+ display: block !important;
1327
+ }
1328
+
1329
+ dialog::backdrop {
1330
+ background: rgb(0 0 0 / 40%);
1331
+ }
1332
+ /* Smooth scrolling when motion is allowed. */
1333
+
1334
+ @media (prefers-reduced-motion: no-preference) {
1335
+ :root {
1336
+ scroll-behavior: smooth;
1095
1337
  }
1338
+ }
1339
+ /* Table border collapse and cell alignment. */
1340
+
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. */
1347
+ }
1348
+
1349
+ thead,
1350
+ tbody,
1351
+ tfoot,
1352
+ tr,
1353
+ td,
1354
+ th {
1355
+ border-color: inherit;
1356
+ border-style: solid;
1357
+ border-width: 0;
1358
+ }
1359
+
1360
+ thead th {
1361
+ vertical-align: bottom;
1362
+ }
1363
+
1364
+ th,
1365
+ td {
1366
+ vertical-align: top;
1367
+ }
1368
+
1369
+ th {
1370
+ text-align: inherit;
1371
+ text-align: -webkit-match-parent;
1372
+ font-weight: 700;
1373
+ }
1374
+
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%;
1383
+ }
1384
+ /* Accessibility helpers (adapted from sanitize.css). */
1385
+
1386
+ /* Busy: progress cursor. */
1387
+ :where([aria-busy='true' i]) {
1388
+ cursor: progress;
1389
+ }
1390
+
1391
+ /* Disabled / inoperable: not-allowed cursor. */
1392
+ :where([aria-disabled='true' i], [disabled]) {
1393
+ cursor: not-allowed;
1394
+ }
1395
+
1396
+ /* aria-hidden="false" on [hidden]: keep in a11y tree when not focused. */
1397
+ :where([aria-hidden='false' i][hidden]) {
1398
+ display: initial;
1399
+ }
1400
+
1401
+ :where([aria-hidden='false' i][hidden]:not(:focus)) {
1402
+ clip: rect(0, 0, 0, 0);
1403
+ position: absolute;
1404
+ }
1405
+ /* Preference queries only (prefers-contrast, forced-colors). Additive. */
1406
+
1407
+ /* prefers-contrast: more: underline links, thicker focus, stronger borders (WCAG 1.4.1). */
1408
+ @media (prefers-contrast: more) {
1096
1409
  a {
1097
- color: rgb(102, 175.8, 255);
1098
- }
1099
- a:hover, a:focus {
1100
- color: rgb(26, 136.0223463687, 255);
1410
+ text-decoration: underline;
1101
1411
  }
1102
- mark {
1103
- background-color: #cccc00;
1412
+
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);
1104
1417
  }
1105
- ins {
1106
- background-color: hsl(60, 100%, 125%);
1418
+
1419
+ :focus-visible {
1420
+ outline-width: 0.3rem;
1421
+ outline-offset: 0.4rem;
1107
1422
  }
1108
- [type=email],
1109
- [type=number],
1110
- [type=password],
1111
- [type=tel],
1112
- [type=search],
1113
- [type=text],
1114
- [type=date],
1115
- [type=datetime-local],
1116
- [type=month],
1117
- [type=week],
1118
- [type=time],
1119
- [type=url],
1120
- [type=range],
1423
+
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'],
1121
1436
  input[list],
1122
1437
  select,
1123
- select:not([size], select[multiple]),
1124
1438
  textarea {
1125
- background-color: #111;
1126
- border-color: #000;
1127
- color: #ccc;
1439
+ border-width: 2px;
1128
1440
  }
1129
- [type=email]:active, [type=email]:focus,
1130
- [type=number]:active,
1131
- [type=number]:focus,
1132
- [type=password]:active,
1133
- [type=password]:focus,
1134
- [type=tel]:active,
1135
- [type=tel]:focus,
1136
- [type=search]:active,
1137
- [type=search]:focus,
1138
- [type=text]:active,
1139
- [type=text]:focus,
1140
- [type=date]:active,
1141
- [type=date]:focus,
1142
- [type=datetime-local]:active,
1143
- [type=datetime-local]:focus,
1144
- [type=month]:active,
1145
- [type=month]:focus,
1146
- [type=week]:active,
1147
- [type=week]:focus,
1148
- [type=time]:active,
1149
- [type=time]:focus,
1150
- [type=url]:active,
1151
- [type=url]:focus,
1152
- [type=range]:active,
1153
- [type=range]:focus,
1154
- input[list]:active,
1155
- input[list]:focus,
1156
- select:active,
1157
- select:focus,
1158
- select:not([size], select[multiple]):active,
1159
- select:not([size], select[multiple]):focus,
1160
- textarea:active,
1161
- textarea:focus {
1162
- background-color: #111;
1163
- border-color: rgb(51, 149.4, 255);
1441
+ }
1442
+
1443
+ /* forced-colors: restore focus via Highlight; underline links; keep button borders. */
1444
+ @media (forced-colors: active) {
1445
+ :focus-visible {
1446
+ outline-color: Highlight;
1164
1447
  }
1165
- [type=email]:active, [type=email]:focus,
1166
- [type=number]:active,
1167
- [type=number]:focus,
1168
- [type=password]:active,
1169
- [type=password]:focus,
1170
- [type=tel]:active,
1171
- [type=tel]:focus,
1172
- [type=search]:active,
1173
- [type=search]:focus,
1174
- [type=text]:active,
1175
- [type=text]:focus,
1176
- [type=date]:active,
1177
- [type=date]:focus,
1178
- [type=datetime-local]:active,
1179
- [type=datetime-local]:focus,
1180
- [type=month]:active,
1181
- [type=month]:focus,
1182
- [type=week]:active,
1183
- [type=week]:focus,
1184
- [type=time]:active,
1185
- [type=time]:focus,
1186
- [type=url]:active,
1187
- [type=url]:focus,
1188
- input[list]:active,
1189
- input[list]:focus,
1190
- select:active,
1191
- select:focus,
1192
- select:not([size], select[multiple]):active,
1193
- select:not([size], select[multiple]):focus,
1194
- textarea:active,
1195
- textarea:focus {
1196
- box-shadow: 0 0 0 3px rgba(3, 102, 214, 0.5);
1448
+
1449
+ a {
1450
+ text-decoration: underline;
1197
1451
  }
1198
- select:not([size], select[multiple]) {
1199
- 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");
1452
+
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;
1200
1459
  }
1201
- /* stylelint-disable-next-line */
1202
1460
  }
1203
- @media screen and (prefers-color-scheme: dark) and (min-width: 0\0 ) and (min-resolution: 0.001dpcm) {
1204
- select:not([size], select[multiple]),
1205
- *[dir=rtl] select:not([size], select[multiple]),
1206
- select[dir=rtl]:not([size], select[multiple]) {
1207
- background-image: none;
1208
- }
1461
+ @media (prefers-color-scheme: dark) {
1462
+
1463
+ /* Always-dark overrides for classless (no media query, no .bf-* selectors). */
1209
1464
  }
1210
1465
  @media (prefers-color-scheme: dark) {
1211
- [type=range] {
1212
- background-color: transparent;
1213
- }
1214
- [type=range]:focus {
1215
- background-color: transparent;
1216
- }
1217
- [type=range]::-webkit-slider-runnable-track {
1218
- background-color: #111;
1219
- }
1220
- [type=range]::-moz-range-track {
1221
- background-color: #111;
1222
- }
1223
- input::-moz-placeholder, textarea::-moz-placeholder {
1224
- color: #999;
1225
- }
1226
- input::placeholder,
1227
- textarea::placeholder {
1228
- color: #999;
1229
- }
1230
- button,
1231
- [type=button],
1232
- [type=reset],
1233
- [type=submit] {
1234
- background: #ccc;
1235
- }
1236
- button:hover, button:active, button:focus,
1237
- [type=button]:hover,
1238
- [type=button]:active,
1239
- [type=button]:focus,
1240
- [type=reset]:hover,
1241
- [type=reset]:active,
1242
- [type=reset]:focus,
1243
- [type=submit]:hover,
1244
- [type=submit]:active,
1245
- [type=submit]:focus {
1246
- background: rgb(178.5, 178.5, 178.5);
1247
- }
1248
- button:active, button:focus,
1249
- [type=button]:active,
1250
- [type=button]:focus,
1251
- [type=reset]:active,
1252
- [type=reset]:focus,
1253
- [type=submit]:active,
1254
- [type=submit]:focus {
1255
- box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.45);
1256
- }
1257
- button:active, button:focus,
1258
- [type=button]:active,
1259
- [type=button]:focus,
1260
- [type=reset]:active,
1261
- [type=reset]:focus,
1262
- [type=submit]:active,
1263
- [type=submit]:focus,
1264
- .bf-btn:active,
1265
- .bf-btn:focus {
1266
- box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.45);
1267
- }
1268
- a:focus,
1269
- input:focus {
1270
- outline-color: rgb(178.5, 115.5, 0);
1271
- }
1272
- :focus-visible {
1273
- outline-color: rgb(178.5, 115.5, 0);
1274
- }
1275
- dialog {
1276
- color: #f0f0f0;
1277
- background-color: rgb(36.125, 36.125, 36.125);
1278
- }
1466
+
1467
+ /* Element-level dark-mode rules, shared by the class-based and classless dark
1468
+ * sheets. Contains no .bf-* selector, so the classless builds can import it as
1469
+ * they are. Class-based extras live in _utility-global-dark-shared.css.
1470
+ * Underscore prefix excludes this file from the buildAllCss glob. */
1471
+
1472
+ html {
1473
+ color: var(--bf-light);
1474
+ }
1475
+
1476
+ body {
1477
+ background-color: var(--bf-dark-bg);
1478
+ }
1479
+
1480
+ a {
1481
+ color: var(--bf-dark-link);
1482
+ }
1483
+
1484
+ a:hover,
1485
+ a:focus {
1486
+ color: var(--bf-dark-link-hover);
1487
+ }
1488
+
1489
+ mark {
1490
+ background-color: var(--bf-dark-mark-bg);
1491
+ }
1492
+
1493
+ ins {
1494
+ background-color: var(--bf-dark-ins-bg);
1495
+ }
1496
+
1497
+ [type='email'],
1498
+ [type='number'],
1499
+ [type='password'],
1500
+ [type='tel'],
1501
+ [type='search'],
1502
+ [type='text'],
1503
+ [type='date'],
1504
+ [type='datetime-local'],
1505
+ [type='month'],
1506
+ [type='week'],
1507
+ [type='time'],
1508
+ [type='url'],
1509
+ [type='range'],
1510
+ input[list],
1511
+ select,
1512
+ select:not([size], select[multiple]),
1513
+ textarea {
1514
+ background-color: var(--bf-dark-extra);
1515
+ border-color: var(--bf-black);
1516
+ color: var(--bf-gray-light);
1517
+ }
1518
+
1519
+ [type='email']:active,
1520
+ [type='email']:focus,
1521
+ [type='number']:active,
1522
+ [type='number']:focus,
1523
+ [type='password']:active,
1524
+ [type='password']:focus,
1525
+ [type='tel']:active,
1526
+ [type='tel']:focus,
1527
+ [type='search']:active,
1528
+ [type='search']:focus,
1529
+ [type='text']:active,
1530
+ [type='text']:focus,
1531
+ [type='date']:active,
1532
+ [type='date']:focus,
1533
+ [type='datetime-local']:active,
1534
+ [type='datetime-local']:focus,
1535
+ [type='month']:active,
1536
+ [type='month']:focus,
1537
+ [type='week']:active,
1538
+ [type='week']:focus,
1539
+ [type='time']:active,
1540
+ [type='time']:focus,
1541
+ [type='url']:active,
1542
+ [type='url']:focus,
1543
+ input[list]:active,
1544
+ input[list]:focus,
1545
+ select:active,
1546
+ select:focus,
1547
+ select:not([size], select[multiple]):active,
1548
+ select:not([size], select[multiple]):focus,
1549
+ textarea:active,
1550
+ textarea:focus {
1551
+ background-color: var(--bf-dark-extra);
1552
+ border-color: var(--bf-dark-border-focus);
1553
+ box-shadow: 0 0 0 3px var(--bf-dark-shadow-focus);
1554
+ }
1555
+
1556
+ select:not([size], select[multiple]) {
1557
+ 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");
1558
+ }
1559
+
1560
+ [type='range'] {
1561
+ background-color: transparent;
1562
+ }
1563
+
1564
+ [type='range']:focus {
1565
+ background-color: transparent;
1566
+ }
1567
+
1568
+ [type='range']::-webkit-slider-runnable-track {
1569
+ background-color: var(--bf-dark-extra);
1570
+ }
1571
+
1572
+ [type='range']::-moz-range-track {
1573
+ background-color: var(--bf-dark-extra);
1574
+ }
1575
+
1576
+ input::-moz-placeholder, textarea::-moz-placeholder {
1577
+ color: var(--bf-gray);
1578
+ }
1579
+
1580
+ input::placeholder,
1581
+ textarea::placeholder {
1582
+ color: var(--bf-gray);
1583
+ }
1584
+
1585
+ button,
1586
+ [type='button'],
1587
+ [type='reset'],
1588
+ [type='submit'] {
1589
+ background: var(--bf-gray-light);
1590
+ }
1591
+
1592
+ button:hover,
1593
+ button:active,
1594
+ button:focus,
1595
+ [type='button']:hover,
1596
+ [type='button']:active,
1597
+ [type='button']:focus,
1598
+ [type='reset']:hover,
1599
+ [type='reset']:active,
1600
+ [type='reset']:focus,
1601
+ [type='submit']:hover,
1602
+ [type='submit']:active,
1603
+ [type='submit']:focus {
1604
+ background: var(--bf-dark-button-hover);
1605
+ }
1606
+
1607
+ button:active,
1608
+ button:focus,
1609
+ [type='button']:active,
1610
+ [type='button']:focus,
1611
+ [type='reset']:active,
1612
+ [type='reset']:focus,
1613
+ [type='submit']:active,
1614
+ [type='submit']:focus {
1615
+ box-shadow: 0 0 0 3px var(--bf-dark-button-shadow);
1616
+ }
1617
+
1618
+ dialog {
1619
+ color: var(--bf-light);
1620
+ background-color: var(--bf-dark-bg);
1621
+ }
1622
+
1623
+ caption {
1624
+ color: var(--bf-gray-light);
1625
+ }
1626
+
1627
+ progress[value] {
1628
+ background: var(--bf-gray-dark-extra);
1629
+ color: var(--bf-blue);
1630
+ }
1631
+
1632
+ progress[value]::-webkit-progress-bar {
1633
+ background: var(--bf-gray-dark-extra);
1634
+ }
1635
+
1636
+ progress[value]::-webkit-progress-value {
1637
+ background: var(--bf-blue);
1638
+ }
1639
+ }
1640
+
1641
+ @media (prefers-color-scheme: dark) {
1642
+
1643
+ a:focus,
1644
+ input:focus {
1645
+ outline-color: rgb(214 140 0); /* orange -15% */
1646
+ }
1647
+
1648
+ :focus-visible {
1649
+ outline-color: rgb(214 140 0); /* orange -15% */
1650
+ }
1651
+ }
1652
+
1653
+ @media (prefers-color-scheme: dark) {
1654
+
1655
+ /* Dark scrollbar colors (Firefox + WebKit). */
1656
+
1657
+ html {
1658
+ scrollbar-color: rgb(97 97 97) var(--bf-dark-extra); /* gray-dark -5% lightness */
1659
+ }
1660
+
1661
+ /* WebKit thumb / track. */
1662
+
1663
+ ::-webkit-scrollbar {
1664
+ width: 1.5rem;
1665
+ height: 1.5rem;
1666
+ }
1667
+
1668
+ ::-webkit-scrollbar-track {
1669
+ background-color: var(--bf-dark-extra);
1670
+ }
1671
+
1672
+ ::-webkit-scrollbar-thumb {
1673
+ background-color: rgb(97 97 97); /* gray-dark -5% lightness */
1674
+ }
1675
+
1676
+ ::-webkit-scrollbar-thumb:hover {
1677
+ background-color: rgb(115 115 115); /* gray-dark +10% lightness */
1678
+ }
1279
1679
  }
1280
- /*# sourceMappingURL=bullframe-classless-system-default.css.map */