bullframe.css 6.2.1 → 6.3.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 (33) hide show
  1. package/CHANGELOG.md +75 -46
  2. package/README.md +1 -2
  3. package/dist/css/bullframe-classless-dark.css +1 -1
  4. package/dist/css/bullframe-classless-dark.min.css +1 -1
  5. package/dist/css/bullframe-classless-dark.min.css.map +1 -1
  6. package/dist/css/bullframe-classless-system-default.css +1 -1
  7. package/dist/css/bullframe-classless-system-default.min.css +1 -1
  8. package/dist/css/bullframe-classless-system-default.min.css.map +1 -1
  9. package/dist/css/bullframe-classless.css +1 -1
  10. package/dist/css/bullframe-classless.min.css +1 -1
  11. package/dist/css/bullframe-classless.min.css.map +1 -1
  12. package/dist/css/bullframe-dark.css +1 -1
  13. package/dist/css/bullframe-dark.min.css +1 -1
  14. package/dist/css/bullframe-dark.min.css.map +1 -1
  15. package/dist/css/bullframe-system-default.css +1 -1
  16. package/dist/css/bullframe-system-default.min.css +1 -1
  17. package/dist/css/bullframe-system-default.min.css.map +1 -1
  18. package/dist/css/bullframe-utilities.css +1 -1
  19. package/dist/css/bullframe-utilities.min.css +1 -1
  20. package/dist/css/bullframe-utilities.min.css.map +1 -1
  21. package/dist/css/bullframe.css +1 -1
  22. package/dist/css/bullframe.min.css +1 -1
  23. package/dist/css/bullframe.min.css.map +1 -1
  24. package/dist/skills/AGENTS.bullframe.md +3 -0
  25. package/dist/skills/api.json +1 -1
  26. package/dist/skills/bullframe-components/SKILL.md +88 -0
  27. package/dist/skills/bullframe-components/examples/components.html +100 -0
  28. package/dist/skills/bullframe-media/SKILL.md +86 -0
  29. package/dist/skills/bullframe-media/examples/album.html +104 -0
  30. package/dist/skills/bullframe-theming/SKILL.md +85 -0
  31. package/dist/skills/bullframe-theming/examples/branded.html +58 -0
  32. package/dist/skills/index.json +77 -1
  33. package/package.json +9 -5
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: bullframe-media
3
+ description: Build galleries, responsive embeds and media grids with Bullframe CSS. Use when creating an album, photo grid, video or map embed, figure with caption, or mixed media cards.
4
+ bullframe: '>=6.1.0 <7.0.0'
5
+ builds: [bullframe.css, bullframe-dark.css, bullframe-system-default.css]
6
+ requires: [bullframe-core]
7
+ docs: ['/utilities/embeds', '/utilities/filters', '/utilities/grid', '/components/cards']
8
+ ---
9
+
10
+ # Media
11
+
12
+ <!-- bf-absent: bf-gallery, bf-media, bf-card, bf-aspect-ratio, bf-col-md-4 -->
13
+
14
+ Media layouts in Bullframe are grid columns plus embed utilities. Cards and galleries are
15
+ composed markup; there is no gallery or card class.
16
+
17
+ ## When to use
18
+
19
+ An album, portfolio grid, video or map embed, captioned figure, filter chip bar over a
20
+ media set, or any page whose main content is images or embeds.
21
+
22
+ ## Inputs to gather
23
+
24
+ Item list (image or embed URL, title, caption, meaningful vs decorative), grid density
25
+ (two or three columns), whether a filter bar is needed, and light / dark / system theme.
26
+
27
+ ## Rules
28
+
29
+ 1. Wrap iframes, video and map-like boxes in `.bf-embed-responsive` (16:9). Add
30
+ `.bf-embed-responsive--4-3` for a taller ratio. Non-replaced content inside the box
31
+ needs `.bf-embed-responsive--item`.
32
+ 2. There is no `.bf-card` or `.bf-gallery`. A media card is an `<article>` with a border,
33
+ radius and padding written as `var(--bf-*)` declarations, or an image plus a body
34
+ block.
35
+ 3. Lay out cards with `.bf-row` and `.bf-col-*` that sum to 12 or less. Use
36
+ `.bf-container.bf-container--break-md` so columns stack below 768px.
37
+ 4. Meaningful images take real `alt` text. Decorative images take `alt=""`.
38
+ 5. Prefer `<figure>` with `<figcaption>` for a single captioned image.
39
+ 6. A filter bar is a `<nav aria-label="…">` of `.bf-btn` links; mark the active filter with
40
+ `aria-current="page"`.
41
+ 7. Optional image treatments use `.bf-filter-grayscale`, `.bf-filter-blur`,
42
+ `.bf-filter-invert`, `.bf-filter-dim-images` or `.bf-filter-none`. Do not invent filter
43
+ classes.
44
+ 8. Keep custom CSS out of the page unless the task asks for crop or object-fit rules that
45
+ tokens cannot cover.
46
+
47
+ ## Recipe
48
+
49
+ 1. Pick a class-based build (`bullframe-core` has the table).
50
+ 2. Emit the scaffold with skip link and container.
51
+ 3. Optional hero row, then optional filter `<nav>`.
52
+ 4. Emit the grid: one `.bf-row`, equal `.bf-col-4` or `.bf-col-6` children.
53
+ 5. Each cell is an `<article>` or `<figure>` with image or embed, then title and caption.
54
+ 6. Re-read and delete any class that is not in `api.json`.
55
+
56
+ ## Example
57
+
58
+ [`examples/album.html`](examples/album.html) is a six-tile album with a filter bar,
59
+ captioned articles and a 16:9 embed section. Placeholders stand in for real assets.
60
+
61
+ ## Expected output
62
+
63
+ One HTML file with responsive embeds and a grid whose column classes sum to at most 12
64
+ per row. No gallery library and no invented media classes.
65
+
66
+ ## Failure modes
67
+
68
+ - Inventing `.bf-gallery`, `.bf-media`, `.bf-card` or `.bf-aspect-ratio`.
69
+ - A bare `<iframe>` or `<video>` without `.bf-embed-responsive`.
70
+ - Missing or placeholder `alt` on meaningful photos.
71
+ - Per-breakpoint column classes such as `.bf-col-md-4` (they do not exist).
72
+ - Filter chips built from unlabelled `<div>`s instead of a `<nav>` and buttons or links.
73
+
74
+ ## Do not
75
+
76
+ - Do not add a lightbox or carousel library unless the task explicitly asks for one.
77
+ - Do not put decorative images in the accessibility tree with non-empty alt text.
78
+ - Do not use the classless build for a multi-column media grid; it has no grid utilities.
79
+
80
+ ## Canonical docs
81
+
82
+ - Embeds: <https://bullframecss.marcopontili.com/utilities/embeds.md>
83
+ - Filters: <https://bullframecss.marcopontili.com/utilities/filters.md>
84
+ - Grid: <https://bullframecss.marcopontili.com/utilities/grid.md>
85
+ - Cards: <https://bullframecss.marcopontili.com/components/cards.md>
86
+ - Live album and media examples: <https://bullframecss.marcopontili.com/examples>
@@ -0,0 +1,104 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Coastal light · Portfolio</title>
7
+ <meta name="description" content="Six-frame portfolio album built with Bullframe media utilities." />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bullframe.css" />
9
+ </head>
10
+ <body>
11
+ <a class="bf-skip-link" href="#main-content">Skip to content</a>
12
+
13
+ <main id="main-content" class="bf-container bf-container--break-md bf-p-b-4">
14
+ <header class="bf-m-b-3">
15
+ <div class="bf-row" style="align-items: end">
16
+ <div class="bf-col-8">
17
+ <p class="bf-m-b-1"><small>Portfolio · Spring 2026</small></p>
18
+ <h1 class="bf-m-b-1">Coastal light</h1>
19
+ <p class="bf-lead bf-m-b-0">Six frames from a weekend shoot: harbors, night streets, forest paths and studio stills.</p>
20
+ </div>
21
+ <div class="bf-col-4 bf-t-right">
22
+ <p class="bf-m-b-1"><small>12 photos · 3 locations</small></p>
23
+ <a class="bf-btn bf-btn--primary" href="#reel">Watch reel</a>
24
+ </div>
25
+ </div>
26
+ </header>
27
+
28
+ <nav class="bf-m-b-3" aria-label="Filter photos">
29
+ <a class="bf-btn bf-btn--primary" href="#" aria-current="page">All</a>
30
+ <a class="bf-btn" href="#">Outdoors</a>
31
+ <a class="bf-btn" href="#">City</a>
32
+ <a class="bf-btn" href="#">Studio</a>
33
+ </nav>
34
+
35
+ <div class="bf-row">
36
+ <div class="bf-col-4">
37
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
38
+ <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%23c7d2e0' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23344' font-family='sans-serif' font-size='28'%3EHarbor%3C/text%3E%3C/svg%3E" width="640" height="400" alt="Harbor at sunrise with dock pilings" style="display: block; width: 100%; height: auto" />
39
+ <div style="padding: var(--bf-spacing-xl)">
40
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Sunrise dock</h2>
41
+ <p class="bf-m-b-0">Harbor light study · ISO 200</p>
42
+ </div>
43
+ </article>
44
+ </div>
45
+ <div class="bf-col-4">
46
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
47
+ <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%231e293b' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23e2e8f0' font-family='sans-serif' font-size='28'%3ENight%3C/text%3E%3C/svg%3E" width="640" height="400" alt="City skyline at night with lit windows" style="display: block; width: 100%; height: auto" />
48
+ <div style="padding: var(--bf-spacing-xl)">
49
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Night grid</h2>
50
+ <p class="bf-m-b-0">Downtown skyline · 1/30s</p>
51
+ </div>
52
+ </article>
53
+ </div>
54
+ <div class="bf-col-4">
55
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
56
+ <img class="bf-filter-grayscale" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%234d7c5a' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23f0fdf4' font-family='sans-serif' font-size='28'%3EForest%3C/text%3E%3C/svg%3E" width="640" height="400" alt="Sunlit path through green forest" style="display: block; width: 100%; height: auto" />
57
+ <div style="padding: var(--bf-spacing-xl)">
58
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Forest path</h2>
59
+ <p class="bf-m-b-0">Trail series · morning</p>
60
+ </div>
61
+ </article>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="bf-row">
66
+ <div class="bf-col-4">
67
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
68
+ <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%23e7e5e4' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23444' font-family='sans-serif' font-size='28'%3EStudio%3C/text%3E%3C/svg%3E" width="640" height="400" alt="Product on seamless studio backdrop" style="display: block; width: 100%; height: auto" />
69
+ <div style="padding: var(--bf-spacing-xl)">
70
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Studio still</h2>
71
+ <p class="bf-m-b-0">Product pack · softbox</p>
72
+ </div>
73
+ </article>
74
+ </div>
75
+ <div class="bf-col-4">
76
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
77
+ <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%23d97706' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23fff7ed' font-family='sans-serif' font-size='28'%3EWarm%3C/text%3E%3C/svg%3E" width="640" height="400" alt="Warm desert dusk with grain" style="display: block; width: 100%; height: auto" />
78
+ <div style="padding: var(--bf-spacing-xl)">
79
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Warm grain</h2>
80
+ <p class="bf-m-b-0">Film scan · Portra 400</p>
81
+ </div>
82
+ </article>
83
+ </div>
84
+ <div class="bf-col-4">
85
+ <article class="bf-m-b-2" style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); overflow: hidden">
86
+ <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='640' height='400' viewBox='0 0 640 400'%3E%3Crect fill='%230891b2' width='640' height='400'/%3E%3Ctext x='50%25' y='50%25' dominant-baseline='middle' text-anchor='middle' fill='%23ecfeff' font-family='sans-serif' font-size='28'%3ECyan%3C/text%3E%3C/svg%3E" width="640" height="400" alt="Cyan geometric poster print" style="display: block; width: 100%; height: auto" />
87
+ <div style="padding: var(--bf-spacing-xl)">
88
+ <h2 class="bf-m-t-0" style="font-size: 1.15rem">Cyan print</h2>
89
+ <p class="bf-m-b-0">Poster draft · A2</p>
90
+ </div>
91
+ </article>
92
+ </div>
93
+ </div>
94
+
95
+ <section id="reel" class="bf-m-t-3">
96
+ <h2>Weekend reel · 16:9</h2>
97
+ <p>Wrap players in <code>.bf-embed-responsive</code>. Default ratio is 16:9.</p>
98
+ <div class="bf-embed-responsive">
99
+ <div class="bf-embed-responsive--item bf-t-center bf-p-4" role="img" aria-label="Placeholder for a 16:9 portfolio reel" style="background: var(--bf-light); display: flex; align-items: center; justify-content: center">Reel placeholder</div>
100
+ </div>
101
+ </section>
102
+ </main>
103
+ </body>
104
+ </html>
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: bullframe-theming
3
+ description: Theme Bullframe CSS with token overrides, dark or system builds, and a short project stylesheet. Use when branding colours or fonts, picking a dark or prefers-color-scheme build, or adding custom.css on top of one base build.
4
+ bullframe: '>=6.1.0 <7.0.0'
5
+ builds: [bullframe.css, bullframe-dark.css, bullframe-system-default.css, bullframe-classless.css, bullframe-classless-dark.css, bullframe-classless-system-default.css, bullframe-utilities.css]
6
+ requires: [bullframe-core]
7
+ docs: ['/theming', '/theming/dark-mode', '/theming/customization', '/variables']
8
+ ---
9
+
10
+ # Theming
11
+
12
+ <!-- bf-absent: bf-theme, bf-theme-toggle, bf-dark-mode -->
13
+
14
+ Bullframe themes through CSS custom properties and build choice. Override `--bf-*` tokens
15
+ after the stylesheet; do not fork the framework or invent theme classes.
16
+
17
+ ## When to use
18
+
19
+ Brand colour or type, a dark or system-prefers page, a short `custom.css` on top of one
20
+ base build, or any task that changes appearance without new component CSS.
21
+
22
+ ## Inputs to gather
23
+
24
+ Brand primary colour (and a hover/focus sibling), optional font stacks, light / dark /
25
+ system preference, and whether overrides are global (`:root`) or scoped to a class.
26
+
27
+ ## Rules
28
+
29
+ 1. Link exactly one base build. Dark is `bullframe-dark.css`; OS-follows is
30
+ `bullframe-system-default.css` (or the classless equivalents). Do not stack two bases.
31
+ 2. Override tokens, not selectors. Set `--bf-blue`, `--bf-blue-light`,
32
+ `--bf-focus-ring-color`, grays, and font stacks. Links, primary buttons and focus rings
33
+ follow those tokens.
34
+ 3. Load project CSS after Bullframe. Prefer a `<style>` block or one `custom.css` link.
35
+ Keep it to token overrides plus a few layout or type rules.
36
+ 4. Scope when the brand is not site-wide: put the overrides on a class such as
37
+ `.brand`, not on every page.
38
+ 5. Replaced blues must clear WCAG AA contrast (4.5:1) on the page background. The shipped
39
+ blues already do; a replacement has to match that bar.
40
+ 6. Do not add a theme-toggle script to get dark mode. Pick a `-dark` or `-system-default`
41
+ build instead.
42
+ 7. Leave the HTML alone when tokens suffice. Prefer element styles and utilities over
43
+ restyling `.bf-btn` selectors unless a token cannot reach the property.
44
+
45
+ ## Recipe
46
+
47
+ 1. Choose the build from `bullframe-core` (light, dark, or system; class-based or
48
+ classless).
49
+ 2. Emit the page scaffold.
50
+ 3. Add a token block on `:root` or a brand scope class.
51
+ 4. If a few layout rules are needed, keep them in the same stylesheet and name them for
52
+ the project, not as fake `.bf-*` classes.
53
+ 5. Check contrast on primary buttons, links and body text.
54
+
55
+ ## Example
56
+
57
+ [`examples/branded.html`](examples/branded.html) is a class-based page with a scoped brand
58
+ class: teal primary tokens, serif headings, and no second Bullframe build.
59
+
60
+ ## Expected output
61
+
62
+ One HTML file that links exactly one Bullframe stylesheet, overrides only real `--bf-*`
63
+ tokens from `api.json`, and needs no JavaScript for theming.
64
+
65
+ ## Failure modes
66
+
67
+ - Linking `bullframe.css` and `bullframe-dark.css` together.
68
+ - Inventing `.bf-theme`, `.bf-theme-toggle` or `.bf-dark-mode`.
69
+ - Hard-coding `#0f766e` on buttons instead of setting `--bf-blue`.
70
+ - Dropping contrast below AA when swapping the primary colour.
71
+ - A large custom stylesheet that reimplements grid, spacing or type scales.
72
+
73
+ ## Do not
74
+
75
+ - Do not write a theme toggle for OS dark mode; use a `-system-default` build.
76
+ - Do not put token overrides in a stylesheet loaded before Bullframe.
77
+ - Do not rebuild the framework from source for a colour change.
78
+ - Do not set `outline: none`; tune `--bf-focus-ring-*` instead.
79
+
80
+ ## Canonical docs
81
+
82
+ - Theming: <https://bullframecss.marcopontili.com/theming.md>
83
+ - Dark mode: <https://bullframecss.marcopontili.com/theming/dark-mode.md>
84
+ - Customization: <https://bullframecss.marcopontili.com/theming/customization.md>
85
+ - Variables: <https://bullframecss.marcopontili.com/variables.md>
@@ -0,0 +1,58 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Northwind Press · Seasonal notes</title>
7
+ <meta name="description" content="Sample branded page using Bullframe token overrides." />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bullframe.css" />
9
+ <style>
10
+ .brand {
11
+ --bf-blue: #0f766e;
12
+ --bf-blue-light: #0d9488;
13
+ --bf-blue-light-extra: #ccfbf1;
14
+ --bf-dark: #134e4a;
15
+ --bf-gray-dark: #3f5f5b;
16
+ --bf-gray-light: #c7e0db;
17
+ --bf-light: #f0fdfa;
18
+ --bf-focus-ring-color: #0f766e;
19
+ --bf-font-serif: Georgia, 'Times New Roman', serif;
20
+ color: var(--bf-dark);
21
+ background: var(--bf-light);
22
+ }
23
+
24
+ .brand h1,
25
+ .brand h2 {
26
+ font-family: var(--bf-font-serif);
27
+ }
28
+ </style>
29
+ </head>
30
+ <body class="brand">
31
+ <a class="bf-skip-link" href="#main-content">Skip to content</a>
32
+
33
+ <main id="main-content" class="bf-container bf-container--break-md bf-p-b-4">
34
+ <p class="bf-m-b-1"><small>Northwind Press</small></p>
35
+ <h1>Seasonal notes from the shop</h1>
36
+ <p class="bf-lead">Colours and type come from token overrides on a brand scope class. The HTML stays ordinary Bullframe markup.</p>
37
+ <p>
38
+ <a class="bf-btn bf-btn--primary" href="#notes">Read the notes</a>
39
+ <a class="bf-btn" href="https://bullframecss.marcopontili.com/theming">Theming docs</a>
40
+ </p>
41
+
42
+ <div id="notes" class="bf-row bf-m-t-3">
43
+ <div class="bf-col-6">
44
+ <article style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); padding: var(--bf-spacing-xl)">
45
+ <h2 class="bf-m-t-0">Token overrides</h2>
46
+ <p class="bf-m-b-0">Set <code>--bf-blue</code>, grays and font stacks. Buttons and links pick them up.</p>
47
+ </article>
48
+ </div>
49
+ <div class="bf-col-6">
50
+ <article style="border: 1px solid var(--bf-gray-light); border-radius: var(--bf-spacing-sm); padding: var(--bf-spacing-xl)">
51
+ <h2 class="bf-m-t-0">One base build</h2>
52
+ <p class="bf-m-b-0">Light, dark or system-default. Never stack two Bullframe stylesheets.</p>
53
+ </article>
54
+ </div>
55
+ </div>
56
+ </main>
57
+ </body>
58
+ </html>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bullframe.css",
3
- "version": "6.2.1",
3
+ "version": "6.3.0",
4
4
  "docs": "https://bullframecss.marcopontili.com",
