@pnx-mixtape/mxds 0.1.0-rc.4 → 0.1.0-rc.5
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.
- package/.claude/skills/create-mxds-component/SKILL.md +77 -0
- package/DESIGN.md +595 -0
- package/README.md +1 -2
- package/dist/build/accordion.entry.js +2 -1
- package/dist/build/autocomplete.entry.js +1 -1
- package/dist/build/back-to-top.css +1 -0
- package/dist/build/back-to-top.entry.js +1 -0
- package/dist/build/button.css +1 -1
- package/dist/build/card.css +1 -1
- package/dist/build/chunks/Accordion-D2wp8hBG.js +44 -0
- package/dist/build/chunks/AccordionGroup-BYtoAFxg.js +47 -0
- package/dist/build/chunks/AccordionMobile-D3sTeiM5.js +26 -0
- package/dist/build/chunks/Autocomplete-kRo8RNbC.js +135 -0
- package/dist/build/chunks/BackToTop-4M-Wl7z3.js +64 -0
- package/dist/build/chunks/ClosableAlert-yy84gae6.js +55 -0
- package/dist/build/chunks/CookieConsent-wd8gQ2Oe.js +18 -0
- package/dist/build/chunks/Dialog-DWoXW-7Z.js +48 -0
- package/dist/build/chunks/DropMenu-CSTZq0Zt.js +68 -0
- package/dist/build/chunks/FeedbackForm-BochXEDx.js +64 -0
- package/dist/build/chunks/Gallery-Rkfv7Mbb.js +165 -0
- package/dist/build/chunks/GlobalToggle-CzlkpLpc.js +82 -0
- package/dist/build/chunks/InPageNavigation-D1Kk-rCm.js +86 -0
- package/dist/build/chunks/Navigation-CDQnN61h.js +147 -0
- package/dist/build/chunks/Popover-CiTAftNU.js +30 -0
- package/dist/build/chunks/Sticky-DoVndENm.js +51 -0
- package/dist/build/chunks/Tabs-BDlxCDNh.js +160 -0
- package/dist/build/chunks/Translate-bmM38j6z.js +46 -0
- package/dist/build/chunks/cookie-compliance-CG6x-TcV.js +119 -0
- package/dist/build/chunks/enums-BrHxPZZ_.js +36 -0
- package/dist/build/chunks/polyfills-D-qh1a_2.js +33 -0
- package/dist/build/chunks/utilities-Dd-08SW6.js +255 -0
- package/dist/build/content-block.css +1 -1
- package/dist/build/cookie-consent.entry.js +1 -1
- package/dist/build/dialog.entry.js +1 -1
- package/dist/build/drop-menu.entry.js +1 -1
- package/dist/build/elements.js +147 -1
- package/dist/build/feedback-form.css +1 -0
- package/dist/build/feedback-form.entry.js +1 -0
- package/dist/build/filters.entry.js +145 -1
- package/dist/build/gallery.entry.js +1 -1
- package/dist/build/global-alert.entry.js +1 -1
- package/dist/build/header.css +1 -1
- package/dist/build/header.entry.js +1 -1
- package/dist/build/icon.css +1 -1
- package/dist/build/in-page-navigation.entry.js +1 -1
- package/dist/build/navigation.entry.js +1 -1
- package/dist/build/pagination.css +1 -1
- package/dist/build/popover.entry.js +1 -1
- package/dist/build/react.js +2270 -1
- package/dist/build/sticky.entry.js +1 -1
- package/dist/build/tabs.entry.js +1 -1
- package/dist/build/translate.css +1 -0
- package/dist/build/translate.entry.js +1 -0
- package/dist/build/utility-list.entry.js +53 -1
- package/dist/types/Component/BackToTop/BackToTop.d.ts +20 -0
- package/dist/types/Component/BackToTop/BackToTop.d.ts.map +1 -0
- package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts +27 -0
- package/dist/types/Component/BackToTop/Elements/BackToTop.d.ts.map +1 -0
- package/dist/types/Component/BackToTop/back-to-top.entry.d.ts +2 -0
- package/dist/types/Component/BackToTop/back-to-top.entry.d.ts.map +1 -0
- package/dist/types/Component/DropMenu/DropMenu.d.ts +2 -1
- package/dist/types/Component/DropMenu/DropMenu.d.ts.map +1 -1
- package/dist/types/Component/Tabs/Components/TabDropMenu.d.ts.map +1 -1
- package/dist/types/Component/Tabs/Elements/Tabs.d.ts.map +1 -1
- package/dist/types/Component/Translate/Elements/Translate.d.ts +23 -0
- package/dist/types/Component/Translate/Elements/Translate.d.ts.map +1 -0
- package/dist/types/Component/Translate/Translate.d.ts +37 -0
- package/dist/types/Component/Translate/Translate.d.ts.map +1 -0
- package/dist/types/Component/Translate/languages.d.ts +11 -0
- package/dist/types/Component/Translate/languages.d.ts.map +1 -0
- package/dist/types/Component/Translate/translate.entry.d.ts +2 -0
- package/dist/types/Component/Translate/translate.entry.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts +37 -0
- package/dist/types/Form/FeedbackForm/Elements/FeedbackForm.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts +36 -0
- package/dist/types/Form/FeedbackForm/FeedbackForm.d.ts.map +1 -0
- package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts +2 -0
- package/dist/types/Form/FeedbackForm/feedback-form.entry.d.ts.map +1 -0
- package/dist/types/Utility/Elements/google-translate-widget.d.ts +91 -0
- package/dist/types/Utility/Elements/google-translate-widget.d.ts.map +1 -0
- package/dist/types/Utility/utilities.d.ts +2 -0
- package/dist/types/Utility/utilities.d.ts.map +1 -1
- package/dist/types/elements.d.ts +3 -0
- package/dist/types/elements.d.ts.map +1 -1
- package/dist/types/enums.d.ts +3 -1
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/react.d.ts +3 -0
- package/dist/types/react.d.ts.map +1 -1
- package/docs/API.md +1215 -0
- package/docs/CSSGuidelines.md +891 -0
- package/docs/CodeQuality.md +940 -0
- package/docs/ComponentArchitecture.md +714 -0
- package/docs/Contributing.md +626 -0
- package/docs/MemoryManagement.md +598 -0
- package/docs/Migrations.md +6 -0
- package/docs/README.md +100 -0
- package/docs/Security.md +444 -0
- package/docs/Testing.md +739 -0
- package/docs/Troubleshooting.md +674 -0
- package/package.json +6 -3
- package/src/Atom/Button/Button.tsx +1 -1
- package/src/Atom/Button/__snapshots__/Button.stories.tsx.snap +2 -2
- package/src/Atom/Button/_buttons.css +1 -0
- package/src/Atom/Icon/README.md +1 -1
- package/src/Atom/Icon/_icon.css +1 -0
- package/src/Atom/Icon/images/thumb.svg +1 -0
- package/src/Atom/Media/__snapshots__/Media.stories.ts.snap +4 -9
- package/src/Atom/Media/media.twig +4 -5
- package/src/Component/BackToTop/BackToTop.stories.ts +127 -0
- package/src/Component/BackToTop/BackToTop.stories.tsx +53 -0
- package/src/Component/BackToTop/BackToTop.tsx +120 -0
- package/src/Component/BackToTop/Elements/BackToTop.ts +119 -0
- package/src/Component/BackToTop/README.md +164 -0
- package/src/Component/BackToTop/__snapshots__/BackToTop.stories.ts.snap +24 -0
- package/src/Component/BackToTop/__snapshots__/BackToTop.stories.tsx.snap +3 -0
- package/src/Component/BackToTop/back-to-top.css +70 -0
- package/src/Component/BackToTop/back-to-top.entry.js +1 -0
- package/src/Component/BackToTop/back-to-top.twig +26 -0
- package/src/Component/Card/Components/CardContent.tsx +1 -1
- package/src/Component/Card/Components/CardMedia.tsx +1 -1
- package/src/Component/Card/__snapshots__/Card.stories.tsx.snap +3 -3
- package/src/Component/Card/card.css +1 -1
- package/src/Component/Carousel/Carousel.stories.ts +66 -36
- package/src/Component/Carousel/__snapshots__/Carousel.stories.tsx.snap +5 -5
- package/src/Component/ContentBlock/Components/ContentBlockMedia.tsx +1 -1
- package/src/Component/ContentBlock/content-block.css +1 -1
- package/src/Component/DropMenu/DropMenu.stories.ts +21 -2
- package/src/Component/DropMenu/DropMenu.tsx +14 -4
- package/src/Component/DropMenu/__snapshots__/DropMenu.stories.ts.snap +3 -3
- package/src/Component/DropMenu/__snapshots__/DropMenu.stories.tsx.snap +2 -2
- package/src/Component/DropMenu/drop-menu.twig +7 -1
- package/src/Component/HeroBanner/__snapshots__/HeroBanner.stories.tsx.snap +1 -1
- package/src/Component/InPageNavigation/__snapshots__/InPageNavigation.stories.ts.snap +48 -13
- package/src/Component/InPageNavigation/in-page-navigation.twig +4 -6
- package/src/Component/ListItem/Components/ListItemMedia.tsx +1 -1
- package/src/Component/Pagination/Pagination.stories.ts +57 -27
- package/src/Component/Pagination/pagination.css +16 -7
- package/src/Component/Popover/__snapshots__/Popover.stories.tsx.snap +3 -3
- package/src/Component/Tabs/Components/TabDropMenu.tsx +7 -1
- package/src/Component/Tabs/Elements/Tabs.ts +13 -3
- package/src/Component/Tabs/Tabs.stories.ts +33 -12
- package/src/Component/Tabs/Tabs.stories.tsx +28 -14
- package/src/Component/Tabs/__snapshots__/Tabs.stories.ts.snap +3 -3
- package/src/Component/Tabs/__snapshots__/Tabs.stories.tsx.snap +2 -2
- package/src/Component/Translate/Elements/Translate.ts +76 -0
- package/src/Component/Translate/README.md +283 -0
- package/src/Component/Translate/Translate.stories.ts +87 -0
- package/src/Component/Translate/Translate.stories.tsx +77 -0
- package/src/Component/Translate/Translate.tsx +213 -0
- package/src/Component/Translate/__snapshots__/Translate.stories.ts.snap +18 -0
- package/src/Component/Translate/__snapshots__/Translate.stories.tsx.snap +3 -0
- package/src/Component/Translate/languages.ts +39 -0
- package/src/Component/Translate/translate.css +62 -0
- package/src/Component/Translate/translate.entry.js +1 -0
- package/src/Component/Translate/translate.twig +44 -0
- package/src/Form/Autocomplete/Autocomplete.stories.tsx +2 -1
- package/src/Form/FeedbackForm/Elements/FeedbackForm.ts +122 -0
- package/src/Form/FeedbackForm/FeedbackForm.stories.ts +99 -0
- package/src/Form/FeedbackForm/FeedbackForm.stories.tsx +73 -0
- package/src/Form/FeedbackForm/FeedbackForm.tsx +196 -0
- package/src/Form/FeedbackForm/README.md +233 -0
- package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.ts.snap +125 -0
- package/src/Form/FeedbackForm/__snapshots__/FeedbackForm.stories.tsx.snap +5 -0
- package/src/Form/FeedbackForm/feedback-form.css +74 -0
- package/src/Form/FeedbackForm/feedback-form.entry.js +1 -0
- package/src/Form/FeedbackForm/feedback-form.twig +80 -0
- package/src/Layout/Header/Components/GlobalToggle.tsx +1 -1
- package/src/Layout/Header/Header.stories.ts +53 -48
- package/src/Layout/Header/Header.stories.tsx +35 -22
- package/src/Layout/Header/Header.tsx +2 -2
- package/src/Layout/Header/__snapshots__/Header.stories.ts.snap +14 -10
- package/src/Layout/Header/__snapshots__/Header.stories.tsx.snap +2 -2
- package/src/Layout/Header/_toggles.css +7 -7
- package/src/Layout/Page/__snapshots__/Page.stories.tsx.snap +1 -1
- package/src/Utility/Elements/google-translate-widget.ts +293 -0
- package/src/Utility/global.d.ts +4 -0
- package/src/Utility/utilities.ts +2 -0
- package/src/elements.ts +3 -0
- package/src/enums.ts +2 -0
- package/src/react.ts +3 -0
- package/dist/build/chunks/Accordion-GN0sME4W.js +0 -1
- package/dist/build/chunks/AccordionGroup-Bzqp5__q.js +0 -1
- package/dist/build/chunks/AccordionMobile-DG5jSe8Q.js +0 -1
- package/dist/build/chunks/Autocomplete-B4RtkAyh.js +0 -1
- package/dist/build/chunks/ClosableAlert-DEhj8Nxm.js +0 -1
- package/dist/build/chunks/CookieConsent-BkCMRVST.js +0 -1
- package/dist/build/chunks/Dialog-Haahn-Yn.js +0 -1
- package/dist/build/chunks/DropMenu-1baQc8Yc.js +0 -1
- package/dist/build/chunks/Gallery-D8NGXy2Q.js +0 -1
- package/dist/build/chunks/GlobalToggle-B52fdBQu.js +0 -1
- package/dist/build/chunks/InPageNavigation-Dyn2TR-N.js +0 -1
- package/dist/build/chunks/Navigation-hOrfLq7h.js +0 -1
- package/dist/build/chunks/Popover-Cxg-s5Jn.js +0 -1
- package/dist/build/chunks/Sticky-BGCuuEJK.js +0 -1
- package/dist/build/chunks/Tabs-DYy1YTdU.js +0 -15
- package/dist/build/chunks/cookie-compliance-Bbm-0vpj.js +0 -1
- package/dist/build/chunks/enums-DLV_1NAf.js +0 -1
- package/dist/build/chunks/polyfills-C7pRt54M.js +0 -1
- 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}`)
|
|
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
|
+
}
|
package/src/Utility/global.d.ts
CHANGED
|
@@ -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
|
|
package/src/Utility/utilities.ts
CHANGED
|
@@ -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 }
|
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
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"
|
|
@@ -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};
|