bullframe.css 6.0.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +86 -26
  3. package/dist/css/bullframe-classless-dark.css +65 -58
  4. package/dist/css/bullframe-classless-dark.css.map +1 -1
  5. package/dist/css/bullframe-classless-dark.min.css +1 -1
  6. package/dist/css/bullframe-classless-dark.min.css.map +1 -1
  7. package/dist/css/bullframe-classless-system-default.css +61 -102
  8. package/dist/css/bullframe-classless-system-default.css.map +1 -1
  9. package/dist/css/bullframe-classless-system-default.min.css +1 -1
  10. package/dist/css/bullframe-classless-system-default.min.css.map +1 -1
  11. package/dist/css/bullframe-classless.css +37 -52
  12. package/dist/css/bullframe-classless.css.map +1 -1
  13. package/dist/css/bullframe-classless.min.css +1 -1
  14. package/dist/css/bullframe-classless.min.css.map +1 -1
  15. package/dist/css/bullframe-dark.css +216 -155
  16. package/dist/css/bullframe-dark.css.map +1 -1
  17. package/dist/css/bullframe-dark.min.css +1 -1
  18. package/dist/css/bullframe-dark.min.css.map +1 -1
  19. package/dist/css/bullframe-system-default.css +221 -154
  20. package/dist/css/bullframe-system-default.css.map +1 -1
  21. package/dist/css/bullframe-system-default.min.css +1 -1
  22. package/dist/css/bullframe-system-default.min.css.map +1 -1
  23. package/dist/css/bullframe-utilities.css +132 -65
  24. package/dist/css/bullframe-utilities.css.map +1 -1
  25. package/dist/css/bullframe-utilities.min.css +1 -1
  26. package/dist/css/bullframe-utilities.min.css.map +1 -1
  27. package/dist/css/bullframe.css +160 -115
  28. package/dist/css/bullframe.css.map +1 -1
  29. package/dist/css/bullframe.min.css +1 -1
  30. package/dist/css/bullframe.min.css.map +1 -1
  31. package/package.json +9 -5
package/CHANGELOG.md CHANGED
@@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [6.1.0] - 2026-09-14
11
+
12
+ ### Added
13
+
14
+ - CSS variables `--bf-focus-ring-color`, `--bf-focus-ring-width`, `--bf-focus-ring-offset`.
15
+ - `.bf-skip-link`, `.bf-focusable`, `.bf-scheme-*`, `.bf-target-size`, `.bf-accent-native`.
16
+ - `@supports` for `text-wrap: balance` and `scrollbar-gutter: stable`.
17
+
18
+ ### Changed
19
+
20
+ - README: install, CDN, examples; unversioned CDN (docs stay pinned + SRI).
21
+ - README, hero, OG, and social preview images regenerated from one source (`npm run brand:images`).
22
+
23
+ ### Fixed
24
+
25
+ - `caption` and `progress` in classless always-dark.
26
+ - Accessibility markup in the kitchen sink and examples.
27
+ - Docs site cache headers, so a new release reaches returning visitors.
28
+
29
+ ### Removed
30
+
31
+ - Dead UA+ rules that never applied inside `@layer`.
32
+
10
33
  ## [6.0.0] - 2026-07-31 - BREAKING CHANGES
11
34
 
12
35
  ### Changed
@@ -489,5 +512,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
489
512
  - Initial commit on 19 November 2012
490
513
  - Framework aimed to kickstart cross-browser responsive HTML/CSS development
491
514
 
492
- [Unreleased]: https://github.com/marcop135/bullframe.css/compare/v6.0.0...HEAD
515
+ [Unreleased]: https://github.com/marcop135/bullframe.css/compare/v6.1.0...HEAD
516
+ [6.1.0]: https://github.com/marcop135/bullframe.css/compare/v6.0.0...v6.1.0
493
517
  [6.0.0]: https://github.com/marcop135/bullframe.css/compare/v5.1.0...v6.0.0
