weg-shared-layout 0.0.23 → 0.0.25

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 (57) hide show
  1. package/LICENSE +21 -21
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/weg-footer_2.cjs.entry.js +307 -219
  4. package/dist/cjs/weg-shared-layout.cjs.js +1 -1
  5. package/dist/collection/collection-manifest.json +0 -1
  6. package/dist/collection/components/weg-footer/icons/instagram.svg +5 -5
  7. package/dist/collection/components/weg-footer/icons/linkedin.svg +3 -3
  8. package/dist/collection/components/weg-footer/icons/tiktok.svg +3 -3
  9. package/dist/collection/components/weg-footer/icons/youtube.svg +4 -4
  10. package/dist/collection/components/weg-footer/weg-footer.css +270 -201
  11. package/dist/collection/components/weg-footer/weg-footer.js +22 -26
  12. package/dist/collection/components/weg-header/weg-header.css +474 -365
  13. package/dist/collection/components/weg-header/weg-header.js +226 -166
  14. package/dist/collection/constants/breakpoints.js +6 -0
  15. package/dist/collection/styles/shared.css +72 -78
  16. package/dist/collection/utils/layout.js +57 -9
  17. package/dist/components/p-BnMIy-A5.js +1 -0
  18. package/dist/components/weg-footer.js +1 -1
  19. package/dist/components/weg-header.js +1 -1
  20. package/dist/esm/loader.js +1 -1
  21. package/dist/esm/weg-footer_2.entry.js +307 -219
  22. package/dist/esm/weg-shared-layout.js +1 -1
  23. package/dist/types/components/weg-footer/weg-footer.d.ts +2 -2
  24. package/dist/types/components/weg-header/weg-header.d.ts +32 -16
  25. package/dist/types/components.d.ts +6 -48
  26. package/dist/types/constants/breakpoints.d.ts +6 -0
  27. package/dist/types/types/layout-data.d.ts +13 -27
  28. package/dist/types/utils/layout.d.ts +9 -1
  29. package/dist/weg-shared-layout/p-d74a58cf.entry.js +1 -0
  30. package/dist/weg-shared-layout/weg-shared-layout.esm.js +1 -1
  31. package/docs/angular-integration-guide.md +1004 -0
  32. package/docs/angular.md +229 -138
  33. package/docs/nextjs.md +306 -305
  34. package/docs/publishing.md +48 -48
  35. package/docs/react.md +261 -261
  36. package/docs/vanilla.md +138 -140
  37. package/package.json +12 -8
  38. package/readme.md +82 -107
  39. package/src/assets/dummy-data.json +137 -63
  40. package/src/constants/breakpoints.ts +7 -0
  41. package/dist/cjs/my-component.cjs.entry.js +0 -33
  42. package/dist/collection/components/my-component/my-component.css +0 -3
  43. package/dist/collection/components/my-component/my-component.js +0 -95
  44. package/dist/collection/components/weg-header/signed-in-layout.js +0 -13
  45. package/dist/collection/constants/weg-urls.js +0 -18
  46. package/dist/components/my-component.d.ts +0 -11
  47. package/dist/components/my-component.js +0 -1
  48. package/dist/components/p-DbIEJ3IT.js +0 -1
  49. package/dist/esm/my-component.entry.js +0 -31
  50. package/dist/types/components/my-component/my-component.d.ts +0 -16
  51. package/dist/types/components/weg-header/signed-in-layout.d.ts +0 -18
  52. package/dist/types/constants/weg-urls.d.ts +0 -18
  53. package/dist/weg-shared-layout/p-80fa529c.entry.js +0 -1
  54. package/dist/weg-shared-layout/p-d61033bd.entry.js +0 -1
  55. package/src/constants/weg-urls.ts +0 -23
  56. /package/dist/types/Users/{tan/Documents/code → rakin/Documents/WEG/repos}/weg-shared-layout/.stencil/test-utils/axe.d.ts +0 -0
  57. /package/dist/types/Users/{tan/Documents/code → rakin/Documents/WEG/repos}/weg-shared-layout/.stencil/test-utils/viewport.d.ts +0 -0
@@ -2,6 +2,7 @@
2
2
 
3
3
  var index = require('./index-CC8e1qRm.js');
4
4
 
