@expressivecss/expressive 0.10.1 → 0.11.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 +77 -1
- package/README.md +22 -1
- package/dist/css/expressive.css +44 -10
- 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/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/js/chunks/{chunk-QYCYP443.mjs → chunk-74N6U5JJ.mjs} +12 -6
- package/dist/js/chunks/chunk-74N6U5JJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZIZVUWRL.mjs → chunk-7GKXUG4B.mjs} +8 -8
- package/dist/js/chunks/{chunk-7MM4VJJO.mjs → chunk-AYYYWUJ4.mjs} +7 -5
- package/dist/js/chunks/chunk-AYYYWUJ4.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZZBZI2XN.mjs → chunk-CDW6WIRT.mjs} +2 -2
- package/dist/js/chunks/chunk-FRB7TOCS.mjs +135 -0
- package/dist/js/chunks/chunk-FRB7TOCS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-AOGFNMXS.mjs → chunk-I5KR22BY.mjs} +2 -2
- package/dist/js/chunks/{chunk-AOGFNMXS.mjs.map → chunk-I5KR22BY.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-YFXEJ7GR.mjs → chunk-IMUPRRI6.mjs} +6 -7
- package/dist/js/chunks/chunk-IMUPRRI6.mjs.map +7 -0
- package/dist/js/chunks/chunk-PMBPAFAS.mjs +7 -0
- package/dist/js/chunks/{chunk-ZAOYQ6SY.mjs.map → chunk-PMBPAFAS.mjs.map} +1 -1
- package/dist/js/chunks/{chunk-G576EP5O.mjs → chunk-XFJ452AZ.mjs} +74 -11
- package/dist/js/chunks/chunk-XFJ452AZ.mjs.map +7 -0
- package/dist/js/expressive.cjs +139 -88
- package/dist/js/expressive.cjs.map +2 -2
- package/dist/js/expressive.js +139 -88
- package/dist/js/expressive.js.map +2 -2
- package/dist/js/expressive.min.js +10 -10
- package/dist/js/expressive.min.js.map +3 -3
- package/dist/js/expressive.mjs +9 -9
- package/dist/js/internal/components/autocomplete.mjs +1 -1
- package/dist/js/internal/components/carousel.mjs +1 -1
- package/dist/js/internal/components/chips.mjs +2 -2
- package/dist/js/internal/components/datepicker.mjs +2 -2
- package/dist/js/internal/components/index.mjs +7 -7
- package/dist/js/internal/components/registry.mjs +8 -8
- package/dist/js/internal/components/scrollspy.mjs +1 -1
- package/dist/js/internal/components/select.mjs +1 -1
- package/dist/js/internal/components/tabs.mjs +2 -2
- package/dist/js/modular.mjs +9 -9
- package/dist/types/components/autocomplete.d.ts +2 -1
- package/dist/types/components/datepicker.d.ts +1 -0
- package/dist/types/components/scrollspy.d.ts +5 -4
- package/dist/types/components/select.d.ts +7 -1
- package/dist/types/modular.d.ts +1 -1
- package/package.json +1 -1
- package/src/sass/abstracts/_mixins.scss +19 -11
- package/src/sass/components/_buttons.scss +45 -0
- package/src/sass/components/_chips.scss +5 -9
- package/src/sass/components/_dialog.scss +0 -7
- package/src/sass/components/_navbar.scss +3 -3
- package/src/sass/components/forms/_fieldset.scss +20 -1
- package/src/sass/components/forms/_file-input.scss +11 -3
- package/src/sass/components/forms/_select.scss +3 -2
- package/src/sass/utilities/_visibility.scss +5 -0
- package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +0 -7
- package/dist/js/chunks/chunk-G576EP5O.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYCYP443.mjs.map +0 -7
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs +0 -154
- package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +0 -7
- package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZAOYQ6SY.mjs +0 -7
- /package/dist/js/chunks/{chunk-ZIZVUWRL.mjs.map → chunk-7GKXUG4B.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZZBZI2XN.mjs.map → chunk-CDW6WIRT.mjs.map} +0 -0
|
@@ -52,12 +52,12 @@ var _Autocomplete = class _Autocomplete extends Component {
|
|
|
52
52
|
this._resetAutocomplete();
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
|
-
this._handleInputKeyup = (
|
|
56
|
-
|
|
55
|
+
this._handleInputKeyup = () => {
|
|
56
|
+
_Autocomplete._keydown = false;
|
|
57
|
+
};
|
|
58
|
+
this._handleInput = () => {
|
|
57
59
|
this.count = 0;
|
|
58
60
|
const actualValue = this.el.value.toLocaleLowerCase();
|
|
59
|
-
if (e.key === Utils.keys.ENTER || e.key === Utils.keys.ARROW_UP || e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ESC || e.key === "Tab")
|
|
60
|
-
return;
|
|
61
61
|
if (this.oldVal !== actualValue && this.el.matches(":focus-visible")) {
|
|
62
62
|
this.open();
|
|
63
63
|
}
|
|
@@ -237,6 +237,7 @@ var _Autocomplete = class _Autocomplete extends Component {
|
|
|
237
237
|
}
|
|
238
238
|
_setupEventHandlers() {
|
|
239
239
|
this.el.addEventListener("blur", this._handleInputBlur);
|
|
240
|
+
this.el.addEventListener("input", this._handleInput);
|
|
240
241
|
this.el.addEventListener("keyup", this._handleInputKeyup);
|
|
241
242
|
this.el.addEventListener("focus", this._handleInputFocus);
|
|
242
243
|
this.el.addEventListener("keydown", this._handleInputKeydown);
|
|
@@ -247,6 +248,7 @@ var _Autocomplete = class _Autocomplete extends Component {
|
|
|
247
248
|
}
|
|
248
249
|
_removeEventHandlers() {
|
|
249
250
|
this.el.removeEventListener("blur", this._handleInputBlur);
|
|
251
|
+
this.el.removeEventListener("input", this._handleInput);
|
|
250
252
|
this.el.removeEventListener("keyup", this._handleInputKeyup);
|
|
251
253
|
this.el.removeEventListener("focus", this._handleInputFocus);
|
|
252
254
|
this.el.removeEventListener("keydown", this._handleInputKeydown);
|
|
@@ -506,4 +508,4 @@ var Autocomplete = _Autocomplete;
|
|
|
506
508
|
export {
|
|
507
509
|
Autocomplete
|
|
508
510
|
};
|
|
509
|
-
//# sourceMappingURL=chunk-
|
|
511
|
+
//# sourceMappingURL=chunk-AYYYWUJ4.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/autocomplete.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface AutocompleteData {\n /**\n * A primitive value that can be converted to string.\n * If \"text\" is not provided, it will also be used as \"option text\" as well\n */\n id: string | number;\n /**\n * This optional attribute is used as \"display value\" for the current entry.\n * When provided, it will also be taken into consideration by the standard search function.\n */\n text?: string;\n /**\n * This optional attribute is used to provide a valid image URL to the current option.\n */\n image?: string;\n /**\n * Optional attributes which describes the option.\n */\n description?: string;\n}\n\nexport interface AutocompleteOptions extends BaseOptions {\n i18n: Partial<{\n loading: string;\n noResults: string;\n results: (count: number) => string;\n selected: (count: number) => string;\n }>;\n /**\n * Data object defining autocomplete options with\n * optional icon strings.\n */\n data: AutocompleteData[];\n /**\n * Flag which can be set if multiple values can be selected. The Result will be an Array.\n * @default false\n */\n isMultiSelect: boolean;\n /**\n * Callback for when autocompleted.\n */\n onAutocomplete: (entries: AutocompleteData[]) => void;\n /**\n * Minimum number of characters before autocomplete starts.\n * @default 1\n */\n minLength: number;\n /**\n * The height of the Menu which can be set via css-property.\n * @default '300px'\n */\n maxMenuHeight: string;\n /**\n * Function is called when the input text is altered and data can also be loaded asynchronously.\n * If the results are collected the items in the list can be updated via the function setMenuItems(collectedItems).\n * @param text Searched text.\n * @param autocomplete Current autocomplete instance.\n */\n onSearch: (text: string, autocomplete: Autocomplete) => void;\n /**\n * If true will render the key from each item directly as HTML.\n * User input MUST be properly sanitized first.\n * @default false\n */\n allowUnsafeHTML: boolean;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n /**\n * Predefined selected values\n */\n selected: number[] | string[];\n}\n\nconst _defaults: AutocompleteOptions = {\n i18n: {\n loading: 'Loading results.',\n noResults: 'No results.',\n results: count => `${count} ${count === 1 ? 'result' : 'results'} available.`,\n selected: count => `${count} ${count === 1 ? 'item' : 'items'} selected.`\n },\n data: [], // Autocomplete data set\n onAutocomplete: null, // Callback for when autocompleted\n menuOptions: {\n // Default menu options\n autoFocus: false,\n closeOnClick: false,\n coverTrigger: false\n },\n minLength: 1, // Min characters before autocomplete starts\n isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n const data = autocomplete.options.data;\n autocomplete.setMenuItems(\n data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\n autocomplete.options.data = data;\n },\n maxMenuHeight: '300px',\n allowUnsafeHTML: false,\n selected: []\n};\n\nexport class Autocomplete extends Component<AutocompleteOptions> {\n declare el: HTMLInputElement;\n /** If the autocomplete is open. */\n isOpen: boolean;\n /** Number of matching autocomplete options. */\n count: number;\n /** Index of the current selected option. */\n activeIndex: number;\n private oldVal: string;\n private $active: HTMLElement | null;\n private _openTimer: ReturnType<typeof setTimeout> | undefined;\n private _statusInfo: HTMLElement;\n private _announcer: HTMLElement;\n\n /**\n * The active entry, for both the eye and the screen reader. The class alone\n * was invisible to assistive technology; aria-activedescendant on the input\n * is what reports the move.\n *\n * Deliberately does not touch aria-selected. Active and selected are two\n * different things - in a multi-select the checkboxes track real choices,\n * and folding the highlight into aria-selected would announce a committed\n * choice as unselected the moment the user arrowed past it.\n */\n private _setActive(item: HTMLElement | null) {\n this.$active?.classList.remove('active');\n this.$active = item;\n if (item) {\n item.classList.add('active');\n this.el.setAttribute('aria-activedescendant', item.id);\n } else {\n this.el.removeAttribute('aria-activedescendant');\n }\n }\n private _pointerDown: boolean;\n container: HTMLElement;\n /** Instance of the menu plugin for this autocomplete. */\n menu: Menu;\n static _keydown: boolean;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options, Autocomplete);\n this.el['Expressive_Autocomplete'] = this;\n\n this.options = {\n ...Autocomplete.defaults,\n ...options,\n i18n: { ...Autocomplete.defaults.i18n, ...options?.i18n }\n };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.options.selected.map((id) => this.options.data.find(entry => entry.id === id) ?? { id });\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._pointerDown = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Autocomplete.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<AutocompleteOptions>): Autocomplete;\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<AutocompleteOptions>\n ): Autocomplete[];\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<AutocompleteOptions> = {}\n ): Autocomplete | Autocomplete[] {\n return super.init(els, options, Autocomplete);\n }\n\n static getInstance(el: HTMLElement): Autocomplete {\n return el['Expressive_Autocomplete'];\n }\n\n /**\n * The three-dot loading indicator, parsed once and cloned thereafter.\n *\n * It is shown on every input change, and it used to be assigned as an\n * innerHTML string each time - re-running the HTML parser over the same\n * fixed markup on every keystroke.\n */\n private static _loadingTemplate: HTMLElement = null;\n\n private static _loadingIndicator(): HTMLElement {\n if (!Autocomplete._loadingTemplate) {\n const template = document.createElement('template');\n template.innerHTML = `<div style=\"height:100%;width:50px;\"><svg version=\"1.1\" id=\"L4\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 0 0\" xml:space=\"preserve\">\n <circle fill=\"#888c\" stroke=\"none\" cx=\"6\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.1\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"26\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.2\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"46\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.3\"/></circle>\n </svg></div>`;\n Autocomplete._loadingTemplate = template.content.firstElementChild as HTMLElement;\n }\n return Autocomplete._loadingTemplate.cloneNode(true) as HTMLElement;\n }\n\n destroy() {\n // open() defers menu.open() to a timer. Without cancelling it, destroying\n // an autocomplete that was opened in the same tick let the callback run\n // against a menu whose element had already been removed.\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this._removeEventHandlers();\n this.menu.destroy();\n this._removeMenu();\n this._statusInfo.remove();\n this._announcer.remove();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\n this.el.addEventListener('input', this._handleInput);\n this.el.addEventListener('keyup', this._handleInputKeyup);\n this.el.addEventListener('focus', this._handleInputFocus);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('click', this._handleInputClick);\n // One pair, not two. These used to be a mouse pair plus a touch pair behind\n // a `window.ontouchstart` feature detect; a pointer event covers both, and\n // the detect covered nothing the browser does not report itself.\n this.container.addEventListener('pointerdown', this._handleContainerPointerDown);\n this.container.addEventListener('pointerup', this._handleContainerPointerUp);\n this.container.addEventListener('pointercancel', this._handleContainerPointerUp);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\n this.el.removeEventListener('input', this._handleInput);\n this.el.removeEventListener('keyup', this._handleInputKeyup);\n this.el.removeEventListener('focus', this._handleInputFocus);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('click', this._handleInputClick);\n this.container.removeEventListener('pointerdown', this._handleContainerPointerDown);\n this.container.removeEventListener('pointerup', this._handleContainerPointerUp);\n this.container.removeEventListener('pointercancel', this._handleContainerPointerUp);\n }\n\n _setupMenu() {\n this.container = document.createElement('menu');\n this.container.style.maxHeight = this.options.maxMenuHeight;\n this.container.id = `autocomplete-options-${Utils.guid()}`;\n this.container.classList.add('autocomplete-content');\n this.container.ariaExpanded = 'true';\n // An autocomplete is the textbook combobox, and this one already\n // implements the keyboard contract the roles promise - Up and Down move\n // the active entry, Enter commits it - so it is allowed to claim them.\n // It had none: the suggestions were an unlabelled list of <li>, and the\n // highlight moved with a class no assistive technology could see.\n this.container.setAttribute('role', 'listbox');\n this.el.setAttribute('role', 'combobox');\n this.el.setAttribute('aria-autocomplete', 'list');\n this.el.setAttribute('aria-controls', this.container.id);\n this.el.setAttribute('data-target', this.container.id);\n\n this.menuItems.forEach((menuItem) => {\n const itemElement = this._createMenuItem(menuItem);\n this.container.append(itemElement);\n });\n\n // ! Issue in Component Menu: _placeMenu moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize menu\n const menuOptions = {\n ...Autocomplete.defaults.menuOptions,\n ...this.options.menuOptions\n };\n // The wrapper is installed unconditionally: selecting the clicked entry is\n // how the autocomplete works, not an optional extra. Only the forwarding to\n // a user-supplied handler is conditional, and it hands over exactly what\n // Menu would have (the clicked `li`, called on the Menu instance).\n const userOnItemClick = menuOptions.onItemClick;\n menuOptions.onItemClick = (li) => {\n if (!li) return;\n const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\n if (typeof userOnItemClick === 'function') userOnItemClick.call(this.menu, li);\n };\n this.menu = Menu.init(this.el, menuOptions);\n this.el.setAttribute('aria-haspopup', 'listbox');\n\n // ! Workaround for Label: move label up again\n // TODO: Just use PopperJS in future!\n const label = this.el.parentElement.querySelector('label');\n if (label) this.el.after(label);\n\n // Sketchy removal of menu click handler\n this.el.removeEventListener('click', this.menu._handleClick);\n if(!this.options.isMultiSelect && !(this.options.selected.length === 0)) {\n const selectedValue = this.menuItems.filter((value) => value.id === this.selectedValues[0].id);\n this.el.value = selectedValue[0].text;\n }\n // Set Value if already set in HTML\n if (this.el.value) this.selectOption(this.el.value);\n // Add StatusInfo\n const div = document.createElement('div');\n div.classList.add('status-info');\n div.setAttribute('aria-hidden', 'true');\n div.setAttribute('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\n this._statusInfo = div;\n this._announcer = document.createElement('div');\n this._announcer.classList.add('autocomplete-status');\n this._announcer.setAttribute('role', 'status');\n this._announcer.setAttribute('aria-live', 'polite');\n this._announcer.setAttribute('aria-atomic', 'true');\n this.el.parentElement.appendChild(this._announcer);\n this._updateSelectedInfo();\n }\n\n _removeMenu() {\n this.container.ariaExpanded = 'false';\n this.container.parentNode.removeChild(this.container);\n }\n\n _handleInputBlur = () => {\n if (!this._pointerDown) {\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = () => {\n Autocomplete._keydown = false;\n };\n\n _handleInput = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Check if the input isn't empty, and that focus arrived by keyboard -\n // which is what `:focus-visible` means, and used to be a global flag this\n // bundle maintained from four capture-phase document listeners.\n if (this.oldVal !== actualValue && this.el.matches(':focus-visible')) {\n this.open();\n }\n this._inputChangeDetection(actualValue);\n };\n\n _handleInputFocus = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string) => {\n if (!this.options.isMultiSelect && this.selectedValues.length && this.el.value !== (this.selectedValues[0].text || String(this.selectedValues[0].id))) {\n this.selectedValues = [];\n }\n // Value has changed!\n if (this.oldVal !== value) {\n this._setStatusLoading();\n this.options.onSearch(this.el.value, this);\n }\n // Reset Single-Select when Input cleared\n if (!this.options.isMultiSelect && this.el.value.length === 0) {\n this.selectedValues = [];\n this._triggerChanged();\n }\n this.oldVal = value;\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Autocomplete._keydown = true;\n if (e.key === Utils.keys.ESC || e.key === 'Tab') {\n this.close();\n this._resetCurrentElementPosition();\n return;\n }\n // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (e.key === Utils.keys.ENTER && this.activeIndex >= 0) {\n const liElement = this.container.querySelectorAll('li')[this.activeIndex];\n if (liElement) {\n this.selectOption(liElement.getAttribute('data-id'));\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (e.key === Utils.keys.ARROW_UP || e.key === Utils.keys.ARROW_DOWN) {\n e.preventDefault();\n if (e.key === Utils.keys.ARROW_UP && this.activeIndex > 0) this.activeIndex--;\n if (e.key === Utils.keys.ARROW_DOWN && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this._setActive(null);\n if (this.activeIndex >= 0) {\n this._setActive(this.container.querySelectorAll('li')[this.activeIndex]);\n // Focus selected\n this.container.children[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n };\n\n _handleInputClick = () => {\n this.open();\n };\n\n // The flag says \"a press is in flight inside the option list\", so that a blur\n // caused by that press does not close the list out from under it. Without the\n // cancel half, a cancelled gesture left the flag set and the next blur could\n // not close the list at all.\n _handleContainerPointerDown = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n this._pointerDown = true;\n };\n\n _handleContainerPointerUp = () => {\n this._pointerDown = false;\n };\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this._setActive(null);\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this.isOpen = false;\n this._pointerDown = false;\n }\n\n _highlightPartialText(input: string, label: string) {\n const start = label.toLocaleLowerCase().indexOf('' + input.toLocaleLowerCase() + '');\n const end = start + input.length - 1;\n //custom filters may return results where the string does not match any part\n if (start == -1 || end == -1) {\n return [label, '', ''];\n }\n return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];\n }\n\n _createMenuItem(entry: AutocompleteData) {\n const item = document.createElement('li');\n item.id = `autocomplete-option-${Utils.guid()}`;\n item.setAttribute('role', 'option');\n // role=option promises a selection state on every entry, not just the\n // chosen one - and it has to be the *real* one. A multi-select entry that\n // is already committed is selected whether or not it is the highlighted\n // row.\n const isSelected = this.selectedValues.some((sel) => sel.id === entry.id);\n item.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n item.setAttribute('data-id', <string>entry.id);\n item.setAttribute(\n 'style',\n 'display:grid; grid-auto-flow: column; user-select: none; align-items: center;'\n );\n item.tabIndex = -1;\n // Checkbox\n if (this.options.isMultiSelect) {\n const selection = document.createElement('div');\n selection.classList.add('item-selection');\n selection.style.textAlign = 'center';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n checkbox.checked = isSelected;\n const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n if (entry.image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = entry.image;\n item.appendChild(img);\n }\n\n // Text\n const inputText = this.el.value.toLocaleLowerCase();\n const parts = this._highlightPartialText(inputText, (entry.text || entry.id).toString());\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n if (this.options.allowUnsafeHTML) {\n div.innerHTML = parts[0] + '<span class=\"highlight\">' + parts[1] + '</span>' + parts[2];\n } else {\n div.appendChild(document.createTextNode(parts[0]));\n if (parts[1]) {\n const highlight = document.createElement('span');\n highlight.textContent = parts[1];\n highlight.classList.add('highlight');\n div.appendChild(highlight);\n div.appendChild(document.createTextNode(parts[2]));\n }\n }\n\n const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n item.querySelector('.item-text').appendChild(div);\n // Description\n if (\n typeof entry.description === 'string' ||\n (typeof entry.description === 'number' && !isNaN(entry.description))\n ) {\n const description = document.createElement('small');\n description.setAttribute(\n 'style',\n 'line-height:1.3;color:grey;white-space:nowrap;text-overflow:ellipsis;display:block;width:90%;overflow:hidden;'\n );\n description.innerText = entry.description;\n item.querySelector('.item-text').appendChild(description);\n }\n // Set Grid\n const getGridConfig = () => {\n if (this.options.isMultiSelect) {\n if (entry.image) return '40px min-content auto'; // cb-img-txt\n return '40px auto'; // cb-txt\n }\n if (entry.image) return 'min-content auto'; // img-txt\n return 'auto'; // txt\n };\n item.style.gridTemplateColumns = getGridConfig();\n return item;\n }\n\n _renderMenu() {\n this._resetAutocomplete();\n // Check if Data is empty\n if (this.menuItems.length === 0) {\n this.menuItems = this.selectedValues; // Show selected Items\n }\n for (let i = 0; i < this.menuItems.length; i++) {\n const item = this._createMenuItem(this.menuItems[i]);\n this.container.append(item);\n }\n }\n\n _setStatusLoading() {\n const statusElement = this._statusInfo;\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n this._announce(this.options.i18n.loading);\n }\n\n private _announce(message: string) {\n if (!this._announcer) return;\n const text = this.el.matches(':focus') && this.el.value.length >= this.options.minLength ? message : '';\n if (this._announcer.textContent !== text) this._announcer.textContent = text;\n }\n\n _updateSelectedInfo() {\n const statusElement = this._statusInfo;\n if (statusElement) {\n if (this.options.isMultiSelect)\n statusElement.textContent = this.selectedValues.length.toString();\n else statusElement.replaceChildren();\n }\n }\n\n _refreshInputText() {\n if (this.selectedValues.length === 1) {\n const entry = this.selectedValues[0];\n this.el.value = entry.text || <string>entry.id; // Write Text to Input\n }\n }\n\n _triggerChanged() {\n this.el.dispatchEvent(new Event('change'));\n // Trigger Autocomplete Event\n if (typeof this.options.onAutocomplete === 'function')\n this.options.onAutocomplete.call(this, this.selectedValues);\n }\n\n /**\n * Show autocomplete.\n */\n open = () => {\n const inputText = this.el.value.toLocaleLowerCase();\n this._resetAutocomplete();\n if (inputText.length >= this.options.minLength) {\n this.isOpen = true;\n this._renderMenu();\n this._announce(this.menuItems.length ? this.options.i18n.results(this.menuItems.length) : this.options.i18n.noResults);\n }\n // Open menu\n if (!this.menu.isOpen) {\n // Cancel first: two open() calls before the callback fires would leave\n // the earlier timer untracked, and destroy() can only cancel the one it\n // knows about.\n if (this._openTimer !== undefined) clearTimeout(this._openTimer);\n this._openTimer = setTimeout(() => {\n this._openTimer = undefined;\n this.menu.open();\n }, 0); // TODO: why?\n } else this.menu.recalculateDimensions(); // Recalculate menu when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n if (this._announcer) this._announcer.textContent = '';\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this.isOpen = false;\n this.menu.close();\n };\n\n /**\n * Updates the visible or selectable items shown in the menu.\n * @param menuItems Items to be available.\n * @param selected Selected item ids\n * @param open Option to conditionally open menu\n */\n setMenuItems(menuItems: AutocompleteData[], selected: number[] | string[] = null, open: boolean = true) {\n if (this.el['Expressive_Autocomplete'] !== this) return;\n const resultCount = menuItems.length;\n this.menuItems = menuItems;\n this.options.data = menuItems;\n if (selected) {\n this.selectedValues = this.menuItems.filter(\n (item) => !(selected.indexOf(<never>item.id) === -1)\n );\n }\n if (this.options.isMultiSelect) {\n this._renderMenu();\n } else {\n this._refreshInputText();\n }\n if (open) this.open();\n this._updateSelectedInfo();\n this._announce(open ? resultCount ? this.options.i18n.results(resultCount) : this.options.i18n.noResults : '');\n this._triggerChanged();\n }\n\n /**\n * Select a specific autocomplete option via id-property.\n * @param id The id of a data-entry.\n */\n selectOption(id: number | string) {\n const entry = this.menuItems.find((item) => item.id == id);\n if (!entry) return;\n // Toggle Checkbox\n /* const li = this.container.querySelector('li[data-id=\"' + id + '\"]');\n if (!li) return;*/\n if (this.options.isMultiSelect) {\n /* const checkbox = <HTMLInputElement | null>li.querySelector('input[type=\"checkbox\"]');\n checkbox.checked = !checkbox.checked;*/\n if (!(this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id === entry.id\n ).length >= 1)) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id !== entry.id\n );\n this._renderMenu();\n this.el.focus();\n } else {\n // Single-Select\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n }\n this._updateSelectedInfo();\n if (this.options.isMultiSelect) this._announce(this.options.i18n.selected(this.selectedValues.length));\n this._triggerChanged();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Autocomplete
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AYYYWUJ4.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Utils
|
|
6
6
|
} from "./chunk-MISGHDUU.mjs";
|
|
@@ -335,4 +335,4 @@ var Chips = _Chips;
|
|
|
335
335
|
export {
|
|
336
336
|
Chips
|
|
337
337
|
};
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
338
|
+
//# sourceMappingURL=chunk-CDW6WIRT.mjs.map
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-QSQ24FYT.mjs";
|
|
4
|
+
|
|
5
|
+
// src/ts/components/scrollspy.ts
|
|
6
|
+
var _defaultGetActiveElement = (id) => `a[href="#${id}"]`;
|
|
7
|
+
var _defaults = {
|
|
8
|
+
scrollOffset: 200,
|
|
9
|
+
activeClass: "active",
|
|
10
|
+
getActiveElement: _defaultGetActiveElement,
|
|
11
|
+
keepTopElementActive: false
|
|
12
|
+
};
|
|
13
|
+
var _ScrollSpy = class _ScrollSpy extends Component {
|
|
14
|
+
constructor(el, options) {
|
|
15
|
+
super(el, options, _ScrollSpy);
|
|
16
|
+
this._ratio = 0;
|
|
17
|
+
this._link = null;
|
|
18
|
+
this.el["Expressive_ScrollSpy"] = this;
|
|
19
|
+
this.options = {
|
|
20
|
+
..._ScrollSpy.defaults,
|
|
21
|
+
...options
|
|
22
|
+
};
|
|
23
|
+
this._offset = this.el.style.getPropertyValue("--md-comp-scrollspy-offset");
|
|
24
|
+
this._offsetPriority = this.el.style.getPropertyPriority("--md-comp-scrollspy-offset");
|
|
25
|
+
this.el.style.setProperty(
|
|
26
|
+
"--md-comp-scrollspy-offset",
|
|
27
|
+
`${this.options.scrollOffset}px`
|
|
28
|
+
);
|
|
29
|
+
_ScrollSpy._elements.push(this);
|
|
30
|
+
if (typeof IntersectionObserver !== "undefined") {
|
|
31
|
+
this._observer = new IntersectionObserver((entries) => {
|
|
32
|
+
if (_ScrollSpy.getInstance(this.el) !== this) return;
|
|
33
|
+
for (const entry of entries) this._ratio = entry.isIntersecting ? entry.intersectionRatio : 0;
|
|
34
|
+
_ScrollSpy._syncActive(this.options.getActiveElement);
|
|
35
|
+
}, {
|
|
36
|
+
rootMargin: `-${this.options.scrollOffset}px 0px -45% 0px`,
|
|
37
|
+
threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]
|
|
38
|
+
});
|
|
39
|
+
this._observer.observe(this.el);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
static get defaults() {
|
|
43
|
+
return _defaults;
|
|
44
|
+
}
|
|
45
|
+
static init(els, options = {}) {
|
|
46
|
+
return super.init(els, options, _ScrollSpy);
|
|
47
|
+
}
|
|
48
|
+
static getInstance(el) {
|
|
49
|
+
return el["Expressive_ScrollSpy"];
|
|
50
|
+
}
|
|
51
|
+
destroy() {
|
|
52
|
+
const index = _ScrollSpy._elements.indexOf(this);
|
|
53
|
+
if (index < 0) return;
|
|
54
|
+
_ScrollSpy._elements.splice(index, 1);
|
|
55
|
+
this._observer?.disconnect();
|
|
56
|
+
const resolver = this.options.getActiveElement;
|
|
57
|
+
if (_ScrollSpy._active.get(resolver) === this) _ScrollSpy._clearActive(resolver);
|
|
58
|
+
this.el.style.setProperty("--md-comp-scrollspy-offset", this._offset, this._offsetPriority);
|
|
59
|
+
this.el["Expressive_ScrollSpy"] = void 0;
|
|
60
|
+
_ScrollSpy._syncActive(resolver);
|
|
61
|
+
}
|
|
62
|
+
static _syncActive(resolver) {
|
|
63
|
+
const elements = _ScrollSpy._elements.filter((spy) => spy.options.getActiveElement === resolver);
|
|
64
|
+
let best = null;
|
|
65
|
+
let bestRatio = 0;
|
|
66
|
+
for (const spy of elements) {
|
|
67
|
+
const ratio = spy._ratio;
|
|
68
|
+
if (ratio > bestRatio) {
|
|
69
|
+
bestRatio = ratio;
|
|
70
|
+
best = spy;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!best) {
|
|
74
|
+
const retained = elements.filter((spy) => spy.options.keepTopElementActive);
|
|
75
|
+
best = _ScrollSpy._nearestAbove(retained) ?? retained[0];
|
|
76
|
+
}
|
|
77
|
+
const next = best ? _ScrollSpy._linkFor(best.el.id, best.options) : null;
|
|
78
|
+
const active = _ScrollSpy._active.get(resolver);
|
|
79
|
+
if (active === best && active?._link === next) return;
|
|
80
|
+
_ScrollSpy._clearActive(resolver);
|
|
81
|
+
if (!next) return;
|
|
82
|
+
next.classList.add(best.options.activeClass);
|
|
83
|
+
next.setAttribute("aria-current", "true");
|
|
84
|
+
best._link = next;
|
|
85
|
+
_ScrollSpy._active.set(resolver, best);
|
|
86
|
+
}
|
|
87
|
+
static _nearestAbove(elements) {
|
|
88
|
+
let best = null;
|
|
89
|
+
let bestTop = -Infinity;
|
|
90
|
+
for (const spy of elements) {
|
|
91
|
+
const top = spy.el.getBoundingClientRect().top;
|
|
92
|
+
if (top <= 0 && top >= bestTop) {
|
|
93
|
+
bestTop = top;
|
|
94
|
+
best = spy;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return best;
|
|
98
|
+
}
|
|
99
|
+
static _clearActive(resolver) {
|
|
100
|
+
const active = _ScrollSpy._active.get(resolver);
|
|
101
|
+
if (!active) return;
|
|
102
|
+
active._link?.classList.remove(active.options.activeClass);
|
|
103
|
+
active._link?.removeAttribute("aria-current");
|
|
104
|
+
active._link = null;
|
|
105
|
+
_ScrollSpy._active.delete(resolver);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Default lookup compares href attributes (no interpolated selector).
|
|
109
|
+
* A custom getActiveElement still returns a selector.
|
|
110
|
+
*/
|
|
111
|
+
static _linkFor(id, options) {
|
|
112
|
+
if (!id) return null;
|
|
113
|
+
if (options.getActiveElement !== _defaultGetActiveElement) {
|
|
114
|
+
try {
|
|
115
|
+
return document.querySelector(options.getActiveElement(id));
|
|
116
|
+
} catch {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const href = `#${id}`;
|
|
121
|
+
const links = document.querySelectorAll('a[href^="#"]');
|
|
122
|
+
for (let i = 0; i < links.length; i++) {
|
|
123
|
+
if (links[i].getAttribute("href") === href) return links[i];
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
_ScrollSpy._elements = [];
|
|
129
|
+
_ScrollSpy._active = /* @__PURE__ */ new Map();
|
|
130
|
+
var ScrollSpy = _ScrollSpy;
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
ScrollSpy
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=chunk-FRB7TOCS.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/scrollspy.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ScrollSpyOptions extends BaseOptions {\n /**\n * Offset used as IntersectionObserver rootMargin and as\n * `--md-comp-scrollspy-offset` (scroll-margin on the section).\n * @default 200\n */\n scrollOffset: number;\n /**\n * Class applied to active elements.\n * @default 'active'\n */\n activeClass: string;\n /**\n * Returns a CSS selector for the TOC link. The default is unused: links\n * are found by comparing `a[href^=\"#\"]` to `#id`. A custom function\n * still runs through `querySelector` (escape any author id yourself).\n * @default id => 'a[href=\"#' + id + '\"]'\n */\n getActiveElement: (id: string) => string;\n /**\n * If true, keep the last section above the viewport active when nothing\n * intersects. If there is no such section, the first one stays active.\n * @default false\n */\n keepTopElementActive: boolean;\n}\n\nconst _defaultGetActiveElement = (id: string): string => `a[href=\"#${id}\"]`;\n\nconst _defaults: ScrollSpyOptions = {\n scrollOffset: 200,\n activeClass: 'active',\n getActiveElement: _defaultGetActiveElement,\n keepTopElementActive: false\n};\n\n/**\n * ScrollSpy. IntersectionObserver decides which section is current.\n * Hash links are left to the browser (`scroll-margin` + `scroll-behavior`).\n */\nexport class ScrollSpy extends Component<ScrollSpyOptions> {\n static _elements: ScrollSpy[] = [];\n private static _active = new Map<ScrollSpyOptions['getActiveElement'], ScrollSpy>();\n private _observer: IntersectionObserver;\n private _ratio = 0;\n private _link: Element | null = null;\n private _offset: string;\n private _offsetPriority: string;\n\n constructor(el: HTMLElement, options: Partial<ScrollSpyOptions>) {\n super(el, options, ScrollSpy);\n this.el['Expressive_ScrollSpy'] = this;\n\n this.options = {\n ...ScrollSpy.defaults,\n ...options\n };\n\n this._offset = this.el.style.getPropertyValue('--md-comp-scrollspy-offset');\n this._offsetPriority = this.el.style.getPropertyPriority('--md-comp-scrollspy-offset');\n this.el.style.setProperty(\n '--md-comp-scrollspy-offset',\n `${this.options.scrollOffset}px`\n );\n\n ScrollSpy._elements.push(this);\n if (typeof IntersectionObserver !== 'undefined') {\n this._observer = new IntersectionObserver((entries) => {\n if (ScrollSpy.getInstance(this.el) !== this) return;\n for (const entry of entries) this._ratio = entry.isIntersecting ? entry.intersectionRatio : 0;\n ScrollSpy._syncActive(this.options.getActiveElement);\n }, {\n rootMargin: `-${this.options.scrollOffset}px 0px -45% 0px`,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]\n });\n this._observer.observe(this.el);\n }\n }\n\n static get defaults(): ScrollSpyOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ScrollSpyOptions>): ScrollSpy;\n static init(els: InitElements<InitElement>, options?: Partial<ScrollSpyOptions>): ScrollSpy[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ScrollSpyOptions> = {}\n ): ScrollSpy | ScrollSpy[] {\n return super.init(els, options, ScrollSpy);\n }\n\n static getInstance(el: HTMLElement): ScrollSpy {\n return el['Expressive_ScrollSpy'];\n }\n\n destroy() {\n const index = ScrollSpy._elements.indexOf(this);\n if (index < 0) return;\n ScrollSpy._elements.splice(index, 1);\n this._observer?.disconnect();\n const resolver = this.options.getActiveElement;\n if (ScrollSpy._active.get(resolver) === this) ScrollSpy._clearActive(resolver);\n this.el.style.setProperty('--md-comp-scrollspy-offset', this._offset, this._offsetPriority);\n this.el['Expressive_ScrollSpy'] = undefined;\n ScrollSpy._syncActive(resolver);\n }\n\n private static _syncActive(resolver: ScrollSpyOptions['getActiveElement']) {\n const elements = ScrollSpy._elements.filter(spy => spy.options.getActiveElement === resolver);\n\n let best: ScrollSpy | null = null;\n let bestRatio = 0;\n for (const spy of elements) {\n const ratio = spy._ratio;\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = spy;\n }\n }\n\n if (!best) {\n const retained = elements.filter(spy => spy.options.keepTopElementActive);\n best = ScrollSpy._nearestAbove(retained) ?? retained[0];\n }\n\n const next = best ? ScrollSpy._linkFor(best.el.id, best.options) : null;\n const active = ScrollSpy._active.get(resolver);\n if (active === best && active?._link === next) return;\n ScrollSpy._clearActive(resolver);\n if (!next) return;\n next.classList.add(best.options.activeClass);\n next.setAttribute('aria-current', 'true');\n best._link = next;\n ScrollSpy._active.set(resolver, best);\n }\n\n private static _nearestAbove(elements: ScrollSpy[]): ScrollSpy | null {\n let best: ScrollSpy | null = null;\n let bestTop = -Infinity;\n for (const spy of elements) {\n const top = spy.el.getBoundingClientRect().top;\n if (top <= 0 && top >= bestTop) {\n bestTop = top;\n best = spy;\n }\n }\n return best;\n }\n\n private static _clearActive(resolver: ScrollSpyOptions['getActiveElement']) {\n const active = ScrollSpy._active.get(resolver);\n if (!active) return;\n active._link?.classList.remove(active.options.activeClass);\n active._link?.removeAttribute('aria-current');\n active._link = null;\n ScrollSpy._active.delete(resolver);\n }\n\n /**\n * Default lookup compares href attributes (no interpolated selector).\n * A custom getActiveElement still returns a selector.\n */\n static _linkFor(id: string, options: ScrollSpyOptions): Element | null {\n if (!id) return null;\n if (options.getActiveElement !== _defaultGetActiveElement) {\n try {\n return document.querySelector(options.getActiveElement(id));\n } catch {\n return null;\n }\n }\n const href = `#${id}`;\n const links = document.querySelectorAll('a[href^=\"#\"]');\n for (let i = 0; i < links.length; i++) {\n if (links[i].getAttribute('href') === href) return links[i];\n }\n return null;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -221,7 +221,7 @@ var _Carousel = class _Carousel extends Component {
|
|
|
221
221
|
this._scroller.removeEventListener("scrollend", this._handleScrollEnd);
|
|
222
222
|
};
|
|
223
223
|
this._handleScrollEnd = () => {
|
|
224
|
-
if (!this.images.some((item) => item.getAnimations().some((animation) => animation.playState === "running"))) {
|
|
224
|
+
if (this._nearestIndex() === this.center && !this.images.some((item) => item.getAnimations().some((animation) => animation.playState === "running"))) {
|
|
225
225
|
this._finishScroll();
|
|
226
226
|
}
|
|
227
227
|
};
|
|
@@ -688,4 +688,4 @@ var Carousel = _Carousel;
|
|
|
688
688
|
export {
|
|
689
689
|
Carousel
|
|
690
690
|
};
|
|
691
|
-
//# sourceMappingURL=chunk-
|
|
691
|
+
//# sourceMappingURL=chunk-I5KR22BY.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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\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 const naturallyFocusable =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\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 if (i === 0) {\n button.classList.add('active');\n button.setAttribute('aria-current', 'true');\n }\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('pointermove', this._handleTrackPointerMove);\n this._scroller.addEventListener('pointerup', this._handleTrackPointerUp);\n this._scroller.addEventListener('pointercancel', this._handleTrackPointerUp);\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._scroller.removeEventListener('pointermove', this._handleTrackPointerMove);\n this._scroller.removeEventListener('pointerup', this._handleTrackPointerUp);\n this._scroller.removeEventListener('pointercancel', this._handleTrackPointerUp);\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 _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 try {\n this._scroller.setPointerCapture(e.pointerId);\n } catch {\n // Pointer capture is optional in older browsers and test DOMs.\n }\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 }\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.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('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 this._updateParallax();\n if (this._ignoreScroll) return;\n const index = this._nearestIndex();\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 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 const setSize = (item: HTMLElement, size: 'large' | 'medium' | 'small') => {\n if (this._authoredItemSizes.has(item)) return;\n item.setAttribute('data-carousel-size', size);\n this._generatedItemSizes.add(item);\n };\n\n this.images.forEach((item) => setSize(item, 'large'));\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 return;\n }\n\n if (\n this.el.classList.contains('hero') ||\n this.el.classList.contains('full-screen-horizontal')\n ) {\n const next = this.images[index + 1];\n if (next) setSize(next, 'small');\n if (this.el.classList.contains('center-aligned')) {\n const previous = this.images[index - 1];\n if (previous) setSize(previous, 'small');\n }\n return;\n }\n\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\n for (let offset = 1; offset < largeCount; offset += 1) {\n const item = this.images[index + offset];\n if (item) setSize(item, 'large');\n }\n const medium = this.images[index + largeCount];\n const small = this.images[index + largeCount + 1];\n if (medium) setSize(medium, 'medium');\n if (small) setSize(small, 'small');\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(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n ? item\n : item.querySelector<HTMLElement>(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n (focusable ?? item).focus({ preventScroll: true });\n }\n\n private _updateParallax() {\n if (window.matchMedia('(prefers-reduced-motion: reduce)').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 this.images.forEach((item) => {\n const rect = item.getBoundingClientRect();\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 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 clearTimeout(this._scrollEndTimeout);\n this._scroller.removeEventListener('scrollend', this._handleScrollEnd);\n };\n\n private _handleScrollEnd = () => {\n if (!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 (n === undefined || 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 (n === undefined || 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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",
|
|
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\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 const naturallyFocusable =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\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 if (i === 0) {\n button.classList.add('active');\n button.setAttribute('aria-current', 'true');\n }\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('pointermove', this._handleTrackPointerMove);\n this._scroller.addEventListener('pointerup', this._handleTrackPointerUp);\n this._scroller.addEventListener('pointercancel', this._handleTrackPointerUp);\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._scroller.removeEventListener('pointermove', this._handleTrackPointerMove);\n this._scroller.removeEventListener('pointerup', this._handleTrackPointerUp);\n this._scroller.removeEventListener('pointercancel', this._handleTrackPointerUp);\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 _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 try {\n this._scroller.setPointerCapture(e.pointerId);\n } catch {\n // Pointer capture is optional in older browsers and test DOMs.\n }\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 }\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.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('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 this._updateParallax();\n if (this._ignoreScroll) return;\n const index = this._nearestIndex();\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 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 const setSize = (item: HTMLElement, size: 'large' | 'medium' | 'small') => {\n if (this._authoredItemSizes.has(item)) return;\n item.setAttribute('data-carousel-size', size);\n this._generatedItemSizes.add(item);\n };\n\n this.images.forEach((item) => setSize(item, 'large'));\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 return;\n }\n\n if (\n this.el.classList.contains('hero') ||\n this.el.classList.contains('full-screen-horizontal')\n ) {\n const next = this.images[index + 1];\n if (next) setSize(next, 'small');\n if (this.el.classList.contains('center-aligned')) {\n const previous = this.images[index - 1];\n if (previous) setSize(previous, 'small');\n }\n return;\n }\n\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\n for (let offset = 1; offset < largeCount; offset += 1) {\n const item = this.images[index + offset];\n if (item) setSize(item, 'large');\n }\n const medium = this.images[index + largeCount];\n const small = this.images[index + largeCount + 1];\n if (medium) setSize(medium, 'medium');\n if (small) setSize(small, 'small');\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(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n ? item\n : item.querySelector<HTMLElement>(\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), ' +\n 'textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n (focusable ?? item).focus({ preventScroll: true });\n }\n\n private _updateParallax() {\n if (window.matchMedia('(prefers-reduced-motion: reduce)').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 this.images.forEach((item) => {\n const rect = item.getBoundingClientRect();\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 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 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 (n === undefined || 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 (n === undefined || 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
6
|
"names": ["el"]
|
|
7
7
|
}
|