@pnx-mixtape/mxds 0.1.0-rc.4 → 0.1.0-rc.6

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 (236) hide show
  1. package/.claude/skills/create-mxds-component/SKILL.md +77 -0
  2. package/DESIGN.md +595 -0
  3. package/README.md +2 -3
  4. package/dist/build/accordion.entry.js +2 -1
  5. package/dist/build/autocomplete.entry.js +1 -1
  6. package/dist/build/back-to-top.css +1 -0
  7. package/dist/build/back-to-top.entry.js +1 -0
  8. package/dist/build/base.css +1 -1
  9. package/dist/build/button.css +1 -1
  10. package/dist/build/card.css +1 -1
  11. package/dist/build/chunks/Accordion-Bqe8vTNR.js +44 -0
  12. package/dist/build/chunks/AccordionGroup-BYtoAFxg.js +47 -0
  13. package/dist/build/chunks/AccordionMobile-D517oXYZ.js +26 -0
  14. package/dist/build/chunks/Autocomplete-kRo8RNbC.js +135 -0
  15. package/dist/build/chunks/BackToTop-4M-Wl7z3.js +64 -0
  16. package/dist/build/chunks/ClosableAlert-CZ114JsL.js +55 -0
  17. package/dist/build/chunks/CookieConsent-wd8gQ2Oe.js +18 -0
  18. package/dist/build/chunks/Dialog-DoYcGqhW.js +48 -0
  19. package/dist/build/chunks/DropMenu-CSTZq0Zt.js +68 -0
  20. package/dist/build/chunks/FeedbackForm-BsL7fv8s.js +64 -0
  21. package/dist/build/chunks/Gallery-DqJPujX5.js +165 -0
  22. package/dist/build/chunks/GlobalToggle-7H3F1Wvc.js +82 -0
  23. package/dist/build/chunks/InPageNavigation-D7m3IN89.js +86 -0
  24. package/dist/build/chunks/Navigation-CRModT40.js +142 -0
  25. package/dist/build/chunks/Popover-CiTAftNU.js +30 -0
  26. package/dist/build/chunks/Sticky-C1H8MNqK.js +51 -0
  27. package/dist/build/chunks/Tabs-BJD3kABL.js +160 -0
  28. package/dist/build/chunks/Translate-yAgySwet.js +46 -0
  29. package/dist/build/chunks/cookie-compliance-CG6x-TcV.js +119 -0
  30. package/dist/build/chunks/enums-BrHxPZZ_.js +36 -0
  31. package/dist/build/chunks/polyfills-D-qh1a_2.js +33 -0
  32. package/dist/build/chunks/utilities-B9mNRs7V.js +255 -0
  33. package/dist/build/content-block.css +1 -1
  34. package/dist/build/cookie-consent.entry.js +1 -1
  35. package/dist/build/dialog.entry.js +1 -1
  36. package/dist/build/drop-menu.entry.js +1 -1
  37. package/dist/build/elements.js +147 -1
  38. package/dist/build/feedback-form.css +1 -0
  39. package/dist/build/feedback-form.entry.js +1 -0
  40. package/dist/build/filters.entry.js +145 -1
  41. package/dist/build/form.css +1 -1
  42. package/dist/build/gallery.entry.js +1 -1
  43. package/dist/build/global-alert.entry.js +1 -1
  44. package/dist/build/header.css +1 -1
  45. package/dist/build/header.entry.js +1 -1
  46. package/dist/build/icon.css +1 -1
  47. package/dist/build/in-page-navigation.entry.js +1 -1
  48. package/dist/build/navigation.css +1 -1
  49. package/dist/build/navigation.entry.js +1 -1
  50. package/dist/build/pagination.css +1 -1
  51. package/dist/build/popover.entry.js +1 -1
  52. package/dist/build/react.js +2291 -1
  53. package/dist/build/side-navigation.css +1 -1
  54. package/dist/build/sidebar.css +1 -1
  55. package/dist/build/sticky.entry.js +1 -1
  56. package/dist/build/tabs.entry.js +1 -1
  57. package/dist/build/translate.css +1 -0
  58. package/dist/build/translate.entry.js +1 -0
  59. package/dist/build/utility-list.entry.js +53 -1
  60. package/dist/types/Component/BackToTop/BackToTop.d.ts +20 -0
  61. package/dist/types/Component/BackToTop/BackToTop.d.ts.map +1 -0
  62. package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts +27 -0
  63. package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts.map +1 -0
  64. package/dist/types/Component/BackToTop/back-to-top.entry.d.ts +2 -0
  65. package/dist/types/Component/BackToTop/back-to-top.entry.d.ts.map +1 -0
  66. package/dist/types/Component/DropMenu/DropMenu.d.ts +2 -1
  67. package/dist/types/Component/DropMenu/DropMenu.d.ts.map +1 -1
  68. package/dist/types/Component/Navigation/Elements/Navigation.d.ts +2 -3
  69. package/dist/types/Component/Navigation/Elements/Navigation.d.ts.map +1 -1
  70. package/dist/types/Component/SideNavigation/Components/SideNavigationTree.d.ts +3 -3
  71. package/dist/types/Component/SideNavigation/Components/SideNavigationTree.d.ts.map +1 -1
  72. package/dist/types/Component/SideNavigation/SideNavigation.d.ts +3 -1
  73. package/dist/types/Component/SideNavigation/SideNavigation.d.ts.map +1 -1
  74. package/dist/types/Component/Tabs/Components/TabDropMenu.d.ts.map +1 -1
  75. package/dist/types/Component/Tabs/Elements/Tabs.d.ts.map +1 -1
  76. package/dist/types/Component/Translate/Elements/Translate.d.ts +23 -0
  77. package/dist/types/Component/Translate/Elements/Translate.d.ts.map +1 -0
  78. package/dist/types/Component/Translate/Translate.d.ts +37 -0
  79. package/dist/types/Component/Translate/Translate.d.ts.map +1 -0
  80. package/dist/types/Component/Translate/languages.d.ts +11 -0
  81. package/dist/types/Component/Translate/languages.d.ts.map +1 -0
  82. package/dist/types/Component/Translate/translate.entry.d.ts +2 -0
  83. package/dist/types/Component/Translate/translate.entry.d.ts.map +1 -0
  84. package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts +37 -0
  85. package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts.map +1 -0
  86. package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts +36 -0
  87. package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts.map +1 -0
  88. package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts +2 -0
  89. package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts.map +1 -0
  90. package/dist/types/Utility/Elements/google-translate-widget.d.ts +91 -0
  91. package/dist/types/Utility/Elements/google-translate-widget.d.ts.map +1 -0
  92. package/dist/types/Utility/utilities.d.ts +2 -0
  93. package/dist/types/Utility/utilities.d.ts.map +1 -1
  94. package/dist/types/elements.d.ts +3 -0
  95. package/dist/types/elements.d.ts.map +1 -1
  96. package/dist/types/enums.d.ts +3 -1
  97. package/dist/types/enums.d.ts.map +1 -1
  98. package/dist/types/react.d.ts +3 -0
  99. package/dist/types/react.d.ts.map +1 -1
  100. package/dist/types/tokens.d.ts +1 -0
  101. package/dist/types/tokens.d.ts.map +1 -1
  102. package/docs/API.md +1215 -0
  103. package/docs/CSSGuidelines.md +893 -0
  104. package/docs/CodeQuality.md +940 -0
  105. package/docs/ComponentArchitecture.md +714 -0
  106. package/docs/Contributing.md +626 -0
  107. package/docs/MemoryManagement.md +598 -0
  108. package/docs/Migrations.md +6 -0
  109. package/docs/README.md +100 -0
  110. package/docs/Security.md +444 -0
  111. package/docs/Testing.md +739 -0
  112. package/docs/Troubleshooting.md +674 -0
  113. package/package.json +9 -6
  114. package/src/Atom/Button/Button.tsx +1 -1
  115. package/src/Atom/Button/__snapshots__/Button.stories.tsx.snap +2 -2
  116. package/src/Atom/Button/_buttons.css +1 -0
  117. package/src/Atom/Icon/README.md +1 -1
  118. package/src/Atom/Icon/_icon.css +1 -0
  119. package/src/Atom/Icon/images/thumb.svg +1 -0
  120. package/src/Atom/Link/_links.css +1 -0
  121. package/src/Atom/Media/__snapshots__/Media.stories.ts.snap +4 -9
  122. package/src/Atom/Media/media.twig +4 -5
  123. package/src/Component/BackToTop/BackToTop.stories.ts +127 -0
  124. package/src/Component/BackToTop/BackToTop.stories.tsx +53 -0
  125. package/src/Component/BackToTop/BackToTop.tsx +120 -0
  126. package/src/Component/BackToTop/Elements/BackToTop.ts +119 -0
  127. package/src/Component/BackToTop/README.md +164 -0
  128. package/src/Component/BackToTop/__snapshots__/BackToTop.stories.ts.snap +24 -0
  129. package/src/Component/BackToTop/__snapshots__/BackToTop.stories.tsx.snap +3 -0
  130. package/src/Component/BackToTop/back-to-top.css +70 -0
  131. package/src/Component/BackToTop/back-to-top.entry.js +1 -0
  132. package/src/Component/BackToTop/back-to-top.twig +26 -0
  133. package/src/Component/Card/Components/CardContent.tsx +1 -1
  134. package/src/Component/Card/Components/CardMedia.tsx +1 -1
  135. package/src/Component/Card/__snapshots__/Card.stories.tsx.snap +3 -3
  136. package/src/Component/Card/card.css +1 -1
  137. package/src/Component/Carousel/Carousel.stories.ts +66 -36
  138. package/src/Component/Carousel/__snapshots__/Carousel.stories.tsx.snap +5 -5
  139. package/src/Component/ContentBlock/Components/ContentBlockMedia.tsx +1 -1
  140. package/src/Component/ContentBlock/content-block.css +1 -1
  141. package/src/Component/DropMenu/DropMenu.stories.ts +21 -2
  142. package/src/Component/DropMenu/DropMenu.tsx +14 -4
  143. package/src/Component/DropMenu/__snapshots__/DropMenu.stories.ts.snap +3 -3
  144. package/src/Component/DropMenu/__snapshots__/DropMenu.stories.tsx.snap +2 -2
  145. package/src/Component/DropMenu/drop-menu.twig +7 -1
  146. package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.tsx.snap +1 -1
  147. package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.ts.snap +48 -13
  148. package/src/Component/InPageNavigation/in-page-navigation.twig +4 -6
  149. package/src/Component/ListItem/Components/ListItemMedia.tsx +1 -1
  150. package/src/Component/Navigation/Elements/Navigation.ts +25 -29
  151. package/src/Component/Navigation/README.md +11 -10
  152. package/src/Component/Navigation/__snapshots__/Navigation.stories.ts.snap +8 -8
  153. package/src/Component/Navigation/_navigation-dropdown.css +9 -11
  154. package/src/Component/Navigation/_navigation-mega.css +5 -11
  155. package/src/Component/Navigation/_navigation.css +5 -3
  156. package/src/Component/Navigation/menu.twig +1 -1
  157. package/src/Component/Navigation/navigation.twig +0 -1
  158. package/src/Component/Pagination/Pagination.stories.ts +57 -27
  159. package/src/Component/Pagination/pagination.css +16 -7
  160. package/src/Component/Popover/__snapshots__/Popover.stories.tsx.snap +3 -3
  161. package/src/Component/SideNavigation/Components/SideNavigationTree.tsx +68 -24
  162. package/src/Component/SideNavigation/README.md +78 -32
  163. package/src/Component/SideNavigation/SideNavigation.stories.ts +41 -2
  164. package/src/Component/SideNavigation/SideNavigation.stories.tsx +31 -0
  165. package/src/Component/SideNavigation/SideNavigation.tsx +13 -3
  166. package/src/Component/SideNavigation/__snapshots__/SideNavigation.stories.ts.snap +87 -3
  167. package/src/Component/SideNavigation/__snapshots__/SideNavigation.stories.tsx.snap +2 -0
  168. package/src/Component/SideNavigation/side-navigation.css +3 -3
  169. package/src/Component/SideNavigation/side-navigation.twig +10 -3
  170. package/src/Component/Tabs/Components/TabDropMenu.tsx +7 -1
  171. package/src/Component/Tabs/Elements/Tabs.ts +13 -3
  172. package/src/Component/Tabs/Tabs.stories.ts +33 -12
  173. package/src/Component/Tabs/Tabs.stories.tsx +28 -14
  174. package/src/Component/Tabs/__snapshots__/Tabs.stories.ts.snap +3 -3
  175. package/src/Component/Tabs/__snapshots__/Tabs.stories.tsx.snap +2 -2
  176. package/src/Component/Translate/Elements/Translate.ts +76 -0
  177. package/src/Component/Translate/README.md +285 -0
  178. package/src/Component/Translate/Translate.stories.ts +87 -0
  179. package/src/Component/Translate/Translate.stories.tsx +77 -0
  180. package/src/Component/Translate/Translate.tsx +213 -0
  181. package/src/Component/Translate/__snapshots__/Translate.stories.ts.snap +18 -0
  182. package/src/Component/Translate/__snapshots__/Translate.stories.tsx.snap +3 -0
  183. package/src/Component/Translate/languages.ts +39 -0
  184. package/src/Component/Translate/translate.css +62 -0
  185. package/src/Component/Translate/translate.entry.js +1 -0
  186. package/src/Component/Translate/translate.twig +44 -0
  187. package/src/Form/Autocomplete/Autocomplete.stories.tsx +2 -1
  188. package/src/Form/FeedbackForm/Elements/FeedbackForm.ts +122 -0
  189. package/src/Form/FeedbackForm/FeedbackForm.stories.ts +99 -0
  190. package/src/Form/FeedbackForm/FeedbackForm.stories.tsx +73 -0
  191. package/src/Form/FeedbackForm/FeedbackForm.tsx +196 -0
  192. package/src/Form/FeedbackForm/README.md +233 -0
  193. package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.ts.snap +125 -0
  194. package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.tsx.snap +5 -0
  195. package/src/Form/FeedbackForm/feedback-form.css +74 -0
  196. package/src/Form/FeedbackForm/feedback-form.entry.js +1 -0
  197. package/src/Form/FeedbackForm/feedback-form.twig +80 -0
  198. package/src/Form/form.css +17 -19
  199. package/src/Introduction.mdx +1 -1
  200. package/src/Layout/Footer/__snapshots__/Footer.stories.ts.snap +3 -3
  201. package/src/Layout/Header/Components/GlobalToggle.tsx +1 -1
  202. package/src/Layout/Header/Header.stories.ts +53 -48
  203. package/src/Layout/Header/Header.stories.tsx +35 -22
  204. package/src/Layout/Header/Header.tsx +2 -2
  205. package/src/Layout/Header/__snapshots__/Header.stories.ts.snap +18 -14
  206. package/src/Layout/Header/__snapshots__/Header.stories.tsx.snap +2 -2
  207. package/src/Layout/Header/_toggles.css +7 -7
  208. package/src/Layout/Page/__snapshots__/Page.stories.tsx.snap +1 -1
  209. package/src/Layout/Sidebar/sidebar.css +10 -3
  210. package/src/Utility/Elements/google-translate-widget.ts +293 -0
  211. package/src/Utility/global.d.ts +4 -0
  212. package/src/Utility/utilities.ts +2 -0
  213. package/src/_custom-media.css +2 -0
  214. package/src/elements.ts +3 -0
  215. package/src/enums.ts +2 -0
  216. package/src/react.ts +3 -0
  217. package/src/tokens.js +1 -0
  218. package/dist/build/chunks/Accordion-GN0sME4W.js +0 -1
  219. package/dist/build/chunks/AccordionGroup-Bzqp5__q.js +0 -1
  220. package/dist/build/chunks/AccordionMobile-DG5jSe8Q.js +0 -1
  221. package/dist/build/chunks/Autocomplete-B4RtkAyh.js +0 -1
  222. package/dist/build/chunks/ClosableAlert-DEhj8Nxm.js +0 -1
  223. package/dist/build/chunks/CookieConsent-BkCMRVST.js +0 -1
  224. package/dist/build/chunks/Dialog-Haahn-Yn.js +0 -1
  225. package/dist/build/chunks/DropMenu-1baQc8Yc.js +0 -1
  226. package/dist/build/chunks/Gallery-D8NGXy2Q.js +0 -1
  227. package/dist/build/chunks/GlobalToggle-B52fdBQu.js +0 -1
  228. package/dist/build/chunks/InPageNavigation-Dyn2TR-N.js +0 -1
  229. package/dist/build/chunks/Navigation-hOrfLq7h.js +0 -1
  230. package/dist/build/chunks/Popover-Cxg-s5Jn.js +0 -1
  231. package/dist/build/chunks/Sticky-BGCuuEJK.js +0 -1
  232. package/dist/build/chunks/Tabs-DYy1YTdU.js +0 -15
  233. package/dist/build/chunks/cookie-compliance-Bbm-0vpj.js +0 -1
  234. package/dist/build/chunks/enums-DLV_1NAf.js +0 -1
  235. package/dist/build/chunks/polyfills-C7pRt54M.js +0 -1
  236. package/dist/build/chunks/utilities-_Bq3TxAQ.js +0 -1
