weg-shared-layout 0.0.14 → 0.0.16

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 (50) hide show
  1. package/dist/cjs/{index-CmiaQ_Dj.js → index-CC8e1qRm.js} +112 -0
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/my-component.cjs.entry.js +1 -1
  4. package/dist/cjs/weg-footer_2.cjs.entry.js +438 -0
  5. package/dist/cjs/weg-shared-layout.cjs.js +2 -2
  6. package/dist/collection/collection-manifest.json +2 -1
  7. package/dist/collection/components/weg-footer/weg-footer.css +1 -24
  8. package/dist/collection/components/weg-footer/weg-footer.js +5 -40
  9. package/dist/collection/components/weg-header/logo-data.js +2 -0
  10. package/dist/collection/components/weg-header/weg-header.cmp.test.js +77 -0
  11. package/dist/collection/components/weg-header/weg-header.css +327 -0
  12. package/dist/collection/components/weg-header/weg-header.js +344 -0
  13. package/dist/collection/styles/shared.css +49 -0
  14. package/dist/collection/utils/layout.js +33 -0
  15. package/dist/collection/utils/layout.unit.test.js +36 -0
  16. package/dist/components/index.js +1 -1
  17. package/dist/components/my-component.js +1 -1
  18. package/dist/components/p-CtYuWNO6.js +1 -0
  19. package/dist/components/p-DbIEJ3IT.js +1 -0
  20. package/dist/components/weg-footer.js +1 -1
  21. package/dist/components/weg-header.d.ts +11 -0
  22. package/dist/components/weg-header.js +1 -0
  23. package/dist/esm/{index-QiJxC4Ow.js → index-D8pmhPiH.js} +111 -1
  24. package/dist/esm/loader.js +3 -3
  25. package/dist/esm/my-component.entry.js +1 -1
  26. package/dist/esm/weg-footer_2.entry.js +435 -0
  27. package/dist/esm/weg-shared-layout.js +3 -3
  28. package/dist/types/components/weg-header/logo-data.d.ts +2 -0
  29. package/dist/types/components/weg-header/weg-header.cmp.test.d.ts +1 -0
  30. package/dist/types/components/weg-header/weg-header.d.ts +56 -0
  31. package/dist/types/components.d.ts +56 -2
  32. package/dist/types/types/layout-data.d.ts +21 -4
  33. package/dist/types/utils/layout.d.ts +4 -0
  34. package/dist/types/utils/layout.unit.test.d.ts +1 -0
  35. package/dist/weg-shared-layout/p-D8pmhPiH.js +2 -0
  36. package/dist/weg-shared-layout/{p-d1addb13.entry.js → p-d61033bd.entry.js} +1 -1
  37. package/dist/weg-shared-layout/p-eaf953a4.entry.js +1 -0
  38. package/dist/weg-shared-layout/weg-shared-layout.esm.js +1 -1
  39. package/docs/angular.md +66 -18
  40. package/docs/nextjs.md +145 -111
  41. package/docs/react.md +123 -59
  42. package/docs/vanilla.md +99 -3
  43. package/package.json +5 -1
  44. package/readme.md +29 -3
  45. package/src/assets/dummy-data.json +41 -1
  46. package/dist/cjs/weg-footer.cjs.entry.js +0 -189
  47. package/dist/components/p-BTQYW5OR.js +0 -1
  48. package/dist/esm/weg-footer.entry.js +0 -187
  49. package/dist/weg-shared-layout/p-0c28f34f.entry.js +0 -1
  50. package/dist/weg-shared-layout/p-QiJxC4Ow.js +0 -2
@@ -1,29 +1,14 @@
1
1
  import { h } from "@stencil/core";
2
+ import { isNonEmptyString, normalizeLinks, parseJsonProp } from "../../utils/layout";
2
3
  const EMPTY_FOOTER = {
3
4
  social: [],
4
5
  columns: [],
5
6
  credits: '',
6
7
  copyright: '',
7
8
  };
8
- function parseJsonProp(value) {
9
- if (typeof value !== 'string')
10
- return value;
11
- const trimmed = value.trim();
12
- if (!trimmed)
13
- return undefined;
14
- try {
15
- return JSON.parse(trimmed);
16
- }
17
- catch {
18
- return undefined;
19
- }
20
- }
21
9
  function isExternalHref(href) {
22
10
  return /^https?:\/\//.test(href);
23
11
  }
