stimulus_plumbers 0.4.3 → 0.4.4
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/stimulus-plumbers/{stimulus-plumbers-controllers.es.js → index.es.js} +2 -0
- data/app/assets/javascripts/stimulus-plumbers/index.es.js.map +1 -0
- data/app/assets/javascripts/stimulus-plumbers/{stimulus-plumbers-controllers.umd.js → index.umd.js} +2 -1
- data/app/assets/javascripts/stimulus-plumbers/index.umd.js.map +1 -0
- data/lib/stimulus_plumbers/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9de763c041b8b091739e3130ac1b831a6819ca250c1068f91e9bad332892d37b
|
|
4
|
+
data.tar.gz: fca860e3e80a04d86b381e3c5e6c38ae791f59195b3a776f6e0c07a1a1ee5db7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f279e071f01f01b98b097bb73f906f2b12c7e48bae08af840a25f1324be412b9e120799d9c384c025c7bcda9aba07c088a45efd829ed8de2cd5ac6d4f097fefd
|
|
7
|
+
data.tar.gz: 12c31f2d9a804ddadee35f241806f1301f9211f3fa9ab2d2abe03d98b42d7ea1e92ef39f00a739d2fc7f58348efb52194a8ccba099e15ce38786d9cc16028327
|
data/app/assets/javascripts/stimulus-plumbers/{stimulus-plumbers-controllers.es.js → index.es.js}
RENAMED
|
@@ -2118,3 +2118,5 @@ var U = 7, Ee = 12, W = 10, G = {
|
|
|
2118
2118
|
};
|
|
2119
2119
|
//#endregion
|
|
2120
2120
|
export { y as ARIA_HASPOPUP_VALUES, Ge as CalendarDecadeController, Ke as CalendarDecadeSelectorController, qe as CalendarMonthController, Je as CalendarMonthSelectorController, Xe as CalendarYearController, Ze as CalendarYearSelectorController, Qe as ClipboardController, $e as ComboboxDateController, et as ComboboxDropdownController, tt as ComboboxTimeController, nt as DismisserController, t as FOCUSABLE_SELECTOR, I as FORMATTER_TYPES, rt as FlipperController, a as FocusTrap, z as Formatter, ot as InputClearableController, it as InputComboboxController, at as InputFormatterController, d as ListboxNavigation, st as ModalController, ct as PannerController, lt as PopoverController, w as Requestor, u as RovingTabIndex, ut as TimelineController, f as announce, S as connectTriggerToTarget, re as disconnectTriggerFromTarget, m as ensureId, E as filterOptions, i as focusFirst, T as fuzzyMatcher, p as generateId, n as getFocusableElements, s as isActivationKey, c as isArrowKey, o as isKey, r as isVisible, l as preventDefault, h as setAriaState, te as setChecked, ne as setDisabled, g as setExpanded, v as setHidden, _ as setPressed };
|
|
2121
|
+
|
|
2122
|
+
//# sourceMappingURL=index.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","names":["defaultOptions","STRIP_NON_DIGITS","STRIP_NON_DIGITS","defaultOptions","defaultOptions","defaultOptions","defaultOptions","defaultOptions","defaultOptions"],"sources":["../src/accessibility/focus.js","../src/accessibility/keyboard.js","../src/accessibility/aria.js","../src/requestor.js","../src/researcher.js","../src/plumbers/plumber/geometry.js","../src/plumbers/plumber/config.js","../src/plumbers/plumber/index.js","../src/plumbers/formatters/plain.js","../src/plumbers/formatters/credit_card.js","../src/plumbers/formatters/phone.js","../src/plumbers/formatters/currency.js","../src/plumbers/formatters/date.js","../src/plumbers/formatters/time.js","../src/plumbers/formatter.js","../src/plumbers/plumber/date.js","../src/plumbers/calendar.js","../src/plumbers/calendar-selector.js","../src/plumbers/content_loader.js","../src/plumbers/plumber/window_observer.js","../src/plumbers/dismisser.js","../src/plumbers/flipper.js","../src/plumbers/shifter.js","../src/plumbers/visibility.js","../src/controllers/calendar_decade_controller.js","../src/controllers/calendar_decade_selector_controller.js","../src/controllers/calendar_month_controller.js","../src/controllers/calendar_month_selector_controller.js","../src/controllers/calendar_year_controller.js","../src/controllers/calendar_year_selector_controller.js","../src/controllers/clipboard_controller.js","../src/controllers/combobox_date_controller.js","../src/controllers/combobox_dropdown_controller.js","../src/controllers/combobox_time_controller.js","../src/controllers/dismisser_controller.js","../src/controllers/flipper_controller.js","../src/controllers/input_combobox_controller.js","../src/controllers/input_formatter_controller.js","../src/controllers/input_clearable_controller.js","../src/controllers/modal_controller.js","../src/controllers/panner_controller.js","../src/controllers/popover_controller.js","../src/controllers/timeline_controller.js"],"sourcesContent":["/**\n * Query selector for all focusable elements\n */\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n].join(',');\n\n/**\n * Get all focusable elements within a container\n */\nexport function getFocusableElements(container) {\n return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((el) => isVisible(el));\n}\n\n/**\n * Check if an element is visible\n */\nexport function isVisible(element) {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n}\n\n/**\n * Focus the first focusable element in a container\n */\nexport function focusFirst(container) {\n const elements = getFocusableElements(container);\n if (elements.length > 0) {\n elements[0].focus();\n return true;\n }\n return false;\n}\n\n/**\n * Create a focus trap within a container\n */\nexport class FocusTrap {\n constructor(container, options = {}) {\n this.container = container;\n this.previouslyFocused = null;\n this.options = options;\n this.isActive = false;\n }\n\n activate() {\n if (this.isActive) return;\n\n this.previouslyFocused = document.activeElement;\n this.isActive = true;\n\n // Focus initial element or first focusable\n if (this.options.initialFocus) {\n this.options.initialFocus.focus();\n } else {\n focusFirst(this.container);\n }\n\n // Add event listeners\n this.container.addEventListener('keydown', this.handleKeyDown);\n }\n\n deactivate() {\n if (!this.isActive) return;\n\n this.isActive = false;\n this.container.removeEventListener('keydown', this.handleKeyDown);\n\n // Return focus to previously focused element\n const returnElement = this.options.returnFocus || this.previouslyFocused;\n if (returnElement && isVisible(returnElement)) {\n returnElement.focus();\n }\n\n if (typeof this.options.onDeactivate === 'function') {\n this.options.onDeactivate();\n }\n }\n\n handleKeyDown = (event) => {\n if (event.key === 'Escape' && this.options.escapeDeactivates) {\n event.preventDefault();\n this.deactivate();\n return;\n }\n\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements(this.container);\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n // Trap focus within container\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n };\n}\n","/**\n * Keyboard interaction utilities\n */\n\n/**\n * Check if a key matches the expected key\n */\nexport function isKey(event, key) {\n return event.key === key;\n}\n\n/**\n * Check if Enter or Space was pressed (activation keys)\n */\nexport function isActivationKey(event) {\n return event.key === 'Enter' || event.key === ' ';\n}\n\n/**\n * Check if an arrow key was pressed\n */\nexport function isArrowKey(event) {\n return ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key);\n}\n\n/**\n * Prevent default and stop propagation\n */\nexport function preventDefault(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n/**\n * Handle roving tabindex for a list of items\n */\nexport class RovingTabIndex {\n constructor(items, options = {}) {\n this.items = Array.from(items);\n this.currentIndex = options.initialIndex ?? 0;\n this.orientation = options.orientation ?? 'both';\n this.wrap = options.wrap ?? true;\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleClick = this._handleClick.bind(this);\n }\n\n activate() {\n this.updateTabIndex();\n this.items.forEach((item) => {\n item.addEventListener('keydown', this._handleKeyDown);\n item.addEventListener('click', this._handleClick);\n });\n return this;\n }\n\n deactivate() {\n this.items.forEach((item) => {\n item.removeEventListener('keydown', this._handleKeyDown);\n item.removeEventListener('click', this._handleClick);\n });\n }\n\n updateItems(items) {\n this.deactivate();\n this.items = Array.from(items);\n this.currentIndex = Math.min(this.currentIndex, Math.max(0, this.items.length - 1));\n this.activate();\n }\n\n setCurrentIndex(index) {\n if (index >= 0 && index < this.items.length) {\n this.currentIndex = index;\n this.updateTabIndex();\n this.items[index].focus();\n }\n }\n\n updateTabIndex() {\n this.items.forEach((item, i) => {\n item.tabIndex = i === this.currentIndex ? 0 : -1;\n });\n }\n\n _handleClick(event) {\n const index = this.items.indexOf(event.currentTarget);\n if (index !== -1) {\n this.currentIndex = index;\n this.updateTabIndex();\n }\n }\n\n _handleKeyDown(event) {\n const fromIndex = this.items.indexOf(event.currentTarget);\n if (fromIndex !== -1 && fromIndex !== this.currentIndex) {\n this.currentIndex = fromIndex;\n this.updateTabIndex();\n }\n\n const verticalKeys = this.orientation !== 'horizontal' ? ['ArrowUp', 'ArrowDown'] : [];\n const horizontalKeys = this.orientation !== 'vertical' ? ['ArrowLeft', 'ArrowRight'] : [];\n const activeKeys = [...verticalKeys, ...horizontalKeys, 'Home', 'End'];\n\n if (!activeKeys.includes(event.key)) return;\n event.preventDefault();\n const base = fromIndex !== -1 ? fromIndex : this.currentIndex;\n\n let newIndex;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n newIndex = this.wrap ? (base + 1) % this.items.length : Math.min(base + 1, this.items.length - 1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n newIndex = this.wrap ? (base - 1 + this.items.length) % this.items.length : Math.max(base - 1, 0);\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = this.items.length - 1;\n break;\n }\n this.setCurrentIndex(newIndex);\n }\n}\n\nexport class ListboxNavigation {\n constructor(listbox, options = {}) {\n this.listbox = listbox;\n this.itemSelector = options.itemSelector ?? '[role=\"option\"]:not([aria-disabled=\"true\"]):not([hidden])';\n this.wrap = options.wrap ?? false;\n this.orientation = options.orientation ?? 'vertical';\n }\n\n get selectedItem() {\n return this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`) ?? null;\n }\n\n get currentIndex() {\n const items = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n return items.indexOf(this.selectedItem);\n }\n\n _selectItem(item) {\n const all = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n all.forEach((o) => o.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n item.scrollIntoView({ block: 'nearest' });\n }\n\n step(delta) {\n const options = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n if (!options.length) return;\n const current = this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`);\n const idx = options.indexOf(current);\n let next;\n if (delta > 0) {\n next = this.wrap ? options[(idx + 1) % options.length] : options[Math.min(idx + 1, options.length - 1)];\n } else {\n next = this.wrap ? options[(idx - 1 + options.length) % options.length] : options[Math.max(idx - 1, 0)];\n }\n if (!next || next === current) return;\n this._selectItem(next);\n }\n\n handleKeyDown(event) {\n const verticalKeys = this.orientation !== 'horizontal' ? ['ArrowUp', 'ArrowDown'] : [];\n const horizontalKeys = this.orientation !== 'vertical' ? ['ArrowLeft', 'ArrowRight'] : [];\n const activeKeys = [...verticalKeys, ...horizontalKeys, 'Home', 'End', 'Enter', ' '];\n\n if (!activeKeys.includes(event.key)) return;\n event.preventDefault();\n\n const options = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n this.step(1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n this.step(-1);\n break;\n case 'Home':\n if (options.length) this._selectItem(options[0]);\n break;\n case 'End':\n if (options.length) this._selectItem(options[options.length - 1]);\n break;\n case 'Enter':\n case ' ':\n this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`)?.click();\n break;\n }\n }\n}\n","/**\n * Get or create a live region for screen reader announcements\n */\nconst getLiveRegion = (politeness, atomic, relevant) => {\n let region = document.querySelector(`[data-live-region=\"${politeness}\"]`);\n\n if (!region) {\n region = document.createElement('div');\n region.className = 'sr-only';\n region.dataset.liveRegion = politeness;\n region.setAttribute('aria-live', politeness);\n region.setAttribute('aria-atomic', atomic.toString());\n region.setAttribute('aria-relevant', relevant);\n document.body.appendChild(region);\n }\n\n return region;\n};\n\n/**\n * Announce a message to screen readers using an aria-live region\n */\nexport function announce(message, options = {}) {\n const { politeness = 'polite', atomic = true, relevant = 'additions text' } = options;\n const region = getLiveRegion(politeness, atomic, relevant);\n\n region.textContent = '';\n setTimeout(() => {\n region.textContent = message;\n }, 100);\n}\n\n/**\n * Generate a unique ID for ARIA relationships\n */\nexport const generateId = (prefix = 'a11y') => `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n\n/**\n * Ensure element has an ID, generate one if needed\n */\nexport const ensureId = (element, prefix = 'element') => element.id || (element.id = generateId(prefix));\n\n/**\n * Generic function to set ARIA state attributes\n */\nexport const setAriaState = (element, attribute, value) => {\n element.setAttribute(attribute, value.toString());\n};\n\n/**\n * Update aria-expanded state\n */\nexport const setExpanded = (element, expanded) => setAriaState(element, 'aria-expanded', expanded);\n\n/**\n * Update aria-pressed state\n */\nexport const setPressed = (element, pressed) => setAriaState(element, 'aria-pressed', pressed);\n\n/**\n * Update aria-checked state\n */\nexport const setChecked = (element, checked) => setAriaState(element, 'aria-checked', checked);\n\n/**\n * Set or remove the hidden attribute\n */\nexport const setHidden = (element, hidden) =>\n hidden ? element.setAttribute('hidden', '') : element.removeAttribute('hidden');\n\n/**\n * Update aria-disabled state and manage tabindex\n */\nexport function setDisabled(element, disabled) {\n setAriaState(element, 'aria-disabled', disabled);\n disabled ? element.setAttribute('tabindex', '-1') : element.removeAttribute('tabindex');\n}\n\n/**\n * Maps ARIA roles to their appropriate aria-haspopup values\n */\nexport const ARIA_HASPOPUP_VALUES = {\n menu: 'menu',\n listbox: 'listbox',\n tree: 'tree',\n grid: 'grid',\n dialog: 'dialog',\n};\n\n/**\n * Apply attributes to element if they should be set\n */\nconst applyAttributes = (element, attributes, result) => {\n Object.entries(attributes).forEach(([attr, value]) => {\n element.setAttribute(attr, value);\n result[attr] = value;\n });\n};\n\n/**\n * Check if attribute should be set based on override and existing value\n */\nconst shouldSet = (element, attribute, override) => override || !element.hasAttribute(attribute);\n\n/**\n * Connects a trigger element to a target element with ARIA relationships\n * @param {Object} options - Configuration options\n * @param {HTMLElement} options.trigger - Trigger/anchor element (e.g., button)\n * @param {HTMLElement} options.target - Target/reference element (e.g., menu, dialog)\n * @param {string} [options.role] - ARIA role for the target element\n * @param {boolean} [options.override=false] - Override existing attributes\n * @returns {Object} Object containing set attributes with trigger and target subobjects\n */\nexport function connectTriggerToTarget({ trigger, target, role = null, override = false }) {\n const result = { trigger: {}, target: {} };\n\n if (!trigger || !target) return result;\n\n const triggerAttrs = {};\n const targetAttrs = {};\n\n // Set target role\n if (role && shouldSet(target, 'role', override)) {\n targetAttrs.role = role;\n }\n\n // Set trigger attributes if target has an ID\n if (target.id) {\n if (shouldSet(trigger, 'aria-controls', override)) {\n triggerAttrs['aria-controls'] = target.id;\n }\n\n if (role === 'tooltip' && shouldSet(trigger, 'aria-describedby', override)) {\n triggerAttrs['aria-describedby'] = target.id;\n }\n }\n\n // Set aria-haspopup based on role\n if (role && shouldSet(trigger, 'aria-haspopup', override)) {\n const haspopup = ARIA_HASPOPUP_VALUES[role] || 'true';\n if (haspopup) triggerAttrs['aria-haspopup'] = haspopup;\n }\n\n applyAttributes(target, targetAttrs, result.target);\n applyAttributes(trigger, triggerAttrs, result.trigger);\n\n return result;\n}\n\n/**\n * Remove attributes from element if they exist\n */\nconst removeAttributes = (element, attributes) => {\n attributes.forEach((attr) => {\n if (element.hasAttribute(attr)) {\n element.removeAttribute(attr);\n }\n });\n};\n\n/**\n * Disconnects a trigger element from a target element by removing ARIA relationships\n * @param {Object} options - Configuration options\n * @param {HTMLElement} options.trigger - Trigger element\n * @param {HTMLElement} options.target - Target element\n * @param {string[]} [options.attributes] - Specific attributes to remove (default: all)\n */\nexport function disconnectTriggerFromTarget({ trigger, target, attributes = null }) {\n if (!trigger || !target) return;\n\n const defaultAttrs = ['aria-controls', 'aria-haspopup', 'aria-describedby'];\n const attrsToRemove = attributes || defaultAttrs;\n\n removeAttributes(trigger, attrsToRemove);\n\n if (!attributes || attributes.includes('role')) {\n removeAttributes(target, ['role']);\n }\n}\n","export class Requestor {\n constructor() {\n this._abortController = null;\n this._timer = null;\n }\n\n schedule(fn, delay) {\n clearTimeout(this._timer);\n this._timer = setTimeout(fn, delay);\n }\n\n async request(url, options = {}) {\n this._abortController?.abort();\n this._abortController = new AbortController();\n const res = await fetch(url, { ...options, signal: this._abortController.signal });\n if (!res.ok) throw new Error(`${res.status}`);\n return res;\n }\n\n cancel() {\n clearTimeout(this._timer);\n this._abortController?.abort();\n }\n}\n","export function fuzzyMatcher(needle, haystack) {\n let ni = 0;\n for (let i = 0; i < haystack.length && ni < needle.length; i++) {\n if (haystack[i] === needle[ni]) ni++;\n }\n return ni === needle.length;\n}\n\nfunction matchContains(needle, haystack) {\n return haystack.includes(needle);\n}\n\nfunction matchPrefix(needle, haystack) {\n return haystack.startsWith(needle);\n}\n\nfunction getStrategy(strategy) {\n if (strategy === 'contains') return matchContains;\n if (strategy === 'prefix') return matchPrefix;\n return fuzzyMatcher;\n}\n\nfunction extractDOMValue(el, field) {\n if (field === 'textContent') return el.textContent?.trim().toLowerCase() ?? '';\n return (el.getAttribute(field) ?? '').toLowerCase();\n}\n\nexport function filterOptions(listbox, query, options = {}) {\n const { strategy = 'fuzzy', matcher, fields = ['textContent'] } = options;\n const matchFn = typeof matcher === 'function' ? matcher : getStrategy(strategy);\n const needle = query.toLowerCase();\n let visible = 0;\n listbox.querySelectorAll('[role=\"option\"]').forEach((opt) => {\n const match = fields.some((field) => matchFn(needle, extractDOMValue(opt, field)));\n opt.hidden = !match;\n if (match) visible++;\n });\n return visible;\n}\n","export const directionMap = {\n get top() {\n return 'bottom';\n },\n get bottom() {\n return 'top';\n },\n get left() {\n return 'right';\n },\n get right() {\n return 'left';\n },\n};\n\nexport function defineRect({ x, y, width, height }) {\n return { x, y, width, height, left: x, right: x + width, top: y, bottom: y + height };\n}\n\nexport function viewportRect() {\n return defineRect({\n x: 0,\n y: 0,\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight,\n });\n}\n\nexport function isWithinViewport(target) {\n if (!(target instanceof HTMLElement)) return false;\n const outer = viewportRect();\n const inner = target.getBoundingClientRect();\n const vertical = inner.top <= outer.height && inner.top + inner.height > 0;\n const horizontal = inner.left <= outer.width && inner.left + inner.width > 0;\n return vertical && horizontal;\n}\n","export const visibilityConfig = {\n get visibleOnly() {\n return true;\n },\n hiddenClass: null,\n};\n","import { isWithinViewport } from './geometry';\nimport { visibilityConfig } from './config';\n\nconst defaultOptions = {\n element: null,\n visible: null,\n dispatch: true,\n prefix: '',\n};\n\nexport default class Plumber {\n /**\n * Creates a new Plumber instance.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} options - Configuration options\n * @param {HTMLElement} [options.element] - Target element (defaults to controller.element)\n * @param {boolean|string} [options.visible=true] - Visibility check configuration\n * @param {boolean} [options.dispatch=true] - Enable event dispatching\n * @param {string} [options.prefix] - Event prefix (defaults to controller.identifier)\n */\n constructor(controller, options = {}) {\n this.controller = controller;\n\n const config = Object.assign({}, defaultOptions, options);\n const { element, visible, dispatch, prefix } = config;\n this.element = element || controller.element;\n this.visibleOnly = typeof visible === 'boolean' ? visible : visibilityConfig.visibleOnly;\n this.visibleCallback = typeof visible === 'string' ? visible : null;\n this.notify = !!dispatch;\n this.prefix = typeof prefix === 'string' && prefix ? prefix : controller.identifier;\n }\n\n /**\n * Checks if the element is visible in viewport.\n * @returns {boolean} True if element is visible\n */\n get visible() {\n if (!(this.element instanceof HTMLElement)) return false;\n if (!this.visibleOnly) return true;\n\n return isWithinViewport(this.element) && this.isVisible(this.element);\n }\n\n /**\n * Determines if a target element is visible.\n * @param {HTMLElement} target - Element to check\n * @returns {boolean} True if element is visible\n */\n isVisible(target) {\n if (this.visibleCallback) {\n const callback = this.findCallback(this.visibleCallback);\n if (typeof callback == 'function') return callback(target);\n }\n\n if (!(target instanceof HTMLElement)) return false;\n return !target.hasAttribute('hidden');\n }\n\n /**\n * Dispatches a custom event from the controller.\n * @param {string} name - Event name\n * @param {Object} [options] - Event options\n * @param {HTMLElement} [options.target] - Event target element\n * @param {string} [options.prefix] - Event prefix\n * @param {*} [options.detail] - Event detail data\n * @returns {boolean|undefined} Dispatch result\n */\n dispatch(name, { target = null, prefix = null, detail = null } = {}) {\n if (!this.notify) return;\n\n return this.controller.dispatch(name, {\n target: target || this.element,\n prefix: prefix || this.prefix,\n detail: detail,\n });\n }\n\n /**\n * Finds and binds a callback function by name from controller or plumber.\n * @param {string} name - Callback name or dot-notation path\n * @returns {Function|undefined} Bound callback function\n */\n findCallback(name) {\n if (typeof name !== 'string') return;\n\n const context = this;\n const controllerCallback = name.split('.').reduce((acc, key) => acc && acc[key], context.controller);\n if (typeof controllerCallback === 'function') {\n return controllerCallback.bind(context.controller);\n }\n const callback = name.split('.').reduce((acc, key) => acc && acc[key], context);\n if (typeof callback === 'function') {\n return callback.bind(context);\n }\n }\n\n /**\n * Executes a callback function and awaits if it returns a Promise.\n * @param {string|Function} callback - Callback name or function\n * @param {...*} args - Arguments to pass to callback\n * @returns {Promise<*>} Result of callback execution\n */\n async awaitCallback(callback, ...args) {\n if (typeof callback === 'string') callback = this.findCallback(callback);\n if (typeof callback === 'function') {\n const result = callback(...args);\n if (result instanceof Promise) return await result;\n else return result;\n }\n }\n}\n","export const PlainFormatter = {\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n return raw;\n },\n\n validate() {\n return true;\n },\n};\n","/**\n * Validates a credit card number string using the Luhn algorithm.\n *\n * Starting from the rightmost digit, double every second digit. If doubling\n * produces a number greater than 9, subtract 9 from it. Sum all digits.\n * A valid card number produces a total divisible by 10.\n *\n * @param {string} digits - Digit-only string (no spaces or dashes)\n * @returns {boolean} true if the number passes the Luhn check\n */\nfunction luhn(digits) {\n let sum = 0;\n let alternate = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits[i], 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\n/** Strips all non-digit characters from raw input */\nconst STRIP_NON_DIGITS = /\\D/g;\n\n/** Matches a valid card digit count (13–19 digits, no other characters) */\nconst VALID_CARD_LENGTH = /^\\d{13,19}$/;\n\n/** Captures groups of up to 4 characters followed by at least one more character */\nconst GROUP_FOUR_DIGITS = /(.{4})(?=.)/g;\n\nexport const CreditCardFormatter = {\n /**\n * Converts raw input to the canonical stored form: digits only, no separators.\n * e.g. '4242 4242 4242 4242' → '4242424242424242'\n * @param {string} raw - Raw input (may contain spaces, dashes, etc.)\n * @returns {string} Digit-only string, or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n return raw.replace(STRIP_NON_DIGITS, '');\n },\n\n /**\n * Validates the canonical card number using length and Luhn checks.\n * Expects the output of normalize() — digits only.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n if (!VALID_CARD_LENGTH.test(value)) return false;\n return luhn(value);\n },\n\n /**\n * Formats a canonical card number for display: groups of 4 separated by spaces.\n * e.g. '4242424242424242' → '4242 4242 4242 4242'\n * @param {string} value - Canonical value from normalize()\n * @returns {string} Formatted display string, or '' for non-string input\n */\n format(value) {\n if (typeof value !== 'string') return '';\n return value.replace(GROUP_FOUR_DIGITS, '$1 ');\n },\n};\n","/**\n * Map of E.164 country calling code → expected local digit count.\n * Key: calling code string (without '+').\n * Value: local number digit count (excluding the country code).\n *\n * Example: '1' → 10 means USA/Canada use a 10-digit local number\n * (3-digit area code + 7-digit subscriber number).\n *\n * Extend this object to add formatting support for additional countries.\n */\nconst DIALING_CODE_LOCAL_DIGITS = {\n 1: 10, // USA, Canada, and NANP countries\n};\n\n/** Strips all non-digit characters */\nconst STRIP_NON_DIGITS = /\\D/g;\n\n/** Matches an E.164 international phone number: + followed by 7–15 digits */\nconst E164_PATTERN = /^\\+\\d{7,15}$/;\n\nexport const PhoneFormatter = {\n /**\n * Converts raw input to canonical form.\n * If input starts with '+', produces E.164 (+digits); otherwise strips to digits only.\n * e.g. '(555) 123-4567' → '5551234567', '+1 555 123 4567' → '+15551234567'\n * @param {string} raw - Raw input (may contain spaces, dashes, parentheses, etc.)\n * @returns {string} Canonical string, or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const hasPlus = raw.trimStart().startsWith('+');\n const digits = raw.replace(STRIP_NON_DIGITS, '');\n return hasPlus ? `+${digits}` : digits;\n },\n\n /**\n * Validates the canonical phone number.\n * Accepts E.164 format or a local number whose digit count appears in DIALING_CODE_LOCAL_DIGITS.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n if (E164_PATTERN.test(value)) return true;\n const digits = value.replace(STRIP_NON_DIGITS, '');\n return Object.values(DIALING_CODE_LOCAL_DIGITS).includes(digits.length);\n },\n\n /**\n * Formats a canonical phone number for display.\n * Recognises numbers matching entries in DIALING_CODE_LOCAL_DIGITS.\n * e.g. '5551234567' → '(555) 123-4567', '+15551234567' → '+1 (555) 123-4567'\n * Returns value unchanged for unrecognised international numbers.\n * @param {string} value - Canonical value from normalize()\n * @returns {string} Formatted display string, or '' for non-string input\n */\n format(value) {\n if (typeof value !== 'string') return '';\n const digits = value.replace(STRIP_NON_DIGITS, '');\n for (const [code, localDigits] of Object.entries(DIALING_CODE_LOCAL_DIGITS)) {\n if (digits.length === localDigits) {\n // Local number without country code prefix\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;\n }\n const totalWithCode = localDigits + code.length;\n if (digits.length === totalWithCode && digits.startsWith(code)) {\n const local = digits.slice(code.length);\n return `+${code} (${local.slice(0, 3)}) ${local.slice(3, 6)}-${local.slice(6)}`;\n }\n }\n return value;\n },\n};\n","/** Strips everything except digits, period, comma, and negative sign */\nconst STRIP_NON_NUMERIC = /[^\\d.,-]/g;\n\n/** Matches a valid canonical amount: optional negative sign, digits, optional decimal part */\nconst VALID_AMOUNT_PATTERN = /^-?\\d+(\\.\\d+)?$/;\n\nexport const CurrencyFormatter = {\n /**\n * Converts raw input to the canonical stored form: a plain decimal number string.\n * Handles US format (1,234.56), European format (1.234,56), and integers ($1,000).\n * The heuristic for ambiguous comma-only input: ≤2 digits after comma → decimal\n * separator; 3 digits after → thousands separator.\n * @param {string} raw - Raw input (may contain currency symbols, separators)\n * @returns {string} Canonical decimal string (e.g. '1234.56'), or '' for non-string/empty\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const stripped = raw.replace(STRIP_NON_NUMERIC, '');\n if (!stripped) return '';\n const lastComma = stripped.lastIndexOf(',');\n const lastDot = stripped.lastIndexOf('.');\n\n if (lastComma > -1 && lastDot > -1) {\n // Both present: the later one is the decimal separator\n if (lastComma > lastDot) {\n // European: 1.234,56 — comma is decimal, dot is thousands\n return stripped.replace(/\\./g, '').replace(',', '.');\n }\n // US: 1,234.56 — dot is decimal, comma is thousands\n return stripped.replace(/,/g, '');\n }\n\n if (lastComma > -1) {\n // Comma only: 1-2 digits after = decimal separator; 3 digits after = thousands separator\n const afterComma = stripped.slice(lastComma + 1);\n if (afterComma.length <= 2) return stripped.replace(',', '.');\n return stripped.replace(/,/g, '');\n }\n\n // Dot only or no separator\n return stripped;\n },\n\n /**\n * Validates the canonical amount: optional negative sign, integer digits,\n * and an optional decimal part of any length.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n return VALID_AMOUNT_PATTERN.test(value);\n },\n\n /**\n * Formats a canonical amount for display using Intl.NumberFormat.\n * Fraction digit defaults come from the currency itself (e.g. JPY uses 0,\n * USD uses 2, KWD uses 3) — no hardcoded overrides unless opts.fractionDigits\n * is explicitly provided.\n * @param {string} value - Canonical value from normalize()\n * @param {Object} [opts={}] - Options\n * @param {string} [opts.locale='en-US'] - BCP 47 locale tag\n * @param {string} [opts.currency='USD'] - ISO 4217 currency code\n * @param {number} [opts.fractionDigits] - Override min and max fraction digits\n * @returns {string} Formatted currency string, or value as-is for non-numeric input\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const num = parseFloat(value);\n if (isNaN(num)) return value;\n const locale = opts.locale || 'en-US';\n const currency = opts.currency || 'USD';\n const fractionOpts =\n opts.fractionDigits !== undefined\n ? { minimumFractionDigits: opts.fractionDigits, maximumFractionDigits: opts.fractionDigits }\n : {};\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...fractionOpts,\n }).format(num);\n } catch {\n return value;\n }\n },\n};\n","/** Matches an ISO 8601 date: YYYY-MM-DD */\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Matches a date with separators: number-sep-number-sep-number (/, -, or .) */\nconst SEPARATED_DATE_PATTERN = /^(\\d{1,4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,4})$/;\n\n/** Strips all non-digit characters (used when extracting 8-digit compact dates) */\nconst STRIP_NON_DIGITS = /\\D/g;\n\nexport const DateFormatter = {\n /**\n * Converts raw input to the canonical stored form: ISO 8601 YYYY-MM-DD.\n * Accepts a variety of common date formats:\n * - YYYY-MM-DD (ISO, returned unchanged)\n * - MM/DD/YYYY, DD/MM/YYYY, YYYY/MM/DD (with /, -, or . separators)\n * - YYYYMMDD (8 compact digits, first 4 digits treated as year)\n * When the first component of a separated date is 4 digits, it is treated as the year.\n * Otherwise, MM/DD/YYYY ordering is assumed.\n * @param {string} raw - Raw input in any supported format\n * @returns {string} ISO date string (YYYY-MM-DD), or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const trimmed = raw.trim();\n\n // Already ISO YYYY-MM-DD\n if (ISO_DATE_PATTERN.test(trimmed)) return trimmed;\n\n // Date with separators: MM/DD/YYYY, DD/MM/YYYY, or YYYY/MM/DD\n const sepMatch = trimmed.match(SEPARATED_DATE_PATTERN);\n if (sepMatch) {\n const [, a, b, c] = sepMatch;\n if (a.length === 4) {\n return `${a}-${b.padStart(2, '0')}-${c.padStart(2, '0')}`;\n }\n if (c.length === 4) {\n // Default MM/DD/YYYY assumption\n return `${c}-${a.padStart(2, '0')}-${b.padStart(2, '0')}`;\n }\n }\n\n // 8 pure digits: YYYYMMDD or MMDDYYYY\n const digits = trimmed.replace(STRIP_NON_DIGITS, '');\n if (digits.length === 8) {\n const potentialYear = parseInt(digits.slice(0, 4), 10);\n if (potentialYear >= 1000 && potentialYear <= 9999) {\n return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;\n }\n return `${digits.slice(4, 8)}-${digits.slice(0, 2)}-${digits.slice(2, 4)}`;\n }\n\n return trimmed;\n },\n\n /**\n * Validates the input, accepting any format supported by normalize().\n * Internally normalizes to ISO form first, then checks calendar validity.\n * e.g. validate('04/13/2025') → true, validate('2025-02-29') → false (not a leap year)\n * @param {string} value - Input in any format (ISO, MM/DD/YYYY, etc.)\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n const iso = DateFormatter.normalize(value);\n if (!ISO_DATE_PATTERN.test(iso)) return false;\n const date = new Date(`${iso}T00:00:00Z`);\n return !isNaN(date.getTime()) && date.toISOString().startsWith(iso);\n },\n\n /**\n * Formats an ISO date string for display using Intl.DateTimeFormat.\n * All Intl options are configurable; defaults produce MM/DD/YYYY in en-US.\n * @param {string} value - Canonical ISO date string (YYYY-MM-DD) from normalize()\n * @param {Object} [opts={}] - Options\n * @param {string} [opts.locale='en-US'] - BCP 47 locale tag\n * @param {string} [opts.timeZone='UTC'] - IANA time zone\n * @param {string} [opts.year='numeric'] - Intl year format\n * @param {string} [opts.month='2-digit'] - Intl month format\n * @param {string} [opts.day='2-digit'] - Intl day format\n * @returns {string} Formatted date string, or value as-is for invalid input\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const date = new Date(`${value}T00:00:00Z`);\n if (isNaN(date.getTime())) return value;\n const locale = opts.locale || 'en-US';\n try {\n return new Intl.DateTimeFormat(locale, {\n year: opts.year || 'numeric',\n month: opts.month || '2-digit',\n day: opts.day || '2-digit',\n timeZone: opts.timeZone || 'UTC',\n }).format(date);\n } catch {\n return value;\n }\n },\n};\n","/** Matches a 24-hour time: HH:MM */\nconst H24_PATTERN = /^([01]?\\d|2[0-3]):([0-5]\\d)$/;\n\nexport const TimeFormatter = {\n /**\n * Converts raw input to canonical 24-hour form: HH:MM.\n * Accepts HH:MM (24h) and h:mm AM/PM (12h).\n * @param {string} raw\n * @returns {string} \"HH:MM\" or \"\" for invalid input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const trimmed = raw.trim();\n\n if (H24_PATTERN.test(trimmed)) {\n const [h, m] = trimmed.split(':');\n return `${String(parseInt(h, 10)).padStart(2, '0')}:${m}`;\n }\n\n // h:mm AM/PM\n const ampm = trimmed.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n if (ampm) {\n let h = parseInt(ampm[1], 10);\n const m = ampm[2];\n const period = ampm[3].toUpperCase();\n if (period === 'AM') h = h === 12 ? 0 : h;\n else h = h === 12 ? 12 : h + 12;\n if (h > 23 || parseInt(m, 10) > 59) return '';\n return `${String(h).padStart(2, '0')}:${m}`;\n }\n\n return '';\n },\n\n /**\n * Validates that the value is a parseable time.\n * @param {string} value\n * @returns {boolean}\n */\n validate(value) {\n return TimeFormatter.normalize(value) !== '';\n },\n\n /**\n * Formats a canonical HH:MM value for display.\n * @param {string} value - Canonical \"HH:MM\" from normalize()\n * @param {Object} [opts={}]\n * @param {string} [opts.format='h12'] - 'h12' or 'h24'\n * @returns {string}\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const match = value.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) return value;\n const h = parseInt(match[1], 10);\n const m = match[2];\n if (opts.format === 'h24') return `${String(h).padStart(2, '0')}:${m}`;\n const period = h < 12 ? 'AM' : 'PM';\n const displayH = h % 12 || 12;\n return `${displayH}:${m} ${period}`;\n },\n};\n","import Plumber from './plumber';\nimport { PlainFormatter } from './formatters/plain';\nimport { CreditCardFormatter } from './formatters/credit_card';\nimport { PhoneFormatter } from './formatters/phone';\nimport { CurrencyFormatter } from './formatters/currency';\nimport { DateFormatter } from './formatters/date';\nimport { TimeFormatter } from './formatters/time';\n\nexport const FORMATTER_TYPES = {\n PLAIN: 'plain',\n CREDIT_CARD: 'creditCard',\n PHONE: 'phone',\n CURRENCY: 'currency',\n DATE: 'date',\n TIME: 'time',\n};\n\nconst registry = new Map([\n [FORMATTER_TYPES.PLAIN, PlainFormatter],\n [FORMATTER_TYPES.CREDIT_CARD, CreditCardFormatter],\n [FORMATTER_TYPES.PHONE, PhoneFormatter],\n [FORMATTER_TYPES.CURRENCY, CurrencyFormatter],\n [FORMATTER_TYPES.DATE, DateFormatter],\n [FORMATTER_TYPES.TIME, TimeFormatter],\n]);\n\nconst defaultOptions = {\n type: FORMATTER_TYPES.PLAIN,\n options: {},\n};\n\nexport class Formatter extends Plumber {\n static register(type, formatter) {\n registry.set(type, formatter);\n }\n\n constructor(controller, options = {}) {\n super(controller, options);\n this.type = options.type ?? defaultOptions.type;\n this.options = options.options ?? defaultOptions.options;\n this.enhance();\n }\n\n enhance() {\n const context = this;\n const formatter = registry.get(context.type) ?? registry.get(FORMATTER_TYPES.PLAIN);\n\n const helpers = {\n normalize: (raw) => formatter.normalize?.(raw, context.options) ?? (typeof raw === 'string' ? raw : ''),\n validate: (value) => formatter.validate?.(value, context.options) ?? true,\n format: (value) => formatter.format?.(value, context.options) ?? (typeof value === 'string' ? value : ''),\n mask: (value) => formatter.mask?.(value, context.options) ?? null,\n maskable: () => typeof formatter.mask === 'function',\n };\n\n Object.defineProperty(this.controller, 'formatter', {\n get() {\n return helpers;\n },\n configurable: true,\n });\n }\n}\n\nexport const attachFormatter = (controller, options) => new Formatter(controller, options);\n","const DATE_ONLY_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n\nexport function tryParseDate(...values) {\n if (values.length === 0) throw 'Missing values to parse as date';\n if (values.length === 1) {\n const dateValue = values[0];\n if (!dateValue) return undefined;\n if (typeof dateValue === 'string' && DATE_ONLY_PATTERN.test(dateValue)) {\n // YYYY-MM-DD strings are UTC by spec; use local constructor instead\n const [year, month, day] = dateValue.split('-').map(Number);\n const parsed = new Date(year, month - 1, day);\n if (isValidDate(parsed)) return parsed;\n } else {\n const parsed = new Date(dateValue);\n if (isValidDate(parsed)) return parsed;\n }\n } else {\n const parsed = new Date(...values);\n if (isValidDate(parsed)) return parsed;\n }\n}\n","import Plumber from './plumber';\nimport { isValidDate, tryParseDate } from './plumber/date';\n\nconst DAYS_PER_ROW = 7;\nconst YEAR_SIZE = 12;\nconst DECADE_SIZE = 10;\n\nconst defaultOptions = {\n locales: ['default'],\n today: '',\n day: null,\n month: null,\n year: null,\n since: null,\n till: null,\n disabledDates: [],\n disabledWeekdays: [],\n disabledDays: [],\n disabledMonths: [],\n disabledYears: [],\n firstDayOfWeek: 0,\n onNavigated: 'navigated',\n};\n\nexport class Calendar extends Plumber {\n /**\n * Creates a new Calendar plumber instance with date navigation and validation.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @param {string[]} [options.locales=['default']] - Locale identifiers for date formatting\n * @param {string|Date} [options.today=''] - Initial \"today\" date\n * @param {number} [options.day] - Initial day\n * @param {number} [options.month] - Initial month (0-11)\n * @param {number} [options.year] - Initial year\n * @param {string|Date} [options.since] - Minimum selectable date\n * @param {string|Date} [options.till] - Maximum selectable date\n * @param {Array<string|Date>} [options.disabledDates=[]] - Array of disabled dates\n * @param {string[]|number[]} [options.disabledWeekdays=[]] - Array of disabled weekdays\n * @param {string[]|number[]} [options.disabledDays=[]] - Array of disabled day numbers\n * @param {string[]|number[]} [options.disabledMonths=[]] - Array of disabled months\n * @param {string[]|number[]} [options.disabledYears=[]] - Array of disabled years\n * @param {number} [options.firstDayOfWeek=0] - First day of week (0=Sunday, 1=Monday, etc.)\n * @param {string} [options.onNavigated='navigated'] - Callback name when navigated\n */\n constructor(controller, options = {}) {\n super(controller, options);\n\n const config = Object.assign({}, defaultOptions, options);\n const { onNavigated, since, till, firstDayOfWeek } = config;\n this.onNavigated = onNavigated;\n this.since = tryParseDate(since);\n this.till = tryParseDate(till);\n this.firstDayOfWeek = 0 <= firstDayOfWeek && firstDayOfWeek < 7 ? firstDayOfWeek : defaultOptions.firstDayOfWeek;\n\n const { disabledDates, disabledWeekdays, disabledDays, disabledMonths, disabledYears } = config;\n this.disabledDates = Array.isArray(disabledDates) ? disabledDates : [];\n this.disabledWeekdays = Array.isArray(disabledWeekdays) ? disabledWeekdays : [];\n this.disabledDays = Array.isArray(disabledDays) ? disabledDays : [];\n this.disabledMonths = Array.isArray(disabledMonths) ? disabledMonths : [];\n this.disabledYears = Array.isArray(disabledYears) ? disabledYears : [];\n\n const { today, day, month, year } = config;\n this.now = tryParseDate(today) || new Date();\n\n if (typeof year === 'number' && typeof month === 'number' && typeof day === 'number') {\n this.current = tryParseDate(year, month, day);\n } else {\n this.current = this.now;\n }\n\n this.build();\n this.enhance();\n }\n\n /**\n * Builds all calendar data structures (days of week, days of month, months of year).\n */\n build() {\n this.daysOfWeek = this.buildDaysOfWeek();\n this.daysOfMonth = this.buildDaysOfMonth();\n this.monthsOfYear = this.buildMonthsOfYear();\n this.yearsOfDecade = this.buildYearsOfDecade();\n }\n\n /**\n * Builds array of weekday objects with localized names.\n * @returns {Array<Object>} Array of weekday objects\n */\n buildDaysOfWeek() {\n const longFormatter = new Intl.DateTimeFormat(this.localesValue, { weekday: 'long' });\n const shortFormatter = new Intl.DateTimeFormat(this.localesValue, { weekday: 'short' });\n\n const sunday = new Date('2024-10-06');\n const daysOfWeek = [];\n for (let i = this.firstDayOfWeek, n = i + 7; i < n; i++) {\n const weekday = new Date(sunday);\n weekday.setDate(sunday.getDate() + i);\n daysOfWeek.push({\n date: weekday,\n value: weekday.getDay(),\n long: longFormatter.format(weekday),\n short: shortFormatter.format(weekday),\n });\n }\n return daysOfWeek;\n }\n\n /**\n * Builds array of day objects for the current month view, including overflow from adjacent months.\n * @returns {Array<Object>} Array of day objects with metadata\n */\n buildDaysOfMonth() {\n const currentMonth = this.month;\n const currentYear = this.year;\n const daysOfMonth = [];\n const parseDate = (date) => ({\n current: this.month === date.getMonth() && this.year === date.getFullYear(),\n date: date,\n value: date.getDate(),\n month: date.getMonth(),\n year: date.getFullYear(),\n iso: date.toISOString(),\n });\n\n const currentWeekday = new Date(currentYear, currentMonth).getDay();\n const weekdayBeforeCurrent = this.firstDayOfWeek - currentWeekday;\n for (let i = weekdayBeforeCurrent > 0 ? weekdayBeforeCurrent - 7 : weekdayBeforeCurrent; i < 0; i++) {\n const previous = new Date(currentYear, currentMonth, i + 1);\n daysOfMonth.push(parseDate(previous));\n }\n const currentMonthTotalDays = new Date(currentYear, currentMonth + 1, 0).getDate();\n for (let i = 1; i <= currentMonthTotalDays; i++) {\n const current = new Date(currentYear, currentMonth, i);\n daysOfMonth.push(parseDate(current));\n }\n const mod = daysOfMonth.length % DAYS_PER_ROW;\n const trailing = mod === 0 ? 0 : DAYS_PER_ROW - mod;\n for (let i = 1; i <= trailing; i++) {\n const next = new Date(currentYear, currentMonth + 1, i);\n daysOfMonth.push(parseDate(next));\n }\n return daysOfMonth;\n }\n\n /**\n * Builds array of month objects with localized names for the current year.\n * @returns {Array<Object>} Array of month objects\n */\n buildMonthsOfYear() {\n const longFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'long' });\n const shortFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'short' });\n const numericFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'numeric' });\n\n const monthsOfYear = [];\n for (let i = 0; i < YEAR_SIZE; i++) {\n const date = new Date(this.year, i);\n const monthStart = new Date(this.year, i, 1);\n const monthEnd = new Date(this.year, i + 1, 0);\n const shortName = shortFormatter.format(date);\n const longName = longFormatter.format(date);\n const rangeDisabled = (this.since && monthEnd < this.since) || (this.till && monthStart > this.till);\n const listDisabled = this.disabledMonths.some((str) => i == str || shortName === str || longName === str);\n monthsOfYear.push({\n date: date,\n value: date.getMonth(),\n long: longName,\n short: shortName,\n numeric: numericFormatter.format(date),\n disabled: rangeDisabled || listDisabled,\n });\n }\n return monthsOfYear;\n }\n\n /**\n * Builds array of year objects spanning the decade containing the current year.\n * Returns 12 entries: decade start - 1 (buffer) through decade start + 10 (buffer).\n * @returns {Array<Object>} Array of year objects\n */\n buildYearsOfDecade() {\n const decadeStart = Math.floor(this.year / DECADE_SIZE) * DECADE_SIZE;\n const yearsOfDecade = [];\n for (let i = decadeStart - 1; i <= decadeStart + DECADE_SIZE; i++) {\n const bufferYear = i < decadeStart || i > decadeStart + DECADE_SIZE - 1;\n const rangeDisabled = (this.since && i < this.since.getFullYear()) || (this.till && i > this.till.getFullYear());\n const listDisabled = this.disabledYears.some((str) => i == str);\n yearsOfDecade.push({\n value: i,\n current: i === this.year,\n disabled: bufferYear || rangeDisabled || listDisabled,\n });\n }\n return yearsOfDecade;\n }\n\n /**\n * Gets the current \"today\" reference date.\n * @returns {Date} Today's date\n */\n get today() {\n return this.now;\n }\n\n /**\n * Sets the \"today\" reference date.\n * @param {Date} value - New today date\n */\n set today(value) {\n if (!isValidDate(value)) return;\n\n const month = this.month ?? value.getMonth();\n const year = this.year ?? value.getFullYear();\n const sameMonthYear = month == value.getMonth() && year == value.getFullYear();\n const day = sameMonthYear ? value.getDate() : 1;\n this.now = new Date(year, month, day);\n }\n\n /**\n * Gets the current selected date.\n * @returns {Date|null} Current date or null if not fully specified\n */\n get current() {\n if (typeof this.year === 'number' && typeof this.month === 'number' && typeof this.day === 'number') {\n return tryParseDate(this.year, this.month, this.day);\n }\n return null;\n }\n\n /**\n * Sets the current selected date.\n * @param {Date} value - New current date\n */\n set current(value) {\n if (!isValidDate(value)) return;\n\n this.day = value.getDate();\n this.month = value.getMonth();\n this.year = value.getFullYear();\n }\n\n /**\n * Navigates to a specific date, dispatching events and rebuilding calendar.\n * @param {Date} to - Target date to navigate to\n * @returns {Promise<void>}\n */\n navigate = async (to) => {\n if (!isValidDate(to)) return;\n\n const from = this.current;\n const toIso = to.toISOString();\n const fromIso = from.toISOString();\n\n this.dispatch('navigate', { detail: { from: fromIso, to: toIso } });\n\n this.current = to;\n this.build();\n await this.awaitCallback(this.onNavigated, { from: fromIso, to: toIso });\n\n this.dispatch('navigated', { detail: { from: fromIso, to: toIso } });\n };\n\n /**\n * Steps the calendar by a given amount in a specific unit (year, month, or day).\n * @param {string} type - Type of step ('year', 'month', 'day')\n * @param {number} value - Number of units to step (positive or negative)\n * @returns {Promise<void>}\n */\n step = async (type, value) => {\n if (value === 0) return;\n\n const target = this.current;\n switch (type) {\n case 'year': {\n target.setFullYear(target.getFullYear() + value);\n break;\n }\n case 'month': {\n target.setMonth(target.getMonth() + value);\n break;\n }\n case 'day': {\n target.setDate(target.getDate() + value);\n break;\n }\n default:\n return;\n }\n await this.navigate(target);\n };\n\n /**\n * Checks if a date is disabled based on configured rules.\n * @param {Date} date - Date to check\n * @returns {boolean} True if date is disabled\n */\n isDisabled = (date) => {\n if (!isValidDate(date)) return false;\n\n if (this.disabledDates.length) {\n const epoch = date.getTime();\n for (const str of this.disabledDates) {\n if (epoch === new Date(str).getTime()) return true;\n }\n }\n\n if (this.disabledWeekdays.length) {\n const target = date.getDay();\n const weekdays = this.daysOfWeek;\n const index = weekdays.findIndex((w) => w.value === target);\n if (index >= 0) {\n const weekday = weekdays[index];\n for (const str of this.disabledWeekdays) {\n if (weekday.value == str || weekday.short === str || weekday.long === str) return true;\n }\n }\n }\n\n if (this.disabledDays.length) {\n const target = date.getDate();\n for (const str of this.disabledDays) {\n if (target == str) return true;\n }\n }\n\n if (this.disabledMonths.length) {\n const target = date.getMonth();\n const months = this.monthsOfYear;\n const index = months.findIndex((m) => m.value === target);\n if (index >= 0) {\n const month = months[index];\n for (const str of this.disabledMonths) {\n if (month.value == str || month.short === str || month.long === str) return true;\n }\n }\n }\n\n if (this.disabledYears.length) {\n const target = date.getFullYear();\n for (const str of this.disabledYears) {\n if (target == str) return true;\n }\n }\n\n return false;\n };\n\n /**\n * Checks if a date is within the allowed range (since/till).\n * @param {Date} date - Date to check\n * @returns {boolean} True if date is within range\n */\n isWithinRange = (date) => {\n if (!isValidDate(date)) return false;\n\n let within = true;\n if (this.since) within = within && date >= this.since;\n if (this.till) within = within && date <= this.till;\n return within;\n };\n\n enhance() {\n const context = this;\n Object.assign(this.controller, {\n get calendar() {\n return {\n get today() {\n return context.today;\n },\n get current() {\n return context.current;\n },\n get day() {\n return context.day;\n },\n get month() {\n return context.month;\n },\n get year() {\n return context.year;\n },\n get since() {\n return context.since;\n },\n get till() {\n return context.till;\n },\n get firstDayOfWeek() {\n return context.firstDayOfWeek;\n },\n get disabledDates() {\n return context.disabledDates;\n },\n get disabledWeekdays() {\n return context.disabledWeekdays;\n },\n get disabledDays() {\n return context.disabledDays;\n },\n get disabledMonths() {\n return context.disabledMonths;\n },\n get disabledYears() {\n return context.disabledYears;\n },\n get daysOfWeek() {\n return context.daysOfWeek;\n },\n get daysOfMonth() {\n return context.daysOfMonth;\n },\n get monthsOfYear() {\n return context.monthsOfYear;\n },\n get yearsOfDecade() {\n return context.yearsOfDecade;\n },\n navigate: async (to) => await context.navigate(to),\n step: async (type, value) => await context.step(type, value),\n isDisabled: (date) => context.isDisabled(date),\n isWithinRange: (date) => context.isWithinRange(date),\n };\n },\n });\n }\n}\n\n/**\n * Factory function to create and attach a Calendar plumber to a controller.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @returns {Calendar} Calendar plumber instance\n */\nexport const initCalendar = (controller, options) => new Calendar(controller, options);\n","import Plumber from './plumber';\nimport { tryParseDate } from './plumber/date';\n\nexport class CalendarDaySelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n this.onSelect = options.onSelect || null;\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n if (!(event.target instanceof HTMLElement)) return;\n event.preventDefault();\n const input = event.target instanceof HTMLTimeElement ? event.target.parentElement : event.target;\n if (input.disabled || input.getAttribute('aria-disabled') === 'true') return;\n const time = event.target instanceof HTMLTimeElement ? event.target : event.target.querySelector('time');\n if (!time) return;\n const date = tryParseDate(time.dateTime);\n if (!date) return;\n this.dispatch('selecting', { target: input });\n const iso = date.toISOString();\n if (this.onSelect) {\n this.awaitCallback(this.onSelect, iso);\n } else {\n this.dispatch('selected', { detail: { epoch: date.getTime(), iso } });\n }\n }\n}\n\nexport class CalendarMonthSelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n const btn = event.target.closest('button[data-month]');\n if (!btn || btn.disabled || btn.getAttribute('aria-disabled') === 'true') return;\n event.preventDefault();\n const month = parseInt(btn.dataset.month, 10);\n if (isNaN(month)) return;\n this.dispatch('selected', { detail: { month } });\n }\n}\n\nexport class CalendarYearSelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n const btn = event.target.closest('button[data-year]');\n if (!btn || btn.disabled || btn.getAttribute('aria-disabled') === 'true') return;\n event.preventDefault();\n const year = parseInt(btn.dataset.year, 10);\n if (isNaN(year)) return;\n this.dispatch('selected', { detail: { year } });\n }\n}\n\nexport const attachCalendarDaySelector = (controller, options) => new CalendarDaySelector(controller, options);\nexport const attachCalendarMonthSelector = (controller, options) => new CalendarMonthSelector(controller, options);\nexport const attachCalendarYearSelector = (controller, options) => new CalendarYearSelector(controller, options);\n","import Plumber from './plumber';\nimport { tryParseDate } from './plumber/date';\nimport { Requestor } from '../requestor';\n\nconst defaultOptions = {\n content: null,\n url: '',\n reload: 'never',\n stale: 3600,\n onLoad: 'canLoad',\n onLoaded: 'contentLoaded',\n};\n\nexport class ContentLoader extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const config = Object.assign({}, defaultOptions, options);\n const { content, url, reload, stale } = config;\n this.content = content;\n this.url = url;\n this.reload = typeof reload === 'string' ? reload : defaultOptions.reload;\n this.stale = typeof stale === 'number' ? stale : defaultOptions.stale;\n\n const { onLoad, onLoaded } = config;\n this.onLoad = onLoad;\n this.onLoaded = onLoaded;\n\n this._requestor = new Requestor();\n this.enhance();\n }\n\n get reloadable() {\n switch (this.reload) {\n case 'never':\n return false;\n case 'always':\n return true;\n default: {\n const loadedAt = tryParseDate(this.loadedAt);\n return loadedAt && new Date() - loadedAt > this.stale * 1000;\n }\n }\n }\n\n contentLoadable = ({ url }) => !!url;\n\n contentLoader = async () => '';\n\n remoteContentLoader = async (url) => {\n const res = await this._requestor.request(url);\n return res.text();\n };\n\n load = async () => {\n if (this.loadedAt && !this.reloadable) return;\n\n const loadableCallback = this.findCallback(this.onLoad);\n const loadable = await this.awaitCallback(loadableCallback || this.contentLoadable, { url: this.url });\n this.dispatch('load', { detail: { url: this.url } });\n if (!loadable) return;\n\n this.dispatch('loading', { detail: { url: this.url } });\n const content = this.url ? await this.remoteContentLoader(this.url) : await this.contentLoader();\n if (!content) return;\n\n await this.awaitCallback(this.onLoaded, { url: this.url, content });\n this.loadedAt = new Date().getTime();\n this.dispatch('loaded', { detail: { url: this.url, content } });\n };\n\n enhance() {\n const context = this;\n Object.assign(this.controller, {\n load: context.load.bind(context),\n });\n }\n}\n\nexport const attachContentLoader = (controller, options) => new ContentLoader(controller, options);\n","import Plumber from './index';\n\nexport default class WindowObserver extends Plumber {\n observe(handler) {\n this._handler = handler;\n this.events.forEach((e) => window.addEventListener(e, handler, true));\n }\n\n unobserve() {\n if (!this._handler) return;\n this.events.forEach((e) => window.removeEventListener(e, this._handler, true));\n }\n\n enhance() {\n const context = this;\n const superDisconnect = this.controller.disconnect?.bind(this.controller) || (() => {});\n this.controller.disconnect = () => {\n context.unobserve();\n superDisconnect();\n };\n }\n}\n","import WindowObserver from './plumber/window_observer';\n\nconst defaultOptions = {\n trigger: null,\n events: ['click'],\n onDismissed: 'dismissed',\n};\n\nexport class Dismisser extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { trigger, events, onDismissed } = Object.assign({}, defaultOptions, options);\n this.onDismissed = onDismissed;\n this.trigger = trigger || this.element;\n this.events = events;\n\n this.enhance();\n this.observe(this.dismiss);\n }\n\n dismiss = async (event) => {\n const { target } = event;\n if (!(target instanceof HTMLElement)) return;\n if (this.element.contains(target)) return;\n if (!this.visible) return;\n\n this.dispatch('dismiss');\n await this.awaitCallback(this.onDismissed, { target: this.trigger });\n this.dispatch('dismissed');\n };\n}\n\nexport const attachDismisser = (controller, options) => new Dismisser(controller, options);\n","import WindowObserver from './plumber/window_observer';\nimport { defineRect, viewportRect, directionMap } from './plumber/geometry';\nimport { connectTriggerToTarget } from '../accessibility/aria';\n\nconst defaultOptions = {\n anchor: null,\n events: ['click'],\n placement: 'bottom',\n alignment: 'start',\n onFlipped: 'flipped',\n ariaRole: null,\n respectMotion: true,\n};\n\nexport class Flipper extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { anchor, events, placement, alignment, onFlipped, ariaRole, respectMotion } = Object.assign(\n {},\n defaultOptions,\n options\n );\n this.anchor = anchor;\n this.events = events;\n this.placement = placement;\n this.alignment = alignment;\n this.onFlipped = onFlipped;\n this.ariaRole = ariaRole;\n this.respectMotion = respectMotion;\n this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (this.anchor && this.element) {\n connectTriggerToTarget({ trigger: this.anchor, target: this.element, role: this.ariaRole });\n }\n\n this.enhance();\n this.observe(this.flip);\n }\n\n flip = async () => {\n if (!this.visible) return;\n\n this.dispatch('flip');\n const positionStyle = window.getComputedStyle(this.element);\n if (positionStyle['position'] != 'absolute') this.element.style['position'] = 'absolute';\n\n const placement = this.flippedRect(this.anchor.getBoundingClientRect(), this.element.getBoundingClientRect());\n\n this.element.style.transition = this.respectMotion && this.prefersReducedMotion ? 'none' : '';\n\n for (const [key, value] of Object.entries(placement)) {\n this.element.style[key] = value;\n }\n\n await this.awaitCallback(this.onFlipped, { target: this.element, placement });\n this.dispatch('flipped', { detail: { placement } });\n };\n\n flippedRect(anchorRect, referenceRect) {\n const candidateRects = this.quadrumRect(anchorRect, viewportRect());\n const candidates = [this.placement, directionMap[this.placement]];\n let flipped = {};\n while (!Object.keys(flipped).length && candidates.length > 0) {\n const candidate = candidates.shift();\n if (!this.biggerRectThan(candidateRects[candidate], referenceRect)) continue;\n const placementRect = this.quadrumPlacement(anchorRect, candidate, referenceRect);\n const alignmentRect = this.quadrumAlignment(anchorRect, candidate, placementRect);\n flipped['top'] = `${alignmentRect['top'] + window.scrollY}px`;\n flipped['left'] = `${alignmentRect['left'] + window.scrollX}px`;\n }\n if (!Object.keys(flipped).length) {\n flipped['top'] = '';\n flipped['left'] = '';\n }\n return flipped;\n }\n\n quadrumRect(inner, outer) {\n return {\n left: defineRect({ x: outer.x, y: outer.y, width: inner.x - outer.x, height: outer.height }),\n right: defineRect({\n x: inner.x + inner.width,\n y: outer.y,\n width: outer.width - (inner.x + inner.width),\n height: outer.height,\n }),\n top: defineRect({ x: outer.x, y: outer.y, width: outer.width, height: inner.y - outer.y }),\n bottom: defineRect({\n x: outer.x,\n y: inner.y + inner.height,\n width: outer.width,\n height: outer.height - (inner.y + inner.height),\n }),\n };\n }\n\n quadrumPlacement(anchor, direction, reference) {\n switch (direction) {\n case 'top':\n return defineRect({\n x: reference.x,\n y: anchor.y - reference.height,\n width: reference.width,\n height: reference.height,\n });\n case 'bottom':\n return defineRect({\n x: reference.x,\n y: anchor.y + anchor.height,\n width: reference.width,\n height: reference.height,\n });\n case 'left':\n return defineRect({\n x: anchor.x - reference.width,\n y: reference.y,\n width: reference.width,\n height: reference.height,\n });\n case 'right':\n return defineRect({\n x: anchor.x + anchor.width,\n y: reference.y,\n width: reference.width,\n height: reference.height,\n });\n default:\n throw `Unable place at the quadrum, ${direction}`;\n }\n }\n\n quadrumAlignment(anchor, direction, reference) {\n switch (direction) {\n case 'top':\n case 'bottom': {\n let alignment = anchor.x;\n if (this.alignment === 'center') alignment = anchor.x + anchor.width / 2 - reference.width / 2;\n else if (this.alignment === 'end') alignment = anchor.x + anchor.width - reference.width;\n return defineRect({ x: alignment, y: reference.y, width: reference.width, height: reference.height });\n }\n case 'left':\n case 'right': {\n let alignment = anchor.y;\n if (this.alignment === 'center') alignment = anchor.y + anchor.height / 2 - reference.height / 2;\n else if (this.alignment === 'end') alignment = anchor.y + anchor.height - reference.height;\n return defineRect({ x: reference.x, y: alignment, width: reference.width, height: reference.height });\n }\n default:\n throw `Unable align at the quadrum, ${direction}`;\n }\n }\n\n biggerRectThan(big, small) {\n return big.height >= small.height && big.width >= small.width;\n }\n\n enhance() {\n super.enhance();\n this.controller.flip = this.flip;\n }\n}\n\nexport const attachFlipper = (controller, options) => new Flipper(controller, options);\n","import WindowObserver from './plumber/window_observer';\nimport { viewportRect, directionMap, defineRect } from './plumber/geometry';\n\nconst defaultOptions = {\n events: ['resize'],\n boundaries: ['top', 'left', 'right'],\n onShifted: 'shifted',\n respectMotion: true,\n};\n\nexport class Shifter extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { onShifted, events, boundaries, respectMotion } = Object.assign({}, defaultOptions, options);\n this.onShifted = onShifted;\n this.events = events;\n this.boundaries = boundaries;\n this.respectMotion = respectMotion;\n this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n this.enhance();\n this.observe(this.shift);\n }\n\n shift = async () => {\n if (!this.visible) return;\n\n this.dispatch('shift');\n const overflow = this.overflowRect(this.element.getBoundingClientRect(), this.elementTranslations(this.element));\n const translateX = overflow['left'] || overflow['right'] || 0;\n const translateY = overflow['top'] || overflow['bottom'] || 0;\n\n this.element.style.transition = this.respectMotion && this.prefersReducedMotion ? 'none' : '';\n this.element.style.transform = `translate(${translateX}px, ${translateY}px)`;\n\n await this.awaitCallback(this.onShifted, overflow);\n this.dispatch('shifted', { detail: overflow });\n };\n\n overflowRect(targetRect, translations) {\n const overflow = {};\n const viewport = viewportRect();\n const currentRect = defineRect({\n x: targetRect.x - translations.x,\n y: targetRect.y - translations.y,\n width: targetRect.width,\n height: targetRect.height,\n });\n for (const direction of this.boundaries) {\n const distance = this.directionDistance(currentRect, direction, viewport);\n const opposite = directionMap[direction];\n if (distance < 0) {\n const sufficientSpace = currentRect[opposite] + distance >= viewport[opposite];\n if (sufficientSpace && !overflow[opposite]) overflow[direction] = distance;\n } else {\n overflow[direction] = '';\n }\n }\n return overflow;\n }\n\n directionDistance(inner, direction, outer) {\n switch (direction) {\n case 'top':\n case 'left':\n return inner[direction] - outer[direction];\n case 'bottom':\n case 'right':\n return outer[direction] - inner[direction];\n default:\n throw `Invalid direction to calcuate distance, ${direction}`;\n }\n }\n\n elementTranslations(target) {\n const style = window.getComputedStyle(target);\n const matrix = style['transform'] || style['webkitTransform'] || style['mozTransform'];\n if (matrix === 'none' || typeof matrix === 'undefined') return { x: 0, y: 0 };\n const matrixType = matrix.includes('3d') ? '3d' : '2d';\n const matrixValues = matrix.match(/matrix.*\\((.+)\\)/)[1].split(', ');\n if (matrixType === '2d') return { x: Number(matrixValues[4]), y: Number(matrixValues[5]) };\n return { x: 0, y: 0 };\n }\n\n enhance() {\n super.enhance();\n this.controller.shift = this.shift;\n }\n}\n\nexport const attachShifter = (controller, options) => new Shifter(controller, options);\n","import Plumber from './plumber';\nimport { visibilityConfig } from './plumber/config';\nimport { setExpanded, setHidden } from '../accessibility/aria';\n\nconst defaultOptions = {\n visibility: 'visibility',\n onShown: 'shown',\n onHidden: 'hidden',\n};\n\nexport class Visibility extends Plumber {\n /**\n * Creates a new Visibility plumber instance.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @param {string} [options.visibility='visibility'] - Namespace for visibility helpers\n * @param {string} [options.onShown='shown'] - Method name on plumber instance called after showing\n * @param {string} [options.onHidden='hidden'] - Method name on plumber instance called after hiding\n */\n constructor(controller, options = {}) {\n const { visibility, onShown, onHidden, activator } = Object.assign({}, defaultOptions, options);\n\n const namespace = typeof visibility === 'string' ? visibility : defaultOptions.namespace;\n const resolver = typeof options.visible === 'string' ? options.visible : 'isVisible';\n if (typeof options.visible !== 'boolean' || options.visible) {\n options.visible = `${namespace}.${resolver}`;\n }\n super(controller, options);\n\n this.visibility = namespace;\n this.visibilityResolver = resolver;\n this.onShown = onShown;\n this.onHidden = onHidden;\n this.activator = activator instanceof HTMLElement ? activator : null;\n\n this.enhance();\n\n if (this.element instanceof HTMLElement) this.activate(this.isVisible(this.element));\n }\n\n /**\n * Checks if a target element is visible.\n * @param {HTMLElement} target - Element to check\n * @returns {boolean} True if element is visible\n */\n isVisible(target) {\n if (!(target instanceof HTMLElement)) return false;\n\n const hiddenClass = visibilityConfig.hiddenClass;\n return hiddenClass ? !target.classList.contains(hiddenClass) : !target.hasAttribute('hidden');\n }\n\n /**\n * Toggles element visibility using class or hidden attribute.\n * @param {HTMLElement} target - Element to toggle\n * @param {boolean} visible - True to show, false to hide\n */\n toggle(target, visible) {\n if (!(target instanceof HTMLElement)) return;\n\n const hiddenClass = visibilityConfig.hiddenClass;\n if (hiddenClass) {\n if (visible) target.classList.remove(hiddenClass);\n else target.classList.add(hiddenClass);\n } else {\n setHidden(target, !visible);\n }\n }\n\n /**\n * Sets aria-expanded on the activator element.\n * @param {boolean} isExpanded - True to mark as expanded, false to mark as collapsed\n */\n activate(isExpanded) {\n if (this.activator) setExpanded(this.activator, isExpanded);\n }\n\n /**\n * Shows the element and dispatches show events.\n * @returns {Promise<void>}\n */\n async show() {\n if (!(this.element instanceof HTMLElement) || this.isVisible(this.element)) return;\n\n this.dispatch('show');\n this.toggle(this.element, true);\n this.activate(true);\n\n await this.awaitCallback(this.onShown, { target: this.element });\n this.dispatch('shown');\n }\n\n /**\n * Hides the element and dispatches hide events.\n * @returns {Promise<void>}\n */\n async hide() {\n if (!(this.element instanceof HTMLElement) || !this.isVisible(this.element)) return;\n\n this.dispatch('hide');\n this.toggle(this.element, false);\n this.activate(false);\n\n await this.awaitCallback(this.onHidden, { target: this.element });\n this.dispatch('hidden');\n }\n\n enhance() {\n const context = this;\n const helpers = {\n show: context.show.bind(context),\n hide: context.hide.bind(context),\n };\n Object.defineProperty(helpers, 'visible', {\n get() {\n return context.isVisible(context.element);\n },\n });\n Object.defineProperty(helpers, this.visibilityResolver, {\n value: context.isVisible.bind(context),\n });\n Object.defineProperty(this.controller, this.visibility, {\n get() {\n return helpers;\n },\n });\n }\n}\n\n/**\n * Factory function to create and attach a Visibility plumber to a controller.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @returns {Visibility} Visibility plumber instance\n */\nexport const attachVisibility = (controller, options) => new Visibility(controller, options);\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarYearSelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst YEARS_PER_ROW = 4;\n\nexport default class extends Controller {\n static targets = ['grid'];\n static values = {\n current: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n };\n\n initialize() {\n this.selector = attachCalendarYearSelector(this);\n initCalendar(this, {\n today: this.todayValue,\n year: this.currentValue || undefined,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n currentValueChanged() {\n if (!this.calendar || !this.hasCurrentValue) return;\n this.calendar.navigate(this.currentDate);\n }\n\n selectedValueChanged() {\n if (!this.hasGridTarget) return;\n const selected = tryParseDate(this.selectedValue);\n const selectedYear = selected ? selected.getFullYear() : null;\n this.gridTarget.querySelectorAll('button[data-year]').forEach((btn) => {\n const year = parseInt(btn.dataset.year, 10);\n btn.setAttribute('aria-selected', year === selectedYear ? 'true' : 'false');\n });\n }\n\n navigate(date) {\n this.currentValue = date.getFullYear();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n navigated() {\n this.drawGrid();\n }\n\n get currentDate() {\n return new Date(this.currentValue, 0, 1);\n }\n\n drawGrid() {\n if (!this.hasGridTarget) return;\n\n const { yearsOfDecade } = this.calendar;\n const todayYear = this.calendar.today.getFullYear();\n const selectedDate = tryParseDate(this.selectedValue);\n const selectedYear = selectedDate ? selectedDate.getFullYear() : null;\n const cells = [];\n\n for (const y of yearsOfDecade) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = y.value;\n btn.dataset.year = y.value;\n btn.setAttribute('role', 'gridcell');\n btn.setAttribute('aria-selected', y.value === selectedYear ? 'true' : 'false');\n if (y.value === todayYear) btn.setAttribute('aria-current', 'year');\n if (y.disabled) btn.setAttribute('aria-disabled', 'true');\n cells.push(btn);\n }\n\n const rowgroup = document.createElement('div');\n rowgroup.setAttribute('role', 'rowgroup');\n for (let i = 0; i < cells.length; i += YEARS_PER_ROW) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n for (const cell of cells.slice(i, i + YEARS_PER_ROW)) row.appendChild(cell);\n rowgroup.appendChild(row);\n }\n this.gridTarget.replaceChildren(rowgroup);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarYearSelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarYearSelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarDaySelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nexport default class extends Controller {\n static targets = ['daysOfWeek', 'daysOfMonth'];\n static classes = ['dayOfWeek', 'dayOfMonth', 'dayOfOtherMonth', 'row'];\n static values = {\n year: Number,\n month: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n locales: { type: Array, default: ['default'] },\n weekdayFormat: { type: String, default: 'short' },\n dayFormat: { type: String, default: 'numeric' },\n daysOfOtherMonth: { type: Boolean, default: false },\n };\n\n initialize() {\n this.selector = attachCalendarDaySelector(this, { onSelect: 'select' });\n initCalendar(this, {\n today: this.todayValue,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n yearValueChanged() {\n if (!this.calendar || !this.hasYearValue) return;\n this._scheduleNavigate();\n }\n monthValueChanged() {\n if (!this.calendar || !this.hasYearValue) return;\n this._scheduleNavigate();\n }\n\n _scheduleNavigate() {\n if (this._navigatePending) return;\n this._navigatePending = true;\n queueMicrotask(async () => {\n this._navigatePending = false;\n await this.calendar.navigate(this.currentDate);\n this.navigated();\n });\n }\n\n selectedValueChanged() {\n if (!this.hasDaysOfMonthTarget) return;\n\n this.daysOfMonthTarget.querySelectorAll('[aria-selected]').forEach((el) => {\n el.setAttribute('aria-selected', 'false');\n });\n\n if (!this.selectedValue) return;\n\n const parsed = tryParseDate(this.selectedValue);\n if (!parsed) return;\n\n const time = this.daysOfMonthTarget.querySelector(`time[datetime=\"${parsed.toISOString()}\"]`);\n if (time) time.closest('[aria-selected]')?.setAttribute('aria-selected', 'true');\n }\n\n navigate(date) {\n this.yearValue = date.getFullYear();\n this.monthValue = date.getMonth();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n select(iso) {\n const date = tryParseDate(iso);\n if (!date) return;\n this.selectedValue = iso;\n if (date.getMonth() !== this.calendar.month || date.getFullYear() !== this.calendar.year) {\n this.calendar.navigate(date);\n }\n this.dispatch('selected', { detail: { epoch: date.getTime(), iso } });\n }\n\n navigated() {\n this.drawDaysOfWeek();\n this.drawDaysOfMonth();\n this.selectedValueChanged();\n }\n\n get currentDate() {\n return new Date(this.yearValue, this.monthValue, 1);\n }\n\n createDayElement(day, { selectable = false, disabled = false } = {}) {\n const element = document.createElement(selectable ? 'button' : 'div');\n element.tabIndex = -1;\n if (day) element.textContent = day;\n else element.setAttribute('aria-hidden', 'true');\n if (disabled) {\n if (element instanceof HTMLButtonElement) element.disabled = true;\n else element.setAttribute('aria-disabled', 'true');\n }\n return element;\n }\n\n drawDaysOfWeek() {\n if (!this.hasDaysOfWeekTarget) return;\n\n const formatter = new Intl.DateTimeFormat(this.localesValue, {\n weekday: this.weekdayFormatValue,\n });\n const daysOfWeek = [];\n for (const date of this.calendar.daysOfWeek) {\n const dayElement = this.createDayElement(formatter.format(date.date));\n dayElement.setAttribute('role', 'columnheader');\n dayElement.title = date.long;\n if (this.hasDayOfWeekClass) dayElement.classList.add(...this.dayOfWeekClasses);\n daysOfWeek.push(dayElement);\n }\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n if (this.hasRowClass) row.classList.add(...this.rowClasses);\n row.replaceChildren(...daysOfWeek);\n this.daysOfWeekTarget.replaceChildren(row);\n }\n\n drawDaysOfMonth() {\n if (!this.hasDaysOfMonthTarget) return;\n\n const t = this.calendar.today;\n const today = new Date(t.getFullYear(), t.getMonth(), t.getDate()).getTime();\n const daysOfMonth = [];\n for (const date of this.calendar.daysOfMonth) {\n const dayRuleDisabled = this.calendar.isDisabled(date.date) || !this.calendar.isWithinRange(date.date);\n const dayOutsideNavigable = !date.current && this.daysOfOtherMonthValue && !dayRuleDisabled;\n const dayText = date.current || this.daysOfOtherMonthValue ? date.value : '';\n const dayElement = this.createDayElement(dayText, {\n selectable: date.current || dayOutsideNavigable,\n disabled: date.current ? dayRuleDisabled : !dayOutsideNavigable,\n });\n\n if (today === date.date.getTime()) dayElement.setAttribute('aria-current', 'date');\n if (date.current || this.daysOfOtherMonthValue) dayElement.setAttribute('aria-selected', '');\n if (!date.current && this.daysOfOtherMonthValue && this.hasDayOfOtherMonthClass) {\n dayElement.classList.add(...this.dayOfOtherMonthClasses);\n } else if (this.hasDayOfMonthClass) {\n dayElement.classList.add(...this.dayOfMonthClasses);\n }\n\n const time = document.createElement('time');\n time.dateTime = date.iso;\n dayElement.appendChild(time);\n\n daysOfMonth.push(dayElement);\n }\n\n const rows = [];\n for (let i = 0; i < daysOfMonth.length; i += 7) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n if (this.hasRowClass) row.classList.add(...this.rowClasses);\n for (const day of daysOfMonth.slice(i, i + 7)) {\n day.setAttribute('role', 'gridcell');\n row.appendChild(day);\n }\n rows.push(row);\n }\n this.daysOfMonthTarget.replaceChildren(...rows);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarDaySelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarDaySelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarMonthSelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst MONTHS_PER_ROW = 4;\n\nexport default class extends Controller {\n static targets = ['grid'];\n static values = {\n current: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n locales: { type: Array, default: ['default'] },\n monthFormat: { type: String, default: 'short' },\n };\n\n initialize() {\n this.selector = attachCalendarMonthSelector(this);\n initCalendar(this, {\n today: this.todayValue,\n year: this.currentValue || undefined,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n currentValueChanged() {\n if (!this.calendar || !this.hasCurrentValue) return;\n this.calendar.navigate(this.currentDate);\n }\n\n selectedValueChanged() {\n if (!this.hasGridTarget) return;\n const selected = tryParseDate(this.selectedValue);\n this.gridTarget.querySelectorAll('button[data-month]').forEach((btn) => {\n const month = parseInt(btn.dataset.month, 10) - 1; // 0-indexed\n btn.setAttribute('aria-selected', selected && selected.getMonth() === month ? 'true' : 'false');\n });\n }\n\n navigate(date) {\n this.currentValue = date.getFullYear();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n navigated() {\n this.drawGrid();\n }\n\n get currentDate() {\n return new Date(this.currentValue, 0, 1);\n }\n\n drawGrid() {\n if (!this.hasGridTarget) return;\n\n const { year, monthsOfYear } = this.calendar;\n const today = this.calendar.today;\n const selectedDate = tryParseDate(this.selectedValue);\n const cells = [];\n\n const formatter = new Intl.DateTimeFormat(this.localesValue, { month: this.monthFormatValue });\n\n for (const m of monthsOfYear) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = formatter.format(m.date);\n btn.dataset.month = m.value + 1; // 1-indexed\n btn.setAttribute('role', 'gridcell');\n const isSelected = selectedDate && selectedDate.getMonth() === m.value;\n btn.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n if (m.value === today.getMonth() && year === today.getFullYear()) {\n btn.setAttribute('aria-current', 'month');\n }\n if (m.disabled) btn.setAttribute('aria-disabled', 'true');\n cells.push(btn);\n }\n\n const rowgroup = document.createElement('div');\n rowgroup.setAttribute('role', 'rowgroup');\n for (let i = 0; i < cells.length; i += MONTHS_PER_ROW) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n for (const cell of cells.slice(i, i + MONTHS_PER_ROW)) row.appendChild(cell);\n rowgroup.appendChild(row);\n }\n this.gridTarget.replaceChildren(rowgroup);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarMonthSelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarMonthSelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['source'];\n static values = {\n contentType: { type: String, default: 'text/plain' },\n };\n\n onPaste(event) {\n const text = event.clipboardData?.getData(this.contentTypeValue) ?? '';\n const types = Array.from(event.clipboardData?.types ?? []);\n event.preventDefault();\n this.dispatch('pasted', { detail: { text, types }, bubbles: true });\n }\n\n async copy(event) {\n const text =\n event.params?.text ??\n (this.hasSourceTarget ? (this.sourceTarget.value ?? this.sourceTarget.textContent ?? '') : '');\n try {\n await navigator.clipboard.writeText(text);\n this.dispatch('copied', { detail: { text }, bubbles: true });\n } catch (error) {\n this.dispatch('copy-failed', { detail: { error }, bubbles: true });\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst VIEWS = ['month', 'year', 'decade'];\n\nexport default class extends Controller {\n static targets = ['previous', 'next', 'day', 'month', 'year', 'viewTitle'];\n static outlets = ['calendar-month', 'calendar-year', 'calendar-decade'];\n static values = {\n date: String,\n view: { type: String, default: 'month' },\n locales: { type: Array, default: ['default'] },\n dayFormat: { type: String, default: 'numeric' },\n monthFormat: { type: String, default: 'long' },\n yearFormat: { type: String, default: 'numeric' },\n };\n\n initialize() {\n this.previous = this.previous.bind(this);\n this.next = this.next.bind(this);\n }\n\n async calendarMonthOutletConnected() {\n if (this.dateValue) {\n const date = tryParseDate(this.dateValue);\n if (date) await this.calendarMonthOutlet.calendar.navigate(date);\n }\n this.draw();\n }\n\n onDaySelect(event) {\n this.dateValue = event.detail.iso;\n this.draw();\n this.dispatch('selected', { detail: { value: event.detail.iso }, bubbles: true });\n }\n\n zoomOut() {\n const idx = VIEWS.indexOf(this.viewValue);\n if (idx < VIEWS.length - 1) {\n this.viewValue = VIEWS[idx + 1];\n this.draw();\n }\n }\n\n async onMonthSelect(event) {\n const { month } = event.detail; // 1-indexed\n if (!this.hasCalendarMonthOutlet) return;\n const { year } = this.calendarMonthOutlet.calendar;\n await this.calendarMonthOutlet.calendar.navigate(new Date(year, month - 1, 1));\n this.viewValue = 'month';\n this.draw();\n }\n\n async onYearSelect(event) {\n const { year } = event.detail;\n if (!this.hasCalendarMonthOutlet) return;\n const { month } = this.calendarMonthOutlet.calendar;\n await this.calendarMonthOutlet.calendar.navigate(new Date(year, month, 1));\n if (this.hasCalendarYearOutlet) {\n this.calendarYearOutlet.navigate(this.calendarMonthOutlet.calendar.current);\n }\n this.viewValue = 'year';\n this.draw();\n }\n\n previousTargetConnected(target) {\n target.addEventListener('click', this.previous);\n }\n\n previousTargetDisconnected(target) {\n target.removeEventListener('click', this.previous);\n }\n\n async previous() {\n await this.calendarMonthOutlet.calendar.step(...this.stepArgs(-1));\n this.syncOutletValues();\n this.draw();\n }\n\n nextTargetConnected(target) {\n target.addEventListener('click', this.next);\n }\n\n nextTargetDisconnected(target) {\n target.removeEventListener('click', this.next);\n }\n\n async next() {\n await this.calendarMonthOutlet.calendar.step(...this.stepArgs(1));\n this.syncOutletValues();\n this.draw();\n }\n\n draw() {\n this.drawDay();\n this.drawMonth();\n this.drawYear();\n this.drawViewTitle();\n this.drawView();\n }\n\n drawDay() {\n if (!this.hasDayTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month, day } = this.calendarMonthOutlet.calendar;\n this.dayTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { day: this.dayFormatValue }).format(\n new Date(year, month, day)\n );\n }\n\n drawMonth() {\n if (!this.hasMonthTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month } = this.calendarMonthOutlet.calendar;\n this.monthTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { month: this.monthFormatValue }).format(\n new Date(year, month)\n );\n }\n\n drawYear() {\n if (!this.hasYearTarget || !this.hasCalendarMonthOutlet) return;\n const { year } = this.calendarMonthOutlet.calendar;\n this.yearTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { year: this.yearFormatValue }).format(\n new Date(year, 0)\n );\n }\n\n drawViewTitle() {\n if (!this.hasViewTitleTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month } = this.calendarMonthOutlet.calendar;\n this.viewTitleTarget.textContent = this.viewTitleLabel(year, month);\n }\n\n syncOutletValues() {\n if (!this.hasCalendarMonthOutlet) return;\n const { current } = this.calendarMonthOutlet.calendar;\n if (!current) return;\n if (this.hasCalendarYearOutlet) this.calendarYearOutlet.navigate(current);\n if (this.hasCalendarDecadeOutlet) this.calendarDecadeOutlet.navigate(current);\n }\n\n stepArgs(direction) {\n if (this.viewValue === 'year') return ['year', direction];\n if (this.viewValue === 'decade') return ['year', direction * 10];\n return ['month', direction];\n }\n\n viewTitleLabel(year, month) {\n if (this.viewValue === 'year') return String(year);\n if (this.viewValue === 'decade') {\n const start = Math.floor(year / 10) * 10;\n return `${start}–${start + 9}`;\n }\n return new Intl.DateTimeFormat(this.localesValue, { month: 'long', year: 'numeric' }).format(new Date(year, month));\n }\n\n drawView() {\n const inMonthView = this.viewValue === 'month';\n const inYearView = this.viewValue === 'year';\n const inDecadeView = this.viewValue === 'decade';\n\n if (this.hasCalendarMonthOutlet) {\n const outlet = this.calendarMonthOutlet;\n if (outlet.hasDaysOfWeekTarget) outlet.daysOfWeekTarget.hidden = !inMonthView;\n if (outlet.hasDaysOfMonthTarget) outlet.daysOfMonthTarget.hidden = !inMonthView;\n }\n if (this.hasCalendarYearOutlet) {\n this.calendarYearOutletElement.hidden = !inYearView;\n }\n if (this.hasCalendarDecadeOutlet) {\n this.calendarDecadeOutletElement.hidden = !inDecadeView;\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { Requestor } from '../requestor';\nimport { filterOptions } from '../researcher';\nimport { ListboxNavigation } from '../accessibility/keyboard';\n\nexport default class extends Controller {\n static targets = ['listbox', 'loading', 'empty'];\n static values = {\n url: { type: String, default: '' },\n field: { type: String, default: 'q' },\n delay: { type: Number, default: 300 },\n };\n\n initialize() {\n this._requestor = new Requestor();\n }\n\n connect() {\n if (this.hasListboxTarget) {\n this.listboxNav = new ListboxNavigation(this.listboxTarget);\n }\n }\n\n disconnect() {\n this._requestor.cancel();\n }\n\n onSelect(event) {\n const option = event.target.closest('[role=\"option\"]');\n if (!option || option.getAttribute('aria-disabled') === 'true') return;\n this.select(option.dataset.value ?? '');\n }\n\n select(value) {\n const options = this.listboxTarget.querySelectorAll('[role=\"option\"]');\n options.forEach((o) => o.setAttribute('aria-selected', 'false'));\n const option = [...options].find((o) => o.dataset.value === value);\n if (option) option.setAttribute('aria-selected', 'true');\n this.dispatch('selected', { detail: { value }, bubbles: true });\n }\n\n onNavigate(event) {\n this.listboxNav?.handleKeyDown(event);\n }\n\n filter(query) {\n if (this.urlValue) {\n const url = new URL(this.urlValue, window.location.href);\n url.searchParams.set(this.fieldValue, query);\n this.setLoading(true);\n this._requestor.schedule(\n () =>\n this._requestor\n .request(url)\n .then((r) => r.text())\n .then((html) => {\n this.listboxTarget.innerHTML = html;\n this.setEmpty(this.listboxTarget.querySelectorAll('[role=\"option\"]').length === 0);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') console.error('[combobox-dropdown] fetch failed', err);\n })\n .finally(() => this.setLoading(false)),\n this.delayValue\n );\n } else {\n const visible = filterOptions(this.listboxTarget, query);\n this.setEmpty(visible === 0);\n }\n }\n\n showAll() {\n this.listboxTarget.querySelectorAll('[role=\"option\"]').forEach((o) => (o.hidden = false));\n this.setEmpty(false);\n }\n\n setLoading(on) {\n if (this.hasLoadingTarget) this.loadingTarget.hidden = !on;\n }\n\n setEmpty(on) {\n if (this.hasEmptyTarget) this.emptyTarget.hidden = !on;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['hour', 'minute', 'period'];\n\n connect() {\n this.select(this.toH24());\n }\n\n onSelect(event) {\n const item = event.target.closest('[role=\"option\"]');\n if (!item) return;\n const drum = item.closest('[role=\"listbox\"]');\n drum.querySelectorAll('[role=\"option\"]').forEach((o) => o.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n this.select(this.toH24());\n }\n\n select(value) {\n if (value) this.dispatch('selected', { detail: { value }, bubbles: true });\n }\n\n onNavigate(event) {\n if (!['ArrowUp', 'ArrowDown'].includes(event.key)) return;\n event.preventDefault();\n this.step(event.currentTarget, event.key === 'ArrowDown' ? 1 : -1);\n }\n\n step(drum, delta) {\n const items = [...drum.querySelectorAll('[role=\"option\"]')];\n const current = drum.querySelector('[aria-selected=\"true\"]');\n const idx = items.indexOf(current);\n const next = delta > 0 ? items[Math.min(idx + 1, items.length - 1)] : items[Math.max(idx - 1, 0)];\n if (!next || next === current) return;\n items.forEach((o) => o.setAttribute('aria-selected', 'false'));\n next.setAttribute('aria-selected', 'true');\n next.scrollIntoView({ block: 'nearest' });\n this.select(this.toH24());\n }\n\n toH24() {\n const h = this.selectedValue(this.hourTarget);\n const m = this.selectedValue(this.minuteTarget);\n if (!h || !m) return null;\n if (!this.hasPeriodTarget) return `${h}:${m}`;\n const period = this.selectedValue(this.periodTarget);\n let hour = parseInt(h, 10);\n if (period === 'AM') hour = hour === 12 ? 0 : hour;\n else hour = hour === 12 ? 12 : hour + 12;\n return `${String(hour).padStart(2, '0')}:${m}`;\n }\n\n selectedValue(drum) {\n return drum?.querySelector('[aria-selected=\"true\"]')?.dataset.value ?? null;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachDismisser } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['trigger'];\n\n connect() {\n attachDismisser(this, { trigger: this.hasTriggerTarget ? this.triggerTarget : null });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachFlipper } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['anchor', 'reference'];\n static values = {\n placement: { type: String, default: 'bottom' },\n alignment: { type: String, default: 'start' },\n role: { type: String, default: 'tooltip' },\n };\n\n connect() {\n if (!this.hasReferenceTarget) {\n console.error(\n 'FlipperController requires a reference target. Add data-flipper-target=\"reference\" to your element.'\n );\n return;\n }\n\n if (!this.hasAnchorTarget) {\n console.error('FlipperController requires an anchor target. Add data-flipper-target=\"anchor\" to your element.');\n return;\n }\n\n attachFlipper(this, {\n element: this.referenceTarget,\n anchor: this.anchorTarget,\n placement: this.placementValue,\n alignment: this.alignmentValue,\n ariaRole: this.roleValue,\n });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['trigger', 'input'];\n static values = {\n value: String,\n minLength: { type: Number, default: 1 },\n };\n static outlets = ['combobox-dropdown'];\n\n onSelect(event) {\n if (event.detail?.value !== undefined) this.valueValue = event.detail.value;\n }\n\n onInput(event) {\n if (event.target !== this.triggerTarget) return;\n const query = event.target.value.trim();\n if (query.length < this.minLengthValue) {\n if (this.hasComboboxDropdownOutlet) this.comboboxDropdownOutlet.showAll();\n return;\n }\n if (this.hasComboboxDropdownOutlet) this.comboboxDropdownOutlet.filter(query);\n }\n\n valueValueChanged(newVal) {\n if (this.hasInputTarget) this.inputTarget.value = newVal;\n this.dispatch('changed', { detail: { value: newVal } });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { setPressed } from '../accessibility/aria';\nimport { attachFormatter } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['input', 'toggle'];\n static values = {\n format: { type: String, default: 'plain' },\n options: { type: Object, default: {} },\n revealed: { type: Boolean, default: false },\n };\n\n connect() {\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n this.drawToggle();\n }\n\n formatValueChanged() {\n if (!this.formatter) return;\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n this.drawToggle();\n }\n\n optionsValueChanged() {\n if (!this.formatter) return;\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n }\n\n revealedValueChanged() {\n if (!this.formatter) return;\n this.format(this.readValue());\n this.drawToggle();\n }\n\n onChange(event) {\n this.format(event?.detail?.value ?? '');\n }\n\n format(value) {\n if (!this.formatter) return;\n this.onFormatting(value);\n }\n\n toggle() {\n if (!this.formatter.maskable() && this.formatValue !== 'password') return;\n this.revealedValue = !this.revealedValue;\n }\n\n onPaste(event) {\n const raw = event.detail?.text ?? '';\n if (!this.formatter || !raw) return;\n const value = this.formatter.normalize(raw);\n if (!this.formatter.validate(value)) return;\n this.format(value);\n }\n\n drawToggle() {\n if (!this.hasToggleTarget) return;\n const hasToggleBehavior = this.formatter?.maskable() || this.formatValue === 'password';\n this.toggleTarget.hidden = !hasToggleBehavior;\n if (hasToggleBehavior) setPressed(this.toggleTarget, this.revealedValue);\n }\n\n readValue() {\n if (!this.hasInputTarget) return '';\n return this.inputTarget instanceof HTMLInputElement ? this.inputTarget.value : this.inputTarget.textContent;\n }\n\n onFormatting(raw) {\n if (!this.formatter) return;\n\n if (this.formatValue === 'password') {\n if (this.hasInputTarget) this.inputTarget.type = this.revealedValue ? 'text' : 'password';\n return;\n }\n\n const value = this.formatter.normalize(raw);\n const formatted =\n this.revealedValue || !this.formatter.maskable() ? this.formatter.format(value) : this.formatter.mask(value);\n\n if (this.hasInputTarget) {\n if (this.inputTarget instanceof HTMLInputElement) {\n this.inputTarget.value = formatted;\n } else {\n this.inputTarget.textContent = formatted;\n }\n }\n\n this.dispatch('formatted', { detail: { value: formatted } });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['input', 'clear'];\n\n initialize() {\n this.onInput = this.draw.bind(this);\n this.onEscape = this.handleEscape.bind(this);\n }\n\n connect() {\n this.draw();\n }\n\n inputTargetConnected(input) {\n input.addEventListener('input', this.onInput);\n input.addEventListener('keydown', this.onEscape);\n }\n\n inputTargetDisconnected(input) {\n input.removeEventListener('input', this.onInput);\n input.removeEventListener('keydown', this.onEscape);\n }\n\n clear() {\n if (!this.hasInputTarget) return;\n this.inputTarget.value = '';\n this.draw();\n this.inputTarget.focus();\n this.inputTarget.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n draw() {\n if (!this.hasInputTarget || !this.hasClearTarget) return;\n this.clearTarget.hidden = this.inputTarget.value.length === 0;\n }\n\n handleEscape(event) {\n if (event.key !== 'Escape') return;\n if (this.inputTarget.value === '') return;\n event.preventDefault();\n this.clear();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { FocusTrap } from '../accessibility/focus';\nimport { announce } from '../accessibility/aria';\nimport { attachDismisser } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['modal', 'overlay'];\n\n initialize() {\n this.onCancel = this.close.bind(this);\n }\n\n connect() {\n if (!this.hasModalTarget) {\n console.error('ModalController requires a modal target. Add data-modal-target=\"modal\" to your element.');\n }\n }\n\n modalTargetConnected(modal) {\n this.isNativeDialog = modal instanceof HTMLDialogElement;\n if (this.isNativeDialog) {\n modal.addEventListener('cancel', this.onCancel);\n modal.addEventListener('click', this.onBackdropClick);\n } else {\n this.focusTrap = new FocusTrap(modal, {\n escapeDeactivates: true,\n onDeactivate: () => this.close(),\n });\n attachDismisser(this, { element: modal });\n }\n }\n\n modalTargetDisconnected(modal) {\n if (this.isNativeDialog) {\n modal.removeEventListener('cancel', this.onCancel);\n modal.removeEventListener('click', this.onBackdropClick);\n }\n }\n\n dismissed = () => {\n this.close();\n };\n\n open(event) {\n if (event) event.preventDefault();\n if (!this.hasModalTarget) return;\n\n if (this.isNativeDialog) {\n this.previouslyFocused = document.activeElement;\n this.modalTarget.showModal();\n } else {\n const targetToShow = this.hasOverlayTarget ? this.overlayTarget : this.modalTarget;\n targetToShow.hidden = false;\n\n document.body.style.overflow = 'hidden';\n\n if (this.focusTrap) {\n this.focusTrap.activate();\n }\n }\n\n announce('Modal opened');\n }\n\n close(event) {\n if (event) event.preventDefault();\n if (!this.hasModalTarget) return;\n\n if (this.isNativeDialog) {\n this.modalTarget.close();\n\n if (this.previouslyFocused && this.previouslyFocused.isConnected) {\n setTimeout(() => {\n this.previouslyFocused.focus();\n }, 0);\n }\n } else {\n const targetToHide = this.hasOverlayTarget ? this.overlayTarget : this.modalTarget;\n targetToHide.hidden = true;\n\n document.body.style.overflow = '';\n\n if (this.focusTrap) {\n this.focusTrap.deactivate();\n }\n }\n\n announce('Modal closed');\n }\n\n onBackdropClick = (event) => {\n const rect = this.modalTarget.getBoundingClientRect();\n const isOutsideDialog =\n event.clientY < rect.top ||\n event.clientY > rect.bottom ||\n event.clientX < rect.left ||\n event.clientX > rect.right;\n\n if (isOutsideDialog) {\n this.close();\n }\n };\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachShifter } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['content'];\n\n connect() {\n attachShifter(this, { element: this.hasContentTarget ? this.contentTarget : null });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { focusFirst } from '../accessibility/focus';\nimport { announce } from '../accessibility/aria';\nimport { attachContentLoader, attachDismisser, attachVisibility } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['trigger', 'panel', 'template', 'loader'];\n static classes = ['hidden'];\n static values = {\n url: String,\n loadedAt: String,\n reload: { type: String, default: 'never' },\n staleAfter: { type: Number, default: 3600 },\n closeOnSelect: { type: Boolean, default: true },\n announceOpen: { type: String, default: 'Panel opened' },\n announceClose: { type: String, default: 'Panel closed' },\n };\n\n connect() {\n attachContentLoader(this, {\n element: this.hasPanelTarget ? this.panelTarget : null,\n url: this.hasUrlValue ? this.urlValue : null,\n });\n\n if (this.hasPanelTarget) {\n attachVisibility(this, {\n element: this.panelTarget,\n activator: this.hasTriggerTarget ? this.triggerTarget : null,\n });\n attachDismisser(this);\n }\n if (this.hasLoaderTarget)\n attachVisibility(this, { element: this.loaderTarget, visibility: 'contentLoaderVisibility' });\n }\n\n async dismissed() {\n await this.close();\n }\n\n async open() {\n if (!this.hasPanelTarget) return;\n await this.visibility.show();\n }\n\n async close() {\n if (!this.hasPanelTarget) return;\n await this.visibility.hide();\n }\n\n async toggle() {\n this.visibility?.visible ? await this.close() : await this.open();\n }\n\n async closeOnSelect() {\n if (this.closeOnSelectValue) await this.close();\n }\n\n async shown() {\n await this.load();\n if (this.hasPanelTarget) focusFirst(this.panelTarget);\n announce(this.announceOpenValue);\n }\n\n async hidden() {\n if (this.hasTriggerTarget) this.triggerTarget.focus();\n announce(this.announceCloseValue);\n }\n\n canLoad() {\n if (this.hasPanelTarget && this.panelTarget.tagName.toLowerCase() === 'turbo-frame') {\n if (this.hasUrlValue) this.panelTarget.setAttribute('src', this.urlValue);\n return false;\n }\n return true;\n }\n\n async contentLoading() {\n if (this.hasLoaderTarget) await this.contentLoaderVisibility.show();\n }\n\n async contentLoaded({ content }) {\n if (this.hasPanelTarget) {\n this.panelTarget.replaceChildren(this.getContentNode(content));\n }\n if (this.hasLoaderTarget) await this.contentLoaderVisibility.hide();\n }\n\n getContentNode(content) {\n if (typeof content === 'string') {\n const template = document.createElement('template');\n template.innerHTML = content;\n return document.importNode(template.content, true);\n }\n return document.importNode(content, true);\n }\n\n contentLoader() {\n if (!this.hasTemplateTarget) return;\n if (this.templateTarget instanceof HTMLTemplateElement) return this.templateTarget.content;\n\n return this.templateTarget.innerHTML;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { DateFormatter } from '../plumbers/formatters/date';\nimport { RovingTabIndex } from '../accessibility/keyboard';\nimport { setExpanded, setHidden, announce } from '../accessibility/aria';\n\nexport default class extends Controller {\n static targets = ['trigger', 'detail', 'time'];\n static values = {\n dateFormat: { type: Object, default: {} },\n };\n\n connect() {\n this.rovingTabIndex = new RovingTabIndex(this.triggerTargets, { orientation: 'vertical' });\n this.rovingTabIndex.activate();\n }\n\n disconnect() {\n this.rovingTabIndex?.deactivate();\n this.rovingTabIndex = null;\n }\n\n toggle(event) {\n const trigger = event.currentTarget;\n trigger.getAttribute('aria-expanded') === 'true' ? this.collapseItem(trigger) : this.expandItem(trigger);\n }\n\n expand(event) {\n this.expandItem(event.currentTarget);\n }\n\n collapse(event) {\n this.collapseItem(event.currentTarget);\n }\n\n expandItem(trigger) {\n const detail = this.detailTargets.find((d) => d.id === trigger.getAttribute('aria-controls')) ?? null;\n this.dispatch('expand', { detail: { trigger, detail } });\n setExpanded(trigger, true);\n if (detail) {\n setHidden(detail, false);\n announce(`${trigger.textContent.trim()} expanded`);\n }\n this.dispatch('expanded', { detail: { trigger, detail } });\n }\n\n collapseItem(trigger) {\n const detail = this.detailTargets.find((d) => d.id === trigger.getAttribute('aria-controls')) ?? null;\n this.dispatch('collapse', { detail: { trigger, detail } });\n setExpanded(trigger, false);\n if (detail) {\n setHidden(detail, true);\n announce(`${trigger.textContent.trim()} collapsed`);\n }\n this.dispatch('collapsed', { detail: { trigger, detail } });\n }\n\n triggerTargetConnected(trigger) {\n if (!trigger.hasAttribute('aria-expanded')) trigger.setAttribute('aria-expanded', 'false');\n this.rovingTabIndex?.updateItems(this.triggerTargets);\n }\n\n triggerTargetDisconnected() {\n this.rovingTabIndex?.updateItems(this.triggerTargets);\n }\n\n timeTargetConnected(el) {\n if (!Object.keys(this.dateFormatValue).length || el.textContent.trim()) return;\n const formatted = DateFormatter.format(el.getAttribute('datetime'), this.dateFormatValue);\n if (formatted) el.textContent = formatted;\n }\n}\n"],"mappings":"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"}
|
data/app/assets/javascripts/stimulus-plumbers/{stimulus-plumbers-controllers.umd.js → index.umd.js}
RENAMED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@hotwired/stimulus`)):typeof define==`function`&&define.amd?define([`exports`,`@hotwired/stimulus`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.StimulusPlumbersControllers={},e.Stimulus))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=[`a[href]`,`area[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable="false"])`].join(`,`);function r(e){return Array.from(e.querySelectorAll(n)).filter(e=>i(e))}function i(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}function a(e){let t=r(e);return t.length>0?(t[0].focus(),!0):!1}var o=class{constructor(e,t={}){this.container=e,this.previouslyFocused=null,this.options=t,this.isActive=!1}activate(){this.isActive||(this.previouslyFocused=document.activeElement,this.isActive=!0,this.options.initialFocus?this.options.initialFocus.focus():a(this.container),this.container.addEventListener(`keydown`,this.handleKeyDown))}deactivate(){if(!this.isActive)return;this.isActive=!1,this.container.removeEventListener(`keydown`,this.handleKeyDown);let e=this.options.returnFocus||this.previouslyFocused;e&&i(e)&&e.focus(),typeof this.options.onDeactivate==`function`&&this.options.onDeactivate()}handleKeyDown=e=>{if(e.key===`Escape`&&this.options.escapeDeactivates){e.preventDefault(),this.deactivate();return}if(e.key!==`Tab`)return;let t=r(this.container);if(t.length===0)return;let n=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),n.focus())}};function s(e,t){return e.key===t}function c(e){return e.key===`Enter`||e.key===` `}function l(e){return[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`].includes(e.key)}function u(e){e.preventDefault(),e.stopPropagation()}var d=class{constructor(e,t={}){this.items=Array.from(e),this.currentIndex=t.initialIndex??0,this.orientation=t.orientation??`both`,this.wrap=t.wrap??!0,this._handleKeyDown=this._handleKeyDown.bind(this),this._handleClick=this._handleClick.bind(this)}activate(){return this.updateTabIndex(),this.items.forEach(e=>{e.addEventListener(`keydown`,this._handleKeyDown),e.addEventListener(`click`,this._handleClick)}),this}deactivate(){this.items.forEach(e=>{e.removeEventListener(`keydown`,this._handleKeyDown),e.removeEventListener(`click`,this._handleClick)})}updateItems(e){this.deactivate(),this.items=Array.from(e),this.currentIndex=Math.min(this.currentIndex,Math.max(0,this.items.length-1)),this.activate()}setCurrentIndex(e){e>=0&&e<this.items.length&&(this.currentIndex=e,this.updateTabIndex(),this.items[e].focus())}updateTabIndex(){this.items.forEach((e,t)=>{e.tabIndex=t===this.currentIndex?0:-1})}_handleClick(e){let t=this.items.indexOf(e.currentTarget);t!==-1&&(this.currentIndex=t,this.updateTabIndex())}_handleKeyDown(e){let t=this.items.indexOf(e.currentTarget);t!==-1&&t!==this.currentIndex&&(this.currentIndex=t,this.updateTabIndex());let n=this.orientation===`horizontal`?[]:[`ArrowUp`,`ArrowDown`],r=this.orientation===`vertical`?[]:[`ArrowLeft`,`ArrowRight`];if(![...n,...r,`Home`,`End`].includes(e.key))return;e.preventDefault();let i=t===-1?this.currentIndex:t,a;switch(e.key){case`ArrowDown`:case`ArrowRight`:a=this.wrap?(i+1)%this.items.length:Math.min(i+1,this.items.length-1);break;case`ArrowUp`:case`ArrowLeft`:a=this.wrap?(i-1+this.items.length)%this.items.length:Math.max(i-1,0);break;case`Home`:a=0;break;case`End`:a=this.items.length-1;break}this.setCurrentIndex(a)}},f=class{constructor(e,t={}){this.listbox=e,this.itemSelector=t.itemSelector??`[role="option"]:not([aria-disabled="true"]):not([hidden])`,this.wrap=t.wrap??!1,this.orientation=t.orientation??`vertical`}get selectedItem(){return this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`)??null}get currentIndex(){return Array.from(this.listbox.querySelectorAll(this.itemSelector)).indexOf(this.selectedItem)}_selectItem(e){Array.from(this.listbox.querySelectorAll(this.itemSelector)).forEach(e=>e.setAttribute(`aria-selected`,`false`)),e.setAttribute(`aria-selected`,`true`),e.scrollIntoView({block:`nearest`})}step(e){let t=Array.from(this.listbox.querySelectorAll(this.itemSelector));if(!t.length)return;let n=this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`),r=t.indexOf(n),i;i=e>0?this.wrap?t[(r+1)%t.length]:t[Math.min(r+1,t.length-1)]:this.wrap?t[(r-1+t.length)%t.length]:t[Math.max(r-1,0)],!(!i||i===n)&&this._selectItem(i)}handleKeyDown(e){let t=this.orientation===`horizontal`?[]:[`ArrowUp`,`ArrowDown`],n=this.orientation===`vertical`?[]:[`ArrowLeft`,`ArrowRight`];if(![...t,...n,`Home`,`End`,`Enter`,` `].includes(e.key))return;e.preventDefault();let r=Array.from(this.listbox.querySelectorAll(this.itemSelector));switch(e.key){case`ArrowDown`:case`ArrowRight`:this.step(1);break;case`ArrowUp`:case`ArrowLeft`:this.step(-1);break;case`Home`:r.length&&this._selectItem(r[0]);break;case`End`:r.length&&this._selectItem(r[r.length-1]);break;case`Enter`:case` `:this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`)?.click();break}}},p=(e,t,n)=>{let r=document.querySelector(`[data-live-region="${e}"]`);return r||(r=document.createElement(`div`),r.className=`sr-only`,r.dataset.liveRegion=e,r.setAttribute(`aria-live`,e),r.setAttribute(`aria-atomic`,t.toString()),r.setAttribute(`aria-relevant`,n),document.body.appendChild(r)),r};function m(e,t={}){let{politeness:n=`polite`,atomic:r=!0,relevant:i=`additions text`}=t,a=p(n,r,i);a.textContent=``,setTimeout(()=>{a.textContent=e},100)}var h=(e=`a11y`)=>`${e}-${Math.random().toString(36).substr(2,9)}`,ee=(e,t=`element`)=>e.id||=h(t),g=(e,t,n)=>{e.setAttribute(t,n.toString())},_=(e,t)=>g(e,`aria-expanded`,t),v=(e,t)=>g(e,`aria-pressed`,t),te=(e,t)=>g(e,`aria-checked`,t),y=(e,t)=>t?e.setAttribute(`hidden`,``):e.removeAttribute(`hidden`);function ne(e,t){g(e,`aria-disabled`,t),t?e.setAttribute(`tabindex`,`-1`):e.removeAttribute(`tabindex`)}var b={menu:`menu`,listbox:`listbox`,tree:`tree`,grid:`grid`,dialog:`dialog`},x=(e,t,n)=>{Object.entries(t).forEach(([t,r])=>{e.setAttribute(t,r),n[t]=r})},S=(e,t,n)=>n||!e.hasAttribute(t);function C({trigger:e,target:t,role:n=null,override:r=!1}){let i={trigger:{},target:{}};if(!e||!t)return i;let a={},o={};if(n&&S(t,`role`,r)&&(o.role=n),t.id&&(S(e,`aria-controls`,r)&&(a[`aria-controls`]=t.id),n===`tooltip`&&S(e,`aria-describedby`,r)&&(a[`aria-describedby`]=t.id)),n&&S(e,`aria-haspopup`,r)){let e=b[n]||`true`;e&&(a[`aria-haspopup`]=e)}return x(t,o,i.target),x(e,a,i.trigger),i}var w=(e,t)=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})};function re({trigger:e,target:t,attributes:n=null}){!e||!t||(w(e,n||[`aria-controls`,`aria-haspopup`,`aria-describedby`]),(!n||n.includes(`role`))&&w(t,[`role`]))}var T=class{constructor(){this._abortController=null,this._timer=null}schedule(e,t){clearTimeout(this._timer),this._timer=setTimeout(e,t)}async request(e,t={}){this._abortController?.abort(),this._abortController=new AbortController;let n=await fetch(e,{...t,signal:this._abortController.signal});if(!n.ok)throw Error(`${n.status}`);return n}cancel(){clearTimeout(this._timer),this._abortController?.abort()}};function ie(e,t){let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&n++;return n===e.length}function ae(e,t){return t.includes(e)}function oe(e,t){return t.startsWith(e)}function se(e){return e===`contains`?ae:e===`prefix`?oe:ie}function ce(e,t){return t===`textContent`?e.textContent?.trim().toLowerCase()??``:(e.getAttribute(t)??``).toLowerCase()}function E(e,t,n={}){let{strategy:r=`fuzzy`,matcher:i,fields:a=[`textContent`]}=n,o=typeof i==`function`?i:se(r),s=t.toLowerCase(),c=0;return e.querySelectorAll(`[role="option"]`).forEach(e=>{let t=a.some(t=>o(s,ce(e,t)));e.hidden=!t,t&&c++}),c}var D={get top(){return`bottom`},get bottom(){return`top`},get left(){return`right`},get right(){return`left`}};function O({x:e,y:t,width:n,height:r}){return{x:e,y:t,width:n,height:r,left:e,right:e+n,top:t,bottom:t+r}}function k(){return O({x:0,y:0,width:window.innerWidth||document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight})}function le(e){if(!(e instanceof HTMLElement))return!1;let t=k(),n=e.getBoundingClientRect(),r=n.top<=t.height&&n.top+n.height>0,i=n.left<=t.width&&n.left+n.width>0;return r&&i}var A={get visibleOnly(){return!0},hiddenClass:null},ue={element:null,visible:null,dispatch:!0,prefix:``},j=class{constructor(e,t={}){this.controller=e;let{element:n,visible:r,dispatch:i,prefix:a}=Object.assign({},ue,t);this.element=n||e.element,this.visibleOnly=typeof r==`boolean`?r:A.visibleOnly,this.visibleCallback=typeof r==`string`?r:null,this.notify=!!i,this.prefix=typeof a==`string`&&a?a:e.identifier}get visible(){return this.element instanceof HTMLElement?this.visibleOnly?le(this.element)&&this.isVisible(this.element):!0:!1}isVisible(e){if(this.visibleCallback){let t=this.findCallback(this.visibleCallback);if(typeof t==`function`)return t(e)}return e instanceof HTMLElement?!e.hasAttribute(`hidden`):!1}dispatch(e,{target:t=null,prefix:n=null,detail:r=null}={}){if(this.notify)return this.controller.dispatch(e,{target:t||this.element,prefix:n||this.prefix,detail:r})}findCallback(e){if(typeof e!=`string`)return;let t=this,n=e.split(`.`).reduce((e,t)=>e&&e[t],t.controller);if(typeof n==`function`)return n.bind(t.controller);let r=e.split(`.`).reduce((e,t)=>e&&e[t],t);if(typeof r==`function`)return r.bind(t)}async awaitCallback(e,...t){if(typeof e==`string`&&(e=this.findCallback(e)),typeof e==`function`){let n=e(...t);return n instanceof Promise?await n:n}}},de={normalize(e){return typeof e==`string`?e:``},validate(){return!0}};function fe(e){let t=0,n=!1;for(let r=e.length-1;r>=0;r--){let i=parseInt(e[r],10);n&&(i*=2,i>9&&(i-=9)),t+=i,n=!n}return t%10==0}var pe=/\D/g,me=/^\d{13,19}$/,he=/(.{4})(?=.)/g,ge={normalize(e){return typeof e==`string`?e.replace(pe,``):``},validate(e){return typeof e!=`string`||!me.test(e)?!1:fe(e)},format(e){return typeof e==`string`?e.replace(he,`$1 `):``}},_e={1:10},M=/\D/g,ve=/^\+\d{7,15}$/,ye={normalize(e){if(typeof e!=`string`)return``;let t=e.trimStart().startsWith(`+`),n=e.replace(M,``);return t?`+${n}`:n},validate(e){if(typeof e!=`string`)return!1;if(ve.test(e))return!0;let t=e.replace(M,``);return Object.values(_e).includes(t.length)},format(e){if(typeof e!=`string`)return``;let t=e.replace(M,``);for(let[e,n]of Object.entries(_e)){if(t.length===n)return`(${t.slice(0,3)}) ${t.slice(3,6)}-${t.slice(6)}`;let r=n+e.length;if(t.length===r&&t.startsWith(e)){let n=t.slice(e.length);return`+${e} (${n.slice(0,3)}) ${n.slice(3,6)}-${n.slice(6)}`}}return e}},be=/[^\d.,-]/g,xe=/^-?\d+(\.\d+)?$/,Se={normalize(e){if(typeof e!=`string`)return``;let t=e.replace(be,``);if(!t)return``;let n=t.lastIndexOf(`,`),r=t.lastIndexOf(`.`);return n>-1&&r>-1?n>r?t.replace(/\./g,``).replace(`,`,`.`):t.replace(/,/g,``):n>-1?t.slice(n+1).length<=2?t.replace(`,`,`.`):t.replace(/,/g,``):t},validate(e){return typeof e==`string`?xe.test(e):!1},format(e,t={}){if(typeof e!=`string`)return``;let n=parseFloat(e);if(isNaN(n))return e;let r=t.locale||`en-US`,i=t.currency||`USD`,a=t.fractionDigits===void 0?{}:{minimumFractionDigits:t.fractionDigits,maximumFractionDigits:t.fractionDigits};try{return new Intl.NumberFormat(r,{style:`currency`,currency:i,...a}).format(n)}catch{return e}}},N=/^\d{4}-\d{2}-\d{2}$/,Ce=/^(\d{1,4})[/\-.](\d{1,2})[/\-.](\d{1,4})$/,we=/\D/g,P={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(N.test(t))return t;let n=t.match(Ce);if(n){let[,e,t,r]=n;if(e.length===4)return`${e}-${t.padStart(2,`0`)}-${r.padStart(2,`0`)}`;if(r.length===4)return`${r}-${e.padStart(2,`0`)}-${t.padStart(2,`0`)}`}let r=t.replace(we,``);if(r.length===8){let e=parseInt(r.slice(0,4),10);return e>=1e3&&e<=9999?`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`:`${r.slice(4,8)}-${r.slice(0,2)}-${r.slice(2,4)}`}return t},validate(e){if(typeof e!=`string`)return!1;let t=P.normalize(e);if(!N.test(t))return!1;let n=new Date(`${t}T00:00:00Z`);return!isNaN(n.getTime())&&n.toISOString().startsWith(t)},format(e,t={}){if(typeof e!=`string`)return``;let n=new Date(`${e}T00:00:00Z`);if(isNaN(n.getTime()))return e;let r=t.locale||`en-US`;try{return new Intl.DateTimeFormat(r,{year:t.year||`numeric`,month:t.month||`2-digit`,day:t.day||`2-digit`,timeZone:t.timeZone||`UTC`}).format(n)}catch{return e}}},Te=/^([01]?\d|2[0-3]):([0-5]\d)$/,F={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(Te.test(t)){let[e,n]=t.split(`:`);return`${String(parseInt(e,10)).padStart(2,`0`)}:${n}`}let n=t.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);if(n){let e=parseInt(n[1],10),t=n[2];return e=n[3].toUpperCase()===`AM`?e===12?0:e:e===12?12:e+12,e>23||parseInt(t,10)>59?``:`${String(e).padStart(2,`0`)}:${t}`}return``},validate(e){return F.normalize(e)!==``},format(e,t={}){if(typeof e!=`string`)return``;let n=e.match(/^(\d{2}):(\d{2})$/);if(!n)return e;let r=parseInt(n[1],10),i=n[2];if(t.format===`h24`)return`${String(r).padStart(2,`0`)}:${i}`;let a=r<12?`AM`:`PM`;return`${r%12||12}:${i} ${a}`}},I={PLAIN:`plain`,CREDIT_CARD:`creditCard`,PHONE:`phone`,CURRENCY:`currency`,DATE:`date`,TIME:`time`},L=new Map([[I.PLAIN,de],[I.CREDIT_CARD,ge],[I.PHONE,ye],[I.CURRENCY,Se],[I.DATE,P],[I.TIME,F]]),R={type:I.PLAIN,options:{}},z=class extends j{static register(e,t){L.set(e,t)}constructor(e,t={}){super(e,t),this.type=t.type??R.type,this.options=t.options??R.options,this.enhance()}enhance(){let e=this,t=L.get(e.type)??L.get(I.PLAIN),n={normalize:n=>t.normalize?.(n,e.options)??(typeof n==`string`?n:``),validate:n=>t.validate?.(n,e.options)??!0,format:n=>t.format?.(n,e.options)??(typeof n==`string`?n:``),mask:n=>t.mask?.(n,e.options)??null,maskable:()=>typeof t.mask==`function`};Object.defineProperty(this.controller,`formatter`,{get(){return n},configurable:!0})}},B=(e,t)=>new z(e,t),Ee=/^\d{4}-\d{2}-\d{2}$/;function V(e){return e instanceof Date&&!isNaN(e)}function H(...e){if(e.length===0)throw`Missing values to parse as date`;if(e.length===1){let t=e[0];if(!t)return;if(typeof t==`string`&&Ee.test(t)){let[e,n,r]=t.split(`-`).map(Number),i=new Date(e,n-1,r);if(V(i))return i}else{let e=new Date(t);if(V(e))return e}}else{let t=new Date(...e);if(V(t))return t}}var U=7,De=12,W=10,G={locales:[`default`],today:``,day:null,month:null,year:null,since:null,till:null,disabledDates:[],disabledWeekdays:[],disabledDays:[],disabledMonths:[],disabledYears:[],firstDayOfWeek:0,onNavigated:`navigated`},Oe=class extends j{constructor(e,t={}){super(e,t);let n=Object.assign({},G,t),{onNavigated:r,since:i,till:a,firstDayOfWeek:o}=n;this.onNavigated=r,this.since=H(i),this.till=H(a),this.firstDayOfWeek=0<=o&&o<7?o:G.firstDayOfWeek;let{disabledDates:s,disabledWeekdays:c,disabledDays:l,disabledMonths:u,disabledYears:d}=n;this.disabledDates=Array.isArray(s)?s:[],this.disabledWeekdays=Array.isArray(c)?c:[],this.disabledDays=Array.isArray(l)?l:[],this.disabledMonths=Array.isArray(u)?u:[],this.disabledYears=Array.isArray(d)?d:[];let{today:f,day:p,month:m,year:h}=n;this.now=H(f)||new Date,typeof h==`number`&&typeof m==`number`&&typeof p==`number`?this.current=H(h,m,p):this.current=this.now,this.build(),this.enhance()}build(){this.daysOfWeek=this.buildDaysOfWeek(),this.daysOfMonth=this.buildDaysOfMonth(),this.monthsOfYear=this.buildMonthsOfYear(),this.yearsOfDecade=this.buildYearsOfDecade()}buildDaysOfWeek(){let e=new Intl.DateTimeFormat(this.localesValue,{weekday:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{weekday:`short`}),n=new Date(`2024-10-06`),r=[];for(let i=this.firstDayOfWeek,a=i+7;i<a;i++){let a=new Date(n);a.setDate(n.getDate()+i),r.push({date:a,value:a.getDay(),long:e.format(a),short:t.format(a)})}return r}buildDaysOfMonth(){let e=this.month,t=this.year,n=[],r=e=>({current:this.month===e.getMonth()&&this.year===e.getFullYear(),date:e,value:e.getDate(),month:e.getMonth(),year:e.getFullYear(),iso:e.toISOString()}),i=new Date(t,e).getDay(),a=this.firstDayOfWeek-i;for(let i=a>0?a-7:a;i<0;i++){let a=new Date(t,e,i+1);n.push(r(a))}let o=new Date(t,e+1,0).getDate();for(let i=1;i<=o;i++){let a=new Date(t,e,i);n.push(r(a))}let s=n.length%U,c=s===0?0:U-s;for(let i=1;i<=c;i++){let a=new Date(t,e+1,i);n.push(r(a))}return n}buildMonthsOfYear(){let e=new Intl.DateTimeFormat(this.localesValue,{month:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{month:`short`}),n=new Intl.DateTimeFormat(this.localesValue,{month:`numeric`}),r=[];for(let i=0;i<De;i++){let a=new Date(this.year,i),o=new Date(this.year,i,1),s=new Date(this.year,i+1,0),c=t.format(a),l=e.format(a),u=this.since&&s<this.since||this.till&&o>this.till,d=this.disabledMonths.some(e=>i==e||c===e||l===e);r.push({date:a,value:a.getMonth(),long:l,short:c,numeric:n.format(a),disabled:u||d})}return r}buildYearsOfDecade(){let e=Math.floor(this.year/W)*W,t=[];for(let n=e-1;n<=e+W;n++){let r=n<e||n>e+W-1,i=this.since&&n<this.since.getFullYear()||this.till&&n>this.till.getFullYear(),a=this.disabledYears.some(e=>n==e);t.push({value:n,current:n===this.year,disabled:r||i||a})}return t}get today(){return this.now}set today(e){if(!V(e))return;let t=this.month??e.getMonth(),n=this.year??e.getFullYear(),r=t==e.getMonth()&&n==e.getFullYear()?e.getDate():1;this.now=new Date(n,t,r)}get current(){return typeof this.year==`number`&&typeof this.month==`number`&&typeof this.day==`number`?H(this.year,this.month,this.day):null}set current(e){V(e)&&(this.day=e.getDate(),this.month=e.getMonth(),this.year=e.getFullYear())}navigate=async e=>{if(!V(e))return;let t=this.current,n=e.toISOString(),r=t.toISOString();this.dispatch(`navigate`,{detail:{from:r,to:n}}),this.current=e,this.build(),await this.awaitCallback(this.onNavigated,{from:r,to:n}),this.dispatch(`navigated`,{detail:{from:r,to:n}})};step=async(e,t)=>{if(t===0)return;let n=this.current;switch(e){case`year`:n.setFullYear(n.getFullYear()+t);break;case`month`:n.setMonth(n.getMonth()+t);break;case`day`:n.setDate(n.getDate()+t);break;default:return}await this.navigate(n)};isDisabled=e=>{if(!V(e))return!1;if(this.disabledDates.length){let t=e.getTime();for(let e of this.disabledDates)if(t===new Date(e).getTime())return!0}if(this.disabledWeekdays.length){let t=e.getDay(),n=this.daysOfWeek,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledWeekdays)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledDays.length){let t=e.getDate();for(let e of this.disabledDays)if(t==e)return!0}if(this.disabledMonths.length){let t=e.getMonth(),n=this.monthsOfYear,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledMonths)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledYears.length){let t=e.getFullYear();for(let e of this.disabledYears)if(t==e)return!0}return!1};isWithinRange=e=>{if(!V(e))return!1;let t=!0;return this.since&&(t&&=e>=this.since),this.till&&(t&&=e<=this.till),t};enhance(){let e=this;Object.assign(this.controller,{get calendar(){return{get today(){return e.today},get current(){return e.current},get day(){return e.day},get month(){return e.month},get year(){return e.year},get since(){return e.since},get till(){return e.till},get firstDayOfWeek(){return e.firstDayOfWeek},get disabledDates(){return e.disabledDates},get disabledWeekdays(){return e.disabledWeekdays},get disabledDays(){return e.disabledDays},get disabledMonths(){return e.disabledMonths},get disabledYears(){return e.disabledYears},get daysOfWeek(){return e.daysOfWeek},get daysOfMonth(){return e.daysOfMonth},get monthsOfYear(){return e.monthsOfYear},get yearsOfDecade(){return e.yearsOfDecade},navigate:async t=>await e.navigate(t),step:async(t,n)=>await e.step(t,n),isDisabled:t=>e.isDisabled(t),isWithinRange:t=>e.isWithinRange(t)}}})}},K=(e,t)=>new Oe(e,t),ke=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this),this.onSelect=t.onSelect||null}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){if(!(e.target instanceof HTMLElement))return;e.preventDefault();let t=e.target instanceof HTMLTimeElement?e.target.parentElement:e.target;if(t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;let n=e.target instanceof HTMLTimeElement?e.target:e.target.querySelector(`time`);if(!n)return;let r=H(n.dateTime);if(!r)return;this.dispatch(`selecting`,{target:t});let i=r.toISOString();this.onSelect?this.awaitCallback(this.onSelect,i):this.dispatch(`selected`,{detail:{epoch:r.getTime(),iso:i}})}},Ae=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this)}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){let t=e.target.closest(`button[data-month]`);if(!t||t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;e.preventDefault();let n=parseInt(t.dataset.month,10);isNaN(n)||this.dispatch(`selected`,{detail:{month:n}})}},je=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this)}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){let t=e.target.closest(`button[data-year]`);if(!t||t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;e.preventDefault();let n=parseInt(t.dataset.year,10);isNaN(n)||this.dispatch(`selected`,{detail:{year:n}})}},q=(e,t)=>new ke(e,t),J=(e,t)=>new Ae(e,t),Y=(e,t)=>new je(e,t),X={content:null,url:``,reload:`never`,stale:3600,onLoad:`canLoad`,onLoaded:`contentLoaded`},Me=class extends j{constructor(e,t={}){super(e,t);let n=Object.assign({},X,t),{content:r,url:i,reload:a,stale:o}=n;this.content=r,this.url=i,this.reload=typeof a==`string`?a:X.reload,this.stale=typeof o==`number`?o:X.stale;let{onLoad:s,onLoaded:c}=n;this.onLoad=s,this.onLoaded=c,this._requestor=new T,this.enhance()}get reloadable(){switch(this.reload){case`never`:return!1;case`always`:return!0;default:{let e=H(this.loadedAt);return e&&new Date-e>this.stale*1e3}}}contentLoadable=({url:e})=>!!e;contentLoader=async()=>``;remoteContentLoader=async e=>(await this._requestor.request(e)).text();load=async()=>{if(this.loadedAt&&!this.reloadable)return;let e=this.findCallback(this.onLoad),t=await this.awaitCallback(e||this.contentLoadable,{url:this.url});if(this.dispatch(`load`,{detail:{url:this.url}}),!t)return;this.dispatch(`loading`,{detail:{url:this.url}});let n=this.url?await this.remoteContentLoader(this.url):await this.contentLoader();n&&(await this.awaitCallback(this.onLoaded,{url:this.url,content:n}),this.loadedAt=new Date().getTime(),this.dispatch(`loaded`,{detail:{url:this.url,content:n}}))};enhance(){let e=this;Object.assign(this.controller,{load:e.load.bind(e)})}},Ne=(e,t)=>new Me(e,t),Z=class extends j{observe(e){this._handler=e,this.events.forEach(t=>window.addEventListener(t,e,!0))}unobserve(){this._handler&&this.events.forEach(e=>window.removeEventListener(e,this._handler,!0))}enhance(){let e=this,t=this.controller.disconnect?.bind(this.controller)||(()=>{});this.controller.disconnect=()=>{e.unobserve(),t()}}},Pe={trigger:null,events:[`click`],onDismissed:`dismissed`},Fe=class extends Z{constructor(e,t={}){super(e,t);let{trigger:n,events:r,onDismissed:i}=Object.assign({},Pe,t);this.onDismissed=i,this.trigger=n||this.element,this.events=r,this.enhance(),this.observe(this.dismiss)}dismiss=async e=>{let{target:t}=e;t instanceof HTMLElement&&(this.element.contains(t)||this.visible&&(this.dispatch(`dismiss`),await this.awaitCallback(this.onDismissed,{target:this.trigger}),this.dispatch(`dismissed`)))}},Q=(e,t)=>new Fe(e,t),Ie={anchor:null,events:[`click`],placement:`bottom`,alignment:`start`,onFlipped:`flipped`,ariaRole:null,respectMotion:!0},Le=class extends Z{constructor(e,t={}){super(e,t);let{anchor:n,events:r,placement:i,alignment:a,onFlipped:o,ariaRole:s,respectMotion:c}=Object.assign({},Ie,t);this.anchor=n,this.events=r,this.placement=i,this.alignment=a,this.onFlipped=o,this.ariaRole=s,this.respectMotion=c,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.anchor&&this.element&&C({trigger:this.anchor,target:this.element,role:this.ariaRole}),this.enhance(),this.observe(this.flip)}flip=async()=>{if(!this.visible)return;this.dispatch(`flip`),window.getComputedStyle(this.element).position!=`absolute`&&(this.element.style.position=`absolute`);let e=this.flippedRect(this.anchor.getBoundingClientRect(),this.element.getBoundingClientRect());this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``;for(let[t,n]of Object.entries(e))this.element.style[t]=n;await this.awaitCallback(this.onFlipped,{target:this.element,placement:e}),this.dispatch(`flipped`,{detail:{placement:e}})};flippedRect(e,t){let n=this.quadrumRect(e,k()),r=[this.placement,D[this.placement]],i={};for(;!Object.keys(i).length&&r.length>0;){let a=r.shift();if(!this.biggerRectThan(n[a],t))continue;let o=this.quadrumPlacement(e,a,t),s=this.quadrumAlignment(e,a,o);i.top=`${s.top+window.scrollY}px`,i.left=`${s.left+window.scrollX}px`}return Object.keys(i).length||(i.top=``,i.left=``),i}quadrumRect(e,t){return{left:O({x:t.x,y:t.y,width:e.x-t.x,height:t.height}),right:O({x:e.x+e.width,y:t.y,width:t.width-(e.x+e.width),height:t.height}),top:O({x:t.x,y:t.y,width:t.width,height:e.y-t.y}),bottom:O({x:t.x,y:e.y+e.height,width:t.width,height:t.height-(e.y+e.height)})}}quadrumPlacement(e,t,n){switch(t){case`top`:return O({x:n.x,y:e.y-n.height,width:n.width,height:n.height});case`bottom`:return O({x:n.x,y:e.y+e.height,width:n.width,height:n.height});case`left`:return O({x:e.x-n.width,y:n.y,width:n.width,height:n.height});case`right`:return O({x:e.x+e.width,y:n.y,width:n.width,height:n.height});default:throw`Unable place at the quadrum, ${t}`}}quadrumAlignment(e,t,n){switch(t){case`top`:case`bottom`:{let t=e.x;return this.alignment===`center`?t=e.x+e.width/2-n.width/2:this.alignment===`end`&&(t=e.x+e.width-n.width),O({x:t,y:n.y,width:n.width,height:n.height})}case`left`:case`right`:{let t=e.y;return this.alignment===`center`?t=e.y+e.height/2-n.height/2:this.alignment===`end`&&(t=e.y+e.height-n.height),O({x:n.x,y:t,width:n.width,height:n.height})}default:throw`Unable align at the quadrum, ${t}`}}biggerRectThan(e,t){return e.height>=t.height&&e.width>=t.width}enhance(){super.enhance(),this.controller.flip=this.flip}},Re=(e,t)=>new Le(e,t),ze={events:[`resize`],boundaries:[`top`,`left`,`right`],onShifted:`shifted`,respectMotion:!0},Be=class extends Z{constructor(e,t={}){super(e,t);let{onShifted:n,events:r,boundaries:i,respectMotion:a}=Object.assign({},ze,t);this.onShifted=n,this.events=r,this.boundaries=i,this.respectMotion=a,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.enhance(),this.observe(this.shift)}shift=async()=>{if(!this.visible)return;this.dispatch(`shift`);let e=this.overflowRect(this.element.getBoundingClientRect(),this.elementTranslations(this.element)),t=e.left||e.right||0,n=e.top||e.bottom||0;this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``,this.element.style.transform=`translate(${t}px, ${n}px)`,await this.awaitCallback(this.onShifted,e),this.dispatch(`shifted`,{detail:e})};overflowRect(e,t){let n={},r=k(),i=O({x:e.x-t.x,y:e.y-t.y,width:e.width,height:e.height});for(let e of this.boundaries){let t=this.directionDistance(i,e,r),a=D[e];t<0?i[a]+t>=r[a]&&!n[a]&&(n[e]=t):n[e]=``}return n}directionDistance(e,t,n){switch(t){case`top`:case`left`:return e[t]-n[t];case`bottom`:case`right`:return n[t]-e[t];default:throw`Invalid direction to calcuate distance, ${t}`}}elementTranslations(e){let t=window.getComputedStyle(e),n=t.transform||t.webkitTransform||t.mozTransform;if(n===`none`||n===void 0)return{x:0,y:0};let r=n.includes(`3d`)?`3d`:`2d`,i=n.match(/matrix.*\((.+)\)/)[1].split(`, `);return r===`2d`?{x:Number(i[4]),y:Number(i[5])}:{x:0,y:0}}enhance(){super.enhance(),this.controller.shift=this.shift}},Ve=(e,t)=>new Be(e,t),He={visibility:`visibility`,onShown:`shown`,onHidden:`hidden`},Ue=class extends j{constructor(e,t={}){let{visibility:n,onShown:r,onHidden:i,activator:a}=Object.assign({},He,t),o=typeof n==`string`?n:He.namespace,s=typeof t.visible==`string`?t.visible:`isVisible`;(typeof t.visible!=`boolean`||t.visible)&&(t.visible=`${o}.${s}`),super(e,t),this.visibility=o,this.visibilityResolver=s,this.onShown=r,this.onHidden=i,this.activator=a instanceof HTMLElement?a:null,this.enhance(),this.element instanceof HTMLElement&&this.activate(this.isVisible(this.element))}isVisible(e){if(!(e instanceof HTMLElement))return!1;let t=A.hiddenClass;return t?!e.classList.contains(t):!e.hasAttribute(`hidden`)}toggle(e,t){if(!(e instanceof HTMLElement))return;let n=A.hiddenClass;n?t?e.classList.remove(n):e.classList.add(n):y(e,!t)}activate(e){this.activator&&_(this.activator,e)}async show(){!(this.element instanceof HTMLElement)||this.isVisible(this.element)||(this.dispatch(`show`),this.toggle(this.element,!0),this.activate(!0),await this.awaitCallback(this.onShown,{target:this.element}),this.dispatch(`shown`))}async hide(){!(this.element instanceof HTMLElement)||!this.isVisible(this.element)||(this.dispatch(`hide`),this.toggle(this.element,!1),this.activate(!1),await this.awaitCallback(this.onHidden,{target:this.element}),this.dispatch(`hidden`))}enhance(){let e=this,t={show:e.show.bind(e),hide:e.hide.bind(e)};Object.defineProperty(t,`visible`,{get(){return e.isVisible(e.element)}}),Object.defineProperty(t,this.visibilityResolver,{value:e.isVisible.bind(e)}),Object.defineProperty(this.controller,this.visibility,{get(){return t}})}},We=(e,t)=>new Ue(e,t),Ge=4,Ke=class extends t.Controller{static targets=[`grid`];static values={current:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``}};initialize(){this.selector=Y(this),K(this,{today:this.todayValue,year:this.currentValue||void 0,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}currentValueChanged(){!this.calendar||!this.hasCurrentValue||this.calendar.navigate(this.currentDate)}selectedValueChanged(){if(!this.hasGridTarget)return;let e=H(this.selectedValue),t=e?e.getFullYear():null;this.gridTarget.querySelectorAll(`button[data-year]`).forEach(e=>{let n=parseInt(e.dataset.year,10);e.setAttribute(`aria-selected`,n===t?`true`:`false`)})}navigate(e){this.currentValue=e.getFullYear()}step(e,t){return this.calendar.step(e,t)}navigated(){this.drawGrid()}get currentDate(){return new Date(this.currentValue,0,1)}drawGrid(){if(!this.hasGridTarget)return;let{yearsOfDecade:e}=this.calendar,t=this.calendar.today.getFullYear(),n=H(this.selectedValue),r=n?n.getFullYear():null,i=[];for(let n of e){let e=document.createElement(`button`);e.type=`button`,e.textContent=n.value,e.dataset.year=n.value,e.setAttribute(`role`,`gridcell`),e.setAttribute(`aria-selected`,n.value===r?`true`:`false`),n.value===t&&e.setAttribute(`aria-current`,`year`),n.disabled&&e.setAttribute(`aria-disabled`,`true`),i.push(e)}let a=document.createElement(`div`);a.setAttribute(`role`,`rowgroup`);for(let e=0;e<i.length;e+=Ge){let t=document.createElement(`div`);t.setAttribute(`role`,`row`);for(let n of i.slice(e,e+Ge))t.appendChild(n);a.appendChild(t)}this.gridTarget.replaceChildren(a)}},qe=class extends t.Controller{initialize(){this.selector=Y(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},Je=class extends t.Controller{static targets=[`daysOfWeek`,`daysOfMonth`];static classes=[`dayOfWeek`,`dayOfMonth`,`dayOfOtherMonth`,`row`];static values={year:Number,month:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``},locales:{type:Array,default:[`default`]},weekdayFormat:{type:String,default:`short`},dayFormat:{type:String,default:`numeric`},daysOfOtherMonth:{type:Boolean,default:!1}};initialize(){this.selector=q(this,{onSelect:`select`}),K(this,{today:this.todayValue,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}yearValueChanged(){!this.calendar||!this.hasYearValue||this._scheduleNavigate()}monthValueChanged(){!this.calendar||!this.hasYearValue||this._scheduleNavigate()}_scheduleNavigate(){this._navigatePending||(this._navigatePending=!0,queueMicrotask(async()=>{this._navigatePending=!1,await this.calendar.navigate(this.currentDate),this.navigated()}))}selectedValueChanged(){if(!this.hasDaysOfMonthTarget||(this.daysOfMonthTarget.querySelectorAll(`[aria-selected]`).forEach(e=>{e.setAttribute(`aria-selected`,`false`)}),!this.selectedValue))return;let e=H(this.selectedValue);if(!e)return;let t=this.daysOfMonthTarget.querySelector(`time[datetime="${e.toISOString()}"]`);t&&t.closest(`[aria-selected]`)?.setAttribute(`aria-selected`,`true`)}navigate(e){this.yearValue=e.getFullYear(),this.monthValue=e.getMonth()}step(e,t){return this.calendar.step(e,t)}select(e){let t=H(e);t&&(this.selectedValue=e,(t.getMonth()!==this.calendar.month||t.getFullYear()!==this.calendar.year)&&this.calendar.navigate(t),this.dispatch(`selected`,{detail:{epoch:t.getTime(),iso:e}}))}navigated(){this.drawDaysOfWeek(),this.drawDaysOfMonth(),this.selectedValueChanged()}get currentDate(){return new Date(this.yearValue,this.monthValue,1)}createDayElement(e,{selectable:t=!1,disabled:n=!1}={}){let r=document.createElement(t?`button`:`div`);return r.tabIndex=-1,e?r.textContent=e:r.setAttribute(`aria-hidden`,`true`),n&&(r instanceof HTMLButtonElement?r.disabled=!0:r.setAttribute(`aria-disabled`,`true`)),r}drawDaysOfWeek(){if(!this.hasDaysOfWeekTarget)return;let e=new Intl.DateTimeFormat(this.localesValue,{weekday:this.weekdayFormatValue}),t=[];for(let n of this.calendar.daysOfWeek){let r=this.createDayElement(e.format(n.date));r.setAttribute(`role`,`columnheader`),r.title=n.long,this.hasDayOfWeekClass&&r.classList.add(...this.dayOfWeekClasses),t.push(r)}let n=document.createElement(`div`);n.setAttribute(`role`,`row`),this.hasRowClass&&n.classList.add(...this.rowClasses),n.replaceChildren(...t),this.daysOfWeekTarget.replaceChildren(n)}drawDaysOfMonth(){if(!this.hasDaysOfMonthTarget)return;let e=this.calendar.today,t=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),n=[];for(let e of this.calendar.daysOfMonth){let r=this.calendar.isDisabled(e.date)||!this.calendar.isWithinRange(e.date),i=!e.current&&this.daysOfOtherMonthValue&&!r,a=e.current||this.daysOfOtherMonthValue?e.value:``,o=this.createDayElement(a,{selectable:e.current||i,disabled:e.current?r:!i});t===e.date.getTime()&&o.setAttribute(`aria-current`,`date`),(e.current||this.daysOfOtherMonthValue)&&o.setAttribute(`aria-selected`,``),!e.current&&this.daysOfOtherMonthValue&&this.hasDayOfOtherMonthClass?o.classList.add(...this.dayOfOtherMonthClasses):this.hasDayOfMonthClass&&o.classList.add(...this.dayOfMonthClasses);let s=document.createElement(`time`);s.dateTime=e.iso,o.appendChild(s),n.push(o)}let r=[];for(let e=0;e<n.length;e+=7){let t=document.createElement(`div`);t.setAttribute(`role`,`row`),this.hasRowClass&&t.classList.add(...this.rowClasses);for(let r of n.slice(e,e+7))r.setAttribute(`role`,`gridcell`),t.appendChild(r);r.push(t)}this.daysOfMonthTarget.replaceChildren(...r)}},Ye=class extends t.Controller{initialize(){this.selector=q(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},Xe=4,Ze=class extends t.Controller{static targets=[`grid`];static values={current:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``},locales:{type:Array,default:[`default`]},monthFormat:{type:String,default:`short`}};initialize(){this.selector=J(this),K(this,{today:this.todayValue,year:this.currentValue||void 0,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}currentValueChanged(){!this.calendar||!this.hasCurrentValue||this.calendar.navigate(this.currentDate)}selectedValueChanged(){if(!this.hasGridTarget)return;let e=H(this.selectedValue);this.gridTarget.querySelectorAll(`button[data-month]`).forEach(t=>{let n=parseInt(t.dataset.month,10)-1;t.setAttribute(`aria-selected`,e&&e.getMonth()===n?`true`:`false`)})}navigate(e){this.currentValue=e.getFullYear()}step(e,t){return this.calendar.step(e,t)}navigated(){this.drawGrid()}get currentDate(){return new Date(this.currentValue,0,1)}drawGrid(){if(!this.hasGridTarget)return;let{year:e,monthsOfYear:t}=this.calendar,n=this.calendar.today,r=H(this.selectedValue),i=[],a=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue});for(let o of t){let t=document.createElement(`button`);t.type=`button`,t.textContent=a.format(o.date),t.dataset.month=o.value+1,t.setAttribute(`role`,`gridcell`);let s=r&&r.getMonth()===o.value;t.setAttribute(`aria-selected`,s?`true`:`false`),o.value===n.getMonth()&&e===n.getFullYear()&&t.setAttribute(`aria-current`,`month`),o.disabled&&t.setAttribute(`aria-disabled`,`true`),i.push(t)}let o=document.createElement(`div`);o.setAttribute(`role`,`rowgroup`);for(let e=0;e<i.length;e+=Xe){let t=document.createElement(`div`);t.setAttribute(`role`,`row`);for(let n of i.slice(e,e+Xe))t.appendChild(n);o.appendChild(t)}this.gridTarget.replaceChildren(o)}},Qe=class extends t.Controller{initialize(){this.selector=J(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},$e=class extends t.Controller{static targets=[`source`];static values={contentType:{type:String,default:`text/plain`}};onPaste(e){let t=e.clipboardData?.getData(this.contentTypeValue)??``,n=Array.from(e.clipboardData?.types??[]);e.preventDefault(),this.dispatch(`pasted`,{detail:{text:t,types:n},bubbles:!0})}async copy(e){let t=e.params?.text??(this.hasSourceTarget?this.sourceTarget.value??this.sourceTarget.textContent??``:``);try{await navigator.clipboard.writeText(t),this.dispatch(`copied`,{detail:{text:t},bubbles:!0})}catch(e){this.dispatch(`copy-failed`,{detail:{error:e},bubbles:!0})}}},$=[`month`,`year`,`decade`],et=class extends t.Controller{static targets=[`previous`,`next`,`day`,`month`,`year`,`viewTitle`];static outlets=[`calendar-month`,`calendar-year`,`calendar-decade`];static values={date:String,view:{type:String,default:`month`},locales:{type:Array,default:[`default`]},dayFormat:{type:String,default:`numeric`},monthFormat:{type:String,default:`long`},yearFormat:{type:String,default:`numeric`}};initialize(){this.previous=this.previous.bind(this),this.next=this.next.bind(this)}async calendarMonthOutletConnected(){if(this.dateValue){let e=H(this.dateValue);e&&await this.calendarMonthOutlet.calendar.navigate(e)}this.draw()}onDaySelect(e){this.dateValue=e.detail.iso,this.draw(),this.dispatch(`selected`,{detail:{value:e.detail.iso},bubbles:!0})}zoomOut(){let e=$.indexOf(this.viewValue);e<$.length-1&&(this.viewValue=$[e+1],this.draw())}async onMonthSelect(e){let{month:t}=e.detail;if(!this.hasCalendarMonthOutlet)return;let{year:n}=this.calendarMonthOutlet.calendar;await this.calendarMonthOutlet.calendar.navigate(new Date(n,t-1,1)),this.viewValue=`month`,this.draw()}async onYearSelect(e){let{year:t}=e.detail;if(!this.hasCalendarMonthOutlet)return;let{month:n}=this.calendarMonthOutlet.calendar;await this.calendarMonthOutlet.calendar.navigate(new Date(t,n,1)),this.hasCalendarYearOutlet&&this.calendarYearOutlet.navigate(this.calendarMonthOutlet.calendar.current),this.viewValue=`year`,this.draw()}previousTargetConnected(e){e.addEventListener(`click`,this.previous)}previousTargetDisconnected(e){e.removeEventListener(`click`,this.previous)}async previous(){await this.calendarMonthOutlet.calendar.step(...this.stepArgs(-1)),this.syncOutletValues(),this.draw()}nextTargetConnected(e){e.addEventListener(`click`,this.next)}nextTargetDisconnected(e){e.removeEventListener(`click`,this.next)}async next(){await this.calendarMonthOutlet.calendar.step(...this.stepArgs(1)),this.syncOutletValues(),this.draw()}draw(){this.drawDay(),this.drawMonth(),this.drawYear(),this.drawViewTitle(),this.drawView()}drawDay(){if(!this.hasDayTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t,day:n}=this.calendarMonthOutlet.calendar;this.dayTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{day:this.dayFormatValue}).format(new Date(e,t,n))}drawMonth(){if(!this.hasMonthTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.monthTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue}).format(new Date(e,t))}drawYear(){if(!this.hasYearTarget||!this.hasCalendarMonthOutlet)return;let{year:e}=this.calendarMonthOutlet.calendar;this.yearTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{year:this.yearFormatValue}).format(new Date(e,0))}drawViewTitle(){if(!this.hasViewTitleTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.viewTitleTarget.textContent=this.viewTitleLabel(e,t)}syncOutletValues(){if(!this.hasCalendarMonthOutlet)return;let{current:e}=this.calendarMonthOutlet.calendar;e&&(this.hasCalendarYearOutlet&&this.calendarYearOutlet.navigate(e),this.hasCalendarDecadeOutlet&&this.calendarDecadeOutlet.navigate(e))}stepArgs(e){return this.viewValue===`year`?[`year`,e]:this.viewValue===`decade`?[`year`,e*10]:[`month`,e]}viewTitleLabel(e,t){if(this.viewValue===`year`)return String(e);if(this.viewValue===`decade`){let t=Math.floor(e/10)*10;return`${t}–${t+9}`}return new Intl.DateTimeFormat(this.localesValue,{month:`long`,year:`numeric`}).format(new Date(e,t))}drawView(){let e=this.viewValue===`month`,t=this.viewValue===`year`,n=this.viewValue===`decade`;if(this.hasCalendarMonthOutlet){let t=this.calendarMonthOutlet;t.hasDaysOfWeekTarget&&(t.daysOfWeekTarget.hidden=!e),t.hasDaysOfMonthTarget&&(t.daysOfMonthTarget.hidden=!e)}this.hasCalendarYearOutlet&&(this.calendarYearOutletElement.hidden=!t),this.hasCalendarDecadeOutlet&&(this.calendarDecadeOutletElement.hidden=!n)}},tt=class extends t.Controller{static targets=[`listbox`,`loading`,`empty`];static values={url:{type:String,default:``},field:{type:String,default:`q`},delay:{type:Number,default:300}};initialize(){this._requestor=new T}connect(){this.hasListboxTarget&&(this.listboxNav=new f(this.listboxTarget))}disconnect(){this._requestor.cancel()}onSelect(e){let t=e.target.closest(`[role="option"]`);!t||t.getAttribute(`aria-disabled`)===`true`||this.select(t.dataset.value??``)}select(e){let t=this.listboxTarget.querySelectorAll(`[role="option"]`);t.forEach(e=>e.setAttribute(`aria-selected`,`false`));let n=[...t].find(t=>t.dataset.value===e);n&&n.setAttribute(`aria-selected`,`true`),this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){this.listboxNav?.handleKeyDown(e)}filter(e){if(this.urlValue){let t=new URL(this.urlValue,window.location.href);t.searchParams.set(this.fieldValue,e),this.setLoading(!0),this._requestor.schedule(()=>this._requestor.request(t).then(e=>e.text()).then(e=>{this.listboxTarget.innerHTML=e,this.setEmpty(this.listboxTarget.querySelectorAll(`[role="option"]`).length===0)}).catch(e=>{e.name!==`AbortError`&&console.error(`[combobox-dropdown] fetch failed`,e)}).finally(()=>this.setLoading(!1)),this.delayValue)}else{let t=E(this.listboxTarget,e);this.setEmpty(t===0)}}showAll(){this.listboxTarget.querySelectorAll(`[role="option"]`).forEach(e=>e.hidden=!1),this.setEmpty(!1)}setLoading(e){this.hasLoadingTarget&&(this.loadingTarget.hidden=!e)}setEmpty(e){this.hasEmptyTarget&&(this.emptyTarget.hidden=!e)}},nt=class extends t.Controller{static targets=[`hour`,`minute`,`period`];connect(){this.select(this.toH24())}onSelect(e){let t=e.target.closest(`[role="option"]`);t&&(t.closest(`[role="listbox"]`).querySelectorAll(`[role="option"]`).forEach(e=>e.setAttribute(`aria-selected`,`false`)),t.setAttribute(`aria-selected`,`true`),this.select(this.toH24()))}select(e){e&&this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){[`ArrowUp`,`ArrowDown`].includes(e.key)&&(e.preventDefault(),this.step(e.currentTarget,e.key===`ArrowDown`?1:-1))}step(e,t){let n=[...e.querySelectorAll(`[role="option"]`)],r=e.querySelector(`[aria-selected="true"]`),i=n.indexOf(r),a=t>0?n[Math.min(i+1,n.length-1)]:n[Math.max(i-1,0)];!a||a===r||(n.forEach(e=>e.setAttribute(`aria-selected`,`false`)),a.setAttribute(`aria-selected`,`true`),a.scrollIntoView({block:`nearest`}),this.select(this.toH24()))}toH24(){let e=this.selectedValue(this.hourTarget),t=this.selectedValue(this.minuteTarget);if(!e||!t)return null;if(!this.hasPeriodTarget)return`${e}:${t}`;let n=this.selectedValue(this.periodTarget),r=parseInt(e,10);return r=n===`AM`?r===12?0:r:r===12?12:r+12,`${String(r).padStart(2,`0`)}:${t}`}selectedValue(e){return e?.querySelector(`[aria-selected="true"]`)?.dataset.value??null}},rt=class extends t.Controller{static targets=[`trigger`];connect(){Q(this,{trigger:this.hasTriggerTarget?this.triggerTarget:null})}},it=class extends t.Controller{static targets=[`anchor`,`reference`];static values={placement:{type:String,default:`bottom`},alignment:{type:String,default:`start`},role:{type:String,default:`tooltip`}};connect(){if(!this.hasReferenceTarget){console.error(`FlipperController requires a reference target. Add data-flipper-target="reference" to your element.`);return}if(!this.hasAnchorTarget){console.error(`FlipperController requires an anchor target. Add data-flipper-target="anchor" to your element.`);return}Re(this,{element:this.referenceTarget,anchor:this.anchorTarget,placement:this.placementValue,alignment:this.alignmentValue,ariaRole:this.roleValue})}},at=class extends t.Controller{static targets=[`trigger`,`input`];static values={value:String,minLength:{type:Number,default:1}};static outlets=[`combobox-dropdown`];onSelect(e){e.detail?.value!==void 0&&(this.valueValue=e.detail.value)}onInput(e){if(e.target!==this.triggerTarget)return;let t=e.target.value.trim();if(t.length<this.minLengthValue){this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.showAll();return}this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.filter(t)}valueValueChanged(e){this.hasInputTarget&&(this.inputTarget.value=e),this.dispatch(`changed`,{detail:{value:e}})}},ot=class extends t.Controller{static targets=[`input`,`toggle`];static values={format:{type:String,default:`plain`},options:{type:Object,default:{}},revealed:{type:Boolean,default:!1}};connect(){B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle()}formatValueChanged(){this.formatter&&(B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle())}optionsValueChanged(){this.formatter&&(B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()))}revealedValueChanged(){this.formatter&&(this.format(this.readValue()),this.drawToggle())}onChange(e){this.format(e?.detail?.value??``)}format(e){this.formatter&&this.onFormatting(e)}toggle(){!this.formatter.maskable()&&this.formatValue!==`password`||(this.revealedValue=!this.revealedValue)}onPaste(e){let t=e.detail?.text??``;if(!this.formatter||!t)return;let n=this.formatter.normalize(t);this.formatter.validate(n)&&this.format(n)}drawToggle(){if(!this.hasToggleTarget)return;let e=this.formatter?.maskable()||this.formatValue===`password`;this.toggleTarget.hidden=!e,e&&v(this.toggleTarget,this.revealedValue)}readValue(){return this.hasInputTarget?this.inputTarget instanceof HTMLInputElement?this.inputTarget.value:this.inputTarget.textContent:``}onFormatting(e){if(!this.formatter)return;if(this.formatValue===`password`){this.hasInputTarget&&(this.inputTarget.type=this.revealedValue?`text`:`password`);return}let t=this.formatter.normalize(e),n=this.revealedValue||!this.formatter.maskable()?this.formatter.format(t):this.formatter.mask(t);this.hasInputTarget&&(this.inputTarget instanceof HTMLInputElement?this.inputTarget.value=n:this.inputTarget.textContent=n),this.dispatch(`formatted`,{detail:{value:n}})}},st=class extends t.Controller{static targets=[`input`,`clear`];initialize(){this.onInput=this.draw.bind(this),this.onEscape=this.handleEscape.bind(this)}connect(){this.draw()}inputTargetConnected(e){e.addEventListener(`input`,this.onInput),e.addEventListener(`keydown`,this.onEscape)}inputTargetDisconnected(e){e.removeEventListener(`input`,this.onInput),e.removeEventListener(`keydown`,this.onEscape)}clear(){this.hasInputTarget&&(this.inputTarget.value=``,this.draw(),this.inputTarget.focus(),this.inputTarget.dispatchEvent(new Event(`input`,{bubbles:!0})))}draw(){!this.hasInputTarget||!this.hasClearTarget||(this.clearTarget.hidden=this.inputTarget.value.length===0)}handleEscape(e){e.key===`Escape`&&this.inputTarget.value!==``&&(e.preventDefault(),this.clear())}},ct=class extends t.Controller{static targets=[`modal`,`overlay`];initialize(){this.onCancel=this.close.bind(this)}connect(){this.hasModalTarget||console.error(`ModalController requires a modal target. Add data-modal-target="modal" to your element.`)}modalTargetConnected(e){this.isNativeDialog=e instanceof HTMLDialogElement,this.isNativeDialog?(e.addEventListener(`cancel`,this.onCancel),e.addEventListener(`click`,this.onBackdropClick)):(this.focusTrap=new o(e,{escapeDeactivates:!0,onDeactivate:()=>this.close()}),Q(this,{element:e}))}modalTargetDisconnected(e){this.isNativeDialog&&(e.removeEventListener(`cancel`,this.onCancel),e.removeEventListener(`click`,this.onBackdropClick))}dismissed=()=>{this.close()};open(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.previouslyFocused=document.activeElement,this.modalTarget.showModal();else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!1,document.body.style.overflow=`hidden`,this.focusTrap&&this.focusTrap.activate()}m(`Modal opened`)}}close(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.modalTarget.close(),this.previouslyFocused&&this.previouslyFocused.isConnected&&setTimeout(()=>{this.previouslyFocused.focus()},0);else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!0,document.body.style.overflow=``,this.focusTrap&&this.focusTrap.deactivate()}m(`Modal closed`)}}onBackdropClick=e=>{let t=this.modalTarget.getBoundingClientRect();(e.clientY<t.top||e.clientY>t.bottom||e.clientX<t.left||e.clientX>t.right)&&this.close()}},lt=class extends t.Controller{static targets=[`content`];connect(){Ve(this,{element:this.hasContentTarget?this.contentTarget:null})}},ut=class extends t.Controller{static targets=[`trigger`,`panel`,`template`,`loader`];static classes=[`hidden`];static values={url:String,loadedAt:String,reload:{type:String,default:`never`},staleAfter:{type:Number,default:3600},closeOnSelect:{type:Boolean,default:!0},announceOpen:{type:String,default:`Panel opened`},announceClose:{type:String,default:`Panel closed`}};connect(){Ne(this,{element:this.hasPanelTarget?this.panelTarget:null,url:this.hasUrlValue?this.urlValue:null}),this.hasPanelTarget&&(We(this,{element:this.panelTarget,activator:this.hasTriggerTarget?this.triggerTarget:null}),Q(this)),this.hasLoaderTarget&&We(this,{element:this.loaderTarget,visibility:`contentLoaderVisibility`})}async dismissed(){await this.close()}async open(){this.hasPanelTarget&&await this.visibility.show()}async close(){this.hasPanelTarget&&await this.visibility.hide()}async toggle(){this.visibility?.visible?await this.close():await this.open()}async closeOnSelect(){this.closeOnSelectValue&&await this.close()}async shown(){await this.load(),this.hasPanelTarget&&a(this.panelTarget),m(this.announceOpenValue)}async hidden(){this.hasTriggerTarget&&this.triggerTarget.focus(),m(this.announceCloseValue)}canLoad(){return this.hasPanelTarget&&this.panelTarget.tagName.toLowerCase()===`turbo-frame`?(this.hasUrlValue&&this.panelTarget.setAttribute(`src`,this.urlValue),!1):!0}async contentLoading(){this.hasLoaderTarget&&await this.contentLoaderVisibility.show()}async contentLoaded({content:e}){this.hasPanelTarget&&this.panelTarget.replaceChildren(this.getContentNode(e)),this.hasLoaderTarget&&await this.contentLoaderVisibility.hide()}getContentNode(e){if(typeof e==`string`){let t=document.createElement(`template`);return t.innerHTML=e,document.importNode(t.content,!0)}return document.importNode(e,!0)}contentLoader(){if(this.hasTemplateTarget)return this.templateTarget instanceof HTMLTemplateElement?this.templateTarget.content:this.templateTarget.innerHTML}},dt=class extends t.Controller{static targets=[`trigger`,`detail`,`time`];static values={dateFormat:{type:Object,default:{}}};connect(){this.rovingTabIndex=new d(this.triggerTargets,{orientation:`vertical`}),this.rovingTabIndex.activate()}disconnect(){this.rovingTabIndex?.deactivate(),this.rovingTabIndex=null}toggle(e){let t=e.currentTarget;t.getAttribute(`aria-expanded`)===`true`?this.collapseItem(t):this.expandItem(t)}expand(e){this.expandItem(e.currentTarget)}collapse(e){this.collapseItem(e.currentTarget)}expandItem(e){let t=this.detailTargets.find(t=>t.id===e.getAttribute(`aria-controls`))??null;this.dispatch(`expand`,{detail:{trigger:e,detail:t}}),_(e,!0),t&&(y(t,!1),m(`${e.textContent.trim()} expanded`)),this.dispatch(`expanded`,{detail:{trigger:e,detail:t}})}collapseItem(e){let t=this.detailTargets.find(t=>t.id===e.getAttribute(`aria-controls`))??null;this.dispatch(`collapse`,{detail:{trigger:e,detail:t}}),_(e,!1),t&&(y(t,!0),m(`${e.textContent.trim()} collapsed`)),this.dispatch(`collapsed`,{detail:{trigger:e,detail:t}})}triggerTargetConnected(e){e.hasAttribute(`aria-expanded`)||e.setAttribute(`aria-expanded`,`false`),this.rovingTabIndex?.updateItems(this.triggerTargets)}triggerTargetDisconnected(){this.rovingTabIndex?.updateItems(this.triggerTargets)}timeTargetConnected(e){if(!Object.keys(this.dateFormatValue).length||e.textContent.trim())return;let t=P.format(e.getAttribute(`datetime`),this.dateFormatValue);t&&(e.textContent=t)}};e.ARIA_HASPOPUP_VALUES=b,e.CalendarDecadeController=Ke,e.CalendarDecadeSelectorController=qe,e.CalendarMonthController=Je,e.CalendarMonthSelectorController=Ye,e.CalendarYearController=Ze,e.CalendarYearSelectorController=Qe,e.ClipboardController=$e,e.ComboboxDateController=et,e.ComboboxDropdownController=tt,e.ComboboxTimeController=nt,e.DismisserController=rt,e.FOCUSABLE_SELECTOR=n,e.FORMATTER_TYPES=I,e.FlipperController=it,e.FocusTrap=o,e.Formatter=z,e.InputClearableController=st,e.InputComboboxController=at,e.InputFormatterController=ot,e.ListboxNavigation=f,e.ModalController=ct,e.PannerController=lt,e.PopoverController=ut,e.Requestor=T,e.RovingTabIndex=d,e.TimelineController=dt,e.announce=m,e.connectTriggerToTarget=C,e.disconnectTriggerFromTarget=re,e.ensureId=ee,e.filterOptions=E,e.focusFirst=a,e.fuzzyMatcher=ie,e.generateId=h,e.getFocusableElements=r,e.isActivationKey=c,e.isArrowKey=l,e.isKey=s,e.isVisible=i,e.preventDefault=u,e.setAriaState=g,e.setChecked=te,e.setDisabled=ne,e.setExpanded=_,e.setHidden=y,e.setPressed=v});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@hotwired/stimulus`)):typeof define==`function`&&define.amd?define([`exports`,`@hotwired/stimulus`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.StimulusPlumbersControllers={},e.Stimulus))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=[`a[href]`,`area[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable="false"])`].join(`,`);function r(e){return Array.from(e.querySelectorAll(n)).filter(e=>i(e))}function i(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}function a(e){let t=r(e);return t.length>0?(t[0].focus(),!0):!1}var o=class{constructor(e,t={}){this.container=e,this.previouslyFocused=null,this.options=t,this.isActive=!1}activate(){this.isActive||(this.previouslyFocused=document.activeElement,this.isActive=!0,this.options.initialFocus?this.options.initialFocus.focus():a(this.container),this.container.addEventListener(`keydown`,this.handleKeyDown))}deactivate(){if(!this.isActive)return;this.isActive=!1,this.container.removeEventListener(`keydown`,this.handleKeyDown);let e=this.options.returnFocus||this.previouslyFocused;e&&i(e)&&e.focus(),typeof this.options.onDeactivate==`function`&&this.options.onDeactivate()}handleKeyDown=e=>{if(e.key===`Escape`&&this.options.escapeDeactivates){e.preventDefault(),this.deactivate();return}if(e.key!==`Tab`)return;let t=r(this.container);if(t.length===0)return;let n=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),n.focus())}};function s(e,t){return e.key===t}function c(e){return e.key===`Enter`||e.key===` `}function l(e){return[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`].includes(e.key)}function u(e){e.preventDefault(),e.stopPropagation()}var d=class{constructor(e,t={}){this.items=Array.from(e),this.currentIndex=t.initialIndex??0,this.orientation=t.orientation??`both`,this.wrap=t.wrap??!0,this._handleKeyDown=this._handleKeyDown.bind(this),this._handleClick=this._handleClick.bind(this)}activate(){return this.updateTabIndex(),this.items.forEach(e=>{e.addEventListener(`keydown`,this._handleKeyDown),e.addEventListener(`click`,this._handleClick)}),this}deactivate(){this.items.forEach(e=>{e.removeEventListener(`keydown`,this._handleKeyDown),e.removeEventListener(`click`,this._handleClick)})}updateItems(e){this.deactivate(),this.items=Array.from(e),this.currentIndex=Math.min(this.currentIndex,Math.max(0,this.items.length-1)),this.activate()}setCurrentIndex(e){e>=0&&e<this.items.length&&(this.currentIndex=e,this.updateTabIndex(),this.items[e].focus())}updateTabIndex(){this.items.forEach((e,t)=>{e.tabIndex=t===this.currentIndex?0:-1})}_handleClick(e){let t=this.items.indexOf(e.currentTarget);t!==-1&&(this.currentIndex=t,this.updateTabIndex())}_handleKeyDown(e){let t=this.items.indexOf(e.currentTarget);t!==-1&&t!==this.currentIndex&&(this.currentIndex=t,this.updateTabIndex());let n=this.orientation===`horizontal`?[]:[`ArrowUp`,`ArrowDown`],r=this.orientation===`vertical`?[]:[`ArrowLeft`,`ArrowRight`];if(![...n,...r,`Home`,`End`].includes(e.key))return;e.preventDefault();let i=t===-1?this.currentIndex:t,a;switch(e.key){case`ArrowDown`:case`ArrowRight`:a=this.wrap?(i+1)%this.items.length:Math.min(i+1,this.items.length-1);break;case`ArrowUp`:case`ArrowLeft`:a=this.wrap?(i-1+this.items.length)%this.items.length:Math.max(i-1,0);break;case`Home`:a=0;break;case`End`:a=this.items.length-1;break}this.setCurrentIndex(a)}},f=class{constructor(e,t={}){this.listbox=e,this.itemSelector=t.itemSelector??`[role="option"]:not([aria-disabled="true"]):not([hidden])`,this.wrap=t.wrap??!1,this.orientation=t.orientation??`vertical`}get selectedItem(){return this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`)??null}get currentIndex(){return Array.from(this.listbox.querySelectorAll(this.itemSelector)).indexOf(this.selectedItem)}_selectItem(e){Array.from(this.listbox.querySelectorAll(this.itemSelector)).forEach(e=>e.setAttribute(`aria-selected`,`false`)),e.setAttribute(`aria-selected`,`true`),e.scrollIntoView({block:`nearest`})}step(e){let t=Array.from(this.listbox.querySelectorAll(this.itemSelector));if(!t.length)return;let n=this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`),r=t.indexOf(n),i;i=e>0?this.wrap?t[(r+1)%t.length]:t[Math.min(r+1,t.length-1)]:this.wrap?t[(r-1+t.length)%t.length]:t[Math.max(r-1,0)],!(!i||i===n)&&this._selectItem(i)}handleKeyDown(e){let t=this.orientation===`horizontal`?[]:[`ArrowUp`,`ArrowDown`],n=this.orientation===`vertical`?[]:[`ArrowLeft`,`ArrowRight`];if(![...t,...n,`Home`,`End`,`Enter`,` `].includes(e.key))return;e.preventDefault();let r=Array.from(this.listbox.querySelectorAll(this.itemSelector));switch(e.key){case`ArrowDown`:case`ArrowRight`:this.step(1);break;case`ArrowUp`:case`ArrowLeft`:this.step(-1);break;case`Home`:r.length&&this._selectItem(r[0]);break;case`End`:r.length&&this._selectItem(r[r.length-1]);break;case`Enter`:case` `:this.listbox.querySelector(`${this.itemSelector}[aria-selected="true"]`)?.click();break}}},p=(e,t,n)=>{let r=document.querySelector(`[data-live-region="${e}"]`);return r||(r=document.createElement(`div`),r.className=`sr-only`,r.dataset.liveRegion=e,r.setAttribute(`aria-live`,e),r.setAttribute(`aria-atomic`,t.toString()),r.setAttribute(`aria-relevant`,n),document.body.appendChild(r)),r};function m(e,t={}){let{politeness:n=`polite`,atomic:r=!0,relevant:i=`additions text`}=t,a=p(n,r,i);a.textContent=``,setTimeout(()=>{a.textContent=e},100)}var h=(e=`a11y`)=>`${e}-${Math.random().toString(36).substr(2,9)}`,ee=(e,t=`element`)=>e.id||=h(t),g=(e,t,n)=>{e.setAttribute(t,n.toString())},_=(e,t)=>g(e,`aria-expanded`,t),v=(e,t)=>g(e,`aria-pressed`,t),te=(e,t)=>g(e,`aria-checked`,t),y=(e,t)=>t?e.setAttribute(`hidden`,``):e.removeAttribute(`hidden`);function ne(e,t){g(e,`aria-disabled`,t),t?e.setAttribute(`tabindex`,`-1`):e.removeAttribute(`tabindex`)}var b={menu:`menu`,listbox:`listbox`,tree:`tree`,grid:`grid`,dialog:`dialog`},x=(e,t,n)=>{Object.entries(t).forEach(([t,r])=>{e.setAttribute(t,r),n[t]=r})},S=(e,t,n)=>n||!e.hasAttribute(t);function C({trigger:e,target:t,role:n=null,override:r=!1}){let i={trigger:{},target:{}};if(!e||!t)return i;let a={},o={};if(n&&S(t,`role`,r)&&(o.role=n),t.id&&(S(e,`aria-controls`,r)&&(a[`aria-controls`]=t.id),n===`tooltip`&&S(e,`aria-describedby`,r)&&(a[`aria-describedby`]=t.id)),n&&S(e,`aria-haspopup`,r)){let e=b[n]||`true`;e&&(a[`aria-haspopup`]=e)}return x(t,o,i.target),x(e,a,i.trigger),i}var w=(e,t)=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})};function re({trigger:e,target:t,attributes:n=null}){!e||!t||(w(e,n||[`aria-controls`,`aria-haspopup`,`aria-describedby`]),(!n||n.includes(`role`))&&w(t,[`role`]))}var T=class{constructor(){this._abortController=null,this._timer=null}schedule(e,t){clearTimeout(this._timer),this._timer=setTimeout(e,t)}async request(e,t={}){this._abortController?.abort(),this._abortController=new AbortController;let n=await fetch(e,{...t,signal:this._abortController.signal});if(!n.ok)throw Error(`${n.status}`);return n}cancel(){clearTimeout(this._timer),this._abortController?.abort()}};function ie(e,t){let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&n++;return n===e.length}function ae(e,t){return t.includes(e)}function oe(e,t){return t.startsWith(e)}function se(e){return e===`contains`?ae:e===`prefix`?oe:ie}function ce(e,t){return t===`textContent`?e.textContent?.trim().toLowerCase()??``:(e.getAttribute(t)??``).toLowerCase()}function E(e,t,n={}){let{strategy:r=`fuzzy`,matcher:i,fields:a=[`textContent`]}=n,o=typeof i==`function`?i:se(r),s=t.toLowerCase(),c=0;return e.querySelectorAll(`[role="option"]`).forEach(e=>{let t=a.some(t=>o(s,ce(e,t)));e.hidden=!t,t&&c++}),c}var D={get top(){return`bottom`},get bottom(){return`top`},get left(){return`right`},get right(){return`left`}};function O({x:e,y:t,width:n,height:r}){return{x:e,y:t,width:n,height:r,left:e,right:e+n,top:t,bottom:t+r}}function k(){return O({x:0,y:0,width:window.innerWidth||document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight})}function le(e){if(!(e instanceof HTMLElement))return!1;let t=k(),n=e.getBoundingClientRect(),r=n.top<=t.height&&n.top+n.height>0,i=n.left<=t.width&&n.left+n.width>0;return r&&i}var A={get visibleOnly(){return!0},hiddenClass:null},ue={element:null,visible:null,dispatch:!0,prefix:``},j=class{constructor(e,t={}){this.controller=e;let{element:n,visible:r,dispatch:i,prefix:a}=Object.assign({},ue,t);this.element=n||e.element,this.visibleOnly=typeof r==`boolean`?r:A.visibleOnly,this.visibleCallback=typeof r==`string`?r:null,this.notify=!!i,this.prefix=typeof a==`string`&&a?a:e.identifier}get visible(){return this.element instanceof HTMLElement?this.visibleOnly?le(this.element)&&this.isVisible(this.element):!0:!1}isVisible(e){if(this.visibleCallback){let t=this.findCallback(this.visibleCallback);if(typeof t==`function`)return t(e)}return e instanceof HTMLElement?!e.hasAttribute(`hidden`):!1}dispatch(e,{target:t=null,prefix:n=null,detail:r=null}={}){if(this.notify)return this.controller.dispatch(e,{target:t||this.element,prefix:n||this.prefix,detail:r})}findCallback(e){if(typeof e!=`string`)return;let t=this,n=e.split(`.`).reduce((e,t)=>e&&e[t],t.controller);if(typeof n==`function`)return n.bind(t.controller);let r=e.split(`.`).reduce((e,t)=>e&&e[t],t);if(typeof r==`function`)return r.bind(t)}async awaitCallback(e,...t){if(typeof e==`string`&&(e=this.findCallback(e)),typeof e==`function`){let n=e(...t);return n instanceof Promise?await n:n}}},de={normalize(e){return typeof e==`string`?e:``},validate(){return!0}};function fe(e){let t=0,n=!1;for(let r=e.length-1;r>=0;r--){let i=parseInt(e[r],10);n&&(i*=2,i>9&&(i-=9)),t+=i,n=!n}return t%10==0}var pe=/\D/g,me=/^\d{13,19}$/,he=/(.{4})(?=.)/g,ge={normalize(e){return typeof e==`string`?e.replace(pe,``):``},validate(e){return typeof e!=`string`||!me.test(e)?!1:fe(e)},format(e){return typeof e==`string`?e.replace(he,`$1 `):``}},_e={1:10},M=/\D/g,ve=/^\+\d{7,15}$/,ye={normalize(e){if(typeof e!=`string`)return``;let t=e.trimStart().startsWith(`+`),n=e.replace(M,``);return t?`+${n}`:n},validate(e){if(typeof e!=`string`)return!1;if(ve.test(e))return!0;let t=e.replace(M,``);return Object.values(_e).includes(t.length)},format(e){if(typeof e!=`string`)return``;let t=e.replace(M,``);for(let[e,n]of Object.entries(_e)){if(t.length===n)return`(${t.slice(0,3)}) ${t.slice(3,6)}-${t.slice(6)}`;let r=n+e.length;if(t.length===r&&t.startsWith(e)){let n=t.slice(e.length);return`+${e} (${n.slice(0,3)}) ${n.slice(3,6)}-${n.slice(6)}`}}return e}},be=/[^\d.,-]/g,xe=/^-?\d+(\.\d+)?$/,Se={normalize(e){if(typeof e!=`string`)return``;let t=e.replace(be,``);if(!t)return``;let n=t.lastIndexOf(`,`),r=t.lastIndexOf(`.`);return n>-1&&r>-1?n>r?t.replace(/\./g,``).replace(`,`,`.`):t.replace(/,/g,``):n>-1?t.slice(n+1).length<=2?t.replace(`,`,`.`):t.replace(/,/g,``):t},validate(e){return typeof e==`string`?xe.test(e):!1},format(e,t={}){if(typeof e!=`string`)return``;let n=parseFloat(e);if(isNaN(n))return e;let r=t.locale||`en-US`,i=t.currency||`USD`,a=t.fractionDigits===void 0?{}:{minimumFractionDigits:t.fractionDigits,maximumFractionDigits:t.fractionDigits};try{return new Intl.NumberFormat(r,{style:`currency`,currency:i,...a}).format(n)}catch{return e}}},N=/^\d{4}-\d{2}-\d{2}$/,Ce=/^(\d{1,4})[/\-.](\d{1,2})[/\-.](\d{1,4})$/,we=/\D/g,P={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(N.test(t))return t;let n=t.match(Ce);if(n){let[,e,t,r]=n;if(e.length===4)return`${e}-${t.padStart(2,`0`)}-${r.padStart(2,`0`)}`;if(r.length===4)return`${r}-${e.padStart(2,`0`)}-${t.padStart(2,`0`)}`}let r=t.replace(we,``);if(r.length===8){let e=parseInt(r.slice(0,4),10);return e>=1e3&&e<=9999?`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`:`${r.slice(4,8)}-${r.slice(0,2)}-${r.slice(2,4)}`}return t},validate(e){if(typeof e!=`string`)return!1;let t=P.normalize(e);if(!N.test(t))return!1;let n=new Date(`${t}T00:00:00Z`);return!isNaN(n.getTime())&&n.toISOString().startsWith(t)},format(e,t={}){if(typeof e!=`string`)return``;let n=new Date(`${e}T00:00:00Z`);if(isNaN(n.getTime()))return e;let r=t.locale||`en-US`;try{return new Intl.DateTimeFormat(r,{year:t.year||`numeric`,month:t.month||`2-digit`,day:t.day||`2-digit`,timeZone:t.timeZone||`UTC`}).format(n)}catch{return e}}},Te=/^([01]?\d|2[0-3]):([0-5]\d)$/,F={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(Te.test(t)){let[e,n]=t.split(`:`);return`${String(parseInt(e,10)).padStart(2,`0`)}:${n}`}let n=t.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);if(n){let e=parseInt(n[1],10),t=n[2];return e=n[3].toUpperCase()===`AM`?e===12?0:e:e===12?12:e+12,e>23||parseInt(t,10)>59?``:`${String(e).padStart(2,`0`)}:${t}`}return``},validate(e){return F.normalize(e)!==``},format(e,t={}){if(typeof e!=`string`)return``;let n=e.match(/^(\d{2}):(\d{2})$/);if(!n)return e;let r=parseInt(n[1],10),i=n[2];if(t.format===`h24`)return`${String(r).padStart(2,`0`)}:${i}`;let a=r<12?`AM`:`PM`;return`${r%12||12}:${i} ${a}`}},I={PLAIN:`plain`,CREDIT_CARD:`creditCard`,PHONE:`phone`,CURRENCY:`currency`,DATE:`date`,TIME:`time`},L=new Map([[I.PLAIN,de],[I.CREDIT_CARD,ge],[I.PHONE,ye],[I.CURRENCY,Se],[I.DATE,P],[I.TIME,F]]),R={type:I.PLAIN,options:{}},z=class extends j{static register(e,t){L.set(e,t)}constructor(e,t={}){super(e,t),this.type=t.type??R.type,this.options=t.options??R.options,this.enhance()}enhance(){let e=this,t=L.get(e.type)??L.get(I.PLAIN),n={normalize:n=>t.normalize?.(n,e.options)??(typeof n==`string`?n:``),validate:n=>t.validate?.(n,e.options)??!0,format:n=>t.format?.(n,e.options)??(typeof n==`string`?n:``),mask:n=>t.mask?.(n,e.options)??null,maskable:()=>typeof t.mask==`function`};Object.defineProperty(this.controller,`formatter`,{get(){return n},configurable:!0})}},B=(e,t)=>new z(e,t),Ee=/^\d{4}-\d{2}-\d{2}$/;function V(e){return e instanceof Date&&!isNaN(e)}function H(...e){if(e.length===0)throw`Missing values to parse as date`;if(e.length===1){let t=e[0];if(!t)return;if(typeof t==`string`&&Ee.test(t)){let[e,n,r]=t.split(`-`).map(Number),i=new Date(e,n-1,r);if(V(i))return i}else{let e=new Date(t);if(V(e))return e}}else{let t=new Date(...e);if(V(t))return t}}var U=7,De=12,W=10,G={locales:[`default`],today:``,day:null,month:null,year:null,since:null,till:null,disabledDates:[],disabledWeekdays:[],disabledDays:[],disabledMonths:[],disabledYears:[],firstDayOfWeek:0,onNavigated:`navigated`},Oe=class extends j{constructor(e,t={}){super(e,t);let n=Object.assign({},G,t),{onNavigated:r,since:i,till:a,firstDayOfWeek:o}=n;this.onNavigated=r,this.since=H(i),this.till=H(a),this.firstDayOfWeek=0<=o&&o<7?o:G.firstDayOfWeek;let{disabledDates:s,disabledWeekdays:c,disabledDays:l,disabledMonths:u,disabledYears:d}=n;this.disabledDates=Array.isArray(s)?s:[],this.disabledWeekdays=Array.isArray(c)?c:[],this.disabledDays=Array.isArray(l)?l:[],this.disabledMonths=Array.isArray(u)?u:[],this.disabledYears=Array.isArray(d)?d:[];let{today:f,day:p,month:m,year:h}=n;this.now=H(f)||new Date,typeof h==`number`&&typeof m==`number`&&typeof p==`number`?this.current=H(h,m,p):this.current=this.now,this.build(),this.enhance()}build(){this.daysOfWeek=this.buildDaysOfWeek(),this.daysOfMonth=this.buildDaysOfMonth(),this.monthsOfYear=this.buildMonthsOfYear(),this.yearsOfDecade=this.buildYearsOfDecade()}buildDaysOfWeek(){let e=new Intl.DateTimeFormat(this.localesValue,{weekday:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{weekday:`short`}),n=new Date(`2024-10-06`),r=[];for(let i=this.firstDayOfWeek,a=i+7;i<a;i++){let a=new Date(n);a.setDate(n.getDate()+i),r.push({date:a,value:a.getDay(),long:e.format(a),short:t.format(a)})}return r}buildDaysOfMonth(){let e=this.month,t=this.year,n=[],r=e=>({current:this.month===e.getMonth()&&this.year===e.getFullYear(),date:e,value:e.getDate(),month:e.getMonth(),year:e.getFullYear(),iso:e.toISOString()}),i=new Date(t,e).getDay(),a=this.firstDayOfWeek-i;for(let i=a>0?a-7:a;i<0;i++){let a=new Date(t,e,i+1);n.push(r(a))}let o=new Date(t,e+1,0).getDate();for(let i=1;i<=o;i++){let a=new Date(t,e,i);n.push(r(a))}let s=n.length%U,c=s===0?0:U-s;for(let i=1;i<=c;i++){let a=new Date(t,e+1,i);n.push(r(a))}return n}buildMonthsOfYear(){let e=new Intl.DateTimeFormat(this.localesValue,{month:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{month:`short`}),n=new Intl.DateTimeFormat(this.localesValue,{month:`numeric`}),r=[];for(let i=0;i<De;i++){let a=new Date(this.year,i),o=new Date(this.year,i,1),s=new Date(this.year,i+1,0),c=t.format(a),l=e.format(a),u=this.since&&s<this.since||this.till&&o>this.till,d=this.disabledMonths.some(e=>i==e||c===e||l===e);r.push({date:a,value:a.getMonth(),long:l,short:c,numeric:n.format(a),disabled:u||d})}return r}buildYearsOfDecade(){let e=Math.floor(this.year/W)*W,t=[];for(let n=e-1;n<=e+W;n++){let r=n<e||n>e+W-1,i=this.since&&n<this.since.getFullYear()||this.till&&n>this.till.getFullYear(),a=this.disabledYears.some(e=>n==e);t.push({value:n,current:n===this.year,disabled:r||i||a})}return t}get today(){return this.now}set today(e){if(!V(e))return;let t=this.month??e.getMonth(),n=this.year??e.getFullYear(),r=t==e.getMonth()&&n==e.getFullYear()?e.getDate():1;this.now=new Date(n,t,r)}get current(){return typeof this.year==`number`&&typeof this.month==`number`&&typeof this.day==`number`?H(this.year,this.month,this.day):null}set current(e){V(e)&&(this.day=e.getDate(),this.month=e.getMonth(),this.year=e.getFullYear())}navigate=async e=>{if(!V(e))return;let t=this.current,n=e.toISOString(),r=t.toISOString();this.dispatch(`navigate`,{detail:{from:r,to:n}}),this.current=e,this.build(),await this.awaitCallback(this.onNavigated,{from:r,to:n}),this.dispatch(`navigated`,{detail:{from:r,to:n}})};step=async(e,t)=>{if(t===0)return;let n=this.current;switch(e){case`year`:n.setFullYear(n.getFullYear()+t);break;case`month`:n.setMonth(n.getMonth()+t);break;case`day`:n.setDate(n.getDate()+t);break;default:return}await this.navigate(n)};isDisabled=e=>{if(!V(e))return!1;if(this.disabledDates.length){let t=e.getTime();for(let e of this.disabledDates)if(t===new Date(e).getTime())return!0}if(this.disabledWeekdays.length){let t=e.getDay(),n=this.daysOfWeek,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledWeekdays)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledDays.length){let t=e.getDate();for(let e of this.disabledDays)if(t==e)return!0}if(this.disabledMonths.length){let t=e.getMonth(),n=this.monthsOfYear,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledMonths)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledYears.length){let t=e.getFullYear();for(let e of this.disabledYears)if(t==e)return!0}return!1};isWithinRange=e=>{if(!V(e))return!1;let t=!0;return this.since&&(t&&=e>=this.since),this.till&&(t&&=e<=this.till),t};enhance(){let e=this;Object.assign(this.controller,{get calendar(){return{get today(){return e.today},get current(){return e.current},get day(){return e.day},get month(){return e.month},get year(){return e.year},get since(){return e.since},get till(){return e.till},get firstDayOfWeek(){return e.firstDayOfWeek},get disabledDates(){return e.disabledDates},get disabledWeekdays(){return e.disabledWeekdays},get disabledDays(){return e.disabledDays},get disabledMonths(){return e.disabledMonths},get disabledYears(){return e.disabledYears},get daysOfWeek(){return e.daysOfWeek},get daysOfMonth(){return e.daysOfMonth},get monthsOfYear(){return e.monthsOfYear},get yearsOfDecade(){return e.yearsOfDecade},navigate:async t=>await e.navigate(t),step:async(t,n)=>await e.step(t,n),isDisabled:t=>e.isDisabled(t),isWithinRange:t=>e.isWithinRange(t)}}})}},K=(e,t)=>new Oe(e,t),ke=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this),this.onSelect=t.onSelect||null}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){if(!(e.target instanceof HTMLElement))return;e.preventDefault();let t=e.target instanceof HTMLTimeElement?e.target.parentElement:e.target;if(t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;let n=e.target instanceof HTMLTimeElement?e.target:e.target.querySelector(`time`);if(!n)return;let r=H(n.dateTime);if(!r)return;this.dispatch(`selecting`,{target:t});let i=r.toISOString();this.onSelect?this.awaitCallback(this.onSelect,i):this.dispatch(`selected`,{detail:{epoch:r.getTime(),iso:i}})}},Ae=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this)}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){let t=e.target.closest(`button[data-month]`);if(!t||t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;e.preventDefault();let n=parseInt(t.dataset.month,10);isNaN(n)||this.dispatch(`selected`,{detail:{month:n}})}},je=class extends j{constructor(e,t={}){super(e,t),this.handle=this.handle.bind(this)}attach(){this.element.addEventListener(`click`,this.handle)}detach(){this.element.removeEventListener(`click`,this.handle)}handle(e){let t=e.target.closest(`button[data-year]`);if(!t||t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;e.preventDefault();let n=parseInt(t.dataset.year,10);isNaN(n)||this.dispatch(`selected`,{detail:{year:n}})}},q=(e,t)=>new ke(e,t),J=(e,t)=>new Ae(e,t),Y=(e,t)=>new je(e,t),X={content:null,url:``,reload:`never`,stale:3600,onLoad:`canLoad`,onLoaded:`contentLoaded`},Me=class extends j{constructor(e,t={}){super(e,t);let n=Object.assign({},X,t),{content:r,url:i,reload:a,stale:o}=n;this.content=r,this.url=i,this.reload=typeof a==`string`?a:X.reload,this.stale=typeof o==`number`?o:X.stale;let{onLoad:s,onLoaded:c}=n;this.onLoad=s,this.onLoaded=c,this._requestor=new T,this.enhance()}get reloadable(){switch(this.reload){case`never`:return!1;case`always`:return!0;default:{let e=H(this.loadedAt);return e&&new Date-e>this.stale*1e3}}}contentLoadable=({url:e})=>!!e;contentLoader=async()=>``;remoteContentLoader=async e=>(await this._requestor.request(e)).text();load=async()=>{if(this.loadedAt&&!this.reloadable)return;let e=this.findCallback(this.onLoad),t=await this.awaitCallback(e||this.contentLoadable,{url:this.url});if(this.dispatch(`load`,{detail:{url:this.url}}),!t)return;this.dispatch(`loading`,{detail:{url:this.url}});let n=this.url?await this.remoteContentLoader(this.url):await this.contentLoader();n&&(await this.awaitCallback(this.onLoaded,{url:this.url,content:n}),this.loadedAt=new Date().getTime(),this.dispatch(`loaded`,{detail:{url:this.url,content:n}}))};enhance(){let e=this;Object.assign(this.controller,{load:e.load.bind(e)})}},Ne=(e,t)=>new Me(e,t),Z=class extends j{observe(e){this._handler=e,this.events.forEach(t=>window.addEventListener(t,e,!0))}unobserve(){this._handler&&this.events.forEach(e=>window.removeEventListener(e,this._handler,!0))}enhance(){let e=this,t=this.controller.disconnect?.bind(this.controller)||(()=>{});this.controller.disconnect=()=>{e.unobserve(),t()}}},Pe={trigger:null,events:[`click`],onDismissed:`dismissed`},Fe=class extends Z{constructor(e,t={}){super(e,t);let{trigger:n,events:r,onDismissed:i}=Object.assign({},Pe,t);this.onDismissed=i,this.trigger=n||this.element,this.events=r,this.enhance(),this.observe(this.dismiss)}dismiss=async e=>{let{target:t}=e;t instanceof HTMLElement&&(this.element.contains(t)||this.visible&&(this.dispatch(`dismiss`),await this.awaitCallback(this.onDismissed,{target:this.trigger}),this.dispatch(`dismissed`)))}},Q=(e,t)=>new Fe(e,t),Ie={anchor:null,events:[`click`],placement:`bottom`,alignment:`start`,onFlipped:`flipped`,ariaRole:null,respectMotion:!0},Le=class extends Z{constructor(e,t={}){super(e,t);let{anchor:n,events:r,placement:i,alignment:a,onFlipped:o,ariaRole:s,respectMotion:c}=Object.assign({},Ie,t);this.anchor=n,this.events=r,this.placement=i,this.alignment=a,this.onFlipped=o,this.ariaRole=s,this.respectMotion=c,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.anchor&&this.element&&C({trigger:this.anchor,target:this.element,role:this.ariaRole}),this.enhance(),this.observe(this.flip)}flip=async()=>{if(!this.visible)return;this.dispatch(`flip`),window.getComputedStyle(this.element).position!=`absolute`&&(this.element.style.position=`absolute`);let e=this.flippedRect(this.anchor.getBoundingClientRect(),this.element.getBoundingClientRect());this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``;for(let[t,n]of Object.entries(e))this.element.style[t]=n;await this.awaitCallback(this.onFlipped,{target:this.element,placement:e}),this.dispatch(`flipped`,{detail:{placement:e}})};flippedRect(e,t){let n=this.quadrumRect(e,k()),r=[this.placement,D[this.placement]],i={};for(;!Object.keys(i).length&&r.length>0;){let a=r.shift();if(!this.biggerRectThan(n[a],t))continue;let o=this.quadrumPlacement(e,a,t),s=this.quadrumAlignment(e,a,o);i.top=`${s.top+window.scrollY}px`,i.left=`${s.left+window.scrollX}px`}return Object.keys(i).length||(i.top=``,i.left=``),i}quadrumRect(e,t){return{left:O({x:t.x,y:t.y,width:e.x-t.x,height:t.height}),right:O({x:e.x+e.width,y:t.y,width:t.width-(e.x+e.width),height:t.height}),top:O({x:t.x,y:t.y,width:t.width,height:e.y-t.y}),bottom:O({x:t.x,y:e.y+e.height,width:t.width,height:t.height-(e.y+e.height)})}}quadrumPlacement(e,t,n){switch(t){case`top`:return O({x:n.x,y:e.y-n.height,width:n.width,height:n.height});case`bottom`:return O({x:n.x,y:e.y+e.height,width:n.width,height:n.height});case`left`:return O({x:e.x-n.width,y:n.y,width:n.width,height:n.height});case`right`:return O({x:e.x+e.width,y:n.y,width:n.width,height:n.height});default:throw`Unable place at the quadrum, ${t}`}}quadrumAlignment(e,t,n){switch(t){case`top`:case`bottom`:{let t=e.x;return this.alignment===`center`?t=e.x+e.width/2-n.width/2:this.alignment===`end`&&(t=e.x+e.width-n.width),O({x:t,y:n.y,width:n.width,height:n.height})}case`left`:case`right`:{let t=e.y;return this.alignment===`center`?t=e.y+e.height/2-n.height/2:this.alignment===`end`&&(t=e.y+e.height-n.height),O({x:n.x,y:t,width:n.width,height:n.height})}default:throw`Unable align at the quadrum, ${t}`}}biggerRectThan(e,t){return e.height>=t.height&&e.width>=t.width}enhance(){super.enhance(),this.controller.flip=this.flip}},Re=(e,t)=>new Le(e,t),ze={events:[`resize`],boundaries:[`top`,`left`,`right`],onShifted:`shifted`,respectMotion:!0},Be=class extends Z{constructor(e,t={}){super(e,t);let{onShifted:n,events:r,boundaries:i,respectMotion:a}=Object.assign({},ze,t);this.onShifted=n,this.events=r,this.boundaries=i,this.respectMotion=a,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.enhance(),this.observe(this.shift)}shift=async()=>{if(!this.visible)return;this.dispatch(`shift`);let e=this.overflowRect(this.element.getBoundingClientRect(),this.elementTranslations(this.element)),t=e.left||e.right||0,n=e.top||e.bottom||0;this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``,this.element.style.transform=`translate(${t}px, ${n}px)`,await this.awaitCallback(this.onShifted,e),this.dispatch(`shifted`,{detail:e})};overflowRect(e,t){let n={},r=k(),i=O({x:e.x-t.x,y:e.y-t.y,width:e.width,height:e.height});for(let e of this.boundaries){let t=this.directionDistance(i,e,r),a=D[e];t<0?i[a]+t>=r[a]&&!n[a]&&(n[e]=t):n[e]=``}return n}directionDistance(e,t,n){switch(t){case`top`:case`left`:return e[t]-n[t];case`bottom`:case`right`:return n[t]-e[t];default:throw`Invalid direction to calcuate distance, ${t}`}}elementTranslations(e){let t=window.getComputedStyle(e),n=t.transform||t.webkitTransform||t.mozTransform;if(n===`none`||n===void 0)return{x:0,y:0};let r=n.includes(`3d`)?`3d`:`2d`,i=n.match(/matrix.*\((.+)\)/)[1].split(`, `);return r===`2d`?{x:Number(i[4]),y:Number(i[5])}:{x:0,y:0}}enhance(){super.enhance(),this.controller.shift=this.shift}},Ve=(e,t)=>new Be(e,t),He={visibility:`visibility`,onShown:`shown`,onHidden:`hidden`},Ue=class extends j{constructor(e,t={}){let{visibility:n,onShown:r,onHidden:i,activator:a}=Object.assign({},He,t),o=typeof n==`string`?n:He.namespace,s=typeof t.visible==`string`?t.visible:`isVisible`;(typeof t.visible!=`boolean`||t.visible)&&(t.visible=`${o}.${s}`),super(e,t),this.visibility=o,this.visibilityResolver=s,this.onShown=r,this.onHidden=i,this.activator=a instanceof HTMLElement?a:null,this.enhance(),this.element instanceof HTMLElement&&this.activate(this.isVisible(this.element))}isVisible(e){if(!(e instanceof HTMLElement))return!1;let t=A.hiddenClass;return t?!e.classList.contains(t):!e.hasAttribute(`hidden`)}toggle(e,t){if(!(e instanceof HTMLElement))return;let n=A.hiddenClass;n?t?e.classList.remove(n):e.classList.add(n):y(e,!t)}activate(e){this.activator&&_(this.activator,e)}async show(){!(this.element instanceof HTMLElement)||this.isVisible(this.element)||(this.dispatch(`show`),this.toggle(this.element,!0),this.activate(!0),await this.awaitCallback(this.onShown,{target:this.element}),this.dispatch(`shown`))}async hide(){!(this.element instanceof HTMLElement)||!this.isVisible(this.element)||(this.dispatch(`hide`),this.toggle(this.element,!1),this.activate(!1),await this.awaitCallback(this.onHidden,{target:this.element}),this.dispatch(`hidden`))}enhance(){let e=this,t={show:e.show.bind(e),hide:e.hide.bind(e)};Object.defineProperty(t,`visible`,{get(){return e.isVisible(e.element)}}),Object.defineProperty(t,this.visibilityResolver,{value:e.isVisible.bind(e)}),Object.defineProperty(this.controller,this.visibility,{get(){return t}})}},We=(e,t)=>new Ue(e,t),Ge=4,Ke=class extends t.Controller{static targets=[`grid`];static values={current:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``}};initialize(){this.selector=Y(this),K(this,{today:this.todayValue,year:this.currentValue||void 0,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}currentValueChanged(){!this.calendar||!this.hasCurrentValue||this.calendar.navigate(this.currentDate)}selectedValueChanged(){if(!this.hasGridTarget)return;let e=H(this.selectedValue),t=e?e.getFullYear():null;this.gridTarget.querySelectorAll(`button[data-year]`).forEach(e=>{let n=parseInt(e.dataset.year,10);e.setAttribute(`aria-selected`,n===t?`true`:`false`)})}navigate(e){this.currentValue=e.getFullYear()}step(e,t){return this.calendar.step(e,t)}navigated(){this.drawGrid()}get currentDate(){return new Date(this.currentValue,0,1)}drawGrid(){if(!this.hasGridTarget)return;let{yearsOfDecade:e}=this.calendar,t=this.calendar.today.getFullYear(),n=H(this.selectedValue),r=n?n.getFullYear():null,i=[];for(let n of e){let e=document.createElement(`button`);e.type=`button`,e.textContent=n.value,e.dataset.year=n.value,e.setAttribute(`role`,`gridcell`),e.setAttribute(`aria-selected`,n.value===r?`true`:`false`),n.value===t&&e.setAttribute(`aria-current`,`year`),n.disabled&&e.setAttribute(`aria-disabled`,`true`),i.push(e)}let a=document.createElement(`div`);a.setAttribute(`role`,`rowgroup`);for(let e=0;e<i.length;e+=Ge){let t=document.createElement(`div`);t.setAttribute(`role`,`row`);for(let n of i.slice(e,e+Ge))t.appendChild(n);a.appendChild(t)}this.gridTarget.replaceChildren(a)}},qe=class extends t.Controller{initialize(){this.selector=Y(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},Je=class extends t.Controller{static targets=[`daysOfWeek`,`daysOfMonth`];static classes=[`dayOfWeek`,`dayOfMonth`,`dayOfOtherMonth`,`row`];static values={year:Number,month:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``},locales:{type:Array,default:[`default`]},weekdayFormat:{type:String,default:`short`},dayFormat:{type:String,default:`numeric`},daysOfOtherMonth:{type:Boolean,default:!1}};initialize(){this.selector=q(this,{onSelect:`select`}),K(this,{today:this.todayValue,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}yearValueChanged(){!this.calendar||!this.hasYearValue||this._scheduleNavigate()}monthValueChanged(){!this.calendar||!this.hasYearValue||this._scheduleNavigate()}_scheduleNavigate(){this._navigatePending||(this._navigatePending=!0,queueMicrotask(async()=>{this._navigatePending=!1,await this.calendar.navigate(this.currentDate),this.navigated()}))}selectedValueChanged(){if(!this.hasDaysOfMonthTarget||(this.daysOfMonthTarget.querySelectorAll(`[aria-selected]`).forEach(e=>{e.setAttribute(`aria-selected`,`false`)}),!this.selectedValue))return;let e=H(this.selectedValue);if(!e)return;let t=this.daysOfMonthTarget.querySelector(`time[datetime="${e.toISOString()}"]`);t&&t.closest(`[aria-selected]`)?.setAttribute(`aria-selected`,`true`)}navigate(e){this.yearValue=e.getFullYear(),this.monthValue=e.getMonth()}step(e,t){return this.calendar.step(e,t)}select(e){let t=H(e);t&&(this.selectedValue=e,(t.getMonth()!==this.calendar.month||t.getFullYear()!==this.calendar.year)&&this.calendar.navigate(t),this.dispatch(`selected`,{detail:{epoch:t.getTime(),iso:e}}))}navigated(){this.drawDaysOfWeek(),this.drawDaysOfMonth(),this.selectedValueChanged()}get currentDate(){return new Date(this.yearValue,this.monthValue,1)}createDayElement(e,{selectable:t=!1,disabled:n=!1}={}){let r=document.createElement(t?`button`:`div`);return r.tabIndex=-1,e?r.textContent=e:r.setAttribute(`aria-hidden`,`true`),n&&(r instanceof HTMLButtonElement?r.disabled=!0:r.setAttribute(`aria-disabled`,`true`)),r}drawDaysOfWeek(){if(!this.hasDaysOfWeekTarget)return;let e=new Intl.DateTimeFormat(this.localesValue,{weekday:this.weekdayFormatValue}),t=[];for(let n of this.calendar.daysOfWeek){let r=this.createDayElement(e.format(n.date));r.setAttribute(`role`,`columnheader`),r.title=n.long,this.hasDayOfWeekClass&&r.classList.add(...this.dayOfWeekClasses),t.push(r)}let n=document.createElement(`div`);n.setAttribute(`role`,`row`),this.hasRowClass&&n.classList.add(...this.rowClasses),n.replaceChildren(...t),this.daysOfWeekTarget.replaceChildren(n)}drawDaysOfMonth(){if(!this.hasDaysOfMonthTarget)return;let e=this.calendar.today,t=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),n=[];for(let e of this.calendar.daysOfMonth){let r=this.calendar.isDisabled(e.date)||!this.calendar.isWithinRange(e.date),i=!e.current&&this.daysOfOtherMonthValue&&!r,a=e.current||this.daysOfOtherMonthValue?e.value:``,o=this.createDayElement(a,{selectable:e.current||i,disabled:e.current?r:!i});t===e.date.getTime()&&o.setAttribute(`aria-current`,`date`),(e.current||this.daysOfOtherMonthValue)&&o.setAttribute(`aria-selected`,``),!e.current&&this.daysOfOtherMonthValue&&this.hasDayOfOtherMonthClass?o.classList.add(...this.dayOfOtherMonthClasses):this.hasDayOfMonthClass&&o.classList.add(...this.dayOfMonthClasses);let s=document.createElement(`time`);s.dateTime=e.iso,o.appendChild(s),n.push(o)}let r=[];for(let e=0;e<n.length;e+=7){let t=document.createElement(`div`);t.setAttribute(`role`,`row`),this.hasRowClass&&t.classList.add(...this.rowClasses);for(let r of n.slice(e,e+7))r.setAttribute(`role`,`gridcell`),t.appendChild(r);r.push(t)}this.daysOfMonthTarget.replaceChildren(...r)}},Ye=class extends t.Controller{initialize(){this.selector=q(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},Xe=4,Ze=class extends t.Controller{static targets=[`grid`];static values={current:Number,today:{type:String,default:``},selected:{type:String,default:``},since:{type:String,default:``},till:{type:String,default:``},locales:{type:Array,default:[`default`]},monthFormat:{type:String,default:`short`}};initialize(){this.selector=J(this),K(this,{today:this.todayValue,year:this.currentValue||void 0,since:this.sinceValue||null,till:this.tillValue||null})}connect(){this.selector.attach(),this.navigated()}disconnect(){this.selector.detach()}currentValueChanged(){!this.calendar||!this.hasCurrentValue||this.calendar.navigate(this.currentDate)}selectedValueChanged(){if(!this.hasGridTarget)return;let e=H(this.selectedValue);this.gridTarget.querySelectorAll(`button[data-month]`).forEach(t=>{let n=parseInt(t.dataset.month,10)-1;t.setAttribute(`aria-selected`,e&&e.getMonth()===n?`true`:`false`)})}navigate(e){this.currentValue=e.getFullYear()}step(e,t){return this.calendar.step(e,t)}navigated(){this.drawGrid()}get currentDate(){return new Date(this.currentValue,0,1)}drawGrid(){if(!this.hasGridTarget)return;let{year:e,monthsOfYear:t}=this.calendar,n=this.calendar.today,r=H(this.selectedValue),i=[],a=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue});for(let o of t){let t=document.createElement(`button`);t.type=`button`,t.textContent=a.format(o.date),t.dataset.month=o.value+1,t.setAttribute(`role`,`gridcell`);let s=r&&r.getMonth()===o.value;t.setAttribute(`aria-selected`,s?`true`:`false`),o.value===n.getMonth()&&e===n.getFullYear()&&t.setAttribute(`aria-current`,`month`),o.disabled&&t.setAttribute(`aria-disabled`,`true`),i.push(t)}let o=document.createElement(`div`);o.setAttribute(`role`,`rowgroup`);for(let e=0;e<i.length;e+=Xe){let t=document.createElement(`div`);t.setAttribute(`role`,`row`);for(let n of i.slice(e,e+Xe))t.appendChild(n);o.appendChild(t)}this.gridTarget.replaceChildren(o)}},Qe=class extends t.Controller{initialize(){this.selector=J(this)}connect(){this.selector.attach()}disconnect(){this.selector.detach()}},$e=class extends t.Controller{static targets=[`source`];static values={contentType:{type:String,default:`text/plain`}};onPaste(e){let t=e.clipboardData?.getData(this.contentTypeValue)??``,n=Array.from(e.clipboardData?.types??[]);e.preventDefault(),this.dispatch(`pasted`,{detail:{text:t,types:n},bubbles:!0})}async copy(e){let t=e.params?.text??(this.hasSourceTarget?this.sourceTarget.value??this.sourceTarget.textContent??``:``);try{await navigator.clipboard.writeText(t),this.dispatch(`copied`,{detail:{text:t},bubbles:!0})}catch(e){this.dispatch(`copy-failed`,{detail:{error:e},bubbles:!0})}}},$=[`month`,`year`,`decade`],et=class extends t.Controller{static targets=[`previous`,`next`,`day`,`month`,`year`,`viewTitle`];static outlets=[`calendar-month`,`calendar-year`,`calendar-decade`];static values={date:String,view:{type:String,default:`month`},locales:{type:Array,default:[`default`]},dayFormat:{type:String,default:`numeric`},monthFormat:{type:String,default:`long`},yearFormat:{type:String,default:`numeric`}};initialize(){this.previous=this.previous.bind(this),this.next=this.next.bind(this)}async calendarMonthOutletConnected(){if(this.dateValue){let e=H(this.dateValue);e&&await this.calendarMonthOutlet.calendar.navigate(e)}this.draw()}onDaySelect(e){this.dateValue=e.detail.iso,this.draw(),this.dispatch(`selected`,{detail:{value:e.detail.iso},bubbles:!0})}zoomOut(){let e=$.indexOf(this.viewValue);e<$.length-1&&(this.viewValue=$[e+1],this.draw())}async onMonthSelect(e){let{month:t}=e.detail;if(!this.hasCalendarMonthOutlet)return;let{year:n}=this.calendarMonthOutlet.calendar;await this.calendarMonthOutlet.calendar.navigate(new Date(n,t-1,1)),this.viewValue=`month`,this.draw()}async onYearSelect(e){let{year:t}=e.detail;if(!this.hasCalendarMonthOutlet)return;let{month:n}=this.calendarMonthOutlet.calendar;await this.calendarMonthOutlet.calendar.navigate(new Date(t,n,1)),this.hasCalendarYearOutlet&&this.calendarYearOutlet.navigate(this.calendarMonthOutlet.calendar.current),this.viewValue=`year`,this.draw()}previousTargetConnected(e){e.addEventListener(`click`,this.previous)}previousTargetDisconnected(e){e.removeEventListener(`click`,this.previous)}async previous(){await this.calendarMonthOutlet.calendar.step(...this.stepArgs(-1)),this.syncOutletValues(),this.draw()}nextTargetConnected(e){e.addEventListener(`click`,this.next)}nextTargetDisconnected(e){e.removeEventListener(`click`,this.next)}async next(){await this.calendarMonthOutlet.calendar.step(...this.stepArgs(1)),this.syncOutletValues(),this.draw()}draw(){this.drawDay(),this.drawMonth(),this.drawYear(),this.drawViewTitle(),this.drawView()}drawDay(){if(!this.hasDayTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t,day:n}=this.calendarMonthOutlet.calendar;this.dayTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{day:this.dayFormatValue}).format(new Date(e,t,n))}drawMonth(){if(!this.hasMonthTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.monthTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue}).format(new Date(e,t))}drawYear(){if(!this.hasYearTarget||!this.hasCalendarMonthOutlet)return;let{year:e}=this.calendarMonthOutlet.calendar;this.yearTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{year:this.yearFormatValue}).format(new Date(e,0))}drawViewTitle(){if(!this.hasViewTitleTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.viewTitleTarget.textContent=this.viewTitleLabel(e,t)}syncOutletValues(){if(!this.hasCalendarMonthOutlet)return;let{current:e}=this.calendarMonthOutlet.calendar;e&&(this.hasCalendarYearOutlet&&this.calendarYearOutlet.navigate(e),this.hasCalendarDecadeOutlet&&this.calendarDecadeOutlet.navigate(e))}stepArgs(e){return this.viewValue===`year`?[`year`,e]:this.viewValue===`decade`?[`year`,e*10]:[`month`,e]}viewTitleLabel(e,t){if(this.viewValue===`year`)return String(e);if(this.viewValue===`decade`){let t=Math.floor(e/10)*10;return`${t}–${t+9}`}return new Intl.DateTimeFormat(this.localesValue,{month:`long`,year:`numeric`}).format(new Date(e,t))}drawView(){let e=this.viewValue===`month`,t=this.viewValue===`year`,n=this.viewValue===`decade`;if(this.hasCalendarMonthOutlet){let t=this.calendarMonthOutlet;t.hasDaysOfWeekTarget&&(t.daysOfWeekTarget.hidden=!e),t.hasDaysOfMonthTarget&&(t.daysOfMonthTarget.hidden=!e)}this.hasCalendarYearOutlet&&(this.calendarYearOutletElement.hidden=!t),this.hasCalendarDecadeOutlet&&(this.calendarDecadeOutletElement.hidden=!n)}},tt=class extends t.Controller{static targets=[`listbox`,`loading`,`empty`];static values={url:{type:String,default:``},field:{type:String,default:`q`},delay:{type:Number,default:300}};initialize(){this._requestor=new T}connect(){this.hasListboxTarget&&(this.listboxNav=new f(this.listboxTarget))}disconnect(){this._requestor.cancel()}onSelect(e){let t=e.target.closest(`[role="option"]`);!t||t.getAttribute(`aria-disabled`)===`true`||this.select(t.dataset.value??``)}select(e){let t=this.listboxTarget.querySelectorAll(`[role="option"]`);t.forEach(e=>e.setAttribute(`aria-selected`,`false`));let n=[...t].find(t=>t.dataset.value===e);n&&n.setAttribute(`aria-selected`,`true`),this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){this.listboxNav?.handleKeyDown(e)}filter(e){if(this.urlValue){let t=new URL(this.urlValue,window.location.href);t.searchParams.set(this.fieldValue,e),this.setLoading(!0),this._requestor.schedule(()=>this._requestor.request(t).then(e=>e.text()).then(e=>{this.listboxTarget.innerHTML=e,this.setEmpty(this.listboxTarget.querySelectorAll(`[role="option"]`).length===0)}).catch(e=>{e.name!==`AbortError`&&console.error(`[combobox-dropdown] fetch failed`,e)}).finally(()=>this.setLoading(!1)),this.delayValue)}else{let t=E(this.listboxTarget,e);this.setEmpty(t===0)}}showAll(){this.listboxTarget.querySelectorAll(`[role="option"]`).forEach(e=>e.hidden=!1),this.setEmpty(!1)}setLoading(e){this.hasLoadingTarget&&(this.loadingTarget.hidden=!e)}setEmpty(e){this.hasEmptyTarget&&(this.emptyTarget.hidden=!e)}},nt=class extends t.Controller{static targets=[`hour`,`minute`,`period`];connect(){this.select(this.toH24())}onSelect(e){let t=e.target.closest(`[role="option"]`);t&&(t.closest(`[role="listbox"]`).querySelectorAll(`[role="option"]`).forEach(e=>e.setAttribute(`aria-selected`,`false`)),t.setAttribute(`aria-selected`,`true`),this.select(this.toH24()))}select(e){e&&this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){[`ArrowUp`,`ArrowDown`].includes(e.key)&&(e.preventDefault(),this.step(e.currentTarget,e.key===`ArrowDown`?1:-1))}step(e,t){let n=[...e.querySelectorAll(`[role="option"]`)],r=e.querySelector(`[aria-selected="true"]`),i=n.indexOf(r),a=t>0?n[Math.min(i+1,n.length-1)]:n[Math.max(i-1,0)];!a||a===r||(n.forEach(e=>e.setAttribute(`aria-selected`,`false`)),a.setAttribute(`aria-selected`,`true`),a.scrollIntoView({block:`nearest`}),this.select(this.toH24()))}toH24(){let e=this.selectedValue(this.hourTarget),t=this.selectedValue(this.minuteTarget);if(!e||!t)return null;if(!this.hasPeriodTarget)return`${e}:${t}`;let n=this.selectedValue(this.periodTarget),r=parseInt(e,10);return r=n===`AM`?r===12?0:r:r===12?12:r+12,`${String(r).padStart(2,`0`)}:${t}`}selectedValue(e){return e?.querySelector(`[aria-selected="true"]`)?.dataset.value??null}},rt=class extends t.Controller{static targets=[`trigger`];connect(){Q(this,{trigger:this.hasTriggerTarget?this.triggerTarget:null})}},it=class extends t.Controller{static targets=[`anchor`,`reference`];static values={placement:{type:String,default:`bottom`},alignment:{type:String,default:`start`},role:{type:String,default:`tooltip`}};connect(){if(!this.hasReferenceTarget){console.error(`FlipperController requires a reference target. Add data-flipper-target="reference" to your element.`);return}if(!this.hasAnchorTarget){console.error(`FlipperController requires an anchor target. Add data-flipper-target="anchor" to your element.`);return}Re(this,{element:this.referenceTarget,anchor:this.anchorTarget,placement:this.placementValue,alignment:this.alignmentValue,ariaRole:this.roleValue})}},at=class extends t.Controller{static targets=[`trigger`,`input`];static values={value:String,minLength:{type:Number,default:1}};static outlets=[`combobox-dropdown`];onSelect(e){e.detail?.value!==void 0&&(this.valueValue=e.detail.value)}onInput(e){if(e.target!==this.triggerTarget)return;let t=e.target.value.trim();if(t.length<this.minLengthValue){this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.showAll();return}this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.filter(t)}valueValueChanged(e){this.hasInputTarget&&(this.inputTarget.value=e),this.dispatch(`changed`,{detail:{value:e}})}},ot=class extends t.Controller{static targets=[`input`,`toggle`];static values={format:{type:String,default:`plain`},options:{type:Object,default:{}},revealed:{type:Boolean,default:!1}};connect(){B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle()}formatValueChanged(){this.formatter&&(B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle())}optionsValueChanged(){this.formatter&&(B(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()))}revealedValueChanged(){this.formatter&&(this.format(this.readValue()),this.drawToggle())}onChange(e){this.format(e?.detail?.value??``)}format(e){this.formatter&&this.onFormatting(e)}toggle(){!this.formatter.maskable()&&this.formatValue!==`password`||(this.revealedValue=!this.revealedValue)}onPaste(e){let t=e.detail?.text??``;if(!this.formatter||!t)return;let n=this.formatter.normalize(t);this.formatter.validate(n)&&this.format(n)}drawToggle(){if(!this.hasToggleTarget)return;let e=this.formatter?.maskable()||this.formatValue===`password`;this.toggleTarget.hidden=!e,e&&v(this.toggleTarget,this.revealedValue)}readValue(){return this.hasInputTarget?this.inputTarget instanceof HTMLInputElement?this.inputTarget.value:this.inputTarget.textContent:``}onFormatting(e){if(!this.formatter)return;if(this.formatValue===`password`){this.hasInputTarget&&(this.inputTarget.type=this.revealedValue?`text`:`password`);return}let t=this.formatter.normalize(e),n=this.revealedValue||!this.formatter.maskable()?this.formatter.format(t):this.formatter.mask(t);this.hasInputTarget&&(this.inputTarget instanceof HTMLInputElement?this.inputTarget.value=n:this.inputTarget.textContent=n),this.dispatch(`formatted`,{detail:{value:n}})}},st=class extends t.Controller{static targets=[`input`,`clear`];initialize(){this.onInput=this.draw.bind(this),this.onEscape=this.handleEscape.bind(this)}connect(){this.draw()}inputTargetConnected(e){e.addEventListener(`input`,this.onInput),e.addEventListener(`keydown`,this.onEscape)}inputTargetDisconnected(e){e.removeEventListener(`input`,this.onInput),e.removeEventListener(`keydown`,this.onEscape)}clear(){this.hasInputTarget&&(this.inputTarget.value=``,this.draw(),this.inputTarget.focus(),this.inputTarget.dispatchEvent(new Event(`input`,{bubbles:!0})))}draw(){!this.hasInputTarget||!this.hasClearTarget||(this.clearTarget.hidden=this.inputTarget.value.length===0)}handleEscape(e){e.key===`Escape`&&this.inputTarget.value!==``&&(e.preventDefault(),this.clear())}},ct=class extends t.Controller{static targets=[`modal`,`overlay`];initialize(){this.onCancel=this.close.bind(this)}connect(){this.hasModalTarget||console.error(`ModalController requires a modal target. Add data-modal-target="modal" to your element.`)}modalTargetConnected(e){this.isNativeDialog=e instanceof HTMLDialogElement,this.isNativeDialog?(e.addEventListener(`cancel`,this.onCancel),e.addEventListener(`click`,this.onBackdropClick)):(this.focusTrap=new o(e,{escapeDeactivates:!0,onDeactivate:()=>this.close()}),Q(this,{element:e}))}modalTargetDisconnected(e){this.isNativeDialog&&(e.removeEventListener(`cancel`,this.onCancel),e.removeEventListener(`click`,this.onBackdropClick))}dismissed=()=>{this.close()};open(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.previouslyFocused=document.activeElement,this.modalTarget.showModal();else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!1,document.body.style.overflow=`hidden`,this.focusTrap&&this.focusTrap.activate()}m(`Modal opened`)}}close(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.modalTarget.close(),this.previouslyFocused&&this.previouslyFocused.isConnected&&setTimeout(()=>{this.previouslyFocused.focus()},0);else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!0,document.body.style.overflow=``,this.focusTrap&&this.focusTrap.deactivate()}m(`Modal closed`)}}onBackdropClick=e=>{let t=this.modalTarget.getBoundingClientRect();(e.clientY<t.top||e.clientY>t.bottom||e.clientX<t.left||e.clientX>t.right)&&this.close()}},lt=class extends t.Controller{static targets=[`content`];connect(){Ve(this,{element:this.hasContentTarget?this.contentTarget:null})}},ut=class extends t.Controller{static targets=[`trigger`,`panel`,`template`,`loader`];static classes=[`hidden`];static values={url:String,loadedAt:String,reload:{type:String,default:`never`},staleAfter:{type:Number,default:3600},closeOnSelect:{type:Boolean,default:!0},announceOpen:{type:String,default:`Panel opened`},announceClose:{type:String,default:`Panel closed`}};connect(){Ne(this,{element:this.hasPanelTarget?this.panelTarget:null,url:this.hasUrlValue?this.urlValue:null}),this.hasPanelTarget&&(We(this,{element:this.panelTarget,activator:this.hasTriggerTarget?this.triggerTarget:null}),Q(this)),this.hasLoaderTarget&&We(this,{element:this.loaderTarget,visibility:`contentLoaderVisibility`})}async dismissed(){await this.close()}async open(){this.hasPanelTarget&&await this.visibility.show()}async close(){this.hasPanelTarget&&await this.visibility.hide()}async toggle(){this.visibility?.visible?await this.close():await this.open()}async closeOnSelect(){this.closeOnSelectValue&&await this.close()}async shown(){await this.load(),this.hasPanelTarget&&a(this.panelTarget),m(this.announceOpenValue)}async hidden(){this.hasTriggerTarget&&this.triggerTarget.focus(),m(this.announceCloseValue)}canLoad(){return this.hasPanelTarget&&this.panelTarget.tagName.toLowerCase()===`turbo-frame`?(this.hasUrlValue&&this.panelTarget.setAttribute(`src`,this.urlValue),!1):!0}async contentLoading(){this.hasLoaderTarget&&await this.contentLoaderVisibility.show()}async contentLoaded({content:e}){this.hasPanelTarget&&this.panelTarget.replaceChildren(this.getContentNode(e)),this.hasLoaderTarget&&await this.contentLoaderVisibility.hide()}getContentNode(e){if(typeof e==`string`){let t=document.createElement(`template`);return t.innerHTML=e,document.importNode(t.content,!0)}return document.importNode(e,!0)}contentLoader(){if(this.hasTemplateTarget)return this.templateTarget instanceof HTMLTemplateElement?this.templateTarget.content:this.templateTarget.innerHTML}},dt=class extends t.Controller{static targets=[`trigger`,`detail`,`time`];static values={dateFormat:{type:Object,default:{}}};connect(){this.rovingTabIndex=new d(this.triggerTargets,{orientation:`vertical`}),this.rovingTabIndex.activate()}disconnect(){this.rovingTabIndex?.deactivate(),this.rovingTabIndex=null}toggle(e){let t=e.currentTarget;t.getAttribute(`aria-expanded`)===`true`?this.collapseItem(t):this.expandItem(t)}expand(e){this.expandItem(e.currentTarget)}collapse(e){this.collapseItem(e.currentTarget)}expandItem(e){let t=this.detailTargets.find(t=>t.id===e.getAttribute(`aria-controls`))??null;this.dispatch(`expand`,{detail:{trigger:e,detail:t}}),_(e,!0),t&&(y(t,!1),m(`${e.textContent.trim()} expanded`)),this.dispatch(`expanded`,{detail:{trigger:e,detail:t}})}collapseItem(e){let t=this.detailTargets.find(t=>t.id===e.getAttribute(`aria-controls`))??null;this.dispatch(`collapse`,{detail:{trigger:e,detail:t}}),_(e,!1),t&&(y(t,!0),m(`${e.textContent.trim()} collapsed`)),this.dispatch(`collapsed`,{detail:{trigger:e,detail:t}})}triggerTargetConnected(e){e.hasAttribute(`aria-expanded`)||e.setAttribute(`aria-expanded`,`false`),this.rovingTabIndex?.updateItems(this.triggerTargets)}triggerTargetDisconnected(){this.rovingTabIndex?.updateItems(this.triggerTargets)}timeTargetConnected(e){if(!Object.keys(this.dateFormatValue).length||e.textContent.trim())return;let t=P.format(e.getAttribute(`datetime`),this.dateFormatValue);t&&(e.textContent=t)}};e.ARIA_HASPOPUP_VALUES=b,e.CalendarDecadeController=Ke,e.CalendarDecadeSelectorController=qe,e.CalendarMonthController=Je,e.CalendarMonthSelectorController=Ye,e.CalendarYearController=Ze,e.CalendarYearSelectorController=Qe,e.ClipboardController=$e,e.ComboboxDateController=et,e.ComboboxDropdownController=tt,e.ComboboxTimeController=nt,e.DismisserController=rt,e.FOCUSABLE_SELECTOR=n,e.FORMATTER_TYPES=I,e.FlipperController=it,e.FocusTrap=o,e.Formatter=z,e.InputClearableController=st,e.InputComboboxController=at,e.InputFormatterController=ot,e.ListboxNavigation=f,e.ModalController=ct,e.PannerController=lt,e.PopoverController=ut,e.Requestor=T,e.RovingTabIndex=d,e.TimelineController=dt,e.announce=m,e.connectTriggerToTarget=C,e.disconnectTriggerFromTarget=re,e.ensureId=ee,e.filterOptions=E,e.focusFirst=a,e.fuzzyMatcher=ie,e.generateId=h,e.getFocusableElements=r,e.isActivationKey=c,e.isArrowKey=l,e.isKey=s,e.isVisible=i,e.preventDefault=u,e.setAriaState=g,e.setChecked=te,e.setDisabled=ne,e.setExpanded=_,e.setHidden=y,e.setPressed=v});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.umd.js","names":["defaultOptions","STRIP_NON_DIGITS","STRIP_NON_DIGITS","defaultOptions","defaultOptions","defaultOptions","defaultOptions","defaultOptions","defaultOptions","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller","Controller"],"sources":["../src/accessibility/focus.js","../src/accessibility/keyboard.js","../src/accessibility/aria.js","../src/requestor.js","../src/researcher.js","../src/plumbers/plumber/geometry.js","../src/plumbers/plumber/config.js","../src/plumbers/plumber/index.js","../src/plumbers/formatters/plain.js","../src/plumbers/formatters/credit_card.js","../src/plumbers/formatters/phone.js","../src/plumbers/formatters/currency.js","../src/plumbers/formatters/date.js","../src/plumbers/formatters/time.js","../src/plumbers/formatter.js","../src/plumbers/plumber/date.js","../src/plumbers/calendar.js","../src/plumbers/calendar-selector.js","../src/plumbers/content_loader.js","../src/plumbers/plumber/window_observer.js","../src/plumbers/dismisser.js","../src/plumbers/flipper.js","../src/plumbers/shifter.js","../src/plumbers/visibility.js","../src/controllers/calendar_decade_controller.js","../src/controllers/calendar_decade_selector_controller.js","../src/controllers/calendar_month_controller.js","../src/controllers/calendar_month_selector_controller.js","../src/controllers/calendar_year_controller.js","../src/controllers/calendar_year_selector_controller.js","../src/controllers/clipboard_controller.js","../src/controllers/combobox_date_controller.js","../src/controllers/combobox_dropdown_controller.js","../src/controllers/combobox_time_controller.js","../src/controllers/dismisser_controller.js","../src/controllers/flipper_controller.js","../src/controllers/input_combobox_controller.js","../src/controllers/input_formatter_controller.js","../src/controllers/input_clearable_controller.js","../src/controllers/modal_controller.js","../src/controllers/panner_controller.js","../src/controllers/popover_controller.js","../src/controllers/timeline_controller.js"],"sourcesContent":["/**\n * Query selector for all focusable elements\n */\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n].join(',');\n\n/**\n * Get all focusable elements within a container\n */\nexport function getFocusableElements(container) {\n return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((el) => isVisible(el));\n}\n\n/**\n * Check if an element is visible\n */\nexport function isVisible(element) {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n}\n\n/**\n * Focus the first focusable element in a container\n */\nexport function focusFirst(container) {\n const elements = getFocusableElements(container);\n if (elements.length > 0) {\n elements[0].focus();\n return true;\n }\n return false;\n}\n\n/**\n * Create a focus trap within a container\n */\nexport class FocusTrap {\n constructor(container, options = {}) {\n this.container = container;\n this.previouslyFocused = null;\n this.options = options;\n this.isActive = false;\n }\n\n activate() {\n if (this.isActive) return;\n\n this.previouslyFocused = document.activeElement;\n this.isActive = true;\n\n // Focus initial element or first focusable\n if (this.options.initialFocus) {\n this.options.initialFocus.focus();\n } else {\n focusFirst(this.container);\n }\n\n // Add event listeners\n this.container.addEventListener('keydown', this.handleKeyDown);\n }\n\n deactivate() {\n if (!this.isActive) return;\n\n this.isActive = false;\n this.container.removeEventListener('keydown', this.handleKeyDown);\n\n // Return focus to previously focused element\n const returnElement = this.options.returnFocus || this.previouslyFocused;\n if (returnElement && isVisible(returnElement)) {\n returnElement.focus();\n }\n\n if (typeof this.options.onDeactivate === 'function') {\n this.options.onDeactivate();\n }\n }\n\n handleKeyDown = (event) => {\n if (event.key === 'Escape' && this.options.escapeDeactivates) {\n event.preventDefault();\n this.deactivate();\n return;\n }\n\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements(this.container);\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n // Trap focus within container\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n };\n}\n","/**\n * Keyboard interaction utilities\n */\n\n/**\n * Check if a key matches the expected key\n */\nexport function isKey(event, key) {\n return event.key === key;\n}\n\n/**\n * Check if Enter or Space was pressed (activation keys)\n */\nexport function isActivationKey(event) {\n return event.key === 'Enter' || event.key === ' ';\n}\n\n/**\n * Check if an arrow key was pressed\n */\nexport function isArrowKey(event) {\n return ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key);\n}\n\n/**\n * Prevent default and stop propagation\n */\nexport function preventDefault(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n/**\n * Handle roving tabindex for a list of items\n */\nexport class RovingTabIndex {\n constructor(items, options = {}) {\n this.items = Array.from(items);\n this.currentIndex = options.initialIndex ?? 0;\n this.orientation = options.orientation ?? 'both';\n this.wrap = options.wrap ?? true;\n this._handleKeyDown = this._handleKeyDown.bind(this);\n this._handleClick = this._handleClick.bind(this);\n }\n\n activate() {\n this.updateTabIndex();\n this.items.forEach((item) => {\n item.addEventListener('keydown', this._handleKeyDown);\n item.addEventListener('click', this._handleClick);\n });\n return this;\n }\n\n deactivate() {\n this.items.forEach((item) => {\n item.removeEventListener('keydown', this._handleKeyDown);\n item.removeEventListener('click', this._handleClick);\n });\n }\n\n updateItems(items) {\n this.deactivate();\n this.items = Array.from(items);\n this.currentIndex = Math.min(this.currentIndex, Math.max(0, this.items.length - 1));\n this.activate();\n }\n\n setCurrentIndex(index) {\n if (index >= 0 && index < this.items.length) {\n this.currentIndex = index;\n this.updateTabIndex();\n this.items[index].focus();\n }\n }\n\n updateTabIndex() {\n this.items.forEach((item, i) => {\n item.tabIndex = i === this.currentIndex ? 0 : -1;\n });\n }\n\n _handleClick(event) {\n const index = this.items.indexOf(event.currentTarget);\n if (index !== -1) {\n this.currentIndex = index;\n this.updateTabIndex();\n }\n }\n\n _handleKeyDown(event) {\n const fromIndex = this.items.indexOf(event.currentTarget);\n if (fromIndex !== -1 && fromIndex !== this.currentIndex) {\n this.currentIndex = fromIndex;\n this.updateTabIndex();\n }\n\n const verticalKeys = this.orientation !== 'horizontal' ? ['ArrowUp', 'ArrowDown'] : [];\n const horizontalKeys = this.orientation !== 'vertical' ? ['ArrowLeft', 'ArrowRight'] : [];\n const activeKeys = [...verticalKeys, ...horizontalKeys, 'Home', 'End'];\n\n if (!activeKeys.includes(event.key)) return;\n event.preventDefault();\n const base = fromIndex !== -1 ? fromIndex : this.currentIndex;\n\n let newIndex;\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n newIndex = this.wrap ? (base + 1) % this.items.length : Math.min(base + 1, this.items.length - 1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n newIndex = this.wrap ? (base - 1 + this.items.length) % this.items.length : Math.max(base - 1, 0);\n break;\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = this.items.length - 1;\n break;\n }\n this.setCurrentIndex(newIndex);\n }\n}\n\nexport class ListboxNavigation {\n constructor(listbox, options = {}) {\n this.listbox = listbox;\n this.itemSelector = options.itemSelector ?? '[role=\"option\"]:not([aria-disabled=\"true\"]):not([hidden])';\n this.wrap = options.wrap ?? false;\n this.orientation = options.orientation ?? 'vertical';\n }\n\n get selectedItem() {\n return this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`) ?? null;\n }\n\n get currentIndex() {\n const items = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n return items.indexOf(this.selectedItem);\n }\n\n _selectItem(item) {\n const all = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n all.forEach((o) => o.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n item.scrollIntoView({ block: 'nearest' });\n }\n\n step(delta) {\n const options = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n if (!options.length) return;\n const current = this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`);\n const idx = options.indexOf(current);\n let next;\n if (delta > 0) {\n next = this.wrap ? options[(idx + 1) % options.length] : options[Math.min(idx + 1, options.length - 1)];\n } else {\n next = this.wrap ? options[(idx - 1 + options.length) % options.length] : options[Math.max(idx - 1, 0)];\n }\n if (!next || next === current) return;\n this._selectItem(next);\n }\n\n handleKeyDown(event) {\n const verticalKeys = this.orientation !== 'horizontal' ? ['ArrowUp', 'ArrowDown'] : [];\n const horizontalKeys = this.orientation !== 'vertical' ? ['ArrowLeft', 'ArrowRight'] : [];\n const activeKeys = [...verticalKeys, ...horizontalKeys, 'Home', 'End', 'Enter', ' '];\n\n if (!activeKeys.includes(event.key)) return;\n event.preventDefault();\n\n const options = Array.from(this.listbox.querySelectorAll(this.itemSelector));\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n this.step(1);\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n this.step(-1);\n break;\n case 'Home':\n if (options.length) this._selectItem(options[0]);\n break;\n case 'End':\n if (options.length) this._selectItem(options[options.length - 1]);\n break;\n case 'Enter':\n case ' ':\n this.listbox.querySelector(`${this.itemSelector}[aria-selected=\"true\"]`)?.click();\n break;\n }\n }\n}\n","/**\n * Get or create a live region for screen reader announcements\n */\nconst getLiveRegion = (politeness, atomic, relevant) => {\n let region = document.querySelector(`[data-live-region=\"${politeness}\"]`);\n\n if (!region) {\n region = document.createElement('div');\n region.className = 'sr-only';\n region.dataset.liveRegion = politeness;\n region.setAttribute('aria-live', politeness);\n region.setAttribute('aria-atomic', atomic.toString());\n region.setAttribute('aria-relevant', relevant);\n document.body.appendChild(region);\n }\n\n return region;\n};\n\n/**\n * Announce a message to screen readers using an aria-live region\n */\nexport function announce(message, options = {}) {\n const { politeness = 'polite', atomic = true, relevant = 'additions text' } = options;\n const region = getLiveRegion(politeness, atomic, relevant);\n\n region.textContent = '';\n setTimeout(() => {\n region.textContent = message;\n }, 100);\n}\n\n/**\n * Generate a unique ID for ARIA relationships\n */\nexport const generateId = (prefix = 'a11y') => `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n\n/**\n * Ensure element has an ID, generate one if needed\n */\nexport const ensureId = (element, prefix = 'element') => element.id || (element.id = generateId(prefix));\n\n/**\n * Generic function to set ARIA state attributes\n */\nexport const setAriaState = (element, attribute, value) => {\n element.setAttribute(attribute, value.toString());\n};\n\n/**\n * Update aria-expanded state\n */\nexport const setExpanded = (element, expanded) => setAriaState(element, 'aria-expanded', expanded);\n\n/**\n * Update aria-pressed state\n */\nexport const setPressed = (element, pressed) => setAriaState(element, 'aria-pressed', pressed);\n\n/**\n * Update aria-checked state\n */\nexport const setChecked = (element, checked) => setAriaState(element, 'aria-checked', checked);\n\n/**\n * Set or remove the hidden attribute\n */\nexport const setHidden = (element, hidden) =>\n hidden ? element.setAttribute('hidden', '') : element.removeAttribute('hidden');\n\n/**\n * Update aria-disabled state and manage tabindex\n */\nexport function setDisabled(element, disabled) {\n setAriaState(element, 'aria-disabled', disabled);\n disabled ? element.setAttribute('tabindex', '-1') : element.removeAttribute('tabindex');\n}\n\n/**\n * Maps ARIA roles to their appropriate aria-haspopup values\n */\nexport const ARIA_HASPOPUP_VALUES = {\n menu: 'menu',\n listbox: 'listbox',\n tree: 'tree',\n grid: 'grid',\n dialog: 'dialog',\n};\n\n/**\n * Apply attributes to element if they should be set\n */\nconst applyAttributes = (element, attributes, result) => {\n Object.entries(attributes).forEach(([attr, value]) => {\n element.setAttribute(attr, value);\n result[attr] = value;\n });\n};\n\n/**\n * Check if attribute should be set based on override and existing value\n */\nconst shouldSet = (element, attribute, override) => override || !element.hasAttribute(attribute);\n\n/**\n * Connects a trigger element to a target element with ARIA relationships\n * @param {Object} options - Configuration options\n * @param {HTMLElement} options.trigger - Trigger/anchor element (e.g., button)\n * @param {HTMLElement} options.target - Target/reference element (e.g., menu, dialog)\n * @param {string} [options.role] - ARIA role for the target element\n * @param {boolean} [options.override=false] - Override existing attributes\n * @returns {Object} Object containing set attributes with trigger and target subobjects\n */\nexport function connectTriggerToTarget({ trigger, target, role = null, override = false }) {\n const result = { trigger: {}, target: {} };\n\n if (!trigger || !target) return result;\n\n const triggerAttrs = {};\n const targetAttrs = {};\n\n // Set target role\n if (role && shouldSet(target, 'role', override)) {\n targetAttrs.role = role;\n }\n\n // Set trigger attributes if target has an ID\n if (target.id) {\n if (shouldSet(trigger, 'aria-controls', override)) {\n triggerAttrs['aria-controls'] = target.id;\n }\n\n if (role === 'tooltip' && shouldSet(trigger, 'aria-describedby', override)) {\n triggerAttrs['aria-describedby'] = target.id;\n }\n }\n\n // Set aria-haspopup based on role\n if (role && shouldSet(trigger, 'aria-haspopup', override)) {\n const haspopup = ARIA_HASPOPUP_VALUES[role] || 'true';\n if (haspopup) triggerAttrs['aria-haspopup'] = haspopup;\n }\n\n applyAttributes(target, targetAttrs, result.target);\n applyAttributes(trigger, triggerAttrs, result.trigger);\n\n return result;\n}\n\n/**\n * Remove attributes from element if they exist\n */\nconst removeAttributes = (element, attributes) => {\n attributes.forEach((attr) => {\n if (element.hasAttribute(attr)) {\n element.removeAttribute(attr);\n }\n });\n};\n\n/**\n * Disconnects a trigger element from a target element by removing ARIA relationships\n * @param {Object} options - Configuration options\n * @param {HTMLElement} options.trigger - Trigger element\n * @param {HTMLElement} options.target - Target element\n * @param {string[]} [options.attributes] - Specific attributes to remove (default: all)\n */\nexport function disconnectTriggerFromTarget({ trigger, target, attributes = null }) {\n if (!trigger || !target) return;\n\n const defaultAttrs = ['aria-controls', 'aria-haspopup', 'aria-describedby'];\n const attrsToRemove = attributes || defaultAttrs;\n\n removeAttributes(trigger, attrsToRemove);\n\n if (!attributes || attributes.includes('role')) {\n removeAttributes(target, ['role']);\n }\n}\n","export class Requestor {\n constructor() {\n this._abortController = null;\n this._timer = null;\n }\n\n schedule(fn, delay) {\n clearTimeout(this._timer);\n this._timer = setTimeout(fn, delay);\n }\n\n async request(url, options = {}) {\n this._abortController?.abort();\n this._abortController = new AbortController();\n const res = await fetch(url, { ...options, signal: this._abortController.signal });\n if (!res.ok) throw new Error(`${res.status}`);\n return res;\n }\n\n cancel() {\n clearTimeout(this._timer);\n this._abortController?.abort();\n }\n}\n","export function fuzzyMatcher(needle, haystack) {\n let ni = 0;\n for (let i = 0; i < haystack.length && ni < needle.length; i++) {\n if (haystack[i] === needle[ni]) ni++;\n }\n return ni === needle.length;\n}\n\nfunction matchContains(needle, haystack) {\n return haystack.includes(needle);\n}\n\nfunction matchPrefix(needle, haystack) {\n return haystack.startsWith(needle);\n}\n\nfunction getStrategy(strategy) {\n if (strategy === 'contains') return matchContains;\n if (strategy === 'prefix') return matchPrefix;\n return fuzzyMatcher;\n}\n\nfunction extractDOMValue(el, field) {\n if (field === 'textContent') return el.textContent?.trim().toLowerCase() ?? '';\n return (el.getAttribute(field) ?? '').toLowerCase();\n}\n\nexport function filterOptions(listbox, query, options = {}) {\n const { strategy = 'fuzzy', matcher, fields = ['textContent'] } = options;\n const matchFn = typeof matcher === 'function' ? matcher : getStrategy(strategy);\n const needle = query.toLowerCase();\n let visible = 0;\n listbox.querySelectorAll('[role=\"option\"]').forEach((opt) => {\n const match = fields.some((field) => matchFn(needle, extractDOMValue(opt, field)));\n opt.hidden = !match;\n if (match) visible++;\n });\n return visible;\n}\n","export const directionMap = {\n get top() {\n return 'bottom';\n },\n get bottom() {\n return 'top';\n },\n get left() {\n return 'right';\n },\n get right() {\n return 'left';\n },\n};\n\nexport function defineRect({ x, y, width, height }) {\n return { x, y, width, height, left: x, right: x + width, top: y, bottom: y + height };\n}\n\nexport function viewportRect() {\n return defineRect({\n x: 0,\n y: 0,\n width: window.innerWidth || document.documentElement.clientWidth,\n height: window.innerHeight || document.documentElement.clientHeight,\n });\n}\n\nexport function isWithinViewport(target) {\n if (!(target instanceof HTMLElement)) return false;\n const outer = viewportRect();\n const inner = target.getBoundingClientRect();\n const vertical = inner.top <= outer.height && inner.top + inner.height > 0;\n const horizontal = inner.left <= outer.width && inner.left + inner.width > 0;\n return vertical && horizontal;\n}\n","export const visibilityConfig = {\n get visibleOnly() {\n return true;\n },\n hiddenClass: null,\n};\n","import { isWithinViewport } from './geometry';\nimport { visibilityConfig } from './config';\n\nconst defaultOptions = {\n element: null,\n visible: null,\n dispatch: true,\n prefix: '',\n};\n\nexport default class Plumber {\n /**\n * Creates a new Plumber instance.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} options - Configuration options\n * @param {HTMLElement} [options.element] - Target element (defaults to controller.element)\n * @param {boolean|string} [options.visible=true] - Visibility check configuration\n * @param {boolean} [options.dispatch=true] - Enable event dispatching\n * @param {string} [options.prefix] - Event prefix (defaults to controller.identifier)\n */\n constructor(controller, options = {}) {\n this.controller = controller;\n\n const config = Object.assign({}, defaultOptions, options);\n const { element, visible, dispatch, prefix } = config;\n this.element = element || controller.element;\n this.visibleOnly = typeof visible === 'boolean' ? visible : visibilityConfig.visibleOnly;\n this.visibleCallback = typeof visible === 'string' ? visible : null;\n this.notify = !!dispatch;\n this.prefix = typeof prefix === 'string' && prefix ? prefix : controller.identifier;\n }\n\n /**\n * Checks if the element is visible in viewport.\n * @returns {boolean} True if element is visible\n */\n get visible() {\n if (!(this.element instanceof HTMLElement)) return false;\n if (!this.visibleOnly) return true;\n\n return isWithinViewport(this.element) && this.isVisible(this.element);\n }\n\n /**\n * Determines if a target element is visible.\n * @param {HTMLElement} target - Element to check\n * @returns {boolean} True if element is visible\n */\n isVisible(target) {\n if (this.visibleCallback) {\n const callback = this.findCallback(this.visibleCallback);\n if (typeof callback == 'function') return callback(target);\n }\n\n if (!(target instanceof HTMLElement)) return false;\n return !target.hasAttribute('hidden');\n }\n\n /**\n * Dispatches a custom event from the controller.\n * @param {string} name - Event name\n * @param {Object} [options] - Event options\n * @param {HTMLElement} [options.target] - Event target element\n * @param {string} [options.prefix] - Event prefix\n * @param {*} [options.detail] - Event detail data\n * @returns {boolean|undefined} Dispatch result\n */\n dispatch(name, { target = null, prefix = null, detail = null } = {}) {\n if (!this.notify) return;\n\n return this.controller.dispatch(name, {\n target: target || this.element,\n prefix: prefix || this.prefix,\n detail: detail,\n });\n }\n\n /**\n * Finds and binds a callback function by name from controller or plumber.\n * @param {string} name - Callback name or dot-notation path\n * @returns {Function|undefined} Bound callback function\n */\n findCallback(name) {\n if (typeof name !== 'string') return;\n\n const context = this;\n const controllerCallback = name.split('.').reduce((acc, key) => acc && acc[key], context.controller);\n if (typeof controllerCallback === 'function') {\n return controllerCallback.bind(context.controller);\n }\n const callback = name.split('.').reduce((acc, key) => acc && acc[key], context);\n if (typeof callback === 'function') {\n return callback.bind(context);\n }\n }\n\n /**\n * Executes a callback function and awaits if it returns a Promise.\n * @param {string|Function} callback - Callback name or function\n * @param {...*} args - Arguments to pass to callback\n * @returns {Promise<*>} Result of callback execution\n */\n async awaitCallback(callback, ...args) {\n if (typeof callback === 'string') callback = this.findCallback(callback);\n if (typeof callback === 'function') {\n const result = callback(...args);\n if (result instanceof Promise) return await result;\n else return result;\n }\n }\n}\n","export const PlainFormatter = {\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n return raw;\n },\n\n validate() {\n return true;\n },\n};\n","/**\n * Validates a credit card number string using the Luhn algorithm.\n *\n * Starting from the rightmost digit, double every second digit. If doubling\n * produces a number greater than 9, subtract 9 from it. Sum all digits.\n * A valid card number produces a total divisible by 10.\n *\n * @param {string} digits - Digit-only string (no spaces or dashes)\n * @returns {boolean} true if the number passes the Luhn check\n */\nfunction luhn(digits) {\n let sum = 0;\n let alternate = false;\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits[i], 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n return sum % 10 === 0;\n}\n\n/** Strips all non-digit characters from raw input */\nconst STRIP_NON_DIGITS = /\\D/g;\n\n/** Matches a valid card digit count (13–19 digits, no other characters) */\nconst VALID_CARD_LENGTH = /^\\d{13,19}$/;\n\n/** Captures groups of up to 4 characters followed by at least one more character */\nconst GROUP_FOUR_DIGITS = /(.{4})(?=.)/g;\n\nexport const CreditCardFormatter = {\n /**\n * Converts raw input to the canonical stored form: digits only, no separators.\n * e.g. '4242 4242 4242 4242' → '4242424242424242'\n * @param {string} raw - Raw input (may contain spaces, dashes, etc.)\n * @returns {string} Digit-only string, or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n return raw.replace(STRIP_NON_DIGITS, '');\n },\n\n /**\n * Validates the canonical card number using length and Luhn checks.\n * Expects the output of normalize() — digits only.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n if (!VALID_CARD_LENGTH.test(value)) return false;\n return luhn(value);\n },\n\n /**\n * Formats a canonical card number for display: groups of 4 separated by spaces.\n * e.g. '4242424242424242' → '4242 4242 4242 4242'\n * @param {string} value - Canonical value from normalize()\n * @returns {string} Formatted display string, or '' for non-string input\n */\n format(value) {\n if (typeof value !== 'string') return '';\n return value.replace(GROUP_FOUR_DIGITS, '$1 ');\n },\n};\n","/**\n * Map of E.164 country calling code → expected local digit count.\n * Key: calling code string (without '+').\n * Value: local number digit count (excluding the country code).\n *\n * Example: '1' → 10 means USA/Canada use a 10-digit local number\n * (3-digit area code + 7-digit subscriber number).\n *\n * Extend this object to add formatting support for additional countries.\n */\nconst DIALING_CODE_LOCAL_DIGITS = {\n 1: 10, // USA, Canada, and NANP countries\n};\n\n/** Strips all non-digit characters */\nconst STRIP_NON_DIGITS = /\\D/g;\n\n/** Matches an E.164 international phone number: + followed by 7–15 digits */\nconst E164_PATTERN = /^\\+\\d{7,15}$/;\n\nexport const PhoneFormatter = {\n /**\n * Converts raw input to canonical form.\n * If input starts with '+', produces E.164 (+digits); otherwise strips to digits only.\n * e.g. '(555) 123-4567' → '5551234567', '+1 555 123 4567' → '+15551234567'\n * @param {string} raw - Raw input (may contain spaces, dashes, parentheses, etc.)\n * @returns {string} Canonical string, or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const hasPlus = raw.trimStart().startsWith('+');\n const digits = raw.replace(STRIP_NON_DIGITS, '');\n return hasPlus ? `+${digits}` : digits;\n },\n\n /**\n * Validates the canonical phone number.\n * Accepts E.164 format or a local number whose digit count appears in DIALING_CODE_LOCAL_DIGITS.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n if (E164_PATTERN.test(value)) return true;\n const digits = value.replace(STRIP_NON_DIGITS, '');\n return Object.values(DIALING_CODE_LOCAL_DIGITS).includes(digits.length);\n },\n\n /**\n * Formats a canonical phone number for display.\n * Recognises numbers matching entries in DIALING_CODE_LOCAL_DIGITS.\n * e.g. '5551234567' → '(555) 123-4567', '+15551234567' → '+1 (555) 123-4567'\n * Returns value unchanged for unrecognised international numbers.\n * @param {string} value - Canonical value from normalize()\n * @returns {string} Formatted display string, or '' for non-string input\n */\n format(value) {\n if (typeof value !== 'string') return '';\n const digits = value.replace(STRIP_NON_DIGITS, '');\n for (const [code, localDigits] of Object.entries(DIALING_CODE_LOCAL_DIGITS)) {\n if (digits.length === localDigits) {\n // Local number without country code prefix\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;\n }\n const totalWithCode = localDigits + code.length;\n if (digits.length === totalWithCode && digits.startsWith(code)) {\n const local = digits.slice(code.length);\n return `+${code} (${local.slice(0, 3)}) ${local.slice(3, 6)}-${local.slice(6)}`;\n }\n }\n return value;\n },\n};\n","/** Strips everything except digits, period, comma, and negative sign */\nconst STRIP_NON_NUMERIC = /[^\\d.,-]/g;\n\n/** Matches a valid canonical amount: optional negative sign, digits, optional decimal part */\nconst VALID_AMOUNT_PATTERN = /^-?\\d+(\\.\\d+)?$/;\n\nexport const CurrencyFormatter = {\n /**\n * Converts raw input to the canonical stored form: a plain decimal number string.\n * Handles US format (1,234.56), European format (1.234,56), and integers ($1,000).\n * The heuristic for ambiguous comma-only input: ≤2 digits after comma → decimal\n * separator; 3 digits after → thousands separator.\n * @param {string} raw - Raw input (may contain currency symbols, separators)\n * @returns {string} Canonical decimal string (e.g. '1234.56'), or '' for non-string/empty\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const stripped = raw.replace(STRIP_NON_NUMERIC, '');\n if (!stripped) return '';\n const lastComma = stripped.lastIndexOf(',');\n const lastDot = stripped.lastIndexOf('.');\n\n if (lastComma > -1 && lastDot > -1) {\n // Both present: the later one is the decimal separator\n if (lastComma > lastDot) {\n // European: 1.234,56 — comma is decimal, dot is thousands\n return stripped.replace(/\\./g, '').replace(',', '.');\n }\n // US: 1,234.56 — dot is decimal, comma is thousands\n return stripped.replace(/,/g, '');\n }\n\n if (lastComma > -1) {\n // Comma only: 1-2 digits after = decimal separator; 3 digits after = thousands separator\n const afterComma = stripped.slice(lastComma + 1);\n if (afterComma.length <= 2) return stripped.replace(',', '.');\n return stripped.replace(/,/g, '');\n }\n\n // Dot only or no separator\n return stripped;\n },\n\n /**\n * Validates the canonical amount: optional negative sign, integer digits,\n * and an optional decimal part of any length.\n * @param {string} value - Canonical value from normalize()\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n return VALID_AMOUNT_PATTERN.test(value);\n },\n\n /**\n * Formats a canonical amount for display using Intl.NumberFormat.\n * Fraction digit defaults come from the currency itself (e.g. JPY uses 0,\n * USD uses 2, KWD uses 3) — no hardcoded overrides unless opts.fractionDigits\n * is explicitly provided.\n * @param {string} value - Canonical value from normalize()\n * @param {Object} [opts={}] - Options\n * @param {string} [opts.locale='en-US'] - BCP 47 locale tag\n * @param {string} [opts.currency='USD'] - ISO 4217 currency code\n * @param {number} [opts.fractionDigits] - Override min and max fraction digits\n * @returns {string} Formatted currency string, or value as-is for non-numeric input\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const num = parseFloat(value);\n if (isNaN(num)) return value;\n const locale = opts.locale || 'en-US';\n const currency = opts.currency || 'USD';\n const fractionOpts =\n opts.fractionDigits !== undefined\n ? { minimumFractionDigits: opts.fractionDigits, maximumFractionDigits: opts.fractionDigits }\n : {};\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n ...fractionOpts,\n }).format(num);\n } catch {\n return value;\n }\n },\n};\n","/** Matches an ISO 8601 date: YYYY-MM-DD */\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/** Matches a date with separators: number-sep-number-sep-number (/, -, or .) */\nconst SEPARATED_DATE_PATTERN = /^(\\d{1,4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,4})$/;\n\n/** Strips all non-digit characters (used when extracting 8-digit compact dates) */\nconst STRIP_NON_DIGITS = /\\D/g;\n\nexport const DateFormatter = {\n /**\n * Converts raw input to the canonical stored form: ISO 8601 YYYY-MM-DD.\n * Accepts a variety of common date formats:\n * - YYYY-MM-DD (ISO, returned unchanged)\n * - MM/DD/YYYY, DD/MM/YYYY, YYYY/MM/DD (with /, -, or . separators)\n * - YYYYMMDD (8 compact digits, first 4 digits treated as year)\n * When the first component of a separated date is 4 digits, it is treated as the year.\n * Otherwise, MM/DD/YYYY ordering is assumed.\n * @param {string} raw - Raw input in any supported format\n * @returns {string} ISO date string (YYYY-MM-DD), or '' for non-string input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const trimmed = raw.trim();\n\n // Already ISO YYYY-MM-DD\n if (ISO_DATE_PATTERN.test(trimmed)) return trimmed;\n\n // Date with separators: MM/DD/YYYY, DD/MM/YYYY, or YYYY/MM/DD\n const sepMatch = trimmed.match(SEPARATED_DATE_PATTERN);\n if (sepMatch) {\n const [, a, b, c] = sepMatch;\n if (a.length === 4) {\n return `${a}-${b.padStart(2, '0')}-${c.padStart(2, '0')}`;\n }\n if (c.length === 4) {\n // Default MM/DD/YYYY assumption\n return `${c}-${a.padStart(2, '0')}-${b.padStart(2, '0')}`;\n }\n }\n\n // 8 pure digits: YYYYMMDD or MMDDYYYY\n const digits = trimmed.replace(STRIP_NON_DIGITS, '');\n if (digits.length === 8) {\n const potentialYear = parseInt(digits.slice(0, 4), 10);\n if (potentialYear >= 1000 && potentialYear <= 9999) {\n return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;\n }\n return `${digits.slice(4, 8)}-${digits.slice(0, 2)}-${digits.slice(2, 4)}`;\n }\n\n return trimmed;\n },\n\n /**\n * Validates the input, accepting any format supported by normalize().\n * Internally normalizes to ISO form first, then checks calendar validity.\n * e.g. validate('04/13/2025') → true, validate('2025-02-29') → false (not a leap year)\n * @param {string} value - Input in any format (ISO, MM/DD/YYYY, etc.)\n * @returns {boolean}\n */\n validate(value) {\n if (typeof value !== 'string') return false;\n const iso = DateFormatter.normalize(value);\n if (!ISO_DATE_PATTERN.test(iso)) return false;\n const date = new Date(`${iso}T00:00:00Z`);\n return !isNaN(date.getTime()) && date.toISOString().startsWith(iso);\n },\n\n /**\n * Formats an ISO date string for display using Intl.DateTimeFormat.\n * All Intl options are configurable; defaults produce MM/DD/YYYY in en-US.\n * @param {string} value - Canonical ISO date string (YYYY-MM-DD) from normalize()\n * @param {Object} [opts={}] - Options\n * @param {string} [opts.locale='en-US'] - BCP 47 locale tag\n * @param {string} [opts.timeZone='UTC'] - IANA time zone\n * @param {string} [opts.year='numeric'] - Intl year format\n * @param {string} [opts.month='2-digit'] - Intl month format\n * @param {string} [opts.day='2-digit'] - Intl day format\n * @returns {string} Formatted date string, or value as-is for invalid input\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const date = new Date(`${value}T00:00:00Z`);\n if (isNaN(date.getTime())) return value;\n const locale = opts.locale || 'en-US';\n try {\n return new Intl.DateTimeFormat(locale, {\n year: opts.year || 'numeric',\n month: opts.month || '2-digit',\n day: opts.day || '2-digit',\n timeZone: opts.timeZone || 'UTC',\n }).format(date);\n } catch {\n return value;\n }\n },\n};\n","/** Matches a 24-hour time: HH:MM */\nconst H24_PATTERN = /^([01]?\\d|2[0-3]):([0-5]\\d)$/;\n\nexport const TimeFormatter = {\n /**\n * Converts raw input to canonical 24-hour form: HH:MM.\n * Accepts HH:MM (24h) and h:mm AM/PM (12h).\n * @param {string} raw\n * @returns {string} \"HH:MM\" or \"\" for invalid input\n */\n normalize(raw) {\n if (typeof raw !== 'string') return '';\n const trimmed = raw.trim();\n\n if (H24_PATTERN.test(trimmed)) {\n const [h, m] = trimmed.split(':');\n return `${String(parseInt(h, 10)).padStart(2, '0')}:${m}`;\n }\n\n // h:mm AM/PM\n const ampm = trimmed.match(/^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i);\n if (ampm) {\n let h = parseInt(ampm[1], 10);\n const m = ampm[2];\n const period = ampm[3].toUpperCase();\n if (period === 'AM') h = h === 12 ? 0 : h;\n else h = h === 12 ? 12 : h + 12;\n if (h > 23 || parseInt(m, 10) > 59) return '';\n return `${String(h).padStart(2, '0')}:${m}`;\n }\n\n return '';\n },\n\n /**\n * Validates that the value is a parseable time.\n * @param {string} value\n * @returns {boolean}\n */\n validate(value) {\n return TimeFormatter.normalize(value) !== '';\n },\n\n /**\n * Formats a canonical HH:MM value for display.\n * @param {string} value - Canonical \"HH:MM\" from normalize()\n * @param {Object} [opts={}]\n * @param {string} [opts.format='h12'] - 'h12' or 'h24'\n * @returns {string}\n */\n format(value, opts = {}) {\n if (typeof value !== 'string') return '';\n const match = value.match(/^(\\d{2}):(\\d{2})$/);\n if (!match) return value;\n const h = parseInt(match[1], 10);\n const m = match[2];\n if (opts.format === 'h24') return `${String(h).padStart(2, '0')}:${m}`;\n const period = h < 12 ? 'AM' : 'PM';\n const displayH = h % 12 || 12;\n return `${displayH}:${m} ${period}`;\n },\n};\n","import Plumber from './plumber';\nimport { PlainFormatter } from './formatters/plain';\nimport { CreditCardFormatter } from './formatters/credit_card';\nimport { PhoneFormatter } from './formatters/phone';\nimport { CurrencyFormatter } from './formatters/currency';\nimport { DateFormatter } from './formatters/date';\nimport { TimeFormatter } from './formatters/time';\n\nexport const FORMATTER_TYPES = {\n PLAIN: 'plain',\n CREDIT_CARD: 'creditCard',\n PHONE: 'phone',\n CURRENCY: 'currency',\n DATE: 'date',\n TIME: 'time',\n};\n\nconst registry = new Map([\n [FORMATTER_TYPES.PLAIN, PlainFormatter],\n [FORMATTER_TYPES.CREDIT_CARD, CreditCardFormatter],\n [FORMATTER_TYPES.PHONE, PhoneFormatter],\n [FORMATTER_TYPES.CURRENCY, CurrencyFormatter],\n [FORMATTER_TYPES.DATE, DateFormatter],\n [FORMATTER_TYPES.TIME, TimeFormatter],\n]);\n\nconst defaultOptions = {\n type: FORMATTER_TYPES.PLAIN,\n options: {},\n};\n\nexport class Formatter extends Plumber {\n static register(type, formatter) {\n registry.set(type, formatter);\n }\n\n constructor(controller, options = {}) {\n super(controller, options);\n this.type = options.type ?? defaultOptions.type;\n this.options = options.options ?? defaultOptions.options;\n this.enhance();\n }\n\n enhance() {\n const context = this;\n const formatter = registry.get(context.type) ?? registry.get(FORMATTER_TYPES.PLAIN);\n\n const helpers = {\n normalize: (raw) => formatter.normalize?.(raw, context.options) ?? (typeof raw === 'string' ? raw : ''),\n validate: (value) => formatter.validate?.(value, context.options) ?? true,\n format: (value) => formatter.format?.(value, context.options) ?? (typeof value === 'string' ? value : ''),\n mask: (value) => formatter.mask?.(value, context.options) ?? null,\n maskable: () => typeof formatter.mask === 'function',\n };\n\n Object.defineProperty(this.controller, 'formatter', {\n get() {\n return helpers;\n },\n configurable: true,\n });\n }\n}\n\nexport const attachFormatter = (controller, options) => new Formatter(controller, options);\n","const DATE_ONLY_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport function isValidDate(value) {\n return value instanceof Date && !isNaN(value);\n}\n\nexport function tryParseDate(...values) {\n if (values.length === 0) throw 'Missing values to parse as date';\n if (values.length === 1) {\n const dateValue = values[0];\n if (!dateValue) return undefined;\n if (typeof dateValue === 'string' && DATE_ONLY_PATTERN.test(dateValue)) {\n // YYYY-MM-DD strings are UTC by spec; use local constructor instead\n const [year, month, day] = dateValue.split('-').map(Number);\n const parsed = new Date(year, month - 1, day);\n if (isValidDate(parsed)) return parsed;\n } else {\n const parsed = new Date(dateValue);\n if (isValidDate(parsed)) return parsed;\n }\n } else {\n const parsed = new Date(...values);\n if (isValidDate(parsed)) return parsed;\n }\n}\n","import Plumber from './plumber';\nimport { isValidDate, tryParseDate } from './plumber/date';\n\nconst DAYS_PER_ROW = 7;\nconst YEAR_SIZE = 12;\nconst DECADE_SIZE = 10;\n\nconst defaultOptions = {\n locales: ['default'],\n today: '',\n day: null,\n month: null,\n year: null,\n since: null,\n till: null,\n disabledDates: [],\n disabledWeekdays: [],\n disabledDays: [],\n disabledMonths: [],\n disabledYears: [],\n firstDayOfWeek: 0,\n onNavigated: 'navigated',\n};\n\nexport class Calendar extends Plumber {\n /**\n * Creates a new Calendar plumber instance with date navigation and validation.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @param {string[]} [options.locales=['default']] - Locale identifiers for date formatting\n * @param {string|Date} [options.today=''] - Initial \"today\" date\n * @param {number} [options.day] - Initial day\n * @param {number} [options.month] - Initial month (0-11)\n * @param {number} [options.year] - Initial year\n * @param {string|Date} [options.since] - Minimum selectable date\n * @param {string|Date} [options.till] - Maximum selectable date\n * @param {Array<string|Date>} [options.disabledDates=[]] - Array of disabled dates\n * @param {string[]|number[]} [options.disabledWeekdays=[]] - Array of disabled weekdays\n * @param {string[]|number[]} [options.disabledDays=[]] - Array of disabled day numbers\n * @param {string[]|number[]} [options.disabledMonths=[]] - Array of disabled months\n * @param {string[]|number[]} [options.disabledYears=[]] - Array of disabled years\n * @param {number} [options.firstDayOfWeek=0] - First day of week (0=Sunday, 1=Monday, etc.)\n * @param {string} [options.onNavigated='navigated'] - Callback name when navigated\n */\n constructor(controller, options = {}) {\n super(controller, options);\n\n const config = Object.assign({}, defaultOptions, options);\n const { onNavigated, since, till, firstDayOfWeek } = config;\n this.onNavigated = onNavigated;\n this.since = tryParseDate(since);\n this.till = tryParseDate(till);\n this.firstDayOfWeek = 0 <= firstDayOfWeek && firstDayOfWeek < 7 ? firstDayOfWeek : defaultOptions.firstDayOfWeek;\n\n const { disabledDates, disabledWeekdays, disabledDays, disabledMonths, disabledYears } = config;\n this.disabledDates = Array.isArray(disabledDates) ? disabledDates : [];\n this.disabledWeekdays = Array.isArray(disabledWeekdays) ? disabledWeekdays : [];\n this.disabledDays = Array.isArray(disabledDays) ? disabledDays : [];\n this.disabledMonths = Array.isArray(disabledMonths) ? disabledMonths : [];\n this.disabledYears = Array.isArray(disabledYears) ? disabledYears : [];\n\n const { today, day, month, year } = config;\n this.now = tryParseDate(today) || new Date();\n\n if (typeof year === 'number' && typeof month === 'number' && typeof day === 'number') {\n this.current = tryParseDate(year, month, day);\n } else {\n this.current = this.now;\n }\n\n this.build();\n this.enhance();\n }\n\n /**\n * Builds all calendar data structures (days of week, days of month, months of year).\n */\n build() {\n this.daysOfWeek = this.buildDaysOfWeek();\n this.daysOfMonth = this.buildDaysOfMonth();\n this.monthsOfYear = this.buildMonthsOfYear();\n this.yearsOfDecade = this.buildYearsOfDecade();\n }\n\n /**\n * Builds array of weekday objects with localized names.\n * @returns {Array<Object>} Array of weekday objects\n */\n buildDaysOfWeek() {\n const longFormatter = new Intl.DateTimeFormat(this.localesValue, { weekday: 'long' });\n const shortFormatter = new Intl.DateTimeFormat(this.localesValue, { weekday: 'short' });\n\n const sunday = new Date('2024-10-06');\n const daysOfWeek = [];\n for (let i = this.firstDayOfWeek, n = i + 7; i < n; i++) {\n const weekday = new Date(sunday);\n weekday.setDate(sunday.getDate() + i);\n daysOfWeek.push({\n date: weekday,\n value: weekday.getDay(),\n long: longFormatter.format(weekday),\n short: shortFormatter.format(weekday),\n });\n }\n return daysOfWeek;\n }\n\n /**\n * Builds array of day objects for the current month view, including overflow from adjacent months.\n * @returns {Array<Object>} Array of day objects with metadata\n */\n buildDaysOfMonth() {\n const currentMonth = this.month;\n const currentYear = this.year;\n const daysOfMonth = [];\n const parseDate = (date) => ({\n current: this.month === date.getMonth() && this.year === date.getFullYear(),\n date: date,\n value: date.getDate(),\n month: date.getMonth(),\n year: date.getFullYear(),\n iso: date.toISOString(),\n });\n\n const currentWeekday = new Date(currentYear, currentMonth).getDay();\n const weekdayBeforeCurrent = this.firstDayOfWeek - currentWeekday;\n for (let i = weekdayBeforeCurrent > 0 ? weekdayBeforeCurrent - 7 : weekdayBeforeCurrent; i < 0; i++) {\n const previous = new Date(currentYear, currentMonth, i + 1);\n daysOfMonth.push(parseDate(previous));\n }\n const currentMonthTotalDays = new Date(currentYear, currentMonth + 1, 0).getDate();\n for (let i = 1; i <= currentMonthTotalDays; i++) {\n const current = new Date(currentYear, currentMonth, i);\n daysOfMonth.push(parseDate(current));\n }\n const mod = daysOfMonth.length % DAYS_PER_ROW;\n const trailing = mod === 0 ? 0 : DAYS_PER_ROW - mod;\n for (let i = 1; i <= trailing; i++) {\n const next = new Date(currentYear, currentMonth + 1, i);\n daysOfMonth.push(parseDate(next));\n }\n return daysOfMonth;\n }\n\n /**\n * Builds array of month objects with localized names for the current year.\n * @returns {Array<Object>} Array of month objects\n */\n buildMonthsOfYear() {\n const longFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'long' });\n const shortFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'short' });\n const numericFormatter = new Intl.DateTimeFormat(this.localesValue, { month: 'numeric' });\n\n const monthsOfYear = [];\n for (let i = 0; i < YEAR_SIZE; i++) {\n const date = new Date(this.year, i);\n const monthStart = new Date(this.year, i, 1);\n const monthEnd = new Date(this.year, i + 1, 0);\n const shortName = shortFormatter.format(date);\n const longName = longFormatter.format(date);\n const rangeDisabled = (this.since && monthEnd < this.since) || (this.till && monthStart > this.till);\n const listDisabled = this.disabledMonths.some((str) => i == str || shortName === str || longName === str);\n monthsOfYear.push({\n date: date,\n value: date.getMonth(),\n long: longName,\n short: shortName,\n numeric: numericFormatter.format(date),\n disabled: rangeDisabled || listDisabled,\n });\n }\n return monthsOfYear;\n }\n\n /**\n * Builds array of year objects spanning the decade containing the current year.\n * Returns 12 entries: decade start - 1 (buffer) through decade start + 10 (buffer).\n * @returns {Array<Object>} Array of year objects\n */\n buildYearsOfDecade() {\n const decadeStart = Math.floor(this.year / DECADE_SIZE) * DECADE_SIZE;\n const yearsOfDecade = [];\n for (let i = decadeStart - 1; i <= decadeStart + DECADE_SIZE; i++) {\n const bufferYear = i < decadeStart || i > decadeStart + DECADE_SIZE - 1;\n const rangeDisabled = (this.since && i < this.since.getFullYear()) || (this.till && i > this.till.getFullYear());\n const listDisabled = this.disabledYears.some((str) => i == str);\n yearsOfDecade.push({\n value: i,\n current: i === this.year,\n disabled: bufferYear || rangeDisabled || listDisabled,\n });\n }\n return yearsOfDecade;\n }\n\n /**\n * Gets the current \"today\" reference date.\n * @returns {Date} Today's date\n */\n get today() {\n return this.now;\n }\n\n /**\n * Sets the \"today\" reference date.\n * @param {Date} value - New today date\n */\n set today(value) {\n if (!isValidDate(value)) return;\n\n const month = this.month ?? value.getMonth();\n const year = this.year ?? value.getFullYear();\n const sameMonthYear = month == value.getMonth() && year == value.getFullYear();\n const day = sameMonthYear ? value.getDate() : 1;\n this.now = new Date(year, month, day);\n }\n\n /**\n * Gets the current selected date.\n * @returns {Date|null} Current date or null if not fully specified\n */\n get current() {\n if (typeof this.year === 'number' && typeof this.month === 'number' && typeof this.day === 'number') {\n return tryParseDate(this.year, this.month, this.day);\n }\n return null;\n }\n\n /**\n * Sets the current selected date.\n * @param {Date} value - New current date\n */\n set current(value) {\n if (!isValidDate(value)) return;\n\n this.day = value.getDate();\n this.month = value.getMonth();\n this.year = value.getFullYear();\n }\n\n /**\n * Navigates to a specific date, dispatching events and rebuilding calendar.\n * @param {Date} to - Target date to navigate to\n * @returns {Promise<void>}\n */\n navigate = async (to) => {\n if (!isValidDate(to)) return;\n\n const from = this.current;\n const toIso = to.toISOString();\n const fromIso = from.toISOString();\n\n this.dispatch('navigate', { detail: { from: fromIso, to: toIso } });\n\n this.current = to;\n this.build();\n await this.awaitCallback(this.onNavigated, { from: fromIso, to: toIso });\n\n this.dispatch('navigated', { detail: { from: fromIso, to: toIso } });\n };\n\n /**\n * Steps the calendar by a given amount in a specific unit (year, month, or day).\n * @param {string} type - Type of step ('year', 'month', 'day')\n * @param {number} value - Number of units to step (positive or negative)\n * @returns {Promise<void>}\n */\n step = async (type, value) => {\n if (value === 0) return;\n\n const target = this.current;\n switch (type) {\n case 'year': {\n target.setFullYear(target.getFullYear() + value);\n break;\n }\n case 'month': {\n target.setMonth(target.getMonth() + value);\n break;\n }\n case 'day': {\n target.setDate(target.getDate() + value);\n break;\n }\n default:\n return;\n }\n await this.navigate(target);\n };\n\n /**\n * Checks if a date is disabled based on configured rules.\n * @param {Date} date - Date to check\n * @returns {boolean} True if date is disabled\n */\n isDisabled = (date) => {\n if (!isValidDate(date)) return false;\n\n if (this.disabledDates.length) {\n const epoch = date.getTime();\n for (const str of this.disabledDates) {\n if (epoch === new Date(str).getTime()) return true;\n }\n }\n\n if (this.disabledWeekdays.length) {\n const target = date.getDay();\n const weekdays = this.daysOfWeek;\n const index = weekdays.findIndex((w) => w.value === target);\n if (index >= 0) {\n const weekday = weekdays[index];\n for (const str of this.disabledWeekdays) {\n if (weekday.value == str || weekday.short === str || weekday.long === str) return true;\n }\n }\n }\n\n if (this.disabledDays.length) {\n const target = date.getDate();\n for (const str of this.disabledDays) {\n if (target == str) return true;\n }\n }\n\n if (this.disabledMonths.length) {\n const target = date.getMonth();\n const months = this.monthsOfYear;\n const index = months.findIndex((m) => m.value === target);\n if (index >= 0) {\n const month = months[index];\n for (const str of this.disabledMonths) {\n if (month.value == str || month.short === str || month.long === str) return true;\n }\n }\n }\n\n if (this.disabledYears.length) {\n const target = date.getFullYear();\n for (const str of this.disabledYears) {\n if (target == str) return true;\n }\n }\n\n return false;\n };\n\n /**\n * Checks if a date is within the allowed range (since/till).\n * @param {Date} date - Date to check\n * @returns {boolean} True if date is within range\n */\n isWithinRange = (date) => {\n if (!isValidDate(date)) return false;\n\n let within = true;\n if (this.since) within = within && date >= this.since;\n if (this.till) within = within && date <= this.till;\n return within;\n };\n\n enhance() {\n const context = this;\n Object.assign(this.controller, {\n get calendar() {\n return {\n get today() {\n return context.today;\n },\n get current() {\n return context.current;\n },\n get day() {\n return context.day;\n },\n get month() {\n return context.month;\n },\n get year() {\n return context.year;\n },\n get since() {\n return context.since;\n },\n get till() {\n return context.till;\n },\n get firstDayOfWeek() {\n return context.firstDayOfWeek;\n },\n get disabledDates() {\n return context.disabledDates;\n },\n get disabledWeekdays() {\n return context.disabledWeekdays;\n },\n get disabledDays() {\n return context.disabledDays;\n },\n get disabledMonths() {\n return context.disabledMonths;\n },\n get disabledYears() {\n return context.disabledYears;\n },\n get daysOfWeek() {\n return context.daysOfWeek;\n },\n get daysOfMonth() {\n return context.daysOfMonth;\n },\n get monthsOfYear() {\n return context.monthsOfYear;\n },\n get yearsOfDecade() {\n return context.yearsOfDecade;\n },\n navigate: async (to) => await context.navigate(to),\n step: async (type, value) => await context.step(type, value),\n isDisabled: (date) => context.isDisabled(date),\n isWithinRange: (date) => context.isWithinRange(date),\n };\n },\n });\n }\n}\n\n/**\n * Factory function to create and attach a Calendar plumber to a controller.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @returns {Calendar} Calendar plumber instance\n */\nexport const initCalendar = (controller, options) => new Calendar(controller, options);\n","import Plumber from './plumber';\nimport { tryParseDate } from './plumber/date';\n\nexport class CalendarDaySelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n this.onSelect = options.onSelect || null;\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n if (!(event.target instanceof HTMLElement)) return;\n event.preventDefault();\n const input = event.target instanceof HTMLTimeElement ? event.target.parentElement : event.target;\n if (input.disabled || input.getAttribute('aria-disabled') === 'true') return;\n const time = event.target instanceof HTMLTimeElement ? event.target : event.target.querySelector('time');\n if (!time) return;\n const date = tryParseDate(time.dateTime);\n if (!date) return;\n this.dispatch('selecting', { target: input });\n const iso = date.toISOString();\n if (this.onSelect) {\n this.awaitCallback(this.onSelect, iso);\n } else {\n this.dispatch('selected', { detail: { epoch: date.getTime(), iso } });\n }\n }\n}\n\nexport class CalendarMonthSelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n const btn = event.target.closest('button[data-month]');\n if (!btn || btn.disabled || btn.getAttribute('aria-disabled') === 'true') return;\n event.preventDefault();\n const month = parseInt(btn.dataset.month, 10);\n if (isNaN(month)) return;\n this.dispatch('selected', { detail: { month } });\n }\n}\n\nexport class CalendarYearSelector extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n this.handle = this.handle.bind(this);\n }\n\n attach() {\n this.element.addEventListener('click', this.handle);\n }\n detach() {\n this.element.removeEventListener('click', this.handle);\n }\n\n handle(event) {\n const btn = event.target.closest('button[data-year]');\n if (!btn || btn.disabled || btn.getAttribute('aria-disabled') === 'true') return;\n event.preventDefault();\n const year = parseInt(btn.dataset.year, 10);\n if (isNaN(year)) return;\n this.dispatch('selected', { detail: { year } });\n }\n}\n\nexport const attachCalendarDaySelector = (controller, options) => new CalendarDaySelector(controller, options);\nexport const attachCalendarMonthSelector = (controller, options) => new CalendarMonthSelector(controller, options);\nexport const attachCalendarYearSelector = (controller, options) => new CalendarYearSelector(controller, options);\n","import Plumber from './plumber';\nimport { tryParseDate } from './plumber/date';\nimport { Requestor } from '../requestor';\n\nconst defaultOptions = {\n content: null,\n url: '',\n reload: 'never',\n stale: 3600,\n onLoad: 'canLoad',\n onLoaded: 'contentLoaded',\n};\n\nexport class ContentLoader extends Plumber {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const config = Object.assign({}, defaultOptions, options);\n const { content, url, reload, stale } = config;\n this.content = content;\n this.url = url;\n this.reload = typeof reload === 'string' ? reload : defaultOptions.reload;\n this.stale = typeof stale === 'number' ? stale : defaultOptions.stale;\n\n const { onLoad, onLoaded } = config;\n this.onLoad = onLoad;\n this.onLoaded = onLoaded;\n\n this._requestor = new Requestor();\n this.enhance();\n }\n\n get reloadable() {\n switch (this.reload) {\n case 'never':\n return false;\n case 'always':\n return true;\n default: {\n const loadedAt = tryParseDate(this.loadedAt);\n return loadedAt && new Date() - loadedAt > this.stale * 1000;\n }\n }\n }\n\n contentLoadable = ({ url }) => !!url;\n\n contentLoader = async () => '';\n\n remoteContentLoader = async (url) => {\n const res = await this._requestor.request(url);\n return res.text();\n };\n\n load = async () => {\n if (this.loadedAt && !this.reloadable) return;\n\n const loadableCallback = this.findCallback(this.onLoad);\n const loadable = await this.awaitCallback(loadableCallback || this.contentLoadable, { url: this.url });\n this.dispatch('load', { detail: { url: this.url } });\n if (!loadable) return;\n\n this.dispatch('loading', { detail: { url: this.url } });\n const content = this.url ? await this.remoteContentLoader(this.url) : await this.contentLoader();\n if (!content) return;\n\n await this.awaitCallback(this.onLoaded, { url: this.url, content });\n this.loadedAt = new Date().getTime();\n this.dispatch('loaded', { detail: { url: this.url, content } });\n };\n\n enhance() {\n const context = this;\n Object.assign(this.controller, {\n load: context.load.bind(context),\n });\n }\n}\n\nexport const attachContentLoader = (controller, options) => new ContentLoader(controller, options);\n","import Plumber from './index';\n\nexport default class WindowObserver extends Plumber {\n observe(handler) {\n this._handler = handler;\n this.events.forEach((e) => window.addEventListener(e, handler, true));\n }\n\n unobserve() {\n if (!this._handler) return;\n this.events.forEach((e) => window.removeEventListener(e, this._handler, true));\n }\n\n enhance() {\n const context = this;\n const superDisconnect = this.controller.disconnect?.bind(this.controller) || (() => {});\n this.controller.disconnect = () => {\n context.unobserve();\n superDisconnect();\n };\n }\n}\n","import WindowObserver from './plumber/window_observer';\n\nconst defaultOptions = {\n trigger: null,\n events: ['click'],\n onDismissed: 'dismissed',\n};\n\nexport class Dismisser extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { trigger, events, onDismissed } = Object.assign({}, defaultOptions, options);\n this.onDismissed = onDismissed;\n this.trigger = trigger || this.element;\n this.events = events;\n\n this.enhance();\n this.observe(this.dismiss);\n }\n\n dismiss = async (event) => {\n const { target } = event;\n if (!(target instanceof HTMLElement)) return;\n if (this.element.contains(target)) return;\n if (!this.visible) return;\n\n this.dispatch('dismiss');\n await this.awaitCallback(this.onDismissed, { target: this.trigger });\n this.dispatch('dismissed');\n };\n}\n\nexport const attachDismisser = (controller, options) => new Dismisser(controller, options);\n","import WindowObserver from './plumber/window_observer';\nimport { defineRect, viewportRect, directionMap } from './plumber/geometry';\nimport { connectTriggerToTarget } from '../accessibility/aria';\n\nconst defaultOptions = {\n anchor: null,\n events: ['click'],\n placement: 'bottom',\n alignment: 'start',\n onFlipped: 'flipped',\n ariaRole: null,\n respectMotion: true,\n};\n\nexport class Flipper extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { anchor, events, placement, alignment, onFlipped, ariaRole, respectMotion } = Object.assign(\n {},\n defaultOptions,\n options\n );\n this.anchor = anchor;\n this.events = events;\n this.placement = placement;\n this.alignment = alignment;\n this.onFlipped = onFlipped;\n this.ariaRole = ariaRole;\n this.respectMotion = respectMotion;\n this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (this.anchor && this.element) {\n connectTriggerToTarget({ trigger: this.anchor, target: this.element, role: this.ariaRole });\n }\n\n this.enhance();\n this.observe(this.flip);\n }\n\n flip = async () => {\n if (!this.visible) return;\n\n this.dispatch('flip');\n const positionStyle = window.getComputedStyle(this.element);\n if (positionStyle['position'] != 'absolute') this.element.style['position'] = 'absolute';\n\n const placement = this.flippedRect(this.anchor.getBoundingClientRect(), this.element.getBoundingClientRect());\n\n this.element.style.transition = this.respectMotion && this.prefersReducedMotion ? 'none' : '';\n\n for (const [key, value] of Object.entries(placement)) {\n this.element.style[key] = value;\n }\n\n await this.awaitCallback(this.onFlipped, { target: this.element, placement });\n this.dispatch('flipped', { detail: { placement } });\n };\n\n flippedRect(anchorRect, referenceRect) {\n const candidateRects = this.quadrumRect(anchorRect, viewportRect());\n const candidates = [this.placement, directionMap[this.placement]];\n let flipped = {};\n while (!Object.keys(flipped).length && candidates.length > 0) {\n const candidate = candidates.shift();\n if (!this.biggerRectThan(candidateRects[candidate], referenceRect)) continue;\n const placementRect = this.quadrumPlacement(anchorRect, candidate, referenceRect);\n const alignmentRect = this.quadrumAlignment(anchorRect, candidate, placementRect);\n flipped['top'] = `${alignmentRect['top'] + window.scrollY}px`;\n flipped['left'] = `${alignmentRect['left'] + window.scrollX}px`;\n }\n if (!Object.keys(flipped).length) {\n flipped['top'] = '';\n flipped['left'] = '';\n }\n return flipped;\n }\n\n quadrumRect(inner, outer) {\n return {\n left: defineRect({ x: outer.x, y: outer.y, width: inner.x - outer.x, height: outer.height }),\n right: defineRect({\n x: inner.x + inner.width,\n y: outer.y,\n width: outer.width - (inner.x + inner.width),\n height: outer.height,\n }),\n top: defineRect({ x: outer.x, y: outer.y, width: outer.width, height: inner.y - outer.y }),\n bottom: defineRect({\n x: outer.x,\n y: inner.y + inner.height,\n width: outer.width,\n height: outer.height - (inner.y + inner.height),\n }),\n };\n }\n\n quadrumPlacement(anchor, direction, reference) {\n switch (direction) {\n case 'top':\n return defineRect({\n x: reference.x,\n y: anchor.y - reference.height,\n width: reference.width,\n height: reference.height,\n });\n case 'bottom':\n return defineRect({\n x: reference.x,\n y: anchor.y + anchor.height,\n width: reference.width,\n height: reference.height,\n });\n case 'left':\n return defineRect({\n x: anchor.x - reference.width,\n y: reference.y,\n width: reference.width,\n height: reference.height,\n });\n case 'right':\n return defineRect({\n x: anchor.x + anchor.width,\n y: reference.y,\n width: reference.width,\n height: reference.height,\n });\n default:\n throw `Unable place at the quadrum, ${direction}`;\n }\n }\n\n quadrumAlignment(anchor, direction, reference) {\n switch (direction) {\n case 'top':\n case 'bottom': {\n let alignment = anchor.x;\n if (this.alignment === 'center') alignment = anchor.x + anchor.width / 2 - reference.width / 2;\n else if (this.alignment === 'end') alignment = anchor.x + anchor.width - reference.width;\n return defineRect({ x: alignment, y: reference.y, width: reference.width, height: reference.height });\n }\n case 'left':\n case 'right': {\n let alignment = anchor.y;\n if (this.alignment === 'center') alignment = anchor.y + anchor.height / 2 - reference.height / 2;\n else if (this.alignment === 'end') alignment = anchor.y + anchor.height - reference.height;\n return defineRect({ x: reference.x, y: alignment, width: reference.width, height: reference.height });\n }\n default:\n throw `Unable align at the quadrum, ${direction}`;\n }\n }\n\n biggerRectThan(big, small) {\n return big.height >= small.height && big.width >= small.width;\n }\n\n enhance() {\n super.enhance();\n this.controller.flip = this.flip;\n }\n}\n\nexport const attachFlipper = (controller, options) => new Flipper(controller, options);\n","import WindowObserver from './plumber/window_observer';\nimport { viewportRect, directionMap, defineRect } from './plumber/geometry';\n\nconst defaultOptions = {\n events: ['resize'],\n boundaries: ['top', 'left', 'right'],\n onShifted: 'shifted',\n respectMotion: true,\n};\n\nexport class Shifter extends WindowObserver {\n constructor(controller, options = {}) {\n super(controller, options);\n\n const { onShifted, events, boundaries, respectMotion } = Object.assign({}, defaultOptions, options);\n this.onShifted = onShifted;\n this.events = events;\n this.boundaries = boundaries;\n this.respectMotion = respectMotion;\n this.prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n this.enhance();\n this.observe(this.shift);\n }\n\n shift = async () => {\n if (!this.visible) return;\n\n this.dispatch('shift');\n const overflow = this.overflowRect(this.element.getBoundingClientRect(), this.elementTranslations(this.element));\n const translateX = overflow['left'] || overflow['right'] || 0;\n const translateY = overflow['top'] || overflow['bottom'] || 0;\n\n this.element.style.transition = this.respectMotion && this.prefersReducedMotion ? 'none' : '';\n this.element.style.transform = `translate(${translateX}px, ${translateY}px)`;\n\n await this.awaitCallback(this.onShifted, overflow);\n this.dispatch('shifted', { detail: overflow });\n };\n\n overflowRect(targetRect, translations) {\n const overflow = {};\n const viewport = viewportRect();\n const currentRect = defineRect({\n x: targetRect.x - translations.x,\n y: targetRect.y - translations.y,\n width: targetRect.width,\n height: targetRect.height,\n });\n for (const direction of this.boundaries) {\n const distance = this.directionDistance(currentRect, direction, viewport);\n const opposite = directionMap[direction];\n if (distance < 0) {\n const sufficientSpace = currentRect[opposite] + distance >= viewport[opposite];\n if (sufficientSpace && !overflow[opposite]) overflow[direction] = distance;\n } else {\n overflow[direction] = '';\n }\n }\n return overflow;\n }\n\n directionDistance(inner, direction, outer) {\n switch (direction) {\n case 'top':\n case 'left':\n return inner[direction] - outer[direction];\n case 'bottom':\n case 'right':\n return outer[direction] - inner[direction];\n default:\n throw `Invalid direction to calcuate distance, ${direction}`;\n }\n }\n\n elementTranslations(target) {\n const style = window.getComputedStyle(target);\n const matrix = style['transform'] || style['webkitTransform'] || style['mozTransform'];\n if (matrix === 'none' || typeof matrix === 'undefined') return { x: 0, y: 0 };\n const matrixType = matrix.includes('3d') ? '3d' : '2d';\n const matrixValues = matrix.match(/matrix.*\\((.+)\\)/)[1].split(', ');\n if (matrixType === '2d') return { x: Number(matrixValues[4]), y: Number(matrixValues[5]) };\n return { x: 0, y: 0 };\n }\n\n enhance() {\n super.enhance();\n this.controller.shift = this.shift;\n }\n}\n\nexport const attachShifter = (controller, options) => new Shifter(controller, options);\n","import Plumber from './plumber';\nimport { visibilityConfig } from './plumber/config';\nimport { setExpanded, setHidden } from '../accessibility/aria';\n\nconst defaultOptions = {\n visibility: 'visibility',\n onShown: 'shown',\n onHidden: 'hidden',\n};\n\nexport class Visibility extends Plumber {\n /**\n * Creates a new Visibility plumber instance.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @param {string} [options.visibility='visibility'] - Namespace for visibility helpers\n * @param {string} [options.onShown='shown'] - Method name on plumber instance called after showing\n * @param {string} [options.onHidden='hidden'] - Method name on plumber instance called after hiding\n */\n constructor(controller, options = {}) {\n const { visibility, onShown, onHidden, activator } = Object.assign({}, defaultOptions, options);\n\n const namespace = typeof visibility === 'string' ? visibility : defaultOptions.namespace;\n const resolver = typeof options.visible === 'string' ? options.visible : 'isVisible';\n if (typeof options.visible !== 'boolean' || options.visible) {\n options.visible = `${namespace}.${resolver}`;\n }\n super(controller, options);\n\n this.visibility = namespace;\n this.visibilityResolver = resolver;\n this.onShown = onShown;\n this.onHidden = onHidden;\n this.activator = activator instanceof HTMLElement ? activator : null;\n\n this.enhance();\n\n if (this.element instanceof HTMLElement) this.activate(this.isVisible(this.element));\n }\n\n /**\n * Checks if a target element is visible.\n * @param {HTMLElement} target - Element to check\n * @returns {boolean} True if element is visible\n */\n isVisible(target) {\n if (!(target instanceof HTMLElement)) return false;\n\n const hiddenClass = visibilityConfig.hiddenClass;\n return hiddenClass ? !target.classList.contains(hiddenClass) : !target.hasAttribute('hidden');\n }\n\n /**\n * Toggles element visibility using class or hidden attribute.\n * @param {HTMLElement} target - Element to toggle\n * @param {boolean} visible - True to show, false to hide\n */\n toggle(target, visible) {\n if (!(target instanceof HTMLElement)) return;\n\n const hiddenClass = visibilityConfig.hiddenClass;\n if (hiddenClass) {\n if (visible) target.classList.remove(hiddenClass);\n else target.classList.add(hiddenClass);\n } else {\n setHidden(target, !visible);\n }\n }\n\n /**\n * Sets aria-expanded on the activator element.\n * @param {boolean} isExpanded - True to mark as expanded, false to mark as collapsed\n */\n activate(isExpanded) {\n if (this.activator) setExpanded(this.activator, isExpanded);\n }\n\n /**\n * Shows the element and dispatches show events.\n * @returns {Promise<void>}\n */\n async show() {\n if (!(this.element instanceof HTMLElement) || this.isVisible(this.element)) return;\n\n this.dispatch('show');\n this.toggle(this.element, true);\n this.activate(true);\n\n await this.awaitCallback(this.onShown, { target: this.element });\n this.dispatch('shown');\n }\n\n /**\n * Hides the element and dispatches hide events.\n * @returns {Promise<void>}\n */\n async hide() {\n if (!(this.element instanceof HTMLElement) || !this.isVisible(this.element)) return;\n\n this.dispatch('hide');\n this.toggle(this.element, false);\n this.activate(false);\n\n await this.awaitCallback(this.onHidden, { target: this.element });\n this.dispatch('hidden');\n }\n\n enhance() {\n const context = this;\n const helpers = {\n show: context.show.bind(context),\n hide: context.hide.bind(context),\n };\n Object.defineProperty(helpers, 'visible', {\n get() {\n return context.isVisible(context.element);\n },\n });\n Object.defineProperty(helpers, this.visibilityResolver, {\n value: context.isVisible.bind(context),\n });\n Object.defineProperty(this.controller, this.visibility, {\n get() {\n return helpers;\n },\n });\n }\n}\n\n/**\n * Factory function to create and attach a Visibility plumber to a controller.\n * @param {Object} controller - Stimulus controller instance\n * @param {Object} [options] - Configuration options\n * @returns {Visibility} Visibility plumber instance\n */\nexport const attachVisibility = (controller, options) => new Visibility(controller, options);\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarYearSelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst YEARS_PER_ROW = 4;\n\nexport default class extends Controller {\n static targets = ['grid'];\n static values = {\n current: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n };\n\n initialize() {\n this.selector = attachCalendarYearSelector(this);\n initCalendar(this, {\n today: this.todayValue,\n year: this.currentValue || undefined,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n currentValueChanged() {\n if (!this.calendar || !this.hasCurrentValue) return;\n this.calendar.navigate(this.currentDate);\n }\n\n selectedValueChanged() {\n if (!this.hasGridTarget) return;\n const selected = tryParseDate(this.selectedValue);\n const selectedYear = selected ? selected.getFullYear() : null;\n this.gridTarget.querySelectorAll('button[data-year]').forEach((btn) => {\n const year = parseInt(btn.dataset.year, 10);\n btn.setAttribute('aria-selected', year === selectedYear ? 'true' : 'false');\n });\n }\n\n navigate(date) {\n this.currentValue = date.getFullYear();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n navigated() {\n this.drawGrid();\n }\n\n get currentDate() {\n return new Date(this.currentValue, 0, 1);\n }\n\n drawGrid() {\n if (!this.hasGridTarget) return;\n\n const { yearsOfDecade } = this.calendar;\n const todayYear = this.calendar.today.getFullYear();\n const selectedDate = tryParseDate(this.selectedValue);\n const selectedYear = selectedDate ? selectedDate.getFullYear() : null;\n const cells = [];\n\n for (const y of yearsOfDecade) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = y.value;\n btn.dataset.year = y.value;\n btn.setAttribute('role', 'gridcell');\n btn.setAttribute('aria-selected', y.value === selectedYear ? 'true' : 'false');\n if (y.value === todayYear) btn.setAttribute('aria-current', 'year');\n if (y.disabled) btn.setAttribute('aria-disabled', 'true');\n cells.push(btn);\n }\n\n const rowgroup = document.createElement('div');\n rowgroup.setAttribute('role', 'rowgroup');\n for (let i = 0; i < cells.length; i += YEARS_PER_ROW) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n for (const cell of cells.slice(i, i + YEARS_PER_ROW)) row.appendChild(cell);\n rowgroup.appendChild(row);\n }\n this.gridTarget.replaceChildren(rowgroup);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarYearSelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarYearSelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarDaySelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nexport default class extends Controller {\n static targets = ['daysOfWeek', 'daysOfMonth'];\n static classes = ['dayOfWeek', 'dayOfMonth', 'dayOfOtherMonth', 'row'];\n static values = {\n year: Number,\n month: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n locales: { type: Array, default: ['default'] },\n weekdayFormat: { type: String, default: 'short' },\n dayFormat: { type: String, default: 'numeric' },\n daysOfOtherMonth: { type: Boolean, default: false },\n };\n\n initialize() {\n this.selector = attachCalendarDaySelector(this, { onSelect: 'select' });\n initCalendar(this, {\n today: this.todayValue,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n yearValueChanged() {\n if (!this.calendar || !this.hasYearValue) return;\n this._scheduleNavigate();\n }\n monthValueChanged() {\n if (!this.calendar || !this.hasYearValue) return;\n this._scheduleNavigate();\n }\n\n _scheduleNavigate() {\n if (this._navigatePending) return;\n this._navigatePending = true;\n queueMicrotask(async () => {\n this._navigatePending = false;\n await this.calendar.navigate(this.currentDate);\n this.navigated();\n });\n }\n\n selectedValueChanged() {\n if (!this.hasDaysOfMonthTarget) return;\n\n this.daysOfMonthTarget.querySelectorAll('[aria-selected]').forEach((el) => {\n el.setAttribute('aria-selected', 'false');\n });\n\n if (!this.selectedValue) return;\n\n const parsed = tryParseDate(this.selectedValue);\n if (!parsed) return;\n\n const time = this.daysOfMonthTarget.querySelector(`time[datetime=\"${parsed.toISOString()}\"]`);\n if (time) time.closest('[aria-selected]')?.setAttribute('aria-selected', 'true');\n }\n\n navigate(date) {\n this.yearValue = date.getFullYear();\n this.monthValue = date.getMonth();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n select(iso) {\n const date = tryParseDate(iso);\n if (!date) return;\n this.selectedValue = iso;\n if (date.getMonth() !== this.calendar.month || date.getFullYear() !== this.calendar.year) {\n this.calendar.navigate(date);\n }\n this.dispatch('selected', { detail: { epoch: date.getTime(), iso } });\n }\n\n navigated() {\n this.drawDaysOfWeek();\n this.drawDaysOfMonth();\n this.selectedValueChanged();\n }\n\n get currentDate() {\n return new Date(this.yearValue, this.monthValue, 1);\n }\n\n createDayElement(day, { selectable = false, disabled = false } = {}) {\n const element = document.createElement(selectable ? 'button' : 'div');\n element.tabIndex = -1;\n if (day) element.textContent = day;\n else element.setAttribute('aria-hidden', 'true');\n if (disabled) {\n if (element instanceof HTMLButtonElement) element.disabled = true;\n else element.setAttribute('aria-disabled', 'true');\n }\n return element;\n }\n\n drawDaysOfWeek() {\n if (!this.hasDaysOfWeekTarget) return;\n\n const formatter = new Intl.DateTimeFormat(this.localesValue, {\n weekday: this.weekdayFormatValue,\n });\n const daysOfWeek = [];\n for (const date of this.calendar.daysOfWeek) {\n const dayElement = this.createDayElement(formatter.format(date.date));\n dayElement.setAttribute('role', 'columnheader');\n dayElement.title = date.long;\n if (this.hasDayOfWeekClass) dayElement.classList.add(...this.dayOfWeekClasses);\n daysOfWeek.push(dayElement);\n }\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n if (this.hasRowClass) row.classList.add(...this.rowClasses);\n row.replaceChildren(...daysOfWeek);\n this.daysOfWeekTarget.replaceChildren(row);\n }\n\n drawDaysOfMonth() {\n if (!this.hasDaysOfMonthTarget) return;\n\n const t = this.calendar.today;\n const today = new Date(t.getFullYear(), t.getMonth(), t.getDate()).getTime();\n const daysOfMonth = [];\n for (const date of this.calendar.daysOfMonth) {\n const dayRuleDisabled = this.calendar.isDisabled(date.date) || !this.calendar.isWithinRange(date.date);\n const dayOutsideNavigable = !date.current && this.daysOfOtherMonthValue && !dayRuleDisabled;\n const dayText = date.current || this.daysOfOtherMonthValue ? date.value : '';\n const dayElement = this.createDayElement(dayText, {\n selectable: date.current || dayOutsideNavigable,\n disabled: date.current ? dayRuleDisabled : !dayOutsideNavigable,\n });\n\n if (today === date.date.getTime()) dayElement.setAttribute('aria-current', 'date');\n if (date.current || this.daysOfOtherMonthValue) dayElement.setAttribute('aria-selected', '');\n if (!date.current && this.daysOfOtherMonthValue && this.hasDayOfOtherMonthClass) {\n dayElement.classList.add(...this.dayOfOtherMonthClasses);\n } else if (this.hasDayOfMonthClass) {\n dayElement.classList.add(...this.dayOfMonthClasses);\n }\n\n const time = document.createElement('time');\n time.dateTime = date.iso;\n dayElement.appendChild(time);\n\n daysOfMonth.push(dayElement);\n }\n\n const rows = [];\n for (let i = 0; i < daysOfMonth.length; i += 7) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n if (this.hasRowClass) row.classList.add(...this.rowClasses);\n for (const day of daysOfMonth.slice(i, i + 7)) {\n day.setAttribute('role', 'gridcell');\n row.appendChild(day);\n }\n rows.push(row);\n }\n this.daysOfMonthTarget.replaceChildren(...rows);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarDaySelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarDaySelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { initCalendar } from '../plumbers';\nimport { attachCalendarMonthSelector } from '../plumbers/calendar-selector';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst MONTHS_PER_ROW = 4;\n\nexport default class extends Controller {\n static targets = ['grid'];\n static values = {\n current: Number,\n today: { type: String, default: '' },\n selected: { type: String, default: '' },\n since: { type: String, default: '' },\n till: { type: String, default: '' },\n locales: { type: Array, default: ['default'] },\n monthFormat: { type: String, default: 'short' },\n };\n\n initialize() {\n this.selector = attachCalendarMonthSelector(this);\n initCalendar(this, {\n today: this.todayValue,\n year: this.currentValue || undefined,\n since: this.sinceValue || null,\n till: this.tillValue || null,\n });\n }\n\n connect() {\n this.selector.attach();\n this.navigated();\n }\n\n disconnect() {\n this.selector.detach();\n }\n\n currentValueChanged() {\n if (!this.calendar || !this.hasCurrentValue) return;\n this.calendar.navigate(this.currentDate);\n }\n\n selectedValueChanged() {\n if (!this.hasGridTarget) return;\n const selected = tryParseDate(this.selectedValue);\n this.gridTarget.querySelectorAll('button[data-month]').forEach((btn) => {\n const month = parseInt(btn.dataset.month, 10) - 1; // 0-indexed\n btn.setAttribute('aria-selected', selected && selected.getMonth() === month ? 'true' : 'false');\n });\n }\n\n navigate(date) {\n this.currentValue = date.getFullYear();\n }\n\n step(unit, dir) {\n return this.calendar.step(unit, dir);\n }\n\n navigated() {\n this.drawGrid();\n }\n\n get currentDate() {\n return new Date(this.currentValue, 0, 1);\n }\n\n drawGrid() {\n if (!this.hasGridTarget) return;\n\n const { year, monthsOfYear } = this.calendar;\n const today = this.calendar.today;\n const selectedDate = tryParseDate(this.selectedValue);\n const cells = [];\n\n const formatter = new Intl.DateTimeFormat(this.localesValue, { month: this.monthFormatValue });\n\n for (const m of monthsOfYear) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.textContent = formatter.format(m.date);\n btn.dataset.month = m.value + 1; // 1-indexed\n btn.setAttribute('role', 'gridcell');\n const isSelected = selectedDate && selectedDate.getMonth() === m.value;\n btn.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n if (m.value === today.getMonth() && year === today.getFullYear()) {\n btn.setAttribute('aria-current', 'month');\n }\n if (m.disabled) btn.setAttribute('aria-disabled', 'true');\n cells.push(btn);\n }\n\n const rowgroup = document.createElement('div');\n rowgroup.setAttribute('role', 'rowgroup');\n for (let i = 0; i < cells.length; i += MONTHS_PER_ROW) {\n const row = document.createElement('div');\n row.setAttribute('role', 'row');\n for (const cell of cells.slice(i, i + MONTHS_PER_ROW)) row.appendChild(cell);\n rowgroup.appendChild(row);\n }\n this.gridTarget.replaceChildren(rowgroup);\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachCalendarMonthSelector } from '../plumbers/calendar-selector';\n\nexport default class extends Controller {\n initialize() {\n this.selector = attachCalendarMonthSelector(this);\n }\n connect() {\n this.selector.attach();\n }\n disconnect() {\n this.selector.detach();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['source'];\n static values = {\n contentType: { type: String, default: 'text/plain' },\n };\n\n onPaste(event) {\n const text = event.clipboardData?.getData(this.contentTypeValue) ?? '';\n const types = Array.from(event.clipboardData?.types ?? []);\n event.preventDefault();\n this.dispatch('pasted', { detail: { text, types }, bubbles: true });\n }\n\n async copy(event) {\n const text =\n event.params?.text ??\n (this.hasSourceTarget ? (this.sourceTarget.value ?? this.sourceTarget.textContent ?? '') : '');\n try {\n await navigator.clipboard.writeText(text);\n this.dispatch('copied', { detail: { text }, bubbles: true });\n } catch (error) {\n this.dispatch('copy-failed', { detail: { error }, bubbles: true });\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { tryParseDate } from '../plumbers/plumber/date';\n\nconst VIEWS = ['month', 'year', 'decade'];\n\nexport default class extends Controller {\n static targets = ['previous', 'next', 'day', 'month', 'year', 'viewTitle'];\n static outlets = ['calendar-month', 'calendar-year', 'calendar-decade'];\n static values = {\n date: String,\n view: { type: String, default: 'month' },\n locales: { type: Array, default: ['default'] },\n dayFormat: { type: String, default: 'numeric' },\n monthFormat: { type: String, default: 'long' },\n yearFormat: { type: String, default: 'numeric' },\n };\n\n initialize() {\n this.previous = this.previous.bind(this);\n this.next = this.next.bind(this);\n }\n\n async calendarMonthOutletConnected() {\n if (this.dateValue) {\n const date = tryParseDate(this.dateValue);\n if (date) await this.calendarMonthOutlet.calendar.navigate(date);\n }\n this.draw();\n }\n\n onDaySelect(event) {\n this.dateValue = event.detail.iso;\n this.draw();\n this.dispatch('selected', { detail: { value: event.detail.iso }, bubbles: true });\n }\n\n zoomOut() {\n const idx = VIEWS.indexOf(this.viewValue);\n if (idx < VIEWS.length - 1) {\n this.viewValue = VIEWS[idx + 1];\n this.draw();\n }\n }\n\n async onMonthSelect(event) {\n const { month } = event.detail; // 1-indexed\n if (!this.hasCalendarMonthOutlet) return;\n const { year } = this.calendarMonthOutlet.calendar;\n await this.calendarMonthOutlet.calendar.navigate(new Date(year, month - 1, 1));\n this.viewValue = 'month';\n this.draw();\n }\n\n async onYearSelect(event) {\n const { year } = event.detail;\n if (!this.hasCalendarMonthOutlet) return;\n const { month } = this.calendarMonthOutlet.calendar;\n await this.calendarMonthOutlet.calendar.navigate(new Date(year, month, 1));\n if (this.hasCalendarYearOutlet) {\n this.calendarYearOutlet.navigate(this.calendarMonthOutlet.calendar.current);\n }\n this.viewValue = 'year';\n this.draw();\n }\n\n previousTargetConnected(target) {\n target.addEventListener('click', this.previous);\n }\n\n previousTargetDisconnected(target) {\n target.removeEventListener('click', this.previous);\n }\n\n async previous() {\n await this.calendarMonthOutlet.calendar.step(...this.stepArgs(-1));\n this.syncOutletValues();\n this.draw();\n }\n\n nextTargetConnected(target) {\n target.addEventListener('click', this.next);\n }\n\n nextTargetDisconnected(target) {\n target.removeEventListener('click', this.next);\n }\n\n async next() {\n await this.calendarMonthOutlet.calendar.step(...this.stepArgs(1));\n this.syncOutletValues();\n this.draw();\n }\n\n draw() {\n this.drawDay();\n this.drawMonth();\n this.drawYear();\n this.drawViewTitle();\n this.drawView();\n }\n\n drawDay() {\n if (!this.hasDayTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month, day } = this.calendarMonthOutlet.calendar;\n this.dayTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { day: this.dayFormatValue }).format(\n new Date(year, month, day)\n );\n }\n\n drawMonth() {\n if (!this.hasMonthTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month } = this.calendarMonthOutlet.calendar;\n this.monthTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { month: this.monthFormatValue }).format(\n new Date(year, month)\n );\n }\n\n drawYear() {\n if (!this.hasYearTarget || !this.hasCalendarMonthOutlet) return;\n const { year } = this.calendarMonthOutlet.calendar;\n this.yearTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { year: this.yearFormatValue }).format(\n new Date(year, 0)\n );\n }\n\n drawViewTitle() {\n if (!this.hasViewTitleTarget || !this.hasCalendarMonthOutlet) return;\n const { year, month } = this.calendarMonthOutlet.calendar;\n this.viewTitleTarget.textContent = this.viewTitleLabel(year, month);\n }\n\n syncOutletValues() {\n if (!this.hasCalendarMonthOutlet) return;\n const { current } = this.calendarMonthOutlet.calendar;\n if (!current) return;\n if (this.hasCalendarYearOutlet) this.calendarYearOutlet.navigate(current);\n if (this.hasCalendarDecadeOutlet) this.calendarDecadeOutlet.navigate(current);\n }\n\n stepArgs(direction) {\n if (this.viewValue === 'year') return ['year', direction];\n if (this.viewValue === 'decade') return ['year', direction * 10];\n return ['month', direction];\n }\n\n viewTitleLabel(year, month) {\n if (this.viewValue === 'year') return String(year);\n if (this.viewValue === 'decade') {\n const start = Math.floor(year / 10) * 10;\n return `${start}–${start + 9}`;\n }\n return new Intl.DateTimeFormat(this.localesValue, { month: 'long', year: 'numeric' }).format(new Date(year, month));\n }\n\n drawView() {\n const inMonthView = this.viewValue === 'month';\n const inYearView = this.viewValue === 'year';\n const inDecadeView = this.viewValue === 'decade';\n\n if (this.hasCalendarMonthOutlet) {\n const outlet = this.calendarMonthOutlet;\n if (outlet.hasDaysOfWeekTarget) outlet.daysOfWeekTarget.hidden = !inMonthView;\n if (outlet.hasDaysOfMonthTarget) outlet.daysOfMonthTarget.hidden = !inMonthView;\n }\n if (this.hasCalendarYearOutlet) {\n this.calendarYearOutletElement.hidden = !inYearView;\n }\n if (this.hasCalendarDecadeOutlet) {\n this.calendarDecadeOutletElement.hidden = !inDecadeView;\n }\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { Requestor } from '../requestor';\nimport { filterOptions } from '../researcher';\nimport { ListboxNavigation } from '../accessibility/keyboard';\n\nexport default class extends Controller {\n static targets = ['listbox', 'loading', 'empty'];\n static values = {\n url: { type: String, default: '' },\n field: { type: String, default: 'q' },\n delay: { type: Number, default: 300 },\n };\n\n initialize() {\n this._requestor = new Requestor();\n }\n\n connect() {\n if (this.hasListboxTarget) {\n this.listboxNav = new ListboxNavigation(this.listboxTarget);\n }\n }\n\n disconnect() {\n this._requestor.cancel();\n }\n\n onSelect(event) {\n const option = event.target.closest('[role=\"option\"]');\n if (!option || option.getAttribute('aria-disabled') === 'true') return;\n this.select(option.dataset.value ?? '');\n }\n\n select(value) {\n const options = this.listboxTarget.querySelectorAll('[role=\"option\"]');\n options.forEach((o) => o.setAttribute('aria-selected', 'false'));\n const option = [...options].find((o) => o.dataset.value === value);\n if (option) option.setAttribute('aria-selected', 'true');\n this.dispatch('selected', { detail: { value }, bubbles: true });\n }\n\n onNavigate(event) {\n this.listboxNav?.handleKeyDown(event);\n }\n\n filter(query) {\n if (this.urlValue) {\n const url = new URL(this.urlValue, window.location.href);\n url.searchParams.set(this.fieldValue, query);\n this.setLoading(true);\n this._requestor.schedule(\n () =>\n this._requestor\n .request(url)\n .then((r) => r.text())\n .then((html) => {\n this.listboxTarget.innerHTML = html;\n this.setEmpty(this.listboxTarget.querySelectorAll('[role=\"option\"]').length === 0);\n })\n .catch((err) => {\n if (err.name !== 'AbortError') console.error('[combobox-dropdown] fetch failed', err);\n })\n .finally(() => this.setLoading(false)),\n this.delayValue\n );\n } else {\n const visible = filterOptions(this.listboxTarget, query);\n this.setEmpty(visible === 0);\n }\n }\n\n showAll() {\n this.listboxTarget.querySelectorAll('[role=\"option\"]').forEach((o) => (o.hidden = false));\n this.setEmpty(false);\n }\n\n setLoading(on) {\n if (this.hasLoadingTarget) this.loadingTarget.hidden = !on;\n }\n\n setEmpty(on) {\n if (this.hasEmptyTarget) this.emptyTarget.hidden = !on;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['hour', 'minute', 'period'];\n\n connect() {\n this.select(this.toH24());\n }\n\n onSelect(event) {\n const item = event.target.closest('[role=\"option\"]');\n if (!item) return;\n const drum = item.closest('[role=\"listbox\"]');\n drum.querySelectorAll('[role=\"option\"]').forEach((o) => o.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n this.select(this.toH24());\n }\n\n select(value) {\n if (value) this.dispatch('selected', { detail: { value }, bubbles: true });\n }\n\n onNavigate(event) {\n if (!['ArrowUp', 'ArrowDown'].includes(event.key)) return;\n event.preventDefault();\n this.step(event.currentTarget, event.key === 'ArrowDown' ? 1 : -1);\n }\n\n step(drum, delta) {\n const items = [...drum.querySelectorAll('[role=\"option\"]')];\n const current = drum.querySelector('[aria-selected=\"true\"]');\n const idx = items.indexOf(current);\n const next = delta > 0 ? items[Math.min(idx + 1, items.length - 1)] : items[Math.max(idx - 1, 0)];\n if (!next || next === current) return;\n items.forEach((o) => o.setAttribute('aria-selected', 'false'));\n next.setAttribute('aria-selected', 'true');\n next.scrollIntoView({ block: 'nearest' });\n this.select(this.toH24());\n }\n\n toH24() {\n const h = this.selectedValue(this.hourTarget);\n const m = this.selectedValue(this.minuteTarget);\n if (!h || !m) return null;\n if (!this.hasPeriodTarget) return `${h}:${m}`;\n const period = this.selectedValue(this.periodTarget);\n let hour = parseInt(h, 10);\n if (period === 'AM') hour = hour === 12 ? 0 : hour;\n else hour = hour === 12 ? 12 : hour + 12;\n return `${String(hour).padStart(2, '0')}:${m}`;\n }\n\n selectedValue(drum) {\n return drum?.querySelector('[aria-selected=\"true\"]')?.dataset.value ?? null;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachDismisser } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['trigger'];\n\n connect() {\n attachDismisser(this, { trigger: this.hasTriggerTarget ? this.triggerTarget : null });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachFlipper } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['anchor', 'reference'];\n static values = {\n placement: { type: String, default: 'bottom' },\n alignment: { type: String, default: 'start' },\n role: { type: String, default: 'tooltip' },\n };\n\n connect() {\n if (!this.hasReferenceTarget) {\n console.error(\n 'FlipperController requires a reference target. Add data-flipper-target=\"reference\" to your element.'\n );\n return;\n }\n\n if (!this.hasAnchorTarget) {\n console.error('FlipperController requires an anchor target. Add data-flipper-target=\"anchor\" to your element.');\n return;\n }\n\n attachFlipper(this, {\n element: this.referenceTarget,\n anchor: this.anchorTarget,\n placement: this.placementValue,\n alignment: this.alignmentValue,\n ariaRole: this.roleValue,\n });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['trigger', 'input'];\n static values = {\n value: String,\n minLength: { type: Number, default: 1 },\n };\n static outlets = ['combobox-dropdown'];\n\n onSelect(event) {\n if (event.detail?.value !== undefined) this.valueValue = event.detail.value;\n }\n\n onInput(event) {\n if (event.target !== this.triggerTarget) return;\n const query = event.target.value.trim();\n if (query.length < this.minLengthValue) {\n if (this.hasComboboxDropdownOutlet) this.comboboxDropdownOutlet.showAll();\n return;\n }\n if (this.hasComboboxDropdownOutlet) this.comboboxDropdownOutlet.filter(query);\n }\n\n valueValueChanged(newVal) {\n if (this.hasInputTarget) this.inputTarget.value = newVal;\n this.dispatch('changed', { detail: { value: newVal } });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { setPressed } from '../accessibility/aria';\nimport { attachFormatter } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['input', 'toggle'];\n static values = {\n format: { type: String, default: 'plain' },\n options: { type: Object, default: {} },\n revealed: { type: Boolean, default: false },\n };\n\n connect() {\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n this.drawToggle();\n }\n\n formatValueChanged() {\n if (!this.formatter) return;\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n this.drawToggle();\n }\n\n optionsValueChanged() {\n if (!this.formatter) return;\n attachFormatter(this, { type: this.formatValue, options: this.optionsValue });\n this.format(this.readValue());\n }\n\n revealedValueChanged() {\n if (!this.formatter) return;\n this.format(this.readValue());\n this.drawToggle();\n }\n\n onChange(event) {\n this.format(event?.detail?.value ?? '');\n }\n\n format(value) {\n if (!this.formatter) return;\n this.onFormatting(value);\n }\n\n toggle() {\n if (!this.formatter.maskable() && this.formatValue !== 'password') return;\n this.revealedValue = !this.revealedValue;\n }\n\n onPaste(event) {\n const raw = event.detail?.text ?? '';\n if (!this.formatter || !raw) return;\n const value = this.formatter.normalize(raw);\n if (!this.formatter.validate(value)) return;\n this.format(value);\n }\n\n drawToggle() {\n if (!this.hasToggleTarget) return;\n const hasToggleBehavior = this.formatter?.maskable() || this.formatValue === 'password';\n this.toggleTarget.hidden = !hasToggleBehavior;\n if (hasToggleBehavior) setPressed(this.toggleTarget, this.revealedValue);\n }\n\n readValue() {\n if (!this.hasInputTarget) return '';\n return this.inputTarget instanceof HTMLInputElement ? this.inputTarget.value : this.inputTarget.textContent;\n }\n\n onFormatting(raw) {\n if (!this.formatter) return;\n\n if (this.formatValue === 'password') {\n if (this.hasInputTarget) this.inputTarget.type = this.revealedValue ? 'text' : 'password';\n return;\n }\n\n const value = this.formatter.normalize(raw);\n const formatted =\n this.revealedValue || !this.formatter.maskable() ? this.formatter.format(value) : this.formatter.mask(value);\n\n if (this.hasInputTarget) {\n if (this.inputTarget instanceof HTMLInputElement) {\n this.inputTarget.value = formatted;\n } else {\n this.inputTarget.textContent = formatted;\n }\n }\n\n this.dispatch('formatted', { detail: { value: formatted } });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n static targets = ['input', 'clear'];\n\n initialize() {\n this.onInput = this.draw.bind(this);\n this.onEscape = this.handleEscape.bind(this);\n }\n\n connect() {\n this.draw();\n }\n\n inputTargetConnected(input) {\n input.addEventListener('input', this.onInput);\n input.addEventListener('keydown', this.onEscape);\n }\n\n inputTargetDisconnected(input) {\n input.removeEventListener('input', this.onInput);\n input.removeEventListener('keydown', this.onEscape);\n }\n\n clear() {\n if (!this.hasInputTarget) return;\n this.inputTarget.value = '';\n this.draw();\n this.inputTarget.focus();\n this.inputTarget.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n draw() {\n if (!this.hasInputTarget || !this.hasClearTarget) return;\n this.clearTarget.hidden = this.inputTarget.value.length === 0;\n }\n\n handleEscape(event) {\n if (event.key !== 'Escape') return;\n if (this.inputTarget.value === '') return;\n event.preventDefault();\n this.clear();\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { FocusTrap } from '../accessibility/focus';\nimport { announce } from '../accessibility/aria';\nimport { attachDismisser } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['modal', 'overlay'];\n\n initialize() {\n this.onCancel = this.close.bind(this);\n }\n\n connect() {\n if (!this.hasModalTarget) {\n console.error('ModalController requires a modal target. Add data-modal-target=\"modal\" to your element.');\n }\n }\n\n modalTargetConnected(modal) {\n this.isNativeDialog = modal instanceof HTMLDialogElement;\n if (this.isNativeDialog) {\n modal.addEventListener('cancel', this.onCancel);\n modal.addEventListener('click', this.onBackdropClick);\n } else {\n this.focusTrap = new FocusTrap(modal, {\n escapeDeactivates: true,\n onDeactivate: () => this.close(),\n });\n attachDismisser(this, { element: modal });\n }\n }\n\n modalTargetDisconnected(modal) {\n if (this.isNativeDialog) {\n modal.removeEventListener('cancel', this.onCancel);\n modal.removeEventListener('click', this.onBackdropClick);\n }\n }\n\n dismissed = () => {\n this.close();\n };\n\n open(event) {\n if (event) event.preventDefault();\n if (!this.hasModalTarget) return;\n\n if (this.isNativeDialog) {\n this.previouslyFocused = document.activeElement;\n this.modalTarget.showModal();\n } else {\n const targetToShow = this.hasOverlayTarget ? this.overlayTarget : this.modalTarget;\n targetToShow.hidden = false;\n\n document.body.style.overflow = 'hidden';\n\n if (this.focusTrap) {\n this.focusTrap.activate();\n }\n }\n\n announce('Modal opened');\n }\n\n close(event) {\n if (event) event.preventDefault();\n if (!this.hasModalTarget) return;\n\n if (this.isNativeDialog) {\n this.modalTarget.close();\n\n if (this.previouslyFocused && this.previouslyFocused.isConnected) {\n setTimeout(() => {\n this.previouslyFocused.focus();\n }, 0);\n }\n } else {\n const targetToHide = this.hasOverlayTarget ? this.overlayTarget : this.modalTarget;\n targetToHide.hidden = true;\n\n document.body.style.overflow = '';\n\n if (this.focusTrap) {\n this.focusTrap.deactivate();\n }\n }\n\n announce('Modal closed');\n }\n\n onBackdropClick = (event) => {\n const rect = this.modalTarget.getBoundingClientRect();\n const isOutsideDialog =\n event.clientY < rect.top ||\n event.clientY > rect.bottom ||\n event.clientX < rect.left ||\n event.clientX > rect.right;\n\n if (isOutsideDialog) {\n this.close();\n }\n };\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { attachShifter } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['content'];\n\n connect() {\n attachShifter(this, { element: this.hasContentTarget ? this.contentTarget : null });\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { focusFirst } from '../accessibility/focus';\nimport { announce } from '../accessibility/aria';\nimport { attachContentLoader, attachDismisser, attachVisibility } from '../plumbers';\n\nexport default class extends Controller {\n static targets = ['trigger', 'panel', 'template', 'loader'];\n static classes = ['hidden'];\n static values = {\n url: String,\n loadedAt: String,\n reload: { type: String, default: 'never' },\n staleAfter: { type: Number, default: 3600 },\n closeOnSelect: { type: Boolean, default: true },\n announceOpen: { type: String, default: 'Panel opened' },\n announceClose: { type: String, default: 'Panel closed' },\n };\n\n connect() {\n attachContentLoader(this, {\n element: this.hasPanelTarget ? this.panelTarget : null,\n url: this.hasUrlValue ? this.urlValue : null,\n });\n\n if (this.hasPanelTarget) {\n attachVisibility(this, {\n element: this.panelTarget,\n activator: this.hasTriggerTarget ? this.triggerTarget : null,\n });\n attachDismisser(this);\n }\n if (this.hasLoaderTarget)\n attachVisibility(this, { element: this.loaderTarget, visibility: 'contentLoaderVisibility' });\n }\n\n async dismissed() {\n await this.close();\n }\n\n async open() {\n if (!this.hasPanelTarget) return;\n await this.visibility.show();\n }\n\n async close() {\n if (!this.hasPanelTarget) return;\n await this.visibility.hide();\n }\n\n async toggle() {\n this.visibility?.visible ? await this.close() : await this.open();\n }\n\n async closeOnSelect() {\n if (this.closeOnSelectValue) await this.close();\n }\n\n async shown() {\n await this.load();\n if (this.hasPanelTarget) focusFirst(this.panelTarget);\n announce(this.announceOpenValue);\n }\n\n async hidden() {\n if (this.hasTriggerTarget) this.triggerTarget.focus();\n announce(this.announceCloseValue);\n }\n\n canLoad() {\n if (this.hasPanelTarget && this.panelTarget.tagName.toLowerCase() === 'turbo-frame') {\n if (this.hasUrlValue) this.panelTarget.setAttribute('src', this.urlValue);\n return false;\n }\n return true;\n }\n\n async contentLoading() {\n if (this.hasLoaderTarget) await this.contentLoaderVisibility.show();\n }\n\n async contentLoaded({ content }) {\n if (this.hasPanelTarget) {\n this.panelTarget.replaceChildren(this.getContentNode(content));\n }\n if (this.hasLoaderTarget) await this.contentLoaderVisibility.hide();\n }\n\n getContentNode(content) {\n if (typeof content === 'string') {\n const template = document.createElement('template');\n template.innerHTML = content;\n return document.importNode(template.content, true);\n }\n return document.importNode(content, true);\n }\n\n contentLoader() {\n if (!this.hasTemplateTarget) return;\n if (this.templateTarget instanceof HTMLTemplateElement) return this.templateTarget.content;\n\n return this.templateTarget.innerHTML;\n }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { DateFormatter } from '../plumbers/formatters/date';\nimport { RovingTabIndex } from '../accessibility/keyboard';\nimport { setExpanded, setHidden, announce } from '../accessibility/aria';\n\nexport default class extends Controller {\n static targets = ['trigger', 'detail', 'time'];\n static values = {\n dateFormat: { type: Object, default: {} },\n };\n\n connect() {\n this.rovingTabIndex = new RovingTabIndex(this.triggerTargets, { orientation: 'vertical' });\n this.rovingTabIndex.activate();\n }\n\n disconnect() {\n this.rovingTabIndex?.deactivate();\n this.rovingTabIndex = null;\n }\n\n toggle(event) {\n const trigger = event.currentTarget;\n trigger.getAttribute('aria-expanded') === 'true' ? this.collapseItem(trigger) : this.expandItem(trigger);\n }\n\n expand(event) {\n this.expandItem(event.currentTarget);\n }\n\n collapse(event) {\n this.collapseItem(event.currentTarget);\n }\n\n expandItem(trigger) {\n const detail = this.detailTargets.find((d) => d.id === trigger.getAttribute('aria-controls')) ?? null;\n this.dispatch('expand', { detail: { trigger, detail } });\n setExpanded(trigger, true);\n if (detail) {\n setHidden(detail, false);\n announce(`${trigger.textContent.trim()} expanded`);\n }\n this.dispatch('expanded', { detail: { trigger, detail } });\n }\n\n collapseItem(trigger) {\n const detail = this.detailTargets.find((d) => d.id === trigger.getAttribute('aria-controls')) ?? null;\n this.dispatch('collapse', { detail: { trigger, detail } });\n setExpanded(trigger, false);\n if (detail) {\n setHidden(detail, true);\n announce(`${trigger.textContent.trim()} collapsed`);\n }\n this.dispatch('collapsed', { detail: { trigger, detail } });\n }\n\n triggerTargetConnected(trigger) {\n if (!trigger.hasAttribute('aria-expanded')) trigger.setAttribute('aria-expanded', 'false');\n this.rovingTabIndex?.updateItems(this.triggerTargets);\n }\n\n triggerTargetDisconnected() {\n this.rovingTabIndex?.updateItems(this.triggerTargets);\n }\n\n timeTargetConnected(el) {\n if (!Object.keys(this.dateFormatValue).length || el.textContent.trim()) return;\n const formatted = DateFormatter.format(el.getAttribute('datetime'), this.dateFormatValue);\n if (formatted) el.textContent = formatted;\n }\n}\n"],"mappings":"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"}
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stimulus_plumbers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ryan Chang
|
|
@@ -41,8 +41,10 @@ files:
|
|
|
41
41
|
- README.md
|
|
42
42
|
- app/assets/javascripts/stimulus-plumbers/.keep
|
|
43
43
|
- app/assets/javascripts/stimulus-plumbers/controllers.manifest.json
|
|
44
|
-
- app/assets/javascripts/stimulus-plumbers/
|
|
45
|
-
- app/assets/javascripts/stimulus-plumbers/
|
|
44
|
+
- app/assets/javascripts/stimulus-plumbers/index.es.js
|
|
45
|
+
- app/assets/javascripts/stimulus-plumbers/index.es.js.map
|
|
46
|
+
- app/assets/javascripts/stimulus-plumbers/index.umd.js
|
|
47
|
+
- app/assets/javascripts/stimulus-plumbers/index.umd.js.map
|
|
46
48
|
- app/assets/stylesheets/stimulus_plumbers/tokens.css
|
|
47
49
|
- config/locales/en.yml
|
|
48
50
|
- lib/stimulus_plumbers.rb
|