@24vlh/vds 0.1.0 → 0.1.1

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.
@@ -1,348 +1 @@
1
- /************************************************************
2
- * VLAH DESIGN SYSTEM (VDS) - Header & Footer Framework
3
- *
4
- * Responsibilities:
5
- * - Provide full site chrome: header, navigation, skip-link, footer
6
- * - Define desktop + mobile header behaviour using CSS-only state hooks
7
- * - Establish logo sizing, layout, alignment, and identity integration
8
- * - Structure primary navigation with active, hover, focus-visible,
9
- * disabled, and mobile-collapsed states
10
- * - Supply full footer system: columns, link lists, meta area, and
11
- * inverse-logo treatment
12
- *
13
- * System Notes:
14
- * - Token-driven: colours, radii, borders, spacing, z-index, typography
15
- * - No JS assumptions; the `.header--nav-open` modifier is JS-controlled
16
- * but CSS-complete
17
- * - Respects VDS accessibility requirements: focus-visible, skip-links,
18
- * readable contrast, and responsive layout
19
- ************************************************************/
20
-
21
- /* ---------------------------------------------------------
22
- 1. HEADER & FOOTER TOKEN DEFINITIONS
23
- --------------------------------------------------------- */
24
-
25
- [data-vds-header-footer],
26
- .vds-header-footer {
27
- --header-height: var(--space-16);
28
- --header-logo-height: var(--space-12);
29
- --header-toggle-size: var(--space-6);
30
-
31
- --footer-logo-height: var(--space-8);
32
- --footer-col-min-width: var(--space-40);
33
- }
34
-
35
- /* ---------------------------------------------------------
36
- 2. GLOBAL HEADER CONTAINER
37
- --------------------------------------------------------- */
38
-
39
- .header {
40
- width: 100%;
41
- background-color: var(--color-header-bg);
42
- border-bottom: var(--border-width) solid var(--color-header-border);
43
- position: relative;
44
- z-index: var(--z-header);
45
- }
46
-
47
- .header--sticky {
48
- position: sticky;
49
- top: 0;
50
- }
51
-
52
- .header--elevated {
53
- box-shadow: var(--shadow-1);
54
- }
55
-
56
- .header__inner {
57
- display: flex;
58
- align-items: center;
59
- justify-content: space-between;
60
-
61
- height: var(--header-height);
62
- padding: 0 var(--space-6);
63
-
64
- max-width: var(--layout-max-width);
65
- margin: 0 auto;
66
- }
67
-
68
- /* ---------------------------------------------------------
69
- 3. LOGO HANDLING IN HEADER
70
- --------------------------------------------------------- */
71
-
72
- .header .logo {
73
- display: inline-flex;
74
- align-items: center;
75
- justify-content: center;
76
-
77
- height: 100%;
78
- margin-right: var(--space-6);
79
- padding: 0;
80
- }
81
-
82
- .header .logo svg {
83
- height: var(--header-logo-height);
84
- width: auto;
85
- }
86
-
87
- .header .logo[href]:hover {
88
- opacity: 0.9;
89
- }
90
-
91
- /* ---------------------------------------------------------
92
- 4. PRIMARY NAVIGATION (DESKTOP)
93
- --------------------------------------------------------- */
94
-
95
- .header .nav {
96
- display: flex;
97
- align-items: center;
98
- gap: var(--space-6);
99
- }
100
-
101
- .header .nav__item {
102
- font-size: var(--text-sm);
103
- color: var(--color-text);
104
- padding: var(--space-1) 0;
105
- -webkit-text-decoration: none;
106
- text-decoration: none;
107
- transition: color 0.15s ease;
108
- position: relative;
109
- }
110
-
111
- .header .nav__item:hover {
112
- color: var(--color-text-muted);
113
- }
114
-
115
- .header .nav__item--active {
116
- color: var(--color-text);
117
- font-weight: 600;
118
- }
119
-
120
- .header .nav__item--active::after {
121
- content: "";
122
- position: absolute;
123
- left: 0;
124
- right: 0;
125
- bottom: calc(-1 * var(--space-1));
126
- height: var(--border-width);
127
- background-color: var(--color-accent);
128
- border-radius: var(--radius-pill, var(--radius-md));
129
- }
130
-
131
- .header .nav__item--disabled {
132
- opacity: 0.5;
133
- cursor: default;
134
- pointer-events: none;
135
- }
136
-
137
- .header .nav__item:focus-visible {
138
- outline: var(--border-width) solid var(--focus-ring-color);
139
- outline-offset: var(--space-1);
140
- border-radius: var(--radius-sm);
141
- }
142
-
143
- /* ---------------------------------------------------------
144
- 5. MOBILE NAVIGATION (CSS-ONLY HOOKS)
145
- --------------------------------------------------------- */
146
-
147
- .header .header__toggle {
148
- display: none;
149
- cursor: pointer;
150
- padding: var(--space-2);
151
- color: var(--color-text);
152
- border-radius: var(--radius-sm);
153
- background-color: transparent;
154
- border: none;
155
- }
156
-
157
- .header .header__toggle svg {
158
- stroke: currentColor;
159
- width: var(--header-toggle-size);
160
- height: var(--header-toggle-size);
161
- }
162
-
163
- .header .header__toggle:focus-visible {
164
- outline: var(--border-width) solid var(--focus-ring-color);
165
- outline-offset: var(--space-1);
166
- }
167
-
168
- @media (max-width: 768px) {
169
-
170
- .header .nav {
171
- display: none;
172
- }
173
-
174
- .header .header__toggle {
175
- display: flex;
176
- align-items: center;
177
- justify-content: center;
178
- }
179
-
180
- .header.header--nav-open .nav {
181
- display: flex;
182
- flex-direction: column;
183
- gap: var(--space-4);
184
-
185
- position: absolute;
186
- top: var(--header-height);
187
- right: 0;
188
- width: 100%;
189
-
190
- padding: var(--space-6);
191
- background-color: var(--color-surface);
192
- border-bottom: var(--border-width) solid var(--color-border-subtle);
193
- }
194
-
195
- .header.header--nav-open .nav__item {
196
- padding: var(--space-1) 0;
197
- }
198
- }
199
-
200
- /* ---------------------------------------------------------
201
- 6. SKIP-LINK (ACCESSIBILITY)
202
- --------------------------------------------------------- */
203
-
204
- .header .skip-link {
205
- position: absolute;
206
- left: var(--space-4);
207
- top: var(--space-4);
208
- padding: var(--space-2) var(--space-3);
209
- background-color: var(--color-accent);
210
- color: var(--color-on-accent);
211
- border-radius: var(--radius-sm);
212
- -webkit-text-decoration: none;
213
- text-decoration: none;
214
- transform: translateY(calc(-1 * var(--space-6)));
215
- transition: transform 0.15s ease;
216
- z-index: var(--z-header);
217
- }
218
-
219
- .header .skip-link:focus-visible {
220
- transform: translateY(0);
221
- outline: var(--border-width) solid var(--focus-ring-color);
222
- outline-offset: var(--space-1);
223
- }
224
-
225
- /* ---------------------------------------------------------
226
- 7. GLOBAL FOOTER CONTAINER
227
- --------------------------------------------------------- */
228
-
229
- .footer {
230
- width: 100%;
231
- background-color: var(--color-footer-bg);
232
- color: var(--color-footer-text);
233
-
234
- padding-top: var(--space-10);
235
- padding-bottom: var(--space-10);
236
- border-top: var(--border-width) solid var(--color-border-strong);
237
- }
238
-
239
- .footer__inner {
240
- max-width: var(--layout-max-width);
241
- margin: 0 auto;
242
-
243
- display: flex;
244
- flex-wrap: nowrap;
245
- justify-content: space-between;
246
- align-items: flex-start;
247
-
248
- padding: 0 var(--space-6);
249
- }
250
-
251
- /* ---------------------------------------------------------
252
- 8. FOOTER COLUMN SYSTEM
253
- --------------------------------------------------------- */
254
-
255
- .footer__col {
256
- display: flex;
257
- flex-direction: column;
258
- gap: var(--space-3);
259
- min-width: var(--footer-col-min-width);
260
- }
261
-
262
- .footer__col-title {
263
- font-size: var(--text-sm);
264
- font-weight: 600;
265
- margin-bottom: var(--space-2);
266
- }
267
-
268
- .footer__link {
269
- color: var(--color-footer-text);
270
- font-size: var(--text-sm);
271
- -webkit-text-decoration: none;
272
- text-decoration: none;
273
- opacity: 0.85;
274
- transition: opacity 0.15s ease;
275
- }
276
-
277
- .footer__link:hover {
278
- opacity: 1;
279
- }
280
-
281
- .footer__link:focus-visible {
282
- outline: var(--border-width) solid var(--focus-ring-color);
283
- outline-offset: var(--space-1);
284
- border-radius: var(--radius-sm);
285
- }
286
-
287
- @media (max-width: 768px) {
288
- .footer__inner {
289
- flex-direction: column;
290
- gap: var(--space-10);
291
- }
292
- }
293
-
294
- /* ---------------------------------------------------------
295
- 9. FOOTER LOGO HANDLING
296
- --------------------------------------------------------- */
297
-
298
- .footer .logo {
299
- display: inline-flex;
300
- align-items: center;
301
- justify-content: flex-start;
302
-
303
- padding: 0;
304
- margin-bottom: var(--space-6);
305
- }
306
-
307
- .footer .logo svg {
308
- height: var(--footer-logo-height);
309
- width: auto;
310
- }
311
-
312
- .footer .logo-frame,
313
- .footer .logo-rail {
314
- stroke: var(--color-logo-ink-inverse);
315
- }
316
-
317
- .footer .logo-chevron {
318
- stroke: var(--color-logo-accent-inverse);
319
- }
320
-
321
- /* ---------------------------------------------------------
322
- 10. FOOTER META / COPYRIGHT
323
- --------------------------------------------------------- */
324
-
325
- .footer__meta {
326
- margin-top: var(--space-8);
327
- font-size: var(--text-xs);
328
- opacity: 0.75;
329
- }
330
-
331
- .footer__meta,
332
- .footer__meta p,
333
- .footer__meta a,
334
- .footer__meta span,
335
- .footer__meta small {
336
- color: var(--color-footer-text);
337
- }
338
-
339
- .footer__meta a {
340
- -webkit-text-decoration: none;
341
- text-decoration: none;
342
- }
343
-
344
- .footer__meta a:focus-visible {
345
- outline: var(--border-width) solid var(--focus-ring-color);
346
- outline-offset: var(--space-1);
347
- border-radius: var(--radius-sm);
348
- }
1
+ .vds-header-footer,[data-vds-header-footer]{--header-height:var(--space-16);--header-logo-height:var(--space-12);--header-toggle-size:var(--space-6);--footer-logo-height:var(--space-8);--footer-col-min-width:var(--space-40)}.header{background-color:var(--color-header-bg);border-bottom:var(--border-width) solid var(--color-header-border);position:relative;width:100%;z-index:var(--z-header)}.header--sticky{position:sticky;top:0}.header--elevated{box-shadow:var(--shadow-1)}.header__inner{align-items:center;display:flex;height:var(--header-height);justify-content:space-between;margin:0 auto;max-width:var(--layout-max-width);padding:0 var(--space-6)}.header .logo{align-items:center;display:inline-flex;height:100%;justify-content:center;margin-right:var(--space-6);padding:0}.header .logo svg{height:var(--header-logo-height);width:auto}.header .logo[href]:hover{opacity:.9}.header .nav{align-items:center;display:flex;gap:var(--space-6)}.header .nav__item{color:var(--color-text);font-size:var(--text-sm);padding:var(--space-1) 0;position:relative;-webkit-text-decoration:none;text-decoration:none;transition:color .15s ease}.header .nav__item:hover{color:var(--color-text-muted)}.header .nav__item--active{color:var(--color-text);font-weight:600}.header .nav__item--active:after{background-color:var(--color-accent);border-radius:var(--radius-pill,var(--radius-md));bottom:calc(var(--space-1)*-1);content:"";height:var(--border-width);left:0;position:absolute;right:0}.header .nav__item--disabled{cursor:default;opacity:.5;pointer-events:none}.header .nav__item:focus-visible{border-radius:var(--radius-sm);outline:var(--border-width) solid var(--focus-ring-color);outline-offset:var(--space-1)}.header .header__toggle{background-color:transparent;border:none;border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;display:none;padding:var(--space-2)}.header .header__toggle svg{stroke:currentColor;height:var(--header-toggle-size);width:var(--header-toggle-size)}.header .header__toggle:focus-visible{outline:var(--border-width) solid var(--focus-ring-color);outline-offset:var(--space-1)}@media (max-width:768px){.header .nav{display:none}.header .header__toggle{align-items:center;display:flex;justify-content:center}.header.header--nav-open .nav{background-color:var(--color-surface);border-bottom:var(--border-width) solid var(--color-border-subtle);display:flex;flex-direction:column;gap:var(--space-4);padding:var(--space-6);position:absolute;right:0;top:var(--header-height);width:100%}.header.header--nav-open .nav__item{padding:var(--space-1) 0}}.header .skip-link{background-color:var(--color-accent);border-radius:var(--radius-sm);color:var(--color-on-accent);left:var(--space-4);padding:var(--space-2) var(--space-3);position:absolute;-webkit-text-decoration:none;text-decoration:none;top:var(--space-4);transform:translateY(calc(var(--space-6)*-1));transition:transform .15s ease;z-index:var(--z-header)}.header .skip-link:focus-visible{outline:var(--border-width) solid var(--focus-ring-color);outline-offset:var(--space-1);transform:translateY(0)}.footer{background-color:var(--color-footer-bg);border-top:var(--border-width) solid var(--color-border-strong);color:var(--color-footer-text);padding-bottom:var(--space-10);padding-top:var(--space-10);width:100%}.footer__inner{align-items:flex-start;display:flex;flex-wrap:nowrap;justify-content:space-between;margin:0 auto;max-width:var(--layout-max-width);padding:0 var(--space-6)}.footer__col{display:flex;flex-direction:column;gap:var(--space-3);min-width:var(--footer-col-min-width)}.footer__col-title{font-size:var(--text-sm);font-weight:600;margin-bottom:var(--space-2)}.footer__link{color:var(--color-footer-text);font-size:var(--text-sm);opacity:.85;-webkit-text-decoration:none;text-decoration:none;transition:opacity .15s ease}.footer__link:hover{opacity:1}.footer__link:focus-visible{border-radius:var(--radius-sm);outline:var(--border-width) solid var(--focus-ring-color);outline-offset:var(--space-1)}@media (max-width:768px){.footer__inner{flex-direction:column;gap:var(--space-10)}}.footer .logo{align-items:center;display:inline-flex;justify-content:flex-start;margin-bottom:var(--space-6);padding:0}.footer .logo svg{height:var(--footer-logo-height);width:auto}.footer .logo-frame,.footer .logo-rail{stroke:var(--color-logo-ink-inverse)}.footer .logo-chevron{stroke:var(--color-logo-accent-inverse)}.footer__meta{font-size:var(--text-xs);margin-top:var(--space-8);opacity:.75}.footer__meta,.footer__meta a,.footer__meta p,.footer__meta small,.footer__meta span{color:var(--color-footer-text)}.footer__meta a{-webkit-text-decoration:none;text-decoration:none}.footer__meta a:focus-visible{border-radius:var(--radius-sm);outline:var(--border-width) solid var(--focus-ring-color);outline-offset:var(--space-1)}