bullframe.css 5.0.1 → 6.0.0

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