stimulus-library 0.7.2 → 0.7.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"stimulus-library.cjs.js","sources":["../src/utilities/logging.ts","../src/utilities/events.ts","../src/utilities/base_controller.ts","../src/utilities/ephemeral_controller.ts","../src/utilities/scroll.ts","../src/utilities/turbo.ts","../node_modules/mitt/dist/mitt.mjs","../src/utilities/event_bus.ts","../src/utilities/elements.ts","../src/utilities/request_submit.ts","../src/utilities/arrays.ts","../src/mixins/create_mixin.ts","../src/mixins/use_event_listener.ts","../src/mixins/use_fullscreen.ts","../src/utilities/reactive.ts","../src/mixins/use_geolocation.ts","../src/mixins/use_injected_html.ts","../src/mixins/use_interval.ts","../src/mixins/use_localstorage.ts","../src/mixins/use_timeout.ts","../src/mixins/use_temporary_content.ts","../src/utilities/fetchRetry.ts","../src/controllers/ajax/load_block_controller.ts","../src/controllers/ajax/async_block_controller.ts","../src/mixins/use_intersection.ts","../src/controllers/ajax/lazy_block_controller.ts","../src/controllers/ajax/poll_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../src/controllers/forms/autosize_controller.ts","../src/utilities/stimulus.ts","../src/utilities/strings.ts","../src/mixins/install_class_methods.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_disable_inputs_controller.ts","../src/controllers/forms/checkbox_enable_inputs_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/forms/checkbox_xor_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/forms/focus_steal_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/forms/navigate_form_errors_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/mixins/use_event_bus.ts","../src/controllers/forms/sync_inputs_controller.ts","../src/controllers/forms/value_warn_controller.ts","../src/controllers/forms/word_count_controller.ts","../src/controllers/media/fallback_image_controller.ts","../node_modules/dialog-polyfill/dist/dialog-polyfill.esm.js","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/scroll/scroll_container_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/signal/expressions.ts","../src/controllers/signal/events.ts","../src/controllers/signal/signal_action_controller.ts","../src/mixins/use_mutation_observer.ts","../src/controllers/signal/signal_dom_children_controller.ts","../src/controllers/signal/signal_input_controller.ts","../src/controllers/signal/signal_visibility_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/utility/alert_controller.ts","../src/controllers/utility/fullscreen_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/utility/interval_controller.ts","../src/controllers/utility/presence_controller.ts","../src/controllers/utility/print_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/utility/user_focus_controller.ts","../src/controllers/visual/clock_controller.ts","../src/controllers/visual/countdown_controller.ts","../src/controllers/visual/duration_controller.ts","../src/controllers/visual/tabs_controller.ts","../src/controllers/visual/time_distance_controller.ts","../src/controllers/visual/tree_view_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/back_link_controller.ts","../src/controllers/clipboard_controller.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/prefetch_controller.ts","../src/controllers/print_button_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/temporary_state_controller.ts","../src/mixins/use_click_outside.ts","../src/mixins/use_hover.ts","../src/controllers/toggle_class_controller.ts","../src/mixins/use_trix_modifiers.ts","../src/controllers/trix_modifier_controller.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts"],"sourcesContent":["import {Controller} from \"stimulus\";\n\nexport function logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n if (/^.*?ClassesPresent$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n\n\nexport function log(controller: Controller, functionName: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(...colorize(controller.identifier, \"#3B82F6\"), `#${functionName}`);\n logger.log({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function warn(controller: Controller, warning: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(...colorize(controller.identifier, \"#F39B1AFF\"), `!! ${warning} !!`);\n logger.warn({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function logEvent(controller: Controller, eventName: string, event: CustomEvent, element: HTMLElement) {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(\n ...colorizeMany([\n {text: controller.identifier, color: \"#3B82F6\"},\n {text: eventName, color: \"#0be000\"},\n ]),\n event.detail,\n );\n logger.log(...colorize(\"Dispatched on\", \"#3b82f6\"), element);\n logger.log(...colorize(\"event\", \"#3b82f6\"), event);\n logger.log(...colorize(\"event details\", \"#3b82f6\"), event.detail);\n logger.groupEnd();\n}\n\ninterface ColorMapping {\n text: string;\n color: string;\n}\n\nfunction colorize(text: string, color: string): string[] {\n return colorizeMany([{text, color}]);\n}\n\nfunction colorizeMany(texts: ColorMapping[]): string[] {\n let str = \"\";\n let colors = texts.flatMap(x => {\n str += `%c${x.text}%c `;\n return [`color: ${x.color}`, \"color: unset\"];\n });\n\n return [str, ...colors];\n}\n","import {Controller} from \"stimulus\";\nimport {logEvent} from \"./logging\";\n\nexport function dispatchEvent(controller: Controller, element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n logEvent(controller, eventName, event, element);\n element.dispatchEvent(event);\n}\n","import {Context, Controller} from \"stimulus\";\nimport {log, logProperty} from \"./logging\";\nimport {dispatchEvent} from \"./events\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n // @ts-ignore\n if (!this.application.debug) {\n return this;\n }\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (\"logFormattedMessage\" in this.application) {\n return returnVal;\n }\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n log(self, prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n log(this, prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n get isTurboPreview(): boolean {\n return document.documentElement.hasAttribute('data-turbo-preview') || document.documentElement.hasAttribute('data-turbolinks-preview');\n }\n\n get isTurbolinksPreview(): boolean {\n return this.isTurboPreview;\n }\n\n get csrfToken(): string | null {\n return this.metaValue('csrf-token');\n }\n\n metaValue(name: string): string | null {\n const element = document.head.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || null;\n }\n\n dispatchEvent(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n dispatchEvent(this, element, eventName, options);\n }\n\n}\n","import {camelCase} from \"lodash-es\";\nimport {BaseController} from \"./base_controller\";\n\nexport class EphemeralController extends BaseController {\n\n _cleanupSelf() {\n this.cleanup(this.el);\n }\n\n cleanup(element: HTMLElement) {\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\\\s|^)${this.identifier}(\\\\s|$)`, \"g\"), \"\") || \"\";\n if (element.dataset.controller == \"\") {\n // If there are no controllers left, remove the attribute\n delete element.dataset.controller;\n }\n\n let substringIdentifierValueRegex = new RegExp(`(\\\\s|^)${this.identifier}\\\\..+?(\\\\s|$)`, \"g\");\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-target`)];\n if (element.dataset.target == \"\") {\n // If there are no targets left, remove the attribute\n delete element.dataset.target;\n }\n\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-action`)];\n if (element.dataset.action == \"\") {\n // If there are no actions left, remove the attribute\n delete element.dataset.action;\n }\n\n // @ts-ignore\n let values = this.constructor.values;\n if (values) {\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\n }\n\n // @ts-ignore\n let classes = this.constructor.classes;\n if (classes) {\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\nlet smoothPolyfilled: boolean;\n\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollIntoView({behavior, block, inline});\n}\n\nexport async function scrollAbsoluteTop(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({top: 0, left: 0, behavior});\n}\n\nexport async function scrollAbsoluteBottom(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({top: document.body.scrollHeight, left: 0, behavior});\n } else {\n element.scrollTo({top: (element as Element).scrollHeight, left: 0, behavior});\n }\n}\n\nexport async function scrollAbsoluteLeft(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({left: 0, behavior});\n}\n\nexport async function scrollAbsoluteRight(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({left: document.body.scrollWidth, behavior});\n } else {\n element.scrollTo({left: (element as Element).scrollWidth, behavior});\n }\n}\n\nexport async function scrollUp(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: -amount, left: 0, behavior});\n}\n\nexport async function scrollDown(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: amount, left: 0, behavior});\n}\n\nexport async function scrollLeft(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: -amount, behavior});\n}\n\nexport async function scrollRight(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: amount, behavior});\n}\n\nasync function polyfillSmooth() {\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\n if (smoothPolyfilled) {\n return;\n }\n smoothPolyfilled = true;\n polyfill();\n}\n\nexport function getScrollParent(node: HTMLElement | null): Window | HTMLElement | null {\n if (!node) {\n return null;\n }\n\n if (node == document.body) {\n return window;\n }\n\n const overflowY = getComputedStyle(node).overflowY;\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\n\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\n return node;\n }\n\n return getScrollParent(node.parentElement) || document.body;\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\n return element.nodeName == \"TURBO-FRAME\";\n}\n","export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","import mitt from 'mitt';\n\nexport const EventBus = mitt<{ [idx: string]: any }>();\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLLabelElement(element: Element): element is HTMLLabelElement {\n return element.nodeName == \"LABEL\";\n}\n\nexport function isHTMLTextAreaElement(element: Element): element is HTMLTextAreaElement {\n return element.nodeName == \"TEXTAREA\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isHTMLButtonInputElement(element: Element): element is HTMLInputElement & { type: \"button\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"button\";\n}\n\nexport function isHTMLSubmitInputElement(element: Element): element is HTMLInputElement & { type: \"submit\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"submit\";\n}\n\nexport function isHTMLResetInputElement(element: Element): element is HTMLInputElement & { type: \"reset\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"reset\";\n}\n\nexport function isHTMLButtonButtonElement(element: Element): element is HTMLButtonElement & { type: \"button\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"button\";\n}\n\nexport function isHTMLSubmitButtonElement(element: Element): element is HTMLButtonElement & { type: \"submit\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"submit\";\n}\n\nexport function isHTMLResetButtonElement(element: Element): element is HTMLButtonElement & { type: \"reset\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"reset\";\n}\n\nexport function isTypeOfResetButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"reset\" } {\n return isHTMLResetButtonElement(element) || isHTMLResetInputElement(element);\n}\n\nexport function isTypeOfSubmitButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"submit\" } {\n return isHTMLSubmitButtonElement(element) || isHTMLSubmitInputElement(element);\n}\n\nexport function isTypeOfButtonableElement(element: Element): element is HTMLButtonElement | (HTMLInputElement & { type: \"submit\" | \"reset\" }) {\n return isTypeOfResetButtonElement(element) || isTypeOfSubmitButtonElement(element) || isHTMLButtonButtonElement(element);\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n\nexport function isTypeOfFormInputElement(element: Element): element is (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n return isHTMLInputElement(element) || isHTMLSelectElement(element) || isHTMLTextAreaElement(element);\n}\n\nexport function createHiddenButton(type: \"submit\" | \"reset\"): HTMLButtonElement {\n let button = document.createElement('button');\n button.type = type;\n button.style.display = 'none';\n button.dataset.sythentic = 'true';\n return button;\n}\n\nexport function createHiddenInput(name: string, value: string): HTMLInputElement {\n let input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value;\n return input;\n}\n\nexport function insertElement<T extends Element>(targetElement: Element, insertPosition: InsertPosition, element: T): T {\n let createdElement = targetElement.insertAdjacentElement(insertPosition, element);\n if (!createdElement) {\n throw new Error(`Failed to insert element ${element.nodeName} into ${targetElement.nodeName}`);\n }\n return createdElement as T;\n}\n\nexport function insertHiddenInput(name: string, value: string, targetElement: Element, insertPosition: InsertPosition): HTMLInputElement {\n return insertElement(targetElement, insertPosition, createHiddenInput(name, value));\n}\n\nexport function insertHiddenButton(type: \"submit\" | \"reset\", targetElement: Element, insertPosition: InsertPosition): HTMLButtonElement {\n return insertElement(targetElement, insertPosition, createHiddenButton(type));\n}\n\nexport function getAllRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n let parent = radio.form || document;\n return Array.from(parent.querySelectorAll(`input[type=\"radio\"][name=\"${radio.name}\"]`));\n}\n\nexport function getOtherRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n return getAllRadiosInGroup(radio).filter((r) => r !== radio);\n}\n\nexport function isElementInViewport(el: Element) {\n const rect = el.getBoundingClientRect();\n\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n const vertInView = rect.top <= windowHeight && rect.top + rect.height >= 0;\n const horInView = rect.left <= windowWidth && rect.left + rect.width >= 0;\n\n return vertInView && horInView;\n}\n","import {insertHiddenButton} from \"./elements\";\n\nexport function requestSubmit(form: HTMLFormElement) {\n if (form.requestSubmit) {\n form.requestSubmit();\n } else {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"submit\"]');\n if (!button) {\n button = insertHiddenButton(\"submit\", form, 'beforeend');\n }\n button.click();\n }\n}\n\nexport function requestReset(form: HTMLFormElement) {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"reset\"]');\n if (!button) {\n button = insertHiddenButton(\"reset\", form, 'beforeend');\n }\n button.click();\n}","export function wrapArray<T>(x: T | Array<T>): Array<T> {\n return Array.isArray(x) ? x : [x];\n}","import {Controller} from \"stimulus\";\n\nexport function useMixin(controller: Controller, setup: () => void, teardown: () => void) {\n const controllerDisconnect = controller.disconnect.bind(controller);\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return controllerDisconnect;\n}","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventListener(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n if (opts?.debounce) {\n handler = debounce(handler.bind(controller), opts.debounce);\n delete opts.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => element.addEventListener(eventName, handler, opts));\n let teardown = () => eventNames.forEach(eventName => element.removeEventListener(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n\nexport function useEventListeners(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useEventListener(controller, element, eventNameOrNames, handler, opts);\n}\n\nexport function useCollectionEventListener(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n let handlers: Array<{ setup: () => void, teardown: () => void, }> = [];\n elements.forEach(el => {\n let {setup, teardown} = useEventListener(controller, el, eventNameOrNames, handler, opts);\n handlers.push({setup, teardown});\n });\n return [\n () => handlers.forEach(h => h.setup()),\n () => handlers.forEach(h => h.teardown()),\n ];\n}\n\nexport function useCollectionEventListeners(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useCollectionEventListener(controller, elements, eventNameOrNames, handler, opts);\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useFullscreen(controller: Controller, el?: Element) {\n let element = el || document.documentElement;\n let fullscreenOpen = document.fullscreenElement !== null;\n\n const updateFullscreenState = () => fullscreenOpen = document.fullscreenElement !== null;\n const isFullscreen = (): boolean => fullscreenOpen;\n const toggle = async () => fullscreenOpen ? await exit() : await enter();\n let setup = () => document.addEventListener('fullscreenchange', updateFullscreenState);\n let teardown = () => document.removeEventListener('fullscreenchange', updateFullscreenState);\n\n const exit = async () => {\n if (document.exitFullscreen) {\n fullscreenOpen = false;\n await document.exitFullscreen();\n }\n };\n\n const enter = async () => {\n if (fullscreenOpen) {\n await exit();\n }\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n fullscreenOpen = true;\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n isFullscreen,\n enter,\n exit,\n toggle,\n teardown,\n };\n}","export function reactive<T extends Object>(object: T): T {\n\n if (object === null || typeof object !== 'object') {\n return object;\n }\n\n for (const property in object) {\n if (Object.getOwnPropertyDescriptor(object, property) == undefined) {\n continue;\n }\n\n // @ts-ignore\n object[property] = reactive(object[property]);\n }\n\n return new Proxy(object, {\n get(target, property) {\n // @ts-ignore\n return target[property];\n },\n set(target, property, value) {\n // @ts-ignore\n target[property] = reactive(value);\n\n return true;\n },\n });\n}","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\nimport {useMixin} from \"./create_mixin\";\n\nexport interface GeolocationOptions extends Partial<PositionOptions> {\n}\n\nexport interface GeolocationData {\n locatedAt: number | null,\n error: GeolocationPositionError | null,\n coords: {\n accuracy: number,\n latitude: number,\n longitude: number,\n altitude: number | null,\n altitudeAccuracy: number | null,\n heading: number | null,\n speed: number | null,\n },\n teardown: () => void,\n}\n\nexport function useGeolocation(controller: Controller, options: GeolocationOptions = {}, update?: (...args: any[]) => void, error?: (...args: any[]) => void) {\n // Ensure passed functions are bound to the correct controller scope\n if (update) {\n update = update.bind(controller);\n }\n if (error) {\n error = error.bind(controller);\n }\n\n // Default options to pass to the navigator.geolocation.watchPosition() method\n const {\n enableHighAccuracy = true,\n maximumAge = 30000,\n timeout = 27000,\n } = options;\n\n const isSupported = navigator && 'geolocation' in navigator;\n\n // Create a reactive object to store the geolocation data\n const values = reactive({\n locatedAt: null,\n error: null,\n coords: {\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null,\n },\n teardown: () => {\n if (watcher) {\n navigator.geolocation.clearWatch(watcher);\n watcher = null;\n }\n },\n } as GeolocationData);\n\n let setup = () => {\n if (isSupported) {\n watcher = navigator.geolocation.watchPosition(\n (position: GeolocationPosition) => {\n // Update reactive values\n values.locatedAt = position.timestamp;\n values.coords = position.coords;\n values.error = null;\n // Fire user callback if provided\n if (update) {\n update(position);\n }\n },\n (err: GeolocationPositionError) => {\n // Update reactive values\n values.error = err;\n // Fire user callback if provided\n if (error) {\n error(err);\n }\n },\n {\n enableHighAccuracy,\n maximumAge,\n timeout,\n },\n );\n }\n };\n\n let watcher: number | null = null;\n\n useMixin(controller, setup, values.teardown);\n\n return values;\n}\n\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInjectedFragment(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, fragment: DocumentFragment, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n let nodes = Array.from(fragment.childNodes);\n\n let setup = () => {\n let parent = targetElement.parentElement;\n if ([\"beforebegin\", \"afterend\"].includes(insertPosition) && parent == null) {\n throw new Error(\"Cannot insert beforebegin into a node with no parent\");\n }\n\n switch (insertPosition) {\n case 'beforeend':\n targetElement.append(fragment);\n break;\n case \"afterbegin\":\n targetElement.prepend(fragment);\n break;\n case \"beforebegin\":\n parent!.insertBefore(fragment, targetElement);\n break;\n case \"afterend\":\n parent!.insertBefore(fragment, targetElement);\n break;\n }\n };\n let teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0;\n\n useMixin(controller, setup, teardown);\n return [nodes, teardown];\n}\n\nexport function useInjectedHTML(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, html: string, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n const fragment = document.createRange().createContextualFragment(html);\n return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n}\n\nexport function useInjectedElement(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, element: HTMLElement, options: { cleanup?: boolean } = {}): [ChildNode, () => void] {\n const fragment = new DocumentFragment();\n fragment.append(element);\n let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n return [nodes[0], teardown];\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInterval(controller: Controller, handler: (...args: any[]) => void, interval: number) {\n handler = handler.bind(controller);\n let intervalHandle: ReturnType<typeof window.setInterval> | null = null;\n\n let setup = () => intervalHandle = setInterval(handler, interval);\n let teardown = () => {\n if (intervalHandle !== null) {\n clearInterval(intervalHandle);\n }\n };\n\n useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\n\n\nexport type Serializer<T> = {\n deserialize(raw: string): T\n serialize(value: T): string\n isEmpty(value: T): boolean\n}\n\nexport interface LocalStorageProxy<T> {\n get value(): T;\n\n set value(value: T);\n\n read(): T;\n\n write(value: T): void;\n\n clear(): void;\n\n isEmpty(): boolean;\n}\n\nexport const StorageSerializers: Record<'boolean' | 'object' | 'number' | 'any' | 'string' | 'map' | 'set', Serializer<any>> & { [idx: string]: Serializer<any> } = {\n boolean: {\n deserialize: (v: any) => v === 'true',\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n object: {\n deserialize: (v: any) => JSON.parse(v),\n serialize: (v: any) => JSON.stringify(v),\n isEmpty: (v: any) => {\n const values = Object.values(JSON.parse(v));\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n number: {\n deserialize: (v: any) => Number.parseFloat(v),\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n any: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n string: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n map: {\n deserialize: (v: any) => new Map(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Map<any, any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Map<any, any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n set: {\n deserialize: (v: any) => new Set(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Set<any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Set<any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n};\n\nexport function useLocalStorage<T>(controller: Controller, key: string, defaultValue: T, opts: { writeDefaults: boolean } = {writeDefaults: true}): LocalStorageProxy<T> {\n let type: string;\n let {writeDefaults} = opts;\n\n if (defaultValue == null) {\n type = 'any';\n } else if (defaultValue instanceof Set) {\n type = 'set';\n } else if (defaultValue instanceof Map) {\n type = 'map';\n } else if (typeof defaultValue === 'boolean') {\n type = 'boolean';\n } else if (typeof defaultValue === 'string') {\n type = 'string';\n } else if (typeof defaultValue === 'object') {\n type = 'object';\n } else if (Array.isArray(defaultValue)) {\n type = 'object';\n } else if (!Number.isNaN(defaultValue)) {\n type = 'number';\n } else {\n type = 'any';\n }\n\n let data = reactive({\n value: defaultValue,\n });\n\n let storage = localStorage;\n const serializer = StorageSerializers[type];\n\n const read = () => {\n const rawValue = storage.getItem(key);\n if (rawValue == null) {\n data.value = defaultValue;\n if (writeDefaults && defaultValue !== null) {\n storage.setItem(key, serializer.serialize(defaultValue));\n }\n } else {\n data.value = serializer.deserialize(rawValue);\n }\n\n return data.value;\n };\n\n const write = (value: T) => {\n storage.setItem(key, serializer.serialize(value));\n data.value = value;\n };\n\n const clear = () => {\n storage.removeItem(key);\n data.value = defaultValue;\n return data.value;\n };\n\n const isEmpty = (): boolean => {\n let rawValue = storage.getItem(key);\n return serializer.isEmpty(rawValue);\n };\n\n read();\n\n return {\n get value() {\n return read();\n },\n set value(value) {\n write(value);\n },\n read,\n clear,\n write,\n isEmpty,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\n\nexport function useTimeout(controller: Controller, handler: (...args: any[]) => void, timeout: number) {\n let controllerDisconnect: () => void;\n let timeoutHandle: ReturnType<typeof window.setTimeout> | null = null;\n handler = handler.bind(controller);\n\n let newHandler = () => {\n handler();\n timeoutHandle = null;\n Object.assign(controller, {disconnect: controllerDisconnect});\n };\n\n let setup = () => timeoutHandle = setTimeout(newHandler, timeout);\n let teardown = () => {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n timeoutHandle = null;\n }\n };\n\n controllerDisconnect = useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\nimport {useTimeout} from \"./use_timeout\";\nimport {isHTMLInputElement} from \"../utilities/elements\";\n\nexport function useTemporaryContent(controller: Controller, target: HTMLElement, content: string, timeout?: number, teardownCallback?: () => void) {\n\n const setContent = (element: HTMLElement | HTMLInputElement, text: string) => {\n if (isHTMLInputElement(element)) {\n element.value = text;\n } else {\n element.textContent = text;\n }\n };\n\n const getContent = (element: HTMLElement): string => {\n return isHTMLInputElement(element) ? element.value : element.innerHTML;\n };\n\n let cleanupTimeout: () => void = () => void 0;\n let originalText: string = getContent(target);\n\n const teardown = () => {\n setContent(target, originalText);\n cleanupTimeout();\n if (teardownCallback) {\n teardownCallback.call(controller);\n }\n };\n\n const setup = () => {\n setContent(target, content);\n if (timeout !== undefined) {\n cleanupTimeout = useTimeout(controller, teardown, timeout);\n }\n };\n\n useMixin(controller, setup, teardown);\n\n return {\n teardown,\n update(newContent: string) {\n setContent(target, newContent);\n },\n };\n}\n","export async function fetchRetry(n: number, input: RequestInfo, init?: RequestInit): Promise<Response> {\n try {\n return await fetch(input, init);\n } catch (err) {\n if (n === 1) {\n throw err;\n }\n return await fetchRetry(n - 1, input, init);\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {fetchRetry} from \"../../utilities/fetchRetry\";\n\nexport class LoadBlockController extends BaseController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare maxRetriesValue: number;\n declare readonly hasMaxRetriesValue: boolean;\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n get _maxRetries(): number {\n return this.hasMaxRetriesValue ? this.maxRetriesValue : 1;\n }\n\n connect() {\n }\n\n async loadContent(event: Event | null = null) {\n event?.preventDefault();\n\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n\n let failure = () => {\n el.replaceWith(this._errorMessage);\n self.dispatchEvent(el, \"ajax:error\");\n };\n\n try {\n let response = await fetchRetry(this._maxRetries, this.endpointValue);\n if (!response.ok) {\n failure();\n }\n let text = await response.text();\n let newEl = document.createElement(\"div\");\n\n newEl.innerHTML = text;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatchEvent(el, \"ajax:success\");\n } catch (e) {\n failure();\n } finally {\n self.dispatchEvent(el, \"ajax:complete\");\n }\n }\n}\n","import {LoadBlockController} from \"./load_block_controller\";\n\nexport class AsyncBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n async connect() {\n await this.loadContent();\n }\n\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useIntersectionObserver(controller: Controller, handler: IntersectionObserverCallback, options?: IntersectionObserverInit) {\n handler = handler.bind(controller);\n\n let observer: IntersectionObserver | null = new IntersectionObserver(handler, options);\n let teardown = () => {\n observer?.disconnect();\n observer = null;\n };\n let observe = (element: HTMLElement) => observer?.observe(element);\n let unobserve = (element: HTMLElement) => observer?.unobserve(element);\n\n return {\n observer,\n teardown,\n observe,\n unobserve,\n };\n}\n\nexport function useIntersection(\n controller: Controller,\n element: HTMLElement,\n appear?: null | ((entry: IntersectionObserverEntry) => void),\n disappear?: null | ((entry: IntersectionObserverEntry) => void),\n options?: IntersectionObserverInit,\n) {\n if (appear) {\n appear = appear.bind(controller);\n }\n if (disappear) {\n disappear = disappear.bind(controller);\n }\n let opts = options ?? {};\n let processEntries = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n appear && appear(entry);\n } else {\n disappear && disappear(entry);\n }\n });\n };\n let {observer, observe, unobserve, teardown} = useIntersectionObserver(controller, processEntries, opts);\n let setup = () => observe(element);\n useMixin(controller, setup, teardown);\n\n return {\n observer,\n observe: () => observe(element),\n unobserve: () => unobserve(element),\n teardown,\n };\n}","import {LoadBlockController} from \"./load_block_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class LazyBlockController extends LoadBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n async connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n let {observe, unobserve} = useIntersection(this, element, this.appear, null, {threshold: 0.3});\n this.observe = observe;\n this.unobserve = unobserve;\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n await this.loadContent();\n }\n }\n\n async appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n await this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {LoadBlockController} from \"./load_block_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class PollBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n seconds: Number,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error(\"Required value `seconds` is missing\");\n }\n\n requestAnimationFrame(() => {\n this._timeout();\n useInterval(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n async _timeout() {\n await this.loadContent();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {requestSubmit} from \"../../utilities/request_submit\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n static values = {submitMode: String, eventMode: String, debounceInterval: Number};\n declare readonly submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare eventModeValue: 'change' | 'input' | 'debounced';\n declare readonly hasEventModeValue: boolean;\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n\n get _eventModes(): Array<'change' | 'input'> {\n if (this.hasEventModeValue) {\n let modes = this.eventModeValue.split(' ').map(mode => mode.trim());\n\n if (modes.length === 1 && modes[0] === 'debounced') {\n return ['change', 'input'];\n }\n\n if (!modes.every(mode => ['change', 'input'].includes(mode))) {\n throw new Error(`The modeValue provided '${this.eventModeValue}' is not one of the recognised configuration options`);\n }\n\n return modes as Array<'change' | 'input'>;\n } else {\n return [\"change\"];\n }\n }\n\n get _debounceTimeout(): number {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : -1;\n }\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get _cssSelector() {\n let inputTypes = ['input', 'textarea', 'select'];\n let ignore = ':not([data-no-autosubmit])';\n return inputTypes.map(type => type.concat(ignore)).join(',');\n }\n\n get inputElements() {\n let subElements = Array.from(this.element.querySelectorAll(this._cssSelector));\n subElements = subElements.filter(el => !this._ancestorIsTrix(el));\n return subElements;\n }\n\n connect() {\n this.inputElements.forEach(el => {\n return useEventListener(\n this,\n el as HTMLElement,\n this._eventModes,\n this.submit,\n {debounce: this._debounceTimeout && this._debounceTimeout > 0 ? this._debounceTimeout : undefined},\n );\n });\n }\n\n _ancestorIsTrix(element: Element) {\n return element.closest('trix-toolbar') !== null && element.closest('trix-editor') !== null;\n }\n\n private submit() {\n let el = this.el as HTMLFormElement;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLTextAreaElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class AutosizeController extends BaseController {\n\n declare _unobserveIntersection: () => void;\n\n connect() {\n let {teardown} = useIntersection(this, this.el, this.appear);\n this._unobserveIntersection = teardown;\n if (!isHTMLTextAreaElement(this.el)) {\n throw new Error(`Expected controller to be attached to a textarea, but was a '${this.el.tagName}'`);\n }\n\n requestAnimationFrame(() => {\n this.el.style.resize = \"none\";\n this.el.style.boxSizing = \"border-box\";\n\n this._handler();\n useEventListener(this, window, ['resize'], this._handler);\n useEventListener(this, this.el, ['input', 'change', 'focus'], this._handler, {debounce: 100});\n });\n }\n\n appear(_entry: IntersectionObserverEntry) {\n this.autosize(this.el as HTMLTextAreaElement);\n this._unobserveIntersection();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n }\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {Controller} from \"stimulus\";\n\nexport function controllerMethod<C extends Controller>(controller: C, methodName: string): (...args: any[]) => any {\n // @ts-ignore\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n } else if (method != undefined) {\n return () => method;\n } else {\n return () => void 0;\n }\n}","import {camelCase, upperFirst} from \"lodash-es\";\n\nexport function pascalCase(str: string): string {\n return upperFirst(\n camelCase(str),\n );\n}","import {Controller} from \"stimulus\";\nimport {controllerMethod} from \"../utilities/stimulus\";\nimport {pascalCase} from \"../utilities/strings\";\n\nexport class InstallClassMethodComposableController extends Controller {\n [index: string]: any\n}\n\nfunction addMethodsForClassDefinition(controller: InstallClassMethodComposableController, name: string) {\n let defaultElement = controller.element as HTMLElement;\n let hasClass = (): boolean => controller[`has${pascalCase(name)}Class`] == true;\n let classes = (): string[] => controller[`${name}Classes`];\n let defaultClasses = (): string[] => controllerMethod(controller, `default${pascalCase(name)}Classes`).call(controller) || [];\n let classOrDefault = (): string[] => hasClass() ? classes() : defaultClasses();\n\n if (controller[`${name}Classes`] == undefined) {\n Object.defineProperty(controller, `${name}Classes`, {\n get: () => hasClass() ? controller[`${name}Class`].split(' ') : defaultClasses(),\n });\n }\n let methods = {\n [`add${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.add(...classOrDefault()),\n [`remove${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.remove(...classOrDefault()),\n [`${name}ClassesPresent`]: (element = defaultElement) => classOrDefault().every((klass: string) => element.classList.contains(klass)),\n };\n Object.assign(controller, methods);\n}\n\nexport function installClassMethods(controller: InstallClassMethodComposableController) {\n // @ts-ignore\n let classes = controller.constructor.classes || [];\n classes.forEach((classDefinition: string) => addMethodsForClassDefinition(controller, classDefinition));\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class CharCountController extends BaseController {\n\n // Config\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n // Targets\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n // Values\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n // Classes\n declare removeErrorClasses: (el?: HTMLElement) => void;\n declare addErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n useEventListener(this, this.inputTarget, \"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this._isValidCount(charCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxDisableInputsController extends BaseController {\n\n static targets = [\"disabler\", \"disable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasDisablerTarget: boolean;\n declare readonly disablerTarget: HTMLInputElement;\n declare readonly disableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\n this.disable();\n } else {\n this.enable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.disableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.disableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxEnableInputsController extends BaseController {\n\n static targets = [\"enabler\", \"enable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasEnablerTarget: boolean;\n declare readonly enablerTarget: HTMLInputElement;\n declare readonly enableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.enableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.enableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {useCollectionEventListener, useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this._enabled.filter(checkbox => checkbox.checked);\n }\n\n private get _enabled() {\n return this.checkboxTargets.filter(checkbox => !checkbox.disabled && !checkbox.readOnly);\n }\n\n private get _unchecked() {\n return this._enabled.filter(checkbox => !checkbox.checked);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n useEventListener(this, this.selectAllTarget, 'change', this._toggle);\n useCollectionEventListener(this, this.checkboxTargets, 'change', this._refresh);\n this._refresh();\n });\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this._enabled.forEach((checkbox) => checkbox.checked = (checkbox.disabled || checkbox.readOnly) ? checkbox.checked : target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this._enabled.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins\";\n\nexport class CheckboxXORController extends BaseController {\n\n static targets = [\"checkbox\"];\n declare readonly checkboxTargets: HTMLInputElement[];\n\n connect() {\n useCollectionEventListener(this, this.checkboxTargets, \"change\", this._update);\n }\n\n _otherCheckboxes(el: HTMLInputElement): HTMLInputElement[] {\n return Array.from(this.checkboxTargets).filter(field => field !== el);\n }\n\n _update(event: Event) {\n const target = event.target as HTMLInputElement | null;\n if (!target) {\n throw new Error(\"No target found on event\");\n }\n\n let others = this._otherCheckboxes(target);\n if (target.checked) {\n others.forEach(checkbox => {\n checkbox.checked = false;\n this.dispatchEvent(this.el, 'change');\n });\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyController extends BaseController {\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._restoreElementFromLoadValue();\n }\n\n private _getElementValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(): boolean {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkDirty() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty()) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(): boolean {\n return this._getElementValue() !== this._getElementLoadValue();\n }\n\n private _restoreElementFromLoadValue() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n}\n\nexport function isDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyFormController extends BaseController {\n\n get _formElements(): Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> {\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\n }\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\n }\n\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty(element)) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return this._getElementValue(element) !== this._getElementLoadValue(element);\n }\n\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\n }\n\n private _checkDirty(): void {\n this._formElements.forEach(el => this._checkElementDirty(el));\n if (this._formElements.some(el => isFormDirty(el))) {\n this.el.setAttribute(\"data-dirty\", \"true\");\n } else {\n this.el.removeAttribute(\"data-dirty\");\n }\n }\n}\n\nexport function isFormDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class EnableInputsController extends BaseController {\n\n static targets = [\"input\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly inputTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.inputTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.inputTargets.forEach((el, _) => el.disabled = false);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FocusStealController extends BaseController {\n\n\n static values = {\n mode: String,\n };\n\n declare modeValue: 'immediate' | 'wait';\n declare hasModeValue: boolean;\n\n get _mode() {\n const MODES = ['immediate', 'wait'];\n if (this.hasModeValue) {\n if (!MODES.includes(this.modeValue)) {\n throw new Error(`The given modeValue '${this.modeValue}' is not one of the supported modes: \"${MODES.join('\", \"')}\"`);\n } else {\n return this.modeValue;\n }\n } else {\n return MODES[0];\n }\n }\n\n connect() {\n if (this._mode == 'immediate') {\n this.steal();\n }\n }\n\n steal() {\n (this.el as HTMLInputElement).focus();\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {requestReset, requestSubmit} from \"../../utilities/request_submit\";\n\nexport class FormRcController extends BaseController {\n\n static targets = [\"form\"];\n static values = {\n formSelector: String,\n submitMode: String,\n };\n\n declare submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare readonly formTarget: HTMLFormElement;\n declare readonly formSelectorValue: string;\n declare readonly hasFormSelectorValue: boolean;\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get form(): HTMLFormElement {\n let form: HTMLFormElement | null;\n if (this.hasFormSelectorValue) {\n form = document.querySelector(this.formSelectorValue);\n if (!form) {\n throw new Error(`Could not find a form on the page that matches selector '${this.formSelectorValue}'`);\n }\n } else {\n form = this.formTarget;\n }\n return form;\n }\n\n submit(event?: Event) {\n event?.preventDefault();\n let el = this.formTarget;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n\n reset(event?: Event) {\n event?.preventDefault();\n requestReset(this.form);\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\ninterface FormSavePayload {\n [idx: string]: {\n [idx: string]: string | boolean\n };\n}\n\nexport class FormSaveController extends BaseController {\n\n static values = {\n id: String,\n restoreOnLoad: Boolean,\n clearOnSubmit: Boolean,\n };\n\n declare readonly idValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare readonly clearOnSubmitValue: boolean;\n declare readonly hasClearOnSubmitValue: boolean;\n\n get _formID() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = (this.el as HTMLFormElement).id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\n }\n }\n\n get _formIdentifier() {\n const url = location.href;\n return `${url} ${this._formID}`;\n }\n\n get _formElements() {\n return (this.el as HTMLFormElement).elements;\n }\n\n get _formData(): FormSavePayload {\n let data: FormSavePayload = {[this._formIdentifier]: {}};\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name.length > 0) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n data[this._formIdentifier][el.name] = el.checked;\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.checked) {\n data[this._formIdentifier][el.name] = el.value;\n }\n } else {\n data[this._formIdentifier][el.name] = el.value;\n }\n }\n }\n return data;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _clearOnSubmit() {\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (!isHTMLFormElement(element)) {\n throw new Error('Expected controller to be mounted on a form element.');\n }\n\n if (this._restoreOnLoad) {\n this.restore();\n }\n if (this._clearOnSubmit) {\n useEventListener(this, this.el, 'submit', this._clear);\n }\n });\n }\n\n _clear() {\n localStorage.removeItem(this._formIdentifier);\n this.dispatchEvent(this.el, `form-save:cleared`);\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n save(event: Event) {\n event.preventDefault();\n let data = this._formData;\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\n this.dispatchEvent(this.el, `form-save:save:success`);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n if (localStorage.getItem(this._formIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name in savedData) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n el.checked = savedData[el.name];\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.value == savedData[el.name]) {\n el.checked = true;\n }\n } else {\n el.value = savedData[el.name];\n }\n }\n }\n this.dispatchEvent(this.el, `form-save:restore:success`);\n } else {\n this.dispatchEvent(this.el, `form-save:restore:empty`);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n connect() {\n useCollectionEventListener(this, this.inputTargets, \"change\", this._handleInputs);\n }\n\n _handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatchEvent(target, \"change\");\n this.dispatchEvent(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget && this.hasMessageValue) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatchEvent(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {clamp} from \"lodash-es\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class NavigateFormErrorsController extends BaseController {\n static values = {\n selector: String,\n index: Number,\n };\n\n static classes = [\"current\"];\n static targets = [\"next\", \"current\", \"previous\"];\n\n declare readonly hasNextTarget: boolean;\n declare readonly nextTarget: HTMLElement;\n declare readonly hasPreviousTarget: boolean;\n declare readonly previousTarget: HTMLElement;\n declare readonly hasCurrentTarget: boolean;\n declare readonly currentTarget: HTMLElement;\n declare selectorValue: string;\n declare readonly hasSelectorValue: boolean;\n declare indexValue: number;\n declare readonly hasIndexValue: boolean;\n _errors: HTMLElement[] = [];\n _firstClick = false;\n\n declare addCurrentClasses: (el?: HTMLElement) => void;\n declare removeCurrentClasses: (el?: HTMLElement) => void;\n\n get defaultCurrentClasses(): string[] {\n return [\"currentError\"];\n }\n\n get _errorCount(): number {\n return this._errors.length;\n }\n\n get _previousIndex(): number {\n let index = this._index - 1;\n if (index < 0) {\n return 0;\n }\n return index;\n }\n\n get _nextIndex(): number {\n let index = this._index + 1;\n if (index > this._errors.length - 1) {\n return this._errors.length - 1;\n }\n return index;\n }\n\n get _index(): number {\n return clamp(this.hasIndexValue ? this.indexValue : 0, 0, this._errors.length);\n }\n\n get _selector(): string {\n if (this.hasSelectorValue) {\n return this.selectorValue;\n } else {\n throw new Error(\"Expected `selectorValue` to be present\");\n }\n }\n\n get _currentError(): HTMLElement {\n return this._errors[this._index];\n }\n\n get _otherErrors(): HTMLElement[] {\n return this._errors.filter((error, index) => index !== this._index);\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._firstClick = true;\n this._toggleButtons();\n this._toggleVisibility();\n },\n );\n }\n\n async current(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async next(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._nextIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async previous(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._previousIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n indexValueChanged() {\n this._toggleButtons();\n }\n\n selectorValueChanged() {\n this._errors = Array.from(document.querySelectorAll(this._selector));\n this.indexValue = 0;\n this._toggleButtons();\n this._toggleVisibility();\n }\n\n private _updateClasses() {\n this.addCurrentClasses(this._currentError);\n this._otherErrors.forEach((error) => this.removeCurrentClasses(error));\n }\n\n private _toggleVisibility() {\n if (this._errorCount === 0) {\n this.el.style.display = \"none\";\n } else {\n this.el.style.display = \"\";\n }\n }\n\n private _toggleButtons() {\n if (this.hasNextTarget) {\n // If there is no \"Current Error\" button, then enable the next error button when there is only 1 error.\n if (!this.hasCurrentTarget && this._firstClick && this.indexValue == this._errorCount - 1) {\n this.nextTarget.removeAttribute(\"disabled\");\n return;\n } else if (this.indexValue >= this._errorCount - 1) {\n this.nextTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.nextTarget.removeAttribute(\"disabled\");\n }\n }\n if (this.hasPreviousTarget) {\n if (this.indexValue <= 0) {\n this.previousTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.previousTarget.removeAttribute(\"disabled\");\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n useCollectionEventListener(this, this.passwordTargets, \"change\", this._checkPasswordsMatch);\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private _checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatchEvent(element, \"password-confirm:match\");\n this.passwordTargets.forEach(el => this.removeErrorClasses(el));\n } else {\n this.dispatchEvent(element, \"password-confirm:no-match\");\n this.passwordTargets.forEach(el => this.addErrorClasses(el));\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class RemoteFormController extends BaseController {\n static targets = [];\n\n static values = {selector: String};\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n get _selector(): string {\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\n }\n\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\n const [data, status, xhr] = event.detail;\n if (data instanceof Node) {\n let newElement: HTMLElement | null = data.querySelector(this._selector);\n\n if (newElement == null) {\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\n }\n\n let parentNode = this.el.parentNode;\n if (parentNode == null) {\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\n }\n parentNode.replaceChild(newElement, this.el);\n this.dispatchEvent(newElement, 'remote-form:replace');\n } else {\n console.log('Unknown', data);\n }\n }\n}\n","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {EventBus} from \"../utilities/event_bus\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventBus(controller: Controller, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: { debounce?: number }) {\n let options = opts;\n\n if (options?.debounce) {\n handler = debounce(handler.bind(controller), options.debounce);\n delete options.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => EventBus.on(eventName, handler));\n let teardown = () => eventNames.forEach(eventName => EventBus.off(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isHTMLInputElement, isHTMLSelectElement, isHTMLTextAreaElement, isTypeOfFormInputElement} from \"../../utilities/elements\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SyncValuePayload {\n value: string | boolean;\n dispatcher: HTMLElement;\n}\n\nexport class SyncInputsController extends BaseController {\n static values = {\n key: String,\n };\n\n declare readonly keyValue: string;\n declare readonly hasKeyValue: boolean;\n\n get _eventName(): string {\n return `sync:${this._key}`;\n }\n\n get _key(): string {\n if (this.hasKeyValue) {\n return this.keyValue;\n }\n throw new Error(\"Expected `keyValue` to be present\");\n }\n\n get _value(): string | boolean {\n let el = this.el as | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n return el.checked;\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n return el.checked ? el.value : \"\";\n } else {\n return el.value;\n }\n }\n\n set _value(val: string | boolean) {\n let el = this.el;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n el.checked = val.toString() === \"true\";\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n el.checked = el.value === val;\n } else if (isHTMLInputElement(el) || isHTMLTextAreaElement(el) || isHTMLSelectElement(el)) {\n el.value = val.toString();\n } else {\n el.innerHTML = val.toString();\n }\n }\n\n connect() {\n useEventBus(this, this._eventName, this._read);\n\n requestAnimationFrame(() => {\n if (isTypeOfFormInputElement(this.el)) {\n this._emit();\n useEventListener(this, this.el, \"input\", this._emit);\n }\n });\n }\n\n _emit() {\n EventBus.emit(this._eventName, {value: this._value, dispatcher: this.el} as SyncValuePayload);\n }\n\n _read(payload?: SyncValuePayload) {\n if (payload === undefined) {\n throw new Error(\"No payload received\");\n }\n let {dispatcher, value} = payload;\n if (dispatcher !== this.el) {\n this._value = value;\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class ValueWarnController extends BaseController {\n\n static classes = [\"inputWarning\", \"warningHide\"];\n static targets = [\"input\", \"warning\"];\n static values = {\n max: Number,\n min: Number,\n minMessage: String,\n maxMessage: String,\n };\n\n declare readonly inputTarget: HTMLInputElement;\n declare readonly warningTarget: HTMLElement;\n declare readonly maxValue: number;\n declare readonly hasMaxValue: boolean;\n declare readonly minValue: number;\n declare readonly hasMinValue: boolean;\n declare readonly minMessageValue: string;\n declare readonly hasMinMessageValue: boolean;\n declare readonly maxMessageValue: string;\n declare readonly hasMaxMessageValue: boolean;\n declare addInputWarningClasses: (el?: HTMLElement) => void;\n declare removeInputWarningClasses: (el?: HTMLElement) => void;\n declare addWarningHideClasses: (el?: HTMLElement) => void;\n declare removeWarningHideClasses: (el?: HTMLElement) => void;\n\n get _maxMessage(): string {\n return this.hasMaxMessageValue ? this.maxMessageValue : `Value must be less than ${this.maxValue}`;\n }\n\n get _minMessage(): string {\n return this.hasMinMessageValue ? this.minMessageValue : `Value must be greater than ${this.minValue}`;\n }\n\n get defaultWarningHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n this.addWarningHideClasses(this.warningTarget);\n useEventListener(this, this.inputTarget, \"input\", this._check);\n this._check();\n }\n\n private _check() {\n if (this.hasMinValue && Number.parseFloat(this.inputTarget.value) < this.minValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._minMessage;\n } else if (this.hasMaxValue && Number.parseFloat(this.inputTarget.value) > this.maxValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._maxMessage;\n } else {\n this.addWarningHideClasses(this.warningTarget);\n this.removeInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = \"\";\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n this._updateWordCount();\n useEventListener(this, this.inputTarget, \"input\", this._updateWordCount);\n }\n\n _updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this._isValidCount(wordCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FallbackImageController extends BaseController {\n\n static values = {placeholder: String};\n static classes = [\"success\", \"fail\"];\n\n declare readonly placeholderValue: string;\n declare readonly hasPlaceholderValue: boolean;\n declare addSuccessClasses: (el?: HTMLElement) => void;\n declare removeSuccessClasses: (el?: HTMLElement) => void;\n declare addFailClasses: (el?: HTMLElement) => void;\n declare removeFailClasses: (el?: HTMLElement) => void;\n\n\n initialize() {\n this._hasLoadedSuccessfully = this._hasLoadedSuccessfully.bind(this);\n this._success = this._success.bind(this);\n this._fail = this._fail.bind(this);\n }\n\n connect() {\n let element = this.el as HTMLImageElement;\n\n element.onerror = this._fail;\n if (element.complete && !this._hasLoadedSuccessfully()) {\n this._fail();\n } else {\n this._success();\n }\n }\n\n disconnect() {\n this.removeSuccessClasses();\n this.removeFailClasses();\n }\n\n private _success() {\n this.addSuccessClasses();\n }\n\n private _fail() {\n let element = this.el as HTMLImageElement;\n this.addFailClasses();\n\n if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {\n this.dispatchEvent(element, \"fallback-image:placeholder\");\n element.src = this.placeholderValue;\n element.onerror = this._fail;\n } else {\n this.dispatchEvent(element, \"fallback-image:fail\");\n element.style.display = \"none\";\n }\n }\n\n private _hasLoadedSuccessfully(): boolean {\n let element = this.el as HTMLImageElement;\n return element.naturalHeight > 0 && element.naturalWidth > 0;\n }\n\n}\n","// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n supportCustomEvent = function CustomEvent(event, x) {\n x = x || {};\n var ev = document.createEvent('CustomEvent');\n ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n return ev;\n };\n supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * Dispatches the passed event to both an \"on<type>\" handler as well as via the\n * normal dispatch operation. Does not bubble.\n *\n * @param {!EventTarget} target\n * @param {!Event} event\n * @return {boolean}\n */\nfunction safeDispatchEvent(target, event) {\n var check = 'on' + event.type.toLowerCase();\n if (typeof target[check] === 'function') {\n target[check](event);\n }\n return target.dispatchEvent(event);\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n while (el && el !== document.body) {\n var s = window.getComputedStyle(el);\n var invalid = function(k, ok) {\n return !(s[k] === undefined || s[k] === ok);\n };\n\n if (s.opacity < 1 ||\n invalid('zIndex', 'auto') ||\n invalid('transform', 'none') ||\n invalid('mixBlendMode', 'normal') ||\n invalid('filter', 'none') ||\n invalid('perspective', 'none') ||\n s['isolation'] === 'isolate' ||\n s.position === 'fixed' ||\n s.webkitOverflowScrolling === 'touch') {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n while (el) {\n if (el.localName === 'dialog') {\n return /** @type {HTMLDialogElement} */ (el);\n }\n if (el.parentElement) {\n el = el.parentElement;\n } else if (el.parentNode) {\n el = el.parentNode.host;\n } else {\n el = null;\n }\n }\n return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n // Find the actual focused element when the active element is inside a shadow root\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement;\n }\n\n if (el && el.blur && el !== document.body) {\n el.blur();\n }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n for (var i = 0; i < nodeList.length; ++i) {\n if (nodeList[i] === node) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n if (!el || !el.hasAttribute('method')) {\n return false;\n }\n return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!DocumentFragment|!Element} hostElement\n * @return {?Element}\n */\nfunction findFocusableElementWithin(hostElement) {\n // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n // alternative involves stepping through and trying to focus everything.\n var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n var query = opts.map(function(el) {\n return el + ':not([disabled])';\n });\n // TODO(samthor): tabindex values that are not numeric are not focusable.\n query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])'); // tabindex != \"\", not disabled\n var target = hostElement.querySelector(query.join(', '));\n\n if (!target && 'attachShadow' in Element.prototype) {\n // If we haven't found a focusable target, see if the host element contains an element\n // which has a shadowRoot.\n // Recursively search for the first focusable item in shadow roots.\n var elems = hostElement.querySelectorAll('*');\n for (var i = 0; i < elems.length; i++) {\n if (elems[i].tagName && elems[i].shadowRoot) {\n target = findFocusableElementWithin(elems[i].shadowRoot);\n if (target) {\n break;\n }\n }\n }\n }\n return target;\n}\n\n/**\n * Determines if an element is attached to the DOM.\n * @param {Element} element to check\n * @return {boolean} whether the element is in DOM\n */\nfunction isConnected(element) {\n return element.isConnected || document.body.contains(element);\n}\n\n/**\n * @param {!Event} event\n * @return {?Element}\n */\nfunction findFormSubmitter(event) {\n if (event.submitter) {\n return event.submitter;\n }\n\n var form = event.target;\n if (!(form instanceof HTMLFormElement)) {\n return null;\n }\n\n var submitter = dialogPolyfill.formSubmitter;\n if (!submitter) {\n var target = event.target;\n var root = ('getRootNode' in target && target.getRootNode() || document);\n submitter = root.activeElement;\n }\n\n if (!submitter || submitter.form !== form) {\n return null;\n }\n return submitter;\n}\n\n/**\n * @param {!Event} event\n */\nfunction maybeHandleSubmit(event) {\n if (event.defaultPrevented) {\n return;\n }\n var form = /** @type {!HTMLFormElement} */ (event.target);\n\n // We'd have a value if we clicked on an imagemap.\n var value = dialogPolyfill.imagemapUseValue;\n var submitter = findFormSubmitter(event);\n if (value === null && submitter) {\n value = submitter.value;\n }\n\n // There should always be a dialog as this handler is added specifically on them, but check just\n // in case.\n var dialog = findNearestDialog(form);\n if (!dialog) {\n return;\n }\n\n // Prefer formmethod on the button.\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod !== 'dialog') {\n return;\n }\n event.preventDefault();\n\n if (value != null) {\n // nb. we explicitly check against null/undefined\n dialog.close(value);\n } else {\n dialog.close();\n }\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n this.dialog_ = dialog;\n this.replacedStyleTop_ = false;\n this.openAsModal_ = false;\n\n // Set a11y role. Browsers that support dialog implicitly know this already.\n if (!dialog.hasAttribute('role')) {\n dialog.setAttribute('role', 'dialog');\n }\n\n dialog.show = this.show.bind(this);\n dialog.showModal = this.showModal.bind(this);\n dialog.close = this.close.bind(this);\n\n dialog.addEventListener('submit', maybeHandleSubmit, false);\n\n if (!('returnValue' in dialog)) {\n dialog.returnValue = '';\n }\n\n if ('MutationObserver' in window) {\n var mo = new MutationObserver(this.maybeHideModal.bind(this));\n mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n } else {\n // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n // seem to fire even if the element was removed as part of a parent removal. Use the removed\n // events to force downgrade (useful if removed/immediately added).\n var removed = false;\n var cb = function() {\n removed ? this.downgradeModal() : this.maybeHideModal();\n removed = false;\n }.bind(this);\n var timeout;\n var delayModel = function(ev) {\n if (ev.target !== dialog) { return; } // not for a child element\n var cand = 'DOMNodeRemoved';\n removed |= (ev.type.substr(0, cand.length) === cand);\n window.clearTimeout(timeout);\n timeout = window.setTimeout(cb, 0);\n };\n ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n dialog.addEventListener(name, delayModel);\n });\n }\n // Note that the DOM is observed inside DialogManager while any dialog\n // is being displayed as a modal, to catch modal removal from the DOM.\n\n Object.defineProperty(dialog, 'open', {\n set: this.setOpen.bind(this),\n get: dialog.hasAttribute.bind(dialog, 'open')\n });\n\n this.backdrop_ = document.createElement('div');\n this.backdrop_.className = 'backdrop';\n this.backdrop_.addEventListener('mouseup' , this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('mousedown', this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('click' , this.backdropMouseEvent_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = /** @type {HTMLDialogElement.prototype} */ ({\n\n get dialog() {\n return this.dialog_;\n },\n\n /**\n * Maybe remove this dialog from the modal top layer. This is called when\n * a modal dialog may no longer be tenable, e.g., when the dialog is no\n * longer open or is no longer part of the DOM.\n */\n maybeHideModal: function() {\n if (this.dialog_.hasAttribute('open') && isConnected(this.dialog_)) { return; }\n this.downgradeModal();\n },\n\n /**\n * Remove this dialog from the modal top layer, leaving it as a non-modal.\n */\n downgradeModal: function() {\n if (!this.openAsModal_) { return; }\n this.openAsModal_ = false;\n this.dialog_.style.zIndex = '';\n\n // This won't match the native <dialog> exactly because if the user set top on a centered\n // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n // possible to polyfill this perfectly.\n if (this.replacedStyleTop_) {\n this.dialog_.style.top = '';\n this.replacedStyleTop_ = false;\n }\n\n // Clear the backdrop and remove from the manager.\n this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n dialogPolyfill.dm.removeDialog(this);\n },\n\n /**\n * @param {boolean} value whether to open or close this dialog\n */\n setOpen: function(value) {\n if (value) {\n this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n } else {\n this.dialog_.removeAttribute('open');\n this.maybeHideModal(); // nb. redundant with MutationObserver\n }\n },\n\n /**\n * Handles mouse events ('mouseup', 'mousedown', 'click') on the fake .backdrop element, redirecting them as if\n * they were on the dialog itself.\n *\n * @param {!Event} e to redirect\n */\n backdropMouseEvent_: function(e) {\n if (!this.dialog_.hasAttribute('tabindex')) {\n // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n // would not be needed - clicks would move the implicit cursor there.\n var fake = document.createElement('div');\n this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n fake.tabIndex = -1;\n fake.focus();\n this.dialog_.removeChild(fake);\n } else {\n this.dialog_.focus();\n }\n\n var redirectedEvent = document.createEvent('MouseEvents');\n redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n this.dialog_.dispatchEvent(redirectedEvent);\n e.stopPropagation();\n },\n\n /**\n * Focuses on the first focusable element within the dialog. This will always blur the current\n * focus, even if nothing within the dialog is found.\n */\n focus_: function() {\n // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n if (!target && this.dialog_.tabIndex >= 0) {\n target = this.dialog_;\n }\n if (!target) {\n target = findFocusableElementWithin(this.dialog_);\n }\n safeBlur(document.activeElement);\n target && target.focus();\n },\n\n /**\n * Sets the zIndex for the backdrop and dialog.\n *\n * @param {number} dialogZ\n * @param {number} backdropZ\n */\n updateZIndex: function(dialogZ, backdropZ) {\n if (dialogZ < backdropZ) {\n throw new Error('dialogZ should never be < backdropZ');\n }\n this.dialog_.style.zIndex = dialogZ;\n this.backdrop_.style.zIndex = backdropZ;\n },\n\n /**\n * Shows the dialog. If the dialog is already open, this does nothing.\n */\n show: function() {\n if (!this.dialog_.open) {\n this.setOpen(true);\n this.focus_();\n }\n },\n\n /**\n * Show this dialog modally.\n */\n showModal: function() {\n if (this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n }\n if (!isConnected(this.dialog_)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n }\n if (!dialogPolyfill.dm.pushDialog(this)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n }\n\n if (createsStackingContext(this.dialog_.parentElement)) {\n console.warn('A dialog is being shown inside a stacking context. ' +\n 'This may cause it to be unusable. For more information, see this link: ' +\n 'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n }\n\n this.setOpen(true);\n this.openAsModal_ = true;\n\n // Optionally center vertically, relative to the current viewport.\n if (dialogPolyfill.needsCentering(this.dialog_)) {\n dialogPolyfill.reposition(this.dialog_);\n this.replacedStyleTop_ = true;\n } else {\n this.replacedStyleTop_ = false;\n }\n\n // Insert backdrop.\n this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n // Focus on whatever inside the dialog.\n this.focus_();\n },\n\n /**\n * Closes this HTMLDialogElement. This is optional vs clearing the open\n * attribute, however this fires a 'close' event.\n *\n * @param {string=} opt_returnValue to use as the returnValue\n */\n close: function(opt_returnValue) {\n if (!this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n }\n this.setOpen(false);\n\n // Leave returnValue untouched in case it was set directly on the element\n if (opt_returnValue !== undefined) {\n this.dialog_.returnValue = opt_returnValue;\n }\n\n // Triggering \"close\" event for any attached listeners on the <dialog>.\n var closeEvent = new supportCustomEvent('close', {\n bubbles: false,\n cancelable: false\n });\n safeDispatchEvent(this.dialog_, closeEvent);\n }\n\n});\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n for (var i = 0; i < document.styleSheets.length; ++i) {\n var styleSheet = document.styleSheets[i];\n var cssRules = null;\n // Some browsers throw on cssRules.\n try {\n cssRules = styleSheet.cssRules;\n } catch (e) {}\n if (!cssRules) { continue; }\n for (var j = 0; j < cssRules.length; ++j) {\n var rule = cssRules[j];\n var selectedNodes = null;\n // Ignore errors on invalid selector texts.\n try {\n selectedNodes = document.querySelectorAll(rule.selectorText);\n } catch(e) {}\n if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n continue;\n }\n var cssTop = rule.style.getPropertyValue('top');\n var cssBottom = rule.style.getPropertyValue('bottom');\n if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n return true;\n }\n }\n }\n return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n var computedStyle = window.getComputedStyle(dialog);\n if (computedStyle.position !== 'absolute') {\n return false;\n }\n\n // We must determine whether the top/bottom specified value is non-auto. In\n // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n // Firefox returns the used value. So we do this crazy thing instead: check\n // the inline style and then go through CSS rules.\n if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n return false;\n }\n return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n if (window.HTMLDialogElement || element.showModal) {\n console.warn('This browser already supports <dialog>, the polyfill ' +\n 'may not work correctly', element);\n }\n if (element.localName !== 'dialog') {\n throw new Error('Failed to register dialog: The element is not a dialog.');\n }\n new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n if (!element.showModal) {\n dialogPolyfill.forceRegisterDialog(element);\n }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n /** @type {!Array<!dialogPolyfillInfo>} */\n this.pendingDialogStack = [];\n\n var checkDOM = this.checkDOM_.bind(this);\n\n // The overlay is used to simulate how a modal dialog blocks the document.\n // The blocking dialog is positioned on top of the overlay, and the rest of\n // the dialogs on the pending dialog stack are positioned below it. In the\n // actual implementation, the modal dialog stacking is controlled by the\n // top layer, where z-index has no effect.\n this.overlay = document.createElement('div');\n this.overlay.className = '_dialog_overlay';\n this.overlay.addEventListener('click', function(e) {\n this.forwardTab_ = undefined;\n e.stopPropagation();\n checkDOM([]); // sanity-check DOM\n }.bind(this));\n\n this.handleKey_ = this.handleKey_.bind(this);\n this.handleFocus_ = this.handleFocus_.bind(this);\n\n this.zIndexLow_ = 100000;\n this.zIndexHigh_ = 100000 + 150;\n\n this.forwardTab_ = undefined;\n\n if ('MutationObserver' in window) {\n this.mo_ = new MutationObserver(function(records) {\n var removed = [];\n records.forEach(function(rec) {\n for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n if (!(c instanceof Element)) {\n continue;\n } else if (c.localName === 'dialog') {\n removed.push(c);\n }\n removed = removed.concat(c.querySelectorAll('dialog'));\n }\n });\n removed.length && checkDOM(removed);\n });\n }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n document.documentElement.addEventListener('focus', this.handleFocus_, true);\n document.addEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n document.removeEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n var zIndex = this.zIndexHigh_;\n\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n dpi.updateZIndex(--zIndex, --zIndex);\n if (i === 0) {\n this.overlay.style.zIndex = --zIndex;\n }\n }\n\n // Make the overlay a sibling of the dialog itself.\n var last = this.pendingDialogStack[0];\n if (last) {\n var p = last.dialog.parentNode || document.body;\n p.appendChild(this.overlay);\n } else if (this.overlay.parentNode) {\n this.overlay.parentNode.removeChild(this.overlay);\n }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n while (candidate = findNearestDialog(candidate)) {\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n if (dpi.dialog === candidate) {\n return i === 0; // only valid if top-most\n }\n }\n candidate = candidate.parentElement;\n }\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n var target = event.composedPath ? event.composedPath()[0] : event.target;\n\n if (this.containedByTopDialog_(target)) { return; }\n\n if (document.activeElement === document.documentElement) { return; }\n\n event.preventDefault();\n event.stopPropagation();\n safeBlur(/** @type {Element} */ (target));\n\n if (this.forwardTab_ === undefined) { return; } // move focus only from a tab key\n\n var dpi = this.pendingDialogStack[0];\n var dialog = dpi.dialog;\n var position = dialog.compareDocumentPosition(target);\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n if (this.forwardTab_) {\n // forward\n dpi.focus_();\n } else if (target !== document.documentElement) {\n // backwards if we're not already focused on <html>\n document.documentElement.focus();\n }\n }\n\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n this.forwardTab_ = undefined;\n if (event.keyCode === 27) {\n event.preventDefault();\n event.stopPropagation();\n var cancelEvent = new supportCustomEvent('cancel', {\n bubbles: false,\n cancelable: true\n });\n var dpi = this.pendingDialogStack[0];\n if (dpi && safeDispatchEvent(dpi.dialog, cancelEvent)) {\n dpi.dialog.close();\n }\n } else if (event.keyCode === 9) {\n this.forwardTab_ = !event.shiftKey;\n }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n // This operates on a clone because it may cause it to change. Each change also calls\n // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n // at a time?!\n var clone = this.pendingDialogStack.slice();\n clone.forEach(function(dpi) {\n if (removed.indexOf(dpi.dialog) !== -1) {\n dpi.downgradeModal();\n } else {\n dpi.maybeHideModal();\n }\n });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n if (this.pendingDialogStack.length >= allowed) {\n return false;\n }\n if (this.pendingDialogStack.unshift(dpi) === 1) {\n this.blockDocument();\n }\n this.updateStacking();\n return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n var index = this.pendingDialogStack.indexOf(dpi);\n if (index === -1) { return; }\n\n this.pendingDialogStack.splice(index, 1);\n if (this.pendingDialogStack.length === 0) {\n this.unblockDocument();\n }\n this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.imagemapUseValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n /**\n * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n * one that returns the correct value.\n */\n var testForm = document.createElement('form');\n testForm.setAttribute('method', 'dialog');\n if (testForm.method !== 'dialog') {\n var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n if (methodDescriptor) {\n // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n // and don't bother to update the element.\n var realGet = methodDescriptor.get;\n methodDescriptor.get = function() {\n if (isFormMethodDialog(this)) {\n return 'dialog';\n }\n return realGet.call(this);\n };\n var realSet = methodDescriptor.set;\n /** @this {HTMLElement} */\n methodDescriptor.set = function(v) {\n if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n return this.setAttribute('method', v);\n }\n return realSet.call(this, v);\n };\n Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n }\n }\n\n /**\n * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n * document.activeElement.\n */\n document.addEventListener('click', function(ev) {\n dialogPolyfill.formSubmitter = null;\n dialogPolyfill.imagemapUseValue = null;\n if (ev.defaultPrevented) { return; } // e.g. a submit which prevents default submission\n\n var target = /** @type {Element} */ (ev.target);\n if ('composedPath' in ev) {\n var path = ev.composedPath();\n target = path.shift() || target;\n }\n if (!target || !isFormMethodDialog(target.form)) { return; }\n\n var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n if (!valid) {\n if (!(target.localName === 'input' && target.type === 'image')) { return; }\n // this is a <input type=\"image\">, which can submit forms\n dialogPolyfill.imagemapUseValue = ev.offsetX + ',' + ev.offsetY;\n }\n\n var dialog = findNearestDialog(target);\n if (!dialog) { return; }\n\n dialogPolyfill.formSubmitter = target;\n\n }, false);\n\n /**\n * Global 'submit' handler. This handles submits of `method=\"dialog\"` which are invalid, i.e.,\n * outside a dialog. They get prevented.\n */\n document.addEventListener('submit', function(ev) {\n var form = ev.target;\n var dialog = findNearestDialog(form);\n if (dialog) {\n return; // ignore, handle there\n }\n\n var submitter = findFormSubmitter(ev);\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod === 'dialog') {\n ev.preventDefault();\n }\n });\n\n /**\n * Replace the native HTMLFormElement.submit() method, as it won't fire the\n * submit event and give us a chance to respond.\n */\n var nativeFormSubmit = HTMLFormElement.prototype.submit;\n var replacementFormSubmit = function () {\n if (!isFormMethodDialog(this)) {\n return nativeFormSubmit.call(this);\n }\n var dialog = findNearestDialog(this);\n dialog && dialog.close();\n };\n HTMLFormElement.prototype.submit = replacementFormSubmit;\n}\n\nexport default dialogPolyfill;\n","import dialogPolyfill from \"dialog-polyfill\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LightboxImageController extends BaseController {\n\n static values = {\n src: String,\n srcSet: String,\n sizes: String,\n };\n static classes = [\"modal\", \"image\"];\n\n declare readonly hasModalClass: boolean;\n declare readonly modalClass: string;\n declare readonly hasImageClass: boolean;\n declare readonly imageClass: string;\n declare readonly hasSrcValue: boolean;\n declare readonly srcValue: string;\n declare readonly hasSrcSetValue: boolean;\n declare readonly srcSetValue: string;\n declare readonly hasSizesValue: boolean;\n declare readonly sizesValue: string;\n _dialog: HTMLDialogElement | null = null;\n\n get _src(): string {\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\n }\n\n get _srcSet(): string {\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\n }\n\n get _sizes(): string {\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\n }\n\n get _modalClassName() {\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\n }\n\n get _imageClassName() {\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\n }\n\n initialize() {\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n }\n\n connect() {\n }\n\n disconnect() {\n this.close();\n }\n\n open() {\n let element = this.el as HTMLImageElement;\n if (this._dialog) {\n return;\n }\n this._dialog = document.createElement(\"dialog\");\n\n let image = document.createElement(\"img\") as HTMLImageElement;\n image.className = this._imageClassName;\n image.src = this._src;\n image.srcset = this._srcSet;\n image.sizes = this._sizes;\n this._dialog.appendChild(image);\n\n element.insertAdjacentElement(\"afterend\", this._dialog);\n dialogPolyfill.registerDialog(this._dialog);\n this._dialog.className = this._modalClassName;\n // @ts-ignore Experimental API\n this._dialog.showModal();\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\n useEventListener(this, this._dialog, \"click\", this.close);\n useEventListener(this, this._dialog, \"cancel\", this.close);\n useEventListener(this, this._dialog, \"close\", this.close);\n }\n\n close() {\n if (this._dialog) {\n // @ts-ignore Experimental API\n this._dialog.close();\n this._dialog.remove();\n this._dialog = null;\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class MediaPlayerController extends BaseController {\n\n static targets = [\"media\"];\n\n declare readonly mediaTarget: HTMLMediaElement;\n\n async play(event?: Event) {\n event?.preventDefault();\n await this.mediaTarget.play();\n }\n\n pause(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.pause();\n }\n\n restart(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime = 0;\n }\n\n seek(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime += 5;\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollUp} from \"../../utilities/scroll\";\n\nexport class ScrollContainerController extends BaseController {\n\n static values = {\n behaviour: String,\n increment: Number,\n };\n\n declare readonly behaviourValue: ScrollBehavior;\n declare readonly hasBehaviourValue: boolean;\n\n declare readonly incrementValue: number;\n declare readonly hasIncrementValue: boolean;\n\n get _increment(): number {\n return this.hasIncrementValue ? this.incrementValue : 50;\n }\n\n get _behaviour(): ScrollBehavior {\n if (this.hasBehaviourValue) {\n if ([\"auto\", \"smooth\"].includes(this.behaviourValue)) {\n return this.behaviourValue;\n } else {\n throw new Error(`'${this.behaviourValue}' is not a recognised scroll behaviour`);\n }\n } else {\n return \"auto\";\n }\n }\n\n async scrollTop(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteTop(this.el, {behavior: this._behaviour});\n }\n\n async scrollBottom(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteBottom(this.el, {behavior: this._behaviour});\n }\n\n async scrollLeft(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async scrollRight(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async up(event?: Event) {\n event?.preventDefault();\n await scrollUp(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async down(event?: Event) {\n event?.preventDefault();\n await scrollDown(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async left(event?: Event) {\n event?.preventDefault();\n await scrollLeft(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async right(event?: Event) {\n event?.preventDefault();\n await scrollRight(this.el, this._increment, {behavior: this._behaviour});\n }\n}\n\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollIntoFocusController extends EphemeralController {\n\n static values = {\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n connect() {\n requestAnimationFrame(() => {\n // Attempt smooth scrolling, with polyfill\n scrollToElement(\n this.el,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\n this._cleanupSelf();\n });\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteBottom} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteBottom(this._scrollTarget);\n }\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteTop} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteTop(this._scrollTarget);\n }\n }\n\n}\n\n","export function extractPredicates(expressionString: string): Array<(val: string | number) => boolean> {\n expressionString = expressionString.trim();\n\n let andExpression = expressionString.includes(\"&&\");\n let orExpression = expressionString.includes(\"||\");\n let groupings = expressionString.includes(\"(\") || expressionString.includes(\")\");\n\n if (andExpression && orExpression) {\n throw new Error(\"Cannot have both && and || in the same expression.\");\n }\n\n if (groupings) {\n throw new Error(\"Cannot have logical groupings `(>3 && <= 9) || (>1 && <2)` in the expression. Only supports simple expressions like `>1 && <3`\");\n }\n\n let expressions = expressionString.split(andExpression ? \"&&\" : \"||\");\n if (andExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else if (orExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else {\n return [_predicateForExpression(expressionString)];\n }\n}\n\n\nfunction _predicateForExpression(expression: string): (val: string | number) => boolean {\n let operators = [\">=\", \"<=\", \"==\", \"!=\", \">\", \"<\"];\n let operator = operators.find(part => expression.includes(part));\n if (!operator) {\n throw new Error(`Could not find operator in expression: ${expression}`);\n }\n let expressionValue: string | number = expression.split(operator)[1].trim();\n let isNumber = /^-?\\d*(\\.\\d+)?$/.test(expressionValue);\n if (isNumber) {\n expressionValue = parseFloat(expressionValue);\n }\n\n if (expressionValue === \"\") {\n throw new Error(`Could not find a value in expression: ${expression}`);\n }\n\n let notEmpty = (signalValue: string | number) => signalValue !== \"\";\n\n switch (operator) {\n case \">\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue > expressionValue;\n case \"<\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue < expressionValue;\n case \">=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue >= expressionValue;\n case \"<=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue <= expressionValue;\n case \"==\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue == expressionValue;\n case \"!=\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue != expressionValue;\n default:\n throw new Error(`Unknown operator ${operator}`);\n }\n}\n","export function signalEventName(name: string, type: string): string {\n return `signal:${type}:${name}`;\n}\n\nexport function signalConnectEvent(name: string): string {\n return signalEventName(name, 'connect');\n}\n\nexport function signalValueEvent(name: string): string {\n return signalEventName(name, 'value');\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {EventBus} from \"../../utilities\";\nimport {signalConnectEvent, signalEventName, signalValueEvent} from \"./events\";\n\nexport class SignalActionController extends BaseController {\n\n static values = {\n name: String,\n when: String,\n };\n\n declare whenValue: string;\n declare readonly hasWhenValue: boolean;\n\n declare nameValue: string;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.whenValue);\n }\n\n connect() {\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (!this.hasWhenValue) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'));\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'), {detail: {element: this.el, value}});\n } else {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'no-match'), {detail: {element: this.el, value}});\n }\n }\n\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useMutationObserver(controller: Controller, element: HTMLElement, handler: (entries: MutationRecord[]) => void, options: MutationObserverInit) {\n handler = handler.bind(controller);\n let observer: MutationObserver = new MutationObserver(handler);\n\n let setup = () => observer.observe(element, options);\n let teardown = () => observer.disconnect();\n\n useMixin(controller, setup, teardown);\n return teardown;\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {EventBus} from \"../../utilities\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {useMutationObserver} from \"../../mixins/use_mutation_observer\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport class SignalDomChildrenController extends BaseController {\n\n static values = {\n name: String,\n scopeSelector: String,\n };\n declare nameValue: string;\n declare hasNameValue: boolean;\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _children(): Element[] {\n if (this.hasScopeSelectorValue) {\n return Array.from(this.el.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(this.el.children);\n }\n }\n\n get _name() {\n if (this.hasNameValue) {\n return this.nameValue;\n } else {\n throw new Error(\"SignalEmptyDomController requires a nameValue to be provided\");\n }\n }\n\n connect() {\n useEventBus(this, signalConnectEvent(this._name), this.emitChildCount);\n EventBus.emit(signalConnectEvent(this._name));\n useMutationObserver(this, this.el, this.mutate, {childList: true});\n this.emitChildCount();\n }\n\n mutate(entries: MutationRecord[]) {\n this.emitChildCount();\n }\n\n emitChildCount() {\n let childCount = this._children.length;\n EventBus.emit(signalValueEvent(this._name), {element: this.el, value: childCount.toString()} as SignalPayload);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListeners} from \"../../mixins/use_event_listener\";\nimport {getAllRadiosInGroup, isHTMLInputElement} from \"../../utilities\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SignalPayload {\n element: HTMLElement;\n value: string;\n}\n\nexport class SignalInputController extends BaseController {\n\n static values = {\n name: String,\n debounceInterval: Number,\n };\n\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n declare nameValue: string;\n declare hasNameValue: boolean;\n\n get _debounceTimeout(): number | null {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : 1;\n }\n\n get _name(): string {\n return this.hasNameValue ? this.nameValue : (this.element as HTMLInputElement).name;\n }\n\n connect() {\n useEventBus(this, signalConnectEvent(this._name), () => this.emitValue());\n useEventListeners(this, this.el, [\"input\", \"change\"], this.emitValue, {debounce: this._debounceTimeout || undefined});\n requestAnimationFrame(() => this.emitValue());\n }\n\n emitValue() {\n let value = (this.el as HTMLInputElement).value;\n\n if (isHTMLInputElement(this.el) && this.el.type === \"checkbox\") {\n value = this.el.checked ? \"true\" : \"false\";\n } else if (isHTMLInputElement(this.el) && this.el.type === \"radio\") {\n let selectedValue = getAllRadiosInGroup(this.el).find(el => el.checked)?.value;\n value = selectedValue ? selectedValue : \"\";\n }\n\n this.dispatchEvent(this.el, signalValueEvent(this._name), {detail: {value}});\n EventBus.emit(signalValueEvent(this._name), {element: this.el, value} as SignalPayload);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {EventBus} from \"../../utilities\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class SignalVisibilityController extends BaseController {\n\n static values = {\n name: String,\n show: String,\n };\n\n static classes = ['hide'];\n\n declare nameValue: string;\n declare showValue: string;\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.showValue);\n }\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (this.showValue == \"default\") {\n if (value == \"\") {\n this.removeHideClasses(this.el);\n } else {\n this.addHideClasses(this.el);\n }\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.dispatchEvent(this.el, \"signal-visibility:show\", {detail: {predicate: this.showValue, value}});\n this.removeHideClasses(this.el);\n } else {\n this.dispatchEvent(this.el, \"signal-visibility:hide\", {detail: {predicate: this.showValue, value}});\n this.addHideClasses(this.el);\n }\n }\n\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TableSortController extends BaseController {\n\n static values = {startSort: Number};\n\n declare readonly startSortValue: number;\n declare readonly hasStartSortValue: boolean;\n _lastIndex: number | null = null;\n _reverse: boolean = false;\n\n get _tableHead(): HTMLTableSectionElement {\n let head = (this.el as HTMLTableElement).tHead;\n if (head == null) {\n throw new Error('Expected table to have a <thead> element.');\n }\n return head;\n }\n\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\n let rows = this._tableHead.rows;\n if (rows.length == 0) {\n throw new Error('Expected table to have a <thead> element with at least one row.');\n }\n return Array.from(rows[0].cells);\n }\n\n get _tableBody() {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n connect() {\n requestAnimationFrame(() => {\n useCollectionEventListener(this, this._tableHeaders, \"click\", this.sort);\n if (this.hasStartSortValue) {\n this._sortByColumn(this.startSortValue);\n }\n });\n }\n\n sort(event: Event) {\n event.preventDefault();\n let headerCell = event.target! as HTMLTableHeaderCellElement;\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\n if (headerCell.dataset.sortable == \"false\") {\n return;\n }\n if (headerCell.dataset.sort == \"asc\") {\n this._reverse = true;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"desc\";\n this._sortByColumn(headerCellIndex);\n } else {\n this._reverse = false;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"asc\";\n this._sortByColumn(headerCellIndex);\n }\n }\n\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement): number {\n return this._tableHeaders.indexOf(cell);\n }\n\n private _otherHeaderCells(cell: HTMLTableHeaderCellElement): HTMLTableHeaderCellElement[] {\n return Array.from(this._tableHeaders).filter(otherCell => otherCell != cell);\n }\n\n private _sortByColumn(index: number) {\n let frag = document.createDocumentFragment();\n let rows = this._tableRows;\n\n let newRows = rows.sort((row, otherRow) => {\n let cells = Array.from(row.cells);\n let otherCells = Array.from(otherRow.cells);\n\n // TODO: Handle colspans?\n let x = cells[index]?.innerText || \"\";\n let y = otherCells[index]?.innerText || \"\";\n\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\n\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\n return sortVal;\n }\n return -1;\n }\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\n return sortVal;\n }\n return 1;\n }\n\n if (this._reverse) {\n return sortVal > 0 ? -1 : 1;\n }\n return sortVal;\n });\n\n newRows.forEach(row => frag.appendChild(row));\n\n this._tableBody.innerHTML = \"\";\n this._tableBody.appendChild(frag);\n this._lastIndex = index;\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useMutationObserver} from \"../../mixins/use_mutation_observer\";\n\nexport class TableTruncateController extends BaseController {\n\n static targets = [\"showMore\"];\n static values = {\n limit: Number,\n truncated: Boolean,\n };\n\n declare readonly showMoreTarget: HTMLElement;\n declare limitValue: number;\n declare readonly hasLimitValue: boolean;\n declare truncatedValue: boolean;\n declare readonly hasTruncatedValue: boolean;\n\n get _truncated(): boolean {\n return this.hasTruncatedValue ? this.truncatedValue : false;\n }\n\n set _truncated(value) {\n this.truncatedValue = value;\n }\n\n get _tableBody(): HTMLTableSectionElement {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n get _limit(): number {\n return this.hasLimitValue ? this.limitValue : 20;\n }\n\n connect() {\n useMutationObserver(this, this._tableBody, this.mutate, {childList: true});\n\n requestAnimationFrame(() => {\n this.truncate();\n useEventListener(this, this.showMoreTarget, \"click\", this.expand);\n });\n }\n\n truncate(event?: Event) {\n event?.preventDefault();\n this._truncated = true;\n if (this._tableRows.length >= this._limit) {\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n } else {\n this._hideElement(this.showMoreTarget);\n }\n }\n\n expand(event?: Event) {\n this._truncated = false;\n event?.preventDefault();\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._hideElement(this.showMoreTarget);\n }\n\n mutate(entries: MutationRecord[]) {\n if (this._truncated) {\n this._reTruncate();\n }\n }\n\n private _showElement(el: HTMLElement): void {\n el.style.display = \"\";\n }\n\n private _hideElement(el: HTMLElement): void {\n el.style.display = \"none\";\n }\n\n private _reTruncate() {\n this._tableRows.slice(0, this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AlertController extends BaseController {\n\n static values = {message: String};\n\n declare messageValue: string;\n\n alert() {\n alert(this.messageValue);\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useFullscreen} from \"../../mixins\";\n\nexport class FullscreenController extends BaseController {\n\n declare enter: () => void;\n declare exit: () => void;\n declare toggle: () => void;\n\n connect() {\n let {enter, exit, toggle} = useFullscreen(this);\n this.enter = enter;\n this.exit = exit;\n this.toggle = toggle;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\nimport {dispatchEvent} from \"../../utilities/events\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, this.el, this.appear, this.disappear, {threshold: this._threshold});\n }\n\n appear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:appear\");\n };\n\n disappear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:disappear\");\n };\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class IntervalController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n declare readonly hasSecondsValue: boolean;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error('Expected `secondsValue` to be present');\n }\n requestAnimationFrame(() => {\n useInterval(this, this._interval, this.secondsValue * 1000);\n });\n }\n\n _interval() {\n this.dispatchEvent(this.el, \"interval:action\");\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PresenceController extends BaseController {\n\n static values = {name: String};\n\n declare nameValue: string;\n declare readonly hasNameValue: boolean;\n\n get name(): string {\n return this.hasNameValue ? this.nameValue : ``;\n }\n\n get _addedEventName(): string {\n return [this.name, 'presence', 'added'].filter(el => !!el).join(':');\n }\n\n get _removedEventName(): string {\n return [this.name, 'presence', 'removed'].filter(el => !!el).join(':');\n }\n\n connect() {\n this.dispatchEvent(this.el, this._addedEventName);\n }\n\n disconnect() {\n this.dispatchEvent(this.el, this._removedEventName);\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class PrintController extends BaseController {\n\n print(event?: Event) {\n event?.preventDefault();\n window.print();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeoutController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n useTimeout(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n _timeout() {\n this.dispatchEvent(this.el, \"timeout\");\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class UserFocusController extends BaseController {\n\n connect() {\n useEventListener(this, window, [\"focus\", \"blur\"], this._handleVisibility);\n useEventListener(this, document, \"visibilitychange\", this._handleVisibility);\n requestAnimationFrame(() => {\n this._handleVisibility();\n });\n }\n\n appear() {\n this.dispatchEvent(this.el, \"user-focus:active\");\n }\n\n away() {\n this.dispatchEvent(this.el, \"user-focus:away\");\n }\n\n private _handleVisibility() {\n this._documentIsActive() ? this.appear() : this.away();\n }\n\n private _documentIsActive() {\n return document.visibilityState == \"visible\" && document.hasFocus();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class ClockController extends BaseController {\n\n\n static targets = [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"];\n\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n declare readonly hasMillisecondsTarget: boolean;\n declare readonly millisecondsTarget: HTMLElement;\n\n get _tickInterval() {\n if (this.hasMillisecondsTarget) {\n return 1; // 1 ms\n } else if (this.hasSecondsTarget) {\n return 1000; // 1 seconds\n } else if (this.hasMinutesTarget) {\n return 15000; // 15 seconds\n } else {\n return 300000; // Every 5 minutes\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useInterval(this, this._tick, this._tickInterval);\n });\n }\n\n _tick() {\n let current = new Date();\n\n if (this.hasHoursTarget) {\n this.hoursTarget.innerHTML = current\n .getHours()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMinutesTarget) {\n this.minutesTarget.innerHTML = current\n .getMinutes()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasSecondsTarget) {\n this.secondsTarget.innerHTML = current\n .getSeconds()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMillisecondsTarget) {\n this.millisecondsTarget.innerHTML = current\n .getMilliseconds()\n .toString()\n .padStart(3, \"0\");\n }\n }\n}\n","import {Duration, intervalToDuration, isPast} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class CountdownController extends BaseController {\n\n static values = {deadline: String, removeUnused: Boolean};\n static targets = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n static classes = [\"countingDown\", \"ended\"];\n\n // Values\n declare readonly deadlineValue: string;\n declare readonly removeUnusedValue: boolean;\n declare readonly hasRemoveUnusedValue: boolean;\n // Targets\n declare readonly hasYearsTarget: boolean;\n declare readonly yearsTarget: HTMLElement;\n declare readonly hasMonthsTarget: boolean;\n declare readonly monthsTarget: HTMLElement;\n declare readonly hasDaysTarget: boolean;\n declare readonly daysTarget: HTMLElement;\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n // Classes\n declare addEndedClasses: (el?: HTMLElement) => void;\n declare removeEndedClasses: (el?: HTMLElement) => void;\n declare addCountingDownClasses: (el?: HTMLElement) => void;\n declare removeCountingDownClasses: (el?: HTMLElement) => void;\n\n // Instance Data\n _interval: null | ReturnType<typeof window.setInterval> = null;\n\n get _removeUnused(): boolean {\n return this.hasRemoveUnusedValue ? this.removeUnusedValue : false;\n }\n\n\n get _deadlineDate() {\n return new Date(this.deadlineValue);\n }\n\n connect() {\n this._interval = setInterval(this._tick.bind(this), 1000);\n this.addCountingDownClasses();\n }\n\n disconnect() {\n this._clearTick();\n this.removeCountingDownClasses();\n this.removeEndedClasses();\n }\n\n deadlineValueChanged() {\n // Countdown had previously ended, restart ticking. Updating mid-tick will just work.\n if (this._interval == null) {\n this._interval = setInterval(this._tick.bind(this), 1000);\n }\n }\n\n _tick() {\n try {\n const now = new Date();\n let distance: Duration = {};\n\n if (isPast(this._deadlineDate)) {\n distance = {years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0};\n // Countdown has ended, stop ticking\n this._clearTick();\n this.removeCountingDownClasses();\n this.addEndedClasses();\n this.dispatchEvent(this.el, \"countdown:ended\");\n } else {\n distance = intervalToDuration({start: this._deadlineDate, end: now});\n }\n\n if (this.hasYearsTarget) {\n this._updateTarget(this.yearsTarget, this._years(distance));\n }\n if (this.hasMonthsTarget) {\n this._updateTarget(this.monthsTarget, this._months(distance));\n }\n if (this.hasDaysTarget) {\n this._updateTarget(this.daysTarget, this._days(distance));\n }\n if (this.hasHoursTarget) {\n this._updateTarget(this.hoursTarget, this._hours(distance));\n }\n if (this.hasMinutesTarget) {\n this._updateTarget(this.minutesTarget, this._minutes(distance));\n }\n if (this.hasSecondsTarget) {\n this._updateTarget(this.secondsTarget, this._seconds(distance));\n }\n } catch (e) {\n console.error(e);\n this._clearTick();\n }\n }\n\n _clearTick() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _updateTarget(target: HTMLElement, value: number) {\n this._removeTargetIfUnused(target, value);\n target.innerHTML = value.toString();\n }\n\n _removeTargetIfUnused(target: HTMLElement, value: number) {\n if (this._removeUnused) {\n if (value === 0 && target.dataset.unused) {\n if (Number.parseInt(target.dataset.unused) > Date.now() + 1500) {\n target.remove();\n }\n } else if (value == 0) {\n target.dataset.unused = Date.now().toString();\n } else {\n target.dataset.unused = undefined;\n }\n }\n }\n\n _years(duration: Duration): number {\n return duration.years || 0;\n }\n\n _months(duration: Duration): number {\n return duration.months || 0;\n }\n\n _days(duration: Duration): number {\n return duration.days || 0;\n }\n\n _hours(duration: Duration): number {\n return duration.hours || 0;\n }\n\n _minutes(duration: Duration): number {\n return duration.minutes || 0;\n }\n\n _seconds(duration: Duration): number {\n return duration.seconds || 0;\n }\n\n}\n","import {Duration, formatDuration, intervalToDuration, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class DurationController extends BaseController {\n static values = {\n timestamp: Number,\n minutes: Boolean,\n seconds: Boolean,\n };\n\n declare readonly minutesValue: boolean;\n declare readonly hasMinutesValue: boolean;\n declare readonly secondsValue: boolean;\n declare readonly hasSecondsValue: boolean;\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n declare _clearInterval: () => void;\n\n get _format(): string[] {\n return [\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n ...(this._minutes ? [\"minutes\"] : []),\n ...(this._seconds ? [\"seconds\"] : []),\n ];\n }\n\n get _output(): string {\n let {years, months, weeks, days, hours, minutes, seconds} = this._duration;\n\n years ||= 0;\n months ||= 0;\n weeks ||= 0;\n days ||= 0;\n hours ||= 0;\n minutes ||= 0;\n seconds ||= 0;\n\n let largeDenominators = [years, months, weeks, days, hours];\n\n if (!this._minutes && !this._seconds && largeDenominators.every((x) => x === 0)) {\n minutes = minutes + seconds / 60.0;\n return `${(minutes / 60).toFixed(1)} hours`;\n }\n\n return formatDuration(this._duration, {format: this._format, delimiter: \", \"});\n }\n\n get _seconds(): boolean {\n return this.hasSecondsValue ? this.secondsValue : true;\n }\n\n get _minutes(): boolean {\n return this.hasMinutesValue ? this.minutesValue : true;\n }\n\n get _timestamp(): Date {\n if (this.hasTimestampValue) {\n return toDate(this.timestampValue * 1000);\n } else {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n }\n\n get _duration(): Duration {\n return intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _tickInterval() {\n if (this._seconds) {\n return 1000; // 1 seconds\n } else if (this._minutes) {\n return 15000; // 15 seconds\n } else {\n return 120000; // 2 minutes\n }\n }\n\n connect() {\n this._clearInterval = useInterval(this, this._update, this._tickInterval);\n this._update();\n }\n\n\n _update() {\n try {\n this.el.innerHTML = this._output;\n } catch {\n this._clearInterval();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {clamp} from \"lodash-es\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TabsController extends BaseController {\n\n static values = {currentTab: Number, equalize: Boolean};\n static targets = [\"link\", \"content\"];\n static classes = [\"active\", \"hide\"];\n\n declare currentTabValue: number;\n declare hasCurrentTabValue: boolean;\n\n declare equalizeValue: boolean;\n declare hasEqualizeValue: boolean;\n declare readonly linkTargets: HTMLElement[];\n declare readonly contentTargets: HTMLElement[];\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n get defaultActiveClasses(): string[] {\n return [\"is-active\"];\n }\n\n get _currentTab(): number {\n return this.hasCurrentTabValue ? this.currentTabValue : 0;\n }\n\n get _equalize(): boolean {\n return this.hasEqualizeValue ? this.equalizeValue : false;\n }\n\n connect() {\n useCollectionEventListener(this, this.linkTargets, \"click\", this.switchTabs);\n\n if (this._equalize) {\n this._setMinHeight();\n }\n\n this.currentTabValue = this._currentTab;\n }\n\n switchTabs(event: Event) {\n event.preventDefault();\n this.currentTabValue = this.linkTargets.indexOf(event.currentTarget as HTMLElement);\n }\n\n currentTabValueChanged() {\n let index = this._currentTab;\n index = this._clampIndex(index);\n this._selectTab(index);\n }\n\n _selectTab(index: number) {\n index = this._clampIndex(index);\n let links = this.linkTargets;\n let panels = this.contentTargets;\n let activePanel = panels[index];\n let activeLink = links[index];\n let otherPanels = [...panels.slice(0, index), ...panels.slice(index + 1)];\n let otherLinks = [...links.slice(0, index), ...links.slice(index + 1)];\n\n this.addActiveClasses(activeLink);\n activeLink.setAttribute('aria-selected', \"true\");\n\n this.addActiveClasses(activePanel);\n this.removeHideClasses(activePanel);\n\n otherLinks.forEach((link) => {\n link.removeAttribute('aria-selected');\n this.removeActiveClasses(link);\n });\n otherPanels.forEach((panel) => {\n this.removeActiveClasses(panel);\n this.addHideClasses(panel);\n });\n }\n\n _clampIndex(index: number): number {\n return clamp(index, 0, this.contentTargets.length - 1);\n }\n\n _setMinHeight() {\n let minHeight = 0;\n\n // determine the minimum height\n this.contentTargets.forEach((content) => {\n let hidden = content.hasAttribute(\"tab-hidden\");\n if (hidden) {\n this.removeHideClasses(content);\n }\n\n let height = content.offsetHeight;\n if (height > minHeight) {\n minHeight = height;\n }\n\n if (hidden) {\n this.addHideClasses(content);\n }\n });\n\n // apply to all tabs\n this.contentTargets.forEach((content) => content.style.minHeight = minHeight + \"px\");\n }\n\n}\n","import {Duration, formatDistanceToNow, intervalToDuration, isPast, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeDistanceController extends BaseController {\n static values = {\n timestamp: Number,\n };\n\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n\n declare _timestamp: Date;\n\n get _duration(): Duration {\n return isPast(this._timestamp) ? intervalToDuration({start: this._timestamp, end: new Date()}) : intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _nextUpdate(): number | null {\n let duration = this._duration;\n\n if (duration.years && duration.years > 0) {\n return null;\n } else if (duration.months && duration.months > 0) {\n return null;\n } else if (duration.days && duration.days > 0) {\n return null;\n } else if (duration.hours && duration.hours > 0) {\n return 1800000; // Update every 30 mins\n } else {\n return 30000; // Update every 30 seconds\n }\n }\n\n timestampValueChanged() {\n this._timestamp = toDate(this.timestampValue * 1000);\n }\n\n connect() {\n if (!this.hasTimestampValue) {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n this._update();\n }\n\n _update() {\n this.el.innerHTML = formatDistanceToNow(this._timestamp, {\n addSuffix: true,\n includeSeconds: true,\n });\n\n if (this._nextUpdate) {\n useTimeout(this, this._update, this._nextUpdate);\n }\n }\n}\n","import {useMutationObserver} from \"../../mixins/use_mutation_observer\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class TreeViewController extends BaseController {\n\n static classes = [\n \"active\",\n \"collapsed\",\n ];\n\n declare activeClasses: string[];\n declare activeClassesPresent: (el?: HTMLElement) => boolean;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n declare addCollapsedClasses: (el?: HTMLElement) => void;\n declare removeCollapsedClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultCollapsedClasses(): string[] {\n return [\"collapsed\"];\n }\n\n initialize() {\n this._nodeClicked = this._nodeClicked.bind(this);\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this.el, this.mutate, {subtree: true, childList: true});\n this._setup();\n }\n\n disconnect() {\n this._teardown();\n }\n\n _setup() {\n this._setupNode(this.el);\n }\n\n _setupNode(el: HTMLElement) {\n const process = (e: HTMLElement) => {\n let parent = e.parentElement;\n if (parent) {\n if (!this._nodeActive(parent)) {\n this._hideNode(parent);\n }\n parent.removeEventListener(\"click\", this._nodeClicked);\n parent.addEventListener(\"click\", this._nodeClicked);\n }\n };\n if (el.tagName === 'UL' || el.tagName === 'OL') {\n process(el);\n }\n el.querySelectorAll(\"ul, ol\").forEach(e => process(e as HTMLElement));\n }\n\n _teardown() {\n this.el.querySelectorAll(\"ul, ol, li\").forEach((el) => this._teardownNode(el as HTMLElement));\n }\n\n _teardownNode(el: HTMLElement) {\n [el, ...Array.from(el.querySelectorAll('ul, ol, li')) as HTMLElement[]].forEach((x) => {\n x.removeEventListener(\"click\", this._nodeClicked);\n this.removeActiveClasses(x);\n this.removeCollapsedClasses(x);\n });\n }\n\n _nodeClicked(event: MouseEvent) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n let el = event.target as HTMLElement | null;\n\n if (!el || !this._hasNested(el)) {\n return;\n }\n\n if (this._nodeActive(el)) {\n this._hideNode(el);\n } else {\n this._showNode(el);\n }\n }\n\n _nodeActive(el: HTMLElement): boolean {\n return this.activeClassesPresent(el);\n }\n\n _showNode(el: HTMLElement) {\n this.removeCollapsedClasses(el);\n this.addActiveClasses(el);\n }\n\n _hideNode(el: HTMLElement) {\n this.removeActiveClasses(el);\n this.addCollapsedClasses(el);\n }\n\n _hasNested(el: HTMLElement): boolean {\n return el.querySelectorAll(\"ul, ol\").length > 0;\n }\n\n mutate(entries: MutationRecord[]) {\n for (const mutation of entries) {\n if (mutation.type === \"childList\") {\n (Array.from(mutation.addedNodes || []) as HTMLElement[]).forEach(el => this._setupNode(el));\n (Array.from(mutation.removedNodes || []) as HTMLElement[]).forEach(el => this._teardownNode(el));\n }\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class AnchorSpyController extends BaseController {\n static values = {key: String};\n static classes = [\"active\", \"inactive\"];\n\n declare readonly keyValue: string;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeInactiveClasses: (el?: HTMLElement) => void;\n declare addInactiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultInactiveClasses(): string[] {\n return [\"inactive\"];\n }\n\n get _key(): string {\n return this.keyValue.replaceAll('#', '');\n }\n\n get _anchor(): string {\n return window.location.hash.substr(1);\n }\n\n set _anchor(value: string) {\n window.location.hash = value;\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._checkAnchor();\n useEventListener(this, window, 'hashchange', this._checkAnchor);\n });\n }\n\n write(event?: Event) {\n event?.preventDefault();\n this._anchor = this._key;\n }\n\n private _checkAnchor() {\n if (this._key === this._anchor) {\n this.dispatchEvent(this.el, \"anchor-spy:active\");\n this.addActiveClasses(this.el);\n this.removeInactiveClasses(this.el);\n } else {\n this.dispatchEvent(this.el, \"anchor-spy:inactive\");\n this.addInactiveClasses(this.el);\n this.removeActiveClasses(this.el);\n }\n }\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class BackLinkController extends BaseController {\n\n static values = {timeout: Number, pages: Number};\n\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n declare readonly pagesValue: number;\n declare readonly hasPagesValue: boolean;\n\n get _pages(): number {\n return this.hasPagesValue ? Math.abs(this.pagesValue) : 1;\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1500;\n }\n\n connect() {\n useEventListener(this, this.el, \"click\", this.goBack);\n }\n\n goBack(event?: Event) {\n event?.preventDefault();\n history.go(-this._pages);\n if ((this.el as HTMLAnchorElement).href) {\n useTimeout(this, this.fallback, this._timeout);\n }\n }\n\n fallback() {\n window.location.href = (this.el as HTMLAnchorElement).href;\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ClipboardController extends BaseController {\n\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\n static values = {removeUnused: Boolean};\n\n declare readonly sourceTarget: HTMLElement;\n declare readonly copyTarget: HTMLElement;\n declare readonly hasCopyTarget: boolean;\n declare readonly fallbackTarget: HTMLElement;\n declare readonly hasFallbackTarget: boolean;\n\n declare readonly hasRemoveUnusedValue: boolean;\n declare readonly removeUnusedValue: boolean;\n\n _supported = false;\n\n connect() {\n this._supported = document.queryCommandSupported(\"copy\");\n\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\n if (this._supported && this.hasFallbackTarget) {\n this.fallbackTarget.remove();\n } else if (this.hasCopyTarget) {\n this.copyTarget.remove();\n }\n }\n }\n\n select(event: MouseEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n }\n\n copy(event: ClipboardEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n if (this._supported) {\n document.execCommand(\"copy\");\n }\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n get _eventType(): \"submit\" | \"click\" {\n if (isHTMLFormElement(this.el)) {\n return \"submit\";\n } else if (isHTMLAnchorElement(this.el)) {\n return \"click\";\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, this._eventType, this.confirm);\n });\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatchEvent(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {message: String};\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n useEventListener(this, window, \"popstate\", this.confirmNavigation);\n useEventListener(this, window, \"submit\", this.allowSubmit);\n useEventListener(this, window, [\"turbolinks:before-visit\", \"turbo:before-visit\"], this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.onbeforeunload = null;\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: Event | PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isTypeOfButtonableElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useTemporaryContent} from \"../mixins/use_temporary_content\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, [\"click\"], this.disable);\n useEventListener(this, window, [\"turbo:load\", \"turbolinks:load\"], this._enable);\n });\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._disable();\n useTemporaryContent(this, element, this._message, this._timeout, this._enable);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._enable();\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if (isTypeOfButtonableElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _disable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n\nexport class RemoveController extends DismissableController {\n}","import {debounce, get as _get, set as _set} from \"lodash-es\";\nimport {BaseController} from '../utilities/base_controller';\nimport {LocalStorageProxy, useLocalStorage} from \"../mixins\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare _store: LocalStorageProxy<{ [idx: string]: string; }>;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n initialize() {\n this.save = debounce(this.save.bind(this), 300);\n }\n\n connect() {\n this._store = useLocalStorage(this, this._uniqueIdentifier, {});\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n this._store.clear();\n this.dispatchEvent(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n this._store.value = data;\n this.dispatchEvent(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (!this._store.isEmpty()) {\n const savedData = this._store.value; // get and parse the saved data from localStorage\n Object.keys(savedData).forEach(\n (attr: string) => _set(element as HTMLElement, attr, savedData[attr]),\n );\n this.dispatchEvent(element, `element-save:restore:success`);\n } else {\n this.dispatchEvent(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutationObserver} from \"../mixins/use_mutation_observer\";\nimport {BaseController} from \"../utilities/base_controller\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class EmptyDomController extends BaseController {\n\n static targets = [\"container\"];\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare readonly hasContainerTarget: boolean;\n declare readonly containerTarget: HTMLElement;\n\n declare addEmptyClasses: (el?: HTMLElement) => void;\n declare removeEmptyClasses: (el?: HTMLElement) => void;\n declare addNotEmptyClasses: (el?: HTMLElement) => void;\n declare removeNotEmptyClasses: (el?: HTMLElement) => void;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _container() {\n return this.hasContainerTarget ? this.containerTarget : this.el;\n }\n\n get _children(): Element[] {\n let element = this._container;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this._container, this.mutate, {childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this._container;\n let children = this._children;\n if (children.length === 0) {\n this.removeNotEmptyClasses();\n this.addEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:empty\");\n } else {\n this.addNotEmptyClasses();\n this.removeEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {warn} from \"../utilities/logging\";\n\nexport class PrefetchController extends BaseController {\n\n static values = {mode: String};\n\n declare readonly modeValue: \"intersect\" | \"mouseover\";\n declare readonly hasModeValue: boolean;\n\n get _mode(): string {\n return this.hasModeValue ? this.modeValue : \"mouseover\";\n }\n\n get _supportsPrefetch(): boolean {\n const link: HTMLLinkElement = document.createElement('link');\n return link.relList?.supports && link.relList?.supports('prefetch');\n }\n\n get _href(): string {\n return (this.el as HTMLAnchorElement).href;\n }\n\n get _existingPrefetch(): boolean {\n return (document.head.querySelectorAll(`link[rel=\"prefetch\"][href=\"${this._href}\"]`) || []).length > 0;\n }\n\n get _connectionSuitable(): boolean {\n // @ts-ignore\n const connection = navigator.connection;\n\n // no way to know what network state is. Allow prefetching\n if (!connection) {\n return true;\n }\n\n // Don't prefetch if network conditions are poor or user has enabled data-saving mode\n if (connection) {\n // @ts-ignore Experimental API\n if (connection.saveData) {\n warn(this, 'Data Saving is enabled');\n return false;\n }\n\n // @ts-ignore Experimental API\n if (/2g/.test(connection.effectiveType)) {\n warn(this, \"Network is too slow\");\n return false;\n }\n }\n return true;\n }\n\n connect(): void {\n if (!this._supportsPrefetch) {\n return;\n }\n\n switch (this._mode) {\n case \"intersect\":\n this._setupObserver();\n break;\n case \"mouseover\":\n useEventListener(this, this.el, \"mouseover\", this.prefetch, {once: true});\n break;\n default:\n throw new Error(`'${this._mode}' is not a supported prefetch mode`);\n }\n }\n\n _setupObserver(): void {\n const observer: IntersectionObserver = new IntersectionObserver(\n ([entry]: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n if (entry.isIntersecting) {\n this.prefetch();\n observer.unobserve(entry.target);\n }\n },\n );\n observer.observe(this.element);\n }\n\n prefetch() {\n if (this._existingPrefetch || !this._connectionSuitable) {\n return;\n }\n const link: HTMLLinkElement = document.createElement('link');\n Object.assign(link, {rel: 'prefetch', href: this._href, as: 'document'});\n document.head.appendChild(link);\n }\n\n}\n","import {PrintController} from \"./utility/print_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class PrintButtonController extends PrintController {\n\n static classes = [\n 'unsupported',\n ];\n declare addUnsupportedClasses: (el?: HTMLElement) => void;\n\n get defaultUnsupportedClasses(): string[] {\n return [\"unsupported\"];\n }\n\n connect() {\n installClassMethods(this);\n if (!(\"print\" in window)) {\n this.addUnsupportedClasses();\n }\n useEventListener(this, this.el, 'click', this.print);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n connect() {\n useEventListener(this, window, \"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent<ResponsiveIframeMessage>) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useEventListener(this, window, \"resize\", this.postUpdate, {debounce: 200});\n this.postUpdate();\n }\n }\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class SelfDestructController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n // Only start countdown on first paint\n useTimeout(this, () => this.el.remove(), this.secondsValue * 1000);\n });\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useInjectedElement} from \"../mixins/use_injected_html\";\n\nexport class StickyController extends BaseController {\n\n static classes = [\"stuck\"];\n static values = {mode: String};\n\n declare addStuckClasses: (el?: HTMLElement) => void;\n declare removeStuckClasses: (el?: HTMLElement) => void;\n\n declare readonly hasModeValue: \"top\" | \"bottom\";\n declare readonly modeValue: \"top\" | \"bottom\";\n\n _magicElement: HTMLDivElement | null = null;\n\n get defaultStuckClasses(): string[] {\n return [\"stuck\"];\n }\n\n get _mode(): 'beforebegin' | 'afterend' {\n if (this.hasModeValue) {\n if (!['top', 'bottom'].includes(this.modeValue)) {\n throw new Error(`The modeValue provided '${this.modeValue}' is not one of the recognised configuration options`);\n }\n if (this.modeValue === 'top') {\n return 'beforebegin';\n }\n }\n return \"afterend\";\n }\n\n connect() {\n this._magicElement = document.createElement(\"div\");\n useInjectedElement(this, this.el, this._mode, this._magicElement);\n\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (entry.target !== this._magicElement) {\n return;\n }\n if (entry.intersectionRatio === 0) {\n this.addStuckClasses();\n } else if (entry.intersectionRatio === 1) {\n this.removeStuckClasses();\n }\n });\n\n }, {\n threshold: [0, 1],\n });\n observer.observe(this._magicElement!);\n }\n\n}\n","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatchEvent(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {camelCase, get as _get, set as _set} from \"lodash-es\";\nimport {EphemeralController} from \"../utilities/ephemeral_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class TemporaryStateController extends EphemeralController {\n\n static values = {\n attribute: String,\n seconds: Number,\n value: String,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n declare readonly attributeValue: string;\n declare readonly hasAttributeValue: boolean;\n declare readonly valueValue: string;\n declare readonly hasValueValue: boolean;\n _previousState: { [index: string]: any } = {};\n\n get _value(): string {\n if (this.hasValueValue) {\n return this.valueValue;\n }\n throw new Error(\"Expected `valueValue` to be present\");\n }\n\n get _attribute(): string {\n if (this.hasAttributeValue) {\n return this.attributeValue;\n }\n throw new Error(\"Expected `attributeValue` to be present\");\n }\n\n get _seconds(): number {\n if (this.hasSecondsValue) {\n return this.secondsValue * 1000;\n }\n throw new Error(\"Expected `secondsValue` to be present\");\n }\n\n connect() {\n this.setState();\n useTimeout(this, this.removeState, this._seconds);\n }\n\n disconnect() {\n this.removeState();\n }\n\n setState() {\n this._previousState[this._attribute] = _get(this.el, this._attribute);\n _set(this.el, this._attribute, this.valueValue);\n }\n\n removeState() {\n _set(this.el, this._attribute, this._previousState[this._attribute]);\n }\n\n}\n\nexport function applyTemporaryState(element: HTMLElement, propertyString: string, value: any, seconds: number, controllerIdentifier = \"temporary-state\") {\n if (!element.dataset.controller || !element.dataset.controller?.includes(controllerIdentifier)) {\n element.dataset.controller = (element.dataset.controller || '' + ` ${controllerIdentifier} `).trim().replaceAll(' ', ' ');\n }\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-attribute-value`)] = propertyString;\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-seconds-value`)] = seconds.toString();\n}\n\nexport function applyTemporaryClass(element: HTMLElement, value: any, seconds: number) {\n applyTemporaryState(element, 'className', value, seconds);\n}\n","import {Controller} from \"stimulus\";\nimport {isElementInViewport} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useClickOutside(controller: Controller, element: HTMLElement, callback: (event: Event) => void) {\n callback = callback.bind(controller);\n\n const handler = (event: Event) => {\n if (element.contains(event.target as Node) || (!isElementInViewport(element))) {\n return;\n }\n callback(event);\n };\n\n let {teardown} = useEventListener(controller, window, [\"click\", \"touchend\"], handler);\n useMixin(controller, () => void 0, teardown);\n\n return {\n teardown,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useHover(controller: Controller, element: HTMLElement, enter?: ((event: Event) => void) | null, leave?: ((event: Event) => void) | null) {\n let teardownEnter: null | (() => void) = null;\n let teardownLeave: null | (() => void) = null;\n\n if (enter) {\n enter = enter.bind(controller);\n let {teardown: _teardownEnter} = useEventListener(controller, element, \"mouseenter\", enter);\n teardownEnter = _teardownEnter;\n }\n if (leave) {\n leave = leave.bind(controller);\n let {teardown: _teardownLeave} = useEventListener(controller, element, \"mouseleave\", leave);\n teardownLeave = _teardownLeave;\n }\n\n let setup = () => void 0;\n let teardown = () => {\n if (teardownEnter) {\n teardownEnter();\n }\n if (teardownLeave) {\n teardownLeave();\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n teardown,\n };\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {useClickOutside} from \"../mixins/use_click_outside\";\nimport {useHover} from \"../mixins/use_hover\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this, this.el, this.mouseEnter, this.mouseLeave);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this, this.el, this.clickOutside);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","import {controllerMethod} from \"../utilities/stimulus\";\nimport {Controller} from \"stimulus\";\n\nexport interface TrixElementsPayload {\n toolbar: HTMLElement,\n editor: HTMLElement\n}\n\nexport class TrixComposableController extends Controller {\n declare install?: (elements: TrixElementsPayload) => void;\n declare uninstall?: (elements: TrixElementsPayload) => void;\n}\n\nexport function useTrixModifiers(controller: TrixComposableController) {\n // keep a copy of the lifecycle function of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n let observing = false;\n\n let observerCallback = (entries: MutationRecord[], observer: MutationObserver) => {\n entries.forEach(mutation => {\n if (mutation.type === 'childList' && Array.from(mutation.addedNodes).some((el) => (el as HTMLElement).tagName === 'TRIX-TOOLBAR')) {\n attemptSetup();\n observer.disconnect();\n }\n });\n };\n let pasteHandler = (event: Event) => controllerMethod(controller, 'pasteEvent').call(controller, event);\n\n let observer = new MutationObserver(observerCallback);\n\n let attemptSetup = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.addEventListener('trix-paste', pasteHandler);\n\n let toolbar = editorParent.querySelector('trix-toolbar');\n\n if (!observing && !toolbar) {\n // toolbar is not in the DOM yet, wait for it to arrive before running setup\n observing = true;\n observer.observe(editorParent, {childList: true});\n return;\n } else if (!toolbar) {\n // Fallback, in case this runs twice, or mutation observer logic fails\n throw new Error('Could not find an instance of <trix-toolbar> that is a sibling of this <trix-editor>');\n } else {\n // Do not need MutationObserver, all elements are present and correct\n observer.disconnect();\n }\n\n controllerMethod(controller, 'install').call(controller, {toolbar, editor});\n };\n\n let teardown = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.removeEventListener('trix-paste', pasteHandler);\n let toolbar = editorParent.querySelector('trix-toolbar');\n if (!toolbar) {\n throw new Error('Could not find <trix-toolbar> that is a sibling of this <trix-editor> element');\n }\n controllerMethod(controller, 'uninstall').call(controller, {toolbar, editor});\n };\n\n attemptSetup();\n\n Object.assign(controller, {\n disconnect() {\n observer.disconnect();\n teardown();\n controllerMethod(controller, 'uninstall').call({toolbar, editor: controller.element});\n controllerDisconnect();\n },\n });\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {TrixElementsPayload, useTrixModifiers} from \"../mixins/use_trix_modifiers\";\n\ninterface TrixInstallable {\n install: (elements: TrixElementsPayload) => void,\n uninstall: (elements: TrixElementsPayload) => void\n pasteEvent?: (event: TrixPasteEvent) => void\n}\n\ninterface TrixPasteEventPayload {\n dataTransfer: DataTransfer,\n html: string,\n range: [number, number],\n type: string,\n}\n\ninterface TrixPasteEvent extends CustomEvent {\n paste: TrixPasteEventPayload;\n}\n\nexport class TrixModifierController extends BaseController {\n\n get enabledBehaviours(): TrixInstallable[] {\n let enabled = (datasetProp: string | undefined) => datasetProp !== undefined && datasetProp !== 'false';\n let behaviourIfEnabled = (datasetProp: string | undefined, trixInstallable: TrixInstallable) => enabled(datasetProp) ? [trixInstallable] : [];\n return [\n ...(behaviourIfEnabled(this.el.dataset.noBold, this.bold)),\n ...(behaviourIfEnabled(this.el.dataset.noBulletList, this.bulletList)),\n ...(behaviourIfEnabled(this.el.dataset.noCode, this.code)),\n ...(behaviourIfEnabled(this.el.dataset.noHeading, this.heading)),\n ...(behaviourIfEnabled(this.el.dataset.noItalic, this.italic)),\n ...(behaviourIfEnabled(this.el.dataset.noStrikethrough, this.strikethrough)),\n ...(behaviourIfEnabled(this.el.dataset.noLink, this.link)),\n ...(behaviourIfEnabled(this.el.dataset.noIndents, this.indents)),\n ...(behaviourIfEnabled(this.el.dataset.noNumberList, this.numberList)),\n ...(behaviourIfEnabled(this.el.dataset.noQuote, this.quote)),\n ...(behaviourIfEnabled(this.el.dataset.noFileUploads, this.fileUploads)),\n ];\n }\n\n get bold() {\n return this.formattingHandlers('.trix-button--icon-bold', 'bold');\n }\n\n get bulletList() {\n return this.formattingHandlers('.trix-button--icon-bullet-list', 'bullet-list');\n }\n\n get code() {\n return this.formattingHandlers('.trix-button--icon-code', 'code');\n }\n\n get heading() {\n return this.formattingHandlers('.trix-button--icon-heading-1', 'heading');\n }\n\n get italic() {\n return this.formattingHandlers('.trix-button--icon-italic', 'italic');\n }\n\n get strikethrough() {\n return this.formattingHandlers('.trix-button--icon-strike', 'strike');\n }\n\n get link() {\n return this.formattingHandlers('.trix-button--icon-link', 'href');\n }\n\n get indents() {\n return this.simpleHideShowHandlers(\n [\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n ].join(', '),\n );\n }\n\n get numberList() {\n return this.simpleHideShowHandlers('.trix-button--icon-number-list');\n }\n\n get quote() {\n return this.simpleHideShowHandlers('.trix-button--icon-quote');\n }\n\n get fileUploads() {\n let selector = '.trix-button-group.trix-button-group--file-tools';\n let preventUploads = (e: Event) => e?.preventDefault();\n let self = this;\n let element = this.el as HTMLElement & { editor: any };\n return {\n install(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).install(elements);\n self.el.addEventListener('trix-file-accept', preventUploads);\n },\n pasteEvent(event: TrixPasteEvent) {\n let {dataTransfer, html} = event.paste;\n let {editor} = element;\n if (dataTransfer.files.length > 0 || html.includes('<img')) {\n alert('The content you pasted contains images and/or files. File uploads are not supported.');\n editor.undo();\n }\n },\n uninstall(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).uninstall(elements);\n self.el.removeEventListener('trix-file-accept', preventUploads);\n },\n };\n }\n\n connect() {\n useTrixModifiers(this);\n }\n\n install(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.install(elements));\n }\n\n pasteEvent(event: TrixPasteEvent) {\n this.enabledBehaviours.forEach(behaviour => behaviour.pasteEvent && behaviour.pasteEvent(event));\n }\n\n uninstall(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.uninstall(elements));\n }\n\n simpleHideShowHandlers(selector: string) {\n return {\n install: ({toolbar}: TrixElementsPayload) => this.hideToolbarSelector(toolbar, selector),\n uninstall: ({toolbar}: TrixElementsPayload) => this.showToolbarSelector(toolbar, selector),\n };\n }\n\n formattingHandlers(selector: string, trixAttribute: string) {\n let element = this.el as HTMLElement & { editor: any };\n let {editor} = element;\n return {\n install: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).install(elements);\n },\n pasteEvent(pasteEvent: TrixPasteEvent) {\n let {range} = pasteEvent.paste;\n let prevRange = element.editor.getSelectedRange();\n\n editor.setSelectedRange(range);\n editor.deactivateAttribute(trixAttribute);\n editor.setSelectedRange(prevRange);\n },\n uninstall: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).uninstall(elements);\n },\n };\n }\n\n showToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = '');\n }\n\n hideToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = 'none');\n }\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided <turbo-frame> element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a <turbo-frame> element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => useTimeout(this, this.refresh, this.intervalValue));\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n"],"names":["Controller","camelCase","debounce","upperFirst","clamp","isPast","intervalToDuration","formatDuration","toDate","formatDistanceToNow","_get","_set"],"mappings":"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"}
1
+ {"version":3,"file":"stimulus-library.cjs.js","sources":["../src/utilities/logging.ts","../src/utilities/events.ts","../src/utilities/base_controller.ts","../src/utilities/ephemeral_controller.ts","../src/utilities/scroll.ts","../src/utilities/turbo.ts","../node_modules/mitt/dist/mitt.mjs","../src/utilities/event_bus.ts","../src/utilities/elements.ts","../src/utilities/request_submit.ts","../src/utilities/arrays.ts","../src/mixins/create_mixin.ts","../src/mixins/use_event_listener.ts","../src/mixins/use_fullscreen.ts","../src/utilities/reactive.ts","../src/mixins/use_geolocation.ts","../src/mixins/use_injected_html.ts","../src/mixins/use_interval.ts","../src/mixins/use_localstorage.ts","../src/mixins/use_timeout.ts","../src/mixins/use_temporary_content.ts","../src/utilities/fetchRetry.ts","../src/controllers/ajax/load_block_controller.ts","../src/controllers/ajax/async_block_controller.ts","../src/mixins/use_intersection.ts","../src/controllers/ajax/lazy_block_controller.ts","../src/controllers/ajax/poll_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../src/controllers/forms/autosize_controller.ts","../src/utilities/stimulus.ts","../src/utilities/strings.ts","../src/mixins/install_class_methods.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_disable_inputs_controller.ts","../src/controllers/forms/checkbox_enable_inputs_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/forms/checkbox_xor_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/forms/focus_steal_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/forms/navigate_form_errors_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/mixins/use_event_bus.ts","../src/controllers/forms/sync_inputs_controller.ts","../src/controllers/forms/value_warn_controller.ts","../src/controllers/forms/word_count_controller.ts","../src/controllers/media/fallback_image_controller.ts","../node_modules/dialog-polyfill/dist/dialog-polyfill.esm.js","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/scroll/scroll_container_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/signal/expressions.ts","../src/controllers/signal/events.ts","../src/controllers/signal/signal_action_controller.ts","../src/mixins/use_mutation_observer.ts","../src/controllers/signal/signal_dom_children_controller.ts","../src/controllers/signal/signal_input_controller.ts","../src/controllers/signal/signal_visibility_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/utility/alert_controller.ts","../src/controllers/utility/fullscreen_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/utility/interval_controller.ts","../src/controllers/utility/presence_controller.ts","../src/controllers/utility/print_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/utility/user_focus_controller.ts","../src/controllers/visual/clock_controller.ts","../src/controllers/visual/countdown_controller.ts","../src/controllers/visual/duration_controller.ts","../src/controllers/visual/tabs_controller.ts","../src/controllers/visual/time_distance_controller.ts","../src/controllers/visual/tree_view_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/back_link_controller.ts","../src/controllers/clipboard_controller.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/prefetch_controller.ts","../src/controllers/print_button_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/temporary_state_controller.ts","../src/mixins/use_click_outside.ts","../src/mixins/use_hover.ts","../src/controllers/toggle_class_controller.ts","../src/mixins/use_trix_modifiers.ts","../src/controllers/trix_modifier_controller.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts"],"sourcesContent":["import {Controller} from \"stimulus\";\n\nexport function logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n if (/^.*?ClassesPresent$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n\n\nexport function log(controller: Controller, functionName: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(...colorize(controller.identifier, \"#3B82F6\"), `#${functionName}`);\n logger.log({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function warn(controller: Controller, warning: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(...colorize(controller.identifier, \"#F39B1AFF\"), `!! ${warning} !!`);\n logger.warn({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function logEvent(controller: Controller, eventName: string, event: CustomEvent, element: HTMLElement) {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(\n ...colorizeMany([\n {text: controller.identifier, color: \"#3B82F6\"},\n {text: eventName, color: \"#0be000\"},\n ]),\n event.detail,\n );\n logger.log(...colorize(\"Dispatched on\", \"#3b82f6\"), element);\n logger.log(...colorize(\"event\", \"#3b82f6\"), event);\n logger.log(...colorize(\"event details\", \"#3b82f6\"), event.detail);\n logger.groupEnd();\n}\n\ninterface ColorMapping {\n text: string;\n color: string;\n}\n\nfunction colorize(text: string, color: string): string[] {\n return colorizeMany([{text, color}]);\n}\n\nfunction colorizeMany(texts: ColorMapping[]): string[] {\n let str = \"\";\n let colors = texts.flatMap(x => {\n str += `%c${x.text}%c `;\n return [`color: ${x.color}`, \"color: unset\"];\n });\n\n return [str, ...colors];\n}\n","import {Controller} from \"stimulus\";\nimport {logEvent} from \"./logging\";\n\nexport function dispatchEvent(controller: Controller, element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n logEvent(controller, eventName, event, element);\n element.dispatchEvent(event);\n}\n","import {Context, Controller} from \"stimulus\";\nimport {log, logProperty} from \"./logging\";\nimport {dispatchEvent} from \"./events\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n // @ts-ignore\n if (!this.application.debug) {\n return this;\n }\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (\"logFormattedMessage\" in this.application) {\n return returnVal;\n }\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n log(self, prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n log(this, prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n get isTurboPreview(): boolean {\n return document.documentElement.hasAttribute('data-turbo-preview') || document.documentElement.hasAttribute('data-turbolinks-preview');\n }\n\n get isTurbolinksPreview(): boolean {\n return this.isTurboPreview;\n }\n\n get csrfToken(): string | null {\n return this.metaValue('csrf-token');\n }\n\n metaValue(name: string): string | null {\n const element = document.head.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || null;\n }\n\n dispatchEvent(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n dispatchEvent(this, element, eventName, options);\n }\n\n}\n","import {camelCase} from \"lodash-es\";\nimport {BaseController} from \"./base_controller\";\n\nexport class EphemeralController extends BaseController {\n\n _cleanupSelf() {\n this.cleanup(this.el);\n }\n\n cleanup(element: HTMLElement) {\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\\\s|^)${this.identifier}(\\\\s|$)`, \"g\"), \"\") || \"\";\n if (element.dataset.controller == \"\") {\n // If there are no controllers left, remove the attribute\n delete element.dataset.controller;\n }\n\n let substringIdentifierValueRegex = new RegExp(`(\\\\s|^)${this.identifier}\\\\..+?(\\\\s|$)`, \"g\");\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-target`)];\n if (element.dataset.target == \"\") {\n // If there are no targets left, remove the attribute\n delete element.dataset.target;\n }\n\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-action`)];\n if (element.dataset.action == \"\") {\n // If there are no actions left, remove the attribute\n delete element.dataset.action;\n }\n\n // @ts-ignore\n let values = this.constructor.values;\n if (values) {\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\n }\n\n // @ts-ignore\n let classes = this.constructor.classes;\n if (classes) {\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\nlet smoothPolyfilled: boolean;\n\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollIntoView({behavior, block, inline});\n}\n\nexport async function scrollAbsoluteTop(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({top: 0, left: 0, behavior});\n}\n\nexport async function scrollAbsoluteBottom(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({top: document.body.scrollHeight, left: 0, behavior});\n } else {\n element.scrollTo({top: (element as Element).scrollHeight, left: 0, behavior});\n }\n}\n\nexport async function scrollAbsoluteLeft(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({left: 0, behavior});\n}\n\nexport async function scrollAbsoluteRight(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({left: document.body.scrollWidth, behavior});\n } else {\n element.scrollTo({left: (element as Element).scrollWidth, behavior});\n }\n}\n\nexport async function scrollUp(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: -amount, left: 0, behavior});\n}\n\nexport async function scrollDown(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: amount, left: 0, behavior});\n}\n\nexport async function scrollLeft(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: -amount, behavior});\n}\n\nexport async function scrollRight(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: amount, behavior});\n}\n\nasync function polyfillSmooth() {\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\n if (smoothPolyfilled) {\n return;\n }\n smoothPolyfilled = true;\n polyfill();\n}\n\nexport function getScrollParent(node: HTMLElement | null): Window | HTMLElement | null {\n if (!node) {\n return null;\n }\n\n if (node == document.body) {\n return window;\n }\n\n const overflowY = getComputedStyle(node).overflowY;\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\n\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\n return node;\n }\n\n return getScrollParent(node.parentElement) || document.body;\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\n return element.nodeName == \"TURBO-FRAME\";\n}\n","export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","import mitt from 'mitt';\n\nexport const EventBus = mitt<{ [idx: string]: any }>();\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLLabelElement(element: Element): element is HTMLLabelElement {\n return element.nodeName == \"LABEL\";\n}\n\nexport function isHTMLTextAreaElement(element: Element): element is HTMLTextAreaElement {\n return element.nodeName == \"TEXTAREA\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isHTMLButtonInputElement(element: Element): element is HTMLInputElement & { type: \"button\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"button\";\n}\n\nexport function isHTMLSubmitInputElement(element: Element): element is HTMLInputElement & { type: \"submit\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"submit\";\n}\n\nexport function isHTMLResetInputElement(element: Element): element is HTMLInputElement & { type: \"reset\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"reset\";\n}\n\nexport function isHTMLButtonButtonElement(element: Element): element is HTMLButtonElement & { type: \"button\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"button\";\n}\n\nexport function isHTMLSubmitButtonElement(element: Element): element is HTMLButtonElement & { type: \"submit\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"submit\";\n}\n\nexport function isHTMLResetButtonElement(element: Element): element is HTMLButtonElement & { type: \"reset\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"reset\";\n}\n\nexport function isTypeOfResetButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"reset\" } {\n return isHTMLResetButtonElement(element) || isHTMLResetInputElement(element);\n}\n\nexport function isTypeOfSubmitButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"submit\" } {\n return isHTMLSubmitButtonElement(element) || isHTMLSubmitInputElement(element);\n}\n\nexport function isTypeOfButtonableElement(element: Element): element is HTMLButtonElement | (HTMLInputElement & { type: \"submit\" | \"reset\" }) {\n return isTypeOfResetButtonElement(element) || isTypeOfSubmitButtonElement(element) || isHTMLButtonButtonElement(element);\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n\nexport function isTypeOfFormInputElement(element: Element): element is (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n return isHTMLInputElement(element) || isHTMLSelectElement(element) || isHTMLTextAreaElement(element);\n}\n\nexport function createHiddenButton(type: \"submit\" | \"reset\"): HTMLButtonElement {\n let button = document.createElement('button');\n button.type = type;\n button.style.display = 'none';\n button.dataset.sythentic = 'true';\n return button;\n}\n\nexport function createHiddenInput(name: string, value: string): HTMLInputElement {\n let input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value;\n return input;\n}\n\nexport function insertElement<T extends Element>(targetElement: Element, insertPosition: InsertPosition, element: T): T {\n let createdElement = targetElement.insertAdjacentElement(insertPosition, element);\n if (!createdElement) {\n throw new Error(`Failed to insert element ${element.nodeName} into ${targetElement.nodeName}`);\n }\n return createdElement as T;\n}\n\nexport function insertHiddenInput(name: string, value: string, targetElement: Element, insertPosition: InsertPosition): HTMLInputElement {\n return insertElement(targetElement, insertPosition, createHiddenInput(name, value));\n}\n\nexport function insertHiddenButton(type: \"submit\" | \"reset\", targetElement: Element, insertPosition: InsertPosition): HTMLButtonElement {\n return insertElement(targetElement, insertPosition, createHiddenButton(type));\n}\n\nexport function getAllRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n let parent = radio.form || document;\n return Array.from(parent.querySelectorAll(`input[type=\"radio\"][name=\"${radio.name}\"]`));\n}\n\nexport function getOtherRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n return getAllRadiosInGroup(radio).filter((r) => r !== radio);\n}\n\nexport function isElementInViewport(el: Element) {\n const rect = el.getBoundingClientRect();\n\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n const vertInView = rect.top <= windowHeight && rect.top + rect.height >= 0;\n const horInView = rect.left <= windowWidth && rect.left + rect.width >= 0;\n\n return vertInView && horInView;\n}\n","import {insertHiddenButton} from \"./elements\";\n\nexport function requestSubmit(form: HTMLFormElement) {\n if (form.requestSubmit) {\n form.requestSubmit();\n } else {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"submit\"]');\n if (!button) {\n button = insertHiddenButton(\"submit\", form, 'beforeend');\n }\n button.click();\n }\n}\n\nexport function requestReset(form: HTMLFormElement) {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"reset\"]');\n if (!button) {\n button = insertHiddenButton(\"reset\", form, 'beforeend');\n }\n button.click();\n}","export function wrapArray<T>(x: T | Array<T>): Array<T> {\n return Array.isArray(x) ? x : [x];\n}","import {Controller} from \"stimulus\";\n\nexport function useMixin(controller: Controller, setup: () => void, teardown: () => void) {\n const controllerDisconnect = controller.disconnect.bind(controller);\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return controllerDisconnect;\n}","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventListener(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n if (opts?.debounce) {\n handler = debounce(handler.bind(controller), opts.debounce);\n delete opts.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => element.addEventListener(eventName, handler, opts));\n let teardown = () => eventNames.forEach(eventName => element.removeEventListener(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n\nexport function useEventListeners(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useEventListener(controller, element, eventNameOrNames, handler, opts);\n}\n\nexport function useCollectionEventListener(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n let handlers: Array<{ setup: () => void, teardown: () => void, }> = [];\n elements.forEach(el => {\n let {setup, teardown} = useEventListener(controller, el, eventNameOrNames, handler, opts);\n handlers.push({setup, teardown});\n });\n return [\n () => handlers.forEach(h => h.setup()),\n () => handlers.forEach(h => h.teardown()),\n ];\n}\n\nexport function useCollectionEventListeners(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useCollectionEventListener(controller, elements, eventNameOrNames, handler, opts);\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useFullscreen(controller: Controller, el?: Element) {\n let element = el || document.documentElement;\n let fullscreenOpen = document.fullscreenElement !== null;\n\n const updateFullscreenState = () => fullscreenOpen = document.fullscreenElement !== null;\n const isFullscreen = (): boolean => fullscreenOpen;\n const toggle = async () => fullscreenOpen ? await exit() : await enter();\n let setup = () => document.addEventListener('fullscreenchange', updateFullscreenState);\n let teardown = () => document.removeEventListener('fullscreenchange', updateFullscreenState);\n\n const exit = async () => {\n if (document.exitFullscreen) {\n fullscreenOpen = false;\n await document.exitFullscreen();\n }\n };\n\n const enter = async () => {\n if (fullscreenOpen) {\n await exit();\n }\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n fullscreenOpen = true;\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n isFullscreen,\n enter,\n exit,\n toggle,\n teardown,\n };\n}","export function reactive<T extends Object>(object: T): T {\n\n if (object === null || typeof object !== 'object') {\n return object;\n }\n\n for (const property in object) {\n if (Object.getOwnPropertyDescriptor(object, property) == undefined) {\n continue;\n }\n\n // @ts-ignore\n object[property] = reactive(object[property]);\n }\n\n return new Proxy(object, {\n get(target, property) {\n // @ts-ignore\n return target[property];\n },\n set(target, property, value) {\n // @ts-ignore\n target[property] = reactive(value);\n\n return true;\n },\n });\n}","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\nimport {useMixin} from \"./create_mixin\";\n\nexport interface GeolocationOptions extends Partial<PositionOptions> {\n}\n\nexport interface GeolocationData {\n locatedAt: number | null,\n error: GeolocationPositionError | null,\n coords: {\n accuracy: number,\n latitude: number,\n longitude: number,\n altitude: number | null,\n altitudeAccuracy: number | null,\n heading: number | null,\n speed: number | null,\n },\n teardown: () => void,\n}\n\nexport function useGeolocation(controller: Controller, options: GeolocationOptions = {}, update?: (...args: any[]) => void, error?: (...args: any[]) => void) {\n // Ensure passed functions are bound to the correct controller scope\n if (update) {\n update = update.bind(controller);\n }\n if (error) {\n error = error.bind(controller);\n }\n\n // Default options to pass to the navigator.geolocation.watchPosition() method\n const {\n enableHighAccuracy = true,\n maximumAge = 30000,\n timeout = 27000,\n } = options;\n\n const isSupported = navigator && 'geolocation' in navigator;\n\n // Create a reactive object to store the geolocation data\n const values = reactive({\n locatedAt: null,\n error: null,\n coords: {\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null,\n },\n teardown: () => {\n if (watcher) {\n navigator.geolocation.clearWatch(watcher);\n watcher = null;\n }\n },\n } as GeolocationData);\n\n let setup = () => {\n if (isSupported) {\n watcher = navigator.geolocation.watchPosition(\n (position: GeolocationPosition) => {\n // Update reactive values\n values.locatedAt = position.timestamp;\n values.coords = position.coords;\n values.error = null;\n // Fire user callback if provided\n if (update) {\n update(position);\n }\n },\n (err: GeolocationPositionError) => {\n // Update reactive values\n values.error = err;\n // Fire user callback if provided\n if (error) {\n error(err);\n }\n },\n {\n enableHighAccuracy,\n maximumAge,\n timeout,\n },\n );\n }\n };\n\n let watcher: number | null = null;\n\n useMixin(controller, setup, values.teardown);\n\n return values;\n}\n\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInjectedFragment(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, fragment: DocumentFragment, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n let nodes = Array.from(fragment.childNodes);\n\n let setup = () => {\n let parent = targetElement.parentElement;\n if ([\"beforebegin\", \"afterend\"].includes(insertPosition) && parent == null) {\n throw new Error(\"Cannot insert beforebegin into a node with no parent\");\n }\n\n switch (insertPosition) {\n case 'beforeend':\n targetElement.append(fragment);\n break;\n case \"afterbegin\":\n targetElement.prepend(fragment);\n break;\n case \"beforebegin\":\n parent!.insertBefore(fragment, targetElement);\n break;\n case \"afterend\":\n parent!.insertBefore(fragment, targetElement);\n break;\n }\n };\n let teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0;\n\n useMixin(controller, setup, teardown);\n return [nodes, teardown];\n}\n\nexport function useInjectedHTML(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, html: string, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n const fragment = document.createRange().createContextualFragment(html);\n return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n}\n\nexport function useInjectedElement(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, element: HTMLElement, options: { cleanup?: boolean } = {}): [ChildNode, () => void] {\n const fragment = new DocumentFragment();\n fragment.append(element);\n let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n return [nodes[0], teardown];\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInterval(controller: Controller, handler: (...args: any[]) => void, interval: number) {\n handler = handler.bind(controller);\n let intervalHandle: ReturnType<typeof window.setInterval> | null = null;\n\n let setup = () => intervalHandle = setInterval(handler, interval);\n let teardown = () => {\n if (intervalHandle !== null) {\n clearInterval(intervalHandle);\n }\n };\n\n useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\n\n\nexport type Serializer<T> = {\n deserialize(raw: string): T\n serialize(value: T): string\n isEmpty(value: T): boolean\n}\n\nexport interface LocalStorageProxy<T> {\n get value(): T;\n\n set value(value: T);\n\n read(): T;\n\n write(value: T): void;\n\n clear(): void;\n\n isEmpty(): boolean;\n}\n\nexport const StorageSerializers: Record<'boolean' | 'object' | 'number' | 'any' | 'string' | 'map' | 'set', Serializer<any>> & { [idx: string]: Serializer<any> } = {\n boolean: {\n deserialize: (v: any) => v === 'true',\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n object: {\n deserialize: (v: any) => JSON.parse(v),\n serialize: (v: any) => JSON.stringify(v),\n isEmpty: (v: any) => {\n const values = Object.values(JSON.parse(v));\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n number: {\n deserialize: (v: any) => Number.parseFloat(v),\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n any: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n string: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n map: {\n deserialize: (v: any) => new Map(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Map<any, any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Map<any, any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n set: {\n deserialize: (v: any) => new Set(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Set<any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Set<any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n};\n\nexport function useLocalStorage<T>(controller: Controller, key: string, defaultValue: T, opts: { writeDefaults: boolean } = {writeDefaults: true}): LocalStorageProxy<T> {\n let type: string;\n let {writeDefaults} = opts;\n\n if (defaultValue == null) {\n type = 'any';\n } else if (defaultValue instanceof Set) {\n type = 'set';\n } else if (defaultValue instanceof Map) {\n type = 'map';\n } else if (typeof defaultValue === 'boolean') {\n type = 'boolean';\n } else if (typeof defaultValue === 'string') {\n type = 'string';\n } else if (typeof defaultValue === 'object') {\n type = 'object';\n } else if (Array.isArray(defaultValue)) {\n type = 'object';\n } else if (!Number.isNaN(defaultValue)) {\n type = 'number';\n } else {\n type = 'any';\n }\n\n let data = reactive({\n value: defaultValue,\n });\n\n let storage = localStorage;\n const serializer = StorageSerializers[type];\n\n const read = () => {\n const rawValue = storage.getItem(key);\n if (rawValue == null) {\n data.value = defaultValue;\n if (writeDefaults && defaultValue !== null) {\n storage.setItem(key, serializer.serialize(defaultValue));\n }\n } else {\n data.value = serializer.deserialize(rawValue);\n }\n\n return data.value;\n };\n\n const write = (value: T) => {\n storage.setItem(key, serializer.serialize(value));\n data.value = value;\n };\n\n const clear = () => {\n storage.removeItem(key);\n data.value = defaultValue;\n return data.value;\n };\n\n const isEmpty = (): boolean => {\n let rawValue = storage.getItem(key);\n return serializer.isEmpty(rawValue);\n };\n\n read();\n\n return {\n get value() {\n return read();\n },\n set value(value) {\n write(value);\n },\n read,\n clear,\n write,\n isEmpty,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\n\nexport function useTimeout(controller: Controller, handler: (...args: any[]) => void, timeout: number) {\n let controllerDisconnect: () => void;\n let timeoutHandle: ReturnType<typeof window.setTimeout> | null = null;\n handler = handler.bind(controller);\n\n let newHandler = () => {\n handler();\n timeoutHandle = null;\n Object.assign(controller, {disconnect: controllerDisconnect});\n };\n\n let setup = () => timeoutHandle = setTimeout(newHandler, timeout);\n let teardown = () => {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n timeoutHandle = null;\n }\n };\n\n controllerDisconnect = useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\nimport {useTimeout} from \"./use_timeout\";\nimport {isHTMLInputElement} from \"../utilities/elements\";\n\nexport function useTemporaryContent(controller: Controller, target: HTMLElement, content: string, timeout?: number, teardownCallback?: () => void) {\n\n const setContent = (element: HTMLElement | HTMLInputElement, text: string) => {\n if (isHTMLInputElement(element)) {\n element.value = text;\n } else {\n element.textContent = text;\n }\n };\n\n const getContent = (element: HTMLElement): string => {\n return isHTMLInputElement(element) ? element.value : element.innerHTML;\n };\n\n let cleanupTimeout: () => void = () => void 0;\n let originalText: string = getContent(target);\n\n const teardown = () => {\n setContent(target, originalText);\n cleanupTimeout();\n if (teardownCallback) {\n teardownCallback.call(controller);\n }\n };\n\n const setup = () => {\n setContent(target, content);\n if (timeout !== undefined) {\n cleanupTimeout = useTimeout(controller, teardown, timeout);\n }\n };\n\n useMixin(controller, setup, teardown);\n\n return {\n teardown,\n update(newContent: string) {\n setContent(target, newContent);\n },\n };\n}\n","export async function fetchRetry(n: number, input: RequestInfo, init?: RequestInit): Promise<Response> {\n try {\n return await fetch(input, init);\n } catch (err) {\n if (n === 1) {\n throw err;\n }\n return await fetchRetry(n - 1, input, init);\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {fetchRetry} from \"../../utilities/fetchRetry\";\n\nexport class LoadBlockController extends BaseController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare maxRetriesValue: number;\n declare readonly hasMaxRetriesValue: boolean;\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n get _maxRetries(): number {\n return this.hasMaxRetriesValue ? this.maxRetriesValue : 1;\n }\n\n connect() {\n }\n\n async loadContent(event: Event | null = null) {\n event?.preventDefault();\n\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n\n let failure = () => {\n el.replaceWith(this._errorMessage);\n self.dispatchEvent(el, \"ajax:error\");\n };\n\n try {\n let response = await fetchRetry(this._maxRetries, this.endpointValue);\n if (!response.ok) {\n failure();\n }\n let text = await response.text();\n let newEl = document.createElement(\"div\");\n\n newEl.innerHTML = text;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatchEvent(el, \"ajax:success\");\n } catch (e) {\n failure();\n } finally {\n self.dispatchEvent(el, \"ajax:complete\");\n }\n }\n}\n","import {LoadBlockController} from \"./load_block_controller\";\n\nexport class AsyncBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n async connect() {\n await this.loadContent();\n }\n\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useIntersectionObserver(controller: Controller, handler: IntersectionObserverCallback, options?: IntersectionObserverInit) {\n handler = handler.bind(controller);\n\n let observer: IntersectionObserver | null = new IntersectionObserver(handler, options);\n let teardown = () => {\n observer?.disconnect();\n observer = null;\n };\n let observe = (element: HTMLElement) => observer?.observe(element);\n let unobserve = (element: HTMLElement) => observer?.unobserve(element);\n\n return {\n observer,\n teardown,\n observe,\n unobserve,\n };\n}\n\nexport function useIntersection(\n controller: Controller,\n element: HTMLElement,\n appear?: null | ((entry: IntersectionObserverEntry) => void),\n disappear?: null | ((entry: IntersectionObserverEntry) => void),\n options?: IntersectionObserverInit,\n) {\n if (appear) {\n appear = appear.bind(controller);\n }\n if (disappear) {\n disappear = disappear.bind(controller);\n }\n let opts = options ?? {};\n let processEntries = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n appear && appear(entry);\n } else {\n disappear && disappear(entry);\n }\n });\n };\n let {observer, observe, unobserve, teardown} = useIntersectionObserver(controller, processEntries, opts);\n let setup = () => observe(element);\n useMixin(controller, setup, teardown);\n\n return {\n observer,\n observe: () => observe(element),\n unobserve: () => unobserve(element),\n teardown,\n };\n}","import {LoadBlockController} from \"./load_block_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class LazyBlockController extends LoadBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n async connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n let {observe, unobserve} = useIntersection(this, element, this.appear, null, {threshold: 0.3});\n this.observe = observe;\n this.unobserve = unobserve;\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n await this.loadContent();\n }\n }\n\n async appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n await this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {LoadBlockController} from \"./load_block_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class PollBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n seconds: Number,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error(\"Required value `seconds` is missing\");\n }\n\n requestAnimationFrame(() => {\n this._timeout();\n useInterval(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n async _timeout() {\n await this.loadContent();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {requestSubmit} from \"../../utilities/request_submit\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n static values = {submitMode: String, eventMode: String, debounceInterval: Number};\n declare readonly submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare eventModeValue: 'change' | 'input' | 'debounced';\n declare readonly hasEventModeValue: boolean;\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n\n get _eventModes(): Array<'change' | 'input'> {\n if (this.hasEventModeValue) {\n let modes = this.eventModeValue.split(' ').map(mode => mode.trim());\n\n if (modes.length === 1 && modes[0] === 'debounced') {\n return ['change', 'input'];\n }\n\n if (!modes.every(mode => ['change', 'input'].includes(mode))) {\n throw new Error(`The modeValue provided '${this.eventModeValue}' is not one of the recognised configuration options`);\n }\n\n return modes as Array<'change' | 'input'>;\n } else {\n return [\"change\"];\n }\n }\n\n get _debounceTimeout(): number {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : -1;\n }\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get _cssSelector() {\n let inputTypes = ['input', 'textarea', 'select'];\n let ignore = ':not([data-no-autosubmit])';\n return inputTypes.map(type => type.concat(ignore)).join(',');\n }\n\n get inputElements() {\n let subElements = Array.from(this.element.querySelectorAll(this._cssSelector));\n subElements = subElements.filter(el => !this._ancestorIsTrix(el));\n return subElements;\n }\n\n connect() {\n this.inputElements.forEach(el => {\n return useEventListener(\n this,\n el as HTMLElement,\n this._eventModes,\n this.submit,\n {debounce: this._debounceTimeout && this._debounceTimeout > 0 ? this._debounceTimeout : undefined},\n );\n });\n }\n\n _ancestorIsTrix(element: Element) {\n return element.closest('trix-toolbar') !== null && element.closest('trix-editor') !== null;\n }\n\n private submit() {\n let el = this.el as HTMLFormElement;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLTextAreaElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class AutosizeController extends BaseController {\n\n declare _unobserveIntersection: () => void;\n\n connect() {\n let {teardown} = useIntersection(this, this.el, this.appear);\n this._unobserveIntersection = teardown;\n if (!isHTMLTextAreaElement(this.el)) {\n throw new Error(`Expected controller to be attached to a textarea, but was a '${this.el.tagName}'`);\n }\n\n requestAnimationFrame(() => {\n this.el.style.resize = \"none\";\n this.el.style.boxSizing = \"border-box\";\n\n this._handler();\n useEventListener(this, window, ['resize'], this._handler);\n useEventListener(this, this.el, ['input', 'change', 'focus'], this._handler, {debounce: 100});\n });\n }\n\n appear(_entry: IntersectionObserverEntry) {\n this.autosize(this.el as HTMLTextAreaElement);\n this._unobserveIntersection();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n }\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {Controller} from \"stimulus\";\n\nexport function controllerMethod<C extends Controller>(controller: C, methodName: string): (...args: any[]) => any {\n // @ts-ignore\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n } else if (method != undefined) {\n return () => method;\n } else {\n return () => void 0;\n }\n}","import {camelCase, upperFirst} from \"lodash-es\";\n\nexport function pascalCase(str: string): string {\n return upperFirst(\n camelCase(str),\n );\n}","import {Controller} from \"stimulus\";\nimport {controllerMethod} from \"../utilities/stimulus\";\nimport {pascalCase} from \"../utilities/strings\";\n\nexport class InstallClassMethodComposableController extends Controller {\n [index: string]: any\n}\n\nfunction addMethodsForClassDefinition(controller: InstallClassMethodComposableController, name: string) {\n let defaultElement = controller.element as HTMLElement;\n let hasClass = (): boolean => controller[`has${pascalCase(name)}Class`] == true;\n let classes = (): string[] => controller[`${name}Classes`];\n let defaultClasses = (): string[] => controllerMethod(controller, `default${pascalCase(name)}Classes`).call(controller) || [];\n let classOrDefault = (): string[] => hasClass() ? classes() : defaultClasses();\n\n if (controller[`${name}Classes`] == undefined) {\n Object.defineProperty(controller, `${name}Classes`, {\n get: () => hasClass() ? controller[`${name}Class`].split(' ') : defaultClasses(),\n });\n }\n let methods = {\n [`add${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.add(...classOrDefault()),\n [`remove${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.remove(...classOrDefault()),\n [`${name}ClassesPresent`]: (element = defaultElement) => classOrDefault().every((klass: string) => element.classList.contains(klass)),\n };\n Object.assign(controller, methods);\n}\n\nexport function installClassMethods(controller: InstallClassMethodComposableController) {\n // @ts-ignore\n let classes = controller.constructor.classes || [];\n classes.forEach((classDefinition: string) => addMethodsForClassDefinition(controller, classDefinition));\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class CharCountController extends BaseController {\n\n // Config\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n // Targets\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n // Values\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n // Classes\n declare removeErrorClasses: (el?: HTMLElement) => void;\n declare addErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n useEventListener(this, this.inputTarget, \"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this._isValidCount(charCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxDisableInputsController extends BaseController {\n\n static targets = [\"disabler\", \"disable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasDisablerTarget: boolean;\n declare readonly disablerTarget: HTMLInputElement;\n declare readonly disableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\n this.disable();\n } else {\n this.enable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.disableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.disableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxEnableInputsController extends BaseController {\n\n static targets = [\"enabler\", \"enable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasEnablerTarget: boolean;\n declare readonly enablerTarget: HTMLInputElement;\n declare readonly enableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.enableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.enableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {useCollectionEventListener, useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this._enabled.filter(checkbox => checkbox.checked);\n }\n\n private get _enabled() {\n return this.checkboxTargets.filter(checkbox => !checkbox.disabled && !checkbox.readOnly);\n }\n\n private get _unchecked() {\n return this._enabled.filter(checkbox => !checkbox.checked);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n useEventListener(this, this.selectAllTarget, 'change', this._toggle);\n useCollectionEventListener(this, this.checkboxTargets, 'change', this._refresh);\n this._refresh();\n });\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this._enabled.forEach((checkbox) => checkbox.checked = (checkbox.disabled || checkbox.readOnly) ? checkbox.checked : target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this._enabled.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins\";\n\nexport class CheckboxXORController extends BaseController {\n\n static targets = [\"checkbox\"];\n declare readonly checkboxTargets: HTMLInputElement[];\n\n connect() {\n useCollectionEventListener(this, this.checkboxTargets, \"change\", this._update);\n }\n\n _otherCheckboxes(el: HTMLInputElement): HTMLInputElement[] {\n return Array.from(this.checkboxTargets).filter(field => field !== el);\n }\n\n _update(event: Event) {\n const target = event.target as HTMLInputElement | null;\n if (!target) {\n throw new Error(\"No target found on event\");\n }\n\n let others = this._otherCheckboxes(target);\n if (target.checked) {\n others.forEach(checkbox => {\n checkbox.checked = false;\n this.dispatchEvent(this.el, 'change');\n });\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyController extends BaseController {\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._restoreElementFromLoadValue();\n }\n\n private _getElementValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(): boolean {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkDirty() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty()) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(): boolean {\n return this._getElementValue() !== this._getElementLoadValue();\n }\n\n private _restoreElementFromLoadValue() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n}\n\nexport function isDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyFormController extends BaseController {\n\n get _formElements(): Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> {\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\n }\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\n }\n\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty(element)) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return this._getElementValue(element) !== this._getElementLoadValue(element);\n }\n\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\n }\n\n private _checkDirty(): void {\n this._formElements.forEach(el => this._checkElementDirty(el));\n if (this._formElements.some(el => isFormDirty(el))) {\n this.el.setAttribute(\"data-dirty\", \"true\");\n } else {\n this.el.removeAttribute(\"data-dirty\");\n }\n }\n}\n\nexport function isFormDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class EnableInputsController extends BaseController {\n\n static targets = [\"input\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly inputTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.inputTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.inputTargets.forEach((el, _) => el.disabled = false);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FocusStealController extends BaseController {\n\n\n static values = {\n mode: String,\n };\n\n declare modeValue: 'immediate' | 'wait';\n declare hasModeValue: boolean;\n\n get _mode() {\n const MODES = ['immediate', 'wait'];\n if (this.hasModeValue) {\n if (!MODES.includes(this.modeValue)) {\n throw new Error(`The given modeValue '${this.modeValue}' is not one of the supported modes: \"${MODES.join('\", \"')}\"`);\n } else {\n return this.modeValue;\n }\n } else {\n return MODES[0];\n }\n }\n\n connect() {\n if (this._mode == 'immediate') {\n this.steal();\n }\n }\n\n steal() {\n (this.el as HTMLInputElement).focus();\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {requestReset, requestSubmit} from \"../../utilities/request_submit\";\n\nexport class FormRcController extends BaseController {\n\n static targets = [\"form\"];\n static values = {\n formSelector: String,\n submitMode: String,\n };\n\n declare submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare readonly formTarget: HTMLFormElement;\n declare readonly formSelectorValue: string;\n declare readonly hasFormSelectorValue: boolean;\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get form(): HTMLFormElement {\n let form: HTMLFormElement | null;\n if (this.hasFormSelectorValue) {\n form = document.querySelector(this.formSelectorValue);\n if (!form) {\n throw new Error(`Could not find a form on the page that matches selector '${this.formSelectorValue}'`);\n }\n } else {\n form = this.formTarget;\n }\n return form;\n }\n\n submit(event?: Event) {\n event?.preventDefault();\n let el = this.formTarget;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n\n reset(event?: Event) {\n event?.preventDefault();\n requestReset(this.form);\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\ninterface FormSavePayload {\n [idx: string]: {\n [idx: string]: string | boolean\n };\n}\n\nexport class FormSaveController extends BaseController {\n\n static values = {\n id: String,\n restoreOnLoad: Boolean,\n clearOnSubmit: Boolean,\n };\n\n declare readonly idValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare readonly clearOnSubmitValue: boolean;\n declare readonly hasClearOnSubmitValue: boolean;\n\n get _formID() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = (this.el as HTMLFormElement).id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\n }\n }\n\n get _formIdentifier() {\n const url = location.href;\n return `${url} ${this._formID}`;\n }\n\n get _formElements() {\n return (this.el as HTMLFormElement).elements;\n }\n\n get _formData(): FormSavePayload {\n let data: FormSavePayload = {[this._formIdentifier]: {}};\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name.length > 0) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n data[this._formIdentifier][el.name] = el.checked;\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.checked) {\n data[this._formIdentifier][el.name] = el.value;\n }\n } else {\n data[this._formIdentifier][el.name] = el.value;\n }\n }\n }\n return data;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _clearOnSubmit() {\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (!isHTMLFormElement(element)) {\n throw new Error('Expected controller to be mounted on a form element.');\n }\n\n if (this._restoreOnLoad) {\n this.restore();\n }\n if (this._clearOnSubmit) {\n useEventListener(this, this.el, 'submit', this._clear);\n }\n });\n }\n\n _clear() {\n localStorage.removeItem(this._formIdentifier);\n this.dispatchEvent(this.el, `form-save:cleared`);\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n save(event: Event) {\n event.preventDefault();\n let data = this._formData;\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\n this.dispatchEvent(this.el, `form-save:save:success`);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n if (localStorage.getItem(this._formIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name in savedData) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n el.checked = savedData[el.name];\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.value == savedData[el.name]) {\n el.checked = true;\n }\n } else {\n el.value = savedData[el.name];\n }\n }\n }\n this.dispatchEvent(this.el, `form-save:restore:success`);\n } else {\n this.dispatchEvent(this.el, `form-save:restore:empty`);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n connect() {\n useCollectionEventListener(this, this.inputTargets, \"change\", this._handleInputs);\n }\n\n _handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatchEvent(target, \"change\");\n this.dispatchEvent(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget && this.hasMessageValue) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatchEvent(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {clamp} from \"lodash-es\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class NavigateFormErrorsController extends BaseController {\n static values = {\n selector: String,\n index: Number,\n };\n\n static classes = [\"current\"];\n static targets = [\"next\", \"current\", \"previous\"];\n\n declare readonly hasNextTarget: boolean;\n declare readonly nextTarget: HTMLElement;\n declare readonly hasPreviousTarget: boolean;\n declare readonly previousTarget: HTMLElement;\n declare readonly hasCurrentTarget: boolean;\n declare readonly currentTarget: HTMLElement;\n declare selectorValue: string;\n declare readonly hasSelectorValue: boolean;\n declare indexValue: number;\n declare readonly hasIndexValue: boolean;\n _errors: HTMLElement[] = [];\n _firstClick = false;\n\n declare addCurrentClasses: (el?: HTMLElement) => void;\n declare removeCurrentClasses: (el?: HTMLElement) => void;\n\n get defaultCurrentClasses(): string[] {\n return [\"currentError\"];\n }\n\n get _errorCount(): number {\n return this._errors.length;\n }\n\n get _previousIndex(): number {\n let index = this._index - 1;\n if (index < 0) {\n return 0;\n }\n return index;\n }\n\n get _nextIndex(): number {\n let index = this._index + 1;\n if (index > this._errors.length - 1) {\n return this._errors.length - 1;\n }\n return index;\n }\n\n get _index(): number {\n return clamp(this.hasIndexValue ? this.indexValue : 0, 0, this._errors.length);\n }\n\n get _selector(): string {\n if (this.hasSelectorValue) {\n return this.selectorValue;\n } else {\n throw new Error(\"Expected `selectorValue` to be present\");\n }\n }\n\n get _currentError(): HTMLElement {\n return this._errors[this._index];\n }\n\n get _otherErrors(): HTMLElement[] {\n return this._errors.filter((error, index) => index !== this._index);\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._firstClick = true;\n this._toggleButtons();\n this._toggleVisibility();\n },\n );\n }\n\n async current(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async next(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._nextIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async previous(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._previousIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n indexValueChanged() {\n this._toggleButtons();\n }\n\n selectorValueChanged() {\n this._errors = Array.from(document.querySelectorAll(this._selector));\n this.indexValue = 0;\n this._toggleButtons();\n this._toggleVisibility();\n }\n\n private _updateClasses() {\n this.addCurrentClasses(this._currentError);\n this._otherErrors.forEach((error) => this.removeCurrentClasses(error));\n }\n\n private _toggleVisibility() {\n if (this._errorCount === 0) {\n this.el.style.display = \"none\";\n } else {\n this.el.style.display = \"\";\n }\n }\n\n private _toggleButtons() {\n if (this.hasNextTarget) {\n // If there is no \"Current Error\" button, then enable the next error button when there is only 1 error.\n if (!this.hasCurrentTarget && this._firstClick && this.indexValue == this._errorCount - 1) {\n this.nextTarget.removeAttribute(\"disabled\");\n return;\n } else if (this.indexValue >= this._errorCount - 1) {\n this.nextTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.nextTarget.removeAttribute(\"disabled\");\n }\n }\n if (this.hasPreviousTarget) {\n if (this.indexValue <= 0) {\n this.previousTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.previousTarget.removeAttribute(\"disabled\");\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n useCollectionEventListener(this, this.passwordTargets, \"change\", this._checkPasswordsMatch);\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private _checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatchEvent(element, \"password-confirm:match\");\n this.passwordTargets.forEach(el => this.removeErrorClasses(el));\n } else {\n this.dispatchEvent(element, \"password-confirm:no-match\");\n this.passwordTargets.forEach(el => this.addErrorClasses(el));\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class RemoteFormController extends BaseController {\n static targets = [];\n\n static values = {selector: String};\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n get _selector(): string {\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\n }\n\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\n const [data, status, xhr] = event.detail;\n if (data instanceof Node) {\n let newElement: HTMLElement | null = data.querySelector(this._selector);\n\n if (newElement == null) {\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\n }\n\n let parentNode = this.el.parentNode;\n if (parentNode == null) {\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\n }\n parentNode.replaceChild(newElement, this.el);\n this.dispatchEvent(newElement, 'remote-form:replace');\n } else {\n console.log('Unknown', data);\n }\n }\n}\n","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {EventBus} from \"../utilities/event_bus\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventBus(controller: Controller, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: { debounce?: number }) {\n let options = opts;\n\n if (options?.debounce) {\n handler = debounce(handler.bind(controller), options.debounce);\n delete options.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => EventBus.on(eventName, handler));\n let teardown = () => eventNames.forEach(eventName => EventBus.off(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isHTMLInputElement, isHTMLSelectElement, isHTMLTextAreaElement, isTypeOfFormInputElement} from \"../../utilities/elements\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SyncValuePayload {\n value: string | boolean;\n dispatcher: HTMLElement;\n}\n\nexport class SyncInputsController extends BaseController {\n static values = {\n key: String,\n };\n\n declare readonly keyValue: string;\n declare readonly hasKeyValue: boolean;\n\n get _eventName(): string {\n return `sync:${this._key}`;\n }\n\n get _key(): string {\n if (this.hasKeyValue) {\n return this.keyValue;\n }\n throw new Error(\"Expected `keyValue` to be present\");\n }\n\n get _value(): string | boolean {\n let el = this.el as | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n return el.checked;\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n return el.checked ? el.value : \"\";\n } else {\n return el.value;\n }\n }\n\n set _value(val: string | boolean) {\n let el = this.el;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n el.checked = val.toString() === \"true\";\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n el.checked = el.value === val;\n } else if (isHTMLInputElement(el) || isHTMLTextAreaElement(el) || isHTMLSelectElement(el)) {\n el.value = val.toString();\n } else {\n el.innerHTML = val.toString();\n }\n }\n\n connect() {\n useEventBus(this, this._eventName, this._read);\n\n requestAnimationFrame(() => {\n if (isTypeOfFormInputElement(this.el)) {\n this._emit();\n useEventListener(this, this.el, \"input\", this._emit);\n }\n });\n }\n\n _emit() {\n EventBus.emit(this._eventName, {value: this._value, dispatcher: this.el} as SyncValuePayload);\n }\n\n _read(payload?: SyncValuePayload) {\n if (payload === undefined) {\n throw new Error(\"No payload received\");\n }\n let {dispatcher, value} = payload;\n if (dispatcher !== this.el) {\n this._value = value;\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class ValueWarnController extends BaseController {\n\n static classes = [\"inputWarning\", \"warningHide\"];\n static targets = [\"input\", \"warning\"];\n static values = {\n max: Number,\n min: Number,\n minMessage: String,\n maxMessage: String,\n };\n\n declare readonly inputTarget: HTMLInputElement;\n declare readonly warningTarget: HTMLElement;\n declare readonly maxValue: number;\n declare readonly hasMaxValue: boolean;\n declare readonly minValue: number;\n declare readonly hasMinValue: boolean;\n declare readonly minMessageValue: string;\n declare readonly hasMinMessageValue: boolean;\n declare readonly maxMessageValue: string;\n declare readonly hasMaxMessageValue: boolean;\n declare addInputWarningClasses: (el?: HTMLElement) => void;\n declare removeInputWarningClasses: (el?: HTMLElement) => void;\n declare addWarningHideClasses: (el?: HTMLElement) => void;\n declare removeWarningHideClasses: (el?: HTMLElement) => void;\n\n get _maxMessage(): string {\n return this.hasMaxMessageValue ? this.maxMessageValue : `Value must be less than ${this.maxValue}`;\n }\n\n get _minMessage(): string {\n return this.hasMinMessageValue ? this.minMessageValue : `Value must be greater than ${this.minValue}`;\n }\n\n get defaultWarningHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n this.addWarningHideClasses(this.warningTarget);\n useEventListener(this, this.inputTarget, \"input\", this._check);\n this._check();\n }\n\n private _check() {\n if (this.hasMinValue && Number.parseFloat(this.inputTarget.value) < this.minValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._minMessage;\n } else if (this.hasMaxValue && Number.parseFloat(this.inputTarget.value) > this.maxValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._maxMessage;\n } else {\n this.addWarningHideClasses(this.warningTarget);\n this.removeInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = \"\";\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n this._updateWordCount();\n useEventListener(this, this.inputTarget, \"input\", this._updateWordCount);\n }\n\n _updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this._isValidCount(wordCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FallbackImageController extends BaseController {\n\n static values = {placeholder: String};\n static classes = [\"success\", \"fail\"];\n\n declare readonly placeholderValue: string;\n declare readonly hasPlaceholderValue: boolean;\n declare addSuccessClasses: (el?: HTMLElement) => void;\n declare removeSuccessClasses: (el?: HTMLElement) => void;\n declare addFailClasses: (el?: HTMLElement) => void;\n declare removeFailClasses: (el?: HTMLElement) => void;\n\n\n initialize() {\n this._hasLoadedSuccessfully = this._hasLoadedSuccessfully.bind(this);\n this._success = this._success.bind(this);\n this._fail = this._fail.bind(this);\n }\n\n connect() {\n let element = this.el as HTMLImageElement;\n\n element.onerror = this._fail;\n if (element.complete && !this._hasLoadedSuccessfully()) {\n this._fail();\n } else {\n this._success();\n }\n }\n\n disconnect() {\n this.removeSuccessClasses();\n this.removeFailClasses();\n }\n\n private _success() {\n this.addSuccessClasses();\n }\n\n private _fail() {\n let element = this.el as HTMLImageElement;\n this.addFailClasses();\n\n if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {\n this.dispatchEvent(element, \"fallback-image:placeholder\");\n element.src = this.placeholderValue;\n element.onerror = this._fail;\n } else {\n this.dispatchEvent(element, \"fallback-image:fail\");\n element.style.display = \"none\";\n }\n }\n\n private _hasLoadedSuccessfully(): boolean {\n let element = this.el as HTMLImageElement;\n return element.naturalHeight > 0 && element.naturalWidth > 0;\n }\n\n}\n","// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n supportCustomEvent = function CustomEvent(event, x) {\n x = x || {};\n var ev = document.createEvent('CustomEvent');\n ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n return ev;\n };\n supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * Dispatches the passed event to both an \"on<type>\" handler as well as via the\n * normal dispatch operation. Does not bubble.\n *\n * @param {!EventTarget} target\n * @param {!Event} event\n * @return {boolean}\n */\nfunction safeDispatchEvent(target, event) {\n var check = 'on' + event.type.toLowerCase();\n if (typeof target[check] === 'function') {\n target[check](event);\n }\n return target.dispatchEvent(event);\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n while (el && el !== document.body) {\n var s = window.getComputedStyle(el);\n var invalid = function(k, ok) {\n return !(s[k] === undefined || s[k] === ok);\n };\n\n if (s.opacity < 1 ||\n invalid('zIndex', 'auto') ||\n invalid('transform', 'none') ||\n invalid('mixBlendMode', 'normal') ||\n invalid('filter', 'none') ||\n invalid('perspective', 'none') ||\n s['isolation'] === 'isolate' ||\n s.position === 'fixed' ||\n s.webkitOverflowScrolling === 'touch') {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n while (el) {\n if (el.localName === 'dialog') {\n return /** @type {HTMLDialogElement} */ (el);\n }\n if (el.parentElement) {\n el = el.parentElement;\n } else if (el.parentNode) {\n el = el.parentNode.host;\n } else {\n el = null;\n }\n }\n return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n // Find the actual focused element when the active element is inside a shadow root\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement;\n }\n\n if (el && el.blur && el !== document.body) {\n el.blur();\n }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n for (var i = 0; i < nodeList.length; ++i) {\n if (nodeList[i] === node) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n if (!el || !el.hasAttribute('method')) {\n return false;\n }\n return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!DocumentFragment|!Element} hostElement\n * @return {?Element}\n */\nfunction findFocusableElementWithin(hostElement) {\n // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n // alternative involves stepping through and trying to focus everything.\n var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n var query = opts.map(function(el) {\n return el + ':not([disabled])';\n });\n // TODO(samthor): tabindex values that are not numeric are not focusable.\n query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])'); // tabindex != \"\", not disabled\n var target = hostElement.querySelector(query.join(', '));\n\n if (!target && 'attachShadow' in Element.prototype) {\n // If we haven't found a focusable target, see if the host element contains an element\n // which has a shadowRoot.\n // Recursively search for the first focusable item in shadow roots.\n var elems = hostElement.querySelectorAll('*');\n for (var i = 0; i < elems.length; i++) {\n if (elems[i].tagName && elems[i].shadowRoot) {\n target = findFocusableElementWithin(elems[i].shadowRoot);\n if (target) {\n break;\n }\n }\n }\n }\n return target;\n}\n\n/**\n * Determines if an element is attached to the DOM.\n * @param {Element} element to check\n * @return {boolean} whether the element is in DOM\n */\nfunction isConnected(element) {\n return element.isConnected || document.body.contains(element);\n}\n\n/**\n * @param {!Event} event\n * @return {?Element}\n */\nfunction findFormSubmitter(event) {\n if (event.submitter) {\n return event.submitter;\n }\n\n var form = event.target;\n if (!(form instanceof HTMLFormElement)) {\n return null;\n }\n\n var submitter = dialogPolyfill.formSubmitter;\n if (!submitter) {\n var target = event.target;\n var root = ('getRootNode' in target && target.getRootNode() || document);\n submitter = root.activeElement;\n }\n\n if (!submitter || submitter.form !== form) {\n return null;\n }\n return submitter;\n}\n\n/**\n * @param {!Event} event\n */\nfunction maybeHandleSubmit(event) {\n if (event.defaultPrevented) {\n return;\n }\n var form = /** @type {!HTMLFormElement} */ (event.target);\n\n // We'd have a value if we clicked on an imagemap.\n var value = dialogPolyfill.imagemapUseValue;\n var submitter = findFormSubmitter(event);\n if (value === null && submitter) {\n value = submitter.value;\n }\n\n // There should always be a dialog as this handler is added specifically on them, but check just\n // in case.\n var dialog = findNearestDialog(form);\n if (!dialog) {\n return;\n }\n\n // Prefer formmethod on the button.\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod !== 'dialog') {\n return;\n }\n event.preventDefault();\n\n if (value != null) {\n // nb. we explicitly check against null/undefined\n dialog.close(value);\n } else {\n dialog.close();\n }\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n this.dialog_ = dialog;\n this.replacedStyleTop_ = false;\n this.openAsModal_ = false;\n\n // Set a11y role. Browsers that support dialog implicitly know this already.\n if (!dialog.hasAttribute('role')) {\n dialog.setAttribute('role', 'dialog');\n }\n\n dialog.show = this.show.bind(this);\n dialog.showModal = this.showModal.bind(this);\n dialog.close = this.close.bind(this);\n\n dialog.addEventListener('submit', maybeHandleSubmit, false);\n\n if (!('returnValue' in dialog)) {\n dialog.returnValue = '';\n }\n\n if ('MutationObserver' in window) {\n var mo = new MutationObserver(this.maybeHideModal.bind(this));\n mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n } else {\n // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n // seem to fire even if the element was removed as part of a parent removal. Use the removed\n // events to force downgrade (useful if removed/immediately added).\n var removed = false;\n var cb = function() {\n removed ? this.downgradeModal() : this.maybeHideModal();\n removed = false;\n }.bind(this);\n var timeout;\n var delayModel = function(ev) {\n if (ev.target !== dialog) { return; } // not for a child element\n var cand = 'DOMNodeRemoved';\n removed |= (ev.type.substr(0, cand.length) === cand);\n window.clearTimeout(timeout);\n timeout = window.setTimeout(cb, 0);\n };\n ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n dialog.addEventListener(name, delayModel);\n });\n }\n // Note that the DOM is observed inside DialogManager while any dialog\n // is being displayed as a modal, to catch modal removal from the DOM.\n\n Object.defineProperty(dialog, 'open', {\n set: this.setOpen.bind(this),\n get: dialog.hasAttribute.bind(dialog, 'open')\n });\n\n this.backdrop_ = document.createElement('div');\n this.backdrop_.className = 'backdrop';\n this.backdrop_.addEventListener('mouseup' , this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('mousedown', this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('click' , this.backdropMouseEvent_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = /** @type {HTMLDialogElement.prototype} */ ({\n\n get dialog() {\n return this.dialog_;\n },\n\n /**\n * Maybe remove this dialog from the modal top layer. This is called when\n * a modal dialog may no longer be tenable, e.g., when the dialog is no\n * longer open or is no longer part of the DOM.\n */\n maybeHideModal: function() {\n if (this.dialog_.hasAttribute('open') && isConnected(this.dialog_)) { return; }\n this.downgradeModal();\n },\n\n /**\n * Remove this dialog from the modal top layer, leaving it as a non-modal.\n */\n downgradeModal: function() {\n if (!this.openAsModal_) { return; }\n this.openAsModal_ = false;\n this.dialog_.style.zIndex = '';\n\n // This won't match the native <dialog> exactly because if the user set top on a centered\n // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n // possible to polyfill this perfectly.\n if (this.replacedStyleTop_) {\n this.dialog_.style.top = '';\n this.replacedStyleTop_ = false;\n }\n\n // Clear the backdrop and remove from the manager.\n this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n dialogPolyfill.dm.removeDialog(this);\n },\n\n /**\n * @param {boolean} value whether to open or close this dialog\n */\n setOpen: function(value) {\n if (value) {\n this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n } else {\n this.dialog_.removeAttribute('open');\n this.maybeHideModal(); // nb. redundant with MutationObserver\n }\n },\n\n /**\n * Handles mouse events ('mouseup', 'mousedown', 'click') on the fake .backdrop element, redirecting them as if\n * they were on the dialog itself.\n *\n * @param {!Event} e to redirect\n */\n backdropMouseEvent_: function(e) {\n if (!this.dialog_.hasAttribute('tabindex')) {\n // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n // would not be needed - clicks would move the implicit cursor there.\n var fake = document.createElement('div');\n this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n fake.tabIndex = -1;\n fake.focus();\n this.dialog_.removeChild(fake);\n } else {\n this.dialog_.focus();\n }\n\n var redirectedEvent = document.createEvent('MouseEvents');\n redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n this.dialog_.dispatchEvent(redirectedEvent);\n e.stopPropagation();\n },\n\n /**\n * Focuses on the first focusable element within the dialog. This will always blur the current\n * focus, even if nothing within the dialog is found.\n */\n focus_: function() {\n // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n if (!target && this.dialog_.tabIndex >= 0) {\n target = this.dialog_;\n }\n if (!target) {\n target = findFocusableElementWithin(this.dialog_);\n }\n safeBlur(document.activeElement);\n target && target.focus();\n },\n\n /**\n * Sets the zIndex for the backdrop and dialog.\n *\n * @param {number} dialogZ\n * @param {number} backdropZ\n */\n updateZIndex: function(dialogZ, backdropZ) {\n if (dialogZ < backdropZ) {\n throw new Error('dialogZ should never be < backdropZ');\n }\n this.dialog_.style.zIndex = dialogZ;\n this.backdrop_.style.zIndex = backdropZ;\n },\n\n /**\n * Shows the dialog. If the dialog is already open, this does nothing.\n */\n show: function() {\n if (!this.dialog_.open) {\n this.setOpen(true);\n this.focus_();\n }\n },\n\n /**\n * Show this dialog modally.\n */\n showModal: function() {\n if (this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n }\n if (!isConnected(this.dialog_)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n }\n if (!dialogPolyfill.dm.pushDialog(this)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n }\n\n if (createsStackingContext(this.dialog_.parentElement)) {\n console.warn('A dialog is being shown inside a stacking context. ' +\n 'This may cause it to be unusable. For more information, see this link: ' +\n 'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n }\n\n this.setOpen(true);\n this.openAsModal_ = true;\n\n // Optionally center vertically, relative to the current viewport.\n if (dialogPolyfill.needsCentering(this.dialog_)) {\n dialogPolyfill.reposition(this.dialog_);\n this.replacedStyleTop_ = true;\n } else {\n this.replacedStyleTop_ = false;\n }\n\n // Insert backdrop.\n this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n // Focus on whatever inside the dialog.\n this.focus_();\n },\n\n /**\n * Closes this HTMLDialogElement. This is optional vs clearing the open\n * attribute, however this fires a 'close' event.\n *\n * @param {string=} opt_returnValue to use as the returnValue\n */\n close: function(opt_returnValue) {\n if (!this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n }\n this.setOpen(false);\n\n // Leave returnValue untouched in case it was set directly on the element\n if (opt_returnValue !== undefined) {\n this.dialog_.returnValue = opt_returnValue;\n }\n\n // Triggering \"close\" event for any attached listeners on the <dialog>.\n var closeEvent = new supportCustomEvent('close', {\n bubbles: false,\n cancelable: false\n });\n safeDispatchEvent(this.dialog_, closeEvent);\n }\n\n});\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n for (var i = 0; i < document.styleSheets.length; ++i) {\n var styleSheet = document.styleSheets[i];\n var cssRules = null;\n // Some browsers throw on cssRules.\n try {\n cssRules = styleSheet.cssRules;\n } catch (e) {}\n if (!cssRules) { continue; }\n for (var j = 0; j < cssRules.length; ++j) {\n var rule = cssRules[j];\n var selectedNodes = null;\n // Ignore errors on invalid selector texts.\n try {\n selectedNodes = document.querySelectorAll(rule.selectorText);\n } catch(e) {}\n if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n continue;\n }\n var cssTop = rule.style.getPropertyValue('top');\n var cssBottom = rule.style.getPropertyValue('bottom');\n if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n return true;\n }\n }\n }\n return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n var computedStyle = window.getComputedStyle(dialog);\n if (computedStyle.position !== 'absolute') {\n return false;\n }\n\n // We must determine whether the top/bottom specified value is non-auto. In\n // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n // Firefox returns the used value. So we do this crazy thing instead: check\n // the inline style and then go through CSS rules.\n if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n return false;\n }\n return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n if (window.HTMLDialogElement || element.showModal) {\n console.warn('This browser already supports <dialog>, the polyfill ' +\n 'may not work correctly', element);\n }\n if (element.localName !== 'dialog') {\n throw new Error('Failed to register dialog: The element is not a dialog.');\n }\n new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n if (!element.showModal) {\n dialogPolyfill.forceRegisterDialog(element);\n }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n /** @type {!Array<!dialogPolyfillInfo>} */\n this.pendingDialogStack = [];\n\n var checkDOM = this.checkDOM_.bind(this);\n\n // The overlay is used to simulate how a modal dialog blocks the document.\n // The blocking dialog is positioned on top of the overlay, and the rest of\n // the dialogs on the pending dialog stack are positioned below it. In the\n // actual implementation, the modal dialog stacking is controlled by the\n // top layer, where z-index has no effect.\n this.overlay = document.createElement('div');\n this.overlay.className = '_dialog_overlay';\n this.overlay.addEventListener('click', function(e) {\n this.forwardTab_ = undefined;\n e.stopPropagation();\n checkDOM([]); // sanity-check DOM\n }.bind(this));\n\n this.handleKey_ = this.handleKey_.bind(this);\n this.handleFocus_ = this.handleFocus_.bind(this);\n\n this.zIndexLow_ = 100000;\n this.zIndexHigh_ = 100000 + 150;\n\n this.forwardTab_ = undefined;\n\n if ('MutationObserver' in window) {\n this.mo_ = new MutationObserver(function(records) {\n var removed = [];\n records.forEach(function(rec) {\n for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n if (!(c instanceof Element)) {\n continue;\n } else if (c.localName === 'dialog') {\n removed.push(c);\n }\n removed = removed.concat(c.querySelectorAll('dialog'));\n }\n });\n removed.length && checkDOM(removed);\n });\n }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n document.documentElement.addEventListener('focus', this.handleFocus_, true);\n document.addEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n document.removeEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n var zIndex = this.zIndexHigh_;\n\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n dpi.updateZIndex(--zIndex, --zIndex);\n if (i === 0) {\n this.overlay.style.zIndex = --zIndex;\n }\n }\n\n // Make the overlay a sibling of the dialog itself.\n var last = this.pendingDialogStack[0];\n if (last) {\n var p = last.dialog.parentNode || document.body;\n p.appendChild(this.overlay);\n } else if (this.overlay.parentNode) {\n this.overlay.parentNode.removeChild(this.overlay);\n }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n while (candidate = findNearestDialog(candidate)) {\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n if (dpi.dialog === candidate) {\n return i === 0; // only valid if top-most\n }\n }\n candidate = candidate.parentElement;\n }\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n var target = event.composedPath ? event.composedPath()[0] : event.target;\n\n if (this.containedByTopDialog_(target)) { return; }\n\n if (document.activeElement === document.documentElement) { return; }\n\n event.preventDefault();\n event.stopPropagation();\n safeBlur(/** @type {Element} */ (target));\n\n if (this.forwardTab_ === undefined) { return; } // move focus only from a tab key\n\n var dpi = this.pendingDialogStack[0];\n var dialog = dpi.dialog;\n var position = dialog.compareDocumentPosition(target);\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n if (this.forwardTab_) {\n // forward\n dpi.focus_();\n } else if (target !== document.documentElement) {\n // backwards if we're not already focused on <html>\n document.documentElement.focus();\n }\n }\n\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n this.forwardTab_ = undefined;\n if (event.keyCode === 27) {\n event.preventDefault();\n event.stopPropagation();\n var cancelEvent = new supportCustomEvent('cancel', {\n bubbles: false,\n cancelable: true\n });\n var dpi = this.pendingDialogStack[0];\n if (dpi && safeDispatchEvent(dpi.dialog, cancelEvent)) {\n dpi.dialog.close();\n }\n } else if (event.keyCode === 9) {\n this.forwardTab_ = !event.shiftKey;\n }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n // This operates on a clone because it may cause it to change. Each change also calls\n // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n // at a time?!\n var clone = this.pendingDialogStack.slice();\n clone.forEach(function(dpi) {\n if (removed.indexOf(dpi.dialog) !== -1) {\n dpi.downgradeModal();\n } else {\n dpi.maybeHideModal();\n }\n });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n if (this.pendingDialogStack.length >= allowed) {\n return false;\n }\n if (this.pendingDialogStack.unshift(dpi) === 1) {\n this.blockDocument();\n }\n this.updateStacking();\n return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n var index = this.pendingDialogStack.indexOf(dpi);\n if (index === -1) { return; }\n\n this.pendingDialogStack.splice(index, 1);\n if (this.pendingDialogStack.length === 0) {\n this.unblockDocument();\n }\n this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.imagemapUseValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n /**\n * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n * one that returns the correct value.\n */\n var testForm = document.createElement('form');\n testForm.setAttribute('method', 'dialog');\n if (testForm.method !== 'dialog') {\n var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n if (methodDescriptor) {\n // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n // and don't bother to update the element.\n var realGet = methodDescriptor.get;\n methodDescriptor.get = function() {\n if (isFormMethodDialog(this)) {\n return 'dialog';\n }\n return realGet.call(this);\n };\n var realSet = methodDescriptor.set;\n /** @this {HTMLElement} */\n methodDescriptor.set = function(v) {\n if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n return this.setAttribute('method', v);\n }\n return realSet.call(this, v);\n };\n Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n }\n }\n\n /**\n * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n * document.activeElement.\n */\n document.addEventListener('click', function(ev) {\n dialogPolyfill.formSubmitter = null;\n dialogPolyfill.imagemapUseValue = null;\n if (ev.defaultPrevented) { return; } // e.g. a submit which prevents default submission\n\n var target = /** @type {Element} */ (ev.target);\n if ('composedPath' in ev) {\n var path = ev.composedPath();\n target = path.shift() || target;\n }\n if (!target || !isFormMethodDialog(target.form)) { return; }\n\n var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n if (!valid) {\n if (!(target.localName === 'input' && target.type === 'image')) { return; }\n // this is a <input type=\"image\">, which can submit forms\n dialogPolyfill.imagemapUseValue = ev.offsetX + ',' + ev.offsetY;\n }\n\n var dialog = findNearestDialog(target);\n if (!dialog) { return; }\n\n dialogPolyfill.formSubmitter = target;\n\n }, false);\n\n /**\n * Global 'submit' handler. This handles submits of `method=\"dialog\"` which are invalid, i.e.,\n * outside a dialog. They get prevented.\n */\n document.addEventListener('submit', function(ev) {\n var form = ev.target;\n var dialog = findNearestDialog(form);\n if (dialog) {\n return; // ignore, handle there\n }\n\n var submitter = findFormSubmitter(ev);\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod === 'dialog') {\n ev.preventDefault();\n }\n });\n\n /**\n * Replace the native HTMLFormElement.submit() method, as it won't fire the\n * submit event and give us a chance to respond.\n */\n var nativeFormSubmit = HTMLFormElement.prototype.submit;\n var replacementFormSubmit = function () {\n if (!isFormMethodDialog(this)) {\n return nativeFormSubmit.call(this);\n }\n var dialog = findNearestDialog(this);\n dialog && dialog.close();\n };\n HTMLFormElement.prototype.submit = replacementFormSubmit;\n}\n\nexport default dialogPolyfill;\n","import dialogPolyfill from \"dialog-polyfill\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LightboxImageController extends BaseController {\n\n static values = {\n src: String,\n srcSet: String,\n sizes: String,\n };\n static classes = [\"modal\", \"image\"];\n\n declare readonly hasModalClass: boolean;\n declare readonly modalClass: string;\n declare readonly hasImageClass: boolean;\n declare readonly imageClass: string;\n declare readonly hasSrcValue: boolean;\n declare readonly srcValue: string;\n declare readonly hasSrcSetValue: boolean;\n declare readonly srcSetValue: string;\n declare readonly hasSizesValue: boolean;\n declare readonly sizesValue: string;\n _dialog: HTMLDialogElement | null = null;\n\n get _src(): string {\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\n }\n\n get _srcSet(): string {\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\n }\n\n get _sizes(): string {\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\n }\n\n get _modalClassName() {\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\n }\n\n get _imageClassName() {\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\n }\n\n initialize() {\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n }\n\n connect() {\n }\n\n disconnect() {\n this.close();\n }\n\n open() {\n let element = this.el as HTMLImageElement;\n if (this._dialog) {\n return;\n }\n this._dialog = document.createElement(\"dialog\");\n\n let image = document.createElement(\"img\") as HTMLImageElement;\n image.className = this._imageClassName;\n image.src = this._src;\n image.srcset = this._srcSet;\n image.sizes = this._sizes;\n this._dialog.appendChild(image);\n\n element.insertAdjacentElement(\"afterend\", this._dialog);\n dialogPolyfill.registerDialog(this._dialog);\n this._dialog.className = this._modalClassName;\n // @ts-ignore Experimental API\n this._dialog.showModal();\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\n useEventListener(this, this._dialog, \"click\", this.close);\n useEventListener(this, this._dialog, \"cancel\", this.close);\n useEventListener(this, this._dialog, \"close\", this.close);\n }\n\n close() {\n if (this._dialog) {\n // @ts-ignore Experimental API\n this._dialog.close();\n this._dialog.remove();\n this._dialog = null;\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class MediaPlayerController extends BaseController {\n\n static targets = [\"media\"];\n\n declare readonly mediaTarget: HTMLMediaElement;\n\n async play(event?: Event) {\n event?.preventDefault();\n await this.mediaTarget.play();\n }\n\n pause(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.pause();\n }\n\n restart(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime = 0;\n }\n\n seek(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime += 5;\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollUp} from \"../../utilities/scroll\";\n\nexport class ScrollContainerController extends BaseController {\n\n static values = {\n behaviour: String,\n increment: Number,\n };\n\n declare readonly behaviourValue: ScrollBehavior;\n declare readonly hasBehaviourValue: boolean;\n\n declare readonly incrementValue: number;\n declare readonly hasIncrementValue: boolean;\n\n get _increment(): number {\n return this.hasIncrementValue ? this.incrementValue : 50;\n }\n\n get _behaviour(): ScrollBehavior {\n if (this.hasBehaviourValue) {\n if ([\"auto\", \"smooth\"].includes(this.behaviourValue)) {\n return this.behaviourValue;\n } else {\n throw new Error(`'${this.behaviourValue}' is not a recognised scroll behaviour`);\n }\n } else {\n return \"auto\";\n }\n }\n\n async scrollTop(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteTop(this.el, {behavior: this._behaviour});\n }\n\n async scrollBottom(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteBottom(this.el, {behavior: this._behaviour});\n }\n\n async scrollLeft(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async scrollRight(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async up(event?: Event) {\n event?.preventDefault();\n await scrollUp(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async down(event?: Event) {\n event?.preventDefault();\n await scrollDown(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async left(event?: Event) {\n event?.preventDefault();\n await scrollLeft(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async right(event?: Event) {\n event?.preventDefault();\n await scrollRight(this.el, this._increment, {behavior: this._behaviour});\n }\n}\n\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollIntoFocusController extends EphemeralController {\n\n static values = {\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n connect() {\n requestAnimationFrame(() => {\n // Attempt smooth scrolling, with polyfill\n scrollToElement(\n this.el,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\n this._cleanupSelf();\n });\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteBottom} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteBottom(this._scrollTarget);\n }\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteTop} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteTop(this._scrollTarget);\n }\n }\n\n}\n\n","export function extractPredicates(expressionString: string): Array<(val: string | number) => boolean> {\n expressionString = expressionString.trim();\n\n let andExpression = expressionString.includes(\"&&\");\n let orExpression = expressionString.includes(\"||\");\n let groupings = expressionString.includes(\"(\") || expressionString.includes(\")\");\n\n if (andExpression && orExpression) {\n throw new Error(\"Cannot have both && and || in the same expression.\");\n }\n\n if (groupings) {\n throw new Error(\"Cannot have logical groupings `(>3 && <= 9) || (>1 && <2)` in the expression. Only supports simple expressions like `>1 && <3`\");\n }\n\n let expressions = expressionString.split(andExpression ? \"&&\" : \"||\");\n if (andExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else if (orExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else {\n return [_predicateForExpression(expressionString)];\n }\n}\n\n\nfunction _predicateForExpression(expression: string): (val: string | number) => boolean {\n let operators = [\">=\", \"<=\", \"==\", \"!=\", \">\", \"<\"];\n let operator = operators.find(part => expression.includes(part));\n if (!operator) {\n throw new Error(`Could not find operator in expression: ${expression}`);\n }\n let expressionValue: string | number = expression.split(operator)[1].trim();\n let isNumber = /^-?\\d*(\\.\\d+)?$/.test(expressionValue);\n if (isNumber) {\n expressionValue = parseFloat(expressionValue);\n }\n\n if (expressionValue === \"\") {\n throw new Error(`Could not find a value in expression: ${expression}`);\n }\n\n let notEmpty = (signalValue: string | number) => signalValue !== \"\";\n\n switch (operator) {\n case \">\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue > expressionValue;\n case \"<\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue < expressionValue;\n case \">=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue >= expressionValue;\n case \"<=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue <= expressionValue;\n case \"==\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue == expressionValue;\n case \"!=\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue != expressionValue;\n default:\n throw new Error(`Unknown operator ${operator}`);\n }\n}\n","export function signalEventName(name: string, type: string): string {\n return `signal:${type}:${name}`;\n}\n\nexport function signalConnectEvent(name: string): string {\n return signalEventName(name, 'connect');\n}\n\nexport function signalValueEvent(name: string): string {\n return signalEventName(name, 'value');\n}\n\nexport function signalVisibilityEvent(name: string, action: \"hide\" | \"show\"): string {\n return signalEventName(`${name}:${action}`, 'visibility');\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {EventBus} from \"../../utilities\";\nimport {signalConnectEvent, signalEventName, signalValueEvent} from \"./events\";\n\nexport class SignalActionController extends BaseController {\n\n static values = {\n name: String,\n when: String,\n };\n\n declare whenValue: string;\n declare readonly hasWhenValue: boolean;\n\n declare nameValue: string;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.whenValue);\n }\n\n connect() {\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (!this.hasWhenValue) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'));\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'), {detail: {element: this.el, value}});\n } else {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'no-match'), {detail: {element: this.el, value}});\n }\n }\n\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useMutationObserver(controller: Controller, element: HTMLElement, handler: (entries: MutationRecord[]) => void, options: MutationObserverInit) {\n handler = handler.bind(controller);\n let observer: MutationObserver = new MutationObserver(handler);\n\n let setup = () => observer.observe(element, options);\n let teardown = () => observer.disconnect();\n\n useMixin(controller, setup, teardown);\n return teardown;\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {EventBus} from \"../../utilities\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {useMutationObserver} from \"../../mixins/use_mutation_observer\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport class SignalDomChildrenController extends BaseController {\n\n static values = {\n name: String,\n scopeSelector: String,\n };\n declare nameValue: string;\n declare hasNameValue: boolean;\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _children(): Element[] {\n if (this.hasScopeSelectorValue) {\n return Array.from(this.el.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(this.el.children);\n }\n }\n\n get _name() {\n if (this.hasNameValue) {\n return this.nameValue;\n } else {\n throw new Error(\"SignalEmptyDomController requires a nameValue to be provided\");\n }\n }\n\n connect() {\n useEventBus(this, signalConnectEvent(this._name), this.emitChildCount);\n EventBus.emit(signalConnectEvent(this._name));\n useMutationObserver(this, this.el, this.mutate, {childList: true});\n this.emitChildCount();\n }\n\n mutate(entries: MutationRecord[]) {\n this.emitChildCount();\n }\n\n emitChildCount() {\n let childCount = this._children.length;\n EventBus.emit(signalValueEvent(this._name), {element: this.el, value: childCount.toString()} as SignalPayload);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListeners} from \"../../mixins/use_event_listener\";\nimport {getAllRadiosInGroup, isHTMLInputElement} from \"../../utilities\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SignalPayload {\n element: HTMLElement;\n value: string;\n}\n\nexport class SignalInputController extends BaseController {\n\n static values = {\n name: String,\n debounceInterval: Number,\n };\n\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n declare nameValue: string;\n declare hasNameValue: boolean;\n\n get _debounceTimeout(): number | null {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : 1;\n }\n\n get _name(): string {\n return this.hasNameValue ? this.nameValue : (this.element as HTMLInputElement).name;\n }\n\n connect() {\n useEventBus(this, signalConnectEvent(this._name), () => this.emitValue());\n useEventListeners(this, this.el, [\"input\", \"change\"], this.emitValue, {debounce: this._debounceTimeout || undefined});\n requestAnimationFrame(() => this.emitValue());\n }\n\n emitValue() {\n let value = (this.el as HTMLInputElement).value;\n\n if (isHTMLInputElement(this.el) && this.el.type === \"checkbox\") {\n value = this.el.checked ? \"true\" : \"false\";\n } else if (isHTMLInputElement(this.el) && this.el.type === \"radio\") {\n let selectedValue = getAllRadiosInGroup(this.el).find(el => el.checked)?.value;\n value = selectedValue ? selectedValue : \"\";\n }\n\n this.dispatchEvent(this.el, signalValueEvent(this._name), {detail: {value}});\n EventBus.emit(signalValueEvent(this._name), {element: this.el, value} as SignalPayload);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {signalConnectEvent, signalValueEvent, signalVisibilityEvent} from \"./events\";\nimport {EventBus} from \"../../utilities\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class SignalVisibilityController extends BaseController {\n\n static values = {\n name: String,\n show: String,\n };\n\n static classes = ['hide'];\n\n declare nameValue: string;\n declare showValue: string;\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.showValue);\n }\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (this.showValue == \"default\") {\n if (value == \"\") {\n this.removeHideClasses(this.el);\n } else {\n this.addHideClasses(this.el);\n }\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.dispatchEvent(this.el, signalVisibilityEvent(this.nameValue, \"show\"), {detail: {predicate: this.showValue, value}});\n this.removeHideClasses(this.el);\n } else {\n this.dispatchEvent(this.el, signalVisibilityEvent(this.nameValue, \"hide\"), {detail: {predicate: this.showValue, value}});\n this.addHideClasses(this.el);\n }\n }\n\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TableSortController extends BaseController {\n\n static values = {startSort: Number};\n\n declare readonly startSortValue: number;\n declare readonly hasStartSortValue: boolean;\n _lastIndex: number | null = null;\n _reverse: boolean = false;\n\n get _tableHead(): HTMLTableSectionElement {\n let head = (this.el as HTMLTableElement).tHead;\n if (head == null) {\n throw new Error('Expected table to have a <thead> element.');\n }\n return head;\n }\n\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\n let rows = this._tableHead.rows;\n if (rows.length == 0) {\n throw new Error('Expected table to have a <thead> element with at least one row.');\n }\n return Array.from(rows[0].cells);\n }\n\n get _tableBody() {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n connect() {\n requestAnimationFrame(() => {\n useCollectionEventListener(this, this._tableHeaders, \"click\", this.sort);\n if (this.hasStartSortValue) {\n this._sortByColumn(this.startSortValue);\n }\n });\n }\n\n sort(event: Event) {\n event.preventDefault();\n let headerCell = event.target! as HTMLTableHeaderCellElement;\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\n if (headerCell.dataset.sortable == \"false\") {\n return;\n }\n if (headerCell.dataset.sort == \"asc\") {\n this._reverse = true;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"desc\";\n this._sortByColumn(headerCellIndex);\n } else {\n this._reverse = false;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"asc\";\n this._sortByColumn(headerCellIndex);\n }\n }\n\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement): number {\n return this._tableHeaders.indexOf(cell);\n }\n\n private _otherHeaderCells(cell: HTMLTableHeaderCellElement): HTMLTableHeaderCellElement[] {\n return Array.from(this._tableHeaders).filter(otherCell => otherCell != cell);\n }\n\n private _sortByColumn(index: number) {\n let frag = document.createDocumentFragment();\n let rows = this._tableRows;\n\n let newRows = rows.sort((row, otherRow) => {\n let cells = Array.from(row.cells);\n let otherCells = Array.from(otherRow.cells);\n\n // TODO: Handle colspans?\n let x = cells[index]?.innerText || \"\";\n let y = otherCells[index]?.innerText || \"\";\n\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\n\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\n return sortVal;\n }\n return -1;\n }\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\n return sortVal;\n }\n return 1;\n }\n\n if (this._reverse) {\n return sortVal > 0 ? -1 : 1;\n }\n return sortVal;\n });\n\n newRows.forEach(row => frag.appendChild(row));\n\n this._tableBody.innerHTML = \"\";\n this._tableBody.appendChild(frag);\n this._lastIndex = index;\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useMutationObserver} from \"../../mixins/use_mutation_observer\";\n\nexport class TableTruncateController extends BaseController {\n\n static targets = [\"showMore\"];\n static values = {\n limit: Number,\n truncated: Boolean,\n };\n\n declare readonly showMoreTarget: HTMLElement;\n declare limitValue: number;\n declare readonly hasLimitValue: boolean;\n declare truncatedValue: boolean;\n declare readonly hasTruncatedValue: boolean;\n\n get _truncated(): boolean {\n return this.hasTruncatedValue ? this.truncatedValue : false;\n }\n\n set _truncated(value) {\n this.truncatedValue = value;\n }\n\n get _tableBody(): HTMLTableSectionElement {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n get _limit(): number {\n return this.hasLimitValue ? this.limitValue : 20;\n }\n\n connect() {\n useMutationObserver(this, this._tableBody, this.mutate, {childList: true});\n\n requestAnimationFrame(() => {\n this.truncate();\n useEventListener(this, this.showMoreTarget, \"click\", this.expand);\n });\n }\n\n truncate(event?: Event) {\n event?.preventDefault();\n this._truncated = true;\n if (this._tableRows.length >= this._limit) {\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n } else {\n this._hideElement(this.showMoreTarget);\n }\n }\n\n expand(event?: Event) {\n this._truncated = false;\n event?.preventDefault();\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._hideElement(this.showMoreTarget);\n }\n\n mutate(entries: MutationRecord[]) {\n if (this._truncated) {\n this._reTruncate();\n }\n }\n\n private _showElement(el: HTMLElement): void {\n el.style.display = \"\";\n }\n\n private _hideElement(el: HTMLElement): void {\n el.style.display = \"none\";\n }\n\n private _reTruncate() {\n this._tableRows.slice(0, this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AlertController extends BaseController {\n\n static values = {message: String};\n\n declare messageValue: string;\n\n alert() {\n alert(this.messageValue);\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useFullscreen} from \"../../mixins\";\n\nexport class FullscreenController extends BaseController {\n\n declare enter: () => void;\n declare exit: () => void;\n declare toggle: () => void;\n\n connect() {\n let {enter, exit, toggle} = useFullscreen(this);\n this.enter = enter;\n this.exit = exit;\n this.toggle = toggle;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\nimport {dispatchEvent} from \"../../utilities/events\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, this.el, this.appear, this.disappear, {threshold: this._threshold});\n }\n\n appear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:appear\");\n };\n\n disappear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:disappear\");\n };\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class IntervalController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n declare readonly hasSecondsValue: boolean;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error('Expected `secondsValue` to be present');\n }\n requestAnimationFrame(() => {\n useInterval(this, this._interval, this.secondsValue * 1000);\n });\n }\n\n _interval() {\n this.dispatchEvent(this.el, \"interval:action\");\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PresenceController extends BaseController {\n\n static values = {name: String};\n\n declare nameValue: string;\n declare readonly hasNameValue: boolean;\n\n get name(): string {\n return this.hasNameValue ? this.nameValue : ``;\n }\n\n get _addedEventName(): string {\n return [this.name, 'presence', 'added'].filter(el => !!el).join(':');\n }\n\n get _removedEventName(): string {\n return [this.name, 'presence', 'removed'].filter(el => !!el).join(':');\n }\n\n connect() {\n this.dispatchEvent(this.el, this._addedEventName);\n }\n\n disconnect() {\n this.dispatchEvent(this.el, this._removedEventName);\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class PrintController extends BaseController {\n\n print(event?: Event) {\n event?.preventDefault();\n window.print();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeoutController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n useTimeout(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n _timeout() {\n this.dispatchEvent(this.el, \"timeout\");\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class UserFocusController extends BaseController {\n\n connect() {\n useEventListener(this, window, [\"focus\", \"blur\"], this._handleVisibility);\n useEventListener(this, document, \"visibilitychange\", this._handleVisibility);\n requestAnimationFrame(() => {\n this._handleVisibility();\n });\n }\n\n appear() {\n this.dispatchEvent(this.el, \"user-focus:active\");\n }\n\n away() {\n this.dispatchEvent(this.el, \"user-focus:away\");\n }\n\n private _handleVisibility() {\n this._documentIsActive() ? this.appear() : this.away();\n }\n\n private _documentIsActive() {\n return document.visibilityState == \"visible\" && document.hasFocus();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class ClockController extends BaseController {\n\n\n static targets = [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"];\n\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n declare readonly hasMillisecondsTarget: boolean;\n declare readonly millisecondsTarget: HTMLElement;\n\n get _tickInterval() {\n if (this.hasMillisecondsTarget) {\n return 1; // 1 ms\n } else if (this.hasSecondsTarget) {\n return 1000; // 1 seconds\n } else if (this.hasMinutesTarget) {\n return 15000; // 15 seconds\n } else {\n return 300000; // Every 5 minutes\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useInterval(this, this._tick, this._tickInterval);\n });\n }\n\n _tick() {\n let current = new Date();\n\n if (this.hasHoursTarget) {\n this.hoursTarget.innerHTML = current\n .getHours()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMinutesTarget) {\n this.minutesTarget.innerHTML = current\n .getMinutes()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasSecondsTarget) {\n this.secondsTarget.innerHTML = current\n .getSeconds()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMillisecondsTarget) {\n this.millisecondsTarget.innerHTML = current\n .getMilliseconds()\n .toString()\n .padStart(3, \"0\");\n }\n }\n}\n","import {Duration, intervalToDuration, isPast} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class CountdownController extends BaseController {\n\n static values = {deadline: String, removeUnused: Boolean};\n static targets = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n static classes = [\"countingDown\", \"ended\"];\n\n // Values\n declare readonly deadlineValue: string;\n declare readonly removeUnusedValue: boolean;\n declare readonly hasRemoveUnusedValue: boolean;\n // Targets\n declare readonly hasYearsTarget: boolean;\n declare readonly yearsTarget: HTMLElement;\n declare readonly hasMonthsTarget: boolean;\n declare readonly monthsTarget: HTMLElement;\n declare readonly hasDaysTarget: boolean;\n declare readonly daysTarget: HTMLElement;\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n // Classes\n declare addEndedClasses: (el?: HTMLElement) => void;\n declare removeEndedClasses: (el?: HTMLElement) => void;\n declare addCountingDownClasses: (el?: HTMLElement) => void;\n declare removeCountingDownClasses: (el?: HTMLElement) => void;\n\n // Instance Data\n _interval: null | ReturnType<typeof window.setInterval> = null;\n\n get _removeUnused(): boolean {\n return this.hasRemoveUnusedValue ? this.removeUnusedValue : false;\n }\n\n\n get _deadlineDate() {\n return new Date(this.deadlineValue);\n }\n\n connect() {\n this._interval = setInterval(this._tick.bind(this), 1000);\n this.addCountingDownClasses();\n }\n\n disconnect() {\n this._clearTick();\n this.removeCountingDownClasses();\n this.removeEndedClasses();\n }\n\n deadlineValueChanged() {\n // Countdown had previously ended, restart ticking. Updating mid-tick will just work.\n if (this._interval == null) {\n this._interval = setInterval(this._tick.bind(this), 1000);\n }\n }\n\n _tick() {\n try {\n const now = new Date();\n let distance: Duration = {};\n\n if (isPast(this._deadlineDate)) {\n distance = {years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0};\n // Countdown has ended, stop ticking\n this._clearTick();\n this.removeCountingDownClasses();\n this.addEndedClasses();\n this.dispatchEvent(this.el, \"countdown:ended\");\n } else {\n distance = intervalToDuration({start: this._deadlineDate, end: now});\n }\n\n if (this.hasYearsTarget) {\n this._updateTarget(this.yearsTarget, this._years(distance));\n }\n if (this.hasMonthsTarget) {\n this._updateTarget(this.monthsTarget, this._months(distance));\n }\n if (this.hasDaysTarget) {\n this._updateTarget(this.daysTarget, this._days(distance));\n }\n if (this.hasHoursTarget) {\n this._updateTarget(this.hoursTarget, this._hours(distance));\n }\n if (this.hasMinutesTarget) {\n this._updateTarget(this.minutesTarget, this._minutes(distance));\n }\n if (this.hasSecondsTarget) {\n this._updateTarget(this.secondsTarget, this._seconds(distance));\n }\n } catch (e) {\n console.error(e);\n this._clearTick();\n }\n }\n\n _clearTick() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _updateTarget(target: HTMLElement, value: number) {\n this._removeTargetIfUnused(target, value);\n target.innerHTML = value.toString();\n }\n\n _removeTargetIfUnused(target: HTMLElement, value: number) {\n if (this._removeUnused) {\n if (value === 0 && target.dataset.unused) {\n if (Number.parseInt(target.dataset.unused) > Date.now() + 1500) {\n target.remove();\n }\n } else if (value == 0) {\n target.dataset.unused = Date.now().toString();\n } else {\n target.dataset.unused = undefined;\n }\n }\n }\n\n _years(duration: Duration): number {\n return duration.years || 0;\n }\n\n _months(duration: Duration): number {\n return duration.months || 0;\n }\n\n _days(duration: Duration): number {\n return duration.days || 0;\n }\n\n _hours(duration: Duration): number {\n return duration.hours || 0;\n }\n\n _minutes(duration: Duration): number {\n return duration.minutes || 0;\n }\n\n _seconds(duration: Duration): number {\n return duration.seconds || 0;\n }\n\n}\n","import {Duration, formatDuration, intervalToDuration, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class DurationController extends BaseController {\n static values = {\n timestamp: Number,\n minutes: Boolean,\n seconds: Boolean,\n };\n\n declare readonly minutesValue: boolean;\n declare readonly hasMinutesValue: boolean;\n declare readonly secondsValue: boolean;\n declare readonly hasSecondsValue: boolean;\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n declare _clearInterval: () => void;\n\n get _format(): string[] {\n return [\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n ...(this._minutes ? [\"minutes\"] : []),\n ...(this._seconds ? [\"seconds\"] : []),\n ];\n }\n\n get _output(): string {\n let {years, months, weeks, days, hours, minutes, seconds} = this._duration;\n\n years ||= 0;\n months ||= 0;\n weeks ||= 0;\n days ||= 0;\n hours ||= 0;\n minutes ||= 0;\n seconds ||= 0;\n\n let largeDenominators = [years, months, weeks, days, hours];\n\n if (!this._minutes && !this._seconds && largeDenominators.every((x) => x === 0)) {\n minutes = minutes + seconds / 60.0;\n return `${(minutes / 60).toFixed(1)} hours`;\n }\n\n return formatDuration(this._duration, {format: this._format, delimiter: \", \"});\n }\n\n get _seconds(): boolean {\n return this.hasSecondsValue ? this.secondsValue : true;\n }\n\n get _minutes(): boolean {\n return this.hasMinutesValue ? this.minutesValue : true;\n }\n\n get _timestamp(): Date {\n if (this.hasTimestampValue) {\n return toDate(this.timestampValue * 1000);\n } else {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n }\n\n get _duration(): Duration {\n return intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _tickInterval() {\n if (this._seconds) {\n return 1000; // 1 seconds\n } else if (this._minutes) {\n return 15000; // 15 seconds\n } else {\n return 120000; // 2 minutes\n }\n }\n\n connect() {\n this._clearInterval = useInterval(this, this._update, this._tickInterval);\n this._update();\n }\n\n\n _update() {\n try {\n this.el.innerHTML = this._output;\n } catch {\n this._clearInterval();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {clamp} from \"lodash-es\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TabsController extends BaseController {\n\n static values = {currentTab: Number, equalize: Boolean};\n static targets = [\"link\", \"content\"];\n static classes = [\"active\", \"hide\"];\n\n declare currentTabValue: number;\n declare hasCurrentTabValue: boolean;\n\n declare equalizeValue: boolean;\n declare hasEqualizeValue: boolean;\n declare readonly linkTargets: HTMLElement[];\n declare readonly contentTargets: HTMLElement[];\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n get defaultActiveClasses(): string[] {\n return [\"is-active\"];\n }\n\n get _currentTab(): number {\n return this.hasCurrentTabValue ? this.currentTabValue : 0;\n }\n\n get _equalize(): boolean {\n return this.hasEqualizeValue ? this.equalizeValue : false;\n }\n\n connect() {\n useCollectionEventListener(this, this.linkTargets, \"click\", this.switchTabs);\n\n if (this._equalize) {\n this._setMinHeight();\n }\n\n this.currentTabValue = this._currentTab;\n }\n\n switchTabs(event: Event) {\n event.preventDefault();\n this.currentTabValue = this.linkTargets.indexOf(event.currentTarget as HTMLElement);\n }\n\n currentTabValueChanged() {\n let index = this._currentTab;\n index = this._clampIndex(index);\n this._selectTab(index);\n }\n\n _selectTab(index: number) {\n index = this._clampIndex(index);\n let links = this.linkTargets;\n let panels = this.contentTargets;\n let activePanel = panels[index];\n let activeLink = links[index];\n let otherPanels = [...panels.slice(0, index), ...panels.slice(index + 1)];\n let otherLinks = [...links.slice(0, index), ...links.slice(index + 1)];\n\n this.addActiveClasses(activeLink);\n activeLink.setAttribute('aria-selected', \"true\");\n\n this.addActiveClasses(activePanel);\n this.removeHideClasses(activePanel);\n\n otherLinks.forEach((link) => {\n link.removeAttribute('aria-selected');\n this.removeActiveClasses(link);\n });\n otherPanels.forEach((panel) => {\n this.removeActiveClasses(panel);\n this.addHideClasses(panel);\n });\n }\n\n _clampIndex(index: number): number {\n return clamp(index, 0, this.contentTargets.length - 1);\n }\n\n _setMinHeight() {\n let minHeight = 0;\n\n // determine the minimum height\n this.contentTargets.forEach((content) => {\n let hidden = content.hasAttribute(\"tab-hidden\");\n if (hidden) {\n this.removeHideClasses(content);\n }\n\n let height = content.offsetHeight;\n if (height > minHeight) {\n minHeight = height;\n }\n\n if (hidden) {\n this.addHideClasses(content);\n }\n });\n\n // apply to all tabs\n this.contentTargets.forEach((content) => content.style.minHeight = minHeight + \"px\");\n }\n\n}\n","import {Duration, formatDistanceToNow, intervalToDuration, isPast, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeDistanceController extends BaseController {\n static values = {\n timestamp: Number,\n };\n\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n\n declare _timestamp: Date;\n\n get _duration(): Duration {\n return isPast(this._timestamp) ? intervalToDuration({start: this._timestamp, end: new Date()}) : intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _nextUpdate(): number | null {\n let duration = this._duration;\n\n if (duration.years && duration.years > 0) {\n return null;\n } else if (duration.months && duration.months > 0) {\n return null;\n } else if (duration.days && duration.days > 0) {\n return null;\n } else if (duration.hours && duration.hours > 0) {\n return 1800000; // Update every 30 mins\n } else {\n return 30000; // Update every 30 seconds\n }\n }\n\n timestampValueChanged() {\n this._timestamp = toDate(this.timestampValue * 1000);\n }\n\n connect() {\n if (!this.hasTimestampValue) {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n this._update();\n }\n\n _update() {\n this.el.innerHTML = formatDistanceToNow(this._timestamp, {\n addSuffix: true,\n includeSeconds: true,\n });\n\n if (this._nextUpdate) {\n useTimeout(this, this._update, this._nextUpdate);\n }\n }\n}\n","import {useMutationObserver} from \"../../mixins/use_mutation_observer\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class TreeViewController extends BaseController {\n\n static classes = [\n \"active\",\n \"collapsed\",\n ];\n\n declare activeClasses: string[];\n declare activeClassesPresent: (el?: HTMLElement) => boolean;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n declare addCollapsedClasses: (el?: HTMLElement) => void;\n declare removeCollapsedClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultCollapsedClasses(): string[] {\n return [\"collapsed\"];\n }\n\n initialize() {\n this._nodeClicked = this._nodeClicked.bind(this);\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this.el, this.mutate, {subtree: true, childList: true});\n this._setup();\n }\n\n disconnect() {\n this._teardown();\n }\n\n _setup() {\n this._setupNode(this.el);\n }\n\n _setupNode(el: HTMLElement) {\n const process = (e: HTMLElement) => {\n let parent = e.parentElement;\n if (parent) {\n if (!this._nodeActive(parent)) {\n this._hideNode(parent);\n }\n parent.removeEventListener(\"click\", this._nodeClicked);\n parent.addEventListener(\"click\", this._nodeClicked);\n }\n };\n if (el.tagName === 'UL' || el.tagName === 'OL') {\n process(el);\n }\n el.querySelectorAll(\"ul, ol\").forEach(e => process(e as HTMLElement));\n }\n\n _teardown() {\n this.el.querySelectorAll(\"ul, ol, li\").forEach((el) => this._teardownNode(el as HTMLElement));\n }\n\n _teardownNode(el: HTMLElement) {\n [el, ...Array.from(el.querySelectorAll('ul, ol, li')) as HTMLElement[]].forEach((x) => {\n x.removeEventListener(\"click\", this._nodeClicked);\n this.removeActiveClasses(x);\n this.removeCollapsedClasses(x);\n });\n }\n\n _nodeClicked(event: MouseEvent) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n let el = event.target as HTMLElement | null;\n\n if (!el || !this._hasNested(el)) {\n return;\n }\n\n if (this._nodeActive(el)) {\n this._hideNode(el);\n } else {\n this._showNode(el);\n }\n }\n\n _nodeActive(el: HTMLElement): boolean {\n return this.activeClassesPresent(el);\n }\n\n _showNode(el: HTMLElement) {\n this.removeCollapsedClasses(el);\n this.addActiveClasses(el);\n }\n\n _hideNode(el: HTMLElement) {\n this.removeActiveClasses(el);\n this.addCollapsedClasses(el);\n }\n\n _hasNested(el: HTMLElement): boolean {\n return el.querySelectorAll(\"ul, ol\").length > 0;\n }\n\n mutate(entries: MutationRecord[]) {\n for (const mutation of entries) {\n if (mutation.type === \"childList\") {\n (Array.from(mutation.addedNodes || []) as HTMLElement[]).forEach(el => this._setupNode(el));\n (Array.from(mutation.removedNodes || []) as HTMLElement[]).forEach(el => this._teardownNode(el));\n }\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class AnchorSpyController extends BaseController {\n static values = {key: String};\n static classes = [\"active\", \"inactive\"];\n\n declare readonly keyValue: string;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeInactiveClasses: (el?: HTMLElement) => void;\n declare addInactiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultInactiveClasses(): string[] {\n return [\"inactive\"];\n }\n\n get _key(): string {\n return this.keyValue.replaceAll('#', '');\n }\n\n get _anchor(): string {\n return window.location.hash.substr(1);\n }\n\n set _anchor(value: string) {\n window.location.hash = value;\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._checkAnchor();\n useEventListener(this, window, 'hashchange', this._checkAnchor);\n });\n }\n\n write(event?: Event) {\n event?.preventDefault();\n this._anchor = this._key;\n }\n\n private _checkAnchor() {\n if (this._key === this._anchor) {\n this.dispatchEvent(this.el, \"anchor-spy:active\");\n this.addActiveClasses(this.el);\n this.removeInactiveClasses(this.el);\n } else {\n this.dispatchEvent(this.el, \"anchor-spy:inactive\");\n this.addInactiveClasses(this.el);\n this.removeActiveClasses(this.el);\n }\n }\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class BackLinkController extends BaseController {\n\n static values = {timeout: Number, pages: Number};\n\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n declare readonly pagesValue: number;\n declare readonly hasPagesValue: boolean;\n\n get _pages(): number {\n return this.hasPagesValue ? Math.abs(this.pagesValue) : 1;\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1500;\n }\n\n connect() {\n useEventListener(this, this.el, \"click\", this.goBack);\n }\n\n goBack(event?: Event) {\n event?.preventDefault();\n history.go(-this._pages);\n if ((this.el as HTMLAnchorElement).href) {\n useTimeout(this, this.fallback, this._timeout);\n }\n }\n\n fallback() {\n window.location.href = (this.el as HTMLAnchorElement).href;\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ClipboardController extends BaseController {\n\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\n static values = {removeUnused: Boolean};\n\n declare readonly sourceTarget: HTMLElement;\n declare readonly copyTarget: HTMLElement;\n declare readonly hasCopyTarget: boolean;\n declare readonly fallbackTarget: HTMLElement;\n declare readonly hasFallbackTarget: boolean;\n\n declare readonly hasRemoveUnusedValue: boolean;\n declare readonly removeUnusedValue: boolean;\n\n _supported = false;\n\n connect() {\n this._supported = document.queryCommandSupported(\"copy\");\n\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\n if (this._supported && this.hasFallbackTarget) {\n this.fallbackTarget.remove();\n } else if (this.hasCopyTarget) {\n this.copyTarget.remove();\n }\n }\n }\n\n select(event: MouseEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n }\n\n copy(event: ClipboardEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n if (this._supported) {\n document.execCommand(\"copy\");\n }\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n get _eventType(): \"submit\" | \"click\" {\n if (isHTMLFormElement(this.el)) {\n return \"submit\";\n } else if (isHTMLAnchorElement(this.el)) {\n return \"click\";\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, this._eventType, this.confirm);\n });\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatchEvent(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {message: String};\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n useEventListener(this, window, \"popstate\", this.confirmNavigation);\n useEventListener(this, window, \"submit\", this.allowSubmit);\n useEventListener(this, window, [\"turbolinks:before-visit\", \"turbo:before-visit\"], this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.onbeforeunload = null;\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: Event | PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isTypeOfButtonableElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useTemporaryContent} from \"../mixins/use_temporary_content\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, [\"click\"], this.disable);\n useEventListener(this, window, [\"turbo:load\", \"turbolinks:load\"], this._enable);\n });\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._disable();\n useTemporaryContent(this, element, this._message, this._timeout, this._enable);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._enable();\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if (isTypeOfButtonableElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _disable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n\nexport class RemoveController extends DismissableController {\n}","import {debounce, get as _get, set as _set} from \"lodash-es\";\nimport {BaseController} from '../utilities/base_controller';\nimport {LocalStorageProxy, useLocalStorage} from \"../mixins\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare _store: LocalStorageProxy<{ [idx: string]: string; }>;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n initialize() {\n this.save = debounce(this.save.bind(this), 300);\n }\n\n connect() {\n this._store = useLocalStorage(this, this._uniqueIdentifier, {});\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n this._store.clear();\n this.dispatchEvent(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n this._store.value = data;\n this.dispatchEvent(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (!this._store.isEmpty()) {\n const savedData = this._store.value; // get and parse the saved data from localStorage\n Object.keys(savedData).forEach(\n (attr: string) => _set(element as HTMLElement, attr, savedData[attr]),\n );\n this.dispatchEvent(element, `element-save:restore:success`);\n } else {\n this.dispatchEvent(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutationObserver} from \"../mixins/use_mutation_observer\";\nimport {BaseController} from \"../utilities/base_controller\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class EmptyDomController extends BaseController {\n\n static targets = [\"container\"];\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare readonly hasContainerTarget: boolean;\n declare readonly containerTarget: HTMLElement;\n\n declare addEmptyClasses: (el?: HTMLElement) => void;\n declare removeEmptyClasses: (el?: HTMLElement) => void;\n declare addNotEmptyClasses: (el?: HTMLElement) => void;\n declare removeNotEmptyClasses: (el?: HTMLElement) => void;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _container() {\n return this.hasContainerTarget ? this.containerTarget : this.el;\n }\n\n get _children(): Element[] {\n let element = this._container;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this._container, this.mutate, {childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this._container;\n let children = this._children;\n if (children.length === 0) {\n this.removeNotEmptyClasses();\n this.addEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:empty\");\n } else {\n this.addNotEmptyClasses();\n this.removeEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {warn} from \"../utilities/logging\";\n\nexport class PrefetchController extends BaseController {\n\n static values = {mode: String};\n\n declare readonly modeValue: \"intersect\" | \"mouseover\";\n declare readonly hasModeValue: boolean;\n\n get _mode(): string {\n return this.hasModeValue ? this.modeValue : \"mouseover\";\n }\n\n get _supportsPrefetch(): boolean {\n const link: HTMLLinkElement = document.createElement('link');\n return link.relList?.supports && link.relList?.supports('prefetch');\n }\n\n get _href(): string {\n return (this.el as HTMLAnchorElement).href;\n }\n\n get _existingPrefetch(): boolean {\n return (document.head.querySelectorAll(`link[rel=\"prefetch\"][href=\"${this._href}\"]`) || []).length > 0;\n }\n\n get _connectionSuitable(): boolean {\n // @ts-ignore\n const connection = navigator.connection;\n\n // no way to know what network state is. Allow prefetching\n if (!connection) {\n return true;\n }\n\n // Don't prefetch if network conditions are poor or user has enabled data-saving mode\n if (connection) {\n // @ts-ignore Experimental API\n if (connection.saveData) {\n warn(this, 'Data Saving is enabled');\n return false;\n }\n\n // @ts-ignore Experimental API\n if (/2g/.test(connection.effectiveType)) {\n warn(this, \"Network is too slow\");\n return false;\n }\n }\n return true;\n }\n\n connect(): void {\n if (!this._supportsPrefetch) {\n return;\n }\n\n switch (this._mode) {\n case \"intersect\":\n this._setupObserver();\n break;\n case \"mouseover\":\n useEventListener(this, this.el, \"mouseover\", this.prefetch, {once: true});\n break;\n default:\n throw new Error(`'${this._mode}' is not a supported prefetch mode`);\n }\n }\n\n _setupObserver(): void {\n const observer: IntersectionObserver = new IntersectionObserver(\n ([entry]: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n if (entry.isIntersecting) {\n this.prefetch();\n observer.unobserve(entry.target);\n }\n },\n );\n observer.observe(this.element);\n }\n\n prefetch() {\n if (this._existingPrefetch || !this._connectionSuitable) {\n return;\n }\n const link: HTMLLinkElement = document.createElement('link');\n Object.assign(link, {rel: 'prefetch', href: this._href, as: 'document'});\n document.head.appendChild(link);\n }\n\n}\n","import {PrintController} from \"./utility/print_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class PrintButtonController extends PrintController {\n\n static classes = [\n 'unsupported',\n ];\n declare addUnsupportedClasses: (el?: HTMLElement) => void;\n\n get defaultUnsupportedClasses(): string[] {\n return [\"unsupported\"];\n }\n\n connect() {\n installClassMethods(this);\n if (!(\"print\" in window)) {\n this.addUnsupportedClasses();\n }\n useEventListener(this, this.el, 'click', this.print);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n connect() {\n useEventListener(this, window, \"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent<ResponsiveIframeMessage>) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useEventListener(this, window, \"resize\", this.postUpdate, {debounce: 200});\n this.postUpdate();\n }\n }\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class SelfDestructController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n // Only start countdown on first paint\n useTimeout(this, () => this.el.remove(), this.secondsValue * 1000);\n });\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useInjectedElement} from \"../mixins/use_injected_html\";\n\nexport class StickyController extends BaseController {\n\n static classes = [\"stuck\"];\n static values = {mode: String};\n\n declare addStuckClasses: (el?: HTMLElement) => void;\n declare removeStuckClasses: (el?: HTMLElement) => void;\n\n declare readonly hasModeValue: \"top\" | \"bottom\";\n declare readonly modeValue: \"top\" | \"bottom\";\n\n _magicElement: HTMLDivElement | null = null;\n\n get defaultStuckClasses(): string[] {\n return [\"stuck\"];\n }\n\n get _mode(): 'beforebegin' | 'afterend' {\n if (this.hasModeValue) {\n if (!['top', 'bottom'].includes(this.modeValue)) {\n throw new Error(`The modeValue provided '${this.modeValue}' is not one of the recognised configuration options`);\n }\n if (this.modeValue === 'top') {\n return 'beforebegin';\n }\n }\n return \"afterend\";\n }\n\n connect() {\n this._magicElement = document.createElement(\"div\");\n useInjectedElement(this, this.el, this._mode, this._magicElement);\n\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (entry.target !== this._magicElement) {\n return;\n }\n if (entry.intersectionRatio === 0) {\n this.addStuckClasses();\n } else if (entry.intersectionRatio === 1) {\n this.removeStuckClasses();\n }\n });\n\n }, {\n threshold: [0, 1],\n });\n observer.observe(this._magicElement!);\n }\n\n}\n","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatchEvent(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {camelCase, get as _get, set as _set} from \"lodash-es\";\nimport {EphemeralController} from \"../utilities/ephemeral_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class TemporaryStateController extends EphemeralController {\n\n static values = {\n attribute: String,\n seconds: Number,\n value: String,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n declare readonly attributeValue: string;\n declare readonly hasAttributeValue: boolean;\n declare readonly valueValue: string;\n declare readonly hasValueValue: boolean;\n _previousState: { [index: string]: any } = {};\n\n get _value(): string {\n if (this.hasValueValue) {\n return this.valueValue;\n }\n throw new Error(\"Expected `valueValue` to be present\");\n }\n\n get _attribute(): string {\n if (this.hasAttributeValue) {\n return this.attributeValue;\n }\n throw new Error(\"Expected `attributeValue` to be present\");\n }\n\n get _seconds(): number {\n if (this.hasSecondsValue) {\n return this.secondsValue * 1000;\n }\n throw new Error(\"Expected `secondsValue` to be present\");\n }\n\n connect() {\n this.setState();\n useTimeout(this, this.removeState, this._seconds);\n }\n\n disconnect() {\n this.removeState();\n }\n\n setState() {\n this._previousState[this._attribute] = _get(this.el, this._attribute);\n _set(this.el, this._attribute, this.valueValue);\n }\n\n removeState() {\n _set(this.el, this._attribute, this._previousState[this._attribute]);\n }\n\n}\n\nexport function applyTemporaryState(element: HTMLElement, propertyString: string, value: any, seconds: number, controllerIdentifier = \"temporary-state\") {\n if (!element.dataset.controller || !element.dataset.controller?.includes(controllerIdentifier)) {\n element.dataset.controller = (element.dataset.controller || '' + ` ${controllerIdentifier} `).trim().replaceAll(' ', ' ');\n }\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-attribute-value`)] = propertyString;\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-seconds-value`)] = seconds.toString();\n}\n\nexport function applyTemporaryClass(element: HTMLElement, value: any, seconds: number) {\n applyTemporaryState(element, 'className', value, seconds);\n}\n","import {Controller} from \"stimulus\";\nimport {isElementInViewport} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useClickOutside(controller: Controller, element: HTMLElement, callback: (event: Event) => void) {\n callback = callback.bind(controller);\n\n const handler = (event: Event) => {\n if (element.contains(event.target as Node) || (!isElementInViewport(element))) {\n return;\n }\n callback(event);\n };\n\n let {teardown} = useEventListener(controller, window, [\"click\", \"touchend\"], handler);\n useMixin(controller, () => void 0, teardown);\n\n return {\n teardown,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useHover(controller: Controller, element: HTMLElement, enter?: ((event: Event) => void) | null, leave?: ((event: Event) => void) | null) {\n let teardownEnter: null | (() => void) = null;\n let teardownLeave: null | (() => void) = null;\n\n if (enter) {\n enter = enter.bind(controller);\n let {teardown: _teardownEnter} = useEventListener(controller, element, \"mouseenter\", enter);\n teardownEnter = _teardownEnter;\n }\n if (leave) {\n leave = leave.bind(controller);\n let {teardown: _teardownLeave} = useEventListener(controller, element, \"mouseleave\", leave);\n teardownLeave = _teardownLeave;\n }\n\n let setup = () => void 0;\n let teardown = () => {\n if (teardownEnter) {\n teardownEnter();\n }\n if (teardownLeave) {\n teardownLeave();\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n teardown,\n };\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {useClickOutside} from \"../mixins/use_click_outside\";\nimport {useHover} from \"../mixins/use_hover\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this, this.el, this.mouseEnter, this.mouseLeave);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this, this.el, this.clickOutside);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","import {controllerMethod} from \"../utilities/stimulus\";\nimport {Controller} from \"stimulus\";\n\nexport interface TrixElementsPayload {\n toolbar: HTMLElement,\n editor: HTMLElement\n}\n\nexport class TrixComposableController extends Controller {\n declare install?: (elements: TrixElementsPayload) => void;\n declare uninstall?: (elements: TrixElementsPayload) => void;\n}\n\nexport function useTrixModifiers(controller: TrixComposableController) {\n // keep a copy of the lifecycle function of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n let observing = false;\n\n let observerCallback = (entries: MutationRecord[], observer: MutationObserver) => {\n entries.forEach(mutation => {\n if (mutation.type === 'childList' && Array.from(mutation.addedNodes).some((el) => (el as HTMLElement).tagName === 'TRIX-TOOLBAR')) {\n attemptSetup();\n observer.disconnect();\n }\n });\n };\n let pasteHandler = (event: Event) => controllerMethod(controller, 'pasteEvent').call(controller, event);\n\n let observer = new MutationObserver(observerCallback);\n\n let attemptSetup = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.addEventListener('trix-paste', pasteHandler);\n\n let toolbar = editorParent.querySelector('trix-toolbar');\n\n if (!observing && !toolbar) {\n // toolbar is not in the DOM yet, wait for it to arrive before running setup\n observing = true;\n observer.observe(editorParent, {childList: true});\n return;\n } else if (!toolbar) {\n // Fallback, in case this runs twice, or mutation observer logic fails\n throw new Error('Could not find an instance of <trix-toolbar> that is a sibling of this <trix-editor>');\n } else {\n // Do not need MutationObserver, all elements are present and correct\n observer.disconnect();\n }\n\n controllerMethod(controller, 'install').call(controller, {toolbar, editor});\n };\n\n let teardown = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.removeEventListener('trix-paste', pasteHandler);\n let toolbar = editorParent.querySelector('trix-toolbar');\n if (!toolbar) {\n throw new Error('Could not find <trix-toolbar> that is a sibling of this <trix-editor> element');\n }\n controllerMethod(controller, 'uninstall').call(controller, {toolbar, editor});\n };\n\n attemptSetup();\n\n Object.assign(controller, {\n disconnect() {\n observer.disconnect();\n teardown();\n controllerMethod(controller, 'uninstall').call({toolbar, editor: controller.element});\n controllerDisconnect();\n },\n });\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {TrixElementsPayload, useTrixModifiers} from \"../mixins/use_trix_modifiers\";\n\ninterface TrixInstallable {\n install: (elements: TrixElementsPayload) => void,\n uninstall: (elements: TrixElementsPayload) => void\n pasteEvent?: (event: TrixPasteEvent) => void\n}\n\ninterface TrixPasteEventPayload {\n dataTransfer: DataTransfer,\n html: string,\n range: [number, number],\n type: string,\n}\n\ninterface TrixPasteEvent extends CustomEvent {\n paste: TrixPasteEventPayload;\n}\n\nexport class TrixModifierController extends BaseController {\n\n get enabledBehaviours(): TrixInstallable[] {\n let enabled = (datasetProp: string | undefined) => datasetProp !== undefined && datasetProp !== 'false';\n let behaviourIfEnabled = (datasetProp: string | undefined, trixInstallable: TrixInstallable) => enabled(datasetProp) ? [trixInstallable] : [];\n return [\n ...(behaviourIfEnabled(this.el.dataset.noBold, this.bold)),\n ...(behaviourIfEnabled(this.el.dataset.noBulletList, this.bulletList)),\n ...(behaviourIfEnabled(this.el.dataset.noCode, this.code)),\n ...(behaviourIfEnabled(this.el.dataset.noHeading, this.heading)),\n ...(behaviourIfEnabled(this.el.dataset.noItalic, this.italic)),\n ...(behaviourIfEnabled(this.el.dataset.noStrikethrough, this.strikethrough)),\n ...(behaviourIfEnabled(this.el.dataset.noLink, this.link)),\n ...(behaviourIfEnabled(this.el.dataset.noIndents, this.indents)),\n ...(behaviourIfEnabled(this.el.dataset.noNumberList, this.numberList)),\n ...(behaviourIfEnabled(this.el.dataset.noQuote, this.quote)),\n ...(behaviourIfEnabled(this.el.dataset.noFileUploads, this.fileUploads)),\n ];\n }\n\n get bold() {\n return this.formattingHandlers('.trix-button--icon-bold', 'bold');\n }\n\n get bulletList() {\n return this.formattingHandlers('.trix-button--icon-bullet-list', 'bullet-list');\n }\n\n get code() {\n return this.formattingHandlers('.trix-button--icon-code', 'code');\n }\n\n get heading() {\n return this.formattingHandlers('.trix-button--icon-heading-1', 'heading');\n }\n\n get italic() {\n return this.formattingHandlers('.trix-button--icon-italic', 'italic');\n }\n\n get strikethrough() {\n return this.formattingHandlers('.trix-button--icon-strike', 'strike');\n }\n\n get link() {\n return this.formattingHandlers('.trix-button--icon-link', 'href');\n }\n\n get indents() {\n return this.simpleHideShowHandlers(\n [\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n ].join(', '),\n );\n }\n\n get numberList() {\n return this.simpleHideShowHandlers('.trix-button--icon-number-list');\n }\n\n get quote() {\n return this.simpleHideShowHandlers('.trix-button--icon-quote');\n }\n\n get fileUploads() {\n let selector = '.trix-button-group.trix-button-group--file-tools';\n let preventUploads = (e: Event) => e?.preventDefault();\n let self = this;\n let element = this.el as HTMLElement & { editor: any };\n return {\n install(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).install(elements);\n self.el.addEventListener('trix-file-accept', preventUploads);\n },\n pasteEvent(event: TrixPasteEvent) {\n let {dataTransfer, html} = event.paste;\n let {editor} = element;\n if (dataTransfer.files.length > 0 || html.includes('<img')) {\n alert('The content you pasted contains images and/or files. File uploads are not supported.');\n editor.undo();\n }\n },\n uninstall(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).uninstall(elements);\n self.el.removeEventListener('trix-file-accept', preventUploads);\n },\n };\n }\n\n connect() {\n useTrixModifiers(this);\n }\n\n install(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.install(elements));\n }\n\n pasteEvent(event: TrixPasteEvent) {\n this.enabledBehaviours.forEach(behaviour => behaviour.pasteEvent && behaviour.pasteEvent(event));\n }\n\n uninstall(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.uninstall(elements));\n }\n\n simpleHideShowHandlers(selector: string) {\n return {\n install: ({toolbar}: TrixElementsPayload) => this.hideToolbarSelector(toolbar, selector),\n uninstall: ({toolbar}: TrixElementsPayload) => this.showToolbarSelector(toolbar, selector),\n };\n }\n\n formattingHandlers(selector: string, trixAttribute: string) {\n let element = this.el as HTMLElement & { editor: any };\n let {editor} = element;\n return {\n install: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).install(elements);\n },\n pasteEvent(pasteEvent: TrixPasteEvent) {\n let {range} = pasteEvent.paste;\n let prevRange = element.editor.getSelectedRange();\n\n editor.setSelectedRange(range);\n editor.deactivateAttribute(trixAttribute);\n editor.setSelectedRange(prevRange);\n },\n uninstall: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).uninstall(elements);\n },\n };\n }\n\n showToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = '');\n }\n\n hideToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = 'none');\n }\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided <turbo-frame> element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a <turbo-frame> element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => useTimeout(this, this.refresh, this.intervalValue));\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n"],"names":["Controller","camelCase","debounce","upperFirst","clamp","isPast","intervalToDuration","formatDuration","toDate","formatDistanceToNow","_get","_set"],"mappings":"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"}