5
5
  "api": "api.json",
6
6
  "agentsBlock": "AGENTS.bullframe.md",
@@ -34,6 +34,30 @@
34
34
  "SKILL.md"
35
35
  ]
36
36
  },
37
+ {
38
+ "name": "bullframe-components",
39
+ "description": "Compose navigation, cards and native dialog modals with Bullframe CSS. Use when building a header nav, breadcrumb, pagination, content or media cards, or a confirm dialog without a component library.",
40
+ "path": "bullframe-components/SKILL.md",
41
+ "bullframe": ">=6.1.0 <7.0.0",
42
+ "builds": [
43
+ "bullframe.css",
44
+ "bullframe-dark.css",
45
+ "bullframe-system-default.css"
46
+ ],
47
+ "requires": [
48
+ "bullframe-core"
49
+ ],
50
+ "docs": [
51
+ "https://bullframecss.marcopontili.com/components/navigation",
52
+ "https://bullframecss.marcopontili.com/components/cards",
53
+ "https://bullframecss.marcopontili.com/components/modals",
54
+ "https://bullframecss.marcopontili.com/components/button-patterns"
55
+ ],
56
+ "files": [
57
+ "SKILL.md",
58
+ "examples/components.html"
59
+ ]
60
+ },
37
61
  {
38
62
  "name": "bullframe-convert",
39
63
  "description": "Convert existing HTML and CSS to Bullframe CSS. Use when migrating a page off Bootstrap, Tailwind, a hand-rolled stylesheet, or an older Bullframe version, and when asked to remove custom CSS in favour of the framework.",
@@ -129,6 +153,58 @@
129
153
  "SKILL.md",
130
154
  "examples/landing.html"
131
155
  ]