package/README.md CHANGED
@@ -1,38 +1,67 @@
1
1
  <div align="center">
2
2
 
3
- ![Bullframe CSS](https://raw.githubusercontent.com/marcop135/bullframe.css/main/src/docs/github-readme/bf-readme-hero-light-16x9.png#gh-light-mode-only)
4
- ![Bullframe CSS](https://raw.githubusercontent.com/marcop135/bullframe.css/main/src/docs/github-readme/bf-readme-hero-dark-16x9.png#gh-dark-mode-only)
3
+ ![Bullframe CSS](src/docs/github-readme/bf-readme-hero-light-16x9.png#gh-light-mode-only)
4
+ ![Bullframe CSS](src/docs/github-readme/bf-readme-hero-dark-16x9.png#gh-dark-mode-only)
5
5
 
6
6
  # Bullframe CSS
7
7
 
8
- Semantic by default. Any stack.<br>
9
- <em>Classless when you want it. System dark built in.</em>
8
+ Semantic by default. Any stack.
10
9
 
11
10
  </div>
12
11
 
13
12
  <p align="center">
14
13
  <a href="https://www.npmjs.com/package/bullframe.css"><img src="https://img.shields.io/npm/v/bullframe.css.svg?style=flat-square" alt="npm version"></a>
15
- <a href="https://bullframecss.marcopontili.com/"><img src="https://img.shields.io/badge/docs-online-0056b3?style=flat-square" alt="Docs"></a>
16
- <img src="https://img.shields.io/badge/dependencies-0-brightgreen?style=flat-square" alt="Zero dependencies">
17
- <img src="https://img.shields.io/badge/any%20stack-555555?style=flat-square" alt="Any stack">
14
+ <a href="https://github.com/marcop135/bullframe.css/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/marcop135/bullframe.css/ci.yml?branch=main&style=flat-square" alt="CI status"></a>
18
15
  <a href="LICENSE"><img src="https://img.shields.io/github/license/marcop135/bullframe.css.svg?style=flat-square" alt="MIT License"></a>
19
16
  </p>
20
17
 
21
18
  ---
22
19
 
23
- ## Why use it
20
+ One-stylesheet CSS framework for plain HTML: no build step, no JavaScript. Typography, forms, tables, buttons, and layout out of the box.
24
21
 
25
- - **Semantic HTML first:** headings, forms, tables, and links are styled without a pile of classes
26
- - **Classless when you want it:** swap in `bullframe-classless.css` and keep markup as plain HTML
27
- - **Dark without a script:** always-dark builds, or system-default builds that follow `prefers-color-scheme`
28
- - **Accessible defaults:** focus-visible rings, reduced-motion respect, WCAG AA contrast on links and primary buttons
29
- - **Native CSS, any stack:** PostCSS builds, no Sass, no runtime JavaScript, solid cross-browser support
22
+ Light or dark. Built for pages and forms: landings, docs, help centers, and marketing microsites.
30
23
 
31
- ## When to use
24
+ <!-- sri:cdn:start -->
25
+ ```html
26
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bullframe.css">
27
+ ```
28
+ <!-- sri:cdn:end -->
29
+
30
+ [Check the docs →](https://bullframecss.marcopontili.com/)
31
+
32
+ ## Features
33
+
34
+ - Plain HTML looks finished before you write a class
35
+ - Classless when you want clean markup; classes when you need layout control
36
+ - Light and dark out of the box, no theme script
37
+ - One stylesheet, about 8 kB gzipped: type, forms, tables, buttons, layout
38
+ - Restyle the whole page by changing a few colour tokens
39
+ - Accessibility built in: clear focus, reduced motion respect, WCAG AA defaults
40
+ - Works with any stack: drop it on a landing, docs site, or help center
41
+ - npm or CDN; nothing to compile to use it
32
42
 
33
- Pages and forms, not complex app UIs: docs, blogs, landings, help centers, listings, micro-sites. One stylesheet for reset, type, forms, and layout. Class-based or classless. No Tailwind-style utility pipeline.
43
+ ## Examples
44
+
45
+ Ready to copy: landings, blogs, forms, docs. Plain HTML, one stylesheet.
46
+
47
+ <table>
48
+ <tr>
49
+ <td><a href="https://bullframecss.marcopontili.com/examples/typography/"><img src="src/docs/examples/screenshots/typography.png" alt="Typography" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
50
+ <td><a href="https://bullframecss.marcopontili.com/examples/album/"><img src="src/docs/examples/screenshots/album.png" alt="Album" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
51
+ </tr>
52
+ <tr>
53
+ <td><a href="https://bullframecss.marcopontili.com/examples/pricing/"><img src="src/docs/examples/screenshots/pricing.png" alt="Pricing" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
54
+ <td><a href="https://bullframecss.marcopontili.com/examples/branded/"><img src="src/docs/examples/screenshots/branded.png" alt="Branded" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
55
+ </tr>
56
+ <tr>
57
+ <td><a href="https://bullframecss.marcopontili.com/examples/blog/"><img src="src/docs/examples/screenshots/blog.png" alt="Blog" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
58
+ <td><a href="https://bullframecss.marcopontili.com/examples/cover/"><img src="src/docs/examples/screenshots/cover.png" alt="Cover" style="border: 1px solid #999; border-radius: 10px;" /></a></td>
59
+ </tr>
60
+ </table>
34
61
 
35
- ## Getting started
62
+ [Browse all examples →](https://bullframecss.marcopontili.com/examples)
63
+
64
+ ## Install
36
65
 
37
66
  ```bash
38
67
  npm install bullframe.css
@@ -42,30 +71,61 @@ npm install bullframe.css
42
71
  import 'bullframe.css';
43
72
  ```
44
73
 
74
+ Default import: class-based, light. Other builds: `bullframe.css/classless`, `bullframe.css/dark`, and so on. See [Builds](#builds) below.
75
+
76
+ ### CDN
77
+
45
78
  ```html
46
79
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bullframe.css">
47
80
  ```
48
81
 
49
- ## Docs
82
+ Always the latest release. Swap the path for another build (e.g. `bullframe.css/dist/css/bullframe-classless.min.css`).
50
83
 
51
- [bullframecss.marcopontili.com](https://bullframecss.marcopontili.com/)
84
+ ## Builds
52
85
 
53
- ## Examples
86
+ <details>
87
+ <summary>See all 7 variants</summary>
54
88
 
55
- [Example templates](https://bullframecss.marcopontili.com/examples)
89
+ Seven files in `dist/css/`, each with a minified twin and a source map. Pick one; do not combine them, except utilities on top of another build.
56
90
 
57
- ## Kitchen sink
91
+ | Build | npm subpath | Use when |
92
+ | ---------------------------------------- | -------------------------------- | ------------------------------------ |
93
+ | `bullframe.css` | `bullframe.css` | Class-based, light |
94
+ | `bullframe-dark.css` | `bullframe.css/dark` | Class-based, always dark |
95
+ | `bullframe-system-default.css` | `bullframe.css/system` | Class-based, `prefers-color-scheme` |
96
+ | `bullframe-classless.css` | `bullframe.css/classless` | Classless, light |
97
+ | `bullframe-classless-dark.css` | `bullframe.css/classless/dark` | Classless, always dark |
98
+ | `bullframe-classless-system-default.css` | `bullframe.css/classless/system` | Classless, `prefers-color-scheme` |
99
+ | `bullframe-utilities.css` | `bullframe.css/utilities` | `.bf-*` helpers only, no base styles |
58
100
 
59
- [Every styled element in one page](https://bullframecss.marcopontili.com/kitchen-sink/)
101
+ **Classless** styles HTML tags only (no `.bf-*` classes). **Class-based** adds `.bf-*` grid, spacing, and helpers on top.
60
102
 
61
- ## Contributing
103
+ </details>
62
104
 
63
- See [CONTRIBUTING.md](./.github/CONTRIBUTING.md). Bug reports and feature requests go through [issues](https://github.com/marcop135/bullframe.css/issues).
105
+ ## Documentation
64
106
 
65
- ## Author
107
+ | Topic | |
108
+ | ----- | --- |
109
+ | [Docs](https://bullframecss.marcopontili.com/) | Home |
110
+ | [Getting started](https://bullframecss.marcopontili.com/getting-started) | Install and pick a build |
111
+ | [Examples](https://bullframecss.marcopontili.com/examples) | Page templates |
112
+ | [Kitchen sink](https://bullframecss.marcopontili.com/kitchen-sink/) | Every element in one place |
113
+ | [Variables](https://bullframecss.marcopontili.com/variables) | `--bf-*` tokens |
114
+ | [Components](https://bullframecss.marcopontili.com/components/) | Cards, modals, navigation, buttons |
115
+ | [Theming](https://bullframecss.marcopontili.com/theming) | Colours and dark mode |
116
+ | [API reference](https://bullframecss.marcopontili.com/api-reference) | Full token and class list |
117
+ | [Changelog](./CHANGELOG.md) | Release notes |
66
118
 
67
- [Marco Pontili](https://marcopontili.com)
119
+ ## Contributing
120
+
121
+ See [CONTRIBUTING.md](./.github/CONTRIBUTING.md).
122
+
123
+ Bugs → [issues](https://github.com/marcop135/bullframe.css/issues).
68
124
 
69
125
  ## License
70
126
 
71
127
  [MIT](./LICENSE)
128
+
129
+ ## Author
130
+
131
+ [Marco Pontili](https://marcopontili.com)
@@ -1,8 +1,8 @@
1
- /* ! Bullframe CSS v6.0.0 | MIT License | https://github.com/marcop135/bullframe.css */
1
+ /* ! Bullframe CSS v6.1.0 | MIT License | https://github.com/marcop135/bullframe.css */
2
2
 
3
3
  /* Always-dark classless build. */
4
4
 
5
- /* Classless build: semantic element styles only (no .bf-* utilities). */
5
+ /* Classless build: semantic element styles only (no .bf-* classes). */
6
6
 
7
7
  /* Variables */
8
8
  /* Design tokens (--bf-*). Shared by every build variant.
@@ -34,6 +34,11 @@
34
34
  /* Invalid / error */
35
35
  --bf-red: rgb(255 0 0);
36
36
 
37
+ /* Focus ring (prefers-contrast: more raises colour for WCAG 1.4.11) */
38
+ --bf-focus-ring-color: var(--bf-orange);
39
+ --bf-focus-ring-width: 0.2rem;
40
+ --bf-focus-ring-offset: 0.3rem;
41
+
37
42
  /* Dark-mode surfaces (used by utility-global-dark*.css) */
38
43
  --bf-dark-bg: rgb(28 28 28);
39
44
  --bf-dark-link: rgb(77 165 255);
@@ -111,11 +116,6 @@ template {
111
116
  * Light UA improvements; complements Bullframe base styles. */
112
117
 
113
118
  @layer {
114
- /* Spacing between content and focus outline (enhances focus.css). */
115
- :focus-visible {
116
- outline-offset: 3px;
117
- }
118
-
119
119
  /* Disable mobile landscape text inflation on optimized layouts. */
120
120
  html {
121
121
  -webkit-text-size-adjust: none;
@@ -123,14 +123,11 @@ template {
123
123
  text-size-adjust: none;
124
124
  }
125
125
 
126
- /* Comfortable default root line-height (body still uses --bf-body-line-height). */
127
- html {
128
- line-height: 1.5;
129
- }
130
-
131
126
  /* Stable scrollbar gutter avoids layout jump on short pages. */
132
- html {
133
- scrollbar-gutter: stable;
127
+ @supports (scrollbar-gutter: stable) {
128
+ html {
129
+ scrollbar-gutter: stable;
130
+ }
134
131
  }
135
132
 
136
133
  /* Nested h1 size/margin: match modern UA (Safari still nests sectioning styles). */
@@ -139,13 +136,6 @@ template {
139
136
  margin-block: 0.67em;
140
137
  }
141
138
 
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
139
  /* mark: system Highlight colors under forced-colors. */
150
140
  @media (forced-colors: active) {
151
141
  mark {
@@ -215,17 +205,12 @@ template {
215
205
  direction: ltr;
216
206
  }
217
207
 
218
- /* Tables: collapsed borders + cell padding for scanability. */
208
+ /* Tables: outer border. Cell borders and padding come from
209
+ * miscellaneous/tables.css, which is unlayered and therefore wins. */
219
210
  table {
220
211
  border: 1px solid currentColor;
221
212
  }
222
213
 
223
- th,
224
- td {
225
- border: 1px solid currentColor;
226
- padding: 0.25em 0.5em;
227
- }
228
-
229
214
  /* Soft dialog / popover enter transitions (skip when reduced-motion is on). */
230
215
  @media (prefers-reduced-motion: no-preference) {
231
216
  dialog::backdrop {
@@ -259,26 +244,11 @@ template {
259
244
  }
260
245
  }
261
246
 
262
- /* Keep [hidden] hard-hidden except until-found. */
263
- [hidden]:not([hidden='until-found']) {
264
- display: none !important;
265
- }
266
-
267
247
  /* Images as blocks (max-width still from embedded-content.css). */
268
248
  img {
269
249
  display: block;
270
250
  }
271
251
 
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
252
  /* Popovers: anchor near trigger when position-area is supported. */
283
253
  @supports (position-area: block-end span-inline-end) {
284
254
  [popover] {
@@ -356,7 +326,18 @@ h6 {
356
326
  color: inherit;
357
327
  line-height: 1.25;
358
328
  margin-bottom: var(--bf-spacing-lg);
359
- text-wrap: balance;
329
+ }
330
+
331
+ /* Balanced headings where supported; no-op elsewhere. */
332
+ @supports (text-wrap: balance) {
333
+ h1,
334
+ h2,
335
+ h3,
336
+ h4,
337
+ h5,
338
+ h6 {
339
+ text-wrap: balance;
340
+ }
360
341
  }
361
342
 
362
343
  h1 {
@@ -441,6 +422,7 @@ strong {
441
422
  font-weight: inherit;
442
423
  }
443
424
 
425
+ /* stylelint-disable-next-line no-duplicate-selectors -- normalize.css Safari fix */
444
426
  b,
445
427
  strong {
446
428
  font-weight: bolder;
@@ -1116,7 +1098,7 @@ a:not([href], [class]):hover {
1116
1098
  a:not([href], [tabindex]):focus {
1117
1099
  outline: 0;
1118
1100
  }
1119
- /* Keyboard-first focus: orange :focus-visible ring; mute mouse outline.
1101
+ /* Keyboard-first focus: :focus-visible ring from --bf-focus-ring-*; mute mouse outline.
1120
1102
  * Text-like controls clear UA outline here; field chrome is in forms/styling.css. */
1121
1103
 
1122
1104
  :where(:focus:not(:focus-visible)) {
@@ -1129,8 +1111,8 @@ a:not([href], [tabindex]):focus {
1129
1111
  }
1130
1112
 
1131
1113
  :focus-visible {
1132
- outline: 0.2rem solid var(--bf-orange);
1133
- outline-offset: 0.3rem;
1114
+ outline: var(--bf-focus-ring-width) solid var(--bf-focus-ring-color);
1115
+ outline-offset: var(--bf-focus-ring-offset);
1134
1116
  }
1135
1117
 
1136
1118
  /* Clear UA outline on text-like controls (styled fields keep their own chrome).
@@ -1155,8 +1137,7 @@ button:focus,
1155
1137
  [type='checkbox']:focus,
1156
1138
  input[list]:focus,
1157
1139
  select:focus,
1158
- textarea:focus,
1159
- .bf-btn:focus {
1140
+ textarea:focus {
1160
1141
  outline: 0;
1161
1142
  }
1162
1143
  /* List spacing and nav list reset. */
@@ -1187,7 +1168,6 @@ ol {
1187
1168
  nav ol,
1188
1169
  nav ul {
1189
1170
  list-style: none;
1190
- list-style-image: none;
1191
1171
  margin-left: 0;
1192
1172
  }
1193
1173
 
@@ -1430,6 +1410,12 @@ caption {
1430
1410
  text-decoration: underline;
1431
1411
  }
1432
1412
 
1413
+ /* Darker amber clears WCAG 1.4.11 (3:1) on white, --bf-light and --bf-dark-bg;
1414
+ * the default --bf-orange ring is only ~2:1 on white. */
1415
+ :root {
1416
+ --bf-focus-ring-color: rgb(184 115 0);
1417
+ }
1418
+
1433
1419
  :focus-visible {
1434
1420
  outline-width: 0.3rem;
1435
1421
  outline-offset: 0.4rem;
@@ -1468,12 +1454,16 @@ caption {
1468
1454
  button,
1469
1455
  [type='button'],
1470
1456
  [type='reset'],
1471
- [type='submit'],
1472
- .bf-btn {
1457
+ [type='submit'] {
1473
1458
  border: 1px solid ButtonText;
1474
1459
  }
1475
1460
  }
1476
- /* Always-dark overrides for classless (no media query). */
1461
+ /* Always-dark overrides for classless (no media query, no .bf-* selectors). */
1462
+
1463
+ /* Element-level dark-mode rules, shared by the class-based and classless dark
1464
+ * sheets. Contains no .bf-* selector, so the classless builds can import it as
1465
+ * they are. Class-based extras live in _utility-global-dark-shared.css.
1466
+ * Underscore prefix excludes this file from the buildAllCss glob. */
1477
1467
 
1478
1468
  html {
1479
1469
  color: var(--bf-light);
@@ -1621,6 +1611,28 @@ button:focus,
1621
1611
  box-shadow: 0 0 0 3px var(--bf-dark-button-shadow);
1622
1612
  }
1623
1613
 
1614
+ dialog {
1615
+ color: var(--bf-light);
1616
+ background-color: var(--bf-dark-bg);
1617
+ }
1618
+
1619
+ caption {
1620
+ color: var(--bf-gray-light);
1621
+ }
1622
+
1623
+ progress[value] {
1624
+ background: var(--bf-gray-dark-extra);
1625
+ color: var(--bf-blue);
1626
+ }
1627
+
1628
+ progress[value]::-webkit-progress-bar {
1629
+ background: var(--bf-gray-dark-extra);
1630
+ }
1631
+
1632
+ progress[value]::-webkit-progress-value {
1633
+ background: var(--bf-blue);
1634
+ }
1635
+
1624
1636
  a:focus,
1625
1637
  input:focus {
1626
1638
  outline-color: rgb(214 140 0); /* orange -15% */
@@ -1629,11 +1641,6 @@ input:focus {
1629
1641
  :focus-visible {
1630
1642
  outline-color: rgb(214 140 0); /* orange -15% */
1631
1643
  }
1632
-
1633
- dialog {
1634
- color: var(--bf-light);
1635
- background-color: var(--bf-dark-bg);
1636
- }
1637
1644
  /* Dark scrollbar colors (Firefox + WebKit). */
1638
1645
 
1639
1646
  html {