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.
- package/CHANGELOG.md +75 -46
- package/README.md +1 -2
- package/dist/css/bullframe-classless-dark.css +1 -1
- package/dist/css/bullframe-classless-dark.min.css +1 -1
- package/dist/css/bullframe-classless-dark.min.css.map +1 -1
- package/dist/css/bullframe-classless-system-default.css +1 -1
- package/dist/css/bullframe-classless-system-default.min.css +1 -1
- package/dist/css/bullframe-classless-system-default.min.css.map +1 -1
- package/dist/css/bullframe-classless.css +1 -1
- package/dist/css/bullframe-classless.min.css +1 -1
- package/dist/css/bullframe-classless.min.css.map +1 -1
- package/dist/css/bullframe-dark.css +1 -1
- package/dist/css/bullframe-dark.min.css +1 -1
- package/dist/css/bullframe-dark.min.css.map +1 -1
- package/dist/css/bullframe-system-default.css +1 -1
- package/dist/css/bullframe-system-default.min.css +1 -1
- package/dist/css/bullframe-system-default.min.css.map +1 -1
- package/dist/css/bullframe-utilities.css +1 -1
- package/dist/css/bullframe-utilities.min.css +1 -1
- package/dist/css/bullframe-utilities.min.css.map +1 -1
- package/dist/css/bullframe.css +1 -1
- package/dist/css/bullframe.min.css +1 -1
- package/dist/css/bullframe.min.css.map +1 -1
- package/dist/skills/AGENTS.bullframe.md +3 -0
- package/dist/skills/api.json +1 -1
- package/dist/skills/bullframe-components/SKILL.md +88 -0
- package/dist/skills/bullframe-components/examples/components.html +100 -0
- package/dist/skills/bullframe-media/SKILL.md +86 -0
- package/dist/skills/bullframe-media/examples/album.html +104 -0
- package/dist/skills/bullframe-theming/SKILL.md +85 -0
- package/dist/skills/bullframe-theming/examples/branded.html +58 -0
- package/dist/skills/index.json +77 -1
- 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>
|
package/dist/skills/index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bullframe.css",
|
|
3
|
-
"version": "6.
|
|
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.
|
|
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
|
|
45
|
-
"format:check": "prettier --check \"src/**/*.css\" \"src/**/*.html\" \"src
|
|
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
|
|
62
|
-
"brand:images:check": "node
|
|
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",
|