@expressivecss/expressive 0.14.1 → 0.15.0
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/CHANGELOG.md +88 -1
- package/README.md +1 -1
- package/dist/css/expressive.css +200 -241
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/js/chunks/{chunk-4KMNFIFZ.mjs → chunk-33QVDDGR.mjs} +3 -3
- package/dist/js/chunks/{chunk-SPETGK25.mjs → chunk-45FER6RI.mjs} +5 -5
- package/dist/js/chunks/chunk-45FER6RI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-5CEAOLUA.mjs} +11 -10
- package/dist/js/chunks/{chunk-GIW4K4SE.mjs.map → chunk-5CEAOLUA.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-LRZMJZ3T.mjs → chunk-6VATUZC6.mjs} +10 -6
- package/dist/js/chunks/chunk-6VATUZC6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-74MXKKLN.mjs} +2 -2
- package/dist/js/chunks/{chunk-QDAL4IYN.mjs.map → chunk-74MXKKLN.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-CUQPB25U.mjs → chunk-AIURVCG6.mjs} +3 -3
- package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-BGZLF6JZ.mjs} +16 -16
- package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-C6CHEWYP.mjs} +2 -2
- package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-CK2XCICY.mjs} +2 -2
- package/dist/js/chunks/{chunk-KY6U46SM.mjs → chunk-CXXM2L4F.mjs} +8 -9
- package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +7 -0
- package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-DXGRXYYL.mjs} +25 -37
- package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-FM5CZOUB.mjs} +3 -7
- package/dist/js/chunks/{chunk-MZ6Z24BX.mjs.map → chunk-FM5CZOUB.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-GJL6GCIU.mjs} +34 -55
- package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +7 -0
- package/dist/js/chunks/chunk-K3HZMFMD.mjs +135 -0
- package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-KHXZ2A4K.mjs} +12 -15
- package/dist/js/chunks/{chunk-TBM3FT7G.mjs.map → chunk-KHXZ2A4K.mjs.map} +2 -2
- package/dist/js/chunks/chunk-KQACNQ22.mjs +7 -0
- package/dist/js/chunks/{chunk-KBNN3QDH.mjs.map → chunk-KQACNQ22.mjs.map} +1 -1
- package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-KUFHW3DS.mjs} +2 -2
- package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-KVJAVDBC.mjs} +7 -15
- package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-L27Q6ZMI.mjs} +2 -2
- package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-LQWUDNHZ.mjs} +3 -3
- package/dist/js/chunks/{chunk-MNPROCZF.mjs → chunk-M372EDXD.mjs} +4 -10
- package/dist/js/chunks/chunk-M372EDXD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-YMSXJON6.mjs → chunk-M3MURWMB.mjs} +15 -12
- package/dist/js/chunks/{chunk-YMSXJON6.mjs.map → chunk-M3MURWMB.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-NUHMOAOY.mjs} +18 -33
- package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VGZSAFTX.mjs → chunk-OWG3LMUL.mjs} +7 -11
- package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LTWPGFBR.mjs → chunk-PD6HYHAE.mjs} +4 -15
- package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-PDG64UHF.mjs} +3 -3
- package/dist/js/chunks/{chunk-QERLECVU.mjs → chunk-PO3AXVR3.mjs} +38 -64
- package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ILP3PDTL.mjs → chunk-QYGK36OG.mjs} +7 -13
- package/dist/js/chunks/chunk-QYGK36OG.mjs.map +7 -0
- package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-SFI2U4YW.mjs} +28 -44
- package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SMY7GJSS.mjs} +3 -3
- package/dist/js/chunks/{chunk-O5XPWXIQ.mjs → chunk-TCCA2HDG.mjs} +39 -31
- package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-TSZYSW7F.mjs} +4 -4
- package/dist/js/chunks/{chunk-PM655FXL.mjs.map → chunk-TSZYSW7F.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-UAZSDUVP.mjs} +3 -4
- package/dist/js/chunks/{chunk-UEZUJQ66.mjs.map → chunk-UAZSDUVP.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-6N2XAEFK.mjs → chunk-UBRZZWRA.mjs} +10 -8
- package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +7 -0
- package/dist/js/chunks/{chunk-5BKHWHYY.mjs → chunk-UCOE7ZDL.mjs} +41 -46
- package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-UETTGDLI.mjs} +3 -3
- package/dist/js/chunks/{chunk-RHRQKTTX.mjs → chunk-UNCRDLP6.mjs} +6 -9
- package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-VGNYF6FB.mjs} +3 -6
- package/dist/js/chunks/{chunk-GUB3TNO2.mjs.map → chunk-VGNYF6FB.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-X7OCHZVF.mjs → chunk-VGPGBNGL.mjs} +4 -12
- package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +7 -0
- package/dist/js/chunks/chunk-VKAUVTQY.mjs +1 -0
- package/dist/js/chunks/{chunk-HKT2S7VM.mjs → chunk-VM4FTS7L.mjs} +3 -3
- package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-WDK4T63U.mjs} +8 -11
- package/dist/js/chunks/chunk-WDK4T63U.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GZKEFWPM.mjs → chunk-WOCCTVUF.mjs} +38 -34
- package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QJABDLSD.mjs → chunk-WQYN5L4E.mjs} +11 -16
- package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-X4ISMKE2.mjs} +2 -2
- package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-XAEAEHIX.mjs} +6 -8
- package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-ZX6M7SWO.mjs} +24 -24
- package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +7 -0
- package/dist/js/expressive.cjs +484 -507
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +484 -507
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +10 -13
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +54 -50
- package/dist/js/expressive.mjs.map +1 -1
- package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
- package/dist/js/internal/components/appBar.mjs +2 -2
- package/dist/js/internal/components/autocomplete.mjs +4 -4
- package/dist/js/internal/components/barChart.mjs +4 -4
- package/dist/js/internal/components/buttonGroup.mjs +2 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/characterCounter.mjs +2 -2
- package/dist/js/internal/components/chips.mjs +5 -5
- package/dist/js/internal/components/columnChart.mjs +3 -3
- package/dist/js/internal/components/commandPalette.mjs +3 -3
- package/dist/js/internal/components/confetti.mjs +2 -2
- package/dist/js/internal/components/datepicker.mjs +6 -6
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/heatmapChart.mjs +3 -3
- package/dist/js/internal/components/index.mjs +47 -43
- package/dist/js/internal/components/keypad.mjs +9 -0
- package/dist/js/internal/components/keypad.mjs.map +7 -0
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/lineChart.mjs +6 -2
- package/dist/js/internal/components/mapView.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/messageScroller.mjs +3 -3
- package/dist/js/internal/components/mixedChart.mjs +4 -4
- package/dist/js/internal/components/navigationRail.mjs +2 -2
- package/dist/js/internal/components/particles.mjs +2 -2
- package/dist/js/internal/components/pieChart.mjs +3 -3
- package/dist/js/internal/components/questionnaire.mjs +3 -3
- package/dist/js/internal/components/radarChart.mjs +3 -3
- package/dist/js/internal/components/radialChart.mjs +3 -3
- package/dist/js/internal/components/registry.mjs +41 -40
- package/dist/js/internal/components/richTextEditor.mjs +3 -3
- package/dist/js/internal/components/scrollspy.mjs +2 -2
- package/dist/js/internal/components/select.mjs +4 -4
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/tabs.mjs +4 -4
- package/dist/js/internal/components/timepicker.mjs +4 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/core/component.mjs +1 -1
- package/dist/js/internal/core/utils.mjs +1 -1
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/modular.mjs +54 -50
- package/dist/types/components/autocomplete.d.ts +1 -0
- package/dist/types/components/datepicker.d.ts +3 -4
- package/dist/types/components/expandingCard.d.ts +2 -0
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/components/keypad.d.ts +34 -0
- package/dist/types/components/lightbox.d.ts +3 -5
- package/dist/types/components/lineChart.d.ts +4 -0
- package/dist/types/components/menu.d.ts +1 -0
- package/dist/types/components/radialChart.d.ts +0 -1
- package/dist/types/components/registry.d.ts +4 -0
- package/dist/types/components/slider.d.ts +2 -0
- package/dist/types/components/snackbar.d.ts +1 -0
- package/dist/types/components/tabs.d.ts +4 -0
- package/dist/types/components/timepicker.d.ts +2 -0
- package/dist/types/modular.d.ts +1 -1
- package/dist/types/plugins/dockedDisplayPlugin.d.ts +1 -0
- package/package.json +1 -1
- package/src/sass/abstracts/_breakpoints.scss +0 -1
- package/src/sass/abstracts/_elevation.scss +1 -1
- package/src/sass/abstracts/_mixins.scss +20 -60
- package/src/sass/abstracts/_variables.scss +10 -0
- package/src/sass/base/_global.scss +3 -12
- package/src/sass/base/_index.scss +1 -1
- package/src/sass/components/_badges.scss +1 -8
- package/src/sass/components/_bar-chart.scss +1 -1
- package/src/sass/components/_button-groups.scss +31 -66
- package/src/sass/components/_cards.scss +6 -25
- package/src/sass/components/_carousel.scss +16 -55
- package/src/sass/components/_chips.scss +0 -6
- package/src/sass/components/_column-chart.scss +1 -1
- package/src/sass/components/_data-table.scss +1 -3
- package/src/sass/components/_datepicker.scss +3 -22
- package/src/sass/components/_dialog.scss +1 -4
- package/src/sass/components/_heatmap-chart.scss +2 -2
- package/src/sass/components/_icon-buttons.scss +0 -1
- package/src/sass/components/_index.scss +1 -0
- package/src/sass/components/_keypad.scss +162 -0
- package/src/sass/components/_lightbox.scss +3 -8
- package/src/sass/components/_map.scss +2 -2
- package/src/sass/components/_menu.scss +31 -74
- package/src/sass/components/_mixed-chart.scss +1 -1
- package/src/sass/components/_navbar.scss +9 -45
- package/src/sass/components/_navigation-rail.scss +23 -32
- package/src/sass/components/_page-footer.scss +15 -12
- package/src/sass/components/_panes.scss +2 -6
- package/src/sass/components/_progress.scss +6 -4
- package/src/sass/components/_side-sheet.scss +1 -4
- package/src/sass/components/_stepper.scss +0 -4
- package/src/sass/components/_timepicker.scss +4 -36
- package/src/sass/components/_toolbar.scss +0 -4
- package/src/sass/components/forms/_checkboxes.scss +37 -65
- package/src/sass/components/forms/_fieldset.scss +3 -3
- package/src/sass/components/forms/_file-input.scss +0 -1
- package/src/sass/components/forms/_radio-buttons.scss +10 -36
- package/src/sass/components/forms/_select.scss +0 -3
- package/src/sass/components/forms/_slider.scss +72 -259
- package/src/sass/tokens/_state.scss +2 -2
- package/src/sass/tokens/_theme.scss +1 -1
- package/src/sass/utilities/_colors.scss +6 -1
- package/src/sass/utilities/_index.scss +1 -1
- package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
- package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
- package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
- package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
- package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
- package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
- package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
- package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
- package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
- package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
- package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
- package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
- package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
- package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
- package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
- package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
- package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
- package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
- package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
- package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
- package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
- package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
- /package/dist/js/chunks/{chunk-4KMNFIFZ.mjs.map → chunk-33QVDDGR.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-CUQPB25U.mjs.map → chunk-AIURVCG6.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-BG6ZRB5H.mjs.map → chunk-C6CHEWYP.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-GVGT6MIU.mjs.map → chunk-CK2XCICY.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-UEXCIMJZ.mjs.map → chunk-KUFHW3DS.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-YDCS5S3J.mjs.map → chunk-L27Q6ZMI.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-NS2UMNZV.mjs.map → chunk-LQWUDNHZ.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZAS25YFD.mjs.map → chunk-PDG64UHF.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-FS7XY3HT.mjs.map → chunk-SMY7GJSS.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-4TKTLGEM.mjs.map → chunk-UETTGDLI.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-VKAUVTQY.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-HKT2S7VM.mjs.map → chunk-VM4FTS7L.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-DAIU5SLG.mjs.map → chunk-X4ISMKE2.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/keypad.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface KeypadOptions extends BaseOptions {\n /**\n * Called after every key press with the text typed ('7', 'A', ' ') or the\n * function key's name ('Backspace', 'Enter', 'Shift').\n * @default null\n */\n onKey: ((key: string) => void) | null;\n}\n\nconst _defaults: KeypadOptions = {\n onKey: null\n};\n\ntype Field = HTMLInputElement | HTMLTextAreaElement;\ntype Root = Document | ShadowRoot;\n\nconst isField = (el: unknown): el is Field => el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;\n\nconst instances = new Set<Keypad>();\n// Fields that have had focus, so their caret is one a person placed.\nconst touched = new WeakSet<Field>();\nlet segmenter: Intl.Segmenter | undefined;\n\n// One listener per document or shadow root serves every keypad in it, kept\n// while any keypad lives there. A key inside a keypad belongs to that keypad.\n// A `data-key` key inside a field's `.field` wrapper, such as a trailing\n// Backspace, belongs to the keypad that controls the field, found at press\n// time: a field rendered after init or a changed aria-controls still works,\n// and a press runs once however many keypads share the field. Other buttons\n// there, such as a password toggle, stay their own.\nfunction keyFor(e: Event): [Keypad, HTMLButtonElement] | null {\n const key = (e.target as Element).closest?.('button');\n if (!key) return null;\n const keypad = key.closest('.keypad, .keyboard')?.['Expressive_Keypad'] as Keypad | undefined;\n if (keypad) return [keypad, key];\n const wrapper = key.dataset.key && key.closest('.field');\n if (!wrapper) return null;\n for (const other of instances) {\n const field = other.target;\n if (field && wrapper.contains(field)) return [other, key];\n }\n return null;\n}\n\nconst rootListeners: [string, EventListener][] = [\n // A pointer press on a key would move focus off the field and hide its\n // caret. Keep focus where it is while the field has it.\n ['mousedown', (e) => {\n const hit = keyFor(e);\n if (hit && hit[0]._root?.activeElement === hit[0].target) e.preventDefault();\n }],\n ['click', (e) => {\n const hit = keyFor(e);\n if (hit) hit[0]._press(hit[1]);\n }],\n ['focusin', (e) => {\n if (isField(e.target)) touched.add(e.target);\n }]\n];\n\n/**\n * Keypad and keyboard. A `.keypad` or `.keyboard` whose `aria-controls`\n * names a text field types into it: a key's `value` is inserted at the caret,\n * and `data-key=\"Backspace\"`, `\"Enter\"` and `\"Shift\"` edit, submit and\n * capitalize. The field receives the same `input` event typing would fire.\n */\nexport class Keypad extends Component<KeypadOptions> {\n /** @internal */\n _root: Root | null;\n\n constructor(el: HTMLElement, options: Partial<KeypadOptions>) {\n super(el, options, Keypad);\n this.el['Expressive_Keypad'] = this;\n this.options = { ...Keypad.defaults, ...options };\n const root = this.el.getRootNode();\n // A document (9) or shadow root (11); a detached keypad has neither.\n this._root = root.nodeType === 9 || root.nodeType === 11 ? (root as Root) : null;\n if (this._root && !this._shared()) {\n for (const [type, listener] of rootListeners) this._root.addEventListener(type, listener);\n }\n instances.add(this);\n const active = this._root?.activeElement;\n if (isField(active)) touched.add(active);\n }\n\n static get defaults(): KeypadOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<KeypadOptions>): Keypad;\n static init(els: InitElements<InitElement>, options?: Partial<KeypadOptions>): Keypad[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<KeypadOptions> = {}\n ): Keypad | Keypad[] {\n return super.init(els, options, Keypad);\n }\n\n static getInstance(el: HTMLElement): Keypad {\n return el['Expressive_Keypad'];\n }\n\n destroy() {\n instances.delete(this);\n if (this._root && !this._shared()) {\n for (const [type, listener] of rootListeners) this._root.removeEventListener(type, listener);\n }\n this.el['Expressive_Keypad'] = undefined;\n }\n\n /** The text field named by `aria-controls`, if there is one. */\n get target(): Field | null {\n const id = this.el.getAttribute('aria-controls');\n const field = id ? Utils.getElementById(this.el, id) : null;\n return isField(field) ? field : null;\n }\n\n // Whether another keypad already listens on this one's root.\n private _shared() {\n for (const other of instances) if (other !== this && other._root === this._root) return true;\n return false;\n }\n\n /** @internal */\n _press(key: HTMLButtonElement) {\n const name = key.dataset.key;\n // A button that is neither a value key nor a function key is not a key.\n if (key.disabled || (!name && !key.hasAttribute('value'))) return;\n if (name === 'Shift') {\n key.setAttribute('aria-pressed', String(key.getAttribute('aria-pressed') !== 'true'));\n this.options.onKey?.(name);\n return;\n }\n let text = name ? '' : key.value;\n // Shift is one-shot: it capitalizes the next character and releases.\n const shift = text && this.el.querySelector('[data-key=\"Shift\"][aria-pressed=\"true\"]');\n if (shift) {\n text = text.toUpperCase();\n shift.setAttribute('aria-pressed', 'false');\n }\n const field = this.target;\n if (field && !field.matches(':disabled') && !field.readOnly) {\n if (name === 'Enter' && field instanceof HTMLInputElement) field.form?.requestSubmit();\n else if (name === 'Enter') this._edit(field, '\\n', 'insertLineBreak');\n else if (name === 'Backspace') this._edit(field, '', 'deleteContentBackward');\n else if (text) this._edit(field, text, 'insertText');\n }\n this.options.onKey?.(name ?? text);\n }\n\n private _edit(field: Field, text: string, inputType: string) {\n const { value } = field;\n // Number and email inputs expose no selection; type at the end.\n let start = field.selectionStart ?? value.length;\n let end = field.selectionEnd ?? value.length;\n // A field that has never had focus may report its caret at 0. Type at the\n // end, where a reader expects the next character.\n if (start === 0 && end === 0 && !touched.has(field)) start = end = value.length;\n // Backspace removes the whole character before the caret, emoji included.\n // A short tail holds the last grapheme, so long text is not walked.\n if (inputType === 'deleteContentBackward' && start === end && start) {\n const tail = value.slice(Math.max(0, start - 64), start);\n start -= (segmenter ??= new Intl.Segmenter()).segment(tail).containing(tail.length - 1).segment.length;\n }\n if (start === end && !text) return;\n if (text && field.maxLength >= 0 && value.length - (end - start) + text.length > field.maxLength) return;\n const next = value.slice(0, start) + text + value.slice(end);\n field.value = next;\n // A number input empties itself on a partial value such as \"12.\" or \"-\".\n // Keep what was there; the docs point decimals and signs at a text field.\n if (next && !field.value) {\n field.value = value;\n return;\n }\n if (field.selectionStart !== null) field.setSelectionRange(start + text.length, start + text.length);\n touched.add(field);\n // Composed, so listeners outside a shadow root hear it as they do typing.\n field.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType, data: text || null }));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M372EDXD.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PD6HYHAE.mjs";
|
|
7
7
|
|
|
8
8
|
// src/ts/components/mapView.ts
|
|
9
9
|
var OPENFREEMAP = "https://tiles.openfreemap.org/styles/";
|
|
@@ -218,6 +218,13 @@ var MapView = class _MapView extends Component {
|
|
|
218
218
|
const reset = () => {
|
|
219
219
|
this.map.getCanvas().style.cursor = "";
|
|
220
220
|
};
|
|
221
|
+
const listen = (method) => {
|
|
222
|
+
this.map[method]("click", clusters, zoomIn);
|
|
223
|
+
for (const layer of [clusters, points]) {
|
|
224
|
+
this.map[method]("mouseenter", layer, pointer);
|
|
225
|
+
this.map[method]("mouseleave", layer, reset);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
221
228
|
this._draw(id, {
|
|
222
229
|
draw: () => {
|
|
223
230
|
const color = options.color ?? this._color("var(--md-comp-map-cluster-color)");
|
|
@@ -262,19 +269,9 @@ var MapView = class _MapView extends Component {
|
|
|
262
269
|
paint: { "circle-color": color, "circle-radius": 6, "circle-stroke-width": 2, "circle-stroke-color": surface }
|
|
263
270
|
});
|
|
264
271
|
},
|
|
265
|
-
off: () =>
|
|
266
|
-
this.map.off("click", clusters, zoomIn);
|
|
267
|
-
for (const layer of [clusters, points]) {
|
|
268
|
-
this.map.off("mouseenter", layer, pointer);
|
|
269
|
-
this.map.off("mouseleave", layer, reset);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
+
off: () => listen("off")
|
|
272
273
|
});
|
|
273
|
-
|
|
274
|
-
for (const layer of [clusters, points]) {
|
|
275
|
-
this.map.on("mouseenter", layer, pointer);
|
|
276
|
-
this.map.on("mouseleave", layer, reset);
|
|
277
|
-
}
|
|
274
|
+
listen("on");
|
|
278
275
|
}
|
|
279
276
|
/** Removes a route, arcs or clusters added with this id. */
|
|
280
277
|
removeOverlay(id) {
|
|
@@ -395,4 +392,4 @@ var MapView = class _MapView extends Component {
|
|
|
395
392
|
export {
|
|
396
393
|
MapView
|
|
397
394
|
};
|
|
398
|
-
//# sourceMappingURL=chunk-
|
|
395
|
+
//# sourceMappingURL=chunk-KHXZ2A4K.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ts/components/mapView.ts"],
|
|
4
|
-
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\n/** `[longitude, latitude]`, MapLibre's order. */\nexport type LngLat = [number, number];\n\n/**\n * The parts of the `maplibre-gl` module this component uses. Declared here so\n * the published types do not depend on MapLibre.\n */\nexport interface MapLibre {\n Map: new (options: object) => any;\n Marker: new (options: object) => any;\n Popup: new (options: object) => any;\n}\n\n/** A style for each color scheme. The map follows the page's theme. */\nexport interface MapThemedStyle {\n light: string | object;\n dark: string | object;\n}\n\nexport interface MapViewOptions extends BaseOptions {\n /**\n * The `maplibre-gl` module. ExpressiveCSS does not bundle MapLibre, so the\n * page imports it and passes it in.\n * @default null\n */\n maplibregl: MapLibre | null;\n /**\n * A MapLibre style URL or object, or `{ light, dark }` to follow the theme.\n * @default OpenFreeMap Positron and Dark\n */\n style: string | object | MapThemedStyle;\n /**\n * Starting `[longitude, latitude]`.\n * @default [0, 20]\n */\n center: LngLat;\n /**\n * Starting zoom level.\n * @default 1\n */\n zoom: number;\n /**\n * More MapLibre `Map` options, such as `maxZoom` or `bearing`.\n * @default {}\n */\n mapOptions: object;\n}\n\nexport interface MapLineOptions {\n /** CSS color. Defaults to the route or arc color token. */\n color?: string;\n /** Width in pixels. Routes default to 4, arcs to 2. */\n width?: number;\n /** 0 to 1. */\n opacity?: number;\n /** Dash and gap lengths in line widths, such as `[2, 2]`. */\n dashArray?: number[];\n}\n\nexport interface MapArc {\n from: LngLat;\n to: LngLat;\n}\n\nexport interface MapClusterOptions {\n /** CSS color. Defaults to the cluster color token. */\n color?: string;\n /**\n * Pixels within which points join a cluster.\n * @default 50\n */\n radius?: number;\n /**\n * Last zoom level that clusters points.\n * @default 14\n */\n maxZoom?: number;\n}\n\nconst OPENFREEMAP = 'https://tiles.openfreemap.org/styles/';\n\nconst _defaults: MapViewOptions = {\n maplibregl: null,\n style: { light: `${OPENFREEMAP}positron`, dark: `${OPENFREEMAP}dark` },\n center: [0, 20],\n zoom: 1,\n mapOptions: {}\n};\n\ntype Overlay = { draw: () => void; off?: () => void };\n\nconst lngLat = (el: HTMLElement) => el.dataset.lngLat.split(',').map(Number) as LngLat;\n\n// A quadratic B\u00E9zier from `from` to `to`, bowed north of an eastward line.\n// ponytail: drawn in degrees, so an arc across the antimeridian goes the long\n// way round; split it at \u00B1180 if that matters.\nfunction arc([x0, y0]: LngLat, [x2, y2]: LngLat, steps = 32): LngLat[] {\n const bow = x2 >= x0 ? 0.25 : -0.25;\n const x1 = (x0 + x2) / 2 - (y2 - y0) * bow;\n const y1 = (y0 + y2) / 2 + (x2 - x0) * bow;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps, u = 1 - t;\n return [u * u * x0 + 2 * u * t * x1 + t * t * x2, u * u * y0 + 2 * u * t * y1 + t * t * y2];\n });\n}\n\n/**\n * An interactive map built on MapLibre: a `.map` holding `.map-marker`,\n * `.map-popup` and `.map-controls` children.\n *\n * Each marker sits at its `data-lng-lat`. A marker button with\n * `aria-controls` opens the `.map-popup` it names; a popup with its own\n * `data-lng-lat` and no marker opens at init. Buttons in `.map-controls`\n * run their `data-action`: `zoom-in`, `zoom-out`, `compass`, `locate` or\n * `fullscreen`. Routes, arcs and clusters are data, so they are added from\n * script. The default style follows the page's light or dark theme, and\n * line and cluster colors come from the theme.\n *\n * The class is `MapView` rather than `Map` so importing it does not shadow\n * JavaScript's `Map`.\n */\nexport class MapView extends Component<MapViewOptions> {\n /** The MapLibre map. */\n map: any = null;\n /** The MapLibre markers made from `.map-marker` children, in order. */\n markers: any[] = [];\n private _children: Element[] = [];\n private _popups: any[] = [];\n private _markerPopups = new Map<HTMLElement, any>();\n private _overlays = new Map<string, Overlay>();\n private _styleReady = false;\n private _dark = false;\n private _location: any = null;\n private _media: MediaQueryList | null = null;\n private _observer: MutationObserver | null = null;\n // Looked up once: `move` fires every frame of a pan or zoom.\n private _zoomIn: HTMLButtonElement[] = [];\n private _zoomOut: HTMLButtonElement[] = [];\n\n constructor(el: HTMLElement, options: Partial<MapViewOptions>) {\n super(el, options, MapView);\n this.el['Expressive_MapView'] = this;\n this.options = {\n ...MapView.defaults,\n ...options\n };\n const lib = this.options.maplibregl;\n if (!lib) {\n console.error('MapView needs the maplibre-gl module in options.maplibregl.');\n return;\n }\n\n this._children = [...el.children];\n this._zoomIn = [...this._buttons('zoom-in')];\n this._zoomOut = [...this._buttons('zoom-out')];\n this._dark = this._isDark();\n this.map = new lib.Map({\n ...this.options.mapOptions,\n container: el,\n style: this._style(),\n center: this.options.center,\n zoom: this.options.zoom\n });\n this.map.on('style.load', this._handleStyleLoad);\n this.map.on('move', this._sync);\n this.map.on('click', this._handleMapClick);\n\n const children = this._children.filter((child): child is HTMLElement => child instanceof HTMLElement);\n const claimed = new Set<Element>();\n for (const marker of children.filter((child) => child.matches('.map-marker[data-lng-lat]'))) {\n const target = marker.hasAttribute('aria-controls') ? Utils.getElementById(marker, marker.getAttribute('aria-controls')) : null;\n const popup = target?.parentElement === el && target.matches('.map-popup') ? target : null;\n if (popup) claimed.add(popup);\n this._addMarker(marker, popup);\n }\n for (const popup of children.filter((child) => child.matches('.map-popup[data-lng-lat]') && !claimed.has(child))) {\n this._popup(popup, 0).setLngLat(lngLat(popup)).addTo(this.map);\n }\n\n if (this._themed()) {\n this._media = matchMedia('(prefers-color-scheme: dark)');\n this._media.addEventListener('change', this._handleScheme);\n this._observer = new MutationObserver(this._handleScheme);\n this._observer.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n }\n for (const button of this._buttons('fullscreen')) button.hidden = !document.fullscreenEnabled;\n document.addEventListener('fullscreenchange', this._handleFullscreen);\n el.addEventListener('click', this._handleClick);\n el.addEventListener('keydown', this._handleKeydown);\n this._sync();\n }\n\n static get defaults(): MapViewOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of MapView.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MapViewOptions>): MapView;\n /**\n * Initializes instances of MapView.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MapViewOptions>): MapView[];\n /**\n * Initializes instances of MapView.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MapViewOptions> = {}\n ): MapView | MapView[] {\n return super.init(els, options, MapView);\n }\n\n static getInstance(el: HTMLElement): MapView {\n return el['Expressive_MapView'];\n }\n\n destroy() {\n this.el['Expressive_MapView'] = undefined;\n if (!this.map) return;\n this.el.removeEventListener('click', this._handleClick);\n this.el.removeEventListener('keydown', this._handleKeydown);\n document.removeEventListener('fullscreenchange', this._handleFullscreen);\n this._media?.removeEventListener('change', this._handleScheme);\n this._observer?.disconnect();\n for (const overlay of this._overlays.values()) overlay.off?.();\n for (const popup of this._popups) popup.remove();\n for (const marker of this.markers) {\n marker.remove();\n const element: HTMLElement = marker.getElement();\n element.classList.remove(...[...element.classList].filter((name) => name.startsWith('maplibregl-')));\n element.style.removeProperty('transform');\n element.style.removeProperty('opacity');\n if (element.hasAttribute('aria-controls')) element.removeAttribute('aria-expanded');\n }\n this._location?.remove();\n this._location = null;\n this.map.remove();\n this.map = null;\n this.markers = [];\n this._popups = [];\n this._markerPopups.clear();\n this._overlays.clear();\n this.el.style.removeProperty('--md-comp-map-bearing');\n for (const button of this.el.querySelectorAll<HTMLButtonElement>('.map-controls [data-action]')) {\n button.disabled = false;\n button.hidden = false;\n button.removeAttribute('aria-pressed');\n }\n this.el.append(...this._children);\n }\n\n /** Draws a line through `[longitude, latitude]` points. Replaces an overlay with the same id. */\n addRoute(id: string, coordinates: LngLat[], options: MapLineOptions = {}) {\n this._line(id, { type: 'LineString', coordinates }, 'route', { width: 4, ...options });\n }\n\n /** Draws a curved line for each `{ from, to }`. Replaces an overlay with the same id. */\n addArcs(id: string, arcs: MapArc[], options: MapLineOptions = {}) {\n this._line(id, { type: 'MultiLineString', coordinates: arcs.map(({ from, to }) => arc(from, to)) }, 'arc', { width: 2, ...options });\n }\n\n /**\n * Draws GeoJSON points, or the URL of a GeoJSON file, as clusters that\n * show their count and zoom in when clicked. The layers are\n * `${id}-clusters`, `${id}-count` and `${id}-points`.\n */\n addClusters(id: string, data: object | string, options: MapClusterOptions = {}) {\n const clusters = `${id}-clusters`, points = `${id}-points`;\n const zoomIn = async (e: any) => {\n const [feature] = e.features;\n const zoom = await this.map.getSource(id).getClusterExpansionZoom(feature.properties.cluster_id);\n this.map.easeTo({ center: feature.geometry.coordinates, zoom });\n };\n const pointer = () => { this.map.getCanvas().style.cursor = 'pointer'; };\n const reset = () => { this.map.getCanvas().style.cursor = ''; };\n this._draw(id, {\n draw: () => {\n const color = options.color ?? this._color('var(--md-comp-map-cluster-color)');\n const surface = this._color('var(--md-comp-map-marker-ring-color)');\n this.map.addSource(id, {\n type: 'geojson',\n data,\n cluster: true,\n clusterRadius: options.radius ?? 50,\n clusterMaxZoom: options.maxZoom ?? 14\n });\n this.map.addLayer({\n id: clusters,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': color,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 10, 20, 100, 26],\n 'circle-stroke-width': 6,\n 'circle-stroke-color': color,\n 'circle-stroke-opacity': 0.3\n }\n });\n // A symbol layer needs the style's glyphs and one of its fonts.\n const style = this.map.getStyle();\n const font = style.glyphs && style.layers.find((layer: any) => layer.layout?.['text-font'])?.layout['text-font'];\n if (font) {\n this.map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-font': font, 'text-size': 12 },\n paint: { 'text-color': this._color('var(--md-comp-map-cluster-label-color)') }\n });\n }\n this.map.addLayer({\n id: points,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: { 'circle-color': color, 'circle-radius': 6, 'circle-stroke-width': 2, 'circle-stroke-color': surface }\n });\n },\n off: () => {\n this.map.off('click', clusters, zoomIn);\n for (const layer of [clusters, points]) {\n this.map.off('mouseenter', layer, pointer);\n this.map.off('mouseleave', layer, reset);\n }\n }\n });\n this.map.on('click', clusters, zoomIn);\n for (const layer of [clusters, points]) {\n this.map.on('mouseenter', layer, pointer);\n this.map.on('mouseleave', layer, reset);\n }\n }\n\n /** Removes a route, arcs or clusters added with this id. */\n removeOverlay(id: string) {\n const overlay = this._overlays.get(id);\n if (!overlay) return;\n this._overlays.delete(id);\n overlay.off?.();\n if (!this._styleReady || !this.map.getSource(id)) return;\n for (const layer of this.map.getStyle().layers) if (layer.source === id) this.map.removeLayer(layer.id);\n this.map.removeSource(id);\n }\n\n private _line(id: string, geometry: object, token: string, options: MapLineOptions) {\n this._draw(id, {\n draw: () => {\n this.map.addSource(id, { type: 'geojson', data: { type: 'Feature', properties: {}, geometry } });\n this.map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: {\n 'line-color': options.color ?? this._color(`var(--md-comp-map-${token}-color)`),\n 'line-width': options.width,\n 'line-opacity': options.opacity ?? 1,\n ...(options.dashArray && { 'line-dasharray': options.dashArray })\n }\n });\n }\n });\n }\n\n // Sources and layers go with the style, so every overlay is drawn again\n // when a theme change swaps it.\n private _draw(id: string, overlay: Overlay) {\n this.removeOverlay(id);\n this._overlays.set(id, overlay);\n if (this._styleReady) overlay.draw();\n }\n\n private _addMarker(element: HTMLElement, content: HTMLElement | null) {\n const marker = new this.options.maplibregl.Marker({\n element,\n draggable: element.hasAttribute('data-draggable')\n }).setLngLat(lngLat(element)).addTo(this.map);\n marker.on('dragend', () => {\n const { lng, lat } = marker.getLngLat();\n element.dataset.lngLat = `${lng},${lat}`;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n });\n this.markers.push(marker);\n if (!content) return;\n element.setAttribute('aria-expanded', 'false');\n const popup = this._popup(content, 16);\n popup.on('open', () => element.setAttribute('aria-expanded', 'true'));\n popup.on('close', () => {\n element.setAttribute('aria-expanded', 'false');\n if (!document.activeElement || document.activeElement === document.body) element.focus();\n });\n this._markerPopups.set(element, popup);\n }\n\n private _popup(content: HTMLElement, offset: number) {\n const popup = new this.options.maplibregl.Popup({ closeOnClick: false, maxWidth: 'none', offset }).setDOMContent(content);\n this._popups.push(popup);\n return popup;\n }\n\n private _toggle(marker: HTMLElement) {\n const popup = this._markerPopups.get(marker);\n if (popup.isOpen()) popup.remove();\n else popup.setLngLat(this.markers.find((m) => m.getElement() === marker).getLngLat()).addTo(this.map);\n }\n\n private _buttons(action: string) {\n return this.el.querySelectorAll<HTMLButtonElement>(`.map-controls [data-action=\"${action}\"]`);\n }\n\n private _locate(button: HTMLButtonElement) {\n navigator.geolocation?.getCurrentPosition(\n ({ coords }) => {\n if (!this.map) return;\n const center = [coords.longitude, coords.latitude];\n if (!this._location) {\n const dot = document.createElement('span');\n dot.className = 'map-marker location';\n dot.setAttribute('aria-hidden', 'true');\n this._location = new this.options.maplibregl.Marker({ element: dot });\n }\n this._location.setLngLat(center).addTo(this.map);\n this.map.flyTo({ center, zoom: Math.max(this.map.getZoom(), 14) });\n },\n (error) => { if (this.map && error.code === error.PERMISSION_DENIED) button.disabled = true; }\n );\n }\n\n // Resolves a CSS color where the map is, so light-dark() and scoped\n // themes apply, then paints it on a canvas to read back the sRGB value.\n // MapLibre does not parse the oklch() the theme tokens compute to.\n private _color(value: string) {\n const probe = document.createElement('span');\n probe.hidden = true;\n probe.style.color = value;\n this.el.append(probe);\n const context = document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n context.fillStyle = getComputedStyle(probe).color;\n probe.remove();\n context.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n return `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 100) / 100})`;\n }\n\n private _isDark() {\n return this._color('light-dark(black, white)') === 'rgba(255, 255, 255, 1)';\n }\n\n private _themed() {\n const style = this.options.style;\n return typeof style === 'object' && 'light' in style && 'dark' in style;\n }\n\n private _style() {\n return this._themed() ? this.options.style[this._dark ? 'dark' : 'light'] : this.options.style;\n }\n\n private _handleStyleLoad = () => {\n this._styleReady = true;\n for (const overlay of this._overlays.values()) overlay.draw();\n };\n\n private _handleScheme = () => {\n const dark = this._isDark();\n if (dark === this._dark) return;\n this._dark = dark;\n this._styleReady = false;\n this.map.setStyle(this._style(), { diff: false });\n };\n\n private _sync = () => {\n const zoom = this.map.getZoom();\n for (const button of this._zoomIn) button.disabled = zoom >= this.map.getMaxZoom();\n for (const button of this._zoomOut) button.disabled = zoom <= this.map.getMinZoom();\n this.el.style.setProperty('--md-comp-map-bearing', `${-this.map.getBearing()}deg`);\n };\n\n private _handleFullscreen = () => {\n for (const button of this._buttons('fullscreen')) {\n button.setAttribute('aria-pressed', String(document.fullscreenElement === this.el));\n }\n };\n\n private _handleClick = (e: MouseEvent) => {\n const target = e.target as Element;\n const button = target.closest<HTMLButtonElement>('.map-controls [data-action]');\n const action = button?.dataset.action;\n if (action === 'zoom-in') this.map.zoomIn();\n else if (action === 'zoom-out') this.map.zoomOut();\n else if (action === 'compass') this.map.resetNorthPitch();\n else if (action === 'locate') this._locate(button);\n else if (action === 'fullscreen') {\n if (document.fullscreenElement === this.el) document.exitFullscreen();\n else this.el.requestFullscreen();\n } else {\n const marker = target.closest<HTMLElement>('.map-marker');\n if (this._markerPopups.has(marker)) this._toggle(marker);\n }\n };\n\n // A click on the map closes marker popups, but not the one being toggled.\n private _handleMapClick = (e: any) => {\n const target = e.originalEvent.target as Node;\n for (const [marker, popup] of this._markerPopups) {\n if (!marker.contains(target) && !popup.getElement()?.contains(target)) popup.remove();\n }\n };\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n for (const popup of this._popups) {\n if (popup.getElement()?.contains(e.target as Node)) {\n e.preventDefault();\n popup.remove();\n }\n }\n };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAkFA,IAAM,cAAc;AAEpB,IAAM,YAA4B;AAAA,EAChC,YAAY;AAAA,EACZ,OAAO,EAAE,OAAO,GAAG,WAAW,YAAY,MAAM,GAAG,WAAW,OAAO;AAAA,EACrE,QAAQ,CAAC,GAAG,EAAE;AAAA,EACd,MAAM;AAAA,EACN,YAAY,CAAC;AACf;AAIA,IAAM,SAAS,CAAC,OAAoB,GAAG,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAK3E,SAAS,IAAI,CAAC,IAAI,EAAE,GAAW,CAAC,IAAI,EAAE,GAAW,QAAQ,IAAc;AACrE,QAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,QAAM,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM;AACvC,QAAM,MAAM,KAAK,MAAM,KAAK,KAAK,MAAM;AACvC,SAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AACjD,UAAM,IAAI,IAAI,OAAO,IAAI,IAAI;AAC7B,WAAO,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;AAAA,EAC5F,CAAC;AACH;AAiBO,IAAM,UAAN,MAAM,iBAAgB,UAA0B;AAAA,EAkBrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAjB5B;AAAA,eAAW;AAEX;AAAA,mBAAiB,CAAC;AAClB,SAAQ,YAAuB,CAAC;AAChC,SAAQ,UAAiB,CAAC;AAC1B,SAAQ,gBAAgB,oBAAI,IAAsB;AAClD,SAAQ,YAAY,oBAAI,IAAqB;AAC7C,SAAQ,cAAc;AACtB,SAAQ,QAAQ;AAChB,SAAQ,YAAiB;AACzB,SAAQ,SAAgC;AACxC,SAAQ,YAAqC;AAE7C;AAAA,SAAQ,UAA+B,CAAC;AACxC,SAAQ,WAAgC,CAAC;AA0UzC,SAAQ,mBAAmB,MAAM;AAC/B,WAAK,cAAc;AACnB,iBAAW,WAAW,KAAK,UAAU,OAAO,EAAG,SAAQ,KAAK;AAAA,IAC9D;AAEA,SAAQ,gBAAgB,MAAM;AAC5B,YAAM,OAAO,KAAK,QAAQ;AAC1B,UAAI,SAAS,KAAK,MAAO;AACzB,WAAK,QAAQ;AACb,WAAK,cAAc;AACnB,WAAK,IAAI,SAAS,KAAK,OAAO,GAAG,EAAE,MAAM,MAAM,CAAC;AAAA,IAClD;AAEA,SAAQ,QAAQ,MAAM;AACpB,YAAM,OAAO,KAAK,IAAI,QAAQ;AAC9B,iBAAW,UAAU,KAAK,QAAS,QAAO,WAAW,QAAQ,KAAK,IAAI,WAAW;AACjF,iBAAW,UAAU,KAAK,SAAU,QAAO,WAAW,QAAQ,KAAK,IAAI,WAAW;AAClF,WAAK,GAAG,MAAM,YAAY,yBAAyB,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK;AAAA,IACnF;AAEA,SAAQ,oBAAoB,MAAM;AAChC,iBAAW,UAAU,KAAK,SAAS,YAAY,GAAG;AAChD,eAAO,aAAa,gBAAgB,OAAO,SAAS,sBAAsB,KAAK,EAAE,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,SAAQ,eAAe,CAAC,MAAkB;AACxC,YAAM,SAAS,EAAE;AACjB,YAAM,SAAS,OAAO,QAA2B,6BAA6B;AAC9E,YAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAI,WAAW,UAAW,MAAK,IAAI,OAAO;AAAA,eACjC,WAAW,WAAY,MAAK,IAAI,QAAQ;AAAA,eACxC,WAAW,UAAW,MAAK,IAAI,gBAAgB;AAAA,eAC/C,WAAW,SAAU,MAAK,QAAQ,MAAM;AAAA,eACxC,WAAW,cAAc;AAChC,YAAI,SAAS,sBAAsB,KAAK,GAAI,UAAS,eAAe;AAAA,YAC/D,MAAK,GAAG,kBAAkB;AAAA,MACjC,OAAO;AACL,cAAM,SAAS,OAAO,QAAqB,aAAa;AACxD,YAAI,KAAK,cAAc,IAAI,MAAM,EAAG,MAAK,QAAQ,MAAM;AAAA,MACzD;AAAA,IACF;AAGA;AAAA,SAAQ,kBAAkB,CAAC,MAAW;AACpC,YAAM,SAAS,EAAE,cAAc;AAC/B,iBAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,eAAe;AAChD,YAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,MAAM,WAAW,GAAG,SAAS,MAAM,EAAG,OAAM,OAAO;AAAA,MACtF;AAAA,IACF;AAEA,SAAQ,iBAAiB,CAAC,MAAqB;AAC7C,UAAI,EAAE,QAAQ,SAAU;AACxB,iBAAW,SAAS,KAAK,SAAS;AAChC,YAAI,MAAM,WAAW,GAAG,SAAS,EAAE,MAAc,GAAG;AAClD,YAAE,eAAe;AACjB,gBAAM,OAAO;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAjYE,SAAK,GAAG,oBAAoB,IAAI;AAChC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG;AAAA,IACL;AACA,UAAM,MAAM,KAAK,QAAQ;AACzB,QAAI,CAAC,KAAK;AACR,cAAQ,MAAM,6DAA6D;AAC3E;AAAA,IACF;AAEA,SAAK,YAAY,CAAC,GAAG,GAAG,QAAQ;AAChC,SAAK,UAAU,CAAC,GAAG,KAAK,SAAS,SAAS,CAAC;AAC3C,SAAK,WAAW,CAAC,GAAG,KAAK,SAAS,UAAU,CAAC;AAC7C,SAAK,QAAQ,KAAK,QAAQ;AAC1B,SAAK,MAAM,IAAI,IAAI,IAAI;AAAA,MACrB,GAAG,KAAK,QAAQ;AAAA,MAChB,WAAW;AAAA,MACX,OAAO,KAAK,OAAO;AAAA,MACnB,QAAQ,KAAK,QAAQ;AAAA,MACrB,MAAM,KAAK,QAAQ;AAAA,IACrB,CAAC;AACD,SAAK,IAAI,GAAG,cAAc,KAAK,gBAAgB;AAC/C,SAAK,IAAI,GAAG,QAAQ,KAAK,KAAK;AAC9B,SAAK,IAAI,GAAG,SAAS,KAAK,eAAe;AAEzC,UAAM,WAAW,KAAK,UAAU,OAAO,CAAC,UAAgC,iBAAiB,WAAW;AACpG,UAAM,UAAU,oBAAI,IAAa;AACjC,eAAW,UAAU,SAAS,OAAO,CAAC,UAAU,MAAM,QAAQ,2BAA2B,CAAC,GAAG;AAC3F,YAAM,SAAS,OAAO,aAAa,eAAe,IAAI,MAAM,eAAe,QAAQ,OAAO,aAAa,eAAe,CAAC,IAAI;AAC3H,YAAM,QAAQ,QAAQ,kBAAkB,MAAM,OAAO,QAAQ,YAAY,IAAI,SAAS;AACtF,UAAI,MAAO,SAAQ,IAAI,KAAK;AAC5B,WAAK,WAAW,QAAQ,KAAK;AAAA,IAC/B;AACA,eAAW,SAAS,SAAS,OAAO,CAAC,UAAU,MAAM,QAAQ,0BAA0B,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,GAAG;AAChH,WAAK,OAAO,OAAO,CAAC,EAAE,UAAU,OAAO,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG;AAAA,IAC/D;AAEA,QAAI,KAAK,QAAQ,GAAG;AAClB,WAAK,SAAS,WAAW,8BAA8B;AACvD,WAAK,OAAO,iBAAiB,UAAU,KAAK,aAAa;AACzD,WAAK,YAAY,IAAI,iBAAiB,KAAK,aAAa;AACxD,WAAK,UAAU,QAAQ,SAAS,iBAAiB,EAAE,YAAY,MAAM,iBAAiB,CAAC,OAAO,GAAG,SAAS,KAAK,CAAC;AAAA,IAClH;AACA,eAAW,UAAU,KAAK,SAAS,YAAY,EAAG,QAAO,SAAS,CAAC,SAAS;AAC5E,aAAS,iBAAiB,oBAAoB,KAAK,iBAAiB;AACpE,OAAG,iBAAiB,SAAS,KAAK,YAAY;AAC9C,OAAG,iBAAiB,WAAW,KAAK,cAAc;AAClD,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,SAAK,GAAG,oBAAoB,IAAI;AAChC,QAAI,CAAC,KAAK,IAAK;AACf,SAAK,GAAG,oBAAoB,SAAS,KAAK,YAAY;AACtD,SAAK,GAAG,oBAAoB,WAAW,KAAK,cAAc;AAC1D,aAAS,oBAAoB,oBAAoB,KAAK,iBAAiB;AACvE,SAAK,QAAQ,oBAAoB,UAAU,KAAK,aAAa;AAC7D,SAAK,WAAW,WAAW;AAC3B,eAAW,WAAW,KAAK,UAAU,OAAO,EAAG,SAAQ,MAAM;AAC7D,eAAW,SAAS,KAAK,QAAS,OAAM,OAAO;AAC/C,eAAW,UAAU,KAAK,SAAS;AACjC,aAAO,OAAO;AACd,YAAM,UAAuB,OAAO,WAAW;AAC/C,cAAQ,UAAU,OAAO,GAAG,CAAC,GAAG,QAAQ,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,aAAa,CAAC,CAAC;AACnG,cAAQ,MAAM,eAAe,WAAW;AACxC,cAAQ,MAAM,eAAe,SAAS;AACtC,UAAI,QAAQ,aAAa,eAAe,EAAG,SAAQ,gBAAgB,eAAe;AAAA,IACpF;AACA,SAAK,WAAW,OAAO;AACvB,SAAK,YAAY;AACjB,SAAK,IAAI,OAAO;AAChB,SAAK,MAAM;AACX,SAAK,UAAU,CAAC;AAChB,SAAK,UAAU,CAAC;AAChB,SAAK,cAAc,MAAM;AACzB,SAAK,UAAU,MAAM;AACrB,SAAK,GAAG,MAAM,eAAe,uBAAuB;AACpD,eAAW,UAAU,KAAK,GAAG,iBAAoC,6BAA6B,GAAG;AAC/F,aAAO,WAAW;AAClB,aAAO,SAAS;AAChB,aAAO,gBAAgB,cAAc;AAAA,IACvC;AACA,SAAK,GAAG,OAAO,GAAG,KAAK,SAAS;AAAA,EAClC;AAAA;AAAA,EAGA,SAAS,IAAY,aAAuB,UAA0B,CAAC,GAAG;AACxE,SAAK,MAAM,IAAI,EAAE,MAAM,cAAc,YAAY,GAAG,SAAS,EAAE,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EACvF;AAAA;AAAA,EAGA,QAAQ,IAAY,MAAgB,UAA0B,CAAC,GAAG;AAChE,SAAK,MAAM,IAAI,EAAE,MAAM,mBAAmB,aAAa,KAAK,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EACrI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAY,MAAuB,UAA6B,CAAC,GAAG;AAC9E,UAAM,WAAW,GAAG,EAAE,aAAa,SAAS,GAAG,EAAE;AACjD,UAAM,SAAS,OAAO,MAAW;AAC/B,YAAM,CAAC,OAAO,IAAI,EAAE;AACpB,YAAM,OAAO,MAAM,KAAK,IAAI,UAAU,EAAE,EAAE,wBAAwB,QAAQ,WAAW,UAAU;AAC/F,WAAK,IAAI,OAAO,EAAE,QAAQ,QAAQ,SAAS,aAAa,KAAK,CAAC;AAAA,IAChE;AACA,UAAM,UAAU,MAAM;AAAE,WAAK,IAAI,UAAU,EAAE,MAAM,SAAS;AAAA,IAAW;AACvE,UAAM,QAAQ,MAAM;AAAE,WAAK,IAAI,UAAU,EAAE,MAAM,SAAS;AAAA,IAAI;AAC9D,SAAK,MAAM,IAAI;AAAA,MACb,MAAM,MAAM;AACV,cAAM,QAAQ,QAAQ,SAAS,KAAK,OAAO,kCAAkC;AAC7E,cAAM,UAAU,KAAK,OAAO,sCAAsC;AAClE,aAAK,IAAI,UAAU,IAAI;AAAA,UACrB,MAAM;AAAA,UACN;AAAA,UACA,SAAS;AAAA,UACT,eAAe,QAAQ,UAAU;AAAA,UACjC,gBAAgB,QAAQ,WAAW;AAAA,QACrC,CAAC;AACD,aAAK,IAAI,SAAS;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,CAAC,OAAO,aAAa;AAAA,UAC7B,OAAO;AAAA,YACL,gBAAgB;AAAA,YAChB,iBAAiB,CAAC,QAAQ,CAAC,OAAO,aAAa,GAAG,IAAI,IAAI,IAAI,KAAK,EAAE;AAAA,YACrE,uBAAuB;AAAA,YACvB,uBAAuB;AAAA,YACvB,yBAAyB;AAAA,UAC3B;AAAA,QACF,CAAC;AAED,cAAM,QAAQ,KAAK,IAAI,SAAS;AAChC,cAAM,OAAO,MAAM,UAAU,MAAM,OAAO,KAAK,CAAC,UAAe,MAAM,SAAS,WAAW,CAAC,GAAG,OAAO,WAAW;AAC/G,YAAI,MAAM;AACR,eAAK,IAAI,SAAS;AAAA,YAChB,IAAI,GAAG,EAAE;AAAA,YACT,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,QAAQ,CAAC,OAAO,aAAa;AAAA,YAC7B,QAAQ,EAAE,cAAc,CAAC,OAAO,yBAAyB,GAAG,aAAa,MAAM,aAAa,GAAG;AAAA,YAC/F,OAAO,EAAE,cAAc,KAAK,OAAO,wCAAwC,EAAE;AAAA,UAC/E,CAAC;AAAA,QACH;AACA,aAAK,IAAI,SAAS;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC;AAAA,UACpC,OAAO,EAAE,gBAAgB,OAAO,iBAAiB,GAAG,uBAAuB,GAAG,uBAAuB,QAAQ;AAAA,QAC/G,CAAC;AAAA,MACH;AAAA,MACA,KAAK,MAAM;AACT,aAAK,IAAI,IAAI,SAAS,UAAU,MAAM;AACtC,mBAAW,SAAS,CAAC,UAAU,MAAM,GAAG;AACtC,eAAK,IAAI,IAAI,cAAc,OAAO,OAAO;AACzC,eAAK,IAAI,IAAI,cAAc,OAAO,KAAK;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AACD,SAAK,IAAI,GAAG,SAAS,UAAU,MAAM;AACrC,eAAW,SAAS,CAAC,UAAU,MAAM,GAAG;AACtC,WAAK,IAAI,GAAG,cAAc,OAAO,OAAO;AACxC,WAAK,IAAI,GAAG,cAAc,OAAO,KAAK;AAAA,IACxC;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,IAAY;AACxB,UAAM,UAAU,KAAK,UAAU,IAAI,EAAE;AACrC,QAAI,CAAC,QAAS;AACd,SAAK,UAAU,OAAO,EAAE;AACxB,YAAQ,MAAM;AACd,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,IAAI,UAAU,EAAE,EAAG;AAClD,eAAW,SAAS,KAAK,IAAI,SAAS,EAAE,OAAQ,KAAI,MAAM,WAAW,GAAI,MAAK,IAAI,YAAY,MAAM,EAAE;AACtG,SAAK,IAAI,aAAa,EAAE;AAAA,EAC1B;AAAA,EAEQ,MAAM,IAAY,UAAkB,OAAe,SAAyB;AAClF,SAAK,MAAM,IAAI;AAAA,MACb,MAAM,MAAM;AACV,aAAK,IAAI,UAAU,IAAI,EAAE,MAAM,WAAW,MAAM,EAAE,MAAM,WAAW,YAAY,CAAC,GAAG,SAAS,EAAE,CAAC;AAC/F,aAAK,IAAI,SAAS;AAAA,UAChB;AAAA,UACA,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,EAAE,YAAY,SAAS,aAAa,QAAQ;AAAA,UACpD,OAAO;AAAA,YACL,cAAc,QAAQ,SAAS,KAAK,OAAO,qBAAqB,KAAK,SAAS;AAAA,YAC9E,cAAc,QAAQ;AAAA,YACtB,gBAAgB,QAAQ,WAAW;AAAA,YACnC,GAAI,QAAQ,aAAa,EAAE,kBAAkB,QAAQ,UAAU;AAAA,UACjE;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA,EAIQ,MAAM,IAAY,SAAkB;AAC1C,SAAK,cAAc,EAAE;AACrB,SAAK,UAAU,IAAI,IAAI,OAAO;AAC9B,QAAI,KAAK,YAAa,SAAQ,KAAK;AAAA,EACrC;AAAA,EAEQ,WAAW,SAAsB,SAA6B;AACpE,UAAM,SAAS,IAAI,KAAK,QAAQ,WAAW,OAAO;AAAA,MAChD;AAAA,MACA,WAAW,QAAQ,aAAa,gBAAgB;AAAA,IAClD,CAAC,EAAE,UAAU,OAAO,OAAO,CAAC,EAAE,MAAM,KAAK,GAAG;AAC5C,WAAO,GAAG,WAAW,MAAM;AACzB,YAAM,EAAE,KAAK,IAAI,IAAI,OAAO,UAAU;AACtC,cAAQ,QAAQ,SAAS,GAAG,GAAG,IAAI,GAAG;AACtC,cAAQ,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAAA,IAC9D,CAAC;AACD,SAAK,QAAQ,KAAK,MAAM;AACxB,QAAI,CAAC,QAAS;AACd,YAAQ,aAAa,iBAAiB,OAAO;AAC7C,UAAM,QAAQ,KAAK,OAAO,SAAS,EAAE;AACrC,UAAM,GAAG,QAAQ,MAAM,QAAQ,aAAa,iBAAiB,MAAM,CAAC;AACpE,UAAM,GAAG,SAAS,MAAM;AACtB,cAAQ,aAAa,iBAAiB,OAAO;AAC7C,UAAI,CAAC,SAAS,iBAAiB,SAAS,kBAAkB,SAAS,KAAM,SAAQ,MAAM;AAAA,IACzF,CAAC;AACD,SAAK,cAAc,IAAI,SAAS,KAAK;AAAA,EACvC;AAAA,EAEQ,OAAO,SAAsB,QAAgB;AACnD,UAAM,QAAQ,IAAI,KAAK,QAAQ,WAAW,MAAM,EAAE,cAAc,OAAO,UAAU,QAAQ,OAAO,CAAC,EAAE,cAAc,OAAO;AACxH,SAAK,QAAQ,KAAK,KAAK;AACvB,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,QAAqB;AACnC,UAAM,QAAQ,KAAK,cAAc,IAAI,MAAM;AAC3C,QAAI,MAAM,OAAO,EAAG,OAAM,OAAO;AAAA,QAC5B,OAAM,UAAU,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,MAAM,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,GAAG;AAAA,EACtG;AAAA,EAEQ,SAAS,QAAgB;AAC/B,WAAO,KAAK,GAAG,iBAAoC,+BAA+B,MAAM,IAAI;AAAA,EAC9F;AAAA,EAEQ,QAAQ,QAA2B;AACzC,cAAU,aAAa;AAAA,MACrB,CAAC,EAAE,OAAO,MAAM;AACd,YAAI,CAAC,KAAK,IAAK;AACf,cAAM,SAAS,CAAC,OAAO,WAAW,OAAO,QAAQ;AACjD,YAAI,CAAC,KAAK,WAAW;AACnB,gBAAM,MAAM,SAAS,cAAc,MAAM;AACzC,cAAI,YAAY;AAChB,cAAI,aAAa,eAAe,MAAM;AACtC,eAAK,YAAY,IAAI,KAAK,QAAQ,WAAW,OAAO,EAAE,SAAS,IAAI,CAAC;AAAA,QACtE;AACA,aAAK,UAAU,UAAU,MAAM,EAAE,MAAM,KAAK,GAAG;AAC/C,aAAK,IAAI,MAAM,EAAE,QAAQ,MAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;AAAA,MACnE;AAAA,MACA,CAAC,UAAU;AAAE,YAAI,KAAK,OAAO,MAAM,SAAS,MAAM,kBAAmB,QAAO,WAAW;AAAA,MAAM;AAAA,IAC/F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,OAAe;AAC5B,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,SAAS;AACf,UAAM,MAAM,QAAQ;AACpB,SAAK,GAAG,OAAO,KAAK;AACpB,UAAM,UAAU,SAAS,cAAc,QAAQ,EAAE,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AAC9F,YAAQ,YAAY,iBAAiB,KAAK,EAAE;AAC5C,UAAM,OAAO;AACb,YAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAC3B,UAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,QAAQ,aAAa,GAAG,GAAG,GAAG,CAAC,EAAE;AACtD,WAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,MAAO,IAAI,MAAO,GAAG,IAAI,GAAG;AAAA,EACpE;AAAA,EAEQ,UAAU;AAChB,WAAO,KAAK,OAAO,0BAA0B,MAAM;AAAA,EACrD;AAAA,EAEQ,UAAU;AAChB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,WAAO,OAAO,UAAU,YAAY,WAAW,SAAS,UAAU;AAAA,EACpE;AAAA,EAEQ,SAAS;AACf,WAAO,KAAK,QAAQ,IAAI,KAAK,QAAQ,MAAM,KAAK,QAAQ,SAAS,OAAO,IAAI,KAAK,QAAQ;AAAA,EAC3F;AA8DF;",
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\n/** `[longitude, latitude]`, MapLibre's order. */\nexport type LngLat = [number, number];\n\n/**\n * The parts of the `maplibre-gl` module this component uses. Declared here so\n * the published types do not depend on MapLibre.\n */\nexport interface MapLibre {\n Map: new (options: object) => any;\n Marker: new (options: object) => any;\n Popup: new (options: object) => any;\n}\n\n/** A style for each color scheme. The map follows the page's theme. */\nexport interface MapThemedStyle {\n light: string | object;\n dark: string | object;\n}\n\nexport interface MapViewOptions extends BaseOptions {\n /**\n * The `maplibre-gl` module. ExpressiveCSS does not bundle MapLibre, so the\n * page imports it and passes it in.\n * @default null\n */\n maplibregl: MapLibre | null;\n /**\n * A MapLibre style URL or object, or `{ light, dark }` to follow the theme.\n * @default OpenFreeMap Positron and Dark\n */\n style: string | object | MapThemedStyle;\n /**\n * Starting `[longitude, latitude]`.\n * @default [0, 20]\n */\n center: LngLat;\n /**\n * Starting zoom level.\n * @default 1\n */\n zoom: number;\n /**\n * More MapLibre `Map` options, such as `maxZoom` or `bearing`.\n * @default {}\n */\n mapOptions: object;\n}\n\nexport interface MapLineOptions {\n /** CSS color. Defaults to the route or arc color token. */\n color?: string;\n /** Width in pixels. Routes default to 4, arcs to 2. */\n width?: number;\n /** 0 to 1. */\n opacity?: number;\n /** Dash and gap lengths in line widths, such as `[2, 2]`. */\n dashArray?: number[];\n}\n\nexport interface MapArc {\n from: LngLat;\n to: LngLat;\n}\n\nexport interface MapClusterOptions {\n /** CSS color. Defaults to the cluster color token. */\n color?: string;\n /**\n * Pixels within which points join a cluster.\n * @default 50\n */\n radius?: number;\n /**\n * Last zoom level that clusters points.\n * @default 14\n */\n maxZoom?: number;\n}\n\nconst OPENFREEMAP = 'https://tiles.openfreemap.org/styles/';\n\nconst _defaults: MapViewOptions = {\n maplibregl: null,\n style: { light: `${OPENFREEMAP}positron`, dark: `${OPENFREEMAP}dark` },\n center: [0, 20],\n zoom: 1,\n mapOptions: {}\n};\n\ntype Overlay = { draw: () => void; off?: () => void };\n\nconst lngLat = (el: HTMLElement) => el.dataset.lngLat.split(',').map(Number) as LngLat;\n\n// A quadratic B\u00E9zier from `from` to `to`, bowed north of an eastward line.\n// ponytail: drawn in degrees, so an arc across the antimeridian goes the long\n// way round; split it at \u00B1180 if that matters.\nfunction arc([x0, y0]: LngLat, [x2, y2]: LngLat, steps = 32): LngLat[] {\n const bow = x2 >= x0 ? 0.25 : -0.25;\n const x1 = (x0 + x2) / 2 - (y2 - y0) * bow;\n const y1 = (y0 + y2) / 2 + (x2 - x0) * bow;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps, u = 1 - t;\n return [u * u * x0 + 2 * u * t * x1 + t * t * x2, u * u * y0 + 2 * u * t * y1 + t * t * y2];\n });\n}\n\n/**\n * An interactive map built on MapLibre: a `.map` holding `.map-marker`,\n * `.map-popup` and `.map-controls` children.\n *\n * Each marker sits at its `data-lng-lat`. A marker button with\n * `aria-controls` opens the `.map-popup` it names; a popup with its own\n * `data-lng-lat` and no marker opens at init. Buttons in `.map-controls`\n * run their `data-action`: `zoom-in`, `zoom-out`, `compass`, `locate` or\n * `fullscreen`. Routes, arcs and clusters are data, so they are added from\n * script. The default style follows the page's light or dark theme, and\n * line and cluster colors come from the theme.\n *\n * The class is `MapView` rather than `Map` so importing it does not shadow\n * JavaScript's `Map`.\n */\nexport class MapView extends Component<MapViewOptions> {\n /** The MapLibre map. */\n map: any = null;\n /** The MapLibre markers made from `.map-marker` children, in order. */\n markers: any[] = [];\n private _children: Element[] = [];\n private _popups: any[] = [];\n private _markerPopups = new Map<HTMLElement, any>();\n private _overlays = new Map<string, Overlay>();\n private _styleReady = false;\n private _dark = false;\n private _location: any = null;\n private _media: MediaQueryList | null = null;\n private _observer: MutationObserver | null = null;\n // Looked up once: `move` fires every frame of a pan or zoom.\n private _zoomIn: HTMLButtonElement[] = [];\n private _zoomOut: HTMLButtonElement[] = [];\n\n constructor(el: HTMLElement, options: Partial<MapViewOptions>) {\n super(el, options, MapView);\n this.el['Expressive_MapView'] = this;\n this.options = {\n ...MapView.defaults,\n ...options\n };\n const lib = this.options.maplibregl;\n if (!lib) {\n console.error('MapView needs the maplibre-gl module in options.maplibregl.');\n return;\n }\n\n this._children = [...el.children];\n this._zoomIn = [...this._buttons('zoom-in')];\n this._zoomOut = [...this._buttons('zoom-out')];\n this._dark = this._isDark();\n this.map = new lib.Map({\n ...this.options.mapOptions,\n container: el,\n style: this._style(),\n center: this.options.center,\n zoom: this.options.zoom\n });\n this.map.on('style.load', this._handleStyleLoad);\n this.map.on('move', this._sync);\n this.map.on('click', this._handleMapClick);\n\n const children = this._children.filter((child): child is HTMLElement => child instanceof HTMLElement);\n const claimed = new Set<Element>();\n for (const marker of children.filter((child) => child.matches('.map-marker[data-lng-lat]'))) {\n const target = marker.hasAttribute('aria-controls') ? Utils.getElementById(marker, marker.getAttribute('aria-controls')) : null;\n const popup = target?.parentElement === el && target.matches('.map-popup') ? target : null;\n if (popup) claimed.add(popup);\n this._addMarker(marker, popup);\n }\n for (const popup of children.filter((child) => child.matches('.map-popup[data-lng-lat]') && !claimed.has(child))) {\n this._popup(popup, 0).setLngLat(lngLat(popup)).addTo(this.map);\n }\n\n if (this._themed()) {\n this._media = matchMedia('(prefers-color-scheme: dark)');\n this._media.addEventListener('change', this._handleScheme);\n this._observer = new MutationObserver(this._handleScheme);\n this._observer.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n }\n for (const button of this._buttons('fullscreen')) button.hidden = !document.fullscreenEnabled;\n document.addEventListener('fullscreenchange', this._handleFullscreen);\n el.addEventListener('click', this._handleClick);\n el.addEventListener('keydown', this._handleKeydown);\n this._sync();\n }\n\n static get defaults(): MapViewOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of MapView.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MapViewOptions>): MapView;\n /**\n * Initializes instances of MapView.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MapViewOptions>): MapView[];\n /**\n * Initializes instances of MapView.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MapViewOptions> = {}\n ): MapView | MapView[] {\n return super.init(els, options, MapView);\n }\n\n static getInstance(el: HTMLElement): MapView {\n return el['Expressive_MapView'];\n }\n\n destroy() {\n this.el['Expressive_MapView'] = undefined;\n if (!this.map) return;\n this.el.removeEventListener('click', this._handleClick);\n this.el.removeEventListener('keydown', this._handleKeydown);\n document.removeEventListener('fullscreenchange', this._handleFullscreen);\n this._media?.removeEventListener('change', this._handleScheme);\n this._observer?.disconnect();\n for (const overlay of this._overlays.values()) overlay.off?.();\n for (const popup of this._popups) popup.remove();\n for (const marker of this.markers) {\n marker.remove();\n const element: HTMLElement = marker.getElement();\n element.classList.remove(...[...element.classList].filter((name) => name.startsWith('maplibregl-')));\n element.style.removeProperty('transform');\n element.style.removeProperty('opacity');\n if (element.hasAttribute('aria-controls')) element.removeAttribute('aria-expanded');\n }\n this._location?.remove();\n this._location = null;\n this.map.remove();\n this.map = null;\n this.markers = [];\n this._popups = [];\n this._markerPopups.clear();\n this._overlays.clear();\n this.el.style.removeProperty('--md-comp-map-bearing');\n for (const button of this.el.querySelectorAll<HTMLButtonElement>('.map-controls [data-action]')) {\n button.disabled = false;\n button.hidden = false;\n button.removeAttribute('aria-pressed');\n }\n this.el.append(...this._children);\n }\n\n /** Draws a line through `[longitude, latitude]` points. Replaces an overlay with the same id. */\n addRoute(id: string, coordinates: LngLat[], options: MapLineOptions = {}) {\n this._line(id, { type: 'LineString', coordinates }, 'route', { width: 4, ...options });\n }\n\n /** Draws a curved line for each `{ from, to }`. Replaces an overlay with the same id. */\n addArcs(id: string, arcs: MapArc[], options: MapLineOptions = {}) {\n this._line(id, { type: 'MultiLineString', coordinates: arcs.map(({ from, to }) => arc(from, to)) }, 'arc', { width: 2, ...options });\n }\n\n /**\n * Draws GeoJSON points, or the URL of a GeoJSON file, as clusters that\n * show their count and zoom in when clicked. The layers are\n * `${id}-clusters`, `${id}-count` and `${id}-points`.\n */\n addClusters(id: string, data: object | string, options: MapClusterOptions = {}) {\n const clusters = `${id}-clusters`, points = `${id}-points`;\n const zoomIn = async (e: any) => {\n const [feature] = e.features;\n const zoom = await this.map.getSource(id).getClusterExpansionZoom(feature.properties.cluster_id);\n this.map.easeTo({ center: feature.geometry.coordinates, zoom });\n };\n const pointer = () => { this.map.getCanvas().style.cursor = 'pointer'; };\n const reset = () => { this.map.getCanvas().style.cursor = ''; };\n const listen = (method: 'on' | 'off') => {\n this.map[method]('click', clusters, zoomIn);\n for (const layer of [clusters, points]) {\n this.map[method]('mouseenter', layer, pointer);\n this.map[method]('mouseleave', layer, reset);\n }\n };\n this._draw(id, {\n draw: () => {\n const color = options.color ?? this._color('var(--md-comp-map-cluster-color)');\n const surface = this._color('var(--md-comp-map-marker-ring-color)');\n this.map.addSource(id, {\n type: 'geojson',\n data,\n cluster: true,\n clusterRadius: options.radius ?? 50,\n clusterMaxZoom: options.maxZoom ?? 14\n });\n this.map.addLayer({\n id: clusters,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': color,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 10, 20, 100, 26],\n 'circle-stroke-width': 6,\n 'circle-stroke-color': color,\n 'circle-stroke-opacity': 0.3\n }\n });\n // A symbol layer needs the style's glyphs and one of its fonts.\n const style = this.map.getStyle();\n const font = style.glyphs && style.layers.find((layer: any) => layer.layout?.['text-font'])?.layout['text-font'];\n if (font) {\n this.map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-font': font, 'text-size': 12 },\n paint: { 'text-color': this._color('var(--md-comp-map-cluster-label-color)') }\n });\n }\n this.map.addLayer({\n id: points,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: { 'circle-color': color, 'circle-radius': 6, 'circle-stroke-width': 2, 'circle-stroke-color': surface }\n });\n },\n off: () => listen('off')\n });\n listen('on');\n }\n\n /** Removes a route, arcs or clusters added with this id. */\n removeOverlay(id: string) {\n const overlay = this._overlays.get(id);\n if (!overlay) return;\n this._overlays.delete(id);\n overlay.off?.();\n if (!this._styleReady || !this.map.getSource(id)) return;\n for (const layer of this.map.getStyle().layers) if (layer.source === id) this.map.removeLayer(layer.id);\n this.map.removeSource(id);\n }\n\n private _line(id: string, geometry: object, token: string, options: MapLineOptions) {\n this._draw(id, {\n draw: () => {\n this.map.addSource(id, { type: 'geojson', data: { type: 'Feature', properties: {}, geometry } });\n this.map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: {\n 'line-color': options.color ?? this._color(`var(--md-comp-map-${token}-color)`),\n 'line-width': options.width,\n 'line-opacity': options.opacity ?? 1,\n ...(options.dashArray && { 'line-dasharray': options.dashArray })\n }\n });\n }\n });\n }\n\n // Sources and layers go with the style, so every overlay is drawn again\n // when a theme change swaps it.\n private _draw(id: string, overlay: Overlay) {\n this.removeOverlay(id);\n this._overlays.set(id, overlay);\n if (this._styleReady) overlay.draw();\n }\n\n private _addMarker(element: HTMLElement, content: HTMLElement | null) {\n const marker = new this.options.maplibregl.Marker({\n element,\n draggable: element.hasAttribute('data-draggable')\n }).setLngLat(lngLat(element)).addTo(this.map);\n marker.on('dragend', () => {\n const { lng, lat } = marker.getLngLat();\n element.dataset.lngLat = `${lng},${lat}`;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n });\n this.markers.push(marker);\n if (!content) return;\n element.setAttribute('aria-expanded', 'false');\n const popup = this._popup(content, 16);\n popup.on('open', () => element.setAttribute('aria-expanded', 'true'));\n popup.on('close', () => {\n element.setAttribute('aria-expanded', 'false');\n if (!document.activeElement || document.activeElement === document.body) element.focus();\n });\n this._markerPopups.set(element, popup);\n }\n\n private _popup(content: HTMLElement, offset: number) {\n const popup = new this.options.maplibregl.Popup({ closeOnClick: false, maxWidth: 'none', offset }).setDOMContent(content);\n this._popups.push(popup);\n return popup;\n }\n\n private _toggle(marker: HTMLElement) {\n const popup = this._markerPopups.get(marker);\n if (popup.isOpen()) popup.remove();\n else popup.setLngLat(this.markers.find((m) => m.getElement() === marker).getLngLat()).addTo(this.map);\n }\n\n private _buttons(action: string) {\n return this.el.querySelectorAll<HTMLButtonElement>(`.map-controls [data-action=\"${action}\"]`);\n }\n\n private _locate(button: HTMLButtonElement) {\n navigator.geolocation?.getCurrentPosition(\n ({ coords }) => {\n if (!this.map) return;\n const center = [coords.longitude, coords.latitude];\n if (!this._location) {\n const dot = document.createElement('span');\n dot.className = 'map-marker location';\n dot.setAttribute('aria-hidden', 'true');\n this._location = new this.options.maplibregl.Marker({ element: dot });\n }\n this._location.setLngLat(center).addTo(this.map);\n this.map.flyTo({ center, zoom: Math.max(this.map.getZoom(), 14) });\n },\n (error) => { if (this.map && error.code === error.PERMISSION_DENIED) button.disabled = true; }\n );\n }\n\n // Resolves a CSS color where the map is, so light-dark() and scoped\n // themes apply, then paints it on a canvas to read back the sRGB value.\n // MapLibre does not parse the oklch() the theme tokens compute to.\n private _color(value: string) {\n const probe = document.createElement('span');\n probe.hidden = true;\n probe.style.color = value;\n this.el.append(probe);\n const context = document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n context.fillStyle = getComputedStyle(probe).color;\n probe.remove();\n context.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n return `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 100) / 100})`;\n }\n\n private _isDark() {\n return this._color('light-dark(black, white)') === 'rgba(255, 255, 255, 1)';\n }\n\n private _themed() {\n const style = this.options.style;\n return typeof style === 'object' && 'light' in style && 'dark' in style;\n }\n\n private _style() {\n return this._themed() ? this.options.style[this._dark ? 'dark' : 'light'] : this.options.style;\n }\n\n private _handleStyleLoad = () => {\n this._styleReady = true;\n for (const overlay of this._overlays.values()) overlay.draw();\n };\n\n private _handleScheme = () => {\n const dark = this._isDark();\n if (dark === this._dark) return;\n this._dark = dark;\n this._styleReady = false;\n this.map.setStyle(this._style(), { diff: false });\n };\n\n private _sync = () => {\n const zoom = this.map.getZoom();\n for (const button of this._zoomIn) button.disabled = zoom >= this.map.getMaxZoom();\n for (const button of this._zoomOut) button.disabled = zoom <= this.map.getMinZoom();\n this.el.style.setProperty('--md-comp-map-bearing', `${-this.map.getBearing()}deg`);\n };\n\n private _handleFullscreen = () => {\n for (const button of this._buttons('fullscreen')) {\n button.setAttribute('aria-pressed', String(document.fullscreenElement === this.el));\n }\n };\n\n private _handleClick = (e: MouseEvent) => {\n const target = e.target as Element;\n const button = target.closest<HTMLButtonElement>('.map-controls [data-action]');\n const action = button?.dataset.action;\n if (action === 'zoom-in') this.map.zoomIn();\n else if (action === 'zoom-out') this.map.zoomOut();\n else if (action === 'compass') this.map.resetNorthPitch();\n else if (action === 'locate') this._locate(button);\n else if (action === 'fullscreen') {\n if (document.fullscreenElement === this.el) document.exitFullscreen();\n else this.el.requestFullscreen();\n } else {\n const marker = target.closest<HTMLElement>('.map-marker');\n if (this._markerPopups.has(marker)) this._toggle(marker);\n }\n };\n\n // A click on the map closes marker popups, but not the one being toggled.\n private _handleMapClick = (e: any) => {\n const target = e.originalEvent.target as Node;\n for (const [marker, popup] of this._markerPopups) {\n if (!marker.contains(target) && !popup.getElement()?.contains(target)) popup.remove();\n }\n };\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n for (const popup of this._popups) {\n if (popup.getElement()?.contains(e.target as Node)) {\n e.preventDefault();\n popup.remove();\n }\n }\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ts/modular.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.
|
|
4
|
+
"sourcesContent": ["export * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.15.0';\n\nexport type * from './components/autocomplete';\nexport type * from './components/appBar';\nexport type * from './components/buttons';\nexport type * from './components/buttonGroup';\nexport type * from './components/cards';\nexport type * from './components/expandingCard';\nexport type * from './components/carousel';\nexport type * from './components/characterCounter';\nexport type * from './components/chips';\nexport type * from './components/lineChart';\nexport type * from './components/columnChart';\nexport type * from './components/barChart';\nexport type * from './components/pieChart';\nexport type * from './components/heatmapChart';\nexport type * from './components/radarChart';\nexport type * from './components/radialChart';\nexport type * from './components/mixedChart';\nexport type * from './components/questionnaire';\nexport type * from './components/datepicker';\nexport type * from './components/menu';\nexport type * from './components/lightbox';\nexport type * from './components/slider';\nexport type * from './components/scrollspy';\nexport type * from './components/select';\nexport type * from './components/navigationRail';\nexport type * from './components/tabs';\nexport type * from './components/timepicker';\nexport type * from './components/snackbar';\nexport type * from './components/tooltip';\n"],
|
|
5
5
|
"mappings": ";AAQO,IAAM,UAAU;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Component
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PD6HYHAE.mjs";
|
|
4
4
|
|
|
5
5
|
// src/ts/components/confetti.ts
|
|
6
6
|
var _defaults = {
|
|
@@ -211,4 +211,4 @@ function themeColors(themed) {
|
|
|
211
211
|
export {
|
|
212
212
|
Confetti
|
|
213
213
|
};
|
|
214
|
-
//# sourceMappingURL=chunk-
|
|
214
|
+
//# sourceMappingURL=chunk-KUFHW3DS.mjs.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M372EDXD.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PD6HYHAE.mjs";
|
|
7
7
|
|
|
8
8
|
// src/ts/components/carousel.ts
|
|
9
9
|
var _defaults = {
|
|
@@ -22,6 +22,7 @@ var _defaults = {
|
|
|
22
22
|
slide: "Slide"
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
|
+
var naturallyFocusable = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
25
26
|
var _Carousel = class _Carousel extends Component {
|
|
26
27
|
constructor(el, options) {
|
|
27
28
|
super(el, options, _Carousel);
|
|
@@ -323,7 +324,6 @@ var _Carousel = class _Carousel extends Component {
|
|
|
323
324
|
this.el.setAttribute("aria-roledescription", "carousel");
|
|
324
325
|
this._generatedContainerDescription = true;
|
|
325
326
|
}
|
|
326
|
-
const naturallyFocusable = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
327
327
|
this.images.forEach((item, index) => {
|
|
328
328
|
if (!item.hasAttribute("aria-roledescription")) {
|
|
329
329
|
item.setAttribute("aria-roledescription", "slide");
|
|
@@ -356,10 +356,6 @@ var _Carousel = class _Carousel extends Component {
|
|
|
356
356
|
const button = document.createElement("button");
|
|
357
357
|
button.type = "button";
|
|
358
358
|
button.classList.add("indicator-item");
|
|
359
|
-
if (i === 0) {
|
|
360
|
-
button.classList.add("active");
|
|
361
|
-
button.setAttribute("aria-current", "true");
|
|
362
|
-
}
|
|
363
359
|
button.setAttribute("aria-label", `${this.options.i18n.slide} ${i + 1}`);
|
|
364
360
|
this._indicators.appendChild(button);
|
|
365
361
|
});
|
|
@@ -557,11 +553,7 @@ var _Carousel = class _Carousel extends Component {
|
|
|
557
553
|
_focusItem(index) {
|
|
558
554
|
const item = this.images[index];
|
|
559
555
|
if (!item) return;
|
|
560
|
-
const focusable = item.matches(
|
|
561
|
-
'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'
|
|
562
|
-
) ? item : item.querySelector(
|
|
563
|
-
'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])'
|
|
564
|
-
);
|
|
556
|
+
const focusable = item.matches(naturallyFocusable) ? item : item.querySelector(naturallyFocusable);
|
|
565
557
|
(focusable ?? item).focus({ preventScroll: true });
|
|
566
558
|
}
|
|
567
559
|
_updateParallax() {
|
|
@@ -658,13 +650,13 @@ var _Carousel = class _Carousel extends Component {
|
|
|
658
650
|
this._syncAutoAdvance();
|
|
659
651
|
}
|
|
660
652
|
next(n = 1) {
|
|
661
|
-
if (
|
|
653
|
+
if (isNaN(n)) n = 1;
|
|
662
654
|
const index = this.center + n;
|
|
663
655
|
if (index >= this.count || index < 0) return;
|
|
664
656
|
this._cycleTo(index);
|
|
665
657
|
}
|
|
666
658
|
prev(n = 1) {
|
|
667
|
-
if (
|
|
659
|
+
if (isNaN(n)) n = 1;
|
|
668
660
|
const index = this.center - n;
|
|
669
661
|
if (index >= this.count || index < 0) return;
|
|
670
662
|
this._cycleTo(index);
|
|
@@ -685,4 +677,4 @@ var Carousel = _Carousel;
|
|
|
685
677
|
export {
|
|
686
678
|
Carousel
|
|
687
679
|
};
|
|
688
|
-
//# sourceMappingURL=chunk-
|
|
680
|
+
//# sourceMappingURL=chunk-KVJAVDBC.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/carousel.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface CarouselI18nOptions {\n carousel: string;\n item: string;\n of: string;\n indicators: string;\n slide: string;\n}\n\nexport interface CarouselOptions extends BaseOptions {\n /**\n * Milliseconds allowed for a programmatic scroll to land. The track itself\n * scrolls at the browser's own smooth-scroll speed; this only bounds how\n * long the component waits for `scrollend` before assuming it arrived, and\n * is added to `interval` to time each auto-advance rest.\n * @default 200\n */\n duration: number;\n /**\n * Full-width compatibility track. Material 3 layouts are already linear.\n * Also implied by `.flat`.\n * @default false\n */\n fullWidth: boolean;\n /**\n * Show paging dots. Only drawn when there is more than one item.\n * @default false\n */\n indicators: boolean;\n /**\n * Stop auto-advance at the last item instead of looping back to the first.\n * A scroll track never wraps under arrow keys or `set()` either way.\n * @default false\n */\n noWrap: boolean;\n /**\n * Milliseconds to rest between automatic advances, on top of `duration` -\n * the gap follows each transition rather than containing it, so a full cycle\n * takes `duration + interval`. 0 leaves auto-advance off.\n * Whenever it is set the track pauses on hover and on keyboard focus, and\n * `prefers-reduced-motion: reduce` suppresses it entirely - auto-advancing\n * content is WCAG 2.2.2 territory, so neither is an option an author can\n * turn off. `noWrap` stops it after one pass instead of looping.\n * @default 0\n */\n interval: number;\n /**\n * Fixed track height in pixels. `null` sizes the carousel from its content.\n * A fixed height gives the indicators their own row below the track instead\n * of laying them over the media.\n * @default null\n */\n height: number | null;\n /**\n * Called when a new item becomes the center.\n * @default null\n */\n onCycleTo: (current: Element, dragged: boolean) => void;\n /**\n * Accessible names generated for an unlabeled carousel, its items and its\n * indicators.\n */\n i18n: Partial<CarouselI18nOptions>;\n}\n\nconst _defaults: CarouselOptions = {\n duration: 200,\n fullWidth: false,\n indicators: false,\n noWrap: false,\n interval: 0,\n height: null,\n onCycleTo: null,\n i18n: {\n carousel: 'Carousel',\n item: 'Item',\n of: 'of',\n indicators: 'Slides',\n slide: 'Slide'\n }\n};\n\nconst naturallyFocusable =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport class Carousel extends Component<CarouselOptions> {\n hasMultipleSlides: boolean;\n showIndicators: boolean;\n pressed: boolean;\n dragged: boolean;\n images: HTMLElement[];\n _indicators: HTMLUListElement | HTMLElement;\n count: number;\n center: number = 0;\n scrollingTimeout: ReturnType<typeof setTimeout>;\n oneTimeCallback: (current: Element, dragged: boolean) => void | null;\n\n private _ownIndicators: boolean = false;\n private _trackEl: HTMLElement | null = null;\n private _ignoreScroll: boolean = false;\n private _alignAfterResize = false;\n private _scrollEndTimeout: ReturnType<typeof setTimeout>;\n private _trackRaf: number = null;\n private _started: boolean = false;\n private _vertical: boolean = false;\n private _resizeObserver: ResizeObserver | null = null;\n private _resizeTimeout: ReturnType<typeof setTimeout> = null;\n private _usesWindowResize: boolean = false;\n private _dragPointerId: number | null = null;\n private _dragStartX: number = 0;\n private _dragStartY: number = 0;\n private _dragStartScroll: number = 0;\n private _suppressClick: boolean = false;\n private _suppressClickTimeout: ReturnType<typeof setTimeout> = null;\n private _generatedContainerRole: boolean = false;\n private _generatedContainerLabel: boolean = false;\n private _generatedContainerDescription: boolean = false;\n private _generatedWideLayout: boolean = false;\n private _generatedFixedHeight: boolean = false;\n private _authoredInlineHeight: string | null = null;\n private _autoAdvanceTimer: ReturnType<typeof setTimeout> = null;\n private _autoAdvances: boolean = false;\n private _autoPaused: boolean = false;\n private _hovered: boolean = false;\n private _focused: boolean = false;\n private _motion = window.matchMedia('(prefers-reduced-motion: reduce)');\n private _generatedItemTabIndexes = new Set<HTMLElement>();\n private _generatedItemLabels = new Set<HTMLElement>();\n private _generatedItemDescriptions = new Set<HTMLElement>();\n private _generatedItemSizes = new Set<HTMLElement>();\n private _authoredItemSizes = new Set<HTMLElement>();\n private _itemA11yOriginal = new Map<\n HTMLElement,\n { ariaHidden: string | null; tabIndex: string | null }\n >();\n\n private get _scroller(): HTMLElement {\n return this._trackEl ?? this.el;\n }\n\n private static _live = new Set<Carousel>();\n private static _resizeListening = false;\n private static _onResize = Utils.throttle(() => {\n Carousel._live.forEach((c) => c._handleResize());\n }, 200);\n\n constructor(el: HTMLElement, options: Partial<CarouselOptions>) {\n super(el, options, Carousel);\n this.el['Expressive_Carousel'] = this;\n\n this.options = {\n ...Carousel.defaults,\n ...options\n };\n if (options?.i18n) {\n this.options.i18n = { ...Carousel.defaults.i18n, ...options.i18n };\n }\n\n if (this.options.fullWidth || this.el.classList.contains('flat')) {\n this.el.classList.add('flat');\n this.options.fullWidth = true;\n }\n this._vertical = this.el.classList.contains('full-screen');\n\n this.pressed = false;\n this.dragged = false;\n this.images = this._collectItems();\n if (!this.images.length) {\n console.error('Carousel: no .carousel-item elements to show');\n return;\n }\n this.images.forEach((item) => {\n this._itemA11yOriginal.set(item, {\n ariaHidden: item.getAttribute('aria-hidden'),\n tabIndex: item.getAttribute('tabindex')\n });\n if (item.hasAttribute('data-carousel-size')) this._authoredItemSizes.add(item);\n });\n\n this.hasMultipleSlides = this.images.length > 1;\n this.showIndicators = this.options.indicators && this.hasMultipleSlides;\n this.count = this.images.length;\n\n this._autoAdvances = this.options.interval > 0 && this.hasMultipleSlides;\n\n this.images.forEach((item) => item.classList.add('carousel-item'));\n if (this.options.height !== null) {\n this._generatedFixedHeight = !this.el.classList.contains('fixed-height');\n this._authoredInlineHeight = this.el.style.getPropertyValue('--carousel-height') || null;\n this.el.classList.add('fixed-height');\n this.el.style.setProperty('--carousel-height', `${this.options.height}px`);\n }\n this._wrapTrack();\n this._syncAdaptiveMode();\n\n if (this.showIndicators) this._setupIndicators();\n\n this._setupAccessibility();\n\n this._setupEventHandlers();\n this._started = true;\n\n const start = Math.max(\n 0,\n this.images.findIndex((el) => el.classList.contains('active'))\n );\n this.center = start;\n this._syncActive(start, false);\n this._updateParallax();\n this._scrollToIndex(start, false);\n\n this._syncAutoAdvance();\n }\n\n static get defaults(): CarouselOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<CarouselOptions>): Carousel;\n static init(els: InitElements<InitElement>, options?: Partial<CarouselOptions>): Carousel[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<CarouselOptions> = {}\n ): Carousel | Carousel[] {\n return super.init(els, options, Carousel);\n }\n\n static getInstance(el: HTMLElement): Carousel {\n return el['Expressive_Carousel'];\n }\n\n destroy() {\n if (this._started) this._teardown();\n this.el['Expressive_Carousel'] = undefined;\n }\n\n private _collectItems(): HTMLElement[] {\n const explicit = Array.from(this.el.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.classList.contains('carousel-item')\n );\n if (explicit.length) return explicit;\n return Array.from(this.el.children).filter((el): el is HTMLElement => {\n if (!(el instanceof HTMLElement)) return false;\n if (el.classList.contains('indicators') || el.classList.contains('carousel-fixed-item')) {\n return false;\n }\n return el.tagName !== 'NAV';\n });\n }\n\n private _setupAccessibility() {\n if (!this.el.hasAttribute('role')) {\n this.el.setAttribute('role', 'region');\n this._generatedContainerRole = true;\n }\n if (!this.el.hasAttribute('aria-label') && !this.el.hasAttribute('aria-labelledby')) {\n this.el.setAttribute('aria-label', this.options.i18n.carousel);\n this._generatedContainerLabel = true;\n }\n if (!this.el.hasAttribute('aria-roledescription')) {\n this.el.setAttribute('aria-roledescription', 'carousel');\n this._generatedContainerDescription = true;\n }\n\n this.images.forEach((item, index) => {\n if (!item.hasAttribute('aria-roledescription')) {\n item.setAttribute('aria-roledescription', 'slide');\n this._generatedItemDescriptions.add(item);\n }\n\n if (!item.hasAttribute('aria-label') && !item.hasAttribute('aria-labelledby')) {\n const mediaName = item.querySelector('img[alt]')?.getAttribute('alt')?.trim();\n const textName = item.textContent?.replace(/\\s+/g, ' ').trim();\n const name = mediaName || textName;\n const position = `${this.options.i18n.item} ${index + 1} ${this.options.i18n.of} ${this.count}`;\n item.setAttribute('aria-label', name ? `${name}, ${position}` : position);\n this._generatedItemLabels.add(item);\n }\n\n if (!item.matches(naturallyFocusable) && !item.querySelector(naturallyFocusable)) {\n item.tabIndex = 0;\n this._generatedItemTabIndexes.add(item);\n }\n });\n }\n\n private _setupIndicators() {\n const existing = Array.from(this.el.children).find(\n (el): el is HTMLElement => el instanceof HTMLElement && el.classList.contains('indicators')\n );\n this._indicators = existing ?? document.createElement('nav');\n this._ownIndicators = !existing;\n this._indicators.classList.add('indicators');\n this._indicators.setAttribute('aria-label', this.options.i18n.indicators);\n this._indicators.replaceChildren();\n\n this.images.forEach((_, i) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('indicator-item');\n button.setAttribute('aria-label', `${this.options.i18n.slide} ${i + 1}`);\n this._indicators.appendChild(button);\n });\n\n if (this._ownIndicators) this.el.appendChild(this._indicators);\n this.el.querySelector('.carousel-fixed-item')?.classList.add('with-indicators');\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('keydown', this._handleKeydown);\n this._motion.addEventListener('change', this._handleMotionChange);\n if (this._autoAdvances) {\n this.el.addEventListener('mouseenter', this._handleAutoAdvanceState);\n this.el.addEventListener('mouseleave', this._handleAutoAdvanceState);\n this.el.addEventListener('focusin', this._handleAutoAdvanceState);\n this.el.addEventListener('focusout', this._handleAutoAdvanceState);\n // Browsers clamp a background tab's timers rather than stopping them, so\n // without this the track keeps cycling out of sight.\n document.addEventListener('visibilitychange', this._handleAutoAdvanceState);\n }\n if (this.showIndicators && this._indicators) {\n this._indicators.addEventListener('click', this._handleIndicatorClick);\n }\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => this._handleThrottledResize());\n this._resizeObserver.observe(this.el);\n }\n\n // Full-screen needs a window signal when orientation changes without\n // changing the container width. ResizeObserver handles every other track,\n // including pane resizes.\n this._usesWindowResize =\n !this._resizeObserver || this.el.classList.contains('full-screen');\n if (this._usesWindowResize) {\n Carousel._live.add(this);\n if (!Carousel._resizeListening) {\n window.addEventListener('resize', Carousel._onResize, {\n passive: true\n });\n Carousel._resizeListening = true;\n }\n }\n\n this._scroller.addEventListener('scroll', this._handleTrackScroll, {\n passive: true\n });\n this._scroller.addEventListener('pointerdown', this._handleTrackPointerDown);\n this._scroller.addEventListener('wheel', this._handleNativeScroll, { passive: true });\n this._scroller.addEventListener('click', this._handleTrackClick, true);\n this._scroller.addEventListener('dragstart', this._handleTrackDragStart);\n this._scroller.addEventListener('transitionend', this._handleItemResize);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('keydown', this._handleKeydown);\n this._motion.removeEventListener('change', this._handleMotionChange);\n this.el.removeEventListener('mouseenter', this._handleAutoAdvanceState);\n this.el.removeEventListener('mouseleave', this._handleAutoAdvanceState);\n this.el.removeEventListener('focusin', this._handleAutoAdvanceState);\n this.el.removeEventListener('focusout', this._handleAutoAdvanceState);\n document.removeEventListener('visibilitychange', this._handleAutoAdvanceState);\n if (this._indicators) {\n this._indicators.removeEventListener('click', this._handleIndicatorClick);\n }\n this._scroller.removeEventListener('scroll', this._handleTrackScroll);\n this._scroller.removeEventListener('pointerdown', this._handleTrackPointerDown);\n this._scroller.removeEventListener('wheel', this._handleNativeScroll);\n this._setDragListeners(false);\n this._scroller.removeEventListener('click', this._handleTrackClick, true);\n this._scroller.removeEventListener('dragstart', this._handleTrackDragStart);\n this._scroller.removeEventListener('transitionend', this._handleItemResize);\n\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n if (this._usesWindowResize) {\n Carousel._live.delete(this);\n if (Carousel._live.size === 0 && Carousel._resizeListening) {\n window.removeEventListener('resize', Carousel._onResize);\n Carousel._resizeListening = false;\n }\n }\n }\n\n private _teardown() {\n this._started = false;\n this._removeEventHandlers();\n this._finishScroll();\n this._autoAdvances = false;\n this._syncAutoAdvance();\n if (this._trackRaf !== null) cancelAnimationFrame(this._trackRaf);\n window.clearTimeout(this.scrollingTimeout);\n window.clearTimeout(this._suppressClickTimeout);\n clearTimeout(this._resizeTimeout);\n if (this._ownIndicators) this._indicators?.remove();\n this._unwrapTrack();\n this.images.forEach((el) => {\n el.style.removeProperty('--md-comp-carousel-item-parallax');\n if (this._generatedItemLabels.has(el)) el.removeAttribute('aria-label');\n if (this._generatedItemDescriptions.has(el)) el.removeAttribute('aria-roledescription');\n if (this._generatedItemSizes.has(el)) el.removeAttribute('data-carousel-size');\n const original = this._itemA11yOriginal.get(el);\n if (original?.ariaHidden === null) el.removeAttribute('aria-hidden');\n else if (original) el.setAttribute('aria-hidden', original.ariaHidden);\n if (original?.tabIndex === null) el.removeAttribute('tabindex');\n else if (original) el.setAttribute('tabindex', original.tabIndex);\n });\n if (this._generatedContainerRole) this.el.removeAttribute('role');\n if (this._generatedContainerLabel) this.el.removeAttribute('aria-label');\n if (this._generatedContainerDescription) this.el.removeAttribute('aria-roledescription');\n if (this._generatedFixedHeight) this.el.classList.remove('fixed-height');\n if (this.options.height !== null) {\n if (this._authoredInlineHeight === null) this.el.style.removeProperty('--carousel-height');\n else this.el.style.setProperty('--carousel-height', this._authoredInlineHeight);\n }\n if (this._generatedWideLayout) {\n this.el.classList.remove(\n 'multi-wide',\n 'multi-large',\n 'multi-extra-large',\n 'full-screen-horizontal'\n );\n }\n }\n\n _handleThrottledResize = () => {\n if (!this._started || this._resizeTimeout !== null) return;\n this._handleResize();\n this._resizeTimeout = setTimeout(() => {\n this._resizeTimeout = null;\n this._handleResize();\n }, 200);\n };\n\n _handleAutoAdvanceState = (e: Event) => {\n if (e.type === 'mouseenter') this._hovered = true;\n else if (e.type === 'mouseleave') this._hovered = false;\n else if (e.type === 'focusin') this._focused = true;\n else if (e.type === 'focusout') this._focused = this.el.contains((e as FocusEvent).relatedTarget as Node);\n this._syncAutoAdvance();\n };\n\n private _handleMotionChange = () => {\n this._syncAutoAdvance();\n if (this._motion.matches) this._scrollToIndex(this.center, false);\n this._updateParallax();\n };\n\n /** Start or stop the timer to match the current pause state. */\n private _syncAutoAdvance() {\n const run =\n this._autoAdvances &&\n !this._autoPaused &&\n !this._hovered &&\n !this._focused &&\n !this._motion.matches &&\n !document.hidden;\n if (run && this._autoAdvanceTimer === null) {\n // Each rest is armed after the move before it, never on a fixed phase.\n // A repeating timer assumes the work it triggers is instant; a smooth\n // scroll is not, so a fixed period either lands mid-scroll or, once a\n // tick is dropped, leaves whatever is left of the period as the next\n // rest.\n this._autoAdvanceTimer = setTimeout(\n this._tick,\n this.options.duration + this.options.interval\n );\n } else if (!run && this._autoAdvanceTimer !== null) {\n clearTimeout(this._autoAdvanceTimer);\n this._autoAdvanceTimer = null;\n }\n }\n\n private _tick = () => {\n this._autoAdvanceTimer = null;\n this._advance();\n this._syncAutoAdvance();\n };\n\n private _advance = () => {\n const next = this.center + 1;\n if (next < this.count) {\n this.set(next);\n return;\n }\n // Arrow keys and `set()` never wrap, because a scroll container has ends.\n // Auto-advance is the one caller that can: looping back to the first item\n // is just a scroll. An author who asked for no wrapping gets one pass and\n // then silence.\n if (this.options.noWrap) {\n this._autoAdvances = false;\n this._syncAutoAdvance();\n return;\n }\n this.set(0);\n };\n\n private _handleNativeScroll = () => {\n this._alignAfterResize = false;\n this._finishScroll();\n };\n\n /** The document only hears from a carousel while a mouse press is down on its track. */\n private _setDragListeners(on: boolean) {\n const method = on ? 'addEventListener' : 'removeEventListener';\n document[method]('pointermove', this._handleTrackPointerMove);\n document[method]('pointerup', this._handleTrackPointerUp);\n document[method]('pointercancel', this._handleTrackPointerUp);\n }\n\n _handleTrackPointerDown = (e: PointerEvent) => {\n this._handleNativeScroll();\n if (e.pointerType !== 'mouse' || e.button !== 0) return;\n this.pressed = true;\n this.dragged = false;\n this._suppressClick = false;\n this._dragPointerId = e.pointerId;\n this._dragStartX = e.clientX;\n this._dragStartY = e.clientY;\n this._dragStartScroll = this._vertical ? this._scroller.scrollTop : this._scroller.scrollLeft;\n this._setDragListeners(true);\n };\n\n _handleTrackPointerMove = (e: PointerEvent) => {\n if (!this.pressed || e.pointerId !== this._dragPointerId) return;\n const deltaX = e.clientX - this._dragStartX;\n const deltaY = e.clientY - this._dragStartY;\n const primaryDelta = this._vertical ? deltaY : deltaX;\n const crossDelta = this._vertical ? deltaX : deltaY;\n\n if (!this.dragged) {\n if (Math.abs(primaryDelta) < 6 || Math.abs(primaryDelta) <= Math.abs(crossDelta)) return;\n this.dragged = true;\n this.el.classList.add('dragging');\n try {\n this._scroller.setPointerCapture(e.pointerId);\n } catch {\n // Pointer capture is optional in older browsers and test DOMs.\n }\n }\n\n if (this._vertical) this._scroller.scrollTop = this._dragStartScroll - deltaY;\n else this._scroller.scrollLeft = this._dragStartScroll - deltaX;\n e.preventDefault();\n };\n\n _handleTrackPointerUp = (e: PointerEvent) => {\n if (!this.pressed || e.pointerId !== this._dragPointerId) return;\n this.pressed = false;\n this._dragPointerId = null;\n this._setDragListeners(false);\n this.el.classList.remove('dragging');\n try {\n this._scroller.releasePointerCapture(e.pointerId);\n } catch {\n // Pointer capture may already have been released.\n }\n\n if (!this.dragged) return;\n this._suppressClick = true;\n window.clearTimeout(this._suppressClickTimeout);\n this._suppressClickTimeout = setTimeout(() => {\n this._suppressClick = false;\n }, 0);\n this._syncActive(this._nearestIndex(), true);\n };\n\n _handleTrackClick = (e: MouseEvent) => {\n if (!this._suppressClick) return;\n this._suppressClick = false;\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n\n _handleTrackDragStart = (e: DragEvent) => {\n if ((e.target as HTMLElement).closest('a, img, picture, video')) e.preventDefault();\n };\n\n private _handleItemResize = (e: TransitionEvent) => {\n if (this._alignAfterResize && !this.pressed && e.propertyName === 'flex-basis' && this.images.includes(e.target as HTMLElement)) {\n this._scrollToIndex(this.center, false);\n }\n };\n\n _handleIndicatorClick = (e: Event) => {\n e.stopPropagation();\n const indicator = (e.target as HTMLElement).closest('.indicator-item');\n if (!indicator || !this._indicators.contains(indicator)) return;\n const index = [...this._indicators.children].indexOf(indicator);\n if (index < 0) return;\n this._cycleTo(index);\n };\n\n _handleKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (target.isContentEditable || target.closest('input, textarea, select')) return;\n const rtl = getComputedStyle(this._scroller).direction === 'rtl';\n const forward = this._vertical ? e.key === 'ArrowDown' : e.key === (rtl ? Utils.keys.ARROW_LEFT : Utils.keys.ARROW_RIGHT);\n const backward = this._vertical ? e.key === 'ArrowUp' : e.key === (rtl ? Utils.keys.ARROW_RIGHT : Utils.keys.ARROW_LEFT);\n if (e.key === 'Home') {\n e.preventDefault();\n this.set(0);\n this._focusItem(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n this.set(this.count - 1);\n this._focusItem(this.count - 1);\n } else if (forward) {\n e.preventDefault();\n this.next();\n this._focusItem(this.center);\n } else if (backward) {\n e.preventDefault();\n this.prev();\n this._focusItem(this.center);\n }\n };\n\n _handleTrackScroll = () => {\n if (!this.el.classList.contains('scrolling')) this.el.classList.add('scrolling');\n window.clearTimeout(this.scrollingTimeout);\n this.scrollingTimeout = setTimeout(() => this.el.classList.remove('scrolling'), 120);\n if (this._trackRaf !== null) return;\n this._trackRaf = requestAnimationFrame(() => {\n this._trackRaf = null;\n // Read the nearest index before the parallax writes invalidate style.\n const index = this._ignoreScroll ? this.center : this._nearestIndex();\n this._updateParallax();\n if (index !== this.center) this._syncActive(index, this.dragged);\n });\n };\n\n _handleResize = () => {\n if (!this._started || !this.images.length) return;\n this._syncAdaptiveMode();\n this._syncLayoutRoles(this.center);\n if (!this.pressed) this._scrollToIndex(this.center, false);\n this._updateParallax();\n };\n\n private _paintIndicators(center: number) {\n if (!this.showIndicators || !this._indicators) return;\n const pos = ((center % this.count) + this.count) % this.count;\n this._indicators.querySelectorAll('.indicator-item').forEach((el, i) => {\n const on = i === pos;\n el.classList.toggle('active', on);\n if (on) el.setAttribute('aria-current', 'true');\n else el.removeAttribute('aria-current');\n });\n }\n\n private _syncActive(index: number, dragged: boolean) {\n const prev = this.center;\n this.center = index;\n this.images.forEach((el, i) => el.classList.toggle('active', i === index));\n this._paintIndicators(index);\n this._syncLayoutRoles(index);\n const curr = this.images[index];\n if (prev !== index && typeof this.options.onCycleTo === 'function') {\n this.options.onCycleTo.call(this, curr, dragged);\n }\n if (typeof this.oneTimeCallback === 'function') {\n this.oneTimeCallback.call(this, curr, dragged);\n this.oneTimeCallback = null;\n }\n }\n\n private _syncLayoutRoles(index: number) {\n // Every size is worked out before any is written. Writing `large` to all\n // items and then reading clientWidth forced a layout in that interim\n // state on every center change.\n type Size = 'large' | 'medium' | 'small';\n const sizes: Size[] = this.images.map(() => 'large');\n const setSize = (i: number, size: Size) => {\n if (this.images[i]) sizes[i] = size;\n };\n\n if (\n this.el.classList.contains('flat') ||\n this.el.classList.contains('uncontained') ||\n (this.el.classList.contains('full-screen') && this._vertical)\n ) {\n // Every item stays large.\n } else if (\n this.el.classList.contains('hero') ||\n this.el.classList.contains('full-screen-horizontal')\n ) {\n setSize(index + 1, 'small');\n if (this.el.classList.contains('center-aligned')) setSize(index - 1, 'small');\n } else {\n const width = this.el.clientWidth;\n const desiredLargeCount = width >= 1600 ? 4 : width >= 1200 ? 3 : width >= 600 ? 2 : 1;\n const largeCount = Math.min(desiredLargeCount, Math.max(1, this.count - 2));\n this.el.classList.remove('multi-wide', 'multi-large', 'multi-extra-large');\n if (largeCount === 2) this.el.classList.add('multi-wide');\n else if (largeCount === 3) this.el.classList.add('multi-large');\n else if (largeCount >= 4) this.el.classList.add('multi-extra-large');\n this._generatedWideLayout = this._generatedWideLayout || largeCount > 1;\n setSize(index + largeCount, 'medium');\n setSize(index + largeCount + 1, 'small');\n }\n\n this.images.forEach((item, i) => {\n if (this._authoredItemSizes.has(item)) return;\n item.setAttribute('data-carousel-size', sizes[i]);\n this._generatedItemSizes.add(item);\n });\n }\n\n private _syncAdaptiveMode() {\n if (!this.el.classList.contains('full-screen')) return;\n const landscape = window.matchMedia('(orientation: landscape)').matches;\n const horizontal = this.el.clientWidth >= 840 || landscape;\n const wasVertical = this._vertical;\n this._vertical = !horizontal;\n this.el.classList.toggle('full-screen-horizontal', horizontal);\n this._generatedWideLayout = this._generatedWideLayout || horizontal;\n\n if (this._started && wasVertical !== this._vertical) {\n this._scroller.scrollTo({ left: 0, top: 0, behavior: 'auto' });\n }\n }\n\n private _focusItem(index: number) {\n const item = this.images[index];\n if (!item) return;\n const focusable = item.matches(naturallyFocusable)\n ? item\n : item.querySelector<HTMLElement>(naturallyFocusable);\n (focusable ?? item).focus({ preventScroll: true });\n }\n\n private _updateParallax() {\n if (this._motion.matches) {\n this.images.forEach((item) =>\n item.style.setProperty('--md-comp-carousel-item-parallax', '0px')\n );\n return;\n }\n\n const scrollerRect = this._scroller.getBoundingClientRect();\n const viewportCenter = this._vertical\n ? scrollerRect.top + scrollerRect.height / 2\n : scrollerRect.left + scrollerRect.width / 2;\n const viewportSize = Math.max(1, this._vertical ? scrollerRect.height : scrollerRect.width);\n\n // All reads, then all writes: a write between two reads forces a style\n // recalculation per item on every scroll frame.\n const rects = this.images.map((item) => item.getBoundingClientRect());\n this.images.forEach((item, i) => {\n const rect = rects[i];\n const itemCenter = this._vertical ? rect.top + rect.height / 2 : rect.left + rect.width / 2;\n const progress = Math.max(-1, Math.min(1, (itemCenter - viewportCenter) / viewportSize));\n item.style.setProperty('--md-comp-carousel-item-parallax', `${progress * -24}px`);\n });\n }\n\n private _wrapTrack() {\n const track = document.createElement('div');\n track.className = 'carousel-track';\n this.images[0].before(track);\n this.images.forEach((el) => track.appendChild(el));\n this._trackEl = track;\n }\n\n private _unwrapTrack() {\n if (!this._trackEl) return;\n this.images.forEach((el) => this.el.insertBefore(el, this._trackEl));\n this._trackEl.remove();\n this._trackEl = null;\n }\n\n private _nearestIndex(): number {\n const centered = this.el.classList.contains('center-aligned');\n const style = getComputedStyle(this._scroller);\n const rtl = !this._vertical && style.direction === 'rtl';\n const position = this._vertical ? this._scroller.scrollTop : this._scroller.scrollLeft;\n const viewport = this._vertical ? this._scroller.clientHeight : this._scroller.clientWidth;\n const extent = (this._vertical ? this._scroller.scrollHeight : this._scroller.scrollWidth) - viewport;\n const padding = parseFloat(this._vertical ? style.paddingBlockStart : style.paddingInlineStart) || 0;\n let best = this.center;\n let bestDist = Infinity;\n this.images.forEach((el, i) => {\n const start = this._vertical ? el.offsetTop : el.offsetLeft;\n const size = this._vertical ? el.offsetHeight : el.offsetWidth;\n const target = centered ? start - (viewport - size) / 2 : start + (rtl ? size - viewport + padding : -padding);\n const bounded = Math.max(rtl ? -extent : 0, Math.min(rtl ? 0 : extent, target));\n const dist = Math.abs(bounded - position);\n if (dist < bestDist || (dist === bestDist && i === this.center)) {\n bestDist = dist;\n best = i;\n }\n });\n return best;\n }\n\n private _scrollToIndex(n: number, smooth = true) {\n const el = this.images[n];\n if (!el) return;\n this._finishScroll();\n const centered = this.el.classList.contains('center-aligned');\n const style = getComputedStyle(this._scroller);\n const inlinePadding = Number.parseFloat(style.paddingInlineStart) || 0;\n const blockPadding = Number.parseFloat(style.paddingBlockStart) || 0;\n const left = centered\n ? el.offsetLeft - (this._scroller.clientWidth - el.offsetWidth) / 2\n : style.direction === 'rtl'\n ? el.offsetLeft + el.offsetWidth - this._scroller.clientWidth + inlinePadding\n : el.offsetLeft - inlinePadding;\n const top = el.offsetTop - blockPadding;\n this._ignoreScroll = true;\n // Item sizes are still transitioning, so the track can be too narrow to\n // reach the target and clamps short of it. Firefox takes whatever item\n // sits at that clamped position as the snap target and re-snaps to it\n // after each later layout change, undoing the alignment below. Snapping\n // returns in _finishScroll, once the track has settled on the item.\n this._scroller.style.scrollSnapType = 'none';\n this._scroller.scrollTo({\n left: this._vertical ? 0 : left,\n top: this._vertical ? top : 0,\n behavior: smooth && !this._motion.matches ? 'smooth' : 'instant'\n });\n this._scroller.addEventListener('scrollend', this._handleScrollEnd);\n this._scrollEndTimeout = setTimeout(this._finishScroll, this.options.duration + 350);\n }\n\n private _finishScroll = () => {\n this._ignoreScroll = false;\n this._scroller.style.scrollSnapType = '';\n clearTimeout(this._scrollEndTimeout);\n this._scroller.removeEventListener('scrollend', this._handleScrollEnd);\n };\n\n private _handleScrollEnd = () => {\n // An earlier scroll can finish after a new navigation has started.\n if (this._nearestIndex() === this.center && !this.images.some(item => item.getAnimations().some(animation => animation.playState === 'running'))) {\n this._finishScroll();\n }\n };\n\n _cycleTo(n: number, callback: CarouselOptions['onCycleTo'] = null) {\n this._alignAfterResize = true;\n if (typeof callback === 'function') this.oneTimeCallback = callback;\n this._syncActive(n, false);\n this._scrollToIndex(n);\n }\n\n /**\n * Stop auto-advance until start() is called. Without an `interval` there is\n * nothing to stop and this does nothing.\n */\n pause() {\n this._autoPaused = true;\n this._syncAutoAdvance();\n }\n\n /** Resume auto-advance after pause(). */\n start() {\n this._autoPaused = false;\n this._syncAutoAdvance();\n }\n\n next(n: number = 1) {\n if (isNaN(n)) n = 1;\n const index = this.center + n;\n if (index >= this.count || index < 0) return;\n this._cycleTo(index);\n }\n\n prev(n: number = 1) {\n if (isNaN(n)) n = 1;\n const index = this.center - n;\n if (index >= this.count || index < 0) return;\n this._cycleTo(index);\n }\n\n set(n: number, callback?: CarouselOptions['onCycleTo']) {\n if (n === undefined || isNaN(n)) n = 0;\n if (n >= this.count || n < 0) return;\n this._cycleTo(n, callback);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["el"]
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Component
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PD6HYHAE.mjs";
|
|
4
4
|
|
|
5
5
|
// src/ts/components/buttonGroup.ts
|
|
6
6
|
var _defaults = {};
|
|
@@ -223,4 +223,4 @@ var ButtonGroup = class _ButtonGroup extends Component {
|
|
|
223
223
|
export {
|
|
224
224
|
ButtonGroup
|
|
225
225
|
};
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
226
|
+
//# sourceMappingURL=chunk-L27Q6ZMI.mjs.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Utils
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M372EDXD.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Component
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PD6HYHAE.mjs";
|
|
7
7
|
|
|
8
8
|
// src/ts/components/messageScroller.ts
|
|
9
9
|
var _defaults = {
|
|
@@ -289,4 +289,4 @@ var MessageScroller = class _MessageScroller extends Component {
|
|
|
289
289
|
export {
|
|
290
290
|
MessageScroller
|
|
291
291
|
};
|
|
292
|
-
//# sourceMappingURL=chunk-
|
|
292
|
+
//# sourceMappingURL=chunk-LQWUDNHZ.mjs.map
|
|
@@ -142,12 +142,7 @@ var _Utils = class _Utils {
|
|
|
142
142
|
* @param trigger Trigger element.
|
|
143
143
|
*/
|
|
144
144
|
static getIdFromTrigger(trigger) {
|
|
145
|
-
|
|
146
|
-
if (!id) {
|
|
147
|
-
id = trigger.getAttribute("href");
|
|
148
|
-
return id ? id.slice(1) : "";
|
|
149
|
-
}
|
|
150
|
-
return id;
|
|
145
|
+
return trigger.dataset.target || (trigger.getAttribute("href")?.slice(1) ?? "");
|
|
151
146
|
}
|
|
152
147
|
/**
|
|
153
148
|
* Retrieves document scroll postion from top.
|
|
@@ -213,12 +208,11 @@ var _Utils = class _Utils {
|
|
|
213
208
|
* Renders a button with optional callback function
|
|
214
209
|
*/
|
|
215
210
|
static createButton(container, text, className = [], visibility = true, callback = null) {
|
|
216
|
-
className = className.concat(["text"]);
|
|
217
211
|
const button = document.createElement("button");
|
|
218
|
-
button.className = className.join(" ");
|
|
212
|
+
button.className = className.concat(["text"]).join(" ");
|
|
219
213
|
button.style.visibility = visibility ? "visible" : "hidden";
|
|
220
214
|
button.type = "button";
|
|
221
|
-
button.tabIndex =
|
|
215
|
+
button.tabIndex = visibility ? 0 : -1;
|
|
222
216
|
button.innerText = text;
|
|
223
217
|
if (typeof callback === "function") button.addEventListener("click", callback);
|
|
224
218
|
container.append(button);
|
|
@@ -325,4 +319,4 @@ var Utils = _Utils;
|
|
|
325
319
|
export {
|
|
326
320
|
Utils
|
|
327
321
|
};
|
|
328
|
-
//# sourceMappingURL=chunk-
|
|
322
|
+
//# sourceMappingURL=chunk-M372EDXD.mjs.map
|