156
+ },
157
+ {
158
+ "name": "bullframe-media",
159
+ "description": "Build galleries, responsive embeds and media grids with Bullframe CSS. Use when creating an album, photo grid, video or map embed, figure with caption, or mixed media cards.",
160
+ "path": "bullframe-media/SKILL.md",
161
+ "bullframe": ">=6.1.0 <7.0.0",
162
+ "builds": [
163
+ "bullframe.css",
164
+ "bullframe-dark.css",
165
+ "bullframe-system-default.css"
166
+ ],
167
+ "requires": [
168
+ "bullframe-core"
169
+ ],
170
+ "docs": [
171
+ "https://bullframecss.marcopontili.com/utilities/embeds",
172
+ "https://bullframecss.marcopontili.com/utilities/filters",
173
+ "https://bullframecss.marcopontili.com/utilities/grid",
174
+ "https://bullframecss.marcopontili.com/components/cards"
175
+ ],
176
+ "files": [
177
+ "SKILL.md",
178
+ "examples/album.html"
179
+ ]
180
+ },
181
+ {
182
+ "name": "bullframe-theming",
183
+ "description": "Theme Bullframe CSS with token overrides, dark or system builds, and a short project stylesheet. Use when branding colours or fonts, picking a dark or prefers-color-scheme build, or adding custom.css on top of one base build.",
184
+ "path": "bullframe-theming/SKILL.md",
185
+ "bullframe": ">=6.1.0 <7.0.0",
186
+ "builds": [
187
+ "bullframe.css",
188
+ "bullframe-dark.css",
189
+ "bullframe-system-default.css",
190
+ "bullframe-classless.css",
191
+ "bullframe-classless-dark.css",
192
+ "bullframe-classless-system-default.css",
193
+ "bullframe-utilities.css"
194
+ ],
195
+ "requires": [
196
+ "bullframe-core"
197
+ ],
198
+ "docs": [
199
+ "https://bullframecss.marcopontili.com/theming",
200
+ "https://bullframecss.marcopontili.com/theming/dark-mode",
201
+ "https://bullframecss.marcopontili.com/theming/customization",
202
+ "https://bullframecss.marcopontili.com/variables"
203
+ ],
204
+ "files": [
205
+ "SKILL.md",
206
+ "examples/branded.html"
207
+ ]
132
208
  }