@@ -0,0 +1,293 @@
1
+ /**
2
+ * @file Drives Google's "Website Translator" widget from custom UI, instead
3
+ * of Google's own default banner. Shared, framework-agnostic logic consumed
4
+ * identically by `Component/Translate`'s Web Component and its React
5
+ * component (the "singleton delegation" pattern also used by
6
+ * `CookieCompliance`).
7
+ *
8
+ * This is the only mxds utility that loads a third-party runtime script
9
+ * (`translate.google.com`) — see the Translate README's "Google Translate
10
+ * quirks" section for the caveats that come with that.
11
+ */
12
+
13
+ import { createElement } from "../utilities"
14
+
15
+ const DEFAULT_SCRIPT_URL = "https://translate.google.com/translate_a/element.js?cb=translateInit"
16
+ const DEFAULT_STORAGE_KEY = "googtrans"
17
+ const MOUNT_ID = "mx-translate-google-element"
18
+
19
+ export type GoogleTranslateWidgetNoticeConfig = {
20
+ /** Where to insert the notice. Defaults to the top of `<body>` if omitted. */
21
+ anchorSelector?: string
22
+ /** Insertion position relative to the anchor (standard `insertAdjacentElement` positions). Defaults to `afterend` when `anchorSelector` is set, `afterbegin` otherwise. */
23
+ position?: InsertPosition
24
+ /** Copy shown once a non-default language is active. */
25
+ content: string
26
+ /** Copy shown instead, on a blocked path. */
27
+ blockedContent?: string
28
+ }
29
+
30
+ export type GoogleTranslateWidgetConfig = {
31
+ defaultLanguage: string
32
+ blockedPaths?: string[]
33
+ scriptUrl?: string
34
+ storageKey?: string
35
+ /**
36
+ * Updates the trigger's visible language code + `aria-label` to reflect the active language.
37
+ * On by default — pass `false` to keep the trigger static instead (e.g. always "Language"),
38
+ * which some sites prefer.
39
+ */
40
+ updateTriggerLabel?: boolean
41
+ /**
42
+ * Notice banner shown once translated — entirely opt-in, omit to never create one. Created via
43
+ * JS (not pre-rendered) specifically so it can be inserted elsewhere on the page — e.g. below a
44
+ * header that only has room for the trigger itself, rather than wherever `<mx-translate>` is
45
+ * placed in the DOM.
46
+ */
47
+ notice?: GoogleTranslateWidgetNoticeConfig
48
+ onOpen?: () => void
49
+ onClose?: () => void
50
+ onLanguageChange?: (code: string) => void
51
+ }
52
+
53
+ export default class GoogleTranslateWidget {
54
+ root: HTMLElement
55
+ config: Required<Pick<GoogleTranslateWidgetConfig, "defaultLanguage">> &
56
+ Required<
57
+ Pick<
58
+ GoogleTranslateWidgetConfig,
59
+ "blockedPaths" | "scriptUrl" | "storageKey" | "updateTriggerLabel"
60
+ >
61
+ > &
62
+ Pick<GoogleTranslateWidgetConfig, "notice" | "onOpen" | "onClose" | "onLanguageChange">
63
+ controller?: AbortController
64
+ /** The most recently requested language — lets a slow/earlier `driveSelect` call notice it's been superseded and skip applying a stale value. */
65
+ pendingCode?: string
66
+ noticeEl?: HTMLElement
67
+ blockedNoticeEl?: HTMLElement
68
+
69
+ constructor(root: HTMLElement, config: GoogleTranslateWidgetConfig) {
70
+ this.root = root
71
+ // Per-field ?? rather than a blanket `...config` spread — an explicit
72
+ // `undefined` value (e.g. an unset optional React prop passed straight
73
+ // through) would otherwise silently overwrite these defaults.
74
+ this.config = {
75
+ defaultLanguage: config.defaultLanguage,
76
+ blockedPaths: config.blockedPaths ?? [],
77
+ scriptUrl: config.scriptUrl ?? DEFAULT_SCRIPT_URL,
78
+ storageKey: config.storageKey ?? DEFAULT_STORAGE_KEY,
79
+ updateTriggerLabel: config.updateTriggerLabel ?? true,
80
+ notice: config.notice,
81
+ onOpen: config.onOpen,
82
+ onClose: config.onClose,
83
+ onLanguageChange: config.onLanguageChange,
84
+ }
85
+ }
86
+
87
+ init(): void {
88
+ this.controller = new AbortController()
89
+ window.addEventListener("pageshow", this.handlePageshow, { signal: this.controller.signal })
90
+
91
+ const stored = this.getStoredLanguage()
92
+ if (!stored || stored === this.config.defaultLanguage) return
93
+
94
+ this.updateActiveItem(stored)
95
+ if (this.config.updateTriggerLabel) this.updateTriggerLabel(stored)
96
+ this.updateNotice(stored)
97
+ if (!this.isPathBlocked()) {
98
+ this.pendingCode = stored
99
+ this.loadScript()
100
+ .then(() => this.driveSelect(stored))
101
+ .catch(() => {})
102
+ }
103
+ }
104
+
105
+ destroy(): void {
106
+ this.controller?.abort()
107
+ this.noticeEl?.remove()
108
+ this.blockedNoticeEl?.remove()
109
+ }
110
+
111
+ /** Called when the consumer chooses a language from the menu. */
112
+ setLanguage(code: string): void {
113
+ this.updateActiveItem(code)
114
+ if (this.config.updateTriggerLabel) this.updateTriggerLabel(code)
115
+ this.updateNotice(code)
116
+
117
+ if (this.isPathBlocked()) return
118
+
119
+ this.persist(code)
120
+ this.pendingCode = code
121
+ this.loadScript()
122
+ .then(() => this.driveSelect(code))
123
+ .catch(() => {})
124
+ this.config.onLanguageChange?.(code)
125
+ }
126
+
127
+ getCurrentLanguage(): string {
128
+ return this.getStoredLanguage() ?? this.config.defaultLanguage
129
+ }
130
+
131
+ isPathBlocked(pathname: string = window.location.pathname): boolean {
132
+ return this.config.blockedPaths.some(path => pathname.startsWith(path))
133
+ }
134
+
135
+ private getStoredLanguage(): string | null {
136
+ try {
137
+ // Google's own format: "/<source>/<target>".
138
+ return window.localStorage.getItem(this.config.storageKey)?.split("/")[2] || null
139
+ } catch {
140
+ return null
141
+ }
142
+ }
143
+
144
+ private persist(code: string): void {
145
+ try {
146
+ window.localStorage.setItem(this.config.storageKey, `/${this.config.defaultLanguage}/${code}`)
147
+ } catch {
148
+ // Storage unavailable (private browsing, quota) — selection still applies this page view.
149
+ }
150
+ }
151
+
152
+ private getLanguageItem(code: string): HTMLAnchorElement | null {
153
+ return this.root.querySelector<HTMLAnchorElement>(`[data-language="${code}"]`)
154
+ }
155
+
156
+ private updateActiveItem(code: string): void {
157
+ this.root.querySelectorAll<HTMLAnchorElement>("[data-language]").forEach(item => {
158
+ if (item.dataset.language === code) item.setAttribute("aria-current", "true")
159
+ else item.removeAttribute("aria-current")
160
+ })
161
+ }
162
+
163
+ private updateTriggerLabel(code: string): void {
164
+ const trigger = this.root.querySelector<HTMLButtonElement>("[popovertarget]")
165
+ if (!trigger) return
166
+ const label = trigger.dataset.label || "Language"
167
+ const languageLabel = this.getLanguageItem(code)?.textContent?.trim() ?? code
168
+ trigger.setAttribute("aria-label", `${label}: ${languageLabel}, ${code.toUpperCase()}`)
169
+ const codeEl = trigger.querySelector(".mx-translate__code")
170
+ if (codeEl) codeEl.textContent = code.toUpperCase()
171
+ }
172
+
173
+ /**
174
+ * Creates the notice element(s) via JS, on first use, and inserts them at the configured
175
+ * anchor point — which may be anywhere on the page, not necessarily near `<mx-translate>`
176
+ * itself (e.g. the trigger lives in the header, but the notice should appear below it, or at
177
+ * the top of the page). Matches the original bond_theme implementation's approach.
178
+ *
179
+ * Styled as a (non-dismissible) `GlobalAlert` — a site-wide banner is the right fit for "this
180
+ * page is machine-translated", not a page-scoped `InPageAlert`. There's no close button and no
181
+ * `<mx-closable-alert>` wrapper; it reappears for as long as the active language warrants it,
182
+ * same as the rest of this component's state.
183
+ */
184
+ private createNotice(): void {
185
+ if (!this.config.notice || this.noticeEl) return
186
+ const { anchorSelector, position, content, blockedContent } = this.config.notice
187
+ const anchor = anchorSelector ? document.querySelector(anchorSelector) : document.body
188
+ if (!anchor) return
189
+ const resolvedPosition: InsertPosition =
190
+ position ?? (anchorSelector ? "afterend" : "afterbegin")
191
+
192
+ this.noticeEl = createElement(
193
+ `<div class="mx-global-alert mx-global-alert--light mx-page mx-translate__notice" role="status" aria-live="polite" aria-atomic="true" data-translate-notice hidden><div class="mx-global-alert__inner"><div class="mx-global-alert__content">${content}</div></div></div>`,
194
+ ) as HTMLElement
195
+ if (this.noticeEl) anchor.insertAdjacentElement(resolvedPosition, this.noticeEl)
196
+
197
+ if (blockedContent) {
198
+ this.blockedNoticeEl = createElement(
199
+ `<div class="mx-global-alert mx-global-alert--critical mx-page mx-translate__notice" role="alert" aria-live="assertive" aria-atomic="true" data-translate-notice-blocked hidden><div class="mx-global-alert__inner"><div class="mx-global-alert__content">${blockedContent}</div></div></div>`,
200
+ ) as HTMLElement
201
+ if (this.blockedNoticeEl) anchor.insertAdjacentElement(resolvedPosition, this.blockedNoticeEl)
202
+ }
203
+ }
204
+
205
+ private updateNotice(code: string): void {
206
+ if (!this.config.notice) return
207
+ this.createNotice()
208
+ const isTranslated = code !== this.config.defaultLanguage
209
+ const blocked = this.isPathBlocked()
210
+ this.noticeEl?.toggleAttribute("hidden", !(isTranslated && !blocked))
211
+ this.blockedNoticeEl?.toggleAttribute("hidden", !(isTranslated && blocked))
212
+ }
213
+
214
+ private loadScript(): Promise<void> {
215
+ if (window.mxTranslateScriptPromise) return window.mxTranslateScriptPromise
216
+
217
+ window.mxTranslateScriptPromise = new Promise((resolve, reject) => {
218
+ window.translateInit = () => {
219
+ // oxlint-disable-next-line no-new -- side-effecting Google API: renders into the mount point, returns nothing useful
220
+ new window.google.translate.TranslateElement(
221
+ { pageLanguage: this.config.defaultLanguage, autoDisplay: false },
222
+ this.getMountPoint(),
223
+ )
224
+ resolve()
225
+ }
226
+ const script = document.createElement("script")
227
+ script.src = this.config.scriptUrl
228
+ script.addEventListener("error", () => reject(new Error("Failed to load Google Translate")))
229
+ document.body.appendChild(script)
230
+ })
231
+
232
+ return window.mxTranslateScriptPromise
233
+ }
234
+
235
+ private getMountPoint(): string {
236
+ let mount = document.getElementById(MOUNT_ID)
237
+ if (!mount) {
238
+ mount = document.createElement("div")
239
+ mount.id = MOUNT_ID
240
+ mount.style.display = "none"
241
+ document.body.appendChild(mount)
242
+ }
243
+ return MOUNT_ID
244
+ }
245
+
246
+ /**
247
+ * Waits for Google's own hidden `<select>` to exist *and* contain an `<option>` for `code` —
248
+ * both are populated asynchronously after `TranslateElement` construction, on Google's own
249
+ * timeline. Setting `select.value` to a code with no matching `<option>` yet is a silent DOM
250
+ * no-op (the assignment is simply ignored), so waiting for only the `<select>` itself isn't
251
+ * enough — that's what let `driveSelect` silently fail to translate.
252
+ */
253
+ private waitForComboBoxOption(code: string, attempts = 20): Promise<HTMLSelectElement | null> {
254
+ return new Promise(resolve => {
255
+ const check = (remaining: number): void => {
256
+ const select = document.querySelector<HTMLSelectElement>(".goog-te-combo")
257
+ if (select?.querySelector(`option[value="${code}"]`)) {
258
+ resolve(select)
259
+ return
260
+ }
261
+ if (remaining <= 0) {
262
+ resolve(null)
263
+ return
264
+ }
265
+ setTimeout(() => check(remaining - 1), 100)
266
+ }
267
+ check(attempts)
268
+ })
269
+ }
270
+
271
+ private async driveSelect(code: string): Promise<void> {
272
+ const select = await this.waitForComboBoxOption(code)
273
+ // A newer selection arrived while this one was still waiting on the combo box — drop it
274
+ // rather than applying a stale value and firing a `change` event out of order.
275
+ if (this.pendingCode !== code) return
276
+ if (!select) return
277
+ select.value = code
278
+ select.dispatchEvent(new Event("change"))
279
+ }
280
+
281
+ /** Google's translator instance doesn't survive the back/forward cache — re-inject on restore. */
282
+ private handlePageshow = (event: PageTransitionEvent): void => {
283
+ if (!event.persisted) return
284
+ window.mxTranslateScriptPromise = undefined
285
+
286
+ const stored = this.getStoredLanguage()
287
+ if (!stored || stored === this.config.defaultLanguage || this.isPathBlocked()) return
288
+ this.pendingCode = stored
289
+ this.loadScript()
290
+ .then(() => this.driveSelect(stored))
291
+ .catch(() => {})
292
+ }
293
+ }
@@ -14,6 +14,10 @@ declare global {
14
14
  }
