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.
Files changed (42) hide show
  1. package/README.md +101 -0
  2. package/dist/dropdown.js +36 -0
  3. package/dist/index.js +5 -0
  4. package/dist/scrollspy.js +57 -0
  5. package/dist/tabs.js +30 -0
  6. package/dist/unigrid.css +4501 -0
  7. package/dist/unigrid.js +124 -0
  8. package/dist/unigrid.min.css +1 -0
  9. package/dist/unigrid.min.js +1 -0
  10. package/package.json +41 -0
  11. package/src/js/dropdown.js +49 -0
  12. package/src/js/index.js +19 -0
  13. package/src/js/scrollspy.js +87 -0
  14. package/src/js/tabs.js +58 -0
  15. package/src/scss/_accordion.scss +123 -0
  16. package/src/scss/_broadside.scss +125 -0
  17. package/src/scss/_buttons.scss +241 -0
  18. package/src/scss/_card.scss +168 -0
  19. package/src/scss/_components.scss +140 -0
  20. package/src/scss/_container.scss +54 -0
  21. package/src/scss/_dropdown.scss +178 -0
  22. package/src/scss/_footer.scss +147 -0
  23. package/src/scss/_formats.scss +64 -0
  24. package/src/scss/_forms.scss +192 -0
  25. package/src/scss/_grid.scss +114 -0
  26. package/src/scss/_header.scss +169 -0
  27. package/src/scss/_hero.scss +262 -0
  28. package/src/scss/_mixins.scss +120 -0
  29. package/src/scss/_modules.scss +238 -0
  30. package/src/scss/_navbar.scss +341 -0
  31. package/src/scss/_pagination.scss +160 -0
  32. package/src/scss/_prose.scss +393 -0
  33. package/src/scss/_reset.scss +82 -0
  34. package/src/scss/_scrollspy.scss +62 -0
  35. package/src/scss/_section.scss +91 -0
  36. package/src/scss/_sidebar.scss +147 -0
  37. package/src/scss/_table.scss +122 -0
  38. package/src/scss/_tabs.scss +178 -0
  39. package/src/scss/_typography.scss +105 -0
  40. package/src/scss/_utilities.scss +79 -0
  41. package/src/scss/_variables.scss +183 -0
  42. package/src/scss/unigrid.scss +49 -0
