diff --git a/package.json b/package.json index 6731b79c..c6364f81 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "generate": "graphql-codegen", "prestart": "yarn generate", "predev": "yarn generate", - "generate-widget-version": "sh ./scripts/build-widget.sh" + "generate-widget-version": "sh ./scripts/build-widget.sh", + "postinstall": "patch-package" }, "dependencies": { "@apollo/client": "^3.8.8", @@ -81,6 +82,8 @@ "graphql-tag": "^2.12.6", "happy-dom": "^12.10.3", "next-router-mock": "^0.9.10", + "patch-package": "^8.0.0", + "postinstall-postinstall": "^2.1.0", "prettier": "^3.1.1", "rimraf": "^5.0.1", "typescript": "5.3.3", diff --git a/patches/@github+combobox-nav+2.3.0.patch b/patches/@github+combobox-nav+2.3.0.patch new file mode 100644 index 00000000..1654282f --- /dev/null +++ b/patches/@github+combobox-nav+2.3.0.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/@github/combobox-nav/dist/index.js b/node_modules/@github/combobox-nav/dist/index.js +index d86de71..3956688 100644 +--- a/node_modules/@github/combobox-nav/dist/index.js ++++ b/node_modules/@github/combobox-nav/dist/index.js +@@ -34,7 +34,7 @@ export default class Combobox { + this.input.addEventListener('compositionend', this.compositionEventHandler); + this.input.addEventListener('input', this.inputHandler); + this.input.addEventListener('keydown', this.keyboardEventHandler); +- this.list.addEventListener('click', commitWithElement); ++ this.list.addEventListener('mousedown', commitWithElement); + this.indicateDefaultOption(); + } + stop() { +@@ -44,7 +44,7 @@ export default class Combobox { + this.input.removeEventListener('compositionend', this.compositionEventHandler); + this.input.removeEventListener('input', this.inputHandler); + this.input.removeEventListener('keydown', this.keyboardEventHandler); +- this.list.removeEventListener('click', commitWithElement); ++ this.list.removeEventListener('mousedown', commitWithElement); + } + indicateDefaultOption() { + var _a; diff --git a/public/widget/GYJwhgtkA/2.6.0/planner-web.mjs b/public/widget/GYJwhgtkA/2.6.0/planner-web.mjs index 541f1d3d..47d82358 100644 --- a/public/widget/GYJwhgtkA/2.6.0/planner-web.mjs +++ b/public/widget/GYJwhgtkA/2.6.0/planner-web.mjs @@ -1,22 +1,22 @@ -class H { +class q { constructor(e, i, { tabInsertsSuggestions: n, defaultFirstOption: a, scrollIntoViewOptions: s } = {}) { - this.input = e, this.list = i, this.tabInsertsSuggestions = n ?? !0, this.defaultFirstOption = a ?? !1, this.scrollIntoViewOptions = s, this.isComposing = !1, i.id || (i.id = `combobox-${Math.random().toString().slice(2, 6)}`), this.ctrlBindings = !!navigator.userAgent.match(/Macintosh/), this.keyboardEventHandler = (d) => F(d, this), this.compositionEventHandler = (d) => x(d, this), this.inputHandler = this.clearSelection.bind(this), e.setAttribute("role", "combobox"), e.setAttribute("aria-controls", i.id), e.setAttribute("aria-expanded", "false"), e.setAttribute("aria-autocomplete", "list"), e.setAttribute("aria-haspopup", "listbox"); + this.input = e, this.list = i, this.tabInsertsSuggestions = n ?? !0, this.defaultFirstOption = a ?? !1, this.scrollIntoViewOptions = s, this.isComposing = !1, i.id || (i.id = `combobox-${Math.random().toString().slice(2, 6)}`), this.ctrlBindings = !!navigator.userAgent.match(/Macintosh/), this.keyboardEventHandler = (d) => H(d, this), this.compositionEventHandler = (d) => N(d, this), this.inputHandler = this.clearSelection.bind(this), e.setAttribute("role", "combobox"), e.setAttribute("aria-controls", i.id), e.setAttribute("aria-expanded", "false"), e.setAttribute("aria-autocomplete", "list"), e.setAttribute("aria-haspopup", "listbox"); } destroy() { this.clearSelection(), this.stop(), this.input.removeAttribute("role"), this.input.removeAttribute("aria-controls"), this.input.removeAttribute("aria-expanded"), this.input.removeAttribute("aria-autocomplete"), this.input.removeAttribute("aria-haspopup"); } start() { - this.input.setAttribute("aria-expanded", "true"), this.input.addEventListener("compositionstart", this.compositionEventHandler), this.input.addEventListener("compositionend", this.compositionEventHandler), this.input.addEventListener("input", this.inputHandler), this.input.addEventListener("keydown", this.keyboardEventHandler), this.list.addEventListener("click", I), this.indicateDefaultOption(); + this.input.setAttribute("aria-expanded", "true"), this.input.addEventListener("compositionstart", this.compositionEventHandler), this.input.addEventListener("compositionend", this.compositionEventHandler), this.input.addEventListener("input", this.inputHandler), this.input.addEventListener("keydown", this.keyboardEventHandler), this.list.addEventListener("mousedown", C), this.indicateDefaultOption(); } stop() { - this.clearSelection(), this.input.setAttribute("aria-expanded", "false"), this.input.removeEventListener("compositionstart", this.compositionEventHandler), this.input.removeEventListener("compositionend", this.compositionEventHandler), this.input.removeEventListener("input", this.inputHandler), this.input.removeEventListener("keydown", this.keyboardEventHandler), this.list.removeEventListener("click", I); + this.clearSelection(), this.input.setAttribute("aria-expanded", "false"), this.input.removeEventListener("compositionstart", this.compositionEventHandler), this.input.removeEventListener("compositionend", this.compositionEventHandler), this.input.removeEventListener("input", this.inputHandler), this.input.removeEventListener("keydown", this.keyboardEventHandler), this.list.removeEventListener("mousedown", C); } indicateDefaultOption() { var e; - this.defaultFirstOption && ((e = Array.from(this.list.querySelectorAll('[role="option"]:not([aria-disabled="true"])')).filter(T)[0]) === null || e === void 0 || e.setAttribute("data-combobox-option-default", "true")); + this.defaultFirstOption && ((e = Array.from(this.list.querySelectorAll('[role="option"]:not([aria-disabled="true"])')).filter(A)[0]) === null || e === void 0 || e.setAttribute("data-combobox-option-default", "true")); } navigate(e = 1) { - const i = Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(T)[0], n = Array.from(this.list.querySelectorAll('[role="option"]')).filter(T), a = n.indexOf(i); + const i = Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(A)[0], n = Array.from(this.list.querySelectorAll('[role="option"]')).filter(A), a = n.indexOf(i); if (a === n.length - 1 && e === 1 || a === 0 && e === -1) { this.clearSelection(), this.input.focus(); return; @@ -29,7 +29,7 @@ class H { const d = n[s]; if (d) for (const m of n) - m.removeAttribute("data-combobox-option-default"), d === m ? (this.input.setAttribute("aria-activedescendant", d.id), d.setAttribute("aria-selected", "true"), N(d), d.scrollIntoView(this.scrollIntoViewOptions)) : m.removeAttribute("aria-selected"); + m.removeAttribute("data-combobox-option-default"), d === m ? (this.input.setAttribute("aria-activedescendant", d.id), d.setAttribute("aria-selected", "true"), W(d), d.scrollIntoView(this.scrollIntoViewOptions)) : m.removeAttribute("aria-selected"); } clearSelection() { this.input.removeAttribute("aria-activedescendant"); @@ -38,14 +38,14 @@ class H { this.indicateDefaultOption(); } } -function F(t, e) { +function H(t, e) { if (!(t.shiftKey || t.metaKey || t.altKey) && !(!e.ctrlBindings && t.ctrlKey) && !e.isComposing) switch (t.key) { case "Enter": - C(e.input, e.list) && t.preventDefault(); + D(e.input, e.list) && t.preventDefault(); break; case "Tab": - e.tabInsertsSuggestions && C(e.input, e.list) && t.preventDefault(); + e.tabInsertsSuggestions && D(e.input, e.list) && t.preventDefault(); break; case "Escape": e.clearSelection(); @@ -68,99 +68,99 @@ function F(t, e) { e.clearSelection(); } } -function I(t) { +function C(t) { if (!(t.target instanceof Element)) return; const e = t.target.closest('[role="option"]'); - e && e.getAttribute("aria-disabled") !== "true" && W(e, { event: t }); + e && e.getAttribute("aria-disabled") !== "true" && F(e, { event: t }); } -function C(t, e) { +function D(t, e) { const i = e.querySelector('[aria-selected="true"], [data-combobox-option-default="true"]'); return i ? (i.getAttribute("aria-disabled") === "true" || i.click(), !0) : !1; } -function W(t, e) { +function F(t, e) { t.dispatchEvent(new CustomEvent("combobox-commit", { bubbles: !0, detail: e })); } -function N(t) { +function W(t) { t.dispatchEvent(new Event("combobox-select", { bubbles: !0 })); } -function T(t) { +function A(t) { return !t.hidden && !(t instanceof HTMLInputElement && t.type === "hidden") && (t.offsetWidth > 0 || t.offsetHeight > 0); } -function x(t, e) { +function N(t, e) { e.isComposing = t.type === "compositionstart", document.getElementById(e.input.getAttribute("aria-controls") || "") && e.clearSelection(); } -const R = "theme-module__light", G = '"../page-modules/assistant/assistant.module.css"', V = '"../page-modules/departures/departures.module.css"', K = '"../components/search/search.module.css"', U = '"../modules/search-time/selector/selector.module.css"', Q = '"../components/button/button.module.css"', J = "widget-module__hidden", Y = "widget-module__lightWrapper theme-module__light", z = "widget-module__wrapper theme-module__override-light", X = "widget-module__form assistant-module__container", Z = "widget-module__nav", ee = "widget-module__tabs", te = "widget-module__tabSelected", oe = "widget-module__main assistant-module__main", ne = "widget-module__heading assistant-module__heading", ie = "widget-module__inputBoxes", ae = "widget-module__search_container search-module__container", re = "widget-module__search_inputContainer search-module__inputContainer", se = "widget-module__search_label search-module__label typography-module__typo-body__secondary", le = "widget-module__search_input search-module__input", ce = "widget-module__search_inputLast", de = "widget-module__button_geolocation departures-module__geolocationButton", ue = "widget-module__selector_group selector-module__departureDateSelector", pe = "widget-module__selector_options selector-module__options", me = "widget-module__selector_options__small selector-module__options", he = "widget-module__selector_option selector-module__option selector-module__option", _e = "widget-module__selector_option__text selector-module__option__text", ge = "widget-module__selector_option__label selector-module__option__label", be = "widget-module__selector_option__input selector-module__option__input", fe = "widget-module__selector_dateAndTimeSelectorsWrapper selector-module__dateAndTimeSelectorsWrapper", ve = "widget-module__selector_dateAndTimeSelectorsWrapper__hidden", we = "widget-module__selector_dateAndTimeSelectors selector-module__dateAndTimeSelectors", ye = "widget-module__selector_dateSelector selector-module__dateSelector", $e = "widget-module__selector_timeSelector selector-module__timeSelector", Se = "widget-module__buttonGroup", Ee = "widget-module__button", Te = "widget-module__listItem", Ae = "widget-module__itemIcon", Le = "widget-module__itemLocality search-module__itemLocality typography-module__typo-body__secondary", ke = "widget-module__popupContainer search-module__menu", Ie = "widget-module__messageBox", o = { +const x = "theme-module__light", R = '"../page-modules/assistant/assistant.module.css"', G = '"../page-modules/departures/departures.module.css"', V = '"../components/search/search.module.css"', K = '"../modules/search-time/selector/selector.module.css"', U = '"../components/button/button.module.css"', Q = "widget-module__hidden", J = "widget-module__lightWrapper theme-module__light", Y = "widget-module__wrapper theme-module__override-light", z = "widget-module__form assistant-module__container", X = "widget-module__nav", Z = "widget-module__tabs", ee = "widget-module__tabSelected", te = "widget-module__main assistant-module__main", oe = "widget-module__heading assistant-module__heading", ne = "widget-module__inputBoxes", ie = "widget-module__search_container search-module__container", ae = "widget-module__search_inputContainer search-module__inputContainer", re = "widget-module__search_label search-module__label typography-module__typo-body__secondary", se = "widget-module__search_input search-module__input", le = "widget-module__search_inputLast", ce = "widget-module__button_geolocation departures-module__geolocationButton", de = "widget-module__selector_group selector-module__departureDateSelector", ue = "widget-module__selector_options selector-module__options", pe = "widget-module__selector_options__small selector-module__options", me = "widget-module__selector_option selector-module__option selector-module__option", he = "widget-module__selector_option__text selector-module__option__text", _e = "widget-module__selector_option__label selector-module__option__label", ge = "widget-module__selector_option__input selector-module__option__input", fe = "widget-module__selector_dateAndTimeSelectorsWrapper selector-module__dateAndTimeSelectorsWrapper", be = "widget-module__selector_dateAndTimeSelectorsWrapper__hidden", ve = "widget-module__selector_dateAndTimeSelectors selector-module__dateAndTimeSelectors", we = "widget-module__selector_dateSelector selector-module__dateSelector", ye = "widget-module__selector_timeSelector selector-module__timeSelector", $e = "widget-module__buttonGroup", Se = "widget-module__button", Ee = "widget-module__listItem", Te = "widget-module__itemIcon", Ae = "widget-module__itemLocality search-module__itemLocality typography-module__typo-body__secondary", Le = "widget-module__popupContainer search-module__menu", ke = "widget-module__messageBox", o = { "override-light": "theme-module__override-light", - light: R, - assistant: G, - departures: V, - search: K, - selector: U, - buttonComponent: Q, - hidden: J, - lightWrapper: Y, - wrapper: z, - form: X, - nav: Z, - tabs: ee, - tabSelected: te, - main: oe, - heading: ne, - inputBoxes: ie, - search_container: ae, - search_inputContainer: re, - search_label: se, - search_input: le, - search_inputLast: ce, - button_geolocation: de, - selector_group: ue, - selector_options: pe, - selector_options__small: me, - selector_option: he, - selector_option__text: _e, - selector_option__label: ge, - selector_option__input: be, + light: x, + assistant: R, + departures: G, + search: V, + selector: K, + buttonComponent: U, + hidden: Q, + lightWrapper: J, + wrapper: Y, + form: z, + nav: X, + tabs: Z, + tabSelected: ee, + main: te, + heading: oe, + inputBoxes: ne, + search_container: ie, + search_inputContainer: ae, + search_label: re, + search_input: se, + search_inputLast: le, + button_geolocation: ce, + selector_group: de, + selector_options: ue, + selector_options__small: pe, + selector_option: me, + selector_option__text: he, + selector_option__label: _e, + selector_option__input: ge, selector_dateAndTimeSelectorsWrapper: fe, - selector_dateAndTimeSelectorsWrapper__hidden: ve, - selector_dateAndTimeSelectors: we, - selector_dateSelector: ye, - selector_timeSelector: $e, - buttonGroup: Se, - button: Ee, + selector_dateAndTimeSelectorsWrapper__hidden: be, + selector_dateAndTimeSelectors: ve, + selector_dateSelector: we, + selector_timeSelector: ye, + buttonGroup: $e, + button: Se, "button--disabled": "widget-module__button--disabled", - listItem: Te, - itemIcon: Ae, - itemLocality: Le, - popupContainer: ke, - messageBox: Ie + listItem: Ee, + itemIcon: Te, + itemLocality: Ae, + popupContainer: Le, + messageBox: ke }; var B = { MODULE_VERSION: "2.6.0", COMPRESSED_ORG: "GYJwhgtkA" }; -const Ce = 300, y = String.raw, A = B.MODULE_VERSION, L = B.COMPRESSED_ORG; -function De(t) { +const Ie = 300, y = String.raw, L = B.MODULE_VERSION, k = B.COMPRESSED_ORG; +function Ce(t) { if (!(t != null && t.startsWith("http"))) throw new Error("Missing urlBase in correct schema."); return t.endsWith("/") || (t += "/"), { URL_BASE: t, - URL_JS_UMD: `${t}widget/${L}/${A}/planner-web.umd.js`, - URL_JS_ESM: `${t}widget/${L}/${A}/planner-web.mjs`, - URL_CSS: `${t}widget/${L}/${A}/planner-web.css` + URL_JS_UMD: `${t}widget/${k}/${L}/planner-web.umd.js`, + URL_JS_ESM: `${t}widget/${k}/${L}/planner-web.mjs`, + URL_CSS: `${t}widget/${k}/${L}/planner-web.css` }; } function ze({ urlBase: t, language: e = "en" }) { - const i = Je(e), n = De(t); + const i = Je(e), n = Ce(t); return { - output: Pe(n, i), - init: Me, + output: Oe(n, i), + init: De, urls: n }; } -function Me() { +function De() { var e, i; - je(), D("pw-assistant"), D("pw-departures"); + Pe(), M("pw-assistant"), M("pw-departures"); let t = { from: void 0, to: void 0 @@ -187,14 +187,14 @@ function Me() { }), (e = document.querySelector("#pw-form-departures")) == null || e.addEventListener("submit", (n) => { n.preventDefault(); const a = n.currentTarget; - Oe(a, t.from); + Be(a, t.from); }), (i = document.querySelector("#pw-form-assistant")) == null || i.addEventListener("submit", (n) => { n.preventDefault(); const a = n.currentTarget; - Be(a, t.from, t.to); + Me(a, t.from, t.to); }); } -function D(t) { +function M(t) { const e = document.querySelector( `#${t}-searchTimeSelector-date` ), i = document.querySelector( @@ -228,15 +228,15 @@ function O(t, e) { }; } } -function Be(t, e, i) { +function Me(t, e, i) { const n = t.action, a = O(new FormData(t), "pw-assistant"), s = xe({ from: e, to: i }, a), d = new URLSearchParams(s); window.location.href = `${n}?${d.toString()}`; } -function Oe(t, e) { +function Be(t, e) { const i = t.action, n = O(new FormData(t), "pw-departures"), a = Re(n, e), s = new URLSearchParams(a); (e == null ? void 0 : e.layer) === "venue" ? window.location.href = `${i}/${e.id}?${s.toString()}` : window.location.href = `${i}?${s.toString()}`; } -class S extends HTMLElement { +class E extends HTMLElement { constructor() { super(); } @@ -248,7 +248,7 @@ class S extends HTMLElement { }), document.addEventListener("pw-errorMessage-clear", function(i) { e.hidden = !0; }), e.addEventListener("click", function() { - S.clearMessageBox(); + E.clearMessageBox(); }); } static clearMessageBox() { @@ -259,19 +259,19 @@ class S extends HTMLElement { ); } } -function Pe({ URL_BASE: t }, e) { +function Oe({ URL_BASE: t }, e) { function i(r) { - const c = a(r), h = f("span", [r.name]), u = f("span", [r.locality ?? ""], o.itemLocality), l = f("li", [c, h, u], o.listItem); + const c = a(r), h = v("span", [r.name]), u = v("span", [r.locality ?? ""], o.itemLocality), l = v("li", [c, h, u], o.listItem); return l.role = "option", l.setAttribute("data-feature-id", r.id), l; } function n(r) { - const c = f("span", [r]); - return f("li", [c], o.listItem); + const c = v("span", [r]); + return v("li", [c], o.listItem); } function a(r) { - const c = He(r.category), h = f("img"); + const c = He(r.category), h = v("img"); h.src = `${t}assets/mono/light/${c.icon}.svg`, h.alt = c.alt, h.role = "img"; - const u = f("div", [h], o.itemIcon); + const u = v("div", [h], o.itemIcon); return u.ariaHidden = "true", u; } class s extends HTMLElement { @@ -282,7 +282,7 @@ function Pe({ URL_BASE: t }, e) { const c = this; this.querySelector("button").addEventListener("click", async () => { var u; - S.clearMessageBox(); + E.clearMessageBox(); try { const l = await Ke(t, e), g = (u = c.parentElement) == null ? void 0 : u.querySelector("input"); g && (g.value = l ? `${l.name}, ${l.locality}` : g.value), document.dispatchEvent( @@ -307,7 +307,7 @@ function Pe({ URL_BASE: t }, e) { }); } } - customElements.define("pw-geobutton", s), customElements.define("pw-messagebox", S); + customElements.define("pw-geobutton", s), customElements.define("pw-messagebox", E); class d extends HTMLElement { constructor() { super(), this.dataList = {}; @@ -323,62 +323,59 @@ function Pe({ URL_BASE: t }, e) { connectedCallback() { const c = this, h = qe( this.getAttribute("data-debounce-ms"), - Ce + Ie ), u = this.querySelector("input"), l = this.querySelector( "#" + this.getAttribute("for") ); - let g = new H(u, l, { + let g = new q(u, l, { tabInsertsSuggestions: !0, scrollIntoViewOptions: !1 }); - function v(p) { + function w(p) { p ? g.start() : (g.clearSelection(), g.stop()), l.hidden = !p; } - function k() { + function I() { c.setItems([]), l.innerHTML = ""; const p = n(e.noResults); - l.appendChild(p), v(!0); + l.appendChild(p), w(!0); } - const j = M(async (p) => { + const j = je(async (p) => { try { if (!p.value) { l.innerHTML = ""; return; } - const b = await Ge(t, p.value); - if (b.length === 0) - return k(); - c.setItems(b), l.innerHTML = ""; - for (let w of b) { - const q = i(w); - l.appendChild(q); + const f = await Ge(t, p.value); + if (f.length === 0) + return I(); + c.setItems(f), l.innerHTML = ""; + for (let b of f) { + const S = i(b); + l.appendChild(S); } - v(!0); + w(!0); } catch { - k(); + I(); } }, h); u.addEventListener("keydown", (p) => { - p.key === "Escape" && v(!1); + p.key === "Escape" && w(!1); }), u.addEventListener( "input", (p) => j(p.target) - ), u.addEventListener("focus", () => v(!0)), u.addEventListener( - "blur", - // Blur after properly selecting - M(() => v(!1), 100) - ), document.addEventListener("click", (p) => { - P(p.target, this) || v(!1); + ), u.addEventListener("focus", () => w(!0)), u.addEventListener("blur", () => w(!1)), document.addEventListener("click", (p) => { + P(p.target, this) || w(!1); }), l.addEventListener("combobox-commit", function(p) { - const b = p.target.getAttribute( + const f = p.target.getAttribute( "data-feature-id" - ), w = b ? c.getItem(b) : void 0; - u.value = w ? `${w.name}, ${w.locality}` : u.value, document.dispatchEvent( + ), b = f ? c.getItem(f) : void 0; + let S = u.value; + b && (S = `${b.name}`, b.locality && (S += `, ${b.locality}`)), u.value = S, document.dispatchEvent( new CustomEvent("search-selected", { bubbles: !0, detail: { key: u.name, - item: w + item: b } }) ), l.hidden = !0, g.clearSelection(), g.stop(); @@ -484,7 +481,7 @@ function Pe({ URL_BASE: t }, e) { - `, E = y` + `, T = y`