24
- function isNonEmptyString(value) {
25
- return typeof value === 'string' && value.trim().length > 0;
26
- }
27
12
  function isValidSocialPlatform(value) {
28
13
  return value === 'LinkedIn' || value === 'Instagram' || value === 'TikTok' || value === 'YouTube';
29
14
  }
@@ -44,26 +29,6 @@ function normalizeSocialLinks(input) {
44
29
  }
45
30
  return result;
46
31
  }
47
- function normalizeLinks(input) {
48
- if (!Array.isArray(input))
49
- return [];
50
- const result = [];
51
- for (const item of input) {
52
- if (!item || typeof item !== 'object')
53
- continue;
54
- const label = item.label;
55
- const href = item.href;
56
- if (!isNonEmptyString(label))
57
- continue;
58
- if (!isNonEmptyString(href))
59
- continue;
60
- result.push({
61
- label: label.trim(),
62
- href: href.trim(),
63
- });
64
- }
65
- return result;
66
- }
67
32
  function normalizeColumns(input) {
68
33
  if (!Array.isArray(input))
69
34
  return [];
@@ -168,18 +133,18 @@ export class WegFooter {
168
133
  return (h("div", { class: "columns" }, columns.map((column, columnIndex) => (h("div", { class: "columns__col", key: columnIndex }, columnIndex > 0 ? h("div", { class: "columns__divider", "aria-hidden": "true" }) : null, h("nav", { class: "columns__links", "aria-label": `Footer links column ${columnIndex + 1}` }, column.links.map((l, linkIndex) => (h("a", { class: "footer-link", href: l.href, key: linkIndex, target: linkOpensNewTab(l) ? '_blank' : undefined, rel: linkOpensNewTab(l) ? 'noreferrer noopener' : undefined }, l.label)))))))));
169
134
  }
170
135
  render() {
171
- return (h("footer", { key: '6aea0fd57f4ce816f31975b4b62638000370f0f0', class: "footer" }, h("div", { key: '56a87925be4d1c19cd1020224297c135368d17b1', class: "container" }, this.renderSocialLinks(), h("div", { key: 'c3e8c38bf81ea81326d74b0fdd66421eb397a300', class: "standard" }, this.renderColumns(), this.renderLegalText()))));
136
+ return (h("footer", { key: 'f592a5632d0b39833ac01384f8541082afc36c6b', class: "footer" }, h("div", { key: 'dca05ec8f8eb48beef27e20305865156b2d2122a', class: "container container--stack" }, this.renderSocialLinks(), h("div", { key: '0d73dd8a28f2839e00f4dc23daa0219ac6d83662', class: "standard" }, this.renderColumns(), this.renderLegalText()))));
172
137
  }
173
138
  static get is() { return "weg-footer"; }
174
139
  static get encapsulation() { return "shadow"; }
175
140
  static get originalStyleUrls() {
176
141
  return {
177
- "$": ["weg-footer.css"]
142
+ "$": ["../../styles/shared.css", "weg-footer.css"]
178
143
  };
179
144
  }
180
145
  static get styleUrls() {
181
146
  return {
182
- "$": ["weg-footer.css"]
147
+ "$": ["../../styles/shared.css", "weg-footer.css"]
183
148
  };
184
149
  }
185
150
  static get properties() {
@@ -189,7 +154,7 @@ export class WegFooter {
189
154
  "mutable": false,
190
155
  "complexType": {
191
156
  "original": "LayoutData | string",
192
- "resolved": "string | { header?: unknown; footer?: Partial<{ social: unknown; columns: unknown; credits: unknown; copyright: unknown; }>; }",
157
+ "resolved": "string | { header?: Partial<LayoutHeaderData>; footer?: Partial<{ social: unknown; columns: unknown; credits: unknown; copyright: unknown; }>; }",
193
158
  "references": {
194
159
  "LayoutData": {
195
160
  "location": "import",
@@ -0,0 +1,2 @@
1
+ /** WEG logo — inlined from logo.svg (not configurable). */
2
+ export const LOGO_SRC = "data:image/png;base64,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";
@@ -0,0 +1,77 @@
1
+ import { render, h, describe, it, expect } from "@stencil/vitest";
2
+ const SAMPLE_HEADER_LAYOUT = {
3
+ header: {
4
+ dropdowns: [
5
+ {
6
+ label: 'Find a job',
7
+ items: [{ label: 'Graduates', href: '/search?category=graduates' }],
8
+ },
9
+ ],
10
+ links: [{ label: 'Career advice', href: '/career-advice' }],
11
+ signIn: { label: 'Sign in', href: '/account/login' },
12
+ signOut: { label: 'Sign out' },
13
+ },
14
+ };
15
+ describe('weg-header', () => {
16
+ it('renders safely when layout is undefined', async () => {
17
+ const { root } = await render(h("weg-header", null));
18
+ expect(root).toBeTruthy();
19
+ const header = root.shadowRoot?.querySelector('.header');
20
+ expect(header).toBeTruthy();
21
+ });
22
+ it('parses JSON string layout prop', async () => {
23
+ const { root } = await render(h("weg-header", { layout: JSON.stringify(SAMPLE_HEADER_LAYOUT) }));
24
+ const text = root.shadowRoot?.textContent ?? '';
25
+ expect(text).toContain('Find a job');
26
+ expect(text).toContain('Career advice');
27
+ expect(text).toContain('Sign in');
28
+ });
29
+ it('renders dropdown labels and flat links from layout object', async () => {
30
+ const { root } = await render(h("weg-header", { layout: SAMPLE_HEADER_LAYOUT }));
31
+ const text = root.shadowRoot?.textContent ?? '';
32
+ expect(text).toContain('Find a job');
33
+ expect(text).toContain('Career advice');
34
+ });
35
+ it('shows Sign out when signed-in is true', async () => {
36
+ const { root } = await render(h("weg-header", { layout: SAMPLE_HEADER_LAYOUT, "signed-in": true }));
37
+ const text = root.shadowRoot?.textContent ?? '';
38
+ expect(text).toContain('Sign out');
39
+ expect(text).not.toContain('Sign in');
40
+ });
41
+ it('emits wegAuthClick when auth control is clicked', async () => {
42
+ const { root } = await render(h("weg-header", { layout: SAMPLE_HEADER_LAYOUT }));
43
+ let detail;
44
+ root.addEventListener('wegAuthClick', ((event) => {
45
+ detail = event.detail;
46
+ event.preventDefault();
47
+ }));
48
+ const authLink = root.shadowRoot?.querySelector('.desktop .sign-in-link');
49
+ expect(authLink).toBeTruthy();
50
+ authLink?.click();
51
+ expect(detail).toEqual({ action: 'sign-in' });
52
+ });
53
+ it('emits sign-out action when signed in', async () => {
54
+ const { root } = await render(h("weg-header", { layout: SAMPLE_HEADER_LAYOUT, "signed-in": true }));
55
+ let detail;
56
+ root.addEventListener('wegAuthClick', ((event) => {
57
+ detail = event.detail;
58
+ event.preventDefault();
59
+ }));
60
+ const authButton = root.shadowRoot?.querySelector('.desktop .auth-button');
61
+ expect(authButton).toBeTruthy();
62
+ authButton?.click();
63
+ expect(detail).toEqual({ action: 'sign-out' });
64
+ });
65
+ it('toggles mobile accordion aria-expanded', async () => {
66
+ const { root } = await render(h("weg-header", { layout: SAMPLE_HEADER_LAYOUT }));
67
+ const openButton = root.shadowRoot?.querySelector('.mobile .icon-button');
68
+ expect(openButton).toBeTruthy();
69
+ openButton?.click();
70
+ await new Promise((r) => setTimeout(r, 0));
71
+ const accordionButton = root.shadowRoot?.querySelector('.mobile-nav__row');
72
+ expect(accordionButton?.getAttribute('aria-expanded')).toBe('false');
73
+ accordionButton?.click();
74
+ await new Promise((r) => setTimeout(r, 0));
75
+ expect(accordionButton?.getAttribute('aria-expanded')).toBe('true');
76
+ });
77
+ });
@@ -0,0 +1,327 @@
1
+ .header {
2
+ width: 100%;
3
+ border-bottom: 2px solid var(--weg-color-accent);
4
+ background: #ffffff;
5
+ color: #0f172a;
6
+ font-family: var(--weg-font-family);
7
+ }
8
+
9
+ @media (min-width: 768px) {
10
+ .header {
11
+ border-bottom-width: 4px;
12
+ }
13
+ }
14
+
15
+ .logo-link {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ text-decoration: none;
19
+ outline: none;
20
+ }
21
+
22
+ .logo-link:focus-visible {
23
+ outline: 2px solid var(--weg-color-accent);
24
+ outline-offset: 4px;
25
+ border-radius: 4px;
26
+ }
27
+
28
+ .logo {
29
+ height: 40px;
30
+ width: auto;
31
+ }
32
+
33
+ @media (min-width: 768px) {
34
+ .logo {
35
+ height: 80px;
36
+ }
37
+ }
38
+
39
+ /* Desktop */
40
+ .desktop {
41
+ display: none;
42
+ }
43
+
44
+ @media (min-width: 768px) {
45
+ .desktop {
46
+ display: flex;
47
+ width: 100%;
48
+ align-items: center;
49
+ justify-content: space-between;
50
+ gap: 24px;
51
+ }
52
+ }
53
+
54
+ .desktop-nav {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: flex-end;
58
+ flex-wrap: wrap;
59
+ gap: 16px;
60
+ }
61
+
62
+ .desktop-nav__list {
63
+ display: flex;
64
+ align-items: center;
65
+ flex-wrap: wrap;
66
+ gap: 16px;
67
+ list-style: none;
68
+ margin: 0;
69
+ padding: 0;
70
+ }
71
+
72
+ .desktop-nav__item {
73
+ position: relative;
74
+ }
75
+
76
+ .nav-link {
77
+ font-weight: 600;
78
+ color: inherit;
79
+ text-decoration: none;
80
+ outline: none;
81
+ }
82
+
83
+ .nav-link:hover {
84
+ opacity: 0.85;
85
+ }
86
+
87
+ .nav-link:focus-visible {
88
+ outline: 2px solid var(--weg-color-accent);
89
+ outline-offset: 4px;
90
+ border-radius: 4px;
91
+ }
92
+
93
+ .dropdown-trigger {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ gap: 8px;
97
+ padding: 8px 12px;
98
+ border: none;
99
+ border-radius: 8px;
100
+ background: transparent;
101
+ font: inherit;
102
+ font-weight: 600;
103
+ color: inherit;
104
+ cursor: pointer;
105
+ outline: none;
106
+ }
107
+
108
+ .dropdown-trigger:hover {
109
+ opacity: 0.85;
110
+ }
111
+
112
+ .dropdown-trigger:focus-visible {
113
+ outline: 2px solid var(--weg-color-accent);
114
+ outline-offset: 2px;
115
+ }
116
+
117
+ .dropdown-trigger--open {
118
+ background: #f1f5f9;
119
+ }
120
+
121
+ .toggle-icon {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ justify-content: center;
125
+ width: 24px;
126
+ height: 24px;
127
+ border-radius: 999px;
128
+ background: #312e81;
129
+ color: #ffffff;
130
+ flex-shrink: 0;
131
+ }
132
+
133
+ .dropdown-panel {
134
+ position: absolute;
135
+ top: calc(100% + 8px);
136
+ left: 0;
137
+ z-index: 50;
138
+ min-width: 280px;
139
+ padding: 12px 0 12px 12px;
140
+ border: 1px solid #e2e8f0;
141
+ border-radius: 8px;
142
+ background: #f8fafc;
143
+ box-shadow: 0 4px 16px rgba(15, 23, 42, 0.08);
144
+ }
145
+
146
+ .dropdown-panel__accent {
147
+ border-left: 4px solid var(--weg-color-accent);
148
+ padding-left: 12px;
149
+ }
150
+
151
+ .dropdown-panel__links {
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 4px;
155
+ }
156
+
157
+ .dropdown-panel__link {
158
+ display: block;
159
+ padding: 8px 12px 8px 0;
160
+ font-weight: 600;
161
+ color: inherit;
162
+ text-decoration: none;
163
+ outline: none;
164
+ }
165
+
166
+ .dropdown-panel__link:hover {
167
+ opacity: 0.85;
168
+ }
169
+
170
+ .dropdown-panel__link:focus-visible {
171
+ outline: 2px solid var(--weg-color-accent);
172
+ outline-offset: 2px;
173
+ border-radius: 4px;
174
+ }
175
+
176
+ .sign-in-link,
177
+ .auth-button {
178
+ display: inline-flex;
179
+ align-items: center;
180
+ gap: 8px;
181
+ font-weight: 600;
182
+ color: inherit;
183
+ text-decoration: none;
184
+ outline: none;
185
+ }
186
+
187
+ .auth-button {
188
+ padding: 0;
189
+ border: none;
190
+ background: transparent;
191
+ font: inherit;
192
+ cursor: pointer;
193
+ }
194
+
195
+ .sign-in-link:hover,
196
+ .auth-button:hover {
197
+ opacity: 0.85;
198
+ }
199
+
200
+ .sign-in-link:focus-visible,
201
+ .auth-button:focus-visible {
202
+ outline: 2px solid var(--weg-color-accent);
203
+ outline-offset: 4px;
204
+ border-radius: 4px;
205
+ }
206
+
207
+ /* Mobile */
208
+ .mobile {
209
+ display: flex;
210
+ width: 100%;
211
+ align-items: center;
212
+ justify-content: space-between;
213
+ gap: 12px;
214
+ }
215
+
216
+ @media (min-width: 768px) {
217
+ .mobile {
218
+ display: none;
219
+ }
220
+ }
221
+
222
+ .icon-button {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ justify-content: center;
226
+ width: 40px;
227
+ height: 40px;
228
+ padding: 0;
229
+ border: none;
230
+ border-radius: 8px;
231
+ background: transparent;
232
+ color: inherit;
233
+ cursor: pointer;
234
+ text-decoration: none;
235
+ outline: none;
236
+ }
237
+
238
+ .icon-button:hover {
239
+ background: #f1f5f9;
240
+ }
241
+
242
+ .icon-button:focus-visible {
243
+ outline: 2px solid var(--weg-color-accent);
244
+ outline-offset: 2px;
245
+ }
246
+
247
+ .mobile-overlay {
248
+ position: fixed;
249
+ inset: 0;
250
+ z-index: 100;
251
+ background: #ffffff;
252
+ overflow-y: auto;
253
+ }
254
+
255
+ .mobile-overlay__header {
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: space-between;
259
+ gap: 12px;
260
+ padding: 12px 16px;
261
+ border-bottom: 2px solid var(--weg-color-accent);
262
+ }
263
+
264
+ .mobile-overlay__logo {
265
+ flex: 1;
266
+ display: flex;
267
+ justify-content: center;
268
+ }
269
+
270
+ .mobile-overlay__logo .logo {
271
+ height: 40px;
272
+ }
273
+
274
+ .mobile-nav {
275
+ padding: 0 16px 24px;
276
+ }
277
+
278
+ .mobile-nav__section {
279
+ border-bottom: 1px solid #d8d4f7;
280
+ }
281
+
282
+ .mobile-nav__row {
283
+ display: flex;
284
+ align-items: center;
285
+ justify-content: space-between;
286
+ gap: 12px;
287
+ width: 100%;
288
+ padding: 16px 0;
289
+ border: none;
290
+ background: transparent;
291
+ font: inherit;
292
+ font-weight: 600;
293
+ color: inherit;
294
+ text-align: left;
295
+ text-decoration: none;
296
+ cursor: pointer;
297
+ outline: none;
298
+ }
299
+
300
+ .mobile-nav__row:focus-visible {
301
+ outline: 2px solid var(--weg-color-accent);
302
+ outline-offset: 2px;
303
+ border-radius: 4px;
304
+ }
305
+
306
+ .mobile-nav__sub {
307
+ padding: 0 0 12px 0;
308
+ }
309
+
310
+ .mobile-nav__sub-link {
311
+ display: block;
312
+ padding: 10px 0;
313
+ font-weight: 400;
314
+ color: inherit;
315
+ text-decoration: none;
316
+ outline: none;
317
+ }
318
+
319
+ .mobile-nav__sub-link:focus-visible {
320
+ outline: 2px solid var(--weg-color-accent);
321
+ outline-offset: 2px;
322
+ border-radius: 4px;
323
+ }
324
+
325
+ .mobile-nav__sub-link:hover {
326
+ opacity: 0.85;
327
+ }