@expressivecss/expressive 0.4.0 → 0.6.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +4 -9
  3. package/dist/css/expressive.css +2617 -951
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/js/expressive.cjs +643 -804
  8. package/dist/js/expressive.cjs.map +4 -4
  9. package/dist/js/expressive.js +643 -804
  10. package/dist/js/expressive.js.map +4 -4
  11. package/dist/js/expressive.min.js +11 -11
  12. package/dist/js/expressive.min.js.map +4 -4
  13. package/dist/js/expressive.mjs +643 -804
  14. package/dist/js/expressive.mjs.map +4 -4
  15. package/dist/types/behaviors/bottomSheets.d.ts +18 -0
  16. package/dist/types/behaviors/sideSheets.d.ts +18 -0
  17. package/dist/types/components/autocomplete.d.ts +11 -11
  18. package/dist/types/components/index.d.ts +3 -5
  19. package/dist/types/components/{dropdown.d.ts → menu.d.ts} +38 -37
  20. package/dist/types/components/navigationRail.d.ts +53 -0
  21. package/dist/types/components/range.d.ts +3 -0
  22. package/dist/types/components/registry.d.ts +7 -15
  23. package/dist/types/components/select.d.ts +12 -12
  24. package/dist/types/components/{toasts.d.ts → snackbar.d.ts} +28 -25
  25. package/dist/types/index.d.ts +3 -1
  26. package/package.json +3 -2
  27. package/src/sass/README.md +13 -11
  28. package/src/sass/abstracts/_breakpoints.scss +14 -3
  29. package/src/sass/abstracts/_mixins.scss +3 -3
  30. package/src/sass/abstracts/_variables.scss +27 -2
  31. package/src/sass/base/_global.scss +1 -1
  32. package/src/sass/base/_grid.scss +66 -116
  33. package/src/sass/base/_index.scss +1 -1
  34. package/src/sass/components/_badges.scss +80 -60
  35. package/src/sass/components/_bottom-sheet.scss +137 -0
  36. package/src/sass/components/_cards.scss +4 -4
  37. package/src/sass/components/_chips.scss +6 -5
  38. package/src/sass/components/_dialog.scss +268 -0
  39. package/src/sass/components/_index.scss +9 -7
  40. package/src/sass/components/_list.scss +253 -0
  41. package/src/sass/components/_menu.scss +341 -0
  42. package/src/sass/components/_navbar.scss +65 -117
  43. package/src/sass/components/_navigation-bar.scss +165 -0
  44. package/src/sass/components/_navigation-rail.scss +308 -0
  45. package/src/sass/components/_page-footer.scss +7 -3
  46. package/src/sass/components/_panes.scss +294 -0
  47. package/src/sass/components/_side-sheet.scss +193 -0
  48. package/src/sass/components/_sidenav.scss +78 -49
  49. package/src/sass/components/{_toast.scss → _snackbar.scss} +35 -34
  50. package/src/sass/components/_tabs.scss +1 -27
  51. package/src/sass/components/_toolbar.scss +91 -25
  52. package/src/sass/components/_tooltip.scss +1 -1
  53. package/src/sass/components/forms/_fieldset.scss +1 -1
  54. package/src/sass/components/forms/_input-fields.scss +3 -3
  55. package/src/sass/components/forms/_range.scss +423 -98
  56. package/src/sass/components/forms/_select.scss +19 -17
  57. package/src/sass/tokens/_reference.scss +37 -13
  58. package/src/sass/tokens/_theme.scss +5 -13
  59. package/src/sass/utilities/_colors.scss +16 -74
  60. package/src/sass/utilities/_visibility.scss +8 -0
  61. package/dist/types/components/collapsible.d.ts +0 -79
  62. package/dist/types/components/pushpin.d.ts +0 -51
  63. package/dist/types/components/tapTarget.d.ts +0 -57
  64. package/src/sass/components/_collapsible.scss +0 -179
  65. package/src/sass/components/_collection.scss +0 -180
  66. package/src/sass/components/_dropdown.scss +0 -225
  67. package/src/sass/components/_modal.scss +0 -190
  68. package/src/sass/components/_pushpin.scss +0 -11
  69. package/src/sass/components/_tapTarget.scss +0 -187
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/ts/index.ts", "../../src/ts/core/utils.ts", "../../src/ts/core/component.ts", "../../src/ts/components/cards.ts", "../../src/ts/components/dropdown.ts", "../../src/ts/components/autocomplete.ts", "../../src/ts/components/chips.ts", "../../src/ts/components/range.ts", "../../src/ts/behaviors/dialogs.ts", "../../src/ts/behaviors/forms.ts", "../../src/ts/behaviors/waves.ts", "../../src/ts/components/buttons.ts", "../../src/ts/components/carousel.ts", "../../src/ts/components/characterCounter.ts", "../../src/ts/components/collapsible.ts", "../../src/ts/components/select.ts", "../../src/ts/plugins/dockedDisplayPlugin.ts", "../../src/ts/components/datepicker.ts", "../../src/ts/components/lightbox.ts", "../../src/ts/components/parallax.ts", "../../src/ts/components/pushpin.ts", "../../src/ts/components/scrollspy.ts", "../../src/ts/components/sidenav.ts", "../../src/ts/components/slider.ts", "../../src/ts/components/tabs.ts", "../../src/ts/components/tapTarget.ts", "../../src/ts/components/timepicker.ts", "../../src/ts/components/toasts.ts", "../../src/ts/components/tooltip.ts", "../../src/ts/components/registry.ts"],
4
- "sourcesContent": ["// 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 { Forms } from './behaviors/forms';\nimport { Waves } from './behaviors/waves';\n\nexport * from './components';\nexport { Dialogs } from './behaviors/dialogs';\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.4.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();\n", "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 DropdownOptions 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 dropdown el for keyboard.\n * @default true\n */\n autoFocus: boolean;\n /**\n * If true, constrainWidth to the size of the dropdown activator.\n * @default true\n */\n constrainWidth: boolean;\n /**\n * Provide an element that will be the bounding container of the dropdown.\n * @default null\n */\n container: Element;\n /**\n * If false, the dropdown will show below the trigger.\n * @default true\n */\n coverTrigger: boolean;\n /**\n * If true, close dropdown on item click.\n * @default true\n */\n closeOnClick: boolean;\n /**\n * If true, the dropdown 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 dropdown starts entering.\n * @default null\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown finishes entering.\n * @default null\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Function called when dropdown starts exiting.\n * @default null\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Function called when dropdown 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: DropdownOptions = {\n alignment: 'left',\n autoFocus: true,\n constrainWidth: true,\n container: null,\n coverTrigger: true,\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 Dropdown extends Component<DropdownOptions> implements Openable {\n static _dropdowns: Dropdown[] = [];\n /** ID of the dropdown element. */\n id: string;\n /** The DOM element of the dropdown. */\n dropdownEl: HTMLElement;\n /** If the dropdown is open. */\n isOpen: boolean;\n /** If the dropdown 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<DropdownOptions>) {\n super(el, options, Dropdown);\n this.el['Expressive_Dropdown'] = this;\n\n Dropdown._dropdowns.push(this);\n this.id = Utils.getIdFromTrigger(el);\n this.dropdownEl = document.getElementById(this.id);\n\n this.options = {\n ...Dropdown.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._moveDropdownToElement();\n this._makeDropdownFocusable();\n this._setupSubmenus();\n this._setupEventHandlers();\n }\n\n static get defaults(): DropdownOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Dropdown.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<DropdownOptions>): Dropdown;\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<DropdownOptions>): Dropdown[];\n /**\n * Initializes instances of Dropdown.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<DropdownOptions> = {}\n ): Dropdown | Dropdown[] {\n return super.init(els, options, Dropdown);\n }\n\n static getInstance(el: HTMLElement): Dropdown {\n return el['Expressive_Dropdown'];\n }\n\n destroy() {\n clearTimeout(this.filterTimeout);\n this._resetDropdownStyles();\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 = Dropdown._dropdowns.indexOf(this);\n if (index >= 0) Dropdown._dropdowns.splice(index, 1);\n this.el['Expressive_Dropdown'] = undefined;\n }\n\n _setupEventHandlers() {\n // Trigger keydown handler\n this.el.addEventListener('keydown', this._handleTriggerKeydown);\n // Item click handler\n this.dropdownEl?.addEventListener('click', this._handleDropdownClick);\n if (this.dropdownEl?.querySelector(':scope > li > menu')) {\n this.dropdownEl.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.dropdownEl.addEventListener('mouseleave', this._handleMouseLeave);\n // Click event handlers\n } else {\n this.el.addEventListener('click', this._handleClick);\n }\n }\n\n _removeEventHandlers() {\n // `dropdownEl` 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.dropdownEl?.removeEventListener('click', this._handleDropdownClick);\n this.dropdownEl?.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.dropdownEl?.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.dropdownEl?.addEventListener('keydown', this._handleDropdownKeydown);\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.dropdownEl?.removeEventListener('keydown', this._handleDropdownKeydown);\n window.removeEventListener('resize', this._handleWindowResize);\n }\n\n _handleClick = (e: MouseEvent) => {\n e.preventDefault();\n //this._moveDropdown((<HTMLElement>e.target).closest('li'));\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n };\n\n _handleMouseEnter = () => {\n //this._moveDropdown((<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 leaveToDropdownContent = !!(this.dropdownEl && toEl && this.dropdownEl.contains(toEl));\n let leaveToActiveDropdownTrigger = false;\n const closestTrigger = toEl.closest('.dropdown-trigger');\n if (closestTrigger && !!closestTrigger['Expressive_Dropdown'] && closestTrigger['Expressive_Dropdown'].isOpen) {\n leaveToActiveDropdownTrigger = true;\n }\n // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content\n if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) {\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.dropdownEl?.contains(target) && !this.isTouchMoving) {\n // isTouchMoving to check if scrolling on mobile.\n this.close();\n } else if (!this.dropdownEl?.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 dropdown\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 Dropdown\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.dropdownEl?.contains(target)) {\n this.isTouchMoving = true;\n }\n };\n\n _handleDropdownClick = (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.dropdownEl) return false;\n const li = target.closest('li');\n if (!li || !this.dropdownEl.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.dropdownEl?.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.dropdownEl?.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 const wasHidden = getComputedStyle(menu).display === 'none';\n if (wasHidden) menu.style.display = 'block';\n li.classList.remove('submenu-start');\n const rect = menu.getBoundingClientRect();\n if (rect.right > window.innerWidth - 8) li.classList.add('submenu-start');\n if (wasHidden) menu.style.display = '';\n }\n\n private _closeSubmenus() {\n this.dropdownEl?.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.dropdownEl?.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.dropdownEl?.contains(li)) return li;\n return null;\n }\n\n _handleDropdownKeydown = (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 dropdown 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.dropdownEl;\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.dropdownEl.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 dropdown on ESC\n else if (Utils.keys.ESC.includes(e.key) && this.isOpen) {\n e.preventDefault();\n const openSub = this.dropdownEl.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.dropdownEl;\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 dropdown 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 _resetDropdownStyles() {\n this.dropdownEl.style.display = '';\n this._resetDropdownPositioningStyles();\n this.dropdownEl.style.transform = '';\n this.dropdownEl.style.opacity = '';\n }\n\n _resetDropdownPositioningStyles() {\n this.dropdownEl.style.width = '';\n this.dropdownEl.style.height = '';\n this.dropdownEl.style.left = '';\n this.dropdownEl.style.top = '';\n this.dropdownEl.style.transformOrigin = '';\n }\n\n _moveDropdownToElement(containerEl: HTMLElement = null) {\n if (this.options.container) {\n this.options.container.append(this.dropdownEl);\n return;\n }\n if (containerEl) {\n if (!containerEl.contains(this.dropdownEl)) containerEl.append(this.dropdownEl);\n return;\n }\n this.el.after(this.dropdownEl);\n }\n\n _makeDropdownFocusable() {\n if (!this.dropdownEl) return;\n this.dropdownEl.popover = '';\n // Needed for arrow key navigation\n this.dropdownEl.tabIndex = 0;\n // Only set tabindex if it hasn't been set by user\n this.dropdownEl.querySelectorAll(':scope li, :scope > hr').forEach((el) => {\n if (el instanceof HTMLHRElement || el.classList.contains('divider')) {\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.dropdownEl.children.length &&\n this.options.autoFocus\n ) {\n (this.dropdownEl.children[this.focusedIndex] as HTMLElement).focus({\n preventScroll: true\n });\n this.dropdownEl.children[this.focusedIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n\n _getDropdownPosition(closestOverflowParent: HTMLElement) {\n // const offsetParentBRect = this.el.offsetParent.getBoundingClientRect();\n const triggerBRect = this.el.getBoundingClientRect();\n const dropdownBRect = this.dropdownEl.getBoundingClientRect();\n\n let idealHeight = dropdownBRect.height;\n let idealWidth = dropdownBRect.width;\n let idealXPos = triggerBRect.left - dropdownBRect.left;\n let idealYPos = triggerBRect.top - dropdownBRect.top;\n\n const dropdownBounds = {\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 dropdownBounds,\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 - dropdownBRect.height + (this.options.coverTrigger ? triggerBRect.height : 0);\n }\n if (horizontalAlignment === 'right') {\n idealXPos = idealXPos - dropdownBRect.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.dropdownEl.style.transition = 'none';\n // from\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n // easeOutQuad (opacity) & easeOutQuint\n this.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '1';\n this.dropdownEl.style.transform = 'scale(1, 1)';\n }, 1);\n setTimeout(() => {\n if (this.options.autoFocus) this.dropdownEl.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.dropdownEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;\n // to\n this.dropdownEl.style.opacity = '0';\n this.dropdownEl.style.transform = 'scale(0.3, 0.3)';\n setTimeout(() => {\n this._resetDropdownStyles();\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 _placeDropdown() {\n // Container here will be closest ancestor with overflow: hidden\n let closestOverflowParent: HTMLElement = this._getClosestAncestor(\n this.dropdownEl,\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.dropdownEl.offsetParent ? this.dropdownEl.offsetParent : this.dropdownEl.parentNode)\n );\n }\n\n if (getComputedStyle(closestOverflowParent).position === 'static')\n closestOverflowParent.style.position = 'relative';\n\n //this._moveDropdown(closestOverflowParent);\n\n // Set width before calculating positionInfo\n const idealWidth = this.options.constrainWidth\n ? this.el.getBoundingClientRect().width\n : this.dropdownEl.getBoundingClientRect().width;\n this.dropdownEl.style.width = idealWidth + 'px';\n\n const positionInfo = this._getDropdownPosition(closestOverflowParent);\n this.dropdownEl.style.left = positionInfo.x + 'px';\n this.dropdownEl.style.top = positionInfo.y + 'px';\n this.dropdownEl.style.height = positionInfo.height + 'px';\n this.dropdownEl.style.width = positionInfo.width + 'px';\n this.dropdownEl.style.transformOrigin = `${\n positionInfo.horizontalAlignment === 'left' ? '0' : '100%'\n } ${positionInfo.verticalAlignment === 'top' ? '0' : '100%'}`;\n }\n\n /**\n * Open dropdown.\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._resetDropdownStyles();\n this.dropdownEl.style.display = 'block';\n this._placeDropdown();\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 dropdown\n setTimeout(() => this._setupTemporaryEventHandlers(), 0);\n this.el.ariaExpanded = 'true';\n };\n\n /**\n * Close dropdown.\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 dropdown is open, you can recalculate its dimensions if its contents have changed.\n */\n recalculateDimensions = () => {\n if (this.isOpen) {\n this._resetDropdownPositioningStyles();\n this._placeDropdown();\n }\n };\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\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 maxDropDownHeight: 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 dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\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 dropdownOptions: {\n // Default dropdown 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 maxDropDownHeight: '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 dropdown plugin for this autocomplete. */\n dropdown: Dropdown;\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._setupDropdown();\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._removeDropdown();\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 _setupDropdown() {\n this.container = document.createElement('menu');\n this.container.style.maxHeight = this.options.maxDropDownHeight;\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._createDropdownItem(menuItem);\n this.container.append(itemElement);\n });\n\n // ! Issue in Component Dropdown: _placeDropdown moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize dropdown\n const dropdownOptions = {\n ...Autocomplete.defaults.dropdownOptions,\n ...this.options.dropdownOptions\n };\n // @todo shouldn't we conditionally check if dropdownOptions.onItemClick is set in first place?\n const userOnItemClick = dropdownOptions.onItemClick;\n // Ensuring the select Option call when user passes custom onItemClick function to dropdown\n dropdownOptions.onItemClick = (li) => {\n if (!li) return;\n const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\n // Handle user declared onItemClick if needed\n if (userOnItemClick && typeof userOnItemClick === 'function')\n userOnItemClick.call(this.dropdown, this.el);\n };\n this.dropdown = Dropdown.init(this.el, dropdownOptions);\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 dropdown click handler\n this.el.removeEventListener('click', this.dropdown._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 _removeDropdown() {\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 _createDropdownItem(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 _renderDropdown() {\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._createDropdownItem(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._renderDropdown();\n }\n // Open dropdown\n if (!this.dropdown.isOpen) {\n setTimeout(() => {\n this.dropdown.open();\n }, 0); // TODO: why?\n } else this.dropdown.recalculateDimensions(); // Recalculate dropdown when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n this.dropdown.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 dropdown\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._renderDropdown();\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._renderDropdown();\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._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._sync();\n if (e.type !== 'input') {\n this.thumb.classList.add('active');\n }\n };\n\n _handleRangeInputMousemoveTouchmove = () => {\n if (this._mousedown) {\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 _sync() {\n const max = parseFloat(this.el.getAttribute('max')) || 100;\n const min = parseFloat(this.el.getAttribute('min')) || 0;\n const val = parseFloat(this.el.value) || 0;\n const percent = max === min ? 0 : (val - min) / (max - min);\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', `${percent * 100}%`);\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\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 { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface CollapsibleOptions extends BaseOptions {\n /**\n * If accordion versus collapsible. When omitted, `.expandable` on the\n * element turns accordion off. `<details>` with the same `name` already\n * exclusive-open in the browser; this option assigns `name` when it\n * is missing.\n * @default true\n */\n accordion: boolean;\n /**\n * Callback function called before collapsible is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before collapsible is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after collapsible is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: CollapsibleOptions = {\n accordion: true,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\n/**\n * Collapsible. Open/close is HTML (`<details>` / `[open]`). Height is CSS.\n * This class is the public API and accordion `name` assignment.\n */\nexport class Collapsible extends Component<CollapsibleOptions> {\n private _items: HTMLElement[] = [];\n private _groupName: string;\n private _endTimers: number[] = [];\n private _wrappedBodies: HTMLElement[] = [];\n\n constructor(el: HTMLElement, options: Partial<CollapsibleOptions>) {\n super(el, options, Collapsible);\n this.el['Expressive_Collapsible'] = this;\n\n const accordion =\n options.accordion !== undefined\n ? options.accordion\n : !el.classList.contains('expandable');\n\n this.options = {\n ...Collapsible.defaults,\n ...options,\n accordion\n };\n\n this._groupName = el.id ? `collapsible-${el.id}` : `collapsible-${Utils.guid()}`;\n this._items = this._collectItems();\n this._wrapDetailsBodies();\n this._setupItems();\n this._setupEventHandlers();\n }\n\n static get defaults(): CollapsibleOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Collapsible.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CollapsibleOptions>): Collapsible;\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<CollapsibleOptions>): Collapsible[];\n /**\n * Initializes instances of Collapsible.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<CollapsibleOptions> = {}\n ): Collapsible | Collapsible[] {\n return super.init(els, options, Collapsible);\n }\n\n static getInstance(el: HTMLElement): Collapsible {\n return el['Expressive_Collapsible'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._endTimers.forEach((id) => clearTimeout(id));\n this._endTimers = [];\n this._unwrapDetailsBodies();\n this.el['Expressive_Collapsible'] = undefined;\n }\n\n /**\n * Open collapsible section.\n * @param index 0-based index of the section to open.\n */\n open = (index: number) => {\n const item = this._items[index];\n if (!item || this._isOpen(item)) return;\n\n if (this.options.accordion) {\n this._items.forEach((other, i) => {\n if (i !== index && this._isOpen(other)) this.close(i);\n });\n }\n\n this._setOpen(item, true);\n };\n\n /**\n * Close collapsible section.\n * @param index 0-based index of the section to close.\n */\n close = (index: number) => {\n const item = this._items[index];\n if (!item || !this._isOpen(item)) return;\n this._setOpen(item, false);\n };\n\n private _collectItems(): HTMLElement[] {\n return Array.from(this.el.querySelectorAll(':scope > details')) as HTMLElement[];\n }\n\n private _setupItems() {\n if (this.options.accordion) {\n this._items.forEach((item) => {\n if (item instanceof HTMLDetailsElement && !item.getAttribute('name')) {\n item.setAttribute('name', this._groupName);\n }\n });\n }\n\n const opened = this._items.filter((item) => this._isOpen(item));\n if (this.options.accordion && opened.length > 1) {\n opened.slice(1).forEach((item) => {\n if (item instanceof HTMLDetailsElement) item.open = false;\n });\n }\n }\n\n private _isOpen(item: HTMLElement): boolean {\n return item instanceof HTMLDetailsElement && item.open;\n }\n\n private _setOpen(item: HTMLElement, open: boolean) {\n if (item instanceof HTMLDetailsElement) item.open = open;\n }\n\n private _wrapDetailsBodies() {\n this._items.forEach((item) => {\n if (!(item instanceof HTMLDetailsElement)) return;\n if (item.querySelector(':scope > :not(summary)')) {\n const already = Array.from(item.children).filter((c) => c.tagName !== 'SUMMARY');\n if (already.length === 1 && already[0].tagName === 'DIV') {\n this._wrappedBodies.push(already[0] as HTMLElement);\n return;\n }\n }\n const body = document.createElement('div');\n Array.from(item.childNodes).forEach((node) => {\n if (node instanceof HTMLElement && node.tagName === 'SUMMARY') return;\n body.appendChild(node);\n });\n item.appendChild(body);\n this._wrappedBodies.push(body);\n });\n }\n\n private _unwrapDetailsBodies() {\n this._wrappedBodies.forEach((body) => {\n const parent = body.parentNode;\n if (!parent) return;\n while (body.firstChild) parent.insertBefore(body.firstChild, body);\n body.remove();\n });\n this._wrappedBodies = [];\n }\n\n private _bodyOf(item: HTMLElement): HTMLElement | null {\n return item.querySelector(':scope > :not(summary)') as HTMLElement | null;\n }\n\n private _setupEventHandlers() {\n this.el.addEventListener('toggle', this._handleToggle, true);\n }\n\n private _removeEventHandlers() {\n this.el.removeEventListener('toggle', this._handleToggle, true);\n };\n\n private _handleToggle = (e: Event) => {\n const item = e.target as HTMLElement;\n if (!(item instanceof HTMLDetailsElement)) return;\n if (!this._items.includes(item)) return;\n this._notify(item, item.open);\n };\n\n private _notify(item: HTMLElement, opening: boolean) {\n const start = opening ? this.options.onOpenStart : this.options.onCloseStart;\n if (typeof start === 'function') start.call(this, item);\n\n const end = opening ? this.options.onOpenEnd : this.options.onCloseEnd;\n if (typeof end !== 'function') return;\n\n const target = this._bodyOf(item) ?? item;\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n target.removeEventListener('transitionend', onEnd);\n end.call(this, item);\n };\n const onEnd = (ev: TransitionEvent) => {\n if (ev.target !== target) return;\n finish();\n };\n target.addEventListener('transitionend', onEnd);\n this._endTimers.push(window.setTimeout(finish, this._durationMs() + 50));\n }\n\n private _durationMs(): number {\n const raw = getComputedStyle(this.el)\n .getPropertyValue('--md-comp-collapsible-duration')\n .trim();\n if (!raw) return 500;\n if (raw.endsWith('ms')) return parseFloat(raw);\n if (raw.endsWith('s')) return parseFloat(raw) * 1000;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : 500;\n }\n}\n", "import { Utils } from '../core/utils';\nimport { Dropdown, DropdownOptions } from './dropdown';\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 dropdown initialization.\n * @default {}\n */\n dropdownOptions: Partial<DropdownOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n dropdownOptions: {}\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 /** Dropdown menu element. */\n dropdownOptions: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the dropdown plugin for this select. */\n dropdown: Dropdown;\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._setupDropdown();\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 Dropdown holds itself in the static Dropdown._dropdowns 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.dropdown?.destroy();\n this._removeDropdown();\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 dropdown 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 Dropdown instance stay put.\n */\n refresh() {\n if (!this.dropdownOptions) 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.dropdownOptions.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.dropdownOptions?.removeEventListener('focusin', this._handleOptionFocus);\n }\n\n private _setupOptionHandlers() {\n this.dropdownOptions.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.dropdownOptions?.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.dropdown?.close();\n }\n\n _handleInputClick = () => {\n if (this.dropdown && this.dropdown.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupDropdown() {\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.dropdownOptions = document.createElement('menu');\n this.dropdownOptions.id = `select-options-${Utils.guid()}`;\n this.dropdownOptions.setAttribute('popover', 'auto');\n this.dropdownOptions.setAttribute('role', 'listbox');\n this.dropdownOptions.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.dropdownOptions.classList.add('multiple-select-dropdown');\n this._buildOptions();\n this.wrapper.append(this.dropdownOptions);\n\n this._buildInput();\n this._buildCaret();\n this._initDropdown();\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('dropdown-trigger');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.dropdownOptions.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.dropdownOptions.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 _initDropdown() {\n if (this.el.disabled) return;\n const dropdownOptions = { ...this.options.dropdownOptions };\n dropdownOptions.coverTrigger = false;\n const userOnOpenEnd = dropdownOptions.onOpenEnd;\n const userOnCloseEnd = dropdownOptions.onCloseEnd;\n dropdownOptions.onOpenEnd = () => {\n const selectedOption = this.dropdownOptions.querySelector('.selected');\n if (selectedOption) {\n Utils.keyDown = true;\n this.dropdown.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.dropdown._focusFocusedItem();\n Utils.keyDown = false;\n if (this.dropdown.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.dropdownOptions.getBoundingClientRect().top;\n scrollOffset -= this.dropdownOptions.clientHeight / 2;\n this.dropdownOptions.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.dropdown, this.el);\n };\n dropdownOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.dropdown, this.el);\n };\n dropdownOptions.closeOnClick = false;\n this.dropdown = Dropdown.init(this.input, dropdownOptions);\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.dropdownOptions.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.dropdownOptions.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.dropdown?._makeDropdownFocusable();\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeDropdown() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.dropdownOptions?.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.dropdownOptions.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.dropdownOptions, 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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\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 // Dropdown - 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 dropdownOptions: { container: document.body, constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n dropdownOptions: { 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 { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface PushpinOptions extends BaseOptions {\n /**\n * The distance in pixels from the top of the page where\n * the element becomes fixed.\n * @default 0\n */\n top: number;\n /**\n * The distance in pixels from the top of the page where\n * the elements stops being fixed.\n * @default Infinity\n */\n bottom: number;\n /**\n * The offset from the top the element will be fixed at.\n * @default 0\n */\n offset: number;\n /**\n * Callback function called when pushpin position changes.\n * You are provided with a position string.\n * @default null\n */\n onPositionChange: (position: 'pinned' | 'pin-top' | 'pin-bottom') => void;\n}\n\nconst _defaults = {\n top: 0,\n bottom: Infinity,\n offset: 0,\n onPositionChange: null\n};\n\nexport class Pushpin extends Component<PushpinOptions> {\n static _pushpins: Pushpin[];\n originalOffset: number;\n\n constructor(el: HTMLElement, options: Partial<PushpinOptions>) {\n super(el, options, Pushpin);\n this.el['Expressive_Pushpin'] = this;\n\n this.options = {\n ...Pushpin.defaults,\n ...options\n };\n\n this.originalOffset = (this.el as HTMLElement).offsetTop;\n Pushpin._pushpins.push(this);\n this._setupEventHandlers();\n this._updatePosition();\n }\n\n static get defaults(): PushpinOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Pushpin.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<PushpinOptions>): Pushpin;\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(els: InitElements<InitElement>, options?: Partial<PushpinOptions>): Pushpin[];\n /**\n * Initializes instances of Pushpin.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<PushpinOptions> = {}\n ): Pushpin | Pushpin[] {\n return super.init(els, options, Pushpin);\n }\n\n static getInstance(el: HTMLElement): Pushpin {\n return el['Expressive_Pushpin'];\n }\n\n destroy() {\n (this.el as HTMLElement).style.top = null;\n this._removePinClasses();\n // Remove pushpin Inst\n const index = Pushpin._pushpins.indexOf(this);\n Pushpin._pushpins.splice(index, 1);\n if (Pushpin._pushpins.length === 0) {\n this._removeEventHandlers();\n }\n this.el['Expressive_Pushpin'] = undefined;\n }\n\n static _updateElements() {\n for (let i = 0; i < Pushpin._pushpins.length; i++) {\n Pushpin._pushpins[i]._updatePosition();\n }\n }\n\n _setupEventHandlers() {\n document.addEventListener('scroll', Pushpin._updateElements, { passive: true });\n }\n\n _removeEventHandlers() {\n document.removeEventListener('scroll', Pushpin._updateElements);\n }\n\n _updatePosition() {\n const scrolled = Utils.getDocumentScrollTop() + this.options.offset;\n\n if (\n this.options.top <= scrolled &&\n this.options.bottom >= scrolled &&\n !this.el.classList.contains('pinned')\n ) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = `${this.options.offset}px`;\n this.el.classList.add('pinned');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pinned');\n }\n }\n\n // Add pin-top (when scrolled position is above top)\n if (scrolled < this.options.top && !this.el.classList.contains('pin-top')) {\n this._removePinClasses();\n (this.el as HTMLElement).style.top = '0';\n this.el.classList.add('pin-top');\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-top');\n }\n }\n\n // Add pin-bottom (when scrolled position is below bottom)\n if (scrolled > this.options.bottom && !this.el.classList.contains('pin-bottom')) {\n this._removePinClasses();\n this.el.classList.add('pin-bottom');\n (this.el as HTMLElement).style.top = `${this.options.bottom - this.originalOffset}px`;\n\n // onPositionChange callback\n if (typeof this.options.onPositionChange === 'function') {\n this.options.onPositionChange.call(this, 'pin-bottom');\n }\n }\n }\n\n _removePinClasses() {\n this.el.classList.remove('pin-top', 'pinned', 'pin-bottom');\n }\n\n static {\n Pushpin._pushpins = [];\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 { 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, Openable } from '../core/component';\n\nexport interface TapTargetOptions extends BaseOptions {\n /**\n * Callback function called when Tap Target is opened.\n * @default null\n */\n onOpen: (origin: HTMLElement) => void;\n /**\n * Callback function called when Tap Target is closed.\n * @default null\n */\n onClose: (origin: HTMLElement) => void;\n}\n\nconst _defaults: TapTargetOptions = {\n onOpen: null,\n onClose: null\n};\n\n/**\n * Tap target (Feature Discovery). Placement is CSS custom properties;\n * the wrapper is a popover when the platform has one. This class is\n * open/close, origin lookup, and the two geometry variables.\n */\nexport class TapTarget extends Component<TapTargetOptions> implements Openable {\n isOpen: boolean;\n originEl: HTMLElement | null;\n\n static _taptargets: TapTarget[];\n\n private wrapper: HTMLElement | null = null;\n private waveEl: HTMLElement | null = null;\n private contentEl: HTMLElement | null = null;\n private _createdWrapper = false;\n private _createdWave = false;\n private _usePopover = false;\n private _liftedStatic = false;\n private _opening = false;\n\n constructor(el: HTMLElement, options: Partial<TapTargetOptions>) {\n super(el, options, TapTarget);\n this.el['Expressive_TapTarget'] = this;\n\n this.options = {\n ...TapTarget.defaults,\n ...options\n };\n\n this.isOpen = false;\n // getElementById, not a `#${\u2026}` selector: data-target is author content\n // and anything that is not a bare identifier either threw a SyntaxError\n // here or steered the query somewhere else.\n this.originEl = el.dataset.target ? document.getElementById(el.dataset.target) : null;\n if (!this.originEl) {\n console.error(`TapTarget: no element with id \"${el.dataset.target ?? ''}\" to attach to`);\n return;\n }\n\n this._setup();\n this._calculatePositioning();\n this._setupEventHandlers();\n\n TapTarget._taptargets.push(this);\n }\n\n static get defaults(): TapTargetOptions {\n return _defaults;\n }\n\n static init(el: HTMLElement, options?: Partial<TapTargetOptions>): TapTarget;\n static init(els: InitElements<InitElement>, options?: Partial<TapTargetOptions>): TapTarget[];\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<TapTargetOptions> = {}\n ): TapTarget | TapTarget[] {\n return super.init(els, options, TapTarget);\n }\n\n static getInstance(el: HTMLElement): TapTarget {\n return el['Expressive_TapTarget'];\n }\n\n destroy() {\n this.close();\n this._removeEventHandlers();\n this._teardownDom();\n this.el['Expressive_TapTarget'] = undefined;\n const index = TapTarget._taptargets.indexOf(this);\n if (index >= 0) TapTarget._taptargets.splice(index, 1);\n }\n\n /**\n * Open Tap Target.\n */\n open = () => {\n if (this.isOpen || !this.originEl || !this.wrapper) return;\n\n TapTarget._taptargets.forEach((other) => {\n if (other !== this) other.close();\n });\n\n this._calculatePositioning();\n\n if (typeof this.options.onOpen === 'function') {\n this.options.onOpen.call(this, this.originEl);\n }\n\n this.isOpen = true;\n this.wrapper.classList.add('open');\n this.originEl.setAttribute('aria-expanded', 'true');\n\n if (!this._usePopover) {\n this.originEl.classList.add('tap-target-origin');\n if (getComputedStyle(this.originEl).position === 'static') {\n this.originEl.style.position = 'relative';\n this._liftedStatic = true;\n }\n }\n\n if (this._usePopover) {\n this._opening = true;\n try {\n this.wrapper.showPopover();\n } catch {\n // already open\n }\n requestAnimationFrame(() => {\n this._opening = false;\n });\n }\n };\n\n /**\n * Close Tap Target.\n */\n close = () => {\n if (!this.isOpen) return;\n\n if (typeof this.options.onClose === 'function' && this.originEl) {\n this.options.onClose.call(this, this.originEl);\n }\n\n this.isOpen = false;\n this.wrapper?.classList.remove('open');\n this.originEl?.setAttribute('aria-expanded', 'false');\n this.originEl?.classList.remove('tap-target-origin');\n if (this._liftedStatic && this.originEl) {\n this.originEl.style.position = '';\n this._liftedStatic = false;\n }\n\n if (this._usePopover && this.wrapper) {\n try {\n this.wrapper.hidePopover();\n } catch {\n // already closed\n }\n }\n };\n\n private _setup() {\n const parent = this.el.parentElement;\n if (parent?.classList.contains('tap-target-wrapper')) {\n this.wrapper = parent;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('tap-target-wrapper');\n this.el.before(this.wrapper);\n this.wrapper.append(this.el);\n this._createdWrapper = true;\n }\n\n this.contentEl = this.el.querySelector('.tap-target-content');\n if (!this.contentEl) {\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'tap-target-content';\n while (this.el.firstChild) this.contentEl.append(this.el.firstChild);\n this.el.append(this.contentEl);\n }\n\n this.waveEl =\n this.el.querySelector('.tap-target-wave') ??\n this.wrapper.querySelector('.tap-target-wave');\n if (!this.waveEl) {\n this.waveEl = document.createElement('div');\n this.waveEl.className = 'tap-target-wave';\n this._createdWave = true;\n }\n // Inside the circle, behind .tap-target-content \u2014 a sibling of the\n // circle paints over the copy.\n this.el.prepend(this.waveEl);\n\n this.el.setAttribute('role', 'dialog');\n this._labelFromHeading();\n\n const origin = this.originEl;\n origin.setAttribute('aria-expanded', 'false');\n origin.setAttribute('aria-controls', this.el.id || this._ensureId());\n\n this._usePopover = typeof this.wrapper.showPopover === 'function';\n if (this._usePopover) {\n this.wrapper.setAttribute('popover', 'auto');\n }\n }\n\n private _ensureId(): string {\n if (!this.el.id) this.el.id = `tap-target-${Utils.guid()}`;\n return this.el.id;\n }\n\n private _labelFromHeading() {\n const heading = this.contentEl?.querySelector('h1, h2, h3, h4, h5, h6');\n if (!heading) return;\n if (!heading.id) heading.id = `tap-target-title-${Utils.guid()}`;\n this.el.setAttribute('aria-labelledby', heading.id);\n }\n\n private _teardownDom() {\n if (this._createdWave) this.waveEl?.remove();\n if (this._createdWrapper && this.wrapper) {\n this.wrapper.before(this.el);\n this.wrapper.remove();\n }\n this.wrapper = null;\n this.waveEl = null;\n }\n\n private _setupEventHandlers() {\n if (!this.originEl) return;\n this.originEl.addEventListener('click', this._handleTargetToggle);\n if (!this.originEl.matches('button, a, [tabindex], [role=\"button\"]')) {\n this.originEl.tabIndex = 0;\n this.originEl.addEventListener('keydown', this._handleOriginKeydown);\n }\n this.wrapper?.addEventListener('toggle', this._handlePopoverToggle);\n window.addEventListener('resize', this._handleThrottledResize, { passive: true });\n }\n\n private _removeEventHandlers() {\n if (!this.originEl) return;\n this.originEl.removeEventListener('click', this._handleTargetToggle);\n this.originEl.removeEventListener('keydown', this._handleOriginKeydown);\n this.wrapper?.removeEventListener('toggle', this._handlePopoverToggle);\n window.removeEventListener('resize', this._handleThrottledResize);\n }\n\n // Built once per instance; a fresh throttle per event never fires.\n private _handleThrottledResize = Utils.throttle(() => this._handleResize(), 200);\n\n private _handleOriginKeydown = (e: KeyboardEvent) => {\n if (Utils.keys.ENTER.includes(e.key) || e.key === ' ') {\n e.preventDefault();\n this._handleTargetToggle();\n }\n };\n\n private _handleTargetToggle = () => {\n if (!this.isOpen) this.open();\n else this.close();\n };\n\n private _handleResize = () => {\n if (this.isOpen) this._calculatePositioning();\n };\n\n private _handlePopoverToggle = (e: Event) => {\n const state = 'newState' in e ? String((e as { newState: string }).newState) : '';\n if (state === 'open') return;\n if (this._opening) {\n try {\n this.wrapper?.showPopover();\n } catch {\n /* still opening */\n }\n return;\n }\n if (this.isOpen) this.close();\n };\n\n private _calculatePositioning() {\n if (!this.originEl || !this.wrapper) return;\n const rect = this.originEl.getBoundingClientRect();\n const x = rect.left + rect.width / 2;\n const y = rect.top + rect.height / 2;\n const size = Math.max(rect.width, rect.height, 1);\n\n this.wrapper.style.setProperty('--md-comp-tap-target-x', `${x}px`);\n this.wrapper.style.setProperty('--md-comp-tap-target-y', `${y}px`);\n this.wrapper.style.setProperty('--md-comp-tap-target-origin-size', `${size}px`);\n\n const vertical = y <= window.innerHeight / 2 ? 'top' : 'bottom';\n const onCenter = x >= window.innerWidth * 0.25 && x <= window.innerWidth * 0.75;\n const horizontal = onCenter ? 'center' : x <= window.innerWidth / 2 ? 'left' : 'right';\n this.wrapper.dataset.edge = `${vertical}-${horizontal}`;\n }\n\n static {\n TapTarget._taptargets = [];\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 ToastOptions extends BaseOptions {\n /**\n * The content of the Toast.\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 toast 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 for the tooltip.\n * @default \"\"\n */\n toastId?: string;\n /**\n * Length in ms the Toast stays before dismissal.\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 toast element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when toast is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the toast's width it takes fora drag\n * to dismiss a Toast.\n * @default 0.8\n */\n activationPercent: number;\n}\n\nconst _defaults: ToastOptions = {\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 Toast {\n /** The toast element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the toast\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Toast.\n */\n panning: boolean;\n options: ToastOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the toast 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\n static _toasts: Toast[];\n static _container: HTMLElement;\n static _draggedToast: Toast;\n\n constructor(options: Partial<ToastOptions>) {\n this.options = {\n ...Toast.defaults,\n ...options\n };\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n if (Toast._toasts.length === 0) {\n Toast._createContainer();\n }\n // Create new toast\n Toast._toasts.push(this);\n const toastElement = this._createToast();\n toastElement['Expressive_Toast'] = this;\n this.el = toastElement;\n this._animateIn();\n this._setTimer();\n }\n\n static get defaults(): ToastOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Toast {\n return el['Expressive_Toast'];\n }\n\n static _createContainer() {\n const container = document.createElement('div');\n container.setAttribute('id', 'toast-container');\n // Add event handler\n container.addEventListener('touchstart', Toast._onDragStart);\n container.addEventListener('touchmove', Toast._onDragMove);\n container.addEventListener('touchend', Toast._onDragEnd);\n container.addEventListener('mousedown', Toast._onDragStart);\n document.addEventListener('mousemove', Toast._onDragMove);\n document.addEventListener('mouseup', Toast._onDragEnd);\n document.body.appendChild(container);\n Toast._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('mousemove', Toast._onDragMove);\n document.removeEventListener('mouseup', Toast._onDragEnd);\n Toast._container.remove();\n Toast._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 toastElem = target.closest('.snackbar') as HTMLElement;\n const toast: Toast = toastElem['Expressive_Toast'];\n if (!toast) return;\n toast.panning = true;\n toast._pauseTimer();\n Toast._draggedToast = toast;\n toast.el.classList.add('panning');\n toast.el.style.transition = '';\n toast.startingXPos = Toast._xPos(e);\n toast.time = Date.now();\n toast.xPos = Toast._xPos(e);\n }\n }\n\n static _onDragMove(e: TouchEvent | MouseEvent) {\n if (!!Toast._draggedToast) {\n e.preventDefault();\n const toast = Toast._draggedToast;\n toast.deltaX = Math.abs(toast.xPos - Toast._xPos(e));\n toast.xPos = Toast._xPos(e);\n toast.velocityX = toast.deltaX / (Date.now() - toast.time);\n toast.time = Date.now();\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n toast.el.style.transform = `translateX(${totalDeltaX}px)`;\n toast.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd() {\n if (!!Toast._draggedToast) {\n const toast = Toast._draggedToast;\n toast.panning = false;\n toast.el.classList.remove('panning');\n\n const totalDeltaX = toast.xPos - toast.startingXPos;\n const activationDistance = toast.el.offsetWidth * toast.options.activationPercent;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || toast.velocityX > 1;\n\n // Remove toast\n if (shouldBeDismissed) {\n toast.wasSwiped = true;\n toast.dismiss();\n // Animate toast back to original position\n } else {\n toast.el.style.transition = 'transform .2s, opacity .2s';\n toast.el.style.transform = '';\n toast.el.style.opacity = '';\n toast._resumeTimer();\n }\n Toast._draggedToast = 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 toasts.\n */\n static dismissAll() {\n // Copy first: dismiss() splices the list it is iterating.\n for (const toast of [...Toast._toasts]) {\n toast.dismiss();\n }\n }\n\n _createToast() {\n let toast: HTMLElement = this.options.toastId\n ? document.getElementById(this.options.toastId)\n : document.createElement('div');\n if (toast instanceof HTMLTemplateElement) {\n const node = (toast as HTMLTemplateElement).content.cloneNode(true);\n toast = (node as HTMLElement).firstElementChild as HTMLElement;\n }\n toast.classList.add('snackbar');\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', 'polite');\n toast.setAttribute('aria-atomic', 'true');\n // Add custom classes onto toast\n if (this.options.classes.length > 0) {\n toast.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 toast.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 toast.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 toast.appendChild(close);\n }\n Toast._container.appendChild(toast);\n return toast;\n }\n\n _animateIn() {\n // Animate toast in\n this.el.style.display = '';\n this.el.style.opacity = '0';\n // easeOutCubic\n this.el.style.transition = `\n top ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n setTimeout(() => {\n this.el.style.top = '0';\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 toast 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 toast with animation.\n */\n dismiss() {\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 toast from DOM\n if (this.el.id != this.options.toastId) {\n this.el.remove();\n // Guarded: splice(-1, 1) on an already-removed toast would drop an\n // unrelated one off the end of the list.\n const index = Toast._toasts.indexOf(this);\n if (index >= 0) Toast._toasts.splice(index, 1);\n if (Toast._toasts.length === 0 && Toast._container) {\n Toast._removeContainer();\n }\n }\n }, this.options.outDuration);\n }\n\n static {\n Toast._toasts = [];\n Toast._container = null;\n Toast._draggedToast = 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 (Toast,\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 Collapsible: { component: Components.Collapsible, selector: '.collapsible' },\n Datepicker: { component: Components.Datepicker, selector: '.datepicker' },\n Dropdown: { component: Components.Dropdown, selector: '.dropdown-trigger' },\n Lightbox: { component: Components.Lightbox, selector: '.lightboxed' },\n Parallax: { component: Components.Parallax, selector: '.parallax' },\n Pushpin: { component: Components.Pushpin, selector: '.pushpin' },\n ScrollSpy: { component: Components.ScrollSpy, selector: '.scrollspy' },\n FormSelect: { component: Components.FormSelect, selector: 'select' },\n Sidenav: { component: Components.Sidenav, selector: '.sidenav' },\n Tabs: { component: Components.Tabs, selector: '.tabs' },\n TapTarget: { component: Components.TapTarget, selector: '.tap-target' },\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"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,SAAN,MAAM,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAsCjB,OAAO,iBAAiB,GAAkB;AACxC,WAAM,UAAU;AAChB,QAAI,OAAM,gBAAgB,IAAI,EAAE,GAAG,GAAG;AACpC,aAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAe,GAAkB;AACtC,WAAM,UAAU;AAChB,QAAI,OAAM,gBAAgB,IAAI,EAAE,GAAG,GAAG;AACpC,aAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,eAAe,GAAe;AACnC,QAAI,OAAM,SAAS;AACjB,eAAS,KAAK,UAAU,IAAI,kBAAkB;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAc,GAAe;AAClC,aAAS,KAAK,UAAU,OAAO,kBAAkB;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,gBAAgB,UAA4B;AACjD,QAAI,OAAO,aAAa,YAAa;AACrC,QAAI,SAAS,eAAe,WAAW;AACrC,eAAS,iBAAiB,oBAAoB,UAAU,EAAE,MAAM,KAAK,CAAC;AAAA,IACxE,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAe;AACpB,UAAM,KAAK,MAAc;AACvB,aAAO,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,KAAO,EAC5C,SAAS,EAAE,EACX,UAAU,CAAC;AAAA,IAChB;AACA,WAAO,GAAG,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,qBAAqB,WAAwB,UAAoB,QAAuB;AAC7F,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAEA,UAAM,gBAAgB,UAAU,sBAAsB;AAEtD,UAAM,kBACJ,cAAc,SAAS,OACnB,KAAK,IAAI,cAAc,QAAQ,OAAO,WAAW,IACjD,cAAc;AAEpB,UAAM,aAAa,UAAU;AAC7B,UAAM,YAAY,UAAU;AAE5B,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,YAAY,SAAS,MAAM;AAGjC,QAAI,YAAY,cAAc,OAAO,UAAU,YAAY,QAAQ;AACjE,YAAM,OAAO;AAAA,IACf;AAEA,QACE,YAAY,SAAS,QAAQ,cAAc,QAAQ,UACnD,YAAY,SAAS,QAAQ,OAAO,aAAa,QACjD;AACA,YAAM,QAAQ;AAAA,IAChB;AAEA,QAAI,YAAY,cAAc,MAAM,UAAU,YAAY,QAAQ;AAChE,YAAM,MAAM;AAAA,IACd;AAEA,QACE,YAAY,SAAS,SAAS,kBAAkB,UAChD,YAAY,SAAS,SAAS,OAAO,cAAc,QACnD;AACA,YAAM,SAAS;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,wBACL,IACA,WACA,UACA,QACA;AACA,UAAM,WASF;AAAA,MACF,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAEA,UAAM,0BAA0B,iBAAiB,SAAS,EAAE,aAAa;AACzE,UAAM,gBAAgB,UAAU,sBAAsB;AACtD,UAAM,kBAAkB,KAAK,IAAI,cAAc,QAAQ,OAAO,WAAW;AACzE,UAAM,iBAAiB,KAAK,IAAI,cAAc,OAAO,OAAO,UAAU;AACtE,UAAM,eAAe,GAAG,sBAAsB;AAE9C,UAAM,aAAa,UAAU;AAC7B,UAAM,YAAY,UAAU;AAE5B,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,mBAAmB,SAAS,MAAM;AACxC,UAAM,sBAAsB,SAAS,MAAM,aAAa,SAAS;AAGjE,aAAS,eAAe,CAAC,0BACrB,kBAAkB,YAAY,SAAS,SACvC,OAAO,cAAc,aAAa,OAAO,SAAS;AACtD,QAAI,SAAS,eAAe,GAAG;AAC7B,eAAS,OAAO;AAAA,IAClB;AAGA,aAAS,cAAc,CAAC,0BACpB,YAAY,SAAS,QAAQ,aAAa,QAC1C,aAAa,QAAQ,SAAS;AAClC,QAAI,SAAS,cAAc,GAAG;AAC5B,eAAS,QAAQ;AAAA,IACnB;AAGA,aAAS,gBAAgB,CAAC,0BACtB,mBAAmB,mBAAmB,SAAS,SAAS,UACxD,OAAO,eAAe,aAAa,MAAM,SAAS,SAAS;AAC/D,QAAI,SAAS,gBAAgB,GAAG;AAC9B,eAAS,MAAM;AAAA,IACjB;AAGA,aAAS,aAAa,CAAC,0BACnB,uBAAuB,SAAS,SAAS,UACzC,aAAa,UAAU,SAAS,SAAS;AAC7C,QAAI,SAAS,aAAa,GAAG;AAC3B,eAAS,SAAS;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,iBAAiB,SAA8B;AACpD,QAAI,KAAK,QAAQ,QAAQ;AACzB,QAAI,CAAC,IAAI;AACP,WAAK,QAAQ,aAAa,MAAM;AAChC,aAAO,KAAK,GAAG,MAAM,CAAC,IAAI;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,uBAA+B;AACpC,WAAO,OAAO,WAAW,SAAS,gBAAgB,aAAa,SAAS,KAAK,aAAa;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAgC;AACrC,WAAO,OAAO,WAAW,SAAS,gBAAgB,cAAc,SAAS,KAAK,cAAc;AAAA,EAC9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SACL,MACA,MACA,UAA4D,CAAC,GAC7D;AAEA,QAAI,WAAsB,MACxB,QACA,UAAU,MACV,WAAW;AAEb,UAAM,QAAQ,MAAM;AAClB,iBAAW,SAAS,YAAY,QAAQ,IAAI,KAAK,IAAI;AACrD,gBAAU;AAGV,eAAS,KAAK,GAAI,YAAY,CAAC,CAAE;AACjC,iBAAW;AAAA,IACb;AAEA,WAAO,IAAI,SAAoB;AAC7B,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,CAAC,YAAY,SAAS,YAAY,MAAO,YAAW;AACxD,YAAM,YAAY,QAAQ,MAAM;AAChC,iBAAW;AACX,UAAI,aAAa,GAAG;AAClB,qBAAa,OAAO;AACpB,kBAAU;AACV,mBAAW;AACX,mBAAW;AACX,iBAAS,KAAK,GAAG,IAAI;AAAA,MACvB,WAAW,CAAC,WAAW,SAAS,aAAa,OAAO;AAClD,kBAAU,WAAW,OAAO,SAAS;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,4BACL,WACA,aACA,YACA,WACA,UACM;AACN,UAAM,+BAA+B,SAAS,cAAc,KAAK;AACjE,iCAA6B,UAAU,IAAI,mBAAmB;AAC9D,cAAU,OAAO,4BAA4B;AAE7C,SAAK,aAAa,8BAA8B,YAAY,CAAC,YAAY,GAAG,MAAM,QAAQ;AAC1F,SAAK,aAAa,8BAA8B,aAAa,CAAC,aAAa,GAAG,MAAM,SAAS;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aACL,WACA,MACA,YAAsB,CAAC,GACvB,aAAsB,MACtB,WAAuC,MACjC;AACN,gBAAY,UAAU,OAAO,CAAC,gBAAgB,MAAM,CAAC;AACrD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY,UAAU,KAAK,GAAG;AACrC,WAAO,MAAM,aAAa,aAAa,YAAY;AACnD,WAAO,OAAO;AACd,WAAO,WAAW,CAAC,CAAC,aAAa,IAAI;AACrC,WAAO,YAAY;AAGnB,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,iBAAiB,SAAS,QAAQ;AACzC,aAAO,iBAAiB,YAAY,CAAC,MAAM;AACzC,YAAI,OAAM,KAAK,MAAM,SAAS,EAAE,GAAG,EAAG,UAAS,CAAC;AAAA,MAClD,CAAC;AAAA,IACH;AACA,cAAU,OAAO,MAAM;AAAA,EACzB;AAAA,EAEA,OAAO,qBACL,QACA,WACA,UACA,QACA,oBACA,QAAgB,UAChB;AACA,UAAM,eAAe,OAAO,cAC1B,cAAc,OAAO,aACrB,kBAAkB,UAAU,cAC5B,iBAAiB,UAAU,aAC3B,aAAa,OAAO,sBAAsB;AAC5C,QAAI,YAAY,GACd,YAAY,GACZ,YAAY,WAAW,MAAM,OAAM,qBAAqB,GACxD,aAAa,WAAW,OAAO,OAAM,sBAAsB;AAE7D,QAAI,aAAa,OAAO;AACtB,mBAAa,CAAC,kBAAkB;AAChC,UAAI,UAAU,UAAU;AACtB,sBAAc,cAAc,IAAI,iBAAiB;AAAA,MACnD;AACA,kBAAY,CAAC;AAAA,IACf,WAAW,aAAa,SAAS;AAC/B,mBAAa,eAAe,IAAI,kBAAkB;AAClD,mBAAa,cAAc;AAC3B,kBAAY;AAAA,IACd,WAAW,aAAa,QAAQ;AAC9B,mBAAa,eAAe,IAAI,kBAAkB;AAClD,mBAAa,CAAC,iBAAiB;AAC/B,kBAAY,CAAC;AAAA,IACf,OAAO;AACL,mBAAa,eAAe;AAC5B,UAAI,UAAU,UAAU;AACtB,sBAAc,cAAc,IAAI,iBAAiB;AAAA,MACnD;AACA,kBAAY;AAAA,IACd;AACA,QAAI,UAAU,SAAS;AACrB,oBAAc,cAAc,iBAAiB;AAAA,IAC/C;AAEA,UAAM,iBAAiB,OAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,cAAU,MAAM,MAAM,eAAe,IAAI;AACzC,cAAU,MAAM,OAAO,eAAe,IAAI;AAE1C,WAAO,EAAC,GAAG,WAAW,GAAG,UAAS;AAAA,EACpC;AAAA,EAEA,OAAO,wBACL,GACA,GACA,OACA,QACA,QACA,oBACA,OACA;AACA,UAAM,aAAa,OAAM,sBAAsB;AAC/C,UAAM,YAAY,OAAM,qBAAqB;AAC7C,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AAEf,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,QAAI;AACJ,QAAI,UAAU,UAAU,SAAS,UAAU;AACzC,eAAS,SAAS;AAAA,IACpB,WAAW,UAAU,SAAS;AAC5B,eAAS,SAAS;AAAA,IACpB;AACA,UAAM,QAAQ,OAAM,qBAAqB,SAAS,MAAM,UAAU,MAAM;AAExE,QAAI,MAAM,MAAM;AACd,aAAO;AAAA,IACT,WAAW,MAAM,OAAO;AACtB,cAAQ,OAAO,QAAQ,OAAO;AAAA,IAChC;AACA,QAAI,MAAM,KAAK;AACb,aAAO;AAAA,IACT,WAAW,MAAM,QAAQ;AACvB,cAAQ,OAAO,SAAS,OAAO;AAAA,IACjC;AACA,WAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ;AAAA,EACF;AACF;AAAA;AA5ca,OAEJ,aAAsB;AAAA;AAFlB,OAIJ,UAAmB;AAAA;AAAA;AAAA;AAJf,OASJ,OAAO;AAAA,EACZ,KAAK,CAAC,KAAK;AAAA,EACX,OAAO,CAAC,OAAO;AAAA,EACf,KAAK,CAAC,UAAU,KAAK;AAAA,EACrB,WAAW,CAAC,WAAW;AAAA,EACvB,UAAU,CAAC,WAAW,IAAI;AAAA,EAC1B,YAAY,CAAC,aAAa,MAAM;AAAA,EAChC,YAAY,CAAC,aAAa,MAAM;AAAA,EAChC,aAAa,CAAC,cAAc,OAAO;AAAA,EACnC,QAAQ,CAAC,UAAU,KAAK;AAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnBW,OA4BI,kBAAkB,oBAAI,IAAI;AAAA,EACvC,GAAG,OAAM,KAAK;AAAA,EACd,GAAG,OAAM,KAAK;AAAA,EACd,GAAG,OAAM,KAAK;AAChB,CAAC;AAhCI,IAAM,QAAN;;;ACsBA,IAAM,YAAN,MAAuC;AAAA;AAAA;AAAA;AAAA,EAa5C,YAAY,IAAiB,SAAqB,UAA0C;AAE1F,QAAI,EAAE,cAAc,cAAc;AAChC,cAAQ,MAAM,MAAM,KAAK,yBAAyB,CAAC;AAAA,IACrD;AAEA,UAAM,MAAM,SAAS,YAAY,EAAE;AACnC,QAAI,CAAC,CAAC,KAAK;AACT,UAAI,QAAQ;AAAA,IACd;AACA,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCA,OAAiB,KACf,KACA,SACA,UACS;AACT,QAAI,YAAY;AAChB,QAAI,eAAe,SAAS;AAC1B,kBAAY,IAAI,SAAsB,KAAK,OAAO;AAAA,IACpD,WAAW,CAAC,CAAC,OAAO,IAAI,QAAQ;AAC9B,kBAAY,CAAC;AACb,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,kBAAU,KAAK,IAAI,SAAsB,IAAI,CAAC,GAAG,OAAO,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,WAAwB;AACjC,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,IAAyC;AAC1D,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACF;;;AC5HA,IAAM,YAA0B;AAAA,EAC9B,QAAQ;AAAA,EACR,SAAS;AACX;AAUO,IAAM,iBAAiB;AAEvB,IAAM,QAAN,MAAM,eAAc,UAA4C;AAAA,EAMrE,YAAY,IAAiB,SAAgC;AAC3D,UAAM,IAAI,SAAS,MAAK;AAN1B,kBAAkB;AA2ElB,+BAAsB,MAAM;AAC1B,WAAK,YAAY,QAAQ,CAAC,OAAoB;AAC5C,WAAG,iBAAiB,SAAS,KAAK,uBAAuB;AACzD,WAAG,iBAAiB,YAAY,KAAK,oBAAoB;AAAA,MAC3D,CAAC;AAAA,IACH;AAEA,gCAAuB,MAAM;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAoB;AAC5C,WAAG,oBAAoB,SAAS,KAAK,uBAAuB;AAC5D,WAAG,oBAAoB,YAAY,KAAK,oBAAoB;AAAA,MAC9D,CAAC;AAAA,IACH;AAEA,mCAA0B,MAAM;AAC9B,WAAK,mBAAmB;AAAA,IAC1B;AAEA,gCAAmD,CAAC,MAAqB;AACvE,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,8BAAqB,MAAM;AAEzB,WAAK,YAAY,QAAQ,CAAC,OAAqB,GAAG,WAAW,EAAG;AAChE,WAAK,KAAK;AAAA,IACZ;AAEA,0CAAiC,MAAM;AACrC,WAAK,gBAAgB,iBAAiB,SAAS,KAAK,KAAK;AACzD,WAAK,gBAAgB,iBAAiB,YAAY,KAAK,yBAAyB;AAAA,IAClF;AAEA,2CAAkC,MAAM;AACtC,WAAK,gBAAgB,oBAAoB,SAAS,KAAK,KAAK;AAC5D,WAAK,gBAAgB,oBAAoB,YAAY,KAAK,yBAAyB;AAAA,IACrF;AAEA,qCAAwD,CAAC,MAAqB;AAC5E,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,gBAAmB,MAAM;AACvB,UAAI,KAAK,UAAU,CAAC,KAAK,WAAY;AACrC,WAAK,SAAS;AACd,WAAK,WAAW,eAAe;AAE/B,UAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAC1D,UAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,aAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,MAC/B;AACA,UAAI,KAAK,gBAAiB,MAAK,+BAA+B;AAAA,IAChE;AAKA;AAAA;AAAA;AAAA,iBAAoB,MAAM;AACxB,UAAI,CAAC,KAAK,UAAU,CAAC,KAAK,WAAY;AACtC,WAAK,SAAS;AACd,WAAK,WAAW,eAAe;AAC/B,WAAK,YAAY,QAAQ,CAAC,OAAqB,GAAG,WAAW,CAAE;AAC/D,UAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAC1D,UAAI,OAAO,KAAK,QAAQ,YAAY,YAAY;AAC9C,aAAK,QAAQ,QAAQ,KAAK,IAAI;AAAA,MAChC;AACA,UAAI,KAAK,gBAAiB,MAAK,gCAAgC;AAAA,IACjE;AA9IE,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,cAAc,CAAC;AAEpB,SAAK,aAAa,KAAK,GAAG,cAAc,gBAAgB;AACxD,QAAI,KAAK,YAAY;AACnB,WAAK,cAAc,MAAM,KAAK,KAAK,GAAG,iBAAiB,YAAY,CAAC;AACpE,WAAK,YAAY,QAAQ,CAACA,QAAoB;AAC5C,YAAIA,IAAI,CAAAA,IAAG,WAAW;AAAA,MACxB,CAAC;AAED,WAAK,kBAAkB,KAAK,WAAW;AAAA,QACrC;AAAA,MACF;AACA,UAAI,KAAK,gBAAiB,MAAK,gBAAgB,WAAW;AAE1D,WAAK,WAAW,eAAe;AAC/B,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,SACiB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,qBAAqB;AAC1B,QAAI,KAAK,gBAAiB,MAAK,gCAAgC;AAC/D,SAAK,cAAc,CAAC;AACpB,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EA8EA,OAAO,OAAO;AAEZ,UAAM,gBAAgB,MAAM;AAC1B,YAAM,QAAQ,SAAS,iBAAiB,cAAc;AACtD,YAAM,QAAQ,CAAC,OAAO;AACpB,YAAI,MAAM,GAAG,kBAAkB,KAAK,OAAW,MAAK,KAAK,EAAiB;AAAA,MAC5E,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC5GA,IAAMC,aAA6B;AAAA,EACjC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,YAAN,MAAM,kBAAiB,UAA+C;AAAA,EAgB3E,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAuH7B,wBAAe,CAAC,MAAkB;AAChC,QAAE,eAAe;AAEjB,UAAI,KAAK,QAAQ;AACf,aAAK,MAAM;AAAA,MACb,OAAO;AACL,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,6BAAoB,MAAM;AAExB,WAAK,KAAK;AAAA,IACZ;AAEA,6BAAoB,CAAC,MAAkB;AACrC,YAAM,OAAO,EAAE;AAEf,UAAI,CAAC,MAAM;AACT,aAAK,MAAM;AACX;AAAA,MACF;AACA,YAAM,yBAAyB,CAAC,EAAE,KAAK,cAAc,QAAQ,KAAK,WAAW,SAAS,IAAI;AAC1F,UAAI,+BAA+B;AACnC,YAAM,iBAAiB,KAAK,QAAQ,mBAAmB;AACvD,UAAI,kBAAkB,CAAC,CAAC,eAAe,qBAAqB,KAAK,eAAe,qBAAqB,EAAE,QAAQ;AAC7G,uCAA+B;AAAA,MACjC;AAEA,UAAI,CAAC,gCAAgC,CAAC,wBAAwB;AAC5D,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAkB;AACxC,YAAM,SAAsB,EAAE;AAC9B,UAAI,KAAK,uBAAuB,MAAM,EAAG;AACzC,UAAI,KAAK,QAAQ,gBAAgB,KAAK,YAAY,SAAS,MAAM,KAAK,CAAC,KAAK,eAAe;AAEzF,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,KAAK,YAAY,SAAS,MAAM,GAAG;AAG7C,mBAAW,MAAM;AACf,cAAI,KAAK,QAAQ;AACf,iBAAK,MAAM;AAAA,UACb;AAAA,QACF,GAAG,CAAC;AAAA,MACN;AACA,WAAK,gBAAgB;AAAA,IACvB;AAEA,iCAAwB,CAAC,MAAqB;AAE5C,YAAM,mBACJ,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG;AAC1E,UAAI,oBAAoB,CAAC,KAAK,QAAQ;AACpC,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,oCAA2B,CAAC,MAAkB;AAC5C,YAAM,SAAsB,EAAE;AAC9B,UAAI,KAAK,YAAY,SAAS,MAAM,GAAG;AACrC,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAkB;AACxC,YAAM,SAAsB,EAAE;AAC9B,YAAM,KAAK,OAAO,QAAQ,IAAI;AAC9B,UAAI,MAAM,KAAK,uBAAuB,MAAM,GAAG;AAC7C,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,aAAK,eAAe,EAAE;AACtB;AAAA,MACF;AACA,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,aAAK,QAAQ,YAAY,KAAK,MAAM,EAAE;AAAA,MACxC;AAAA,IACF;AAsCA,SAAQ,sBAAsB,CAAC,MAAkB;AAC/C,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAU;AAClC,YAAM,KAAK,OAAO,QAAQ,IAAI;AAC9B,UAAI,IAAI,cAAc,eAAe,KAAK,KAAK,YAAY,SAAS,EAAE,GAAG;AACvE,aAAK,cAAc,EAAiB;AAAA,MACtC;AAAA,IACF;AAoCA,kCAAyB,CAAC,MAAqB;AAC7C,YAAM,gBACJ,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG;AAC7E,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,GAAG;AAClC,UAAE,eAAe;AACjB,aAAK,MAAM;AAAA,MACb,WACS,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AAC9D,cAAM,KAAK,KAAK,YAAY,CAAC;AAC7B,YAAI,IAAI,cAAc,eAAe,GAAG;AACtC,YAAE,eAAe;AACjB,aAAG,UAAU,IAAI,MAAM;AACvB,eAAK,cAAc,EAAE;AACrB,eAAK,iBAAiB,IAAI,IAAI;AAC9B,gBAAM,QAAQ,GAAG,cAAc,oBAAoB;AACnD,iBAAO,MAAM;AAAA,QACf;AAAA,MACF,WAAW,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AAC/D,cAAM,UAAU,KAAK,mBAAmB,CAAC;AACzC,YAAI,SAAS;AACX,YAAE,eAAe;AACjB,gBAAM,WAAW,QAAQ;AACzB,mBAAS,UAAU,OAAO,QAAQ,eAAe;AACjD,eAAK,iBAAiB,UAAU,KAAK;AACrC,mBAAS,MAAM;AAAA,QACjB;AAAA,MACF,WAES,iBAAiB,KAAK,QAAQ;AACrC,UAAE,eAAe;AACjB,cAAM,YAAY,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,IAAI,IAAI;AAC9D,cAAM,OAAO,KAAK,mBAAmB,CAAC,KAAK,KAAK;AAChD,YAAI,kBAAkB,KAAK;AAC3B,YAAI,mBAAmB;AACvB,WAAG;AACD,4BAAkB,kBAAkB;AACpC,cACE,CAAC,CAAC,KAAK,SAAS,eAAe,KACf,KAAK,SAAS,eAAe,EAAG,aAAa,IAC7D;AACA,+BAAmB;AACnB;AAAA,UACF;AAAA,QACF,SAAS,kBAAkB,KAAK,SAAS,UAAU,mBAAmB;AAEtE,YAAI,kBAAkB;AACpB,cAAI,KAAK,gBAAgB;AACvB,iBAAK,SAAS,KAAK,YAAY,GAAG,UAAU,OAAO,QAAQ;AAC7D,eAAK,eAAe;AACpB,gBAAM,OAAO,KAAK,SAAS,KAAK,YAAY;AAC5C,eAAK,UAAU,IAAI,QAAQ;AAC3B,eAAK,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,QACpC;AAAA,MACF,WAES,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AACxD,cAAM,KAAK,KAAK,YAAY,CAAC;AAC7B,YAAI,IAAI,cAAc,eAAe,GAAG;AACtC,YAAE,eAAe;AACjB,eAAK,eAAe,EAAE;AACtB;AAAA,QACF;AACA,cAAM,iBAAiB,MAAM,KAAK,WAAW,SAAS,KAAK,YAAY;AACvE,cAAM,qBAAkC,gBAAgB,cAAc,WAAW;AACjF,YAAI,CAAC,CAAC,oBAAoB;AACxB,6BAAmB,MAAM;AAAA,QAC3B,WAAW,0BAA0B,aAAa;AAChD,yBAAe,MAAM;AAAA,QACvB;AAAA,MACF,WAES,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AACtD,UAAE,eAAe;AACjB,cAAM,UAAU,KAAK,WAAW,cAAc,SAAS;AACvD,YAAI,SAAS;AACX,kBAAQ,UAAU,OAAO,QAAQ,eAAe;AAChD,eAAK,iBAAiB,SAAwB,KAAK;AACnD,UAAC,QAAwB,MAAM;AAAA,QACjC,OAAO;AACL,eAAK,MAAM;AAAA,QACb;AAAA,MACF;AAGA,YAAM,UAAU,EAAE,IAAI,YAAY;AAClC,YAAM,WAAW,gBAAgB,KAAK,OAAO;AAC7C,YAAM,cAAc;AAAA,QAClB,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,QACd,GAAG,MAAM,KAAK;AAAA,MAChB;AACA,UAAI,YAAY,CAAC,YAAY,SAAS,EAAE,GAAG,GAAG;AAC5C,aAAK,YAAY,KAAK,OAAO;AAC7B,cAAM,SAAS,KAAK,YAAY,KAAK,EAAE;AAGvC,cAAM,OAAO,KAAK,mBAAmB,CAAC,KAAK,KAAK;AAChD,cAAM,cAAc,MAAM,KAAK,KAAK,iBAAiB,aAAa,CAAC,EAAE;AAAA,UACnE,CAAC,OAAO,GAAG,YAAY,KAAK,EAAE,YAAY,EAAE,QAAQ,MAAM,MAAM;AAAA,QAClE;AACA,YAAI,aAAa;AACf,eAAK,eAAe,CAAC,GAAG,YAAY,WAAW,QAAQ,EAAE,QAAQ,WAAW;AAC5E,eAAK,kBAAkB;AAAA,QACzB;AAAA,MACF;AAGA,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB,WAAW,KAAK,mBAAmB,GAAI;AAAA,IAC9D;AAEA,+BAAsB,MAAM;AAG1B,UAAI,KAAK,GAAG,cAAc;AACxB,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,WAAK,cAAc,CAAC;AAAA,IACtB;AA6OA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,OAAQ;AACjB,WAAK,SAAS;AAEd,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAAA,MAC7C;AAEA,WAAK,qBAAqB;AAC1B,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,eAAe;AACpB,WAAK,WAAW;AAGhB,iBAAW,MAAM,KAAK,6BAA6B,GAAG,CAAC;AACvD,WAAK,GAAG,eAAe;AAAA,IACzB;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,SAAS;AACd,WAAK,eAAe;AACpB,WAAK,eAAe;AAEpB,UAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,aAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAAA,MAC9C;AACA,WAAK,YAAY;AACjB,WAAK,8BAA8B;AACnC,UAAI,KAAK,QAAQ,WAAW;AAC1B,aAAK,GAAG,MAAM;AAAA,MAChB;AACA,WAAK,GAAG,eAAe;AAAA,IACzB;AAKA;AAAA;AAAA;AAAA,iCAAwB,MAAM;AAC5B,UAAI,KAAK,QAAQ;AACf,aAAK,gCAAgC;AACrC,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AA9qBE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,cAAS,WAAW,KAAK,IAAI;AAC7B,SAAK,KAAK,MAAM,iBAAiB,EAAE;AACnC,SAAK,aAAa,SAAS,eAAe,KAAK,EAAE;AAEjD,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,eAAe;AACpB,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,cAAc,CAAC;AACpB,SAAK,GAAG,eAAe;AAGvB,SAAK,uBAAuB;AAC5B,SAAK,uBAAuB;AAC5B,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,iBAAa,KAAK,aAAa;AAC/B,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAG1B,SAAK,8BAA8B;AACnC,UAAM,QAAQ,UAAS,WAAW,QAAQ,IAAI;AAC9C,QAAI,SAAS,EAAG,WAAS,WAAW,OAAO,OAAO,CAAC;AACnD,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AAAA,EAEA,sBAAsB;AAEpB,SAAK,GAAG,iBAAiB,WAAW,KAAK,qBAAqB;AAE9D,SAAK,YAAY,iBAAiB,SAAS,KAAK,oBAAoB;AACpE,QAAI,KAAK,YAAY,cAAc,oBAAoB,GAAG;AACxD,WAAK,WAAW,iBAAiB,aAAa,KAAK,mBAAmB;AAAA,IACxE;AAEA,QAAI,KAAK,QAAQ,OAAO;AACtB,WAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,WAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,WAAK,WAAW,iBAAiB,cAAc,KAAK,iBAAiB;AAAA,IAEvE,OAAO;AACL,WAAK,GAAG,iBAAiB,SAAS,KAAK,YAAY;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,uBAAuB;AAIrB,SAAK,GAAG,oBAAoB,WAAW,KAAK,qBAAqB;AACjE,SAAK,YAAY,oBAAoB,SAAS,KAAK,oBAAoB;AACvE,SAAK,YAAY,oBAAoB,aAAa,KAAK,mBAAmB;AAC1E,QAAI,KAAK,QAAQ,OAAO;AACtB,WAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,WAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,WAAK,YAAY,oBAAoB,cAAc,KAAK,iBAAiB;AAAA,IAC3E,OAAO;AACL,WAAK,GAAG,oBAAoB,SAAS,KAAK,YAAY;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,+BAA+B;AAC7B,aAAS,KAAK,iBAAiB,SAAS,KAAK,oBAAoB;AACjE,aAAS,KAAK,iBAAiB,aAAa,KAAK,0BAA0B,EAAE,SAAS,KAAK,CAAC;AAC5F,SAAK,YAAY,iBAAiB,WAAW,KAAK,sBAAsB;AACxE,WAAO,iBAAiB,UAAU,KAAK,mBAAmB;AAAA,EAC5D;AAAA,EAEA,gCAAgC;AAC9B,aAAS,KAAK,oBAAoB,SAAS,KAAK,oBAAoB;AACpE,aAAS,KAAK,oBAAoB,aAAa,KAAK,wBAAwB;AAC5E,SAAK,YAAY,oBAAoB,WAAW,KAAK,sBAAsB;AAC3E,WAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAAA,EAC/D;AAAA,EAqFQ,uBAAuB,QAAqB;AAClD,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,UAAM,KAAK,OAAO,QAAQ,IAAI;AAC9B,QAAI,CAAC,MAAM,CAAC,KAAK,WAAW,SAAS,EAAE,EAAG,QAAO;AACjD,UAAM,UAAU,GAAG,cAAc,eAAe;AAChD,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,CAAC,QAAQ,SAAS,MAAM;AAAA,EACjC;AAAA,EAEQ,iBAAiB;AACvB,SAAK,YAAY,iBAAiB,IAAI,EAAE,QAAQ,CAAC,OAAO;AACtD,UAAI,CAAC,GAAG,cAAc,eAAe,EAAG;AACxC,YAAM,UAAU,GAAG,cAAc,4CAA4C,KAAK;AAClF,cAAQ,aAAa,iBAAiB,MAAM;AAC5C,cAAQ,aAAa,iBAAiB,OAAO;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,IAAiB;AACtC,UAAM,OAAO,CAAC,GAAG,UAAU,SAAS,MAAM;AAC1C,OAAG,eAAe,iBAAiB,kBAAkB,EAAE,QAAQ,CAAC,UAAU;AACxE,UAAI,UAAU,IAAI;AAChB,cAAM,UAAU,OAAO,QAAQ,eAAe;AAC9C,aAAK,iBAAiB,OAAsB,KAAK;AAAA,MACnD;AAAA,IACF,CAAC;AACD,OAAG,UAAU,OAAO,QAAQ,IAAI;AAChC,QAAI,KAAM,MAAK,cAAc,EAAE;AAC/B,SAAK,iBAAiB,IAAI,IAAI;AAAA,EAChC;AAAA,EAEQ,iBAAiB,IAAiB,MAAe;AACvD,UAAM,UAAU,GAAG,cAAc,4CAA4C,KAAK;AAClF,YAAQ,aAAa,iBAAiB,OAAO,SAAS,OAAO;AAAA,EAC/D;AAAA,EAWQ,cAAc,IAAiB;AACrC,UAAM,OAAO,GAAG,cAAc,eAAe;AAC7C,QAAI,CAAC,KAAM;AACX,UAAM,YAAY,iBAAiB,IAAI,EAAE,YAAY;AACrD,QAAI,UAAW,MAAK,MAAM,UAAU;AACpC,OAAG,UAAU,OAAO,eAAe;AACnC,UAAM,OAAO,KAAK,sBAAsB;AACxC,QAAI,KAAK,QAAQ,OAAO,aAAa,EAAG,IAAG,UAAU,IAAI,eAAe;AACxE,QAAI,UAAW,MAAK,MAAM,UAAU;AAAA,EACtC;AAAA,EAEQ,iBAAiB;AACvB,SAAK,YAAY,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AAC3D,SAAG,UAAU,OAAO,QAAQ,eAAe;AAC3C,WAAK,iBAAiB,IAAmB,KAAK;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,GAA8B;AACvD,UAAM,SAAS,EAAE;AACjB,QAAI,EAAE,kBAAkB,SAAU,QAAO;AACzC,UAAM,UAAU,OAAO,QAAQ,WAAW;AAC1C,QAAI,mBAAmB,eAAe,KAAK,YAAY,SAAS,OAAO,EAAG,QAAO;AACjF,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,GAA8B;AAChD,UAAM,SAAS,EAAE;AACjB,QAAI,EAAE,kBAAkB,SAAU,QAAO;AACzC,UAAM,KAAK,OAAO,QAAQ,IAAI;AAC9B,QAAI,cAAc,eAAe,KAAK,YAAY,SAAS,EAAE,EAAG,QAAO;AACvE,WAAO;AAAA,EACT;AAAA,EA+HA,uBAAuB;AACrB,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,gCAAgC;AACrC,SAAK,WAAW,MAAM,YAAY;AAClC,SAAK,WAAW,MAAM,UAAU;AAAA,EAClC;AAAA,EAEA,kCAAkC;AAChC,SAAK,WAAW,MAAM,QAAQ;AAC9B,SAAK,WAAW,MAAM,SAAS;AAC/B,SAAK,WAAW,MAAM,OAAO;AAC7B,SAAK,WAAW,MAAM,MAAM;AAC5B,SAAK,WAAW,MAAM,kBAAkB;AAAA,EAC1C;AAAA,EAEA,uBAAuB,cAA2B,MAAM;AACtD,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,QAAQ,UAAU,OAAO,KAAK,UAAU;AAC7C;AAAA,IACF;AACA,QAAI,aAAa;AACf,UAAI,CAAC,YAAY,SAAS,KAAK,UAAU,EAAG,aAAY,OAAO,KAAK,UAAU;AAC9E;AAAA,IACF;AACA,SAAK,GAAG,MAAM,KAAK,UAAU;AAAA,EAC/B;AAAA,EAEA,yBAAyB;AACvB,QAAI,CAAC,KAAK,WAAY;AACtB,SAAK,WAAW,UAAU;AAE1B,SAAK,WAAW,WAAW;AAE3B,SAAK,WAAW,iBAAiB,wBAAwB,EAAE,QAAQ,CAAC,OAAO;AACzE,UAAI,cAAc,iBAAiB,GAAG,UAAU,SAAS,SAAS,GAAG;AACnE,WAAG,aAAa,YAAY,IAAI;AAChC;AAAA,MACF;AACA,UAAI,CAAC,GAAG,aAAa,UAAU,EAAG,IAAG,aAAa,YAAY,GAAG;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB;AAClB,QACE,KAAK,gBAAgB,KACrB,KAAK,eAAe,KAAK,WAAW,SAAS,UAC7C,KAAK,QAAQ,WACb;AACA,MAAC,KAAK,WAAW,SAAS,KAAK,YAAY,EAAkB,MAAM;AAAA,QACjE,eAAe;AAAA,MACjB,CAAC;AACD,WAAK,WAAW,SAAS,KAAK,YAAY,EAAE,eAAe;AAAA,QACzD,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,qBAAqB,uBAAoC;AAEvD,UAAM,eAAe,KAAK,GAAG,sBAAsB;AACnD,UAAM,gBAAgB,KAAK,WAAW,sBAAsB;AAE5D,QAAI,cAAc,cAAc;AAChC,QAAI,aAAa,cAAc;AAC/B,QAAI,YAAY,aAAa,OAAO,cAAc;AAClD,QAAI,YAAY,aAAa,MAAM,cAAc;AAEjD,UAAM,iBAAiB;AAAA,MACrB,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM;AAAA,MACvB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,QAAQ,eAAe,IAAI,aAAa;AAAA,IAC/C;AAEA,QAAI,oBAAoB;AACxB,QAAI,sBAAsB,KAAK,QAAQ;AACvC,iBAAa,KAAK,QAAQ,eAAe,IAAI,aAAa;AAG1D,SAAK,eAAe;AAEpB,QAAI,CAAC,WAAW,KAAK;AACnB,UAAI,WAAW,QAAQ;AACrB,4BAAoB;AAEpB,YAAI,CAAC,KAAK,QAAQ,cAAc;AAC9B,uBAAa,aAAa;AAAA,QAC5B;AAAA,MACF,OAAO;AACL,aAAK,eAAe;AAGpB,uBAAe;AACf,YAAI,WAAW,aAAa,WAAW,eAAe;AACpD,8BAAoB;AACpB,yBAAe,WAAW;AAC1B,uBAAa,KAAK,QAAQ,eACtB,WAAW,aAAa,KACxB,WAAW,aAAa,KAAK,aAAa;AAAA,QAChD,OAAO;AACL,yBAAe,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,mBAAmB,GAAG;AACpC,YAAM,oBAAoB,wBAAwB,SAAS,UAAU;AACrE,UAAI,WAAW,iBAAiB,GAAG;AACjC,8BAAsB;AAAA,MACxB,OAAO;AAEL,YAAI,WAAW,cAAc,WAAW,cAAc;AACpD,gCAAsB;AACtB,wBAAc,WAAW;AACzB,uBAAa,WAAW;AAAA,QAC1B,OAAO;AACL,gCAAsB;AACtB,wBAAc,WAAW;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,sBAAsB,UAAU;AAClC,kBACE,YAAY,cAAc,UAAU,KAAK,QAAQ,eAAe,aAAa,SAAS;AAAA,IAC1F;AACA,QAAI,wBAAwB,SAAS;AACnC,kBAAY,YAAY,cAAc,QAAQ,aAAa;AAAA,IAC7D;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa;AACX,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,WAAW,MAAM,aAAa;AAEnC,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,WAAW,MAAM,YAAY;AAClC,eAAW,MAAM;AAEf,WAAK,WAAW,MAAM,aAAa,WAAW,QAAQ,sBAAsB,QAAQ;AAEpF,WAAK,WAAW,MAAM,UAAU;AAChC,WAAK,WAAW,MAAM,YAAY;AAAA,IACpC,GAAG,CAAC;AACJ,eAAW,MAAM;AACf,UAAI,KAAK,QAAQ,UAAW,MAAK,WAAW,MAAM;AAClD,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,IAC7F,GAAG,QAAQ;AAAA,EACb;AAAA,EAEA,cAAc;AACZ,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,WAAW,MAAM,aAAa,WAAW,QAAQ,sBAAsB,QAAQ;AAEpF,SAAK,WAAW,MAAM,UAAU;AAChC,SAAK,WAAW,MAAM,YAAY;AAClC,eAAW,MAAM;AACf,WAAK,qBAAqB;AAC1B,UAAI,OAAO,KAAK,QAAQ,eAAe;AACrC,aAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C,GAAG,QAAQ;AAAA,EACb;AAAA,EAEQ,oBAAoB,IAAiB,WAA+C;AAC1F,QAAI,WAAW,GAAG;AAClB,WAAO,aAAa,QAAQ,aAAa,UAAU;AACjD,UAAI,UAAU,QAAQ,GAAG;AACvB,eAAoB;AAAA,MACtB;AACA,iBAAW,SAAS;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,iBAAiB;AAEf,QAAI,wBAAqC,KAAK;AAAA,MAC5C,KAAK;AAAA,MACL,CAAC,aAA0B;AACzB,eACE,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,SAAS,OAAO,KAC3C,iBAAiB,QAAQ,EAAE,aAAa;AAAA,MAE5C;AAAA,IACF;AAEA,QAAI,CAAC,uBAAuB;AAC1B,8BACG,CAAC,CAAC,KAAK,WAAW,eAAe,KAAK,WAAW,eAAe,KAAK,WAAW;AAAA,IAErF;AAEA,QAAI,iBAAiB,qBAAqB,EAAE,aAAa;AACvD,4BAAsB,MAAM,WAAW;AAKzC,UAAM,aAAa,KAAK,QAAQ,iBAC5B,KAAK,GAAG,sBAAsB,EAAE,QAChC,KAAK,WAAW,sBAAsB,EAAE;AAC5C,SAAK,WAAW,MAAM,QAAQ,aAAa;AAE3C,UAAM,eAAe,KAAK,qBAAqB,qBAAqB;AACpE,SAAK,WAAW,MAAM,OAAO,aAAa,IAAI;AAC9C,SAAK,WAAW,MAAM,MAAM,aAAa,IAAI;AAC7C,SAAK,WAAW,MAAM,SAAS,aAAa,SAAS;AACrD,SAAK,WAAW,MAAM,QAAQ,aAAa,QAAQ;AACnD,SAAK,WAAW,MAAM,kBAAkB,GACtC,aAAa,wBAAwB,SAAS,MAAM,MACtD,IAAI,aAAa,sBAAsB,QAAQ,MAAM,MAAM;AAAA,EAC7D;AAoDF;AAjsBa,UACJ,aAAyB,CAAC;AAD5B,IAAM,WAAN;;;ACnBP,IAAMC,aAAiC;AAAA,EACrC,MAAM,CAAC;AAAA;AAAA,EACP,gBAAgB;AAAA;AAAA,EAChB,iBAAiB;AAAA;AAAA,IAEf,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,WAAW;AAAA;AAAA,EACX,eAAe;AAAA,EACf,UAAU,CAAC,MAAc,iBAA+B;AACtD,UAAM,aAAa,KAAK,kBAAkB;AAC1C,iBAAa;AAAA,MAEX,aAAa,QAAQ,KAAK;AAAA,QAAO,CAAC,WAChC,OAAO,GAAG,SAAS,EAAE,kBAAkB,EAAE,SAAS,UAAU,KACvD,OAAO,MAAM,kBAAkB,EAAE,SAAS,UAAU;AAAA,MAE3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,UAAU,CAAC;AACb;AAEO,IAAM,gBAAN,MAAM,sBAAqB,UAA+B;AAAA,EAkB/D,YAAY,IAAsB,SAAuC;AACvE,UAAM,IAAI,SAAS,aAAY;AA4KjC,4BAAmB,MAAM;AACvB,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,MAAM;AACX,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,6BAAoB,CAAC,MAAqB;AACxC,UAAI,EAAE,SAAS,QAAS,eAAa,WAAW;AAChD,WAAK,QAAQ;AACb,YAAM,cAAc,KAAK,GAAG,MAAM,kBAAkB;AAEpD,UACE,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAC/B,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAClC,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG;AAEpC;AAGF,UAAI,KAAK,WAAW,eAAe,MAAM,YAAY;AACnD,aAAK,KAAK;AAAA,MACZ;AACA,WAAK,sBAAsB,WAAW;AAAA,IACxC;AAEA,6BAAoB,MAAM;AACxB,WAAK,QAAQ;AACb,YAAM,cAAc,KAAK,GAAG,MAAM,kBAAkB;AACpD,WAAK,sBAAsB,WAAW;AAAA,IACxC;AAEA,iCAAwB,CAAC,UAAkB;AAEzC,UAAI,KAAK,WAAW,OAAO;AACzB,aAAK,kBAAkB;AACvB,aAAK,QAAQ,SAAS,KAAK,GAAG,OAAO,IAAI;AAAA,MAC3C;AAEA,UAAI,CAAC,KAAK,QAAQ,iBAAiB,KAAK,GAAG,MAAM,WAAW,GAAG;AAC7D,aAAK,iBAAiB,CAAC;AACvB,aAAK,gBAAgB;AAAA,MACvB;AACA,WAAK,SAAS;AAAA,IAChB;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,oBAAa,WAAW;AAExB,YAAM,WAAW,KAAK,UAAU,iBAAiB,IAAI,EAAE;AAEvD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,KAAK,eAAe,GAAG;AAC7D,cAAM,YAAY,KAAK,UAAU,iBAAiB,IAAI,EAAE,KAAK,WAAW;AACxE,YAAI,WAAW;AACb,eAAK,aAAa,UAAU,aAAa,SAAS,CAAC;AACnD,YAAE,eAAe;AAAA,QACnB;AACA;AAAA,MACF;AAEA,UAAI,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChF,UAAE,eAAe;AACjB,YAAI,MAAM,KAAK,SAAS,SAAS,EAAE,GAAG,KAAK,KAAK,cAAc,EAAG,MAAK;AACtE,YAAI,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,KAAK,KAAK,cAAc,WAAW;AACzE,eAAK;AACP,aAAK,SAAS,UAAU,OAAO,QAAQ;AACvC,YAAI,KAAK,eAAe,GAAG;AACzB,eAAK,UAAU,KAAK,UAAU,iBAAiB,IAAI,EAAE,KAAK,WAAW;AACrE,eAAK,SAAS,UAAU,IAAI,QAAQ;AAEpC,eAAK,UAAU,SAAS,KAAK,WAAW,EAAE,eAAe;AAAA,YACvD,UAAU;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,WAAK,KAAK;AAAA,IACZ;AAEA,kDAAyC,MAAM;AAC7C,WAAK,aAAa;AAAA,IACpB;AAEA,8CAAqC,MAAM;AACzC,WAAK,aAAa;AAAA,IACpB;AAkJA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,YAAM,YAAY,KAAK,GAAG,MAAM,kBAAkB;AAClD,WAAK,mBAAmB;AACxB,UAAI,UAAU,UAAU,KAAK,QAAQ,WAAW;AAC9C,aAAK,SAAS;AACd,aAAK,gBAAgB;AAAA,MACvB;AAEA,UAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,mBAAW,MAAM;AACf,eAAK,SAAS,KAAK;AAAA,QACrB,GAAG,CAAC;AAAA,MACN,MAAO,MAAK,SAAS,sBAAsB;AAAA,IAC7C;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,SAAS,MAAM;AAAA,IACtB;AA1aE,SAAK,GAAG,yBAAyB,IAAI;AAErC,SAAK,UAAU;AAAA,MACb,GAAG,cAAa;AAAA,MAChB,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,SAAS;AACd,SAAK,iBAAiB,KAAK,kBAAkB,KAAK,QAAQ,SAAS,IAAI,CAAC,WAA4B,EAAE,IAAI,MAAM,EAAC,KAAK,CAAC;AACvH,SAAK,YAAY,KAAK,QAAQ,QAAQ,CAAC;AACvC,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAgC;AACzC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAwC,CAAC,GACV;AAC/B,WAAO,MAAM,KAAK,KAAK,SAAS,aAAY;AAAA,EAC9C;AAAA,EAEA,OAAO,YAAY,IAA+B;AAChD,WAAO,GAAG,yBAAyB;AAAA,EACrC;AAAA,EAWA,OAAe,oBAAiC;AAC9C,QAAI,CAAC,cAAa,kBAAkB;AAClC,YAAM,WAAW,SAAS,cAAc,UAAU;AAClD,eAAS,YAAY;AAAA;AAAA;AAAA;AAAA;AAKrB,oBAAa,mBAAmB,SAAS,QAAQ;AAAA,IACnD;AACA,WAAO,cAAa,iBAAiB,UAAU,IAAI;AAAA,EACrD;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,gBAAgB;AACrB,SAAK,GAAG,yBAAyB,IAAI;AAAA,EACvC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,QAAQ,KAAK,gBAAgB;AACtD,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,UAAU,iBAAiB,aAAa,KAAK,sCAAsC;AACxF,SAAK,UAAU,iBAAiB,WAAW,KAAK,kCAAkC;AAClF,QAAI,OAAO,OAAO,iBAAiB,aAAa;AAC9C,WAAK,UAAU,iBAAiB,cAAc,KAAK,sCAAsC;AACzF,WAAK,UAAU,iBAAiB,YAAY,KAAK,kCAAkC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,QAAQ,KAAK,gBAAgB;AACzD,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAC/D,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,UAAU,oBAAoB,aAAa,KAAK,sCAAsC;AAC3F,SAAK,UAAU,oBAAoB,WAAW,KAAK,kCAAkC;AAErF,QAAI,OAAO,OAAO,iBAAiB,aAAa;AAC9C,WAAK,UAAU,oBAAoB,cAAc,KAAK,sCAAsC;AAC5F,WAAK,UAAU,oBAAoB,YAAY,KAAK,kCAAkC;AAAA,IACxF;AAAA,EACF;AAAA,EAEA,iBAAiB;AACf,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,MAAM,YAAY,KAAK,QAAQ;AAC9C,SAAK,UAAU,KAAK,wBAAwB,MAAM,KAAK,CAAC;AACxD,SAAK,UAAU,UAAU,IAAI,sBAAsB;AACnD,SAAK,UAAU,eAAe;AAC9B,SAAK,GAAG,aAAa,eAAe,KAAK,UAAU,EAAE;AAErD,SAAK,UAAU,QAAQ,CAAC,aAAa;AACnC,YAAM,cAAc,KAAK,oBAAoB,QAAQ;AACrD,WAAK,UAAU,OAAO,WAAW;AAAA,IACnC,CAAC;AAGD,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAGhD,UAAM,kBAAkB;AAAA,MACtB,GAAG,cAAa,SAAS;AAAA,MACzB,GAAG,KAAK,QAAQ;AAAA,IAClB;AAEA,UAAM,kBAAkB,gBAAgB;AAExC,oBAAgB,cAAc,CAAC,OAAO;AACpC,UAAI,CAAC,GAAI;AACT,YAAM,UAAU,GAAG,aAAa,SAAS;AACzC,WAAK,aAAa,OAAO;AAEzB,UAAI,mBAAmB,OAAO,oBAAoB;AAChD,wBAAgB,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAC/C;AACA,SAAK,WAAW,SAAS,KAAK,KAAK,IAAI,eAAe;AAItD,UAAM,QAAQ,KAAK,GAAG,cAAc,cAAc,OAAO;AACzD,QAAI,MAAO,MAAK,GAAG,MAAM,KAAK;AAG9B,SAAK,GAAG,oBAAoB,SAAS,KAAK,SAAS,YAAY;AAC/D,QAAG,CAAC,KAAK,QAAQ,iBAAiB,EAAE,KAAK,QAAQ,SAAS,WAAW,IAAI;AACvE,YAAM,gBAAgB,KAAK,UAAU,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,eAAe,CAAC,EAAE,EAAE;AAC7F,WAAK,GAAG,QAAQ,cAAc,CAAC,EAAE;AAAA,IACnC;AAEA,QAAI,KAAK,GAAG,MAAO,MAAK,aAAa,KAAK,GAAG,KAAK;AAElD,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,UAAU,IAAI,aAAa;AAC/B,QAAI,aAAa,SAAS,mCAAmC;AAC7D,SAAK,GAAG,cAAc,YAAY,GAAG;AACrC,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,kBAAkB;AAChB,SAAK,UAAU,eAAe;AAC9B,SAAK,UAAU,WAAW,YAAY,KAAK,SAAS;AAAA,EACtD;AAAA,EA6FA,+BAA+B;AAC7B,SAAK,cAAc;AACnB,SAAK,SAAS,UAAU,OAAO,QAAQ;AAAA,EACzC;AAAA,EAEA,qBAAqB;AACnB,SAAK,UAAU,gBAAgB;AAC/B,SAAK,6BAA6B;AAClC,SAAK,SAAS;AACd,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,sBAAsB,OAAe,OAAe;AAClD,UAAM,QAAQ,MAAM,kBAAkB,EAAE,QAAQ,KAAK,MAAM,kBAAkB,CAAM;AACnF,UAAM,MAAM,QAAQ,MAAM,SAAS;AAEnC,QAAI,SAAS,MAAM,OAAO,IAAI;AAC5B,aAAO,CAAC,OAAO,IAAI,EAAE;AAAA,IACvB;AACA,WAAO,CAAC,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,MAAM,MAAM,MAAM,CAAC,CAAC;AAAA,EAClF;AAAA,EAEA,oBAAoB,OAAyB;AAC3C,UAAM,OAAO,SAAS,cAAc,IAAI;AACxC,SAAK,aAAa,WAAmB,MAAM,EAAE;AAC7C,SAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AACA,SAAK,WAAW;AAEhB,QAAI,KAAK,QAAQ,eAAe;AAC9B,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,UAAU,IAAI,gBAAgB;AACxC,gBAAU,MAAM,YAAY;AAC5B,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,eAAS,UAAU,KAAK,eAAe,KAAK,CAAC,QAAQ,IAAI,OAAO,MAAM,EAAE;AACxE,YAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,aAAO,MAAM,cAAc;AAC3B,gBAAU,OAAO,UAAU,MAAM;AACjC,WAAK,YAAY,SAAS;AAAA,IAC5B;AAEA,QAAI,MAAM,OAAO;AACf,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,UAAU,IAAI,QAAQ;AAC1B,UAAI,MAAM,MAAM;AAChB,WAAK,YAAY,GAAG;AAAA,IACtB;AAGA,UAAM,YAAY,KAAK,GAAG,MAAM,kBAAkB;AAClD,UAAM,QAAQ,KAAK,sBAAsB,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AACvF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,aAAa,SAAS,kCAAkC;AAC5D,QAAI,KAAK,QAAQ,iBAAiB;AAChC,UAAI,YAAY,MAAM,CAAC,IAAI,6BAA6B,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC;AAAA,IACxF,OAAO;AACL,UAAI,YAAY,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC;AACjD,UAAI,MAAM,CAAC,GAAG;AACZ,cAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,kBAAU,cAAc,MAAM,CAAC;AAC/B,kBAAU,UAAU,IAAI,WAAW;AACnC,YAAI,YAAY,SAAS;AACzB,YAAI,YAAY,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,UAAU,IAAI,WAAW;AAClC,aAAS,aAAa,SAAS,8BAA8B;AAC7D,SAAK,YAAY,QAAQ;AACzB,SAAK,cAAc,YAAY,EAAE,YAAY,GAAG;AAEhD,QACE,OAAO,MAAM,gBAAgB,YAC5B,OAAO,MAAM,gBAAgB,YAAY,CAAC,MAAM,MAAM,WAAW,GAClE;AACA,YAAM,cAAc,SAAS,cAAc,OAAO;AAClD,kBAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AACA,kBAAY,YAAY,MAAM;AAC9B,WAAK,cAAc,YAAY,EAAE,YAAY,WAAW;AAAA,IAC1D;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,KAAK,QAAQ,eAAe;AAC9B,YAAI,MAAM,MAAO,QAAO;AACxB,eAAO;AAAA,MACT;AACA,UAAI,MAAM,MAAO,QAAO;AACxB,aAAO;AAAA,IACT;AACA,SAAK,MAAM,sBAAsB,cAAc;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,kBAAkB;AAChB,SAAK,mBAAmB;AAExB,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;AAC9C,YAAM,OAAO,KAAK,oBAAoB,KAAK,UAAU,CAAC,CAAC;AACvD,WAAK,UAAU,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,UAAM,gBAAgB,KAAK,GAAG,cAAc,cAAc,cAAc;AACxE,QAAI,cAAe,eAAc,gBAAgB,cAAa,kBAAkB,CAAC;AAAA,EACnF;AAAA,EAEA,sBAAsB;AACpB,UAAM,gBAAgB,KAAK,GAAG,cAAc,cAAc,cAAc;AACxE,QAAI,eAAe;AACjB,UAAI,KAAK,QAAQ;AACf,sBAAc,cAAc,KAAK,eAAe,OAAO,SAAS;AAAA,UAC7D,eAAc,gBAAgB;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,QAAI,KAAK,eAAe,WAAW,GAAG;AACpC,YAAM,QAAQ,KAAK,eAAe,CAAC;AACnC,WAAK,GAAG,QAAQ,MAAM,QAAgB,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,kBAAkB;AAChB,SAAK,GAAG,cAAc,IAAI,MAAM,QAAQ,CAAC;AAEzC,QAAI,OAAO,KAAK,QAAQ,mBAAmB;AACzC,WAAK,QAAQ,eAAe,KAAK,MAAM,KAAK,cAAc;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,aAAa,WAA+B,WAAgC,MAAM,OAAgB,MAAM;AACtG,SAAK,YAAY;AACjB,SAAK,QAAQ,OAAO;AACpB,QAAI,UAAU;AACZ,WAAK,iBAAiB,KAAK,UAAU;AAAA,QACnC,CAAC,SAAS,EAAE,SAAS,QAAe,KAAK,EAAE,MAAM;AAAA,MACnD;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,eAAe;AAC9B,WAAK,gBAAgB;AAAA,IACvB,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAM,MAAK,KAAK;AACpB,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,IAAqB;AAChC,UAAM,QAAQ,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;AACzD,QAAI,CAAC,MAAO;AAIZ,QAAI,KAAK,QAAQ,eAAe;AAG9B,UAAI,EAAE,KAAK,eAAe;AAAA,QACxB,CAAC,kBAAkB,cAAc,OAAO,MAAM;AAAA,MAChD,EAAE,UAAU,GAAI,MAAK,eAAe,KAAK,KAAK;AAAA,UACzC,MAAK,iBAAiB,KAAK,eAAe;AAAA,QAC7C,CAAC,kBAAkB,cAAc,OAAO,MAAM;AAAA,MAChD;AACA,WAAK,gBAAgB;AACrB,WAAK,GAAG,MAAM;AAAA,IAChB,OAAO;AAEL,WAAK,iBAAiB,CAAC,KAAK;AAC5B,WAAK,kBAAkB;AACvB,WAAK,mBAAmB;AACxB,WAAK,MAAM;AAAA,IACb;AACA,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAvfa,cAiFI,mBAAgC;AAjF1C,IAAM,eAAN;;;ACxBP,IAAMC,aAA0B;AAAA,EAC9B,MAAM,CAAC;AAAA,EACP,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,qBAAqB,CAAC;AAAA,EACtB,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,SAAN,MAAM,eAAc,UAAwB;AAAA,EAajD,YAAY,IAAiB,SAAgC;AAC3D,UAAM,IAAI,SAAS,MAAK;AAiG1B,4BAAmB,CAAC,MAAkB;AACpC,YAAM,QAAsB,EAAE,OAAQ,QAAQ,OAAO;AACrD,YAAM,eAA6B,EAAE,OAAQ,UAAU,SAAS,OAAO;AACvE,UAAI,OAAO;AAIT,cAAM,QAAQ,KAAK,OAAO,QAAQ,KAAoB;AACtD,YAAI,QAAQ,EAAG;AACf,YAAI,cAAc;AAChB,eAAK,WAAW,KAAK;AACrB,eAAK,OAAO,MAAM;AAAA,QACpB,OAAO;AACL,eAAK,WAAW,KAAK;AAAA,QACvB;AAAA,MAEF,OAAO;AACL,aAAK,OAAO,MAAM;AAAA,MACpB;AAAA,IACF;AAqDA,6BAAoB,MAAM;AACxB,WAAK,GAAG,UAAU,IAAI,OAAO;AAAA,IAC/B;AAEA,4BAAmB,MAAM;AACvB,WAAK,GAAG,UAAU,OAAO,OAAO;AAAA,IAClC;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,aAAM,WAAW;AACjB,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AAEpC,YAAI,KAAK,mBAAmB,KAAK,gBAAgB,KAAK,aAAa,QAAQ;AACzE;AAAA,QACF;AACA,UAAE,eAAe;AACjB,YAAI,CAAC,KAAK,mBAAoB,KAAK,mBAAmB,CAAC,KAAK,QAAQ,kBAAmB;AACrF,eAAK,QAAQ,EAAE,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA,QACxC;AACA,aAAK,OAAO,QAAQ;AAAA,MACtB,YACG,MAAM,KAAK,UAAU,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,MAC7E,KAAK,OAAO,UAAU,MACtB,KAAK,UAAU,QACf;AACA,UAAE,eAAe;AACjB,aAAK,WAAW,KAAK,UAAU,SAAS,CAAC;AAAA,MAC3C;AAAA,IACF;AApME,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,GAAG,UAAU,IAAI,OAAO;AAC7B,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AAGf,QAAI,KAAK,QAAQ,KAAK,QAAQ;AAC5B,WAAK,YAAY,KAAK,QAAQ;AAC9B,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,WAAK,GAAG,UAAU,IAAI,OAAO;AAC7B,WAAK,YAAY;AACjB,WAAK,oBAAoB;AAEzB,WAAK,GAAG,OAAO,KAAK,MAAM;AAAA,IAC5B;AAGA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAiC,CAAC,GACjB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,UAAU;AACR,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,WAAK,qBAAqB;AAAA,IAC5B;AACA,SAAK,OAAO,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;AACrC,SAAK,SAAS,CAAC;AACf,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,gBAAgB;AAEvD,aAAS,iBAAiB,WAAW,OAAM,mBAAmB;AAC9D,aAAS,iBAAiB,SAAS,OAAM,iBAAiB;AAC1D,SAAK,GAAG,iBAAiB,QAAQ,OAAM,kBAAkB,IAAI;AAC7D,SAAK,OAAO,iBAAiB,SAAS,KAAK,iBAAiB;AAC5D,SAAK,OAAO,iBAAiB,QAAQ,KAAK,gBAAgB;AAC1D,SAAK,OAAO,iBAAiB,WAAW,KAAK,mBAAmB;AAAA,EAClE;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,gBAAgB;AAC1D,aAAS,oBAAoB,WAAW,OAAM,mBAAmB;AACjE,aAAS,oBAAoB,SAAS,OAAM,iBAAiB;AAC7D,SAAK,GAAG,oBAAoB,QAAQ,OAAM,kBAAkB,IAAI;AAChE,SAAK,OAAO,oBAAoB,SAAS,KAAK,iBAAiB;AAC/D,SAAK,OAAO,oBAAoB,QAAQ,KAAK,gBAAgB;AAC7D,SAAK,OAAO,oBAAoB,WAAW,KAAK,mBAAmB;AAAA,EACrE;AAAA,EAuBA,OAAO,oBAAoB,GAAkB;AAC3C,WAAM,WAAW;AACjB,UAAM,QAAsB,EAAE,OAAQ,QAAQ,QAAQ;AACtD,UAAM,eAAe,EAAE,UAAU;AAGjC,UAAM,MAAoB,EAAE,OAAQ;AACpC,QAAI,QAAQ,WAAW,QAAQ,cAAc,CAAC,aAAc;AAE5D,UAAM,YAAmB,MAAM,kBAAkB;AACjD,QAAI,CAAC,UAAW;AAEhB,QAAI,MAAM,KAAK,UAAU,SAAS,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,SAAS,EAAE,GAAG,GAAG;AAC7E,QAAE,eAAe;AACjB,UAAI,cAAc,UAAU,UAAU;AACtC,UAAI,UAAU,eAAe;AAC3B,cAAM,QAAQ,UAAU,OAAO,QAAQ,UAAU,aAAa;AAC9D,kBAAU,WAAW,KAAK;AAC1B,kBAAU,gBAAgB;AAE1B,sBAAc,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,MACrC;AACA,UAAI,UAAU,UAAU,OAAQ,WAAU,WAAW,WAAW;AAAA,UAC3D,WAAU,OAAO,MAAM;AAAA,IAC9B,WAAW,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChD,UAAI,UAAU,eAAe;AAC3B,cAAM,cAAc,UAAU,OAAO,QAAQ,UAAU,aAAa,IAAI;AACxE,YAAI,cAAc,EAAG;AACrB,kBAAU,WAAW,WAAW;AAAA,MAClC;AAAA,IACF,WAAW,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG,GAAG;AACjD,UAAI,UAAU,eAAe;AAC3B,cAAM,cAAc,UAAU,OAAO,QAAQ,UAAU,aAAa,IAAI;AACxE,YAAI,eAAe,UAAU,UAAU,OAAQ,WAAU,OAAO,MAAM;AAAA,YACjE,WAAU,WAAW,WAAW;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,oBAAoB;AACzB,WAAM,WAAW;AAAA,EACnB;AAAA,EAEA,OAAO,iBAAiB,GAAU;AAChC,QAAI,CAAC,OAAM,YAAY,SAAS,QAAQ;AACtC,YAAM,QAAsB,EAAE,OAAQ,QAAQ,QAAQ;AACtD,YAAM,YAAmB,QAAQ,kBAAkB;AACnD,UAAI,UAAW,WAAU,gBAAgB;AAAA,IAC3C;AAAA,EACF;AAAA,EAgCA,YAAY,MAAgC;AAC1C,QAAI,CAAC,KAAK,GAAI;AACd,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,UAAU,IAAI,MAAM;AACjC,iBAAa,YAAY,KAAK,QAAgB,KAAK;AAEnD,QAAI,KAAK,OAAO;AACd,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,aAAa,OAAO,KAAK,KAAK;AAClC,mBAAa,aAAa,KAAK,aAAa,UAAU;AAAA,IACxD;AACA,QAAI,KAAK,QAAQ,gBAAgB;AAC/B,mBAAa,aAAa,YAAY,GAAG;AACzC,YAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,gBAAU,UAAU,IAAI,KAAK,QAAQ,gBAAgB,OAAO;AAC5D,gBAAU,YAAY;AACtB,mBAAa,YAAY,SAAS;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe;AACb,SAAK,SAAS,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;AAC9C,YAAM,WAAW,KAAK,YAAY,KAAK,UAAU,CAAC,CAAC;AACnD,WAAK,GAAG,YAAY,QAAQ;AAC5B,WAAK,OAAO,KAAK,QAAQ;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,oBAAoB,iBAAiB,CAAC,UAAU;AAC3D,UAAI,MAAM,SAAS;AACjB,aAAK,QAAQ;AAAA,UACX,IAAI,MAAM,CAAC,EAAE;AAAA,UACb,MAAM,MAAM,CAAC,EAAE;AAAA,UACf,OAAO,MAAM,CAAC,EAAE;AAAA,QAClB,CAAC;AACH,WAAK,OAAO,QAAQ;AACpB,WAAK,OAAO,MAAM;AAAA,IACpB;AACA,SAAK,eAAe,aAAa,KAAK,KAAK,QAAQ,KAAK,QAAQ,mBAAmB;AAAA,EACrF;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,KAAK,GAAG,cAAc,OAAO;AAC3C,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,SAAS,cAAc,OAAO;AAC5C,WAAK,GAAG,OAAO,KAAK,MAAM;AAAA,IAC5B;AACA,SAAK,OAAO,UAAU,IAAI,OAAO;AACjC,SAAK,kBAAkB,OAAO,KAAK,KAAK,QAAQ,mBAAmB,EAAE,SAAS;AAE9E,QAAI,KAAK,gBAAiB,MAAK,mBAAmB;AAClD,SAAK,gBAAgB;AAErB,QAAI,CAAC,KAAK,OAAO,aAAa,IAAI,EAAG,MAAK,OAAO,aAAa,MAAM,MAAM,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,cAAc;AACZ,SAAK,SAAS,KAAK,GAAG,cAAc,OAAO;AAE3C,QAAI,KAAK,UAAU,KAAK,OAAQ,MAAK,OAAO,aAAa,OAAO,KAAK,OAAO,aAAa,IAAI,CAAC;AAAA,EAChG;AAAA,EAEA,kBAAkB;AAChB,QAAI,KAAK,cAAc,UAAa,CAAC,KAAK,UAAU,UAAU,KAAK,QAAQ,aAAa;AACtF,WAAK,OAAO,cAAc,KAAK,QAAQ;AAAA,IACzC,YACG,KAAK,cAAc,UAAa,CAAC,CAAC,KAAK,UAAU,WAClD,KAAK,QAAQ,sBACb;AACA,WAAK,OAAO,cAAc,KAAK,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,oBAAoB,MAAgB;AAClC,UAAM,UAAU,CAAC,CAAC,KAAK;AACvB,UAAM,eAAe,CAAC,KAAK,UAAU,KAAK,CAAC,SAAS,KAAK,MAAM,KAAK,EAAE;AACtE,WAAO,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAgB;AACtB,QAAI,CAAC,KAAK,oBAAoB,IAAI,KAAK,KAAK,UAAU,UAAU,KAAK,QAAQ,MAAO;AACpF,UAAM,eAAe,KAAK,YAAY,IAAI;AAC1C,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,UAAU,KAAK,IAAI;AACxB,SAAK,OAAO,OAAO,YAAY;AAC/B,SAAK,gBAAgB;AAErB,QAAI,OAAO,KAAK,QAAQ,cAAc,YAAY;AAChD,WAAK,QAAQ,UAAU,KAAK,IAAI,YAAY;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAmB;AAC5B,UAAM,OAAO,KAAK,OAAO,SAAS;AAClC,QAAI,CAAC,KAAM;AACX,SAAK,OAAO;AACZ,SAAK,OAAO,OAAO,WAAW,CAAC;AAC/B,SAAK,UAAU,OAAO,WAAW,CAAC;AAClC,SAAK,gBAAgB;AAErB,QAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,WAAK,QAAQ,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAmB;AAC5B,UAAM,OAAO,KAAK,OAAO,SAAS;AAClC,QAAI,CAAC,KAAM;AACX,SAAK,gBAAgB;AACrB,SAAK,MAAM;AAEX,QAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,WAAK,QAAQ,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAKZ,UAAM,gBAAgB,MAAM;AAC1B,YAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAChD,YAAM,QAAQ,CAAC,OAAO;AACpB,WAAG,iBAAiB,SAAS,CAAC,MAAM;AAClC,cAAI,GAAG,kBAAkB,EAAG;AAC5B,cAAkB,EAAE,OAAQ,UAAU,SAAS,OAAO,GAAG;AACvD,kBAAM,OAAqB,EAAE,OAAQ,QAAQ,OAAO;AACpD,gBAAI,KAAM,MAAK,OAAO;AAAA,UACxB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAKF;AAFI,OAAM,WAAW;AA5Wd,IAAM,QAAN;;;ACrFP,IAAMC,aAA0B,CAAC;AAE1B,IAAM,QAAN,MAAM,eAAc,UAAwB;AAAA,EAMjD,YAAY,IAAsB,SAAgC;AAChE,UAAM,IAAI,SAAS,MAAK;AAsF1B,8BAAqB,MAAM;AACzB,WAAK,MAAM;AACX,WAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,IACnC;AAEA,2CAAkC,CAAC,MAA+B;AAChE,WAAK,aAAa;AAClB,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,MAAM;AACX,UAAI,EAAE,SAAS,SAAS;AACtB,aAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,+CAAsC,MAAM;AAC1C,UAAI,KAAK,YAAY;AACnB,aAAK,MAAM;AACX,aAAK,MAAM,UAAU,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,uCAA8B,MAAM;AAClC,WAAK,aAAa;AAClB,WAAK,GAAG,UAAU,OAAO,QAAQ;AAAA,IACnC;AAEA,8CAAqC,MAAM;AACzC,UAAI,CAAC,KAAK,YAAY;AACpB,aAAK,MAAM,UAAU,OAAO,QAAQ;AAAA,MACtC;AAAA,IACF;AAnHE,SAAK,GAAG,kBAAkB,IAAI;AAE9B,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AAEA,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,MAAM;AACX,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAiC,CAAC,GACjB;AACjB,WAAO,MAAM,KAAK,KAAK,SAAS,MAAK;AAAA,EACvC;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,aAAa;AAClB,SAAK,GAAG,kBAAkB,IAAI;AAAA,EAChC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,UAAU,KAAK,kBAAkB;AAC1D,SAAK,GAAG,iBAAiB,aAAa,KAAK,+BAA+B;AAC1E,SAAK,GAAG,iBAAiB,cAAc,KAAK,+BAA+B;AAC3E,SAAK,GAAG,iBAAiB,SAAS,KAAK,mCAAmC;AAC1E,SAAK,GAAG,iBAAiB,aAAa,KAAK,mCAAmC;AAE9E,SAAK,GAAG,iBAAiB,aAAa,KAAK,qCAAqC;AAAA,MAC9E,SAAS;AAAA,IACX,CAAC;AACD,SAAK,GAAG,iBAAiB,WAAW,KAAK,2BAA2B;AACpE,SAAK,GAAG,iBAAiB,YAAY,KAAK,2BAA2B;AACrE,SAAK,GAAG,iBAAiB,QAAQ,KAAK,kCAAkC;AACxE,SAAK,GAAG,iBAAiB,YAAY,KAAK,kCAAkC;AAC5E,SAAK,GAAG,iBAAiB,cAAc,KAAK,kCAAkC;AAAA,EAChF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,UAAU,KAAK,kBAAkB;AAC7D,SAAK,GAAG,oBAAoB,aAAa,KAAK,+BAA+B;AAC7E,SAAK,GAAG,oBAAoB,cAAc,KAAK,+BAA+B;AAC9E,SAAK,GAAG,oBAAoB,SAAS,KAAK,mCAAmC;AAC7E,SAAK,GAAG,oBAAoB,aAAa,KAAK,mCAAmC;AACjF,SAAK,GAAG,oBAAoB,aAAa,KAAK,mCAAmC;AACjF,SAAK,GAAG,oBAAoB,WAAW,KAAK,2BAA2B;AACvE,SAAK,GAAG,oBAAoB,YAAY,KAAK,2BAA2B;AACxE,SAAK,GAAG,oBAAoB,QAAQ,KAAK,kCAAkC;AAC3E,SAAK,GAAG,oBAAoB,YAAY,KAAK,kCAAkC;AAC/E,SAAK,GAAG,oBAAoB,cAAc,KAAK,kCAAkC;AAAA,EACnF;AAAA,EAkCA,cAAc;AACZ,SAAK,QAAQ,SAAS,cAAc,MAAM;AAC1C,SAAK,QAAQ,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM,UAAU,IAAI,OAAO;AAChC,SAAK,MAAM,UAAU,IAAI,OAAO;AAChC,SAAK,MAAM,OAAO,KAAK,KAAK;AAC5B,SAAK,GAAG,MAAM,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,eAAe;AACb,SAAK,MAAM,OAAO;AAAA,EACpB;AAAA,EAEA,cAAuB;AACrB,WAAO,CAAC,CAAC,KAAK,GAAG,QAAQ,WAAW;AAAA,EACtC;AAAA,EAEA,QAAQ;AACN,UAAM,MAAM,WAAW,KAAK,GAAG,aAAa,KAAK,CAAC,KAAK;AACvD,UAAM,MAAM,WAAW,KAAK,GAAG,aAAa,KAAK,CAAC,KAAK;AACvD,UAAM,MAAM,WAAW,KAAK,GAAG,KAAK,KAAK;AACzC,UAAM,UAAU,QAAQ,MAAM,KAAK,MAAM,QAAQ,MAAM;AAKvD,UAAM,OAAO,KAAK,GAAG;AACrB,UAAM,MAAM,KAAK,GAAG;AACpB,UAAM,QAAQ,KAAK,GAAG;AACtB,UAAM,SAAS,KAAK,GAAG;AAEvB,SAAK,GAAG,MAAM,YAAY,oCAAoC,GAAG,UAAU,GAAG,GAAG;AACjF,SAAK,MAAM,cAAc,KAAK,GAAG;AACjC,QAAI,KAAK,YAAY,GAAG;AACtB,WAAK,MAAM,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC;AAC3C,WAAK,MAAM,MAAM,MAAM,GAAG,OAAO,IAAI,WAAW,MAAM;AAAA,IACxD,OAAO;AACL,WAAK,MAAM,MAAM,OAAO,GAAG,OAAO,UAAU,KAAK;AACjD,WAAK,MAAM,MAAM,MAAM,GAAG,GAAG;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AAGZ,UAAM,gBAAgB,MAAM;AAC1B,aAAM,KAAK,SAAS,iBAAiB,mBAAmB,GAAmC,CAAC,CAAC;AAAA,IAC/F,CAAC;AAAA,EACH;AACF;;;ACzKO,IAAM,WAAN,MAAM,SAAQ;AAAA,EAGnB,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAiB,eAAe,SAAQ,gBAAgB,EAAE,SAAS,KAAK,CAAC;AAClF,eAAS,iBAAiB,aAAa,SAAQ,cAAc,EAAE,SAAS,KAAK,CAAC;AAC9E,eAAS,iBAAiB,iBAAiB,SAAQ,kBAAkB,EAAE,SAAS,KAAK,CAAC;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,eAAe,OAAqB;AACzC,QAAI,CAAC,SAAQ,gBAAgB,KAAK,GAAG;AACnC,eAAQ,QAAQ;AAChB;AAAA,IACF;AACA,UAAM,SAAS,SAAQ,gBAAgB,KAAK;AAC5C,QAAI,CAAC,UAAU,CAAC,SAAQ,kBAAkB,MAAM,KAAK,CAAC,SAAQ,SAAS,OAAO,MAAM,GAAG;AACrF,eAAQ,QAAQ;AAChB;AAAA,IACF;AACA,aAAQ,QAAQ,EAAE,QAAQ,WAAW,MAAM,UAAU;AAAA,EACvD;AAAA,EAEA,OAAO,aAAa,OAAqB;AACvC,UAAM,UAAU,SAAQ;AACxB,aAAQ,QAAQ;AAChB,QAAI,CAAC,WAAW,QAAQ,cAAc,MAAM,UAAW;AACvD,QAAI,CAAC,MAAM,UAAW;AACtB,QAAI,CAAC,QAAQ,OAAO,eAAe,CAAC,QAAQ,OAAO,KAAM;AACzD,QAAI,CAAC,SAAQ,kBAAkB,QAAQ,MAAM,EAAG;AAChD,QAAI,SAAQ,gBAAgB,KAAK,MAAM,QAAQ,OAAQ;AACvD,QAAI,SAAQ,SAAS,OAAO,QAAQ,MAAM,GAAG;AAC3C,cAAQ,OAAO,MAAM;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,OAAO,mBAAmB;AACxB,aAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA,EAGA,OAAe,gBAAgB,OAAwC;AACrE,UAAM,SAAS,MAAM;AACrB,QAAI,EAAE,kBAAkB,sBAAsB,CAAC,OAAO,KAAM,QAAO;AACnE,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,SAAS,OAAqB,QAAoC;AAC/E,UAAM,OAAO,OAAO,sBAAsB;AAC1C,WACE,MAAM,UAAU,KAAK,QACrB,MAAM,UAAU,KAAK,SACrB,MAAM,UAAU,KAAK,OACrB,MAAM,UAAU,KAAK;AAAA,EAEzB;AAAA,EAEA,OAAe,gBAAgB,OAA8B;AAC3D,QAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,WAAO,MAAM,gBAAgB,WAAW,MAAM,WAAW;AAAA,EAC3D;AAAA,EAEA,OAAe,kBAAkB,QAAoC;AACnE,UAAM,QAAQ,SAAQ,UAAU,MAAM;AACtC,QAAI,UAAU,UAAU,UAAU,eAAgB,QAAO;AAGzD,QAAI,UAAU,SAAS,cAAc,kBAAkB,UAAW,QAAO;AACzE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,UAAU,QAA4C;AACnE,UAAM,OAAO,OAAO,aAAa,UAAU;AAC3C,QAAI,SAAS,SAAS,SAAS,kBAAkB,SAAS,OAAQ,QAAO;AACzE,WAAO;AAAA,EACT;AACF;AAhFa,SACI,QAAiE;AAD3E,IAAM,UAAN;;;ACdA,IAAM,QAAN,MAAM,OAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,OAAO,cAAc,WAA6B;AAChD,QAAI,CAAC,WAAW;AACd,cAAQ,MAAM,6BAA6B;AAC3C;AAAA,IACF;AAEA,UAAM,YAAY,UAAU,aAAa,aAAa,MAAM;AAC5D,UAAM,UAAU,SAAS,UAAU,aAAa,aAAa,CAAC;AAC9D,UAAM,MAAM,UAAU,MAAM;AAE5B,QACE,QAAQ,KACR,UAAU,SAAS,aAAa,SAChC,CAAC,UAAU,YACX,UAAU,UAAU,SAAS,UAAU,GACvC;AACA,gBAAU,UAAU,OAAO,SAAS;AAAA,IACtC,WAAW,UAAU,UAAU,SAAS,UAAU,GAAG;AAEnD,UACG,UAAU,SAAS,SAAS,aAAa,OAAO,WAChD,UAAU,SAAS,SAAS,CAAC,WAC9B;AACA,kBAAU,UAAU,OAAO,SAAS;AAAA,MACtC,OAAO;AACL,kBAAU,UAAU,IAAI,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,mBAAmB,GAAgB;AACxC,UAAM,WAAW;AACjB,QAAI,CAAC,SAAU;AAaf,QAAI,CAAC,SAAS,aAAa,iBAAiB,GAAG;AAC7C,eAAS,aAAa,mBAAmB,SAAS,sBAAsB,EAAE,OAAO,SAAS,CAAC;AAAA,IAC7F;AACA,UAAM,iBAAiB,SAAS,SAAS,aAAa,iBAAiB,CAAC;AACxE,QAAI,MAAM,cAAc,EAAG;AAE3B,aAAS,MAAM,SAAS;AAExB,UAAM,UAAU,SAAS,eAAe,SAAS;AACjD,UAAM,gBAAgB,SAAS,eAAe;AAC9C,aAAS,MAAM,SAAS,KAAK,IAAI,gBAAgB,aAAa,IAAI;AAAA,EACpE;AAAA,EAEA,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAiB,UAAU,CAAC,MAAqB;AACxD,cAAM,SAA2B,EAAE;AACnC,YAAI,kBAAkB,kBAAkB;AAKtC,iBAAM,cAAc,MAAM;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,eAAS,iBAAiB,SAAS,CAAC,MAAqB;AACvD,cAAM,SAA2B,EAAE;AAEnC,YAAI,kBAAkB,oBAAoB,CAAC,SAAS,UAAU,EAAE,SAAS,OAAO,IAAI,GAAG;AAErF,cAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,GAAG;AAClC,mBAAO,UAAU,IAAI,QAAQ;AAC7B,mBAAO,iBAAiB,QAAQ,MAAM,OAAO,UAAU,OAAO,QAAQ,GAAG;AAAA,cACvE,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAED,eAAS,iBAAiB,sBAAsB,EAAE,QAAQ,CAAC,aAAkC;AAC3F,eAAM,aAAa,QAAQ;AAAA,MAC7B,CAAC;AAGD,eACG,iBAAiB,gCAAgC,EACjD,QAAQ,CAAC,cAAgC;AACxC,eAAM,kBAAkB,SAAS;AAAA,MACnC,CAAC;AAAA,IACL,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,aAAa,UAA+B;AAEjD,aAAS,aAAa,mBAAmB,SAAS,sBAAsB,EAAE,OAAO,SAAS,CAAC;AAC3F,WAAM,mBAAmB,QAAQ;AAIjC,aAAS,iBAAiB,SAAS,CAAC,MAAM,OAAM,mBAAmB,EAAE,MAAM,CAAC;AAAA,EAC9E;AAAA,EAEA,OAAO,kBAAkB,WAA6B;AACpD,cAAU,iBAAiB,UAAU,MAAM;AACzC,YAAM,YAAY,UAAU,QAAQ,aAAa;AACjD,YAAM,YAA8B,UAAU,cAAc,iBAAiB;AAC7E,YAAM,QAAQ,UAAU;AACxB,YAAM,YAAY,CAAC;AACnB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,kBAAU,KAAK,MAAM,CAAC,EAAE,IAAI;AAAA,MAC9B;AACA,gBAAU,QAAQ,UAAU,KAAK,IAAI;AACrC,gBAAU;AAAA,QACR,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,MACzE;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3HO,IAAM,QAAN,MAAM,OAAM;AAAA,EACjB,OAAe,QAAQ,IAAiB;AACtC,UAAM,MAAM,GAAG,sBAAsB;AACrC,UAAM,UAAU,SAAS;AACzB,WAAO;AAAA,MACL,KAAK,IAAI,MAAM,OAAO,cAAc,QAAQ;AAAA,MAC5C,MAAM,IAAI,OAAO,OAAO,cAAc,QAAQ;AAAA,IAChD;AAAA,EACF;AAAA;AAAA,EAIA,OAAO,iBACL,eACA,WAA4B,MAC5B,QAAyB,MACnB;AACN,UAAM,aAAa,aAAa;AAChC,UAAM,WAAW;AACjB,QAAI,gBAAwB;AAC5B,UAAM,gBAAgB,SAAU,WAAmB;AACjD,UAAI,CAAC,gBAAgB;AACnB,yBAAiB;AAAA,MACnB;AACA,YAAM,QAAQ,YAAY;AAC1B,UAAI,QAAQ,UAAU;AACpB,cAAM,SAAU,QAAQ,YAAa,IAAI,QAAQ;AACjD,cAAM,SAAS,aACX,sBACA,aAAa,SAAS,CAAC,MAAM,SAAS,CAAC;AAC3C,cAAM,YAAY,QAAQ,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAO,IAAI,OAAO;AAClG,cAAM,OAAO,KAAK,SAAS;AAC3B,sBAAc,MAAM,kBAClB,qBACA,SACA,OACA,YACA,MACA,OACA,mBACA,OACA;AACF,yBAAiB,OAAO,sBAAsB,aAAa;AAAA,MAC7D,OAAO;AACL,sBAAc,MAAM,kBAAkB;AACtC,eAAO,qBAAqB,cAAc;AAAA,MAC5C;AAAA,IACF;AACA,qBAAiB,OAAO,sBAAsB,aAAa;AAAA,EAC7D;AAAA,EAEA,OAAO,OAAO;AACZ,UAAM,gBAAgB,MAAM;AAC1B,eAAS,KAAK,iBAAiB,SAAS,CAAC,MAAM;AAC7C,cAAM,UAAuB,EAAE;AAC/B,cAAM,KAAkB,QAAQ,QAAQ,eAAe;AACvD,YAAI,MAAM,GAAG,SAAS,OAAO,GAAG;AAC9B,gBAAM,aAAa,GAAG,UAAU,SAAS,cAAc;AACvD,gBAAM,SAAS,OAAM,QAAQ,EAAE;AAC/B,gBAAM,IAAI,EAAE,QAAQ,OAAO;AAC3B,gBAAM,IAAI,EAAE,QAAQ,OAAO;AAE3B,cAAI,QAAQ;AACZ,cAAI,GAAG,UAAU,SAAS,aAAa,EAAG,SAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAE3E,iBAAM,iBAAiB,IAAI,aAAa,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC5DA,IAAMC,aAAyC;AAAA,EAC7C,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAClB;AAOO,IAAM,uBAAN,MAAM,8BACH,UAEV;AAAA,EAME,YAAY,IAAiB,SAA+C;AAC1E,UAAM,IAAI,SAAS,qBAAoB;AAwEzC;AAAA;AAAA;AAAA,gBAAO,MAAY;AACjB,UAAI,KAAK,OAAQ;AACjB,WAAK,SAAS;AACd,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,SAAS,aAAa,iBAAiB,MAAM;AAElD,eAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAC5D,eAAS,iBAAiB,WAAW,KAAK,sBAAsB;AAAA,IAClE;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAY;AAClB,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,SAAS;AACd,WAAK,GAAG,UAAU,OAAO,QAAQ;AACjC,WAAK,SAAS,aAAa,iBAAiB,OAAO;AACnD,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,eAAS,oBAAoB,WAAW,KAAK,sBAAsB;AAAA,IACrE;AAuBA,SAAQ,kBAAkB,CAAC,MAAkB;AAC3C,QAAE,gBAAgB;AAClB,WAAK,QAAQ;AAAA,IACf;AAEA,SAAQ,uBAAuB,CAAC,MAAqB;AACnD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,EAAE,QAAQ,KAAK;AACrD,UAAE,eAAe;AACjB,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAEA,SAAQ,yBAAyB,CAAC,MAAqB;AACrD,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,EAAG,MAAK,MAAM;AAAA,IACjD;AAEA,SAAQ,uBAAuB,CAAC,MAAkB;AAChD,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAS,KAAK,GAAG,SAAS,MAAM,EAAG;AAC3D,WAAK,MAAM;AAAA,IACb;AAtIE,SAAK,GAAG,iCAAiC,IAAI;AAE7C,UAAM,aAAa,KAAK,oBAAoB;AAC5C,UAAM,UAAU,GAAG,UAAU,SAAS,SAAS,KAAK,QAAQ,mBAAmB;AAC/E,UAAM,gBACJ,GAAG,UAAU,SAAS,iBAAiB,KAAK,QAAQ,iBAAiB;AAEvE,SAAK,UAAU;AAAA,MACb,GAAG,sBAAqB;AAAA,MACxB,GAAG;AAAA,MACH,WAAW,QAAQ,aAAa,cAAc,sBAAqB,SAAS;AAAA,MAC5E,cAAc,CAAC;AAAA,MACf,gBAAgB;AAAA,IAClB;AAEA,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,GAAG,cAAc,6BAA6B;AAClE,SAAK,QAAQ,KAAK,GAAG,cAAc,UAAU;AAE7C,SAAK,GAAG,UAAU,IAAI,aAAa,KAAK,QAAQ,SAAS,EAAE;AAC3D,QAAI,cAAe,MAAK,GAAG,UAAU,IAAI,iBAAiB;AAC1D,QAAI,QAAS,MAAK,GAAG,UAAU,IAAI,SAAS;AAE5C,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,aAAa,iBAAiB,MAAM;AACjD,WAAK,QAAQ,aAAa,iBAAiB,OAAO;AAClD,UACE,KAAK,mBAAmB,qBACxB,CAAC,KAAK,QAAQ,aAAa,MAAM,KACjC,KAAK,QAAQ,WAAW,GACxB;AACA,aAAK,QAAQ,WAAW;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,KAAK,MAAO,MAAK,MAAM,aAAa,QAAQ,MAAM;AAEtD,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA,EAUA,OAAO,KACL,KACA,UAAgD,CAAC,GACF;AAC/C,WAAO,MAAM,KAAK,KAAK,SAAS,qBAAoB;AAAA,EACtD;AAAA,EAEA,OAAO,YAAY,IAAuC;AACxD,WAAO,GAAG,iCAAiC;AAAA,EAC7C;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,qBAAqB;AAC1B,SAAK,GAAG,iCAAiC,IAAI;AAAA,EAC/C;AAAA,EA2BQ,sBAAuE;AAC7E,UAAM,QAAQ,CAAC,GAAG,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,YAAY,CAAC;AAC3E,UAAM,QAAQ,OAAO,MAAM,aAAa,MAAM;AAC9C,QAAI,UAAU,SAAS,UAAU,WAAW,UAAU,YAAY,UAAU,QAAQ;AAClF,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe;AACtD,QAAI,KAAK,mBAAmB,qBAAqB,CAAC,KAAK,QAAQ,aAAa,MAAM,GAAG;AACnF,WAAK,QAAQ,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe;AACzD,SAAK,SAAS,oBAAoB,WAAW,KAAK,oBAAoB;AAAA,EACxE;AAAA,EAwBQ,UAAU;AAChB,QAAI,KAAK,OAAQ,MAAK,MAAM;AAAA,QACvB,MAAK,KAAK;AAAA,EACjB;AACF;;;ACpIA,IAAMC,aAA6B;AAAA,EACjC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AACb;AAEO,IAAM,YAAN,MAAM,kBAAiB,UAA2B;AAAA,EA2CvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAvB7B,kBAAiB;AAMjB,SAAQ,iBAA0B;AAClC,SAAQ,WAA+B;AACvC,SAAQ,gBAAyB;AACjC,SAAQ,YAAoB;AAC5B,SAAQ,WAAoB;AAuM5B,kCAAyB,MAAM,SAAS,MAAM,KAAK,cAAc,GAAG,GAAG;AAEvE,8BAAqB,CAAC,MAAoB;AACxC,UAAI,EAAE,gBAAgB,WAAW,EAAE,WAAW,EAAG;AACjD,UAAI,EAAE,kBAAkB,eAAe,EAAE,OAAO,YAAY,OAAO;AACjE,UAAE,eAAe;AAAA,MACnB;AACA,WAAK,UAAU;AACf,WAAK,UAAU;AACf,WAAK,kBAAkB;AACvB,WAAK,YAAY,EAAE;AACnB,WAAK,aAAa,EAAE;AACpB,WAAK,WAAW,KAAK,YAAY;AACjC,WAAK,QAAQ,KAAK;AAClB,WAAK,YAAY,KAAK,IAAI;AAC1B,UAAI;AACF,aAAK,GAAG,kBAAkB,EAAE,SAAS;AAAA,MACvC,QAAQ;AAAA,MAER;AACA,UAAI,KAAK,cAAc,KAAM,sBAAqB,KAAK,SAAS;AAChE,YAAM,OAAO,MAAM;AACjB,aAAK,OAAO;AACZ,YAAI,KAAK,QAAS,MAAK,YAAY,sBAAsB,IAAI;AAAA,YACxD,MAAK,YAAY;AAAA,MACxB;AACA,WAAK,YAAY,sBAAsB,IAAI;AAAA,IAC7C;AAEA,+BAAsB,CAAC,MAAoB;AACzC,UAAI,CAAC,KAAK,QAAS;AACnB,YAAM,QAAQ,KAAK,YAAY,EAAE;AACjC,YAAM,SAAS,KAAK,IAAI,KAAK,aAAa,EAAE,OAAO;AACnD,UAAI,SAAS,MAAM,CAAC,KAAK,iBAAiB;AACxC,YAAI,QAAQ,KAAK,QAAQ,IAAI;AAC3B,eAAK,UAAU;AACf,eAAK,YAAY,EAAE;AACnB,eAAK,QAAQ,KAAK,SAAS,KAAK;AAAA,QAClC;AAAA,MACF,WAAW,KAAK,SAAS;AACvB,UAAE,eAAe;AAAA,MACnB,OAAO;AACL,aAAK,kBAAkB;AAAA,MACzB;AACA,UAAI,KAAK,QAAS,GAAE,eAAe;AAAA,IACrC;AAEA,kCAAyB,CAAC,MAAoB;AAC5C,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK,UAAU;AACf,UAAI,KAAK,cAAc,MAAM;AAC3B,6BAAqB,KAAK,SAAS;AACnC,aAAK,YAAY;AAAA,MACnB;AACA,UAAI;AACF,aAAK,GAAG,sBAAsB,EAAE,SAAS;AAAA,MAC3C,QAAQ;AAAA,MAER;AACA,WAAK,SAAS,KAAK;AACnB,UAAI,KAAK,WAAW,MAAM,KAAK,WAAW,KAAK;AAC7C,aAAK,YAAY,MAAM,KAAK;AAC5B,aAAK,SAAS,KAAK,SAAS,KAAK;AAAA,MACnC;AACA,WAAK,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG,IAAI,KAAK;AACxD,UAAI,KAAK,QAAQ;AACf,YAAI,KAAK,UAAU,KAAK,OAAO,KAAK,QAAQ,IAAI;AAC9C,eAAK,SAAS,KAAK,OAAO,KAAK,QAAQ;AAAA,QACzC,WAAW,KAAK,SAAS,GAAG;AAC1B,eAAK,SAAS;AAAA,QAChB;AAAA,MACF;AACA,WAAK,YAAY,KAAK,SAAS,KAAK;AACpC,WAAK,YAAY,KAAK,IAAI;AAC1B,4BAAsB,KAAK,WAAW;AACtC,UAAI,KAAK,QAAS,GAAE,eAAe;AAAA,IACrC;AAEA,gCAAuB,CAAC,MAAkB;AACxC,UAAI,KAAK,SAAS;AAChB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB;AAAA,MACF;AACA,YAAM,cAAe,EAAE,OAAuB,QAAQ,gBAAgB;AACtE,UAAI,CAAC,eAAe,CAAC,KAAK,GAAG,SAAS,WAAW,EAAG;AACpD,YAAM,eAAe,KAAK,OAAO,QAAQ,WAA0B;AACnE,YAAM,OAAO,KAAK,MAAM,KAAK,MAAM,IAAI;AACvC,UAAI,SAAS,GAAG;AACd,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAAA,MACpB;AACA,UAAI,eAAe,GAAG;AACpB,YAAI,EAAE,UAAW,EAAE,OAAuB,sBAAsB,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG;AAChG,eAAK,KAAK;AAAA,QACZ,OAAO;AACL,eAAK,KAAK;AAAA,QACZ;AAAA,MACF,OAAO;AACL,aAAK,SAAS,YAAY;AAAA,MAC5B;AAAA,IACF;AAEA,iCAAwB,CAAC,MAAa;AACpC,QAAE,gBAAgB;AAClB,YAAM,YAAa,EAAE,OAAuB,QAAQ,iBAAiB;AACrE,UAAI,CAAC,aAAa,CAAC,KAAK,YAAY,SAAS,SAAS,EAAG;AACzD,YAAM,QAAQ,CAAC,GAAG,KAAK,YAAY,QAAQ,EAAE,QAAQ,SAAS;AAC9D,UAAI,QAAQ,EAAG;AACf,WAAK,SAAS,KAAK;AAAA,IACrB;AAEA,0BAAiB,CAAC,MAAqB;AACrC,YAAM,SAAS,EAAE;AACjB,UAAI,OAAO,QAAQ,mDAAmD,EAAG;AACzE,UAAI,MAAM,KAAK,YAAY,SAAS,EAAE,GAAG,GAAG;AAC1C,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ,WAAW,MAAM,KAAK,WAAW,SAAS,EAAE,GAAG,GAAG;AAChD,UAAE,eAAe;AACjB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,6BAAoB,MAAM;AACxB,UAAI,KAAK,cAAe;AACxB,YAAM,QAAQ,KAAK,cAAc;AACjC,UAAI,UAAU,KAAK,OAAQ,MAAK,YAAY,OAAO,KAAK,OAAO;AAAA,IACjE;AAEA,yBAAgB,MAAM;AACpB,UAAI,CAAC,KAAK,OAAO,OAAQ;AACzB,UAAI,KAAK,OAAO;AACd,aAAK,eAAe,KAAK,QAAQ,KAAK;AACtC;AAAA,MACF;AACA,UAAI,KAAK,QAAQ,WAAW;AAC1B,cAAM,YAAY,KAAK,OAAO,CAAC;AAC/B,YAAI,CAAC,UAAW;AAChB,aAAK,YAAY,UAAU;AAC3B,aAAK,MAAM,KAAK,YAAY,IAAI,KAAK,QAAQ;AAC7C,aAAK,SAAS,KAAK,SAAS,IAAI,KAAK;AACrC,aAAK,SAAS,KAAK;AAAA,MACrB,OAAO;AACL,aAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAgBA,kBAAS,MAAM;AACb,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,UAAU,MAAM,KAAK;AAC3B,YAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,YAAM,IAAK,MAAO,SAAU,IAAI;AAChC,WAAK,YAAY;AACjB,WAAK,QAAQ,KAAK;AAClB,WAAK,WAAW,MAAM,IAAI,MAAM,KAAK;AAAA,IACvC;AAEA,uBAAc,MAAM;AAClB,UAAI,CAAC,KAAK,UAAW;AACrB,YAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,YAAM,QAAQ,KAAK,YAAY,KAAK,IAAI,CAAC,UAAU,KAAK,QAAQ,QAAQ;AACxE,UAAI,QAAQ,KAAK,QAAQ,IAAI;AAC3B,aAAK,QAAQ,KAAK,SAAS,KAAK;AAChC,8BAAsB,KAAK,WAAW;AAAA,MACxC,OAAO;AACL,aAAK,QAAQ,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AA/WE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,QACH,KAAK,QAAQ,aACb,KAAK,GAAG,UAAU,SAAS,MAAM;AACnC,QAAI,KAAK,OAAO;AACd,WAAK,GAAG,UAAU,IAAI,MAAM;AAC5B,WAAK,QAAQ,YAAY;AACzB,WAAK,QAAQ,OAAO;AAAA,IACtB;AAEA,QAAI,OAAO,WAAW,kCAAkC,EAAE,SAAS;AACjE,WAAK,QAAQ,WAAW;AACxB,UAAI,CAAC,KAAK,MAAO,MAAK,QAAQ,OAAO;AAAA,IACvC;AAEA,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,SAAS,KAAK,SAAS;AAC5B,SAAK,SAAS,KAAK,cAAc;AACjC,QAAI,CAAC,KAAK,OAAO,QAAQ;AACvB,cAAQ,MAAM,8CAA8C;AAC5D;AAAA,IACF;AAEA,SAAK,oBAAoB,KAAK,OAAO,SAAS;AAC9C,SAAK,iBAAiB,KAAK,QAAQ,cAAc,KAAK;AACtD,SAAK,SAAS,KAAK,QAAQ,UAAU,CAAC,KAAK,qBAAqB,KAAK;AACrE,SAAK,QAAQ,KAAK,OAAO;AACzB,SAAK,QAAQ,aAAa,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,UAAU;AAEtE,SAAK,OAAO,QAAQ,CAAC,SAAS,KAAK,UAAU,IAAI,eAAe,CAAC;AACjE,QAAI,KAAK,MAAO,MAAK,WAAW;AAEhC,UAAM,YAAY,KAAK,OAAO,CAAC;AAC/B,SAAK,YAAY,UAAU,eAAe,KAAK,GAAG,eAAe;AACjE,SAAK,aAAa,UAAU,gBAAgB,KAAK,GAAG,gBAAgB;AACpE,SAAK,MAAM,KAAK,YAAY,IAAI,KAAK,QAAQ,WAAW;AAExD,QAAI,KAAK,eAAgB,MAAK,iBAAiB;AAE/C,SAAK,GAAG,WAAW,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,WAAW;AAC9D,SAAK,GAAG,aAAa,wBAAwB,UAAU;AAEvD,SAAK,oBAAoB;AACzB,SAAK,WAAW;AAEhB,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK;AAAA,QACjB;AAAA,QACA,KAAK,OAAO,UAAU,CAACC,QAAOA,IAAG,UAAU,SAAS,QAAQ,CAAC;AAAA,MAC/D;AACA,WAAK,SAAS;AACd,WAAK,YAAY,OAAO,KAAK;AAC7B,WAAK,eAAe,OAAO,KAAK;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EA3EA,IAAY,YAAyB;AACnC,WAAO,KAAK,YAAY,KAAK;AAAA,EAC/B;AAAA,EA2EA,WAAW,WAA4B;AACrC,WAAOD;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,SAAU,MAAK,UAAU;AAClC,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AAAA,EAEQ,gBAA+B;AACrC,UAAM,WAAW,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE;AAAA,MAC5C,CAAC,OAA0B,cAAc,eAAe,GAAG,UAAU,SAAS,eAAe;AAAA,IAC/F;AACA,QAAI,SAAS,OAAQ,QAAO;AAC5B,WAAO,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAA0B;AACpE,UAAI,EAAE,cAAc,aAAc,QAAO;AACzC,UAAI,GAAG,UAAU,SAAS,YAAY,KAAK,GAAG,UAAU,SAAS,qBAAqB,GAAG;AACvF,eAAO;AAAA,MACT;AACA,aAAO,GAAG,YAAY;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB;AACzB,UAAM,WAAW,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE;AAAA,MAC5C,CAAC,OAA0B,cAAc,eAAe,GAAG,UAAU,SAAS,YAAY;AAAA,IAC5F;AACA,SAAK,cAAc,YAAY,SAAS,cAAc,KAAK;AAC3D,SAAK,iBAAiB,CAAC;AACvB,SAAK,YAAY,UAAU,IAAI,YAAY;AAC3C,SAAK,YAAY,aAAa,cAAc,QAAQ;AACpD,SAAK,YAAY,gBAAgB;AAEjC,SAAK,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC5B,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,UAAU,IAAI,gBAAgB;AACrC,UAAI,MAAM,GAAG;AACX,eAAO,UAAU,IAAI,QAAQ;AAC7B,eAAO,aAAa,gBAAgB,MAAM;AAAA,MAC5C;AACA,aAAO,aAAa,cAAc,SAAS,IAAI,CAAC,EAAE;AAClD,WAAK,YAAY,YAAY,MAAM;AAAA,IACrC,CAAC;AAED,QAAI,KAAK,eAAgB,MAAK,GAAG,YAAY,KAAK,WAAW;AAC7D,QAAI,KAAK,OAAO;AACd,WAAK,GAAG,cAAc,sBAAsB,GAAG,UAAU,IAAI,iBAAiB;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,WAAW,KAAK,cAAc;AACvD,QAAI,KAAK,kBAAkB,KAAK,aAAa;AAC3C,WAAK,YAAY,iBAAiB,SAAS,KAAK,qBAAqB;AAAA,IACvE;AACA,cAAS,MAAM,IAAI,IAAI;AACvB,QAAI,CAAC,UAAS,kBAAkB;AAC9B,aAAO,iBAAiB,UAAU,UAAS,WAAW,EAAE,SAAS,KAAK,CAAC;AACvE,gBAAS,mBAAmB;AAAA,IAC9B;AAEA,QAAI,KAAK,OAAO;AACd,WAAK,UAAU,iBAAiB,UAAU,KAAK,mBAAmB,EAAE,SAAS,KAAK,CAAC;AACnF;AAAA,IACF;AAEA,SAAK,GAAG,iBAAiB,eAAe,KAAK,kBAAkB;AAC/D,SAAK,GAAG,iBAAiB,eAAe,KAAK,mBAAmB;AAChE,SAAK,GAAG,iBAAiB,aAAa,KAAK,sBAAsB;AACjE,SAAK,GAAG,iBAAiB,iBAAiB,KAAK,sBAAsB;AACrE,SAAK,GAAG,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAC7D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,WAAW,KAAK,cAAc;AAC1D,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,oBAAoB,SAAS,KAAK,qBAAqB;AAAA,IAC1E;AACA,SAAK,UAAU,oBAAoB,UAAU,KAAK,iBAAiB;AACnE,SAAK,GAAG,oBAAoB,eAAe,KAAK,kBAAkB;AAClE,SAAK,GAAG,oBAAoB,eAAe,KAAK,mBAAmB;AACnE,SAAK,GAAG,oBAAoB,aAAa,KAAK,sBAAsB;AACpE,SAAK,GAAG,oBAAoB,iBAAiB,KAAK,sBAAsB;AACxE,SAAK,GAAG,oBAAoB,SAAS,KAAK,oBAAoB;AAE9D,cAAS,MAAM,OAAO,IAAI;AAC1B,QAAI,UAAS,MAAM,SAAS,KAAK,UAAS,kBAAkB;AAC1D,aAAO,oBAAoB,UAAU,UAAS,SAAS;AACvD,gBAAS,mBAAmB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,YAAY;AAClB,SAAK,qBAAqB;AAC1B,QAAI,KAAK,cAAc,KAAM,sBAAqB,KAAK,SAAS;AAChE,WAAO,aAAa,KAAK,gBAAgB;AACzC,QAAI,KAAK,eAAgB,MAAK,aAAa,OAAO;AAClD,SAAK,aAAa;AAClB,SAAK,OAAO,QAAQ,CAAC,OAAO;AAC1B,SAAG,MAAM,YAAY;AACrB,SAAG,MAAM,SAAS;AAClB,SAAG,MAAM,UAAU;AACnB,SAAG,MAAM,aAAa;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAsJA,MAAM,GAA2C;AAC/C,QAAI,aAAa,EAAG,QAAO,EAAE;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,GAA2C;AAC/C,QAAI,aAAa,EAAG,QAAO,EAAE;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,GAAW;AACf,WAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,KAAK,QAAS,IAAI,KAAK,KAAM,IAAI;AAAA,EAChG;AAAA,EAwBA,QAAQ,IAAY,GAAG;AACrB,QAAI,CAAC,KAAK,GAAG,UAAU,SAAS,WAAW,GAAG;AAC5C,WAAK,GAAG,UAAU,IAAI,WAAW;AAAA,IACnC;AACA,WAAO,aAAa,KAAK,gBAAgB;AACzC,SAAK,mBAAmB,WAAW,MAAM;AACvC,WAAK,GAAG,UAAU,OAAO,WAAW;AAAA,IACtC,GAAG,KAAK,QAAQ,QAAQ;AAExB,SAAK,SAAS,OAAO,MAAM,WAAW,IAAI,KAAK;AAC/C,SAAK,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,GAAG;AAEhE,UAAM,OAAO,KAAK,SAAS;AAC3B,UAAM,QAAQ,KAAK,SAAS,KAAK,SAAS,KAAK;AAC/C,UAAM,MAAM,QAAQ,IAAI,IAAI;AAC5B,UAAM,QAAS,CAAC,MAAM,QAAQ,IAAK,KAAK;AACxC,UAAM,aAAa,KAAK;AACxB,UAAM,mBAAmB,IAAI,KAAK,QAAQ;AAE1C,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAY;AACZ,6BAAuB;AAAA,IACzB,OAAO;AACL,kBAAY,iBAAiB,KAAK,GAAG,cAAc,KAAK,aAAa,IAAI;AACzE,mBAAa,iBAAiB,KAAK,GAAG,eAAe,KAAK,cAAc,IAAI;AAC5E,6BAAuB,IAAI,mBAAmB;AAAA,IAChD;AAEA,SAAK,iBAAiB,KAAK,MAAM;AAEjC,QAAI,CAAC,KAAK,UAAW,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,OAAQ;AAClE,YAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AAC9C,UAAI,MAAM,CAAC,GAAG,UAAU,SAAS,QAAQ,GAAG;AAC1C,aAAK,GAAG,cAAc,uBAAuB,GAAG,UAAU,OAAO,QAAQ;AACzE,WAAG,UAAU,IAAI,QAAQ;AAAA,MAC3B;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,KAAK,MAAM,EAAE,GAAG;AAC9B,UAAI;AACJ,UAAI;AACJ,UAAI,KAAK,QAAQ,WAAW;AAC1B,uBAAe,KAAK,QAAQ;AAC5B,yBAAiB,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AAAA,MACzD,OAAO;AACL,uBAAe,KAAK,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AACpD,yBAAiB,IAAI,oBAAoB,IAAI,IAAI,QAAQ;AAAA,MAC3D;AACA,UAAI,CAAC,KAAK,UAAU,KAAK,SAAS,IAAI,KAAK,OAAO;AAChD,cAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AAClD,cAAM,kBAAkB,GAAG,SAAS,eAClC,KAAK,QAAQ,SAAS,KAAK,MAAM,IAAI,SAAS,CAChD,kBAAkB,YAAY;AAC9B,aAAK,iBAAiB,IAAI,gBAAgB,CAAC,GAAG,eAAe;AAAA,MAC/D;AACA,UAAI,KAAK,QAAQ,WAAW;AAC1B,uBAAe,KAAK,QAAQ;AAC5B,yBAAiB,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AAAA,MACzD,OAAO;AACL,uBAAe,KAAK,QAAQ,QAAQ,IAAI,IAAI,QAAQ;AACpD,yBAAiB,IAAI,oBAAoB,IAAI,IAAI,QAAQ;AAAA,MAC3D;AACA,UAAI,CAAC,KAAK,UAAU,KAAK,SAAS,KAAK,GAAG;AACxC,cAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AAClD,cAAM,kBAAkB,GAAG,SAAS,eAClC,CAAC,KAAK,QAAQ,SAAS,CAAC,KAAK,MAAM,IAAI,SAAS,CAClD,kBAAkB,YAAY;AAC9B,aAAK,iBAAiB,IAAI,gBAAgB,CAAC,GAAG,eAAe;AAAA,MAC/D;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,UAAW,KAAK,UAAU,KAAK,KAAK,SAAS,KAAK,OAAQ;AAClE,YAAM,KAAK,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AAC9C,YAAM,kBAAkB,GAAG,SAAS,eAAe,CAAC,QAAQ,CAAC,kBAC3D,MAAM,KAAK,QAAQ,QAAQ,KAC7B,kBAAkB,KAAK,QAAQ,OAAO,KAAK;AAC3C,WAAK,iBAAiB,IAAI,sBAAsB,GAAG,eAAe;AAAA,IACpE;AAEA,UAAM,WAAW,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,CAAC;AACpD,SAAK,UAAU,KAAK,MAAM,KAAK,MAAM,CAAC;AAEtC,QAAI,eAAe,KAAK,UAAU,OAAO,KAAK,QAAQ,cAAc,YAAY;AAC9E,WAAK,QAAQ,UAAU,KAAK,MAAM,UAAU,KAAK,OAAO;AAAA,IAC1D;AACA,QAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,WAAK,gBAAgB,KAAK,MAAM,UAAU,KAAK,OAAO;AACtD,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,iBAAiB,IAAiB,SAAiB,QAAgB,WAAmB;AACpF,QAAI,CAAC,GAAI;AACT,OAAG,MAAM,YAAY;AACrB,OAAG,MAAM,SAAS,OAAO,SAAS;AAClC,OAAG,MAAM,UAAU,QAAQ,SAAS;AACpC,OAAG,MAAM,aAAa;AAAA,EACxB;AAAA,EAEQ,iBAAiB,QAAgB;AACvC,QAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,YAAa;AAC/C,UAAM,OAAQ,SAAS,KAAK,QAAS,KAAK,SAAS,KAAK;AACxD,SAAK,YAAY,iBAAiB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,MAAM;AACtE,YAAM,KAAK,MAAM;AACjB,SAAG,UAAU,OAAO,UAAU,EAAE;AAChC,UAAI,GAAI,IAAG,aAAa,gBAAgB,MAAM;AAAA,UACzC,IAAG,gBAAgB,cAAc;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,OAAe;AAC/B,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC7B,UAAI,MAAM,MAAO,IAAG,gBAAgB,aAAa;AAAA,UAC5C,IAAG,aAAa,eAAe,MAAM;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,OAAe,SAAkB;AACnD,UAAM,OAAO,KAAK;AAClB,SAAK,SAAS;AACd,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM,GAAG,UAAU,OAAO,UAAU,MAAM,KAAK,CAAC;AACzE,SAAK,iBAAiB,KAAK;AAC3B,SAAK,UAAU,KAAK;AACpB,UAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,QAAI,SAAS,SAAS,OAAO,KAAK,QAAQ,cAAc,YAAY;AAClE,WAAK,QAAQ,UAAU,KAAK,MAAM,MAAM,OAAO;AAAA,IACjD;AACA,QAAI,OAAO,KAAK,oBAAoB,YAAY;AAC9C,WAAK,gBAAgB,KAAK,MAAM,MAAM,OAAO;AAC7C,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,SAAK,OAAO,CAAC,EAAE,OAAO,KAAK;AAC3B,SAAK,OAAO,QAAQ,CAAC,OAAO,MAAM,YAAY,EAAE,CAAC;AACjD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,OAAO,QAAQ,CAAC,OAAO,KAAK,GAAG,aAAa,IAAI,KAAK,QAAQ,CAAC;AACnE,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,gBAAwB;AAC9B,UAAM,OAAO,KAAK,UAAU;AAC5B,QAAI,OAAO;AACX,QAAI,WAAW;AACf,SAAK,OAAO,QAAQ,CAAC,IAAI,MAAM;AAC7B,YAAM,OAAO,KAAK,IAAI,GAAG,aAAa,IAAI;AAC1C,UAAI,OAAO,UAAU;AACnB,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,GAAW,SAAS,MAAM;AAC/C,UAAM,KAAK,KAAK,OAAO,CAAC;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,OAAO,GAAG;AAChB,QAAI,KAAK,IAAI,KAAK,UAAU,aAAa,IAAI,IAAI,GAAG;AAClD,WAAK,YAAY,GAAG,KAAK;AACzB;AAAA,IACF;AACA,SAAK,gBAAgB;AACrB,SAAK,UAAU,SAAS,EAAE,MAAM,UAAU,SAAS,WAAW,OAAO,CAAC;AACtE,UAAM,OAAO,MAAM;AACjB,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,UAAU,iBAAiB,aAAa,MAAM,EAAE,MAAM,KAAK,CAAC;AACjE,WAAO,WAAW,MAAM,KAAK,QAAQ,WAAW,GAAG;AAAA,EACrD;AAAA,EAEA,SAAS,GAAW,WAAyC,MAAM;AACjE,QAAI,KAAK,OAAO;AACd,UAAI,OAAO,aAAa,WAAY,MAAK,kBAAkB;AAC3D,WAAK,YAAY,GAAG,KAAK;AACzB,WAAK,eAAe,CAAC;AACrB;AAAA,IACF;AACA,QAAI,OAAQ,KAAK,SAAS,KAAK,QAAS;AACxC,QAAI,CAAC,KAAK,QAAQ;AAChB,UAAI,OAAO,GAAG;AACZ,YAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG;AAChD,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF,WAAW,OAAO,GAAG;AACnB,YAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,MAAM;AACtC,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,SAAK,SAAS,KAAK,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AAC1D,QAAI,OAAO,GAAG;AACZ,WAAK,UAAU,KAAK,MAAM,KAAK,IAAI,IAAI;AAAA,IACzC,WAAW,OAAO,GAAG;AACnB,WAAK,UAAU,KAAK,MAAM;AAAA,IAC5B;AACA,QAAI,OAAO,aAAa,YAAY;AAClC,WAAK,kBAAkB;AAAA,IACzB;AACA,QAAI,KAAK,WAAW,KAAK,QAAQ;AAC/B,WAAK,YAAY,KAAK,SAAS,KAAK;AACpC,WAAK,YAAY,KAAK,IAAI;AAC1B,4BAAsB,KAAK,WAAW;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,KAAK,IAAY,GAAG;AAClB,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,QAAQ,KAAK,SAAS;AAC1B,QAAI,SAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,KAAK,OAAQ;AACjB,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AACA,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEA,KAAK,IAAY,GAAG;AAClB,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,QAAQ,KAAK,SAAS;AAC1B,QAAI,SAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,KAAK,OAAQ;AACjB,cAAQ,KAAK,MAAM,KAAK;AAAA,IAC1B;AACA,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAEA,IAAI,GAAW,UAAyC;AACtD,QAAI,MAAM,UAAa,MAAM,CAAC,EAAG,KAAI;AACrC,QAAI,IAAI,KAAK,SAAS,IAAI,GAAG;AAC3B,UAAI,KAAK,OAAQ;AACjB,UAAI,KAAK,MAAM,CAAC;AAAA,IAClB;AACA,SAAK,SAAS,GAAG,QAAQ;AAAA,EAC3B;AACF;AAlpBa,UAqCI,QAAQ,oBAAI,IAAc;AArC9B,UAsCI,mBAAmB;AAtCvB,UAuCI,YAAY,MAAM,SAAS,MAAM;AAC9C,YAAS,MAAM,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;AACjD,GAAG,GAAG;AAzCD,IAAM,WAAN;;;AC/DP,IAAME,aAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,MAAM,0BAAyB,UAAuB;AAAA,EAS3D,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,CAAC,GAAG,iBAAgB;AA+EhC,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAgB,KAAK,GAAwB,MAAM;AAErD,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AAzFE,SAAK,GAAG,6BAA6B,IAAI;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,kBAAiB;AAAA,MACpB,GAAG;AAAA,IACL;AAEA,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAgC,CAAC,GACM;AACvC,WAAO,MAAM,KAAK,KAAK,SAAS,iBAAgB;AAAA,EAClD;AAAA,EAEA,OAAO,YAAY,IAAoC;AACrD,WAAO,GAAG,6BAA6B;AAAA,EACzC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,6BAA6B,IAAI;AACzC,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC5D;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe,IAAI;AAAA,EAC/D;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAChD,SAAK,UAAU,MAAM,QAAQ;AAC7B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;;;ACpFA,IAAMC,aAAgC;AAAA,EACpC,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAMO,IAAM,cAAN,MAAM,qBAAoB,UAA8B;AAAA,EAM7D,YAAY,IAAiB,SAAsC;AACjE,UAAM,IAAI,SAAS,YAAW;AANhC,SAAQ,SAAwB,CAAC;AAEjC,SAAQ,aAAuB,CAAC;AAChC,SAAQ,iBAAgC,CAAC;AAoEzC;AAAA;AAAA;AAAA;AAAA,gBAAO,CAAC,UAAkB;AACxB,YAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,EAAG;AAEjC,UAAI,KAAK,QAAQ,WAAW;AAC1B,aAAK,OAAO,QAAQ,CAAC,OAAO,MAAM;AAChC,cAAI,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAG,MAAK,MAAM,CAAC;AAAA,QACtD,CAAC;AAAA,MACH;AAEA,WAAK,SAAS,MAAM,IAAI;AAAA,IAC1B;AAMA;AAAA;AAAA;AAAA;AAAA,iBAAQ,CAAC,UAAkB;AACzB,YAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,EAAG;AAClC,WAAK,SAAS,MAAM,KAAK;AAAA,IAC3B;AAyEA,SAAQ,gBAAgB,CAAC,MAAa;AACpC,YAAM,OAAO,EAAE;AACf,UAAI,EAAE,gBAAgB,oBAAqB;AAC3C,UAAI,CAAC,KAAK,OAAO,SAAS,IAAI,EAAG;AACjC,WAAK,QAAQ,MAAM,KAAK,IAAI;AAAA,IAC9B;AAnKE,SAAK,GAAG,wBAAwB,IAAI;AAEpC,UAAM,YACJ,QAAQ,cAAc,SAClB,QAAQ,YACR,CAAC,GAAG,UAAU,SAAS,YAAY;AAEzC,SAAK,UAAU;AAAA,MACb,GAAG,aAAY;AAAA,MACf,GAAG;AAAA,MACH;AAAA,IACF;AAEA,SAAK,aAAa,GAAG,KAAK,eAAe,GAAG,EAAE,KAAK,eAAe,MAAM,KAAK,CAAC;AAC9E,SAAK,SAAS,KAAK,cAAc;AACjC,SAAK,mBAAmB;AACxB,SAAK,YAAY;AACjB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA+B;AACxC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAuC,CAAC,GACX;AAC7B,WAAO,MAAM,KAAK,KAAK,SAAS,YAAW;AAAA,EAC7C;AAAA,EAEA,OAAO,YAAY,IAA8B;AAC/C,WAAO,GAAG,wBAAwB;AAAA,EACpC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,WAAW,QAAQ,CAAC,OAAO,aAAa,EAAE,CAAC;AAChD,SAAK,aAAa,CAAC;AACnB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,wBAAwB,IAAI;AAAA,EACtC;AAAA,EA6BQ,gBAA+B;AACrC,WAAO,MAAM,KAAK,KAAK,GAAG,iBAAiB,kBAAkB,CAAC;AAAA,EAChE;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,OAAO,QAAQ,CAAC,SAAS;AAC5B,YAAI,gBAAgB,sBAAsB,CAAC,KAAK,aAAa,MAAM,GAAG;AACpE,eAAK,aAAa,QAAQ,KAAK,UAAU;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,KAAK,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC;AAC9D,QAAI,KAAK,QAAQ,aAAa,OAAO,SAAS,GAAG;AAC/C,aAAO,MAAM,CAAC,EAAE,QAAQ,CAAC,SAAS;AAChC,YAAI,gBAAgB,mBAAoB,MAAK,OAAO;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,QAAQ,MAA4B;AAC1C,WAAO,gBAAgB,sBAAsB,KAAK;AAAA,EACpD;AAAA,EAEQ,SAAS,MAAmB,MAAe;AACjD,QAAI,gBAAgB,mBAAoB,MAAK,OAAO;AAAA,EACtD;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,OAAO,QAAQ,CAAC,SAAS;AAC5B,UAAI,EAAE,gBAAgB,oBAAqB;AAC3C,UAAI,KAAK,cAAc,wBAAwB,GAAG;AAChD,cAAM,UAAU,MAAM,KAAK,KAAK,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS;AAC/E,YAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,YAAY,OAAO;AACxD,eAAK,eAAe,KAAK,QAAQ,CAAC,CAAgB;AAClD;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,SAAS,cAAc,KAAK;AACzC,YAAM,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,SAAS;AAC5C,YAAI,gBAAgB,eAAe,KAAK,YAAY,UAAW;AAC/D,aAAK,YAAY,IAAI;AAAA,MACvB,CAAC;AACD,WAAK,YAAY,IAAI;AACrB,WAAK,eAAe,KAAK,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,eAAe,QAAQ,CAAC,SAAS;AACpC,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAQ;AACb,aAAO,KAAK,WAAY,QAAO,aAAa,KAAK,YAAY,IAAI;AACjE,WAAK,OAAO;AAAA,IACd,CAAC;AACD,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA,EAEQ,QAAQ,MAAuC;AACrD,WAAO,KAAK,cAAc,wBAAwB;AAAA,EACpD;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,UAAU,KAAK,eAAe,IAAI;AAAA,EAC7D;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,UAAU,KAAK,eAAe,IAAI;AAAA,EAChE;AAAA,EASQ,QAAQ,MAAmB,SAAkB;AACnD,UAAM,QAAQ,UAAU,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAChE,QAAI,OAAO,UAAU,WAAY,OAAM,KAAK,MAAM,IAAI;AAEtD,UAAM,MAAM,UAAU,KAAK,QAAQ,YAAY,KAAK,QAAQ;AAC5D,QAAI,OAAO,QAAQ,WAAY;AAE/B,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK;AACrC,QAAI,OAAO;AACX,UAAM,SAAS,MAAM;AACnB,UAAI,KAAM;AACV,aAAO;AACP,aAAO,oBAAoB,iBAAiB,KAAK;AACjD,UAAI,KAAK,MAAM,IAAI;AAAA,IACrB;AACA,UAAM,QAAQ,CAAC,OAAwB;AACrC,UAAI,GAAG,WAAW,OAAQ;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,iBAAiB,KAAK;AAC9C,SAAK,WAAW,KAAK,OAAO,WAAW,QAAQ,KAAK,YAAY,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA,EAEQ,cAAsB;AAC5B,UAAM,MAAM,iBAAiB,KAAK,EAAE,EACjC,iBAAiB,gCAAgC,EACjD,KAAK;AACR,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,IAAI,SAAS,IAAI,EAAG,QAAO,WAAW,GAAG;AAC7C,QAAI,IAAI,SAAS,GAAG,EAAG,QAAO,WAAW,GAAG,IAAI;AAChD,UAAM,IAAI,WAAW,GAAG;AACxB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACF;;;AC3OA,IAAMC,cAA+B;AAAA,EACnC,SAAS;AAAA,EACT,iBAAiB,CAAC;AACpB;AAOO,IAAM,aAAN,MAAM,oBAAmB,UAA6B;AAAA,EAuB3D,YAAY,IAAuB,SAA4B;AAC7D,UAAM,IAAI,SAAS,WAAU;AA4G/B,+BAAsB,MAAM;AAC1B,WAAK,iBAAiB;AAAA,IACxB;AAIA;AAAA;AAAA,gCAAuB,CAAC,MAAqB;AAC3C,UAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAS,MAAK,mBAAmB,CAAC;AAAA,IACnE;AAEA,8BAAqB,CAAC,MAAkC;AACtD,QAAE,eAAe;AACjB,YAAM,gBAAiB,EAAE,OAAyB,QAAQ,IAAI;AAC9D,WAAK,qBAAqB,aAAa;AACvC,QAAE,gBAAgB;AAAA,IACpB;AAEA,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAU;AAClC,YAAM,KAAK,OAAO,QAAQ,mBAAmB;AAC7C,UAAI,IAAI,GAAI,MAAK,MAAM,aAAa,yBAAyB,GAAG,EAAE;AAAA,IACpE;AAmCA,6BAAoB,MAAM;AACxB,UAAI,KAAK,YAAY,KAAK,SAAS,QAAQ;AACzC,aAAK,iBAAiB;AACtB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAzKE,QAAI,KAAK,GAAG,UAAU,SAAS,iBAAiB,EAAG;AACnD,SAAK,GAAG,uBAAuB,IAAI;AAEnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AAEA,SAAK,aAAa,KAAK,GAAG;AAC1B,SAAK,iBAAiB,KAAK,GAAG,YAAY;AAC1C,SAAK,GAAG,WAAW;AACnB,SAAK,UAAU,CAAC;AAChB,SAAK,kBAAkB;AACvB,SAAK,oBAAoB;AACzB,SAAK,eAAe;AACpB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAI1B,SAAK,UAAU,QAAQ;AACvB,SAAK,gBAAgB;AACrB,SAAK,GAAG,WAAW,KAAK;AACxB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAU;AACR,QAAI,CAAC,KAAK,gBAAiB;AAC3B,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,sBAAsB;AACpB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,iBAAiB,UAAU,KAAK,mBAAmB;AAC3D,SAAK,MAAM,iBAAiB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,gBAAgB,iBAAiB,WAAW,KAAK,kBAAkB;AAAA,EAC1E;AAAA,EAEA,uBAAuB;AACrB,SAAK,sBAAsB;AAC3B,SAAK,GAAG,oBAAoB,UAAU,KAAK,mBAAmB;AAC9D,SAAK,OAAO,oBAAoB,SAAS,KAAK,iBAAiB;AAC/D,SAAK,iBAAiB,oBAAoB,WAAW,KAAK,kBAAkB;AAAA,EAC9E;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,gBAAgB,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AACzE,SAAG,iBAAiB,SAAS,KAAK,kBAAkB;AACpD,SAAG,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA,EAEQ,wBAAwB;AAC9B,SAAK,iBAAiB,iBAAiB,mBAAmB,EAAE,QAAQ,CAAC,OAAO;AAC1E,SAAG,oBAAoB,SAAS,KAAK,kBAAkB;AACvD,SAAG,oBAAoB,WAAW,KAAK,oBAAoB;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EA0BA,aAAmB,GAAQ,GAAc;AACvC,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,KAAK,QAAQ,KAAK,KAAM,QAAO;AACnC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAC7D,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,eAA4B;AAC/C,QACE,CAAC,cAAc,UAAU,SAAS,UAAU,KAC5C,CAAC,cAAc,UAAU,SAAS,UAAU,GAC5C;AACA,YAAM,QAAQ,KAAK,QAAQ,KAAK,CAACC,WAAUA,OAAM,aAAa,aAAa;AAC3E,UAAI,CAAC,MAAO;AACZ,YAAM,yBAAyB,KAAK,kBAAkB;AACtD,UAAI,KAAK,YAAY;AACnB,aAAK,sBAAsB,KAAK;AAAA,MAClC,OAAO;AACL,aAAK,aAAa;AAClB,aAAK,aAAa,KAAK;AAAA,MACzB;AACA,WAAK,iBAAiB;AACtB,YAAM,uBAAuB,KAAK,kBAAkB;AACpD,YAAM,sBAAsB,CAAC,KAAK,aAAa,wBAAwB,oBAAoB;AAC3F,UAAI;AACF,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAAA,IACJ;AACA,QAAI,CAAC,KAAK,WAAY,MAAK,UAAU,MAAM;AAAA,EAC7C;AAAA,EASA,iBAAiB;AAIf,SAAK,UAAU,KAAK,GAAG,SAAS,CAAC,KAAK;AAEtC,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,QAAI,KAAK,GAAG,SAAU,MAAK,QAAQ,UAAU,IAAI,UAAU;AAE3D,SAAK,kBAAkB,SAAS,cAAc,MAAM;AACpD,SAAK,gBAAgB,KAAK,kBAAkB,MAAM,KAAK,CAAC;AACxD,SAAK,gBAAgB,aAAa,WAAW,MAAM;AACnD,SAAK,gBAAgB,aAAa,QAAQ,SAAS;AACnD,SAAK,gBAAgB,sBAAsB,KAAK,WAAW,SAAS;AACpE,QAAI,KAAK,WAAY,MAAK,gBAAgB,UAAU,IAAI,0BAA0B;AAClF,SAAK,cAAc;AACnB,SAAK,QAAQ,OAAO,KAAK,eAAe;AAExC,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,mBAAmB;AACxB,QAAI,KAAK,QAAS,MAAK,MAAM,MAAM,KAAK,OAAO;AAAA,EACjD;AAAA,EAEQ,gBAAgB;AACtB,UAAM,SAAS,KAAK,GAAG;AACvB,UAAM,QACJ,UACA,OAAO,QAAQ,QAAQ,KACvB,CAAC,OAAO,cAAc,uBAAuB,KAC7C,CAAC,OAAO,cAAc,mCAAmC;AAC3D,QAAI,OAAO;AACT,WAAK,UAAU;AACf,WAAK,kBAAkB;AAAA,IACzB,OAAO;AACL,WAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,WAAK,QAAQ,UAAU,IAAI,OAAO;AAClC,WAAK,kBAAkB;AACvB,WAAK,GAAG,OAAO,KAAK,OAAO;AAAA,IAC7B;AACA,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,WAAK,QAAQ,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,aAAa;AACrC,SAAK,GAAG,OAAO,SAAS;AACxB,cAAU,YAAY,KAAK,EAAE;AAC7B,SAAK,QAAQ,OAAO,SAAS;AAAA,EAC/B;AAAA,EAEQ,cAAc;AACpB,SAAK,QAAQ,SAAS,cAAc,OAAO;AAC3C,SAAK,MAAM,KAAK,kBAAkB,MAAM,KAAK;AAC7C,SAAK,MAAM,UAAU,IAAI,kBAAkB;AAC3C,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,aAAa,eAAe,KAAK,gBAAgB,EAAE;AAC9D,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,eAAe,KAAK,GAAG,aAAa,UAAU,EAAE,SAAS;AACpE,QAAI,KAAK,GAAG,SAAU,MAAK,MAAM,WAAW;AAC5C,SAAK,MAAM,aAAa,YAAY,KAAK,eAAe,SAAS,CAAC;AAElE,UAAM,QAAQ,KAAK,GAAG;AACtB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,KAAK,WAAW,OAAO,EAAG,MAAK,MAAM,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAClF;AAEA,SAAK,MAAM,aAAa,QAAQ,UAAU;AAC1C,SAAK,MAAM,aAAa,iBAAiB,SAAS;AAClD,SAAK,MAAM,eAAe;AAC1B,SAAK,MAAM,aAAa,iBAAiB,KAAK,gBAAgB,EAAE;AAChE,SAAK,MAAM,cAAc;AAEzB,QAAI,KAAK,SAAS;AAChB,WAAK,oBAAoB,KAAK,QAAQ;AACtC,WAAK,QAAQ,UAAU,KAAK,MAAM;AAAA,IACpC;AAEA,SAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,cAAc;AACpB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,UAAU,IAAI,OAAO;AAC3B,UAAM,aAAa,eAAe,MAAM;AACxC,SAAK,QAAQ,QAAQ,KAAK;AAAA,EAC5B;AAAA,EAEQ,gBAAgB;AACtB,QAAI,KAAK,GAAG,SAAU;AACtB,UAAM,kBAAkB,EAAE,GAAG,KAAK,QAAQ,gBAAgB;AAC1D,oBAAgB,eAAe;AAC/B,UAAM,gBAAgB,gBAAgB;AACtC,UAAM,iBAAiB,gBAAgB;AACvC,oBAAgB,YAAY,MAAM;AAChC,YAAM,iBAAiB,KAAK,gBAAgB,cAAc,WAAW;AACrE,UAAI,gBAAgB;AAClB,cAAM,UAAU;AAChB,aAAK,SAAS,eAAe,CAAC,GAAG,eAAe,WAAW,QAAQ,EAAE,QAAQ,cAAc;AAC3F,aAAK,SAAS,kBAAkB;AAChC,cAAM,UAAU;AAChB,YAAI,KAAK,SAAS,cAAc;AAC9B,cAAI,eACF,eAAe,sBAAsB,EAAE,MACvC,KAAK,gBAAgB,sBAAsB,EAAE;AAC/C,0BAAgB,KAAK,gBAAgB,eAAe;AACpD,eAAK,gBAAgB,YAAY;AAAA,QACnC;AACA,YAAI,eAAe,GAAI,MAAK,MAAM,aAAa,yBAAyB,eAAe,EAAE;AAAA,MAC3F;AACA,WAAK,MAAM,eAAe;AAC1B,UAAI,iBAAiB,OAAO,kBAAkB;AAC5C,sBAAc,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAC7C;AACA,oBAAgB,aAAa,MAAM;AACjC,WAAK,MAAM,eAAe;AAC1B,WAAK,MAAM,gBAAgB,uBAAuB;AAClD,UAAI,kBAAkB,OAAO,mBAAmB;AAC9C,uBAAe,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,IAC9C;AACA,oBAAgB,eAAe;AAC/B,SAAK,WAAW,SAAS,KAAK,KAAK,OAAO,eAAe;AAAA,EAC3D;AAAA,EAEQ,iBAA8D;AACpE,WACE,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;AAAA,EAE3F;AAAA,EAEQ,gBAAgB;AACtB,SAAK,gBAAgB,KAAK,eAAe;AACzC,SAAK,UAAU,CAAC;AAChB,SAAK,cAAc,QAAQ,CAAC,eAAe;AACzC,UAAI,WAAW,YAAY,UAAU;AACnC,cAAM,gBAAgB,KAAK;AAAA,UACzB;AAAA,UACA,KAAK,aAAa,aAAa;AAAA,QACjC;AACA,aAAK,mBAAmB,YAAiC,aAAa;AAAA,MACxE,WAAW,WAAW,YAAY,YAAY;AAC5C,cAAM,UAAU,eAAe,MAAM,KAAK;AAC1C,cAAM,cAAc,SAAS,cAAc,IAAI;AAC/C,oBAAY,UAAU,IAAI,UAAU;AACpC,oBAAY,WAAW;AACvB,oBAAY,aAAa,QAAQ,OAAO;AACxC,oBAAY,aAAa,mBAAmB,OAAO;AAInD,cAAM,aAAa,SAAS,cAAc,MAAM;AAChD,mBAAW,KAAK;AAChB,mBAAW,aAAa,QAAQ,cAAc;AAC9C,mBAAW,cAAc,WAAW,aAAa,OAAO,KAAK;AAC7D,oBAAY,gBAAgB,UAAU;AACtC,aAAK,gBAAgB,OAAO,WAAW;AAEvC,cAAM,gBAAgB,CAAC;AACvB,cAAM,gBACJ,MAAM,KAAK,WAAW,QAAQ,EAAE,OAAO,CAAC,OAAO,GAAG,YAAY,QAAQ;AAExE,sBAAc,QAAQ,CAAC,UAAU;AAC/B,gBAAM,gBAAgB,KAAK,+BAA+B,OAAO,iBAAiB;AAClF,wBAAc,KAAK,cAAc,EAAE;AACnC,eAAK,mBAAmB,OAAO,aAAa;AAAA,QAC9C,CAAC;AACD,oBAAY,aAAa,aAAa,cAAc,KAAK,GAAG,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,gBAAgB,gBAAgB;AACrC,SAAK,cAAc;AACnB,SAAK,qBAAqB;AAC1B,SAAK,UAAU,uBAAuB;AAAA,EACxC;AAAA,EAEA,mBAAmB,YAA+B,eAA4B;AAC5E,SAAK,QAAQ,KAAK,EAAE,IAAI,YAAY,UAAU,cAAc,CAAC;AAAA,EAC/D;AAAA,EAEA,kBAAkB;AAChB,SAAK,SAAS,cAAc,iBAAiB,GAAG,OAAO;AACvD,SAAK,OAAO,OAAO;AACnB,SAAK,iBAAiB,OAAO;AAC7B,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,MAAM,UAAU,SAAS,aAAa,EAAG,MAAK,YAAY,KAAK,EAAE;AACrE,QAAI,KAAK,WAAW,KAAK,sBAAsB,MAAM;AACnD,WAAK,QAAQ,UAAU,KAAK;AAAA,IAC9B;AACA,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,iBAAiB;AACxB,WAAK,QAAQ,YAAY,KAAK,EAAE;AAAA,IAClC,OAAO;AACL,WAAK,QAAQ,UAAU,OAAO,UAAU;AACxC,UAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,aAAK,QAAQ,UAAU,OAAO,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,+BACE,YACA,MACA;AACA,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,KAAK,mBAAmB,MAAM,KAAK;AACtC,OAAG,aAAa,QAAQ,QAAQ;AAChC,OAAG,WAAW;AACd,QAAI,WAAW,UAAU;AACvB,SAAG,UAAU,IAAI,UAAU;AAC3B,SAAG,eAAe;AAClB,SAAG,WAAW;AAAA,IAChB;AACA,QAAI,SAAS,kBAAmB,IAAG,UAAU,IAAI,IAAI;AAKrD,UAAM,aAAa,WAAW;AAC9B,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAI,KAAK,cAAc,CAAC,WAAW,UAAU;AAC3C,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,eAAS,OAAO;AAChB,eAAS,WAAW;AACpB,YAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,gBAAU,cAAc;AACxB,YAAM,OAAO,UAAU,SAAS;AAChC,WAAK,YAAY,KAAK;AAAA,IACxB,OAAO;AACL,WAAK,cAAc;AAAA,IACrB;AACA,OAAG,YAAY,IAAI;AAEnB,UAAM,UAAU,WAAW,aAAa,WAAW;AAGnD,UAAM,UAAU,WAAW,aAAa,OAAO,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO;AAC3E,QAAI,SAAS;AACX,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,SAAS,OAAQ,KAAI,UAAU,IAAI,GAAG,OAAO;AACjD,UAAI,MAAM;AACV,UAAI,aAAa;AACjB,SAAG,QAAQ,GAAG;AAAA,IAChB;AACA,SAAK,gBAAgB,OAAO,EAAE;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAoB;AAC/B,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,IAAI,UAAU;AACvC,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe,OAAoB;AACjC,UAAM,GAAG,WAAW;AACpB,UAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,UAAM,SAAS,eAAe;AAC9B,UAAM,WAA6B,MAAM,SAAS,cAAc,wBAAwB;AACxF,QAAI,SAAU,UAAS,UAAU;AAAA,EACnC;AAAA,EAEA,eAAe;AACb,SAAK,QAAQ,QAAQ,CAAC,UAAU,KAAK,eAAe,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,iBAAiB,OAAoB;AACnC,UAAM,aAAa,KAAK,kBAAkB;AAC1C,WAAO,WAAW,KAAK,CAAC,cAAc,cAAc,MAAM,GAAG,KAAK;AAAA,EACpE;AAAA,EAEA,sBAAsB,OAAoB;AACxC,QAAI,KAAK,iBAAiB,KAAK,EAAG,MAAK,eAAe,KAAK;AAAA,QACtD,MAAK,aAAa,KAAK;AAAA,EAC9B;AAAA,EAEA,sBAA2C;AACzC,WAAO,MAAM,UAAU,OAAO;AAAA,MAC5B,KAAK,GAAG;AAAA,MACR,CAAC,eAAkC;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,UAAM,sBAAsB,KAAK,oBAAoB;AACrD,UAAM,sBAAsB,KAAK,QAAQ;AAAA,MACvC,CAAC,UAAU,oBAAoB,QAAQ,MAAM,EAAE,KAAK;AAAA,IACtD;AACA,UAAM,yBAAyB,oBAAoB,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,QAAQ;AAGjF,UAAM,QAAQ,uBAAuB;AAAA,MAAI,CAAC,UACxC,MAAM,SAAS,cAAc,MAAM,EAAE,YAAY,KAAK;AAAA,IACxD;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,sBAAyC,KAAK,GAAG,cAAc,iBAAiB;AACtF,UAAI,uBAAuB,oBAAoB,UAAU,IAAI;AAC3D,aAAK,MAAM,QAAQ,oBAAoB;AACvC;AAAA,MACF;AAAA,IACF;AACA,SAAK,MAAM,QAAQ,MAAM,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,qBAAqB;AACnB,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,YAAM,mBAAmB,MAAM,GAAG;AAClC,YAAM,KAAuB,MAAM,SAAS,cAAc,wBAAwB;AAClF,UAAI,GAAI,IAAG,UAAU;AACrB,UAAI,kBAAkB;AACpB,aAAK,gBAAgB,KAAK,iBAAiB,MAAM,QAAQ;AAAA,MAC3D,OAAO;AACL,cAAM,SAAS,UAAU,OAAO,UAAU;AAC1C,cAAM,SAAS,eAAe;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,IAAiB,IAAiB;AAChD,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,KAAK;AACR,SAAG,iBAAiB,aAAa,EAAE,QAAQ,CAAC,QAAQ,IAAI,UAAU,OAAO,UAAU,CAAC;AACtF,OAAG,UAAU,IAAI,UAAU;AAC3B,OAAG,eAAe;AAAA,EACpB;AAAA,EAEA,oBAAoB;AAClB,WAAO,KAAK,oBAAoB,EAAE,IAAI,CAAC,eAAe,WAAW,KAAK;AAAA,EACxE;AACF;;;AChiBA,IAAMC,cAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EAM/B,YAAY,IAAiB,WAAwB,SAA8C;AAenG,SAAQ,uBAAuB,CAAC,MAAkB;AAChD,UAAI,KAAK,WAAW,EAAE,KAAK,OAAoB,EAAE,WAAW,CAAgB,EAAE,OAAQ,QAAQ,iBAAiB,GAAI;AACjH,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAU,MAAM;AACd,eAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAC/D,WAAK,UAAU,OAAO;AAAA,IACxB;AAYA,gBAAO,MAAM;AACX,UAAI,KAAK,QAAS;AAClB,WAAK,UAAU;AACf,YAAM,cAAc,MAAM,qBAAqB,KAAK,IAAI,KAAK,WAAW,UAAU,KAAK,QAAQ,QAAQ,KAAK,QAAQ,YAAY,KAAK,QAAQ,KAAK;AAIlJ,WAAK,UAAU,MAAM,aAAa;AAClC,WAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,KAAK,QAAQ,QAAQ;AAAA,gBACvB,KAAK,QAAQ,QAAQ;AACjC,iBAAW,MAAM;AACf,aAAK,UAAU,MAAM,YAAY,cAAc,YAAY,CAAC,kBAAkB,YAAY,CAAC;AAC3F,aAAK,UAAU,MAAM,UAAW,GAAG,SAAS;AAAA,MAC9C,GAAG,CAAC;AAAA,IACN;AAEA,gBAAO,MAAM;AACX,UAAI,CAAC,KAAK,QAAS;AACnB,WAAK,UAAU;AAEf,WAAK,UAAU,gBAAgB,OAAO;AACtC,WAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,KAAK,QAAQ,QAAQ;AAAA,gBACvB,KAAK,QAAQ,QAAQ;AACjC,iBAAW,MAAM;AACf,aAAK,UAAU,MAAM,YAAY;AACjC,aAAK,UAAU,MAAM,UAAU;AAAA,MACjC,GAAG,CAAC;AAAA,IACN;AArEE,SAAK,KAAK;AACV,SAAK,UAAU;AAAA,MACb,GAAGA;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,UAAU,IAAI,gBAAgB;AAC7C,SAAK,UAAU,OAAO,SAAS;AAC/B,OAAG,cAAc,OAAO,KAAK,SAAS;AAEtC,aAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAO,KAAK,IAAiB,WAAwB,SAAoE;AACvH,WAAO,IAAI,qBAAoB,IAAI,WAAW,OAAO;AAAA,EACvD;AAgCF;;;ACuFA,IAAMC,cAA+B;AAAA;AAAA,EAEnC,QAAQ;AAAA;AAAA,EAER,OAAO;AAAA;AAAA,EAEP,aAAa;AAAA;AAAA,EAEb,gBAAgB;AAAA;AAAA,EAEhB,qBAAqB;AAAA;AAAA,EAErB,aAAa;AAAA;AAAA,EAEb,gBAAgB;AAAA;AAAA,EAEhB,gBAAgB;AAAA;AAAA,EAEhB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA;AAAA,EAEd,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA;AAAA,EAET,SAAS;AAAA;AAAA,EAET,WAAW;AAAA;AAAA,EAEX,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,kBAAkB;AAAA;AAAA,EAElB,oBAAoB;AAAA;AAAA,EAEpB,iCAAiC;AAAA;AAAA,EAEjC,eAAe;AAAA;AAAA,EAEf,WAAW;AAAA;AAAA,EAEX,cAAc;AAAA;AAAA,EAEd,YAAY;AAAA;AAAA,EAEZ,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAAA,IACvF,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IAC/D,gBAAgB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD;AAAA;AAAA,EAEA,QAAQ,CAAC;AAAA;AAAA,EAET,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,IAAM,cAAN,MAAM,oBAAmB,UAA6B;AAAA,EAqC3D,YAAY,IAAsB,SAAqC;AACrE,UAAM,IAAI,SAAS,WAAU;AAnC/B,oBAAoB;AAyBpB;AAAA,SAAQ,aAAa;AAErB;AAAA,SAAQ,aAAa;AAErB;AAAA,SAAQ,eAAuB;AAE/B;AAAA,SAAQ,UAAkB;AAm+B1B,6BAAoB,CAAC,MAAM;AAEzB,UAAI,EAAE,QAAQ,QAAQ;AACpB,UAAE,eAAe;AAAA,MACnB;AACA,WAAK,YAAY,MAAM;AACrB,aAAK,iBAAiB,EAAE,MAA0B;AAClD,aAAK,KAAK;AACV,aAAK,SAAsB,EAAE,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,MAC5E,CAAC;AACD,UAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAChD,UAAI,KAAK,QAAQ,mBAAoB,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AAAA,IAChF;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,YAAY,MAAM;AACrB,eAAK,iBAAiB,EAAE,MAA0B;AAClD,eAAK,KAAK;AAAA,QACZ,CAAC;AACD,YAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAChD,YAAI,KAAK,QAAQ,mBAAoB,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AAAA,MAChF;AAAA,IACF;AAEA,gCAAuB,CAAC,MAAM;AAC5B,YAAM,SAAsB,EAAE;AAC9B,UAAI,OAAO,UAAU,SAAS,aAAa,EAAG;AAE9C,WAAK,YAAY,MAAM;AACrB,YACE,OAAO,UAAU,SAAS,uBAAuB,KACjD,CAAC,OAAO,UAAU,SAAS,UAAU,KACrC,CAAC,OAAO,cAAc,UAAU,SAAS,aAAa,GACtD;AACA,gBAAM,eAAe,IAAI;AAAA,YACvB,EAAE,OAAO,aAAa,WAAW;AAAA,YACjC,EAAE,OAAO,aAAa,YAAY;AAAA,YAClC,EAAE,OAAO,aAAa,UAAU;AAAA,UAClC;AAEA,cAAI,CAAC,KAAK,YAAa,KAAK,YAAY,KAAK,QAAQ,qBAAsB;AACzE,iBAAK,QAAQ,YAAY;AAAA,UAC3B;AAGA,cAAI,KAAK,QAAQ,aAAa;AAC5B,iBAAK,8BAA8B,YAAY;AAAA,UACjD;AAEA,cAAI,KAAK,QAAQ,WAAY,MAAK,iBAAiB;AAAA,QACrD,WAAW,OAAO,QAAQ,aAAa,GAAG;AACxC,eAAK,UAAU;AAAA,QACjB,WAAW,OAAO,QAAQ,aAAa,GAAG;AACxC,eAAK,UAAU;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,yCAAgC,CAAC,SAAe;AAC9C,UAAI,KAAK,WAAW,QAAQ,CAAC,YAAW,cAAc,MAAM,KAAK,OAAO,GAAG;AACzE,YAAI,YAAW,QAAQ,KAAK,IAAI,KAAK,YAAW,iBAAiB,MAAM,KAAK,IAAI,GAAG;AACjF;AAAA,QACF;AAEA,aAAK,QAAQ,MAAM,OAAO,YAAW,QAAQ,KAAK,IAAI,CAAC;AACvD;AAAA,MACF;AAEA,WAAK,YAAY;AACjB,WAAK,KAAK;AAAA,IACZ;AAEA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,eAAe;AAAA,IACtB;AAEA,uBAAc,MAAM;AAClB,WAAK,OAAO;AACZ,WAAK,UAAU;AACf,WAAK,KAAK;AAAA,IACZ;AAEA,8BAAqB,CAAC,MAAM;AAC1B,WAAK,UAAU,EAAE,OAAO,KAAK;AAAA,IAC/B;AAEA,6BAAoB,CAAC,MAAM;AACzB,WAAK,SAAS,EAAE,OAAO,KAAK;AAAA,IAC9B;AAkBA,8BAAqB,CAAC,MAAa;AACjC,UAAI;AACJ,YAAM,KAAK,EAAE;AAEb,UAAI,EAAE,QAAQ,GAAG,YAAY,KAAM;AAEnC,UAAI,MAAM,KAAK,aAAa,CAAC,KAAK,KAAM;AACxC,UAAI,KAAK,QAAQ,OAAO;AACtB,eAAO,KAAK,QAAQ;AAAA,UACjB,EAAE,OAA4B;AAAA,UAC/B,OAAO,KAAK,QAAQ,WAAW,aAC3B,KAAK,QAAQ,OAAO,IAAI,KAAK,KAAK,GAAG,KAAK,CAAC,IAC3C,KAAK,QAAQ;AAAA,QACnB;AAAA,MACF,OAAO;AACL,eAAO,IAAI,KAAK,KAAK,MAAO,EAAE,OAA4B,KAAK,CAAC;AAAA,MAClE;AACA,UAAI,YAAW,QAAQ,IAAI,GAAG;AAC5B,aAAK,QAAQ,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI;AACpD,YAAI,EAAE,QAAQ,QAAQ;AACpB,eAAK,YAAY,GAAG,IAAI;AACxB,eAAK,eAAe;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAsBA,4BAAmB,MAAM;AACvB,WAAK,eAAe;AAAA,IACtB;AAEA,oBAAW,MAAM;AACf,WAAK,iBAAiB;AACtB,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,IAAI;AAAA,IACpF;AAEA,mBAAU,MAAM;AACd,UAAI,OAAO,KAAK,QAAQ,aAAa,WAAY,MAAK,QAAQ,SAAS,KAAK,IAAI;AAAA,IAClF;AApoCE,SAAK,GAAG,uBAAuB,IAAI;AAEnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AAGA,QAAI,CAAC,CAAC,WAAW,QAAQ,eAAe,MAAM,KAAK,OAAO,QAAQ,SAAS,UAAU;AACnF,WAAK,QAAQ,OAAO,EAAE,GAAG,YAAW,SAAS,MAAM,GAAG,QAAQ,KAAK;AAAA,IACrE;AAGA,QAAI,KAAK,QAAQ,QAAS,MAAK,QAAQ,QAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAClE,QAAI,KAAK,QAAQ,QAAS,MAAK,QAAQ,QAAQ,SAAS,GAAG,GAAG,GAAG,CAAC;AAElE,SAAK,KAAK,MAAM,KAAK;AAErB,SAAK,gBAAgB;AACrB,SAAK,mBAAmB;AACxB,SAAK,oBAAoB;AAEzB,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,QAAQ,cAAc,IAAI,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC;AAAA,IAC/D;AAEA,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,YAAW,QAAQ,OAAO,GAAG;AAC/B,UAAI,KAAK,QAAQ,gBAAgB;AAC/B,aAAK,QAAQ,SAAS,IAAI;AAC1B,aAAK,cAAc,KAAK,IAAI,OAAO;AAAA,MACrC,OAAO;AACL,aAAK,SAAS,OAAO;AAAA,MACvB;AAAA,IACF,OAAO;AACL,WAAK,SAAS,oBAAI,KAAK,CAAC;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,WAAW;AAChB,YAAM,aAAa,KAAK,QAAQ;AAChC,UAAI,YAAW,QAAQ,UAAU,GAAG;AAClC,YAAI,KAAK,QAAQ,mBAAmB;AAClC,eAAK,QAAQ,YAAY,MAAM,IAAI;AACnC,eAAK,cAAc,KAAK,WAAW,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,qBAAqB;AACpC,WAAK,WAAW;AAChB,WAAK,QAAQ,CAAC;AACd,WAAK,UAAU,CAAC;AAChB,WAAK,QAAQ,KAAK,EAAE;AAAA,IACtB;AACA,QAAI,KAAK,QAAQ,eAAe;AAC9B,UAAI,KAAK,QAAQ,kBAAkB,SAAU,MAAK,gBAAgB,oBAAoB,KAAK,KAAK,IAAI,KAAK,aAAa,KAAK,QAAQ,oBAAoB;AAAA,IACzJ;AAAA,EACF;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QAAQ,OAAwB;AACrC,WAAO,OAAO,SAAS,EAAE,EACtB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAAA,EAC1B;AAAA,EAEA,OAAO,QAAQ,KAAK;AAClB,WAAO,OAAO,KAAK,OAAO,UAAU,SAAS,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;AAAA,EACjF;AAAA,EAEA,OAAO,WAAW,MAAM;AACtB,UAAM,MAAM,KAAK,OAAO;AACxB,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,MAAM;AAC5B,QAAI,YAAW,QAAQ,IAAI,EAAG,MAAK,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,EACxD;AAAA,EAEA,OAAO,gBAAgB,MAAM,OAAO;AAClC,WAAO,CAAC,IAAI,YAAW,YAAY,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EACxF,KACF;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,MAAM;AAEvB,WAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAAA,EAChE;AAAA,EAEA,OAAO,cAAc,GAAG,GAAG;AAEzB,WAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,oBAAoB,KAAW,MAAY,SAAe;AAC/D,WAAO,IAAI,QAAQ,IAAI,KAAK,QAAQ,KAAK,IAAI,QAAQ,IAAI,QAAQ,QAAQ;AAAA,EAC3E;AAAA,EAEA,OAAO,iBAAiB,GAAS,GAAS;AACxC,WAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,EACjC;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,OAAO;AACxB,SAAK,eAAe;AACpB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA,EAEA,iBAAiB;AACf,UAAM,gBAAgB,KAAK,WAAW,cAAc,mBAAmB;AACvE,QAAI,eAAe;AACjB,iBAAW,YAAY,aAA4B,EAAE,QAAQ;AAAA,IAC/D;AACA,UAAM,iBAAiB,KAAK,WAAW,cAAc,oBAAoB;AACzE,QAAI,gBAAgB;AAClB,iBAAW,YAAY,cAA6B,EAAE,QAAQ;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,qBAAqB;AAEnB,QAAI,KAAK,GAAG,QAAQ,QAAQ;AAC1B,WAAK,GAAG,UAAU,IAAI,uBAAuB;AAAA,IAC/C;AAIA,SAAK,uBAAuB,KAAK,EAAE;AAEnC,QAAI,KAAK,QAAQ,aAAa;AAC5B,WAAK,YAAY,UAAU,IAAI,WAAW;AAC1C,UAAI,CAAC,KAAK,QAAQ,gBAAgB;AAChC,aAAK,YAAY,KAAK,gBAAgB;AACtC,aAAK,UAAU,UAAU,IAAI,qBAAqB;AAAA,MACpD,OAAO;AAIL,aAAK,YAAY,SAAS,cAAc,KAAK,QAAQ,cAAc;AACnE,YAAI,CAAC,KAAK,WAAW;AACnB,kBAAQ,KAAK,oEAAoE;AAAA,QACnF,OAAO;AACL,eAAK,uBAAuB,KAAK,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAQA,UAAM,aAAa,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,CAAC,kBAAkB,GAAG,KAAK,QAAQ,cAAc,KAAK,iBAAiB;AAEhI,QAAI,CAAC,KAAK,QAAQ,YAAY;AAC5B,YAAM,4BAA4B,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,OAAO;AAAA,IAC9H;AAEA,QAAI,KAAK,QAAQ,WAAW;AAC1B,YAAM,QAAQ,KAAK,QAAQ;AAC3B,WAAK,QAAQ,YACX,iBAAiB,cAAc,QAAS,SAAS,cAAc,KAAK;AACtE,WAAK,QAAQ,UAAU,OAAO,KAAK,WAAW;AAAA,IAChD,OAAO;AAEL,YAAM,WAAW,CAAC,KAAK,YAAY,KAAK,KAAK,KAAK;AAClD,UAAI,CAAC,KAAK,QAAQ,cAAe,CAAC,KAAK,YAA4B,aAAa,SAAS,oCAAoC;AAC7H,eAAS,cAAc,MAAM,KAAK,WAAW;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,IAAsB;AAC3C,UAAM,WAAW,GAAG,eAAe,cAAc,oBAAoB;AACrE,QAAI,CAAC,SAAU;AAIf,aAAS,cACP,OAAO,KAAK,QAAQ,WAAW,aAAa,KAAK,OAAO,KAAK,QAAQ,MAAM;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAa,KAAK,MAAM,SAAyC,MAAc;AACtF,aAAS,UAAU,KAAK,QAAQ;AAChC,QAAI,OAAO,WAAW,WAAY,QAAO,OAAO,IAAI;AACpD,QAAI,CAAC,YAAW,QAAQ,IAAI,EAAG,QAAO;AAEtC,WAAO,KAAK,WAAW,MAAM,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAY,QAAgB;AACrC,UAAM,cAAc,OAAO,MAAM,6BAA6B;AAC9D,WAAO,YACJ,IAAI,CAAC,UAAW,KAAK,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,IAAI,IAAI,KAAM,EACxE,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAsB;AACrC,UAAM,OAAO,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,CAAC;AAC1C,SAAK,QAAQ,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QACE,OAAa,MACb,kBAA2B,OAC3B,YAAqB,OACrB,gBAAyB,OACzB;AACA,UAAM,eAAe,KAAK,aAAa,IAAI;AAC3C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,QAAQ,oBAAqB,MAAK,cAAc,cAAc,SAAS;AAAA,aACxE,CAAC,cAAe,MAAK,aAAa,YAAY;AACvD,gBAAW,iBAAiB,YAAY;AACxC,SAAK,SAAS,YAAY;AAC1B,QAAI,CAAC,mBAAmB,OAAO,KAAK,QAAQ,aAAa,YAAY;AACnE,WAAK,QAAQ,SAAS,KAAK,MAAM,YAAY;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,aAAa,MAAY;AACvB,QAAI,CAAC,MAAM;AACT,WAAK,mBAAmB,IAAI;AAC5B,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,IAClC;AACA,QAAI,CAAC,YAAW,QAAQ,IAAI,GAAG;AAC7B;AAAA,IACF;AACA,UAAM,MAAM,KAAK,QAAQ,SACvB,MAAM,KAAK,QAAQ;AACrB,QAAI,YAAW,QAAQ,GAAG,KAAK,OAAO,KAAK;AACzC,aAAO;AAAA,IACT,WAAW,YAAW,QAAQ,GAAG,KAAK,OAAO,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,MAAY,WAAoB;AAC5C,QAAI,CAAC,WAAW;AACd,WAAK,OAAO;AAAA,IACd,WAAW,WAAW;AACpB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAY;AACvB,UAAM,eAAe,KAAK,OAAO,KAAK,CAAC,SAAS;AAC9C,aAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,IAAI,OAAO;AAAA,IACpD,CAAC;AACD,QAAI,CAAC,cAAc;AACjB,WAAK,MAAM,KAAK,IAAI;AAAA,IACtB,OAAO;AACL,WAAK,MAAM,OAAO,KAAK,MAAM,QAAQ,YAAY,GAAG,CAAC;AAAA,IACvD;AACA,SAAK,MAAM,KAAK,CAAC,GAAS,MAAa,EAAE,QAAQ,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAE;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,IAAI,MAAM;AACpB,OAAG,aAAa,aAAa,KAAK,SAAS,IAAI,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACf,QAAI,CAAC,KAAK,SAAS,qBAAqB;AACtC,WAAK,cAAc,KAAK,IAAI,KAAK,IAAI;AACrC,UAAI,KAAK,SAAS,aAAa;AAC7B,aAAK,cAAc,KAAK,WAAW,KAAK,OAAO;AAAA,MACjD;AACA;AAAA,IACF;AACA,SAAK,gCAAgC;AAAA,EACvC;AAAA,EAEA,kCAAkC;AAChC,UAAM,aAAa,MAAM,KAAK,KAAK,OAAO,EAAE,OAAO,CAAC,IAAI,UAAU;AAChE,UAAI,QAAQ,KAAK,MAAM,SAAS,EAAG,QAAO;AAAA,IAC5C,CAAC;AACD,eAAW,QAAQ,CAAC,OAAO;AACzB,SAAG,OAAO;AAAA,IACZ,CAAC;AACD,SAAK,MAAM,QAAQ,CAAC,MAAY,UAAkB;AAChD,UAAI,MAAM,KAAK,KAAK,OAAO,EAAE,KAAK,GAAG;AACnC,aAAK,cAAc,KAAK,QAAQ,KAAK,GAAG,IAAI;AAC5C;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,gBAAgB;AACpC,WAAK,cAAc,QAAQ,IAAI;AAC/B,WAAK,QAAQ,KAAK,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,IAAI,MAAM;AACtB,QAAI,GAAG,QAAQ,QAAQ;AACrB,WAAK,YAAY,IAAI,IAAI;AACzB,SAAG,QAAQ,KAAK,WAAW,MAAM,YAAY;AAAA,IAC/C,OAAO;AACL,SAAG,QAAQ,KAAK,SAAS,IAAI;AAAA,IAC/B;AACA,SAAK,GAAG;AAAA,MACN,IAAI,YAAY,UAAU;AAAA,QACxB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,EAAE,SAAS,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,MAAY,UAAgB,MAAM;AACnD,UAAM,cAAc,YAAW,QAAQ,IAAI,IAAI,OAAO,oBAAI,KAAK;AAI/D,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,WAAW,cAAc,KAAK,WAAW,aAAa,YAAY;AAAA,IACzE,OAAO;AACL,YAAM,iBAAiB,YAAW,QAAQ,OAAO,IAAI,UAAU,oBAAI,KAAK;AACxE,WAAK,WAAW,cAAc,GAAG,KAAK,WAAW,aAAa,OAAO,CAAC,MAAM,KAAK,WAAW,gBAAgB,OAAO,CAAC;AAAA,IACtH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,MAAY;AACnB,QAAI,cAAc;AAClB,QAAI,CAAC,YAAW,QAAQ,IAAI,GAAG;AAC7B;AAAA,IACF;AACA,QAAI,KAAK,WAAW;AAClB,YAAM,mBAAmB,IAAI,KAAK,KAAK,UAAU,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,EAAE,OAAO,CAAC,GAClF,kBAAkB,IAAI;AAAA,QACpB,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,QAC1C,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,QAC1C;AAAA,MACF,GACA,cAAc,KAAK,QAAQ;AAE7B,sBAAgB,SAAS,gBAAgB,SAAS,IAAI,CAAC;AACvD,sBAAgB,QAAQ,gBAAgB,QAAQ,IAAI,CAAC;AACrD,oBACE,cAAc,iBAAiB,QAAQ,KAAK,gBAAgB,QAAQ,IAAI;AAAA,IAC5E;AACA,QAAI,aAAa;AACf,WAAK,YAAY;AAAA,QACf;AAAA,UACE,OAAO,KAAK,SAAS;AAAA,UACrB,MAAM,KAAK,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AACA,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,kBAAkB;AAChB,SAAK,UAAU,CAAC,IAAI,KAAK,eAAe,KAAK,UAAU,CAAC,CAAC;AACzD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,eAAe,UAAU;AACvB,QAAI,SAAS,QAAQ,GAAG;AACtB,eAAS,QAAQ,KAAK,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE;AACxD,eAAS,SAAS;AAAA,IACpB;AACA,QAAI,SAAS,QAAQ,IAAI;AACvB,eAAS,QAAQ,KAAK,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE;AACzD,eAAS,SAAS;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,SAAK,UAAU,CAAC,EAAE;AAClB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,YAAY;AACV,SAAK,UAAU,CAAC,EAAE;AAClB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,OAAO,MAAM,OAAO,QAAQ;AAC1B,UAAM,MAAM,oBAAI,KAAK,GACnB,OAAO,YAAW,gBAAgB,MAAM,KAAK,GAC7C,OAAO,CAAC;AACV,QAAI,SAAS,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,GAC3C,MAAM,CAAC;AACT,gBAAW,iBAAiB,GAAG;AAC/B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,gBAAU,KAAK,QAAQ;AACvB,UAAI,SAAS,GAAG;AACd,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,gBAAgB,UAAU,IAAI,KAAK,QAAQ,GAC/C,YAAY,UAAU,KAAK,IAAI,QAAQ,GACvC,sBAAsB,UAAU,IAAI,OAAO,IAAI,MAC/C,kBAAkB,UAAU,KAAK,OAAO,IAAI,MAC5C,sBAAsB,YAAW,gBAAgB,qBAAqB,aAAa;AACrF,QAAI,QAAQ,OAAO,QACjB,QAAQ;AACV,WAAO,QAAQ,GAAG;AAChB,eAAS;AAAA,IACX;AACA,aAAS,IAAI;AACb,QAAI,iBAAiB;AACrB,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,KAAK;AACrC,YAAM,MAAM,IAAI,KAAK,MAAM,OAAO,KAAK,IAAI,OAAO,GAChD,UAAU,YAAW,cAAc,KAAK,GAAG,GAC3C,WAAW,KAAK,QAAQ,OAAO,QAAQ,IAAI,aAAa,CAAC,MAAM,IAC/D,UAAU,IAAI,UAAU,KAAK,OAAO,QACpC,eACE,KAAK,QAAQ,cAAc,YAAW,cAAc,KAAK,QAAQ,YAAY,GAAG,GAClF,aAAa,KAAK,QAAQ,YAAY,YAAW,cAAc,KAAK,QAAQ,UAAU,GAAG,GACzF,YACE,KAAK,QAAQ,cACb,KAAK,QAAQ,YACb,KAAK,QAAQ,aAAa,OAC1B,MAAM,KAAK,QAAQ,UACrB,aACG,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,WAC3C,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,WAC3C,KAAK,QAAQ,mBAAmB,YAAW,WAAW,GAAG,KACzD,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,aAAa,GAAG,GAC7D,mBAAmB,KAAK,QAAQ,eAAe,KAAK,QAAQ,KAAK,WAAW,YAAW,cAAc,KAAK,MAAM,GAAG,GACnH,iBAAiB,KAAK,QAAQ,eAAe,KAAK,WAAW,YAAW,cAAc,KAAK,SAAS,GAAG,GACvG,cACE,KAAK,QAAQ,eACb,YAAW,QAAQ,KAAK,OAAO,KAC/B,YAAW,oBAAoB,KAAK,KAAK,MAAM,KAAK,OAAO;AAC/D,UAAI,YAAY,KAAK,IAAI,SACvB,cAAc,OACd,aAAa;AAEf,UAAI,aAAa;AACjB,UAAI,YAAW,QAAQ,KAAK,IAAI,GAAG;AACjC,qBAAa,YAAW,cAAc,KAAK,KAAK,IAAI;AAAA,MACtD;AAEA,UAAI,CAAC,cAAc,YAAW,QAAQ,KAAK,OAAO,GAAG;AACnD,qBAAa,YAAW,cAAc,KAAK,KAAK,OAAO;AAAA,MACzD;AAEA,UACE,KAAK,QAAQ,uBACb,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC,GAC3D;AACA,qBAAa;AAAA,MACf;AAEA,UAAI,SAAS;AACX,YAAI,IAAI,QAAQ;AACd,sBAAY,sBAAsB;AAClC,wBAAc;AACd,uBAAa;AAAA,QACf,OAAO;AACL,sBAAY,YAAY;AACxB,wBAAc;AACd,uBAAa;AAAA,QACf;AAAA,MACF;AAEA,YAAM,YAAY;AAAA,QAChB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC,KAAK,QAAQ;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,KAAK,KAAK,UAAU,SAAS,CAAC;AAElC,UAAI,EAAE,MAAM,GAAG;AACb,aAAK,KAAK,KAAK,UAAU,KAAK,KAAK,QAAQ,OAAO,cAAc,CAAC;AACjE,cAAM,CAAC;AACP,YAAI;AACJ,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,WAAO,KAAK,YAAY,KAAK,SAAS,MAAM,MAAM;AAAA,EACpD;AAAA,EAEA,UAAU,MAAM;AACd,UAAM,WAAW;AAAA,MACb,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf,GACA,eAAe,EAAE,CAAC,cAAc,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,eAAe,IAAI,KAAK,KAAK,IAAI,MAAM,KAAK,EAAE,WAAW,IACjI,MAAM,CAAC,gBAAgB;AAEzB,QAAI,KAAK,SAAS;AAChB,UAAI,KAAK,iCAAiC;AACxC,YAAI,KAAK,0BAA0B;AACnC,YAAI,KAAK,uBAAuB;AAAA,MAClC,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAEA,eAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC5D,UAAI,KAAK,eAAe,QAAQ,KAAK,KAAK,QAAQ,GAAG;AACnD,YAAI,KAAK,SAAS;AAAA,MACpB;AAAA,IACF;AAEA,WACE,iBAAiB,KAAK,GAAG,YAAY,IAAI,KAAK,GAAG,CAAC,oBAAoB,YAAY,oEAChB,KAAK,IAAI,iBAAiB,KAAK,KAAK,eAAe,KAAK,GAAG,KAAK,KAAK,GAAG;AAAA,EAG9I;AAAA,EAEA,UAAU,MAAM,OAAO,eAAe;AACpC,WACE,+BACC,gBAAgB,iBAAiB,MAClC,QACC,QAAQ,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,IACvC;AAAA,EAEJ;AAAA,EAEA,YAAY,MAAM,MAAM,QAAQ;AAC9B,WACE,wIACA,SACA,OACA,KAAK,WAAW,IAAI,IACpB,KAAK,WAAW,IAAI,IACpB;AAAA,EAEJ;AAAA,EAEA,WAAW,MAAM;AACf,UAAM,MAAM,CAAC;AACb,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACtB,YAAM,OAAO,YAAW,QAAQ,KAAK,cAAc,MAAM,CAAC,CAAC;AAC3D,YAAM,SAAS,YAAW,QAAQ,KAAK,cAAc,MAAM,GAAG,IAAI,CAAC;AACnE,UAAI,KAAK,gCAAgC,IAAI,KAAK,MAAM,cAAc;AAAA,IACxE;AACA,WAAO,iBAAiB,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,EACvE;AAAA,EAEA,WAAW,MAAM;AACf,WAAO,YAAY,KAAK,KAAK,EAAE,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAY,MAAc,OAAe;AAC/C,UAAM,OAAO,KAAK;AAClB,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,YAAY,SAAS,KAAK;AAChC,WAAO;AAAA,MACL,MAAM,EAAE,cAAc,UAAU,KAAK,KAAK,YAAY;AAAA,MACtD,MAAM,EAAE,cAAc,UAAU,MAAM,KAAK,YAAY;AAAA,IACzD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAkB,MAAsB;AAC9C,UAAM,IAAI,KAAK;AACf,WAAO;AAAA,MACL;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,MAAM,QAAQ,EAAE,SAAS,IAAI,EAAE,UAAU,KAAK,GAAG,IAAI,EAAE;AAAA,MACvD,EAAE;AAAA,MACF,EAAE;AAAA,IACJ,EAAE,KAAK,GAAG;AAAA,EACZ;AAAA,EAEA,YAAY,UAAU,GAAG,MAAM,OAAO,SAAS,QAAQ;AACrD,UAAM,OAAO,KAAK,SAChB,YAAY,SAAS,KAAK,SAC1B,YAAY,SAAS,KAAK;AAC5B,QAAI,GACF,GACA,MAAM,CAAC,GACP,OACE,cACA,SACA;AAKJ,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK,YAAY,MAAM,KAAK;AAEnD,SAAK,IAAI,GAAG,IAAI,IAAI,KAAK;AACvB,UAAI;AAAA,QACF,qBACG,SAAS,UAAU,IAAI,IAAI,KAAK,IAAI,KACrC,OACC,MAAM,QAAQ,yBAAyB,OACtC,aAAa,IAAI,KAAK,YAAc,aAAa,IAAI,KAAK,WACxD,wBACA,MACJ,MACA,YAAW,QAAQ,KAAK,KAAK,OAAO,CAAC,CAAC,IACtC;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,YACJ,uEACA,IAAI,KAAK,EAAE,IACX;AAEF,QAAI,MAAM,QAAQ,KAAK,SAAS,GAAG;AACjC,UAAI,KAAK,UAAU,CAAC;AACpB,UAAI,KAAK,UAAU,CAAC,IAAI;AAAA,IAC1B,OAAO;AACL,UAAI,OAAO,KAAK;AAChB,UAAI,IAAI,OAAO,KAAK;AAAA,IACtB;AAEA,SAAK,MAAM,CAAC,GAAG,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK;AAC9C,UAAI,KAAK,KAAK,SAAS;AACrB,YAAI,KAAK,kBAAkB,CAAC,KAAK,MAAM,OAAO,wBAAwB,EAAE,IAAI,CAAC,WAAW;AAAA,MAC1F;AAAA,IACF;AACA,QAAI,KAAK,iBAAkB,KAAI,QAAQ;AAEvC,UAAM,WAAW,oEAAoE,IAAI,KAAK,EAAE,CAAC;AAEjG,UAAM,YACJ;AACF,YAAQ,4BACN,OAAO,KAAK,cAEd,mBAAmB,SAAS;AAE5B,YAAQ;AACR,QAAI,KAAK,oBAAoB;AAC3B,cAAQ,WAAW;AAAA,IACrB,OAAO;AACL,cAAQ,YAAY;AAAA,IACtB;AACA,YAAQ;AAER,UAAM,aACJ;AACF,YAAQ,4BACN,OAAO,KAAK,cAEd,mBAAmB,UAAU;AAE7B,WAAQ,QAAQ;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,YAAY,IAAgB;AAClC,SAAK;AACL,QAAI;AACF,SAAG;AAAA,IACL,UAAE;AACA,WAAK;AACL,UAAI,KAAK,eAAe,KAAK,KAAK,YAAY;AAC5C,aAAK,aAAa;AAClB,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO;AAEL,QAAI,KAAK,aAAa,GAAG;AACvB,WAAK,aAAa;AAClB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,SAChB,UAAU,KAAK,SACf,UAAU,KAAK,SACf,WAAW,KAAK,UAChB,WAAW,KAAK;AAElB,QAAI,KAAK,MAAM,SAAS;AACtB,WAAK,KAAK;AACV,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,UAAU;AAC1C,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AACA,QAAI,KAAK,MAAM,SAAS;AACtB,WAAK,KAAK;AACV,UAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,UAAU;AAC1C,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,UAAU,CAAC,EAAE;AAC/B,UAAM,QAAQ,KAAK,UAAU,CAAC,EAAE;AAEhC,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,WAAK,mBAAmB,KAAK,IAAI;AAAA,IACnC,OAAO;AACL,WAAK,mBAAmB,KAAK,MAAM,KAAK,OAAO;AAAA,IACjD;AAMA,UAAM,MAAM,KAAK,kBAAkB,IAAI;AACvC,QAAI,QAAQ,KAAK,gBAAgB,KAAK,WAAW,cAAc,sBAAsB,GAAG;AACtF,WAAK,eAAe,MAAM,KAAK;AAAA,IACjC,OAAO;AACL,WAAK,eAAe;AAGpB,WAAK,UAAU,sBAAsB,MAAM,KAAK;AAChD,WAAK,iBAAiB,MAAM,KAAK;AAAA,IACnC;AACA,SAAK,qBAAqB,MAAM,KAAK;AAErC,QAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,WAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGQ,iBAAiB,MAAc,OAAe;AACpD,SAAK,eAAe;AACpB,SAAK,WAAW,YAAY,KAAK,YAAY,MAAM,GAAG,MAAM,OAAO,MAAM,KAAK,OAAO;AAErF,UAAM,aAAa,KAAK,WAAW,cAAc,mBAAmB;AACpE,UAAM,cAAc,KAAK,WAAW,cAAc,oBAAoB;AAEtE,eAAW,KAAK,YAAY;AAAA,MAC1B,SAAS;AAAA,MACT,iBAAiB,EAAE,WAAW,SAAS,MAAM,gBAAgB,MAAM;AAAA,IACrE,CAAC;AACD,eAAW,KAAK,aAAa;AAAA,MAC3B,SAAS;AAAA,MACT,iBAAiB,EAAE,WAAW,SAAS,MAAM,gBAAgB,MAAM;AAAA,IACrE,CAAC;AAGD,eAAW,iBAAiB,UAAU,KAAK,iBAAiB;AAC5D,gBAAY,iBAAiB,UAAU,KAAK,kBAAkB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,MAAc,OAAe;AAClD,UAAM,cAAc,KAAK,WAAW,cAAc,oBAAoB;AACtE,QAAI,eAAe,YAAY,UAAU,MAAM,SAAS,GAAG;AACzD,kBAAY,QAAQ,MAAM,SAAS;AAEnC,iBAAW,YAAY,WAAW,GAAG,QAAQ;AAAA,IAC/C;AAEA,UAAM,EAAE,MAAM,KAAK,IAAI,KAAK,YAAY,MAAM,KAAK;AACnD,SAAK,WAAW,cAAc,aAAa,GAAG,UAAU,OAAO,eAAe,CAAC,IAAI;AACnF,SAAK,WAAW,cAAc,aAAa,GAAG,UAAU,OAAO,eAAe,CAAC,IAAI;AAAA,EACrF;AAAA;AAAA,EAGQ,qBAAqB,MAAc,OAAe;AACxD,UAAM,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO;AAClD,UAAM,WAAW,KAAK,WAAW,cAAc,2BAA2B;AAC1E,QAAI,SAAU,UAAS,YAAY;AAAA,QAC9B,MAAK,WAAW,mBAAmB,aAAa,IAAI;AAAA,EAC3D;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,GAAG,iBAAiB,UAAU,KAAK,kBAAkB;AAC1D,SAAK,WAAW,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAOrE;AAAA,EAEA,kBAAkB;AAChB,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY,YAAW,UAAU,KAAK;AAE/C,SAAK,cAA2B,SAAS,QAAQ;AAEjD,SAAK,aAAa,KAAK,YAAY,cAAc,sBAAsB;AACvE,SAAK,aAAa,KAAK,YAAY,cAAc,YAAY;AAC7D,SAAK,aAAa,KAAK,YAAY,cAAc,YAAY;AAM7D,SAAK,SAAS,KAAK,YAAY,cAAc,oBAAoB;AAEjE,SAAK,UAAU;AAAA,MACb,GAAG,CAAC,SAAe;AACjB,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,cAAM,IAAI,KAAK,QAAQ;AACvB,gBAAQ,IAAI,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,KAAK,CAAC,SAAe;AACnB,eAAO,KAAK,QAAQ,KAAK,cAAc,KAAK,OAAO,CAAC;AAAA,MACtD;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO,CAAC;AAAA,MACjD;AAAA,MACA,GAAG,CAAC,SAAe;AACjB,eAAO,KAAK,SAAS,IAAI;AAAA,MAC3B;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,cAAM,IAAI,KAAK,SAAS,IAAI;AAC5B,gBAAQ,IAAI,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,KAAK,CAAC,SAAe;AACnB,eAAO,KAAK,QAAQ,KAAK,YAAY,KAAK,SAAS,CAAC;AAAA,MACtD;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,CAAC;AAAA,MACjD;AAAA,MACA,IAAI,CAAC,SAAe;AAClB,gBAAQ,KAAK,KAAK,YAAY,GAAG,MAAM,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,CAAC,SAAe;AACpB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAC/D,SAAK,GAAG,oBAAoB,UAAU,KAAK,kBAAkB;AAC7D,SAAK,WAAW,oBAAoB,SAAS,KAAK,oBAAoB;AACtE,QAAI,KAAK,QAAQ,eAAe,KAAK,WAAW;AAC9C,WAAK,UAAU,oBAAoB,SAAS,KAAK,iBAAiB;AAClE,WAAK,UAAU,oBAAoB,YAAY,KAAK,mBAAmB;AACvE,WAAK,UAAU,oBAAoB,UAAU,KAAK,kBAAkB;AAAA,IACtE;AAAA,EACF;AAAA;AAAA,EAgGA,UAAU,OAAO;AACf,QAAI,CAAC,MAAM,KAAK,GAAG;AACjB,WAAK,UAAU,CAAC,EAAE,QAAQ,SAAS,OAAO,EAAE;AAC5C,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,SAAS,MAAM;AACb,QAAI,CAAC,MAAM,IAAI,GAAG;AAChB,WAAK,UAAU,CAAC,EAAE,OAAO,SAAS,MAAM,EAAE;AAC1C,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EA4BA,cAAc,MAAM,KAAK,OAAgB,OAAO;AAC9C,WAAO,KAAK;AACZ,WAAO,OAAO,GAAG;AACf,aAAO;AAAA,IACT;AACA,WAAO,OAAO,KAAK,KAAK,eAAe,GAAG,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,EACtE;AAAA,EAEA,kBAAkB;AAChB,UAAM,YAA8B,KAAK,GAAG,UAAU,IAAI;AAG1D,cAAU,gBAAgB,IAAI;AAC9B,cAAU,iBAAiB,SAAS,KAAK,iBAAiB;AAC1D,cAAU,iBAAiB,YAAY,KAAK,mBAAmB;AAC/D,cAAU,iBAAiB,UAAU,KAAK,kBAAkB;AAC5D,SAAK,GAAG,cAAc,YAAY,SAAS;AAC3C,WAAO;AAAA,EACT;AA4BF;AAZI,YAAW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9qCpB,IAAM,aAAN;;;ACjQP,IAAMC,cAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAEO,IAAM,WAAN,MAAM,kBAAiB,UAA2B;AAAA,EAuBvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AA0E7B,SAAQ,uBAAuB,MAAM;AACnC,WAAK,sBAAsB;AAAA,IAC7B;AAEA,SAAQ,0BAA0B,CAAC,MAAqB;AACtD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,sBAAsB;AAAA,MAC7B;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AAEpC,UAAI,KAAK,kBAAkB,SAAU,KAAK,iBAAiB,KAAK,cAAgB,MAAK,MAAM;AAAA,UACtF,MAAK,KAAK;AAAA,IACjB;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,cAAe,MAAK,MAAM;AAAA,IACrC;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,cAAe,MAAK,MAAM;AAAA,IACrC;AAEA,SAAQ,sBAAsB,CAAC,MAAqB;AAClD,UAAI,MAAM,KAAK,IAAI,SAAS,EAAE,GAAG,KAAK,KAAK,iBAAiB,KAAK,cAAe,MAAK,MAAM;AAAA,IAC7F;AAuMA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,WAAK,YAAY;AAGjB,YAAM,aAAa,KAAK,GAAG,sBAAsB;AACjD,YAAM,kBAAkB,KAAK,YAAY,sBAAsB;AAC/D,WAAK,gBAAgB,WAAW;AAChC,WAAK,iBAAiB,WAAW;AAEjC,WAAK,gBAAgB;AACrB,WAAK,GAAG,UAAU,IAAI,QAAQ;AAC9B,WAAK,gBAAgB;AAErB,UAAI,OAAO,KAAK,QAAQ,gBAAgB;AACtC,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAE7C,WAAK,YAAY,MAAM,QAAQ,gBAAgB,QAAQ;AACvD,WAAK,YAAY,MAAM,SAAS,gBAAgB,SAAS;AACzD,WAAK,YAAY,MAAM,WAAW;AAClC,WAAK,YAAY,MAAM,MAAM;AAC7B,WAAK,YAAY,MAAM,OAAO;AAC9B,WAAK,8BAA8B;AAEnC,WAAK,GAAG,MAAM,WAAW;AACzB,WAAK,GAAG,MAAM,SAAS;AACvB,WAAK,GAAG,MAAM,aAAa;AAE3B,WAAK,YAAY,KAAK,GAAG,aAAa,OAAO;AAC7C,WAAK,aAAa,KAAK,GAAG,aAAa,QAAQ;AAC/C,UAAI,KAAK,WAAW;AAClB,aAAK,GAAG,MAAM,QAAQ,KAAK,YAAY;AACvC,aAAK,GAAG,gBAAgB,OAAO;AAAA,MACjC;AACA,UAAI,KAAK,YAAY;AACnB,aAAK,GAAG,MAAM,SAAS,KAAK,aAAa;AACzC,aAAK,GAAG,gBAAgB,QAAQ;AAAA,MAClC;AACA,WAAK,YAAY;AAEjB,UAAI,KAAK,YAAY,GAAI,MAAK,YAAY;AAE1C,YAAM,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,gBAAgB,KAAK,iBAAiB,KAAK;AACjD,WAAK,WAAW;AAChB,WAAK,YAAY;AACjB,UAAI,eAAe,eAAe;AAEhC,cAAM,QAAQ,KAAK,iBAAiB,KAAK;AACzC,aAAK,WAAW,KAAK,cAAc;AACnC,aAAK,YAAY,KAAK,cAAc,MAAM;AAAA,MAC5C,OAAO;AAEL,cAAM,QAAQ,KAAK,gBAAgB,KAAK;AACxC,aAAK,WAAW,KAAK,eAAe,MAAM;AAC1C,aAAK,YAAY,KAAK,eAAe;AAAA,MACvC;AACA,WAAK,gBAAgB;AAErB,aAAO,iBAAiB,UAAU,KAAK,qBAAqB,EAAE,SAAS,KAAK,CAAC;AAC7E,aAAO,iBAAiB,UAAU,KAAK,qBAAqB,EAAE,SAAS,KAAK,CAAC;AAC7E,aAAO,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,IAC3D;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,YAAY;AACjB,WAAK,gBAAgB;AAErB,UAAI,OAAO,KAAK,QAAQ,iBAAiB;AACvC,aAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAK9C,aAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,aAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,aAAO,oBAAoB,SAAS,KAAK,mBAAmB;AAC5D,WAAK,eAAe;AACpB,WAAK,iBAAiB;AACtB,UAAI,KAAK,YAAY,GAAI,MAAK,eAAe;AAAA,IAC/C;AA5XE,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AACrB,SAAK,cAAc,SAAS,cAAc,KAAK;AAC/C,SAAK,YAAY,UAAU,IAAI,sBAAsB;AACrD,SAAK,gBAAgB;AACrB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB,KAAK,GAAG,aAAa,OAAO;AACtD,SAAK,UAAU,KAAK,GAAG,aAAa,cAAc,KAAK;AACvD,SAAK,GAAG,WAAW;AAEnB,SAAK,GAAG,OAAO,KAAK,WAAW;AAC/B,SAAK,YAAY,OAAO,KAAK,EAAE;AAC/B,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,GAAG,qBAAqB,IAAI;AAGjC,SAAK,YAAY,OAAO;AACxB,SAAK,GAAG,gBAAgB,OAAO;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,GAAG,iBAAiB,SAAS,KAAK,oBAAoB;AAC3D,SAAK,GAAG,iBAAiB,YAAY,KAAK,uBAAuB;AAAA,EACnE;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,GAAG,oBAAoB,SAAS,KAAK,oBAAoB;AAC9D,SAAK,GAAG,oBAAoB,YAAY,KAAK,uBAAuB;AAAA,EACtE;AAAA,EA8BQ,gCAAgC;AACtC,SAAK,uBAAuB,CAAC;AAC7B,QAAI,WAAW,KAAK,YAAY;AAChC,WAAO,aAAa,QAAQ,aAAa,UAAU;AACjD,YAAM,OAAoB;AAC1B,UAAI,KAAK,MAAM,aAAa,WAAW;AACrC,aAAK,MAAM,WAAW;AACtB,aAAK,qBAAqB,KAAK,IAAI;AAAA,MACrC;AACA,iBAAW,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,QAAQ,IAAiB;AAC/B,UAAM,MAAM,GAAG,sBAAsB;AACrC,UAAM,UAAU,SAAS;AACzB,WAAO;AAAA,MACL,KAAK,IAAI,MAAM,OAAO,UAAU,QAAQ;AAAA,MACxC,MAAM,IAAI,OAAO,OAAO,UAAU,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EACQ,cAAoB;AAC1B,SAAK,cAAc,OAAO;AAC1B,SAAK,eAAe,OAAO;AAC3B,SAAK,UAAU,KAAK,GAAG,aAAa,cAAc,KAAK;AAAA,EACzD;AAAA;AAAA,EAGQ,kBAAwB;AAC9B,SAAK,GAAG,MAAM,YAAY,KAAK,UAAU,SAAS,IAAI;AACtD,SAAK,GAAG,MAAM,WAAW,KAAK,SAAS,SAAS,IAAI;AACpD,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,GAAG,MAAM,aAAa;AAC3B,SAAK,GAAG,MAAM,SAAS,KAAK,iBAAiB;AAC7C,SAAK,GAAG,MAAM,QAAQ,KAAK,gBAAgB;AAC3C,eAAW,MAAM;AAEf,YAAM,oBAAoB,KAAK,QAAQ,KAAK,WAAW;AAEvD,WAAK,GAAG,MAAM,aAAa,UAAU,QAAQ;AAAA,gBACnC,QAAQ;AAAA,eACT,QAAQ;AAAA,cACT,QAAQ;AAAA;AAGhB,WAAK,GAAG,MAAM,SAAS,KAAK,YAAY;AACxC,WAAK,GAAG,MAAM,QAAQ,KAAK,WAAW;AACtC,WAAK,GAAG,MAAM,OACZ,MAAM,sBAAsB,IAC5B,KAAK,cAAc,IACnB,kBAAkB,OAClB,KAAK,WAAW,IAChB;AAEF,WAAK,GAAG,MAAM,MACZ,MAAM,qBAAqB,IAC3B,KAAK,eAAe,IACpB,kBAAkB,MAClB,KAAK,YAAY,IACjB;AAAA,IACJ,GAAG,CAAC;AAEJ,eAAW,MAAM;AACf,WAAK,gBAAgB;AACrB,UAAI,OAAO,KAAK,QAAQ,cAAc,WAAY,MAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,IAC7F,GAAG,QAAQ;AAAA,EA0Bb;AAAA,EACQ,mBAAyB;AAC/B,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,GAAG,MAAM,aAAa,UAAU,QAAQ;AAAA,cACnC,QAAQ;AAAA,aACT,QAAQ;AAAA,YACT,QAAQ;AAAA;AAGhB,SAAK,GAAG,MAAM,SAAS,KAAK,iBAAiB;AAC7C,SAAK,GAAG,MAAM,QAAQ,KAAK,gBAAgB;AAC3C,SAAK,GAAG,MAAM,OAAO;AACrB,SAAK,GAAG,MAAM,MAAM;AACpB,eAAW,MAAM;AACf,WAAK,YAAY,MAAM,SAAS;AAChC,WAAK,YAAY,MAAM,QAAQ;AAC/B,WAAK,YAAY,MAAM,WAAW;AAClC,WAAK,YAAY,MAAM,MAAM;AAC7B,WAAK,YAAY,MAAM,OAAO;AAE9B,UAAI,KAAK,UAAW,MAAK,GAAG,aAAa,SAAS,KAAK,UAAU,SAAS,CAAC;AAC3E,UAAI,KAAK,WAAY,MAAK,GAAG,aAAa,UAAU,KAAK,WAAW,SAAS,CAAC;AAC9E,WAAK,GAAG,gBAAgB,OAAO;AAC/B,UAAI,KAAK,mBAAoB,MAAK,GAAG,aAAa,SAAS,KAAK,kBAAkB;AAElF,WAAK,GAAG,UAAU,OAAO,QAAQ;AACjC,WAAK,gBAAgB;AAErB,WAAK,qBAAqB,QAAQ,CAAC,cAAe,UAAU,MAAM,WAAW,EAAG;AAEhF,UAAI,OAAO,KAAK,QAAQ,eAAe;AACrC,aAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C,GAAG,QAAQ;AAAA,EACb;AAAA;AAAA,EAGQ,cAAoB;AAC1B,SAAK,gBAAgB,SAAS,cAAc,KAAK;AACjD,SAAK,cAAc,UAAU,IAAI,kBAAkB;AACnD,SAAK,cAAc,YAAY,KAAK;AACpC,aAAS,KAAK,OAAO,KAAK,aAAa;AACvC,SAAK,cAAc,MAAM,UAAU;AAEnC,SAAK,cAAc,MAAM,aAAa;AACtC,SAAK,cAAc,MAAM,UAAU;AACnC,UAAM,WAAW,KAAK,QAAQ;AAC9B,eAAW,MAAM;AACf,WAAK,cAAc,MAAM,aAAa,WAAW,QAAQ;AACzD,WAAK,cAAc,MAAM,UAAU;AAAA,IACrC,GAAG,CAAC;AAAA,EACN;AAAA,EACQ,iBAAuB;AAC7B,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,cAAc,MAAM,aAAa,WAAW,QAAQ;AACzD,SAAK,cAAc,MAAM,UAAU;AACnC,eAAW,MAAM;AACf,WAAK,cAAc,OAAO;AAAA,IAC5B,GAAG,QAAQ;AAAA,EACb;AAAA;AAAA,EAGQ,cAAoB;AAC1B,SAAK,WAAW,SAAS,cAAc,KAAK;AAC5C,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS;AAAA,MACZ;AAAA,MACA,MAAM;AACJ,YAAI,KAAK,cAAe,MAAK,MAAM;AAAA,MACrC;AAAA,MACA,EAAE,MAAM,KAAK;AAAA,IACf;AAGA,SAAK,GAAG,OAAO,KAAK,QAAQ;AAG5B,UAAM,gBAAgB,KAAK,SAAS,sBAAsB;AAC1D,SAAK,SAAS,MAAM,QAAQ,KAAK,cAAc;AAC/C,SAAK,SAAS,MAAM,SAAS,KAAK,eAAe;AACjD,SAAK,SAAS,MAAM,OAAO,KAAK,cAAc,OAAO;AACrD,SAAK,SAAS,MAAM,MAAM,KAAK,cAAc,MAAM;AAGnD,SAAK,SAAS,MAAM,aAAa;AACjC,SAAK,SAAS,MAAM,UAAU;AAC9B,UAAM,WAAW,KAAK,QAAQ;AAC9B,eAAW,MAAM;AACf,WAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AACpD,WAAK,SAAS,MAAM,UAAU;AAAA,IAChC,GAAG,CAAC;AAAA,EACN;AAAA,EACQ,iBAAuB;AAC7B,UAAM,WAAW,KAAK,QAAQ;AAC9B,SAAK,SAAS,MAAM,aAAa,WAAW,QAAQ;AACpD,SAAK,SAAS,MAAM,UAAU;AAC9B,eAAW,MAAM;AACf,WAAK,gBAAgB;AACrB,WAAK,SAAS,OAAO;AAAA,IACvB,GAAG,QAAQ;AAAA,EACb;AAwFF;;;AC/bA,IAAMC,cAA6B,CAAC;AAO7B,IAAM,WAAN,MAAM,kBAAiB,UAA2B;AAAA,EACvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,SAAS,SAAQ;AAC3B,SAAK,GAAG,qBAAqB,IAAI;AAEjC,SAAK,UAAU;AAAA,MACb,GAAG,UAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,QAAI,CAAC,KAAK,GAAG,cAAc,YAAY,GAAG;AACxC,cAAQ,MAAM,oEAAoE;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAoC,CAAC,GACd;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,SAAQ;AAAA,EAC1C;AAAA,EAEA,OAAO,YAAY,IAA2B;AAC5C,WAAO,GAAG,qBAAqB;AAAA,EACjC;AAAA,EAEA,UAAU;AACR,SAAK,GAAG,qBAAqB,IAAI;AAAA,EACnC;AACF;;;ACjBA,IAAMC,cAAY;AAAA,EAChB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,kBAAkB;AACpB;AAEO,IAAM,WAAN,MAAM,iBAAgB,UAA0B;AAAA,EAIrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAC1B,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,iBAAkB,KAAK,GAAmB;AAC/C,aAAQ,UAAU,KAAK,IAAI;AAC3B,SAAK,oBAAoB;AACzB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,IAAC,KAAK,GAAmB,MAAM,MAAM;AACrC,SAAK,kBAAkB;AAEvB,UAAM,QAAQ,SAAQ,UAAU,QAAQ,IAAI;AAC5C,aAAQ,UAAU,OAAO,OAAO,CAAC;AACjC,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,WAAK,qBAAqB;AAAA,IAC5B;AACA,SAAK,GAAG,oBAAoB,IAAI;AAAA,EAClC;AAAA,EAEA,OAAO,kBAAkB;AACvB,aAAS,IAAI,GAAG,IAAI,SAAQ,UAAU,QAAQ,KAAK;AACjD,eAAQ,UAAU,CAAC,EAAE,gBAAgB;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,sBAAsB;AACpB,aAAS,iBAAiB,UAAU,SAAQ,iBAAiB,EAAE,SAAS,KAAK,CAAC;AAAA,EAChF;AAAA,EAEA,uBAAuB;AACrB,aAAS,oBAAoB,UAAU,SAAQ,eAAe;AAAA,EAChE;AAAA,EAEA,kBAAkB;AAChB,UAAM,WAAW,MAAM,qBAAqB,IAAI,KAAK,QAAQ;AAE7D,QACE,KAAK,QAAQ,OAAO,YACpB,KAAK,QAAQ,UAAU,YACvB,CAAC,KAAK,GAAG,UAAU,SAAS,QAAQ,GACpC;AACA,WAAK,kBAAkB;AACvB,MAAC,KAAK,GAAmB,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM;AAC3D,WAAK,GAAG,UAAU,IAAI,QAAQ;AAG9B,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,QAAQ;AAAA,MACnD;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,QAAQ,OAAO,CAAC,KAAK,GAAG,UAAU,SAAS,SAAS,GAAG;AACzE,WAAK,kBAAkB;AACvB,MAAC,KAAK,GAAmB,MAAM,MAAM;AACrC,WAAK,GAAG,UAAU,IAAI,SAAS;AAG/B,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,SAAS;AAAA,MACpD;AAAA,IACF;AAGA,QAAI,WAAW,KAAK,QAAQ,UAAU,CAAC,KAAK,GAAG,UAAU,SAAS,YAAY,GAAG;AAC/E,WAAK,kBAAkB;AACvB,WAAK,GAAG,UAAU,IAAI,YAAY;AAClC,MAAC,KAAK,GAAmB,MAAM,MAAM,GAAG,KAAK,QAAQ,SAAS,KAAK,cAAc;AAGjF,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB,KAAK,MAAM,YAAY;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,SAAK,GAAG,UAAU,OAAO,WAAW,UAAU,YAAY;AAAA,EAC5D;AAKF;AAFI,SAAQ,YAAY,CAAC;AA7HlB,IAAM,UAAN;;;ACPP,IAAM,2BAA2B,CAAC,OAAuB,YAAY,EAAE;AAEvE,IAAMC,cAA8B;AAAA,EAClC,cAAc;AAAA,EACd,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,sBAAsB;AACxB;AAMO,IAAM,aAAN,MAAM,mBAAkB,UAA4B;AAAA,EAMzD,YAAY,IAAiB,SAAoC;AAC/D,UAAM,IAAI,SAAS,UAAS;AAC5B,SAAK,GAAG,sBAAsB,IAAI;AAElC,SAAK,UAAU;AAAA,MACb,GAAG,WAAU;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,GAAG,MAAM;AAAA,MACZ;AAAA,MACA,GAAG,KAAK,QAAQ,YAAY;AAAA,IAC9B;AAEA,eAAU,UAAU,KAAK,IAAI;AAC7B,eAAU,gBAAgB,KAAK,QAAQ,YAAY;AACnD,eAAU,WAAW,QAAQ,KAAK,EAAE;AAAA,EACtC;AAAA,EAEA,WAAW,WAA6B;AACtC,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAqC,CAAC,GACb;AACzB,WAAO,MAAM,KAAK,KAAK,SAAS,UAAS;AAAA,EAC3C;AAAA,EAEA,OAAO,YAAY,IAA4B;AAC7C,WAAO,GAAG,sBAAsB;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,UAAM,QAAQ,WAAU,UAAU,QAAQ,IAAI;AAC9C,QAAI,SAAS,EAAG,YAAU,UAAU,OAAO,OAAO,CAAC;AACnD,eAAU,QAAQ,OAAO,KAAK,EAAE;AAChC,eAAU,WAAW,UAAU,KAAK,EAAE;AAEtC,UAAM,OAAO,WAAU,SAAS,KAAK,GAAG,IAAI,KAAK,OAAO;AACxD,QAAI,QAAQ,SAAS,WAAU,SAAS;AACtC,iBAAU,aAAa,KAAK,OAAO;AAAA,IACrC,OAAO;AACL,YAAM,UAAU,OAAO,KAAK,QAAQ,WAAW;AAC/C,YAAM,gBAAgB,cAAc;AAAA,IACtC;AAEA,QAAI,WAAU,UAAU,WAAW,GAAG;AACpC,iBAAU,WAAW,WAAW;AAChC,iBAAU,YAAY;AACtB,iBAAU,QAAQ,MAAM;AACxB,iBAAU,UAAU;AAAA,IACtB,OAAO;AACL,iBAAU,YAAY;AAAA,IACxB;AAEA,SAAK,GAAG,sBAAsB,IAAI;AAAA,EACpC;AAAA,EAEA,OAAe,gBAAgB,QAAgB;AAC7C,QAAI,WAAU,UAAW;AACzB,QAAI,OAAO,yBAAyB,YAAa;AACjD,eAAU,YAAY,IAAI,qBAAqB,WAAU,cAAc;AAAA,MACrE,YAAY,IAAI,MAAM;AAAA,MACtB,WAAW,CAAC,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAaA,OAAe,cAAc;AAC3B,QAAI,CAAC,WAAU,UAAU,OAAQ;AACjC,UAAM,UAAU,WAAU,UAAU,CAAC,EAAE;AAEvC,QAAI,OAAyB;AAC7B,QAAI,YAAY;AAChB,eAAW,OAAO,WAAU,WAAW;AACrC,YAAM,QAAQ,WAAU,QAAQ,IAAI,IAAI,EAAE,KAAK;AAC/C,UAAI,QAAQ,WAAW;AACrB,oBAAY;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,UAAI,QAAQ,sBAAsB;AAChC,eAAO,WAAU,cAAc,KAAK,WAAU,UAAU,CAAC;AAAA,MAC3D,OAAO;AACL,mBAAU,aAAa,OAAO;AAC9B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,WAAU,SAAS,KAAK,GAAG,IAAI,KAAK,OAAO;AACxD,QAAI,SAAS,WAAU,QAAS;AAChC,eAAU,aAAa,OAAO;AAC9B,QAAI,CAAC,KAAM;AACX,SAAK,UAAU,IAAI,KAAK,QAAQ,WAAW;AAC3C,SAAK,aAAa,gBAAgB,MAAM;AACxC,eAAU,UAAU;AAAA,EACtB;AAAA,EAEA,OAAe,gBAAkC;AAC/C,QAAI,OAAyB;AAC7B,QAAI,UAAU;AACd,eAAW,OAAO,WAAU,WAAW;AACrC,YAAM,MAAM,IAAI,GAAG,sBAAsB,EAAE;AAC3C,UAAI,OAAO,KAAK,OAAO,SAAS;AAC9B,kBAAU;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAe,aAAa,SAA2B;AACrD,QAAI,CAAC,WAAU,QAAS;AACxB,eAAU,QAAQ,UAAU,OAAO,QAAQ,WAAW;AACtD,eAAU,QAAQ,gBAAgB,cAAc;AAChD,eAAU,UAAU;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAAS,IAAY,SAA2C;AACrE,QAAI,CAAC,GAAI,QAAO;AAChB,QAAI,QAAQ,qBAAqB,0BAA0B;AACzD,UAAI;AACF,eAAO,SAAS,cAAc,QAAQ,iBAAiB,EAAE,CAAC;AAAA,MAC5D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,OAAO,IAAI,EAAE;AACnB,UAAM,QAAQ,SAAS,iBAAiB,cAAc;AACtD,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,MAAM,CAAC,EAAE,aAAa,MAAM,MAAM,KAAM,QAAO,MAAM,CAAC;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AACF;AAhKa,WACJ,YAAyB,CAAC;AADtB,WAEI,YAAyC;AAF7C,WAGI,UAAU,oBAAI,IAAqB;AAHvC,WAII,UAA0B;AAJ9B,WA6EI,eAAe,CAAC,YAAyC;AACtE,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,kBAAkB,MAAM,oBAAoB,GAAG;AACvD,iBAAU,QAAQ,IAAI,MAAM,QAAQ,MAAM,iBAAiB;AAAA,IAC7D,OAAO;AACL,iBAAU,QAAQ,OAAO,MAAM,MAAM;AAAA,IACvC;AAAA,EACF;AACA,aAAU,YAAY;AACxB;AAtFK,IAAM,YAAN;;;ACLP,IAAMC,cAA4B;AAAA,EAChC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AACd;AAEA,IAAM,WAAW;AAOV,IAAM,WAAN,MAAM,iBAAgB,UAA8C;AAAA,EAqBzE,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAwF5B;AAAA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,kBAAkB,KAAK,KAAK,UAAU,CAAC,KAAK,QAAS;AAE9D,eAAQ,UAAU,QAAQ,CAAC,UAAU;AACnC,YAAI,UAAU,QAAQ,MAAM,OAAQ,OAAM,MAAM;AAAA,MAClD,CAAC;AAED,UAAI,OAAO,KAAK,QAAQ,gBAAgB,YAAY;AAClD,aAAK,QAAQ,YAAY,KAAK,MAAM,KAAK,EAAE;AAAA,MAC7C;AAEA,WAAK,SAAS;AACd,WAAK,QAAQ,UAAU,OAAO,UAAU;AACxC,WAAK,YAAY;AACjB,UAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,YAAI;AACF,eAAK,QAAQ,UAAU;AAAA,QACzB,QAAQ;AAAA,QAER;AAAA,MACF;AACA,WAAK,cAAc;AACnB,UAAI,OAAO,KAAK,QAAQ,cAAc,YAAY;AAChD,aAAK,QAAQ,UAAU,KAAK,MAAM,KAAK,EAAE;AAAA,MAC3C;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,KAAK,kBAAkB,KAAK,CAAC,KAAK,OAAQ;AAC9C,WAAK,YAAY;AACjB,UAAI,KAAK,SAAS,MAAM;AACtB,aAAK,WAAW;AAChB,aAAK,QAAQ,MAAM;AAAA,MACrB,OAAO;AACL,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAkBA,SAAQ,iBAAiB,MAAM;AAC7B,UAAI,KAAK,QAAQ;AACf,aAAK,YAAY;AACjB,aAAK,aAAa;AAClB;AAAA,MACF;AACA,UAAI,KAAK,UAAU;AACjB,aAAK,WAAW;AAChB,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,KAAK,kBAAkB,KAAK,KAAK,QAAQ;AAC3C,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AA4FA,SAAQ,2BAA2B,CAAC,MAAa;AAC/C,YAAM,SAAS,EAAE;AACjB,UAAI,EAAE,kBAAkB,SAAU;AAClC,YAAM,eAAe,OAAO,QAAQ,gBAAgB;AACpD,UAAI,gBAAgB,CAAC,KAAK,kBAAkB,GAAG;AAC7C,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAyDA,SAAQ,wBAAwB,CAAC,MAAkB;AACjD,UAAI,CAAC,KAAK,aAAa,EAAG;AAC1B,YAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,YAAM,aAAa,KAAK,QAAQ,SAAS,SAAS,QAAQ,CAAC;AAC3D,YAAM,UAAU,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,GAAG,UAAU,CAAC;AAC7D,YAAM,cAAc,KAAK,SAAS,UAAU,KAAK,SAAS;AAC1D,WAAK,YAAY,UAAU,KAAK,QAAQ,WAAW;AAAA,IACrD;AAEA,SAAQ,2BAA2B,MAAM;AACvC,UAAI,CAAC,KAAK,UAAW;AACrB,WAAK,SAAS,UAAU,OAAO,UAAU;AACzC,UAAI,KAAK,cAAc,KAAK;AAC1B,aAAK,KAAK;AAAA,MACZ,WAAW,KAAK,SAAS,QAAQ,CAAC,KAAK,QAAQ;AAC7C,aAAK,YAAY;AACjB,aAAK,QAAQ,MAAM;AAAA,MACrB;AACA,WAAK,YAAY;AACjB,WAAK,uBAAuB;AAAA,IAC9B;AAEA,SAAQ,mBAAmB,CAAC,MAAkB;AAC5C,UAAI,CAAC,KAAK,UAAU,CAAC,KAAK,aAAa,EAAG;AAC1C,YAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,YAAM,cAAc,KAAK,QAAQ,SAAS,SAAS,CAAC,QAAQ;AAC5D,YAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,KAAK,IAAI,GAAG,WAAW,CAAC;AAC7D,YAAM,cAAc,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;AAC7D,WAAK,YAAY,CAAC,QAAQ,WAAW;AAAA,IACvC;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,CAAC,KAAK,UAAU,CAAC,KAAK,UAAW;AACrC,WAAK,SAAS,UAAU,OAAO,UAAU;AACzC,UAAI,KAAK,cAAc,KAAK;AAC1B,aAAK,YAAY;AAAA,MACnB,OAAO;AACL,aAAK,MAAM;AAAA,MACb;AACA,WAAK,YAAY;AACjB,WAAK,uBAAuB;AAAA,IAC9B;AArWE,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG;AAAA,IACL;AAEA,SAAK,KAAK,KAAK,GAAG;AAClB,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,GAAG,UAAU,SAAS,eAAe;AACzD,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,SAAK,gBAAgB;AACrB,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,SAAK,uBAAuB;AAE5B,SAAK,OAAO,OAAO,WAAW,QAAQ;AACtC,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AACzB,SAAK,cAAc;AAEnB,aAAQ,UAAU,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,QAAI,KAAK,SAAS,MAAM;AACtB,UAAI;AACF,aAAK,QAAQ,MAAM;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,SAAK,GAAG,oBAAoB,IAAI;AAChC,UAAM,QAAQ,SAAQ,UAAU,QAAQ,IAAI;AAC5C,QAAI,SAAS,GAAG;AACd,eAAQ,UAAU,OAAO,OAAO,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EA+CQ,cAAc;AACpB,SAAK,SAAS;AACd,SAAK,SAAS,UAAU,OAAO,UAAU;AACzC,SAAK,YAAY;AACjB,QAAI,OAAO,KAAK,QAAQ,iBAAiB,YAAY;AACnD,WAAK,QAAQ,aAAa,KAAK,MAAM,KAAK,EAAE;AAAA,IAC9C;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,eAAe;AACrB,QAAI,OAAO,KAAK,QAAQ,eAAe,YAAY;AACjD,WAAK,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;AAAA,IAC5C;AAAA,EACF;AAAA,EAoBQ,eAAe;AACrB,QAAI,KAAK,cAAc,mBAAmB;AACxC,WAAK,UAAU,KAAK;AACpB,WAAK,iBAAiB;AACtB;AAAA,IACF;AACA,UAAM,SAAS,KAAK,GAAG;AACvB,QAAI,kBAAkB,qBAAqB,OAAO,UAAU,SAAS,iBAAiB,GAAG;AACvF,WAAK,UAAU;AACf,WAAK,iBAAiB;AACtB;AAAA,IACF;AACA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,UAAU,IAAI,iBAAiB;AACtC,SAAK,GAAG,YAAY,MAAM;AAC1B,WAAO,YAAY,KAAK,EAAE;AAC1B,SAAK,UAAU;AACf,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,QAAS;AAC3C,SAAK,QAAQ,YAAY,KAAK,EAAE;AAChC,SAAK,UAAU;AACf,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,CAAC,KAAK,QAAQ,UAAW;AAC7B,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,UAAU,IAAI,aAAa;AACtC,eAAW,MAAM,QAAQ,KAAK,QAAQ;AACtC,QAAI,KAAK,QAAS,YAAW,QAAQ,QAAQ;AAC7C,aAAS,KAAK,YAAY,UAAU;AACpC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,YAAY,OAAO;AACxB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,gBAAgB;AACtB,QAAI,KAAK,QAAQ,SAAS,SAAS;AACjC,WAAK,GAAG,UAAU,IAAI,eAAe;AACrC,WAAK,SAAS,UAAU,IAAI,eAAe;AAC3C,WAAK,YAAY,UAAU,IAAI,eAAe;AAAA,IAChD;AAAA,EACF;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,eAAS,KAAK,iBAAiB,SAAS,SAAQ,mBAAmB;AAAA,IACrE;AACA,UAAM,UAAU,EAAE,SAAS,KAAK;AAChC,SAAK,YAAY,iBAAiB,aAAa,KAAK,uBAAuB,OAAO;AAClF,SAAK,YAAY,iBAAiB,YAAY,KAAK,wBAAwB;AAC3E,SAAK,SAAS,iBAAiB,aAAa,KAAK,kBAAkB,OAAO;AAC1E,SAAK,SAAS,iBAAiB,YAAY,KAAK,mBAAmB;AACnE,SAAK,SAAS,iBAAiB,SAAS,KAAK,cAAc;AAC3D,SAAK,GAAG,iBAAiB,SAAS,KAAK,wBAAwB;AAC/D,SAAK,KAAK,iBAAiB,UAAU,KAAK,mBAAmB;AAAA,EAC/D;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,SAAQ,UAAU,WAAW,GAAG;AAClC,eAAS,KAAK,oBAAoB,SAAS,SAAQ,mBAAmB;AAAA,IACxE;AACA,SAAK,YAAY,oBAAoB,aAAa,KAAK,qBAAqB;AAC5E,SAAK,YAAY,oBAAoB,YAAY,KAAK,wBAAwB;AAC9E,SAAK,SAAS,oBAAoB,aAAa,KAAK,gBAAgB;AACpE,SAAK,SAAS,oBAAoB,YAAY,KAAK,mBAAmB;AACtE,SAAK,SAAS,oBAAoB,SAAS,KAAK,cAAc;AAC9D,SAAK,GAAG,oBAAoB,SAAS,KAAK,wBAAwB;AAClE,SAAK,KAAK,oBAAoB,UAAU,KAAK,mBAAmB;AAAA,EAClE;AAAA,EAEA,OAAe,oBAAoB,GAAU;AAC3C,UAAM,SAAS,EAAE;AACjB,QAAI,EAAE,kBAAkB,SAAU;AAClC,UAAM,UAAU,OAAO,QAAQ,kBAAkB;AACjD,QAAI,CAAC,WAAW,EAAE,mBAAmB,aAAc;AACnD,UAAM,YAAY,MAAM,iBAAiB,OAAO;AAChD,UAAM,kBAAkB,SAAS,eAAe,SAAS,IAAI,oBAAoB;AACjF,QAAI,iBAAiB;AACnB,sBAAgB,KAAK;AACrB,QAAE,eAAe;AAAA,IACnB;AAAA,EACF;AAAA,EAWQ,eAAe;AACrB,WAAO,KAAK,QAAQ,aAAa,CAAC,KAAK,kBAAkB,KAAK,CAAC,KAAK;AAAA,EACtE;AAAA,EAEQ,oBAAoB;AAC1B,WAAO,KAAK,WAAW,KAAK,KAAK;AAAA,EACnC;AAAA,EAEQ,WAAW,GAAe;AAChC,UAAM,UAAU,EAAE,cAAc,CAAC,EAAE;AACnC,SAAK,YAAY;AACjB,SAAK,gBAAgB;AACrB,SAAK,QAAQ;AACb,SAAK,SACH,KAAK,SAAS,sBAAsB,EAAE,SAAS,KAAK,GAAG,sBAAsB,EAAE;AACjF,SAAK,oBAAoB,KAAK,SAAS,KAAK,GAAG,YAAY,MAAM,qBAAqB;AACtF,SAAK,uBAAuB;AAC5B,SAAK,SAAS,UAAU,IAAI,UAAU;AACtC,QAAI,KAAK,WAAW,CAAC,KAAK,QAAQ,MAAM;AACtC,UAAI;AACF,aAAK,QAAQ,UAAU;AAAA,MACzB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,GAAe;AACrC,UAAM,UAAU,EAAE,cAAc,CAAC,EAAE;AACnC,UAAM,mBAAmB,KAAK,SAAS,KAAK,GAAG,YAAY,MAAM,qBAAqB;AACtF,SAAK,QAAQ;AACb,QAAI,KAAK,sBAAsB,kBAAkB;AAC/C,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,UAAU,GAAe;AAC/B,QAAI,CAAC,KAAK,UAAW,MAAK,WAAW,CAAC;AACtC,SAAK,gBAAgB,CAAC;AACtB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEQ,YAAY,OAAe,aAAqB;AACtD,SAAK,cAAc;AACnB,UAAM,OAAO,KAAK,WAAW,KAAK;AAClC,SAAK,MAAM,YAAY,8BAA8B,GAAG,KAAK,IAAI;AACjE,SAAK,MAAM,YAAY,6BAA6B,OAAO,WAAW,CAAC;AAAA,EACzE;AAAA,EAEQ,cAAc;AACpB,UAAM,OAAO,KAAK,WAAW,KAAK;AAClC,SAAK,MAAM,eAAe,4BAA4B;AACtD,SAAK,MAAM,eAAe,2BAA2B;AAAA,EACvD;AAAA,EA6CQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,GAAI;AACd,aAAS,iBAAiB,kBAAkB,EAAE,QAAQ,CAAC,YAAY;AACjE,UAAI,EAAE,mBAAmB,aAAc;AACvC,UAAI,MAAM,iBAAiB,OAAO,MAAM,KAAK,GAAI;AACjD,cAAQ,aAAa,iBAAiB,KAAK,SAAS,SAAS,OAAO;AACpE,cAAQ,aAAa,iBAAiB,KAAK,EAAE;AAAA,IAC/C,CAAC;AAAA,EACH;AAKF;AAFI,SAAQ,YAAY,CAAC;AAzYlB,IAAM,UAAN;;;ACVP,IAAMC,cAA2B;AAAA,EAC/B,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA;AACtB;AAEO,IAAM,SAAN,MAAM,gBAAe,UAAyB;AAAA,EAcnD,YAAY,IAAiB,SAAiC;AAC5D,UAAM,IAAI,SAAS,OAAM;AAwJ3B;AAAA;AAAA;AAAA,SAAQ,0BAA0B,MAAM;AACtC,UAAI,SAAS,QAAQ;AACnB,YAAI,KAAK,YAAY,KAAM,MAAK,OAAO,IAAI;AAAA,MAC7C,WACE,KAAK,cACL,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aACpC,EAAE,KAAK,QAAQ,gBAAgB,KAAK,WACpC;AACA,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,wBAAwB,CAAC,MAAkB;AACjD,YAAM,KAAmB,EAAE,OAAQ;AACnC,YAAM,YAAY,CAAC,GAAG,GAAG,WAAW,QAAQ,EAAE,QAAQ,EAAE;AACxD,WAAK,gBAAgB;AACrB,WAAK,IAAI,SAAS;AAAA,IACpB;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY,MAAM;AACzB,aAAK,OAAO,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,KAAK,YAAY,MAAM;AACzB,aAAK,OAAO,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aAAa,KAAK,YAAY;AACpE,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,wBAAwB,MAAM;AACpC,WAAK,WAAW;AAChB,UAAI,EAAE,KAAK,QAAQ,gBAAgB,KAAK,aAAa,KAAK,YAAY;AACpE,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AAEA,SAAQ,kBAAkB,MAAM;AAC9B,YAAM,aAAa,KAAK,QAAQ,cAAc,SAAS;AACvD,UAAI,iBAAiB,CAAC,GAAG,WAAW,WAAW,QAAQ,EAAE,QAAQ,UAAU;AAC3E,UAAI,KAAK,QAAQ,WAAW,iBAAiB;AAC3C,yBAAiB;AAAA,UACd,mBAAkB;AACvB,WAAK,IAAI,cAAc;AAAA,IACzB;AA+IA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,WAAK,OAAO,KAAK;AAAA,IACnB;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,oBAAc,KAAK,QAAQ;AAC3B,WAAK,WAAW;AAAA,QACd,KAAK;AAAA,QACL,KAAK,QAAQ,WAAW,KAAK,QAAQ;AAAA,MACvC;AACA,WAAK,aAAa;AAAA,IACpB;AAKA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,WAAW,KAAK,cAAc;AAElC,UAAI,YAAY,KAAK,QAAQ,OAAQ,YAAW;AAAA,eACvC,WAAW,EAAG,YAAW,KAAK,QAAQ,SAAS;AACxD,WAAK,IAAI,QAAQ;AAAA,IACnB;AAKA;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,WAAW,KAAK,cAAc;AAElC,UAAI,YAAY,KAAK,QAAQ,OAAQ,YAAW;AAAA,eACvC,WAAW,EAAG,YAAW,KAAK,QAAQ,SAAS;AACxD,WAAK,IAAI,QAAQ;AAAA,IACnB;AAhYE,SAAK,GAAG,mBAAmB,IAAI;AAE/B,SAAK,UAAU;AAAA,MACb,GAAG,QAAO;AAAA,MACV,GAAG;AAAA,IACL;AAGA,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAGrB,SAAK,UAAU,KAAK,GAAG,cAAc,SAAS;AAC9C,SAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,iBAAiB,IAAI,CAAC;AAC7D,SAAK,cAAc,KAAK,QAAQ,UAAU,CAAC,OAAO,GAAG,UAAU,SAAS,QAAQ,CAAC;AAEjF,QAAI,KAAK,gBAAgB,IAAI;AAC3B,WAAK,eAAe,KAAK,QAAQ,KAAK,WAAW;AAAA,IACnD;AAEA,SAAK,iBAAiB;AAGtB,QAAI,KAAK,QAAQ,aAAa,IAAI,EAAG,MAAK,YAAY,KAAK,QAAQ,aAAa,IAAI;AAAA,SAC/E;AACH,WAAK,YAAY,YAAY,MAAM,KAAK;AACxC,WAAK,QAAQ,aAAa,MAAM,KAAK,SAAS;AAAA,IAChD;AAEA,UAAM,oBACJ;AAEF,SAAK,QAAQ,QAAQ,CAAC,UAAU;AAK9B,YAAM,MAAM,MAAM,cAAc,KAAK;AACrC,UAAI,KAAK;AACP,YAAI,IAAI,QAAQ,mBAAmB;AACjC,cAAI,MAAM,kBAAkB,SAAS,IAAI,MAAM;AAC/C,cAAI,MAAM;AAAA,QACZ;AAAA,MACF;AAEA,UAAI,CAAC,MAAM,aAAa,UAAU,EAAG,OAAM,aAAa,YAAY,IAAI;AAExE,YAAM,MAAM,aAAa;AAAA,IAC3B,CAAC;AAED,SAAK,iBAAiB;AAGtB,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,MAAM,UAAU;AAClC,WAAK,aAAa,MAAM,aAAa;AAAA,IACvC,OAAO;AACL,WAAK,cAAc;AACnB,WAAK,QAAQ,CAAC,EAAE,UAAU,IAAI,QAAQ;AACtC,WAAK,QAAQ,CAAC,EAAE,MAAM,aAAa;AACnC,WAAK,eAAe,KAAK,QAAQ,CAAC;AAClC,WAAK,cAAc,KAAK,QAAQ,CAAC,GAAG,IAAI;AAExC,UAAI,KAAK,QAAQ,YAAY;AAC3B,aAAK,YAAY,KAAK,WAAW,EAAE,SAAS,CAAC,EAAE,UAAU,IAAI,QAAQ;AAAA,MACvE;AAAA,IACF;AACA,SAAK,oBAAoB;AAEzB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,WAAW,WAAW;AACpB,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAkC,CAAC,GAChB;AACnB,WAAO,MAAM,KAAK,KAAK,SAAS,OAAM;AAAA,EACxC;AAAA,EAEA,OAAO,YAAY,IAAyB;AAC1C,WAAO,GAAG,mBAAmB;AAAA,EAC/B;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,mBAAmB,IAAI;AAAA,EACjC;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,iBAAiB,WAAW,KAAK,qBAAqB;AAC9D,WAAK,GAAG,iBAAiB,YAAY,KAAK,qBAAqB;AAAA,IACjE;AACA,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,iBAAiB,cAAc,KAAK,qBAAqB;AACjE,WAAK,GAAG,iBAAiB,cAAc,KAAK,qBAAqB;AAAA,IACnE;AACA,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,iBAAiB,SAAS,KAAK,qBAAqB;AAAA,MACzD,CAAC;AAAA,IACH;AACA,aAAS,iBAAiB,oBAAoB,KAAK,uBAAuB;AAAA,EAC5E;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,oBAAoB,WAAW,KAAK,qBAAqB;AACjE,WAAK,GAAG,oBAAoB,YAAY,KAAK,qBAAqB;AAAA,IACpE;AACA,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,GAAG,oBAAoB,cAAc,KAAK,qBAAqB;AACpE,WAAK,GAAG,oBAAoB,cAAc,KAAK,qBAAqB;AAAA,IACtE;AACA,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,YAAY,QAAQ,CAAC,OAAO;AAC/B,WAAG,oBAAoB,SAAS,KAAK,qBAAqB;AAAA,MAC5D,CAAC;AAAA,IACH;AACA,aAAS,oBAAoB,oBAAoB,KAAK,uBAAuB;AAAA,EAC/E;AAAA,EA6DQ,cAAc,OAAoB,eAA8B;AACtE,QAAI,KAAK,GACP,KAAK;AAEP,UAAM,MAAM,UAAU,gBAAgB,MAAM;AAC5C,eAAW,MAAM;AACf,YAAM,MAAM,aAAa,WAAW,KAAK,QAAQ,QAAQ;AAEzD,YAAM,MAAM,UAAU,gBAAgB,MAAM;AAAA,IAC9C,GAAG,CAAC;AAEJ,UAAM,UAAuB,MAAM,cAAc,UAAU;AAC3D,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,UAAU,SAAS,cAAc,EAAG,MAAK;AAAA,aAC5C,QAAQ,UAAU,SAAS,aAAa,EAAG,MAAK;AAAA,aAChD,QAAQ,UAAU,SAAS,YAAY,EAAG,MAAK;AAExD,YAAQ,MAAM,UAAU,gBAAgB,MAAM;AAC9C,YAAQ,MAAM,YAAY,gBAAgB,aAAa,EAAE,OAAO,EAAE,QAAQ;AAC1E,eAAW,MAAM;AACf,cAAQ,MAAM,aAAa,WAAW,KAAK,QAAQ,QAAQ,sBAAsB,KAAK,QAAQ,QAAQ;AAEtG,cAAQ,MAAM,UAAU,gBAAgB,MAAM;AAC9C,cAAQ,MAAM,YAAY,gBAAgB,oBAAoB,aAAa,EAAE,OAAO,EAAE;AAAA,IACxF,GAAG,KAAK,QAAQ,QAAQ;AAAA,EAC1B;AAAA,EAEQ,mBAAmB;AAEzB,QAAI,CAAC,KAAK,GAAG,UAAU,SAAS,YAAY,GAAG;AAC7C,UAAI,KAAK,QAAQ,YAAY;AAE3B,aAAK,GAAG,MAAM,SAAS,KAAK,QAAQ,SAAS,KAAK;AAAA,MACpD,OAAO;AACL,aAAK,GAAG,MAAM,SAAS,KAAK,QAAQ,SAAS;AAAA,MAC/C;AACA,WAAK,QAAQ,MAAM,SAAS,KAAK,QAAQ,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEQ,mBAAmB;AACzB,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,UAAU,IAAI,YAAY;AAE7B,YAAM,QAAQ,CAAC;AACf,WAAK,QAAQ,QAAQ,CAAC,IAAI,MAAM;AAC9B,cAAM,QAAQ,KAAK,QAAQ,qBACvB,KAAK,QAAQ,mBAAmB,KAAK,MAAM,IAAI,GAAG,MAAM,CAAC,IACzD,GAAG,IAAI,CAAC;AACZ,cAAM,KAAK,SAAS,cAAc,IAAI;AACtC,WAAG,UAAU,IAAI,gBAAgB;AAGjC,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,OAAO;AACd,eAAO,UAAU,IAAI,oBAAoB;AACzC,eAAO,aAAa,cAAc,KAAK;AACvC,eAAO,aAAa,iBAAiB,KAAK,SAAS;AACnD,WAAG,YAAY,MAAM;AACrB,cAAM,KAAK,EAAE;AACb,WAAG,OAAO,EAAE;AAAA,MACd,CAAC;AAED,WAAK,GAAG,OAAO,EAAE;AACjB,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,GAAG,cAAc,eAAe,EAAE,OAAO;AAAA,EAChD;AAAA,EAEA,IAAI,OAAe;AAEjB,QAAI,SAAS,KAAK,QAAQ,OAAQ,SAAQ;AAAA,aACjC,QAAQ,EAAG,SAAQ,KAAK,QAAQ,SAAS;AAGlD,QAAI,KAAK,gBAAgB,MAAO;AAEhC,SAAK,eAAe,KAAK,QAAQ,KAAK,WAAW;AACjD,UAAM,WAA+B,KAAK,aAAa,cAAc,UAAU;AAE/E,SAAK,aAAa,UAAU,OAAO,QAAQ;AAE3C,SAAK,QAAQ,QAAQ,CAAC,UAAW,MAAM,MAAM,aAAa,SAAU;AAGpE,SAAK,aAAa,MAAM,UAAU;AAClC,eAAW,MAAM;AACf,WAAK,QAAQ,QAAQ,CAAC,UAAU;AAC9B,YAAI,MAAM,UAAU,SAAS,QAAQ,EAAG;AACxC,cAAM,MAAM,UAAU;AACtB,cAAM,MAAM,YAAY;AAExB,cAAM,MAAM,aAAa;AAAA,MAC3B,CAAC;AAAA,IACH,GAAG,KAAK,QAAQ,QAAQ;AAIxB,QAAI,SAAU,UAAS,MAAM,UAAU;AAGvC,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,kBAAkB,KAAK,YAAY,KAAK,WAAW,EAAE,SAAS,CAAC;AACrE,YAAM,gBAAgB,KAAK,YAAY,KAAK,EAAE,SAAS,CAAC;AACxD,sBAAgB,UAAU,OAAO,QAAQ;AACzC,oBAAc,UAAU,IAAI,QAAQ;AACpC,UAAI,OAAO,KAAK,QAAQ,uBAAuB,YAAY;AACzD,wBAAgB,YAAY,KAAK,QAAQ,mBAAmB;AAAA,UAC1D;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QACF;AACA,sBAAc,YAAY,KAAK,QAAQ,mBAAmB,KAAK,MAAM,OAAO,IAAI;AAAA,MAClF;AAAA,IACF;AAGA,SAAK,cAAc,KAAK,QAAQ,KAAK,GAAG,IAAI;AAC5C,SAAK,QAAQ,KAAK,EAAE,UAAU,IAAI,QAAQ;AAC1C,SAAK,cAAc;AAInB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,OAAO,WAAoB;AACzB,kBAAc,KAAK,QAAQ;AAC3B,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AA0CF;;;AC3aA,IAAMC,cAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,qBAAqB;AAAA;AACvB;AAEO,IAAM,OAAN,MAAM,cAAa,UAAuB;AAAA,EAU/C,YAAY,IAAiB,SAA+B;AAC1D,UAAM,IAAI,SAAS,KAAI;AAkFzB,+BAAsB,MAAM;AAC1B,WAAK,oBAAoB;AACzB,UAAI,KAAK,cAAc,KAAK,KAAK,eAAe,GAAG;AACjD,aAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,aAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,MAC1E;AAAA,IACF;AAQA,2BAAkB,CAAC,MAAkB;AACnC,YAAM,SAAS,EAAE;AACjB,UAAI,CAAC,OAAQ;AACb,YAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,UAAI,CAAC,WAAW,CAAC,MAAM,KAAK,KAAK,SAAS,EAAE,SAAS,OAAO,EAAG;AAE/D,YAAM,MAAM,QAAQ;AACpB,YAAM,WACJ,QAAQ,UAAU,SAAS,UAAU,KACrC,QAAQ,aAAa,eAAe,MAAM,UAC1C,KAAK,UAAU,SAAS,UAAU;AACpC,UAAI,UAAU;AACZ,UAAE,eAAe;AACjB;AAAA,MACF;AAEA,UAAI,QAAQ,aAAa,QAAQ,EAAG;AAEpC,WAAK,eAAe,UAAU,OAAO,QAAQ;AAC7C,YAAM,cAAc,KAAK;AAGzB,WAAK,iBAAiB;AACtB,UAAI,QAAQ,KAAM,MAAK,WAAW,SAAS,cAAc,QAAQ,IAAI;AACrE,WAAK,YAAY,KAAK,eAAe;AAErC,WAAK,eAAe,UAAU,IAAI,QAAQ;AAC1C,YAAM,YAAY,KAAK;AACvB,WAAK,SAAS,KAAK,IAAI,MAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,OAAO,GAAG,CAAC;AAGrE,UAAI,KAAK,QAAQ,WAAW;AAC1B,YAAI,KAAK,eAAe;AACtB,eAAK,cAAc,IAAI,KAAK,QAAQ,MAAM;AACxC,gBAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,mBAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,UAChD,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AACL,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,MAAM,UAAU;AAC9B,eAAK,SAAS,UAAU,IAAI,QAAQ;AACpC,cAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,iBAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAC9C,cAAI,eAAe,gBAAgB,KAAK,UAAU;AAChD,wBAAY,MAAM,UAAU;AAC5B,wBAAY,UAAU,OAAO,QAAQ;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAEA,WAAK,oBAAoB;AACzB,WAAK,kBAAkB,SAAS;AAChC,QAAE,eAAe;AAAA,IACnB;AArJE,SAAK,GAAG,iBAAiB,IAAI;AAE7B,SAAK,UAAU;AAAA,MACb,GAAG,MAAK;AAAA,MACR,GAAG;AAAA,IACL;AAEA,SAAK,YAAY,KAAK,eAAe;AACrC,SAAK,SAAS;AACd,SAAK,oBAAoB;AACzB,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,oBAAoB;AAAA,IAC3B,OAAO;AACL,WAAK,iBAAiB;AAAA,IACxB;AAEA,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAgC,CAAC,GAClB;AACf,WAAO,MAAM,KAAK,KAAK,SAAS,KAAI;AAAA,EACtC;AAAA,EAEA,OAAO,YAAY,IAAuB;AACxC,WAAO,GAAG,iBAAiB;AAAA,EAC7B;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,WAAW,WAAW,YAAY,KAAK,UAAU;AACtD,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,uBAAuB;AAAA,IAC9B,OAAO;AACL,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,GAAG,iBAAiB,IAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBAAsB;AACpB,WAAO,iBAAiB,UAAU,KAAK,mBAAmB;AAC1D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe;AAAA,EACxD;AAAA,EAEA,uBAAuB;AACrB,WAAO,oBAAoB,UAAU,KAAK,mBAAmB;AAC7D,SAAK,GAAG,oBAAoB,SAAS,KAAK,eAAe;AAAA,EAC3D;AAAA,EAUA,iBAAiB;AACf,WAAO,KAAK,GAAG;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EA0DA,mBAAmB;AACjB,UAAM,MAAM,KAAK,GAAG,YAAY,QAAQ,KAAK,GAAG,YAAY,OAAO,OAAO;AAC1E,UAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,cAAU,UAAU,IAAI,WAAW;AACnC,SAAK,GAAG,YAAY,SAAS;AAC7B,SAAK,aAAa;AAClB,SAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,SAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,EAC1E;AAAA,EAEA,sBAAsB;AAEpB,SAAK,iBAAiB,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,MAC/C,CAAC,MAAyB,EAAE,aAAa,MAAM,MAAM,SAAS;AAAA,IAChE;AAEA,QAAI,CAAC,KAAK,gBAAgB;AACxB,UAAI,gBAAgB,KAAK,GAAG,cAAc,UAAU;AACpD,UAAI,CAAC,eAAe;AAClB,wBAAgB,KAAK,UAAU,CAAC;AAAA,MAClC;AACA,WAAK,iBAAiB;AAAA,IACxB;AACA,UAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,CAAC,MAAyB,EAAE,UAAU,OAAO,QAAQ,CAAC;AACzF,SAAK,eAAe,UAAU,IAAI,QAAQ;AAE1C,SAAK,SAAS,KAAK,IAAI,MAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,KAAK,cAAc,GAAG,CAAC;AACjF,QAAI,KAAK,kBAAkB,KAAK,eAAe,MAAM;AACnD,WAAK,WAAW,SAAS,cAAc,KAAK,eAAe,IAAI;AAC/D,UAAI,KAAK,SAAU,MAAK,SAAS,UAAU,IAAI,QAAQ;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,sBAAsB;AAEpB,QAAI,OAAO,aAAa,KAAK,QAAQ,oBAAqB,MAAK,QAAQ,YAAY;AAEnF,UAAM,cAAc,CAAC;AACrB,SAAK,UAAU,QAAQ,CAAC,MAAM;AAC5B,UAAI,EAAE,MAAM;AACV,cAAM,cAAc,SAAS,cAAc,EAAE,IAAI;AACjD,oBAAY,UAAU,IAAI,eAAe;AACzC,oBAAY,KAAK,WAAW;AAAA,MAC9B;AAAA,IACF,CAAC;AAGD,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,UAAU,IAAI,gBAAgB,YAAY,MAAM;AAG5D,gBAAY,CAAC,EAAE,cAAc,aAAa,aAAa,YAAY,CAAC,CAAC;AACrE,gBAAY,QAAQ,CAAC,eAAe;AAClC,kBAAY,YAAY,UAAU;AAClC,iBAAW,MAAM,UAAU;AAAA,IAC7B,CAAC;AAED,SAAK,gBAAgB,SAAS,KAAK,aAAa;AAAA,MAC9C,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW,CAAC,SAAS;AACnB,cAAM,YAAY,KAAK;AACvB,aAAK,SAAS,MAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,IAAI;AAC/D,aAAK,eAAe,UAAU,OAAO,QAAQ;AAC7C,aAAK,iBAAiB,MAAM,KAAK,KAAK,SAAS,EAAE,KAAK,MAAM;AAC5D,aAAK,eAAe,UAAU,IAAI,QAAQ;AAC1C,aAAK,kBAAkB,SAAS;AAChC,YAAI,OAAO,KAAK,QAAQ,WAAW;AACjC,eAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,MAChD;AAAA,IACF,CAAC;AAED,SAAK,cAAc,IAAI,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,yBAAyB;AACvB,UAAM,cAAc,KAAK,cAAc;AACvC,SAAK,cAAc,QAAQ;AAE3B,gBAAY,OAAO,YAAY,aAAa;AAC5C,gBAAY,OAAO;AAAA,EACrB;AAAA,EAEA,mBAAmB;AAEjB,UAAM,KAAK,KAAK,SAAS,EAAE,QAAQ,CAAC,MAAM;AACxC,UAAI,MAAM,KAAK,eAAgB;AAC/B,UAAwB,EAAG,MAAM;AAC/B,cAAM,cAAc,SAAS,cAAkC,EAAG,IAAI;AACtE,YAAI,YAAa,CAAc,YAAa,MAAM,UAAU;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAAsB;AAEpB,SAAK,UAAU,QAAQ,CAAC,MAAM;AAC5B,UAAI,EAAE,MAAM;AACV,cAAM,cAAc,SAAS,cAAc,EAAE,IAAI;AACjD,YAAI,YAAa,aAAY,MAAM,UAAU;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAAsB;AACpB,SAAK,aAAa,KAAK,GAAG,sBAAsB,EAAE;AAClD,SAAK,YAAY,KAAK,IAAI,KAAK,YAAY,KAAK,GAAG,WAAW,IAAI,KAAK,UAAU;AAAA,EACnF;AAAA,EAEA,cAAc,IAAI;AAChB,WAAO,KAAK,KAAK,KAAK,aAAa,GAAG,aAAa,GAAG,sBAAsB,EAAE,KAAK;AAAA,EACrF;AAAA,EAEA,aAAa,IAAI;AACf,WAAO,KAAK,MAAM,GAAG,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB;AACnB,SAAK,oBAAoB;AACzB,SAAK,kBAAkB,KAAK,MAAM;AAAA,EACpC;AAAA,EAEA,kBAAkB,WAAW;AAC3B,QAAI,YAAY,GACd,aAAa;AAEf,UAAM,wBAAwB,KAAK,SAAS,aAAa;AACzD,QAAI,sBAAuB,aAAY;AAAA,QAClC,cAAa;AAGlB,SAAK,WAAW,MAAM,aAAa;AAAA,aAC1B,KAAK,QAAQ,QAAQ,eAAe,SAAS;AAAA,cAC5C,KAAK,QAAQ,QAAQ,eAAe,UAAU;AAExD,SAAK,WAAW,MAAM,OAAO,KAAK,aAAa,KAAK,cAAc,IAAI;AACtE,SAAK,WAAW,MAAM,QAAQ,KAAK,cAAc,KAAK,cAAc,IAAI;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAe;AACpB,UAAM,MAAM,MAAM,KAAK,KAAK,SAAS,EAAE;AAAA,MACrC,CAAC,MAAyB,EAAE,aAAa,MAAM,MAAM,MAAM;AAAA,IAC7D;AACA,QAAI,IAAK,CAAoB,IAAK,MAAM;AAAA,EAC1C;AACF;;;AC/UA,IAAMC,cAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,SAAS;AACX;AAOO,IAAM,aAAN,MAAM,mBAAkB,UAAgD;AAAA,EAe7E,YAAY,IAAiB,SAAoC;AAC/D,UAAM,IAAI,SAAS,UAAS;AAV9B,SAAQ,UAA8B;AACtC,SAAQ,SAA6B;AACrC,SAAQ,YAAgC;AACxC,SAAQ,kBAAkB;AAC1B,SAAQ,eAAe;AACvB,SAAQ,cAAc;AACtB,SAAQ,gBAAgB;AACxB,SAAQ,WAAW;AAyDnB;AAAA;AAAA;AAAA,gBAAO,MAAM;AACX,UAAI,KAAK,UAAU,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS;AAEpD,iBAAU,YAAY,QAAQ,CAAC,UAAU;AACvC,YAAI,UAAU,KAAM,OAAM,MAAM;AAAA,MAClC,CAAC;AAED,WAAK,sBAAsB;AAE3B,UAAI,OAAO,KAAK,QAAQ,WAAW,YAAY;AAC7C,aAAK,QAAQ,OAAO,KAAK,MAAM,KAAK,QAAQ;AAAA,MAC9C;AAEA,WAAK,SAAS;AACd,WAAK,QAAQ,UAAU,IAAI,MAAM;AACjC,WAAK,SAAS,aAAa,iBAAiB,MAAM;AAElD,UAAI,CAAC,KAAK,aAAa;AACrB,aAAK,SAAS,UAAU,IAAI,mBAAmB;AAC/C,YAAI,iBAAiB,KAAK,QAAQ,EAAE,aAAa,UAAU;AACzD,eAAK,SAAS,MAAM,WAAW;AAC/B,eAAK,gBAAgB;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,KAAK,aAAa;AACpB,aAAK,WAAW;AAChB,YAAI;AACF,eAAK,QAAQ,YAAY;AAAA,QAC3B,QAAQ;AAAA,QAER;AACA,8BAAsB,MAAM;AAC1B,eAAK,WAAW;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAElB,UAAI,OAAO,KAAK,QAAQ,YAAY,cAAc,KAAK,UAAU;AAC/D,aAAK,QAAQ,QAAQ,KAAK,MAAM,KAAK,QAAQ;AAAA,MAC/C;AAEA,WAAK,SAAS;AACd,WAAK,SAAS,UAAU,OAAO,MAAM;AACrC,WAAK,UAAU,aAAa,iBAAiB,OAAO;AACpD,WAAK,UAAU,UAAU,OAAO,mBAAmB;AACnD,UAAI,KAAK,iBAAiB,KAAK,UAAU;AACvC,aAAK,SAAS,MAAM,WAAW;AAC/B,aAAK,gBAAgB;AAAA,MACvB;AAEA,UAAI,KAAK,eAAe,KAAK,SAAS;AACpC,YAAI;AACF,eAAK,QAAQ,YAAY;AAAA,QAC3B,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAyFA;AAAA,SAAQ,yBAAyB,MAAM,SAAS,MAAM,KAAK,cAAc,GAAG,GAAG;AAE/E,SAAQ,uBAAuB,CAAC,MAAqB;AACnD,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,KAAK,EAAE,QAAQ,KAAK;AACrD,UAAE,eAAe;AACjB,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAEA,SAAQ,sBAAsB,MAAM;AAClC,UAAI,CAAC,KAAK,OAAQ,MAAK,KAAK;AAAA,UACvB,MAAK,MAAM;AAAA,IAClB;AAEA,SAAQ,gBAAgB,MAAM;AAC5B,UAAI,KAAK,OAAQ,MAAK,sBAAsB;AAAA,IAC9C;AAEA,SAAQ,uBAAuB,CAAC,MAAa;AAC3C,YAAM,QAAQ,cAAc,IAAI,OAAQ,EAA2B,QAAQ,IAAI;AAC/E,UAAI,UAAU,OAAQ;AACtB,UAAI,KAAK,UAAU;AACjB,YAAI;AACF,eAAK,SAAS,YAAY;AAAA,QAC5B,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AACA,UAAI,KAAK,OAAQ,MAAK,MAAM;AAAA,IAC9B;AA5OE,SAAK,GAAG,sBAAsB,IAAI;AAElC,SAAK,UAAU;AAAA,MACb,GAAG,WAAU;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AAId,SAAK,WAAW,GAAG,QAAQ,SAAS,SAAS,eAAe,GAAG,QAAQ,MAAM,IAAI;AACjF,QAAI,CAAC,KAAK,UAAU;AAClB,cAAQ,MAAM,kCAAkC,GAAG,QAAQ,UAAU,EAAE,gBAAgB;AACvF;AAAA,IACF;AAEA,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AAEzB,eAAU,YAAY,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,WAAW,WAA6B;AACtC,WAAOA;AAAA,EACT;AAAA,EAIA,OAAO,KACL,KACA,UAAqC,CAAC,GACb;AACzB,WAAO,MAAM,KAAK,KAAK,SAAS,UAAS;AAAA,EAC3C;AAAA,EAEA,OAAO,YAAY,IAA4B;AAC7C,WAAO,GAAG,sBAAsB;AAAA,EAClC;AAAA,EAEA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,qBAAqB;AAC1B,SAAK,aAAa;AAClB,SAAK,GAAG,sBAAsB,IAAI;AAClC,UAAM,QAAQ,WAAU,YAAY,QAAQ,IAAI;AAChD,QAAI,SAAS,EAAG,YAAU,YAAY,OAAO,OAAO,CAAC;AAAA,EACvD;AAAA,EAuEQ,SAAS;AACf,UAAM,SAAS,KAAK,GAAG;AACvB,QAAI,QAAQ,UAAU,SAAS,oBAAoB,GAAG;AACpD,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,UAAU,SAAS,cAAc,KAAK;AAC3C,WAAK,QAAQ,UAAU,IAAI,oBAAoB;AAC/C,WAAK,GAAG,OAAO,KAAK,OAAO;AAC3B,WAAK,QAAQ,OAAO,KAAK,EAAE;AAC3B,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,YAAY,KAAK,GAAG,cAAc,qBAAqB;AAC5D,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,WAAK,UAAU,YAAY;AAC3B,aAAO,KAAK,GAAG,WAAY,MAAK,UAAU,OAAO,KAAK,GAAG,UAAU;AACnE,WAAK,GAAG,OAAO,KAAK,SAAS;AAAA,IAC/B;AAEA,SAAK,SACH,KAAK,GAAG,cAAc,kBAAkB,KACxC,KAAK,QAAQ,cAAc,kBAAkB;AAC/C,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,YAAY;AACxB,WAAK,eAAe;AAAA,IACtB;AAGA,SAAK,GAAG,QAAQ,KAAK,MAAM;AAE3B,SAAK,GAAG,aAAa,QAAQ,QAAQ;AACrC,SAAK,kBAAkB;AAEvB,UAAM,SAAS,KAAK;AACpB,WAAO,aAAa,iBAAiB,OAAO;AAC5C,WAAO,aAAa,iBAAiB,KAAK,GAAG,MAAM,KAAK,UAAU,CAAC;AAEnE,SAAK,cAAc,OAAO,KAAK,QAAQ,gBAAgB;AACvD,QAAI,KAAK,aAAa;AACpB,WAAK,QAAQ,aAAa,WAAW,MAAM;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,YAAoB;AAC1B,QAAI,CAAC,KAAK,GAAG,GAAI,MAAK,GAAG,KAAK,cAAc,MAAM,KAAK,CAAC;AACxD,WAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,UAAU,KAAK,WAAW,cAAc,wBAAwB;AACtE,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,QAAQ,GAAI,SAAQ,KAAK,oBAAoB,MAAM,KAAK,CAAC;AAC9D,SAAK,GAAG,aAAa,mBAAmB,QAAQ,EAAE;AAAA,EACpD;AAAA,EAEQ,eAAe;AACrB,QAAI,KAAK,aAAc,MAAK,QAAQ,OAAO;AAC3C,QAAI,KAAK,mBAAmB,KAAK,SAAS;AACxC,WAAK,QAAQ,OAAO,KAAK,EAAE;AAC3B,WAAK,QAAQ,OAAO;AAAA,IACtB;AACA,SAAK,UAAU;AACf,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAChE,QAAI,CAAC,KAAK,SAAS,QAAQ,wCAAwC,GAAG;AACpE,WAAK,SAAS,WAAW;AACzB,WAAK,SAAS,iBAAiB,WAAW,KAAK,oBAAoB;AAAA,IACrE;AACA,SAAK,SAAS,iBAAiB,UAAU,KAAK,oBAAoB;AAClE,WAAO,iBAAiB,UAAU,KAAK,wBAAwB,EAAE,SAAS,KAAK,CAAC;AAAA,EAClF;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAS,oBAAoB,SAAS,KAAK,mBAAmB;AACnE,SAAK,SAAS,oBAAoB,WAAW,KAAK,oBAAoB;AACtE,SAAK,SAAS,oBAAoB,UAAU,KAAK,oBAAoB;AACrE,WAAO,oBAAoB,UAAU,KAAK,sBAAsB;AAAA,EAClE;AAAA,EAmCQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS;AACrC,UAAM,OAAO,KAAK,SAAS,sBAAsB;AACjD,UAAM,IAAI,KAAK,OAAO,KAAK,QAAQ;AACnC,UAAM,IAAI,KAAK,MAAM,KAAK,SAAS;AACnC,UAAM,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,QAAQ,CAAC;AAEhD,SAAK,QAAQ,MAAM,YAAY,0BAA0B,GAAG,CAAC,IAAI;AACjE,SAAK,QAAQ,MAAM,YAAY,0BAA0B,GAAG,CAAC,IAAI;AACjE,SAAK,QAAQ,MAAM,YAAY,oCAAoC,GAAG,IAAI,IAAI;AAE9E,UAAM,WAAW,KAAK,OAAO,cAAc,IAAI,QAAQ;AACvD,UAAM,WAAW,KAAK,OAAO,aAAa,QAAQ,KAAK,OAAO,aAAa;AAC3E,UAAM,aAAa,WAAW,WAAW,KAAK,OAAO,aAAa,IAAI,SAAS;AAC/E,SAAK,QAAQ,QAAQ,OAAO,GAAG,QAAQ,IAAI,UAAU;AAAA,EACvD;AAKF;AAFI,WAAU,cAAc,CAAC;AAjRtB,IAAM,YAAN;;;AC4EP,IAAMC,cAA+B;AAAA,EACnC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA;AAAA,EACb,SAAS;AAAA;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA;AAAA,EAEZ,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA;AAAA,EACZ,SAAS;AAAA;AAAA;AAAA,EAET,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,eAAe;AAAA,EACf,sBAAsB;AACxB;AAOO,IAAM,cAAN,MAAM,oBAAmB,UAA6B;AAAA,EA+C3D,YAAY,IAAsB,SAAqC;AACrE,UAAM,IAAI,SAAS,WAAU;AAH/B;AAAA,SAAQ,cAAc;AA4GtB,6BAAoB,MAAM;AAGxB,WAAK,kBAAkB;AACvB,WAAK,WAAW,MAAM;AACtB,UAAI,OAAO,KAAK,QAAQ,uBAAuB,WAAY,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AACpG,UAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAAA,IAClD;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,kBAAkB;AACvB,aAAK,WAAW,MAAM;AACtB,YAAI,OAAO,KAAK,QAAQ,uBAAuB,WAAY,MAAK,QAAQ,mBAAmB,KAAK,IAAI;AACpG,YAAI,KAAK,cAAe,MAAK,cAAc,KAAK;AAAA,MAClD;AAAA,IACF;AAEA,oCAA2B,CAAC,MAAqB;AAC/C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,UAAE,eAAe;AACjB,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAEA,kCAAyB,CAAC,MAAM;AAC9B,QAAE,eAAe;AACjB,WAAK,kBAAkB;AACvB,YAAM,eAAe,KAAK,MAAM,sBAAsB;AACtD,YAAM,SAAS,EAAE,GAAG,aAAa,MAAM,GAAG,aAAa,IAAI;AAE3D,WAAK,KAAK,OAAO,IAAI,KAAK,QAAQ;AAClC,WAAK,KAAK,OAAO,IAAI,KAAK,QAAQ;AAClC,WAAK,QAAQ;AACb,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,WAAK,KAAK,SAAS,IAAI,KAAK;AAC5B,WAAK,KAAK,SAAS,IAAI,KAAK;AAG5B,WAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK;AAEpC,eAAS,iBAAiB,aAAa,KAAK,wBAAwB;AACpE,eAAS,iBAAiB,aAAa,KAAK,wBAAwB;AAEpE,eAAS,iBAAiB,WAAW,KAAK,uBAAuB;AACjE,eAAS,iBAAiB,YAAY,KAAK,uBAAuB;AAAA,IACpE;AAEA,oCAA2B,CAAC,MAAM;AAChC,QAAE,eAAe;AACjB,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,WAAK,QAAQ;AACb,WAAK,QAAQ,GAAG,GAAG,KAAK;AAAA,IAC1B;AAEA,mCAA0B,CAAC,MAAM;AAC/B,QAAE,eAAe;AACjB,eAAS,oBAAoB,WAAW,KAAK,uBAAuB;AACpE,eAAS,oBAAoB,YAAY,KAAK,uBAAuB;AACrE,YAAM,WAAW,YAAW,KAAK,CAAC;AAClC,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,YAAM,IAAI,SAAS,IAAI,KAAK;AAC5B,UAAI,KAAK,SAAS,MAAM,KAAK,MAAM,MAAM,KAAK,IAAI;AAChD,aAAK,QAAQ,GAAG,CAAC;AAAA,MACnB;AAEA,UAAI,KAAK,gBAAgB,SAAS;AAChC,aAAK,aAAa,MAAM;AACxB,aAAK,SAAS,WAAW,KAAK,QAAQ,WAAW,CAAC;AAAA,MACpD,OAAO;AAEL,mBAAW,MAAM;AACf,cAAI,KAAK,QAAQ,WAAY,MAAK,KAAK;AAAA,QACzC,GAAG,KAAK,QAAQ,WAAW,CAAC;AAAA,MAC9B;AAEA,UAAI,OAAO,KAAK,QAAQ,aAAa,YAAY;AAC/C,aAAK,QAAQ,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,MAC3D;AAEA,eAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,eAAS,oBAAoB,aAAa,KAAK,wBAAwB;AAAA,IACzE;AAwNA,4BAAmB,CAAC,MAAkB;AACpC,WAAK,uBAAoC,EAAE,MAAM;AAAA,IACnD;AAEA,+BAAsB,CAAC,MAAqB;AAC1C,UAAI,MAAM,KAAK,MAAM,SAAS,EAAE,GAAG,GAAG;AACpC,aAAK,uBAAoC,EAAE,MAAM;AAAA,MACnD;AAAA,IACF;AAEA,kCAAyB,CAAC,MAAmB;AAC3C,WAAK,SAAS,EAAE,UAAU,SAAS,QAAQ,IAAI,OAAO;AACtD,WAAK,gBAAgB;AAAA,IACvB;AAgDA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAW,CAAC,MAAa,QAAgB,SAAS;AAChD,WAAK,kBAAkB;AACvB,UAAI,SAAS,aAAa,iBAAiB,KAAK,SAAS,EAAE,eAAe,WAAW;AAAA,MAErF;AACA,YAAM,UAAU,SAAS,SACvB,WAAW,UAAU,KAAK,YAAY,KAAK,aAC3C,WAAW,UAAU,KAAK,cAAc,KAAK;AAC/C,WAAK,cAAc;AAWnB,eAAS,UAAU,IAAI,qBAAqB;AAE5C,eAAS,MAAM,aAAa;AAC5B,eAAS,UAAU,OAAO,qBAAqB;AAG/C,WAAK,WAAW,KAAK;AAErB,mBAAa,KAAK,eAAe;AACjC,WAAK,kBAAkB,WAAW,MAAM;AACtC,iBAAS,MAAM,aAAa;AAAA,MAC9B,GAAG,KAAK,QAAQ,QAAQ;AAAA,IAC1B;AAwBA,+BAAsB,MAAM;AAC1B,YAAM,UAAU,KAAK,gBAAgB;AACrC,UAAI,WAAW,KAAK,WAAW,UAAU,IAAI;AAC3C,cAAM,QAAQ,SAAS,KAAK,WAAW,KAAK;AAC5C,YAAI,QAAQ,KAAK,SAAS,KAAK,QAAQ,aAAa,KAAK,KAAK;AAC5D,eAAK,QAAQ;AAAA,QACf,OAAO;AACL,eAAK,gBAAgB;AAAA,QACvB;AACA,aAAK,uBAAuB,KAAK,OAAO,OAAO;AAAA,MACjD,WAAW,CAAC,WAAW,KAAK,aAAa,UAAU,IAAI;AACrD,cAAM,QAAQ,SAAS,KAAK,aAAa,KAAK;AAC9C,YAAI,SAAS,KAAK,QAAQ,IAAI;AAC5B,eAAK,UAAU;AAAA,QACjB,OAAO;AACL,eAAK,WAAU,oBAAI,KAAK,GAAE,WAAW;AACrC,eAAK,aAAa,QAAQ,KAAK,QAAQ,SAAS;AAAA,QAClD;AACA,aAAK,uBAAuB,KAAK,SAAS,OAAO;AAAA,MACnD;AAAA,IACF;AAkHA,gBAAO,CAAC,aAAa,SAAS;AAE5B,YAAM,OAAO,KAAK,GAAG;AACrB,UAAI,QAAQ,aACR,KACA,YAAW,gBAAgB,KAAK,KAAK,IAAI,MAAM,YAAW,gBAAgB,KAAK,OAAO;AAC1F,WAAK,OAAO;AACZ,UAAI,CAAC,cAAc,KAAK,QAAQ,YAAY;AAC1C,gBAAQ,GAAG,KAAK,IAAI,KAAK,MAAM;AAAA,MACjC;AACA,WAAK,GAAG,QAAQ;AAEhB,UAAI,UAAU,MAAM;AAClB,aAAK,GAAG;AAAA,UACN,IAAI,MAAM,UAAU,EAAE,SAAS,MAAM,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAEA,mBAAU,MAAM;AACd,WAAK,KAAK;AACV,UAAI,OAAO,KAAK,QAAQ,WAAW,WAAY,MAAK,QAAQ,OAAO,KAAK,IAAI;AAAA,IAC9E;AAEA,kBAAS,MAAM;AAGb,UAAI,OAAO,KAAK,QAAQ,aAAa,WAAY,MAAK,QAAQ,SAAS,KAAK,IAAI;AAAA,IAClF;AAEA,iBAAQ,MAAM;AACZ,WAAK,KAAK,IAAI;AAAA,IAChB;AA/qBE,SAAK,GAAG,uBAAuB,IAAI;AACnC,SAAK,UAAU;AAAA,MACb,GAAG,YAAW;AAAA,MACd,GAAG;AAAA,IACL;AACA,SAAK,KAAK,MAAM,KAAK;AACrB,SAAK,mBAAmB;AACxB,SAAK,gBAAgB;AACrB,SAAK,oBAAoB;AAIzB,SAAK,aAAa;AAElB,QAAI,KAAK,QAAQ,eAAe;AAC9B,UAAI,KAAK,QAAQ,kBAAkB,SAAU,MAAK,gBAAgB,oBAAoB,KAAK,KAAK,IAAI,KAAK,aAAa,KAAK,QAAQ,oBAAoB;AAAA,IACzJ;AAAA,EACF;AAAA,EAEA,WAAW,WAA8B;AACvC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,KACL,KACA,UAAsC,CAAC,GACZ;AAC3B,WAAO,MAAM,KAAK,KAAK,SAAS,WAAU;AAAA,EAC5C;AAAA,EAEA,OAAO,gBAAgB,KAAa;AAClC,YAAQ,MAAM,KAAK,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,aAAa,MAAc;AAChC,UAAM,QAAQ;AACd,WAAO,SAAS,gBAAgB,OAAO,IAAI;AAAA,EAC7C;AAAA,EAEA,OAAO,KAAK,GAAmC;AAC7C,QAAI,EAAE,KAAK,WAAW,OAAO,KAAM,EAAiB,cAAc,UAAU,GAAG;AAC7E,aAAO;AAAA,QACL,GAAI,EAAiB,cAAc,CAAC,EAAE;AAAA,QACtC,GAAI,EAAiB,cAAc,CAAC,EAAE;AAAA,MACxC;AAAA,IACF;AAEA,WAAO,EAAE,GAAI,EAAiB,SAAS,GAAI,EAAiB,QAAQ;AAAA,EACtE;AAAA,EAEA,OAAO,YAAY,IAA6B;AAC9C,WAAO,GAAG,uBAAuB;AAAA,EACnC;AAAA,EAEA,UAAU;AACR,SAAK,qBAAqB;AAC1B,SAAK,eAAe,QAAQ;AAC5B,SAAK,YAAY,OAAO;AACxB,SAAK,GAAG,uBAAuB,IAAI;AAAA,EACrC;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,SAAS,KAAK,iBAAiB;AACxD,SAAK,GAAG,iBAAiB,WAAW,KAAK,mBAAmB;AAC5D,SAAK,MAAM,iBAAiB,aAAa,KAAK,sBAAsB;AACpE,SAAK,MAAM,iBAAiB,cAAc,KAAK,sBAAsB;AACrE,SAAK,aAAa,iBAAiB,SAAS,KAAK,mBAAmB;AACpE,SAAK,WAAW,iBAAiB,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;AACtE,SAAK,WAAW,iBAAiB,YAAY,MAAM,KAAK,YAAY,CAAC;AACrE,SAAK,aAAa,iBAAiB,SAAS,MAAM,KAAK,SAAS,SAAS,CAAC;AAC1E,SAAK,aAAa,iBAAiB,YAAY,MAAM,KAAK,cAAc,CAAC;AAAA,EAC3E;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,SAAS,KAAK,iBAAiB;AAC3D,SAAK,GAAG,oBAAoB,WAAW,KAAK,mBAAmB;AAG/D,aAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,aAAS,oBAAoB,aAAa,KAAK,wBAAwB;AACvE,aAAS,oBAAoB,WAAW,KAAK,uBAAuB;AACpE,aAAS,oBAAoB,YAAY,KAAK,uBAAuB;AAAA,EACvE;AAAA,EAyFA,qBAAqB;AACnB,UAAM,WAAW,SAAS,cAAc,UAAU;AAClD,aAAS,YAAY,YAAW,UAAU,KAAK;AAE/C,SAAK,cAA2B,SAAS,QAAQ;AACjD,SAAK,YAAY,KAAK,eAAe,KAAK;AAG1C,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,cAAc,iBAAiB,cAAc,QAAQ,SAAS,cAAc,KAAK;AAEvF,QAAI,KAAK,QAAQ,aAAa,CAAC,CAAC,aAAa;AAC3C,kBAAY,OAAO,KAAK,WAAW;AAAA,IACrC,OAAO;AACL,WAAK,GAAG,cAAc,YAAY,KAAK,WAAW;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,kBAAkB;AAChB,SAAK,cAAc;AAGnB,SAAK,aAAa,OAAO,UAAU,YAAY;AAC/C,SAAK,UAAU,KAAK,YAAY,cAAc,oBAAoB;AAClE,SAAK,QAAQ,KAAK,YAAY,cAAc,mBAAmB;AAC/D,SAAK,eAAe,KAAK,YAAY,cAAc,4BAA4B;AAC/E,SAAK,YAAY,KAAK,YAAY,cAAc,mBAAmB;AACnE,SAAK,cAAc,KAAK,YAAY,cAAc,qBAAqB;AACvE,SAAK,aAAa,KAAK,YAAY,cAAc,yBAAyB;AAC1E,SAAK,eAAe,KAAK,YAAY,cAAc,2BAA2B;AAC9E,SAAK,WAAW,KAAK,YAAY,cAAc,wBAAwB;AACvE,SAAK,SAAS,KAAK,YAAY,cAAc,oBAAoB;AACjE,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,eAAe;AAIb,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,KAAK,QAAQ,KAAK;AAAA,MAClB,CAAC,kBAAkB;AAAA,MACnB,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,IACP;AAEA,QAAI,CAAC,KAAK,QAAQ,YAAY;AAc5B,YAAM;AAAA,QACJ,KAAK;AAAA,QACL,KAAK,QAAQ,KAAK;AAAA,QAClB,KAAK,QAAQ,KAAK;AAAA,QAClB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAEA,SAAK,qBAAqB;AAK1B,QAAI,CAAC,KAAK,QAAQ,cAAe,MAAK,SAAS,OAAO;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB;AAC1B,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AACnB,SAAK,YAAY;AAGjB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,QAAQ,YAAY;AAE3B,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,UAAU,IAAI,QAAQ;AAClC,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,WAAW;AACvB,WAAK,OAAO,iBAAiB,SAAS,KAAK,gBAAgB;AAC3D,WAAK,OAAO,iBAAiB,YAAY,KAAK,mBAAmB;AACjE,WAAK,SAAS,YAAY,KAAK,MAAM;AAErC,WAAK,SAAS,SAAS,cAAc,KAAK;AAC1C,WAAK,OAAO,UAAU,IAAI,QAAQ;AAClC,WAAK,OAAO,YAAY;AACxB,WAAK,OAAO,WAAW;AACvB,WAAK,OAAO,iBAAiB,SAAS,KAAK,gBAAgB;AAC3D,WAAK,OAAO,iBAAiB,YAAY,KAAK,mBAAmB;AACjE,WAAK,SAAS,YAAY,KAAK,MAAM;AAAA,IACvC;AACA,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AACvB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAiB;AAEf,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,WAAW,aAAa;AAC9B,UAAM,MAAM,YAAW,aAAa,KAAK;AACzC,QAAI,aAAa,SAAS,gBAAgB;AAC1C,QAAI,aAAa,SAAS,SAAS,SAAS,CAAC;AAC7C,QAAI,aAAa,UAAU,SAAS,SAAS,CAAC;AAC9C,UAAM,IAAI,YAAW,aAAa,GAAG;AACrC,MAAE,aAAa,aAAa,eAAe,aAAa,MAAM,aAAa,GAAG;AAC9E,UAAM,UAAU,YAAW,aAAa,QAAQ;AAChD,YAAQ,aAAa,SAAS,2BAA2B;AACzD,YAAQ,aAAa,MAAM,GAAG;AAC9B,YAAQ,aAAa,MAAM,GAAG;AAC9B,YAAQ,aAAa,KAAK,GAAG;AAC7B,UAAM,OAAO,YAAW,aAAa,MAAM;AAC3C,SAAK,aAAa,MAAM,GAAG;AAC3B,SAAK,aAAa,MAAM,GAAG;AAC3B,UAAM,KAAK,YAAW,aAAa,QAAQ;AAC3C,OAAG,aAAa,SAAS,sBAAsB;AAC/C,OAAG,aAAa,KAAK,WAAW,SAAS,CAAC;AAC1C,MAAE,YAAY,IAAI;AAClB,MAAE,YAAY,EAAE;AAChB,MAAE,YAAY,OAAO;AACrB,QAAI,YAAY,CAAC;AACjB,SAAK,QAAQ,YAAY,GAAG;AAC5B,SAAK,OAAO;AACZ,SAAK,KAAK;AACV,SAAK,UAAU;AACf,SAAK,IAAI;AAAA,EACX;AAAA,EAEA,kBAAkB;AAIhB,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAE9B,cAAM,SAAU,IAAI,IAAK,KAAK;AAC9B,cAAM,SAAS,KAAK,QAAQ;AAC5B,aAAK,gBAAgB,GAAG,QAAQ,MAAM;AAAA,MACxC;AAAA,IACF,OAAO;AACL,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAE9B,cAAM,SAAU,IAAI,IAAK,KAAK;AAC9B,cAAM,QAAQ,IAAI,KAAK,IAAI;AAC3B,cAAM,SAAS,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAC/D,aAAK,gBAAgB,GAAG,QAAQ,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,GAAW,QAAgB,QAAgB;AACzD,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,UAAU,IAAI,iBAAiB;AACpC,SAAK,MAAM,OACT,KAAK,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ,aAAa;AAClF,SAAK,MAAM,MACT,KAAK,QAAQ,aAAa,KAAK,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ,aAAa;AAClF,SAAK,cAAc,MAAM,IAAI,OAAO,EAAE,SAAS;AAC/C,SAAK,UAAU,YAAY,IAAI;AAAA,EACjC;AAAA,EAEA,oBAAoB;AAClB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,UAAU,IAAI,iBAAiB;AAErC,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAC9B,YAAM,OAAoB,MAAM,UAAU,IAAI;AAC9C,YAAM,SAAU,IAAI,KAAM,KAAK;AAC/B,WAAK,MAAM,OACT,KAAK,QAAQ,aACb,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,cAChC,KAAK,QAAQ,aACb;AACF,WAAK,MAAM,MACT,KAAK,QAAQ,aACb,KAAK,IAAI,MAAM,IAAI,KAAK,QAAQ,cAChC,KAAK,QAAQ,aACb;AACF,WAAK,cAAc,YAAW,gBAAgB,CAAC;AAC/C,WAAK,YAAY,YAAY,IAAI;AAAA,IACnC;AAAA,EACF;AAAA,EAiBA,kBAAkB;AAGhB,QAAI,CAAC,KAAK,UAAU,CAAC,KAAK,OAAQ;AAClC,QAAI,KAAK,QAAQ,YAAY;AAC3B,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,OAAO,UAAU,OAAO,QAAQ;AACrC,aAAK,OAAO,UAAU,IAAI,QAAQ;AAAA,MACpC,WAAW,KAAK,WAAW,MAAM;AAC/B,aAAK,OAAO,UAAU,IAAI,QAAQ;AAClC,aAAK,OAAO,UAAU,OAAO,QAAQ;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB;AAErB,QAAI,UAAU,KAAK,GAAG,SAAS,KAAK,QAAQ,eAAe,MAAM,IAAI,MAAM,GAAG;AAC9E,QAAI,KAAK,QAAQ,cAAc,EAAE,OAAO,MAAM,CAAC,MAAM,cAAc;AACjE,UAAI,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,IAAI,IAAI,GAAG;AAC5C,aAAK,SAAS;AAAA,MAChB,OAAO;AACL,aAAK,SAAS;AAAA,MAChB;AACA,YAAM,CAAC,IAAI,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE,EAAE,QAAQ,MAAM,EAAE;AAAA,IACxD;AACA,QAAI,MAAM,CAAC,MAAM,OAAO;AACtB,YAAM,MAAM,IAAI,KAAK,CAAC,oBAAI,KAAK,IAAI,KAAK,QAAQ,OAAO;AACvD,cAAQ,CAAC,IAAI,SAAS,EAAE,SAAS,GAAG,IAAI,WAAW,EAAE,SAAS,CAAC;AAC/D,UAAI,KAAK,QAAQ,YAAY;AAC3B,aAAK,SAAS,SAAS,MAAM,CAAC,CAAC,KAAK,MAAM,SAAS,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO;AAAA,MAC7E;AAAA,IACF;AACA,SAAK,QAAQ,CAAC,MAAM,CAAC,KAAK;AAC1B,SAAK,UAAU,CAAC,MAAM,CAAC,KAAK;AAC5B,SAAK,WAAW,QAAQ,YAAW,gBAAgB,KAAK,KAAK;AAC7D,SAAK,aAAa,QAAQ,YAAW,gBAAgB,KAAK,OAAO;AAEjE,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAwCA,WAAW,OAAO;AAChB,UAAM,OAAO,KAAK,aAChB,QAAQ,KAAK,IAAI,GACjB,UAAU,SAAS,SACnB,OAAO,KAAK,MAAM,UAAU,IAAI,KAChC,SAAS,QAAQ,MACjB,SACE,WAAW,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ,aAC/E,IAAI,KAAK,IAAI,MAAM,IAAI,QACvB,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI;AAE1B,QAAI,OAAO;AACT,WAAK,SAAS,UAAU,IAAI,uBAAuB;AACnD,iBAAW,MAAM;AACf,aAAK,SAAS,UAAU,OAAO,uBAAuB;AACtD,aAAK,QAAQ,GAAG,CAAC;AAAA,MACnB,GAAG,KAAK;AAAA,IACV,OAAO;AACL,WAAK,QAAQ,GAAG,CAAC;AAAA,IACnB;AAAA,EACF;AAAA,EAwBA,uBAAuB,OAAO,SAAS;AACrC,UAAM,OAAO,KAAK,MAAM,UAAU,IAAI;AACtC,UAAM,SAAS,QAAQ;AACvB,QAAI;AACJ,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,KAAK,QAAQ;AAAA,IACxB,OAAO;AACL,eACE,WAAW,QAAQ,KAAK,QAAQ,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAAA,IACjF;AACA,SAAK,mBAAmB,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,QAAQ,GAAG,GAAG,WAAoB,OAAO;AACvC,UAAM,UAAU,KAAK,gBAAgB,SACnC,OAAO,KAAK,MAAM,WAAW,WAAW,IAAI,KAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,GAC3B,QAAQ,WAAW,KAAK,KAAK,QAAQ,cAAc,KAAK,QAAQ,eAAe;AACjF,QAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,GAC3B,SAAS,QAAQ,KAAK,QAAQ,cAAc,KAAK,QAAQ;AAE3D,QAAI,KAAK,QAAQ,YAAY;AAC3B,eAAS,KAAK,QAAQ;AAAA,IACxB;AAGA,QAAI,SAAS,GAAG;AACd,eAAS,KAAK,KAAK,IAAI;AAAA,IACzB;AAGA,QAAI,QAAQ,KAAK,MAAM,SAAS,IAAI;AAGpC,aAAS,QAAQ;AAGjB,QAAI,KAAK,QAAQ,YAAY;AAC3B,UAAI,SAAS;AACX,YAAI,UAAU,EAAG,SAAQ;AAAA,MAC3B,OAAO;AACL,YAAI,SAAU,UAAS;AACvB,YAAI,UAAU,GAAI,SAAQ;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,UAAI,SAAS;AACX,YAAI,UAAU,IAAI;AAChB,kBAAQ;AAAA,QACV;AACA,gBAAQ,QAAS,UAAU,IAAI,KAAK,QAAS,UAAU,IAAI,IAAI,QAAQ;AAAA,MACzE,OAAO;AACL,YAAI,UAAU;AACZ,mBAAS;AAAA,QACX;AACA,YAAI,UAAU,IAAI;AAChB,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,KAAK,WAAW,MAAM,OAAO;AACpC,UAAI,KAAK,cAAc,KAAK,QAAQ,SAAS;AAE3C,YAAI,CAAC,KAAK,cAAc;AACtB,oBAAU,QAAQ,EAAE;AACpB,eAAK,eAAe,WAAW,MAAM;AACnC,iBAAK,eAAe;AAAA,UACtB,GAAG,GAAG;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,SAAK,KAAK,WAAW,IAAI;AACzB,QAAI,SAAS;AACX,WAAK,WAAW,QAAQ,YAAW,gBAAgB,KAAK;AAAA,IAC1D,OAAO;AACL,WAAK,aAAa,QAAQ,YAAW,gBAAgB,KAAK;AAAA,IAC5D;AAGA,SAAK,mBAAmB,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,mBAAmB,QAAgB,QAAgB;AAEjD,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,GAAI;AAC5B,UAAM,MAAM,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,QAAQ,aACpD,MAAM,CAAC,KAAK,IAAI,MAAM,KAAK,SAAS,KAAK,QAAQ,aACjD,MAAM,KAAK,IAAI,MAAM,IAAI,QACzB,MAAM,CAAC,KAAK,IAAI,MAAM,IAAI;AAC5B,SAAK,KAAK,aAAa,MAAM,IAAI,SAAS,CAAC;AAC3C,SAAK,KAAK,aAAa,MAAM,IAAI,SAAS,CAAC;AAC3C,SAAK,GAAG,aAAa,MAAM,IAAI,SAAS,CAAC;AACzC,SAAK,GAAG,aAAa,MAAM,IAAI,SAAS,CAAC;AAAA,EAC3C;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,WAAW,SAAS,GAAI,MAAK,gBAAgB;AACtD,SAAK,WAAW,QAAQ,YAAW,gBAAgB,OAAO,KAAK,WAAW,KAAK,CAAC;AAAA,EAClF;AAAA,EAEA,gBAAgB;AACd,QAAI,KAAK,aAAa,SAAS,GAAI,MAAK,WAAU,oBAAI,KAAK,GAAE,WAAW;AACxE,SAAK,aAAa,QAAQ,YAAW,gBAAgB,OAAO,KAAK,aAAa,KAAK,CAAC;AAAA,EACtF;AAAA,EAEA,kBAAkB;AAChB,SAAK,SAAQ,oBAAI,KAAK,GAAE,SAAS;AACjC,SAAK,WAAW,SAAS,KAAK,SAAS,KAAK,QAAQ,aAAa,KAAK,KAAK,SAAS;AAAA,EACtF;AAkEF;AA7BI,YAAW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnuBpB,IAAM,aAAN;;;AC1EP,IAAMC,cAA0B;AAAA,EAC9B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,mBAAmB;AACrB;AAEO,IAAM,SAAN,MAAM,OAAM;AAAA,EA4BjB,YAAY,SAAgC;AAC1C,SAAK,UAAU;AAAA,MACb,GAAG,OAAM;AAAA,MACT,GAAG;AAAA,IACL;AACA,SAAK,UAAU,KAAK,QAAQ;AAC5B,SAAK,UAAU;AACf,SAAK,gBAAgB,KAAK,QAAQ;AAClC,QAAI,OAAM,QAAQ,WAAW,GAAG;AAC9B,aAAM,iBAAiB;AAAA,IACzB;AAEA,WAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,eAAe,KAAK,aAAa;AACvC,iBAAa,kBAAkB,IAAI;AACnC,SAAK,KAAK;AACV,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,WAAyB;AAClC,WAAOA;AAAA,EACT;AAAA,EAEA,OAAO,YAAY,IAAwB;AACzC,WAAO,GAAG,kBAAkB;AAAA,EAC9B;AAAA,EAEA,OAAO,mBAAmB;AACxB,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,aAAa,MAAM,iBAAiB;AAE9C,cAAU,iBAAiB,cAAc,OAAM,YAAY;AAC3D,cAAU,iBAAiB,aAAa,OAAM,WAAW;AACzD,cAAU,iBAAiB,YAAY,OAAM,UAAU;AACvD,cAAU,iBAAiB,aAAa,OAAM,YAAY;AAC1D,aAAS,iBAAiB,aAAa,OAAM,WAAW;AACxD,aAAS,iBAAiB,WAAW,OAAM,UAAU;AACrD,aAAS,KAAK,YAAY,SAAS;AACnC,WAAM,aAAa;AAAA,EACrB;AAAA,EAEA,OAAO,mBAAmB;AACxB,aAAS,oBAAoB,aAAa,OAAM,WAAW;AAC3D,aAAS,oBAAoB,WAAW,OAAM,UAAU;AACxD,WAAM,WAAW,OAAO;AACxB,WAAM,aAAa;AAAA,EACrB;AAAA,EAEA,OAAO,aAAa,GAA4B;AAC9C,UAAM,SAAS,EAAE;AAEjB,QAAI,UAAU,CAAC,OAAO,QAAQ,WAAW,KAAK,OAAO,QAAQ,WAAW,GAAG;AACzE,YAAM,YAAY,OAAO,QAAQ,WAAW;AAC5C,YAAM,QAAe,UAAU,kBAAkB;AACjD,UAAI,CAAC,MAAO;AACZ,YAAM,UAAU;AAChB,YAAM,YAAY;AAClB,aAAM,gBAAgB;AACtB,YAAM,GAAG,UAAU,IAAI,SAAS;AAChC,YAAM,GAAG,MAAM,aAAa;AAC5B,YAAM,eAAe,OAAM,MAAM,CAAC;AAClC,YAAM,OAAO,KAAK,IAAI;AACtB,YAAM,OAAO,OAAM,MAAM,CAAC;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,GAA4B;AAC7C,QAAI,CAAC,CAAC,OAAM,eAAe;AACzB,QAAE,eAAe;AACjB,YAAM,QAAQ,OAAM;AACpB,YAAM,SAAS,KAAK,IAAI,MAAM,OAAO,OAAM,MAAM,CAAC,CAAC;AACnD,YAAM,OAAO,OAAM,MAAM,CAAC;AAC1B,YAAM,YAAY,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM;AACrD,YAAM,OAAO,KAAK,IAAI;AAEtB,YAAM,cAAc,MAAM,OAAO,MAAM;AACvC,YAAM,qBAAqB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAChE,YAAM,GAAG,MAAM,YAAY,cAAc,WAAW;AACpD,YAAM,GAAG,MAAM,WAAW,IAAI,KAAK,IAAI,cAAc,kBAAkB,GAAG,SAAS;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,OAAO,aAAa;AAClB,QAAI,CAAC,CAAC,OAAM,eAAe;AACzB,YAAM,QAAQ,OAAM;AACpB,YAAM,UAAU;AAChB,YAAM,GAAG,UAAU,OAAO,SAAS;AAEnC,YAAM,cAAc,MAAM,OAAO,MAAM;AACvC,YAAM,qBAAqB,MAAM,GAAG,cAAc,MAAM,QAAQ;AAChE,YAAM,oBAAoB,KAAK,IAAI,WAAW,IAAI,sBAAsB,MAAM,YAAY;AAG1F,UAAI,mBAAmB;AACrB,cAAM,YAAY;AAClB,cAAM,QAAQ;AAAA,MAEhB,OAAO;AACL,cAAM,GAAG,MAAM,aAAa;AAC5B,cAAM,GAAG,MAAM,YAAY;AAC3B,cAAM,GAAG,MAAM,UAAU;AACzB,cAAM,aAAa;AAAA,MACrB;AACA,aAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,GAA4B;AACvC,QAAI,EAAE,KAAK,WAAW,OAAO,KAAM,EAAiB,cAAc,UAAU,GAAG;AAC7E,aAAQ,EAAiB,cAAc,CAAC,EAAE;AAAA,IAC5C;AAEA,WAAQ,EAAiB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAa;AAElB,eAAW,SAAS,CAAC,GAAG,OAAM,OAAO,GAAG;AACtC,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,eAAe;AACb,QAAI,QAAqB,KAAK,QAAQ,UAClC,SAAS,eAAe,KAAK,QAAQ,OAAO,IAC5C,SAAS,cAAc,KAAK;AAChC,QAAI,iBAAiB,qBAAqB;AACxC,YAAM,OAAQ,MAA8B,QAAQ,UAAU,IAAI;AAClE,cAAS,KAAqB;AAAA,IAChC;AACA,UAAM,UAAU,IAAI,UAAU;AAC9B,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,aAAa,QAAQ;AACxC,UAAM,aAAa,eAAe,MAAM;AAExC,QAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AACnC,YAAM,UAAU,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC;AAAA,IACxE;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,cAAc,KAAK;AACxB,YAAM,gBAAgB,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,QAAQ,QAAQ;AACvB,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,OAAO;AACd,aAAO,cAAc,KAAK,QAAQ;AAClC,aAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,UAAE,gBAAgB;AAClB,YAAI,OAAO,KAAK,QAAQ,aAAa,YAAY;AAC/C,eAAK,QAAQ,SAAS;AAAA,QACxB;AACA,aAAK,QAAQ;AAAA,MACf,CAAC;AACD,YAAM,YAAY,MAAM;AAAA,IAC1B;AACA,QAAI,KAAK,QAAQ,aAAa;AAC5B,YAAM,QAAQ,SAAS,cAAc,QAAQ;AAC7C,YAAM,OAAO;AACb,YAAM,YAAY;AAClB,YAAM,aAAa,cAAc,SAAS;AAC1C,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,YAAY;AACjB,WAAK,aAAa,eAAe,MAAM;AACvC,WAAK,cAAc;AACnB,YAAM,YAAY,IAAI;AACtB,YAAM,iBAAiB,SAAS,CAAC,MAAM;AACrC,UAAE,gBAAgB;AAClB,aAAK,QAAQ;AAAA,MACf,CAAC;AACD,YAAM,YAAY,KAAK;AAAA,IACzB;AACA,WAAM,WAAW,YAAY,KAAK;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa;AAEX,SAAK,GAAG,MAAM,UAAU;AACxB,SAAK,GAAG,MAAM,UAAU;AAExB,SAAK,GAAG,MAAM,aAAa;AAAA,YACnB,KAAK,QAAQ,UAAU;AAAA,gBACnB,KAAK,QAAQ,UAAU;AAAA;AAEnC,eAAW,MAAM;AACf,WAAK,GAAG,MAAM,MAAM;AACpB,WAAK,GAAG,MAAM,UAAU;AAAA,IAC1B,GAAG,CAAC;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY;AACV,QAAI,KAAK,kBAAkB,SAAU;AACrC,SAAK,YAAY,KAAK,IAAI,IAAI,KAAK;AACnC,SAAK,iBAAiB,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,aAAa;AAAA,EAC3E;AAAA;AAAA,EAGA,cAAc;AACZ,QAAI,KAAK,kBAAkB,KAAM;AACjC,iBAAa,KAAK,cAAc;AAChC,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,EAC9D;AAAA;AAAA,EAGA,eAAe;AACb,QAAI,KAAK,kBAAkB,KAAM;AACjC,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,iBAAa,KAAK,cAAc;AAChC,SAAK,iBAAiB;AACtB,UAAM,qBAAqB,KAAK,GAAG,cAAc,KAAK,QAAQ;AAE9D,QAAI,KAAK,WAAW;AAClB,WAAK,GAAG,MAAM,aAAa;AAC3B,WAAK,GAAG,MAAM,YAAY,cAAc,kBAAkB;AAC1D,WAAK,GAAG,MAAM,UAAU;AAAA,IAC1B;AAGA,SAAK,GAAG,MAAM,aAAa;AAAA,eAChB,KAAK,QAAQ,WAAW;AAAA,gBACvB,KAAK,QAAQ,WAAW;AAEpC,eAAW,MAAM;AACf,WAAK,GAAG,MAAM,UAAU;AACxB,WAAK,GAAG,MAAM,YAAY;AAAA,IAC5B,GAAG,CAAC;AAEJ,eAAW,MAAM;AAEf,UAAI,OAAO,KAAK,QAAQ,qBAAqB,YAAY;AACvD,aAAK,QAAQ,iBAAiB;AAAA,MAChC;AAEA,UAAI,KAAK,GAAG,MAAM,KAAK,QAAQ,SAAS;AACtC,aAAK,GAAG,OAAO;AAGf,cAAM,QAAQ,OAAM,QAAQ,QAAQ,IAAI;AACxC,YAAI,SAAS,EAAG,QAAM,QAAQ,OAAO,OAAO,CAAC;AAC7C,YAAI,OAAM,QAAQ,WAAW,KAAK,OAAM,YAAY;AAClD,iBAAM,iBAAiB;AAAA,QACzB;AAAA,MACF;AAAA,IACF,GAAG,KAAK,QAAQ,WAAW;AAAA,EAC7B;AAOF;AAJI,OAAM,UAAU,CAAC;AACjB,OAAM,aAAa;AACnB,OAAM,gBAAgB;AAxSnB,IAAM,QAAN;;;ACdP,IAAMC,cAA4B;AAAA,EAChC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,SAAS;AACX;AAEO,IAAM,UAAN,MAAM,iBAAgB,UAA0B;AAAA,EAmBrD,YAAY,IAAiB,SAAkC;AAC7D,UAAM,IAAI,SAAS,QAAO;AAuG5B;AAAA;AAAA;AAAA,gBAAO,CAAC,aAAsB;AAC5B,UAAI,KAAK,OAAQ;AACjB,iBAAW,aAAa,SAAY,OAAO;AAC3C,WAAK,SAAS;AAEd,WAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,KAAK,qBAAqB,EAAE;AACjE,WAAK,sBAAsB;AAC3B,WAAK,sBAAsB,QAAQ;AAAA,IACrC;AAKA;AAAA;AAAA;AAAA,iBAAQ,MAAM;AACZ,UAAI,CAAC,KAAK,OAAQ;AAClB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,SAAS;AACd,WAAK,qBAAqB;AAAA,IAC5B;AAkIA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,KAAK,KAAK;AAAA,IACjB;AAEA,6BAAoB,MAAM;AACxB,WAAK,YAAY;AACjB,WAAK,YAAY;AACjB,WAAK,MAAM;AAAA,IACb;AAEA,wBAAe,MAAM;AACnB,UAAI,MAAM,YAAY;AACpB,aAAK,YAAY;AACjB,aAAK,KAAK,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,uBAAc,MAAM;AAClB,WAAK,YAAY;AACjB,WAAK,MAAM;AAAA,IACb;AAjRE,SAAK,GAAG,oBAAoB,IAAI;AAEhC,SAAK,UAAU;AAAA,MACb,GAAG,SAAQ;AAAA,MACX,GAAG,KAAK,qBAAqB;AAAA,MAC7B,GAAG;AAAA,IACL;AAEA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,WAAW,WAA2B;AACpC,WAAOA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,KACL,KACA,UAAmC,CAAC,GACf;AACrB,WAAO,MAAM,KAAK,KAAK,SAAS,QAAO;AAAA,EACzC;AAAA,EAEA,OAAO,YAAY,IAA0B;AAC3C,WAAO,GAAG,oBAAoB;AAAA,EAChC;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,GAAG,aAAa,kBAAkB,MAAM,KAAK,UAAU,IAAI;AAClE,WAAK,GAAG,gBAAgB,kBAAkB;AAAA,IAC5C;AACA,SAAK,UAAU,OAAO;AACtB,SAAK,qBAAqB;AAC1B,SAAK,GAAG,oBAAoB,IAAI;AAAA,EAClC;AAAA,EAEA,mBAAmB;AACjB,SAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,SAAK,UAAU,UAAU,IAAI,SAAS;AACtC,SAAK,UAAU,KAAK,WAAW,MAAM,KAAK,CAAC;AAC3C,SAAK,UAAU,aAAa,QAAQ,SAAS;AAC7C,SAAK,GAAG,aAAa,oBAAoB,KAAK,UAAU,EAAE;AAE1D,UAAM,mBAAmB,KAAK,QAAQ,YAClC,SAAS,eAAe,KAAK,QAAQ,SAAS,IAC9C,SAAS,cAAc,KAAK;AAChC,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,UAAU,UAAU,IAAI,MAAM;AAAA,IACrC;AACA,qBAAiB,MAAM,UAAU;AACjC,qBAAiB,UAAU,IAAI,iBAAiB;AAChD,SAAK,mBAAmB,gBAAgB;AACxC,SAAK,UAAU,YAAY,gBAAgB;AAC3C,aAAS,KAAK,YAAY,KAAK,SAAS;AAAA,EAC1C;AAAA,EAEA,mBAAmB,kBAA+B;AAChD,QAAI,KAAK,QAAQ,UAAW;AAC5B,qBAAiB,YAAY,KAAK,QAAQ;AAAA,EAC5C;AAAA,EAEA,wBAAwB;AACtB,SAAK,mBAAmB,KAAK,UAAU,cAAc,kBAAkB,CAAC;AAAA,EAC1E;AAAA,EAEA,sBAAsB;AACpB,SAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,SAAK,GAAG,iBAAiB,cAAc,KAAK,iBAAiB;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,cAAc,IAAI;AACzD,SAAK,GAAG,iBAAiB,QAAQ,KAAK,aAAa,IAAI;AAAA,EACzD;AAAA,EAEA,uBAAuB;AACrB,SAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,SAAK,GAAG,oBAAoB,cAAc,KAAK,iBAAiB;AAChE,SAAK,GAAG,oBAAoB,SAAS,KAAK,cAAc,IAAI;AAC5D,SAAK,GAAG,oBAAoB,QAAQ,KAAK,aAAa,IAAI;AAAA,EAC5D;AAAA,EA0BA,uBAAuB;AACrB,iBAAa,KAAK,iBAAiB;AACnC,SAAK,oBAAoB,WAAW,MAAM;AACxC,UAAI,KAAK,aAAa,KAAK,UAAW;AACtC,WAAK,YAAY;AAAA,IACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,EAC3B;AAAA,EAEA,sBAAsB,UAAU;AAC9B,iBAAa,KAAK,kBAAkB;AACpC,SAAK,qBAAqB,WAAW,MAAM;AACzC,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa,CAAC,SAAU;AACrD,WAAK,WAAW;AAAA,IAClB,GAAG,KAAK,QAAQ,UAAU;AAAA,EAC5B;AAAA,EAEA,mBAAmB;AACjB,UAAM,UAAuB,KAAK;AAClC,UAAM,SAAS,KAAK,IAClB,eAAe,OAAO,cACtB,cAAc,OAAO,aACrB,gBAAgB,QAAQ,cACxB,eAAe,QAAQ,aACvB,SAAS,KAAK,QAAQ;AAExB,SAAK,YAAY;AACjB,SAAK,YAAY;AAEjB,UAAM,aAAa,OAAO,sBAAsB;AAChD,QAAI,YAAY,WAAW,MAAM,MAAM,qBAAqB;AAC5D,QAAI,aAAa,WAAW,OAAO,MAAM,sBAAsB;AAC/D,QAAI,KAAK,QAAQ,aAAa,OAAO;AACnC,mBAAa,CAAC,gBAAgB;AAC9B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,WAAW,KAAK,QAAQ,aAAa,SAAS;AAC5C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,cAAc;AAC5B,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC,WAAW,KAAK,QAAQ,aAAa,QAAQ;AAC3C,mBAAa,eAAe,IAAI,gBAAgB;AAChD,oBAAc,CAAC,eAAe;AAC9B,WAAK,YAAY,CAAC,KAAK,QAAQ;AAAA,IACjC,OAAO;AACL,mBAAa,eAAe;AAC5B,oBAAc,cAAc,IAAI,eAAe;AAC/C,WAAK,YAAY,KAAK,QAAQ;AAAA,IAChC;AAEA,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,YAAQ,MAAM,MAAM,eAAe,IAAI;AACvC,YAAQ,MAAM,OAAO,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEA,wBAAwB,GAAW,GAAW,OAAe,QAAgB;AAC3E,UAAM,aAAa,MAAM,sBAAsB;AAC/C,UAAM,YAAY,MAAM,qBAAqB;AAC7C,QAAI,OAAO,IAAI;AACf,QAAI,OAAO,IAAI;AAEf,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,KAAK,QAAQ,SAAS,KAAK,QAAQ;AAClD,UAAM,QAAQ,MAAM,qBAAqB,SAAS,MAAM,UAAU,MAAM;AAExE,QAAI,MAAM,MAAM;AACd,aAAO;AAAA,IACT,WAAW,MAAM,OAAO;AACtB,cAAQ,OAAO,QAAQ,OAAO;AAAA,IAChC;AACA,QAAI,MAAM,KAAK;AACb,aAAO;AAAA,IACT,WAAW,MAAM,QAAQ;AACvB,cAAQ,OAAO,SAAS,OAAO;AAAA,IACjC;AACA,WAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,aAAa;AACX,SAAK,iBAAiB;AACtB,SAAK,UAAU,MAAM,aAAa;AAClC,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,QAAQ;AAAA,gBACV,QAAQ;AACpB,eAAW,MAAM;AACf,WAAK,UAAU,MAAM,YAAY,cAAc,KAAK,SAAS,kBAAkB,KAAK,SAAS;AAC7F,WAAK,UAAU,MAAM,WAAW,KAAK,QAAQ,WAAW,GAAG,SAAS;AAAA,IACtE,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,cAAc;AACZ,UAAM,WAAW,KAAK,QAAQ;AAE9B,SAAK,UAAU,MAAM,aAAa;AAAA,kBACpB,QAAQ;AAAA,gBACV,QAAQ;AACpB,eAAW,MAAM;AACf,WAAK,UAAU,MAAM,YAAY;AACjC,WAAK,UAAU,MAAM,UAAU;AAAA,IACjC,GAAG,CAAC;AAAA,EAYN;AAAA,EA0BA,uBAAgD;AAC9C,UAAM,mBAA4C,CAAC;AACnD,UAAM,oBAAoB,KAAK,GAAG,aAAa,cAAc;AAC7D,UAAM,YAAY,KAAK,GAAG,aAAa,iBAAiB;AACxD,UAAM,iBAAiB,KAAK,GAAG,aAAa,eAAe;AAC3D,QAAI,mBAAmB;AACrB,uBAAiB,OAAO;AAAA,IAC1B;AACA,QAAI,gBAAgB;AAClB,uBAAiB,WAAW;AAAA,IAC9B;AACA,QAAI,WAAW;AACb,uBAAiB,YAAY;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT;AACF;;;AChXO,IAAM,uBAAuB;AAAA,EAClC,cAAc,EAAE,WAAsB,cAAc,UAAU,gBAAgB;AAAA;AAAA;AAAA,EAG9E,OAAO,EAAE,WAAsB,OAAO,UAAU,eAAe;AAAA,EAC/D,UAAU,EAAE,WAAsB,UAAU,UAAU,YAAY;AAAA,EAClE,OAAO,EAAE,WAAsB,OAAO,UAAU,SAAS;AAAA,EACzD,aAAa,EAAE,WAAsB,aAAa,UAAU,eAAe;AAAA,EAC3E,YAAY,EAAE,WAAsB,YAAY,UAAU,cAAc;AAAA,EACxE,UAAU,EAAE,WAAsB,UAAU,UAAU,oBAAoB;AAAA,EAC1E,UAAU,EAAE,WAAsB,UAAU,UAAU,cAAc;AAAA,EACpE,UAAU,EAAE,WAAsB,UAAU,UAAU,YAAY;AAAA,EAClE,SAAS,EAAE,WAAsB,SAAS,UAAU,WAAW;AAAA,EAC/D,WAAW,EAAE,WAAsB,WAAW,UAAU,aAAa;AAAA,EACrE,YAAY,EAAE,WAAsB,YAAY,UAAU,SAAS;AAAA,EACnE,SAAS,EAAE,WAAsB,SAAS,UAAU,WAAW;AAAA,EAC/D,MAAM,EAAE,WAAsB,MAAM,UAAU,QAAQ;AAAA,EACtD,WAAW,EAAE,WAAsB,WAAW,UAAU,cAAc;AAAA,EACtE,YAAY,EAAE,WAAsB,YAAY,UAAU,cAAc;AAAA,EACxE,SAAS,EAAE,WAAsB,SAAS,UAAU,cAAc;AAAA,EAClE,sBAAsB;AAAA,IACpB,WAAsB;AAAA,IACtB,UAAU;AAAA,EACZ;AACF;AAsBO,SAAS,SACd,UAAuB,SAAS,MAChC,SACA;AACA,aAAW,QAAQ,OAAO,KAAK,oBAAoB,GAAyB;AAC1E,UAAM,EAAE,WAAW,SAAS,IAAI,qBAAqB,IAAI;AAKzD,UAAM,MAAM,QAAQ,iBAAiB,OAAO,QAAQ,qBAAqB;AAGzE,IAAC,UAAsC,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,CAAC;AAAA,EACxE;AACF;;;A7BrDO,IAAM,UAAU;AAMvB,IAAI,OAAO,aAAa,aAAa;AACnC,WAAS,iBAAiB,WAAW,MAAM,kBAAkB,IAAI;AACjE,WAAS,iBAAiB,SAAS,MAAM,gBAAgB,IAAI;AAC7D,WAAS,iBAAiB,SAAS,MAAM,gBAAgB,IAAI;AAC7D,WAAS,iBAAiB,QAAQ,MAAM,eAAe,IAAI;AAC7D;AACA,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,MAAM,KAAK;AACX,QAAQ,KAAK;",
6
- "names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "el", "_defaults", "_defaults", "_defaults", "value", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults"]
3
+ "sources": ["../../src/ts/index.ts", "../../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/range.ts", "../../src/ts/behaviors/dialogs.ts", "../../src/ts/behaviors/bottomSheets.ts", "../../src/ts/behaviors/sideSheets.ts", "../../src/ts/behaviors/forms.ts", "../../src/ts/behaviors/waves.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/parallax.ts", "../../src/ts/components/scrollspy.ts", "../../src/ts/components/sidenav.ts", "../../src/ts/components/navigationRail.ts", "../../src/ts/components/slider.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"],
4
+ "sourcesContent": ["// 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.6.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", "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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\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"],
5
+ "mappings": "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",
6
+ "names": ["el", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "el", "_defaults", "_defaults", "value", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults", "_defaults"]
7
7
  }