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