@expressivecss/expressive 0.7.0-rc.0 → 0.8.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 +1311 -1
- package/README.md +14 -11
- package/dist/css/expressive.css +4215 -1668
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/js/expressive.cjs +1231 -1253
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +1231 -1253
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +12 -12
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +1231 -1253
- package/dist/js/expressive.mjs.map +4 -4
- package/dist/types/behaviors/bottomSheets.d.ts +19 -11
- package/dist/types/behaviors/sheetDrag.d.ts +40 -0
- package/dist/types/behaviors/sideSheets.d.ts +2 -9
- package/dist/types/components/autocomplete.d.ts +15 -3
- package/dist/types/components/buttons.d.ts +5 -1
- package/dist/types/components/carousel.d.ts +87 -53
- package/dist/types/components/chips.d.ts +21 -1
- package/dist/types/components/expandingCard.d.ts +31 -0
- package/dist/types/components/index.d.ts +21 -20
- package/dist/types/components/lightbox.d.ts +1 -0
- package/dist/types/components/menu.d.ts +7 -1
- package/dist/types/components/{sidenav.d.ts → navigationDrawer.d.ts} +16 -16
- package/dist/types/components/registry.d.ts +8 -8
- package/dist/types/components/slider.d.ts +26 -85
- package/dist/types/components/snackbar.d.ts +20 -5
- package/dist/types/components/tabs.d.ts +12 -0
- package/dist/types/components/timepicker.d.ts +12 -9
- package/dist/types/core/utils.d.ts +64 -53
- package/dist/types/index.d.ts +8 -9
- package/package.json +15 -1
- package/src/sass/README.md +61 -11
- package/src/sass/abstracts/_breakpoints.scss +17 -19
- package/src/sass/abstracts/_mixins.scss +103 -21
- package/src/sass/abstracts/_variables.scss +50 -5
- package/src/sass/base/_global.scss +6 -24
- package/src/sass/base/_grid.scss +15 -12
- package/src/sass/base/_normalize.scss +34 -38
- package/src/sass/base/_typography.scss +4 -18
- package/src/sass/components/_badges.scss +2 -3
- package/src/sass/components/_banners.scss +298 -0
- package/src/sass/components/_bottom-app-bar.scss +180 -0
- package/src/sass/components/_bottom-sheet.scss +12 -4
- package/src/sass/components/_button-groups.scss +186 -0
- package/src/sass/components/_buttons.scss +245 -92
- package/src/sass/components/_cards.scss +494 -73
- package/src/sass/components/_carousel.scss +562 -68
- package/src/sass/components/_chips.scss +64 -5
- package/src/sass/components/_datepicker.scss +24 -24
- package/src/sass/components/_dialog.scss +17 -11
- package/src/sass/components/_drag-handle.scss +130 -0
- package/src/sass/components/_expanding-card.scss +260 -0
- package/src/sass/components/_fab-menu.scss +232 -0
- package/src/sass/components/_floating-sheet.scss +86 -0
- package/src/sass/components/_icon-buttons.scss +194 -0
- package/src/sass/components/_icons-material-design.scss +16 -4
- package/src/sass/components/_index.scss +22 -6
- package/src/sass/components/_list.scss +16 -13
- package/src/sass/components/_loading-indicator.scss +106 -0
- package/src/sass/components/_menu.scss +335 -61
- package/src/sass/components/_navbar.scss +71 -24
- package/src/sass/components/_navigation-bar.scss +13 -10
- package/src/sass/components/{_sidenav.scss → _navigation-drawer.scss} +123 -33
- package/src/sass/components/_navigation-rail.scss +22 -22
- package/src/sass/components/_page-footer.scss +19 -16
- package/src/sass/components/_pagination.scss +24 -6
- package/src/sass/components/_panes.scss +52 -11
- package/src/sass/components/{_preloader.scss → _progress.scss} +11 -3
- package/src/sass/components/_scrim.scss +37 -0
- package/src/sass/components/_search.scss +259 -0
- package/src/sass/components/_segmented-buttons.scss +188 -0
- package/src/sass/components/_side-sheet.scss +2 -2
- package/src/sass/components/_snackbar.scss +20 -15
- package/src/sass/components/_split-button.scss +196 -0
- package/src/sass/components/_tabs.scss +7 -8
- package/src/sass/components/_timepicker.scss +67 -58
- package/src/sass/components/_toolbar.scss +206 -80
- package/src/sass/components/forms/_checkboxes.scss +49 -12
- package/src/sass/components/forms/_fieldset.scss +4 -4
- package/src/sass/components/forms/_file-input.scss +8 -1
- package/src/sass/components/forms/_index.scss +1 -1
- package/src/sass/components/forms/_input-fields.scss +50 -44
- package/src/sass/components/forms/_radio-buttons.scss +42 -10
- package/src/sass/components/forms/_select.scss +0 -1
- package/src/sass/components/forms/{_range.scss → _slider.scss} +8 -9
- package/src/sass/components/forms/_switches.scss +6 -7
- package/src/sass/tokens/_index.scss +4 -1
- package/src/sass/tokens/_reference.scss +70 -61
- package/src/sass/tokens/_state.scss +24 -0
- package/src/sass/tokens/_theme.scss +6 -3
- package/src/sass/tokens/_vibrant.scss +76 -0
- package/src/sass/utilities/_colors.scss +14 -1
- package/src/sass/utilities/_helpers.scss +5 -5
- package/src/sass/utilities/_visibility.scss +48 -26
- package/dist/types/behaviors/waves.d.ts +0 -15
- package/dist/types/components/parallax.d.ts +0 -16
- package/dist/types/components/range.d.ts +0 -43
- package/dist/types/core/bounding.d.ts +0 -6
- package/dist/types/core/edges.d.ts +0 -6
- package/src/sass/components/_parallax.scss +0 -104
- package/src/sass/components/_pulse.scss +0 -37
- package/src/sass/components/_slider.scss +0 -129
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/ts/core/utils.ts", "../../src/ts/core/component.ts", "../../src/ts/components/cards.ts", "../../src/ts/components/menu.ts", "../../src/ts/components/autocomplete.ts", "../../src/ts/components/chips.ts", "../../src/ts/components/
|
|
4
|
-
"sourcesContent": ["import { Edges } from './edges';\nimport { Bounding } from './bounding';\n\n/**\n * Class with utilitary functions for global usage.\n */\nexport class Utils {\n /** Specifies wether tab is pressed or not. */\n static tabPressed: boolean = false;\n /** Specifies wether there is a key pressed. */\n static keyDown: boolean = false;\n\n /**\n * Key maps.\n */\n static keys = {\n TAB: ['Tab'],\n ENTER: ['Enter'],\n ESC: ['Escape', 'Esc'],\n BACKSPACE: ['Backspace'],\n ARROW_UP: ['ArrowUp', 'Up'],\n ARROW_DOWN: ['ArrowDown', 'Down'],\n ARROW_LEFT: ['ArrowLeft', 'Left'],\n ARROW_RIGHT: ['ArrowRight', 'Right'],\n DELETE: ['Delete', 'Del']\n };\n\n /**\n * Keys that count as keyboard navigation, precomputed.\n *\n * These handlers run at capture phase on the document for every keystroke on\n * the page, and used to rebuild three arrays and spread them into a fourth\n * on each one.\n */\n private static _navigationKeys = new Set([\n ...Utils.keys.TAB,\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP\n ]);\n\n /**\n * Detects when a key is pressed.\n * @param e Event instance.\n */\n static docHandleKeydown(e: KeyboardEvent) {\n Utils.keyDown = true;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = true;\n }\n }\n\n /**\n * Detects when a key is released.\n * @param e Event instance.\n */\n static docHandleKeyup(e: KeyboardEvent) {\n Utils.keyDown = false;\n if (Utils._navigationKeys.has(e.key)) {\n Utils.tabPressed = false;\n }\n }\n\n /**\n * Detects when document is focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleFocus(e: FocusEvent) {\n if (Utils.keyDown) {\n document.body.classList.add('keyboard-focused');\n }\n }\n\n /**\n * Detects when document is not focused.\n * @param e Event instance.\n */\n /* eslint-disabled as of required event type condition check */\n /* eslint-disable-next-line */\n static docHandleBlur(e: FocusEvent) {\n document.body.classList.remove('keyboard-focused');\n }\n\n /**\n * Run `callback` once the document is parsed.\n *\n * The document-level behaviors all used a bare DOMContentLoaded listener,\n * which never fires if the bundle is loaded after that event - an async or\n * deferred script tag, or a dynamic import. Checking readyState first covers\n * both orders.\n */\n static onDocumentReady(callback: () => void): void {\n if (typeof document === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n } else {\n callback();\n }\n }\n\n /**\n * Generates a unique string identifier.\n */\n static guid(): string {\n const s4 = (): string => {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n };\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n }\n\n /**\n * Checks for exceeded edges\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkWithinContainer(container: HTMLElement, bounding: Bounding, offset: number): Edges {\n const edges = {\n top: false,\n right: false,\n bottom: false,\n left: false\n };\n\n const containerRect = container.getBoundingClientRect();\n // If body element is smaller than viewport, use viewport height instead.\n const containerBottom =\n container === document.body\n ? Math.max(containerRect.bottom, window.innerHeight)\n : containerRect.bottom;\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledY = bounding.top - scrollTop;\n\n // Check for container and viewport for each edge\n if (scrolledX < containerRect.left + offset || scrolledX < offset) {\n edges.left = true;\n }\n\n if (\n scrolledX + bounding.width > containerRect.right - offset ||\n scrolledX + bounding.width > window.innerWidth - offset\n ) {\n edges.right = true;\n }\n\n if (scrolledY < containerRect.top + offset || scrolledY < offset) {\n edges.top = true;\n }\n\n if (\n scrolledY + bounding.height > containerBottom - offset ||\n scrolledY + bounding.height > window.innerHeight - offset\n ) {\n edges.bottom = true;\n }\n\n return edges;\n }\n\n /**\n * Checks if element can be aligned in multiple directions.\n * @param el Element to be inspected.\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkPossibleAlignments(\n el: HTMLElement,\n container: HTMLElement,\n bounding: Bounding,\n offset: number\n ) {\n const canAlign: {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n spaceOnTop: number;\n spaceOnRight: number;\n spaceOnBottom: number;\n spaceOnLeft: number;\n } = {\n top: true,\n right: true,\n bottom: true,\n left: true,\n spaceOnTop: null,\n spaceOnRight: null,\n spaceOnBottom: null,\n spaceOnLeft: null\n };\n\n const containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';\n const containerRect = container.getBoundingClientRect();\n const containerHeight = Math.min(containerRect.height, window.innerHeight);\n const containerWidth = Math.min(containerRect.width, window.innerWidth);\n const elOffsetRect = el.getBoundingClientRect();\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledYTopEdge = bounding.top - scrollTop;\n const scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;\n\n // Check for container and viewport for left\n canAlign.spaceOnRight = !containerAllowsOverflow\n ? containerWidth - (scrolledX + bounding.width)\n : window.innerWidth - (elOffsetRect.left + bounding.width);\n if (canAlign.spaceOnRight < 0) {\n canAlign.left = false;\n }\n\n // Check for container and viewport for Right\n canAlign.spaceOnLeft = !containerAllowsOverflow\n ? scrolledX - bounding.width + elOffsetRect.width\n : elOffsetRect.right - bounding.width;\n if (canAlign.spaceOnLeft < 0) {\n canAlign.right = false;\n }\n\n // Check for container and viewport for Top\n canAlign.spaceOnBottom = !containerAllowsOverflow\n ? containerHeight - (scrolledYTopEdge + bounding.height + offset)\n : window.innerHeight - (elOffsetRect.top + bounding.height + offset);\n if (canAlign.spaceOnBottom < 0) {\n canAlign.top = false;\n }\n\n // Check for container and viewport for Bottom\n canAlign.spaceOnTop = !containerAllowsOverflow\n ? scrolledYBottomEdge - (bounding.height - offset)\n : elOffsetRect.bottom - (bounding.height + offset);\n if (canAlign.spaceOnTop < 0) {\n canAlign.bottom = false;\n }\n\n return canAlign;\n }\n\n /**\n * Retrieves target element id from trigger.\n * @param trigger Trigger element.\n */\n static getIdFromTrigger(trigger: HTMLElement): string {\n let id = trigger.dataset.target;\n if (!id) {\n id = trigger.getAttribute('href');\n return id ? id.slice(1) : '';\n }\n return id;\n }\n\n /**\n * Retrieves document scroll postion from top.\n */\n static getDocumentScrollTop(): number {\n return window.scrollY || document.documentElement.scrollTop || document.body.scrollTop || 0;\n }\n\n /**\n * Retrieves document scroll postion from left.\n */\n static getDocumentScrollLeft(): number {\n return window.scrollX || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n }\n\n /**\n * Fires the given function after a certain ammount of time.\n * @param func Function to be fired.\n * @param wait Wait time.\n * @param options Additional options.\n */\n static throttle(\n func: (...args: unknown[]) => void,\n wait: number,\n options: Partial<{ leading: boolean; trailing: boolean }> = {}\n ) {\n // `options` is nullable because callers pass an explicit null.\n let lastArgs: unknown[] = null,\n result,\n timeout = null,\n previous = 0;\n\n const later = () => {\n previous = options?.leading === false ? 0 : Date.now();\n timeout = null;\n // The trailing call replays the most recent arguments; without this it\n // used to fire with none at all.\n result = func(...(lastArgs ?? []));\n lastArgs = null;\n };\n\n return (...args: unknown[]) => {\n const now = Date.now();\n if (!previous && options?.leading === false) previous = now;\n const remaining = wait - (now - previous);\n lastArgs = args;\n if (remaining <= 0) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n lastArgs = null;\n result = func(...args);\n } else if (!timeout && options?.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n }\n\n /**\n * Renders confirm/close buttons with callback function\n */\n static createConfirmationContainer(\n container: HTMLElement,\n confirmText: string,\n cancelText: string,\n onConfirm: (Function: object) => void,\n onCancel: (Function: object) => void\n ): void {\n const confirmationButtonsContainer = document.createElement('div');\n confirmationButtonsContainer.classList.add('confirmation-btns');\n container.append(confirmationButtonsContainer);\n\n this.createButton(confirmationButtonsContainer, cancelText, ['btn-cancel'], true, onCancel);\n this.createButton(confirmationButtonsContainer, confirmText, ['btn-confirm'], true, onConfirm);\n }\n\n /**\n * Renders a button with optional callback function\n */\n static createButton(\n container: HTMLElement,\n text: string,\n className: string[] = [],\n visibility: boolean = true,\n callback: (Function: object) => void = null\n ): void {\n className = className.concat(['waves-effect', 'text']);\n const button = document.createElement('button');\n button.className = className.join(' ');\n button.style.visibility = visibility ? 'visible' : 'hidden';\n button.type = 'button';\n button.tabIndex = !!visibility ? 0 : -1;\n button.innerText = text;\n // The keypress handler used to call `callback` unconditionally, so a\n // button created without one threw on Enter.\n if (typeof callback === 'function') {\n button.addEventListener('click', callback);\n button.addEventListener('keypress', (e) => {\n if (Utils.keys.ENTER.includes(e.key)) callback(e);\n });\n }\n container.append(button);\n }\n\n static _setAbsolutePosition(\n origin: HTMLElement,\n container: HTMLElement,\n position: string,\n margin: number,\n transitionMovement: number,\n align: string = 'center'\n ) {\n const originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n containerHeight = container.offsetHeight,\n containerWidth = container.offsetWidth,\n originRect = origin.getBoundingClientRect(); // one rect, read twice below\n let xMovement = 0,\n yMovement = 0,\n targetTop = originRect.top + Utils.getDocumentScrollTop(),\n targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n\n if (position === 'top') {\n targetTop += -containerHeight - margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = -transitionMovement;\n } else if (position === 'right') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = originWidth + margin;\n xMovement = transitionMovement;\n } else if (position === 'left') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = -containerWidth - margin;\n xMovement = -transitionMovement;\n } else {\n targetTop += originHeight + margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = transitionMovement;\n }\n if (align === 'right') {\n targetLeft += originWidth - containerWidth - margin;\n }\n\n const newCoordinates = Utils._repositionWithinScreen(\n targetLeft,\n targetTop,\n containerWidth,\n containerHeight,\n margin,\n transitionMovement,\n align\n );\n\n container.style.top = newCoordinates.y + 'px';\n container.style.left = newCoordinates.x + 'px';\n\n return {x: xMovement, y: yMovement};\n }\n\n static _repositionWithinScreen(\n x: number,\n y: number,\n width: number,\n height: number,\n margin: number,\n transitionMovement: number,\n align: string\n ) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n let offset: number;\n if (align === 'left' || align == 'center') {\n offset = margin + transitionMovement;\n } else if (align === 'right') {\n offset = margin - transitionMovement;\n }\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n}\n", "/**\n * Base options for component initialization.\n */\nexport interface BaseOptions {}\n\nexport type InitElement = HTMLElement | Element;\nexport type InitElements<T extends InitElement> = NodeListOf<T> | HTMLCollectionOf<T>;\ntype ComponentConstructor<T extends Component<O>, O extends BaseOptions> = {\n new (el: HTMLElement, options: Partial<O>): T;\n};\ntype ComponentType<C extends Component<O>, O extends BaseOptions> = ComponentConstructor<C, O> &\n typeof Component<O>;\n\nexport interface I18nOptions {\n cancel: string;\n clear: string;\n done: string;\n}\n\nexport interface Openable {\n isOpen: boolean;\n open(): void;\n close(): void;\n}\n\n/**\n * Base class implementation for Expressive components.\n */\nexport class Component<O extends BaseOptions> {\n /**\n * The DOM element the plugin was initialized with.\n */\n el: HTMLElement;\n /**\n * The options the instance was initialized with.\n */\n options: O;\n\n /**\n * Constructs component instance and set everything up.\n */\n constructor(el: HTMLElement, options: Partial<O>, classDef: ComponentType<Component<O>, O>) {\n // Display error if el is not a valid HTML Element\n if (!(el instanceof HTMLElement)) {\n console.error(Error(el + ' is not an HTML Element'));\n }\n // If exists, destroy and reinitialize in child\n const ins = classDef.getInstance(el);\n if (!!ins) {\n ins.destroy();\n }\n this.el = el;\n }\n\n /**\n * Initializes component instance.\n * @param el HTML element.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends HTMLElement, O extends BaseOptions, C extends Component<O>>(\n el: I,\n options: O,\n classDef: ComponentType<C, O>\n ): C;\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[] {\n let instances = null;\n if (els instanceof Element) {\n instances = new classDef(<HTMLElement>els, options);\n } else if (!!els && els.length) {\n instances = [];\n for (let i = 0; i < els.length; i++) {\n instances.push(new classDef(<HTMLElement>els[i], options));\n }\n }\n return instances;\n }\n\n /**\n * @returns default options for component instance.\n */\n static get defaults(): BaseOptions {\n return {};\n }\n\n /**\n * Retrieves component instance for the given element.\n * @param el Associated HTML Element.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getInstance(el: HTMLElement): Component<BaseOptions> {\n throw new Error('This method must be implemented.');\n }\n\n /**\n * Destroy plugin instance and teardown.\n */\n destroy(): void {\n throw new Error('This method must be implemented.');\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * What counts as a card.\n *\n * Shared with `components/registry.ts` rather than written out twice: the\n * registry used to claim `.cards`, which matches nothing this component\n * actually initializes, so the AutoInit entry was dead while `Cards.Init()`\n * quietly did the work through the selector below.\n */\nexport const CARDS_SELECTOR = 'article:has(> aside)';\n\nexport class Cards extends Component<CardsOptions> implements Openable {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private _activators: HTMLElement[] | null;\n private cardRevealClose: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions>) {\n super(el, options, Cards);\n this.el['Expressive_Cards'] = this;\n\n this.options = {\n ...Cards.defaults,\n ...options\n };\n\n this._activators = [];\n\n this.cardReveal = this.el.querySelector(':scope > aside');\n if (this.cardReveal) {\n this._activators = Array.from(this.el.querySelectorAll('.activator'));\n this._activators.forEach((el: HTMLElement) => {\n if (el) el.tabIndex = 0;\n });\n\n this.cardRevealClose = this.cardReveal.querySelector(\n ':scope > :is(h1, h2, h3, h4, h5, h6)'\n );\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n\n this.cardReveal.ariaExpanded = 'false';\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Cards.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CardsOptions>): Cards;\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<CardsOptions>): Cards[];\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options?: Partial<CardsOptions>\n ): Cards | Cards[] {\n return super.init(els, options, Cards);\n }\n\n static getInstance(el: HTMLElement): Cards {\n return el['Expressive_Cards'];\n }\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n this._removeEventHandlers();\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n this._activators = [];\n this.el['Expressive_Cards'] = undefined;\n }\n\n _setupEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.addEventListener('click', this._handleClickInteraction);\n el.addEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _removeEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.removeEventListener('click', this._handleClickInteraction);\n el.removeEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _handleClickInteraction = () => {\n this._handleRevealEvent();\n };\n\n _handleKeypressEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleRevealEvent();\n }\n };\n\n _handleRevealEvent = () => {\n // Reveal Card\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = -1));\n this.open();\n };\n\n _setupRevealCloseEventHandlers = () => {\n this.cardRevealClose.addEventListener('click', this.close);\n this.cardRevealClose.addEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _removeRevealCloseEventHandlers = () => {\n this.cardRevealClose.removeEventListener('click', this.close);\n this.cardRevealClose.removeEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _handleKeypressCloseEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this.close();\n }\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen || !this.cardReveal) return;\n this.isOpen = true;\n this.cardReveal.ariaExpanded = 'true';\n // A reveal without a title has no close affordance; that is allowed.\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = 0;\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this);\n }\n if (this.cardRevealClose) this._setupRevealCloseEventHandlers();\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen || !this.cardReveal) return;\n this.isOpen = false;\n this.cardReveal.ariaExpanded = 'false';\n this._activators.forEach((el: HTMLElement) => (el.tabIndex = 0));\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n if (typeof this.options.onClose === 'function') {\n this.options.onClose.call(this);\n }\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n };\n\n static Init() {\n // Handle initialization of static cards.\n Utils.onDocumentReady(() => {\n const cards = document.querySelectorAll(CARDS_SELECTOR);\n cards.forEach((el) => {\n if (el && el['Expressive_Cards'] == undefined) this.init(el as HTMLElement);\n });\n });\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface MenuOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus menu el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the menu activator.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the menu.\n * @default null\n */\n container: Element;\n /**\n * If false, the menu will show below the trigger.\n * That is the M3 placement. Pass `true` to cover the trigger.\n * @default false\n */\n coverTrigger: boolean;\n /**\n * If true, close menu on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the menu will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when menu starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when menu starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\nconst _defaults: MenuOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: false,\n closeOnClick: true,\n hover: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nexport class Menu extends Component<MenuOptions> implements Openable {\n static _menus: Menu[] = [];\n /** ID of the menu element. */\n id: string;\n /** The DOM element of the menu. */\n menuEl: HTMLElement;\n /** If the menu is open. */\n isOpen: boolean;\n /** If the menu content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n\n constructor(el: HTMLElement, options: Partial<MenuOptions>) {\n super(el, options, Menu);\n this.el['Expressive_Menu'] = this;\n\n Menu._menus.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.menuEl = document.getElementById(this.id);\n\n this.options = {\n ...Menu.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n this.el.ariaExpanded = 'false';\n\n // Keep the menu next to the trigger so positioning stays local.\n this._moveMenuToElement();\n this._makeMenuFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): MenuOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Menu.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MenuOptions>): Menu;\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MenuOptions>): Menu[];\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MenuOptions> = {}\n ): Menu | Menu[] {\n return super.init(els, options, Menu);\n }\n\n static getInstance(el: HTMLElement): Menu {\n return el['Expressive_Menu'];\n }\n\n destroy() {\n clearTimeout(this.filterTimeout);\n this._resetMenuStyles();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Menu._menus.indexOf(this);\n if (index >= 0) Menu._menus.splice(index, 1);\n this.el['Expressive_Menu'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.menuEl?.addEventListener('click', this._handleMenuClick);\n if (this.menuEl?.querySelector(':scope > li > menu')) {\n this.menuEl.addEventListener('mouseover', this._handleSubmenuAlign);\n }\n // Hover event handlers\n if (this.options.hover) {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `menuEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.menuEl?.removeEventListener('click', this._handleMenuClick);\n this.menuEl?.removeEventListener('mouseover', this._handleSubmenuAlign);\n if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, { passive: true });\n this.menuEl?.addEventListener('keydown', this._handleMenuKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.menuEl?.removeEventListener('keydown', this._handleMenuKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToMenuContent = !!(this.menuEl && toEl && this.menuEl.contains(toEl));\n let leaveToActiveMenuTrigger = false;\n const closestTrigger = toEl.closest('.menu-trigger');\n if (closestTrigger && !!closestTrigger['Expressive_Menu'] && closestTrigger['Expressive_Menu'].isOpen) {\n leaveToActiveMenuTrigger = true;\n }\n // Close hover menu if mouse did not leave to either active menu-trigger or menu-content\n if (!leaveToActiveMenuTrigger && !leaveToMenuContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n if (this._isSubmenuTriggerClick(target)) return;\n if (this.options.closeOnClick && this.menuEl?.contains(target) && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!this.menuEl?.contains(target)) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the menu\n setTimeout(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Menu\n const arrowDownOrEnter =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ENTER.includes(e.key);\n if (arrowDownOrEnter && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (this.menuEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleMenuClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n const li = target.closest('li');\n if (li && this._isSubmenuTriggerClick(target)) {\n e.preventDefault();\n e.stopPropagation();\n this._toggleSubmenu(li);\n return;\n }\n if (typeof this.options.onItemClick === 'function') {\n this.options.onItemClick.call(this, li);\n }\n };\n\n private _isSubmenuTriggerClick(target: HTMLElement) {\n if (!this.menuEl) return false;\n const li = target.closest('li');\n if (!li || !this.menuEl.contains(li)) return false;\n const submenu = li.querySelector(':scope > menu');\n if (!submenu) return false;\n return !submenu.contains(target);\n }\n\n private _setupSubmenus() {\n this.menuEl?.querySelectorAll('li').forEach((li) => {\n if (!li.querySelector(':scope > menu')) return;\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n });\n }\n\n private _toggleSubmenu(li: HTMLElement) {\n const open = !li.classList.contains('open');\n li.parentElement?.querySelectorAll(':scope > li.open').forEach((other) => {\n if (other !== li) {\n other.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(other as HTMLElement, false);\n }\n });\n li.classList.toggle('open', open);\n if (open) this._alignSubmenu(li);\n this._syncSubmenuAria(li, open);\n }\n\n private _syncSubmenuAria(li: HTMLElement, open: boolean) {\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n\n private _handleSubmenuAlign = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li');\n if (li?.querySelector(':scope > menu') && this.menuEl?.contains(li)) {\n this._alignSubmenu(li as HTMLElement);\n }\n };\n\n private _alignSubmenu(li: HTMLElement) {\n const menu = li.querySelector(':scope > menu') as HTMLElement | null;\n if (!menu) return;\n // Flyouts stay `display: block` (visibility/opacity hide them) so the\n // rect is readable without temporarily painting the menu.\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n }\n\n private _closeSubmenus() {\n this.menuEl?.querySelectorAll('li.open').forEach((li) => {\n li.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(li as HTMLElement, false);\n });\n }\n\n private _containingSubmenu(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const submenu = target.closest('li > menu');\n if (submenu instanceof HTMLElement && this.menuEl?.contains(submenu)) return submenu;\n return null;\n }\n\n private _focusedRow(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const li = target.closest('li');\n if (li instanceof HTMLElement && this.menuEl?.contains(li)) return li;\n return null;\n }\n\n _handleMenuKeydown = (e: KeyboardEvent) => {\n const arrowUpOrDown =\n Utils.keys.ARROW_DOWN.includes(e.key) || Utils.keys.ARROW_UP.includes(e.key);\n if (Utils.keys.TAB.includes(e.key)) {\n e.preventDefault();\n this.close();\n }\n else if (Utils.keys.ARROW_RIGHT.includes(e.key) && this.isOpen) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu')) {\n e.preventDefault();\n li.classList.add('open');\n this._alignSubmenu(li);\n this._syncSubmenuAria(li, true);\n const first = li.querySelector(':scope > menu > li') as HTMLElement | null;\n first?.focus();\n }\n } else if (Utils.keys.ARROW_LEFT.includes(e.key) && this.isOpen) {\n const submenu = this._containingSubmenu(e);\n if (submenu) {\n e.preventDefault();\n const parentLi = submenu.parentElement as HTMLElement;\n parentLi.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(parentLi, false);\n parentLi.focus();\n }\n }\n // Navigate down menu list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = Utils.keys.ARROW_DOWN.includes(e.key) ? 1 : -1;\n const list = this._containingSubmenu(e) ?? this.menuEl;\n let newFocusedIndex = this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!list.children[newFocusedIndex] &&\n (<HTMLLIElement>list.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n if (this.focusedIndex >= 0)\n list.children[this.focusedIndex]?.classList.remove('active');\n this.focusedIndex = newFocusedIndex;\n const item = list.children[this.focusedIndex] as HTMLElement;\n item.classList.add('active');\n item.focus({ preventScroll: true });\n }\n }\n // ENTER selects choice on focused item\n else if (Utils.keys.ENTER.includes(e.key) && this.isOpen) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu')) {\n e.preventDefault();\n this._toggleSubmenu(li);\n return;\n }\n const focusedElement = li ?? this.menuEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector('a, button');\n if (!!activatableElement) {\n activatableElement.click();\n } else if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n // Close menu on ESC\n else if (Utils.keys.ESC.includes(e.key) && this.isOpen) {\n e.preventDefault();\n const openSub = this.menuEl.querySelector('li.open');\n if (openSub) {\n openSub.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(openSub as HTMLElement, false);\n (openSub as HTMLElement).focus();\n } else {\n this.close();\n }\n }\n\n // CASE WHEN USER TYPE LTTERS\n const keyText = e.key.toLowerCase();\n const isLetter = /[a-zA-Z0-9-_]/.test(keyText);\n const specialKeys = [\n ...Utils.keys.ARROW_DOWN,\n ...Utils.keys.ARROW_UP,\n ...Utils.keys.ENTER,\n ...Utils.keys.ESC,\n ...Utils.keys.TAB\n ];\n if (isLetter && !specialKeys.includes(e.key)) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const list = this._containingSubmenu(e) ?? this.menuEl;\n const newOptionEl = Array.from(list.querySelectorAll(':scope > li')).find(\n (el) => el.textContent.trim().toLowerCase().indexOf(string) === 0\n );\n if (newOptionEl) {\n this.focusedIndex = [...newOptionEl.parentNode.children].indexOf(newOptionEl);\n this._focusFocusedItem();\n }\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n };\n\n _handleWindowResize = () => {\n // Only re-place the menu if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n _resetMenuStyles() {\n this.menuEl.style.display = '';\n this._resetMenuPositioningStyles();\n this.menuEl.style.transform = '';\n this.menuEl.style.opacity = '';\n }\n\n _resetMenuPositioningStyles() {\n this.menuEl.style.width = '';\n this.menuEl.style.height = '';\n this.menuEl.style.left = '';\n this.menuEl.style.top = '';\n this.menuEl.style.transformOrigin = '';\n }\n\n _moveMenuToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.menuEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);\n return;\n }\n this.el.after(this.menuEl);\n }\n\n _makeMenuFocusable() {\n if (!this.menuEl) return;\n this.menuEl.popover = '';\n // Needed for arrow key navigation\n this.menuEl.tabIndex = 0;\n // Only set tabindex if it hasn't been set by user\n this.menuEl.querySelectorAll(':scope li, :scope > hr').forEach((el) => {\n if (\n el instanceof HTMLHRElement ||\n el.classList.contains('divider') ||\n el.classList.contains('gap') ||\n el.classList.contains('label') ||\n el.classList.contains('optgroup')\n ) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.menuEl.children.length &&\n this.options.autoFocus\n ) {\n (this.menuEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.menuEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getMenuPosition(closestOverflowParent: HTMLElement) {\n // const offsetParentBRect = this.el.offsetParent.getBoundingClientRect();\n const triggerBRect = this.el.getBoundingClientRect();\n const menuBRect = this.menuEl.getBoundingClientRect();\n\n let idealHeight = menuBRect.height;\n let idealWidth = menuBRect.width;\n let idealXPos = triggerBRect.left - menuBRect.left;\n let idealYPos = triggerBRect.top - menuBRect.top;\n\n const menuBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n menuBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - menuBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - menuBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n _animateIn() {\n const duration = this.options.inDuration;\n this.menuEl.style.transition = 'none';\n // from\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n setTimeout(() => {\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n this.menuEl.style.opacity = '1';\n this.menuEl.style.transform = 'scale(1)';\n }, 1);\n setTimeout(() => {\n if (this.options.autoFocus) this.menuEl.focus();\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n setTimeout(() => {\n this._resetMenuStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor = el.parentNode;\n while (ancestor !== null && ancestor !== document) {\n if (condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentElement;\n }\n return null;\n }\n\n _placeMenu() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.menuEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n closestOverflowParent = <HTMLElement>(\n (!!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode)\n );\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveMenu(closestOverflowParent);\n\n // Set width before calculating positionInfo\n const natural = this.menuEl.getBoundingClientRect().width;\n const idealWidth = this.options.constrainWidth\n ? this.el.getBoundingClientRect().width\n : Math.min(280, Math.max(112, natural));\n this.menuEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getMenuPosition(closestOverflowParent);\n this.menuEl.style.left = positionInfo.x + 'px';\n this.menuEl.style.top = positionInfo.y + 'px';\n this.menuEl.style.height = positionInfo.height + 'px';\n this.menuEl.style.width = positionInfo.width + 'px';\n this.menuEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open menu.\n */\n open = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Reset styles\n this._resetMenuStyles();\n this.menuEl.style.display = 'block';\n this._placeMenu();\n this._animateIn();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the menu\n setTimeout(() => this._setupTemporaryEventHandlers(), 0);\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close menu.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.focusedIndex = -1;\n this._closeSubmenus();\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._animateOut();\n this._removeTemporaryEventHandlers();\n if (this.options.autoFocus) {\n this.el.focus();\n }\n this.el.ariaExpanded = 'false';\n };\n\n /**\n * While menu is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetMenuPositioningStyles();\n this._placeMenu();\n }\n };\n}\n", "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 /**\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 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 autocomplete.setMenuItems(\n\n autocomplete.options.data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\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 _mousedown: 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 };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.selectedValues || this.options.selected.map((value) => <AutocompleteData>{ id: value }) || [];\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._mousedown = 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 this._removeEventHandlers();\n this._removeMenu();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\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 this.container.addEventListener('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.addEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.addEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\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('mousedown', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('mouseup', this._handleContainerMouseupAndTouchend);\n\n if (typeof window.ontouchstart !== 'undefined') {\n this.container.removeEventListener('touchstart', this._handleContainerMousedownAndTouchstart);\n this.container.removeEventListener('touchend', this._handleContainerMouseupAndTouchend);\n }\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 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\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('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\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._mousedown) {\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = (e: KeyboardEvent) => {\n if (e.type === 'keyup') Autocomplete._keydown = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Don't capture enter or arrow key usage.\n if (\n Utils.keys.ENTER.includes(e.key) ||\n Utils.keys.ARROW_UP.includes(e.key) ||\n Utils.keys.ARROW_DOWN.includes(e.key)\n )\n return;\n // Check if the input isn't empty\n // Check if focus triggered by tab\n if (this.oldVal !== actualValue && Utils.tabPressed) {\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 // 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 // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (Utils.keys.ENTER.includes(e.key) && 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 (Utils.keys.ARROW_UP.includes(e.key) || Utils.keys.ARROW_DOWN.includes(e.key)) {\n e.preventDefault();\n if (Utils.keys.ARROW_UP.includes(e.key) && this.activeIndex > 0) this.activeIndex--;\n if (Utils.keys.ARROW_DOWN.includes(e.key) && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this.$active?.classList.remove('active');\n if (this.activeIndex >= 0) {\n this.$active = this.container.querySelectorAll('li')[this.activeIndex];\n this.$active?.classList.add('active');\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 _handleContainerMousedownAndTouchstart = () => {\n this._mousedown = true;\n };\n\n _handleContainerMouseupAndTouchend = () => {\n this._mousedown = false;\n };\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this.$active?.classList.remove('active');\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this.isOpen = false;\n this._mousedown = 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.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 = 0;\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.checked = this.selectedValues.some((sel) => sel.id === entry.id);\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.el.parentElement.querySelector('.status-info');\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n }\n\n _updateSelectedInfo() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\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 }\n // Open menu\n if (!this.menu.isOpen) {\n setTimeout(() => {\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 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 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._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 this._triggerChanged();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n // @todo why do we need this as document event listener, shouldn't we apply it to the element wrapper itself?\n document.addEventListener('keydown', Chips._handleChipsKeydown);\n document.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n document.removeEventListener('keydown', Chips._handleChipsKeydown);\n document.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n const clickedClose = (<HTMLElement>e.target).classList.contains('close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this.deleteChip(index);\n this._input.focus();\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n const chipsKeydown = e.target && chips;\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chipsKeydown) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.DELETE.includes(e.key)) {\n e.preventDefault();\n let selectIndex = currChips.chipsData.length;\n if (currChips._selectedChip) {\n const index = currChips._chips.indexOf(currChips._selectedChip);\n currChips.deleteChip(index);\n currChips._selectedChip = null;\n // Make sure selectIndex doesn't go negative\n selectIndex = Math.max(index - 1, 0);\n }\n if (currChips.chipsData.length) currChips.selectChip(selectIndex);\n else currChips._input.focus();\n } else if (Utils.keys.ARROW_LEFT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (Utils.keys.ARROW_RIGHT.includes(e.key)) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) currChips._input.focus();\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._selectedChip = null;\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (Utils.keys.ENTER.includes(e.key)) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || (this.hasAutocomplete && !this.options.autocompleteOnly)) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (Utils.keys.BACKSPACE.includes(e.key) || Utils.keys.ARROW_LEFT.includes(e.key)) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLDivElement {\n if (!chip.id) return;\n const renderedChip = document.createElement('div');\n renderedChip.classList.add('chip');\n renderedChip.innerText = chip.text || <string>chip.id;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n renderedChip.setAttribute('tabindex', '0');\n const closeIcon = document.createElement('i');\n closeIcon.classList.add(this.options.closeIconClass, 'close');\n closeIcon.innerText = 'close';\n renderedChip.appendChild(closeIcon);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (items.length > 0)\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (\n (this.chipsData === undefined || !!this.chipsData.length) &&\n this.options.secondaryPlaceholder\n ) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n this._input.before(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._selectedChip = chip;\n chip.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n if ((<HTMLElement>e.target).classList.contains('close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\nimport { Utils } from '../core/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface RangeOptions extends BaseOptions {}\n\nconst _defaults: RangeOptions = {};\n\nexport class Range extends Component<RangeOptions> {\n declare el: HTMLInputElement;\n private _mousedown: boolean;\n value: HTMLElement;\n thumb: HTMLElement;\n\n constructor(el: HTMLInputElement, options: Partial<RangeOptions>) {\n super(el, options, Range);\n this.el['Expressive_Range'] = this;\n\n this.options = {\n ...Range.defaults,\n ...options\n };\n\n this._mousedown = false;\n this._setupThumb();\n this._sync();\n this._setupEventHandlers();\n }\n\n static get defaults(): RangeOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Range.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<RangeOptions>): Range;\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<RangeOptions>\n ): Range[];\n /**\n * Initializes instances of Range.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<RangeOptions> = {}\n ): Range | Range[] {\n return super.init(els, options, Range);\n }\n\n static getInstance(el: HTMLInputElement): Range {\n return el['Expressive_Range'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeThumb();\n this.el['Expressive_Range'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('change', this._handleRangeChange);\n this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n // Never calls preventDefault, so it does not need to block scrolling.\n this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmove, {\n passive: true\n });\n this.el.addEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.addEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('change', this._handleRangeChange);\n this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstart);\n this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmove);\n this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('touchend', this._handleRangeMouseupTouchend);\n this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleave);\n this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleave);\n }\n\n _handleRangeChange = () => {\n this._clampDual();\n this._sync();\n this.thumb.classList.add('active');\n };\n\n _handleRangeMousedownTouchstart = (e: MouseEvent | TouchEvent) => {\n this._mousedown = true;\n this.el.classList.add('active');\n this._clampDual();\n this._sync();\n if (e.type !== 'input') {\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeInputMousemoveTouchmove = () => {\n if (this._mousedown) {\n this._clampDual();\n this._sync();\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeMouseupTouchend = () => {\n this._mousedown = false;\n this.el.classList.remove('active');\n };\n\n _handleRangeBlurMouseoutTouchleave = () => {\n if (!this._mousedown) {\n this.thumb.classList.remove('active');\n }\n };\n\n _setupThumb() {\n this.thumb = document.createElement('span');\n this.value = document.createElement('span');\n this.thumb.classList.add('thumb');\n this.value.classList.add('value');\n this.thumb.append(this.value);\n this.el.after(this.thumb);\n }\n\n _removeThumb() {\n this.thumb.remove();\n }\n\n _isVertical(): boolean {\n return !!this.el.closest('.vertical');\n }\n\n _host(): HTMLElement | null {\n return this.el.closest('.range, .range-field, label');\n }\n\n _clampDual() {\n const host = this._host();\n const peers = host?.querySelectorAll('input[type=\"range\"]');\n if (!peers || peers.length !== 2) return;\n const start = peers[0] as HTMLInputElement;\n const end = peers[1] as HTMLInputElement;\n if (this.el === start && +start.value > +end.value) start.value = end.value;\n if (this.el === end && +end.value < +start.value) end.value = start.value;\n }\n\n _fraction(el: HTMLInputElement): number {\n const max = parseFloat(el.max) || 100;\n const min = parseFloat(el.min) || 0;\n const val = parseFloat(el.value) || 0;\n return max === min ? 0 : (val - min) / (max - min);\n }\n\n _sync() {\n const percent = this._fraction(this.el);\n const fraction = `${percent * 100}%`;\n\n // Read before writing. This runs on every pointer move during a drag, and\n // setting the custom property first made each of the four offset reads\n // below flush a fresh layout.\n const left = this.el.offsetLeft;\n const top = this.el.offsetTop;\n const width = this.el.offsetWidth;\n const height = this.el.offsetHeight;\n\n this.el.style.setProperty('--md-comp-slider-active-fraction', fraction);\n\n const host = this._host();\n const peers = host?.querySelectorAll('input[type=\"range\"]');\n if (host && peers && peers.length === 2) {\n const nums = Array.from(peers).map((el) => this._fraction(el as HTMLInputElement));\n host.style.setProperty('--md-comp-slider-start-fraction', `${Math.min(...nums) * 100}%`);\n host.style.setProperty('--md-comp-slider-end-fraction', `${Math.max(...nums) * 100}%`);\n }\n if (host?.classList.contains('stops')) {\n const max = parseFloat(this.el.max) || 100;\n const min = parseFloat(this.el.min) || 0;\n const step = parseFloat(this.el.step);\n if (step > 0 && Number.isFinite(step)) {\n const n = Math.round((max - min) / step) + 1;\n host.style.setProperty('--md-comp-slider-stop-count', String(Math.max(2, n)));\n }\n }\n\n this.value.textContent = this.el.value;\n if (this._isVertical()) {\n this.thumb.style.left = `${left + width / 2}px`;\n this.thumb.style.top = `${top + (1 - percent) * height}px`;\n } else {\n this.thumb.style.left = `${left + percent * width}px`;\n this.thumb.style.top = `${top}px`;\n }\n }\n\n /**\n * Initializes every range input in the current document.\n */\n static Init() {\n // Deferred like every other Init(): this ran at import time, so a bundle\n // loaded in <head> found no inputs at all.\n Utils.onDocumentReady(() => {\n Range.init(document.querySelectorAll('input[type=range]') as NodeListOf<HTMLInputElement>, {});\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype ClosedBy = 'any' | 'closerequest' | 'none';\n\n/**\n * Light-dismiss for native `<dialog>` elements.\n *\n * `showModal()` does not close on a backdrop tap. A naive `click` listener\n * on the dialog (where `::backdrop` events retarget) also fires when the\n * user starts a gesture on the dialog and releases on the scrim \u2014 selecting\n * text, missing a button, dragging a thumb. Both ends of the pointer\n * gesture must land outside the dialog's border box.\n *\n * Default is on. Opt out with `closedby=\"none\"` or `closedby=\"closerequest\"`.\n * If the browser already honours `closedby=\"any\"`, we leave that alone.\n */\nexport class Dialogs {\n private static _down: { dialog: HTMLDialogElement; pointerId: number } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', Dialogs._onPointerDown, { passive: true });\n document.addEventListener('pointerup', Dialogs._onPointerUp, { passive: true });\n document.addEventListener('pointercancel', Dialogs._onPointerCancel, { passive: true });\n });\n }\n\n static _onPointerDown(event: PointerEvent) {\n if (!Dialogs._isPrimaryPress(event)) {\n Dialogs._down = null;\n return;\n }\n const dialog = Dialogs._backdropDialog(event);\n if (!dialog || !Dialogs._lightDismissible(dialog) || !Dialogs._outside(event, dialog)) {\n Dialogs._down = null;\n return;\n }\n Dialogs._down = { dialog, pointerId: event.pointerId };\n }\n\n static _onPointerUp(event: PointerEvent) {\n const started = Dialogs._down;\n Dialogs._down = null;\n if (!started || started.pointerId !== event.pointerId) return;\n if (!event.isPrimary) return;\n if (!started.dialog.isConnected || !started.dialog.open) return;\n if (!Dialogs._lightDismissible(started.dialog)) return;\n if (Dialogs._backdropDialog(event) !== started.dialog) return;\n if (Dialogs._outside(event, started.dialog)) {\n started.dialog.close();\n }\n }\n\n static _onPointerCancel() {\n Dialogs._down = null;\n }\n\n /** Backdrop hits retarget to the dialog itself, never a child. */\n private static _backdropDialog(event: Event): HTMLDialogElement | null {\n const target = event.target;\n if (!(target instanceof HTMLDialogElement) || !target.open) return null;\n return target;\n }\n\n private static _outside(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n }\n\n private static _isPrimaryPress(event: PointerEvent): boolean {\n if (!event.isPrimary) return false;\n return event.pointerType !== 'mouse' || event.button === 0;\n }\n\n private static _lightDismissible(dialog: HTMLDialogElement): boolean {\n const value = Dialogs._closedBy(dialog);\n if (value === 'none' || value === 'closerequest') return false;\n // Native closedby=\"any\" already light-dismisses with the same\n // \"both ends outside\" rule. Don't race it.\n if (value === 'any' && 'closedBy' in HTMLDialogElement.prototype) return false;\n return true;\n }\n\n // Read the attribute only. The IDL default for an unset closedby is\n // \"closerequest\" (Escape, no light dismiss) \u2014 treating that as an\n // author opt-out made every dialog undismissable from the scrim.\n private static _closedBy(dialog: HTMLDialogElement): ClosedBy | null {\n const attr = dialog.getAttribute('closedby');\n if (attr === 'any' || attr === 'closerequest' || attr === 'none') return attr;\n return null;\n }\n}\n", "import { Utils } from '../core/utils';\n\n/**\n * Drag-to-dismiss for `dialog.bottom-sheet` / `dialog.bottom`.\n *\n * The handle is the top 48dp of the sheet (or an explicit `.handle`).\n * A downward drag past 96dp, or a flick, closes. Anything else snaps back.\n * Content below the handle scrolls normally. Light-dismiss on the scrim\n * stays with {@link Dialogs}.\n */\nexport class BottomSheets {\n private static _drag: {\n dialog: HTMLDialogElement;\n pointerId: number;\n startY: number;\n lastY: number;\n lastT: number;\n shift: number;\n } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', BottomSheets._onDown, { passive: true });\n document.addEventListener('pointermove', BottomSheets._onMove, { passive: true });\n document.addEventListener('pointerup', BottomSheets._onUp, { passive: true });\n document.addEventListener('pointercancel', BottomSheets._onCancel, { passive: true });\n });\n }\n\n static _onDown(event: PointerEvent) {\n if (!event.isPrimary) return;\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n const dialog = BottomSheets._sheet(event.target);\n if (!dialog?.open) {\n BottomSheets._drag = null;\n return;\n }\n if (!BottomSheets._inHandle(event, dialog)) {\n BottomSheets._drag = null;\n return;\n }\n dialog.style.transition = 'none';\n BottomSheets._drag = {\n dialog,\n pointerId: event.pointerId,\n startY: event.clientY,\n lastY: event.clientY,\n lastT: Date.now(),\n shift: 0\n };\n }\n\n static _onMove(event: PointerEvent) {\n const drag = BottomSheets._drag;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const shift = Math.max(0, event.clientY - drag.startY);\n drag.shift = shift;\n drag.lastY = event.clientY;\n drag.lastT = Date.now();\n drag.dialog.style.setProperty('--md-comp-bottom-sheet-shift', `${shift}px`);\n }\n\n static _onUp(event: PointerEvent) {\n const drag = BottomSheets._drag;\n BottomSheets._drag = null;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const dialog = drag.dialog;\n dialog.style.transition = '';\n const dt = Math.max(1, Date.now() - drag.lastT);\n const velocity = (event.clientY - drag.lastY) / dt;\n const dismiss = drag.shift > 96 || velocity > 0.5;\n if (dismiss && dialog.open) {\n dialog.close();\n }\n dialog.style.setProperty('--md-comp-bottom-sheet-shift', '0px');\n }\n\n static _onCancel() {\n const drag = BottomSheets._drag;\n BottomSheets._drag = null;\n if (!drag) return;\n drag.dialog.style.transition = '';\n drag.dialog.style.setProperty('--md-comp-bottom-sheet-shift', '0px');\n }\n\n private static _sheet(target: EventTarget | null): HTMLDialogElement | null {\n if (!(target instanceof Element)) return null;\n const dialog = target.closest('dialog.bottom-sheet, dialog.bottom');\n return dialog instanceof HTMLDialogElement ? dialog : null;\n }\n\n private static _inHandle(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const target = event.target;\n if (target instanceof Element && target.closest('.handle')) return true;\n const rect = dialog.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.top + 48;\n }\n}\n", "import { Utils } from '../core/utils';\n\n/**\n * Drag-to-dismiss for side sheets (`dialog.side-sheet` / `.right` / `.left`).\n *\n * Grab the header or the inner 24dp edge and drag toward the docked side.\n * Past 96dp, or a flick, closes. Light-dismiss on the scrim stays with\n * {@link Dialogs}.\n */\nexport class SideSheets {\n private static _drag: {\n dialog: HTMLDialogElement;\n pointerId: number;\n startX: number;\n lastX: number;\n lastT: number;\n shift: number;\n startDocked: boolean;\n } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', SideSheets._onDown, { passive: true });\n document.addEventListener('pointermove', SideSheets._onMove, { passive: true });\n document.addEventListener('pointerup', SideSheets._onUp, { passive: true });\n document.addEventListener('pointercancel', SideSheets._onCancel, { passive: true });\n });\n }\n\n static _onDown(event: PointerEvent) {\n if (!event.isPrimary) return;\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n const dialog = SideSheets._sheet(event.target);\n if (!dialog?.open) {\n SideSheets._drag = null;\n return;\n }\n if (!SideSheets._inHandle(event, dialog)) {\n SideSheets._drag = null;\n return;\n }\n dialog.style.transition = 'none';\n SideSheets._drag = {\n dialog,\n pointerId: event.pointerId,\n startX: event.clientX,\n lastX: event.clientX,\n lastT: Date.now(),\n shift: 0,\n startDocked: SideSheets._startDocked(dialog)\n };\n }\n\n static _onMove(event: PointerEvent) {\n const drag = SideSheets._drag;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const delta = event.clientX - drag.startX;\n const shift = drag.startDocked ? Math.min(0, delta) : Math.max(0, delta);\n drag.shift = shift;\n drag.lastX = event.clientX;\n drag.lastT = Date.now();\n drag.dialog.style.setProperty('--md-comp-side-sheet-shift', `${shift}px`);\n }\n\n static _onUp(event: PointerEvent) {\n const drag = SideSheets._drag;\n SideSheets._drag = null;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const dialog = drag.dialog;\n dialog.style.transition = '';\n const dt = Math.max(1, Date.now() - drag.lastT);\n const velocity = (event.clientX - drag.lastX) / dt;\n const dismiss = drag.startDocked\n ? drag.shift < -96 || velocity < -0.5\n : drag.shift > 96 || velocity > 0.5;\n if (dismiss && dialog.open) {\n dialog.close();\n }\n dialog.style.setProperty('--md-comp-side-sheet-shift', '0px');\n }\n\n static _onCancel() {\n const drag = SideSheets._drag;\n SideSheets._drag = null;\n if (!drag) return;\n drag.dialog.style.transition = '';\n drag.dialog.style.setProperty('--md-comp-side-sheet-shift', '0px');\n }\n\n private static _sheet(target: EventTarget | null): HTMLDialogElement | null {\n if (!(target instanceof Element)) return null;\n const dialog = target.closest(\n 'dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dialog.left-sheet'\n );\n return dialog instanceof HTMLDialogElement ? dialog : null;\n }\n\n private static _startDocked(dialog: HTMLDialogElement): boolean {\n return (\n dialog.classList.contains('left') ||\n dialog.classList.contains('left-sheet') ||\n dialog.classList.contains('start')\n );\n }\n\n private static _inHandle(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const target = event.target;\n if (target instanceof Element && target.closest('header')) return true;\n const rect = dialog.getBoundingClientRect();\n if (SideSheets._startDocked(dialog)) {\n return event.clientX >= rect.right - 24 && event.clientX <= rect.right;\n }\n return event.clientX >= rect.left && event.clientX <= rect.left + 24;\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport class Forms {\n /**\n * Checks if the label has validation and apply\n * the correct class and styles\n * @param textfield\n */\n static validateField(textfield: HTMLInputElement) {\n if (!textfield) {\n console.error('No text field element found');\n return;\n }\n\n const hasLength = textfield.getAttribute('data-length') !== null;\n const lenAttr = parseInt(textfield.getAttribute('data-length'));\n const len = textfield.value.length;\n\n if (\n len === 0 &&\n textfield.validity.badInput === false &&\n !textfield.required &&\n textfield.classList.contains('validate')\n ) {\n textfield.classList.remove('invalid');\n } else if (textfield.classList.contains('validate')) {\n // Check for character counter attributes\n if (\n (textfield.validity.valid && hasLength && len <= lenAttr) ||\n (textfield.validity.valid && !hasLength)\n ) {\n textfield.classList.remove('invalid');\n } else {\n textfield.classList.add('invalid');\n }\n }\n }\n\n /**\n * Resizes the given TextArea after updating the\n * value content dynamically.\n * @param e EventTarget\n */\n static textareaAutoResize(e: EventTarget) {\n const textarea = e as HTMLTextAreaElement;\n if (!textarea) return;\n\n // Measure the textarea against itself: collapse it to its natural height,\n // then read the content height back. `.expressive-textarea` is\n // `overflow-y: hidden`, so scrollHeight is the full content height and\n // offsetHeight - clientHeight is exactly the borders (no scrollbar to\n // account for) - which border-box sizing needs added back.\n //\n // This replaces a mirror div that the value was copied into via\n // `innerHTML = innerHTML.replace(...)` - a full serialize and reparse of\n // the text on every keystroke, plus getComputedStyle and seven style\n // writes, run twice per keystroke because it was bound to keydown and\n // keyup both.\n if (!textarea.hasAttribute('original-height')) {\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n }\n const originalHeight = parseInt(textarea.getAttribute('original-height'));\n if (isNaN(originalHeight)) return;\n\n textarea.style.height = 'auto';\n // Three reads after a single write: one layout flush for the whole resize.\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const contentHeight = textarea.scrollHeight + borders;\n textarea.style.height = Math.max(originalHeight, contentHeight) + 'px';\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('change', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n if (target instanceof HTMLInputElement) {\n // The sibling-label loop that used to live here compared\n // `tagName == 'label'` (tagName is uppercase) so it never matched,\n // and no rule in the Sass styles `label.active` anyway - the\n // floating label is driven by CSS, not by a class from here.\n Forms.validateField(target);\n }\n });\n\n document.addEventListener('keyup', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n // Radio and Checkbox focus class\n if (target instanceof HTMLInputElement && ['radio', 'checkbox'].includes(target.type)) {\n // TAB, check if tabbing to radio or checkbox.\n if (Utils.keys.TAB.includes(e.key)) {\n target.classList.add('tabbed');\n target.addEventListener('blur', () => target.classList.remove('tabbed'), {\n once: true\n });\n }\n }\n });\n\n document.querySelectorAll('.expressive-textarea').forEach((textArea: HTMLTextAreaElement) => {\n Forms.InitTextarea(textArea);\n });\n\n // File Input Path\n document\n .querySelectorAll('.file-field input[type=\"file\"]')\n .forEach((fileInput: HTMLInputElement) => {\n Forms.InitFileInputPath(fileInput);\n });\n });\n }\n\n static InitTextarea(textarea: HTMLTextAreaElement) {\n // Save Data in Element\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n Forms.textareaAutoResize(textarea);\n // `input` rather than keydown + keyup: it fires once per actual value\n // change and also covers paste, drag-drop and IME composition, which the\n // key events missed.\n textarea.addEventListener('input', (e) => Forms.textareaAutoResize(e.target));\n }\n\n static InitFileInputPath(fileInput: HTMLInputElement) {\n fileInput.addEventListener('change', () => {\n const fileField = fileInput.closest('.file-field');\n const pathInput = <HTMLInputElement>fileField.querySelector('input.file-path');\n const files = fileInput.files;\n const filenames = [];\n for (let i = 0; i < files.length; i++) {\n filenames.push(files[i].name);\n }\n pathInput.value = filenames.join(', ');\n pathInput.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype RGBColor = {\n r: number;\n g: number;\n b: number;\n};\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class Waves {\n private static _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.pageYOffset - docElem.clientTop,\n left: box.left + window.pageXOffset - docElem.clientLeft\n };\n }\n\n // https://phoenix-dx.com/css-techniques-for-material-ripple-effect/\n\n static renderWaveEffect(\n targetElement: HTMLElement,\n position: Position | null = null,\n color: RGBColor | null = null\n ): void {\n const isCentered = position === null;\n const duration = 500;\n let animationFrame: number, animationStart: number;\n const animationStep = function (timestamp: number) {\n if (!animationStart) {\n animationStart = timestamp;\n }\n const frame = timestamp - animationStart;\n if (frame < duration) {\n const easing = (frame / duration) * (2 - frame / duration);\n const circle = isCentered\n ? 'circle at 50% 50%'\n : `circle at ${position.x}px ${position.y}px`;\n const waveColor = `rgba(${color?.r || 0}, ${color?.g || 0}, ${color?.b || 0}, ${0.3 * (1 - easing)})`;\n const stop = 90 * easing + '%';\n targetElement.style.backgroundImage =\n 'radial-gradient(' +\n circle +\n ', ' +\n waveColor +\n ' ' +\n stop +\n ', transparent ' +\n stop +\n ')';\n animationFrame = window.requestAnimationFrame(animationStep);\n } else {\n targetElement.style.backgroundImage = 'none';\n window.cancelAnimationFrame(animationFrame);\n }\n };\n animationFrame = window.requestAnimationFrame(animationStep);\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.body.addEventListener('click', (e) => {\n const trigger = <HTMLElement>e.target;\n const el = <HTMLElement>trigger.closest('.waves-effect');\n if (el && el.contains(trigger)) {\n const isCircular = el.classList.contains('waves-circle');\n const offset = Waves._offset(el); // one rect, not one per axis\n const x = e.pageX - offset.left;\n const y = e.pageY - offset.top;\n\n let color = null;\n if (el.classList.contains('waves-light')) color = { r: 255, g: 255, b: 255 };\n\n Waves.renderWaveEffect(el, isCircular ? null : { x, y }, color);\n }\n });\n });\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement, Openable } from \"../core/component\";\nimport { Utils } from '../core/utils';\n\nexport interface FloatingActionButtonOptions extends BaseOptions {\n /**\n * Direction FAB menu opens.\n * @default \"top\"\n */\n direction: 'top' | 'right' | 'bottom' | 'left';\n /**\n * true: FAB menu appears on hover (CSS, when the pointer can hover).\n * false: FAB menu toggles on click. `.click-to-toggle` is the markup switch.\n * @default true\n */\n hoverEnabled: boolean;\n /**\n * Expand the FAB into a toolbar on click. Prefer a hover or click menu.\n * `.toolbar` on the element is the markup switch.\n * @default false\n */\n toolbarEnabled: boolean;\n}\n\nconst _defaults: FloatingActionButtonOptions = {\n direction: 'top',\n hoverEnabled: true,\n toolbarEnabled: false\n};\n\n/**\n * Speed dial around a FAB. Open/close is the `.active` class; motion is\n * CSS. Hover is CSS (`:hover` when the pointer can hover). This class\n * toggles the class, wires keyboard / click-outside, and stamps direction.\n */\nexport class FloatingActionButton\n extends Component<FloatingActionButtonOptions>\n implements Openable\n{\n isOpen: boolean;\n\n private _anchor: HTMLElement | null;\n private _menu: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<FloatingActionButtonOptions>) {\n super(el, options, FloatingActionButton);\n this.el['Expressive_FloatingActionButton'] = this;\n\n const fromMarkup = this._directionFromClass();\n const toolbar = el.classList.contains('toolbar') || options.toolbarEnabled === true;\n const clickToToggle =\n el.classList.contains('click-to-toggle') || options.hoverEnabled === false;\n\n this.options = {\n ...FloatingActionButton.defaults,\n ...options,\n direction: options.direction ?? fromMarkup ?? FloatingActionButton.defaults.direction,\n hoverEnabled: !clickToToggle,\n toolbarEnabled: toolbar\n };\n\n this.isOpen = false;\n this._anchor = this.el.querySelector(':scope > a, :scope > button');\n this._menu = this.el.querySelector('ul, menu');\n\n this.el.classList.add(`direction-${this.options.direction}`);\n if (clickToToggle) this.el.classList.add('click-to-toggle');\n if (toolbar) this.el.classList.add('toolbar');\n\n if (this._anchor) {\n this._anchor.setAttribute('aria-haspopup', 'menu');\n this._anchor.setAttribute('aria-expanded', 'false');\n if (\n this._anchor instanceof HTMLAnchorElement &&\n !this._anchor.hasAttribute('href') &&\n this._anchor.tabIndex < 0\n ) {\n this._anchor.tabIndex = 0;\n }\n }\n if (this._menu) this._menu.setAttribute('role', 'menu');\n\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(\n el: HTMLElement,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<FloatingActionButtonOptions> = {}\n ): FloatingActionButton | FloatingActionButton[] {\n return super.init(els, options, FloatingActionButton);\n }\n\n static getInstance(el: HTMLElement): FloatingActionButton {\n return el['Expressive_FloatingActionButton'];\n }\n\n destroy() {\n this.close();\n this._removeEventHandlers();\n this.el['Expressive_FloatingActionButton'] = undefined;\n }\n\n /**\n * Open FAB.\n */\n open = (): void => {\n if (this.isOpen) return;\n this.isOpen = true;\n this.el.classList.add('active');\n this._anchor?.setAttribute('aria-expanded', 'true');\n // The trigger click is stopPropagation'd, so it is not also an outside click.\n document.addEventListener('click', this._handleDocumentClick);\n document.addEventListener('keydown', this._handleDocumentKeydown);\n };\n\n /**\n * Close FAB.\n */\n close = (): void => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.el.classList.remove('active');\n this._anchor?.setAttribute('aria-expanded', 'false');\n document.removeEventListener('click', this._handleDocumentClick);\n document.removeEventListener('keydown', this._handleDocumentKeydown);\n };\n\n private _directionFromClass(): FloatingActionButtonOptions['direction'] | null {\n const match = [...this.el.classList].find((c) => c.startsWith('direction-'));\n const value = match?.slice('direction-'.length);\n if (value === 'top' || value === 'right' || value === 'bottom' || value === 'left') {\n return value;\n }\n return null;\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleFABClick);\n if (this._anchor instanceof HTMLAnchorElement && !this._anchor.hasAttribute('href')) {\n this._anchor.addEventListener('keydown', this._handleAnchorKeydown);\n }\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleFABClick);\n this._anchor?.removeEventListener('keydown', this._handleAnchorKeydown);\n }\n\n private _handleFABClick = (e: MouseEvent) => {\n e.stopPropagation();\n this._toggle();\n };\n\n private _handleAnchorKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key) || e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n };\n\n private _handleDocumentKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ESC.includes(e.key)) this.close();\n };\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node) || this.el.contains(target)) return;\n this.close();\n };\n\n private _toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface CarouselOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds (coverflow). Snap mode uses CSS.\n * @default 200\n */\n duration: number;\n /**\n * Perspective zoom. If 0, all items are the same size. Coverflow only.\n * @default -100\n */\n dist: number;\n /**\n * Extra spacing on the center item. Coverflow only.\n * @default 0\n */\n shift: number;\n /**\n * Padding between items that are not in the center. Coverflow only.\n * @default 0\n */\n padding: number;\n /**\n * How many items stay visible. Coverflow only.\n * @default 5\n */\n numVisible: number;\n /**\n * Linear snap track instead of 3D coverflow.\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 at the first and last items instead of wrapping. Coverflow only.\n * Snap tracks do not wrap.\n * @default false\n */\n noWrap: boolean;\n /**\n * Called when a new item becomes the center.\n * @default null\n */\n onCycleTo: (current: Element, dragged: boolean) => void;\n}\n\nconst _defaults: CarouselOptions = {\n duration: 200,\n dist: -100,\n shift: 0,\n padding: 0,\n numVisible: 5,\n fullWidth: false,\n indicators: false,\n noWrap: false,\n onCycleTo: null\n};\n\nexport class Carousel extends Component<CarouselOptions> {\n hasMultipleSlides: boolean;\n showIndicators: boolean;\n noWrap: boolean;\n pressed: boolean;\n dragged: boolean;\n offset: number;\n target: number;\n images: HTMLElement[];\n itemWidth: number;\n itemHeight: number;\n dim: number;\n _indicators: HTMLUListElement | HTMLElement;\n count: number;\n verticalDragged: boolean;\n reference: number;\n referenceY: number;\n velocity: number;\n frame: number;\n timestamp: number;\n amplitude: number;\n center: number = 0;\n imageHeight: number;\n scrollingTimeout: ReturnType<typeof setTimeout>;\n oneTimeCallback: (current: Element, dragged: boolean) => void | null;\n\n private _flat: boolean;\n private _ownIndicators: boolean = false;\n private _trackEl: HTMLElement | null = null;\n private _ignoreScroll: boolean = false;\n private _trackRaf: number = null;\n private _started: boolean = false;\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\n this._flat =\n this.options.fullWidth ||\n this.el.classList.contains('flat');\n if (this._flat) {\n this.el.classList.add('flat');\n this.options.fullWidth = true;\n this.options.dist = 0;\n }\n\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n this.options.duration = 1;\n if (!this._flat) this.options.dist = 0;\n }\n\n this.pressed = false;\n this.dragged = false;\n this.offset = this.target = 0;\n this.images = this._collectItems();\n if (!this.images.length) {\n console.error('Carousel: no .carousel-item elements to show');\n return;\n }\n\n this.hasMultipleSlides = this.images.length > 1;\n this.showIndicators = this.options.indicators && this.hasMultipleSlides;\n this.noWrap = this.options.noWrap || !this.hasMultipleSlides || this._flat;\n this.count = this.images.length;\n this.options.numVisible = Math.min(this.count, this.options.numVisible);\n\n this.images.forEach((item) => item.classList.add('carousel-item'));\n if (this._flat) this._wrapTrack();\n\n const firstItem = this.images[0];\n this.itemWidth = firstItem.clientWidth || this.el.clientWidth || 1;\n this.itemHeight = firstItem.clientHeight || this.el.clientHeight || 1;\n this.dim = this.itemWidth * 2 + this.options.padding || 1;\n\n if (this.showIndicators) this._setupIndicators();\n\n this.el.tabIndex = this.el.tabIndex >= 0 ? this.el.tabIndex : 0;\n this.el.setAttribute('aria-roledescription', 'carousel');\n\n this._setupEventHandlers();\n this._started = true;\n\n if (this._flat) {\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._scrollToIndex(start, false);\n } else {\n this._scroll(this.offset);\n }\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 _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', 'Slides');\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', `Slide ${i + 1}`);\n this._indicators.appendChild(button);\n });\n\n if (this._ownIndicators) this.el.appendChild(this._indicators);\n if (this._flat) {\n this.el.querySelector('.carousel-fixed-item')?.classList.add('with-indicators');\n }\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('keydown', this._handleKeydown);\n if (this.showIndicators && this._indicators) {\n this._indicators.addEventListener('click', this._handleIndicatorClick);\n }\n Carousel._live.add(this);\n if (!Carousel._resizeListening) {\n window.addEventListener('resize', Carousel._onResize, { passive: true });\n Carousel._resizeListening = true;\n }\n\n if (this._flat) {\n this._scroller.addEventListener('scroll', this._handleFlatScroll, { passive: true });\n return;\n }\n\n this.el.addEventListener('pointerdown', this._handleCarouselTap);\n this.el.addEventListener('pointermove', this._handleCarouselDrag);\n this.el.addEventListener('pointerup', this._handleCarouselRelease);\n this.el.addEventListener('pointercancel', this._handleCarouselRelease);\n this.el.addEventListener('click', this._handleCarouselClick);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('keydown', this._handleKeydown);\n if (this._indicators) {\n this._indicators.removeEventListener('click', this._handleIndicatorClick);\n }\n this._scroller.removeEventListener('scroll', this._handleFlatScroll);\n this.el.removeEventListener('pointerdown', this._handleCarouselTap);\n this.el.removeEventListener('pointermove', this._handleCarouselDrag);\n this.el.removeEventListener('pointerup', this._handleCarouselRelease);\n this.el.removeEventListener('pointercancel', this._handleCarouselRelease);\n this.el.removeEventListener('click', this._handleCarouselClick);\n\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 private _teardown() {\n this._removeEventHandlers();\n if (this._trackRaf !== null) cancelAnimationFrame(this._trackRaf);\n window.clearTimeout(this.scrollingTimeout);\n if (this._ownIndicators) this._indicators?.remove();\n this._unwrapTrack();\n this.images.forEach((el) => {\n el.style.transform = '';\n el.style.zIndex = '';\n el.style.opacity = '';\n el.style.visibility = '';\n });\n }\n\n _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n _handleCarouselTap = (e: PointerEvent) => {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n if (e.target instanceof HTMLElement && e.target.tagName === 'IMG') {\n e.preventDefault();\n }\n this.pressed = true;\n this.dragged = false;\n this.verticalDragged = false;\n this.reference = e.clientX;\n this.referenceY = e.clientY;\n this.velocity = this.amplitude = 0;\n this.frame = this.offset;\n this.timestamp = Date.now();\n try {\n this.el.setPointerCapture(e.pointerId);\n } catch {\n // capture is optional\n }\n if (this._trackRaf !== null) cancelAnimationFrame(this._trackRaf);\n const loop = () => {\n this._track();\n if (this.pressed) this._trackRaf = requestAnimationFrame(loop);\n else this._trackRaf = null;\n };\n this._trackRaf = requestAnimationFrame(loop);\n };\n\n _handleCarouselDrag = (e: PointerEvent) => {\n if (!this.pressed) return;\n const delta = this.reference - e.clientX;\n const deltaY = Math.abs(this.referenceY - e.clientY);\n if (deltaY < 30 && !this.verticalDragged) {\n if (delta > 2 || delta < -2) {\n this.dragged = true;\n this.reference = e.clientX;\n this._scroll(this.offset + delta);\n }\n } else if (this.dragged) {\n e.preventDefault();\n } else {\n this.verticalDragged = true;\n }\n if (this.dragged) e.preventDefault();\n };\n\n _handleCarouselRelease = (e: PointerEvent) => {\n if (!this.pressed) return;\n this.pressed = false;\n if (this._trackRaf !== null) {\n cancelAnimationFrame(this._trackRaf);\n this._trackRaf = null;\n }\n try {\n this.el.releasePointerCapture(e.pointerId);\n } catch {\n // already released\n }\n this.target = this.offset;\n if (this.velocity > 10 || this.velocity < -10) {\n this.amplitude = 0.9 * this.velocity;\n this.target = this.offset + this.amplitude;\n }\n this.target = Math.round(this.target / this.dim) * this.dim;\n if (this.noWrap) {\n if (this.target >= this.dim * (this.count - 1)) {\n this.target = this.dim * (this.count - 1);\n } else if (this.target < 0) {\n this.target = 0;\n }\n }\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n if (this.dragged) e.preventDefault();\n };\n\n _handleCarouselClick = (e: MouseEvent) => {\n if (this.dragged) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n const clickedElem = (e.target as HTMLElement).closest('.carousel-item');\n if (!clickedElem || !this.el.contains(clickedElem)) return;\n const clickedIndex = this.images.indexOf(clickedElem as HTMLElement);\n const diff = this._wrap(this.center) - clickedIndex;\n if (diff !== 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n if (clickedIndex < 0) {\n if (e.clientX - (e.target as HTMLElement).getBoundingClientRect().left > this.el.clientWidth / 2) {\n this.next();\n } else {\n this.prev();\n }\n } else {\n this._cycleTo(clickedIndex);\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.closest('input, textarea, select, [contenteditable=\"true\"]')) return;\n if (Utils.keys.ARROW_RIGHT.includes(e.key)) {\n e.preventDefault();\n this.next();\n } else if (Utils.keys.ARROW_LEFT.includes(e.key)) {\n e.preventDefault();\n this.prev();\n }\n };\n\n _handleFlatScroll = () => {\n if (this._ignoreScroll) return;\n const index = this._nearestIndex();\n if (index !== this.center) this._syncActive(index, this.dragged);\n };\n\n _handleResize = () => {\n if (!this.images.length) return;\n if (this._flat) {\n this._scrollToIndex(this.center, false);\n return;\n }\n if (this.options.fullWidth) {\n const firstItem = this.images[0];\n if (!firstItem) return;\n this.itemWidth = firstItem.clientWidth;\n this.dim = this.itemWidth * 2 + this.options.padding;\n this.offset = this.center * 2 * this.itemWidth;\n this.target = this.offset;\n } else {\n this._scroll();\n }\n };\n\n _xpos(e: PointerEvent | MouseEvent | TouchEvent) {\n if ('clientX' in e) return e.clientX;\n return 0;\n }\n\n _ypos(e: PointerEvent | MouseEvent | TouchEvent) {\n if ('clientY' in e) return e.clientY;\n return 0;\n }\n\n _wrap(x: number) {\n return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + (x % this.count)) : x;\n }\n\n _track = () => {\n const now = Date.now();\n const elapsed = now - this.timestamp;\n const delta = this.offset - this.frame;\n const v = (1000 * delta) / (1 + elapsed);\n this.timestamp = now;\n this.frame = this.offset;\n this.velocity = 0.8 * v + 0.2 * this.velocity;\n };\n\n _autoScroll = () => {\n if (!this.amplitude) return;\n const elapsed = Date.now() - this.timestamp;\n const delta = this.amplitude * Math.exp(-elapsed / this.options.duration);\n if (delta > 2 || delta < -2) {\n this._scroll(this.target - delta);\n requestAnimationFrame(this._autoScroll);\n } else {\n this._scroll(this.target);\n }\n };\n\n _scroll(x: number = 0) {\n if (!this.el.classList.contains('scrolling')) {\n this.el.classList.add('scrolling');\n }\n window.clearTimeout(this.scrollingTimeout);\n this.scrollingTimeout = setTimeout(() => {\n this.el.classList.remove('scrolling');\n }, this.options.duration);\n\n this.offset = typeof x === 'number' ? x : this.offset;\n this.center = Math.floor((this.offset + this.dim / 2) / this.dim);\n\n const half = this.count >> 1;\n const delta = this.offset - this.center * this.dim;\n const dir = delta < 0 ? 1 : -1;\n const tween = (-dir * delta * 2) / this.dim;\n const lastCenter = this.center;\n const numVisibleOffset = 1 / this.options.numVisible;\n\n let alignment: string;\n let centerTweenedOpacity: number;\n if (this.options.fullWidth) {\n alignment = 'translateX(0)';\n centerTweenedOpacity = 1;\n } else {\n alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) ';\n alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)';\n centerTweenedOpacity = 1 - numVisibleOffset * tween;\n }\n\n this._paintIndicators(this.center);\n\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n const el = this.images[this._wrap(this.center)];\n if (el && !el.classList.contains('active')) {\n this.el.querySelector('.carousel-item.active')?.classList.remove('active');\n el.classList.add('active');\n }\n }\n\n for (let i = 1; i <= half; ++i) {\n let zTranslation: number;\n let tweenedOpacity: number;\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 + tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir);\n }\n if (!this.noWrap || this.center + i < this.count) {\n const el = this.images[this._wrap(this.center + i)];\n const transformString = `${alignment} translateX(${\n this.options.shift + (this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n if (this.options.fullWidth) {\n zTranslation = this.options.dist;\n tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1;\n } else {\n zTranslation = this.options.dist * (i * 2 - tween * dir);\n tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir);\n }\n if (!this.noWrap || this.center - i >= 0) {\n const el = this.images[this._wrap(this.center - i)];\n const transformString = `${alignment} translateX(${\n -this.options.shift + (-this.dim * i - delta) / 2\n }px) translateZ(${zTranslation}px)`;\n this._updateItemStyle(el, tweenedOpacity, -i, transformString);\n }\n }\n\n if (!this.noWrap || (this.center >= 0 && this.center < this.count)) {\n const el = this.images[this._wrap(this.center)];\n const transformString = `${alignment} translateX(${-delta / 2}px) translateX(${\n dir * this.options.shift * tween\n }px) translateZ(${this.options.dist * tween}px)`;\n this._updateItemStyle(el, centerTweenedOpacity, 0, transformString);\n }\n\n const currItem = this.images[this._wrap(this.center)];\n this._syncA11y(this._wrap(this.center));\n\n if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') {\n this.options.onCycleTo.call(this, currItem, this.dragged);\n }\n if (typeof this.oneTimeCallback === 'function') {\n this.oneTimeCallback.call(this, currItem, this.dragged);\n this.oneTimeCallback = null;\n }\n }\n\n _updateItemStyle(el: HTMLElement, opacity: number, zIndex: number, transform: string) {\n if (!el) return;\n el.style.transform = transform;\n el.style.zIndex = zIndex.toString();\n el.style.opacity = opacity.toString();\n el.style.visibility = 'visible';\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 _syncA11y(index: number) {\n this.images.forEach((el, i) => {\n if (i === index) el.removeAttribute('aria-hidden');\n else el.setAttribute('aria-hidden', 'true');\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._syncA11y(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 _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 left = this._scroller.scrollLeft;\n let best = 0;\n let bestDist = Infinity;\n this.images.forEach((el, i) => {\n const dist = Math.abs(el.offsetLeft - left);\n if (dist < bestDist) {\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 const left = el.offsetLeft;\n if (Math.abs(this._scroller.scrollLeft - left) < 1) {\n this._syncActive(n, false);\n return;\n }\n this._ignoreScroll = true;\n this._scroller.scrollTo({ left, behavior: smooth ? 'smooth' : 'auto' });\n const done = () => {\n this._ignoreScroll = false;\n };\n this._scroller.addEventListener('scrollend', done, { once: true });\n window.setTimeout(done, this.options.duration + 350);\n }\n\n _cycleTo(n: number, callback: CarouselOptions['onCycleTo'] = null) {\n if (this._flat) {\n if (typeof callback === 'function') this.oneTimeCallback = callback;\n this._syncActive(n, false);\n this._scrollToIndex(n);\n return;\n }\n let diff = (this.center % this.count) - n;\n if (!this.noWrap) {\n if (diff < 0) {\n if (Math.abs(diff + this.count) < Math.abs(diff)) {\n diff += this.count;\n }\n } else if (diff > 0) {\n if (Math.abs(diff - this.count) < diff) {\n diff -= this.count;\n }\n }\n }\n this.target = this.dim * Math.round(this.offset / this.dim);\n if (diff < 0) {\n this.target += this.dim * Math.abs(diff);\n } else if (diff > 0) {\n this.target -= this.dim * diff;\n }\n if (typeof callback === 'function') {\n this.oneTimeCallback = callback;\n }\n if (this.offset !== this.target) {\n this.amplitude = this.target - this.offset;\n this.timestamp = Date.now();\n requestAnimationFrame(this._autoScroll);\n }\n }\n\n next(n: number = 1) {\n if (n === undefined || isNaN(n)) n = 1;\n let index = this.center + n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\n this._cycleTo(index);\n }\n\n prev(n: number = 1) {\n if (n === undefined || isNaN(n)) n = 1;\n let index = this.center - n;\n if (index >= this.count || index < 0) {\n if (this.noWrap) return;\n index = this._wrap(index);\n }\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) {\n if (this.noWrap) return;\n n = this._wrap(n);\n }\n this._cycleTo(n, callback);\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | InitElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | InitElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = (this.el as HTMLInputElement).value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabelFor: string | null;\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._originalLabelFor = null;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | InitElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | InitElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._rebuildOptions();\n this._setValueToInput();\n this._setSelectedStates();\n }\n\n _setupEventHandlers() {\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange);\n this.input.addEventListener('click', this._handleInputClick);\n this.menuEl.addEventListener('focusin', this._handleOptionFocus);\n }\n\n _removeEventHandlers() {\n this._removeOptionHandlers();\n this.el.removeEventListener('change', this._handleSelectChange);\n this.input?.removeEventListener('click', this._handleInputClick);\n this.menuEl?.removeEventListener('focusin', this._handleOptionFocus);\n }\n\n private _setupOptionHandlers() {\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n private _removeOptionHandlers() {\n this.menuEl?.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li?.id) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value) return;\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n this._toggleEntryFromArray(value);\n } else {\n this._deselectAll();\n this._selectValue(value);\n }\n this._setValueToInput();\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n if (!this.isMultiple) this.menu?.close();\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.disabled) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement('menu');\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('popover', 'auto');\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this.labelEl) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n this.input.classList.add('menu-trigger');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n if (this.el.disabled) this.input.disabled = true;\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n if (this.labelEl) {\n this._originalLabelFor = this.labelEl.htmlFor;\n this.labelEl.htmlFor = this.input.id;\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _initMenu() {\n if (this.el.disabled) return;\n const menuOptions = { ...this.options.menuOptions };\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (selectedOption) {\n Utils.keyDown = true;\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n Utils.keyDown = false;\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n this.input.ariaExpanded = 'true';\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.menuEl.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._addOptionToValues(child, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._removeOptionHandlers();\n this.menuEl.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n if (this.labelEl && this._originalLabelFor !== null) {\n this.labelEl.htmlFor = this._originalLabelFor;\n }\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n if (realOption.disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !realOption.disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (iconUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = iconUrl;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this.menuEl.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n const realValues = this.getSelectedValues();\n return realValues.some((realValue) => realValue === value.el.value);\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n const selectedRealOptions = this._getSelectedOptions();\n const selectedOptionPairs = this._values.filter(\n (value) => selectedRealOptions.indexOf(value.el) >= 0\n );\n const notDisabledOptionPairs = selectedOptionPairs.filter((op) => !op.el.disabled);\n // textContent, not innerText: innerText is layout-dependent, so reading it\n // once per selected option forced a reflow each time.\n const texts = notDisabledOptionPairs.map((value) =>\n value.optionEl.querySelector('span').textContent.trim()\n );\n if (texts.length === 0) {\n const firstDisabledOption = <HTMLOptionElement>this.el.querySelector('option:disabled');\n if (firstDisabledOption && firstDisabledOption.value === '') {\n this.input.value = firstDisabledOption.textContent;\n return;\n }\n }\n this.input.value = texts.join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.menuEl, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((row) => row.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport interface DockedDisplayPluginOptions {\n /**\n * Margin between element and docked container\n */\n margin: number,\n /**\n * Transition movement\n */\n transition: number,\n /**\n * Transition duration\n */\n duration: number,\n /**\n * The alignment of the docked container\n */\n align: string\n}\n\nconst _defaults: DockedDisplayPluginOptions = {\n margin: 5,\n transition: 10,\n duration: 250,\n align: 'left'\n}\n\nexport class DockedDisplayPlugin {\n private readonly el: HTMLElement;\n private readonly container: HTMLDivElement;\n private options: Partial<DockedDisplayPluginOptions>;\n private visible: boolean;\n\n constructor(el: HTMLElement, container: HTMLElement, options: Partial<DockedDisplayPluginOptions>) {\n this.el = el;\n this.options = {\n ..._defaults,\n ...options\n };\n\n this.container = document.createElement('div');\n this.container.classList.add('display-docked');\n this.container.append(container);\n el.parentElement.append(this.container);\n\n document.addEventListener('click', this._handleDocumentClick);\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n if (this.visible && !(this.el === <HTMLElement>e.target) && !((<HTMLElement>e.target).closest('.display-docked'))) {\n this.hide();\n }\n };\n\n /**\n * Tears the plugin down. The document listener holds a reference to this\n * instance - and through it the whole picker subtree - so the owning\n * component must call this from its own destroy().\n */\n destroy = () => {\n document.removeEventListener('click', this._handleDocumentClick);\n this.container.remove();\n };\n\n /**\n * Initializes instance of DockedDisplayPlugin\n * @param el HTMLElement to position to\n * @param container HTMLElement to be positioned\n * @param options Plugin options\n */\n static init(el: HTMLElement, container: HTMLElement, options?: Partial<DockedDisplayPluginOptions>): DockedDisplayPlugin {\n return new DockedDisplayPlugin(el, container, options);\n }\n\n show = () => {\n if (this.visible) return;\n this.visible = true;\n const coordinates = Utils._setAbsolutePosition(this.el, this.container, 'bottom', this.options.margin, this.options.transition, this.options.align);\n\n // @todo move to Util? -> duplicate code fragment with tooltip\n // easeOutCubic\n this.container.style.visibility = 'visible';\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(${coordinates.x}px) translateY(${coordinates.y}px)`;\n this.container.style.opacity = (1).toString();\n }, 1);\n };\n\n hide = () => {\n if (!this.visible) return;\n this.visible = false;\n // @todo move to Util? -> duplicate code fragment with tooltip\n this.container.removeAttribute('style');\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(0px) translateY(0px)`;\n this.container.style.opacity = '0';\n }, 1);\n };\n}\n", "import { Utils } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions, InitElements, InitElement } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default false\n */\n autoSubmit: true;\n /**\n * Internationalization options.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n startRange?: Date;\n /** Field used for internal calculations DO NOT CHANGE IT */\n endRange?: Date;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n startRange: null,\n endRange: null,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: '\u2039',\n nextMonth: '\u203A',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n\n /** CLEAR button instance. */\n // clearBtn: HTMLElement;\n /** DONE button instance */\n /*doneBtn: HTMLElement;\n cancelBtn: HTMLElement;*/\n\n containerEl: HTMLElement;\n yearTextEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n formats: object;\n calendars: [{ month: number; year: number }];\n private _y: number;\n private _m: number;\n private displayPlugin: DockedDisplayPlugin;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n super(el, options, Datepicker);\n this.el['Expressive_Datepicker'] = this;\n\n this.options = {\n ...Datepicker.defaults,\n ...options\n };\n\n // make sure i18n defaults are not lost when only few i18n option properties are passed\n if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n this.options.i18n = { ...Datepicker.defaults.i18n, ...options.i18n };\n }\n\n // Remove time component from minDate and maxDate options\n if (this.options.minDate) this.options.minDate.setHours(0, 0, 0, 0);\n if (this.options.maxDate) this.options.maxDate.setHours(0, 0, 0, 0);\n\n this.id = Utils.guid();\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n if (!this.options.defaultDate) {\n this.options.defaultDate = new Date(Date.parse(this.el.value));\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [];\n this.dateEls.push(el);\n }\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Datepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<DatepickerOptions>): Datepicker;\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<DatepickerOptions>\n ): Datepicker[];\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<DatepickerOptions> = {}\n ): Datepicker | Datepicker[] {\n return super.init(els, options, Datepicker);\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n static _isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _getDaysInMonth(year, month) {\n return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][\n month\n ];\n }\n\n static _isLeapYear(year) {\n // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static _compareWithinRange(day: Date, date: Date, dateEnd: Date) {\n return day.getTime() > date.getTime() && day.getTime() < dateEnd.getTime();\n }\n\n static _comparePastDate(a: Date, b: Date) {\n return a.getTime() < b.getTime();\n }\n\n static getInstance(el: HTMLElement): Datepicker {\n return el['Expressive_Datepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this.el['Expressive_Datepicker'] = undefined;\n }\n\n destroySelects() {\n const oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n if (oldYearSelect) {\n FormSelect.getInstance(oldYearSelect as HTMLElement).destroy();\n }\n const oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n if (oldMonthSelect) {\n FormSelect.getInstance(oldMonthSelect as HTMLElement).destroy();\n }\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n /*if (this.options.showClearBtn) {\n this.clearBtn.style.visibility = '';\n this.clearBtn.innerText = this.options.i18n.clear;\n }\n this.doneBtn.innerText = this.options.i18n.done;\n this.cancelBtn.innerText = this.options.i18n.cancel;*/\n Utils.createButton(this.footer, this.options.i18n.clear, ['datepicker-clear'], this.options.showClearBtn, this._handleClearClick);\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(this.footer, this.options.i18n.done, this.options.i18n.cancel, this._confirm, this._cancel);\n }\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n //this.containerEl.before(this.el);\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (this.formats[label] ? this.formats[label](date) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n const date = new Date(Date.parse(el.value));\n this.setDate(date, false, el == this.endDateEl, true);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n Datepicker._setToStartOfDay(selectedDate);\n this.gotoDate(selectedDate);\n if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, selectedDate);\n }\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = new Date(Date.parse(date));\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else if (isEndDate) {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const selectedDate = this.dates?.find((item) => {\n return item.getTime() === date.getTime() ? item : false;\n });\n if (!selectedDate) {\n this.dates.push(date);\n } else {\n this.dates.splice(this.dates.indexOf(selectedDate), 1);\n }\n this.dates.sort((a: Date, b: Date) => (a.getTime() < b.getTime() ? -1 : 0));\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', this.toString(date));\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const dateElsArr = Array.from(this.dateEls).filter((el, index) => {\n if (index > this.dates.length - 1) return el;\n });\n dateElsArr.forEach((el) => {\n el.remove();\n });\n this.dates.forEach((date: Date, index: number) => {\n if (Array.from(this.dateEls)[index]) {\n this.setInputValue(this.dateEls[index], date);\n return;\n }\n\n const dateEl = this.createDateInput();\n this.setInputValue(dateEl, date);\n this.dateEls.push(dateEl);\n });\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (el.type == 'date') {\n this.setDataDate(el, date);\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this.el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // this.yearTextEl.innerHTML = displayDate.getFullYear().toString();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n days = Datepicker._getDaysInMonth(year, month),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n let cells = days + before,\n after = cells;\n while (after > 7) {\n after -= 7;\n }\n cells += 7 - after;\n let isWeekSelected = false;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isStartRange =\n this.options.startRange && Datepicker._compareDates(this.options.startRange, day),\n isEndRange = this.options.endRange && Datepicker._compareDates(this.options.endRange, day),\n isInRange =\n this.options.startRange &&\n this.options.endRange &&\n this.options.startRange < day &&\n day < this.options.endRange,\n isDisabled =\n (this.options.minDate && day < this.options.minDate) ||\n (this.options.maxDate && day > this.options.maxDate) ||\n (this.options.disableWeekends && Datepicker._isWeekend(day)) ||\n (this.options.disableDayFn && this.options.disableDayFn(day)),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n Datepicker._isDate(this.endDate) &&\n Datepicker._compareWithinRange(day, this.date, this.endDate);\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n isStartRange: isStartRange,\n isEndRange: isEndRange,\n isInRange: isInRange,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, isWeekSelected));\n row = [];\n r = 0;\n isWeekSelected = false;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isInRange: 'is-inrange',\n isStartRange: 'is-startrange',\n isEndRange: 'is-endrange',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = !(['isSelected', 'isDateRange'].filter((prop) => !!(opts.hasOwnProperty(prop) && opts[prop] === true)).length === 0),\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n return (\n `<td data-day=\"${opts.day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${opts.year}\" data-month=\"${opts.month}\" data-day=\"${opts.day}\">${opts.day}</button>` +\n '</td>'\n );\n }\n\n renderRow(days, isRTL, isRowSelected) {\n return (\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n (isRTL ? days.reverse() : days).join('') +\n '</tr>'\n );\n }\n\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n randId +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n renderBody(rows) {\n return '<tbody>' + rows.join('') + '</tbody>';\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n randId +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${\n prev ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${\n next ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const opts = this.options,\n minYear = opts.minYear,\n maxYear = opts.maxYear,\n minMonth = opts.minMonth,\n maxMonth = opts.maxMonth;\n\n if (this._y <= minYear) {\n this._y = minYear;\n if (!isNaN(minMonth) && this._m < minMonth) {\n this._m = minMonth;\n }\n }\n if (this._y >= maxYear) {\n this._y = maxYear;\n if (!isNaN(maxMonth) && this._m > maxMonth) {\n this._m = maxMonth;\n }\n }\n\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n if (!this.options.isDateRange) {\n this._renderDateDisplay(this.date);\n } else {\n this._renderDateDisplay(this.date, this.endDate);\n }\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Menu - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility @see https://github.com/materializecss/materialize/issues/522\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n menuOptions: { container: document.body, constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n menuOptions: { container: document.body, constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('change', this._handleInputChange);\n this.calendarEl.addEventListener('click', this._handleCalendarClick);\n /* this.doneBtn.addEventListener('click', this._confirm);\n this.cancelBtn.addEventListener('click', this._cancel);\n\n if (this.options.showClearBtn) {\n this.clearBtn.addEventListener('click', this._handleClearClick);\n }*/\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.yearTextEl = this.containerEl.querySelector('.year-text');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n /* if (this.options.showClearBtn) {\n this.clearBtn = this.containerEl.querySelector('.datepicker-clear');\n }\n this.doneBtn = this.containerEl.querySelector('.datepicker-done');\n this.cancelBtn = this.containerEl.querySelector('.datepicker-cancel');*/\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n\n this.formats = {\n d: (date: Date) => {\n return date.getDate();\n },\n dd: (date: Date) => {\n const d = date.getDate();\n return (d < 10 ? '0' : '') + d;\n },\n ddd: (date: Date) => {\n return this.options.i18n.weekdaysShort[date.getDay()];\n },\n dddd: (date: Date) => {\n return this.options.i18n.weekdays[date.getDay()];\n },\n m: (date: Date) => {\n return date.getMonth() + 1;\n },\n mm: (date: Date) => {\n const m = date.getMonth() + 1;\n return (m < 10 ? '0' : '') + m;\n },\n mmm: (date: Date) => {\n return this.options.i18n.monthsShort[date.getMonth()];\n },\n mmmm: (date: Date) => {\n return this.options.i18n.months[date.getMonth()];\n },\n yy: (date: Date) => {\n return ('' + date.getFullYear()).slice(2);\n },\n yyyy: (date: Date) => {\n return date.getFullYear();\n }\n };\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('change', this._handleInputChange);\n this.calendarEl.removeEventListener('click', this._handleCalendarClick);\n if (this.options.isDateRange && this.endDateEl) {\n this.endDateEl.removeEventListener('click', this._handleInputClick);\n this.endDateEl.removeEventListener('keypress', this._handleInputKeydown);\n this.endDateEl.removeEventListener('change', this._handleInputChange);\n }\n }\n\n _handleInputClick = (e) => {\n // Prevents default browser datepicker modal rendering\n if (e.type == 'date') {\n e.preventDefault();\n }\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || (this.multiple && this.options.isMultipleSelection)) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && Datepicker._comparePastDate(date, this.date)) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n _handleInputChange = (e: Event) => {\n let date;\n const el = e.target as HTMLElement;\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n // Prevent change event from being fired if an end date is set without a start date\n if (el == this.endDateEl && !this.date) return;\n if (this.options.parse) {\n date = this.options.parse(\n (e.target as HTMLInputElement).value,\n typeof this.options.format === 'function'\n ? this.options.format(new Date(this.el.value))\n : this.options.format\n );\n } else {\n date = new Date(Date.parse((e.target as HTMLInputElement).value));\n }\n if (Datepicker._isDate(date)) {\n this.setDate(date, false, el == this.endDateEl, true);\n if (e.type == 'date') {\n this.setDataDate(e, date);\n this.setInputValues();\n }\n }\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.addEventListener('click', this._handleInputClick);\n dateInput.addEventListener('keypress', this._handleInputKeydown);\n dateInput.addEventListener('change', this._handleInputChange);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n _finishSelection = () => {\n this.setInputValues();\n };\n\n _confirm = () => {\n this._finishSelection();\n if (typeof this.options.onConfirm === 'function') this.options.onConfirm.call(this);\n }\n\n _cancel = () => {\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n };\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"year-text\"></span>\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { BaseOptions, Component, InitElements, InitElement } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n private _changedAncestorList: HTMLElement[];\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options, Lightbox);\n this.el['Expressive_Lightbox'] = this;\n\n this.options = {\n ...Lightbox.defaults,\n ...options\n };\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this.el.tabIndex = 0;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Lightbox.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<LightboxOptions>): Lightbox;\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<LightboxOptions>): Lightbox[];\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<LightboxOptions> = {}\n ): Lightbox | Lightbox[] {\n return super.init(els, options, Lightbox);\n }\n\n static getInstance(el: HTMLElement): Lightbox {\n return el['Expressive_Lightbox'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Lightbox'] = undefined;\n // Unwrap image\n //this.placeholder.after(this.el).remove();\n this.placeholder.remove();\n this.el.removeAttribute('style');\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleLightboxClick);\n this.el.addEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleLightboxClick);\n this.el.removeEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _handleLightboxClick = () => {\n this._handleLightboxToggle();\n };\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this.doneAnimating === false || (this.overlayActive && this.doneAnimating)) this.close();\n else this.open();\n };\n\n private _handleWindowScroll = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowResize = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (Utils.keys.ESC.includes(e.key) && this.doneAnimating && this.overlayActive) this.close();\n };\n\n private _makeAncestorsOverflowVisible() {\n this._changedAncestorList = [];\n let ancestor = this.placeholder.parentNode;\n while (ancestor !== null && ancestor !== document) {\n const curr = <HTMLElement>ancestor;\n if (curr.style.overflow !== 'visible') {\n curr.style.overflow = 'visible';\n this._changedAncestorList.push(curr);\n }\n ancestor = ancestor.parentNode;\n }\n }\n\n private _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.scrollY - docElem.clientTop,\n left: box.left + window.scrollX - docElem.clientLeft\n };\n }\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n setTimeout(() => {\n // One offset for both axes, read before any of the writes below.\n const placeholderOffset = this._offset(this.placeholder);\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left =\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n placeholderOffset.left -\n this.newWidth / 2 +\n 'px';\n\n this.el.style.top =\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n placeholderOffset.top -\n this.newHeight / 2 +\n 'px';\n }, 1);\n\n setTimeout(() => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n\n /*\n anim({\n targets: this.el, // image\n height: [this.originalHeight, this.newHeight],\n width: [this.originalWidth, this.newWidth],\n left:\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n this._offset(this.placeholder).left -\n this.newWidth / 2,\n top:\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n this._offset(this.placeholder).top -\n this.newHeight / 2,\n\n duration: this.options.inDuration,\n easing: 'easeOutQuad',\n complete: () => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }\n });\n */\n }\n private _animateImageOut(): void {\n const duration = this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n this.el.style.left = '0';\n this.el.style.top = '0';\n setTimeout(() => {\n this.placeholder.style.height = '';\n this.placeholder.style.width = '';\n this.placeholder.style.position = '';\n this.placeholder.style.top = '';\n this.placeholder.style.left = '';\n // Revert to width or height attribute\n if (this.attrWidth) this.el.setAttribute('width', this.attrWidth.toString());\n if (this.attrHeight) this.el.setAttribute('height', this.attrHeight.toString());\n this.el.removeAttribute('style');\n if (this.originInlineStyles) this.el.setAttribute('style', this.originInlineStyles);\n // Remove class\n this.el.classList.remove('active');\n this.doneAnimating = true;\n // Remove overflow overrides on ancestors\n this._changedAncestorList.forEach((anchestor) => (anchestor.style.overflow = ''));\n // onCloseEnd callback\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n document.body.append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n // Animate\n this._photoCaption.style.transition = 'none';\n this._photoCaption.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '1';\n }, 1);\n }\n private _removeCaption(): void {\n const duration = this.options.outDuration;\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '0';\n setTimeout(() => {\n this._photoCaption.remove();\n }, duration);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n () => {\n if (this.doneAnimating) this.close();\n },\n { once: true }\n );\n\n // Put before in origin image to preserve z-index layering.\n this.el.before(this._overlay);\n\n // Set dimensions if needed\n const overlayOffset = this._overlay.getBoundingClientRect();\n this._overlay.style.width = this.windowWidth + 'px';\n this._overlay.style.height = this.windowHeight + 'px';\n this._overlay.style.left = -1 * overlayOffset.left + 'px';\n this._overlay.style.top = -1 * overlayOffset.top + 'px';\n\n // Animate\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '1';\n }, 1);\n }\n private _removeOverlay(): void {\n const duration = this.options.outDuration;\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this.overlayActive = false;\n this._overlay.remove();\n }, duration);\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function')\n this.options.onOpenStart.call(this, this.el);\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n this.placeholder.style.position = 'relative';\n this.placeholder.style.top = '0';\n this.placeholder.style.left = '0';\n this._makeAncestorsOverflowVisible();\n // Set css on origin\n this.el.style.position = 'absolute';\n this.el.style.zIndex = '1000';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n this._addOverlay();\n // Add and animate caption if it exists\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n this.newWidth = 0;\n this.newHeight = 0;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n this._animateImageIn();\n // Handle Exit triggers\n window.addEventListener('scroll', this._handleWindowScroll, { passive: true });\n window.addEventListener('resize', this._handleWindowResize, { passive: true });\n window.addEventListener('keyup', this._handleWindowEscape);\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n this._updateVars();\n this.doneAnimating = false;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function')\n this.options.onCloseStart.call(this, this.el);\n //anim.remove(this.el);\n //anim.remove(this._overlay);\n //if (this.caption !== '') anim.remove(this._photoCaption);\n // disable exit handlers\n window.removeEventListener('scroll', this._handleWindowScroll);\n window.removeEventListener('resize', this._handleWindowResize);\n window.removeEventListener('keyup', this._handleWindowEscape);\n this._removeOverlay();\n this._animateImageOut();\n if (this.caption !== '') this._removeCaption();\n };\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ParallaxOptions extends BaseOptions {}\n\nconst _defaults: ParallaxOptions = {};\n\n/**\n * Parallax. The effect is CSS (see components/_parallax.scss). This class\n * exists so AutoInit / getInstance / destroy keep working; it does not\n * attach scroll or resize listeners.\n */\nexport class Parallax extends Component<ParallaxOptions> {\n constructor(el: HTMLElement, options: Partial<ParallaxOptions>) {\n super(el, options, Parallax);\n this.el['Expressive_Parallax'] = this;\n\n this.options = {\n ...Parallax.defaults,\n ...options\n };\n\n if (!this.el.querySelector('img, video')) {\n console.error('Parallax: no <img> or <video> to move inside the .parallax element');\n }\n }\n\n static get defaults(): ParallaxOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<ParallaxOptions>): Parallax;\n static init(els: InitElements<InitElement>, options?: Partial<ParallaxOptions>): Parallax[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ParallaxOptions> = {}\n ): Parallax | Parallax[] {\n return super.init(els, options, Parallax);\n }\n\n static getInstance(el: HTMLElement): Parallax {\n return el['Expressive_Parallax'];\n }\n\n destroy() {\n this.el['Expressive_Parallax'] = undefined;\n }\n}\n", "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 _observer: IntersectionObserver | null = null;\n private static _ratios = new Map<Element, number>();\n private static _active: Element | null = null;\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.el.style.setProperty(\n '--md-comp-scrollspy-offset',\n `${this.options.scrollOffset}px`\n );\n\n ScrollSpy._elements.push(this);\n ScrollSpy._ensureObserver(this.options.scrollOffset);\n ScrollSpy._observer?.observe(this.el);\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) ScrollSpy._elements.splice(index, 1);\n ScrollSpy._ratios.delete(this.el);\n ScrollSpy._observer?.unobserve(this.el);\n\n const link = ScrollSpy._linkFor(this.el.id, this.options);\n if (link && link === ScrollSpy._active) {\n ScrollSpy._clearActive(this.options);\n } else {\n link?.classList.remove(this.options.activeClass);\n link?.removeAttribute('aria-current');\n }\n\n if (ScrollSpy._elements.length === 0) {\n ScrollSpy._observer?.disconnect();\n ScrollSpy._observer = null;\n ScrollSpy._ratios.clear();\n ScrollSpy._active = null;\n } else {\n ScrollSpy._syncActive();\n }\n\n this.el['Expressive_ScrollSpy'] = undefined;\n }\n\n private static _ensureObserver(offset: number) {\n if (ScrollSpy._observer) return;\n if (typeof IntersectionObserver === 'undefined') return;\n ScrollSpy._observer = new IntersectionObserver(ScrollSpy._onIntersect, {\n rootMargin: `-${offset}px 0px -45% 0px`,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]\n });\n }\n\n private static _onIntersect = (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n ScrollSpy._ratios.set(entry.target, entry.intersectionRatio);\n } else {\n ScrollSpy._ratios.delete(entry.target);\n }\n }\n ScrollSpy._syncActive();\n };\n\n private static _syncActive() {\n if (!ScrollSpy._elements.length) return;\n const options = ScrollSpy._elements[0].options;\n\n let best: ScrollSpy | null = null;\n let bestRatio = 0;\n for (const spy of ScrollSpy._elements) {\n const ratio = ScrollSpy._ratios.get(spy.el) ?? 0;\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = spy;\n }\n }\n\n if (!best) {\n if (options.keepTopElementActive) {\n best = ScrollSpy._nearestAbove() ?? ScrollSpy._elements[0];\n } else {\n ScrollSpy._clearActive(options);\n return;\n }\n }\n\n const next = ScrollSpy._linkFor(best.el.id, best.options);\n if (next === ScrollSpy._active) return;\n ScrollSpy._clearActive(options);\n if (!next) return;\n next.classList.add(best.options.activeClass);\n next.setAttribute('aria-current', 'true');\n ScrollSpy._active = next;\n }\n\n private static _nearestAbove(): ScrollSpy | null {\n let best: ScrollSpy | null = null;\n let bestTop = -Infinity;\n for (const spy of ScrollSpy._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(options: ScrollSpyOptions) {\n if (!ScrollSpy._active) return;\n ScrollSpy._active.classList.remove(options.activeClass);\n ScrollSpy._active.removeAttribute('aria-current');\n ScrollSpy._active = null;\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", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface SidenavOptions extends BaseOptions {\n /**\n * Side of screen on which Sidenav appears.\n * @default 'left'\n */\n edge: 'left' | 'right';\n /**\n * Allow swipe gestures to open/close Sidenav.\n * @default true\n */\n draggable: boolean;\n /**\n * Width of the area where you can start dragging.\n * @default '10px'\n */\n dragTargetWidth: string;\n /**\n * Function called when sidenav starts entering.\n */\n onOpenStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes entering.\n */\n onOpenEnd: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav starts exiting.\n */\n onCloseStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes exiting.\n */\n onCloseEnd: (elem: HTMLElement) => void;\n}\n\nconst _defaults: SidenavOptions = {\n edge: 'left',\n draggable: true,\n dragTargetWidth: '10px',\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst LARGE_UP = '(width >= 993px)';\n\n/**\n * Navigation drawer. Overlay is a modal <dialog>; fixed is a breakpoint.\n * JS opens/closes, handles the trigger, and writes --md-comp-nav-drawer-shift\n * while dragging. CSS owns the slide, the scrim, and the large-screen dock.\n */\nexport class Sidenav extends Component<SidenavOptions> implements Openable {\n id: string;\n /** Describes open/close state of the overlay drawer. */\n isOpen: boolean;\n /** Describes if sidenav has sidenav-fixed. */\n isFixed: boolean;\n /** Describes if Sidenav is being dragged. */\n isDragged: boolean;\n static _sidenavs: Sidenav[];\n dragTarget: HTMLElement | null;\n private _dialog: HTMLDialogElement | null;\n private _createdDialog: boolean;\n private _closing: boolean;\n private _mql: MediaQueryList;\n private _startingXpos: number;\n private _xPos: number;\n private _width: number;\n private _initialScrollTop: number;\n private _verticallyScrolling: boolean;\n private percentOpen: number;\n\n constructor(el: HTMLElement, options: Partial<SidenavOptions>) {\n super(el, options, Sidenav);\n this.el['Expressive_Sidenav'] = this;\n\n this.options = {\n ...Sidenav.defaults,\n ...options\n };\n\n this.id = this.el.id;\n this.isOpen = false;\n this.isFixed = this.el.classList.contains('sidenav-fixed');\n this.isDragged = false;\n this.dragTarget = null;\n this._dialog = null;\n this._createdDialog = false;\n this._closing = false;\n this.percentOpen = 0;\n this._startingXpos = 0;\n this._xPos = 0;\n this._width = 0;\n this._initialScrollTop = 0;\n this._verticallyScrolling = false;\n\n this._mql = window.matchMedia(LARGE_UP);\n this._setupDialog();\n this._createDragTarget();\n this._setupClasses();\n this._setupEventHandlers();\n this._syncTriggers();\n\n Sidenav._sidenavs.push(this);\n }\n\n static get defaults(): SidenavOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Sidenav.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SidenavOptions>): Sidenav;\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<SidenavOptions>): Sidenav[];\n /**\n * Initializes instances of Sidenav.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<SidenavOptions> = {}\n ): Sidenav | Sidenav[] {\n return super.init(els, options, Sidenav);\n }\n\n static getInstance(el: HTMLElement): Sidenav {\n return el['Expressive_Sidenav'];\n }\n\n destroy() {\n this._removeEventHandlers();\n if (this._dialog?.open) {\n try {\n this._dialog.close();\n } catch {\n // already closed\n }\n }\n this._clearShift();\n this._unwrapDialog();\n this._removeDragTarget();\n this.el['Expressive_Sidenav'] = undefined;\n const index = Sidenav._sidenavs.indexOf(this);\n if (index >= 0) {\n Sidenav._sidenavs.splice(index, 1);\n }\n }\n\n /**\n * Opens the overlay drawer. No-op while the sidenav is docked\n * (sidenav-fixed at the large breakpoint).\n */\n open = () => {\n if (this._isCurrentlyFixed() || this.isOpen || !this._dialog) return;\n\n Sidenav._sidenavs.forEach((other) => {\n if (other !== this && other.isOpen) other.close();\n });\n\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n\n this.isOpen = true;\n this._dialog.classList.remove('dragging');\n this._clearShift();\n if (!this._dialog.open) {\n try {\n this._dialog.showModal();\n } catch {\n // already open\n }\n }\n this._syncTriggers();\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, this.el);\n }\n };\n\n /**\n * Closes the overlay drawer. No-op while the sidenav is docked.\n */\n close = () => {\n if (this._isCurrentlyFixed() || !this.isOpen) return;\n this._beginClose();\n if (this._dialog?.open) {\n this._closing = true;\n this._dialog.close();\n } else {\n this._finishClose();\n }\n };\n\n private _beginClose() {\n this.isOpen = false;\n this._dialog?.classList.remove('dragging');\n this._clearShift();\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._syncTriggers();\n }\n\n private _finishClose() {\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, this.el);\n }\n }\n\n private _onDialogClose = () => {\n if (this.isOpen) {\n this._beginClose();\n this._finishClose();\n return;\n }\n if (this._closing) {\n this._closing = false;\n this._finishClose();\n }\n };\n\n private _onBreakpointChange = () => {\n if (this._isCurrentlyFixed() && this.isOpen) {\n this.close();\n }\n };\n\n private _setupDialog() {\n if (this.el instanceof HTMLDialogElement) {\n this._dialog = this.el;\n this._createdDialog = false;\n return;\n }\n const parent = this.el.parentElement;\n if (parent instanceof HTMLDialogElement && parent.classList.contains('sidenav-overlay')) {\n this._dialog = parent;\n this._createdDialog = false;\n return;\n }\n const dialog = document.createElement('dialog');\n dialog.classList.add('sidenav-overlay');\n this.el.replaceWith(dialog);\n dialog.appendChild(this.el);\n this._dialog = dialog;\n this._createdDialog = true;\n }\n\n private _unwrapDialog() {\n if (!this._createdDialog || !this._dialog) return;\n this._dialog.replaceWith(this.el);\n this._dialog = null;\n this._createdDialog = false;\n }\n\n private _createDragTarget() {\n if (!this.options.draggable) return;\n const dragTarget = document.createElement('div');\n dragTarget.classList.add('drag-target');\n dragTarget.style.width = this.options.dragTargetWidth;\n if (this.isFixed) dragTarget.dataset.fixed = '';\n document.body.appendChild(dragTarget);\n this.dragTarget = dragTarget;\n }\n\n private _removeDragTarget() {\n this.dragTarget?.remove();\n this.dragTarget = null;\n }\n\n private _setupClasses() {\n if (this.options.edge === 'right') {\n this.el.classList.add('right-aligned');\n this._dialog?.classList.add('right-aligned');\n this.dragTarget?.classList.add('right-aligned');\n }\n }\n\n private _setupEventHandlers() {\n if (Sidenav._sidenavs.length === 0) {\n document.body.addEventListener('click', Sidenav._handleTriggerClick);\n }\n const passive = { passive: true } as const;\n this.dragTarget?.addEventListener('touchmove', this._handleDragTargetDrag, passive);\n this.dragTarget?.addEventListener('touchend', this._handleDragTargetRelease);\n this._dialog?.addEventListener('touchmove', this._handleCloseDrag, passive);\n this._dialog?.addEventListener('touchend', this._handleCloseRelease);\n this._dialog?.addEventListener('close', this._onDialogClose);\n this.el.addEventListener('click', this._handleCloseTriggerClick);\n this._mql.addEventListener('change', this._onBreakpointChange);\n }\n\n private _removeEventHandlers() {\n if (Sidenav._sidenavs.length === 1) {\n document.body.removeEventListener('click', Sidenav._handleTriggerClick);\n }\n this.dragTarget?.removeEventListener('touchmove', this._handleDragTargetDrag);\n this.dragTarget?.removeEventListener('touchend', this._handleDragTargetRelease);\n this._dialog?.removeEventListener('touchmove', this._handleCloseDrag);\n this._dialog?.removeEventListener('touchend', this._handleCloseRelease);\n this._dialog?.removeEventListener('close', this._onDialogClose);\n this.el.removeEventListener('click', this._handleCloseTriggerClick);\n this._mql.removeEventListener('change', this._onBreakpointChange);\n }\n\n private static _handleTriggerClick(e: Event) {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest('.sidenav-trigger');\n if (!trigger || !(trigger instanceof HTMLElement)) return;\n const sidenavId = Utils.getIdFromTrigger(trigger);\n const sidenavInstance = document.getElementById(sidenavId)?.['Expressive_Sidenav'];\n if (sidenavInstance) {\n sidenavInstance.open();\n e.preventDefault();\n }\n }\n\n private _handleCloseTriggerClick = (e: Event) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const closeTrigger = target.closest('.sidenav-close');\n if (closeTrigger && !this._isCurrentlyFixed()) {\n this.close();\n }\n };\n\n private _isDraggable() {\n return this.options.draggable && !this._isCurrentlyFixed() && !this._verticallyScrolling;\n }\n\n private _isCurrentlyFixed() {\n return this.isFixed && this._mql.matches;\n }\n\n private _startDrag(e: TouchEvent) {\n const clientX = e.targetTouches[0].clientX;\n this.isDragged = true;\n this._startingXpos = clientX;\n this._xPos = clientX;\n this._width =\n this._dialog?.getBoundingClientRect().width || this.el.getBoundingClientRect().width;\n this._initialScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._verticallyScrolling = false;\n this._dialog?.classList.add('dragging');\n if (this._dialog && !this._dialog.open) {\n try {\n this._dialog.showModal();\n } catch {\n // already open\n }\n }\n }\n\n private _dragMoveUpdate(e: TouchEvent) {\n const clientX = e.targetTouches[0].clientX;\n const currentScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._xPos = clientX;\n if (this._initialScrollTop !== currentScrollTop) {\n this._verticallyScrolling = true;\n }\n }\n\n private _rawDelta(e: TouchEvent) {\n if (!this.isDragged) this._startDrag(e);\n this._dragMoveUpdate(e);\n return this._xPos - this._startingXpos;\n }\n\n private _applyShift(shift: number, percentOpen: number) {\n this.percentOpen = percentOpen;\n const host = this._dialog ?? this.el;\n host.style.setProperty('--md-comp-nav-drawer-shift', `${shift}px`);\n host.style.setProperty('--md-comp-nav-drawer-open', String(percentOpen));\n }\n\n private _clearShift() {\n const host = this._dialog ?? this.el;\n host.style.removeProperty('--md-comp-nav-drawer-shift');\n host.style.removeProperty('--md-comp-nav-drawer-open');\n }\n\n private _handleDragTargetDrag = (e: TouchEvent) => {\n if (!this._isDraggable()) return;\n const delta = this._rawDelta(e);\n const towardOpen = this.options.edge === 'left' ? delta : -delta;\n const visible = Math.min(this._width, Math.max(0, towardOpen));\n const percentOpen = this._width ? visible / this._width : 0;\n this._applyShift(visible - this._width, percentOpen);\n };\n\n private _handleDragTargetRelease = () => {\n if (!this.isDragged) return;\n this._dialog?.classList.remove('dragging');\n if (this.percentOpen > 0.2) {\n this.open();\n } else if (this._dialog?.open && !this.isOpen) {\n this._clearShift();\n this._dialog.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n };\n\n private _handleCloseDrag = (e: TouchEvent) => {\n if (!this.isOpen || !this._isDraggable()) return;\n const delta = this._rawDelta(e);\n const towardClose = this.options.edge === 'left' ? -delta : delta;\n const hidden = Math.min(this._width, Math.max(0, towardClose));\n const percentOpen = this._width ? 1 - hidden / this._width : 1;\n this._applyShift(-hidden, percentOpen);\n };\n\n private _handleCloseRelease = () => {\n if (!this.isOpen || !this.isDragged) return;\n this._dialog?.classList.remove('dragging');\n if (this.percentOpen > 0.8) {\n this._clearShift();\n } else {\n this.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n };\n\n private _syncTriggers() {\n if (!this.id) return;\n document.querySelectorAll('.sidenav-trigger').forEach((trigger) => {\n if (!(trigger instanceof HTMLElement)) return;\n if (Utils.getIdFromTrigger(trigger) !== this.id) return;\n trigger.setAttribute('aria-expanded', this.isOpen ? 'true' : 'false');\n trigger.setAttribute('aria-controls', this.id);\n });\n }\n\n static {\n Sidenav._sidenavs = [];\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface NavigationRailOptions extends BaseOptions {\n /**\n * Called before the rail expands.\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Called after the rail expands.\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Called before the rail collapses.\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Called after the rail collapses.\n */\n onCloseEnd: (el: HTMLElement) => void;\n}\n\nconst _defaults: NavigationRailOptions = {\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst COMPACT = '(width < 601px)';\n\n/**\n * Navigation rail. Layout is CSS (collapsed / .expanded). This class\n * toggles that class from the menu button, closes a compact overlay on\n * Escape or a scrim tap, and keeps aria-expanded in sync.\n */\nexport class NavigationRail extends Component<NavigationRailOptions> {\n isExpanded: boolean;\n private _toggle: HTMLButtonElement | null;\n private _mql: MediaQueryList;\n\n constructor(el: HTMLElement, options: Partial<NavigationRailOptions>) {\n super(el, options, NavigationRail);\n this.el['Expressive_NavigationRail'] = this;\n\n this.options = {\n ...NavigationRail.defaults,\n ...options\n };\n\n this._toggle = this._findToggle();\n this._mql = window.matchMedia(COMPACT);\n this.isExpanded = this.el.classList.contains('expanded');\n this._sync();\n this.el.addEventListener('click', this._onClick);\n document.addEventListener('keydown', this._onKeyDown);\n }\n\n static get defaults(): NavigationRailOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<NavigationRailOptions>): NavigationRail;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<NavigationRailOptions>\n ): NavigationRail[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<NavigationRailOptions> = {}\n ): NavigationRail | NavigationRail[] {\n return super.init(els, options, NavigationRail);\n }\n\n static getInstance(el: HTMLElement): NavigationRail {\n return el['Expressive_NavigationRail'];\n }\n\n destroy() {\n this.el.removeEventListener('click', this._onClick);\n document.removeEventListener('keydown', this._onKeyDown);\n this.el['Expressive_NavigationRail'] = undefined;\n }\n\n /**\n * Expands the rail. On compact windows the overlay (scrim) is CSS.\n */\n expand = () => {\n if (this.isExpanded) return;\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n this.isExpanded = true;\n this.el.classList.add('expanded');\n this._sync();\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, this.el);\n }\n };\n\n /**\n * Collapses the rail.\n */\n collapse = () => {\n if (!this.isExpanded) return;\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this.isExpanded = false;\n this.el.classList.remove('expanded');\n this._sync();\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, this.el);\n }\n };\n\n /**\n * Toggles expanded / collapsed.\n */\n toggle = () => {\n if (this.isExpanded) this.collapse();\n else this.expand();\n };\n\n private _findToggle(): HTMLButtonElement | null {\n const first = this.el.querySelector(':scope > button:not(.button)');\n return first instanceof HTMLButtonElement ? first : null;\n }\n\n private _isCompact() {\n return this._mql.matches;\n }\n\n private _isModal() {\n return this.el.classList.contains('modal') || this._isCompact();\n }\n\n private _sync() {\n this.el.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n this._toggle?.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n }\n\n private _onClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node)) return;\n if (this._toggle && (target === this._toggle || this._toggle.contains(target))) {\n this.toggle();\n e.preventDefault();\n return;\n }\n if (target === this.el && this.isExpanded && this._isModal()) {\n this.collapse();\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (this.isExpanded && this._isModal()) this.collapse();\n };\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface SliderOptions extends BaseOptions {\n /**\n * Set to false to hide slide indicators.\n * @default true\n */\n indicators: boolean;\n /**\n * Set height of slider.\n * @default 400\n */\n height: number;\n /**\n * Set the duration of the transition animation in ms.\n * @default 500\n */\n duration: number;\n /**\n * Set the duration between transitions in ms.\n * @default 6000\n */\n interval: number;\n /**\n * If slider should pause when keyboard focus is received.\n * @default true\n */\n pauseOnFocus: boolean;\n /**\n * If slider should pause when is hovered by a pointer.\n * @default true\n */\n pauseOnHover: boolean;\n /**\n * Optional function used to generate ARIA label to indicators (for accessibility purposes).\n * @param index Current index, starting from \"1\".\n * @param current A which indicates whether it is the current element or not\n * @returns a string to be used as label indicator.\n * @default null\n */\n indicatorLabelFunc: (index: number, current: boolean) => string;\n}\n\nconst _defaults: SliderOptions = {\n indicators: true,\n height: 400,\n duration: 500,\n interval: 6000,\n pauseOnFocus: true,\n pauseOnHover: true,\n indicatorLabelFunc: null // Function which will generate a label for the indicators (ARIA)\n};\n\nexport class Slider extends Component<SliderOptions> {\n /** Index of current slide. */\n activeIndex: number;\n interval: ReturnType<typeof setTimeout>;\n eventPause: boolean;\n _slider: HTMLUListElement;\n _slides: HTMLLIElement[];\n _activeSlide: HTMLLIElement;\n _indicators: HTMLLIElement[];\n _hovered: boolean;\n _focused: boolean;\n _focusCurrent: boolean;\n _sliderId: string;\n\n constructor(el: HTMLElement, options: Partial<SliderOptions>) {\n super(el, options, Slider);\n this.el['Expressive_Slider'] = this;\n\n this.options = {\n ...Slider.defaults,\n ...options\n };\n\n // init props\n this.interval = null;\n this.eventPause = false;\n this._hovered = false;\n this._focused = false;\n this._focusCurrent = false;\n\n // setup\n this._slider = this.el.querySelector('.slides');\n this._slides = Array.from(this._slider.querySelectorAll('li'));\n this.activeIndex = this._slides.findIndex((li) => li.classList.contains('active'));\n\n if (this.activeIndex !== -1) {\n this._activeSlide = this._slides[this.activeIndex];\n }\n\n this._setSliderHeight();\n\n // Sets element id if it does not have one\n if (this._slider.hasAttribute('id')) this._sliderId = this._slider.getAttribute('id');\n else {\n this._sliderId = 'slider-' + Utils.guid();\n this._slider.setAttribute('id', this._sliderId);\n }\n\n const placeholderBase64 =\n 'data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';\n // Set initial positions of captions\n this._slides.forEach((slide) => {\n // Caption\n //const caption = <HTMLElement|null>slide.querySelector('.caption');\n //if (caption) this._animateCaptionIn(caption, 0);\n // Set Images as Background Images\n const img = slide.querySelector('img');\n if (img) {\n if (img.src !== placeholderBase64) {\n img.style.backgroundImage = 'url(' + img.src + ')';\n img.src = placeholderBase64;\n }\n }\n // Sets slide as focusable by code\n if (!slide.hasAttribute('tabindex')) slide.setAttribute('tabindex', '-1');\n // Removes initial visibility from \"inactive\" slides\n slide.style.visibility = 'hidden';\n });\n\n this._setupIndicators();\n\n // Show active slide\n if (this._activeSlide) {\n this._activeSlide.style.display = 'block';\n this._activeSlide.style.visibility = 'visible';\n } else {\n this.activeIndex = 0;\n this._slides[0].classList.add('active');\n this._slides[0].style.visibility = 'visible';\n this._activeSlide = this._slides[0];\n this._animateSlide(this._slides[0], true);\n // Update indicators\n if (this.options.indicators) {\n this._indicators[this.activeIndex].children[0].classList.add('active');\n }\n }\n this._setupEventHandlers();\n // auto scroll\n this.start();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Slider.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<SliderOptions>): Slider;\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<SliderOptions>): Slider[];\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<SliderOptions> = {}\n ): Slider | Slider[] {\n return super.init(els, options, Slider);\n }\n\n static getInstance(el: HTMLElement): Slider {\n return el['Expressive_Slider'];\n }\n\n destroy() {\n this.pause();\n this._removeIndicators();\n this._removeEventHandlers();\n this.el['Expressive_Slider'] = undefined;\n }\n\n private _setupEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.addEventListener('focusin', this._handleAutoPauseFocus);\n this.el.addEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.addEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.addEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.addEventListener('click', this._handleIndicatorClick);\n });\n }\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n private _removeEventHandlers() {\n if (this.options.pauseOnFocus) {\n this.el.removeEventListener('focusin', this._handleAutoPauseFocus);\n this.el.removeEventListener('focusout', this._handleAutoStartFocus);\n }\n if (this.options.pauseOnHover) {\n this.el.removeEventListener('mouseenter', this._handleAutoPauseHover);\n this.el.removeEventListener('mouseleave', this._handleAutoStartHover);\n }\n if (this.options.indicators) {\n this._indicators.forEach((el) => {\n el.removeEventListener('click', this._handleIndicatorClick);\n });\n }\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n }\n\n // Nobody is watching a backgrounded tab. Browsers clamp the timer rather\n // than stopping it, so without this the slider keeps cycling slides - and\n // running their transitions - out of sight.\n private _handleVisibilityChange = () => {\n if (document.hidden) {\n if (this.interval != null) this._pause(true);\n } else if (\n this.eventPause &&\n !(this.options.pauseOnHover && this._hovered) &&\n !(this.options.pauseOnFocus && this._focused)\n ) {\n this.start();\n }\n };\n\n private _handleIndicatorClick = (e: MouseEvent) => {\n const el = (<HTMLElement>e.target).parentElement;\n const currIndex = [...el.parentNode.children].indexOf(el);\n this._focusCurrent = true;\n this.set(currIndex);\n };\n\n private _handleAutoPauseHover = () => {\n this._hovered = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoPauseFocus = () => {\n this._focused = true;\n if (this.interval != null) {\n this._pause(true);\n }\n };\n\n private _handleAutoStartHover = () => {\n this._hovered = false;\n if (!(this.options.pauseOnFocus && this._focused) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleAutoStartFocus = () => {\n this._focused = false;\n if (!(this.options.pauseOnHover && this._hovered) && this.eventPause) {\n this.start();\n }\n };\n\n private _handleInterval = () => {\n const activeElem = this._slider.querySelector('.active');\n let newActiveIndex = [...activeElem.parentNode.children].indexOf(activeElem);\n if (this._slides.length === newActiveIndex + 1)\n newActiveIndex = 0; // loop to start\n else newActiveIndex += 1;\n this.set(newActiveIndex);\n };\n\n private _animateSlide(slide: HTMLElement, isDirectionIn: boolean): void {\n let dx = 0,\n dy = 0;\n // from\n slide.style.opacity = isDirectionIn ? '0' : '1';\n setTimeout(() => {\n slide.style.transition = `opacity ${this.options.duration}ms ease`;\n // to\n slide.style.opacity = isDirectionIn ? '1' : '0';\n }, 1);\n // Caption\n const caption: HTMLElement = slide.querySelector('.caption');\n if (!caption) return;\n if (caption.classList.contains('center-align')) dy = -100;\n else if (caption.classList.contains('right-align')) dx = 100;\n else if (caption.classList.contains('left-align')) dx = -100;\n // from\n caption.style.opacity = isDirectionIn ? '0' : '1';\n caption.style.transform = isDirectionIn ? `translate(${dx}px, ${dy}px)` : `translate(0, 0)`;\n setTimeout(() => {\n caption.style.transition = `opacity ${this.options.duration}ms ease, transform ${this.options.duration}ms ease`;\n // to\n caption.style.opacity = isDirectionIn ? '1' : '0';\n caption.style.transform = isDirectionIn ? `translate(0, 0)` : `translate(${dx}px, ${dy}px)`;\n }, this.options.duration); // delay\n }\n\n private _setSliderHeight() {\n // If fullscreen, do nothing\n if (!this.el.classList.contains('fullscreen')) {\n if (this.options.indicators) {\n // Add height if indicators are present\n this.el.style.height = this.options.height + 40 + 'px'; //.css('height', this.options.height + 40 + 'px');\n } else {\n this.el.style.height = this.options.height + 'px';\n }\n this._slider.style.height = this.options.height + 'px';\n }\n }\n\n private _setupIndicators() {\n if (this.options.indicators) {\n const ul = document.createElement('ul');\n ul.classList.add('indicators');\n\n const arrLi = [];\n this._slides.forEach((el, i) => {\n const label = this.options.indicatorLabelFunc\n ? this.options.indicatorLabelFunc.call(this, i + 1, i === 0)\n : `${i + 1}`;\n const li = document.createElement('li');\n li.classList.add('indicator-item');\n // setAttribute, not an interpolated attribute in markup: the label\n // comes from indicatorLabelFunc and a quote in it would break out.\n const button = document.createElement('button');\n button.type = 'button';\n button.classList.add('indicator-item-btn');\n button.setAttribute('aria-label', label);\n button.setAttribute('aria-controls', this._sliderId);\n li.appendChild(button);\n arrLi.push(li);\n ul.append(li);\n });\n\n this.el.append(ul);\n this._indicators = arrLi;\n }\n }\n\n private _removeIndicators() {\n this.el.querySelector('ul.indicators').remove(); //find('ul.indicators').remove();\n }\n\n set(index: number) {\n // Wrap around indices.\n if (index >= this._slides.length) index = 0;\n else if (index < 0) index = this._slides.length - 1;\n\n // Only do if index changes\n if (this.activeIndex === index) return;\n\n this._activeSlide = this._slides[this.activeIndex];\n const _caption = <HTMLElement | null>this._activeSlide.querySelector('.caption');\n\n this._activeSlide.classList.remove('active');\n // Enables every slide\n this._slides.forEach((slide) => (slide.style.visibility = 'visible'));\n\n //--- Hide active Slide + Caption\n this._activeSlide.style.opacity = '0';\n setTimeout(() => {\n this._slides.forEach((slide) => {\n if (slide.classList.contains('active')) return;\n slide.style.opacity = '0';\n slide.style.transform = 'translate(0, 0)';\n // Disables invisible slides (for assistive technologies)\n slide.style.visibility = 'hidden';\n });\n }, this.options.duration);\n\n // Hide active Caption - a slide is not required to have one.\n //this._animateCaptionIn(_caption, this.options.duration);\n if (_caption) _caption.style.opacity = '0';\n\n // Update indicators\n if (this.options.indicators) {\n const activeIndicator = this._indicators[this.activeIndex].children[0];\n const nextIndicator = this._indicators[index].children[0];\n activeIndicator.classList.remove('active');\n nextIndicator.classList.add('active');\n if (typeof this.options.indicatorLabelFunc === 'function') {\n activeIndicator.ariaLabel = this.options.indicatorLabelFunc.call(\n this,\n this.activeIndex,\n false\n );\n nextIndicator.ariaLabel = this.options.indicatorLabelFunc.call(this, index, true);\n }\n }\n\n //--- Show new Slide + Caption\n this._animateSlide(this._slides[index], true);\n this._slides[index].classList.add('active');\n this.activeIndex = index;\n\n // Reset interval, if allowed. This check prevents autostart\n // when slider is paused, since it can be changed though indicators.\n if (this.interval != null) {\n this.start();\n }\n }\n\n _pause(fromEvent: boolean) {\n clearInterval(this.interval);\n this.eventPause = fromEvent;\n this.interval = null;\n }\n\n /**\n * Pause slider autoslide.\n */\n pause = () => {\n this._pause(false);\n };\n\n /**\n * Start slider autoslide.\n */\n start = () => {\n clearInterval(this.interval);\n this.interval = setInterval(\n this._handleInterval,\n this.options.duration + this.options.interval\n );\n this.eventPause = false;\n };\n\n /**\n * Move to next slider.\n */\n next = () => {\n let newIndex = this.activeIndex + 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n\n /**\n * Move to prev slider.\n */\n prev = () => {\n let newIndex = this.activeIndex - 1;\n // Wrap around indices.\n if (newIndex >= this._slides.length) newIndex = 0;\n else if (newIndex < 0) newIndex = this._slides.length - 1;\n this.set(newIndex);\n };\n}\n", "import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.parentNode.removeChild(this._indicator);\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n } else {\n this._teardownNormalTabs();\n }\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n // Make the old tab inactive.\n this._activeTabLink.classList.remove('active');\n const _oldContent = this._content;\n // Update the variables with the new link and content\n\n this._activeTabLink = tabLink;\n if (tabLink.hash) this._content = document.querySelector(tabLink.hash);\n this._tabLinks = this._queryTabLinks();\n // Make the tab active\n this._activeTabLink.classList.add('active');\n const prevIndex = this._index;\n this._index = Math.max(Array.from(this._tabLinks).indexOf(tabLink), 0);\n\n // Swap content\n if (this.options.swipeable) {\n if (this._tabsCarousel) {\n this._tabsCarousel.set(this._index, () => {\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n });\n }\n } else {\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => a.classList.remove('active'));\n this._activeTabLink.classList.add('active');\n\n this._index = Math.max(Array.from(this._tabLinks).indexOf(this._activeTabLink), 0);\n if (this._activeTabLink && this._activeTabLink.hash) {\n this._content = document.querySelector(this._activeTabLink.hash);\n if (this._content) this._content.classList.add('active');\n }\n }\n\n _setupSwipeableTabs() {\n // Change swipeable according to responsive threshold\n if (window.innerWidth > this.options.responsiveThreshold) this.options.swipeable = false;\n\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash);\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'flat');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._index = Array.from(item.parentNode.children).indexOf(item);\n this._activeTabLink.classList.remove('active');\n this._activeTabLink = Array.from(this._tabLinks)[this._index];\n this._activeTabLink.classList.add('active');\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n // Set initial carousel slide to active tab\n this._tabsCarousel.set(this._index);\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n // Unwrap\n tabsWrapper.append(tabsWrapper.parentElement);\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n if ((<HTMLAnchorElement>a).hash) {\n const currContent = document.querySelector((<HTMLAnchorElement>a).hash);\n if (currContent) (<HTMLElement>currContent).style.display = 'none';\n }\n });\n }\n\n _teardownNormalTabs() {\n // show Tabs Content\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash) as HTMLElement;\n if (currContent) currContent.style.display = '';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, I18nOptions } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport type Views = 'hours' | 'minutes';\n\nexport interface TimepickerOptions extends BaseOptions {\n /**\n * Dial radius.\n * @default 135\n */\n dialRadius: number;\n /**\n * Outer radius.\n * @default 105\n */\n outerRadius: number;\n /**\n * Inner radius.\n * @default 70\n */\n innerRadius: number;\n /**\n * Tick radius.\n * @default 20\n */\n tickRadius: number;\n /**\n * Duration of the transition from/to the hours/minutes view.\n * @default 350\n */\n duration: number;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the time picker in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the Timepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit timepicker selection to input field\n * @default true\n */\n autoSubmit: true;\n /**\n * Default time to set on the timepicker 'now' or '13:14'.\n * @default 'now';\n */\n defaultTime: string;\n /**\n * Millisecond offset from the defaultTime.\n * @default 0\n */\n fromNow: number;\n /**\n * Internationalization options.\n */\n i18n: Partial<I18nOptions>;\n /**\n * Use 12 hour AM/PM clock instead of 24 hour clock.\n * @default true\n */\n twelveHour: boolean;\n /**\n * Vibrate device when dragging clock hand.\n * @default true\n */\n vibrate: boolean;\n /**\n * Callback function when a time is selected.\n * @default null\n */\n onSelect: (hour: number, minute: number) => void;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for done.\n * @default null\n */\n onDone: (() => void) | null;\n /**\n * Callback function for cancel.\n * @default null\n */\n onCancel: (() => void) | null;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: TimepickerOptions = {\n dialRadius: 135,\n outerRadius: 105,\n innerRadius: 70,\n tickRadius: 20,\n duration: 350,\n container: null,\n defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n fromNow: 0, // Millisecond offset from the defaultTime\n showClearBtn: false,\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok'\n },\n twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n vibrate: true, // vibrate the device when dragging clock hand\n // Callbacks\n onSelect: null,\n onInputInteraction: null,\n onDone: null,\n onCancel: null,\n displayPlugin: null,\n displayPluginOptions: null,\n};\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport class Timepicker extends Component<TimepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n containerEl: HTMLElement;\n plate: HTMLElement;\n digitalClock: HTMLElement;\n inputHours: HTMLInputElement;\n inputMinutes: HTMLInputElement;\n x0: number;\n y0: number;\n moved: boolean;\n dx: number;\n dy: number;\n /**\n * Current view on the timepicker.\n * @default 'hours'\n */\n currentView: Views;\n hand: SVGElement;\n minutesView: HTMLElement;\n hours: number;\n minutes: number;\n /** The selected time. */\n time: string;\n /**\n * If the time is AM or PM on twelve-hour clock.\n * @default 'PM'\n */\n amOrPm: 'AM' | 'PM';\n static _template;\n /** Whether this device exposes the Vibration API at all. */\n canVibrate: boolean;\n _canvas: HTMLElement;\n hoursView: HTMLElement;\n spanAmPm: HTMLSpanElement;\n footer: HTMLElement;\n private _amBtn: HTMLElement;\n private _pmBtn: HTMLElement;\n bg: Element;\n bearing: Element;\n g: Element;\n toggleViewTimer: ReturnType<typeof setTimeout>;\n vibrateTimer: ReturnType<typeof setTimeout>;\n private displayPlugin: DockedDisplayPlugin;\n /** Whether the dial (ticks + SVG + AM/PM buttons) has been built yet. */\n private _clockBuilt = false;\n\n constructor(el: HTMLInputElement, options: Partial<TimepickerOptions>) {\n super(el, options, Timepicker);\n this.el['Expressive_Timepicker'] = this;\n this.options = {\n ...Timepicker.defaults,\n ...options\n };\n this.id = Utils.guid();\n this._insertHTMLIntoDOM();\n this._setupVariables();\n this._setupEventHandlers();\n // The dial is ~40 elements (12 or 24 hour ticks, 12 minute ticks, the SVG\n // hand and the AM/PM buttons) and is built by _ensureClockBuilt() rather\n // than here - see _pickerSetup for when that first happens.\n this._pickerSetup();\n\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults(): TimepickerOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Timepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<TimepickerOptions>): Timepicker;\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<TimepickerOptions>\n ): Timepicker[];\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<TimepickerOptions> = {}\n ): Timepicker | Timepicker[] {\n return super.init(els, options, Timepicker);\n }\n\n static _addLeadingZero(num: number) {\n return (num < 10 ? '0' : '') + num;\n }\n\n static _createSVGEl(name: string) {\n const svgNS = 'http://www.w3.org/2000/svg';\n return document.createElementNS(svgNS, name);\n }\n\n static _Pos(e: TouchEvent | MouseEvent): Point {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return {\n x: (e as TouchEvent).targetTouches[0].clientX,\n y: (e as TouchEvent).targetTouches[0].clientY\n };\n }\n // mouse event\n return { x: (e as MouseEvent).clientX, y: (e as MouseEvent).clientY };\n }\n\n static getInstance(el: HTMLElement): Timepicker {\n return el['Expressive_Timepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.el['Expressive_Timepicker'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.plate.addEventListener('mousedown', this._handleClockClickStart);\n this.plate.addEventListener('touchstart', this._handleClockClickStart);\n this.digitalClock.addEventListener('keyup', this._inputFromTextField);\n this.inputHours.addEventListener('focus', () => this.showView('hours'));\n this.inputHours.addEventListener('focusout', () => this.formatHours());\n this.inputMinutes.addEventListener('focus', () => this.showView('minutes'));\n this.inputMinutes.addEventListener('focusout', () => this.formatMinutes());\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n // Drag handlers live on the document while the clock hand is held; if the\n // component is destroyed mid-drag they would otherwise outlive it.\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n }\n\n _handleInputClick = () => {\n // Before focus(): focusing inputHours fires the handler that calls\n // showView, and an already-focused input fires nothing at all.\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n }\n };\n\n _handleTimeInputEnterKey = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n e.preventDefault();\n this._inputFromTextField();\n }\n };\n\n _handleClockClickStart = (e) => {\n e.preventDefault();\n this._ensureClockBuilt();\n const clockPlateBR = this.plate.getBoundingClientRect();\n const offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n this.x0 = offset.x + this.options.dialRadius;\n this.y0 = offset.y + this.options.dialRadius;\n this.moved = false;\n const clickPos = Timepicker._Pos(e);\n this.dx = clickPos.x - this.x0;\n this.dy = clickPos.y - this.y0;\n\n // Set clock hands\n this.setHand(this.dx, this.dy, false);\n // Mousemove on document\n document.addEventListener('mousemove', this._handleDocumentClickMove);\n document.addEventListener('touchmove', this._handleDocumentClickMove);\n // Mouseup on document\n document.addEventListener('mouseup', this._handleDocumentClickEnd);\n document.addEventListener('touchend', this._handleDocumentClickEnd);\n };\n\n _handleDocumentClickMove = (e) => {\n e.preventDefault();\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n this.moved = true;\n this.setHand(x, y, false);\n };\n\n _handleDocumentClickEnd = (e) => {\n e.preventDefault();\n document.removeEventListener('mouseup', this._handleDocumentClickEnd);\n document.removeEventListener('touchend', this._handleDocumentClickEnd);\n const clickPos = Timepicker._Pos(e);\n const x = clickPos.x - this.x0;\n const y = clickPos.y - this.y0;\n if (this.moved && x === this.dx && y === this.dy) {\n this.setHand(x, y);\n }\n\n if (this.currentView === 'hours') {\n this.inputMinutes.focus();\n this.showView('minutes', this.options.duration / 2);\n } else {\n // this.minutesView.classList.add('timepicker-dial-out');\n setTimeout(() => {\n if (this.options.autoSubmit) this.done();\n }, this.options.duration / 2);\n }\n\n if (typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, this.hours, this.minutes);\n }\n // Unbind mousemove event\n document.removeEventListener('mousemove', this._handleDocumentClickMove);\n document.removeEventListener('touchmove', this._handleDocumentClickMove);\n };\n\n _insertHTMLIntoDOM() {\n const template = document.createElement('template');\n template.innerHTML = Timepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n this.containerEl.id = 'container-' + this.id;\n\n // Append popover to input by default\n const optEl = this.options.container;\n const containerEl = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);\n\n if (this.options.container && !!containerEl) {\n containerEl.append(this.containerEl);\n } else {\n this.el.parentElement.appendChild(this.containerEl);\n }\n }\n\n _setupVariables() {\n this.currentView = 'hours';\n // `navigator.webkitVibrate` never shipped in any browser - the probe it\n // came from was folklore. A plain feature check is the whole of it.\n this.canVibrate = typeof navigator.vibrate === 'function';\n this._canvas = this.containerEl.querySelector('.timepicker-canvas');\n this.plate = this.containerEl.querySelector('.timepicker-plate');\n this.digitalClock = this.containerEl.querySelector('.timepicker-display-column');\n this.hoursView = this.containerEl.querySelector('.timepicker-hours');\n this.minutesView = this.containerEl.querySelector('.timepicker-minutes');\n this.inputHours = this.containerEl.querySelector('.timepicker-input-hours');\n this.inputMinutes = this.containerEl.querySelector('.timepicker-input-minutes');\n this.spanAmPm = this.containerEl.querySelector('.timepicker-span-am-pm');\n this.footer = this.containerEl.querySelector('.timepicker-footer');\n this.amOrPm = 'PM';\n }\n\n /*private _createButton(text: string, visibility: string): HTMLButtonElement {\n const button = document.createElement('button');\n button.classList.add('waves-effect', 'text');\n button.style.visibility = visibility;\n button.type = 'button';\n button.tabIndex = -1;\n button.innerText = text;\n return button;\n }*/\n\n _pickerSetup() {\n // clearButton.classList.add('timepicker-clear');\n // clearButton.addEventListener('click', this.clear);\n // this.footer.appendChild(clearButton);\n Utils.createButton(\n this.footer,\n this.options.i18n.clear,\n ['timepicker-clear'],\n this.options.showClearBtn,\n this.clear\n );\n\n if (!this.options.autoSubmit) {\n /*const confirmationBtnsContainer = document.createElement('div');\n confirmationBtnsContainer.classList.add('confirmation-btns');\n this.footer.append(confirmationBtnsContainer);\n\n const cancelButton = this._createButton(this.options.i18n.cancel, '');\n cancelButton.classList.add('timepicker-close');\n cancelButton.addEventListener('click', this.close);\n confirmationBtnsContainer.appendChild(cancelButton);\n\n const doneButton = this._createButton(this.options.i18n.done, '');\n doneButton.classList.add('timepicker-close');\n //doneButton.addEventListener('click', this._finishSelection);\n confirmationBtnsContainer.appendChild(doneButton);*/\n Utils.createConfirmationContainer(\n this.footer,\n this.options.i18n.done,\n this.options.i18n.cancel,\n this.confirm,\n this.cancel\n );\n }\n\n this._updateTimeFromInput();\n\n // With a docked display the container is `visibility: hidden` until\n // show(), so the dial can wait for the first interaction. Without one it\n // is on screen from the moment it is inserted and has to be ready now.\n if (!this.options.displayPlugin) this.showView('hours');\n }\n\n /**\n * Build the dial, once. Cheap to call repeatedly - every entry point that\n * touches the clock calls it first, so the picker cannot be interacted with\n * before it exists.\n */\n private _ensureClockBuilt() {\n if (this._clockBuilt) return;\n this._clockBuilt = true;\n this._clockSetup();\n // Applies the AM/PM state _updateTimeFromInput worked out before the\n // buttons existed.\n this._updateAmPmView();\n }\n\n _clockSetup() {\n if (this.options.twelveHour) {\n // AM Button\n this._amBtn = document.createElement('div');\n this._amBtn.classList.add('am-btn');\n this._amBtn.innerText = 'AM';\n this._amBtn.tabIndex = 0;\n this._amBtn.addEventListener('click', this._handleAmPmClick);\n this._amBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._amBtn);\n // PM Button\n this._pmBtn = document.createElement('div');\n this._pmBtn.classList.add('pm-btn');\n this._pmBtn.innerText = 'PM';\n this._pmBtn.tabIndex = 0;\n this._pmBtn.addEventListener('click', this._handleAmPmClick);\n this._pmBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._pmBtn);\n }\n this._buildHoursView();\n this._buildMinutesView();\n this._buildSVGClock();\n }\n\n _buildSVGClock() {\n // Draw clock hands and others\n const dialRadius = this.options.dialRadius;\n const tickRadius = this.options.tickRadius;\n const diameter = dialRadius * 2;\n const svg = Timepicker._createSVGEl('svg');\n svg.setAttribute('class', 'timepicker-svg');\n svg.setAttribute('width', diameter.toString());\n svg.setAttribute('height', diameter.toString());\n const g = Timepicker._createSVGEl('g');\n g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n const bearing = Timepicker._createSVGEl('circle');\n bearing.setAttribute('class', 'timepicker-canvas-bearing');\n bearing.setAttribute('cx', '0');\n bearing.setAttribute('cy', '0');\n bearing.setAttribute('r', '4');\n const hand = Timepicker._createSVGEl('line');\n hand.setAttribute('x1', '0');\n hand.setAttribute('y1', '0');\n const bg = Timepicker._createSVGEl('circle');\n bg.setAttribute('class', 'timepicker-canvas-bg');\n bg.setAttribute('r', tickRadius.toString());\n g.appendChild(hand);\n g.appendChild(bg);\n g.appendChild(bearing);\n svg.appendChild(g);\n this._canvas.appendChild(svg);\n this.hand = hand;\n this.bg = bg;\n this.bearing = bearing;\n this.g = g;\n }\n\n _buildHoursView() {\n // const $tick = document.createElement('div');\n // $tick.classList.add('timepicker-tick');\n // Hours view\n if (this.options.twelveHour) {\n for (let i = 1; i < 13; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const radius = this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n } else {\n for (let i = 0; i < 24; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const inner = i > 0 && i < 13;\n const radius = inner ? this.options.innerRadius : this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n }\n }\n\n _buildHoursTick(i: number, radian: number, radius: number) {\n const tick = document.createElement('div');\n tick.classList.add('timepicker-tick');\n tick.style.left =\n this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px';\n tick.style.top =\n this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px';\n tick.textContent = i === 0 ? '00' : i.toString();\n this.hoursView.appendChild(tick);\n }\n\n _buildMinutesView() {\n const _tick = document.createElement('div');\n _tick.classList.add('timepicker-tick');\n // Minutes view\n for (let i = 0; i < 60; i += 5) {\n const tick = <HTMLElement>_tick.cloneNode(true);\n const radian = (i / 30) * Math.PI;\n tick.style.left =\n this.options.dialRadius +\n Math.sin(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.style.top =\n this.options.dialRadius -\n Math.cos(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.textContent = Timepicker._addLeadingZero(i);\n this.minutesView.appendChild(tick);\n }\n }\n\n _handleAmPmClick = (e: MouseEvent) => {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n };\n\n _handleAmPmKeypress = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key)) {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n }\n };\n\n _handleAmPmInteraction = (e: HTMLElement) => {\n this.amOrPm = e.classList.contains('am-btn') ? 'AM' : 'PM';\n this._updateAmPmView();\n }\n\n _updateAmPmView() {\n // _updateTimeFromInput settles amOrPm before the dial is built; the\n // buttons pick the state up in _ensureClockBuilt.\n if (!this._amBtn || !this._pmBtn) return;\n if (this.options.twelveHour) {\n if (this.amOrPm === 'PM') {\n this._amBtn.classList.remove('filled');\n this._pmBtn.classList.add('filled');\n } else if (this.amOrPm === 'AM') {\n this._amBtn.classList.add('filled');\n this._pmBtn.classList.remove('filled');\n }\n }\n }\n\n _updateTimeFromInput() {\n // Get the time\n let value = ((this.el.value || this.options.defaultTime || '') + '').split(':');\n if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {\n if (value[1].toUpperCase().indexOf('AM') > 0) {\n this.amOrPm = 'AM';\n } else {\n this.amOrPm = 'PM';\n }\n value[1] = value[1].replace('AM', '').replace('PM', '');\n }\n if (value[0] === 'now') {\n const now = new Date(+new Date() + this.options.fromNow);\n value = [now.getHours().toString(), now.getMinutes().toString()];\n if (this.options.twelveHour) {\n this.amOrPm = parseInt(value[0]) >= 12 && parseInt(value[0]) < 24 ? 'PM' : 'AM';\n }\n }\n this.hours = +value[0] || 0;\n this.minutes = +value[1] || 0;\n this.inputHours.value = Timepicker._addLeadingZero(this.hours);\n this.inputMinutes.value = Timepicker._addLeadingZero(this.minutes);\n\n this._updateAmPmView();\n }\n\n /**\n * Show hours or minutes view on timepicker.\n * @param view The name of the view you want to switch to, 'hours' or 'minutes'.\n * @param delay\n */\n showView = (view: Views, delay: number = null) => {\n this._ensureClockBuilt();\n if (view === 'minutes' && getComputedStyle(this.hoursView).visibility === 'visible') {\n // raiseCallback(this.options.beforeHourSelect);\n }\n const isHours = view === 'hours',\n nextView = isHours ? this.hoursView : this.minutesView,\n hideView = isHours ? this.minutesView : this.hoursView;\n this.currentView = view;\n\n /*if (isHours) {\n this.inputHours.classList.add('text-primary');\n this.inputMinutes.classList.remove('text-primary');\n } else {\n this.inputHours.classList.remove('text-primary');\n this.inputMinutes.classList.add('text-primary');\n }*/\n\n // Transition view\n hideView.classList.add('timepicker-dial-out');\n\n nextView.style.visibility = 'visible';\n nextView.classList.remove('timepicker-dial-out');\n\n // Reset clock hand\n this.resetClock(delay);\n // After transitions ended\n clearTimeout(this.toggleViewTimer);\n this.toggleViewTimer = setTimeout(() => {\n hideView.style.visibility = 'hidden';\n }, this.options.duration);\n };\n\n resetClock(delay) {\n const view = this.currentView,\n value = this[view],\n isHours = view === 'hours',\n unit = Math.PI / (isHours ? 6 : 30),\n radian = value * unit,\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n x = Math.sin(radian) * radius,\n y = -Math.cos(radian) * radius;\n\n if (delay) {\n this._canvas?.classList.add('timepicker-canvas-out');\n setTimeout(() => {\n this._canvas?.classList.remove('timepicker-canvas-out');\n this.setHand(x, y);\n }, delay);\n } else {\n this.setHand(x, y);\n }\n }\n\n _inputFromTextField = () => {\n const isHours = this.currentView === 'hours';\n if (isHours && this.inputHours.value !== '') {\n const value = parseInt(this.inputHours.value);\n if (value > 0 && value < (this.options.twelveHour ? 13 : 24)) {\n this.hours = value;\n } else {\n this.setHoursDefault();\n }\n this.drawClockFromTimeInput(this.hours, isHours);\n } else if (!isHours && this.inputMinutes.value !== '') {\n const value = parseInt(this.inputMinutes.value);\n if (value >= 0 && value < 60) {\n this.minutes = value;\n } else {\n this.minutes = new Date().getMinutes();\n this.inputMinutes.value = this.minutes.toString();\n }\n this.drawClockFromTimeInput(this.minutes, isHours);\n }\n };\n\n drawClockFromTimeInput(value, isHours) {\n const unit = Math.PI / (isHours ? 6 : 30);\n const radian = value * unit;\n let radius;\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n } else {\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius;\n }\n this.setClockAttributes(radian, radius);\n }\n\n setHand(x, y, roundBy5: boolean = false) {\n const isHours = this.currentView === 'hours',\n unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n z = Math.sqrt(x * x + y * y),\n inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2;\n let radian = Math.atan2(x, -y),\n radius = inner ? this.options.innerRadius : this.options.outerRadius;\n\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n }\n\n // Radian should in range [0, 2PI]\n if (radian < 0) {\n radian = Math.PI * 2 + radian;\n }\n\n // Get the round value\n let value = Math.round(radian / unit);\n\n // Get the round radian\n radian = value * unit;\n\n // Correct the hours or minutes\n if (this.options.twelveHour) {\n if (isHours) {\n if (value === 0) value = 12;\n } else {\n if (roundBy5) value *= 5;\n if (value === 60) value = 0;\n }\n } else {\n if (isHours) {\n if (value === 12) {\n value = 0;\n }\n value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n } else {\n if (roundBy5) {\n value *= 5;\n }\n if (value === 60) {\n value = 0;\n }\n }\n }\n\n // Once hours or minutes changed, vibrate the device\n if (this[this.currentView] !== value) {\n if (this.canVibrate && this.options.vibrate) {\n // Do not vibrate too frequently\n if (!this.vibrateTimer) {\n navigator.vibrate(10);\n this.vibrateTimer = setTimeout(() => {\n this.vibrateTimer = null;\n }, 100);\n }\n }\n }\n\n this[this.currentView] = value;\n if (isHours) {\n this.inputHours.value = Timepicker._addLeadingZero(value);\n } else {\n this.inputMinutes.value = Timepicker._addLeadingZero(value);\n }\n\n // Set clock hand and others' position\n this.setClockAttributes(radian, radius);\n }\n\n setClockAttributes(radian: number, radius: number) {\n // Nothing to point at until the SVG exists.\n if (!this.hand || !this.bg) return;\n const cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n cx2 = Math.sin(radian) * radius,\n cy2 = -Math.cos(radian) * radius;\n this.hand.setAttribute('x2', cx1.toString());\n this.hand.setAttribute('y2', cy1.toString());\n this.bg.setAttribute('cx', cx2.toString());\n this.bg.setAttribute('cy', cy2.toString());\n }\n\n formatHours() {\n if (this.inputHours.value == '') this.setHoursDefault();\n this.inputHours.value = Timepicker._addLeadingZero(Number(this.inputHours.value));\n }\n\n formatMinutes() {\n if (this.inputMinutes.value == '') this.minutes = new Date().getMinutes();\n this.inputMinutes.value = Timepicker._addLeadingZero(Number(this.inputMinutes.value));\n }\n\n setHoursDefault() {\n this.hours = new Date().getHours();\n this.inputHours.value = (this.hours % (this.options.twelveHour ? 12 : 24)).toString();\n }\n\n done = (clearValue = null) => {\n // Set input value\n const last = this.el.value;\n let value = clearValue\n ? ''\n : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);\n this.time = value;\n if (!clearValue && this.options.twelveHour) {\n value = `${value} ${this.amOrPm}`;\n }\n this.el.value = value;\n // Trigger change event\n if (value !== last) {\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n };\n\n confirm = () => {\n this.done();\n if (typeof this.options.onDone === 'function') this.options.onDone.call(this);\n }\n\n cancel = () => {\n // not logical clearing the input field on cancel, since the end user might want to make use of the previously submitted value\n // this.clear();\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n }\n\n clear = () => {\n this.done(true);\n };\n\n static {\n Timepicker._template = `<div class=\"timepicker-container\">\n <div class=\"timepicker-digital-display\">\n <div class=\"timepicker-text-container\">\n <div class=\"timepicker-display-column timepicker-display-digital-clock\">\n <div class=\"timepicker-input-hours-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-hours text-primary\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-minutes-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-minutes\" />\n </div>\n </div>\n <div class=\"timepicker-display-column timepicker-display-am-pm\">\n <div class=\"timepicker-span-am-pm\"></div>\n </div>\n </div>\n </div>\n <div class=\"timepicker-analog-display\">\n <div class=\"timepicker-plate\">\n <div class=\"timepicker-canvas\"></div>\n <div class=\"timepicker-dial timepicker-hours\"></div>\n <div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>\n </div>\n <div class=\"timepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { BaseOptions } from '../core/component';\n\nexport interface SnackbarOptions extends BaseOptions {\n /**\n * The content of the Snackbar.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The snackbar still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * @default false\n */\n dismissible: boolean;\n /**\n * Element id of a `<template>` (or another element) used as the snackbar body.\n * @default \"\"\n */\n snackbarId?: string;\n /**\n * Length in ms the Snackbar stays before dismissal.\n * `Infinity` keeps it on screen until the user acts.\n * When `action` is set and this is omitted, the default is 10000.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the snackbar element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when the snackbar is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the snackbar's width it takes for a drag\n * to dismiss a Snackbar.\n * @default 0.8\n */\n activationPercent: number;\n}\n\nconst _defaults: SnackbarOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8\n};\n\nexport class Snackbar {\n /** The snackbar element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the snackbar\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Snackbar.\n */\n panning: boolean;\n options: SnackbarOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the snackbar is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n private _dismissed = false;\n\n static _snackbars: Snackbar[];\n static _container: HTMLElement;\n static _draggedSnackbar: Snackbar;\n\n constructor(options: Partial<SnackbarOptions> = {}) {\n this.options = {\n ...Snackbar.defaults,\n ...options\n };\n // With an action, stay long enough to tap it. Pass Infinity to remain\n // until the user acts; pass an explicit displayLength to override.\n if (options.displayLength === undefined && this.options.action) {\n this.options.displayLength = 10000;\n }\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n // One snackbar at a time so a new update does not stack over the page.\n if (Snackbar._snackbars.length > 0) {\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar._dismissed = true;\n clearTimeout(snackbar.counterTimeout);\n snackbar.el.remove();\n }\n Snackbar._snackbars.length = 0;\n }\n if (!Snackbar._container || !Snackbar._container.isConnected) {\n Snackbar._createContainer();\n }\n Snackbar._snackbars.push(this);\n const snackbarElement = this._createSnackbar();\n snackbarElement['Expressive_Snackbar'] = this;\n this.el = snackbarElement;\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): SnackbarOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Snackbar {\n return el['Expressive_Snackbar'];\n }\n\n static _createContainer() {\n const container = document.createElement('div');\n container.setAttribute('id', 'snackbar-container');\n // Add event handler\n container.addEventListener('touchstart', Snackbar._onDragStart);\n container.addEventListener('touchmove', Snackbar._onDragMove);\n container.addEventListener('touchend', Snackbar._onDragEnd);\n container.addEventListener('mousedown', Snackbar._onDragStart);\n document.addEventListener('mousemove', Snackbar._onDragMove);\n document.addEventListener('mouseup', Snackbar._onDragEnd);\n document.body.appendChild(container);\n Snackbar._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('mousemove', Snackbar._onDragMove);\n document.removeEventListener('mouseup', Snackbar._onDragEnd);\n Snackbar._container.remove();\n Snackbar._container = null;\n }\n\n static _onDragStart(e: TouchEvent | MouseEvent) {\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.snackbar')) {\n const snackbarElem = target.closest('.snackbar') as HTMLElement;\n const snackbar: Snackbar = snackbarElem['Expressive_Snackbar'];\n if (!snackbar) return;\n snackbar.panning = true;\n snackbar._pauseTimer();\n Snackbar._draggedSnackbar = snackbar;\n snackbar.el.classList.add('panning');\n snackbar.el.style.transition = '';\n snackbar.startingXPos = Snackbar._xPos(e);\n snackbar.time = Date.now();\n snackbar.xPos = Snackbar._xPos(e);\n }\n }\n\n static _onDragMove(e: TouchEvent | MouseEvent) {\n if (!!Snackbar._draggedSnackbar) {\n e.preventDefault();\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.deltaX = Math.abs(snackbar.xPos - Snackbar._xPos(e));\n snackbar.xPos = Snackbar._xPos(e);\n snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);\n snackbar.time = Date.now();\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;\n snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd() {\n if (!!Snackbar._draggedSnackbar) {\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || snackbar.velocityX > 1;\n\n // Remove snackbar\n if (shouldBeDismissed) {\n snackbar.wasSwiped = true;\n snackbar.dismiss();\n // Animate snackbar back to original position\n } else {\n snackbar.el.style.transition = 'transform .2s, opacity .2s';\n snackbar.el.style.transform = '';\n snackbar.el.style.opacity = '';\n snackbar._resumeTimer();\n }\n Snackbar._draggedSnackbar = null;\n }\n }\n\n static _xPos(e: TouchEvent | MouseEvent) {\n if (e.type.startsWith('touch') && (e as TouchEvent).targetTouches.length >= 1) {\n return (e as TouchEvent).targetTouches[0].clientX;\n }\n // mouse event\n return (e as MouseEvent).clientX;\n }\n\n /**\n * dismiss all snackbars.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar.dismiss();\n }\n }\n\n _createSnackbar() {\n let snackbar: HTMLElement = this.options.snackbarId\n ? document.getElementById(this.options.snackbarId)\n : document.createElement('div');\n if (snackbar instanceof HTMLTemplateElement) {\n const node = (snackbar as HTMLTemplateElement).content.cloneNode(true);\n snackbar = (node as HTMLElement).firstElementChild as HTMLElement;\n }\n snackbar.classList.add('snackbar');\n snackbar.setAttribute('role', 'status');\n snackbar.setAttribute('aria-live', 'polite');\n snackbar.setAttribute('aria-atomic', 'true');\n // Add custom classes onto snackbar\n if (this.options.classes.length > 0) {\n snackbar.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n snackbar.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (typeof this.options.onAction === 'function') {\n this.options.onAction();\n }\n this.dismiss();\n });\n snackbar.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n });\n snackbar.appendChild(close);\n }\n Snackbar._container.appendChild(snackbar);\n return snackbar;\n }\n\n _animateIn() {\n this.el.style.display = '';\n this.el.style.opacity = '0';\n this.el.style.transform = 'translateY(24px)';\n this.el.style.transition = `\n transform ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per snackbar purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this.counterTimeout != null) return;\n this._setTimer();\n }\n\n /**\n * Dismiss snackbar with animation.\n */\n dismiss() {\n if (this._dismissed) return;\n this._dismissed = true;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n const activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n if (this.wasSwiped) {\n this.el.style.transition = 'transform .05s, opacity .05s';\n this.el.style.transform = `translateX(${activationDistance}px)`;\n this.el.style.opacity = '0';\n }\n\n // easeOutExpo\n this.el.style.transition = `\n margin ${this.options.outDuration}ms ease,\n opacity ${this.options.outDuration}ms ease`;\n\n setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n setTimeout(() => {\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n // Remove snackbar from DOM\n if (this.el.id != this.options.snackbarId) {\n this.el.remove();\n // Guarded: splice(-1, 1) on an already-removed snackbar would drop an\n // unrelated one off the end of the list.\n const index = Snackbar._snackbars.indexOf(this);\n if (index >= 0) Snackbar._snackbars.splice(index, 1);\n if (\n Snackbar._snackbars.length === 0 &&\n Snackbar._container &&\n Snackbar._container.childElementCount === 0\n ) {\n Snackbar._removeContainer();\n }\n }\n }, this.options.outDuration);\n }\n\n static {\n Snackbar._snackbars = [];\n Snackbar._container = null;\n Snackbar._draggedSnackbar = null;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Bounding } from '../core/bounding';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom' as TooltipPosition,\n transitionMovement: 10,\n opacity: 1\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options, Tooltip);\n this.el['Expressive_Tooltip'] = this;\n\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tooltip.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TooltipOptions>): Tooltip;\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TooltipOptions>): Tooltip[];\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TooltipOptions> = {}\n ): Tooltip | Tooltip[] {\n return super.init(els, options, Tooltip);\n }\n\n static getInstance(el: HTMLElement): Tooltip {\n return el['Expressive_Tooltip'];\n }\n\n destroy() {\n if (this.el.getAttribute('aria-describedby') === this.tooltipEl.id) {\n this.el.removeAttribute('aria-describedby');\n }\n this.tooltipEl.remove();\n this._removeEventHandlers();\n this.el['Expressive_Tooltip'] = undefined;\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', this.tooltipEl.id);\n\n const tooltipContentEl = this.options.tooltipId\n ? document.getElementById(this.options.tooltipId)\n : document.createElement('div');\n if (this.options.tooltipId) {\n this.tooltipEl.classList.add('rich');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n document.body.appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this.options.tooltipId) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.el.addEventListener('focus', this._handleFocus, true);\n this.el.addEventListener('blur', this._handleBlur, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.el.removeEventListener('focus', this._handleFocus, true);\n this.el.removeEventListener('blur', this._handleBlur, true);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean) => {\n if (this.isOpen) return;\n isManual = isManual === undefined ? true : undefined; // Default value true\n this.isOpen = true;\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this._setExitDelayTimeout();\n };\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el as HTMLElement,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + Utils.getDocumentScrollTop();\n let targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = this._repositionWithinScreen(\n targetLeft,\n targetTop,\n tooltipWidth,\n tooltipHeight\n );\n\n tooltip.style.top = newCoordinates.y + 'px';\n tooltip.style.left = newCoordinates.x + 'px';\n }\n\n _repositionWithinScreen(x: number, y: number, width: number, height: number) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n const offset = this.options.margin + this.options.transitionMovement;\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n\n _animateIn() {\n this._positionTooltip();\n this.tooltipEl.style.visibility = 'visible';\n const duration = this.options.inDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(${this.xMovement}px) translateY(${this.yMovement}px)`;\n this.tooltipEl.style.opacity = (this.options.opacity || 1).toString();\n }, 1);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(0px) translateY(0px)`;\n this.tooltipEl.style.opacity = '0';\n }, 1);\n /*\n anim.remove(this.tooltipEl);\n anim({\n targets: this.tooltipEl,\n opacity: 0,\n translateX: 0,\n translateY: 0,\n duration: this.options.outDuration,\n easing: 'easeOutCubic'\n });\n */\n }\n\n _handleMouseEnter = () => {\n this.isHovered = true;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.open(false);\n };\n\n _handleMouseLeave = () => {\n this.isHovered = false;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.close();\n };\n\n _handleFocus = () => {\n if (Utils.tabPressed) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = () => {\n this.isFocused = false;\n this.close();\n };\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n", "import { InitElements, InitElement } from '../core/component';\nimport * as Components from './index';\nimport { CARDS_SELECTOR } from './cards';\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Snackbar,\n * CharacterCounter, Range, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n Autocomplete: { component: Components.Autocomplete, selector: '.autocomplete' },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR },\n Carousel: { component: Components.Carousel, selector: '.carousel' },\n Chips: { component: Components.Chips, selector: '.chips' },\n Datepicker: { component: Components.Datepicker, selector: '.datepicker' },\n Menu: { component: Components.Menu, selector: '.menu-trigger' },\n Lightbox: { component: Components.Lightbox, selector: '.lightboxed' },\n Parallax: { component: Components.Parallax, selector: '.parallax' },\n ScrollSpy: { component: Components.ScrollSpy, selector: '.scrollspy' },\n FormSelect: { component: Components.FormSelect, selector: 'select' },\n Sidenav: { component: Components.Sidenav, selector: '.sidenav' },\n NavigationRail: { component: Components.NavigationRail, selector: '.navigation-rail' },\n Tabs: { component: Components.Tabs, selector: '.tabs' },\n Timepicker: { component: Components.Timepicker, selector: '.timepicker' },\n Tooltip: { component: Components.Tooltip, selector: '.tooltipped' },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: '.fixed-action-btn'\n }\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<InstanceType<Registry[K]['component']>['options']>;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n init(els: InitElements<InitElement>, options: Partial<object>): unknown;\n};\n\n/**\n * Automatically initialize components.\n * @param context Root element to initialize. Defaults to `document.body`.\n * @param options Options for each component.\n */\nexport function AutoInit(\n context: HTMLElement = document.body,\n options?: Partial<AutoInitOptions>\n) {\n for (const name of Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[]) {\n const { component, selector } = AUTO_INIT_COMPONENTS[name];\n // `:is()` so that `:not(.no-autoinit)` applies to the whole selector. A\n // bare `${selector}:not(...)` binds the negation to the last alternative\n // only, which would silently break the opt-out for any comma-separated\n // entry (Cards is the first).\n const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);\n // Each component's static `init` is overloaded; indexing the table widens\n // it to a union TypeScript cannot call, so narrow it once, here.\n (component as unknown as AutoInitable).init(els, options?.[name] ?? {});\n }\n}\n", "// Public entry point of the bundle.\n//\n// Layout:\n// core/ Component base class, Utils, shared types\n// components/ per-element widgets (+ index.ts barrel, registry.ts)\n// behaviors/ document-level enhancers, started below at import time\n// plugins/ helpers that are not Components\n//\n// See src/ts/README.md before adding anything.\n\nimport { Utils } from './core/utils';\nimport { Cards } from './components/cards';\nimport { Chips } from './components/chips';\nimport { Range } from './components/range';\nimport { Dialogs } from './behaviors/dialogs';\nimport { BottomSheets } from './behaviors/bottomSheets';\nimport { SideSheets } from './behaviors/sideSheets';\nimport { Forms } from './behaviors/forms';\nimport { Waves } from './behaviors/waves';\n\nexport * from './components';\nexport { Dialogs } from './behaviors/dialogs';\nexport { BottomSheets } from './behaviors/bottomSheets';\nexport { SideSheets } from './behaviors/sideSheets';\nexport { Forms } from './behaviors/forms';\nexport { Waves } from './behaviors/waves';\nexport { AutoInit } from './components/registry';\nexport type { AutoInitOptions } from './components/registry';\n\nexport const version = '0.7.0-rc.0';\n\n// Side effects: importing the bundle wires up the document-level behaviors and\n// the delegated listeners the components below rely on. Order is preserved from\n// the original bundle - do not reorder without checking the event handlers.\n\nif (typeof document !== 'undefined') {\n document.addEventListener('keydown', Utils.docHandleKeydown, true);\n document.addEventListener('keyup', Utils.docHandleKeyup, true);\n document.addEventListener('focus', Utils.docHandleFocus, true);\n document.addEventListener('blur', Utils.docHandleBlur, true);\n}\nForms.Init();\nChips.Init();\nWaves.Init();\nRange.Init();\nCards.Init();\nDialogs.Init();\nBottomSheets.Init();\nSideSheets.Init();\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "
|
|
3
|
+
"sources": ["../../src/ts/core/utils.ts", "../../src/ts/core/component.ts", "../../src/ts/components/cards.ts", "../../src/ts/components/expandingCard.ts", "../../src/ts/components/menu.ts", "../../src/ts/components/autocomplete.ts", "../../src/ts/components/chips.ts", "../../src/ts/components/slider.ts", "../../src/ts/behaviors/dialogs.ts", "../../src/ts/behaviors/sheetDrag.ts", "../../src/ts/behaviors/bottomSheets.ts", "../../src/ts/behaviors/sideSheets.ts", "../../src/ts/behaviors/forms.ts", "../../src/ts/components/buttons.ts", "../../src/ts/components/carousel.ts", "../../src/ts/components/characterCounter.ts", "../../src/ts/components/select.ts", "../../src/ts/plugins/dockedDisplayPlugin.ts", "../../src/ts/components/datepicker.ts", "../../src/ts/components/lightbox.ts", "../../src/ts/components/scrollspy.ts", "../../src/ts/components/navigationDrawer.ts", "../../src/ts/components/navigationRail.ts", "../../src/ts/components/tabs.ts", "../../src/ts/components/timepicker.ts", "../../src/ts/components/snackbar.ts", "../../src/ts/components/tooltip.ts", "../../src/ts/components/registry.ts", "../../src/ts/index.ts"],
|
|
4
|
+
"sourcesContent": ["/** The part of a `DOMRect` the positioning helpers below actually read. */\ntype Bounding = Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>;\n\n/** Which edges of a container a box has crossed. */\ntype Edges = { top: boolean; right: boolean; bottom: boolean; left: boolean };\n\n/**\n * Class with utilitary functions for global usage.\n */\nexport class Utils {\n /**\n * Key maps. One `KeyboardEvent.key` value each: the second entries these used\n * to carry (`Esc`, `Up`, `Del`, ...) were IE and Edge Legacy spellings, and\n * the support baseline excludes both.\n */\n static keys = {\n TAB: 'Tab',\n ENTER: 'Enter',\n ESC: 'Escape',\n BACKSPACE: 'Backspace',\n ARROW_UP: 'ArrowUp',\n ARROW_DOWN: 'ArrowDown',\n ARROW_LEFT: 'ArrowLeft',\n ARROW_RIGHT: 'ArrowRight',\n DELETE: 'Delete'\n };\n\n /**\n * Run `callback` once the document is parsed.\n *\n * The document-level behaviors all used a bare DOMContentLoaded listener,\n * which never fires if the bundle is loaded after that event - an async or\n * deferred script tag, or a dynamic import. Checking readyState first covers\n * both orders.\n */\n static onDocumentReady(callback: () => void): void {\n if (typeof document === 'undefined') return;\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n } else {\n callback();\n }\n }\n\n /**\n * Generates a unique string identifier. Every caller prefixes the result and\n * uses it as an element id, and a UUID is valid in that position.\n *\n * `randomUUID` is exposed only in secure contexts, and a dev server on a\n * plain-HTTP LAN address - the usual way a page is opened on a phone - is\n * not one. Without the fallback every component that stamps an id would\n * throw there. The ids only have to be unique within one document, so the\n * fallback does not need to be cryptographic.\n */\n static guid(): string {\n return (\n globalThis.crypto?.randomUUID?.() ??\n `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n );\n }\n\n /**\n * Where an element created at runtime has to be appended to stay in the same\n * tree as `el`. A stylesheet adopted into a shadow root cannot match a node\n * in the document, so a portal that lands on `document.body` is unstyled\n * whenever its origin lives in a shadow root (adr/0002).\n *\n * Light-DOM elements still get `document.body`, which is what escapes an\n * ancestor's `overflow: hidden` and stacking context. Inside a shadow root\n * both hazards come back: the host's own ancestors still form the containing\n * block, so a transformed ancestor re-anchors `position: fixed` and a\n * positioned one re-anchors `position: absolute`.\n */\n static portalRoot(el: Node): HTMLElement | ShadowRoot {\n const root = el.getRootNode() as ShadowRoot;\n // Only a ShadowRoot has a host; a Document or a detached subtree does not.\n return root.host ? root : document.body;\n }\n\n /**\n * `getElementById` against the tree `el` lives in. The mirror of\n * `portalRoot`: an id in a shadow root is invisible to\n * `document.getElementById`, so a trigger and its target inside the same\n * root could not find each other at all.\n *\n * Falls back to the document for a detached `el`, whose root is a plain\n * element with no lookup of its own.\n */\n static getElementById(el: Node, id: string): HTMLElement {\n const root = el.getRootNode() as Document | ShadowRoot;\n return (root.getElementById ? root.getElementById(id) : document.getElementById(id)) as HTMLElement;\n }\n\n /**\n * Checks for exceeded edges\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkWithinContainer(container: HTMLElement, bounding: Bounding, offset: number): Edges {\n const edges = {\n top: false,\n right: false,\n bottom: false,\n left: false\n };\n\n const containerRect = container.getBoundingClientRect();\n // If body element is smaller than viewport, use viewport height instead.\n const containerBottom =\n container === document.body\n ? Math.max(containerRect.bottom, window.innerHeight)\n : containerRect.bottom;\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledY = bounding.top - scrollTop;\n\n // Check for container and viewport for each edge\n if (scrolledX < containerRect.left + offset || scrolledX < offset) {\n edges.left = true;\n }\n\n if (\n scrolledX + bounding.width > containerRect.right - offset ||\n scrolledX + bounding.width > window.innerWidth - offset\n ) {\n edges.right = true;\n }\n\n if (scrolledY < containerRect.top + offset || scrolledY < offset) {\n edges.top = true;\n }\n\n if (\n scrolledY + bounding.height > containerBottom - offset ||\n scrolledY + bounding.height > window.innerHeight - offset\n ) {\n edges.bottom = true;\n }\n\n return edges;\n }\n\n /**\n * Checks if element can be aligned in multiple directions.\n * @param el Element to be inspected.\n * @param container Container element.\n * @param bounding Bounding rect.\n * @param offset Element offset.\n */\n static checkPossibleAlignments(\n el: HTMLElement,\n container: HTMLElement,\n bounding: Bounding,\n offset: number\n ) {\n const canAlign: {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n spaceOnTop: number;\n spaceOnRight: number;\n spaceOnBottom: number;\n spaceOnLeft: number;\n } = {\n top: true,\n right: true,\n bottom: true,\n left: true,\n spaceOnTop: null,\n spaceOnRight: null,\n spaceOnBottom: null,\n spaceOnLeft: null\n };\n\n const containerAllowsOverflow = getComputedStyle(container).overflow === 'visible';\n const containerRect = container.getBoundingClientRect();\n const containerHeight = Math.min(containerRect.height, window.innerHeight);\n const containerWidth = Math.min(containerRect.width, window.innerWidth);\n const elOffsetRect = el.getBoundingClientRect();\n\n const scrollLeft = container.scrollLeft;\n const scrollTop = container.scrollTop;\n\n const scrolledX = bounding.left - scrollLeft;\n const scrolledYTopEdge = bounding.top - scrollTop;\n const scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop;\n\n // Check for container and viewport for left\n canAlign.spaceOnRight = !containerAllowsOverflow\n ? containerWidth - (scrolledX + bounding.width)\n : window.innerWidth - (elOffsetRect.left + bounding.width);\n if (canAlign.spaceOnRight < 0) {\n canAlign.left = false;\n }\n\n // Check for container and viewport for Right\n canAlign.spaceOnLeft = !containerAllowsOverflow\n ? scrolledX - bounding.width + elOffsetRect.width\n : elOffsetRect.right - bounding.width;\n if (canAlign.spaceOnLeft < 0) {\n canAlign.right = false;\n }\n\n // Check for container and viewport for Top\n canAlign.spaceOnBottom = !containerAllowsOverflow\n ? containerHeight - (scrolledYTopEdge + bounding.height + offset)\n : window.innerHeight - (elOffsetRect.top + bounding.height + offset);\n if (canAlign.spaceOnBottom < 0) {\n canAlign.top = false;\n }\n\n // Check for container and viewport for Bottom\n canAlign.spaceOnTop = !containerAllowsOverflow\n ? scrolledYBottomEdge - (bounding.height - offset)\n : elOffsetRect.bottom - (bounding.height + offset);\n if (canAlign.spaceOnTop < 0) {\n canAlign.bottom = false;\n }\n\n return canAlign;\n }\n\n /**\n * Retrieves target element id from trigger.\n * @param trigger Trigger element.\n */\n static getIdFromTrigger(trigger: HTMLElement): string {\n let id = trigger.dataset.target;\n if (!id) {\n id = trigger.getAttribute('href');\n return id ? id.slice(1) : '';\n }\n return id;\n }\n\n /**\n * Retrieves document scroll postion from top.\n */\n static getDocumentScrollTop(): number {\n return window.scrollY;\n }\n\n /**\n * Retrieves document scroll postion from left.\n */\n static getDocumentScrollLeft(): number {\n return window.scrollX;\n }\n\n /**\n * Trailing-edge throttle: run `func` now, then at most once per `wait` ms\n * with the most recent arguments.\n *\n * This used to carry its underscore ancestor's whole configuration - leading\n * and trailing switches, a result passthrough - and both call sites are\n * resize handlers passing nothing but a function and a delay.\n *\n * Assign the return value once. `x = Utils.throttle(fn, 200)` is right;\n * wrapping it in an arrow builds a fresh closure per event and never calls\n * it, which is how resize handling was dead in three components.\n */\n static throttle(func: (...args: unknown[]) => void, wait: number) {\n let timeout: ReturnType<typeof setTimeout> = null;\n let lastArgs: unknown[] = null;\n let previous = 0;\n\n return (...args: unknown[]) => {\n const now = Date.now();\n const remaining = wait - (now - previous);\n if (remaining <= 0) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n lastArgs = null;\n func(...args);\n } else if (!timeout) {\n // The trailing call replays the most recent arguments; without this it\n // used to fire with none at all.\n lastArgs = args;\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func(...(lastArgs ?? []));\n lastArgs = null;\n }, remaining);\n } else {\n lastArgs = args;\n }\n };\n }\n\n /**\n * Renders confirm/close buttons with callback function\n */\n static createConfirmationContainer(\n container: HTMLElement,\n confirmText: string,\n cancelText: string,\n onConfirm: (Function: object) => void,\n onCancel: (Function: object) => void\n ): void {\n const confirmationButtonsContainer = document.createElement('div');\n confirmationButtonsContainer.classList.add('confirmation-btns');\n container.append(confirmationButtonsContainer);\n\n this.createButton(confirmationButtonsContainer, cancelText, ['btn-cancel'], true, onCancel);\n this.createButton(confirmationButtonsContainer, confirmText, ['btn-confirm'], true, onConfirm);\n }\n\n /**\n * Renders a button with optional callback function\n */\n static createButton(\n container: HTMLElement,\n text: string,\n className: string[] = [],\n visibility: boolean = true,\n callback: (Function: object) => void = null\n ): void {\n className = className.concat(['text']);\n const button = document.createElement('button');\n button.className = className.join(' ');\n button.style.visibility = visibility ? 'visible' : 'hidden';\n button.type = 'button';\n button.tabIndex = !!visibility ? 0 : -1;\n button.innerText = text;\n // The keypress handler used to call `callback` unconditionally, so a\n // button created without one threw on Enter.\n if (typeof callback === 'function') {\n button.addEventListener('click', callback);\n button.addEventListener('keypress', (e) => {\n if (e.key === Utils.keys.ENTER) callback(e);\n });\n }\n container.append(button);\n }\n\n static _setAbsolutePosition(\n origin: HTMLElement,\n container: HTMLElement,\n position: string,\n margin: number,\n transitionMovement: number,\n align: string = 'center'\n ) {\n const originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n containerHeight = container.offsetHeight,\n containerWidth = container.offsetWidth,\n originRect = origin.getBoundingClientRect(); // one rect, read twice below\n let xMovement = 0,\n yMovement = 0,\n targetTop = originRect.top + Utils.getDocumentScrollTop(),\n targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n\n if (position === 'top') {\n targetTop += -containerHeight - margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = -transitionMovement;\n } else if (position === 'right') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = originWidth + margin;\n xMovement = transitionMovement;\n } else if (position === 'left') {\n targetTop += originHeight / 2 - containerHeight / 2;\n targetLeft = -containerWidth - margin;\n xMovement = -transitionMovement;\n } else {\n targetTop += originHeight + margin;\n if (align === 'center') {\n targetLeft += originWidth / 2 - containerWidth / 2; // This is center align\n }\n yMovement = transitionMovement;\n }\n if (align === 'right') {\n targetLeft += originWidth - containerWidth - margin;\n }\n\n const newCoordinates = Utils._repositionWithinScreen(\n targetLeft,\n targetTop,\n containerWidth,\n containerHeight,\n margin,\n transitionMovement,\n align\n );\n\n container.style.top = newCoordinates.y + 'px';\n container.style.left = newCoordinates.x + 'px';\n\n return {x: xMovement, y: yMovement};\n }\n\n static _repositionWithinScreen(\n x: number,\n y: number,\n width: number,\n height: number,\n margin: number,\n transitionMovement: number,\n align: string\n ) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding: Bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n let offset: number;\n if (align === 'left' || align == 'center') {\n offset = margin + transitionMovement;\n } else if (align === 'right') {\n offset = margin - transitionMovement;\n }\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n}\n", "/**\n * Base options for component initialization.\n */\nexport interface BaseOptions {}\n\nexport type InitElement = HTMLElement | Element;\nexport type InitElements<T extends InitElement> = NodeListOf<T> | HTMLCollectionOf<T>;\ntype ComponentConstructor<T extends Component<O>, O extends BaseOptions> = {\n new (el: HTMLElement, options: Partial<O>): T;\n};\ntype ComponentType<C extends Component<O>, O extends BaseOptions> = ComponentConstructor<C, O> &\n typeof Component<O>;\n\nexport interface I18nOptions {\n cancel: string;\n clear: string;\n done: string;\n}\n\nexport interface Openable {\n isOpen: boolean;\n open(): void;\n close(): void;\n}\n\n/**\n * Base class implementation for Expressive components.\n */\nexport class Component<O extends BaseOptions> {\n /**\n * The DOM element the plugin was initialized with.\n */\n el: HTMLElement;\n /**\n * The options the instance was initialized with.\n */\n options: O;\n\n /**\n * Constructs component instance and set everything up.\n */\n constructor(el: HTMLElement, options: Partial<O>, classDef: ComponentType<Component<O>, O>) {\n // Display error if el is not a valid HTML Element\n if (!(el instanceof HTMLElement)) {\n console.error(Error(el + ' is not an HTML Element'));\n }\n // If exists, destroy and reinitialize in child\n const ins = classDef.getInstance(el);\n if (!!ins) {\n ins.destroy();\n }\n this.el = el;\n }\n\n /**\n * Initializes component instance.\n * @param el HTML element.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends HTMLElement, O extends BaseOptions, C extends Component<O>>(\n el: I,\n options: O,\n classDef: ComponentType<C, O>\n ): C;\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[];\n /**\n * Initializes component instances.\n * @param els HTML elements.\n * @param options Component options.\n * @param classDef Class definition.\n */\n protected static init<I extends InitElement, O extends BaseOptions, C extends Component<O>>(\n els: I | InitElements<I>,\n options: Partial<O>,\n classDef: ComponentType<C, O>\n ): C | C[] {\n let instances = null;\n if (els instanceof Element) {\n instances = new classDef(<HTMLElement>els, options);\n } else if (!!els && els.length) {\n instances = [];\n for (let i = 0; i < els.length; i++) {\n instances.push(new classDef(<HTMLElement>els[i], options));\n }\n }\n return instances;\n }\n\n /**\n * @returns default options for component instance.\n */\n static get defaults(): BaseOptions {\n return {};\n }\n\n /**\n * Retrieves component instance for the given element.\n * @param el Associated HTML Element.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getInstance(el: HTMLElement): Component<BaseOptions> {\n throw new Error('This method must be implemented.');\n }\n\n /**\n * Destroy plugin instance and teardown.\n */\n destroy(): void {\n throw new Error('This method must be implemented.');\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface CardsOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: CardsOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * What counts as a card.\n *\n * Shared with `components/registry.ts` rather than written out twice: the\n * registry used to claim `.cards`, which matches nothing this component\n * actually initializes, so the AutoInit entry was dead while `Cards.Init()`\n * quietly did the work through the selector below.\n */\nexport const CARDS_SELECTOR = 'article:has(> aside)';\n\nexport class Cards extends Component<CardsOptions> implements Openable {\n isOpen: boolean = false;\n private readonly cardReveal: HTMLElement | null;\n private _activators: HTMLElement[] | null;\n private cardRevealClose: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<CardsOptions>) {\n super(el, options, Cards);\n this.el['Expressive_Cards'] = this;\n\n this.options = {\n ...Cards.defaults,\n ...options\n };\n\n this._activators = [];\n\n this.cardReveal = this.el.querySelector(':scope > aside');\n if (this.cardReveal) {\n this._activators = Array.from(\n this.el.querySelectorAll<HTMLElement>('.activator')\n ).filter(\n (activator: HTMLElement) => !this.cardReveal.contains(activator)\n );\n this._activators.forEach((el: HTMLElement) => {\n if (!el) return;\n el.tabIndex = 0;\n el.ariaExpanded = 'false';\n if (!el.matches('a[href], button, input, select, textarea')) {\n el.setAttribute('role', 'button');\n }\n });\n\n this.cardRevealClose = this.cardReveal.querySelector(\n ':scope > :is(h1, h2, h3, h4, h5, h6)'\n );\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n\n this.cardReveal.ariaExpanded = 'false';\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): CardsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Cards.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CardsOptions>): Cards;\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<CardsOptions>): Cards[];\n /**\n * Initializes instances of Cards.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options?: Partial<CardsOptions>\n ): Cards | Cards[] {\n return super.init(els, options, Cards);\n }\n\n static getInstance(el: HTMLElement): Cards {\n return el['Expressive_Cards'];\n }\n\n /**\n * {@inheritDoc}\n */\n destroy() {\n this._removeEventHandlers();\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n this._activators = [];\n this.el['Expressive_Cards'] = undefined;\n }\n\n _setupEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.addEventListener('click', this._handleClickInteraction);\n el.addEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _removeEventHandlers = () => {\n this._activators.forEach((el: HTMLElement) => {\n el.removeEventListener('click', this._handleClickInteraction);\n el.removeEventListener('keypress', this._handleKeypressEvent);\n });\n };\n\n _handleClickInteraction = () => {\n this._handleRevealEvent();\n };\n\n _handleKeypressEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER || e.key === ' ') {\n e.preventDefault();\n this._handleRevealEvent();\n }\n };\n\n _handleRevealEvent = () => {\n if (this.isOpen) this.close();\n else this.open();\n };\n\n _setupRevealCloseEventHandlers = () => {\n this.cardRevealClose.addEventListener('click', this.close);\n this.cardRevealClose.addEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _removeRevealCloseEventHandlers = () => {\n this.cardRevealClose.removeEventListener('click', this.close);\n this.cardRevealClose.removeEventListener('keypress', this._handleKeypressCloseEvent);\n };\n\n _handleKeypressCloseEvent: (e: KeyboardEvent) => void = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n this.close();\n }\n };\n\n /**\n * Show card reveal.\n */\n open: () => void = () => {\n if (this.isOpen || !this.cardReveal) return;\n this.isOpen = true;\n this.cardReveal.ariaExpanded = 'true';\n this._activators.forEach((el: HTMLElement) => (el.ariaExpanded = 'true'));\n // A reveal without a title has no close affordance; that is allowed.\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = 0;\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this);\n }\n if (this.cardRevealClose) this._setupRevealCloseEventHandlers();\n };\n\n /**\n * Hide card reveal.\n */\n close: () => void = () => {\n if (!this.isOpen || !this.cardReveal) return;\n this.isOpen = false;\n this.cardReveal.ariaExpanded = 'false';\n this._activators.forEach((el: HTMLElement) => (el.ariaExpanded = 'false'));\n if (this.cardRevealClose) this.cardRevealClose.tabIndex = -1;\n if (typeof this.options.onClose === 'function') {\n this.options.onClose.call(this);\n }\n if (this.cardRevealClose) this._removeRevealCloseEventHandlers();\n };\n\n static Init() {\n // Handle initialization of static cards.\n Utils.onDocumentReady(() => {\n const cards = document.querySelectorAll(CARDS_SELECTOR);\n cards.forEach((el) => {\n if (el && el['Expressive_Cards'] == undefined) this.init(el as HTMLElement);\n });\n });\n }\n}\n", "import { Utils } from \"../core/utils\";\nimport {\n Component,\n BaseOptions,\n InitElements,\n InitElement,\n Openable,\n} from \"../core/component\";\n\nexport interface ExpandingCardOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: ExpandingCardOptions = {\n onOpen: null,\n onClose: null,\n};\n\nconst MOTION_DURATION = 500;\n\nexport const EXPANDING_CARD_SELECTOR =\n \"article.expanding-card:has(> dialog.expanding-card-dialog)\";\n\n/**\n * Morphs a compact card into a full-screen modal detail surface.\n */\nexport class ExpandingCard\n extends Component<ExpandingCardOptions>\n implements Openable\n{\n isOpen: boolean = false;\n private readonly trigger: HTMLElement | null;\n private readonly dialog: HTMLDialogElement | null;\n private readonly closeButton: HTMLElement | null;\n private closeTimer: number | null = null;\n\n constructor(el: HTMLElement, options: Partial<ExpandingCardOptions>) {\n super(el, options, ExpandingCard);\n this.el[\"Expressive_ExpandingCard\"] = this;\n\n this.options = {\n ...ExpandingCard.defaults,\n ...options,\n };\n\n this.dialog = this.el.querySelector(\n \":scope > dialog.expanding-card-dialog\",\n );\n this.trigger = this.el.querySelector(\n \":scope > .expanding-card-trigger, :scope > figure > .expanding-card-trigger\",\n );\n this.closeButton =\n this.dialog?.querySelector(\".expanding-card-close\") ?? null;\n\n if (this.trigger && this.dialog) {\n this.trigger.ariaExpanded = \"false\";\n if (this.dialog.id)\n this.trigger.setAttribute(\"aria-controls\", this.dialog.id);\n if (!this.trigger.matches(\"a[href], button, input, select, textarea\")) {\n this.trigger.tabIndex = 0;\n this.trigger.setAttribute(\"role\", \"button\");\n }\n this.dialog.ariaExpanded = \"false\";\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): ExpandingCardOptions {\n return _defaults;\n }\n\n static init(\n el: HTMLElement,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options?: Partial<ExpandingCardOptions>,\n ): ExpandingCard | ExpandingCard[] {\n return super.init(els, options, ExpandingCard);\n }\n\n static getInstance(el: HTMLElement): ExpandingCard {\n return el[\"Expressive_ExpandingCard\"];\n }\n\n destroy() {\n this._removeEventHandlers();\n if (this.closeTimer !== null) window.clearTimeout(this.closeTimer);\n this.dialog?.classList.remove(\"expanded\");\n if (this.dialog?.open) this.dialog.close();\n this.el[\"Expressive_ExpandingCard\"] = undefined;\n }\n\n private _setupEventHandlers = () => {\n this.trigger?.addEventListener(\"click\", this.open);\n this.trigger?.addEventListener(\"keypress\", this._handleTriggerKeypress);\n this.closeButton?.addEventListener(\"click\", this.close);\n this.dialog?.addEventListener(\"cancel\", this._handleCancel);\n this.dialog?.addEventListener(\"close\", this._handleNativeClose);\n };\n\n private _removeEventHandlers = () => {\n this.trigger?.removeEventListener(\"click\", this.open);\n this.trigger?.removeEventListener(\"keypress\", this._handleTriggerKeypress);\n this.closeButton?.removeEventListener(\"click\", this.close);\n this.dialog?.removeEventListener(\"cancel\", this._handleCancel);\n this.dialog?.removeEventListener(\"close\", this._handleNativeClose);\n };\n\n private _handleTriggerKeypress = (event: KeyboardEvent) => {\n if (event.key === Utils.keys.ENTER || event.key === \" \") {\n event.preventDefault();\n this.open();\n }\n };\n\n private _handleCancel = (event: Event) => {\n event.preventDefault();\n this.close();\n };\n\n private _handleNativeClose = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.trigger.ariaExpanded = \"false\";\n this.dialog.ariaExpanded = \"false\";\n this.dialog.classList.remove(\"expanded\");\n };\n\n private _setTransitionOrigin = () => {\n if (!this.dialog) return;\n const card = this.el.getBoundingClientRect();\n const media = this.el.querySelector<HTMLElement>(\n \":scope > figure, :scope > img\",\n );\n const mediaRect = media?.getBoundingClientRect();\n\n this.dialog.style.setProperty(\n \"--md-comp-expanding-card-from-top\",\n `${Math.max(0, card.top)}px`,\n );\n this.dialog.style.setProperty(\n \"--md-comp-expanding-card-from-right\",\n `${Math.max(0, window.innerWidth - card.right)}px`,\n );\n this.dialog.style.setProperty(\n \"--md-comp-expanding-card-from-bottom\",\n `${Math.max(0, window.innerHeight - card.bottom)}px`,\n );\n this.dialog.style.setProperty(\n \"--md-comp-expanding-card-from-left\",\n `${Math.max(0, card.left)}px`,\n );\n this.dialog.style.setProperty(\n \"--md-comp-expanding-card-from-media-height\",\n `${Math.max(0, mediaRect?.height ?? 0)}px`,\n );\n };\n\n open: () => void = () => {\n if (this.isOpen || !this.dialog || !this.trigger) return;\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n\n this._setTransitionOrigin();\n this.isOpen = true;\n this.trigger.ariaExpanded = \"true\";\n this.dialog.ariaExpanded = \"true\";\n this.dialog.showModal();\n // Commit the clipped start frame before asking CSS to expand it.\n void this.dialog.offsetWidth;\n this.dialog.classList.add(\"expanded\");\n this.closeButton?.focus();\n\n if (typeof this.options.onOpen === \"function\") {\n this.options.onOpen.call(this, this.el);\n }\n };\n\n close: () => void = () => {\n if (!this.isOpen || !this.dialog || !this.trigger) return;\n this._setTransitionOrigin();\n this.isOpen = false;\n this.trigger.ariaExpanded = \"false\";\n this.dialog.ariaExpanded = \"false\";\n this.dialog.classList.remove(\"expanded\");\n\n if (typeof this.options.onClose === \"function\") {\n this.options.onClose.call(this, this.el);\n }\n\n const finish = () => {\n this.closeTimer = null;\n if (this.dialog.open) this.dialog.close();\n this.trigger.focus();\n };\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n if (reducedMotion) finish();\n else this.closeTimer = window.setTimeout(finish, MOTION_DURATION);\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {\n if (el && el[\"Expressive_ExpandingCard\"] == undefined) {\n this.init(el as HTMLElement);\n }\n });\n });\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface MenuOptions extends BaseOptions {\n /**\n * Defines the edge the menu is aligned to.\n * @default 'left'\n */\n alignment: 'left' | 'right';\n /**\n * If true, automatically focus menu el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the menu activator.\n *\n * A trigger narrower than the surface's own 112dp minimum cannot be\n * honoured, so such a menu is sized to its content instead - see\n * MIN_SURFACE_WIDTH.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the menu.\n * @default null\n */\n container: Element | ShadowRoot;\n /**\n * If false, the menu will show below the trigger.\n * That is the M3 placement. Pass `true` to cover the trigger.\n * @default false\n */\n coverTrigger: boolean;\n /**\n * If true, close menu on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the menu will open on hover.\n * @default false\n */\n hover: boolean;\n /**\n * The duration of the transition enter in milliseconds.\n * @default 150\n */\n inDuration: number;\n /**\n * The duration of the transition out in milliseconds.\n * @default 250\n */\n outDuration: number;\n /**\n * Function called when menu starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when menu starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when menu finishes exiting.\n * @default null\n */\n onCloseEnd: (el: HTMLElement) => void;\n /**\n * Function called when item is clicked.\n * @default null\n */\n onItemClick: (el: HTMLLIElement) => void;\n}\n\n// The menu surface's own width bounds, stated in `components/_menu.scss` and\n// restated here because the constraint below has to reason about them.\nconst MIN_SURFACE_WIDTH = 112;\nconst MAX_SURFACE_WIDTH = 280;\n\nconst _defaults: MenuOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: false,\n closeOnClick: true,\n hover: false,\n inDuration: 150,\n outDuration: 250,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null,\n onItemClick: null\n};\n\nconst SPACE = ' ';\n\nexport class Menu extends Component<MenuOptions> implements Openable {\n static _menus: Menu[] = [];\n /** ID of the menu element. */\n id: string;\n /** The DOM element of the menu. */\n menuEl: HTMLElement;\n /** If the menu is open. */\n isOpen: boolean;\n /** If the menu content is scrollable. */\n isScrollable: boolean;\n isTouchMoving: boolean;\n /** The index of the item focused. */\n focusedIndex: number;\n filterQuery: string[];\n filterTimeout: ReturnType<typeof setTimeout>;\n\n constructor(el: HTMLElement, options: Partial<MenuOptions>) {\n super(el, options, Menu);\n this.el['Expressive_Menu'] = this;\n\n Menu._menus.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.menuEl = Utils.getElementById(el, this.id);\n\n this.options = {\n ...Menu.defaults,\n ...options\n };\n\n this.isOpen = false;\n this.isScrollable = false;\n this.isTouchMoving = false;\n this.focusedIndex = -1;\n this.filterQuery = [];\n this.el.ariaExpanded = 'false';\n if (!this.el.hasAttribute('aria-haspopup')) this.el.setAttribute('aria-haspopup', 'menu');\n if (this.id && !this.el.hasAttribute('aria-controls'))\n this.el.setAttribute('aria-controls', this.id);\n\n // Keep the menu next to the trigger so positioning stays local.\n this._moveMenuToElement();\n this._setupAccessibility();\n this._makeMenuFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): MenuOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Menu.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<MenuOptions>): Menu;\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<MenuOptions>): Menu[];\n /**\n * Initializes instances of Menu.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<MenuOptions> = {}\n ): Menu | Menu[] {\n return super.init(els, options, Menu);\n }\n\n static getInstance(el: HTMLElement): Menu {\n return el['Expressive_Menu'];\n }\n\n destroy() {\n clearTimeout(this.filterTimeout);\n this._resetMenuStyles();\n this._removeEventHandlers();\n // Temporary handlers only exist while open, but removing them is a no-op\n // otherwise and leaving them attached leaks the instance.\n this._removeTemporaryEventHandlers();\n const index = Menu._menus.indexOf(this);\n if (index >= 0) Menu._menus.splice(index, 1);\n this.el['Expressive_Menu'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.menuEl?.addEventListener('click', this._handleMenuClick);\n if (this.menuEl?.querySelector(':scope > li > menu')) {\n this.menuEl.addEventListener('mouseover', this._handleSubmenuAlign);\n }\n // Hover event handlers\n if (this.options.hover) {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `menuEl` is optional-chained on the way in (the trigger may point at\n // an id that does not resolve); it has to be here too, or destroy() throws\n // before it can detach anything else.\n this.el.removeEventListener('keydown', this._handleTriggerKeydown);\n this.menuEl?.removeEventListener('click', this._handleMenuClick);\n this.menuEl?.removeEventListener('mouseover', this._handleSubmenuAlign);\n if (this.options.hover) {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.menuEl?.removeEventListener('mouseleave', this._handleMouseLeave);\n } else {\n this.el.removeEventListener('click', this._handleClick);\n }\n }\n\n _setupTemporaryEventHandlers() {\n document.body.addEventListener('click', this._handleDocumentClick);\n document.body.addEventListener('touchmove', this._handleDocumentTouchmove, {\n passive: true\n });\n this.menuEl?.addEventListener('keydown', this._handleMenuKeydown);\n window.addEventListener('resize', this._handleWindowResize);\n }\n\n _removeTemporaryEventHandlers() {\n document.body.removeEventListener('click', this._handleDocumentClick);\n document.body.removeEventListener('touchmove', this._handleDocumentTouchmove);\n this.menuEl?.removeEventListener('keydown', this._handleMenuKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveMenu((<HTMLElement>e.target).closest('li'));\n this.open();\n };\n\n _handleMouseLeave = (e: MouseEvent) => {\n const toEl = e.relatedTarget as HTMLElement;\n // relatedTarget is null when the pointer leaves the window entirely.\n if (!toEl) {\n this.close();\n return;\n }\n const leaveToMenuContent = !!(this.menuEl && toEl && this.menuEl.contains(toEl));\n let leaveToActiveMenuTrigger = false;\n const closestTrigger = toEl.closest('.menu-trigger');\n if (\n closestTrigger &&\n !!closestTrigger['Expressive_Menu'] &&\n closestTrigger['Expressive_Menu'].isOpen\n ) {\n leaveToActiveMenuTrigger = true;\n }\n // Close hover menu if mouse did not leave to either active menu-trigger or menu-content\n if (!leaveToActiveMenuTrigger && !leaveToMenuContent) {\n this.close();\n }\n };\n\n _handleDocumentClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n if (this._isSubmenuTriggerClick(target)) return;\n if (this.options.closeOnClick && this.menuEl?.contains(target) && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!this.menuEl?.contains(target)) {\n // Do this one frame later so that if the element clicked also triggers _handleClick\n // For example, if a label for a select was clicked, that we don't close/open the menu\n setTimeout(() => {\n if (this.isOpen) {\n this.close();\n }\n }, 0);\n }\n this.isTouchMoving = false;\n };\n\n _handleTriggerKeydown = (e: KeyboardEvent) => {\n // M3: Space, Enter, Arrow Down, and Arrow Up open a closed menu.\n const opensMenu =\n e.key === SPACE ||\n e.key === Utils.keys.ENTER ||\n e.key === Utils.keys.ARROW_DOWN ||\n e.key === Utils.keys.ARROW_UP;\n if (opensMenu && !this.isOpen) {\n e.preventDefault();\n this.open();\n }\n };\n\n _handleDocumentTouchmove = (e: TouchEvent) => {\n const target = <HTMLElement>e.target;\n if (this.menuEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleMenuClick = (e: MouseEvent) => {\n const target = <HTMLElement>e.target;\n const li = target.closest('li');\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n if (li && this._isSubmenuTriggerClick(target)) {\n e.preventDefault();\n e.stopPropagation();\n this._toggleSubmenu(li);\n return;\n }\n if (li && typeof this.options.onItemClick === 'function') {\n this.options.onItemClick.call(this, li);\n }\n };\n\n private _setupAccessibility() {\n if (!this.menuEl) return;\n if (!this.menuEl.hasAttribute('role')) this.menuEl.setAttribute('role', 'menu');\n\n const menus = [this.menuEl, ...this.menuEl.querySelectorAll('menu')];\n menus.forEach((menu) => {\n if (!menu.hasAttribute('role')) menu.setAttribute('role', 'menu');\n if (menu.getAttribute('role') !== 'menu') return;\n\n menu.querySelectorAll(':scope > li').forEach((li) => {\n if (li.classList.contains('divider')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'separator');\n return;\n }\n if (li.classList.contains('gap')) {\n li.setAttribute('aria-hidden', 'true');\n return;\n }\n if (li.classList.contains('label') || li.classList.contains('optgroup')) {\n if (!li.hasAttribute('role')) li.setAttribute('role', 'presentation');\n return;\n }\n if (!li.hasAttribute('role')) li.setAttribute('role', 'menuitem');\n if (li.classList.contains('disabled') && !li.hasAttribute('aria-disabled')) {\n li.setAttribute('aria-disabled', 'true');\n }\n });\n });\n }\n\n private _isSubmenuTriggerClick(target: HTMLElement) {\n if (!this.menuEl) return false;\n const li = target.closest('li');\n if (!li || !this.menuEl.contains(li)) return false;\n const submenu = li.querySelector(':scope > menu');\n if (!submenu) return false;\n return !submenu.contains(target);\n }\n\n private _setupSubmenus() {\n this.menuEl?.querySelectorAll('li').forEach((li) => {\n if (!li.querySelector(':scope > menu')) return;\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-haspopup', 'menu');\n trigger.setAttribute('aria-expanded', 'false');\n });\n }\n\n private _toggleSubmenu(li: HTMLElement) {\n const open = !li.classList.contains('open');\n li.parentElement?.querySelectorAll(':scope > li.open').forEach((other) => {\n if (other !== li) {\n other.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(other as HTMLElement, false);\n }\n });\n li.classList.toggle('open', open);\n if (open) this._alignSubmenu(li);\n this._syncSubmenuAria(li, open);\n }\n\n private _syncSubmenuAria(li: HTMLElement, open: boolean) {\n const trigger = li.querySelector(':scope > a, :scope > button, :scope > span') ?? li;\n trigger.setAttribute('aria-expanded', open ? 'true' : 'false');\n }\n\n private _handleSubmenuAlign = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li');\n if (li?.querySelector(':scope > menu') && this.menuEl?.contains(li)) {\n this._alignSubmenu(li as HTMLElement);\n }\n };\n\n private _alignSubmenu(li: HTMLElement) {\n const menu = li.querySelector(':scope > menu') as HTMLElement | null;\n if (!menu) return;\n // Flyouts stay `display: block` (visibility/opacity hide them) so the\n // rect is readable without temporarily painting the menu.\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n }\n\n private _closeSubmenus() {\n this.menuEl?.querySelectorAll('li.open').forEach((li) => {\n li.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(li as HTMLElement, false);\n });\n }\n\n private _containingSubmenu(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const submenu = target.closest('li > menu');\n if (submenu instanceof HTMLElement && this.menuEl?.contains(submenu)) return submenu;\n return null;\n }\n\n private _focusedRow(e: Event): HTMLElement | null {\n const target = e.target;\n if (!(target instanceof Element)) return null;\n const li = target.closest('li');\n if (li instanceof HTMLElement && this.menuEl?.contains(li)) return li;\n return null;\n }\n\n _handleMenuKeydown = (e: KeyboardEvent) => {\n const arrowUpOrDown =\n e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;\n if (e.key === Utils.keys.TAB) {\n e.preventDefault();\n this.close();\n } else if (e.key === Utils.keys.ARROW_RIGHT && this.isOpen) {\n const li = this._focusedRow(e);\n if (li?.querySelector(':scope > menu')) {\n e.preventDefault();\n li.classList.add('open');\n this._alignSubmenu(li);\n this._syncSubmenuAria(li, true);\n const first = li.querySelector(':scope > menu > li') as HTMLElement | null;\n first?.focus();\n }\n } else if (e.key === Utils.keys.ARROW_LEFT && this.isOpen) {\n const submenu = this._containingSubmenu(e);\n if (submenu) {\n e.preventDefault();\n const parentLi = submenu.parentElement as HTMLElement;\n parentLi.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(parentLi, false);\n parentLi.focus();\n }\n }\n // Navigate down menu list\n else if (arrowUpOrDown && this.isOpen) {\n e.preventDefault();\n const direction = e.key === Utils.keys.ARROW_DOWN ? 1 : -1;\n const list = this._containingSubmenu(e) ?? this.menuEl;\n let newFocusedIndex = this.focusedIndex;\n let hasFoundNewIndex = false;\n do {\n newFocusedIndex = newFocusedIndex + direction;\n if (\n !!list.children[newFocusedIndex] &&\n (<HTMLLIElement>list.children[newFocusedIndex]).tabIndex !== -1\n ) {\n hasFoundNewIndex = true;\n break;\n }\n } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);\n\n if (hasFoundNewIndex) {\n if (this.focusedIndex >= 0) list.children[this.focusedIndex]?.classList.remove('active');\n this.focusedIndex = newFocusedIndex;\n const item = list.children[this.focusedIndex] as HTMLElement;\n item.classList.add('active');\n item.focus({ preventScroll: true });\n }\n }\n // SPACE OR ENTER selects the focused item.\n else if ((e.key === Utils.keys.ENTER || e.key === SPACE) && this.isOpen) {\n const li = this._focusedRow(e);\n e.preventDefault();\n if (li?.matches('.disabled, [aria-disabled=\"true\"]')) return;\n if (li?.querySelector(':scope > menu')) {\n this._toggleSubmenu(li);\n return;\n }\n const focusedElement = li ?? this.menuEl.children[this.focusedIndex];\n const activatableElement = <HTMLElement>focusedElement?.querySelector('a, button');\n if (!!activatableElement) {\n activatableElement.click();\n } else if (focusedElement instanceof HTMLElement) {\n focusedElement.click();\n }\n }\n // Close menu on ESC\n else if (e.key === Utils.keys.ESC && this.isOpen) {\n e.preventDefault();\n const openSub = this.menuEl.querySelector('li.open');\n if (openSub) {\n openSub.classList.remove('open', 'submenu-start');\n this._syncSubmenuAria(openSub as HTMLElement, false);\n (openSub as HTMLElement).focus();\n } else {\n this.close();\n }\n }\n\n // CASE WHEN USER TYPE LTTERS\n const keyText = e.key.toLowerCase();\n const isLetter = /[a-zA-Z0-9-_]/.test(keyText);\n const specialKeys = [\n Utils.keys.ARROW_DOWN,\n Utils.keys.ARROW_UP,\n Utils.keys.ENTER,\n Utils.keys.ESC,\n Utils.keys.TAB,\n SPACE\n ];\n if (isLetter && !specialKeys.includes(e.key)) {\n this.filterQuery.push(keyText);\n const string = this.filterQuery.join('');\n // textContent rather than innerText: this scans every item on every\n // keystroke, and innerText forces a layout flush per item.\n const list = this._containingSubmenu(e) ?? this.menuEl;\n const newOptionEl = Array.from(list.querySelectorAll(':scope > li')).find(\n (el) => el.textContent.trim().toLowerCase().indexOf(string) === 0\n );\n if (newOptionEl) {\n this.focusedIndex = [...newOptionEl.parentNode.children].indexOf(newOptionEl);\n this._focusFocusedItem();\n }\n }\n // Re-arm rather than stack: without the clear, every keystroke left a live\n // timer behind and the query could reset while the user was still typing.\n clearTimeout(this.filterTimeout);\n this.filterTimeout = setTimeout(this._resetFilterQuery, 1000);\n };\n\n _handleWindowResize = () => {\n // Only re-place the menu if it's still visible\n // Accounts for elements hiding via media queries\n if (this.el.offsetParent) {\n this.recalculateDimensions();\n }\n };\n\n _resetFilterQuery = () => {\n this.filterQuery = [];\n };\n\n _resetMenuStyles() {\n this.menuEl.style.display = '';\n this._resetMenuPositioningStyles();\n this.menuEl.style.transform = '';\n this.menuEl.style.opacity = '';\n }\n\n _resetMenuPositioningStyles() {\n this.menuEl.style.width = '';\n this.menuEl.style.height = '';\n this.menuEl.style.left = '';\n this.menuEl.style.top = '';\n this.menuEl.style.transformOrigin = '';\n }\n\n _moveMenuToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.menuEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);\n return;\n }\n this.el.after(this.menuEl);\n }\n\n _makeMenuFocusable() {\n if (!this.menuEl) return;\n this.menuEl.popover = '';\n // Focus moves directly to menu items; the surface itself is not a stop.\n this.menuEl.tabIndex = -1;\n // Only set tabindex if it hasn't been set by user\n this.menuEl.querySelectorAll(':scope li, :scope > hr').forEach((el) => {\n if (\n el instanceof HTMLHRElement ||\n el.classList.contains('divider') ||\n el.classList.contains('gap') ||\n el.classList.contains('label') ||\n el.classList.contains('optgroup')\n ) {\n el.setAttribute('tabindex', '-1');\n return;\n }\n if (!el.getAttribute('tabindex')) el.setAttribute('tabindex', '0');\n });\n }\n\n private _focusInitialItem() {\n if (!this.menuEl || !this.options.autoFocus) return;\n const first = Array.from(this.menuEl.children).find(\n (child) => child instanceof HTMLElement && child.tabIndex !== -1\n ) as HTMLElement | undefined;\n if (!first) return;\n this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);\n first.focus({ preventScroll: true });\n }\n\n _focusFocusedItem() {\n if (\n this.focusedIndex >= 0 &&\n this.focusedIndex < this.menuEl.children.length &&\n this.options.autoFocus\n ) {\n (this.menuEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.menuEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getMenuPosition(closestOverflowParent: HTMLElement) {\n const triggerBRect = this.el.getBoundingClientRect();\n const menuBRect = this.menuEl.getBoundingClientRect();\n\n let idealHeight = menuBRect.height;\n let idealWidth = menuBRect.width;\n let idealXPos = triggerBRect.left - menuBRect.left;\n let idealYPos = triggerBRect.top - menuBRect.top;\n\n const menuBounds = {\n left: idealXPos,\n top: idealYPos,\n height: idealHeight,\n width: idealWidth\n };\n\n const alignments = Utils.checkPossibleAlignments(\n this.el,\n closestOverflowParent,\n menuBounds,\n this.options.coverTrigger ? 0 : triggerBRect.height\n );\n\n let verticalAlignment = 'top';\n let horizontalAlignment = this.options.alignment;\n idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;\n\n // Reset isScrollable\n this.isScrollable = false;\n\n if (!alignments.top) {\n if (alignments.bottom) {\n verticalAlignment = 'bottom';\n\n if (!this.options.coverTrigger) {\n idealYPos -= triggerBRect.height;\n }\n } else {\n this.isScrollable = true;\n\n // Determine which side has most space and cutoff at correct height\n idealHeight -= 20; // Add padding when cutoff\n if (alignments.spaceOnTop > alignments.spaceOnBottom) {\n verticalAlignment = 'bottom';\n idealHeight += alignments.spaceOnTop;\n idealYPos -= this.options.coverTrigger\n ? alignments.spaceOnTop - 20\n : alignments.spaceOnTop - 20 + triggerBRect.height;\n } else {\n idealHeight += alignments.spaceOnBottom;\n }\n }\n }\n\n // If preferred horizontal alignment is possible\n if (!alignments[horizontalAlignment]) {\n const oppositeAlignment = horizontalAlignment === 'left' ? 'right' : 'left';\n if (alignments[oppositeAlignment]) {\n horizontalAlignment = oppositeAlignment;\n } else {\n // Determine which side has most space and cutoff at correct height\n if (alignments.spaceOnLeft > alignments.spaceOnRight) {\n horizontalAlignment = 'right';\n idealWidth += alignments.spaceOnLeft;\n idealXPos -= alignments.spaceOnLeft;\n } else {\n horizontalAlignment = 'left';\n idealWidth += alignments.spaceOnRight;\n }\n }\n }\n\n if (verticalAlignment === 'bottom') {\n idealYPos =\n idealYPos - menuBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - menuBRect.width + triggerBRect.width;\n }\n return {\n x: idealXPos,\n y: idealYPos,\n verticalAlignment: verticalAlignment,\n horizontalAlignment: horizontalAlignment,\n height: idealHeight,\n width: idealWidth\n };\n }\n\n _animateIn() {\n const duration = this.options.inDuration;\n this.menuEl.style.transition = 'none';\n // from\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n setTimeout(() => {\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n this.menuEl.style.opacity = '1';\n this.menuEl.style.transform = 'scale(1)';\n }, 1);\n setTimeout(() => {\n this._focusInitialItem();\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutQuad (opacity) & easeOutQuint\n this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.menuEl.style.opacity = '0';\n this.menuEl.style.transform = 'scale(0.85)';\n setTimeout(() => {\n this._resetMenuStyles();\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n private _getClosestAncestor(el: HTMLElement, condition: (Function) => boolean): HTMLElement {\n let ancestor: Node = el.parentNode;\n while (ancestor !== null && ancestor !== undefined && ancestor !== document) {\n // A shadow root is not an element and getComputedStyle() rejects it, so\n // step over it to the host - the elements that actually clip the menu\n // are above that.\n if (ancestor.nodeType === Node.ELEMENT_NODE && condition(ancestor)) {\n return <HTMLElement>ancestor;\n }\n ancestor = ancestor.parentNode ?? (<ShadowRoot>ancestor).host;\n }\n return null;\n }\n\n _placeMenu() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.menuEl,\n (ancestor: HTMLElement) => {\n return (\n !['HTML', 'BODY'].includes(ancestor.tagName) &&\n getComputedStyle(ancestor).overflow !== 'visible'\n );\n }\n );\n // Fallback\n if (!closestOverflowParent) {\n const parent = !!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode;\n // Same hazard as the walk: the parent is a shadow root when the menu was\n // moved into one, and the next line reads its computed style.\n closestOverflowParent = <HTMLElement>((<ShadowRoot>parent).host ?? parent);\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveMenu(closestOverflowParent);\n\n // Set width before calculating positionInfo. Both callers reset the\n // positioning styles first, so this reads the surface's natural width.\n const natural = this.menuEl.getBoundingClientRect().width;\n // A trigger narrower than the surface's own minimum is not a constraint\n // the menu can honour: the width is written and `min-width` overrides it,\n // leaving the surface at the floor with every item inside it wrapped. So\n // constrain only to a trigger wide enough to mean something, and size by\n // content otherwise. An icon button and a split button's chevron are both\n // that case - 40dp and 48dp against a 112dp floor.\n const triggerWidth = this.el.getBoundingClientRect().width;\n const idealWidth =\n this.options.constrainWidth && triggerWidth >= MIN_SURFACE_WIDTH\n ? triggerWidth\n : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));\n this.menuEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getMenuPosition(closestOverflowParent);\n this.menuEl.style.left = positionInfo.x + 'px';\n this.menuEl.style.top = positionInfo.y + 'px';\n this.menuEl.style.height = positionInfo.height + 'px';\n this.menuEl.style.width = positionInfo.width + 'px';\n this.menuEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open menu.\n */\n open = () => {\n if (this.isOpen) return;\n this.isOpen = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n // Reset styles\n this._resetMenuStyles();\n this.menuEl.style.display = 'block';\n this._placeMenu();\n this._animateIn();\n // Do this one frame later so that we don't bind an event handler that's immediately\n // called when the event bubbles up to the document and closes the menu\n setTimeout(() => this._setupTemporaryEventHandlers(), 0);\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close menu.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.focusedIndex = -1;\n this._closeSubmenus();\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._animateOut();\n this._removeTemporaryEventHandlers();\n if (this.options.autoFocus) {\n this.el.focus();\n }\n this.el.ariaExpanded = 'false';\n };\n\n /**\n * While menu is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetMenuPositioningStyles();\n this._placeMenu();\n }\n };\n}\n", "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 /**\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 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 autocomplete.setMenuItems(\n\n autocomplete.options.data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\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\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 };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.selectedValues || this.options.selected.map((value) => <AutocompleteData>{ id: value }) || [];\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._removeMenu();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\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('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\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('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\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 = (e: KeyboardEvent) => {\n if (e.type === 'keyup') Autocomplete._keydown = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Don't capture enter or arrow key usage.\n if (\n e.key === Utils.keys.ENTER ||\n e.key === Utils.keys.ARROW_UP ||\n e.key === Utils.keys.ARROW_DOWN\n )\n return;\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 // 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 // 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 = 0;\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.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.el.parentElement.querySelector('.status-info');\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n }\n\n _updateSelectedInfo() {\n const statusElement = this.el.parentElement.querySelector('.status-info');\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 }\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 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 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._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 this._triggerChanged();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Autocomplete, AutocompleteOptions } from './autocomplete';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface ChipData {\n /**\n * Unique identifier.\n */\n id: number | string;\n /**\n * Chip text. If not specified, \"id\" will be used.\n */\n text?: string;\n /**\n * Chip image (URL).\n */\n image?: string;\n}\n\nexport interface ChipsI18nOptions {\n /** Prefix for the delete button's accessible name. */\n remove: string;\n}\n\nexport interface ChipsOptions extends BaseOptions {\n /**\n * Set the chip data.\n * @default []\n */\n data: ChipData[];\n /**\n * Set first placeholder when there are no tags.\n * @default \"\"\n */\n placeholder: string;\n /**\n * Set second placeholder when adding additional tags.\n * @default \"\"\n */\n secondaryPlaceholder: string;\n /**\n * Set autocomplete options.\n * @default {}\n */\n autocompleteOptions: Partial<AutocompleteOptions>;\n /**\n * Toggles abililty to add custom value not in autocomplete list.\n * @default false\n */\n autocompleteOnly: boolean;\n /**\n * Set chips limit.\n * @default Infinity\n */\n limit: number;\n /**\n * Specifies class to be used in \"close\" button.\n * @default 'material-symbols'\n */\n closeIconClass: string;\n /**\n * Specifies option to render user input field\n * @default false;\n */\n allowUserInput: boolean;\n /**\n * Strings the component generates. `remove` prefixes the delete button's\n * accessible name, giving \"Remove Apple\".\n * @default { remove: 'Remove' }\n */\n i18n: Partial<ChipsI18nOptions>;\n /**\n * Callback for chip add.\n * @default null\n */\n onChipAdd: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip select.\n * @default null\n */\n onChipSelect: (element: HTMLElement, chip: HTMLElement) => void;\n /**\n * Callback for chip delete.\n * @default null\n */\n onChipDelete: (element: HTMLElement, chip: HTMLElement) => void;\n}\n\nconst _defaults: ChipsOptions = {\n data: [],\n placeholder: '',\n secondaryPlaceholder: '',\n closeIconClass: 'material-symbols',\n autocompleteOptions: {},\n autocompleteOnly: false,\n limit: Infinity,\n allowUserInput: false,\n i18n: { remove: 'Remove' },\n onChipAdd: null,\n onChipSelect: null,\n onChipDelete: null\n};\n\nexport class Chips extends Component<ChipsOptions> {\n /** Array of the current chips data. */\n chipsData: ChipData[];\n /** If the chips has autocomplete enabled. */\n hasAutocomplete: boolean;\n /** Autocomplete instance, if any. */\n autocomplete: Autocomplete;\n _input: HTMLInputElement;\n _label: HTMLLabelElement;\n _chips: HTMLElement[];\n static _keydown: boolean;\n private _selectedChip: HTMLElement;\n\n /**\n * Selection is drawn by a class now, not by `:focus`, so it does not clear\n * itself when focus moves - every path that changes the selection has to go\n * through here or the class and the field drift apart.\n *\n * Deliberately no `aria-selected`: the chip is not an option in a listbox,\n * and putting the attribute on an element with no such role is the same\n * defect the semantics standard exists to remove.\n */\n private _setSelected(chip: HTMLElement | null) {\n this._selectedChip?.classList.remove('selected');\n this._selectedChip = chip;\n chip?.classList.add('selected');\n }\n\n constructor(el: HTMLElement, options: Partial<ChipsOptions>) {\n super(el, options, Chips);\n this.el['Expressive_Chips'] = this;\n\n this.options = {\n ...Chips.defaults,\n ...options\n };\n // Spreading options over the defaults replaces the i18n object wholesale,\n // so passing one string would drop the rest. Same fix as Datepicker.\n if (options?.i18n) this.options.i18n = { ...Chips.defaults.i18n, ...options.i18n };\n\n this.el.classList.add('chips');\n this.chipsData = [];\n this._chips = [];\n\n // Render initial chips\n if (this.options.data.length) {\n this.chipsData = this.options.data;\n this._renderChips();\n }\n\n // Render input element, setup event handlers\n if (this.options.allowUserInput) {\n this.el.classList.add('field');\n this._setupInput();\n this._setupEventHandlers();\n // move input to end\n this.el.append(this._input);\n }\n // After _setupInput: the label points at the input's id, which is only\n // assigned there. Running this first threw on any .chips with a <label>.\n this._setupLabel();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Chips.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<ChipsOptions>): Chips;\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<ChipsOptions>): Chips[];\n /**\n * Initializes instances of Chips.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<ChipsOptions> = {}\n ): Chips | Chips[] {\n return super.init(els, options, Chips);\n }\n\n static getInstance(el: HTMLElement): Chips {\n return el['Expressive_Chips'];\n }\n\n getData() {\n return this.chipsData;\n }\n\n destroy() {\n if (this.options.allowUserInput) {\n this._removeEventHandlers();\n }\n this._chips.forEach((c) => c.remove());\n this._chips = [];\n this.el['Expressive_Chips'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleChipClick);\n // @todo why do we need this as document event listener, shouldn't we apply it to the element wrapper itself?\n document.addEventListener('keydown', Chips._handleChipsKeydown);\n document.addEventListener('keyup', Chips._handleChipsKeyup);\n this.el.addEventListener('blur', Chips._handleChipsBlur, true);\n this._input.addEventListener('focus', this._handleInputFocus);\n this._input.addEventListener('blur', this._handleInputBlur);\n this._input.addEventListener('keydown', this._handleInputKeydown);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleChipClick);\n document.removeEventListener('keydown', Chips._handleChipsKeydown);\n document.removeEventListener('keyup', Chips._handleChipsKeyup);\n this.el.removeEventListener('blur', Chips._handleChipsBlur, true);\n this._input.removeEventListener('focus', this._handleInputFocus);\n this._input.removeEventListener('blur', this._handleInputBlur);\n this._input.removeEventListener('keydown', this._handleInputKeydown);\n }\n\n _handleChipClick = (e: MouseEvent) => {\n const _chip = (<HTMLElement>e.target).closest('.chip');\n // closest, not classList: the close button now wraps an icon span, so a\n // click on the glyph reports the span as the target.\n const clickedClose = !!(<HTMLElement>e.target).closest('.close');\n if (_chip) {\n // Index into the chip list, not into the container's children: the\n // container also holds the label and the input, so counting children\n // gave an index that did not line up with chipsData.\n const index = this._chips.indexOf(_chip as HTMLElement);\n if (index < 0) return;\n if (clickedClose) {\n this.deleteChip(index);\n this._input.focus();\n } else {\n this.selectChip(index);\n }\n // Default handle click to focus on input\n } else {\n this._input.focus();\n }\n };\n\n static _handleChipsKeydown(e: KeyboardEvent) {\n Chips._keydown = true;\n const chips = (<HTMLElement>e.target).closest('.chips');\n const chipsKeydown = e.target && chips;\n\n // Don't handle keydown inputs on input and textarea\n const tag = (<HTMLElement>e.target).tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || !chipsKeydown) return;\n\n const currChips: Chips = chips['Expressive_Chips'];\n if (!currChips) return; // .chips markup without an instance behind it\n\n if (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.DELETE) {\n e.preventDefault();\n let selectIndex = currChips.chipsData.length;\n if (currChips._selectedChip) {\n const index = currChips._chips.indexOf(currChips._selectedChip);\n currChips.deleteChip(index);\n currChips._setSelected(null);\n // Make sure selectIndex doesn't go negative\n selectIndex = Math.max(index - 1, 0);\n }\n if (currChips.chipsData.length) currChips.selectChip(selectIndex);\n else currChips._input.focus();\n } else if (e.key === Utils.keys.ARROW_LEFT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) - 1;\n if (selectIndex < 0) return;\n currChips.selectChip(selectIndex);\n }\n } else if (e.key === Utils.keys.ARROW_RIGHT) {\n if (currChips._selectedChip) {\n const selectIndex = currChips._chips.indexOf(currChips._selectedChip) + 1;\n if (selectIndex >= currChips.chipsData.length) {\n // Walking off the end returns to the input, so nothing is selected\n // any more - without this the last chip kept the class.\n currChips._setSelected(null);\n currChips._input.focus();\n }\n else currChips.selectChip(selectIndex);\n }\n }\n }\n\n static _handleChipsKeyup() {\n Chips._keydown = false;\n }\n\n static _handleChipsBlur(e: Event) {\n if (!Chips._keydown && document.hidden) {\n const chips = (<HTMLElement>e.target).closest('.chips');\n const currChips: Chips = chips?.['Expressive_Chips'];\n if (currChips) currChips._setSelected(null);\n }\n }\n\n _handleInputFocus = () => {\n this.el.classList.add('focus');\n };\n\n _handleInputBlur = () => {\n this.el.classList.remove('focus');\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Chips._keydown = true;\n if (e.key === Utils.keys.ENTER) {\n // Override enter if autocompleting.\n if (this.hasAutocomplete && this.autocomplete && this.autocomplete.isOpen) {\n return;\n }\n e.preventDefault();\n if (!this.hasAutocomplete || (this.hasAutocomplete && !this.options.autocompleteOnly)) {\n this.addChip({ id: this._input.value });\n }\n this._input.value = '';\n } else if (\n (e.key === Utils.keys.BACKSPACE || e.key === Utils.keys.ARROW_LEFT) &&\n this._input.value === '' &&\n this.chipsData.length\n ) {\n e.preventDefault();\n this.selectChip(this.chipsData.length - 1);\n }\n };\n\n _renderChip(chip: ChipData): HTMLElement {\n if (!chip.id) return;\n const label = chip.text || <string>chip.id;\n // <span>, not <div>: a chip is inline, and the container itself is not a\n // control. It used to be a <div tabindex=\"0\"> with no role - focusable,\n // and announcing nothing.\n const renderedChip = document.createElement('span');\n renderedChip.classList.add('chip');\n renderedChip.innerText = label;\n // attach image if needed\n if (chip.image) {\n const img = document.createElement('img');\n img.setAttribute('src', chip.image);\n renderedChip.insertBefore(img, renderedChip.firstChild);\n }\n if (this.options.allowUserInput) {\n // The delete affordance is the control, so it is the <button> and it\n // carries the name. `type` is explicit because a bare button inside a\n // form submits it.\n const closeButton = document.createElement('button');\n closeButton.type = 'button';\n closeButton.classList.add('close');\n closeButton.setAttribute('aria-label', `${this.options.i18n.remove} ${label}`);\n // The ligature is text and is read out, so the glyph is hidden and the\n // button's own label is what gets announced.\n const closeIcon = document.createElement('span');\n closeIcon.classList.add(this.options.closeIconClass);\n closeIcon.setAttribute('aria-hidden', 'true');\n closeIcon.innerText = 'close';\n closeButton.appendChild(closeIcon);\n renderedChip.appendChild(closeButton);\n }\n return renderedChip;\n }\n\n _renderChips() {\n this._chips = []; //.remove();\n for (let i = 0; i < this.chipsData.length; i++) {\n const chipElem = this._renderChip(this.chipsData[i]);\n this.el.appendChild(chipElem);\n this._chips.push(chipElem);\n }\n }\n\n _setupAutocomplete() {\n this.options.autocompleteOptions.onAutocomplete = (items) => {\n if (items.length > 0)\n this.addChip({\n id: items[0].id,\n text: items[0].text,\n image: items[0].image\n });\n this._input.value = '';\n this._input.focus();\n };\n this.autocomplete = Autocomplete.init(this._input, this.options.autocompleteOptions);\n }\n\n _setupInput() {\n this._input = this.el.querySelector('input');\n if (!this._input) {\n this._input = document.createElement('input');\n this.el.append(this._input);\n }\n this._input.classList.add('input');\n this.hasAutocomplete = Object.keys(this.options.autocompleteOptions).length > 0;\n // Setup autocomplete if needed\n if (this.hasAutocomplete) this._setupAutocomplete();\n this._setPlaceholder();\n // Set input id\n if (!this._input.getAttribute('id')) this._input.setAttribute('id', Utils.guid());\n }\n\n _setupLabel() {\n this._label = this.el.querySelector('label');\n // No input to point at when allowUserInput is off.\n if (this._label && this._input) this._label.setAttribute('for', this._input.getAttribute('id'));\n }\n\n _setPlaceholder() {\n if (this.chipsData !== undefined && !this.chipsData.length && this.options.placeholder) {\n this._input.placeholder = this.options.placeholder;\n } else if (\n (this.chipsData === undefined || !!this.chipsData.length) &&\n this.options.secondaryPlaceholder\n ) {\n this._input.placeholder = this.options.secondaryPlaceholder;\n }\n }\n\n _isValidAndNotExist(chip: ChipData) {\n const isValid = !!chip.id;\n const doesNotExist = !this.chipsData.some((item) => item.id == chip.id);\n return isValid && doesNotExist;\n }\n\n /**\n * Add chip to input.\n * @param chip Chip data object\n */\n addChip(chip: ChipData) {\n if (!this._isValidAndNotExist(chip) || this.chipsData.length >= this.options.limit) return;\n const renderedChip = this._renderChip(chip);\n this._chips.push(renderedChip);\n this.chipsData.push(chip);\n this._input.before(renderedChip);\n this._setPlaceholder();\n // fire chipAdd callback\n if (typeof this.options.onChipAdd === 'function') {\n this.options.onChipAdd(this.el, renderedChip);\n }\n }\n\n /**\n * Delete nth chip.\n * @param chipIndex Index of chip\n */\n deleteChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n if (this._selectedChip === chip) this._setSelected(null);\n chip.remove();\n this._chips.splice(chipIndex, 1);\n this.chipsData.splice(chipIndex, 1);\n this._setPlaceholder();\n // fire chipDelete callback\n if (typeof this.options.onChipDelete === 'function') {\n this.options.onChipDelete(this.el, chip);\n }\n }\n\n /**\n * Select nth chip.\n * @param chipIndex Index of chip\n */\n selectChip(chipIndex: number) {\n const chip = this._chips[chipIndex];\n if (!chip) return;\n this._setSelected(chip);\n // The chip is not a control any more, so focus goes to the one thing in it\n // that is - the delete button.\n (chip.querySelector('.close') as HTMLElement | null)?.focus();\n // fire chipSelect callback\n if (typeof this.options.onChipSelect === 'function') {\n this.options.onChipSelect(this.el, chip);\n }\n }\n\n static Init() {\n // Handle removal of static chips - markup written by hand, with no Chips\n // instance behind it. Where there *is* an instance, _handleChipClick owns\n // the close button: removing the node here as well left chipsData holding\n // an entry whose element was gone.\n Utils.onDocumentReady(() => {\n const chips = document.querySelectorAll('.chips');\n chips.forEach((el) => {\n el.addEventListener('click', (e) => {\n if (el['Expressive_Chips']) return;\n // closest: the close button wraps an icon span, so a click on the\n // glyph reports the span.\n if ((<HTMLElement>e.target).closest('.close')) {\n const chip = (<HTMLElement>e.target).closest('.chip');\n if (chip) chip.remove();\n }\n });\n });\n });\n }\n\n static {\n Chips._keydown = false;\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\nimport { Utils } from '../core/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface SliderOptions extends BaseOptions {}\n\nconst _defaults: SliderOptions = {};\n\nexport class Slider extends Component<SliderOptions> {\n declare el: HTMLInputElement;\n private _pointerDown: boolean;\n value: HTMLElement;\n thumb: HTMLElement;\n\n constructor(el: HTMLInputElement, options: Partial<SliderOptions>) {\n super(el, options, Slider);\n this.el['Expressive_Slider'] = this;\n\n this.options = {\n ...Slider.defaults,\n ...options\n };\n\n this._pointerDown = false;\n this._setupThumb();\n this._sync();\n this._setupEventHandlers();\n }\n\n static get defaults(): SliderOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Slider.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<SliderOptions>): Slider;\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<SliderOptions>\n ): Slider[];\n /**\n * Initializes instances of Slider.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<SliderOptions> = {}\n ): Slider | Slider[] {\n return super.init(els, options, Slider);\n }\n\n static getInstance(el: HTMLInputElement): Slider {\n return el['Expressive_Slider'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._removeThumb();\n this.el['Expressive_Slider'] = undefined;\n }\n\n // Eleven listeners used to cover four stages, because each one was written\n // twice - once for mouse, once for touch. One of the touch spellings,\n // `touchleave`, was never implemented by any browser at all.\n _setupEventHandlers() {\n this.el.addEventListener('change', this._handleRangeChange);\n this.el.addEventListener('pointerdown', this._handleRangePointerDown);\n this.el.addEventListener('input', this._handleRangeInputOrMove);\n // Never calls preventDefault, so it does not need to block scrolling.\n this.el.addEventListener('pointermove', this._handleRangeInputOrMove, { passive: true });\n this.el.addEventListener('pointerup', this._handleRangePointerUp);\n this.el.addEventListener('pointercancel', this._handleRangePointerUp);\n this.el.addEventListener('blur', this._handleRangeRelease);\n // `mouseout`, not `pointerout`: this used to be a `mouseout`/`touchleave`\n // pair, and `touchleave` was never implemented by any browser, so the\n // handler has only ever run for a mouse. `pointerout` also fires when a\n // touch lifts, which would clear the thumb's active state at a moment\n // nothing cleared it before.\n this.el.addEventListener('mouseout', this._handleRangeRelease);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('change', this._handleRangeChange);\n this.el.removeEventListener('pointerdown', this._handleRangePointerDown);\n this.el.removeEventListener('input', this._handleRangeInputOrMove);\n this.el.removeEventListener('pointermove', this._handleRangeInputOrMove);\n this.el.removeEventListener('pointerup', this._handleRangePointerUp);\n this.el.removeEventListener('pointercancel', this._handleRangePointerUp);\n this.el.removeEventListener('blur', this._handleRangeRelease);\n this.el.removeEventListener('mouseout', this._handleRangeRelease);\n }\n\n _handleRangeChange = () => {\n this._clampDual();\n this._sync();\n this.thumb.classList.add('active');\n };\n\n _handleRangePointerDown = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n this._pointerDown = true;\n this.el.classList.add('active');\n this._clampDual();\n this._sync();\n // An `e.type !== 'input'` guard used to sit here. This handler is only ever\n // bound to a press, so it was never anything but true.\n this.thumb.classList.add('active');\n };\n\n _handleRangeInputOrMove = () => {\n if (this._pointerDown) {\n this._clampDual();\n this._sync();\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangePointerUp = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n this._pointerDown = false;\n this.el.classList.remove('active');\n };\n\n _handleRangeRelease = () => {\n if (!this._pointerDown) {\n this.thumb.classList.remove('active');\n }\n };\n\n _setupThumb() {\n this.thumb = document.createElement('span');\n this.value = document.createElement('span');\n this.thumb.classList.add('thumb');\n this.value.classList.add('value');\n this.thumb.append(this.value);\n this.el.after(this.thumb);\n }\n\n _removeThumb() {\n this.thumb.remove();\n }\n\n _isVertical(): boolean {\n return !!this.el.closest('.vertical');\n }\n\n _host(): HTMLElement | null {\n // `.slider` is the documented host now; without it here a dual-handle\n // control could not find its wrapper, so the handles never clamped and the\n // shared start/end fractions never tracked the interval.\n return this.el.closest('.slider, .range, .range-field, label');\n }\n\n _clampDual() {\n const host = this._host();\n const peers = host?.querySelectorAll('input[type=\"range\"]');\n if (!peers || peers.length !== 2) return;\n const start = peers[0] as HTMLInputElement;\n const end = peers[1] as HTMLInputElement;\n if (this.el === start && +start.value > +end.value) start.value = end.value;\n if (this.el === end && +end.value < +start.value) end.value = start.value;\n }\n\n _fraction(el: HTMLInputElement): number {\n const max = parseFloat(el.max) || 100;\n const min = parseFloat(el.min) || 0;\n const val = parseFloat(el.value) || 0;\n return max === min ? 0 : (val - min) / (max - min);\n }\n\n _sync() {\n const percent = this._fraction(this.el);\n const fraction = `${percent * 100}%`;\n\n // Read before writing. This runs on every pointer move during a drag, and\n // setting the custom property first made each of the four offset reads\n // below flush a fresh layout.\n const left = this.el.offsetLeft;\n const top = this.el.offsetTop;\n const width = this.el.offsetWidth;\n const height = this.el.offsetHeight;\n\n this.el.style.setProperty('--md-comp-slider-active-fraction', fraction);\n\n const host = this._host();\n const peers = host?.querySelectorAll('input[type=\"range\"]');\n if (host && peers && peers.length === 2) {\n const nums = Array.from(peers).map((el) => this._fraction(el as HTMLInputElement));\n host.style.setProperty('--md-comp-slider-start-fraction', `${Math.min(...nums) * 100}%`);\n host.style.setProperty('--md-comp-slider-end-fraction', `${Math.max(...nums) * 100}%`);\n }\n if (host?.classList.contains('stops')) {\n const max = parseFloat(this.el.max) || 100;\n const min = parseFloat(this.el.min) || 0;\n const step = parseFloat(this.el.step);\n if (step > 0 && Number.isFinite(step)) {\n const n = Math.round((max - min) / step) + 1;\n host.style.setProperty('--md-comp-slider-stop-count', String(Math.max(2, n)));\n }\n }\n\n this.value.textContent = this.el.value;\n if (this._isVertical()) {\n this.thumb.style.left = `${left + width / 2}px`;\n this.thumb.style.top = `${top + (1 - percent) * height}px`;\n } else {\n this.thumb.style.left = `${left + percent * width}px`;\n this.thumb.style.top = `${top}px`;\n }\n }\n\n /**\n * Initializes every range input in the current document.\n */\n static Init() {\n // Deferred like every other Init(): this ran at import time, so a bundle\n // loaded in <head> found no inputs at all.\n Utils.onDocumentReady(() => {\n Slider.init(document.querySelectorAll('input[type=range]') as NodeListOf<HTMLInputElement>, {});\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\ntype ClosedBy = 'any' | 'closerequest' | 'none';\n\n/**\n * Light-dismiss for native `<dialog>` elements.\n *\n * `showModal()` does not close on a backdrop tap. A naive `click` listener\n * on the dialog (where `::backdrop` events retarget) also fires when the\n * user starts a gesture on the dialog and releases on the scrim \u2014 selecting\n * text, missing a button, dragging a thumb. Both ends of the pointer\n * gesture must land outside the dialog's border box.\n *\n * Default is on. Opt out with `closedby=\"none\"` or `closedby=\"closerequest\"`.\n * If the browser already honours `closedby=\"any\"`, we leave that alone.\n */\nexport class Dialogs {\n private static _down: { dialog: HTMLDialogElement; pointerId: number } | null = null;\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', Dialogs._onPointerDown, { passive: true });\n document.addEventListener('pointerup', Dialogs._onPointerUp, { passive: true });\n document.addEventListener('pointercancel', Dialogs._onPointerCancel, { passive: true });\n });\n }\n\n static _onPointerDown(event: PointerEvent) {\n if (!Dialogs._isPrimaryPress(event)) {\n Dialogs._down = null;\n return;\n }\n const dialog = Dialogs._backdropDialog(event);\n if (!dialog || !Dialogs._lightDismissible(dialog) || !Dialogs._outside(event, dialog)) {\n Dialogs._down = null;\n return;\n }\n Dialogs._down = { dialog, pointerId: event.pointerId };\n }\n\n static _onPointerUp(event: PointerEvent) {\n const started = Dialogs._down;\n Dialogs._down = null;\n if (!started || started.pointerId !== event.pointerId) return;\n if (!event.isPrimary) return;\n if (!started.dialog.isConnected || !started.dialog.open) return;\n if (!Dialogs._lightDismissible(started.dialog)) return;\n if (Dialogs._backdropDialog(event) !== started.dialog) return;\n if (Dialogs._outside(event, started.dialog)) {\n started.dialog.close();\n }\n }\n\n static _onPointerCancel() {\n Dialogs._down = null;\n }\n\n /** Backdrop hits retarget to the dialog itself, never a child. */\n private static _backdropDialog(event: Event): HTMLDialogElement | null {\n const target = event.target;\n if (!(target instanceof HTMLDialogElement) || !target.open) return null;\n return target;\n }\n\n private static _outside(event: PointerEvent, dialog: HTMLDialogElement): boolean {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n }\n\n private static _isPrimaryPress(event: PointerEvent): boolean {\n if (!event.isPrimary) return false;\n return event.pointerType !== 'mouse' || event.button === 0;\n }\n\n private static _lightDismissible(dialog: HTMLDialogElement): boolean {\n const value = Dialogs._closedBy(dialog);\n if (value === 'none' || value === 'closerequest') return false;\n // Native closedby=\"any\" already light-dismisses with the same\n // \"both ends outside\" rule. Don't race it.\n if (value === 'any' && 'closedBy' in HTMLDialogElement.prototype) return false;\n return true;\n }\n\n // Read the attribute only. The IDL default for an unset closedby is\n // \"closerequest\" (Escape, no light dismiss) \u2014 treating that as an\n // author opt-out made every dialog undismissable from the scrim.\n private static _closedBy(dialog: HTMLDialogElement): ClosedBy | null {\n const attr = dialog.getAttribute('closedby');\n if (attr === 'any' || attr === 'closerequest' || attr === 'none') return attr;\n return null;\n }\n}\n", "import { Utils } from '../core/utils';\n\n/**\n * Drag-to-dismiss, shared by the bottom sheet and the side sheet.\n *\n * The two were the same state machine written twice on different axes - same\n * dismissal distance, same flick velocity, same transition suppression, same\n * pointer bookkeeping - so a fix to one could land without reaching the other.\n * What actually differs between them is stated as configuration below.\n *\n * Light-dismiss on the scrim is not here; it stays with `Dialogs`.\n */\nexport interface SheetDragConfig {\n /** Which dialogs this drag applies to. */\n selector: string;\n /** The axis the sheet travels on. */\n axis: 'x' | 'y';\n /** The custom property carrying the live drag offset. */\n property: string;\n /**\n * `1` when the sheet dismisses toward increasing coordinates (downward, or\n * rightward for an end-docked side sheet), `-1` when it dismisses toward\n * decreasing ones. A function rather than a constant because a side sheet's\n * direction depends on which edge each individual sheet is docked to.\n */\n direction: (dialog: HTMLDialogElement) => 1 | -1;\n /** Whether a press at this point landed on the sheet's drag handle. */\n inHandle: (event: PointerEvent, dialog: HTMLDialogElement) => boolean;\n /**\n * Called first on every `pointerdown`, before any guard rejects it. The\n * bottom sheet clears its dragged flag here so a sequence abandoned without\n * a `pointerup` cannot leave the flag set and swallow the next tap.\n */\n onPress?: () => void;\n /** Called when a drag ends, with whether the pointer actually moved. */\n onRelease?: (dragged: boolean) => void;\n}\n\n/** Past this the sheet dismisses rather than snapping back, in pixels. */\nconst DISMISS_DISTANCE = 96;\n/** Past this a flick dismisses whatever the distance, in pixels per millisecond. */\nconst DISMISS_VELOCITY = 0.5;\n/** Past this the pointer was dragging, not tapping. Hand jitter, in pixels. */\nconst DRAG_SLOP = 4;\n\n/**\n * Register one sheet kind's drag handlers on the document. Called once per kind\n * at import time; there is nothing to tear down.\n */\nexport function installSheetDrag(config: SheetDragConfig): void {\n const coord = (event: PointerEvent) => (config.axis === 'x' ? event.clientX : event.clientY);\n\n let drag: {\n dialog: HTMLDialogElement;\n pointerId: number;\n direction: 1 | -1;\n start: number;\n last: number;\n lastT: number;\n shift: number;\n } | null = null;\n\n const sheetFor = (target: EventTarget | null): HTMLDialogElement | null => {\n if (!(target instanceof Element)) return null;\n const dialog = target.closest(config.selector);\n return dialog instanceof HTMLDialogElement ? dialog : null;\n };\n\n const reset = (dialog: HTMLDialogElement) => {\n dialog.style.transition = '';\n dialog.style.setProperty(config.property, '0px');\n };\n\n const onDown = (event: PointerEvent) => {\n config.onPress?.();\n // A press that is not the primary pointer is ignored without disturbing a\n // drag already in flight - a second finger must not abort the first one.\n // A press that lands off the sheet or off its handle does clear it.\n if (!event.isPrimary) return;\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n const dialog = sheetFor(event.target);\n if (!dialog?.open) {\n drag = null;\n return;\n }\n if (!config.inHandle(event, dialog)) {\n drag = null;\n return;\n }\n dialog.style.transition = 'none';\n drag = {\n dialog,\n pointerId: event.pointerId,\n direction: config.direction(dialog),\n start: coord(event),\n last: coord(event),\n lastT: Date.now(),\n shift: 0\n };\n };\n\n const onMove = (event: PointerEvent) => {\n if (!drag || drag.pointerId !== event.pointerId) return;\n const delta = coord(event) - drag.start;\n // Only movement toward dismissal counts; dragging the other way is a no-op\n // rather than a sheet that lifts off its edge.\n drag.shift = drag.direction === 1 ? Math.max(0, delta) : Math.min(0, delta);\n drag.last = coord(event);\n drag.lastT = Date.now();\n drag.dialog.style.setProperty(config.property, `${drag.shift}px`);\n };\n\n const onUp = (event: PointerEvent) => {\n const held = drag;\n if (!held || held.pointerId !== event.pointerId) return;\n drag = null;\n // Not `reset()`, though it looks like it: the two halves belong on either\n // side of close(). The transition has to be back before the sheet closes,\n // so the dismissal animates; the shift has to clear after, or a snap-back\n // would jump to zero before the transition could carry it there.\n held.dialog.style.transition = '';\n const dt = Math.max(1, Date.now() - held.lastT);\n const velocity = (coord(event) - held.last) / dt;\n config.onRelease?.(Math.abs(held.shift) > DRAG_SLOP);\n const dismiss =\n held.direction === 1\n ? held.shift > DISMISS_DISTANCE || velocity > DISMISS_VELOCITY\n : held.shift < -DISMISS_DISTANCE || velocity < -DISMISS_VELOCITY;\n if (dismiss && held.dialog.open) held.dialog.close();\n held.dialog.style.setProperty(config.property, '0px');\n };\n\n const onCancel = () => {\n config.onRelease?.(false);\n const held = drag;\n drag = null;\n if (held) reset(held.dialog);\n };\n\n Utils.onDocumentReady(() => {\n document.addEventListener('pointerdown', onDown, { passive: true });\n document.addEventListener('pointermove', onMove, { passive: true });\n document.addEventListener('pointerup', onUp, { passive: true });\n document.addEventListener('pointercancel', onCancel, { passive: true });\n });\n}\n", "import { installSheetDrag } from './sheetDrag';\nimport { Utils } from '../core/utils';\n\nconst SHEET_SELECTOR = 'dialog.bottom-sheet, dialog.bottom';\n\n/**\n * Drag-to-dismiss for `dialog.bottom-sheet` / `dialog.bottom`.\n *\n * The handle is the top 48dp of the sheet (or an explicit `.drag-handle`,\n * `.handle` being its pre-1.0 spelling). A downward drag past 96dp, or a\n * flick, closes. Anything else snaps back. Content below the handle scrolls\n * normally. Light-dismiss on the scrim stays with {@link Dialogs}.\n *\n * The drag itself is {@link installSheetDrag}, shared with the side sheet. What\n * is here is what is not shared: a handle written as a `<button>` also closes\n * the sheet when it is *activated*, which is what makes it reachable without a\n * pointer - dragging is a pointer gesture, so a control labelled \"Dismiss\" that\n * only answers a drag promises an action a keyboard user cannot perform. A\n * handle written as any other element is decoration and does nothing here -\n * Escape still closes the sheet either way, natively.\n */\nexport class BottomSheets {\n /**\n * Whether the last pointer sequence moved. A drag ends with a `click` on the\n * element it started on, so without this the tail of a drag that snapped back\n * would dismiss the sheet the drag had just declined to dismiss.\n */\n private static _dragged = false;\n\n static Init() {\n installSheetDrag({\n selector: SHEET_SELECTOR,\n axis: 'y',\n property: '--md-comp-bottom-sheet-shift',\n direction: () => 1,\n inHandle: (event, dialog) => {\n const target = event.target;\n if (target instanceof Element && target.closest('.handle')) return true;\n const rect = dialog.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.top + 48;\n },\n onPress: () => {\n BottomSheets._dragged = false;\n },\n onRelease: (dragged) => {\n BottomSheets._dragged = dragged;\n }\n });\n Utils.onDocumentReady(() => {\n document.addEventListener('click', BottomSheets._onClick);\n });\n }\n\n static _onClick(event: MouseEvent) {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const handle = target.closest('.handle, .drag-handle');\n // Only a <button> is a control. A decorative <span> in the same slot is\n // exactly what it looks like, and clicking it does nothing.\n if (!(handle instanceof HTMLButtonElement)) return;\n // `detail` is 0 when the click came from Enter or Space and >= 1 when a\n // pointer produced it, so the keyboard path is decided without consulting\n // pointer state at all - a stale drag can never swallow a key press.\n if (event.detail !== 0 && BottomSheets._dragged) return;\n const dialog = handle.closest(SHEET_SELECTOR);\n if (dialog instanceof HTMLDialogElement && dialog.open) dialog.close();\n }\n}\n", "import { installSheetDrag } from './sheetDrag';\n\nconst startDocked = (dialog: HTMLDialogElement): boolean =>\n dialog.classList.contains('left') ||\n dialog.classList.contains('left-sheet') ||\n dialog.classList.contains('start');\n\n/**\n * Drag-to-dismiss for side sheets (`dialog.side-sheet` / `.right` / `.left`).\n *\n * Grab the header or the inner 24dp edge and drag toward the docked side.\n * Past 96dp, or a flick, closes. Light-dismiss on the scrim stays with\n * {@link Dialogs}. The drag itself is {@link installSheetDrag}, shared with\n * the bottom sheet.\n */\nexport class SideSheets {\n static Init() {\n installSheetDrag({\n selector:\n 'dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dialog.left-sheet',\n axis: 'x',\n property: '--md-comp-side-sheet-shift',\n // A start-docked sheet leaves toward the start edge, so its dismissal\n // direction is the negative one.\n direction: (dialog) => (startDocked(dialog) ? -1 : 1),\n inHandle: (event, dialog) => {\n const target = event.target;\n if (target instanceof Element && target.closest('header')) return true;\n const rect = dialog.getBoundingClientRect();\n return startDocked(dialog)\n ? event.clientX >= rect.right - 24 && event.clientX <= rect.right\n : event.clientX >= rect.left && event.clientX <= rect.left + 24;\n }\n });\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport class Forms {\n /**\n * Checks if the label has validation and apply\n * the correct class and styles\n * @param textfield\n */\n static validateField(textfield: HTMLInputElement) {\n if (!textfield) {\n console.error('No text field element found');\n return;\n }\n\n const hasLength = textfield.getAttribute('data-length') !== null;\n const lenAttr = parseInt(textfield.getAttribute('data-length'));\n const len = textfield.value.length;\n\n if (\n len === 0 &&\n textfield.validity.badInput === false &&\n !textfield.required &&\n textfield.classList.contains('validate')\n ) {\n textfield.classList.remove('invalid');\n } else if (textfield.classList.contains('validate')) {\n // Check for character counter attributes\n if (\n (textfield.validity.valid && hasLength && len <= lenAttr) ||\n (textfield.validity.valid && !hasLength)\n ) {\n textfield.classList.remove('invalid');\n } else {\n textfield.classList.add('invalid');\n }\n }\n }\n\n /**\n * Resizes the given TextArea after updating the\n * value content dynamically.\n * @param e EventTarget\n */\n static textareaAutoResize(e: EventTarget) {\n const textarea = e as HTMLTextAreaElement;\n if (!textarea) return;\n\n // Measure the textarea against itself: collapse it to its natural height,\n // then read the content height back. `.expressive-textarea` is\n // `overflow-y: hidden`, so scrollHeight is the full content height and\n // offsetHeight - clientHeight is exactly the borders (no scrollbar to\n // account for) - which border-box sizing needs added back.\n //\n // This replaces a mirror div that the value was copied into via\n // `innerHTML = innerHTML.replace(...)` - a full serialize and reparse of\n // the text on every keystroke, plus getComputedStyle and seven style\n // writes, run twice per keystroke because it was bound to keydown and\n // keyup both.\n if (!textarea.hasAttribute('original-height')) {\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n }\n const originalHeight = parseInt(textarea.getAttribute('original-height'));\n if (isNaN(originalHeight)) return;\n\n textarea.style.height = 'auto';\n // Three reads after a single write: one layout flush for the whole resize.\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const contentHeight = textarea.scrollHeight + borders;\n textarea.style.height = Math.max(originalHeight, contentHeight) + 'px';\n }\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.addEventListener('change', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n if (target instanceof HTMLInputElement) {\n // The sibling-label loop that used to live here compared\n // `tagName == 'label'` (tagName is uppercase) so it never matched,\n // and no rule in the Sass styles `label.active` anyway - the\n // floating label is driven by CSS, not by a class from here.\n Forms.validateField(target);\n }\n });\n\n document.addEventListener('keyup', (e: KeyboardEvent) => {\n const target = <HTMLInputElement>e.target;\n // Radio and Checkbox focus class\n if (target instanceof HTMLInputElement && ['radio', 'checkbox'].includes(target.type)) {\n // TAB, check if tabbing to radio or checkbox.\n if (e.key === Utils.keys.TAB) {\n target.classList.add('tabbed');\n target.addEventListener('blur', () => target.classList.remove('tabbed'), {\n once: true\n });\n }\n }\n });\n\n document.querySelectorAll('.expressive-textarea').forEach((textArea: HTMLTextAreaElement) => {\n Forms.InitTextarea(textArea);\n });\n\n // File Input Path\n document\n .querySelectorAll('.file-field input[type=\"file\"]')\n .forEach((fileInput: HTMLInputElement) => {\n Forms.InitFileInputPath(fileInput);\n });\n });\n }\n\n static InitTextarea(textarea: HTMLTextAreaElement) {\n // Save Data in Element\n textarea.setAttribute('original-height', textarea.getBoundingClientRect().height.toString());\n Forms.textareaAutoResize(textarea);\n // `input` rather than keydown + keyup: it fires once per actual value\n // change and also covers paste, drag-drop and IME composition, which the\n // key events missed.\n textarea.addEventListener('input', (e) => Forms.textareaAutoResize(e.target));\n }\n\n static InitFileInputPath(fileInput: HTMLInputElement) {\n fileInput.addEventListener('change', () => {\n const fileField = fileInput.closest('.file-field');\n const pathInput = <HTMLInputElement>fileField.querySelector('input.file-path');\n const files = fileInput.files;\n const filenames = [];\n for (let i = 0; i < files.length; i++) {\n filenames.push(files[i].name);\n }\n pathInput.value = filenames.join(', ');\n pathInput.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n });\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement, Openable } from \"../core/component\";\nimport { Utils } from '../core/utils';\n\nexport interface FloatingActionButtonOptions extends BaseOptions {\n /**\n * Direction FAB menu opens.\n * @default \"top\"\n */\n direction: 'top' | 'right' | 'bottom' | 'left';\n /**\n * true: FAB menu appears on hover (CSS, when the pointer can hover).\n * false: FAB menu toggles on click. `.click-to-toggle` is the markup switch.\n * @default true\n */\n hoverEnabled: boolean;\n /**\n * Expand the FAB into a toolbar on click. Prefer a hover or click menu.\n * `.toolbar` on the element is the markup switch.\n * @default false\n */\n toolbarEnabled: boolean;\n}\n\nconst _defaults: FloatingActionButtonOptions = {\n direction: 'top',\n hoverEnabled: true,\n toolbarEnabled: false\n};\n\n/**\n * Speed dial around a FAB. Open/close is the `.active` class; motion is\n * CSS. Hover is CSS (`:hover` when the pointer can hover). This class\n * toggles the class, wires keyboard / click-outside, and stamps direction.\n *\n * `.fab-menu` runs on the same instance: expanded state is one class and one\n * `aria-expanded`, whichever host it is written on, and the two differ only\n * in their Sass. The direction and hover options are inert there - the FAB\n * menu opens upward and on click, both decided in CSS.\n */\nexport class FloatingActionButton\n extends Component<FloatingActionButtonOptions>\n implements Openable\n{\n isOpen: boolean;\n\n private _anchor: HTMLElement | null;\n\n constructor(el: HTMLElement, options: Partial<FloatingActionButtonOptions>) {\n super(el, options, FloatingActionButton);\n this.el['Expressive_FloatingActionButton'] = this;\n\n const fromMarkup = this._directionFromClass();\n const toolbar = el.classList.contains('toolbar') || options.toolbarEnabled === true;\n const clickToToggle =\n el.classList.contains('click-to-toggle') || options.hoverEnabled === false;\n\n this.options = {\n ...FloatingActionButton.defaults,\n ...options,\n direction: options.direction ?? fromMarkup ?? FloatingActionButton.defaults.direction,\n hoverEnabled: !clickToToggle,\n toolbarEnabled: toolbar\n };\n\n this.isOpen = false;\n this._anchor = this.el.querySelector(':scope > a, :scope > button');\n\n this.el.classList.add(`direction-${this.options.direction}`);\n if (clickToToggle) this.el.classList.add('click-to-toggle');\n if (toolbar) this.el.classList.add('toolbar');\n\n if (this._anchor) {\n // `aria-expanded` and nothing more. `aria-haspopup=\"menu\"` and\n // `role=\"menu\"` on the list used to go with it, and both were a promise\n // this component does not keep: a menu is a composite widget whose items\n // are reached with the arrow keys, and there is no such keyboard model\n // here (SEMANTICS rule 2). The list is a list of controls reached with\n // Tab, and the trigger is a disclosure.\n this._anchor.setAttribute('aria-expanded', 'false');\n if (\n this._anchor instanceof HTMLAnchorElement &&\n !this._anchor.hasAttribute('href') &&\n this._anchor.tabIndex < 0\n ) {\n this._anchor.tabIndex = 0;\n }\n }\n this._setupEventHandlers();\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static init(\n el: HTMLElement,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<FloatingActionButtonOptions>\n ): FloatingActionButton[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<FloatingActionButtonOptions> = {}\n ): FloatingActionButton | FloatingActionButton[] {\n return super.init(els, options, FloatingActionButton);\n }\n\n static getInstance(el: HTMLElement): FloatingActionButton {\n return el['Expressive_FloatingActionButton'];\n }\n\n destroy() {\n this.close();\n this._removeEventHandlers();\n this.el['Expressive_FloatingActionButton'] = undefined;\n }\n\n /**\n * Open FAB.\n */\n open = (): void => {\n if (this.isOpen) return;\n this.isOpen = true;\n this.el.classList.add('active');\n this._anchor?.setAttribute('aria-expanded', 'true');\n // The trigger click is stopPropagation'd, so it is not also an outside click.\n document.addEventListener('click', this._handleDocumentClick);\n document.addEventListener('keydown', this._handleDocumentKeydown);\n };\n\n /**\n * Close FAB.\n */\n close = (): void => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.el.classList.remove('active');\n this._anchor?.setAttribute('aria-expanded', 'false');\n document.removeEventListener('click', this._handleDocumentClick);\n document.removeEventListener('keydown', this._handleDocumentKeydown);\n };\n\n private _directionFromClass(): FloatingActionButtonOptions['direction'] | null {\n const match = [...this.el.classList].find((c) => c.startsWith('direction-'));\n const value = match?.slice('direction-'.length);\n if (value === 'top' || value === 'right' || value === 'bottom' || value === 'left') {\n return value;\n }\n return null;\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleFABClick);\n if (this._anchor instanceof HTMLAnchorElement && !this._anchor.hasAttribute('href')) {\n this._anchor.addEventListener('keydown', this._handleAnchorKeydown);\n }\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleFABClick);\n this._anchor?.removeEventListener('keydown', this._handleAnchorKeydown);\n }\n\n private _handleFABClick = (e: MouseEvent) => {\n e.stopPropagation();\n this._toggle();\n };\n\n private _handleAnchorKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER || e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n };\n\n private _handleDocumentKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ESC) this.close();\n };\n\n private _handleDocumentClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node) || this.el.contains(target)) return;\n this.close();\n };\n\n private _toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n}\n", "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 _trackRaf: number = null;\n private _started: boolean = false;\n private _vertical: boolean = false;\n private _resizeObserver: ResizeObserver | null = 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 _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 const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (reducedMotion) this.options.duration = 1;\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 && !reducedMotion;\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 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('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 }\n\n _removeEventHandlers() {\n this.el.removeEventListener('keydown', this._handleKeydown);\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('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\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._removeEventHandlers();\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 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 = Utils.throttle(() => this._handleResize(), 200);\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 = false;\n this._syncAutoAdvance();\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 !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 _handleTrackPointerDown = (e: PointerEvent) => {\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 _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.closest('input, textarea, select, [contenteditable=\"true\"]')) return;\n const forward = this._vertical ? e.key === 'ArrowDown' : e.key === Utils.keys.ARROW_RIGHT;\n const backward = this._vertical ? e.key === 'ArrowUp' : e.key === 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.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 position = this._vertical ? this._scroller.scrollTop : this._scroller.scrollLeft;\n const viewportCenter =\n position + (this._vertical ? this._scroller.clientHeight : this._scroller.clientWidth) / 2;\n let best = 0;\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 + size / 2 : start;\n const dist = Math.abs(target - (centered ? viewportCenter : position));\n if (dist < bestDist) {\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 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 : el.offsetLeft - inlinePadding;\n const top = el.offsetTop - blockPadding;\n const current = this._vertical ? this._scroller.scrollTop : this._scroller.scrollLeft;\n const target = this._vertical ? top : left;\n if (Math.abs(current - target) < 1) {\n this._syncActive(n, false);\n return;\n }\n this._ignoreScroll = true;\n this._scroller.scrollTo({\n left: this._vertical ? 0 : left,\n top: this._vertical ? top : 0,\n behavior: smooth ? 'smooth' : 'auto'\n });\n const done = () => {\n this._ignoreScroll = false;\n };\n this._scroller.addEventListener('scrollend', done, { once: true });\n window.setTimeout(done, this.options.duration + 350);\n }\n\n _cycleTo(n: number, callback: CarouselOptions['onCycleTo'] = null) {\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", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, {}, CharacterCounter);\n this.el['Expressive_CharacterCounter'] = this;\n\n this.options = {\n ...CharacterCounter.defaults,\n ...options\n };\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CharacterCounter.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: InputElement, options?: Partial<BaseOptions>): CharacterCounter;\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InputElement | InitElement>,\n options?: Partial<BaseOptions>\n ): CharacterCounter[];\n /**\n * Initializes instances of CharacterCounter.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InputElement | InitElements<InputElement | InitElement>,\n options: Partial<BaseOptions> = {}\n ): CharacterCounter | CharacterCounter[] {\n return super.init(els, options, CharacterCounter);\n }\n\n static getInstance(el: InputElement): CharacterCounter {\n return el['Expressive_CharacterCounter'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_CharacterCounter'] = undefined;\n this._removeCounter();\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('focus', this.updateCounter, true);\n this.el.addEventListener('input', this.updateCounter, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('focus', this.updateCounter, true);\n this.el.removeEventListener('input', this.updateCounter, true);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n // The count is the whole point of the component and it changes as the\n // user types, so it has to be a live region - otherwise a screen reader\n // user reaches the limit without ever being told one existed. Polite so\n // it waits for a pause instead of interrupting every keystroke, and\n // atomic so \"18/20\" is read as one figure rather than a changed digit.\n this.counterEl.setAttribute('aria-live', 'polite');\n this.counterEl.setAttribute('aria-atomic', 'true');\n this.counterEl.style.float = 'right';\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = (this.el as HTMLInputElement).value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabelFor: string | null;\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._originalLabelFor = null;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | InitElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | InitElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._rebuildOptions();\n this._setValueToInput();\n this._setSelectedStates();\n }\n\n _setupEventHandlers() {\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange);\n this.input.addEventListener('click', this._handleInputClick);\n this.menuEl.addEventListener('focusin', this._handleOptionFocus);\n }\n\n _removeEventHandlers() {\n this._removeOptionHandlers();\n this.el.removeEventListener('change', this._handleSelectChange);\n this.input?.removeEventListener('click', this._handleInputClick);\n this.menuEl?.removeEventListener('focusin', this._handleOptionFocus);\n }\n\n private _setupOptionHandlers() {\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n private _removeOptionHandlers() {\n this.menuEl?.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li?.id) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value) return;\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n this._toggleEntryFromArray(value);\n } else {\n this._deselectAll();\n this._selectValue(value);\n }\n this._setValueToInput();\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n if (!this.isMultiple) this.menu?.close();\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.disabled) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement('menu');\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('popover', 'auto');\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this.labelEl) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n this.input.classList.add('menu-trigger');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n if (this.el.disabled) this.input.disabled = true;\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n if (this.labelEl) {\n this._originalLabelFor = this.labelEl.htmlFor;\n this.labelEl.htmlFor = this.input.id;\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _initMenu() {\n if (this.el.disabled) return;\n const menuOptions = { ...this.options.menuOptions };\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (selectedOption) {\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n this.input.ariaExpanded = 'true';\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.menuEl.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._addOptionToValues(child, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._removeOptionHandlers();\n this.menuEl.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n if (this.labelEl && this._originalLabelFor !== null) {\n this.labelEl.htmlFor = this._originalLabelFor;\n }\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n if (realOption.disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !realOption.disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (iconUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = iconUrl;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this.menuEl.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n const realValues = this.getSelectedValues();\n return realValues.some((realValue) => realValue === value.el.value);\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n const selectedRealOptions = this._getSelectedOptions();\n const selectedOptionPairs = this._values.filter(\n (value) => selectedRealOptions.indexOf(value.el) >= 0\n );\n const notDisabledOptionPairs = selectedOptionPairs.filter((op) => !op.el.disabled);\n // textContent, not innerText: innerText is layout-dependent, so reading it\n // once per selected option forced a reflow each time.\n const texts = notDisabledOptionPairs.map((value) =>\n value.optionEl.querySelector('span').textContent.trim()\n );\n if (texts.length === 0) {\n const firstDisabledOption = <HTMLOptionElement>this.el.querySelector('option:disabled');\n if (firstDisabledOption && firstDisabledOption.value === '') {\n this.input.value = firstDisabledOption.textContent;\n return;\n }\n }\n this.input.value = texts.join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.menuEl, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((row) => row.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n", "import { Utils } from '../core/utils';\n\nexport interface DockedDisplayPluginOptions {\n /**\n * Margin between element and docked container\n */\n margin: number,\n /**\n * Transition movement\n */\n transition: number,\n /**\n * Transition duration\n */\n duration: number,\n /**\n * The alignment of the docked container\n */\n align: string\n}\n\nconst _defaults: DockedDisplayPluginOptions = {\n margin: 5,\n transition: 10,\n duration: 250,\n align: 'left'\n}\n\nexport class DockedDisplayPlugin {\n private readonly el: HTMLElement;\n private readonly container: HTMLDivElement;\n private options: Partial<DockedDisplayPluginOptions>;\n private visible: boolean;\n\n constructor(el: HTMLElement, container: HTMLElement, options: Partial<DockedDisplayPluginOptions>) {\n this.el = el;\n this.options = {\n ..._defaults,\n ...options\n };\n\n this.container = document.createElement('div');\n this.container.classList.add('display-docked');\n this.container.append(container);\n el.parentElement.append(this.container);\n\n document.addEventListener('click', this._handleDocumentClick);\n }\n\n private _handleDocumentClick = (e: MouseEvent) => {\n if (this.visible && !(this.el === <HTMLElement>e.target) && !((<HTMLElement>e.target).closest('.display-docked'))) {\n this.hide();\n }\n };\n\n /**\n * Tears the plugin down. The document listener holds a reference to this\n * instance - and through it the whole picker subtree - so the owning\n * component must call this from its own destroy().\n */\n destroy = () => {\n document.removeEventListener('click', this._handleDocumentClick);\n this.container.remove();\n };\n\n /**\n * Initializes instance of DockedDisplayPlugin\n * @param el HTMLElement to position to\n * @param container HTMLElement to be positioned\n * @param options Plugin options\n */\n static init(el: HTMLElement, container: HTMLElement, options?: Partial<DockedDisplayPluginOptions>): DockedDisplayPlugin {\n return new DockedDisplayPlugin(el, container, options);\n }\n\n show = () => {\n if (this.visible) return;\n this.visible = true;\n const coordinates = Utils._setAbsolutePosition(this.el, this.container, 'bottom', this.options.margin, this.options.transition, this.options.align);\n\n // @todo move to Util? -> duplicate code fragment with tooltip\n // easeOutCubic\n this.container.style.visibility = 'visible';\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(${coordinates.x}px) translateY(${coordinates.y}px)`;\n this.container.style.opacity = (1).toString();\n }, 1);\n };\n\n hide = () => {\n if (!this.visible) return;\n this.visible = false;\n // @todo move to Util? -> duplicate code fragment with tooltip\n this.container.removeAttribute('style');\n this.container.style.transition = `\n transform ${this.options.duration}ms ease-out,\n opacity ${this.options.duration}ms ease-out`;\n setTimeout(() => {\n this.container.style.transform = `translateX(0px) translateY(0px)`;\n this.container.style.opacity = '0';\n }, 1);\n };\n}\n", "import { Utils } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions, InitElements, InitElement } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default false\n */\n autoSubmit: true;\n /**\n * Internationalization options.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n startRange?: Date;\n /** Field used for internal calculations DO NOT CHANGE IT */\n endRange?: Date;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n startRange: null,\n endRange: null,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: '\u2039',\n nextMonth: '\u203A',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n\n /** CLEAR button instance. */\n // clearBtn: HTMLElement;\n /** DONE button instance */\n /*doneBtn: HTMLElement;\n cancelBtn: HTMLElement;*/\n\n containerEl: HTMLElement;\n yearTextEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n formats: object;\n calendars: [{ month: number; year: number }];\n private _y: number;\n private _m: number;\n private displayPlugin: DockedDisplayPlugin;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n super(el, options, Datepicker);\n this.el['Expressive_Datepicker'] = this;\n\n this.options = {\n ...Datepicker.defaults,\n ...options\n };\n\n // make sure i18n defaults are not lost when only few i18n option properties are passed\n if (!!options && options.hasOwnProperty('i18n') && typeof options.i18n === 'object') {\n this.options.i18n = { ...Datepicker.defaults.i18n, ...options.i18n };\n }\n\n // Remove time component from minDate and maxDate options\n if (this.options.minDate) this.options.minDate.setHours(0, 0, 0, 0);\n if (this.options.maxDate) this.options.maxDate.setHours(0, 0, 0, 0);\n\n this.id = Utils.guid();\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n if (!this.options.defaultDate) {\n this.options.defaultDate = new Date(Date.parse(this.el.value));\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [];\n this.dateEls.push(el);\n }\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Initializes instance of Datepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<DatepickerOptions>): Datepicker;\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<DatepickerOptions>\n ): Datepicker[];\n /**\n * Initializes instances of Datepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<DatepickerOptions> = {}\n ): Datepicker | Datepicker[] {\n return super.init(els, options, Datepicker);\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n static _isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _getDaysInMonth(year, month) {\n return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][\n month\n ];\n }\n\n static _isLeapYear(year) {\n // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static _compareWithinRange(day: Date, date: Date, dateEnd: Date) {\n return day.getTime() > date.getTime() && day.getTime() < dateEnd.getTime();\n }\n\n static _comparePastDate(a: Date, b: Date) {\n return a.getTime() < b.getTime();\n }\n\n static getInstance(el: HTMLElement): Datepicker {\n return el['Expressive_Datepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this.el['Expressive_Datepicker'] = undefined;\n }\n\n destroySelects() {\n const oldYearSelect = this.calendarEl.querySelector('.orig-select-year');\n if (oldYearSelect) {\n FormSelect.getInstance(oldYearSelect as HTMLElement).destroy();\n }\n const oldMonthSelect = this.calendarEl.querySelector('.orig-select-month');\n if (oldMonthSelect) {\n FormSelect.getInstance(oldMonthSelect as HTMLElement).destroy();\n }\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n /*if (this.options.showClearBtn) {\n this.clearBtn.style.visibility = '';\n this.clearBtn.innerText = this.options.i18n.clear;\n }\n this.doneBtn.innerText = this.options.i18n.done;\n this.cancelBtn.innerText = this.options.i18n.cancel;*/\n Utils.createButton(this.footer, this.options.i18n.clear, ['datepicker-clear'], this.options.showClearBtn, this._handleClearClick);\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(this.footer, this.options.i18n.done, this.options.i18n.cancel, this._confirm, this._cancel);\n }\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n //this.containerEl.before(this.el);\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (this.formats[label] ? this.formats[label](date) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n const date = new Date(Date.parse(el.value));\n this.setDate(date, false, el == this.endDateEl, true);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n Datepicker._setToStartOfDay(selectedDate);\n this.gotoDate(selectedDate);\n if (!preventOnSelect && typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, selectedDate);\n }\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = new Date(Date.parse(date));\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else if (isEndDate) {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const selectedDate = this.dates?.find((item) => {\n return item.getTime() === date.getTime() ? item : false;\n });\n if (!selectedDate) {\n this.dates.push(date);\n } else {\n this.dates.splice(this.dates.indexOf(selectedDate), 1);\n }\n this.dates.sort((a: Date, b: Date) => (a.getTime() < b.getTime() ? -1 : 0));\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', this.toString(date));\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const dateElsArr = Array.from(this.dateEls).filter((el, index) => {\n if (index > this.dates.length - 1) return el;\n });\n dateElsArr.forEach((el) => {\n el.remove();\n });\n this.dates.forEach((date: Date, index: number) => {\n if (Array.from(this.dateEls)[index]) {\n this.setInputValue(this.dateEls[index], date);\n return;\n }\n\n const dateEl = this.createDateInput();\n this.setInputValue(dateEl, date);\n this.dateEls.push(dateEl);\n });\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (el.type == 'date') {\n this.setDataDate(el, date);\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this.el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // this.yearTextEl.innerHTML = displayDate.getFullYear().toString();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n days = Datepicker._getDaysInMonth(year, month),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = Datepicker._getDaysInMonth(yearOfPreviousMonth, previousMonth);\n let cells = days + before,\n after = cells;\n while (after > 7) {\n after -= 7;\n }\n cells += 7 - after;\n let isWeekSelected = false;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isStartRange =\n this.options.startRange && Datepicker._compareDates(this.options.startRange, day),\n isEndRange = this.options.endRange && Datepicker._compareDates(this.options.endRange, day),\n isInRange =\n this.options.startRange &&\n this.options.endRange &&\n this.options.startRange < day &&\n day < this.options.endRange,\n isDisabled =\n (this.options.minDate && day < this.options.minDate) ||\n (this.options.maxDate && day > this.options.maxDate) ||\n (this.options.disableWeekends && Datepicker._isWeekend(day)) ||\n (this.options.disableDayFn && this.options.disableDayFn(day)),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n Datepicker._isDate(this.endDate) &&\n Datepicker._compareWithinRange(day, this.date, this.endDate);\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n isStartRange: isStartRange,\n isEndRange: isEndRange,\n isInRange: isInRange,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, isWeekSelected));\n row = [];\n r = 0;\n isWeekSelected = false;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isInRange: 'is-inrange',\n isStartRange: 'is-startrange',\n isEndRange: 'is-endrange',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = !(['isSelected', 'isDateRange'].filter((prop) => !!(opts.hasOwnProperty(prop) && opts[prop] === true)).length === 0),\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n return (\n `<td data-day=\"${opts.day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${opts.year}\" data-month=\"${opts.month}\" data-day=\"${opts.day}\">${opts.day}</button>` +\n '</td>'\n );\n }\n\n renderRow(days, isRTL, isRowSelected) {\n return (\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n (isRTL ? days.reverse() : days).join('') +\n '</tr>'\n );\n }\n\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n randId +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n renderBody(rows) {\n return '<tbody>' + rows.join('') + '</tbody>';\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n randId +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${\n prev ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${\n next ? '' : ' is-disabled'\n // @todo remove button class and add scss mixin, current implementation temporary for focus states, @see https://github.com/materializecss/materialize/issues/566\n }\" type=\"button\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const opts = this.options,\n minYear = opts.minYear,\n maxYear = opts.maxYear,\n minMonth = opts.minMonth,\n maxMonth = opts.maxMonth;\n\n if (this._y <= minYear) {\n this._y = minYear;\n if (!isNaN(minMonth) && this._m < minMonth) {\n this._m = minMonth;\n }\n }\n if (this._y >= maxYear) {\n this._y = maxYear;\n if (!isNaN(maxMonth) && this._m > maxMonth) {\n this._m = maxMonth;\n }\n }\n\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n if (!this.options.isDateRange) {\n this._renderDateDisplay(this.date);\n } else {\n this._renderDateDisplay(this.date, this.endDate);\n }\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Menu - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility @see https://github.com/materializecss/materialize/issues/522\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('change', this._handleInputChange);\n this.calendarEl.addEventListener('click', this._handleCalendarClick);\n /* this.doneBtn.addEventListener('click', this._confirm);\n this.cancelBtn.addEventListener('click', this._cancel);\n\n if (this.options.showClearBtn) {\n this.clearBtn.addEventListener('click', this._handleClearClick);\n }*/\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.yearTextEl = this.containerEl.querySelector('.year-text');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n /* if (this.options.showClearBtn) {\n this.clearBtn = this.containerEl.querySelector('.datepicker-clear');\n }\n this.doneBtn = this.containerEl.querySelector('.datepicker-done');\n this.cancelBtn = this.containerEl.querySelector('.datepicker-cancel');*/\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n\n this.formats = {\n d: (date: Date) => {\n return date.getDate();\n },\n dd: (date: Date) => {\n const d = date.getDate();\n return (d < 10 ? '0' : '') + d;\n },\n ddd: (date: Date) => {\n return this.options.i18n.weekdaysShort[date.getDay()];\n },\n dddd: (date: Date) => {\n return this.options.i18n.weekdays[date.getDay()];\n },\n m: (date: Date) => {\n return date.getMonth() + 1;\n },\n mm: (date: Date) => {\n const m = date.getMonth() + 1;\n return (m < 10 ? '0' : '') + m;\n },\n mmm: (date: Date) => {\n return this.options.i18n.monthsShort[date.getMonth()];\n },\n mmmm: (date: Date) => {\n return this.options.i18n.months[date.getMonth()];\n },\n yy: (date: Date) => {\n return ('' + date.getFullYear()).slice(2);\n },\n yyyy: (date: Date) => {\n return date.getFullYear();\n }\n };\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('change', this._handleInputChange);\n this.calendarEl.removeEventListener('click', this._handleCalendarClick);\n if (this.options.isDateRange && this.endDateEl) {\n this.endDateEl.removeEventListener('click', this._handleInputClick);\n this.endDateEl.removeEventListener('keypress', this._handleInputKeydown);\n this.endDateEl.removeEventListener('change', this._handleInputChange);\n }\n }\n\n _handleInputClick = (e) => {\n // Prevents default browser datepicker modal rendering\n if (e.type == 'date') {\n e.preventDefault();\n }\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || (this.multiple && this.options.isMultipleSelection)) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && Datepicker._comparePastDate(date, this.date)) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n _handleInputChange = (e: Event) => {\n let date;\n const el = e.target as HTMLElement;\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n // Prevent change event from being fired if an end date is set without a start date\n if (el == this.endDateEl && !this.date) return;\n if (this.options.parse) {\n date = this.options.parse(\n (e.target as HTMLInputElement).value,\n typeof this.options.format === 'function'\n ? this.options.format(new Date(this.el.value))\n : this.options.format\n );\n } else {\n date = new Date(Date.parse((e.target as HTMLInputElement).value));\n }\n if (Datepicker._isDate(date)) {\n this.setDate(date, false, el == this.endDateEl, true);\n if (e.type == 'date') {\n this.setDataDate(e, date);\n this.setInputValues();\n }\n }\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.addEventListener('click', this._handleInputClick);\n dateInput.addEventListener('keypress', this._handleInputKeydown);\n dateInput.addEventListener('change', this._handleInputChange);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n _finishSelection = () => {\n this.setInputValues();\n };\n\n _confirm = () => {\n this._finishSelection();\n if (typeof this.options.onConfirm === 'function') this.options.onConfirm.call(this);\n }\n\n _cancel = () => {\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n };\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"year-text\"></span>\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { BaseOptions, Component, InitElements, InitElement } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n /** Ancestors forced to `overflow: visible`, with the inline value to put back. */\n private _changedAncestorList: [HTMLElement, string][];\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options, Lightbox);\n this.el['Expressive_Lightbox'] = this;\n\n this.options = {\n ...Lightbox.defaults,\n ...options\n };\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this.el.tabIndex = 0;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Lightbox.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<LightboxOptions>): Lightbox;\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<LightboxOptions>): Lightbox[];\n /**\n * Initializes instances of Lightbox.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<LightboxOptions> = {}\n ): Lightbox | Lightbox[] {\n return super.init(els, options, Lightbox);\n }\n\n static getInstance(el: HTMLElement): Lightbox {\n return el['Expressive_Lightbox'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.el['Expressive_Lightbox'] = undefined;\n // Unwrap image\n //this.placeholder.after(this.el).remove();\n this.placeholder.remove();\n this.el.removeAttribute('style');\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('click', this._handleLightboxClick);\n this.el.addEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleLightboxClick);\n this.el.removeEventListener('keypress', this._handleLightboxKeypress);\n }\n\n private _handleLightboxClick = () => {\n this._handleLightboxToggle();\n };\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this.doneAnimating === false || (this.overlayActive && this.doneAnimating)) this.close();\n else this.open();\n };\n\n private _handleWindowScroll = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowResize = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ESC && this.doneAnimating && this.overlayActive) this.close();\n };\n\n private _makeAncestorsOverflowVisible() {\n this._changedAncestorList = [];\n let ancestor: Node = this.placeholder.parentNode;\n while (ancestor !== null && ancestor !== undefined && ancestor !== document) {\n const curr = <HTMLElement>ancestor;\n // A shadow root has no style; the clipping ancestors are above its host.\n if (curr.style && curr.style.overflow !== 'visible') {\n // Read before the write: an author's inline `overflow` has to come\n // back on close, and restoring '' would silently discard it.\n this._changedAncestorList.push([curr, curr.style.overflow]);\n curr.style.overflow = 'visible';\n }\n ancestor = ancestor.parentNode ?? (<ShadowRoot>ancestor).host;\n }\n }\n\n private _offset(el: HTMLElement) {\n const box = el.getBoundingClientRect();\n const docElem = document.documentElement;\n return {\n top: box.top + window.scrollY - docElem.clientTop,\n left: box.left + window.scrollX - docElem.clientLeft\n };\n }\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n setTimeout(() => {\n // One offset for both axes, read before any of the writes below.\n const placeholderOffset = this._offset(this.placeholder);\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left =\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n placeholderOffset.left -\n this.newWidth / 2 +\n 'px';\n\n this.el.style.top =\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n placeholderOffset.top -\n this.newHeight / 2 +\n 'px';\n }, 1);\n\n setTimeout(() => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }, duration);\n\n /*\n anim({\n targets: this.el, // image\n height: [this.originalHeight, this.newHeight],\n width: [this.originalWidth, this.newWidth],\n left:\n Utils.getDocumentScrollLeft() +\n this.windowWidth / 2 -\n this._offset(this.placeholder).left -\n this.newWidth / 2,\n top:\n Utils.getDocumentScrollTop() +\n this.windowHeight / 2 -\n this._offset(this.placeholder).top -\n this.newHeight / 2,\n\n duration: this.options.inDuration,\n easing: 'easeOutQuad',\n complete: () => {\n this.doneAnimating = true;\n if (typeof this.options.onOpenEnd === 'function') this.options.onOpenEnd.call(this, this.el);\n }\n });\n */\n }\n private _animateImageOut(): void {\n const duration = this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n this.el.style.left = '0';\n this.el.style.top = '0';\n setTimeout(() => {\n this.placeholder.style.height = '';\n this.placeholder.style.width = '';\n this.placeholder.style.position = '';\n this.placeholder.style.top = '';\n this.placeholder.style.left = '';\n // Revert to width or height attribute\n if (this.attrWidth) this.el.setAttribute('width', this.attrWidth.toString());\n if (this.attrHeight) this.el.setAttribute('height', this.attrHeight.toString());\n this.el.removeAttribute('style');\n if (this.originInlineStyles) this.el.setAttribute('style', this.originInlineStyles);\n // Remove class\n this.el.classList.remove('active');\n this.doneAnimating = true;\n // Remove overflow overrides on ancestors\n this._changedAncestorList.forEach(([ancestor, overflow]) => (ancestor.style.overflow = overflow));\n // onCloseEnd callback\n if (typeof this.options.onCloseEnd === 'function')\n this.options.onCloseEnd.call(this, this.el);\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n Utils.portalRoot(this.el).append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n // Animate\n this._photoCaption.style.transition = 'none';\n this._photoCaption.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '1';\n }, 1);\n }\n private _removeCaption(): void {\n const duration = this.options.outDuration;\n this._photoCaption.style.transition = `opacity ${duration}ms ease`;\n this._photoCaption.style.opacity = '0';\n setTimeout(() => {\n this._photoCaption.remove();\n }, duration);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n () => {\n if (this.doneAnimating) this.close();\n },\n { once: true }\n );\n\n // Put before in origin image to preserve z-index layering.\n this.el.before(this._overlay);\n\n // Set dimensions if needed\n const overlayOffset = this._overlay.getBoundingClientRect();\n this._overlay.style.width = this.windowWidth + 'px';\n this._overlay.style.height = this.windowHeight + 'px';\n this._overlay.style.left = -1 * overlayOffset.left + 'px';\n this._overlay.style.top = -1 * overlayOffset.top + 'px';\n\n // Animate\n this._overlay.style.transition = 'none';\n this._overlay.style.opacity = '0';\n const duration = this.options.inDuration;\n setTimeout(() => {\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '1';\n }, 1);\n }\n private _removeOverlay(): void {\n const duration = this.options.outDuration;\n this._overlay.style.transition = `opacity ${duration}ms ease`;\n this._overlay.style.opacity = '0';\n setTimeout(() => {\n this.overlayActive = false;\n this._overlay.remove();\n }, duration);\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (typeof this.options.onOpenStart === 'function')\n this.options.onOpenStart.call(this, this.el);\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n this.placeholder.style.position = 'relative';\n this.placeholder.style.top = '0';\n this.placeholder.style.left = '0';\n this._makeAncestorsOverflowVisible();\n // Set css on origin\n this.el.style.position = 'absolute';\n this.el.style.zIndex = '1000';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n this._addOverlay();\n // Add and animate caption if it exists\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n this.newWidth = 0;\n this.newHeight = 0;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n this._animateImageIn();\n // Handle Exit triggers\n window.addEventListener('scroll', this._handleWindowScroll, { passive: true });\n window.addEventListener('resize', this._handleWindowResize, { passive: true });\n window.addEventListener('keyup', this._handleWindowEscape);\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n this._updateVars();\n this.doneAnimating = false;\n // onCloseStart callback\n if (typeof this.options.onCloseStart === 'function')\n this.options.onCloseStart.call(this, this.el);\n // disable exit handlers\n window.removeEventListener('scroll', this._handleWindowScroll);\n window.removeEventListener('resize', this._handleWindowResize);\n window.removeEventListener('keyup', this._handleWindowEscape);\n this._removeOverlay();\n this._animateImageOut();\n if (this.caption !== '') this._removeCaption();\n };\n}\n", "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 _observer: IntersectionObserver | null = null;\n private static _ratios = new Map<Element, number>();\n private static _active: Element | null = null;\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.el.style.setProperty(\n '--md-comp-scrollspy-offset',\n `${this.options.scrollOffset}px`\n );\n\n ScrollSpy._elements.push(this);\n ScrollSpy._ensureObserver(this.options.scrollOffset);\n ScrollSpy._observer?.observe(this.el);\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) ScrollSpy._elements.splice(index, 1);\n ScrollSpy._ratios.delete(this.el);\n ScrollSpy._observer?.unobserve(this.el);\n\n const link = ScrollSpy._linkFor(this.el.id, this.options);\n if (link && link === ScrollSpy._active) {\n ScrollSpy._clearActive(this.options);\n } else {\n link?.classList.remove(this.options.activeClass);\n link?.removeAttribute('aria-current');\n }\n\n if (ScrollSpy._elements.length === 0) {\n ScrollSpy._observer?.disconnect();\n ScrollSpy._observer = null;\n ScrollSpy._ratios.clear();\n ScrollSpy._active = null;\n } else {\n ScrollSpy._syncActive();\n }\n\n this.el['Expressive_ScrollSpy'] = undefined;\n }\n\n private static _ensureObserver(offset: number) {\n if (ScrollSpy._observer) return;\n if (typeof IntersectionObserver === 'undefined') return;\n ScrollSpy._observer = new IntersectionObserver(ScrollSpy._onIntersect, {\n rootMargin: `-${offset}px 0px -45% 0px`,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1]\n });\n }\n\n private static _onIntersect = (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\n ScrollSpy._ratios.set(entry.target, entry.intersectionRatio);\n } else {\n ScrollSpy._ratios.delete(entry.target);\n }\n }\n ScrollSpy._syncActive();\n };\n\n private static _syncActive() {\n if (!ScrollSpy._elements.length) return;\n const options = ScrollSpy._elements[0].options;\n\n let best: ScrollSpy | null = null;\n let bestRatio = 0;\n for (const spy of ScrollSpy._elements) {\n const ratio = ScrollSpy._ratios.get(spy.el) ?? 0;\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = spy;\n }\n }\n\n if (!best) {\n if (options.keepTopElementActive) {\n best = ScrollSpy._nearestAbove() ?? ScrollSpy._elements[0];\n } else {\n ScrollSpy._clearActive(options);\n return;\n }\n }\n\n const next = ScrollSpy._linkFor(best.el.id, best.options);\n if (next === ScrollSpy._active) return;\n ScrollSpy._clearActive(options);\n if (!next) return;\n next.classList.add(best.options.activeClass);\n next.setAttribute('aria-current', 'true');\n ScrollSpy._active = next;\n }\n\n private static _nearestAbove(): ScrollSpy | null {\n let best: ScrollSpy | null = null;\n let bestTop = -Infinity;\n for (const spy of ScrollSpy._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(options: ScrollSpyOptions) {\n if (!ScrollSpy._active) return;\n ScrollSpy._active.classList.remove(options.activeClass);\n ScrollSpy._active.removeAttribute('aria-current');\n ScrollSpy._active = null;\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", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface NavigationDrawerOptions extends BaseOptions {\n /**\n * Side of screen on which NavigationDrawer appears.\n * @default 'left'\n */\n edge: 'left' | 'right';\n /**\n * Allow swipe gestures to open/close NavigationDrawer.\n * @default true\n */\n draggable: boolean;\n /**\n * Width of the area where you can start dragging.\n * @default '10px'\n */\n dragTargetWidth: string;\n /**\n * Function called when sidenav starts entering.\n */\n onOpenStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes entering.\n */\n onOpenEnd: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav starts exiting.\n */\n onCloseStart: (elem: HTMLElement) => void;\n /**\n * Function called when sidenav finishes exiting.\n */\n onCloseEnd: (elem: HTMLElement) => void;\n}\n\nconst _defaults: NavigationDrawerOptions = {\n edge: 'left',\n draggable: true,\n dragTargetWidth: '10px',\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst EXPANDED_UP = '(width >= 840px)';\n\n/**\n * Navigation drawer. Overlay is a modal <dialog>; fixed is a breakpoint.\n * JS opens/closes, handles the trigger, and writes --md-comp-nav-drawer-shift\n * while dragging. CSS owns the slide, the scrim, and the Expanded+ dock.\n */\nexport class NavigationDrawer extends Component<NavigationDrawerOptions> implements Openable {\n id: string;\n /** Describes open/close state of the overlay drawer. */\n isOpen: boolean;\n /** Whether the drawer is docked (`navigation-drawer-fixed`). */\n isFixed: boolean;\n /** Describes if NavigationDrawer is being dragged. */\n isDragged: boolean;\n static _sidenavs: NavigationDrawer[];\n dragTarget: HTMLElement | null;\n private _dialog: HTMLDialogElement | null;\n private _createdDialog: boolean;\n private _closing: boolean;\n private _mql: MediaQueryList;\n private _startingXpos: number;\n private _xPos: number;\n private _width: number;\n private _initialScrollTop: number;\n private _verticallyScrolling: boolean;\n private percentOpen: number;\n\n constructor(el: HTMLElement, options: Partial<NavigationDrawerOptions>) {\n super(el, options, NavigationDrawer);\n this.el['Expressive_NavigationDrawer'] = this;\n\n this.options = {\n ...NavigationDrawer.defaults,\n ...options\n };\n\n this.id = this.el.id;\n this.isOpen = false;\n // Both spellings: the Sass alias made `.navigation-drawer-fixed` style\n // like the old class, but this read the old name only - so the canonical\n // markup was treated as an overlay at the Expanded breakpoint, leaving the\n // drag target live and letting open() call showModal() on a docked drawer.\n this.isFixed =\n this.el.classList.contains('navigation-drawer-fixed') ||\n this.el.classList.contains('sidenav-fixed');\n this.isDragged = false;\n this.dragTarget = null;\n this._dialog = null;\n this._createdDialog = false;\n this._closing = false;\n this.percentOpen = 0;\n this._startingXpos = 0;\n this._xPos = 0;\n this._width = 0;\n this._initialScrollTop = 0;\n this._verticallyScrolling = false;\n\n this._mql = window.matchMedia(EXPANDED_UP);\n this._setupDialog();\n this._createDragTarget();\n this._setupClasses();\n this._setupEventHandlers();\n this._syncTriggers();\n\n NavigationDrawer._sidenavs.push(this);\n }\n\n static get defaults(): NavigationDrawerOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of NavigationDrawer.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<NavigationDrawerOptions>): NavigationDrawer;\n /**\n * Initializes instances of NavigationDrawer.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<NavigationDrawerOptions>): NavigationDrawer[];\n /**\n * Initializes instances of NavigationDrawer.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<NavigationDrawerOptions> = {}\n ): NavigationDrawer | NavigationDrawer[] {\n return super.init(els, options, NavigationDrawer);\n }\n\n static getInstance(el: HTMLElement): NavigationDrawer {\n return el['Expressive_NavigationDrawer'];\n }\n\n destroy() {\n this._removeEventHandlers();\n if (this._dialog?.open) {\n try {\n this._dialog.close();\n } catch {\n // already closed\n }\n }\n this._clearShift();\n this._unwrapDialog();\n this._removeDragTarget();\n this.el['Expressive_NavigationDrawer'] = undefined;\n const index = NavigationDrawer._sidenavs.indexOf(this);\n if (index >= 0) {\n NavigationDrawer._sidenavs.splice(index, 1);\n }\n }\n\n /**\n * Opens the overlay drawer. No-op while the sidenav is docked\n * (navigation-drawer-fixed at the Expanded breakpoint).\n */\n open = () => {\n if (this._isCurrentlyFixed() || this.isOpen || !this._dialog) return;\n\n NavigationDrawer._sidenavs.forEach((other) => {\n if (other !== this && other.isOpen) other.close();\n });\n\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n\n this.isOpen = true;\n this._dialog.classList.remove('dragging');\n this._clearShift();\n if (!this._dialog.open) {\n try {\n this._dialog.showModal();\n } catch {\n // already open\n }\n }\n this._syncTriggers();\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, this.el);\n }\n };\n\n /**\n * Closes the overlay drawer. No-op while the sidenav is docked.\n */\n close = () => {\n if (this._isCurrentlyFixed() || !this.isOpen) return;\n this._beginClose();\n if (this._dialog?.open) {\n this._closing = true;\n this._dialog.close();\n } else {\n this._finishClose();\n }\n };\n\n private _beginClose() {\n this.isOpen = false;\n this._dialog?.classList.remove('dragging');\n this._clearShift();\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this._syncTriggers();\n }\n\n private _finishClose() {\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, this.el);\n }\n }\n\n private _onDialogClose = () => {\n if (this.isOpen) {\n this._beginClose();\n this._finishClose();\n return;\n }\n if (this._closing) {\n this._closing = false;\n this._finishClose();\n }\n };\n\n private _onBreakpointChange = () => {\n if (this._isCurrentlyFixed() && this.isOpen) {\n this.close();\n }\n };\n\n private _setupDialog() {\n if (this.el instanceof HTMLDialogElement) {\n this._dialog = this.el;\n this._createdDialog = false;\n return;\n }\n const parent = this.el.parentElement;\n if (parent instanceof HTMLDialogElement && parent.classList.contains('sidenav-overlay')) {\n this._dialog = parent;\n this._createdDialog = false;\n return;\n }\n const dialog = document.createElement('dialog');\n dialog.classList.add('sidenav-overlay');\n // Carry the drawer's name onto the dialog. A <dialog> takes no name from\n // its contents, so without this the drawer opened announced as just\n // \"dialog\" - and the label the author wrote on the wrapping <nav> is\n // outside the modal once it opens, where nothing will read it.\n const named = this.el.closest('[aria-label], [aria-labelledby]') ?? this.el;\n const label = named.getAttribute('aria-label');\n const labelledBy = named.getAttribute('aria-labelledby');\n if (label) dialog.setAttribute('aria-label', label);\n else if (labelledBy) dialog.setAttribute('aria-labelledby', labelledBy);\n this.el.replaceWith(dialog);\n dialog.appendChild(this.el);\n this._dialog = dialog;\n this._createdDialog = true;\n }\n\n private _unwrapDialog() {\n if (!this._createdDialog || !this._dialog) return;\n this._dialog.replaceWith(this.el);\n this._dialog = null;\n this._createdDialog = false;\n }\n\n private _createDragTarget() {\n if (!this.options.draggable) return;\n const dragTarget = document.createElement('div');\n dragTarget.classList.add('drag-target');\n dragTarget.style.width = this.options.dragTargetWidth;\n if (this.isFixed) dragTarget.dataset.fixed = '';\n Utils.portalRoot(this.el).appendChild(dragTarget);\n this.dragTarget = dragTarget;\n }\n\n private _removeDragTarget() {\n this.dragTarget?.remove();\n this.dragTarget = null;\n }\n\n private _setupClasses() {\n if (this.options.edge === 'right') {\n this.el.classList.add('right-aligned');\n this._dialog?.classList.add('right-aligned');\n this.dragTarget?.classList.add('right-aligned');\n }\n }\n\n private _setupEventHandlers() {\n if (NavigationDrawer._sidenavs.length === 0) {\n document.body.addEventListener('click', NavigationDrawer._handleTriggerClick);\n }\n // Touch events, deliberately, while four other components moved to Pointer\n // Events. There is no mouse pair here to collapse - the edge drag has only\n // ever been a touch gesture - so a conversion would not remove a listener;\n // it would add `pointerdown` + `setPointerCapture` to replace the implicit\n // capture `touchmove` already has, and would make the drawer mouse-\n // draggable, which is a new behaviour rather than a smaller one.\n const passive = { passive: true } as const;\n this.dragTarget?.addEventListener('touchmove', this._handleDragTargetDrag, passive);\n this.dragTarget?.addEventListener('touchend', this._handleDragTargetRelease);\n this._dialog?.addEventListener('touchmove', this._handleCloseDrag, passive);\n this._dialog?.addEventListener('touchend', this._handleCloseRelease);\n this._dialog?.addEventListener('close', this._onDialogClose);\n this.el.addEventListener('click', this._handleCloseTriggerClick);\n this._mql.addEventListener('change', this._onBreakpointChange);\n }\n\n private _removeEventHandlers() {\n if (NavigationDrawer._sidenavs.length === 1) {\n document.body.removeEventListener('click', NavigationDrawer._handleTriggerClick);\n }\n this.dragTarget?.removeEventListener('touchmove', this._handleDragTargetDrag);\n this.dragTarget?.removeEventListener('touchend', this._handleDragTargetRelease);\n this._dialog?.removeEventListener('touchmove', this._handleCloseDrag);\n this._dialog?.removeEventListener('touchend', this._handleCloseRelease);\n this._dialog?.removeEventListener('close', this._onDialogClose);\n this.el.removeEventListener('click', this._handleCloseTriggerClick);\n this._mql.removeEventListener('change', this._onBreakpointChange);\n }\n\n private static _handleTriggerClick(e: Event) {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest('.sidenav-trigger, .navigation-drawer-trigger');\n if (!trigger || !(trigger instanceof HTMLElement)) return;\n const sidenavId = Utils.getIdFromTrigger(trigger);\n const sidenavInstance =\n Utils.getElementById(trigger, sidenavId)?.['Expressive_NavigationDrawer'];\n if (sidenavInstance) {\n sidenavInstance.open();\n e.preventDefault();\n }\n }\n\n private _handleCloseTriggerClick = (e: Event) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const closeTrigger = target.closest('.sidenav-close, .navigation-drawer-close');\n if (closeTrigger && !this._isCurrentlyFixed()) {\n this.close();\n }\n };\n\n private _isDraggable() {\n return this.options.draggable && !this._isCurrentlyFixed() && !this._verticallyScrolling;\n }\n\n private _isCurrentlyFixed() {\n return this.isFixed && this._mql.matches;\n }\n\n private _startDrag(e: TouchEvent) {\n const clientX = e.targetTouches[0].clientX;\n this.isDragged = true;\n this._startingXpos = clientX;\n this._xPos = clientX;\n this._width =\n this._dialog?.getBoundingClientRect().width || this.el.getBoundingClientRect().width;\n this._initialScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._verticallyScrolling = false;\n this._dialog?.classList.add('dragging');\n if (this._dialog && !this._dialog.open) {\n try {\n this._dialog.showModal();\n } catch {\n // already open\n }\n }\n }\n\n private _dragMoveUpdate(e: TouchEvent) {\n const clientX = e.targetTouches[0].clientX;\n const currentScrollTop = this.isOpen ? this.el.scrollTop : Utils.getDocumentScrollTop();\n this._xPos = clientX;\n if (this._initialScrollTop !== currentScrollTop) {\n this._verticallyScrolling = true;\n }\n }\n\n private _rawDelta(e: TouchEvent) {\n if (!this.isDragged) this._startDrag(e);\n this._dragMoveUpdate(e);\n return this._xPos - this._startingXpos;\n }\n\n private _applyShift(shift: number, percentOpen: number) {\n this.percentOpen = percentOpen;\n const host = this._dialog ?? this.el;\n host.style.setProperty('--md-comp-nav-drawer-shift', `${shift}px`);\n host.style.setProperty('--md-comp-nav-drawer-open', String(percentOpen));\n }\n\n private _clearShift() {\n const host = this._dialog ?? this.el;\n host.style.removeProperty('--md-comp-nav-drawer-shift');\n host.style.removeProperty('--md-comp-nav-drawer-open');\n }\n\n private _handleDragTargetDrag = (e: TouchEvent) => {\n if (!this._isDraggable()) return;\n const delta = this._rawDelta(e);\n const towardOpen = this.options.edge === 'left' ? delta : -delta;\n const visible = Math.min(this._width, Math.max(0, towardOpen));\n const percentOpen = this._width ? visible / this._width : 0;\n this._applyShift(visible - this._width, percentOpen);\n };\n\n private _handleDragTargetRelease = () => {\n if (!this.isDragged) return;\n this._dialog?.classList.remove('dragging');\n if (this.percentOpen > 0.2) {\n this.open();\n } else if (this._dialog?.open && !this.isOpen) {\n this._clearShift();\n this._dialog.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n };\n\n private _handleCloseDrag = (e: TouchEvent) => {\n if (!this.isOpen || !this._isDraggable()) return;\n const delta = this._rawDelta(e);\n const towardClose = this.options.edge === 'left' ? -delta : delta;\n const hidden = Math.min(this._width, Math.max(0, towardClose));\n const percentOpen = this._width ? 1 - hidden / this._width : 1;\n this._applyShift(-hidden, percentOpen);\n };\n\n private _handleCloseRelease = () => {\n if (!this.isOpen || !this.isDragged) return;\n this._dialog?.classList.remove('dragging');\n if (this.percentOpen > 0.8) {\n this._clearShift();\n } else {\n this.close();\n }\n this.isDragged = false;\n this._verticallyScrolling = false;\n };\n\n private _syncTriggers() {\n if (!this.id) return;\n document.querySelectorAll('.sidenav-trigger, .navigation-drawer-trigger').forEach((trigger) => {\n if (!(trigger instanceof HTMLElement)) return;\n if (Utils.getIdFromTrigger(trigger) !== this.id) return;\n trigger.setAttribute('aria-expanded', this.isOpen ? 'true' : 'false');\n trigger.setAttribute('aria-controls', this.id);\n });\n }\n\n static {\n NavigationDrawer._sidenavs = [];\n }\n}\n", "import { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface NavigationRailOptions extends BaseOptions {\n /**\n * Called before the rail expands.\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Called after the rail expands.\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Called before the rail collapses.\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Called after the rail collapses.\n */\n onCloseEnd: (el: HTMLElement) => void;\n}\n\nconst _defaults: NavigationRailOptions = {\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst COMPACT = '(width < 600px)';\n\n/**\n * Navigation rail. Layout is CSS (collapsed / .expanded). This class\n * toggles that class from the menu button, closes a compact overlay on\n * Escape or a scrim tap, and keeps aria-expanded in sync.\n */\nexport class NavigationRail extends Component<NavigationRailOptions> {\n isExpanded: boolean;\n private _toggle: HTMLButtonElement | null;\n private _mql: MediaQueryList;\n\n constructor(el: HTMLElement, options: Partial<NavigationRailOptions>) {\n super(el, options, NavigationRail);\n this.el['Expressive_NavigationRail'] = this;\n\n this.options = {\n ...NavigationRail.defaults,\n ...options\n };\n\n this._toggle = this._findToggle();\n this._mql = window.matchMedia(COMPACT);\n this.isExpanded = this.el.classList.contains('expanded');\n this._sync();\n this.el.addEventListener('click', this._onClick);\n document.addEventListener('keydown', this._onKeyDown);\n }\n\n static get defaults(): NavigationRailOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<NavigationRailOptions>): NavigationRail;\n static init(\n els: InitElements<InitElement>,\n options?: Partial<NavigationRailOptions>\n ): NavigationRail[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<NavigationRailOptions> = {}\n ): NavigationRail | NavigationRail[] {\n return super.init(els, options, NavigationRail);\n }\n\n static getInstance(el: HTMLElement): NavigationRail {\n return el['Expressive_NavigationRail'];\n }\n\n destroy() {\n this.el.removeEventListener('click', this._onClick);\n document.removeEventListener('keydown', this._onKeyDown);\n this.el['Expressive_NavigationRail'] = undefined;\n }\n\n /**\n * Expands the rail. On compact windows the overlay (scrim) is CSS.\n */\n expand = () => {\n if (this.isExpanded) return;\n if (typeof this.options.onOpenStart === 'function') {\n this.options.onOpenStart.call(this, this.el);\n }\n this.isExpanded = true;\n this.el.classList.add('expanded');\n this._sync();\n if (typeof this.options.onOpenEnd === 'function') {\n this.options.onOpenEnd.call(this, this.el);\n }\n };\n\n /**\n * Collapses the rail.\n */\n collapse = () => {\n if (!this.isExpanded) return;\n if (typeof this.options.onCloseStart === 'function') {\n this.options.onCloseStart.call(this, this.el);\n }\n this.isExpanded = false;\n this.el.classList.remove('expanded');\n this._sync();\n if (typeof this.options.onCloseEnd === 'function') {\n this.options.onCloseEnd.call(this, this.el);\n }\n };\n\n /**\n * Toggles expanded / collapsed.\n */\n toggle = () => {\n if (this.isExpanded) this.collapse();\n else this.expand();\n };\n\n private _findToggle(): HTMLButtonElement | null {\n const first = this.el.querySelector(':scope > button:not(.button)');\n return first instanceof HTMLButtonElement ? first : null;\n }\n\n private _isCompact() {\n return this._mql.matches;\n }\n\n private _isModal() {\n return this.el.classList.contains('modal') || this._isCompact();\n }\n\n private _sync() {\n this.el.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n this._toggle?.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n }\n\n private _onClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node)) return;\n if (this._toggle && (target === this._toggle || this._toggle.contains(target))) {\n this.toggle();\n e.preventDefault();\n return;\n }\n if (target === this.el && this.isExpanded && this._isModal()) {\n this.collapse();\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (this.isExpanded && this._isModal()) this.collapse();\n };\n}\n", "import { Carousel } from './carousel';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Transition duration in milliseconds.\n * @default 300\n */\n duration: number;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to enable swipeable tabs.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\nconst _defaults: TabsOptions = {\n duration: 300,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _tabsCarousel: Carousel;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options, Tabs);\n this.el['Expressive_Tabs'] = this;\n\n this.options = {\n ...Tabs.defaults,\n ...options\n };\n\n this._tabLinks = this._queryTabLinks();\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tabs.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TabsOptions>): Tabs;\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TabsOptions>): Tabs[];\n /**\n * Initializes instances of Tabs.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TabsOptions> = {}\n ): Tabs | Tabs[] {\n return super.init(els, options, Tabs);\n }\n\n static getInstance(el: HTMLElement): Tabs {\n return el['Expressive_Tabs'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._indicator.parentNode.removeChild(this._indicator);\n if (this.options.swipeable) {\n this._teardownSwipeableTabs();\n } else {\n this._teardownNormalTabs();\n }\n this.el['Expressive_Tabs'] = undefined;\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n window.addEventListener('resize', this._handleWindowResize);\n this.el.addEventListener('click', this._handleTabClick);\n }\n\n _removeEventHandlers() {\n window.removeEventListener('resize', this._handleWindowResize);\n this.el.removeEventListener('click', this._handleTabClick);\n }\n\n _handleWindowResize = () => {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) {\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n };\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(\n ':scope > a, :scope > .tab > a'\n );\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a') as HTMLAnchorElement | null;\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const tab = tabLink.parentElement;\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true' ||\n tab?.classList.contains('disabled');\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n const _oldContent = this._content;\n // Update the variables with the new link and content\n if (tabLink.hash) this._content = document.querySelector(tabLink.hash);\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n this._setActiveTabLink(tabLink);\n const prevIndex = this._index;\n this._index = Math.max(Array.from(this._tabLinks).indexOf(tabLink), 0);\n\n // Swap content\n if (this.options.swipeable) {\n if (this._tabsCarousel) {\n this._tabsCarousel.set(this._index, () => {\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n });\n }\n } else {\n if (this._content) {\n this._content.style.display = 'block';\n this._content.classList.add('active');\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n if (_oldContent && _oldContent !== this._content) {\n _oldContent.style.display = 'none';\n _oldContent.classList.remove('active');\n }\n }\n }\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n e.preventDefault();\n };\n\n _createIndicator() {\n const tag = this.el.tagName === 'UL' || this.el.tagName === 'OL' ? 'li' : 'span';\n const indicator = document.createElement(tag);\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. `aria-current` is the part a screen reader\n * reads, and because tabs are navigation rather than a tablist (rule 2 -\n * there is no keyboard model here to back a tablist), \"current\" is exactly\n * the right word for it. Its *value* changes as the user clicks, which makes\n * maintaining it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement) {\n Array.from(this._tabLinks).forEach((a: HTMLAnchorElement) => {\n a.classList.remove('active');\n a.removeAttribute('aria-current');\n });\n this._activeTabLink = tabLink;\n tabLink.classList.add('active');\n tabLink.setAttribute('aria-current', 'page');\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n this._activeTabLink = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === location.hash\n );\n // If no match is found, use the first link or any with class 'active' as the initial active tab.\n if (!this._activeTabLink) {\n let activeTabLink = this.el.querySelector('a.active');\n if (!activeTabLink) {\n activeTabLink = this._tabLinks[0];\n }\n this._activeTabLink = activeTabLink as HTMLAnchorElement;\n }\n this._setActiveTabLink(this._activeTabLink);\n\n this._index = Math.max(Array.from(this._tabLinks).indexOf(this._activeTabLink), 0);\n if (this._activeTabLink && this._activeTabLink.hash) {\n this._content = document.querySelector(this._activeTabLink.hash);\n if (this._content) this._content.classList.add('active');\n }\n }\n\n _setupSwipeableTabs() {\n // Change swipeable according to responsive threshold\n if (window.innerWidth > this.options.responsiveThreshold) this.options.swipeable = false;\n\n const tabsContent = [];\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash);\n currContent.classList.add('carousel-item');\n tabsContent.push(currContent);\n }\n });\n\n // Create Carousel-Wrapper around Tab-Contents\n const tabsWrapper = document.createElement('div');\n tabsWrapper.classList.add('tabs-content', 'carousel', 'flat');\n\n // Wrap around\n tabsContent[0].parentElement.insertBefore(tabsWrapper, tabsContent[0]);\n tabsContent.forEach((tabContent) => {\n tabsWrapper.appendChild(tabContent);\n tabContent.style.display = '';\n });\n\n this._tabsCarousel = Carousel.init(tabsWrapper, {\n fullWidth: true,\n noWrap: true,\n onCycleTo: (item) => {\n const prevIndex = this._index;\n this._index = Array.from(item.parentNode.children).indexOf(item);\n this._activeTabLink.classList.remove('active');\n this._activeTabLink = Array.from(this._tabLinks)[this._index];\n this._activeTabLink.classList.add('active');\n this._animateIndicator(prevIndex);\n if (typeof this.options.onShow === 'function')\n this.options.onShow.call(this, this._content);\n }\n });\n // Set initial carousel slide to active tab\n this._tabsCarousel.set(this._index);\n }\n\n _teardownSwipeableTabs() {\n const tabsWrapper = this._tabsCarousel.el;\n this._tabsCarousel.destroy();\n // Unwrap\n tabsWrapper.append(tabsWrapper.parentElement);\n tabsWrapper.remove();\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n if ((<HTMLAnchorElement>a).hash) {\n const currContent = document.querySelector((<HTMLAnchorElement>a).hash);\n if (currContent) (<HTMLElement>currContent).style.display = 'none';\n }\n });\n }\n\n _teardownNormalTabs() {\n // show Tabs Content\n this._tabLinks.forEach((a) => {\n if (a.hash) {\n const currContent = document.querySelector(a.hash) as HTMLElement;\n if (currContent) currContent.style.display = '';\n }\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el) {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el) {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex) {\n let leftDelay = 0,\n rightDelay = 0;\n\n const isMovingLeftOrStaying = this._index - prevIndex >= 0;\n if (isMovingLeftOrStaying) leftDelay = 90;\n else rightDelay = 90;\n\n // in v1: easeOutQuad\n this._indicator.style.transition = `\n left ${this.options.duration}ms ease-out ${leftDelay}ms,\n right ${this.options.duration}ms ease-out ${rightDelay}ms`;\n\n this._indicator.style.left = this._calcLeftPos(this._activeTabLink) + 'px';\n this._indicator.style.right = this._calcRightPos(this._activeTabLink) + 'px';\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(\n (a: HTMLAnchorElement) => a.getAttribute('href') === '#' + tabId\n );\n if (tab) (<HTMLAnchorElement>tab).click();\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, I18nOptions } from '../core/component';\nimport { DockedDisplayPlugin } from '../plugins/dockedDisplayPlugin';\n\nexport type Views = 'hours' | 'minutes';\n\nexport interface TimepickerOptions extends BaseOptions {\n /**\n * Dial radius.\n * @default 135\n */\n dialRadius: number;\n /**\n * Outer radius.\n * @default 105\n */\n outerRadius: number;\n /**\n * Inner radius.\n * @default 70\n */\n innerRadius: number;\n /**\n * Tick radius.\n * @default 20\n */\n tickRadius: number;\n /**\n * Duration of the transition from/to the hours/minutes view.\n * @default 350\n */\n duration: number;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the time picker in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the Timepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit timepicker selection to input field\n * @default true\n */\n autoSubmit: true;\n /**\n * Default time to set on the timepicker 'now' or '13:14'.\n * @default 'now';\n */\n defaultTime: string;\n /**\n * Millisecond offset from the defaultTime.\n * @default 0\n */\n fromNow: number;\n /**\n * Internationalization options.\n */\n i18n: Partial<I18nOptions>;\n /**\n * Use 12 hour AM/PM clock instead of 24 hour clock.\n * @default true\n */\n twelveHour: boolean;\n /**\n * Vibrate device when dragging clock hand.\n * @default true\n */\n vibrate: boolean;\n /**\n * Callback function when a time is selected.\n * @default null\n */\n onSelect: (hour: number, minute: number) => void;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for done.\n * @default null\n */\n onDone: (() => void) | null;\n /**\n * Callback function for cancel.\n * @default null\n */\n onCancel: (() => void) | null;\n /**\n * Display plugin\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: TimepickerOptions = {\n dialRadius: 135,\n outerRadius: 105,\n innerRadius: 70,\n tickRadius: 20,\n duration: 350,\n container: null,\n defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n fromNow: 0, // Millisecond offset from the defaultTime\n showClearBtn: false,\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok'\n },\n twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n vibrate: true, // vibrate the device when dragging clock hand\n // Callbacks\n onSelect: null,\n onInputInteraction: null,\n onDone: null,\n onCancel: null,\n displayPlugin: null,\n displayPluginOptions: null,\n};\n\nexport class Timepicker extends Component<TimepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n containerEl: HTMLElement;\n plate: HTMLElement;\n digitalClock: HTMLElement;\n inputHours: HTMLInputElement;\n inputMinutes: HTMLInputElement;\n x0: number;\n y0: number;\n moved: boolean;\n /** Which pointer is dragging the clock hand; a second finger is ignored. */\n private _dragPointerId: number | null = null;\n dx: number;\n dy: number;\n /**\n * Current view on the timepicker.\n * @default 'hours'\n */\n currentView: Views;\n hand: SVGElement;\n minutesView: HTMLElement;\n hours: number;\n minutes: number;\n /** The selected time. */\n time: string;\n /**\n * If the time is AM or PM on twelve-hour clock.\n * @default 'PM'\n */\n amOrPm: 'AM' | 'PM';\n static _template;\n /** Whether this device exposes the Vibration API at all. */\n canVibrate: boolean;\n _canvas: HTMLElement;\n hoursView: HTMLElement;\n spanAmPm: HTMLSpanElement;\n footer: HTMLElement;\n private _amBtn: HTMLElement;\n private _pmBtn: HTMLElement;\n bg: Element;\n bearing: Element;\n g: Element;\n toggleViewTimer: ReturnType<typeof setTimeout>;\n vibrateTimer: ReturnType<typeof setTimeout>;\n private displayPlugin: DockedDisplayPlugin;\n /** Whether the dial (ticks + SVG + AM/PM buttons) has been built yet. */\n private _clockBuilt = false;\n\n constructor(el: HTMLInputElement, options: Partial<TimepickerOptions>) {\n super(el, options, Timepicker);\n this.el['Expressive_Timepicker'] = this;\n this.options = {\n ...Timepicker.defaults,\n ...options\n };\n this.id = Utils.guid();\n this._insertHTMLIntoDOM();\n this._setupVariables();\n this._setupEventHandlers();\n // The dial is ~40 elements (12 or 24 hour ticks, 12 minute ticks, the SVG\n // hand and the AM/PM buttons) and is built by _ensureClockBuilt() rather\n // than here - see _pickerSetup for when that first happens.\n this._pickerSetup();\n\n if (this.options.displayPlugin) {\n if (this.options.displayPlugin === 'docked') this.displayPlugin = DockedDisplayPlugin.init(this.el, this.containerEl, this.options.displayPluginOptions);\n }\n }\n\n static get defaults(): TimepickerOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Timepicker.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<TimepickerOptions>): Timepicker;\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<TimepickerOptions>\n ): Timepicker[];\n /**\n * Initializes instances of Timepicker.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<TimepickerOptions> = {}\n ): Timepicker | Timepicker[] {\n return super.init(els, options, Timepicker);\n }\n\n static _addLeadingZero(num: number) {\n return (num < 10 ? '0' : '') + num;\n }\n\n static _createSVGEl(name: string) {\n const svgNS = 'http://www.w3.org/2000/svg';\n return document.createElementNS(svgNS, name);\n }\n\n static getInstance(el: HTMLElement): Timepicker {\n return el['Expressive_Timepicker'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.el['Expressive_Timepicker'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleInputClick);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.plate.addEventListener('pointerdown', this._handleClockClickStart);\n this.digitalClock.addEventListener('keyup', this._inputFromTextField);\n this.inputHours.addEventListener('focus', () => this.showView('hours'));\n this.inputHours.addEventListener('focusout', () => this.formatHours());\n this.inputMinutes.addEventListener('focus', () => this.showView('minutes'));\n this.inputMinutes.addEventListener('focusout', () => this.formatMinutes());\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('click', this._handleInputClick);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n // Drag handlers live on the document while the clock hand is held; if the\n // component is destroyed mid-drag they would otherwise outlive it.\n document.removeEventListener('pointermove', this._handleDocumentClickMove);\n document.removeEventListener('pointerup', this._handleDocumentClickEnd);\n document.removeEventListener('pointercancel', this._handleDocumentClickCancel);\n }\n\n _handleInputClick = () => {\n // Before focus(): focusing inputHours fires the handler that calls\n // showView, and an already-focused input fires nothing at all.\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n e.preventDefault();\n this._ensureClockBuilt();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n if (this.displayPlugin) this.displayPlugin.show();\n }\n };\n\n _handleTimeInputEnterKey = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n e.preventDefault();\n this._inputFromTextField();\n }\n };\n\n _handleClockClickStart = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.preventDefault();\n this._ensureClockBuilt();\n const clockPlateBR = this.plate.getBoundingClientRect();\n const offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n this.x0 = offset.x + this.options.dialRadius;\n this.y0 = offset.y + this.options.dialRadius;\n this.moved = false;\n this._dragPointerId = e.pointerId;\n this.dx = e.clientX - this.x0;\n this.dy = e.clientY - this.y0;\n\n // Set clock hands\n this.setHand(this.dx, this.dy, false);\n // The hand follows the pointer anywhere on the page while it is held.\n // `pointercancel` ends the drag the same way `pointerup` does: without it\n // these document listeners outlived a cancelled touch, because the\n // `touchend` pair this replaced had no `touchcancel` companion.\n document.addEventListener('pointermove', this._handleDocumentClickMove);\n document.addEventListener('pointerup', this._handleDocumentClickEnd);\n document.addEventListener('pointercancel', this._handleDocumentClickCancel);\n };\n\n _handleDocumentClickMove = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n e.preventDefault();\n const x = e.clientX - this.x0;\n const y = e.clientY - this.y0;\n this.moved = true;\n this.setHand(x, y, false);\n };\n\n _handleDocumentClickEnd = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n this._dragPointerId = null;\n e.preventDefault();\n document.removeEventListener('pointerup', this._handleDocumentClickEnd);\n document.removeEventListener('pointercancel', this._handleDocumentClickCancel);\n const x = e.clientX - this.x0;\n const y = e.clientY - this.y0;\n if (this.moved && x === this.dx && y === this.dy) {\n this.setHand(x, y);\n }\n\n if (this.currentView === 'hours') {\n this.inputMinutes.focus();\n this.showView('minutes', this.options.duration / 2);\n } else {\n // this.minutesView.classList.add('timepicker-dial-out');\n setTimeout(() => {\n if (this.options.autoSubmit) this.done();\n }, this.options.duration / 2);\n }\n\n if (typeof this.options.onSelect === 'function') {\n this.options.onSelect.call(this, this.hours, this.minutes);\n }\n document.removeEventListener('pointermove', this._handleDocumentClickMove);\n };\n\n /**\n * A cancelled pointer is not a completed selection. The browser or the OS\n * took the gesture over, so this only lets go of the drag - it must not run\n * the pointer-up path, which advances hours to minutes, fires `onSelect`,\n * and under `autoSubmit` closes the picker on a time the user never chose.\n */\n _handleDocumentClickCancel = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n this._dragPointerId = null;\n this.moved = false;\n document.removeEventListener('pointermove', this._handleDocumentClickMove);\n document.removeEventListener('pointerup', this._handleDocumentClickEnd);\n document.removeEventListener('pointercancel', this._handleDocumentClickCancel);\n };\n\n _insertHTMLIntoDOM() {\n const template = document.createElement('template');\n template.innerHTML = Timepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n this.containerEl.id = 'container-' + this.id;\n\n // Append popover to input by default\n const optEl = this.options.container;\n const containerEl = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);\n\n if (this.options.container && !!containerEl) {\n containerEl.append(this.containerEl);\n } else {\n this.el.parentElement.appendChild(this.containerEl);\n }\n }\n\n _setupVariables() {\n this.currentView = 'hours';\n // `navigator.webkitVibrate` never shipped in any browser - the probe it\n // came from was folklore. A plain feature check is the whole of it.\n this.canVibrate = typeof navigator.vibrate === 'function';\n this._canvas = this.containerEl.querySelector('.timepicker-canvas');\n this.plate = this.containerEl.querySelector('.timepicker-plate');\n this.digitalClock = this.containerEl.querySelector('.timepicker-display-column');\n this.hoursView = this.containerEl.querySelector('.timepicker-hours');\n this.minutesView = this.containerEl.querySelector('.timepicker-minutes');\n this.inputHours = this.containerEl.querySelector('.timepicker-input-hours');\n this.inputMinutes = this.containerEl.querySelector('.timepicker-input-minutes');\n this.spanAmPm = this.containerEl.querySelector('.timepicker-span-am-pm');\n this.footer = this.containerEl.querySelector('.timepicker-footer');\n this.amOrPm = 'PM';\n }\n\n _pickerSetup() {\n Utils.createButton(\n this.footer,\n this.options.i18n.clear,\n ['timepicker-clear'],\n this.options.showClearBtn,\n this.clear\n );\n\n if (!this.options.autoSubmit) {\n Utils.createConfirmationContainer(\n this.footer,\n this.options.i18n.done,\n this.options.i18n.cancel,\n this.confirm,\n this.cancel\n );\n }\n\n this._updateTimeFromInput();\n\n // With a docked display the container is `visibility: hidden` until\n // show(), so the dial can wait for the first interaction. Without one it\n // is on screen from the moment it is inserted and has to be ready now.\n if (!this.options.displayPlugin) this.showView('hours');\n }\n\n /**\n * Build the dial, once. Cheap to call repeatedly - every entry point that\n * touches the clock calls it first, so the picker cannot be interacted with\n * before it exists.\n */\n private _ensureClockBuilt() {\n if (this._clockBuilt) return;\n this._clockBuilt = true;\n this._clockSetup();\n // Applies the AM/PM state _updateTimeFromInput worked out before the\n // buttons existed.\n this._updateAmPmView();\n }\n\n _clockSetup() {\n if (this.options.twelveHour) {\n // AM Button\n this._amBtn = document.createElement('div');\n this._amBtn.classList.add('am-btn');\n this._amBtn.innerText = 'AM';\n this._amBtn.tabIndex = 0;\n this._amBtn.addEventListener('click', this._handleAmPmClick);\n this._amBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._amBtn);\n // PM Button\n this._pmBtn = document.createElement('div');\n this._pmBtn.classList.add('pm-btn');\n this._pmBtn.innerText = 'PM';\n this._pmBtn.tabIndex = 0;\n this._pmBtn.addEventListener('click', this._handleAmPmClick);\n this._pmBtn.addEventListener('keypress', this._handleAmPmKeypress);\n this.spanAmPm.appendChild(this._pmBtn);\n }\n this._buildHoursView();\n this._buildMinutesView();\n this._buildSVGClock();\n }\n\n _buildSVGClock() {\n // Draw clock hands and others\n const dialRadius = this.options.dialRadius;\n const tickRadius = this.options.tickRadius;\n const diameter = dialRadius * 2;\n const svg = Timepicker._createSVGEl('svg');\n svg.setAttribute('class', 'timepicker-svg');\n svg.setAttribute('width', diameter.toString());\n svg.setAttribute('height', diameter.toString());\n const g = Timepicker._createSVGEl('g');\n g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')');\n const bearing = Timepicker._createSVGEl('circle');\n bearing.setAttribute('class', 'timepicker-canvas-bearing');\n bearing.setAttribute('cx', '0');\n bearing.setAttribute('cy', '0');\n bearing.setAttribute('r', '4');\n const hand = Timepicker._createSVGEl('line');\n hand.setAttribute('x1', '0');\n hand.setAttribute('y1', '0');\n const bg = Timepicker._createSVGEl('circle');\n bg.setAttribute('class', 'timepicker-canvas-bg');\n bg.setAttribute('r', tickRadius.toString());\n g.appendChild(hand);\n g.appendChild(bg);\n g.appendChild(bearing);\n svg.appendChild(g);\n this._canvas.appendChild(svg);\n this.hand = hand;\n this.bg = bg;\n this.bearing = bearing;\n this.g = g;\n }\n\n _buildHoursView() {\n // Hours view\n if (this.options.twelveHour) {\n for (let i = 1; i < 13; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const radius = this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n } else {\n for (let i = 0; i < 24; i += 1) {\n // const tick = <HTMLElement>$tick.cloneNode(true);\n const radian = (i / 6) * Math.PI;\n const inner = i > 0 && i < 13;\n const radius = inner ? this.options.innerRadius : this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n }\n }\n\n _buildHoursTick(i: number, radian: number, radius: number) {\n const tick = document.createElement('div');\n tick.classList.add('timepicker-tick');\n tick.style.left =\n this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px';\n tick.style.top =\n this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px';\n tick.textContent = i === 0 ? '00' : i.toString();\n this.hoursView.appendChild(tick);\n }\n\n _buildMinutesView() {\n const _tick = document.createElement('div');\n _tick.classList.add('timepicker-tick');\n // Minutes view\n for (let i = 0; i < 60; i += 5) {\n const tick = <HTMLElement>_tick.cloneNode(true);\n const radian = (i / 30) * Math.PI;\n tick.style.left =\n this.options.dialRadius +\n Math.sin(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.style.top =\n this.options.dialRadius -\n Math.cos(radian) * this.options.outerRadius -\n this.options.tickRadius +\n 'px';\n tick.textContent = Timepicker._addLeadingZero(i);\n this.minutesView.appendChild(tick);\n }\n }\n\n _handleAmPmClick = (e: MouseEvent) => {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n };\n\n _handleAmPmKeypress = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ENTER) {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n }\n };\n\n _handleAmPmInteraction = (e: HTMLElement) => {\n this.amOrPm = e.classList.contains('am-btn') ? 'AM' : 'PM';\n this._updateAmPmView();\n }\n\n _updateAmPmView() {\n // _updateTimeFromInput settles amOrPm before the dial is built; the\n // buttons pick the state up in _ensureClockBuilt.\n if (!this._amBtn || !this._pmBtn) return;\n if (this.options.twelveHour) {\n if (this.amOrPm === 'PM') {\n this._amBtn.classList.remove('filled');\n this._pmBtn.classList.add('filled');\n } else if (this.amOrPm === 'AM') {\n this._amBtn.classList.add('filled');\n this._pmBtn.classList.remove('filled');\n }\n }\n }\n\n _updateTimeFromInput() {\n // Get the time\n let value = ((this.el.value || this.options.defaultTime || '') + '').split(':');\n if (this.options.twelveHour && !(typeof value[1] === 'undefined')) {\n if (value[1].toUpperCase().indexOf('AM') > 0) {\n this.amOrPm = 'AM';\n } else {\n this.amOrPm = 'PM';\n }\n value[1] = value[1].replace('AM', '').replace('PM', '');\n }\n if (value[0] === 'now') {\n const now = new Date(+new Date() + this.options.fromNow);\n value = [now.getHours().toString(), now.getMinutes().toString()];\n if (this.options.twelveHour) {\n this.amOrPm = parseInt(value[0]) >= 12 && parseInt(value[0]) < 24 ? 'PM' : 'AM';\n }\n }\n this.hours = +value[0] || 0;\n this.minutes = +value[1] || 0;\n this.inputHours.value = Timepicker._addLeadingZero(this.hours);\n this.inputMinutes.value = Timepicker._addLeadingZero(this.minutes);\n\n this._updateAmPmView();\n }\n\n /**\n * Show hours or minutes view on timepicker.\n * @param view The name of the view you want to switch to, 'hours' or 'minutes'.\n * @param delay\n */\n showView = (view: Views, delay: number = null) => {\n this._ensureClockBuilt();\n const isHours = view === 'hours',\n nextView = isHours ? this.hoursView : this.minutesView,\n hideView = isHours ? this.minutesView : this.hoursView;\n this.currentView = view;\n\n /*if (isHours) {\n this.inputHours.classList.add('text-primary');\n this.inputMinutes.classList.remove('text-primary');\n } else {\n this.inputHours.classList.remove('text-primary');\n this.inputMinutes.classList.add('text-primary');\n }*/\n\n // Transition view\n hideView.classList.add('timepicker-dial-out');\n\n nextView.style.visibility = 'visible';\n nextView.classList.remove('timepicker-dial-out');\n\n // Reset clock hand\n this.resetClock(delay);\n // After transitions ended\n clearTimeout(this.toggleViewTimer);\n this.toggleViewTimer = setTimeout(() => {\n hideView.style.visibility = 'hidden';\n }, this.options.duration);\n };\n\n resetClock(delay) {\n const view = this.currentView,\n value = this[view],\n isHours = view === 'hours',\n unit = Math.PI / (isHours ? 6 : 30),\n radian = value * unit,\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n x = Math.sin(radian) * radius,\n y = -Math.cos(radian) * radius;\n\n if (delay) {\n this._canvas?.classList.add('timepicker-canvas-out');\n setTimeout(() => {\n this._canvas?.classList.remove('timepicker-canvas-out');\n this.setHand(x, y);\n }, delay);\n } else {\n this.setHand(x, y);\n }\n }\n\n _inputFromTextField = () => {\n const isHours = this.currentView === 'hours';\n if (isHours && this.inputHours.value !== '') {\n const value = parseInt(this.inputHours.value);\n if (value > 0 && value < (this.options.twelveHour ? 13 : 24)) {\n this.hours = value;\n } else {\n this.setHoursDefault();\n }\n this.drawClockFromTimeInput(this.hours, isHours);\n } else if (!isHours && this.inputMinutes.value !== '') {\n const value = parseInt(this.inputMinutes.value);\n if (value >= 0 && value < 60) {\n this.minutes = value;\n } else {\n this.minutes = new Date().getMinutes();\n this.inputMinutes.value = this.minutes.toString();\n }\n this.drawClockFromTimeInput(this.minutes, isHours);\n }\n };\n\n drawClockFromTimeInput(value, isHours) {\n const unit = Math.PI / (isHours ? 6 : 30);\n const radian = value * unit;\n let radius;\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n } else {\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius;\n }\n this.setClockAttributes(radian, radius);\n }\n\n setHand(x, y, roundBy5: boolean = false) {\n const isHours = this.currentView === 'hours',\n unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n z = Math.sqrt(x * x + y * y),\n inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2;\n let radian = Math.atan2(x, -y),\n radius = inner ? this.options.innerRadius : this.options.outerRadius;\n\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n }\n\n // Radian should in range [0, 2PI]\n if (radian < 0) {\n radian = Math.PI * 2 + radian;\n }\n\n // Get the round value\n let value = Math.round(radian / unit);\n\n // Get the round radian\n radian = value * unit;\n\n // Correct the hours or minutes\n if (this.options.twelveHour) {\n if (isHours) {\n if (value === 0) value = 12;\n } else {\n if (roundBy5) value *= 5;\n if (value === 60) value = 0;\n }\n } else {\n if (isHours) {\n if (value === 12) {\n value = 0;\n }\n value = inner ? (value === 0 ? 12 : value) : value === 0 ? 0 : value + 12;\n } else {\n if (roundBy5) {\n value *= 5;\n }\n if (value === 60) {\n value = 0;\n }\n }\n }\n\n // Once hours or minutes changed, vibrate the device\n if (this[this.currentView] !== value) {\n if (this.canVibrate && this.options.vibrate) {\n // Do not vibrate too frequently\n if (!this.vibrateTimer) {\n navigator.vibrate(10);\n this.vibrateTimer = setTimeout(() => {\n this.vibrateTimer = null;\n }, 100);\n }\n }\n }\n\n this[this.currentView] = value;\n if (isHours) {\n this.inputHours.value = Timepicker._addLeadingZero(value);\n } else {\n this.inputMinutes.value = Timepicker._addLeadingZero(value);\n }\n\n // Set clock hand and others' position\n this.setClockAttributes(radian, radius);\n }\n\n setClockAttributes(radian: number, radius: number) {\n // Nothing to point at until the SVG exists.\n if (!this.hand || !this.bg) return;\n const cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n cx2 = Math.sin(radian) * radius,\n cy2 = -Math.cos(radian) * radius;\n this.hand.setAttribute('x2', cx1.toString());\n this.hand.setAttribute('y2', cy1.toString());\n this.bg.setAttribute('cx', cx2.toString());\n this.bg.setAttribute('cy', cy2.toString());\n }\n\n formatHours() {\n if (this.inputHours.value == '') this.setHoursDefault();\n this.inputHours.value = Timepicker._addLeadingZero(Number(this.inputHours.value));\n }\n\n formatMinutes() {\n if (this.inputMinutes.value == '') this.minutes = new Date().getMinutes();\n this.inputMinutes.value = Timepicker._addLeadingZero(Number(this.inputMinutes.value));\n }\n\n setHoursDefault() {\n this.hours = new Date().getHours();\n this.inputHours.value = (this.hours % (this.options.twelveHour ? 12 : 24)).toString();\n }\n\n done = (clearValue = null) => {\n // Set input value\n const last = this.el.value;\n let value = clearValue\n ? ''\n : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes);\n this.time = value;\n if (!clearValue && this.options.twelveHour) {\n value = `${value} ${this.amOrPm}`;\n }\n this.el.value = value;\n // Trigger change event\n if (value !== last) {\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n };\n\n confirm = () => {\n this.done();\n if (typeof this.options.onDone === 'function') this.options.onDone.call(this);\n }\n\n cancel = () => {\n // not logical clearing the input field on cancel, since the end user might want to make use of the previously submitted value\n // this.clear();\n if (typeof this.options.onCancel === 'function') this.options.onCancel.call(this);\n }\n\n clear = () => {\n this.done(true);\n };\n\n static {\n Timepicker._template = `<div class=\"timepicker-container\">\n <div class=\"timepicker-digital-display\">\n <div class=\"timepicker-text-container\">\n <div class=\"timepicker-display-column timepicker-display-digital-clock\">\n <div class=\"timepicker-input-hours-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-hours text-primary\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-minutes-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-minutes\" />\n </div>\n </div>\n <div class=\"timepicker-display-column timepicker-display-am-pm\">\n <div class=\"timepicker-span-am-pm\"></div>\n </div>\n </div>\n </div>\n <div class=\"timepicker-analog-display\">\n <div class=\"timepicker-plate\">\n <div class=\"timepicker-canvas\"></div>\n <div class=\"timepicker-dial timepicker-hours\"></div>\n <div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>\n </div>\n <div class=\"timepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n", "import { BaseOptions } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface SnackbarOptions extends BaseOptions {\n /**\n * The content of the Snackbar.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The snackbar still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * @default false\n */\n dismissible: boolean;\n /**\n * Element id of a `<template>` (or another element) used as the snackbar body.\n * @default \"\"\n */\n snackbarId?: string;\n /**\n * Length in ms the Snackbar stays before dismissal.\n * `Infinity` keeps it on screen until the user acts.\n * When `action` is set and this is omitted, the default is 10000.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the snackbar element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when the snackbar is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the snackbar's width it takes for a drag\n * to dismiss a Snackbar.\n * @default 0.8\n */\n activationPercent: number;\n /**\n * Any element in the tree the snackbar should render into. A Snackbar has no\n * originating element to infer this from, so pass one when the page lives in\n * a shadow root \u2014 the container is appended to that root instead of to\n * `document.body`, where a root-scoped stylesheet could not reach it.\n * @default null\n */\n root: HTMLElement;\n}\n\nconst _defaults: SnackbarOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8,\n root: null\n};\n\nexport class Snackbar {\n /** The snackbar element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the snackbar\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Snackbar.\n */\n panning: boolean;\n options: SnackbarOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the snackbar is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n private _dismissed = false;\n\n static _snackbars: Snackbar[];\n static _container: HTMLElement;\n static _draggedSnackbar: Snackbar;\n /** Which pointer owns the drag in flight; a second finger is ignored. */\n static _dragPointerId: number | null = null;\n\n constructor(options: Partial<SnackbarOptions> = {}) {\n this.options = {\n ...Snackbar.defaults,\n ...options\n };\n // With an action, stay long enough to tap it. Pass Infinity to remain\n // until the user acts; pass an explicit displayLength to override.\n if (options.displayLength === undefined && this.options.action) {\n this.options.displayLength = 10000;\n }\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n // One snackbar at a time so a new update does not stack over the page.\n if (Snackbar._snackbars.length > 0) {\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar._dismissed = true;\n clearTimeout(snackbar.counterTimeout);\n snackbar.el.remove();\n }\n Snackbar._snackbars.length = 0;\n }\n // One container serves every snackbar, and only one snackbar shows at a\n // time \u2014 so it is moved rather than duplicated when the root changes.\n const root = Utils.portalRoot(this.options.root ?? document.body);\n if (\n !Snackbar._container ||\n !Snackbar._container.isConnected ||\n Snackbar._container.parentNode !== root\n ) {\n if (Snackbar._container) Snackbar._removeContainer();\n Snackbar._createContainer(root);\n }\n Snackbar._snackbars.push(this);\n const snackbarElement = this._createSnackbar();\n snackbarElement['Expressive_Snackbar'] = this;\n this.el = snackbarElement;\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): SnackbarOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Snackbar {\n return el['Expressive_Snackbar'];\n }\n\n static _createContainer(root: HTMLElement | ShadowRoot = document.body) {\n const container = document.createElement('div');\n container.setAttribute('id', 'snackbar-container');\n // One listener per stage. These used to be a touch trio on the container\n // plus a mouse trio split across the container and the document, with a\n // helper picking `targetTouches[0].clientX` or `clientX` apart afterwards.\n // Move and up stay on the document so a drag that leaves the container\n // still completes.\n container.addEventListener('pointerdown', Snackbar._onDragStart);\n document.addEventListener('pointermove', Snackbar._onDragMove);\n document.addEventListener('pointerup', Snackbar._onDragEnd);\n document.addEventListener('pointercancel', Snackbar._onDragCancel);\n root.appendChild(container);\n Snackbar._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('pointermove', Snackbar._onDragMove);\n document.removeEventListener('pointerup', Snackbar._onDragEnd);\n document.removeEventListener('pointercancel', Snackbar._onDragCancel);\n Snackbar._container.remove();\n Snackbar._container = null;\n }\n\n static _onDragStart(e: PointerEvent) {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.snackbar')) {\n const snackbarElem = target.closest('.snackbar') as HTMLElement;\n const snackbar: Snackbar = snackbarElem['Expressive_Snackbar'];\n if (!snackbar) return;\n snackbar.panning = true;\n snackbar._pauseTimer();\n Snackbar._draggedSnackbar = snackbar;\n snackbar.el.classList.add('panning');\n snackbar.el.style.transition = '';\n Snackbar._dragPointerId = e.pointerId;\n snackbar.startingXPos = e.clientX;\n snackbar.time = Date.now();\n snackbar.xPos = e.clientX;\n }\n }\n\n static _onDragMove(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n if (!!Snackbar._draggedSnackbar) {\n e.preventDefault();\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.deltaX = Math.abs(snackbar.xPos - e.clientX);\n snackbar.xPos = e.clientX;\n snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);\n snackbar.time = Date.now();\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;\n snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n if (!!Snackbar._draggedSnackbar) {\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || snackbar.velocityX > 1;\n\n // Remove snackbar\n if (shouldBeDismissed) {\n snackbar.wasSwiped = true;\n snackbar.dismiss();\n // Animate snackbar back to original position\n } else {\n snackbar.el.style.transition = 'transform .2s, opacity .2s';\n snackbar.el.style.transform = '';\n snackbar.el.style.opacity = '';\n snackbar._resumeTimer();\n }\n Snackbar._draggedSnackbar = null;\n }\n }\n\n /**\n * A cancelled pointer is not a short swipe. Snap back and resume the timer\n * without consulting the distance travelled - the browser took the gesture\n * over, so the movement so far says nothing about what the user wanted.\n */\n static _onDragCancel(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n const snackbar = Snackbar._draggedSnackbar;\n if (!snackbar) return;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n snackbar.el.style.transition = 'transform .2s, opacity .2s';\n snackbar.el.style.transform = '';\n snackbar.el.style.opacity = '';\n snackbar._resumeTimer();\n Snackbar._draggedSnackbar = null;\n }\n\n /**\n * dismiss all snackbars.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const snackbar of [...Snackbar._snackbars]) {\n snackbar.dismiss();\n }\n }\n\n _createSnackbar() {\n let snackbar: HTMLElement = this.options.snackbarId\n ? Utils.getElementById(this.options.root ?? document.body, this.options.snackbarId)\n : document.createElement('div');\n if (snackbar instanceof HTMLTemplateElement) {\n const node = (snackbar as HTMLTemplateElement).content.cloneNode(true);\n snackbar = (node as HTMLElement).firstElementChild as HTMLElement;\n }\n snackbar.classList.add('snackbar');\n snackbar.setAttribute('role', 'status');\n snackbar.setAttribute('aria-live', 'polite');\n snackbar.setAttribute('aria-atomic', 'true');\n // Add custom classes onto snackbar\n if (this.options.classes.length > 0) {\n snackbar.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n snackbar.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (typeof this.options.onAction === 'function') {\n this.options.onAction();\n }\n this.dismiss();\n });\n snackbar.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('i');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n });\n snackbar.appendChild(close);\n }\n Snackbar._container.appendChild(snackbar);\n return snackbar;\n }\n\n _animateIn() {\n this.el.style.display = '';\n this.el.style.opacity = '0';\n this.el.style.transform = 'translateY(24px)';\n this.el.style.transition = `\n transform ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per snackbar purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this.counterTimeout != null) return;\n this._setTimer();\n }\n\n /**\n * Dismiss snackbar with animation.\n */\n dismiss() {\n if (this._dismissed) return;\n this._dismissed = true;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n const activationDistance = this.el.offsetWidth * this.options.activationPercent;\n\n if (this.wasSwiped) {\n this.el.style.transition = 'transform .05s, opacity .05s';\n this.el.style.transform = `translateX(${activationDistance}px)`;\n this.el.style.opacity = '0';\n }\n\n // easeOutExpo\n this.el.style.transition = `\n margin ${this.options.outDuration}ms ease,\n opacity ${this.options.outDuration}ms ease`;\n\n setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n setTimeout(() => {\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n // Remove snackbar from DOM\n if (this.el.id != this.options.snackbarId) {\n this.el.remove();\n // Guarded: splice(-1, 1) on an already-removed snackbar would drop an\n // unrelated one off the end of the list.\n const index = Snackbar._snackbars.indexOf(this);\n if (index >= 0) Snackbar._snackbars.splice(index, 1);\n if (\n Snackbar._snackbars.length === 0 &&\n Snackbar._container &&\n Snackbar._container.childElementCount === 0\n ) {\n Snackbar._removeContainer();\n }\n }\n }, this.options.outDuration);\n }\n\n static {\n Snackbar._snackbars = [];\n Snackbar._container = null;\n Snackbar._draggedSnackbar = null;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface TooltipOptions extends BaseOptions {\n /**\n * Delay time before tooltip disappears.\n * @default 200\n */\n exitDelay: number;\n /**\n * Delay time before tooltip appears.\n * @default 0\n */\n enterDelay: number;\n /**\n * Element Id for the tooltip.\n * @default \"\"\n */\n tooltipId?: string;\n /**\n * Text string for the tooltip.\n * @default \"\"\n */\n text: string;\n /**\n * Set distance tooltip appears away from its activator\n * excluding transitionMovement.\n * @default 4\n */\n margin: number;\n /**\n * Enter transition duration.\n * @default 300\n */\n inDuration: number;\n /**\n * Opacity of the tooltip.\n * @default 1\n */\n opacity: number;\n /**\n * Exit transition duration.\n * @default 250\n */\n outDuration: number;\n /**\n * Set the direction of the tooltip.\n * @default 'bottom'\n */\n position: TooltipPosition;\n /**\n * Amount in px that the tooltip moves during its transition.\n * @default 10\n */\n transitionMovement: number;\n}\n\nconst _defaults: TooltipOptions = {\n exitDelay: 200,\n enterDelay: 0,\n text: '',\n margin: 4,\n inDuration: 250,\n outDuration: 200,\n position: 'bottom' as TooltipPosition,\n transitionMovement: 10,\n opacity: 1\n};\n\nexport class Tooltip extends Component<TooltipOptions> {\n /**\n * If tooltip is open.\n */\n isOpen: boolean;\n /**\n * If tooltip is hovered.\n */\n isHovered: boolean;\n /**\n * If tooltip is focused.\n */\n isFocused: boolean;\n tooltipEl: HTMLElement;\n private _exitDelayTimeout: ReturnType<typeof setTimeout>;\n private _enterDelayTimeout: ReturnType<typeof setTimeout>;\n xMovement: number;\n yMovement: number;\n\n constructor(el: HTMLElement, options: Partial<TooltipOptions>) {\n super(el, options, Tooltip);\n this.el['Expressive_Tooltip'] = this;\n\n this.options = {\n ...Tooltip.defaults,\n ...this._getAttributeOptions(),\n ...options\n };\n\n this.isOpen = false;\n this.isHovered = false;\n this.isFocused = false;\n this._appendTooltipEl();\n this._setupEventHandlers();\n }\n\n static get defaults(): TooltipOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Tooltip.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<TooltipOptions>): Tooltip;\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<TooltipOptions>): Tooltip[];\n /**\n * Initializes instances of Tooltip.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TooltipOptions> = {}\n ): Tooltip | Tooltip[] {\n return super.init(els, options, Tooltip);\n }\n\n static getInstance(el: HTMLElement): Tooltip {\n return el['Expressive_Tooltip'];\n }\n\n destroy() {\n if (this.el.getAttribute('aria-describedby') === this.tooltipEl.id) {\n this.el.removeAttribute('aria-describedby');\n }\n this.tooltipEl.remove();\n this._removeEventHandlers();\n this.el['Expressive_Tooltip'] = undefined;\n }\n\n _appendTooltipEl() {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.classList.add('tooltip');\n this.tooltipEl.id = `tooltip-${Utils.guid()}`;\n this.tooltipEl.setAttribute('role', 'tooltip');\n this.el.setAttribute('aria-describedby', this.tooltipEl.id);\n\n const tooltipContentEl = this.options.tooltipId\n ? Utils.getElementById(this.el, this.options.tooltipId)\n : document.createElement('div');\n if (this.options.tooltipId) {\n this.tooltipEl.classList.add('rich');\n }\n tooltipContentEl.style.display = '';\n tooltipContentEl.classList.add('tooltip-content');\n this._setTooltipContent(tooltipContentEl);\n this.tooltipEl.appendChild(tooltipContentEl);\n Utils.portalRoot(this.el).appendChild(this.tooltipEl);\n }\n\n _setTooltipContent(tooltipContentEl: HTMLElement) {\n if (this.options.tooltipId) return;\n tooltipContentEl.innerText = this.options.text;\n }\n\n _updateTooltipContent() {\n this._setTooltipContent(this.tooltipEl.querySelector('.tooltip-content'));\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('mouseenter', this._handleMouseEnter);\n this.el.addEventListener('mouseleave', this._handleMouseLeave);\n this.el.addEventListener('focus', this._handleFocus, true);\n this.el.addEventListener('blur', this._handleBlur, true);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('mouseenter', this._handleMouseEnter);\n this.el.removeEventListener('mouseleave', this._handleMouseLeave);\n this.el.removeEventListener('focus', this._handleFocus, true);\n this.el.removeEventListener('blur', this._handleBlur, true);\n }\n\n /**\n * Show tooltip.\n */\n open = (isManual: boolean) => {\n if (this.isOpen) return;\n isManual = isManual === undefined ? true : undefined; // Default value true\n this.isOpen = true;\n // Update tooltip content with HTML attribute options\n this.options = { ...this.options, ...this._getAttributeOptions() };\n this._updateTooltipContent();\n this._setEnterDelayTimeout(isManual);\n };\n\n /**\n * Hide tooltip.\n */\n close = () => {\n if (!this.isOpen) return;\n this.isHovered = false;\n this.isFocused = false;\n this.isOpen = false;\n this._setExitDelayTimeout();\n };\n\n _setExitDelayTimeout() {\n clearTimeout(this._exitDelayTimeout);\n this._exitDelayTimeout = setTimeout(() => {\n if (this.isHovered || this.isFocused) return;\n this._animateOut();\n }, this.options.exitDelay);\n }\n\n _setEnterDelayTimeout(isManual) {\n clearTimeout(this._enterDelayTimeout);\n this._enterDelayTimeout = setTimeout(() => {\n if (!this.isHovered && !this.isFocused && !isManual) return;\n this._animateIn();\n }, this.options.enterDelay);\n }\n\n _positionTooltip() {\n const tooltip: HTMLElement = this.tooltipEl;\n const origin = this.el as HTMLElement,\n originHeight = origin.offsetHeight,\n originWidth = origin.offsetWidth,\n tooltipHeight = tooltip.offsetHeight,\n tooltipWidth = tooltip.offsetWidth,\n margin = this.options.margin;\n\n this.xMovement = 0;\n this.yMovement = 0;\n\n const originRect = origin.getBoundingClientRect();\n let targetTop = originRect.top + Utils.getDocumentScrollTop();\n let targetLeft = originRect.left + Utils.getDocumentScrollLeft();\n if (this.options.position === 'top') {\n targetTop += -tooltipHeight - margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = -this.options.transitionMovement;\n } else if (this.options.position === 'right') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += originWidth + margin;\n this.xMovement = this.options.transitionMovement;\n } else if (this.options.position === 'left') {\n targetTop += originHeight / 2 - tooltipHeight / 2;\n targetLeft += -tooltipWidth - margin;\n this.xMovement = -this.options.transitionMovement;\n } else {\n targetTop += originHeight + margin;\n targetLeft += originWidth / 2 - tooltipWidth / 2;\n this.yMovement = this.options.transitionMovement;\n }\n\n const newCoordinates = this._repositionWithinScreen(\n targetLeft,\n targetTop,\n tooltipWidth,\n tooltipHeight\n );\n\n tooltip.style.top = newCoordinates.y + 'px';\n tooltip.style.left = newCoordinates.x + 'px';\n }\n\n _repositionWithinScreen(x: number, y: number, width: number, height: number) {\n const scrollLeft = Utils.getDocumentScrollLeft();\n const scrollTop = Utils.getDocumentScrollTop();\n let newX = x - scrollLeft;\n let newY = y - scrollTop;\n\n const bounding = {\n left: newX,\n top: newY,\n width: width,\n height: height\n };\n const offset = this.options.margin + this.options.transitionMovement;\n const edges = Utils.checkWithinContainer(document.body, bounding, offset);\n\n if (edges.left) {\n newX = offset;\n } else if (edges.right) {\n newX -= newX + width - window.innerWidth;\n }\n if (edges.top) {\n newY = offset;\n } else if (edges.bottom) {\n newY -= newY + height - window.innerHeight;\n }\n return {\n x: newX + scrollLeft,\n y: newY + scrollTop\n };\n }\n\n _animateIn() {\n this._positionTooltip();\n this.tooltipEl.style.visibility = 'visible';\n const duration = this.options.inDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(${this.xMovement}px) translateY(${this.yMovement}px)`;\n this.tooltipEl.style.opacity = (this.options.opacity || 1).toString();\n }, 1);\n }\n\n _animateOut() {\n const duration = this.options.outDuration;\n // easeOutCubic\n this.tooltipEl.style.transition = `\n transform ${duration}ms ease-out,\n opacity ${duration}ms ease-out`;\n setTimeout(() => {\n this.tooltipEl.style.transform = `translateX(0px) translateY(0px)`;\n this.tooltipEl.style.opacity = '0';\n }, 1);\n /*\n anim.remove(this.tooltipEl);\n anim({\n targets: this.tooltipEl,\n opacity: 0,\n translateX: 0,\n translateY: 0,\n duration: this.options.outDuration,\n easing: 'easeOutCubic'\n });\n */\n }\n\n _handleMouseEnter = () => {\n this.isHovered = true;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.open(false);\n };\n\n _handleMouseLeave = () => {\n this.isHovered = false;\n this.isFocused = false; // Allows close of tooltip when opened by focus.\n this.close();\n };\n\n // Focus opens the tooltip only when it arrived by keyboard: a pointer press\n // on the trigger also focuses it, and _handleMouseEnter already covers that.\n _handleFocus = () => {\n if (this.el.matches(':focus-visible')) {\n this.isFocused = true;\n this.open(false);\n }\n };\n\n _handleBlur = () => {\n this.isFocused = false;\n this.close();\n };\n\n _getAttributeOptions(): Partial<TooltipOptions> {\n const attributeOptions: Partial<TooltipOptions> = {};\n const tooltipTextOption = this.el.getAttribute('data-tooltip');\n const tooltipId = this.el.getAttribute('data-tooltip-id');\n const positionOption = this.el.getAttribute('data-position');\n if (tooltipTextOption) {\n attributeOptions.text = tooltipTextOption;\n }\n if (positionOption) {\n attributeOptions.position = positionOption as TooltipPosition;\n }\n if (tooltipId) {\n attributeOptions.tooltipId = tooltipId;\n }\n\n return attributeOptions;\n }\n}\n", "import { InitElements, InitElement } from \"../core/component\";\nimport * as Components from \"./index\";\nimport { CARDS_SELECTOR } from \"./cards\";\nimport { EXPANDING_CARD_SELECTOR } from \"./expandingCard\";\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Snackbar,\n * CharacterCounter, Range, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n Autocomplete: {\n component: Components.Autocomplete,\n selector: \".autocomplete\",\n },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR },\n ExpandingCard: {\n component: Components.ExpandingCard,\n selector: EXPANDING_CARD_SELECTOR,\n },\n Carousel: { component: Components.Carousel, selector: \".carousel\" },\n Chips: { component: Components.Chips, selector: \".chips\" },\n Datepicker: {\n component: Components.Datepicker,\n selector: \".datepicker, .date-picker\",\n },\n Menu: { component: Components.Menu, selector: \".menu-trigger\" },\n Lightbox: { component: Components.Lightbox, selector: \".lightboxed\" },\n ScrollSpy: { component: Components.ScrollSpy, selector: \".scrollspy\" },\n FormSelect: { component: Components.FormSelect, selector: \"select\" },\n NavigationDrawer: {\n component: Components.NavigationDrawer,\n selector: \".sidenav, .navigation-drawer\",\n },\n NavigationRail: {\n component: Components.NavigationRail,\n selector: \".navigation-rail\",\n },\n Tabs: { component: Components.Tabs, selector: \".tabs\" },\n Timepicker: {\n component: Components.Timepicker,\n selector: \".timepicker, .time-picker\",\n },\n Tooltip: { component: Components.Tooltip, selector: \".tooltipped\" },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: \".fab, .fixed-action-btn, .fab-menu\",\n },\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<\n InstanceType<Registry[K][\"component\"]>[\"options\"]\n >;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n init(els: InitElements<InitElement>, options: Partial<object>): unknown;\n};\n\n/**\n * Automatically initialize components.\n * @param context Root element to initialize. Defaults to `document.body`.\n * @param options Options for each component.\n */\nexport function AutoInit(\n context: HTMLElement = document.body,\n options?: Partial<AutoInitOptions>,\n) {\n for (const name of Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[]) {\n const { component, selector } = AUTO_INIT_COMPONENTS[name];\n // `:is()` so that `:not(.no-autoinit)` applies to the whole selector. A\n // bare `${selector}:not(...)` binds the negation to the last alternative\n // only, which would silently break the opt-out for any comma-separated\n // entry (Cards is the first).\n const els = context.querySelectorAll(`:is(${selector}):not(.no-autoinit)`);\n // Each component's static `init` is overloaded; indexing the table widens\n // it to a union TypeScript cannot call, so narrow it once, here.\n (component as unknown as AutoInitable).init(els, options?.[name] ?? {});\n }\n}\n", "// Public entry point of the bundle.\n//\n// Layout:\n// core/ Component base class, Utils, shared types\n// components/ per-element widgets (+ index.ts barrel, registry.ts)\n// behaviors/ document-level enhancers, started below at import time\n// plugins/ helpers that are not Components\n//\n// See src/ts/README.md before adding anything.\n\nimport { Cards } from \"./components/cards\";\nimport { ExpandingCard } from \"./components/expandingCard\";\nimport { Chips } from \"./components/chips\";\nimport { Slider } from \"./components/slider\";\nimport { Dialogs } from \"./behaviors/dialogs\";\nimport { BottomSheets } from \"./behaviors/bottomSheets\";\nimport { SideSheets } from \"./behaviors/sideSheets\";\nimport { Forms } from \"./behaviors/forms\";\n\nexport * from \"./components\";\nexport { Dialogs } from \"./behaviors/dialogs\";\nexport { BottomSheets } from \"./behaviors/bottomSheets\";\nexport { SideSheets } from \"./behaviors/sideSheets\";\nexport { Forms } from \"./behaviors/forms\";\nexport { AutoInit } from \"./components/registry\";\nexport type { AutoInitOptions } from \"./components/registry\";\n\nexport const version = \"0.8.0\";\n\n// Side effects: importing the bundle wires up the document-level behaviors.\n// Order is preserved from the original bundle - do not reorder without checking\n// the event handlers.\n//\n// Four capture-phase document listeners used to be registered here as well, to\n// track whether focus arrived by keyboard and stamp a class on <body> for the\n// Sass to read. `:focus-visible` answers the same question natively, so they\n// are gone and every reader asks the browser instead.\n\nForms.Init();\nChips.Init();\nSlider.Init();\nCards.Init();\nExpandingCard.Init();\nDialogs.Init();\nBottomSheets.Init();\nSideSheets.Init();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "el", "_defaults", "_defaults", "value", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults"]
|
|
7
7
|
}
|