15
15
  CookieCompliance?: CookieCompliance
16
16
  once?: (name: string, selector: string, context?: any) => NodeListOf<HTMLElement>
17
+ // Google's Website Translator widget — see Utility/Elements/google-translate-widget.ts
18
+ google?: any
19
+ translateInit?: () => void
20
+ mxTranslateScriptPromise?: Promise<void>
17
21
  }
18
22
  }
19
23
 
@@ -7,6 +7,8 @@ export { default as DisclosureWidget } from "./Elements/disclosure-widget"
7
7
  export type { DisclosureWidgetEvent } from "./Elements/disclosure-widget"
8
8
  export { default as Keyboard } from "./Elements/keyboard"
9
9
  export { default as CookieCompliance } from "./Elements/cookie-compliance"
10
+ export { default as GoogleTranslateWidget } from "./Elements/google-translate-widget"
11
+ export type { GoogleTranslateWidgetConfig } from "./Elements/google-translate-widget"
10
12
  export { default as IntersectionLoader } from "./Elements/io-loader"
11
13
  export { default as BreakpointLoader } from "./Elements/breakpoint-loader"
12
14
  export { validators }
@@ -19,6 +19,8 @@
19
19
  @custom-media --global-nav-down (width < token("breakpoint.globalNav"));
20
20
  @custom-media --collapse-card-up (width >= token("breakpoint.collapsedCard"));
21
21
  @custom-media --collapse-card-down (token("breakpoint.xxs") < width < token("breakpoint.collapsedCard"));
22
+ @custom-media --sidebar-up (width >= token("breakpoint.globalNav"));
23
+ @custom-media --sidebar-down (width < token("breakpoint.globalNav"));
22
24
 
23
25
  /* Util media queries */
24
26
  @custom-media --touch (pointer: fine);
package/src/elements.ts CHANGED
@@ -14,4 +14,7 @@ export { default as Carousel } from "./Component/Carousel/Elements/Carousel"
14
14
  export { default as Autocomplete } from "./Form/Autocomplete/Elements/Autocomplete"
15
15
  export { default as CookieConsent } from "./Component/CookieConsent/Elements/CookieConsent"
16
16
  export { default as Gallery } from "./Component/Gallery/Elements/Gallery"
17
+ export { default as BackToTop } from "./Component/BackToTop/Elements/BackToTop"
18
+ export { default as FeedbackForm } from "./Form/FeedbackForm/Elements/FeedbackForm"
19
+ export { default as Translate } from "./Component/Translate/Elements/Translate"
17
20
  export * from "./Utility/utilities"
package/src/enums.ts CHANGED
@@ -113,6 +113,8 @@ export enum Icons {
113
113
  USER = "user",
114
114
  SHARE = "share",
115
115
  QUESTION = "question",
116
+ THUMB = "thumb",
117
+ GLOBE = "globe",
116
118
  }
117
119
 