133
209
  ]
134
210
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bullframe.css",
3
- "version": "6.2.1",
3
+ "version": "6.3.0",
4
4
  "type": "module",
5
5
  "description": "Bullframe CSS is a lightweight CSS framework for fast, responsive, accessible UIs. Semantic by default. Any stack. Classless when you want it. System dark built in. Seven builds, solid cross-browser support.",
6
6
  "main": "dist/css/bullframe.css",
@@ -37,12 +37,14 @@
37
37
  "dev": "vite",
38
38
  "build": "vite build",
39
39
  "preview": "vite preview",
40
+ "prepack": "node scripts/npm-readme-light.mjs prepack",
41
+ "postpack": "node scripts/npm-readme-light.mjs postpack",
40
42
  "prepublishOnly": "npm run build && npm run skills:build",
41
43
  "lint": "stylelint \"src/**/*.css\"",
42
44
  "lint:fix": "stylelint \"src/**/*.css\" --fix",
43
45
  "lint:html": "html-validate \"src/**/*.html\"",
44
- "format": "prettier --write \"src/**/*.css\" \"src/**/*.html\" \"src/**/*.mjs\" \"src/skills/**/*.md\" \"bin/**/*.mjs\" \"tests/**/*.mjs\" \"docs/**/*.md\" \"docs/.vitepress/**/*.css\" \"docs/.vitepress/**/*.mjs\" \"docs/.vitepress/**/*.js\" \"scripts/**/*.mjs\"",
45
- "format:check": "prettier --check \"src/**/*.css\" \"src/**/*.html\" \"src/**/*.mjs\" \"src/skills/**/*.md\" \"bin/**/*.mjs\" \"tests/**/*.mjs\" \"docs/**/*.md\" \"docs/.vitepress/**/*.css\" \"docs/.vitepress/**/*.mjs\" \"docs/.vitepress/**/*.js\" \"scripts/**/*.mjs\"",
46
+ "format": "prettier --write \"src/**/*.css\" \"src/**/*.html\" \"src/skills/**/*.md\" \"bin/**/*.mjs\" \"tests/**/*.mjs\" \"docs/**/*.md\" \"docs/.vitepress/**/*.css\" \"docs/.vitepress/**/*.mjs\" \"docs/.vitepress/**/*.js\" \"scripts/**/*.mjs\"",
47
+ "format:check": "prettier --check \"src/**/*.css\" \"src/**/*.html\" \"src/skills/**/*.md\" \"bin/**/*.mjs\" \"tests/**/*.mjs\" \"docs/**/*.md\" \"docs/.vitepress/**/*.css\" \"docs/.vitepress/**/*.mjs\" \"docs/.vitepress/**/*.js\" \"scripts/**/*.mjs\"",
46
48
  "test:e2e": "playwright test",