@@ -0,0 +1,341 @@
1
+ // ==========================================================================
2
+ // Unigrid CSS Framework — Navbar (BEM)
3
+ //
4
+ // Block: .ug-navbar
5
+ // Elements: __inner, __brand, __toggle, __menu, __item, __link, __divider
6
+ // Modifiers: --dark, --fixed, --transparent
7
+ // __toggle--hamburger (icon variant)
8
+ // __menu--open (JS-toggled)
9
+ // ==========================================================================
10
+
11
+ @use "variables" as *;
12
+ @use "mixins" as *;
13
+
14
+ .ug-navbar {
15
+ width: 100%;
16
+ background-color: $ug-white;
17
+ border-bottom: 1px solid $ug-light-gray;
18
+ position: relative;
19
+ z-index: 50;
20
+
21
+ // -- Inner container --
22
+ &__inner {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ max-width: 1280px;
27
+ margin: 0 auto;
28
+ padding: 0 var(--ug-leading);
29
+ height: calc(var(--ug-leading) * 2 - 1px);
30
+ }
31
+
32
+ // -- Brand --
33
+ &__brand {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: calc(var(--ug-leading) * 0.5);
37
+ @include ug-font-size("sm");
38
+ @include ug-font-weight("bold");
39
+ text-decoration: none;
40
+ color: inherit;
41
+ flex-shrink: 0;
42
+ }
43
+
44
+ // -- Toggle Button (mobile only) --
45
+ // Default: outline button with "Menu" / "Close" text
46
+ &__toggle {
47
+ display: none;
48
+ align-items: center;
49
+ justify-content: center;
50
+ cursor: pointer;
51
+ background: none;
52
+ border: 1px solid currentColor;
53
+ padding: 0 calc(var(--ug-leading) * 0.75);
54
+ height: calc(var(--ug-leading) * 1.5);
55
+ margin-top: calc(var(--ug-leading) * 0.5);
56
+ color: inherit;
57
+ @include ug-font-size("sm");
58
+ @include ug-font-weight("bold");
59
+ letter-spacing: 0.05em;
60
+ font-family: inherit;
61
+ transition: background-color 0.15s, color 0.15s;
62
+ z-index: $ug-navbar-toggle-z-index;
63
+
64
+ &:hover {
65
+ background-color: rgba(255, 255, 255, 0.1);
66
+ }
67
+
68
+ // "Close" text hidden by default, shown when menu is open
69
+ &__close {
70
+ display: none;
71
+ }
72
+
73
+ &__label {
74
+ display: inline;
75
+ }
76
+
77
+ @include ug-breakpoint-down("md") {
78
+ display: inline-flex;
79
+ }
80
+ }
81
+
82
+ // When menu is open, swap text
83
+ &__toggle--active {
84
+ .ug-navbar__toggle__label {
85
+ display: none;
86
+ }
87
+ .ug-navbar__toggle__close {
88
+ display: inline;
89
+ }
90
+ }
91
+
92
+ // -- Hamburger variant --
93
+ // Use: .ug-navbar__toggle.ug-navbar__toggle--hamburger
94
+ &__toggle--hamburger {
95
+ border: 1px solid currentColor;
96
+ padding: 0;
97
+ margin-top: calc(var(--ug-leading) * 0.5);
98
+ margin-right: 0;
99
+ flex-direction: column;
100
+ gap: 0;
101
+ width: calc(var(--ug-leading) * 1.5);
102
+ height: calc(var(--ug-leading) * 1.5);
103
+
104
+ &:hover {
105
+ background-color: rgba(255, 255, 255, 0.1);
106
+ }
107
+
108
+ span {
109
+ display: block;
110
+ width: 1.125rem;
111
+ height: 2px;
112
+ background-color: currentColor;
113
+ transition: transform 0.3s, opacity 0.3s;
114
+
115
+ &:nth-child(2) {
116
+ margin-top: 5px;
117
+ }
118
+
119
+ &:nth-child(3) {
120
+ margin-top: 5px;
121
+ }
122
+ }
123
+
124
+ // X transformation when active
125
+ &.ug-navbar__toggle--active {
126
+ span:nth-child(1) {
127
+ transform: translateY(7px) rotate(45deg);
128
+ }
129
+
130
+ span:nth-child(2) {
131
+ opacity: 0;
132
+ }
133
+
134
+ span:nth-child(3) {
135
+ transform: translateY(-7px) rotate(-45deg);
136
+ }
137
+ }
138
+ }
139
+
140
+ // -- Menu --
141
+ &__menu {
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 0;
145
+ list-style: none;
146
+ margin: 0;
147
+ padding: 0;
148
+
149
+ // Mobile: full-screen overlay below navbar
150
+ @include ug-breakpoint-down("md") {
151
+ display: none;
152
+ flex-direction: column;
153
+ align-items: stretch;
154
+ position: fixed;
155
+ top: 0;
156
+ left: 0;
157
+ right: 0;
158
+ bottom: 0;
159
+ background-color: $ug-black;
160
+ color: $ug-white;
161
+ padding: calc(var(--ug-leading) * 4) 0 var(--ug-leading) 0;
162
+ overflow-y: auto;
163
+ z-index: 99;
164
+
165
+ &--open {
166
+ display: flex;
167
+ }
168
+ }
169
+ }
170
+
171
+ // -- Menu Item --
172
+ &__item {
173
+ display: flex;
174
+ align-items: center;
175
+ }
176
+
177
+ // -- Link --
178
+ &__link {
179
+ display: inline-flex;
180
+ align-items: center;
181
+ height: 100%;
182
+ padding: 0 calc(var(--ug-leading) * 0.5);
183
+ @include ug-font-size("base");
184
+ @include ug-font-weight("light");
185
+ color: $ug-dark-gray;
186
+ text-decoration: none;
187
+ white-space: nowrap;
188
+ transition: color 0.15s, background-color 0.15s;
189
+
190
+ &:hover {
191
+ color: $ug-black;
192
+ background-color: $ug-warm-gray;
193
+ }
194
+
195
+ &--active {
196
+ color: $ug-black;
197
+ }
198
+
199
+ @include ug-breakpoint-down("md") {
200
+ display: flex;
201
+ align-items: center;
202
+ height: calc(var(--ug-leading) * 2);
203
+ padding: 0 calc(var(--ug-leading) * 1.5);
204
+ @include ug-font-size("lg");
205
+ color: rgba(255, 255, 255, 0.7);
206
+
207
+ &:hover {
208
+ color: $ug-white;
209
+ background-color: rgba(255, 255, 255, 0.05);
210
+ }
211
+
212
+ &--active {
213
+ color: $ug-white;
214
+ }
215
+ }
216
+ }
217
+
218
+ // -- Divider --
219
+ &__divider {
220
+ width: 1px;
221
+ height: var(--ug-leading);
222
+ background-color: $ug-light-gray;
223
+ margin: 0 calc(var(--ug-leading) * 0.25);
224
+
225
+ @include ug-breakpoint-down("md") {
226
+ width: auto;
227
+ height: 1px;
228
+ margin: calc(var(--ug-leading) * 0.25) calc(var(--ug-leading) * 1.5);
229
+ background-color: rgba(255, 255, 255, 0.15);
230
+ }
231
+ }
232
+
233
+ // -- Dropdown: flat in mobile menu --
234
+ @include ug-breakpoint-down("md") {
235
+ .ug-dropdown {
236
+ flex-direction: column;
237
+ align-items: stretch;
238
+ }
239
+
240
+ // Always show dropdown menu items inline (no popup)
241
+ .ug-dropdown__menu {
242
+ position: static;
243
+ display: flex;
244
+ flex-direction: column;
245
+ background: none;
246
+ border: none;
247
+ box-shadow: none;
248
+ padding: 0;
249
+ min-width: 0;
250
+ }
251
+
252
+ // Indent dropdown links
253
+ .ug-dropdown__link {
254
+ display: flex;
255
+ align-items: center;
256
+ height: calc(var(--ug-leading) * 2);
257
+ padding: 0 calc(var(--ug-leading) * 2.5);
258
+ @include ug-font-size("base");
259
+ color: rgba(255, 255, 255, 0.5);
260
+ text-decoration: none;
261
+
262
+ &:hover {
263
+ color: $ug-white;
264
+ background-color: rgba(255, 255, 255, 0.05);
265
+ }
266
+ }
267
+
268
+ // Hide caret in mobile
269
+ .ug-dropdown__caret {
270
+ display: none;
271
+ }
272
+
273
+ // Hide dropdown dividers/headers or style them flat
274
+ .ug-dropdown__divider {
275
+ height: 1px;
276
+ background-color: rgba(255, 255, 255, 0.1);
277
+ margin: calc(var(--ug-leading) * 0.25) calc(var(--ug-leading) * 2.5);
278
+ }
279
+
280
+ .ug-dropdown__header {
281
+ padding: 0 calc(var(--ug-leading) * 2.5);
282
+ color: rgba(255, 255, 255, 0.3);
283
+ }
284
+ }
285
+
286
+ // ==============================
287
+ // Modifiers
288
+ // ==============================
289
+
290
+ // -- Dark --
291
+ &--dark {
292
+ background-color: $ug-black;
293
+ border-bottom-color: rgba(255, 255, 255, 0.1);
294
+
295
+ .ug-navbar__link {
296
+ color: rgba(255, 255, 255, 0.7);
297
+ &:hover { color: $ug-white; background-color: rgba(255, 255, 255, 0.1); }
298
+ &--active { color: $ug-white; }
299
+ }
300
+
301
+ .ug-navbar__brand { color: $ug-white; }
302
+ .ug-navbar__toggle { color: $ug-white; }
303
+ .ug-navbar__divider { background-color: rgba(255, 255, 255, 0.15); }
304
+
305
+ .ug-navbar__menu {
306
+ @include ug-breakpoint-down("md") {
307
+ background-color: $ug-black;
308
+ border-bottom-color: rgba(255, 255, 255, 0.1);
309
+ }
310
+ }
311
+ }
312
+
313
+ // -- Fixed --
314
+ &--fixed {
315
+ position: fixed;
316
+ top: 0;
317
+ left: 0;
318
+ right: 0;
319
+ }
320
+
321
+ // -- Transparent --
322
+ &--transparent {
323
+ background-color: transparent;
324
+ border-bottom-color: transparent;
325
+
326
+ .ug-navbar__link {
327
+ color: rgba(255, 255, 255, 0.8);
328
+ &:hover { color: $ug-white; background-color: rgba(255, 255, 255, 0.1); }
329
+ &--active { color: $ug-white; }
330
+ }
331
+
332
+ .ug-navbar__brand { color: $ug-white; }
333
+ .ug-navbar__toggle { color: $ug-white; }
334
+
335
+ .ug-navbar__menu {
336
+ @include ug-breakpoint-down("md") {
337
+ background-color: $ug-black;
338
+ }
339
+ }
340
+ }
341
+ }
@@ -0,0 +1,160 @@
1
+ // ==========================================================================
2
+ // Unigrid CSS Framework — Pagination (BEM)
3
+ //
4
+ // Inspired by GOV.UK Design System pagination.
5
+ // Two variants: block-level (prev/next with labels) and numbered list.
6
+ //
7
+ // Block: .ug-pagination
8
+ // Elements: __prev, __next, __label, __title, __list, __item, __link,
9
+ // __ellipsis, __arrow
10
+ // Modifiers: --block
11
+ // __item--current, __item--ellipsis
12
+ // ==========================================================================
13
+
14
+ @use "variables" as *;
15
+ @use "mixins" as *;
16
+
17
+ .ug-pagination {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ gap: 0;
22
+ @include ug-rhythm-margin-top(1);
23
+ @include ug-rhythm-margin-bottom(1);
24
+
25
+ // ==============================
26
+ // Numbered Pagination
27
+ // ==============================
28
+
29
+ &__list {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 0;
33
+ list-style: none;
34
+ margin: 0;
35
+ padding: 0;
36
+ }
37
+
38
+ &__item {
39
+ display: flex;
40
+ }
41
+
42
+ &__link {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ min-width: calc(var(--ug-leading) * 1.5);
47
+ height: calc(var(--ug-leading) * 1.5);
48
+ padding: 0 calc(var(--ug-leading) * 0.25);
49
+ @include ug-font-size("base");
50
+ @include ug-font-weight("regular");
51
+ color: $ug-black;
52
+ text-decoration: none;
53
+ border-bottom: 2px solid transparent;
54
+ transition: border-color 0.15s, color 0.15s;
55
+
56
+ &:hover {
57
+ border-bottom-color: $ug-black;
58
+ }
59
+ }
60
+
61
+ // Current page
62
+ &__item--current &__link {
63
+ @include ug-font-weight("bold");
64
+ border-bottom-color: $ug-black;
65
+ }
66
+
67
+ // Ellipsis
68
+ &__ellipsis {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ min-width: calc(var(--ug-leading) * 1.5);
73
+ height: calc(var(--ug-leading) * 1.5);
74
+ @include ug-font-size("base");
75
+ color: $ug-medium-gray;
76
+ }
77
+
78
+ // Arrow icons (prev/next in numbered mode)
79
+ &__arrow {
80
+ display: inline-flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ min-width: calc(var(--ug-leading) * 1.5);
84
+ height: calc(var(--ug-leading) * 1.5);
85
+ @include ug-font-size("base");
86
+ color: $ug-black;
87
+ text-decoration: none;
88
+ transition: color 0.15s;
89
+
90
+ &:hover {
91
+ color: $ug-medium-gray;
92
+ }
93
+
94
+ // Disabled arrow
95
+ &--disabled {
96
+ color: $ug-light-gray;
97
+ pointer-events: none;
98
+ }
99
+
100
+ // SVG/icon inside
101
+ svg {
102
+ width: 0.75em;
103
+ height: 0.75em;
104
+ }
105
+ }
106
+
107
+ // ==============================
108
+ // Block Pagination (prev/next)
109
+ // ==============================
110
+
111
+ &--block {
112
+ flex-direction: column;
113
+ gap: var(--ug-leading);
114
+ align-items: stretch;
115
+
116
+ @include ug-breakpoint("md") {
117
+ flex-direction: row;
118
+ justify-content: space-between;
119
+ }
120
+ }
121
+
122
+ &__prev,
123
+ &__next {
124
+ display: flex;
125
+ flex-direction: column;
126
+ padding: var(--ug-leading);
127
+ text-decoration: none;
128
+ color: $ug-black;
129
+ border: 1px solid $ug-light-gray;
130
+ transition: border-color 0.15s, background-color 0.15s;
131
+ flex: 1;
132
+
133
+ &:hover {
134
+ border-color: $ug-black;
135
+ background-color: $ug-warm-gray;
136
+ }
137
+ }
138
+
139
+ &__next {
140
+ text-align: right;
141
+ align-items: flex-end;
142
+ }
143
+
144
+ &__label {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: calc(var(--ug-leading) * 0.25);
148
+ @include ug-font-size("sm");
149
+ @include ug-rhythm-line-height(1);
150
+ @include ug-font-weight("regular");
151
+ color: $ug-medium-gray;
152
+ @include ug-rhythm-margin-bottom(0.5);
153
+ }
154
+
155
+ &__title {
156
+ @include ug-font-size("lg");
157
+ @include ug-rhythm-line-height(1);
158
+ @include ug-font-weight("bold");
159
+ }
160
+ }