5
+ const LINK_TARGETS = new Set(['_blank', '_self', '_parent', '_top']);
5
6
  function parseJsonProp(value) {
6
7
  if (typeof value !== 'string')
7
8
  return value;
@@ -18,31 +19,78 @@ function parseJsonProp(value) {
18
19
  function isNonEmptyString(value) {
19
20
  return typeof value === 'string' && value.trim().length > 0;
20
21
  }
21
- function normalizeLinks(input) {
22
+ function isMenuGroup(link) {
23
+ return Boolean(link.items?.length);
24
+ }
25
+ function readNestedItems(raw) {
26
+ return raw.items ?? raw.children;
27
+ }
28
+ function readLinkTarget(raw) {
29
+ const target = raw.target;
30
+ if (typeof target === 'string' && LINK_TARGETS.has(target)) {
31
+ return target;
32
+ }
33
+ return undefined;
34
+ }
35
+ function normalizeLayoutLink(input, options) {
36
+ if (!input || typeof input !== 'object')
37
+ return null;
38
+ const raw = input;
39
+ const label = raw.label;
40
+ if (!isNonEmptyString(label))
41
+ return null;
42
+ const nested = readNestedItems(raw);
43
+ if (Array.isArray(nested)) {
44
+ const items = normalizeLinks(nested, { requireHref: true });
45
+ if (items.length > 0) {
46
+ return { label: label.trim(), items };
47
+ }
48
+ }
49
+ const href = raw.href;
50
+ if (isNonEmptyString(href)) {
51
+ const link = { label: label.trim(), href: href.trim() };
52
+ const target = readLinkTarget(raw);
53
+ if (target)
54
+ link.target = target;
55
+ return link;
56
+ }
57
+ return options?.requireHref === false ? null : null;
58
+ }
59
+ function normalizeLinks(input, options) {
22
60
  if (!Array.isArray(input))
23
61
  return [];
62
+ const requireHref = options?.requireHref ?? true;
24
63
  const result = [];
25
64
  for (const item of input) {
26
- if (!item || typeof item !== 'object')
27
- continue;
28
- const label = item.label;
29
- const href = item.href;
30
- if (!isNonEmptyString(label))
31
- continue;
32
- if (!isNonEmptyString(href))
65
+ const link = normalizeLayoutLink(item, { requireHref });
66
+ if (link)
67
+ result.push(link);
68
+ }
69
+ return result;
70
+ }
71
+ function normalizeHeaderMenu(input) {
72
+ return normalizeLinks(input, { requireHref: false });
73
+ }
74
+ function normalizeMenu(input) {
75
+ if (!Array.isArray(input))
76
+ return [];
77
+ const result = [];
78
+ for (const column of input) {
79
+ const links = normalizeLinks(column, { requireHref: true });
80
+ if (links.length === 0)
33
81
  continue;
34
- result.push({ label: label.trim(), href: href.trim() });
82
+ result.push(links);
35
83
  }
36
84
  return result;
37
85
  }
38
86
 
39
- const sharedCss$1 = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:768px;--weg-breakpoint-lg:1024px;--weg-breakpoint-xl:1280px}*,*::before,*::after{box-sizing:border-box}:host{display:block;--weg-font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji';--weg-color-accent:#948eeb}.container{width:100%;margin-inline:auto;padding-inline:1rem;padding-block:12px}@media (width >= 640px){.container{max-width:var(--weg-breakpoint-sm)}}@media (width >= 768px){.container{max-width:var(--weg-breakpoint-md);padding-inline:2rem;padding-block:20px}}@media (width >= 1024px){.container{max-width:var(--weg-breakpoint-lg)}}@media (width >= 1280px){.container{max-width:var(--weg-breakpoint-xl);padding-block:28px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}`;
87
+ const sharedCss$1 = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:960px;--weg-breakpoint-lg:1280px;--weg-breakpoint-xl:1440px}*,*::before,*::after{box-sizing:border-box}:host{display:block;--weg-font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji';--weg-color-accent:#948eeb}.container{width:100%;margin-inline:auto;padding-block:0.75rem}@media (width >= 960px){.container{padding-inline:1rem;padding-block:1.25rem}}@media (width >= 1280px){.container{padding-inline:2rem}}@media (width >= 1440px){.container{padding-block:1.75rem}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}`;
40
88
 
41
- const wegFooterCss = () => `.footer{background:#030712;color:#ffffff;font-family:var(--weg-font-family);font-weight:300}.footer__inner{display:flex;flex-direction:column;align-items:center;gap:20px;padding-block:32px}.social{display:flex;align-items:center;justify-content:center;gap:16px}.social__link{width:48px;height:48px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:transparent;color:inherit;text-decoration:none;transition:opacity 150ms ease;outline:none}.social__link:hover{opacity:0.9}.social__link:focus-visible{outline:2px solid rgba(255, 255, 255, 0.9);outline-offset:4px}.social__icon{display:inline-flex;width:48px;height:48px}.footer-link{color:#ffffff;font-family:'Open Sans', var(--weg-font-family);font-size:16px;font-style:normal;font-weight:300;line-height:24px;display:block;width:100%;text-align:center;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;outline:none}.footer-link:hover{opacity:0.9}.footer-link:focus-visible{outline:2px solid rgba(255, 255, 255, 0.9);outline-offset:4px}.legal{width:100%;max-width:860px;text-align:center;font-size:16px;line-height:24px}.legal__p{margin:0}.standard{width:100%;display:flex;flex-direction:column;align-items:center;gap:36px;text-align:center;font-size:16px;line-height:24px}.columns{width:100%;display:grid;gap:0;grid-template-columns:1fr}.columns__col{display:flex;flex:1 1 0;min-width:0;width:100%;align-items:stretch;flex-direction:column}.columns__col:not(:first-child){gap:32px}.columns__divider{display:block;background:rgba(255, 255, 255, 0.35);flex-shrink:0;width:100%;height:1px;align-self:stretch;margin-top:32px;margin-bottom:0}.columns__links{display:flex;flex-direction:column;align-items:stretch;gap:12px;flex:1;width:100%;min-width:0;padding:0 4px;text-align:center}@media (width >= 768px){.footer__inner{gap:36px;padding-block:56px}.social{gap:28px}.footer-link{display:inline;width:auto;text-align:left}.legal{font-size:18px;line-height:28px}.standard{font-size:18px;line-height:28px}.columns{display:flex;flex-direction:row;align-items:stretch;justify-content:center;gap:0}.columns__col{flex-direction:row;align-items:stretch}.columns__col:not(:first-child){gap:0}.columns__divider{width:1px;height:auto;margin:0 12px}.columns__links{align-items:flex-start;padding:0 12px;text-align:left}}`;
89
+ const wegFooterCss = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:960px;--weg-breakpoint-lg:1280px;--weg-breakpoint-xl:1440px}.footer{background:#030712;color:#ffffff;font-family:var(--weg-font-family);font-weight:300}.footer__inner{display:flex;flex-direction:column;align-items:center;gap:1.25rem;padding-block:2rem;padding-inline:0.5rem}@media (width >= 960px){.footer__inner{gap:2.25rem;padding-block:3.5rem;padding-inline:1rem}}@media (width >= 1280px){.footer__inner{padding-inline:2rem}}.social{display:flex;align-items:center;justify-content:center;gap:1rem;flex-wrap:wrap}@media (width >= 960px){.social{gap:1.75rem}}.social__link{width:3rem;height:3rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999rem;background:transparent;color:inherit;text-decoration:none;transition:opacity 150ms ease;outline:none}.social__link:hover{opacity:0.9}.social__link:focus-visible{outline:2px solid rgba(255, 255, 255, 0.9);outline-offset:4px}.social__icon{display:inline-flex;width:3rem;height:3rem}.footer-link{color:#ffffff;font-family:'Open Sans', var(--weg-font-family);font-size:1rem;font-style:normal;font-weight:300;line-height:1.5rem;display:block;width:100%;text-align:center;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;outline:none}@media (width >= 960px){.footer-link{display:inline;width:auto;text-align:left}}.footer-link:hover{opacity:0.9}.footer-link:focus-visible{outline:2px solid rgba(255, 255, 255, 0.9);outline-offset:4px}.legal{width:100%;max-width:860px;text-align:center;font-size:1rem;line-height:1.5rem}@media (width >= 960px){.legal{font-size:1.125rem;line-height:1.75rem}}.legal__p{margin:0}.standard{width:100%;display:flex;flex-direction:column;align-items:center;gap:2.25rem;text-align:center;font-size:1rem;line-height:1.5rem}@media (width >= 960px){.standard{font-size:1.125rem;line-height:1.75rem}}.columns{width:100%;display:grid;grid-template-columns:1fr;gap:0}.columns__col{display:flex;flex-direction:column;align-items:stretch;width:100%;min-width:0}.columns__col:not(:first-child){gap:2rem}.columns__divider{display:block;flex-shrink:0;width:100%;height:1px;margin-top:2rem;background:rgba(255, 255, 255, 0.35)}.columns__links{display:flex;flex-direction:column;align-items:stretch;gap:0.75rem;width:100%;min-width:0;text-align:center}@media (width >= 640px){.columns{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5rem 3rem}.columns__col:not(:first-child){gap:0}.columns__col:nth-child(-n+3):not(:first-child) .columns__divider{display:none}.columns__col:nth-child(n+4) .columns__divider{display:block;width:100%;height:1px;margin:0 0 1.5rem}.footer-link{display:inline;width:auto;text-align:left}.columns__links{align-items:flex-start;text-align:left}}@media (width >= 960px){.columns{display:flex;flex-direction:row;align-items:stretch;justify-content:center;gap:0}.columns__col{flex:1 1 0;flex-direction:row;align-items:stretch}.columns__col:not(:first-child){gap:0}.columns__col:nth-child(-n+3):not(:first-child) .columns__divider,.columns__col:nth-child(n+4) .columns__divider{display:block;width:1px;height:auto;margin:0 1.5rem}.columns__links{flex:1;align-items:flex-start;text-align:left}}`;
42
90
 
43
91
  const EMPTY_FOOTER = {
44
92
  social: [],
45
- columns: [],
93
+ menu: [],
46
94
  credits: '',
47
95
  copyright: '',
48
96
  };
@@ -69,32 +117,28 @@ function normalizeSocialLinks(input) {
69
117
  }
70
118
  return result;
71
119
  }
72
- function normalizeColumns(input) {
73
- if (!Array.isArray(input))
74
- return [];
75
- const result = [];
76
- for (const item of input) {
77
- if (!item || typeof item !== 'object')
78
- continue;
79
- const links = normalizeLinks(item.links);
80
- if (links.length === 0)
81
- continue;
82
- result.push({ links });
83
- }
84
- return result;
85
- }
86
120
  function normalizeFooterData(input) {
87
121
  const root = (input && typeof input === 'object' ? input : {});
88
122
  const footer = (root.footer && typeof root.footer === 'object' ? root.footer : {});
89
123
  return {
90
124
  social: normalizeSocialLinks(footer?.social),
91
- columns: normalizeColumns(footer?.columns),
125
+ menu: normalizeMenu(footer?.menu),
92
126
  credits: isNonEmptyString(footer?.credits) ? footer.credits.trim() : '',
93
127
  copyright: isNonEmptyString(footer?.copyright) ? footer.copyright.trim() : '',
94
128
  };
95
129
  }
96
130
  function linkOpensNewTab(link) {
97
- return isExternalHref(link.href);
131
+ if (link.target === '_blank')
132
+ return true;
133
+ return link.href ? isExternalHref(link.href) : false;
134
+ }
135
+ function linkTarget(link) {
136
+ if (link.target)
137
+ return link.target;
138
+ return linkOpensNewTab(link) ? '_blank' : undefined;
139
+ }
140
+ function linkRel(link) {
141
+ return linkOpensNewTab(link) ? 'noreferrer noopener' : undefined;
98
142
  }
99
143
  function SocialIcon({ platform }) {
100
144
  const common = {
@@ -135,7 +179,7 @@ const WegFooter = class {
135
179
  * {
136
180
  * "footer": {
137
181
  * "social": [{ "platform": "LinkedIn", "href": "https://..." }],
138
- * "columns": [{ "links": [{ "label": "About Us", "href": "/about" }] }],
182
+ * "menu": [[{ "label": "About Us", "href": "/about" }]],
139
183
  * "credits": "...",
140
184
  * "copyright": "..."
141
185
  * }
@@ -169,14 +213,14 @@ const WegFooter = class {
169
213
  return null;
170
214
  return (index.h("div", { class: "social" }, links.map((l) => (index.h("a", { class: "social__link", href: l.href, "aria-label": l.platform, target: isExternalHref(l.href) ? '_blank' : undefined, rel: isExternalHref(l.href) ? 'noreferrer noopener' : undefined }, index.h("span", { class: "social__icon", "aria-hidden": "true" }, index.h(SocialIcon, { platform: l.platform })))))));
171
215
  }
172
- renderColumns() {
173
- const columns = this.resolved.columns;
174
- if (columns.length === 0)
216
+ renderMenu() {
217
+ const menu = this.resolved.menu;
218
+ if (menu.length === 0)
175
219
  return null;
176
- return (index.h("div", { class: "columns" }, columns.map((column, columnIndex) => (index.h("div", { class: "columns__col", key: columnIndex }, columnIndex > 0 ? index.h("div", { class: "columns__divider", "aria-hidden": "true" }) : null, index.h("nav", { class: "columns__links", "aria-label": `Footer links column ${columnIndex + 1}` }, column.links.map((l, linkIndex) => (index.h("a", { class: "footer-link", href: l.href, key: linkIndex, target: linkOpensNewTab(l) ? '_blank' : undefined, rel: linkOpensNewTab(l) ? 'noreferrer noopener' : undefined }, l.label)))))))));
220
+ return (index.h("div", { class: "columns" }, menu.map((links, columnIndex) => (index.h("div", { class: "columns__col", key: columnIndex }, columnIndex > 0 ? index.h("div", { class: "columns__divider", "aria-hidden": "true" }) : null, index.h("nav", { class: "columns__links", "aria-label": `Footer links column ${columnIndex + 1}` }, links.map((l, linkIndex) => (index.h("a", { class: "footer-link", href: l.href, key: linkIndex, target: linkTarget(l), rel: linkRel(l) }, l.label)))))))));
177
221
  }
178
222
  render() {
179
- return (index.h("footer", { key: 'f592a5632d0b39833ac01384f8541082afc36c6b', class: "footer" }, index.h("div", { key: 'b988ca82747dea2a60e40d8140cd8adf0232bc54', class: "container footer__inner" }, this.renderSocialLinks(), index.h("div", { key: '0a66f43415f96f0ffbebd3f8e324f413ea29ec9d', class: "standard" }, this.renderColumns(), this.renderLegalText()))));
223
+ return (index.h("footer", { key: '44ce6d694eb145005f006b5a02ec68fe2da8ca44', class: "footer" }, index.h("div", { key: '43dbb00e195a561a44cd9ae0e843c448dce546bb', class: "container footer__inner" }, this.renderSocialLinks(), index.h("div", { key: '1ede37520397d4fa63671dccc7e3f83f26ac0955', class: "standard" }, this.renderMenu(), this.renderLegalText()))));
180
224
  }
181
225
  static get watchers() { return {
182
226
  "layout": [{
@@ -186,95 +230,67 @@ const WegFooter = class {
186
230
  };
187
231
  WegFooter.style = sharedCss$1() + wegFooterCss();
188
232
 
233
+ /**
234
+ * JS media-query strings aligned with `src/styles/breakpoints.css`.
235
+ */
236
+ const WEG_MD_MEDIA_QUERY = '(width >= 960px)';
237
+ /** Primary input can hover (excludes most touch-only profiles). */
238
+ const WEG_HOVER_CAPABLE_MEDIA_QUERY = '(hover: hover)';
239
+
189
240
  /** WEG logo — inlined from logo.svg (not configurable). */
190
241
  const LOGO_SRC = "data:image/png;base64,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";
191
242
 
192
- /** Canonical WEG site and account URLs — single source of truth for components, docs, and host apps. */
193
- const WEG_SITE_ORIGIN = 'https://www.warwickemploymentgroup.com';
194
- const ACCOUNT_ORIGIN = 'https://account.warwickemploymentgroup.com';
195
- const DEFAULT_LOGO_HREF = `${WEG_SITE_ORIGIN}/`;
196
- const FIND_A_JOB_HREF = `${WEG_SITE_ORIGIN}/find-a-job`;
197
- const ACCOUNT_LOGIN_HREF = `${ACCOUNT_ORIGIN}/account/login`;
198
- const ACCOUNT_DASHBOARD_HREF = `${ACCOUNT_ORIGIN}/dashboard`;
199
- const ACCOUNT_MANAGE_HREF = `${ACCOUNT_ORIGIN}/account/manage`;
200
- const HEADER_SIGN_OUT = {
201
- label: 'Sign out',
202
- href: ACCOUNT_LOGIN_HREF,
203
- };
204
-
205
- const SIGNED_IN_HEADER = {
206
- logoHref: DEFAULT_LOGO_HREF,
207
- links: [
208
- { label: 'Find a job', href: FIND_A_JOB_HREF },
209
- { label: 'Dashboard', href: ACCOUNT_DASHBOARD_HREF },
210
- ],
211
- manageAccount: {
212
- href: ACCOUNT_MANAGE_HREF,
213
- },
214
- signOut: HEADER_SIGN_OUT,
215
- };
243
+ const sharedCss = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:960px;--weg-breakpoint-lg:1280px;--weg-breakpoint-xl:1440px}*,*::before,*::after{box-sizing:border-box}:host{display:block;--weg-font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji';--weg-color-accent:#948eeb}.container{width:100%;margin-inline:auto;padding-block:0.75rem}@media (width >= 960px){.container{padding-inline:1rem;padding-block:1.25rem}}@media (width >= 1280px){.container{padding-inline:2rem}}@media (width >= 1440px){.container{padding-block:1.75rem}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}`;
216
244
 
217
- const sharedCss = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:768px;--weg-breakpoint-lg:1024px;--weg-breakpoint-xl:1280px}*,*::before,*::after{box-sizing:border-box}:host{display:block;--weg-font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji';--weg-color-accent:#948eeb}.container{width:100%;margin-inline:auto;padding-inline:1rem;padding-block:12px}@media (width >= 640px){.container{max-width:var(--weg-breakpoint-sm)}}@media (width >= 768px){.container{max-width:var(--weg-breakpoint-md);padding-inline:2rem;padding-block:20px}}@media (width >= 1024px){.container{max-width:var(--weg-breakpoint-lg)}}@media (width >= 1280px){.container{max-width:var(--weg-breakpoint-xl);padding-block:28px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}`;
218
-
219
- const wegHeaderCss = () => `.header{width:100%;border-bottom:2px solid var(--weg-color-accent);background:#ffffff;color:#0f172a;font-family:var(--weg-font-family)}:host{position:relative;z-index:20}.logo-link{display:inline-flex;align-items:center;text-decoration:none;outline:none}.logo-link:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:4px;border-radius:4px}.logo{height:40px;width:auto}.desktop{display:none}.desktop-nav{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:16px}.desktop-nav__list{display:flex;align-items:center;flex-wrap:wrap;gap:16px;list-style:none;margin:0;padding:0}.desktop-nav__item{position:relative}.nav-link{font-weight:600;color:inherit;text-decoration:none;outline:none}.nav-link:hover{opacity:0.85}.nav-link:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:4px;border-radius:4px}.dropdown-trigger{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border:none;border-radius:8px;background:transparent;font:inherit;font-weight:600;color:inherit;cursor:pointer;outline:none}.dropdown-trigger:hover{opacity:0.85}.dropdown-trigger:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px}.dropdown-trigger--open{background:#f1f5f9}.toggle-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:999px;background:#312e81;color:#ffffff;flex-shrink:0}.dropdown-panel{position:absolute;top:calc(100% + 8px);left:0;z-index:50;min-width:280px;padding:12px 0 12px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;box-shadow:0 4px 16px rgba(15, 23, 42, 0.08)}.dropdown-panel::before{content:'';position:absolute;top:-8px;left:0;right:0;height:8px}.dropdown-panel__accent{border-left:4px solid var(--weg-color-accent);padding-left:12px}.dropdown-panel__links{display:flex;flex-direction:column;gap:4px}.dropdown-panel__link{display:block;padding:8px 12px;margin-right:12px;border-radius:6px;font-weight:600;color:inherit;text-decoration:none;outline:none}.dropdown-panel__link:hover{background:#cdcff8}.dropdown-panel__link:focus-visible{background:#cdcff8;outline:2px solid var(--weg-color-accent);outline-offset:2px}.sign-in-link,.sign-out-link,.auth-button{display:inline-flex;align-items:center;gap:8px;font-weight:600;color:inherit;text-decoration:none;outline:none}.sign-out-link.mobile-nav__row{justify-content:flex-start;gap:8px}.auth-button{padding:0;border:none;background:transparent;font:inherit;cursor:pointer}.sign-in-link:hover,.sign-out-link:hover,.auth-button:hover{opacity:0.85}.sign-in-link:focus-visible,.sign-out-link:focus-visible,.auth-button:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:4px;border-radius:4px}.mobile{display:flex;width:100%;min-width:0;align-items:center;justify-content:space-between;gap:12px}.mobile .logo-link{flex:1 1 auto;min-width:0;justify-content:center}.mobile .logo{max-width:100%}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:none;border-radius:8px;background:transparent;color:inherit;cursor:pointer;text-decoration:none;outline:none}.icon-button:hover{background:#f1f5f9}.icon-button:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px}.mobile-overlay{position:fixed;inset:0;z-index:100;background:#ffffff;overflow-y:auto}.mobile-overlay__header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:2px solid var(--weg-color-accent)}.mobile-overlay__logo{flex:1;display:flex;justify-content:center}.mobile-overlay__logo .logo{height:40px}.mobile-nav{padding:0 16px 24px}.mobile-nav__section{border-bottom:1px solid #d8d4f7}.mobile-nav__row{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:16px 0;border:none;background:transparent;font:inherit;font-weight:600;color:inherit;text-align:left;text-decoration:none;cursor:pointer;outline:none}.mobile-nav__row:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px;border-radius:4px}.mobile-nav__sub{padding:0 0 12px 0}.mobile-nav__sub-link{display:block;padding:10px 0;font-weight:400;color:inherit;text-decoration:none;outline:none}.mobile-nav__sub-link:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px;border-radius:4px}.mobile-nav__sub-link:hover{opacity:0.85}@media (width >= 768px){.header{border-bottom-width:4px}.logo{height:80px}.desktop{display:flex;width:100%;align-items:center;justify-content:space-between;gap:24px}.mobile{display:none}}@media (width >= 1280px){.desktop-nav__list{gap:35px}}`;
245
+ const wegHeaderCss = () => `:host{--weg-breakpoint-sm:640px;--weg-breakpoint-md:960px;--weg-breakpoint-lg:1280px;--weg-breakpoint-xl:1440px}.header{width:100%;border-bottom:2px solid var(--weg-color-accent);background:#ffffff;color:#0f172a;font-family:var(--weg-font-family)}@media (width >= 960px){.header{border-bottom-width:0.25rem}}:host{position:relative;z-index:20}.header--menu-open{position:fixed;inset:0;z-index:1000;display:flex;flex-direction:column;overflow:hidden}.header--menu-open .header-inner{flex:1 1 auto;flex-wrap:wrap;align-content:flex-start;min-height:0}.header--menu-open .main-nav-panel{display:block;flex:1 1 100%;width:100%;min-height:0;overflow-y:auto;border-top:1px solid #d8d4f7}@media (width >= 960px){.header--menu-open{position:static;inset:auto;z-index:auto;display:block;overflow:visible}.header--menu-open .header-inner{flex:unset;flex-wrap:nowrap;align-content:unset;min-height:unset}}.logo-link{display:inline-flex;align-items:center;text-decoration:none;outline:none}.logo-link:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:4px;border-radius:4px}.logo{height:2.5rem;width:auto}@media (width >= 960px){.logo{height:3rem}}@media (width >= 1280px){.logo{height:5rem}}.header-inner{display:flex;width:100%;min-width:0;align-items:center;justify-content:space-between;gap:0.75rem}@media (width >= 960px){.header-inner{flex-wrap:nowrap;gap:1.5rem}}.header-inner .logo-link{flex:1 1 auto;min-width:0;justify-content:center}@media (width >= 960px){.header-inner .logo-link{flex:0 0 auto;justify-content:flex-start}}.header-inner .logo{max-width:100%}.header-actions{display:flex;align-items:center;flex-shrink:0}@media (width >= 960px){.header-actions{display:none}}.main-nav-panel{display:none;margin-inline:-0.5rem}@media (width >= 960px){.main-nav-panel{display:flex;flex:1 1 auto;width:auto;min-width:0;justify-content:flex-end;overflow:visible;border-top:none}}.main-nav{padding:0 1rem 1.5rem}@media (width >= 960px){.main-nav{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:1rem;padding:0}}.main-nav__list{list-style:none;margin:0;padding:0}@media (width >= 960px){.main-nav__list{display:flex;align-items:center;flex-wrap:wrap;gap:1rem}}@media (width >= 1280px){.main-nav__list{gap:2rem}}.main-nav__item{border-bottom:1px solid #d8d4f7}@media (width >= 960px){.main-nav__item{border-bottom:none}}.main-nav__item--dropdown{position:static}.nav-dropdown{position:relative}.nav-link{display:block;width:100%;padding:1rem 0;font-weight:600;color:inherit;text-decoration:none;outline:none}.nav-link:hover{opacity:0.85}.nav-link:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px;border-radius:4px}.nav-dropdown__trigger{display:flex;align-items:center;justify-content:space-between;gap:0.75rem;width:100%;padding:1rem 0;border:none;background:transparent;font:inherit;font-weight:600;color:inherit;text-align:left;cursor:pointer;outline:none}.nav-dropdown__trigger:hover{opacity:0.85}.nav-dropdown__trigger:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px;border-radius:4px}.nav-dropdown__trigger--open{background:transparent}.toggle-icon{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;border-radius:999rem;background:#312e81;color:#ffffff;flex-shrink:0}.nav-dropdown__panel{padding:0 0 0.75rem}@media (width >= 960px){.nav-dropdown__panel{position:absolute;top:calc(100% + 0.5rem);left:0;z-index:500;min-width:17.5rem;padding:0.75rem 0 0.75rem 0.75rem;border:1px solid #e2e8f0;border-radius:0.5rem;background:#f8fafc;box-shadow:0 0.25rem 1rem rgba(15, 23, 42, 0.08)}.nav-dropdown__panel::before{content:'';position:absolute;top:-0.5rem;left:0;right:0;height:0.5rem}}.nav-dropdown__accent{border-left:0.25rem solid var(--weg-color-accent);padding-left:0.75rem}.nav-dropdown__links{display:flex;flex-direction:column;gap:0.25rem}.nav-dropdown__link{display:block;padding:0.625rem 0;font-weight:400;color:inherit;text-decoration:none;outline:none}.nav-dropdown__link:hover{opacity:0.85}.nav-dropdown__link:focus-visible{outline:0.125rem solid var(--weg-color-accent);outline-offset:0.125rem;border-radius:0.25rem}@media (width >= 960px){.nav-dropdown__link{padding:0.5rem;margin-right:0.75rem;border-radius:0.5rem;font-weight:600}.nav-dropdown__link:hover,.nav-dropdown__link:focus-visible{background:#cdcff8;opacity:1}}@media (width >= 1280px){.nav-dropdown__link{padding:0.5rem 0.75rem}}.main-nav__item--auth>a{display:flex;align-items:center;gap:0.5rem;width:100%;padding:1rem 0}@media (width >= 960px){.nav-link,.nav-dropdown__trigger,.main-nav__item--auth>a{display:inline-flex;align-items:center;width:auto;padding:0.5rem;border-radius:0.5rem}.nav-dropdown__trigger{gap:0.5rem;cursor:pointer}.nav-dropdown__trigger--open{background:#f1f5f9}}@media (width >= 1280px){.main-nav{font-size:1.25rem}.main-nav__item--auth>a{padding:0.5rem 0.75rem}}.sign-in-link,.sign-out-link,.auth-button{display:inline-flex;align-items:center;gap:0.5rem;font-weight:600;color:inherit;text-decoration:none;outline:none}.auth-button{padding:0;border:none;background:transparent;font:inherit;cursor:pointer}.sign-in-link:hover,.sign-out-link:hover,.auth-button:hover{opacity:0.85}.sign-in-link:focus-visible,.sign-out-link:focus-visible,.auth-button:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:4px;border-radius:4px}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;border:none;border-radius:0.5rem;background:transparent;color:inherit;cursor:pointer;text-decoration:none;outline:none}.icon-button:hover{background:#f1f5f9}.icon-button:focus-visible{outline:2px solid var(--weg-color-accent);outline-offset:2px}.menu-toggle{flex-shrink:0}@media (width >= 960px){.menu-toggle{display:none}}`;
220
246
 
247
+ const WEG_HOME = 'https://www.warwickemploymentgroup.com';
248
+ const ACCOUNT_HOME = 'https://account.warwickemploymentgroup.com';
249
+ const DEFAULT_LOGO_HREF = `${WEG_HOME}/`;
250
+ const ACCOUNT_LOGIN_HREF = `${ACCOUNT_HOME}/account/login`;
251
+ const ACCOUNT_MANAGE_HREF = `${ACCOUNT_HOME}/account/manage`;
252
+ const SIGNED_IN_MENU = [
253
+ { label: 'Find a job', href: `${WEG_HOME}/find-a-job` },
254
+ { label: 'Dashboard', href: `${ACCOUNT_HOME}/dashboard` },
255
+ { label: 'Manage Account', href: `${ACCOUNT_HOME}/account/manage` },
256
+ { label: 'Sign out', href: `${ACCOUNT_HOME}/account/login` },
257
+ ];
221
258
  const EMPTY_HEADER = {
222
- logoHref: DEFAULT_LOGO_HREF,
223
- dropdowns: [],
224
- links: [],
225
- signIn: null,
226
- signOut: null,
259
+ menu: [],
227
260
  };
228
- function normalizeDropdowns(input) {
229
- if (!Array.isArray(input))
230
- return [];
231
- const result = [];
232
- for (const item of input) {
233
- if (!item || typeof item !== 'object')
234
- continue;
235
- const label = item.label;
236
- const items = normalizeLinks(item.items);
237
- if (!isNonEmptyString(label))
238
- continue;
239
- if (items.length === 0)
240
- continue;
241
- result.push({ label: label.trim(), items });
242
- }
243
- return result;
261
+ function isSignInLink(link) {
262
+ const label = link.label.trim().toLowerCase();
263
+ if (label === 'sign out')
264
+ return false;
265
+ if (label === 'sign in')
266
+ return true;
267
+ return link.href === ACCOUNT_LOGIN_HREF;
244
268
  }
245
- function normalizeSignIn(input) {
246
- if (!input || typeof input !== 'object')
247
- return null;
248
- const label = input.label;
249
- const href = input.href;
250
- if (!isNonEmptyString(label))
251
- return null;
252
- if (!isNonEmptyString(href))
253
- return null;
254
- return { label: label.trim(), href: href.trim() };
269
+ function isSignOutLink(link) {
270
+ return link.label.trim().toLowerCase() === 'sign out';
255
271
  }
256
- function normalizeSignOut(input) {
257
- if (!input || typeof input !== 'object')
258
- return null;
259
- const label = input.label;
260
- const href = input.href;
261
- if (!isNonEmptyString(label))
262
- return null;
263
- return {
264
- label: label.trim(),
265
- href: isNonEmptyString(href) ? href.trim() : undefined,
266
- };
272
+ function isManageAccountLink(link) {
273
+ if (link.label.trim().toLowerCase() === 'manage account')
274
+ return true;
275
+ return link.href === ACCOUNT_MANAGE_HREF;
276
+ }
277
+ function isFindJobLink(link) {
278
+ if (link.label.trim().toLowerCase() === 'find a job')
279
+ return true;
280
+ return link.href === `${WEG_HOME}/find-a-job`;
281
+ }
282
+ function isDashboardLink(link) {
283
+ if (link.label.trim().toLowerCase() === 'dashboard')
284
+ return true;
285
+ return link.href === `${ACCOUNT_HOME}/dashboard`;
267
286
  }
268
287
  function normalizeHeaderData(input) {
269
288
  const root = (input && typeof input === 'object' ? input : {});
270
289
  const header = root.header && typeof root.header === 'object' ? root.header : {};
271
- const logoHref = isNonEmptyString(header.logoHref) ? header.logoHref.trim() : DEFAULT_LOGO_HREF;
290
+ const logoSrc = isNonEmptyString(header.logoSrc) ? header.logoSrc.trim() : undefined;
272
291
  return {
273
- logoHref,
274
- dropdowns: normalizeDropdowns(header.dropdowns),
275
- links: normalizeLinks(header.links),
276
- signIn: normalizeSignIn(header.signIn),
277
- signOut: normalizeSignOut(header.signOut),
292
+ logoSrc,
293
+ menu: normalizeHeaderMenu(header.menu),
278
294
  };
279
295
  }
280
296
  function SignInIcon() {
@@ -283,6 +299,12 @@ function SignInIcon() {
283
299
  function SignOutIcon() {
284
300
  return (index.h("svg", { viewBox: "0 0 26 24", width: "26", height: "24", "aria-hidden": "true", focusable: "false", fill: "none" }, index.h("path", { d: "M19.6667 6.33333L25 11.6667L19.6667 17M25 11.6667H6.33333M14.3333 17V18.3333C14.3333 19.3942 13.9119 20.4116 13.1618 21.1618C12.4116 21.9119 11.3942 22.3333 10.3333 22.3333H5C3.93913 22.3333 2.92172 21.9119 2.17157 21.1618C1.42143 20.4116 1 19.3942 1 18.3333V5C1 3.93913 1.42143 2.92172 2.17157 2.17157C2.92172 1.42143 3.93913 1 5 1H10.3333C11.3942 1 12.4116 1.42143 13.1618 2.17157C13.9119 2.92172 14.3333 3.93913 14.3333 5V6.33333", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" })));
285
301
  }
302
+ function FindJobIcon() {
303
+ return (index.h("svg", { viewBox: "0 0 24 24", width: "20", height: "20", "aria-hidden": "true", focusable: "false", fill: "none" }, index.h("path", { d: "M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), index.h("rect", { x: "2", y: "6", width: "20", height: "14", rx: "2", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" })));
304
+ }
305
+ function DashboardIcon() {
306
+ return (index.h("svg", { viewBox: "0 0 24 24", width: "20", height: "20", "aria-hidden": "true", focusable: "false", fill: "none" }, index.h("rect", { x: "3", y: "3", width: "7", height: "9", rx: "1", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), index.h("rect", { x: "14", y: "3", width: "7", height: "5", rx: "1", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), index.h("rect", { x: "14", y: "12", width: "7", height: "9", rx: "1", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), index.h("rect", { x: "3", y: "16", width: "7", height: "5", rx: "1", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" })));
307
+ }
286
308
  function HamburgerIcon() {
287
309
  return (index.h("svg", { viewBox: "0 0 24 24", width: "28", height: "28", "aria-hidden": "true", focusable: "false", fill: "none" }, index.h("path", { d: "M4 7h16M4 12h16M4 17h16", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" })));
288
310
  }
@@ -292,8 +314,8 @@ function CloseIcon() {
292
314
  function ToggleIcon({ expanded }) {
293
315
  return (index.h("span", { class: "toggle-icon", "aria-hidden": "true" }, expanded ? (index.h("svg", { viewBox: "0 0 24 24", width: "14", height: "14", fill: "none" }, index.h("path", { d: "M6 12h12", stroke: "currentColor", "stroke-width": "2.5", "stroke-linecap": "round" }))) : (index.h("svg", { viewBox: "0 0 24 24", width: "14", height: "14", fill: "none" }, index.h("path", { d: "M12 6v12M6 12h12", stroke: "currentColor", "stroke-width": "2.5", "stroke-linecap": "round" })))));
294
316
  }
295
- function Logo({ href }) {
296
- return (index.h("a", { class: "logo-link", href: href, "aria-label": "Home" }, index.h("img", { class: "logo", src: LOGO_SRC, alt: "WEG", width: "225", height: "83" })));
317
+ function Logo({ href, src }) {
318
+ return (index.h("a", { class: "logo-link", href: href, "aria-label": "Home" }, index.h("img", { class: "logo", src: src, alt: "WEG", width: "225", height: "83" })));
297
319
  }
298
320
  const WegHeader = class {
299
321
  constructor(hostRef) {
@@ -307,19 +329,18 @@ const WegHeader = class {
307
329
  * ```json
308
330
  * {
309
331
  * "header": {
310
- * "logoHref": "https://www.warwickemploymentgroup.com/",
311
- * "dropdowns": [{ "label": "Find a job", "items": [{ "label": "...", "href": "..." }] }],
312
- * "links": [{ "label": "Career advice", "href": "/career-advice" }],
313
- * "signIn": { "label": "Sign in", "href": "/account/login" },
314
- * "signOut": { "label": "Sign out", "href": "/account/login" }
332
+ * "menu": [
333
+ * { "label": "Find a job", "items": [{ "label": "Graduates", "href": "..." }] },
334
+ * { "label": "Career advice", "href": "/career-advice" },
335
+ * { "label": "Sign in", "href": "/account/login" }
336
+ * ]
315
337
  * }
316
338
  * }
317
339
  * ```
318
340
  */
319
341
  layout;
320
342
  /**
321
- * When true, the header shows the signed-in navigation (Find a job, Dashboard,
322
- * Manage Account, Sign out) instead of the CMS layout.
343
+ * When true, the header uses the built-in signed-in menu instead of the CMS layout.
323
344
  */
324
345
  signedIn = false;
325
346
  /**
@@ -335,10 +356,13 @@ const WegHeader = class {
335
356
  resolved = EMPTY_HEADER;
336
357
  menuOpen = false;
337
358
  openDropdown = null;
338
- expandedSection = null;
339
359
  boundHandleDocumentClick = this.handleDocumentClick.bind(this);
360
+ boundHandleViewportChange = this.handleViewportChange.bind(this);
361
+ boundHandleHoverCapabilityChange = this.handleHoverCapabilityChange.bind(this);
340
362
  hoverCloseTimer = null;
341
363
  hoverOpenEnabled = false;
364
+ desktopMediaQuery;
365
+ hoverCapableMediaQuery;
342
366
  resolve() {
343
367
  if (this.layout === undefined || this.layout === null) {
344
368
  this.resolved = EMPTY_HEADER;
@@ -348,15 +372,46 @@ const WegHeader = class {
348
372
  }
349
373
  componentWillLoad() {
350
374
  this.resolve();
351
- this.hoverOpenEnabled = window.matchMedia('(hover: hover) and (pointer: fine)').matches;
375
+ this.hoverCapableMediaQuery = window.matchMedia(WEG_HOVER_CAPABLE_MEDIA_QUERY);
376
+ this.hoverCapableMediaQuery.addEventListener('change', this.boundHandleHoverCapabilityChange);
377
+ this.desktopMediaQuery = window.matchMedia(WEG_MD_MEDIA_QUERY);
378
+ this.desktopMediaQuery.addEventListener('change', this.boundHandleViewportChange);
379
+ this.updateHoverDropdownEnabled();
380
+ this.handleViewportChange();
352
381
  }
353
382
  connectedCallback() {
354
383
  document.addEventListener('click', this.boundHandleDocumentClick);
355
384
  }
356
385
  disconnectedCallback() {
357
386
  document.removeEventListener('click', this.boundHandleDocumentClick);
387
+ this.desktopMediaQuery?.removeEventListener('change', this.boundHandleViewportChange);
388
+ this.hoverCapableMediaQuery?.removeEventListener('change', this.boundHandleHoverCapabilityChange);
358
389
  this.cancelScheduledDropdownClose();
359
390
  }
391
+ /**
392
+ * Desktop dropdowns open on hover when viewport is md+ and the device reports hover support.
393
+ * Uses (hover: hover) only — not (pointer: fine), which breaks in DevTools and hybrid devices.
394
+ */
395
+ updateHoverDropdownEnabled() {
396
+ const enabled = Boolean(this.desktopMediaQuery?.matches && this.hoverCapableMediaQuery?.matches);
397
+ if (this.hoverOpenEnabled && !enabled) {
398
+ this.cancelScheduledDropdownClose();
399
+ this.closeDropdown();
400
+ }
401
+ this.hoverOpenEnabled = enabled;
402
+ }
403
+ handleHoverCapabilityChange() {
404
+ this.updateHoverDropdownEnabled();
405
+ }
406
+ handleViewportChange() {
407
+ if (this.desktopMediaQuery?.matches) {
408
+ this.closeMenu();
409
+ }
410
+ this.updateHoverDropdownEnabled();
411
+ }
412
+ isMobileMenuActive() {
413
+ return this.menuOpen && !this.desktopMediaQuery?.matches;
414
+ }
360
415
  watchLayout() {
361
416
  this.resolve();
362
417
  }
@@ -408,18 +463,40 @@ const WegHeader = class {
408
463
  return;
409
464
  this.openDropdownMenu(label);
410
465
  }
411
- handleDropdownPointerLeave() {
466
+ handleDropdownPointerLeave(event) {
412
467
  if (!this.hoverOpenEnabled)
413
468
  return;
469
+ const related = event.relatedTarget;
470
+ const container = event.currentTarget;
471
+ if (related && container.contains(related))
472
+ return;
414
473
  this.scheduleDropdownClose();
415
474
  }
416
- handleDropdownFocusIn(label) {
475
+ handleDropdownPanelPointerEnter(label) {
476
+ if (!this.hoverOpenEnabled)
477
+ return;
478
+ this.cancelScheduledDropdownClose();
417
479
  this.openDropdownMenu(label);
418
480
  }
481
+ handleDropdownPanelPointerLeave(event) {
482
+ if (!this.hoverOpenEnabled)
483
+ return;
484
+ const related = event.relatedTarget;
485
+ const panel = event.currentTarget;
486
+ const container = panel.closest('.nav-dropdown');
487
+ if (related && container?.contains(related))
488
+ return;
489
+ this.scheduleDropdownClose();
490
+ }
491
+ handleDropdownTriggerClick(event, label) {
492
+ event.stopPropagation();
493
+ this.cancelScheduledDropdownClose();
494
+ this.toggleDropdown(label);
495
+ }
419
496
  handleDropdownFocusOut(event, label) {
420
497
  const related = event.relatedTarget;
421
- const currentTarget = event.currentTarget;
422
- if (related && currentTarget.contains(related))
498
+ const container = event.currentTarget;
499
+ if (related && container.contains(related))
423
500
  return;
424
501
  if (this.openDropdown === label) {
425
502
  this.closeDropdown();
@@ -434,62 +511,74 @@ const WegHeader = class {
434
511
  }
435
512
  focusFirstDropdownLink(itemEl) {
436
513
  setTimeout(() => {
437
- const firstLink = itemEl.querySelector('.dropdown-panel__link');
514
+ const firstLink = itemEl.querySelector('.nav-dropdown__link');
438
515
  firstLink?.focus();
439
516
  }, 0);
440
517
  }
441
- toggleAccordion(label) {
442
- this.expandedSection = this.expandedSection === label ? null : label;
518
+ toggleMenu() {
519
+ if (this.menuOpen) {
520
+ this.closeMenu();
521
+ return;
522
+ }
523
+ this.openMenu();
443
524
  }
444
525
  openMenu() {
445
526
  this.menuOpen = true;
446
- this.expandedSection = null;
527
+ this.closeDropdown();
447
528
  }
448
529
  closeMenu() {
449
530
  this.menuOpen = false;
450
- this.expandedSection = null;
451
- }
452
- getActiveHeaderData() {
453
- if (!this.signedIn)
454
- return this.resolved;
455
- return {
456
- logoHref: SIGNED_IN_HEADER.logoHref,
457
- dropdowns: [],
458
- links: [...SIGNED_IN_HEADER.links],
459
- signIn: null,
460
- signOut: SIGNED_IN_HEADER.signOut,
461
- };
531
+ this.closeDropdown();
532
+ }
533
+ getActiveMenu() {
534
+ return this.signedIn ? SIGNED_IN_MENU : this.resolved.menu;
535
+ }
536
+ getLogoSrc() {
537
+ return this.resolved.logoSrc ?? LOGO_SRC;
462
538
  }
463
539
  getLogoHref() {
464
- return this.getActiveHeaderData().logoHref;
540
+ return DEFAULT_LOGO_HREF;
541
+ }
542
+ findSignInLink(menu) {
543
+ for (const item of menu) {
544
+ if (!isMenuGroup(item) && isSignInLink(item))
545
+ return item;
546
+ }
547
+ return null;
465
548
  }
466
549
  getManageAccountLabel() {
467
550
  const name = this.userName?.trim();
468
551
  return name || 'Manage Account';
469
552
  }
470
- getAuthControl() {
471
- if (this.signedIn)
472
- return null;
473
- const signIn = this.resolved.signIn;
474
- if (!signIn)
475
- return null;
476
- return { label: signIn.label, href: signIn.href, action: 'sign-in' };
477
- }
478
- handleAuthClick(event, onNavigate) {
479
- const auth = this.getAuthControl() ?? {
480
- href: SIGNED_IN_HEADER.signOut.href,
481
- action: 'sign-out',
482
- };
483
- const emitted = this.wegAuthClick.emit({ action: auth.action });
553
+ renderIconNavLink(link, Icon, className, onNavigate) {
554
+ return (index.h("li", { class: "main-nav__item main-nav__item--auth", key: link.label }, index.h("a", { class: { 'sign-in-link': true, [className]: true }, href: link.href, onClick: () => onNavigate?.() }, index.h(Icon, null), link.label)));
555
+ }
556
+ renderFlatNavLink(link, onNavigate) {
557
+ return (index.h("li", { class: "main-nav__item", key: link.label }, index.h("a", { class: "nav-link", href: link.href, onClick: () => onNavigate?.() }, link.label)));
558
+ }
559
+ renderMenuGroup(item, onNavigate) {
560
+ const items = item.items ?? [];
561
+ const isOpen = this.openDropdown === item.label;
562
+ const panelId = this.getDropdownPanelId(item.label);
563
+ return (index.h("li", { class: "main-nav__item main-nav__item--dropdown", key: item.label }, index.h("div", { class: "nav-dropdown", onMouseEnter: () => this.handleDropdownPointerEnter(item.label), onMouseLeave: (event) => this.handleDropdownPointerLeave(event), onFocusout: (event) => this.handleDropdownFocusOut(event, item.label) }, index.h("button", { type: "button", class: {
564
+ 'nav-dropdown__trigger': true,
565
+ 'nav-dropdown__trigger--open': isOpen,
566
+ }, "aria-expanded": isOpen ? 'true' : 'false', "aria-haspopup": "true", "aria-controls": panelId, id: `${panelId}-trigger`, onClick: (event) => this.handleDropdownTriggerClick(event, item.label), onKeyDown: (event) => {
567
+ const container = event.currentTarget.closest('.nav-dropdown');
568
+ this.handleDropdownTriggerKeyDown(event, item.label, container);
569
+ } }, index.h("span", { class: "nav-dropdown__label" }, item.label), index.h(ToggleIcon, { expanded: isOpen })), isOpen ? (index.h("div", { class: "nav-dropdown__panel", id: panelId, role: "region", "aria-labelledby": `${panelId}-trigger`, onMouseEnter: () => this.handleDropdownPanelPointerEnter(item.label), onMouseLeave: (event) => this.handleDropdownPanelPointerLeave(event) }, index.h("div", { class: "nav-dropdown__accent" }, index.h("div", { class: "nav-dropdown__links" }, items.map((child) => (index.h("a", { class: "nav-dropdown__link", href: child.href, key: `${item.label}:${child.label}`, onClick: () => onNavigate?.() }, child.label))))))) : null)));
570
+ }
571
+ handleAuthClick(event, action, href, onNavigate) {
572
+ const emitted = this.wegAuthClick.emit({ action });
484
573
  if (emitted.defaultPrevented) {
485
574
  event.preventDefault();
486
575
  onNavigate?.();
487
576
  return;
488
577
  }
489
- if (auth.action === 'sign-out') {
578
+ if (action === 'sign-out') {
490
579
  event.preventDefault();
491
- if (auth.href) {
492
- window.location.assign(auth.href);
580
+ if (href) {
581
+ window.location.assign(href);
493
582
  }
494
583
  onNavigate?.();
495
584
  return;
@@ -497,71 +586,70 @@ const WegHeader = class {
497
586
  onNavigate?.();
498
587
  }
499
588
  renderAuthControl(options) {
500
- const auth = this.getAuthControl();
501
- if (!auth)
502
- return null;
503
- const sharedClass = {
504
- 'sign-in-link': !options.iconOnly,
505
- 'icon-button': !!options.iconOnly,
506
- [options.className || '']: !!options.className,
507
- };
508
- const content = [
509
- index.h(SignInIcon, { key: "icon" }),
510
- !options.iconOnly ? auth.label : null,
511
- options.iconOnly ? index.h("span", { class: "sr-only" }, auth.label) : null,
512
- ];
513
- return (index.h("a", { class: sharedClass, href: auth.href, "aria-label": auth.label, onClick: (event) => this.handleAuthClick(event, options.onNavigate) }, content));
514
- }
515
- renderSignedInAuthControls(options) {
516
- const manageAccountLabel = this.getManageAccountLabel();
517
- const signOut = SIGNED_IN_HEADER.signOut;
518
- if (options.iconOnly) {
519
- return (index.h("a", { class: "icon-button manage-account-link", href: SIGNED_IN_HEADER.manageAccount.href, "aria-label": manageAccountLabel, onClick: () => options.onNavigate?.() }, index.h(SignInIcon, null), index.h("span", { class: "sr-only" }, manageAccountLabel)));
589
+ const { link, action, iconOnly, onNavigate } = options;
590
+ const Icon = action === 'sign-out' ? SignOutIcon : SignInIcon;
591
+ const classSuffix = action === 'sign-out' ? 'sign-out-link' : 'sign-in-link';
592
+ return (index.h("a", { class: {
593
+ [classSuffix]: !iconOnly,
594
+ 'icon-button': !!iconOnly,
595
+ [options.className || '']: !!options.className,
596
+ }, href: link.href, "aria-label": link.label, onClick: (event) => this.handleAuthClick(event, action, link.href, onNavigate) }, index.h(Icon, null), !iconOnly ? link.label : null, iconOnly ? index.h("span", { class: "sr-only" }, link.label) : null));
597
+ }
598
+ renderManageAccountAnchor(onNavigate, iconOnly = false) {
599
+ const label = this.getManageAccountLabel();
600
+ return (index.h("a", { class: {
601
+ 'sign-in-link': !iconOnly,
602
+ 'manage-account-link': true,
603
+ 'icon-button': iconOnly,
604
+ }, href: ACCOUNT_MANAGE_HREF, "aria-label": label, onClick: () => onNavigate?.() }, index.h(SignInIcon, null), !iconOnly ? label : null, iconOnly ? index.h("span", { class: "sr-only" }, label) : null));
605
+ }
606
+ renderNavItem(item, onNavigate) {
607
+ if (isMenuGroup(item)) {
608
+ return this.renderMenuGroup(item, onNavigate);
609
+ }
610
+ if (isSignOutLink(item)) {
611
+ return (index.h("li", { class: "main-nav__item main-nav__item--auth", key: "sign-out" }, this.renderAuthControl({ link: item, action: 'sign-out', onNavigate })));
612
+ }
613
+ if (isSignInLink(item)) {
614
+ return (index.h("li", { class: "main-nav__item main-nav__item--auth", key: "sign-in" }, this.renderAuthControl({ link: item, action: 'sign-in', onNavigate })));
615
+ }
616
+ if (isManageAccountLink(item)) {
617
+ return (index.h("li", { class: "main-nav__item main-nav__item--auth", key: "manage-account" }, this.renderManageAccountAnchor(onNavigate)));
618
+ }
619
+ if (this.signedIn && isFindJobLink(item)) {
620
+ return this.renderIconNavLink(item, FindJobIcon, 'find-a-job-link', onNavigate);
621
+ }
622
+ if (this.signedIn && isDashboardLink(item)) {
623
+ return this.renderIconNavLink(item, DashboardIcon, 'dashboard-link', onNavigate);
624
+ }
625
+ return this.renderFlatNavLink(item, onNavigate);
626
+ }
627
+ renderNav(onNavigate) {
628
+ return (index.h("nav", { class: "main-nav", "aria-label": "Main" }, index.h("ul", { class: "main-nav__list" }, this.getActiveMenu().map((item) => this.renderNavItem(item, onNavigate)))));
629
+ }
630
+ renderCompactAuth(onNavigate) {
631
+ if (this.signedIn) {
632
+ return this.renderManageAccountAnchor(onNavigate, true);
520
633
  }
521
- return [
522
- index.h("li", { class: "desktop-nav__item", key: "manage-account" }, index.h("a", { class: "sign-in-link manage-account-link", href: SIGNED_IN_HEADER.manageAccount.href, "aria-label": manageAccountLabel, onClick: () => options.onNavigate?.() }, index.h(SignInIcon, null), manageAccountLabel)),
523
- index.h("li", { class: "desktop-nav__item", key: "sign-out" }, index.h("a", { class: "sign-in-link sign-out-link", href: signOut.href, "aria-label": signOut.label, onClick: (event) => this.handleAuthClick(event, options.onNavigate) }, index.h(SignOutIcon, null), signOut.label)),
524
- ];
525
- }
526
- renderDesktop() {
527
- const { dropdowns, links } = this.getActiveHeaderData();
528
- return (index.h("div", { class: "desktop" }, index.h(Logo, { href: this.getLogoHref() }), index.h("nav", { class: "desktop-nav", "aria-label": "Main" }, index.h("ul", { class: "desktop-nav__list" }, dropdowns.map((dropdown) => {
529
- const isOpen = this.openDropdown === dropdown.label;
530
- const panelId = this.getDropdownPanelId(dropdown.label);
531
- return (index.h("li", { class: "desktop-nav__item desktop-nav__item--dropdown", key: dropdown.label, onMouseEnter: () => this.handleDropdownPointerEnter(dropdown.label), onMouseLeave: () => this.handleDropdownPointerLeave(), onFocusin: () => this.handleDropdownFocusIn(dropdown.label), onFocusout: (event) => this.handleDropdownFocusOut(event, dropdown.label) }, index.h("button", { type: "button", class: {
532
- 'dropdown-trigger': true,
533
- 'dropdown-trigger--open': isOpen,
534
- }, "aria-expanded": isOpen ? 'true' : 'false', "aria-haspopup": "true", "aria-controls": panelId, id: `${panelId}-trigger`, onClick: (event) => {
535
- event.stopPropagation();
536
- this.toggleDropdown(dropdown.label);
537
- }, onKeyDown: (event) => {
538
- const itemEl = event.currentTarget.closest('.desktop-nav__item--dropdown');
539
- this.handleDropdownTriggerKeyDown(event, dropdown.label, itemEl);
540
- } }, dropdown.label, index.h(ToggleIcon, { expanded: isOpen })), isOpen ? (index.h("div", { class: "dropdown-panel", id: panelId, role: "region", "aria-labelledby": `${panelId}-trigger` }, index.h("div", { class: "dropdown-panel__accent" }, index.h("div", { class: "dropdown-panel__links" }, dropdown.items.map((item) => (index.h("a", { class: "dropdown-panel__link", href: item.href, key: `${dropdown.label}:${item.label}` }, item.label))))))) : null));
541
- }), links.map((link) => (index.h("li", { class: "desktop-nav__item", key: link.label }, index.h("a", { class: "nav-link", href: link.href }, link.label)))), this.signedIn
542
- ? this.renderSignedInAuthControls({})
543
- : this.getAuthControl()
544
- ? index.h("li", { class: "desktop-nav__item" }, this.renderAuthControl({}))
545
- : null))));
546
- }
547
- renderMobileBar() {
548
- return (index.h("div", { class: "mobile" }, index.h("button", { type: "button", class: "icon-button", "aria-label": "Open menu", onClick: () => this.openMenu() }, index.h(HamburgerIcon, null)), index.h(Logo, { href: this.getLogoHref() }), this.signedIn
549
- ? this.renderSignedInAuthControls({ iconOnly: true })
550
- : this.renderAuthControl({ iconOnly: true })));
551
- }
552
- renderMobileOverlay() {
553
- if (!this.menuOpen)
634
+ const signIn = this.findSignInLink(this.resolved.menu);
635
+ if (!signIn?.href)
554
636
  return null;
555
- const { dropdowns, links } = this.getActiveHeaderData();
556
- return (index.h("div", { class: "mobile-overlay", role: "dialog", "aria-modal": "true", "aria-label": "Menu" }, index.h("div", { class: "mobile-overlay__header" }, index.h("button", { type: "button", class: "icon-button", "aria-label": "Close menu", onClick: () => this.closeMenu() }, index.h(CloseIcon, null)), index.h("div", { class: "mobile-overlay__logo" }, index.h(Logo, { href: this.getLogoHref() })), this.signedIn
557
- ? this.renderSignedInAuthControls({ iconOnly: true, onNavigate: () => this.closeMenu() })
558
- : this.renderAuthControl({ iconOnly: true, onNavigate: () => this.closeMenu() })), index.h("nav", { class: "mobile-nav", "aria-label": "Main" }, dropdowns.map((dropdown) => {
559
- const isExpanded = this.expandedSection === dropdown.label;
560
- return (index.h("div", { class: "mobile-nav__section", key: dropdown.label }, index.h("button", { type: "button", class: "mobile-nav__row", "aria-expanded": isExpanded ? 'true' : 'false', onClick: () => this.toggleAccordion(dropdown.label) }, index.h("span", null, dropdown.label), index.h(ToggleIcon, { expanded: isExpanded })), isExpanded ? (index.h("div", { class: "mobile-nav__sub" }, dropdown.items.map((item) => (index.h("a", { class: "mobile-nav__sub-link", href: item.href, key: `${dropdown.label}:${item.label}`, onClick: () => this.closeMenu() }, item.label))))) : null));
561
- }), links.map((link) => (index.h("div", { class: "mobile-nav__section", key: link.label }, index.h("a", { class: "mobile-nav__row", href: link.href, onClick: () => this.closeMenu() }, link.label)))), this.signedIn ? (index.h("div", { class: "mobile-nav__section" }, index.h("a", { class: "mobile-nav__row manage-account-link", href: SIGNED_IN_HEADER.manageAccount.href, onClick: () => this.closeMenu() }, this.getManageAccountLabel()), index.h("a", { class: "mobile-nav__row sign-out-link", href: SIGNED_IN_HEADER.signOut.href, onClick: (event) => this.handleAuthClick(event, () => this.closeMenu()) }, index.h(SignOutIcon, null), SIGNED_IN_HEADER.signOut.label))) : null)));
637
+ return this.renderAuthControl({
638
+ link: signIn,
639
+ action: 'sign-in',
640
+ iconOnly: true,
641
+ onNavigate,
642
+ });
562
643
  }
563
644
  render() {
564
- return (index.h("header", { key: 'fc00e4afd015b291311939ba30f4ae3070957864', class: "header" }, index.h("div", { key: 'f2c8ed2c4e702e0a85acfbccd91165f5a2e1ff7a', class: "container" }, this.renderDesktop(), this.renderMobileBar()), this.renderMobileOverlay()));
645
+ const logoHref = this.getLogoHref();
646
+ const logoSrc = this.getLogoSrc();
647
+ const closeMenu = () => this.closeMenu();
648
+ const mobileMenuActive = this.isMobileMenuActive();
649
+ return (index.h("header", { key: 'ce1a217dd1eda9bb72b506c187a5c6a0848de3a6', class: {
650
+ header: true,
651
+ 'header--menu-open': mobileMenuActive,
652
+ } }, index.h("div", { key: '535d54f8eb512158c6048d748fccce4feb097cc0', class: "container header-inner" }, index.h("button", { key: '51a0fead049fadcbee17c8e622a35b1d2d8be99c', type: "button", class: "menu-toggle icon-button", "aria-label": mobileMenuActive ? 'Close menu' : 'Open menu', "aria-expanded": mobileMenuActive ? 'true' : 'false', "aria-controls": "weg-header-main-nav", onClick: () => this.toggleMenu() }, mobileMenuActive ? index.h(CloseIcon, null) : index.h(HamburgerIcon, null)), index.h(Logo, { key: '6f5693bfec5d8fe196ca3e4ff565506b6c3d3421', href: logoHref, src: logoSrc }), index.h("div", { key: '9f846e47cb68b6158e832fdffda5973e5e1554f4', class: "header-actions" }, this.renderCompactAuth(mobileMenuActive ? closeMenu : undefined)), index.h("div", { key: 'e18db3c24e934200595a1216dc74f3dcb8ad0e67', class: "main-nav-panel", id: "weg-header-main-nav", role: mobileMenuActive ? 'dialog' : undefined, "aria-modal": mobileMenuActive ? 'true' : undefined, "aria-label": mobileMenuActive ? 'Menu' : undefined }, this.renderNav(mobileMenuActive ? closeMenu : undefined)))));
565
653
  }
566
654
  static get watchers() { return {
567
655
  "layout": [{