47
49
  "test:e2e:update": "playwright test --update-snapshots",
48
50
  "test:e2e:sync-from-ci": "node scripts/sync-e2e-baselines-from-ci.mjs",
@@ -58,8 +60,8 @@
58
60
  "examples:shots": "node scripts/capture-example-screenshots.mjs",
59
61
  "kitchen-sink:variants": "node scripts/generate-kitchen-sink-variants.mjs",
60
62
  "brand:icons": "node scripts/render-brand-icons.mjs",
61
- "brand:images": "node scripts/generate-brand-images.mjs",
62
- "brand:images:check": "node scripts/generate-brand-images.mjs --check"
63
+ "brand:images": "node .github/brand/render.mjs",
64
+ "brand:images:check": "node .github/brand/render.mjs --check"
63
65
  },
64
66
  "repository": {
65
67
  "type": "git",
@@ -97,9 +99,11 @@
97
99
  "cssnano": "^7.1.2",
98
100
  "glob": "^13.0.1",
99
101
  "html-validate": "^10.7.0",
102
+ "playwright": "1.62.1",
100
103
  "postcss": "^8.5.12",
101
104
  "postcss-import": "^16.1.1",
102
105
  "prettier": "^3.5.3",
106
+ "sharp": "0.35.4",
103
107
  "stylelint": "^17.1.1",
104
108
  "stylelint-config-standard": "^40.0.0",
105
109
  "vite": "^7.3.1",