unigrid.css 0.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/README.md +101 -0
- package/dist/dropdown.js +36 -0
- package/dist/index.js +5 -0
- package/dist/scrollspy.js +57 -0
- package/dist/tabs.js +30 -0
- package/dist/unigrid.css +4501 -0
- package/dist/unigrid.js +124 -0
- package/dist/unigrid.min.css +1 -0
- package/dist/unigrid.min.js +1 -0
- package/package.json +41 -0
- package/src/js/dropdown.js +49 -0
- package/src/js/index.js +19 -0
- package/src/js/scrollspy.js +87 -0
- package/src/js/tabs.js +58 -0
- package/src/scss/_accordion.scss +123 -0
- package/src/scss/_broadside.scss +125 -0
- package/src/scss/_buttons.scss +241 -0
- package/src/scss/_card.scss +168 -0
- package/src/scss/_components.scss +140 -0
- package/src/scss/_container.scss +54 -0
- package/src/scss/_dropdown.scss +178 -0
- package/src/scss/_footer.scss +147 -0
- package/src/scss/_formats.scss +64 -0
- package/src/scss/_forms.scss +192 -0
- package/src/scss/_grid.scss +114 -0
- package/src/scss/_header.scss +169 -0
- package/src/scss/_hero.scss +262 -0
- package/src/scss/_mixins.scss +120 -0
- package/src/scss/_modules.scss +238 -0
- package/src/scss/_navbar.scss +341 -0
- package/src/scss/_pagination.scss +160 -0
- package/src/scss/_prose.scss +393 -0
- package/src/scss/_reset.scss +82 -0
- package/src/scss/_scrollspy.scss +62 -0
- package/src/scss/_section.scss +91 -0
- package/src/scss/_sidebar.scss +147 -0
- package/src/scss/_table.scss +122 -0
- package/src/scss/_tabs.scss +178 -0
- package/src/scss/_typography.scss +105 -0
- package/src/scss/_utilities.scss +79 -0
- package/src/scss/_variables.scss +183 -0
- package/src/scss/unigrid.scss +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Unigrid.css
|
|
2
|
+
|
|
3
|
+
A CSS grid framework inspired by [Massimo Vignelli's Unigrid system](https://en.wikipedia.org/wiki/Unigrids) for the National Park Service.
|
|
4
|
+
|
|
5
|
+
Built with **SCSS**, native **CSS Grid**, and **BEM** naming — no dependencies.
|
|
6
|
+
|
|
7
|
+
## Concept
|
|
8
|
+
|
|
9
|
+
The Unigrid is a standardized graphic and production system developed for NPS site folders:
|
|
10
|
+
|
|
11
|
+
- **12-column base grid** with responsive breakpoints
|
|
12
|
+
- **10 basic formats** — A-series (1 panel wide: A1–A4, A6) and B-series (2 panels wide: B1–B4, B6)
|
|
13
|
+
- **Broadside approach** — layouts as flat sheets divided into foldable panels
|
|
14
|
+
- **DIN proportions** (1:√2) — panel unit: 99 × 210 mm, folded size always constant
|
|
15
|
+
- **Helvetica typography** with strict hierarchy
|
|
16
|
+
- **Signature black header band**
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<link rel="stylesheet" href="dist/unigrid.css">
|
|
22
|
+
|
|
23
|
+
<header class="ug-header">
|
|
24
|
+
<div class="ug-header__title">
|
|
25
|
+
<h1>Park Name</h1>
|
|
26
|
+
<p class="ug-header__subtitle">National Park / State</p>
|
|
27
|
+
</div>
|
|
28
|
+
</header>
|
|
29
|
+
|
|
30
|
+
<div class="ug-grid">
|
|
31
|
+
<div class="ug-col--4">One third</div>
|
|
32
|
+
<div class="ug-col--8">Two thirds</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="ug-format ug-format--a4">
|
|
36
|
+
<div class="ug-broadside ug-broadside--stack">
|
|
37
|
+
<section class="ug-panel">Panel 1</section>
|
|
38
|
+
<section class="ug-panel">Panel 2</section>
|
|
39
|
+
<section class="ug-panel">Panel 3</section>
|
|
40
|
+
<section class="ug-panel">Panel 4</section>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Formats
|
|
46
|
+
|
|
47
|
+
| Format | Wide × Long | Panel Size | Description |
|
|
48
|
+
|--------|-------------|------------|-------------|
|
|
49
|
+
| A1 | 1 × 1 | 99 × 210 mm | Single panel |
|
|
50
|
+
| A2 | 1 × 2 | 198 × 210 mm | Letter-fold |
|
|
51
|
+
| A3 | 1 × 3 | 297 × 210 mm | Tri-fold |
|
|
52
|
+
| A4 | 1 × 4 | 396 × 210 mm | Most common NPS format |
|
|
53
|
+
| A6 | 1 × 6 | 594 × 210 mm | Extended folder |
|
|
54
|
+
| B1 | 2 × 1 | 99 × 420 mm | Double-height single |
|
|
55
|
+
| B2 | 2 × 2 | 198 × 420 mm | Double-height bifold |
|
|
56
|
+
| B3 | 2 × 3 | 297 × 420 mm | Double-height trifold |
|
|
57
|
+
| B4 | 2 × 4 | 396 × 420 mm | Double-height quad |
|
|
58
|
+
| B6 | 2 × 6 | 594 × 420 mm | DIN A2 — largest format |
|
|
59
|
+
|
|
60
|
+
## Development
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm install
|
|
64
|
+
npm run dev # Start Vite dev server with hot reload
|
|
65
|
+
npm run build # Build dist/unigrid.css + dist/unigrid.min.css
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The dev server provides pages for testing each component:
|
|
69
|
+
- **Overview** — color palette, quick demo
|
|
70
|
+
- **Grid** — column spans, responsive, alignment
|
|
71
|
+
- **Formats** — all 10 formats with broadside examples
|
|
72
|
+
- **Typography** — headings, body, captions, labels
|
|
73
|
+
- **Components** — header, infobox, map, divider, panels
|
|
74
|
+
- **Cheatsheet** — all CSS classes at a glance
|
|
75
|
+
|
|
76
|
+
## SCSS Customization
|
|
77
|
+
|
|
78
|
+
Override variables before importing:
|
|
79
|
+
|
|
80
|
+
```scss
|
|
81
|
+
$ug-font-family: "Frutiger", sans-serif;
|
|
82
|
+
$ug-black: #222;
|
|
83
|
+
$ug-gap: 1rem;
|
|
84
|
+
@import "unigrid";
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Key variables: `$ug-columns`, `$ug-gap`, `$ug-breakpoints`, `$ug-colors`, `$ug-font-sizes`, `$ug-formats`.
|
|
88
|
+
|
|
89
|
+
## BEM Naming
|
|
90
|
+
|
|
91
|
+
All classes follow BEM (Block__Element--Modifier):
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
.ug-header → Block
|
|
95
|
+
.ug-header__logo → Element
|
|
96
|
+
.ug-header--compact → Modifier
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
MIT
|
package/dist/dropdown.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
(function() {
|
|
3
|
+
function init() {
|
|
4
|
+
document.addEventListener("click", function(e) {
|
|
5
|
+
var trigger = e.target.closest(".ug-dropdown__trigger");
|
|
6
|
+
if (trigger) {
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
}
|
|
9
|
+
document.querySelectorAll(".ug-dropdown--open").forEach(function(dd) {
|
|
10
|
+
if (dd.closest(".docs-example__preview")) return;
|
|
11
|
+
if (!trigger || dd !== trigger.closest(".ug-dropdown")) {
|
|
12
|
+
dd.classList.remove("ug-dropdown--open");
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
if (trigger) {
|
|
16
|
+
var dropdown = trigger.closest(".ug-dropdown");
|
|
17
|
+
if (dropdown) {
|
|
18
|
+
dropdown.classList.toggle("ug-dropdown--open");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
document.addEventListener("keydown", function(e) {
|
|
23
|
+
if (e.key === "Escape") {
|
|
24
|
+
document.querySelectorAll(".ug-dropdown--open").forEach(function(dd) {
|
|
25
|
+
dd.classList.remove("ug-dropdown--open");
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (document.readyState === "loading") {
|
|
31
|
+
document.addEventListener("DOMContentLoaded", init);
|
|
32
|
+
} else {
|
|
33
|
+
init();
|
|
34
|
+
}
|
|
35
|
+
})();
|
|
36
|
+
})();
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
(function() {
|
|
3
|
+
function init() {
|
|
4
|
+
document.querySelectorAll("[data-ug-scrollspy]").forEach(function(nav) {
|
|
5
|
+
var links = nav.querySelectorAll(".ug-scrollspy__link, [data-ug-spy]");
|
|
6
|
+
if (!links.length) return;
|
|
7
|
+
var offset = parseInt(nav.getAttribute("data-ug-scrollspy-offset") || "100", 10);
|
|
8
|
+
var activeClass = nav.getAttribute("data-ug-scrollspy-class") || "ug-scrollspy__link--active";
|
|
9
|
+
var targets = [];
|
|
10
|
+
links.forEach(function(link) {
|
|
11
|
+
var href = link.getAttribute("href");
|
|
12
|
+
if (!href || href.charAt(0) !== "#") return;
|
|
13
|
+
var target = document.querySelector(href);
|
|
14
|
+
if (target) {
|
|
15
|
+
targets.push({ link, target });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
if (!targets.length) return;
|
|
19
|
+
var visibleSections = /* @__PURE__ */ new Set();
|
|
20
|
+
var observer = new IntersectionObserver(function(entries) {
|
|
21
|
+
entries.forEach(function(entry) {
|
|
22
|
+
if (entry.isIntersecting) {
|
|
23
|
+
visibleSections.add(entry.target.id);
|
|
24
|
+
} else {
|
|
25
|
+
visibleSections.delete(entry.target.id);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
var activeId = null;
|
|
29
|
+
for (var i = 0; i < targets.length; i++) {
|
|
30
|
+
if (visibleSections.has(targets[i].target.id)) {
|
|
31
|
+
activeId = targets[i].target.id;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
targets.forEach(function(item) {
|
|
36
|
+
if (item.target.id === activeId) {
|
|
37
|
+
item.link.classList.add(activeClass);
|
|
38
|
+
} else {
|
|
39
|
+
item.link.classList.remove(activeClass);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}, {
|
|
43
|
+
rootMargin: "-" + offset + "px 0px -50% 0px",
|
|
44
|
+
threshold: 0
|
|
45
|
+
});
|
|
46
|
+
targets.forEach(function(item) {
|
|
47
|
+
observer.observe(item.target);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (document.readyState === "loading") {
|
|
52
|
+
document.addEventListener("DOMContentLoaded", init);
|
|
53
|
+
} else {
|
|
54
|
+
init();
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
})();
|
package/dist/tabs.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
(function() {
|
|
3
|
+
function init() {
|
|
4
|
+
document.addEventListener("click", function(e) {
|
|
5
|
+
var link = e.target.closest("[data-ug-tab]");
|
|
6
|
+
if (!link) return;
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
var tabs = link.closest(".ug-tabs");
|
|
9
|
+
if (!tabs) return;
|
|
10
|
+
var target = link.getAttribute("data-ug-tab");
|
|
11
|
+
tabs.querySelectorAll(".ug-tabs__link").forEach(function(l) {
|
|
12
|
+
l.classList.remove("ug-tabs__link--active");
|
|
13
|
+
});
|
|
14
|
+
tabs.querySelectorAll(".ug-tabs__panel").forEach(function(p) {
|
|
15
|
+
p.classList.remove("ug-tabs__panel--active");
|
|
16
|
+
});
|
|
17
|
+
link.classList.add("ug-tabs__link--active");
|
|
18
|
+
var panel = tabs.querySelector('[data-ug-panel="' + target + '"]');
|
|
19
|
+
if (panel) {
|
|
20
|
+
panel.classList.add("ug-tabs__panel--active");
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (document.readyState === "loading") {
|
|
25
|
+
document.addEventListener("DOMContentLoaded", init);
|
|
26
|
+
} else {
|
|
27
|
+
init();
|
|
28
|
+
}
|
|
29
|
+
})();
|
|
30
|
+
})();
|