118
120
  export enum PageWidths {
package/src/react.ts CHANGED
@@ -89,11 +89,14 @@ export { default as CookieConsent } from "./Component/CookieConsent/CookieConsen
89
89
  export { default as Gallery } from "./Component/Gallery/Gallery"
90
90
  export { default as GalleryTrigger } from "./Component/Gallery/Components/GalleryTrigger"
91
91
  export { default as ProgressIndicator } from "./Component/ProgressIndicator/ProgressIndicator"
92
+ export { default as BackToTop } from "./Component/BackToTop/BackToTop"
93
+ export { default as Translate } from "./Component/Translate/Translate"
92
94
  export { default as FormSearch } from "./Form/Search/FormSearch"
93
95
  export { default as Autocomplete } from "./Form/Autocomplete/Autocomplete"
94
96
  export { default as CheckboxCard } from "./Form/CheckboxCard/CheckboxCard"
95
97
  export { default as RadioCard } from "./Form/RadioCard/RadioCard"
96
98
  export { default as OneTimeCode } from "./Form/OneTimeCode/OneTimeCode"
99
+ export { default as FeedbackForm } from "./Form/FeedbackForm/FeedbackForm"
97
100
  export { default as Masthead } from "./Layout/Masthead/Masthead"
98
101
  export { default as Sidebar } from "./Layout/Sidebar/Sidebar"
99
102
  export { default as Footer } from "./Layout/Footer/Footer"
package/src/tokens.js CHANGED
@@ -44,6 +44,7 @@ export default {
44
44
  contentCard: "720px",
45
45
  collapsedCard: "720px",
46
46
  dropMenu: "420px",
47
+ sidebar: "720px",
47
48
  },
48
49
  colour: {
49
50
  primary: {
@@ -1 +0,0 @@
1
- import{s as e}from"./utilities-_Bq3TxAQ.js";var t=class extends HTMLElement{internals_;controller;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController}connectedCallback(){if(!this.details||!this.trigger)return;let{signal:e}=this.controller;document.addEventListener(`beforeprint`,this.handleOpen,{signal:e}),document.addEventListener(`afterprint`,this.handleClose,{signal:e}),this.handleHash(),document.addEventListener(`hashchange`,this.handleHash,{signal:e})}disconnectedCallback(){this.controller.abort()}handleOpen=()=>{this.details&&(this.details.open=!0)};handleClose=()=>{this.details&&(this.details.open=!1)};handleHash=()=>{let{hash:e}=window.location;e&&e===`#${this.details?.id}`&&this.handleOpen()};get details(){let e=this.querySelector(`details`);if(!e)throw Error(`${this.localName} must contain a <details> element.`);return e.id=e.id||this.generatedId(),e}get trigger(){let e=this.querySelector(`summary`);if(!e)throw Error(`${this.localName} must contain a <summary> element.`);return e}generatedId=()=>{let t=this.trigger?.textContent?.trim();return t?e(t):``}};customElements.get(`mx-accordion`)||customElements.define(`mx-accordion`,t);export{t};
@@ -1 +0,0 @@
1
- var e=class extends HTMLElement{internals_;controller;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController}connectedCallback(){if(!this.accordions||!this.expandTrigger||!this.collapseTrigger)return;this.handleToggle();let{signal:e}=this.controller;this.addEventListener(`click`,this.handleClick,{signal:e}),this.accordions.forEach(t=>t.addEventListener(`toggle`,this.handleToggle,{signal:e}))}disconnectedCallback(){this.controller.abort()}handleClick=({target:e})=>{e===this.expandTrigger&&this.handleExpand(),e===this.collapseTrigger&&this.handleCollapse()};handleExpand=()=>{this.accordions.forEach(e=>e.open=!0),this.expandTrigger.disabled=!0,this.collapseTrigger.disabled=!1};handleCollapse=()=>{this.accordions.forEach(e=>e.open=!1),this.expandTrigger.disabled=!1,this.collapseTrigger.disabled=!0};handleToggle=()=>{this.expandTrigger.disabled=[...this.accordions].every(e=>e.open===!0),this.collapseTrigger.disabled=[...this.accordions].every(e=>e.open!==!0)};get accordions(){let e=this.querySelectorAll(`details`);if(!e.length)throw Error(`${this.localName} must contain at least one <details> element.`);return e}get expandTrigger(){let e=this.querySelector(`button[data-expand]`);if(!e)throw Error(`${this.localName} must contain a <button data-expand> element.`);return e}get collapseTrigger(){let e=this.querySelector(`button[data-collapse]`);if(!e)throw Error(`${this.localName} must contain a <button data-collapse> element.`);return e}};customElements.get(`mx-accordion-group`)||customElements.define(`mx-accordion-group`,e);export{e as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./Accordion-GN0sME4W.js";var t=class extends e{mq;toggleAttribute;constructor(){super(),this.mq=this.getAttribute(`mq`)||`(max-width: 720px)`}connectedCallback(){super.connectedCallback(),this.handleBreakpoint(this.breakpoint);let{signal:e}=this.controller;this.breakpoint.addEventListener(`change`,this.handleBreakpoint,{signal:e})}disconnectedCallback(){this.controller.abort()}handleBreakpoint=({matches:e})=>{this.details&&this.details.toggleAttribute(`open`,!e)};get breakpoint(){return window.matchMedia(this.mq)}};customElements.get(`mx-accordionmobile`)||customElements.define(`mx-accordionmobile`,t);export{t};
@@ -1 +0,0 @@
1
- var e=class extends HTMLElement{internals_;controller;observer;activeOption;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController,this.activeOption=null}connectedCallback(){if(!this.input||!this.listbox||!this.status)return;let{signal:e}=this.controller;this.input.addEventListener(`input`,this.handleInput,{signal:e}),this.input.addEventListener(`keydown`,this.handleKeydown,{signal:e}),this.input.addEventListener(`focus`,this.handleFocus,{signal:e}),this.input.addEventListener(`blur`,this.handleBlur,{signal:e}),this.listbox.addEventListener(`mousedown`,this.handleListboxMousedown,{signal:e}),this.listbox.addEventListener(`click`,this.handleOptionClick,{signal:e}),this.observer=new MutationObserver(this.handleOptionsChange),this.observer.observe(this.listbox,{childList:!0})}disconnectedCallback(){this.controller.abort(),this.observer?.disconnect()}handleOptionsChange=()=>{this.activeOption&&!this.options.includes(this.activeOption)&&this.setActive(null),this.updateVisibility()};handleInput=()=>{this.setActive(null),this.dispatchSearch(),this.updateVisibility()};handleFocus=()=>{this.updateVisibility()};handleBlur=()=>{this.close()};handleListboxMousedown=e=>{e.preventDefault()};handleKeydown=e=>{if(!this.isOpen){(e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),this.updateVisibility());return}switch(e.key){case`ArrowDown`:e.preventDefault(),this.moveActive(1);break;case`ArrowUp`:e.preventDefault(),this.moveActive(-1);break;case`Home`:e.preventDefault(),this.setActive(this.visibleOptions[0]??null);break;case`End`:e.preventDefault(),this.setActive(this.visibleOptions.at(-1)??null);break;case`Enter`:if(!this.activeOption)return;e.preventDefault(),this.select(this.activeOption);break;case`Escape`:e.preventDefault(),this.close()}};handleOptionClick=e=>{let t=e.target.closest(`[role="option"]`);t&&this.select(t)};dispatchSearch(){let e=new CustomEvent(`mx-autocomplete-search`,{bubbles:!0,detail:{query:this.input.value.trim()}});this.dispatchEvent(e)}updateVisibility(){let e=this.input.value.trim().length>0,t=this.visibleOptions.length,n=e&&t>0;this.listbox.hidden=!n,this.input.setAttribute(`aria-expanded`,String(n)),this.status.textContent=e?t===0?this.noResultsLabel:`${t} result${t===1?``:`s`} available`:``}moveActive(e){let t=this.visibleOptions;if(t.length===0)return;let n=((this.activeOption?t.indexOf(this.activeOption):-1)+e+t.length)%t.length;this.setActive(t[n])}setActive(e){this.activeOption?.setAttribute(`aria-selected`,`false`),this.activeOption=e,e?.setAttribute(`aria-selected`,`true`),this.input.setAttribute(`aria-activedescendant`,e?.id??``),e?.scrollIntoView({block:`nearest`})}select(e){let t=e.textContent??``;this.input.value=t,this.close(),this.input.focus();let n=new CustomEvent(`mx-autocomplete-select`,{bubbles:!0,detail:{value:e.dataset.value??t,label:t}});this.dispatchEvent(n)}close(){this.listbox.hidden=!0,this.input.setAttribute(`aria-expanded`,`false`),this.status.textContent=``,this.setActive(null)}get isOpen(){return!this.listbox.hidden}get noResultsLabel(){return this.dataset.noResultsLabel||`No results found`}get control(){let e=this.querySelector(`[data-control]`);if(!e)throw Error(`${this.localName} must contain a [data-control] element.`);return e}get input(){let e=this.control.querySelector(`input[role="combobox"]`);if(!e)throw Error(`${this.localName} must contain an <input role="combobox">.`);return e}get listbox(){let e=this.querySelector(`[role="listbox"]`);if(!e)throw Error(`${this.localName} must contain a [role="listbox"] element.`);return e}get status(){let e=this.querySelector(`[data-autocomplete-status]`);if(!e)throw Error(`${this.localName} must contain a [data-autocomplete-status] element.`);return e}get options(){return Array.from(this.listbox.querySelectorAll(`[role="option"]`))}get visibleOptions(){return this.options.filter(e=>!e.hidden)}get pending(){return this.control.getAttribute(`aria-busy`)===`true`}set pending(e){this.control.setAttribute(`aria-busy`,String(e))}};customElements.get(`mx-autocomplete`)||customElements.define(`mx-autocomplete`,e);export{e as t};
@@ -1 +0,0 @@
1
- import{s as e,t}from"./utilities-_Bq3TxAQ.js";var n=class extends HTMLElement{internals_;controller;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController}connectedCallback(){if(!this.container)return;if(this.id=this.id||this.generatedId(),this.localStorage){this.controller.abort(),this.remove();return}let{signal:e}=this.controller;this.close?.addEventListener(`click`,this.handleClose,{signal:e})}disconnectedCallback(){this.controller.abort(),this.close.remove()}handleClose=()=>{this.controller.abort(),this.remove(),this.localStorage=`true`,document.body?.focus?.();let e=new CustomEvent(`GlobalAlert-close`,{bubbles:!0,cancelable:!0,detail:{id:this.id,target:this}});this.dispatchEvent(e)};get localStorage(){return localStorage.getItem(this.id)}set localStorage(e){localStorage.setItem(this.id,e)}get container(){let e=this.querySelector(`[data-container]`);if(!e)throw Error(`${this.localName} must contain a [data-container] element.`);return e}get close(){let e=this.querySelector(`.mx-icon--close`);return e||(e=t(`<button class="mx-icon mx-icon--close" aria-controls="${this.id}" aria-label="Close GlobalAlert" type="button"></button>`),this.container.appendChild(e)),e}generatedId(){let t=`mx-alert-${Math.floor(Math.random()*1e4)}`;return e(t,20)}};customElements.get(`mx-closable-alert`)||customElements.define(`mx-closable-alert`,n);export{n as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./cookie-compliance-Bbm-0vpj.js";var t=class extends HTMLElement{internals_;compliance;constructor(){super(),this.internals_=this.attachInternals()}connectedCallback(){this.compliance=new e(this),this.compliance.init()}disconnectedCallback(){this.compliance?.destroy()}};customElements.get(`mx-cookie-consent`)||customElements.define(`mx-cookie-consent`,t);export{t};
@@ -1 +0,0 @@
1
- import{i as e,r as t}from"./utilities-_Bq3TxAQ.js";var n=class extends HTMLElement{internals_;controller;scrollLockClass=`body--scroll-lock`;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController}connectedCallback(){if(!this.dialog)return;let{signal:n}=this.controller;this.openBtns?.forEach(e=>e.addEventListener(`click`,this.handleOpen,{signal:n})),this.closeBtns?.forEach(e=>e.addEventListener(`click`,this.handleClose,{signal:n})),document.addEventListener(`click`,t=>{this.dialog?.open&&e(t,this.dialog,this.handleClose,[...this.openBtns,...this.closeBtns])},{signal:n}),document.addEventListener(`keydown`,e=>{this.dialog?.open&&t(e,this.handleClose)},{signal:n})}disconnectedCallback(){this.dialog&&(typeof this.dialog.close==`function`&&this.dialog.close(),this.openBtns?.forEach(e=>e.setAttribute(`aria-expanded`,`false`)),this.isModal&&document.body.classList.remove(this.scrollLockClass),this.controller.abort())}handleOpen=e=>{this.dialog&&(e.preventDefault(),typeof this.dialog.show==`function`&&(this.isModal?this.dialog.showModal():this.dialog.show()),this.openBtns?.forEach(e=>e.setAttribute(`aria-expanded`,`true`)),this.isModal&&document.body.classList.add(this.scrollLockClass))};handleClose=()=>{this.dialog&&(typeof this.dialog.close==`function`&&this.dialog.close(),this.openBtns?.forEach(e=>e.setAttribute(`aria-expanded`,`false`)),this.isModal&&document.body.classList.remove(this.scrollLockClass))};get dialog(){let e=this.querySelector(`dialog`);if(!e)throw Error(`${this.localName} must contain a <dialog> element.`);return e}get openBtns(){let e=document.querySelectorAll(`[href="#${this.id}"], [aria-controls="${this.id}"]`);return e?.forEach(e=>{e.setAttribute(`aria-controls`,this.id)}),e}get closeBtns(){return this.querySelectorAll(`button[data-close]`)}get isModal(){return this.hasAttribute(`data-modal`)}};customElements.get(`mx-dialog`)||customElements.define(`mx-dialog`,n);export{n as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./Popover-Cxg-s5Jn.js";var t=class extends e{controller;closeOnClick;constructor(){super(),this.controller=new AbortController}async connectedCallback(){if(await super.connectedCallback(),!this.container||!this.trigger)return;this.closeOnClick=this.hasAttribute(`closeonclick`);let{signal:e}=this.controller;document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`a, button`);(t===this.container||[...this.items].includes(n))&&(this.handleSelect(e),e.preventDefault())},{signal:e}),document.addEventListener(`keydown`,e=>{let{target:t,key:n}=e,r=[...this.items];if(t===this.container||r.includes(t))switch(n){case`Enter`:e.preventDefault(),this.handleSelect(e);break;case`ArrowDown`:case`ArrowRight`:e.preventDefault(),this.moveFocus(t,1);break;case`ArrowUp`:case`ArrowLeft`:e.preventDefault(),this.moveFocus(t,-1);break;case`Home`:e.preventDefault(),r[0].focus();break;case`End`:e.preventDefault(),r.at(-1).focus()}},{signal:e})}disconnectedCallback(){this.controller.abort()}handleSelect=e=>{let t=e.target;this.items?.forEach(e=>{e instanceof HTMLButtonElement&&e.setAttribute(`aria-checked`,String(e===t))});let n=new CustomEvent(`drop-menu-select`,{bubbles:!0,cancelable:!0,detail:{event:e,target:t}});this.container.dispatchEvent(n),this.closeOnClick&&this.container.togglePopover()};moveFocus=(e,t)=>{let n=[...this.items],r=n.indexOf(e);if(r===-1)return;let i=r;for(let e=0;e<n.length&&(i=(i+t+n.length)%n.length,n[i].getAttribute(`tabindex`)===`-1`);e+=1);n[i]?.focus()};get items(){return this.container.querySelectorAll(`a, button`)}};customElements.get(`mx-dropmenu`)||customElements.define(`mx-dropmenu`,t);export{t};
@@ -1 +0,0 @@
1
- import{n as e}from"./cookie-compliance-Bbm-0vpj.js";import{t}from"./utilities-_Bq3TxAQ.js";import{t as n}from"./Dialog-Haahn-Yn.js";var r=class extends HTMLElement{internals_;controller;debounced;loop;paginationType;activePage;itemMap;iO;rO;mO;ioTimeout;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController}connectedCallback(){if(!this.track)return;this.buttons&&(this.buttons.hidden=!1),this.activePage=0,this.track.scrollLeft=0,this.debounced=null,this.loop=this.hasAttribute(`loop`);let{signal:e}=this.controller;this.prev&&(this.prev.disabled=!0,this.prev.addEventListener(`click`,()=>this.handleNavigation(this.activePage-1),{signal:e})),this.next&&this.next.addEventListener(`click`,()=>this.handleNavigation(this.activePage+1),{signal:e}),this.track.addEventListener(`scroll`,this.handleScroll,{signal:e}),this.pagination&&(this.paginationType=this.pagination.getAttribute(`data-pagination`),this.pagination.addEventListener(`click`,this.handlePagination,{signal:e})),Array.from(this.track.children).forEach((e,t)=>{e.setAttribute(`data-index`,String(t))});let t=this.track.querySelectorAll(`[data-index]`);this.itemMap=/* @__PURE__ */ new Map,this.iO=new IntersectionObserver(e=>{e.forEach(({target:e,intersectionRatio:t})=>{let n=e;t>.5?(n.removeAttribute(`inert`),n.setAttribute(`aria-hidden`,`false`),this.itemMap.set(n,!0)):(n.setAttribute(`inert`,``),n.setAttribute(`aria-hidden`,`true`),this.itemMap.set(n,!1))})},{root:this.track,threshold:.5}),t.forEach(e=>this.iO.observe(e)),this.rO=new ResizeObserver(e=>{e.forEach(()=>this.handleOverflow())}),this.rO.observe(this.track),this.mO=new MutationObserver(e=>{e.forEach(()=>this.handleOverflow())}),this.mO.observe(this.track,{childList:!0})}disconnectedCallback(){this.controller.abort(),this.mO.disconnect(),this.iO.disconnect(),this.rO.disconnect(),clearTimeout(this.debounced),clearTimeout(this.ioTimeout)}handleNavigation=(e,t=`arrow`)=>{let n=e>this.activePage,r=this.loop&&this.next.hasAttribute(`data-restart`);if(e===0||r&&n&&t===`arrow`){this.activePage=0,this.items[0].scrollIntoView({inline:`start`,block:`nearest`}),this.next.removeAttribute(`data-restart`);return}this.activePage=e,this.items[this.visibleCount*e].scrollIntoView({inline:`start`,block:`nearest`}),r&&!n&&this.next.removeAttribute(`data-restart`);let i=new CustomEvent(`carousel-slide`,{bubbles:!0,cancelable:!0,detail:{page:this.activePage,type:t}});this.dispatchEvent(i)};handleDisabled=()=>{let e=!1;if(this.prev&&(this.prev.disabled=this.track.scrollLeft<200),(this.next||this.pagination)&&(e=Math.round(this.track.scrollLeft)>=Math.round(this.track.scrollWidth-this.track.offsetWidth)),this.next&&(this.loop?e&&this.next.setAttribute(`data-restart`,``):this.next.disabled=e),this.pagination){let t=Math.round(this.track.offsetLeft+this.track.scrollLeft);if(e)this.activePage=this.pageStartItems.length-1;else{let e=0,n=1/0;this.pageStartItems.forEach((r,i)=>{let a=Math.abs(Math.round(r.offsetLeft)-t);a<n&&(n=a,e=i)}),this.activePage=e}this.pagination.querySelectorAll(`button`).forEach(e=>{let t=e.getAttribute(`data-index`);if(!t)return;let n=parseInt(t,10)===this.activePage;e.disabled=n,n?e.setAttribute(`aria-current`,`page`):e.removeAttribute(`aria-current`)})}};handleScroll=()=>{clearTimeout(this.debounced),this.debounced=setTimeout(this.handleDisabled,this.pagination?100:200)};handleOverflow=()=>{let{scrollWidth:e,clientWidth:t}=this.track,n=e>t;this.track.classList.toggle(`overflowing`,n),n?(this.pagination&&(this.ioTimeout=setTimeout(this.buildPagination,200)),this.track.setAttribute(`tabindex`,`0`)):this.track.removeAttribute(`tabindex`)};buildPagination=()=>{if(!this.pagination.hidden){let e=this.pagination.querySelectorAll(`button`);if(e.length===this.pageStartItems.length)return;e.forEach(e=>e.remove())}let e=Array.from({length:this.pageStartItems.length}).fill(null);if(e.length<=0)return;e.forEach((n,r)=>{let i=r+1,a=t(`<button type="button" data-index="${r}" aria-label="Page ${i}">${i}</button>`);this.pagination.append(a),e[r]=a});let n=e[0];n.disabled=!0,n.setAttribute(`aria-current`,`page`),this.pagination.hidden=!1};handlePagination=t=>{let n=t.target.getAttribute(`data-index`);if(!n||!e.integer(n,0))return;let r=parseInt(n,10);this.handleNavigation(r,`pagination`)};get track(){let e=this.querySelector(`[data-track]`);if(!e)throw Error(`${this.localName} must contain an element with [data-track].`);return e}get buttons(){return this.querySelector(`[data-buttons]`)}get prev(){return this.buttons?.querySelector(`.mx-carousel__prev`)}get next(){return this.buttons?.querySelector(`.mx-carousel__next`)}get pagination(){return this.querySelector(`[data-pagination]`)}get items(){return[...this.itemMap.keys()]}get visibleCount(){return[...this.itemMap.values()].filter(e=>e).length}get pageStartItems(){return[...this.items].filter((e,t)=>t%this.visibleCount===0)}};customElements.get(`mx-carousel`)||customElements.define(`mx-carousel`,r);var i=class extends n{connectedCallback(){if(super.connectedCallback(),!this.dialog)return;let{signal:e}=this.controller;this.openBtns?.forEach(t=>t.addEventListener(`click`,()=>this.scrollToTrigger(t),{signal:e}))}scrollToTrigger=e=>{let t=e.dataset.galleryIndex??`0`,n=this.carousel?.track?.querySelector(`[data-index="${t}"]`);n&&(n.removeAttribute(`inert`),n.scrollIntoView({inline:`start`,block:`nearest`}))};get carousel(){return this.querySelector(`mx-carousel`)}};customElements.get(`mx-gallery`)||customElements.define(`mx-gallery`,i);export{r as n,i as t};
@@ -1 +0,0 @@
1
- import{l as e}from"./utilities-_Bq3TxAQ.js";import{createFocusTrap as t}from"focus-trap";var n=class extends HTMLElement{internals_;controller;widget;focusTrap;controls;mq;triggerText;isOpen=!1;closeIconClass=`mx-icon--close`;menuIconClass=`mx-icon--menu`;searchIconClass=`mx-icon--search`;backgroundClass=`mx-background--primary`;scrollLockClass=`body--scroll-lock`;isSearch;hideOther=!0;otherTrigger;rafId;focusTrapTimeout;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController,this.mq=this.getAttribute(`mq`)||`(max-width: 720px)`}connectedCallback(){if(!this.trigger||!this.target)return;this.trigger.getAttribute(`hideOther`)===`false`&&(this.hideOther=!1),this.isSearch=this.controls.includes(`search`),this.otherTrigger=document.querySelector(this.isSearch?`.${this.menuIconClass}`:`.${this.searchIconClass}`),this.widget=new e(this.trigger,this.target),this.widget.init(),this.focusTrap=t(this.target,{escapeDeactivates:!1,setReturnFocus:this.trigger,allowOutsideClick:!0,onActivate:()=>document.body.classList.add(this.scrollLockClass),onDeactivate:()=>document.body.classList.remove(this.scrollLockClass),checkCanFocusTrap:([e])=>new Promise(t=>{this.focusTrapTimeout=setTimeout(()=>{this.rafId&&=(cancelAnimationFrame(this.rafId),null),t()},2e3);let n=()=>{getComputedStyle(e).visibility===`hidden`?this.rafId=requestAnimationFrame(n):(this.focusTrapTimeout&&=(clearTimeout(this.focusTrapTimeout),null),this.rafId=null,t())};this.rafId=requestAnimationFrame(n)})});let{signal:n}=this.controller;this.handleBreakpoint(this.breakpoint),this.breakpoint.addEventListener(`change`,this.handleBreakpoint,{signal:n}),document.addEventListener(`keydown`,this.handleKeyDown,{signal:n})}disconnectedCallback(){this.widget.detach(),this.controller.abort(),this.rafId&&=(cancelAnimationFrame(this.rafId),null),this.focusTrapTimeout&&=(clearTimeout(this.focusTrapTimeout),null),this.focusTrap.deactivate(),document.body.classList.remove(this.scrollLockClass)}handleBreakpoint=({matches:e})=>{if(!this.trigger)return;let{signal:t}=this.controller;e?(this.widget.attach(),this.target.setAttribute(`inert`,``),this.trigger.addEventListener(`disclosure-toggle`,this.handleDisclosure,{signal:t})):(this.widget.detach(),this.target.removeAttribute(`inert`),document.body.classList.remove(this.scrollLockClass),this.trigger.removeEventListener(`disclosure-toggle`,this.handleDisclosure),this.focusTrap.deactivate())};handleDisclosure=async({detail:e})=>{let{isOpen:t}=e,n=t?`Open`:`Close`,r=t?`Close`:`Open`;if(this.trigger.textContent=this.triggerText.replace(n,r),t)try{await this.focusTrap.activate()}catch{}else this.focusTrap.deactivate();t&&this.hideOther&&this.otherTrigger&&this.otherTrigger.getAttribute(`aria-expanded`)===`true`&&this.otherTrigger.click(),this.trigger.classList.toggle(this.isSearch?this.searchIconClass:this.menuIconClass),this.trigger.classList.toggle(this.closeIconClass),this.target.classList.toggle(this.backgroundClass),this.trigger.removeAttribute(`no-focus`),this.isOpen=t};handleKeyDown=e=>{this.isOpen&&e.key===`Escape`&&this.widget.handleToggle()};get trigger(){let e=this.querySelector(`:scope > button`),t=e.getAttribute(`aria-controls`);if(!e||!t)throw Error(`${this.localName} must contain a <button aria-controls="element-to-trigger"> element.`);return e.removeAttribute(`disabled`),this.controls=t,this.triggerText=e.textContent,e}get target(){let e=document.querySelector(`div[id="${this.controls}"]`);if(!e)throw Error(`${this.localName} must contain a target <div id="${this.controls}">.`);return e.classList.remove(`global-nav-up-only`),e}get breakpoint(){return window.matchMedia(this.mq)}};customElements.get(`mx-global-toggle`)||customElements.define(`mx-global-toggle`,n);export{n as t};
@@ -1 +0,0 @@
1
- import{s as e,t}from"./utilities-_Bq3TxAQ.js";var n=class extends HTMLElement{internals_;controller;headingLevels;title;titleClass=`is-excluded mx-heading--m`;items;active;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController,this.headingLevels=this.dataset?.levels||`h2`,this.title=this.dataset?.title||`On this page`,this.items=[]}connectedCallback(){if(!this.menu||!this.headings)return;if(this.links.length)this.links.forEach(e=>{let t=this.container.querySelector(e.hash);t&&this.items.push({link:e,heading:t})});else{let e=t(`<h2 class="${this.titleClass}">${this.title}</h2>`);this.nav.insertBefore(e,this.menu);let n={};this.headings.forEach(e=>{let t=this.generateListItem(e),r=this.generateAnchor(e,n);this.items.push({link:r,heading:e}),t.appendChild(r),this.menu?.appendChild(t)})}let{signal:e}=this.controller;this.menu.addEventListener(`click`,e=>{let{target:t}=e;t instanceof HTMLAnchorElement&&this.handleClick(t)},{signal:e})}disconnectedCallback(){this.menu&&this.headings&&(this.menu.textContent=``,this.items=[],this.controller.abort())}handleClick=e=>{this.active=this.items.find(t=>t.link===e),this.links&&this.active&&(this.links.forEach(e=>e.classList.remove(`is-active`)),this.active.link.classList.add(`is-active`))};get menu(){let e=this.querySelector(`ul, ol`);if(e)return e;if(!this.nav)throw Error(`${this.localName} must contain a <nav> element.`);if(this.items?.length===0&&this.headings?.length===0)return null;let t=document.createElement(`ul`);return this.nav.appendChild(t),t}get nav(){return this.querySelector(`nav`)}get container(){let e=this.getAttribute(`data-content`);if(!e)throw Error(`${this.localName} must have a [data-content] attribute that contains the content selector.`);return this.closest(e)||this.parentElement.querySelector(e)||document.querySelector(e)}get headings(){return this.container?.querySelectorAll(`:is(${this.headingLevels}):not(.is-excluded)`)}get links(){return this.menu?.querySelectorAll(`a`)}generatedId(t,n){let r=t?.textContent?.trim();if(!r)return``;let i=e(r),a=n[i]??0;return n[i]=a+1,a>0?`${i}-${a}`:i}generateAnchor(e,n){let{textContent:r,id:i}=e,a=e.getAttribute(`data-in-page-navigation-title`)||r,o=i||this.generatedId(e,n);return i||(e.id=o),t(`<a href="#${o}"><span class="mx-icon mx-icon--chevron-right"></span><span>${a}</span></a>`)}generateListItem(e){let{tagName:n}=e;return t(`<li class="mx-in-page-navigation__level--${n.toLowerCase()}"></li>`)}};customElements.get(`mx-in-page-navigation`)||customElements.define(`mx-in-page-navigation`,n);export{n as t};
@@ -1 +0,0 @@
1
- import{l as e,s as t}from"./utilities-_Bq3TxAQ.js";var n=class{constructor(){window.Mixtape=window.Mixtape||{},window.Mixtape.Popups=window.Mixtape.Popups||[],window.Mixtape.Menu=window.Mixtape.Menu||{}}attachPopup=(e,t)=>{window.Mixtape.Popups.push({id:e,closefn:t})};detachPopup=e=>{window.Mixtape.Popups=window.Mixtape.Popups.filter(t=>t.id!==e)};attachMenu=(e,t)=>{window.Mixtape.Menu={context:e,items:t}};detachMenu=()=>{window.Mixtape.Menu=null};getNextFocusableMenuItem=(e,t=!1)=>t?e===0?window.Mixtape.Menu.items.length-1:e-1:window.Mixtape.Menu.items.length>e+1?e+1:0;moveFocus=(e,t=!1)=>{if(!window.Mixtape.Menu.items)return;let n=0;window.Mixtape.Menu.items.forEach((t,r)=>{t===e&&(n=r)});let r=this.getNextFocusableMenuItem(n,t),i=window.Mixtape.Menu.items[r].getAttribute(`tabindex`);if(i!==`-1`)window.Mixtape.Menu.items[r].focus();else{for(;i===`-1`;)r=this.getNextFocusableMenuItem(r,t),i=window.Mixtape.Menu.items[r].getAttribute(`tabindex`);window.Mixtape.Menu.items[r].focus()}window.Mixtape.Menu.active=r};handleGlobalClick=({target:e})=>{let t=window.Mixtape.Popups?window.Mixtape.Popups[window.Mixtape.Popups.length-1]:null;if(t&&t.id){let n=document.querySelector(`#${t.id}`).parentElement;if(n&&(e===n||n?.contains(e)))return;t.closefn()}};handleGlobalKeydown=e=>{let t=window.Mixtape.Popups?window.Mixtape.Popups[window.Mixtape.Popups.length-1]:null,n=e.target;switch(e.key){case`Escape`:t&&t.closefn();break;case`ArrowDown`:case`ArrowRight`:window.Mixtape.Menu?.items&&(e.preventDefault(),this.moveFocus(n));break;case`ArrowUp`:case`ArrowLeft`:window.Mixtape.Menu?.items&&(e.preventDefault(),this.moveFocus(n,!0))}};attachEventListeners=e=>{window.addEventListener(`click`,this.handleGlobalClick,{signal:e}),window.addEventListener(`keydown`,this.handleGlobalKeydown,{signal:e})}},r=class extends HTMLElement{internals_;controller;keyboard;subNavs;flyout;edgeCheck;mq;iO;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController,this.flyout=this.hasAttribute(`flyout`)}connectedCallback(){let{signal:r}=this.controller;this.keyboard=new n,this.keyboard.attachEventListeners(r),this.addEventListener(`focusin`,()=>{this.keyboard.attachMenu(this,this.links)}),this.addEventListener(`focusout`,()=>{this.keyboard.detachMenu()}),this.lists.length&&(this.subNavs=/* @__PURE__ */ new Map,this.lists.forEach((n,r)=>{let i=n.closest(`li`),a=i.querySelector(`:scope > a`),o=t(`subnav-${r}-${a.textContent}`,30),s=i.querySelector(`:scope > button.mx-nav__toggle`);if(i&&a&&s){let t=`list-label-${o}`;a.setAttribute(`id`,t),n.setAttribute(`id`,o),n.setAttribute(`aria-labelledby`,t);let r=new e(s,n);r.init(),this.subNavs.set(o,{item:i,trigger:s,list:n,link:a,widget:r})}}),this.addEventListener(`disclosure-toggle`,this.handleDisclosure),this.flyout&&(this.edgeCheck=this.hasAttribute(`edgeCheck`),this.mq=this.getAttribute(`mq`)||`(min-width: 720px)`,this.handleBreakpoint(this.breakpoint),this.breakpoint.addEventListener(`change`,this.handleBreakpoint,{signal:r})))}disconnectedCallback(){this.controller.abort(),this.subNavs?.forEach(e=>e.widget.detach()),this.iO?.disconnect()}handleDisclosure=({detail:e})=>{let{isOpen:t,id:n}=e,{item:r}=this.subNavs.get(n);r.classList.toggle(`mx-nav--open`),t?this.keyboard.attachPopup(n,this.handleCloseAny):this.keyboard.detachPopup(n)};handleCloseAny=()=>{this.subNavs?.forEach(({widget:e})=>{e&&e.isOpen&&e.handleToggle()})};handleFlyout=e=>{let t=e.target.closest(`li`);if(!t)return;let n=t.querySelector(`:scope > ul`);n&&this.subNavs?.forEach(({widget:e,list:t})=>{e&&(e.isOpen&&e.handleToggle(),t.id===n.id&&e.handleToggle())})};handleBreakpoint=({matches:e})=>{let{signal:t}=this.controller;e?(this.addEventListener(`mouseover`,this.handleFlyout,{signal:t}),this.addEventListener(`mouseleave`,this.handleCloseAny,{signal:t}),this.edgeCheck&&this.handleEdgeCheck()):(this.removeEventListener(`mouseover`,this.handleFlyout),this.removeEventListener(`mouseleave`,this.handleCloseAny))};handleEdgeCheck(){let e=window.innerWidth;this.iO=new IntersectionObserver((t,n)=>{t.forEach(({boundingClientRect:t,target:r})=>{e<t.right&&r.classList.add(`mx-nav--reverse`),n.unobserve(r)})}),this.subNavs?.forEach(({list:e})=>{this.iO.observe(e),e.querySelectorAll(`ul`)?.forEach(e=>this.iO.observe(e))})}get links(){let e=this.querySelectorAll(`a`);if(!e.length)throw Error(`${this.localName} must links`);return e}get lists(){return this.querySelectorAll(`li > ul`)}get breakpoint(){return window.matchMedia(this.mq)}};customElements.get(`mx-nav`)||customElements.define(`mx-nav`,r);export{n,r as t};
@@ -1 +0,0 @@
1
- var e=class extends HTMLElement{internals_;polyfills;constructor(){super(),this.internals_=this.attachInternals()}async connectedCallback(){if(this.container&&this.trigger&&(!(`anchorName`in document.documentElement.style)||!(`popover`in HTMLElement.prototype))){let{default:e}=await import(`./polyfills-C7pRt54M.js`);this.polyfills=new e(this.container)}}disconnectedCallback(){this.polyfills?.destroy()}get container(){let e=this.querySelector(`[popover]`);if(!e)throw Error(`${this.localName} must contain a <div popover> element.`);return e}get trigger(){let e=this.querySelector(`[popovertarget=${this.container?.id}]`);if(!e)throw Error(`${this.localName} must contain a <button popovertarget="${this.container.id}">`);return e}};customElements.get(`mx-popover`)||customElements.define(`mx-popover`,e);export{e as t};
@@ -1 +0,0 @@
1
- import{t as e}from"./utilities-_Bq3TxAQ.js";var t=class extends HTMLElement{internals_;iO;rO;offsetPropName;root=null;rootMargin=`0px 0px 0px 0px`;thresholds=[0];constructor(){super(),this.internals_=this.attachInternals()}connectedCallback(){this.offsetPropName=this.getAttribute(`offsetpropname`)||`--sticky-offset`;let e={root:this.root,rootMargin:this.rootMargin,thresholds:this.thresholds};this.iO=new IntersectionObserver(([{boundingClientRect:t}])=>{let n=t.y<0;this.classList.toggle(`is-stuck`,n);let r=new CustomEvent(`sticky-toggle`,{bubbles:!0,cancelable:!0,detail:{isSticky:n,options:e,target:this}});this.dispatchEvent(r)},e),this.iO.observe(this.trigger),this.offsetPropName&&(this.rO=new ResizeObserver(e=>{e.forEach(({borderBoxSize:e})=>{let[{blockSize:t}]=e;document.body.style.setProperty(this.offsetPropName,`${t.toFixed(1)}px`)})}),this.rO.observe(this))}disconnectedCallback(){this.iO.disconnect(),this.rO?.disconnect()}get trigger(){let t=this.querySelector(`.mx-sticky__trigger`);return t||(t=e(`<div class="mx-sticky__trigger"></div>`),this.insertAdjacentElement(`beforebegin`,t)),t}};customElements.get(`mx-sticky`)||customElements.define(`mx-sticky`,t);export{t};
@@ -1,15 +0,0 @@
1
- import{s as e,t}from"./utilities-_Bq3TxAQ.js";import{t as n}from"./DropMenu-1baQc8Yc.js";import{PopoverPlacementModifier as r}from"@pnx-mixtape/ids-shape";var i=class extends HTMLElement{internals_;controller;tabs;mq;locationHash;tabFocus=0;tabListClasses;dropTriggerClasses;dropMenuId;constructor(){super(),this.internals_=this.attachInternals(),this.controller=new AbortController,this.mq=this.getAttribute(`mq`)||`(max-width: 720px)`}connectedCallback(){if(!this.panels)return;this.locationHash=window.location.hash,this.tabFocus=0,this.tabs=/* @__PURE__ */ new Map,this.panels.forEach(e=>{let n=e.id,r=`<button type="button" role="tab" aria-controls="${n}" aria-selected="false">${e.getAttribute(`aria-label`)}</button>`,i=t(r);this.tabList.appendChild(i);let a=t(r);this.dropMenuMenu.appendChild(a),n&&e&&a&&this.tabs.set(n,{panel:e,tab:i,button:a})});let{signal:e}=this.controller;this.handleBreakpoint(this.breakpoint),this.breakpoint.addEventListener(`change`,this.handleBreakpoint,{signal:e});let n=this.locationHash?this.querySelector(this.locationHash):null;n?this.active=n.id:this.active||=this.panels[0].id}disconnectedCallback(){this.controller.abort()}handleBreakpoint=({matches:e})=>{let{signal:t}=this.controller;this.dropMenuTrigger.toggleAttribute(`hidden`,!e),this.tabList.toggleAttribute(`hidden`,e),e?(this.dropMenuMenu.addEventListener(`drop-menu-select`,this.handleDropMenuSelect,{signal:t}),this.tabList.removeEventListener(`click`,this.handleClick),this.tabList.removeEventListener(`keydown`,this.handleKeydown)):(this.tabList.addEventListener(`click`,this.handleClick,{signal:t}),this.tabList.addEventListener(`keydown`,this.handleKeydown,{signal:t}),this.dropMenuMenu.removeEventListener(`drop-menu-select`,this.handleDropMenuSelect))};handleKeydown=e=>{let{key:t,target:n}=e,r=[...this.triggers],i=r.indexOf(n);if(i===-1)return;let a=0;switch(t){case`ArrowRight`:a=(i+1)%r.length;break;case`ArrowLeft`:a=(i-1+r.length)%r.length;break;case`Home`:a=0;break;case`End`:a=r.length-1;break;default:return}e.preventDefault(),e.stopPropagation(),r[a].focus()};handleClick=e=>{let t=e.target;if(!(t instanceof HTMLButtonElement))return;e.preventDefault();let n=t.getAttribute(`aria-controls`);this.handleTabChange(n)};handleDropMenuSelect=e=>{let t=e.detail.target;if(!(t instanceof HTMLButtonElement))return;let n=t.getAttribute(`aria-controls`);this.handleTabChange(n)};handleTabChange=e=>{this.active=e,this.handleUrlParams(e);let{panel:t,tab:n,button:r}=this.tabs.get(e);t.focus({preventScroll:!0});let i=new CustomEvent(`tab-toggle`,{bubbles:!0,cancelable:!0,detail:{id:e,tab:n,button:r,panel:t}});this.dispatchEvent(i)};get dropMenu(){let i=this.querySelector(`mx-dropmenu`);if(i)return i;this.dropTriggerClasses=this.getAttribute(`dropTriggerClasses`)||`mx-button mx-icon mx-icon--chevron-down mx-icon--end`,this.dropMenuId=this.id||e(`tab-drop-menu`);let a=`${this.dropMenuId}-target`,o=new n;o.setAttribute(`closeOnClick`,`true`);let s=t(`<button
2
- id="${a}"
3
- class="mx-popover__trigger ${this.dropTriggerClasses}"
4
- popovertarget="${this.dropMenuId}"
5
- style="anchor-name: --${this.dropMenuId}"
6
- hidden
7
- ></button>`),c=t(`<div
8
- class="mx-popover mx-drop-menu"
9
- id="${this.dropMenuId}"
10
- aria-describedby="${a}"
11
- style="position-anchor: --${this.dropMenuId}"
12
- data-placement="${r.BOTTOM_START}"
13
- popover
14
- role="tablist"
15
- ></div>`);return o.append(s,c),this.prepend(o),o}get dropMenuMenu(){return this.dropMenu.querySelector(`[popover][role="tablist"]`)}get dropMenuTrigger(){return this.dropMenu.querySelector(`[popovertarget]`)}get tabList(){this.tabListClasses=this.getAttribute(`tabListClasses`)||`mx-tabs__list`;let e=this.querySelector(`[role="tablist"]:not([popover])`);if(e)return e;let n=t(`<div class="${this.tabListClasses}" role="tablist" hidden></div>`);return this.prepend(n),n}get triggers(){let e=this.tabList.querySelectorAll(`[role="tab"]`);if(!e.length)throw Error(`${this.localName} must contain [role="tab"]`);return e}get panels(){let e=this.querySelectorAll(`[data-tab]`);if(!e.length)throw Error(`${this.localName} must contain [data-tab]`);return e.forEach(e=>{e.setAttribute(`role`,`tabpanel`),e.setAttribute(`tabindex`,`-1`),e.setAttribute(`aria-label`,e.getAttribute(`data-tab`))}),e}get active(){return this.querySelector(`[aria-selected="true"]`)}get breakpoint(){return window.matchMedia(this.mq)}set active(e){this.tabs.forEach(({tab:t,button:n,panel:r},i)=>{i===e?(t.setAttribute(`aria-selected`,`true`),n.setAttribute(`aria-selected`,`true`),t.setAttribute(`tabindex`,`0`),r.removeAttribute(`inert`),this.dropMenuTrigger.textContent=t.textContent):(t.setAttribute(`aria-selected`,`false`),n.setAttribute(`aria-selected`,`false`),t.setAttribute(`tabindex`,`-1`),r.setAttribute(`inert`,``))})}handleUrlParams=e=>{let t=new URLSearchParams(window.location.search);t.get(`tab`)!==e&&(t.set(`tab`,e),window.history.replaceState({},``,`${window.location.pathname}?${t.toString()}`))}};customElements.get(`mx-tabs`)||customElements.define(`mx-tabs`,i);export{i as t};
@@ -1 +0,0 @@
1
- import e from"js-cookie";var t={url:(e,t=[`http:`,`https:`])=>{try{let n=new URL(e);return t.includes(n.protocol)}catch{return!1}},email:e=>typeof e==`string`&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),number:(e,t,n)=>{let r=Number(e);return!(isNaN(r)||t!==void 0&&r<t||n!==void 0&&r>n)},integer:(e,t,n)=>{let r=Number(e);return!(isNaN(r)||!Number.isInteger(r)||t!==void 0&&r<t||n!==void 0&&r>n)},string:(e,t,n)=>!(typeof e!=`string`||t!==void 0&&e.length<t||n!==void 0&&e.length>n),notEmpty:e=>typeof e==`string`&&e.trim().length>0,pattern:(e,t)=>typeof e==`string`&&(t.lastIndex=0,t.test(e)),oneOf:(e,t)=>t.includes(e),array:(e,t,n)=>!(!Array.isArray(e)||t!==void 0&&e.length<t||n!==void 0&&e.length>n),json:e=>{if(typeof e!=`string`)return!1;try{return JSON.parse(e),!0}catch{return!1}},date:(e,t,n)=>{let r=e instanceof Date?e:new Date(e);return!(isNaN(r.getTime())||t&&r<t||n&&r>n)},hexColor:e=>typeof e==`string`&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(e)},n=class n{banner;acceptBtn;moreBtn;rejectBtn;controller;bots;cookieName;waitRemove;trackingCookiesNames;hostname;timeout;defaultCookieSettings;constructor(e){this.banner=e,this.acceptBtn=e.querySelector(`[data-cookie-accept]`),this.moreBtn=e.querySelector(`[data-cookie-more]`),this.rejectBtn=e.querySelector(`[data-cookie-reject]`),this.controller=new AbortController,this.bots=/bot|crawler|spider|crawling/i,this.cookieName=`has-cookie-consent`;let n=this.banner.dataset.waitRemove;this.waitRemove=n&&t.integer(n,0)?parseInt(n,10):0,this.trackingCookiesNames=[`__utma`,`__utmb`,`__utmc`,`__utmt`,`__utmv`,`__utmz`,`_ga`,`_gat`,`_gid`]}init=()=>{this.hostname=document.location.hostname.replace(/^www\./,``),this.defaultCookieSettings={path:`/`,expires:365,sameSite:`Lax`};let e=this.bots.test(navigator.userAgent),t=navigator.doNotTrack||navigator.msDoNotTrack||window.doNotTrack;if(e||!(t==null||t&&t!==`yes`&&t!==1&&t!==`1`)||this.hasConsent()===!1){this.removeBanner(0);return}this.hasConsent()!==!0&&this.showBanner()};showBanner=()=>{let{signal:e}=this.controller;this.banner.removeAttribute(`inert`),this.moreBtn&&this.moreBtn.addEventListener(`click`,()=>this.deleteCookie(),{signal:e}),this.acceptBtn&&this.acceptBtn.addEventListener(`click`,this.accept,{signal:e}),this.rejectBtn&&this.rejectBtn.addEventListener(`click`,this.reject,{signal:e}),window.CookieCompliance=this};reject=()=>{this.removeBanner(this.waitRemove),this.setCookie(`false`),this.trackingCookiesNames.forEach(e=>this.deleteCookie(e))};accept=()=>{this.removeBanner(this.waitRemove),this.setCookie(`true`)};hasConsent=()=>{let t=e.get(this.cookieName);return t===`true`||t!==`false`&&null};setCookie=t=>{e.set(this.cookieName,t,this.defaultCookieSettings),e.set(this.cookieName,t,{domain:`.${this.hostname}`,...this.defaultCookieSettings})};deleteCookie=(t=this.cookieName)=>{e.remove(t,this.defaultCookieSettings),e.remove(t,{domain:`.${this.hostname}`,...this.defaultCookieSettings})};removeBanner=e=>{this.timeout=setTimeout(()=>{this.banner&&this.banner.parentNode&&(this.banner.parentNode.removeChild(this.banner),this.destroy())},e)};destroy(){clearTimeout(this.timeout),this.controller.abort(),this.controller=new AbortController,window.CookieCompliance===this&&(window.CookieCompliance=void 0)}static create({context:e=null}={}){let[t]=window.once(`cookie-compliance`,`#cookie-compliance`,e||document);if(t){let e=new n(t);e.init(),window.CookieCompliance=e}}};export{t as n,n as t};
@@ -1 +0,0 @@
1
- var e=[],t=400,n=/* @__PURE__ */ function(e){return e.LEFT=`left`,e.RIGHT=`right`,e}({}),r=/* @__PURE__ */ function(e){return e.DIV=`div`,e.LI=`li`,e.ARTICLE=`article`,e.ASIDE=`aside`,e.SECTION=`section`,e}({}),i=/* @__PURE__ */ function(e){return e.P=`p`,e.DIV=`div`,e.STRONG=`strong`,e.ITALIC=`em`,e}({}),a=/* @__PURE__ */ function(e){return e.HEADLINE=`mx-headline`,e.EYEBROW=`mx-text--eyebrow`,e.EMBELLISHED=`mx-text--embellished`,e.RESET=`mx-spacing--reset`,e.RESETTOP=`mx-spacing--top-reset`,e.RESETBOTTOM=`mx-spacing--bottom-reset`,e}({}),o=/* @__PURE__ */ function(e){return e.SECTION=`mx-text--eyebrow`,e.EMBELLISHED=`mx-text--embellished`,e.XXXL=`mx-text--xxxl`,e.XXL=`mx-text--xxl`,e.XL=`mx-text--xl`,e.L=`mx-text--l`,e.M=`mx-text--m`,e.S=`mx-text--s`,e.XS=`mx-text--xs`,e.LEDE=`mx-text--lede`,e.META=`mx-text--meta`,e.PRIMARY=`mx-text--primary`,e.ACCENT=`mx-text--accent`,e.ALT=`mx-text--alt`,e}({}),s=/* @__PURE__ */ function(e){return e.NOTES=`mx-list--notes`,e.REFS=`mx-list--refs`,e.STATS=`mx-list--stats`,e.COLUMNS=`mx-list--columns`,e.SUMMARY=`mx-list--summary`,e}({}),c=/* @__PURE__ */ function(e){return e.ARROW_DOWN=`arrow-down`,e.ARROW_LEFT=`arrow-left`,e.ARROW_UP=`arrow-up`,e.ARROW_RIGHT=`arrow-right`,e.CHEVRON_DOWN=`chevron-down`,e.CHEVRON_LEFT=`chevron-left`,e.CHEVRON_RIGHT=`chevron-right`,e.CHEVRON_UP=`chevron-up`,e.BLUESKY=`bluesky`,e.CLOSE=`close`,e.COLLAPSE=`collapse`,e.DOWNLOAD=`download`,e.DRUPAL=`drupal`,e.ERROR=`error`,e.EXPAND=`expand`,e.EXTERNAL=`external-link`,e.FACEBOOK=`facebook`,e.GOOGLE=`google`,e.INFO=`info`,e.FILE=`file`,e.INSTAGRAM=`instagram`,e.LINKEDIN=`linkedin`,e.MASTODON=`mastodon`,e.MENU=`menu`,e.SEARCH=`search`,e.SUCCESS=`success`,e.TWITTER=`twitter`,e.WARNING=`warning`,e.YOUTUBE=`youtube`,e.EMAIL=`email`,e.HEART=`heart-selected`,e.EMPTY_HEART=`heart-unselected`,e.LINK=`link`,e.LOCK=`lock`,e.LOGIN=`login`,e.MORE=`more`,e.EDIT=`pencil`,e.PHONE=`phone`,e.PIN=`pin`,e.PRINT=`print`,e.RESTART=`restart`,e.STAR=`star-selected`,e.EMPTY_STAR=`star-unselected`,e.TICK=`tick`,e.TRASH=`trash`,e.USER=`user`,e.SHARE=`share`,e.QUESTION=`question`,e}({}),l=/* @__PURE__ */ function(e){return e.NARROW=`narrow`,e.FEATURE=`feature`,e.FULL=`full`,e}({}),u=/* @__PURE__ */ function(e){return e.FLOW=`flow`,e.GROUP=`group`,e}({}),d=/* @__PURE__ */ function(e){return e.DEFAULT=``,e.REVERSE=`sidebar-rev`,e.REVERSE_L=`sidebar-rev-lg`,e}({}),f=/* @__PURE__ */ function(e){return e.PRIMARY=`primary`,e.ACCENT=`accent`,e.ALT=`alt`,e.REVERSE=`reverse`,e.RESET=`reset`,e.BOX=`box`,e.IMAGE=`image`,e}({}),p=/* @__PURE__ */ function(e){return e.FLUSH=`flush`,e.STRIPED=`striped`,e.SMALL=`small`,e.BORDERED=`bordered`,e}({}),m=/* @__PURE__ */ function(e){return e.DEFAULT=`default`,e.VALID=`valid`,e.INVALID=`invalid`,e}({}),h=/* @__PURE__ */ function(e){return e.INFO=`info`,e.SUCCESS=`success`,e.WARNING=`warning`,e.ERROR=`error`,e.FEATURED=`featured`,e}({}),g=/* @__PURE__ */ function(e){return e.DEFAULT=`default`,e.CENTERED=`centered`,e.LINED=`lined`,e}({}),_=/* @__PURE__ */ function(e){return e.TWITTER=`twitter`,e.FACEBOOK=`facebook`,e.LINKEDIN=`linkedin`,e}({});export{o as _,e as a,c,u as d,d as f,h as g,p as h,t as i,s as l,g as m,r as n,m as o,_ as p,f as r,a as s,n as t,l as u,i as v};
@@ -1 +0,0 @@
1
- var e,t=class{constructor(e){this.popover=e,this.trigger=document.querySelector(`[popovertarget="${e.getAttribute(`id`)}"]`),this.init()}init=async()=>{this.trigger&&this.popover&&(this.supportsPopover()||await this.ensurePopoverPolyfill(),this.supportsAnchor()||(this.controller=new AbortController,this.popover.addEventListener(`toggle`,this.positionPopover,{signal:this.controller.signal})))};supportsAnchor=()=>`anchorName`in document.documentElement.style;supportsPopover=()=>`popover`in HTMLElement.prototype;ensurePopoverPolyfill=()=>(e||=import(`@oddbird/popover-polyfill`),e);positionPopover=async({newState:e})=>{if(e===`open`){let{computePosition:e,flip:t,shift:n}=await import(`@floating-ui/dom`);requestAnimationFrame(()=>{e(this.trigger,this.popover,{placement:this.placement||`top`,middleware:[t({padding:10}),n({padding:10})]}).then(({x:e,y:t})=>{this.popover.style.insetInlineStart=`${e}px`,this.popover.style.insetBlockStart=`${t}px`})})}};destroy(){this.controller.abort()}get placement(){return this.popover.getAttribute(`data-placement`)}};export{t as default};
@@ -1 +0,0 @@
1
- import{n as e}from"./cookie-compliance-Bbm-0vpj.js";var t=class{options;context;trigger;element;id;isOpen;attached;constructor(e,t,n,r=document){if(!e)throw Error(`toggle is required.`);if(!t)throw Error(`element is required.`);let i={attribute:`inert`,shouldPreventDefault:!0,setInitialAttribute:!0,clickEvent:`click`};this.options={...i,...n},this.context=r||document,this.trigger=e,this.element=t,this.id=this.element.id||this.generatedId()}init=()=>{if(Object.prototype.hasOwnProperty.call(this.trigger,`disclosureWidget`))return;let{attribute:e,setInitialAttribute:t}=this.options;this.trigger.disclosureWidget=this,t&&this.element.setAttribute(e,``),this.attach()};handleToggle=()=>{let{attribute:e,setInitialAttribute:t}=this.options;this.element.toggleAttribute(e);let n=this.element.hasAttribute(e);this.isOpen=t?!n:n,this.trigger.setAttribute(`aria-expanded`,String(this.isOpen));let r=new CustomEvent(`disclosure-toggle`,{bubbles:!0,cancelable:!0,detail:{isOpen:this.isOpen,id:this.id,options:this.options,target:this.element}});this.trigger.dispatchEvent(r)};handleMouse=e=>{let{currentTarget:t,type:n,relatedTarget:r}=e;if(n===`mouseover`||n===`mouseout`){let e=this.trigger.parentNode;if(e!==t||e.contains(r))return}else if(this.trigger!==t)return;let{shouldPreventDefault:i}=this.options;this.handleToggle(),i&&(e.preventDefault(),e.stopPropagation())};handleKeyboard=e=>{let{key:t,target:n}=e;if(this.trigger!==n)return;let{isOpen:r}=this,{shouldPreventDefault:i}=this.options;switch(t){case`ArrowDown`:case`Enter`:r||this.handleToggle(),i&&(e.preventDefault(),e.stopPropagation());break;case`ArrowUp`:case`Escape`:r&&this.handleToggle(),i&&(e.preventDefault(),e.stopPropagation())}};attach=()=>{if(this.attached)return;let{clickEvent:e}=this.options;if(e===`mouseover`){let e=this.trigger.parentNode;e.addEventListener(`mouseover`,this.handleMouse),e.addEventListener(`mouseout`,this.handleMouse)}else this.trigger.addEventListener(`click`,this.handleMouse);this.trigger.addEventListener(`keydown`,this.handleKeyboard),this.trigger.setAttribute(`aria-expanded`,`false`),this.trigger.hasAttribute(`aria-controls`)||this.trigger.setAttribute(`aria-controls`,this.id),this.attached=!0};detach=()=>{if(!this.attached)return;this.isOpen&&this.handleToggle();let{clickEvent:e}=this.options;if(e===`mouseover`){let e=this.trigger.parentNode;e.removeEventListener(`mouseover`,this.handleMouse),e.removeEventListener(`mouseout`,this.handleMouse)}else this.trigger.removeEventListener(`click`,this.handleMouse);this.trigger.removeEventListener(`keydown`,this.handleKeyboard),this.trigger.removeAttribute(`aria-expanded`),this.attached=!1};generatedId=()=>{let e=this.trigger?.textContent?.trim();return e?n(e):``}},n=(t,n=20)=>{if(!e.notEmpty(t))return``;let r=t.toLowerCase().trim().replace(/\s+/g,`-`).replace(/[^-a-z0-9]/g,``).replace(/[\n\r]+|[\s]{2,}/g,``);return[...[,,,,,,].keys()].forEach(()=>{r.charAt(0).match(/[a-z]/g)||(r=r.substring(1))}),e.integer(n,1)&&(r=r.substring(0,n)),r},r=t=>e.notEmpty(t)?t.trim().replace(/(?:^\w|[A-Z]|\b\w|\s+)/g,(e,t)=>+e==0?``:t===0?e.toLowerCase():e.toUpperCase()).replace(/[^\w\s]/gi,``):``,i=(e,t)=>{if(typeof e!=`string`||!e||!Array.isArray(t))return!1;try{let{hostname:n}=new URL(e);return window.location.hostname===n||t.includes(n)}catch{return!1}},a=e=>{try{return new DOMParser().parseFromString(e,`text/html`).body.firstElementChild}catch{return null}},o=(e,t=!1,n=!1)=>{let r=new ResizeObserver(i=>{i.forEach(({contentBoxSize:i,borderBoxSize:a})=>{let[{inlineSize:o,blockSize:s}]=n?i:a;e.style.setProperty(`--inline-size`,`${o.toFixed(1)}px`),e.style.setProperty(`--block-size`,`${s.toFixed(1)}px`),t&&r.unobserve(e)})});r.observe(e)},s=(e,t,n,r=[])=>{let{target:i,clientY:a,clientX:o}=e,s=i instanceof HTMLOptionElement||i instanceof HTMLSelectElement;if((r?.filter(e=>e===i||e.contains(i))).length||s)return;let c=new IntersectionObserver(([{boundingClientRect:e}])=>{let{top:t,height:r,width:i,left:s}=e;t<=a&&a<=t+r&&s<=o&&o<=s+i||n(),c.disconnect()});c.observe(t)},c=(e,t)=>{let{key:n}=e;n===`Escape`&&t()},l=(e,t)=>{if(Object.hasOwn(window,`Drupal`)&&Object.hasOwn(Drupal,`behaviors`)){Drupal.behaviors[t]={attach:e};return}window.addEventListener(`DOMContentLoaded`,e.bind(document,document))};export{i as a,r as c,s as i,t as l,o as n,l as o,c as r,n as s,a as t};