phoenix_live_view 1.1.2 → 1.1.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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../assets/js/phoenix_live_view/index.ts", "../../assets/js/phoenix_live_view/constants.js", "../../assets/js/phoenix_live_view/entry_uploader.js", "../../assets/js/phoenix_live_view/utils.js", "../../assets/js/phoenix_live_view/browser.js", "../../assets/js/phoenix_live_view/dom.js", "../../assets/js/phoenix_live_view/upload_entry.js", "../../assets/js/phoenix_live_view/live_uploader.js", "../../assets/js/phoenix_live_view/aria.js", "../../assets/js/phoenix_live_view/hooks.js", "../../assets/js/phoenix_live_view/element_ref.js", "../../assets/js/phoenix_live_view/dom_post_morph_restorer.js", "../../node_modules/morphdom/dist/morphdom-esm.js", "../../assets/js/phoenix_live_view/dom_patch.js", "../../assets/js/phoenix_live_view/rendered.js", "../../assets/js/phoenix_live_view/js.js", "../../assets/js/phoenix_live_view/js_commands.ts", "../../assets/js/phoenix_live_view/view_hook.ts", "../../assets/js/phoenix_live_view/view.js", "../../assets/js/phoenix_live_view/live_socket.js"],
4
- "sourcesContent": ["/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n*/\n\nimport OriginalLiveSocket, { isUsedInput } from \"./live_socket\";\nimport DOM from \"./dom\";\nimport { ViewHook } from \"./view_hook\";\nimport View from \"./view\";\n\nimport type { LiveSocketJSCommands } from \"./js_commands\";\nimport type { Hook, HooksOptions } from \"./view_hook\";\nimport type { Socket as PhoenixSocket } from \"phoenix\";\n\n/**\n * Options for configuring the LiveSocket instance.\n */\nexport interface LiveSocketOptions {\n /**\n * Defaults for phx-debounce and phx-throttle.\n */\n defaults?: {\n /** The millisecond phx-debounce time. Defaults 300 */\n debounce?: number;\n /** The millisecond phx-throttle time. Defaults 300 */\n throttle?: number;\n };\n /**\n * An object or function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n * (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n */\n params?:\n | ((el: HTMLElement) => { [key: string]: any })\n | { [key: string]: any };\n /**\n * The optional prefix to use for all phx DOM annotations.\n *\n * Defaults to \"phx-\".\n */\n bindingPrefix?: string;\n /**\n * Callbacks for LiveView hooks.\n *\n * See [Client hooks via `phx-hook`](https://hexdocs.pm/phoenix_live_view/js-interop.html#client-hooks-via-phx-hook) for more information.\n */\n hooks?: HooksOptions;\n /** Callbacks for LiveView uploaders. */\n uploaders?: { [key: string]: any }; // TODO: define more specifically\n /** Delay in milliseconds before applying loading states. */\n loaderTimeout?: number;\n /** Delay in milliseconds before executing phx-disconnected commands. */\n disconnectedTimeout?: number;\n /** Maximum reloads before entering failsafe mode. */\n maxReloads?: number;\n /** Minimum time between normal reload attempts. */\n reloadJitterMin?: number;\n /** Maximum time between normal reload attempts. */\n reloadJitterMax?: number;\n /** Time between reload attempts in failsafe mode. */\n failsafeJitter?: number;\n /**\n * Function to log debug information. For example:\n *\n * (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n */\n viewLogger?: (view: View, kind: string, msg: string, obj: any) => void;\n /**\n * Object mapping event names to functions for populating event metadata.\n *\n * metadata: {\n * click: (e, el) => {\n * return {\n * ctrlKey: e.ctrlKey,\n * metaKey: e.metaKey,\n * detail: e.detail || 1,\n * }\n * },\n * keydown: (e, el) => {\n * return {\n * key: e.key,\n * ctrlKey: e.ctrlKey,\n * metaKey: e.metaKey,\n * shiftKey: e.shiftKey\n * }\n * }\n * }\n *\n */\n metadata?: { [eventName: string]: (e: Event, el: HTMLElement) => object };\n /**\n * An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`. For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.\n *\n * Example usage:\n *\n * class InMemoryStorage {\n * constructor() { this.storage = {} }\n * getItem(keyName) { return this.storage[keyName] || null }\n * removeItem(keyName) { delete this.storage[keyName] }\n * setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n * }\n */\n sessionStorage?: Storage;\n /**\n * An optional Storage compatible object\n * Useful when LiveView won't have access to `localStorage`.\n *\n * See `sessionStorage` for an example.\n */\n localStorage?: Storage;\n /**\n * If set to `true`, `phx-change` events will be blocked (will not fire)\n * while the user is composing input using an IME (Input Method Editor).\n * This is determined by the `e.isComposing` property on keyboard events,\n * which is `true` when the user is in the process of entering composed characters (for example,\n * when typing Japanese or Chinese using romaji or pinyin input methods).\n * By default, `phx-change` will not be blocked during a composition session,\n * but note that there were issues reported in older versions of Safari,\n * where a LiveView patch to the input caused unexpected behavior.\n *\n * For more information, see\n * - https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n * - https://github.com/phoenixframework/phoenix_live_view/issues/3322\n *\n * Defaults to `false`.\n */\n blockPhxChangeWhileComposing?: boolean;\n /** DOM callbacks. */\n dom?: {\n /**\n * An optional function to modify the behavior of querying elements in JS commands.\n * @param sourceEl - The source element, e.g. the button that was clicked.\n * @param query - The query value.\n * @param defaultQuery - A default query function that can be used if no custom query should be applied.\n * @returns A list of DOM elements.\n */\n jsQuerySelectorAll?: (\n sourceEl: HTMLElement,\n query: string,\n defaultQuery: () => Element[],\n ) => Element[];\n /**\n * Called immediately before a DOM patch is applied.\n */\n onPatchStart?: (container: HTMLElement) => void;\n /**\n * Called immediately after a DOM patch is applied.\n */\n onPatchEnd?: (container: HTMLElement) => void;\n /**\n * Called when a new DOM node is added.\n */\n onNodeAdded?: (node: Node) => void;\n /**\n * Called before an element is updated.\n */\n onBeforeElUpdated?: (fromEl: Element, toEl: Element) => void;\n };\n /** Allow passthrough of other options to the Phoenix Socket constructor. */\n [key: string]: any;\n}\n\n/**\n * Interface describing the public API of a LiveSocket instance.\n */\nexport interface LiveSocketInstanceInterface {\n /**\n * Returns the version of the LiveView client.\n */\n version(): string;\n /**\n * Returns true if profiling is enabled. See `enableProfiling` and `disableProfiling`.\n */\n isProfileEnabled(): boolean;\n /**\n * Returns true if debugging is enabled. See `enableDebug` and `disableDebug`.\n */\n isDebugEnabled(): boolean;\n /**\n * Returns true if debugging is disabled. See `enableDebug` and `disableDebug`.\n */\n isDebugDisabled(): boolean;\n /**\n * Enables debugging.\n *\n * When debugging is enabled, the LiveView client will log debug information to the console.\n * See [Debugging client events](https://hexdocs.pm/phoenix_live_view/js-interop.html#debugging-client-events) for more information.\n */\n enableDebug(): void;\n /**\n * Enables profiling.\n *\n * When profiling is enabled, the LiveView client will log profiling information to the console.\n */\n enableProfiling(): void;\n /**\n * Disables debugging.\n */\n disableDebug(): void;\n /**\n * Disables profiling.\n */\n disableProfiling(): void;\n /**\n * Enables latency simulation.\n *\n * When latency simulation is enabled, the LiveView client will add a delay to requests and responses from the server.\n * See [Simulating Latency](https://hexdocs.pm/phoenix_live_view/js-interop.html#simulating-latency) for more information.\n */\n enableLatencySim(upperBoundMs: number): void;\n /**\n * Disables latency simulation.\n */\n disableLatencySim(): void;\n /**\n * Returns the current latency simulation upper bound.\n */\n getLatencySim(): number | null;\n /**\n * Returns the Phoenix Socket instance.\n */\n getSocket(): PhoenixSocket;\n /**\n * Connects to the LiveView server.\n */\n connect(): void;\n /**\n * Disconnects from the LiveView server.\n */\n disconnect(callback?: () => void): void;\n /**\n * Can be used to replace the transport used by the underlying Phoenix Socket.\n */\n replaceTransport(transport: any): void;\n /**\n * Executes an encoded JS command, targeting the given element.\n *\n * See [`Phoenix.LiveView.JS`](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.JS.html) for more information.\n */\n execJS(el: HTMLElement, encodedJS: string, eventType?: string | null): void;\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n *\n * See [JavaScript interoperability](https://hexdocs.pm/phoenix_live_view/js-interop.html) for more information.\n */\n js(): LiveSocketJSCommands;\n}\n\n/**\n * Interface describing the LiveSocket constructor.\n */\nexport interface LiveSocketConstructor {\n /**\n * Creates a new LiveSocket instance.\n *\n * @param endpoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n * `\"/live\"` (inherited host & protocol)\n * @param socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n * import {Socket} from \"phoenix\"\n * import {LiveSocket} from \"phoenix_live_view\"\n * let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param opts - Optional configuration.\n */\n new (\n endpoint: string,\n socket: typeof PhoenixSocket,\n opts?: LiveSocketOptions,\n ): LiveSocketInstanceInterface;\n}\n\n// because LiveSocket is in JS (for now), we cast it to our defined TypeScript constructor.\nconst LiveSocket = OriginalLiveSocket as unknown as LiveSocketConstructor;\n\n/** Creates a hook instance for the given element and callbacks.\n *\n * @param el - The element to associate with the hook.\n * @param callbacks - The list of hook callbacks, such as mounted,\n * updated, destroyed, etc.\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n * connectedCallback(){\n * let onLiveViewMounted = () => this.hook.pushEvent(...))\n * this.hook = createHook(this, {mounted: onLiveViewMounted})\n * }\n * }\n *\n * @returns Returns the Hook instance for the custom element.\n */\nfunction createHook(el: HTMLElement, callbacks: Hook): ViewHook {\n let existingHook = DOM.getCustomElHook(el);\n if (existingHook) {\n return existingHook;\n }\n\n let hook = new ViewHook(View.closestView(el), el, callbacks);\n DOM.putCustomElHook(el, hook);\n return hook;\n}\n\nexport { LiveSocket, isUsedInput, createHook, ViewHook, Hook, HooksOptions };\n", "export const CONSECUTIVE_RELOADS = \"consecutive-reloads\";\nexport const MAX_RELOADS = 10;\nexport const RELOAD_JITTER_MIN = 5000;\nexport const RELOAD_JITTER_MAX = 10000;\nexport const FAILSAFE_JITTER = 30000;\nexport const PHX_EVENT_CLASSES = [\n \"phx-click-loading\",\n \"phx-change-loading\",\n \"phx-submit-loading\",\n \"phx-keydown-loading\",\n \"phx-keyup-loading\",\n \"phx-blur-loading\",\n \"phx-focus-loading\",\n \"phx-hook-loading\",\n];\nexport const PHX_COMPONENT = \"data-phx-component\";\nexport const PHX_VIEW_REF = \"data-phx-view\";\nexport const PHX_LIVE_LINK = \"data-phx-link\";\nexport const PHX_TRACK_STATIC = \"track-static\";\nexport const PHX_LINK_STATE = \"data-phx-link-state\";\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\";\nexport const PHX_REF_SRC = \"data-phx-ref-src\";\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\";\nexport const PHX_PENDING_REFS = \"phx-pending-refs\";\nexport const PHX_TRACK_UPLOADS = \"track-uploads\";\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\";\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\";\nexport const PHX_DONE_REFS = \"data-phx-done-refs\";\nexport const PHX_DROP_TARGET = \"drop-target\";\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\";\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\";\nexport const PHX_SKIP = \"data-phx-skip\";\nexport const PHX_MAGIC_ID = \"data-phx-id\";\nexport const PHX_PRUNE = \"data-phx-prune\";\nexport const PHX_CONNECTED_CLASS = \"phx-connected\";\nexport const PHX_LOADING_CLASS = \"phx-loading\";\nexport const PHX_ERROR_CLASS = \"phx-error\";\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\";\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\";\nexport const PHX_PARENT_ID = \"data-phx-parent-id\";\nexport const PHX_MAIN = \"data-phx-main\";\nexport const PHX_ROOT_ID = \"data-phx-root-id\";\nexport const PHX_VIEWPORT_TOP = \"viewport-top\";\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\";\nexport const PHX_TRIGGER_ACTION = \"trigger-action\";\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\";\nexport const FOCUSABLE_INPUTS = [\n \"text\",\n \"textarea\",\n \"number\",\n \"email\",\n \"password\",\n \"search\",\n \"tel\",\n \"url\",\n \"date\",\n \"time\",\n \"datetime-local\",\n \"color\",\n \"range\",\n];\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"];\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\";\nexport const PHX_SESSION = \"data-phx-session\";\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`;\nexport const PHX_STICKY = \"data-phx-sticky\";\nexport const PHX_STATIC = \"data-phx-static\";\nexport const PHX_READONLY = \"data-phx-readonly\";\nexport const PHX_DISABLED = \"data-phx-disabled\";\nexport const PHX_DISABLE_WITH = \"disable-with\";\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\";\nexport const PHX_HOOK = \"hook\";\nexport const PHX_DEBOUNCE = \"debounce\";\nexport const PHX_THROTTLE = \"throttle\";\nexport const PHX_UPDATE = \"update\";\nexport const PHX_STREAM = \"stream\";\nexport const PHX_STREAM_REF = \"data-phx-stream\";\nexport const PHX_PORTAL = \"data-phx-portal\";\nexport const PHX_TELEPORTED_REF = \"data-phx-teleported\";\nexport const PHX_TELEPORTED_SRC = \"data-phx-teleported-src\";\nexport const PHX_RUNTIME_HOOK = \"data-phx-runtime-hook\";\nexport const PHX_LV_PID = \"data-phx-pid\";\nexport const PHX_KEY = \"key\";\nexport const PHX_PRIVATE = \"phxPrivate\";\nexport const PHX_AUTO_RECOVER = \"auto-recover\";\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\";\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\";\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\";\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\";\nexport const PHX_PROGRESS = \"progress\";\nexport const PHX_MOUNTED = \"mounted\";\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\";\nexport const LOADER_TIMEOUT = 1;\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3;\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200;\nexport const DISCONNECTED_TIMEOUT = 500;\nexport const BINDING_PREFIX = \"phx-\";\nexport const PUSH_TIMEOUT = 30000;\nexport const LINK_HEADER = \"x-requested-with\";\nexport const RESPONSE_URL_HEADER = \"x-response-url\";\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\";\nexport const THROTTLED = \"throttled\";\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\";\nexport const DEFAULTS = {\n debounce: 300,\n throttle: 300,\n};\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK];\n// Rendered\nexport const STATIC = \"s\";\nexport const ROOT = \"r\";\nexport const COMPONENTS = \"c\";\nexport const KEYED = \"k\";\nexport const KEYED_COUNT = \"kc\";\nexport const EVENTS = \"e\";\nexport const REPLY = \"r\";\nexport const TITLE = \"t\";\nexport const TEMPLATES = \"p\";\nexport const STREAM = \"stream\";\n", "import { logError } from \"./utils\";\n\nexport default class EntryUploader {\n constructor(entry, config, liveSocket) {\n const { chunk_size, chunk_timeout } = config;\n this.liveSocket = liveSocket;\n this.entry = entry;\n this.offset = 0;\n this.chunkSize = chunk_size;\n this.chunkTimeout = chunk_timeout;\n this.chunkTimer = null;\n this.errored = false;\n this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {\n token: entry.metadata(),\n });\n }\n\n error(reason) {\n if (this.errored) {\n return;\n }\n this.uploadChannel.leave();\n this.errored = true;\n clearTimeout(this.chunkTimer);\n this.entry.error(reason);\n }\n\n upload() {\n this.uploadChannel.onError((reason) => this.error(reason));\n this.uploadChannel\n .join()\n .receive(\"ok\", (_data) => this.readNextChunk())\n .receive(\"error\", (reason) => this.error(reason));\n }\n\n isDone() {\n return this.offset >= this.entry.file.size;\n }\n\n readNextChunk() {\n const reader = new window.FileReader();\n const blob = this.entry.file.slice(\n this.offset,\n this.chunkSize + this.offset,\n );\n reader.onload = (e) => {\n if (e.target.error === null) {\n this.offset += /** @type {ArrayBuffer} */ (e.target.result).byteLength;\n this.pushChunk(/** @type {ArrayBuffer} */ (e.target.result));\n } else {\n return logError(\"Read error: \" + e.target.error);\n }\n };\n reader.readAsArrayBuffer(blob);\n }\n\n pushChunk(chunk) {\n if (!this.uploadChannel.isJoined()) {\n return;\n }\n this.uploadChannel\n .push(\"chunk\", chunk, this.chunkTimeout)\n .receive(\"ok\", () => {\n this.entry.progress((this.offset / this.entry.file.size) * 100);\n if (!this.isDone()) {\n this.chunkTimer = setTimeout(\n () => this.readNextChunk(),\n this.liveSocket.getLatencySim() || 0,\n );\n }\n })\n .receive(\"error\", ({ reason }) => this.error(reason));\n }\n}\n", "import { PHX_VIEW_SELECTOR } from \"./constants\";\n\nimport EntryUploader from \"./entry_uploader\";\n\nexport const logError = (msg, obj) => console.error && console.error(msg, obj);\n\nexport const isCid = (cid) => {\n const type = typeof cid;\n return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid));\n};\n\nexport function detectDuplicateIds() {\n const ids = new Set();\n const elems = document.querySelectorAll(\"*[id]\");\n for (let i = 0, len = elems.length; i < len; i++) {\n if (ids.has(elems[i].id)) {\n console.error(\n `Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`,\n );\n } else {\n ids.add(elems[i].id);\n }\n }\n}\n\nexport function detectInvalidStreamInserts(inserts) {\n const errors = new Set();\n Object.keys(inserts).forEach((id) => {\n const streamEl = document.getElementById(id);\n if (\n streamEl &&\n streamEl.parentElement &&\n streamEl.parentElement.getAttribute(\"phx-update\") !== \"stream\"\n ) {\n errors.add(\n `The stream container with id \"${streamEl.parentElement.id}\" is missing the phx-update=\"stream\" attribute. Ensure it is set for streams to work properly.`,\n );\n }\n });\n errors.forEach((error) => console.error(error));\n}\n\nexport const debug = (view, kind, msg, obj) => {\n if (view.liveSocket.isDebugEnabled()) {\n console.log(`${view.id} ${kind}: ${msg} - `, obj);\n }\n};\n\n// wraps value in closure or returns closure\nexport const closure = (val) =>\n typeof val === \"function\"\n ? val\n : function () {\n return val;\n };\n\nexport const clone = (obj) => {\n return JSON.parse(JSON.stringify(obj));\n};\n\nexport const closestPhxBinding = (el, binding, borderEl) => {\n do {\n if (el.matches(`[${binding}]`) && !el.disabled) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (\n el !== null &&\n el.nodeType === 1 &&\n !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR))\n );\n return null;\n};\n\nexport const isObject = (obj) => {\n return obj !== null && typeof obj === \"object\" && !(obj instanceof Array);\n};\n\nexport const isEqualObj = (obj1, obj2) =>\n JSON.stringify(obj1) === JSON.stringify(obj2);\n\nexport const isEmpty = (obj) => {\n for (const x in obj) {\n return false;\n }\n return true;\n};\n\nexport const maybe = (el, callback) => el && callback(el);\n\nexport const channelUploader = function (entries, onError, resp, liveSocket) {\n entries.forEach((entry) => {\n const entryUploader = new EntryUploader(entry, resp.config, liveSocket);\n entryUploader.upload();\n });\n};\n", "const Browser = {\n canPushState() {\n return typeof history.pushState !== \"undefined\";\n },\n\n dropLocal(localStorage, namespace, subkey) {\n return localStorage.removeItem(this.localKey(namespace, subkey));\n },\n\n updateLocal(localStorage, namespace, subkey, initial, func) {\n const current = this.getLocal(localStorage, namespace, subkey);\n const key = this.localKey(namespace, subkey);\n const newVal = current === null ? initial : func(current);\n localStorage.setItem(key, JSON.stringify(newVal));\n return newVal;\n },\n\n getLocal(localStorage, namespace, subkey) {\n return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)));\n },\n\n updateCurrentState(callback) {\n if (!this.canPushState()) {\n return;\n }\n history.replaceState(\n callback(history.state || {}),\n \"\",\n window.location.href,\n );\n },\n\n pushState(kind, meta, to) {\n if (this.canPushState()) {\n if (to !== window.location.href) {\n if (meta.type == \"redirect\" && meta.scroll) {\n // If we're redirecting store the current scrollY for the current history state.\n const currentState = history.state || {};\n currentState.scroll = meta.scroll;\n history.replaceState(currentState, \"\", window.location.href);\n }\n\n delete meta.scroll; // Only store the scroll in the redirect case.\n history[kind + \"State\"](meta, \"\", to || null); // IE will coerce undefined to string\n\n // when using navigate, we'd call pushState immediately before patching the DOM,\n // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n // therefore we wait for the next frame (after the DOM patch) and only then try\n // to scroll to the hashEl\n window.requestAnimationFrame(() => {\n const hashEl = this.getHashTargetEl(window.location.hash);\n\n if (hashEl) {\n hashEl.scrollIntoView();\n } else if (meta.type === \"redirect\") {\n window.scroll(0, 0);\n }\n });\n }\n } else {\n this.redirect(to);\n }\n },\n\n setCookie(name, value, maxAgeSeconds) {\n const expires =\n typeof maxAgeSeconds === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\";\n document.cookie = `${name}=${value};${expires} path=/`;\n },\n\n getCookie(name) {\n return document.cookie.replace(\n new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`),\n \"$1\",\n );\n },\n\n deleteCookie(name) {\n document.cookie = `${name}=; max-age=-1; path=/`;\n },\n\n redirect(\n toURL,\n flash,\n navigate = (url) => {\n window.location.href = url;\n },\n ) {\n if (flash) {\n this.setCookie(\"__phoenix_flash__\", flash, 60);\n }\n navigate(toURL);\n },\n\n localKey(namespace, subkey) {\n return `${namespace}-${subkey}`;\n },\n\n getHashTargetEl(maybeHash) {\n const hash = maybeHash.toString().substring(1);\n if (hash === \"\") {\n return;\n }\n return (\n document.getElementById(hash) ||\n document.querySelector(`a[name=\"${hash}\"]`)\n );\n },\n};\n\nexport default Browser;\n", "import {\n CHECKABLE_INPUTS,\n DEBOUNCE_PREV_KEY,\n DEBOUNCE_TRIGGER,\n FOCUSABLE_INPUTS,\n PHX_COMPONENT,\n PHX_VIEW_REF,\n PHX_TELEPORTED_REF,\n PHX_HAS_FOCUSED,\n PHX_HAS_SUBMITTED,\n PHX_MAIN,\n PHX_PARENT_ID,\n PHX_PRIVATE,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_PENDING_ATTRS,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_STATIC,\n PHX_UPLOAD_REF,\n PHX_VIEW_SELECTOR,\n PHX_STICKY,\n PHX_EVENT_CLASSES,\n THROTTLED,\n PHX_PORTAL,\n PHX_STREAM,\n} from \"./constants\";\n\nimport { logError } from \"./utils\";\n\nconst DOM = {\n byId(id) {\n return document.getElementById(id) || logError(`no id found for ${id}`);\n },\n\n removeClass(el, className) {\n el.classList.remove(className);\n if (el.classList.length === 0) {\n el.removeAttribute(\"class\");\n }\n },\n\n all(node, query, callback) {\n if (!node) {\n return [];\n }\n const array = Array.from(node.querySelectorAll(query));\n if (callback) {\n array.forEach(callback);\n }\n return array;\n },\n\n childNodeLength(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content.childElementCount;\n },\n\n isUploadInput(el) {\n return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null;\n },\n\n isAutoUpload(inputEl) {\n return inputEl.hasAttribute(\"data-phx-auto-upload\");\n },\n\n findUploadInputs(node) {\n const formId = node.id;\n const inputsOutsideForm = this.all(\n document,\n `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`,\n );\n return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(\n inputsOutsideForm,\n );\n },\n\n findComponentNodeList(viewId, cid, doc = document) {\n return this.all(\n doc,\n `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}=\"${cid}\"]`,\n );\n },\n\n isPhxDestroyed(node) {\n return node.id && DOM.private(node, \"destroyed\") ? true : false;\n },\n\n wantsNewTab(e) {\n const wantsNewTab =\n e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1);\n const isDownload =\n e.target instanceof HTMLAnchorElement &&\n e.target.hasAttribute(\"download\");\n const isTargetBlank =\n e.target.hasAttribute(\"target\") &&\n e.target.getAttribute(\"target\").toLowerCase() === \"_blank\";\n const isTargetNamedTab =\n e.target.hasAttribute(\"target\") &&\n !e.target.getAttribute(\"target\").startsWith(\"_\");\n return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab;\n },\n\n isUnloadableFormSubmit(e) {\n // Ignore form submissions intended to close a native <dialog> element\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n const isDialogSubmit =\n (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\");\n\n if (isDialogSubmit) {\n return false;\n } else {\n return !e.defaultPrevented && !this.wantsNewTab(e);\n }\n },\n\n isNewPageClick(e, currentLocation) {\n const href =\n e.target instanceof HTMLAnchorElement\n ? e.target.getAttribute(\"href\")\n : null;\n let url;\n\n if (e.defaultPrevented || href === null || this.wantsNewTab(e)) {\n return false;\n }\n if (href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return false;\n }\n if (e.target.isContentEditable) {\n return false;\n }\n\n try {\n url = new URL(href);\n } catch {\n try {\n url = new URL(href, currentLocation);\n } catch {\n // bad URL, fallback to let browser try it as external\n return true;\n }\n }\n\n if (\n url.host === currentLocation.host &&\n url.protocol === currentLocation.protocol\n ) {\n if (\n url.pathname === currentLocation.pathname &&\n url.search === currentLocation.search\n ) {\n return url.hash === \"\" && !url.href.endsWith(\"#\");\n }\n }\n return url.protocol.startsWith(\"http\");\n },\n\n markPhxChildDestroyed(el) {\n if (this.isPhxChild(el)) {\n el.setAttribute(PHX_SESSION, \"\");\n }\n this.putPrivate(el, \"destroyed\", true);\n },\n\n findPhxChildrenInFragment(html, parentId) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return this.findPhxChildren(template.content, parentId);\n },\n\n isIgnored(el, phxUpdate) {\n return (\n (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) ===\n \"ignore\"\n );\n },\n\n isPhxUpdate(el, phxUpdate, updateTypes) {\n return (\n el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n );\n },\n\n findPhxSticky(el) {\n return this.all(el, `[${PHX_STICKY}]`);\n },\n\n findPhxChildren(el, parentId) {\n return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`);\n },\n\n findExistingParentCIDs(viewId, cids) {\n // we only want to find parents that exist on the page\n // if a cid is not on the page, the only way it can be added back to the page\n // is if a parent adds it back, therefore if a cid does not exist on the page,\n // we should not try to render it by itself (because it would be rendered twice,\n // one by the parent, and a second time by itself)\n const parentCids = new Set();\n const childrenCids = new Set();\n\n cids.forEach((cid) => {\n this.all(\n document,\n `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}=\"${cid}\"]`,\n ).forEach((parent) => {\n parentCids.add(cid);\n this.all(parent, `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}]`)\n .map((el) => parseInt(el.getAttribute(PHX_COMPONENT)))\n .forEach((childCID) => childrenCids.add(childCID));\n });\n });\n\n childrenCids.forEach((childCid) => parentCids.delete(childCid));\n\n return parentCids;\n },\n\n private(el, key) {\n return el[PHX_PRIVATE] && el[PHX_PRIVATE][key];\n },\n\n deletePrivate(el, key) {\n el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key];\n },\n\n putPrivate(el, key, value) {\n if (!el[PHX_PRIVATE]) {\n el[PHX_PRIVATE] = {};\n }\n el[PHX_PRIVATE][key] = value;\n },\n\n updatePrivate(el, key, defaultVal, updateFunc) {\n const existing = this.private(el, key);\n if (existing === undefined) {\n this.putPrivate(el, key, updateFunc(defaultVal));\n } else {\n this.putPrivate(el, key, updateFunc(existing));\n }\n },\n\n syncPendingAttrs(fromEl, toEl) {\n if (!fromEl.hasAttribute(PHX_REF_SRC)) {\n return;\n }\n PHX_EVENT_CLASSES.forEach((className) => {\n fromEl.classList.contains(className) && toEl.classList.add(className);\n });\n PHX_PENDING_ATTRS.filter((attr) => fromEl.hasAttribute(attr)).forEach(\n (attr) => {\n toEl.setAttribute(attr, fromEl.getAttribute(attr));\n },\n );\n },\n\n copyPrivates(target, source) {\n if (source[PHX_PRIVATE]) {\n target[PHX_PRIVATE] = source[PHX_PRIVATE];\n }\n },\n\n putTitle(str) {\n const titleEl = document.querySelector(\"title\");\n if (titleEl) {\n const { prefix, suffix, default: defaultTitle } = titleEl.dataset;\n const isEmpty = typeof str !== \"string\" || str.trim() === \"\";\n if (isEmpty && typeof defaultTitle !== \"string\") {\n return;\n }\n\n const inner = isEmpty ? defaultTitle : str;\n document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`;\n } else {\n document.title = str;\n }\n },\n\n debounce(\n el,\n event,\n phxDebounce,\n defaultDebounce,\n phxThrottle,\n defaultThrottle,\n asyncFilter,\n callback,\n ) {\n let debounce = el.getAttribute(phxDebounce);\n let throttle = el.getAttribute(phxThrottle);\n\n if (debounce === \"\") {\n debounce = defaultDebounce;\n }\n if (throttle === \"\") {\n throttle = defaultThrottle;\n }\n const value = debounce || throttle;\n switch (value) {\n case null:\n return callback();\n\n case \"blur\":\n this.incCycle(el, \"debounce-blur-cycle\", () => {\n if (asyncFilter()) {\n callback();\n }\n });\n if (this.once(el, \"debounce-blur\")) {\n el.addEventListener(\"blur\", () =>\n this.triggerCycle(el, \"debounce-blur-cycle\"),\n );\n }\n return;\n\n default:\n const timeout = parseInt(value);\n const trigger = () =>\n throttle ? this.deletePrivate(el, THROTTLED) : callback();\n const currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger);\n if (isNaN(timeout)) {\n return logError(`invalid throttle/debounce value: ${value}`);\n }\n if (throttle) {\n let newKeyDown = false;\n if (event.type === \"keydown\") {\n const prevKey = this.private(el, DEBOUNCE_PREV_KEY);\n this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key);\n newKeyDown = prevKey !== event.key;\n }\n\n if (!newKeyDown && this.private(el, THROTTLED)) {\n return false;\n } else {\n callback();\n const t = setTimeout(() => {\n if (asyncFilter()) {\n this.triggerCycle(el, DEBOUNCE_TRIGGER);\n }\n }, timeout);\n this.putPrivate(el, THROTTLED, t);\n }\n } else {\n setTimeout(() => {\n if (asyncFilter()) {\n this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle);\n }\n }, timeout);\n }\n\n const form = el.form;\n if (form && this.once(form, \"bind-debounce\")) {\n form.addEventListener(\"submit\", () => {\n Array.from(new FormData(form).entries(), ([name]) => {\n const input = form.querySelector(`[name=\"${name}\"]`);\n this.incCycle(input, DEBOUNCE_TRIGGER);\n this.deletePrivate(input, THROTTLED);\n });\n });\n }\n if (this.once(el, \"bind-debounce\")) {\n el.addEventListener(\"blur\", () => {\n // because we trigger the callback here,\n // we also clear the throttle timeout to prevent the callback\n // from being called again after the timeout fires\n clearTimeout(this.private(el, THROTTLED));\n this.triggerCycle(el, DEBOUNCE_TRIGGER);\n });\n }\n }\n },\n\n triggerCycle(el, key, currentCycle) {\n const [cycle, trigger] = this.private(el, key);\n if (!currentCycle) {\n currentCycle = cycle;\n }\n if (currentCycle === cycle) {\n this.incCycle(el, key);\n trigger();\n }\n },\n\n once(el, key) {\n if (this.private(el, key) === true) {\n return false;\n }\n this.putPrivate(el, key, true);\n return true;\n },\n\n incCycle(el, key, trigger = function () {}) {\n let [currentCycle] = this.private(el, key) || [0, trigger];\n currentCycle++;\n this.putPrivate(el, key, [currentCycle, trigger]);\n return currentCycle;\n },\n\n // maintains or adds privately used hook information\n // fromEl and toEl can be the same element in the case of a newly added node\n // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom) {\n // maintain the hooks created with createHook\n if (\n fromEl.hasAttribute &&\n fromEl.hasAttribute(\"data-phx-hook\") &&\n !toEl.hasAttribute(\"data-phx-hook\")\n ) {\n toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"));\n }\n // add hooks to elements with viewport attributes\n if (\n toEl.hasAttribute &&\n (toEl.hasAttribute(phxViewportTop) ||\n toEl.hasAttribute(phxViewportBottom))\n ) {\n toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\");\n }\n },\n\n putCustomElHook(el, hook) {\n if (el.isConnected) {\n el.setAttribute(\"data-phx-hook\", \"\");\n } else {\n console.error(`\n hook attached to non-connected DOM element\n ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n `);\n }\n this.putPrivate(el, \"custom-el-hook\", hook);\n },\n\n getCustomElHook(el) {\n return this.private(el, \"custom-el-hook\");\n },\n\n isUsedInput(el) {\n return (\n el.nodeType === Node.ELEMENT_NODE &&\n (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED))\n );\n },\n\n resetForm(form) {\n Array.from(form.elements).forEach((input) => {\n this.deletePrivate(input, PHX_HAS_FOCUSED);\n this.deletePrivate(input, PHX_HAS_SUBMITTED);\n });\n },\n\n isPhxChild(node) {\n return node.getAttribute && node.getAttribute(PHX_PARENT_ID);\n },\n\n isPhxSticky(node) {\n return node.getAttribute && node.getAttribute(PHX_STICKY) !== null;\n },\n\n isChildOfAny(el, parents) {\n return !!parents.find((parent) => parent.contains(el));\n },\n\n firstPhxChild(el) {\n return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0];\n },\n\n isPortalTemplate(el) {\n return el.tagName === \"TEMPLATE\" && el.hasAttribute(PHX_PORTAL);\n },\n\n closestViewEl(el) {\n // find the closest portal or view element, whichever comes first\n const portalOrViewEl = el.closest(\n `[${PHX_TELEPORTED_REF}],${PHX_VIEW_SELECTOR}`,\n );\n if (!portalOrViewEl) {\n return null;\n }\n if (portalOrViewEl.hasAttribute(PHX_TELEPORTED_REF)) {\n // PHX_TELEPORTED_REF is set to the id of the view that owns the portal element\n return this.byId(portalOrViewEl.getAttribute(PHX_TELEPORTED_REF));\n } else if (portalOrViewEl.hasAttribute(PHX_SESSION)) {\n return portalOrViewEl;\n }\n return null;\n },\n\n dispatchEvent(target, name, opts = {}) {\n let defaultBubble = true;\n const isUploadTarget =\n target.nodeName === \"INPUT\" && target.type === \"file\";\n if (isUploadTarget && name === \"click\") {\n defaultBubble = false;\n }\n const bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles;\n const eventOpts = {\n bubbles: bubbles,\n cancelable: true,\n detail: opts.detail || {},\n };\n const event =\n name === \"click\"\n ? new MouseEvent(\"click\", eventOpts)\n : new CustomEvent(name, eventOpts);\n target.dispatchEvent(event);\n },\n\n cloneNode(node, html) {\n if (typeof html === \"undefined\") {\n return node.cloneNode(true);\n } else {\n const cloned = node.cloneNode(false);\n cloned.innerHTML = html;\n return cloned;\n }\n },\n\n // merge attributes from source to target\n // if an element is ignored, we only merge data attributes\n // including removing data attributes that are no longer in the source\n mergeAttrs(target, source, opts = {}) {\n const exclude = new Set(opts.exclude || []);\n const isIgnored = opts.isIgnored;\n const sourceAttrs = source.attributes;\n for (let i = sourceAttrs.length - 1; i >= 0; i--) {\n const name = sourceAttrs[i].name;\n if (!exclude.has(name)) {\n const sourceValue = source.getAttribute(name);\n if (\n target.getAttribute(name) !== sourceValue &&\n (!isIgnored || (isIgnored && name.startsWith(\"data-\")))\n ) {\n target.setAttribute(name, sourceValue);\n }\n } else {\n // We exclude the value from being merged on focused inputs, because the\n // user's input should always win.\n // We can still assign it as long as the value property is the same, though.\n // This prevents a situation where the updated hook is not being triggered\n // when an input is back in its \"original state\", because the attribute\n // was never changed, see:\n // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n if (name === \"value\" && target.value === source.value) {\n // actually set the value attribute to sync it with the value property\n target.setAttribute(\"value\", source.getAttribute(name));\n }\n }\n }\n\n const targetAttrs = target.attributes;\n for (let i = targetAttrs.length - 1; i >= 0; i--) {\n const name = targetAttrs[i].name;\n if (isIgnored) {\n if (\n name.startsWith(\"data-\") &&\n !source.hasAttribute(name) &&\n !PHX_PENDING_ATTRS.includes(name)\n ) {\n target.removeAttribute(name);\n }\n } else {\n if (!source.hasAttribute(name)) {\n target.removeAttribute(name);\n }\n }\n }\n },\n\n mergeFocusedInput(target, source) {\n // skip selects because FF will reset highlighted index for any setAttribute\n if (!(target instanceof HTMLSelectElement)) {\n DOM.mergeAttrs(target, source, { exclude: [\"value\"] });\n }\n\n if (source.readOnly) {\n target.setAttribute(\"readonly\", true);\n } else {\n target.removeAttribute(\"readonly\");\n }\n },\n\n hasSelectionRange(el) {\n return (\n el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n );\n },\n\n restoreFocus(focused, selectionStart, selectionEnd) {\n if (focused instanceof HTMLSelectElement) {\n focused.focus();\n }\n if (!DOM.isTextualInput(focused)) {\n return;\n }\n\n const wasFocused = focused.matches(\":focus\");\n if (!wasFocused) {\n focused.focus();\n }\n if (this.hasSelectionRange(focused)) {\n focused.setSelectionRange(selectionStart, selectionEnd);\n }\n },\n\n isFormInput(el) {\n if (el.localName && customElements.get(el.localName)) {\n // Custom Elements may be form associated. This allows them\n // to participate within a form's lifecycle, including form\n // validity and form submissions.\n // The spec for Form Associated custom elements requires the\n // custom element's class to contain a static boolean value of `formAssociated`\n // which identifies this class as allowed to associate to a form.\n // See https://html.spec.whatwg.org/dev/custom-elements.html#custom-elements-face-example\n // for details.\n return customElements.get(el.localName)[`formAssociated`];\n }\n\n return (\n /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\"\n );\n },\n\n syncAttrsToProps(el) {\n if (\n el instanceof HTMLInputElement &&\n CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0\n ) {\n el.checked = el.getAttribute(\"checked\") !== null;\n }\n },\n\n isTextualInput(el) {\n return FOCUSABLE_INPUTS.indexOf(el.type) >= 0;\n },\n\n isNowTriggerFormExternal(el, phxTriggerExternal) {\n return (\n el.getAttribute &&\n el.getAttribute(phxTriggerExternal) !== null &&\n document.body.contains(el)\n );\n },\n\n cleanChildNodes(container, phxUpdate) {\n if (\n DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\", PHX_STREAM])\n ) {\n const toRemove = [];\n container.childNodes.forEach((childNode) => {\n if (!childNode.id) {\n // Skip warning if it's an empty text node (e.g. a new-line)\n const isEmptyTextNode =\n childNode.nodeType === Node.TEXT_NODE &&\n childNode.nodeValue.trim() === \"\";\n if (!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE) {\n logError(\n \"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`,\n );\n }\n toRemove.push(childNode);\n }\n });\n toRemove.forEach((childNode) => childNode.remove());\n }\n },\n\n replaceRootContainer(container, tagName, attrs) {\n const retainedAttrs = new Set([\n \"id\",\n PHX_SESSION,\n PHX_STATIC,\n PHX_MAIN,\n PHX_ROOT_ID,\n ]);\n if (container.tagName.toLowerCase() === tagName.toLowerCase()) {\n Array.from(container.attributes)\n .filter((attr) => !retainedAttrs.has(attr.name.toLowerCase()))\n .forEach((attr) => container.removeAttribute(attr.name));\n\n Object.keys(attrs)\n .filter((name) => !retainedAttrs.has(name.toLowerCase()))\n .forEach((attr) => container.setAttribute(attr, attrs[attr]));\n\n return container;\n } else {\n const newContainer = document.createElement(tagName);\n Object.keys(attrs).forEach((attr) =>\n newContainer.setAttribute(attr, attrs[attr]),\n );\n retainedAttrs.forEach((attr) =>\n newContainer.setAttribute(attr, container.getAttribute(attr)),\n );\n newContainer.innerHTML = container.innerHTML;\n container.replaceWith(newContainer);\n return newContainer;\n }\n },\n\n getSticky(el, name, defaultVal) {\n const op = (DOM.private(el, \"sticky\") || []).find(\n ([existingName]) => name === existingName,\n );\n if (op) {\n const [_name, _op, stashedResult] = op;\n return stashedResult;\n } else {\n return typeof defaultVal === \"function\" ? defaultVal() : defaultVal;\n }\n },\n\n deleteSticky(el, name) {\n this.updatePrivate(el, \"sticky\", [], (ops) => {\n return ops.filter(([existingName, _]) => existingName !== name);\n });\n },\n\n putSticky(el, name, op) {\n const stashedResult = op(el);\n this.updatePrivate(el, \"sticky\", [], (ops) => {\n const existingIndex = ops.findIndex(\n ([existingName]) => name === existingName,\n );\n if (existingIndex >= 0) {\n ops[existingIndex] = [name, op, stashedResult];\n } else {\n ops.push([name, op, stashedResult]);\n }\n return ops;\n });\n },\n\n applyStickyOperations(el) {\n const ops = DOM.private(el, \"sticky\");\n if (!ops) {\n return;\n }\n\n ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op));\n },\n\n isLocked(el) {\n return el.hasAttribute && el.hasAttribute(PHX_REF_LOCK);\n },\n};\n\nexport default DOM;\n", "import {\n PHX_ACTIVE_ENTRY_REFS,\n PHX_LIVE_FILE_UPDATED,\n PHX_PREFLIGHTED_REFS,\n} from \"./constants\";\n\nimport { channelUploader, logError } from \"./utils\";\n\nimport LiveUploader from \"./live_uploader\";\n\nexport default class UploadEntry {\n static isActive(fileEl, file) {\n const isNew = file._phxRef === undefined;\n const activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\");\n const isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;\n return file.size > 0 && (isNew || isActive);\n }\n\n static isPreflighted(fileEl, file) {\n const preflightedRefs = fileEl\n .getAttribute(PHX_PREFLIGHTED_REFS)\n .split(\",\");\n const isPreflighted =\n preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;\n return isPreflighted && this.isActive(fileEl, file);\n }\n\n static isPreflightInProgress(file) {\n return file._preflightInProgress === true;\n }\n\n static markPreflightInProgress(file) {\n file._preflightInProgress = true;\n }\n\n constructor(fileEl, file, view, autoUpload) {\n this.ref = LiveUploader.genFileRef(file);\n this.fileEl = fileEl;\n this.file = file;\n this.view = view;\n this.meta = null;\n this._isCancelled = false;\n this._isDone = false;\n this._progress = 0;\n this._lastProgressSent = -1;\n this._onDone = function () {};\n this._onElUpdated = this.onElUpdated.bind(this);\n this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n this.autoUpload = autoUpload;\n }\n\n metadata() {\n return this.meta;\n }\n\n progress(progress) {\n this._progress = Math.floor(progress);\n if (this._progress > this._lastProgressSent) {\n if (this._progress >= 100) {\n this._progress = 100;\n this._lastProgressSent = 100;\n this._isDone = true;\n this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n LiveUploader.untrackFile(this.fileEl, this.file);\n this._onDone();\n });\n } else {\n this._lastProgressSent = this._progress;\n this.view.pushFileProgress(this.fileEl, this.ref, this._progress);\n }\n }\n }\n\n isCancelled() {\n return this._isCancelled;\n }\n\n cancel() {\n this.file._preflightInProgress = false;\n this._isCancelled = true;\n this._isDone = true;\n this._onDone();\n }\n\n isDone() {\n return this._isDone;\n }\n\n error(reason = \"failed\") {\n this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n this.view.pushFileProgress(this.fileEl, this.ref, { error: reason });\n if (!this.isAutoUpload()) {\n LiveUploader.clearFiles(this.fileEl);\n }\n }\n\n isAutoUpload() {\n return this.autoUpload;\n }\n\n //private\n\n onDone(callback) {\n this._onDone = () => {\n this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n callback();\n };\n }\n\n onElUpdated() {\n const activeRefs = this.fileEl\n .getAttribute(PHX_ACTIVE_ENTRY_REFS)\n .split(\",\");\n if (activeRefs.indexOf(this.ref) === -1) {\n LiveUploader.untrackFile(this.fileEl, this.file);\n this.cancel();\n }\n }\n\n toPreflightPayload() {\n return {\n last_modified: this.file.lastModified,\n name: this.file.name,\n relative_path: this.file.webkitRelativePath,\n size: this.file.size,\n type: this.file.type,\n ref: this.ref,\n meta: typeof this.file.meta === \"function\" ? this.file.meta() : undefined,\n };\n }\n\n uploader(uploaders) {\n if (this.meta.uploader) {\n const callback =\n uploaders[this.meta.uploader] ||\n logError(`no uploader configured for ${this.meta.uploader}`);\n return { name: this.meta.uploader, callback: callback };\n } else {\n return { name: \"channel\", callback: channelUploader };\n }\n }\n\n zipPostFlight(resp) {\n this.meta = resp.entries[this.ref];\n if (!this.meta) {\n logError(`no preflight upload response returned with ref ${this.ref}`, {\n input: this.fileEl,\n response: resp,\n });\n }\n }\n}\n", "import {\n PHX_DONE_REFS,\n PHX_PREFLIGHTED_REFS,\n PHX_UPLOAD_REF,\n} from \"./constants\";\n\nimport {} from \"./utils\";\n\nimport DOM from \"./dom\";\nimport UploadEntry from \"./upload_entry\";\n\nlet liveUploaderFileRef = 0;\n\nexport default class LiveUploader {\n static genFileRef(file) {\n const ref = file._phxRef;\n if (ref !== undefined) {\n return ref;\n } else {\n file._phxRef = (liveUploaderFileRef++).toString();\n return file._phxRef;\n }\n }\n\n static getEntryDataURL(inputEl, ref, callback) {\n const file = this.activeFiles(inputEl).find(\n (file) => this.genFileRef(file) === ref,\n );\n callback(URL.createObjectURL(file));\n }\n\n static hasUploadsInProgress(formEl) {\n let active = 0;\n DOM.findUploadInputs(formEl).forEach((input) => {\n if (\n input.getAttribute(PHX_PREFLIGHTED_REFS) !==\n input.getAttribute(PHX_DONE_REFS)\n ) {\n active++;\n }\n });\n return active > 0;\n }\n\n static serializeUploads(inputEl) {\n const files = this.activeFiles(inputEl);\n const fileData = {};\n files.forEach((file) => {\n const entry = { path: inputEl.name };\n const uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF);\n fileData[uploadRef] = fileData[uploadRef] || [];\n entry.ref = this.genFileRef(file);\n entry.last_modified = file.lastModified;\n entry.name = file.name || entry.ref;\n entry.relative_path = file.webkitRelativePath;\n entry.type = file.type;\n entry.size = file.size;\n if (typeof file.meta === \"function\") {\n entry.meta = file.meta();\n }\n fileData[uploadRef].push(entry);\n });\n return fileData;\n }\n\n static clearFiles(inputEl) {\n inputEl.value = null;\n inputEl.removeAttribute(PHX_UPLOAD_REF);\n DOM.putPrivate(inputEl, \"files\", []);\n }\n\n static untrackFile(inputEl, file) {\n DOM.putPrivate(\n inputEl,\n \"files\",\n DOM.private(inputEl, \"files\").filter((f) => !Object.is(f, file)),\n );\n }\n\n /**\n * @param {HTMLInputElement} inputEl\n * @param {Array<File|Blob>} files\n * @param {DataTransfer} [dataTransfer]\n */\n static trackFiles(inputEl, files, dataTransfer) {\n if (inputEl.getAttribute(\"multiple\") !== null) {\n const newFiles = files.filter(\n (file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)),\n );\n DOM.updatePrivate(inputEl, \"files\", [], (existing) =>\n existing.concat(newFiles),\n );\n inputEl.value = null;\n } else {\n // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n if (dataTransfer && dataTransfer.files.length > 0) {\n inputEl.files = dataTransfer.files;\n }\n DOM.putPrivate(inputEl, \"files\", files);\n }\n }\n\n static activeFileInputs(formEl) {\n const fileInputs = DOM.findUploadInputs(formEl);\n return Array.from(fileInputs).filter(\n (el) => el.files && this.activeFiles(el).length > 0,\n );\n }\n\n static activeFiles(input) {\n return (DOM.private(input, \"files\") || []).filter((f) =>\n UploadEntry.isActive(input, f),\n );\n }\n\n static inputsAwaitingPreflight(formEl) {\n const fileInputs = DOM.findUploadInputs(formEl);\n return Array.from(fileInputs).filter(\n (input) => this.filesAwaitingPreflight(input).length > 0,\n );\n }\n\n static filesAwaitingPreflight(input) {\n return this.activeFiles(input).filter(\n (f) =>\n !UploadEntry.isPreflighted(input, f) &&\n !UploadEntry.isPreflightInProgress(f),\n );\n }\n\n static markPreflightInProgress(entries) {\n entries.forEach((entry) => UploadEntry.markPreflightInProgress(entry.file));\n }\n\n constructor(inputEl, view, onComplete) {\n this.autoUpload = DOM.isAutoUpload(inputEl);\n this.view = view;\n this.onComplete = onComplete;\n this._entries = Array.from(\n LiveUploader.filesAwaitingPreflight(inputEl) || [],\n ).map((file) => new UploadEntry(inputEl, file, view, this.autoUpload));\n\n // prevent sending duplicate preflight requests\n LiveUploader.markPreflightInProgress(this._entries);\n\n this.numEntriesInProgress = this._entries.length;\n }\n\n isAutoUpload() {\n return this.autoUpload;\n }\n\n entries() {\n return this._entries;\n }\n\n initAdapterUpload(resp, onError, liveSocket) {\n this._entries = this._entries.map((entry) => {\n if (entry.isCancelled()) {\n this.numEntriesInProgress--;\n if (this.numEntriesInProgress === 0) {\n this.onComplete();\n }\n } else {\n entry.zipPostFlight(resp);\n entry.onDone(() => {\n this.numEntriesInProgress--;\n if (this.numEntriesInProgress === 0) {\n this.onComplete();\n }\n });\n }\n return entry;\n });\n\n const groupedEntries = this._entries.reduce((acc, entry) => {\n if (!entry.meta) {\n return acc;\n }\n const { name, callback } = entry.uploader(liveSocket.uploaders);\n acc[name] = acc[name] || { callback: callback, entries: [] };\n acc[name].entries.push(entry);\n return acc;\n }, {});\n\n for (const name in groupedEntries) {\n const { callback, entries } = groupedEntries[name];\n callback(entries, onError, resp, liveSocket);\n }\n }\n}\n", "const ARIA = {\n anyOf(instance, classes) {\n return classes.find((name) => instance instanceof name);\n },\n\n isFocusable(el, interactiveOnly) {\n return (\n (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n (el instanceof HTMLAreaElement && el.href !== undefined) ||\n (!el.disabled &&\n this.anyOf(el, [\n HTMLInputElement,\n HTMLSelectElement,\n HTMLTextAreaElement,\n HTMLButtonElement,\n ])) ||\n el instanceof HTMLIFrameElement ||\n (el.tabIndex >= 0 && el.getAttribute(\"aria-hidden\") !== \"true\") ||\n (!interactiveOnly &&\n el.getAttribute(\"tabindex\") !== null &&\n el.getAttribute(\"aria-hidden\") !== \"true\")\n );\n },\n\n attemptFocus(el, interactiveOnly) {\n if (this.isFocusable(el, interactiveOnly)) {\n try {\n el.focus();\n } catch {\n // that's fine\n }\n }\n return !!document.activeElement && document.activeElement.isSameNode(el);\n },\n\n focusFirstInteractive(el) {\n let child = el.firstElementChild;\n while (child) {\n if (this.attemptFocus(child, true) || this.focusFirstInteractive(child)) {\n return true;\n }\n child = child.nextElementSibling;\n }\n },\n\n focusFirst(el) {\n let child = el.firstElementChild;\n while (child) {\n if (this.attemptFocus(child) || this.focusFirst(child)) {\n return true;\n }\n child = child.nextElementSibling;\n }\n },\n\n focusLast(el) {\n let child = el.lastElementChild;\n while (child) {\n if (this.attemptFocus(child) || this.focusLast(child)) {\n return true;\n }\n child = child.previousElementSibling;\n }\n },\n};\nexport default ARIA;\n", "import {\n PHX_ACTIVE_ENTRY_REFS,\n PHX_LIVE_FILE_UPDATED,\n PHX_PREFLIGHTED_REFS,\n PHX_UPLOAD_REF,\n} from \"./constants\";\n\nimport LiveUploader from \"./live_uploader\";\nimport ARIA from \"./aria\";\n\nconst Hooks = {\n LiveFileUpload: {\n activeRefs() {\n return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS);\n },\n\n preflightedRefs() {\n return this.el.getAttribute(PHX_PREFLIGHTED_REFS);\n },\n\n mounted() {\n this.preflightedWas = this.preflightedRefs();\n },\n\n updated() {\n const newPreflights = this.preflightedRefs();\n if (this.preflightedWas !== newPreflights) {\n this.preflightedWas = newPreflights;\n if (newPreflights === \"\") {\n this.__view().cancelSubmit(this.el.form);\n }\n }\n\n if (this.activeRefs() === \"\") {\n this.el.value = null;\n }\n this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED));\n },\n },\n\n LiveImgPreview: {\n mounted() {\n this.ref = this.el.getAttribute(\"data-phx-entry-ref\");\n this.inputEl = document.getElementById(\n this.el.getAttribute(PHX_UPLOAD_REF),\n );\n LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => {\n this.url = url;\n this.el.src = url;\n });\n },\n destroyed() {\n URL.revokeObjectURL(this.url);\n },\n },\n FocusWrap: {\n mounted() {\n this.focusStart = this.el.firstElementChild;\n this.focusEnd = this.el.lastElementChild;\n this.focusStart.addEventListener(\"focus\", (e) => {\n if (!e.relatedTarget || !this.el.contains(e.relatedTarget)) {\n // Handle focus entering from outside (e.g. Tab when body is focused)\n // https://github.com/phoenixframework/phoenix_live_view/issues/3636\n const nextFocus = e.target.nextElementSibling;\n ARIA.attemptFocus(nextFocus) || ARIA.focusFirst(nextFocus);\n } else {\n ARIA.focusLast(this.el);\n }\n });\n this.focusEnd.addEventListener(\"focus\", (e) => {\n if (!e.relatedTarget || !this.el.contains(e.relatedTarget)) {\n // Handle focus entering from outside (e.g. Shift+Tab when body is focused)\n // https://github.com/phoenixframework/phoenix_live_view/issues/3636\n const nextFocus = e.target.previousElementSibling;\n ARIA.attemptFocus(nextFocus) || ARIA.focusLast(nextFocus);\n } else {\n ARIA.focusFirst(this.el);\n }\n });\n // only try to change the focus if it is not already inside\n if (!this.el.contains(document.activeElement)) {\n this.el.addEventListener(\"phx:show-end\", () => this.el.focus());\n if (window.getComputedStyle(this.el).display !== \"none\") {\n ARIA.focusFirst(this.el);\n }\n }\n },\n },\n};\n\nconst findScrollContainer = (el) => {\n // the scroll event won't be fired on the html/body element even if overflow is set\n // therefore we return null to instead listen for scroll events on document\n if ([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null;\n if ([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0)\n return el;\n return findScrollContainer(el.parentElement);\n};\n\nconst scrollTop = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.scrollTop;\n } else {\n return document.documentElement.scrollTop || document.body.scrollTop;\n }\n};\n\nconst bottom = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.getBoundingClientRect().bottom;\n } else {\n // when we have no container, the whole page scrolls,\n // therefore the bottom coordinate is the viewport height\n return window.innerHeight || document.documentElement.clientHeight;\n }\n};\n\nconst top = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.getBoundingClientRect().top;\n } else {\n // when we have no container the whole page scrolls,\n // therefore the top coordinate is 0\n return 0;\n }\n};\n\nconst isAtViewportTop = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.top) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.top) <= bottom(scrollContainer)\n );\n};\n\nconst isAtViewportBottom = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.bottom) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.bottom) <= bottom(scrollContainer)\n );\n};\n\nconst isWithinViewport = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.top) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.top) <= bottom(scrollContainer)\n );\n};\n\nHooks.InfiniteScroll = {\n mounted() {\n this.scrollContainer = findScrollContainer(this.el);\n let scrollBefore = scrollTop(this.scrollContainer);\n let topOverran = false;\n const throttleInterval = 500;\n let pendingOp = null;\n\n const onTopOverrun = this.throttle(\n throttleInterval,\n (topEvent, firstChild) => {\n pendingOp = () => true;\n this.liveSocket.js().push(this.el, topEvent, {\n value: { id: firstChild.id, _overran: true },\n callback: () => {\n pendingOp = null;\n },\n });\n },\n );\n\n const onFirstChildAtTop = this.throttle(\n throttleInterval,\n (topEvent, firstChild) => {\n pendingOp = () => firstChild.scrollIntoView({ block: \"start\" });\n this.liveSocket.js().push(this.el, topEvent, {\n value: { id: firstChild.id },\n callback: () => {\n pendingOp = null;\n // make sure that the DOM is patched by waiting for the next tick\n window.requestAnimationFrame(() => {\n if (!isWithinViewport(firstChild, this.scrollContainer)) {\n firstChild.scrollIntoView({ block: \"start\" });\n }\n });\n },\n });\n },\n );\n\n const onLastChildAtBottom = this.throttle(\n throttleInterval,\n (bottomEvent, lastChild) => {\n pendingOp = () => lastChild.scrollIntoView({ block: \"end\" });\n this.liveSocket.js().push(this.el, bottomEvent, {\n value: { id: lastChild.id },\n callback: () => {\n pendingOp = null;\n // make sure that the DOM is patched by waiting for the next tick\n window.requestAnimationFrame(() => {\n if (!isWithinViewport(lastChild, this.scrollContainer)) {\n lastChild.scrollIntoView({ block: \"end\" });\n }\n });\n },\n });\n },\n );\n\n this.onScroll = (_e) => {\n const scrollNow = scrollTop(this.scrollContainer);\n\n if (pendingOp) {\n scrollBefore = scrollNow;\n return pendingOp();\n }\n const rect = this.el.getBoundingClientRect();\n const topEvent = this.el.getAttribute(\n this.liveSocket.binding(\"viewport-top\"),\n );\n const bottomEvent = this.el.getAttribute(\n this.liveSocket.binding(\"viewport-bottom\"),\n );\n const lastChild = this.el.lastElementChild;\n const firstChild = this.el.firstElementChild;\n const isScrollingUp = scrollNow < scrollBefore;\n const isScrollingDown = scrollNow > scrollBefore;\n\n // el overran while scrolling up\n if (isScrollingUp && topEvent && !topOverran && rect.top >= 0) {\n topOverran = true;\n onTopOverrun(topEvent, firstChild);\n } else if (isScrollingDown && topOverran && rect.top <= 0) {\n topOverran = false;\n }\n\n if (\n topEvent &&\n isScrollingUp &&\n isAtViewportTop(firstChild, this.scrollContainer)\n ) {\n onFirstChildAtTop(topEvent, firstChild);\n } else if (\n bottomEvent &&\n isScrollingDown &&\n isAtViewportBottom(lastChild, this.scrollContainer)\n ) {\n onLastChildAtBottom(bottomEvent, lastChild);\n }\n scrollBefore = scrollNow;\n };\n\n if (this.scrollContainer) {\n this.scrollContainer.addEventListener(\"scroll\", this.onScroll);\n } else {\n window.addEventListener(\"scroll\", this.onScroll);\n }\n },\n\n destroyed() {\n if (this.scrollContainer) {\n this.scrollContainer.removeEventListener(\"scroll\", this.onScroll);\n } else {\n window.removeEventListener(\"scroll\", this.onScroll);\n }\n },\n\n throttle(interval, callback) {\n let lastCallAt = 0;\n let timer;\n\n return (...args) => {\n const now = Date.now();\n const remainingTime = interval - (now - lastCallAt);\n\n if (remainingTime <= 0 || remainingTime > interval) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastCallAt = now;\n callback(...args);\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCallAt = Date.now();\n timer = null;\n callback(...args);\n }, remainingTime);\n }\n };\n },\n};\nexport default Hooks;\n", "import {\n PHX_REF_LOADING,\n PHX_REF_LOCK,\n PHX_REF_SRC,\n PHX_PENDING_REFS,\n PHX_EVENT_CLASSES,\n PHX_DISABLED,\n PHX_READONLY,\n PHX_DISABLE_WITH_RESTORE,\n} from \"./constants\";\n\nimport DOM from \"./dom\";\n\nexport default class ElementRef {\n static onUnlock(el, callback) {\n if (!DOM.isLocked(el) && !el.closest(`[${PHX_REF_LOCK}]`)) {\n return callback();\n }\n const closestLock = el.closest(`[${PHX_REF_LOCK}]`);\n const ref = closestLock\n .closest(`[${PHX_REF_LOCK}]`)\n .getAttribute(PHX_REF_LOCK);\n closestLock.addEventListener(\n `phx:undo-lock:${ref}`,\n () => {\n callback();\n },\n { once: true },\n );\n }\n\n constructor(el) {\n this.el = el;\n this.loadingRef = el.hasAttribute(PHX_REF_LOADING)\n ? parseInt(el.getAttribute(PHX_REF_LOADING), 10)\n : null;\n this.lockRef = el.hasAttribute(PHX_REF_LOCK)\n ? parseInt(el.getAttribute(PHX_REF_LOCK), 10)\n : null;\n }\n\n // public\n\n maybeUndo(ref, phxEvent, eachCloneCallback) {\n if (!this.isWithin(ref)) {\n // we cannot undo the lock / loading now, as there is a newer one already set;\n // we need to store the original ref we tried to send the undo event later\n DOM.updatePrivate(this.el, PHX_PENDING_REFS, [], (pendingRefs) => {\n pendingRefs.push(ref);\n return pendingRefs;\n });\n return;\n }\n\n // undo locks and apply clones\n this.undoLocks(ref, phxEvent, eachCloneCallback);\n\n // undo loading states\n this.undoLoading(ref, phxEvent);\n\n // ensure undo events are fired for pending refs that\n // are resolved by the current ref, otherwise we'd leak event listeners\n DOM.updatePrivate(this.el, PHX_PENDING_REFS, [], (pendingRefs) => {\n return pendingRefs.filter((pendingRef) => {\n let opts = {\n detail: { ref: pendingRef, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n if (this.loadingRef && this.loadingRef > pendingRef) {\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-loading:${pendingRef}`, opts),\n );\n }\n if (this.lockRef && this.lockRef > pendingRef) {\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-lock:${pendingRef}`, opts),\n );\n }\n return pendingRef > ref;\n });\n });\n\n // clean up if fully resolved\n if (this.isFullyResolvedBy(ref)) {\n this.el.removeAttribute(PHX_REF_SRC);\n }\n }\n\n // private\n\n isWithin(ref) {\n return !(\n this.loadingRef !== null &&\n this.loadingRef > ref &&\n this.lockRef !== null &&\n this.lockRef > ref\n );\n }\n\n // Check for cloned PHX_REF_LOCK element that has been morphed behind\n // the scenes while this element was locked in the DOM.\n // When we apply the cloned tree to the active DOM element, we must\n //\n // 1. execute pending mounted hooks for nodes now in the DOM\n // 2. undo any ref inside the cloned tree that has since been ack'd\n undoLocks(ref, phxEvent, eachCloneCallback) {\n if (!this.isLockUndoneBy(ref)) {\n return;\n }\n\n const clonedTree = DOM.private(this.el, PHX_REF_LOCK);\n if (clonedTree) {\n eachCloneCallback(clonedTree);\n DOM.deletePrivate(this.el, PHX_REF_LOCK);\n }\n this.el.removeAttribute(PHX_REF_LOCK);\n\n const opts = {\n detail: { ref: ref, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts),\n );\n }\n\n undoLoading(ref, phxEvent) {\n if (!this.isLoadingUndoneBy(ref)) {\n if (\n this.canUndoLoading(ref) &&\n this.el.classList.contains(\"phx-submit-loading\")\n ) {\n this.el.classList.remove(\"phx-change-loading\");\n }\n return;\n }\n\n if (this.canUndoLoading(ref)) {\n this.el.removeAttribute(PHX_REF_LOADING);\n const disabledVal = this.el.getAttribute(PHX_DISABLED);\n const readOnlyVal = this.el.getAttribute(PHX_READONLY);\n // restore inputs\n if (readOnlyVal !== null) {\n this.el.readOnly = readOnlyVal === \"true\" ? true : false;\n this.el.removeAttribute(PHX_READONLY);\n }\n if (disabledVal !== null) {\n this.el.disabled = disabledVal === \"true\" ? true : false;\n this.el.removeAttribute(PHX_DISABLED);\n }\n // restore disables\n const disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE);\n if (disableRestore !== null) {\n this.el.innerText = disableRestore;\n this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE);\n }\n\n const opts = {\n detail: { ref: ref, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts),\n );\n }\n\n // remove classes\n PHX_EVENT_CLASSES.forEach((name) => {\n if (name !== \"phx-submit-loading\" || this.canUndoLoading(ref)) {\n DOM.removeClass(this.el, name);\n }\n });\n }\n\n isLoadingUndoneBy(ref) {\n return this.loadingRef === null ? false : this.loadingRef <= ref;\n }\n isLockUndoneBy(ref) {\n return this.lockRef === null ? false : this.lockRef <= ref;\n }\n\n isFullyResolvedBy(ref) {\n return (\n (this.loadingRef === null || this.loadingRef <= ref) &&\n (this.lockRef === null || this.lockRef <= ref)\n );\n }\n\n // only remove the phx-submit-loading class if we are not locked\n canUndoLoading(ref) {\n return this.lockRef === null || this.lockRef <= ref;\n }\n}\n", "import { maybe } from \"./utils\";\n\nimport DOM from \"./dom\";\n\nexport default class DOMPostMorphRestorer {\n constructor(containerBefore, containerAfter, updateType) {\n const idsBefore = new Set();\n const idsAfter = new Set(\n [...containerAfter.children].map((child) => child.id),\n );\n\n const elementsToModify = [];\n\n Array.from(containerBefore.children).forEach((child) => {\n if (child.id) {\n // all of our children should be elements with ids\n idsBefore.add(child.id);\n if (idsAfter.has(child.id)) {\n const previousElementId =\n child.previousElementSibling && child.previousElementSibling.id;\n elementsToModify.push({\n elementId: child.id,\n previousElementId: previousElementId,\n });\n }\n }\n });\n\n this.containerId = containerAfter.id;\n this.updateType = updateType;\n this.elementsToModify = elementsToModify;\n this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id));\n }\n\n // We do the following to optimize append/prepend operations:\n // 1) Track ids of modified elements & of new elements\n // 2) All the modified elements are put back in the correct position in the DOM tree\n // by storing the id of their previous sibling\n // 3) New elements are going to be put in the right place by morphdom during append.\n // For prepend, we move them to the first position in the container\n perform() {\n const container = DOM.byId(this.containerId);\n if (!container) {\n return;\n }\n this.elementsToModify.forEach((elementToModify) => {\n if (elementToModify.previousElementId) {\n maybe(\n document.getElementById(elementToModify.previousElementId),\n (previousElem) => {\n maybe(\n document.getElementById(elementToModify.elementId),\n (elem) => {\n const isInRightPlace =\n elem.previousElementSibling &&\n elem.previousElementSibling.id == previousElem.id;\n if (!isInRightPlace) {\n previousElem.insertAdjacentElement(\"afterend\", elem);\n }\n },\n );\n },\n );\n } else {\n // This is the first element in the container\n maybe(document.getElementById(elementToModify.elementId), (elem) => {\n const isInRightPlace = elem.previousElementSibling == null;\n if (!isInRightPlace) {\n container.insertAdjacentElement(\"afterbegin\", elem);\n }\n });\n }\n });\n\n if (this.updateType == \"prepend\") {\n this.elementIdsToAdd.reverse().forEach((elemId) => {\n maybe(document.getElementById(elemId), (elem) =>\n container.insertAdjacentElement(\"afterbegin\", elem),\n );\n });\n }\n }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n\n // document-fragments dont have attributes so lets not do anything\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n // update attributes on original DOM element\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n if (fromValue !== attrValue) {\n if (attr.prefix === 'xmlns'){\n attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n\n // Remove any extra attributes found on the original DOM element that\n // weren't found on the target element.\n var fromNodeAttrs = fromNode.attributes;\n\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement('template');\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement('body');\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n // createContextualFragment doesn't support\n // <template> support not available in IE\n return createFragmentFromTemplate(str);\n } else if (HAS_RANGE_SUPPORT) {\n return createFragmentFromRange(str);\n }\n\n return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n * nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n var fromNodeName = fromEl.nodeName;\n var toNodeName = toEl.nodeName;\n var fromCodeStart, toCodeStart;\n\n if (fromNodeName === toNodeName) {\n return true;\n }\n\n fromCodeStart = fromNodeName.charCodeAt(0);\n toCodeStart = toNodeName.charCodeAt(0);\n\n // If the target element is a virtual DOM node or SVG node then we may\n // need to normalize the tag name before comparing. Normal HTML elements that are\n // in the \"http://www.w3.org/1999/xhtml\"\n // are converted to upper case\n if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n return fromNodeName === toNodeName.toUpperCase();\n } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n return toNodeName === fromNodeName.toUpperCase();\n } else {\n return false;\n }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n return !namespaceURI || namespaceURI === NS_XHTML ?\n doc.createElement(name) :\n doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n var curChild = fromEl.firstChild;\n while (curChild) {\n var nextChild = curChild.nextSibling;\n toEl.appendChild(curChild);\n curChild = nextChild;\n }\n return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n if (fromEl[name] !== toEl[name]) {\n fromEl[name] = toEl[name];\n if (fromEl[name]) {\n fromEl.setAttribute(name, '');\n } else {\n fromEl.removeAttribute(name);\n }\n }\n}\n\nvar specialElHandlers = {\n OPTION: function(fromEl, toEl) {\n var parentNode = fromEl.parentNode;\n if (parentNode) {\n var parentName = parentNode.nodeName.toUpperCase();\n if (parentName === 'OPTGROUP') {\n parentNode = parentNode.parentNode;\n parentName = parentNode && parentNode.nodeName.toUpperCase();\n }\n if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n if (fromEl.hasAttribute('selected') && !toEl.selected) {\n // Workaround for MS Edge bug where the 'selected' attribute can only be\n // removed if set to a non-empty value:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n fromEl.setAttribute('selected', 'selected');\n fromEl.removeAttribute('selected');\n }\n // We have to reset select element's selectedIndex to -1, otherwise setting\n // fromEl.selected using the syncBooleanAttrProp below has no effect.\n // The correct selectedIndex will be set in the SELECT special handler below.\n parentNode.selectedIndex = -1;\n }\n }\n syncBooleanAttrProp(fromEl, toEl, 'selected');\n },\n /**\n * The \"value\" attribute is special for the <input> element since it sets\n * the initial value. Changing the \"value\" attribute without changing the\n * \"value\" property will have no effect since it is only used to the set the\n * initial value. Similar for the \"checked\" attribute, and \"disabled\".\n */\n INPUT: function(fromEl, toEl) {\n syncBooleanAttrProp(fromEl, toEl, 'checked');\n syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n if (fromEl.value !== toEl.value) {\n fromEl.value = toEl.value;\n }\n\n if (!toEl.hasAttribute('value')) {\n fromEl.removeAttribute('value');\n }\n },\n\n TEXTAREA: function(fromEl, toEl) {\n var newValue = toEl.value;\n if (fromEl.value !== newValue) {\n fromEl.value = newValue;\n }\n\n var firstChild = fromEl.firstChild;\n if (firstChild) {\n // Needed for IE. Apparently IE sets the placeholder as the\n // node value and vise versa. This ignores an empty update.\n var oldValue = firstChild.nodeValue;\n\n if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n return;\n }\n\n firstChild.nodeValue = newValue;\n }\n },\n SELECT: function(fromEl, toEl) {\n if (!toEl.hasAttribute('multiple')) {\n var selectedIndex = -1;\n var i = 0;\n // We have to loop through children of fromEl, not toEl since nodes can be moved\n // from toEl to fromEl directly when morphing.\n // At the time this special handler is invoked, all children have already been morphed\n // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n var curChild = fromEl.firstChild;\n var optgroup;\n var nodeName;\n while(curChild) {\n nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n if (nodeName === 'OPTGROUP') {\n optgroup = curChild;\n curChild = optgroup.firstChild;\n // handle empty optgroups\n if (!curChild) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n } else {\n if (nodeName === 'OPTION') {\n if (curChild.hasAttribute('selected')) {\n selectedIndex = i;\n break;\n }\n i++;\n }\n curChild = curChild.nextSibling;\n if (!curChild && optgroup) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n }\n }\n\n fromEl.selectedIndex = selectedIndex;\n }\n }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n if (node) {\n return (node.getAttribute && node.getAttribute('id')) || node.id;\n }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n return function morphdom(fromNode, toNode, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof toNode === 'string') {\n if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n var toNodeHtml = toNode;\n toNode = doc.createElement('html');\n toNode.innerHTML = toNodeHtml;\n } else {\n toNode = toElement(toNode);\n }\n } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n toNode = toNode.firstElementChild;\n }\n\n var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n var onNodeAdded = options.onNodeAdded || noop;\n var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n var onElUpdated = options.onElUpdated || noop;\n var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n var onNodeDiscarded = options.onNodeDiscarded || noop;\n var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n var skipFromChildren = options.skipFromChildren || noop;\n var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n var childrenOnly = options.childrenOnly === true;\n\n // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n var fromNodesLookup = Object.create(null);\n var keyedRemovalList = [];\n\n function addKeyedRemoval(key) {\n keyedRemovalList.push(key);\n }\n\n function walkDiscardedChildNodes(node, skipKeyedNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n var curChild = node.firstChild;\n while (curChild) {\n\n var key = undefined;\n\n if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n // If we are skipping keyed nodes then we add the key\n // to a list so that it can be handled at the very end.\n addKeyedRemoval(key);\n } else {\n // Only report the node as discarded if it is not keyed. We do this because\n // at the end we loop through all keyed elements that were unmatched\n // and then discard them in one final pass.\n onNodeDiscarded(curChild);\n if (curChild.firstChild) {\n walkDiscardedChildNodes(curChild, skipKeyedNodes);\n }\n }\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n /**\n * Removes a DOM node out of the original DOM\n *\n * @param {Node} node The node to remove\n * @param {Node} parentNode The nodes parent\n * @param {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n * @return {undefined}\n */\n function removeNode(node, parentNode, skipKeyedNodes) {\n if (onBeforeNodeDiscarded(node) === false) {\n return;\n }\n\n if (parentNode) {\n parentNode.removeChild(node);\n }\n\n onNodeDiscarded(node);\n walkDiscardedChildNodes(node, skipKeyedNodes);\n }\n\n // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n // function indexTree(root) {\n // var treeWalker = document.createTreeWalker(\n // root,\n // NodeFilter.SHOW_ELEMENT);\n //\n // var el;\n // while((el = treeWalker.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n //\n // function indexTree(node) {\n // var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n // var el;\n // while((el = nodeIterator.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n function indexTree(node) {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = getNodeKey(curChild);\n if (key) {\n fromNodesLookup[key] = curChild;\n }\n\n // Walk recursively\n indexTree(curChild);\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n indexTree(fromNode);\n\n function handleNodeAdded(el) {\n onNodeAdded(el);\n\n var curChild = el.firstChild;\n while (curChild) {\n var nextSibling = curChild.nextSibling;\n\n var key = getNodeKey(curChild);\n if (key) {\n var unmatchedFromEl = fromNodesLookup[key];\n // if we find a duplicate #id node in cache, replace `el` with cache value\n // and morph it to the child node.\n if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n morphEl(unmatchedFromEl, curChild);\n } else {\n handleNodeAdded(curChild);\n }\n } else {\n // recursively call for curChild and it's children to see if we find something in\n // fromNodesLookup\n handleNodeAdded(curChild);\n }\n\n curChild = nextSibling;\n }\n }\n\n function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n // We have processed all of the \"to nodes\". If curFromNodeChild is\n // non-null then we still have some from nodes left over that need\n // to be removed\n while (curFromNodeChild) {\n var fromNextSibling = curFromNodeChild.nextSibling;\n if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n curFromNodeChild = fromNextSibling;\n }\n }\n\n function morphEl(fromEl, toEl, childrenOnly) {\n var toElKey = getNodeKey(toEl);\n\n if (toElKey) {\n // If an element with an ID is being morphed then it will be in the final\n // DOM so clear it out of the saved elements collection\n delete fromNodesLookup[toElKey];\n }\n\n if (!childrenOnly) {\n // optional\n var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n if (beforeUpdateResult === false) {\n return;\n } else if (beforeUpdateResult instanceof HTMLElement) {\n fromEl = beforeUpdateResult;\n // reindex the new fromEl in case it's not in the same\n // tree as the original fromEl\n // (Phoenix LiveView sometimes returns a cloned tree,\n // but keyed lookups would still point to the original tree)\n indexTree(fromEl);\n }\n\n // update attributes on original DOM element first\n morphAttrs(fromEl, toEl);\n // optional\n onElUpdated(fromEl);\n\n if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n return;\n }\n }\n\n if (fromEl.nodeName !== 'TEXTAREA') {\n morphChildren(fromEl, toEl);\n } else {\n specialElHandlers.TEXTAREA(fromEl, toEl);\n }\n }\n\n function morphChildren(fromEl, toEl) {\n var skipFrom = skipFromChildren(fromEl, toEl);\n var curToNodeChild = toEl.firstChild;\n var curFromNodeChild = fromEl.firstChild;\n var curToNodeKey;\n var curFromNodeKey;\n\n var fromNextSibling;\n var toNextSibling;\n var matchingFromEl;\n\n // walk the children\n outer: while (curToNodeChild) {\n toNextSibling = curToNodeChild.nextSibling;\n curToNodeKey = getNodeKey(curToNodeChild);\n\n // walk the fromNode children all the way through\n while (!skipFrom && curFromNodeChild) {\n fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n curFromNodeKey = getNodeKey(curFromNodeChild);\n\n var curFromNodeType = curFromNodeChild.nodeType;\n\n // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n var isCompatible = undefined;\n\n if (curFromNodeType === curToNodeChild.nodeType) {\n if (curFromNodeType === ELEMENT_NODE) {\n // Both nodes being compared are Element nodes\n\n if (curToNodeKey) {\n // The target node has a key so we want to match it up with the correct element\n // in the original DOM tree\n if (curToNodeKey !== curFromNodeKey) {\n // The current element in the original DOM tree does not have a matching key so\n // let's check our lookup to see if there is a matching element in the original\n // DOM tree\n if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n if (fromNextSibling === matchingFromEl) {\n // Special case for single element removals. To avoid removing the original\n // DOM node out of the tree (since that can break CSS transitions, etc.),\n // we will instead discard the current node and wait until the next\n // iteration to properly match up the keyed target element with its matching\n // element in the original tree\n isCompatible = false;\n } else {\n // We found a matching keyed element somewhere in the original DOM tree.\n // Let's move the original DOM node into the current position and morph\n // it.\n\n // NOTE: We use insertBefore instead of replaceChild because we want to go through\n // the `removeNode()` function for the node that is being discarded so that\n // all lifecycle hooks are correctly invoked\n fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n // fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = matchingFromEl;\n curFromNodeKey = getNodeKey(curFromNodeChild);\n }\n } else {\n // The nodes are not compatible since the \"to\" node has a key and there\n // is no matching keyed node in the source tree\n isCompatible = false;\n }\n }\n } else if (curFromNodeKey) {\n // The original has a key\n isCompatible = false;\n }\n\n isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n if (isCompatible) {\n // We found compatible DOM elements so transform\n // the current \"from\" node to match the current\n // target DOM node.\n // MORPH\n morphEl(curFromNodeChild, curToNodeChild);\n }\n\n } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n // Both nodes being compared are Text or Comment nodes\n isCompatible = true;\n // Simply update nodeValue on the original node to\n // change the text value\n if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n }\n\n }\n }\n\n if (isCompatible) {\n // Advance both the \"to\" child and the \"from\" child since we found a match\n // Nothing else to do as we already recursively called morphChildren above\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n // No compatible match so remove the old node from the DOM and continue trying to find a\n // match in the original DOM. However, we only do this if the from node is not keyed\n // since it is possible that a keyed node might match up with a node somewhere else in the\n // target tree and we don't want to discard it just yet since it still might find a\n // home in the final DOM tree. After everything is done we will remove any keyed nodes\n // that didn't find a home\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = fromNextSibling;\n } // END: while(curFromNodeChild) {}\n\n // If we got this far then we did not find a candidate match for\n // our \"to node\" and we exhausted all of the children \"from\"\n // nodes. Therefore, we will just append the current \"to\" node\n // to the end\n if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n // MORPH\n if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n morphEl(matchingFromEl, curToNodeChild);\n } else {\n var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n if (onBeforeNodeAddedResult !== false) {\n if (onBeforeNodeAddedResult) {\n curToNodeChild = onBeforeNodeAddedResult;\n }\n\n if (curToNodeChild.actualize) {\n curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n }\n addChild(fromEl, curToNodeChild);\n handleNodeAdded(curToNodeChild);\n }\n }\n\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n }\n\n cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n var specialElHandler = specialElHandlers[fromEl.nodeName];\n if (specialElHandler) {\n specialElHandler(fromEl, toEl);\n }\n } // END: morphChildren(...)\n\n var morphedNode = fromNode;\n var morphedNodeType = morphedNode.nodeType;\n var toNodeType = toNode.nodeType;\n\n if (!childrenOnly) {\n // Handle the case where we are given two DOM nodes that are not\n // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n if (morphedNodeType === ELEMENT_NODE) {\n if (toNodeType === ELEMENT_NODE) {\n if (!compareNodeNames(fromNode, toNode)) {\n onNodeDiscarded(fromNode);\n morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n }\n } else {\n // Going from an element node to a text node\n morphedNode = toNode;\n }\n } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n if (toNodeType === morphedNodeType) {\n if (morphedNode.nodeValue !== toNode.nodeValue) {\n morphedNode.nodeValue = toNode.nodeValue;\n }\n\n return morphedNode;\n } else {\n // Text node to something else\n morphedNode = toNode;\n }\n }\n }\n\n if (morphedNode === toNode) {\n // The \"to node\" was not compatible with the \"from node\" so we had to\n // toss out the \"from node\" and use the \"to node\"\n onNodeDiscarded(fromNode);\n } else {\n if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n return;\n }\n\n morphEl(morphedNode, toNode, childrenOnly);\n\n // We now need to loop over any keyed nodes that might need to be\n // removed. We only do the removal if we know that the keyed node\n // never found a match. When a keyed node is matched up we remove\n // it out of fromNodesLookup and we use fromNodesLookup to determine\n // if a keyed node has been matched up or not\n if (keyedRemovalList) {\n for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n if (elToRemove) {\n removeNode(elToRemove, elToRemove.parentNode, false);\n }\n }\n }\n }\n\n if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n if (morphedNode.actualize) {\n morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n }\n // If we had to swap out the from node with a new node because the old\n // node was not compatible with the target node then we need to\n // replace the old DOM node in the original DOM tree. This is only\n // possible if the original DOM node was part of a DOM tree which\n // we know is the case if it has a parent node.\n fromNode.parentNode.replaceChild(morphedNode, fromNode);\n }\n\n return morphedNode;\n };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n PHX_COMPONENT,\n PHX_PRUNE,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_SKIP,\n PHX_MAGIC_ID,\n PHX_STATIC,\n PHX_TRIGGER_ACTION,\n PHX_UPDATE,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_STREAM,\n PHX_STREAM_REF,\n PHX_VIEWPORT_TOP,\n PHX_VIEWPORT_BOTTOM,\n PHX_PORTAL,\n PHX_TELEPORTED_REF,\n PHX_TELEPORTED_SRC,\n PHX_RUNTIME_HOOK,\n} from \"./constants\";\n\nimport { detectDuplicateIds, detectInvalidStreamInserts, isCid } from \"./utils\";\nimport ElementRef from \"./element_ref\";\nimport DOM from \"./dom\";\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\";\nimport morphdom from \"morphdom\";\n\nexport default class DOMPatch {\n constructor(view, container, id, html, streams, targetCID, opts = {}) {\n this.view = view;\n this.liveSocket = view.liveSocket;\n this.container = container;\n this.id = id;\n this.rootID = view.root.id;\n this.html = html;\n this.streams = streams;\n this.streamInserts = {};\n this.streamComponentRestore = {};\n this.targetCID = targetCID;\n this.cidPatch = isCid(this.targetCID);\n this.pendingRemoves = [];\n this.phxRemove = this.liveSocket.binding(\"remove\");\n this.targetContainer = this.isCIDPatch()\n ? this.targetCIDContainer(html)\n : container;\n this.callbacks = {\n beforeadded: [],\n beforeupdated: [],\n beforephxChildAdded: [],\n afteradded: [],\n afterupdated: [],\n afterdiscarded: [],\n afterphxChildAdded: [],\n aftertransitionsDiscarded: [],\n };\n this.withChildren = opts.withChildren || opts.undoRef || false;\n this.undoRef = opts.undoRef;\n }\n\n before(kind, callback) {\n this.callbacks[`before${kind}`].push(callback);\n }\n after(kind, callback) {\n this.callbacks[`after${kind}`].push(callback);\n }\n\n trackBefore(kind, ...args) {\n this.callbacks[`before${kind}`].forEach((callback) => callback(...args));\n }\n\n trackAfter(kind, ...args) {\n this.callbacks[`after${kind}`].forEach((callback) => callback(...args));\n }\n\n markPrunableContentForRemoval() {\n const phxUpdate = this.liveSocket.binding(PHX_UPDATE);\n DOM.all(\n this.container,\n `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`,\n (el) => {\n el.setAttribute(PHX_PRUNE, \"\");\n },\n );\n }\n\n perform(isJoinPatch) {\n const { view, liveSocket, html, container, targetContainer } = this;\n if (this.isCIDPatch() && !targetContainer) {\n return;\n }\n\n const focused = liveSocket.getActiveElement();\n const { selectionStart, selectionEnd } =\n focused && DOM.hasSelectionRange(focused) ? focused : {};\n const phxUpdate = liveSocket.binding(PHX_UPDATE);\n const phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP);\n const phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM);\n const phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION);\n const added = [];\n const updates = [];\n const appendPrependUpdates = [];\n\n // as the portal target itself could be at the end of the DOM,\n // it may not be present while morphing previous parts;\n // therefore we apply all teleports after the morphing is done+\n const portalCallbacks = [];\n\n let externalFormTriggered = null;\n\n const morph = (\n targetContainer,\n source,\n withChildren = this.withChildren,\n ) => {\n const morphCallbacks = {\n // normally, we are running with childrenOnly, as the patch HTML for a LV\n // does not include the LV attrs (data-phx-session, etc.)\n // when we are patching a live component, we do want to patch the root element as well;\n // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n childrenOnly:\n targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n getNodeKey: (node) => {\n if (DOM.isPhxDestroyed(node)) {\n return null;\n }\n // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n // This is important to reduce the amount of elements morphdom discards.\n if (isJoinPatch) {\n return node.id;\n }\n return (\n node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n );\n },\n // skip indexing from children when container is stream\n skipFromChildren: (from) => {\n return from.getAttribute(phxUpdate) === PHX_STREAM;\n },\n // tell morphdom how to add a child\n addChild: (parent, child) => {\n const { ref, streamAt } = this.getStreamInsert(child);\n if (ref === undefined) {\n return parent.appendChild(child);\n }\n\n this.setStreamRef(child, ref);\n\n // streaming\n if (streamAt === 0) {\n parent.insertAdjacentElement(\"afterbegin\", child);\n } else if (streamAt === -1) {\n const lastChild = parent.lastElementChild;\n if (lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)) {\n const nonStreamChild = Array.from(parent.children).find(\n (c) => !c.hasAttribute(PHX_STREAM_REF),\n );\n parent.insertBefore(child, nonStreamChild);\n } else {\n parent.appendChild(child);\n }\n } else if (streamAt > 0) {\n const sibling = Array.from(parent.children)[streamAt];\n parent.insertBefore(child, sibling);\n }\n },\n onBeforeNodeAdded: (el) => {\n // don't add update_only nodes if they did not already exist\n if (\n this.getStreamInsert(el)?.updateOnly &&\n !this.streamComponentRestore[el.id]\n ) {\n return false;\n }\n\n DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom);\n this.trackBefore(\"added\", el);\n\n let morphedEl = el;\n // this is a stream item that was kept on reset, recursively morph it\n if (this.streamComponentRestore[el.id]) {\n morphedEl = this.streamComponentRestore[el.id];\n delete this.streamComponentRestore[el.id];\n morph(morphedEl, el, true);\n }\n\n return morphedEl;\n },\n onNodeAdded: (el) => {\n if (el.getAttribute) {\n this.maybeReOrderStream(el, true);\n }\n // phx-portal handling\n if (DOM.isPortalTemplate(el)) {\n portalCallbacks.push(() => this.teleport(el, morph));\n }\n\n // hack to fix Safari handling of img srcset and video tags\n if (el instanceof HTMLImageElement && el.srcset) {\n // eslint-disable-next-line no-self-assign\n el.srcset = el.srcset;\n } else if (el instanceof HTMLVideoElement && el.autoplay) {\n el.play();\n }\n if (DOM.isNowTriggerFormExternal(el, phxTriggerExternal)) {\n externalFormTriggered = el;\n }\n\n // nested view handling\n if (\n (DOM.isPhxChild(el) && view.ownsElement(el)) ||\n (DOM.isPhxSticky(el) && view.ownsElement(el.parentNode))\n ) {\n this.trackAfter(\"phxChildAdded\", el);\n }\n\n // data-phx-runtime-hook\n if (el.nodeName === \"SCRIPT\" && el.hasAttribute(PHX_RUNTIME_HOOK)) {\n this.handleRuntimeHook(el, source);\n }\n\n added.push(el);\n },\n onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n onBeforeNodeDiscarded: (el) => {\n if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) {\n return true;\n }\n if (\n el.parentElement !== null &&\n el.id &&\n DOM.isPhxUpdate(el.parentElement, phxUpdate, [\n PHX_STREAM,\n \"append\",\n \"prepend\",\n ])\n ) {\n return false;\n }\n // don't remove teleported elements\n if (el.getAttribute && el.getAttribute(PHX_TELEPORTED_REF)) {\n return false;\n }\n if (this.maybePendingRemove(el)) {\n return false;\n }\n if (this.skipCIDSibling(el)) {\n return false;\n }\n\n if (DOM.isPortalTemplate(el)) {\n // if the portal template itself is removed, remove the teleported element as well;\n // we also perform a check after morphdom is finished to catch parent removals\n const teleportedEl = document.getElementById(\n el.content.firstElementChild.id,\n );\n if (teleportedEl) {\n teleportedEl.remove();\n morphCallbacks.onNodeDiscarded(teleportedEl);\n this.view.dropPortalElementId(teleportedEl.id);\n }\n }\n\n return true;\n },\n onElUpdated: (el) => {\n if (DOM.isNowTriggerFormExternal(el, phxTriggerExternal)) {\n externalFormTriggered = el;\n }\n updates.push(el);\n this.maybeReOrderStream(el, false);\n },\n onBeforeElUpdated: (fromEl, toEl) => {\n // if we are patching the root target container and the id has changed, treat it as a new node\n // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n if (\n fromEl.id &&\n fromEl.isSameNode(targetContainer) &&\n fromEl.id !== toEl.id\n ) {\n morphCallbacks.onNodeDiscarded(fromEl);\n fromEl.replaceWith(toEl);\n return morphCallbacks.onNodeAdded(toEl);\n }\n DOM.syncPendingAttrs(fromEl, toEl);\n DOM.maintainPrivateHooks(\n fromEl,\n toEl,\n phxViewportTop,\n phxViewportBottom,\n );\n DOM.cleanChildNodes(toEl, phxUpdate);\n if (this.skipCIDSibling(toEl)) {\n // if this is a live component used in a stream, we may need to reorder it\n this.maybeReOrderStream(fromEl);\n return false;\n }\n if (DOM.isPhxSticky(fromEl)) {\n [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n .map((attr) => [\n attr,\n fromEl.getAttribute(attr),\n toEl.getAttribute(attr),\n ])\n .forEach(([attr, fromVal, toVal]) => {\n if (toVal && fromVal !== toVal) {\n fromEl.setAttribute(attr, toVal);\n }\n });\n\n return false;\n }\n if (\n DOM.isIgnored(fromEl, phxUpdate) ||\n (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))\n ) {\n this.trackBefore(\"updated\", fromEl, toEl);\n DOM.mergeAttrs(fromEl, toEl, {\n isIgnored: DOM.isIgnored(fromEl, phxUpdate),\n });\n updates.push(fromEl);\n DOM.applyStickyOperations(fromEl);\n return false;\n }\n if (\n fromEl.type === \"number\" &&\n fromEl.validity &&\n fromEl.validity.badInput\n ) {\n return false;\n }\n // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n // If it's locked, we clone the fromEl tree and instruct morphdom to use\n // the cloned tree as the source of the morph for this branch from here on out.\n // We keep a reference to the cloned tree in the element's private data, and\n // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n // apply any changes that happened while the element was locked.\n const isFocusedFormEl =\n focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl);\n const focusedSelectChanged =\n isFocusedFormEl && this.isChangedSelect(fromEl, toEl);\n if (fromEl.hasAttribute(PHX_REF_SRC)) {\n const ref = new ElementRef(fromEl);\n // only perform the clone step if this is not a patch that unlocks\n if (\n ref.lockRef &&\n (!this.undoRef || !ref.isLockUndoneBy(this.undoRef))\n ) {\n if (DOM.isUploadInput(fromEl)) {\n DOM.mergeAttrs(fromEl, toEl, { isIgnored: true });\n this.trackBefore(\"updated\", fromEl, toEl);\n updates.push(fromEl);\n }\n DOM.applyStickyOperations(fromEl);\n const isLocked = fromEl.hasAttribute(PHX_REF_LOCK);\n const clone = isLocked\n ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true)\n : null;\n if (clone) {\n DOM.putPrivate(fromEl, PHX_REF_LOCK, clone);\n if (!isFocusedFormEl) {\n fromEl = clone;\n }\n }\n }\n }\n\n // nested view handling\n if (DOM.isPhxChild(toEl)) {\n const prevSession = fromEl.getAttribute(PHX_SESSION);\n DOM.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] });\n if (prevSession !== \"\") {\n fromEl.setAttribute(PHX_SESSION, prevSession);\n }\n fromEl.setAttribute(PHX_ROOT_ID, this.rootID);\n DOM.applyStickyOperations(fromEl);\n return false;\n }\n\n // if we are undoing a lock, copy potentially nested clones over\n if (this.undoRef && DOM.private(toEl, PHX_REF_LOCK)) {\n DOM.putPrivate(\n fromEl,\n PHX_REF_LOCK,\n DOM.private(toEl, PHX_REF_LOCK),\n );\n }\n // now copy regular DOM.private data\n DOM.copyPrivates(toEl, fromEl);\n\n // phx-portal handling\n if (DOM.isPortalTemplate(toEl)) {\n portalCallbacks.push(() => this.teleport(toEl, morph));\n return false;\n }\n\n // skip patching focused inputs unless focus is a select that has changed options\n if (\n isFocusedFormEl &&\n fromEl.type !== \"hidden\" &&\n !focusedSelectChanged\n ) {\n this.trackBefore(\"updated\", fromEl, toEl);\n DOM.mergeFocusedInput(fromEl, toEl);\n DOM.syncAttrsToProps(fromEl);\n updates.push(fromEl);\n DOM.applyStickyOperations(fromEl);\n return false;\n } else {\n // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n if (focusedSelectChanged) {\n fromEl.blur();\n }\n if (DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])) {\n appendPrependUpdates.push(\n new DOMPostMorphRestorer(\n fromEl,\n toEl,\n toEl.getAttribute(phxUpdate),\n ),\n );\n }\n\n DOM.syncAttrsToProps(toEl);\n DOM.applyStickyOperations(toEl);\n this.trackBefore(\"updated\", fromEl, toEl);\n return fromEl;\n }\n },\n };\n\n morphdom(targetContainer, source, morphCallbacks);\n };\n\n this.trackBefore(\"added\", container);\n this.trackBefore(\"updated\", container, container);\n\n liveSocket.time(\"morphdom\", () => {\n this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n inserts.forEach(([key, streamAt, limit, updateOnly]) => {\n this.streamInserts[key] = { ref, streamAt, limit, reset, updateOnly };\n });\n if (reset !== undefined) {\n DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, (child) => {\n this.removeStreamChildElement(child);\n });\n }\n deleteIds.forEach((id) => {\n const child = container.querySelector(`[id=\"${id}\"]`);\n if (child) {\n this.removeStreamChildElement(child);\n }\n });\n });\n\n // clear stream items from the dead render if they are not inserted again\n if (isJoinPatch) {\n DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`)\n // it is important to filter the element before removing them, as\n // it may happen that streams are nested and the owner check fails if\n // a parent is removed before a child\n .filter((el) => this.view.ownsElement(el))\n .forEach((el) => {\n Array.from(el.children).forEach((child) => {\n // we already performed the owner check, each child is guaranteed to be owned\n // by the view. To prevent the nested owner check from failing in case of nested\n // streams where the parent is removed before the child, we force the removal\n this.removeStreamChildElement(child, true);\n });\n });\n }\n\n morph(targetContainer, html);\n // normal patch complete, teleport elements now\n portalCallbacks.forEach((callback) => callback());\n // check for any teleported elements that are not in the view any more\n // and remove them\n this.view.portalElementIds.forEach((id) => {\n const el = document.getElementById(id);\n if (el) {\n const source = document.getElementById(\n el.getAttribute(PHX_TELEPORTED_SRC),\n );\n if (!source) {\n el.remove();\n this.onNodeDiscarded(el);\n this.view.dropPortalElementId(id);\n }\n }\n });\n });\n\n if (liveSocket.isDebugEnabled()) {\n detectDuplicateIds();\n detectInvalidStreamInserts(this.streamInserts);\n // warn if there are any inputs named \"id\"\n Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(\n (node) => {\n if (node instanceof HTMLInputElement && node.form) {\n console.error(\n 'Detected an input with name=\"id\" inside a form! This will cause problems when patching the DOM.\\n',\n node,\n );\n }\n },\n );\n }\n\n if (appendPrependUpdates.length > 0) {\n liveSocket.time(\"post-morph append/prepend restoration\", () => {\n appendPrependUpdates.forEach((update) => update.perform());\n });\n }\n\n liveSocket.silenceEvents(() =>\n DOM.restoreFocus(focused, selectionStart, selectionEnd),\n );\n DOM.dispatchEvent(document, \"phx:update\");\n added.forEach((el) => this.trackAfter(\"added\", el));\n updates.forEach((el) => this.trackAfter(\"updated\", el));\n\n this.transitionPendingRemoves();\n\n if (externalFormTriggered) {\n liveSocket.unload();\n // check for submitter and inject it as hidden input for external submit;\n // In theory, it could happen that the stored submitter is outdated and doesn't\n // exist in the DOM any more, but this is unlikely, so we just accept it for now.\n const submitter = DOM.private(externalFormTriggered, \"submitter\");\n if (submitter && submitter.name && targetContainer.contains(submitter)) {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n const formId = submitter.getAttribute(\"form\");\n if (formId) {\n input.setAttribute(\"form\", formId);\n }\n input.name = submitter.name;\n input.value = submitter.value;\n submitter.parentElement.insertBefore(input, submitter);\n }\n // use prototype's submit in case there's a form control with name or id of \"submit\"\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n Object.getPrototypeOf(externalFormTriggered).submit.call(\n externalFormTriggered,\n );\n }\n return true;\n }\n\n onNodeDiscarded(el) {\n // nested view handling\n if (DOM.isPhxChild(el) || DOM.isPhxSticky(el)) {\n this.liveSocket.destroyViewByEl(el);\n }\n this.trackAfter(\"discarded\", el);\n }\n\n maybePendingRemove(node) {\n if (node.getAttribute && node.getAttribute(this.phxRemove) !== null) {\n this.pendingRemoves.push(node);\n return true;\n } else {\n return false;\n }\n }\n\n removeStreamChildElement(child, force = false) {\n // make sure to only remove elements owned by the current view\n // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n // and https://github.com/phoenixframework/phoenix_live_view/issues/3681\n if (!force && !this.view.ownsElement(child)) {\n return;\n }\n\n // we need to store the node if it is actually re-added in the same patch\n // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n if (this.streamInserts[child.id]) {\n this.streamComponentRestore[child.id] = child;\n child.remove();\n } else {\n // only remove the element now if it has no phx-remove binding\n if (!this.maybePendingRemove(child)) {\n child.remove();\n this.onNodeDiscarded(child);\n }\n }\n }\n\n getStreamInsert(el) {\n const insert = el.id ? this.streamInserts[el.id] : {};\n return insert || {};\n }\n\n setStreamRef(el, ref) {\n DOM.putSticky(el, PHX_STREAM_REF, (el) =>\n el.setAttribute(PHX_STREAM_REF, ref),\n );\n }\n\n maybeReOrderStream(el, isNew) {\n const { ref, streamAt, reset } = this.getStreamInsert(el);\n if (streamAt === undefined) {\n return;\n }\n\n // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n this.setStreamRef(el, ref);\n\n if (!reset && !isNew) {\n // we only reorder if the element is new or it's a stream reset\n return;\n }\n\n // check if the element has a parent element;\n // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n // because the element is not yet added to the real dom;\n // reordering does not make sense in that case anyway\n if (!el.parentElement) {\n return;\n }\n\n if (streamAt === 0) {\n el.parentElement.insertBefore(el, el.parentElement.firstElementChild);\n } else if (streamAt > 0) {\n const children = Array.from(el.parentElement.children);\n const oldIndex = children.indexOf(el);\n if (streamAt >= children.length - 1) {\n el.parentElement.appendChild(el);\n } else {\n const sibling = children[streamAt];\n if (oldIndex > streamAt) {\n el.parentElement.insertBefore(el, sibling);\n } else {\n el.parentElement.insertBefore(el, sibling.nextElementSibling);\n }\n }\n }\n\n this.maybeLimitStream(el);\n }\n\n maybeLimitStream(el) {\n const { limit } = this.getStreamInsert(el);\n const children = limit !== null && Array.from(el.parentElement.children);\n if (limit && limit < 0 && children.length > limit * -1) {\n children\n .slice(0, children.length + limit)\n .forEach((child) => this.removeStreamChildElement(child));\n } else if (limit && limit >= 0 && children.length > limit) {\n children\n .slice(limit)\n .forEach((child) => this.removeStreamChildElement(child));\n }\n }\n\n transitionPendingRemoves() {\n const { pendingRemoves, liveSocket } = this;\n if (pendingRemoves.length > 0) {\n liveSocket.transitionRemoves(pendingRemoves, () => {\n pendingRemoves.forEach((el) => {\n const child = DOM.firstPhxChild(el);\n if (child) {\n liveSocket.destroyViewByEl(child);\n }\n el.remove();\n });\n this.trackAfter(\"transitionsDiscarded\", pendingRemoves);\n });\n }\n }\n\n isChangedSelect(fromEl, toEl) {\n if (!(fromEl instanceof HTMLSelectElement) || fromEl.multiple) {\n return false;\n }\n if (fromEl.options.length !== toEl.options.length) {\n return true;\n }\n\n // keep the current value\n toEl.value = fromEl.value;\n\n // in general we have to be very careful with using isEqualNode as it does not a reliable\n // DOM tree equality check, but for selection attributes and options it works fine\n return !fromEl.isEqualNode(toEl);\n }\n\n isCIDPatch() {\n return this.cidPatch;\n }\n\n skipCIDSibling(el) {\n return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP);\n }\n\n targetCIDContainer(html) {\n if (!this.isCIDPatch()) {\n return;\n }\n const [first, ...rest] = DOM.findComponentNodeList(\n this.view.id,\n this.targetCID,\n );\n if (rest.length === 0 && DOM.childNodeLength(html) === 1) {\n return first;\n } else {\n return first && first.parentNode;\n }\n }\n\n indexOf(parent, child) {\n return Array.from(parent.children).indexOf(child);\n }\n\n teleport(el, morph) {\n const targetSelector = el.getAttribute(PHX_PORTAL);\n const portalContainer = document.querySelector(targetSelector);\n if (!portalContainer) {\n throw new Error(\n \"portal target with selector \" + targetSelector + \" not found\",\n );\n }\n // phx-portal templates must have a single root element, so we assume this to be\n // the case here\n const toTeleport = el.content.firstElementChild;\n // the PHX_SKIP optimization can also apply inside of the <template> elements\n if (this.skipCIDSibling(toTeleport)) {\n return;\n }\n if (!toTeleport?.id) {\n throw new Error(\n \"phx-portal template must have a single root element with ID!\",\n );\n }\n const existing = document.getElementById(toTeleport.id);\n let portalTarget;\n if (existing) {\n // check if the element needs to be moved to another target\n if (!portalContainer.contains(existing)) {\n portalContainer.appendChild(existing);\n }\n // we already teleported in a previous patch\n portalTarget = existing;\n } else {\n // create empty target and morph it recursively\n portalTarget = document.createElement(toTeleport.tagName);\n portalContainer.appendChild(portalTarget);\n }\n // mark the target as teleported;\n // to prevent unnecessary attribute modifications, we set the attribute\n // on the source and remove it after morphing (we could also just keep it)\n // otherwise morphdom would remove it, as the ref is not present in the source\n // and we'd need to set it back after each morph\n toTeleport.setAttribute(PHX_TELEPORTED_REF, this.view.id);\n toTeleport.setAttribute(PHX_TELEPORTED_SRC, el.id);\n morph(portalTarget, toTeleport, true);\n toTeleport.removeAttribute(PHX_TELEPORTED_REF);\n toTeleport.removeAttribute(PHX_TELEPORTED_SRC);\n // store a reference to the teleported element in the view\n // to cleanup when the view is destroyed, in case the portal target\n // is outside the view itself\n this.view.pushPortalElementId(toTeleport.id);\n }\n\n handleRuntimeHook(el, source) {\n // usually, scripts are not executed when morphdom adds them to the DOM\n // we special case runtime colocated hooks\n const name = el.getAttribute(PHX_RUNTIME_HOOK);\n let nonce = el.hasAttribute(\"nonce\") ? el.getAttribute(\"nonce\") : null;\n if (el.hasAttribute(\"nonce\")) {\n const template = document.createElement(\"template\");\n template.innerHTML = source;\n nonce = template.content\n .querySelector(`script[${PHX_RUNTIME_HOOK}=\"${CSS.escape(name)}\"]`)\n .getAttribute(\"nonce\");\n }\n const script = document.createElement(\"script\");\n script.textContent = el.textContent;\n DOM.mergeAttrs(script, el, { isIgnored: false });\n if (nonce) {\n script.nonce = nonce;\n }\n el.replaceWith(script);\n el = script;\n }\n}\n", "import {\n COMPONENTS,\n TEMPLATES,\n EVENTS,\n PHX_COMPONENT,\n PHX_VIEW_REF,\n PHX_SKIP,\n PHX_MAGIC_ID,\n REPLY,\n STATIC,\n TITLE,\n STREAM,\n ROOT,\n KEYED,\n KEYED_COUNT,\n} from \"./constants\";\n\nimport { isObject, logError, isCid } from \"./utils\";\n\nconst VOID_TAGS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\nconst quoteChars = new Set([\"'\", '\"']);\n\nexport const modifyRoot = (html, attrs, clearInnerHTML) => {\n let i = 0;\n let insideComment = false;\n let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML;\n\n const lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/);\n if (lookahead === null) {\n throw new Error(`malformed html ${html}`);\n }\n\n i = lookahead[0].length;\n beforeTag = lookahead[1];\n tag = lookahead[2];\n tagNameEndsAt = i;\n\n // Scan the opening tag for id, if there is any\n for (i; i < html.length; i++) {\n if (html.charAt(i) === \">\") {\n break;\n }\n if (html.charAt(i) === \"=\") {\n const isId = html.slice(i - 3, i) === \" id\";\n i++;\n const char = html.charAt(i);\n if (quoteChars.has(char)) {\n const attrStartsAt = i;\n i++;\n for (i; i < html.length; i++) {\n if (html.charAt(i) === char) {\n break;\n }\n }\n if (isId) {\n id = html.slice(attrStartsAt + 1, i);\n break;\n }\n }\n }\n }\n\n let closeAt = html.length - 1;\n insideComment = false;\n while (closeAt >= beforeTag.length + tag.length) {\n const char = html.charAt(closeAt);\n if (insideComment) {\n if (char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\") {\n insideComment = false;\n closeAt -= 4;\n } else {\n closeAt -= 1;\n }\n } else if (char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\") {\n insideComment = true;\n closeAt -= 3;\n } else if (char === \">\") {\n break;\n } else {\n closeAt -= 1;\n }\n }\n afterTag = html.slice(closeAt + 1, html.length);\n\n const attrsStr = Object.keys(attrs)\n .map((attr) => (attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`))\n .join(\" \");\n\n if (clearInnerHTML) {\n // Keep the id if any\n const idAttrStr = id ? ` id=\"${id}\"` : \"\";\n if (VOID_TAGS.has(tag)) {\n newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`;\n } else {\n newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`;\n }\n } else {\n const rest = html.slice(tagNameEndsAt, closeAt + 1);\n newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`;\n }\n\n return [newHTML, beforeTag, afterTag];\n};\n\nexport default class Rendered {\n static extract(diff) {\n const { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff;\n delete diff[REPLY];\n delete diff[EVENTS];\n delete diff[TITLE];\n return { diff, title, reply: reply || null, events: events || [] };\n }\n\n constructor(viewId, rendered) {\n this.viewId = viewId;\n this.rendered = {};\n this.magicId = 0;\n this.mergeDiff(rendered);\n }\n\n parentViewId() {\n return this.viewId;\n }\n\n toString(onlyCids) {\n const { buffer: str, streams: streams } = this.recursiveToString(\n this.rendered,\n this.rendered[COMPONENTS],\n onlyCids,\n true,\n {},\n );\n return { buffer: str, streams: streams };\n }\n\n recursiveToString(\n rendered,\n components = rendered[COMPONENTS],\n onlyCids,\n changeTracking,\n rootAttrs,\n ) {\n onlyCids = onlyCids ? new Set(onlyCids) : null;\n const output = {\n buffer: \"\",\n components: components,\n onlyCids: onlyCids,\n streams: new Set(),\n };\n this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs);\n return { buffer: output.buffer, streams: output.streams };\n }\n\n componentCIDs(diff) {\n return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i));\n }\n\n isComponentOnlyDiff(diff) {\n if (!diff[COMPONENTS]) {\n return false;\n }\n return Object.keys(diff).length === 1;\n }\n\n getComponent(diff, cid) {\n return diff[COMPONENTS][cid];\n }\n\n resetRender(cid) {\n // we are racing a component destroy, it could not exist, so\n // make sure that we don't try to set reset on undefined\n if (this.rendered[COMPONENTS][cid]) {\n this.rendered[COMPONENTS][cid].reset = true;\n }\n }\n\n mergeDiff(diff) {\n const newc = diff[COMPONENTS];\n const cache = {};\n delete diff[COMPONENTS];\n this.rendered = this.mutableMerge(this.rendered, diff);\n this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {};\n\n if (newc) {\n const oldc = this.rendered[COMPONENTS];\n\n for (const cid in newc) {\n newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);\n }\n\n for (const cid in newc) {\n oldc[cid] = newc[cid];\n }\n diff[COMPONENTS] = newc;\n }\n }\n\n cachedFindComponent(cid, cdiff, oldc, newc, cache) {\n if (cache[cid]) {\n return cache[cid];\n } else {\n let ndiff,\n stat,\n scid = cdiff[STATIC];\n\n if (isCid(scid)) {\n let tdiff;\n\n if (scid > 0) {\n tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache);\n } else {\n tdiff = oldc[-scid];\n }\n\n stat = tdiff[STATIC];\n ndiff = this.cloneMerge(tdiff, cdiff, true);\n ndiff[STATIC] = stat;\n } else {\n ndiff =\n cdiff[STATIC] !== undefined || oldc[cid] === undefined\n ? cdiff\n : this.cloneMerge(oldc[cid], cdiff, false);\n }\n\n cache[cid] = ndiff;\n return ndiff;\n }\n }\n\n mutableMerge(target, source) {\n if (source[STATIC] !== undefined) {\n return source;\n } else {\n this.doMutableMerge(target, source);\n return target;\n }\n }\n\n doMutableMerge(target, source) {\n if (source[KEYED]) {\n this.mergeKeyed(target, source);\n } else {\n for (const key in source) {\n const val = source[key];\n const targetVal = target[key];\n const isObjVal = isObject(val);\n if (isObjVal && val[STATIC] === undefined && isObject(targetVal)) {\n this.doMutableMerge(targetVal, val);\n } else {\n target[key] = val;\n }\n }\n }\n if (target[ROOT]) {\n target.newRender = true;\n }\n }\n\n clone(diff) {\n if (\"structuredClone\" in window) {\n return structuredClone(diff);\n } else {\n // fallback for jest\n return JSON.parse(JSON.stringify(diff));\n }\n }\n\n // keyed comprehensions\n mergeKeyed(target, source) {\n // we need to clone the target since elements can move and otherwise\n // it could happen that we modify an element that we'll need to refer to\n // later\n const clonedTarget = this.clone(target);\n Object.entries(source[KEYED]).forEach(([i, entry]) => {\n if (i === KEYED_COUNT) {\n return;\n }\n if (Array.isArray(entry)) {\n // [old_idx, diff]\n // moved with diff\n const [old_idx, diff] = entry;\n target[KEYED][i] = clonedTarget[KEYED][old_idx];\n this.doMutableMerge(target[KEYED][i], diff);\n } else if (typeof entry === \"number\") {\n // moved without diff\n const old_idx = entry;\n target[KEYED][i] = clonedTarget[KEYED][old_idx];\n } else if (typeof entry === \"object\") {\n // diff, same position\n if (!target[KEYED][i]) {\n target[KEYED][i] = {};\n }\n this.doMutableMerge(target[KEYED][i], entry);\n }\n });\n // drop extra entries\n if (source[KEYED][KEYED_COUNT] < target[KEYED][KEYED_COUNT]) {\n for (\n let i = source[KEYED][KEYED_COUNT];\n i < target[KEYED][KEYED_COUNT];\n i++\n ) {\n delete target[KEYED][i];\n }\n }\n target[KEYED][KEYED_COUNT] = source[KEYED][KEYED_COUNT];\n if (source[STREAM]) {\n target[STREAM] = source[STREAM];\n }\n if (source[TEMPLATES]) {\n target[TEMPLATES] = source[TEMPLATES];\n }\n }\n\n // Merges cid trees together, copying statics from source tree.\n //\n // The `pruneMagicId` is passed to control pruning the magicId of the\n // target. We must always prune the magicId when we are sharing statics\n // from another component. If not pruning, we replicate the logic from\n // mutableMerge, where we set newRender to true if there is a root\n // (effectively forcing the new version to be rendered instead of skipped)\n //\n cloneMerge(target, source, pruneMagicId) {\n const merged = { ...target, ...source };\n for (const key in merged) {\n const val = source[key];\n const targetVal = target[key];\n if (isObject(val) && val[STATIC] === undefined && isObject(targetVal)) {\n merged[key] = this.cloneMerge(targetVal, val, pruneMagicId);\n } else if (val === undefined && isObject(targetVal)) {\n merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId);\n }\n }\n if (pruneMagicId) {\n delete merged.magicId;\n delete merged.newRender;\n } else if (target[ROOT]) {\n merged.newRender = true;\n }\n return merged;\n }\n\n componentToString(cid) {\n const { buffer: str, streams } = this.recursiveCIDToString(\n this.rendered[COMPONENTS],\n cid,\n null,\n );\n const [strippedHTML, _before, _after] = modifyRoot(str, {});\n return { buffer: strippedHTML, streams: streams };\n }\n\n pruneCIDs(cids) {\n cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]);\n }\n\n // private\n\n get() {\n return this.rendered;\n }\n\n isNewFingerprint(diff = {}) {\n return !!diff[STATIC];\n }\n\n templateStatic(part, templates) {\n if (typeof part === \"number\") {\n return templates[part];\n } else {\n return part;\n }\n }\n\n nextMagicID() {\n this.magicId++;\n return `m${this.magicId}-${this.parentViewId()}`;\n }\n\n // Converts rendered tree to output buffer.\n //\n // changeTracking controls if we can apply the PHX_SKIP optimization.\n toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}) {\n if (rendered[KEYED]) {\n return this.comprehensionToBuffer(\n rendered,\n templates,\n output,\n changeTracking,\n );\n }\n\n // Templates are a way of sharing statics between multiple rendered structs.\n // Since LiveView 1.1, those can also appear at the root - for example if one renders\n // two comprehensions that can share statics.\n // Whenever we find templates, we need to use them recursively. Also, templates can\n // be sent for each diff, not only for the initial one. We don't want to merge them\n // though, so we always resolve them and remove them from the rendered object.\n if (rendered[TEMPLATES]) {\n templates = rendered[TEMPLATES];\n delete rendered[TEMPLATES];\n }\n\n let { [STATIC]: statics } = rendered;\n statics = this.templateStatic(statics, templates);\n rendered[STATIC] = statics;\n const isRoot = rendered[ROOT];\n const prevBuffer = output.buffer;\n if (isRoot) {\n output.buffer = \"\";\n }\n\n // this condition is called when first rendering an optimizable function component.\n // LC have their magicId previously set\n if (changeTracking && isRoot && !rendered.magicId) {\n rendered.newRender = true;\n rendered.magicId = this.nextMagicID();\n }\n\n output.buffer += statics[0];\n for (let i = 1; i < statics.length; i++) {\n this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking);\n output.buffer += statics[i];\n }\n\n // Applies the root tag \"skip\" optimization if supported, which clears\n // the root tag attributes and innerHTML, and only maintains the magicId.\n // We can only skip when changeTracking is supported,\n // and when the root element hasn't experienced an unrendered merge (newRender true).\n if (isRoot) {\n let skip = false;\n let attrs;\n // When a LC is re-added to the page, we need to re-render the entire LC tree,\n // therefore changeTracking is false; however, we need to keep all the magicIds\n // from any function component so the next time the LC is updated, we can apply\n // the skip optimization\n if (changeTracking || rendered.magicId) {\n skip = changeTracking && !rendered.newRender;\n attrs = { [PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs };\n } else {\n attrs = rootAttrs;\n }\n if (skip) {\n attrs[PHX_SKIP] = true;\n }\n const [newRoot, commentBefore, commentAfter] = modifyRoot(\n output.buffer,\n attrs,\n skip,\n );\n rendered.newRender = false;\n output.buffer = prevBuffer + commentBefore + newRoot + commentAfter;\n }\n }\n\n comprehensionToBuffer(rendered, templates, output, changeTracking) {\n const keyedTemplates = templates || rendered[TEMPLATES];\n const statics = this.templateStatic(rendered[STATIC], templates);\n rendered[STATIC] = statics;\n delete rendered[TEMPLATES];\n for (let i = 0; i < rendered[KEYED][KEYED_COUNT]; i++) {\n output.buffer += statics[0];\n for (let j = 1; j < statics.length; j++) {\n this.dynamicToBuffer(\n rendered[KEYED][i][j - 1],\n keyedTemplates,\n output,\n changeTracking,\n );\n output.buffer += statics[j];\n }\n }\n // we don't need to store the rendered tree for streams\n if (rendered[STREAM]) {\n const stream = rendered[STREAM];\n const [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null];\n if (\n stream !== undefined &&\n (rendered[KEYED][KEYED_COUNT] > 0 || deleteIds.length > 0 || reset)\n ) {\n delete rendered[STREAM];\n rendered[KEYED] = {\n [KEYED_COUNT]: 0,\n };\n output.streams.add(stream);\n }\n }\n }\n\n dynamicToBuffer(rendered, templates, output, changeTracking) {\n if (typeof rendered === \"number\") {\n const { buffer: str, streams } = this.recursiveCIDToString(\n output.components,\n rendered,\n output.onlyCids,\n );\n output.buffer += str;\n output.streams = new Set([...output.streams, ...streams]);\n } else if (isObject(rendered)) {\n this.toOutputBuffer(rendered, templates, output, changeTracking, {});\n } else {\n output.buffer += rendered;\n }\n }\n\n recursiveCIDToString(components, cid, onlyCids) {\n const component =\n components[cid] || logError(`no component for CID ${cid}`, components);\n const attrs = { [PHX_COMPONENT]: cid, [PHX_VIEW_REF]: this.viewId };\n const skip = onlyCids && !onlyCids.has(cid);\n // Two optimization paths apply here:\n //\n // 1. The onlyCids optimization works by the server diff telling us only specific\n // cid's have changed. This allows us to skip rendering any component that hasn't changed,\n // which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n //\n // 2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n // works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n // at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n // experienced a change which must be a newRender, and thus we can't skip the render.\n //\n // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n // we track a deterministic magicId based on the cid.\n //\n // changeTracking is about the entire tree\n // newRender is about the current root in the tree\n //\n // By default changeTracking is enabled, but we special case the flow where the client is pruning\n // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n // for the entire component tree.\n component.newRender = !skip;\n component.magicId = `c${cid}-${this.parentViewId()}`;\n // enable change tracking as long as the component hasn't been reset\n const changeTracking = !component.reset;\n const { buffer: html, streams } = this.recursiveToString(\n component,\n components,\n onlyCids,\n changeTracking,\n attrs,\n );\n // disable reset after we've rendered\n delete component.reset;\n\n return { buffer: html, streams: streams };\n }\n}\n", "import DOM from \"./dom\";\nimport ARIA from \"./aria\";\n\nconst focusStack = [];\nconst default_transition_time = 200;\n\nconst JS = {\n // private\n exec(e, eventType, phxEvent, view, sourceEl, defaults) {\n const [defaultKind, defaultArgs] = defaults || [\n null,\n { callback: defaults && defaults.callback },\n ];\n const commands =\n phxEvent.charAt(0) === \"[\"\n ? JSON.parse(phxEvent)\n : [[defaultKind, defaultArgs]];\n\n commands.forEach(([kind, args]) => {\n if (kind === defaultKind) {\n // always prefer the args, but keep existing keys from the defaultArgs\n args = { ...defaultArgs, ...args };\n args.callback = args.callback || defaultArgs.callback;\n }\n this.filterToEls(view.liveSocket, sourceEl, args).forEach((el) => {\n this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args);\n });\n });\n },\n\n isVisible(el) {\n return !!(\n el.offsetWidth ||\n el.offsetHeight ||\n el.getClientRects().length > 0\n );\n },\n\n // returns true if any part of the element is inside the viewport\n isInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n const windowWidth =\n window.innerWidth || document.documentElement.clientWidth;\n\n return (\n rect.right > 0 &&\n rect.bottom > 0 &&\n rect.left < windowWidth &&\n rect.top < windowHeight\n );\n },\n\n // private\n\n // commands\n\n exec_exec(e, eventType, phxEvent, view, sourceEl, el, { attr, to }) {\n const encodedJS = el.getAttribute(attr);\n if (!encodedJS) {\n throw new Error(`expected ${attr} to contain JS command on \"${to}\"`);\n }\n view.liveSocket.execJS(el, encodedJS, eventType);\n },\n\n exec_dispatch(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { event, detail, bubbles, blocking },\n ) {\n detail = detail || {};\n detail.dispatcher = sourceEl;\n if (blocking) {\n const promise = new Promise((resolve, _reject) => {\n detail.done = resolve;\n });\n view.liveSocket.asyncTransition(promise);\n }\n DOM.dispatchEvent(el, event, { detail, bubbles });\n },\n\n exec_push(e, eventType, phxEvent, view, sourceEl, el, args) {\n const {\n event,\n data,\n target,\n page_loading,\n loading,\n value,\n dispatcher,\n callback,\n } = args;\n const pushOpts = {\n loading,\n value,\n target,\n page_loading: !!page_loading,\n originalEvent: e,\n };\n const targetSrc =\n eventType === \"change\" && dispatcher ? dispatcher : sourceEl;\n const phxTarget =\n target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc;\n const handler = (targetView, targetCtx) => {\n if (!targetView.isConnected()) {\n return;\n }\n if (eventType === \"change\") {\n let { newCid, _target } = args;\n _target =\n _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined);\n if (_target) {\n pushOpts._target = _target;\n }\n targetView.pushInput(\n sourceEl,\n targetCtx,\n newCid,\n event || phxEvent,\n pushOpts,\n callback,\n );\n } else if (eventType === \"submit\") {\n const { submitter } = args;\n targetView.submitForm(\n sourceEl,\n targetCtx,\n event || phxEvent,\n submitter,\n pushOpts,\n callback,\n );\n } else {\n targetView.pushEvent(\n eventType,\n sourceEl,\n targetCtx,\n event || phxEvent,\n data,\n pushOpts,\n callback,\n );\n }\n };\n // in case of formRecovery, targetView and targetCtx are passed as argument\n // as they are looked up in a template element, not the real DOM\n if (args.targetView && args.targetCtx) {\n handler(args.targetView, args.targetCtx);\n } else {\n view.withinTargets(phxTarget, handler);\n }\n },\n\n exec_navigate(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) {\n view.liveSocket.historyRedirect(\n e,\n href,\n replace ? \"replace\" : \"push\",\n null,\n sourceEl,\n );\n },\n\n exec_patch(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) {\n view.liveSocket.pushHistoryPatch(\n e,\n href,\n replace ? \"replace\" : \"push\",\n sourceEl,\n );\n },\n\n exec_focus(e, eventType, phxEvent, view, sourceEl, el) {\n ARIA.attemptFocus(el);\n // in case the JS.focus command is in a JS.show/hide/toggle chain, for show we need\n // to wait for JS.show to have updated the element's display property (see exec_toggle)\n // but that run in nested animation frames, therefore we need to use them here as well\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => ARIA.attemptFocus(el));\n });\n },\n\n exec_focus_first(e, eventType, phxEvent, view, sourceEl, el) {\n ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el);\n // if you wonder about the nested animation frames, see exec_focus\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(\n () => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el),\n );\n });\n },\n\n exec_push_focus(e, eventType, phxEvent, view, sourceEl, el) {\n focusStack.push(el || sourceEl);\n },\n\n exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el) {\n const el = focusStack.pop();\n if (el) {\n el.focus();\n // if you wonder about the nested animation frames, see exec_focus\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => el.focus());\n });\n }\n },\n\n exec_add_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.addOrRemoveClasses(el, names, [], transition, time, view, blocking);\n },\n\n exec_remove_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.addOrRemoveClasses(el, [], names, transition, time, view, blocking);\n },\n\n exec_toggle_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.toggleClasses(el, names, transition, time, view, blocking);\n },\n\n exec_toggle_attr(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { attr: [attr, val1, val2] },\n ) {\n this.toggleAttr(el, attr, val1, val2);\n },\n\n exec_ignore_attrs(e, eventType, phxEvent, view, sourceEl, el, { attrs }) {\n this.ignoreAttrs(el, attrs);\n },\n\n exec_transition(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { time, transition, blocking },\n ) {\n this.addOrRemoveClasses(el, [], [], transition, time, view, blocking);\n },\n\n exec_toggle(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, ins, outs, time, blocking },\n ) {\n this.toggle(eventType, view, el, display, ins, outs, time, blocking);\n },\n\n exec_show(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, transition, time, blocking },\n ) {\n this.show(eventType, view, el, display, transition, time, blocking);\n },\n\n exec_hide(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, transition, time, blocking },\n ) {\n this.hide(eventType, view, el, display, transition, time, blocking);\n },\n\n exec_set_attr(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { attr: [attr, val] },\n ) {\n this.setOrRemoveAttrs(el, [[attr, val]], []);\n },\n\n exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, { attr }) {\n this.setOrRemoveAttrs(el, [], [attr]);\n },\n\n ignoreAttrs(el, attrs) {\n DOM.putPrivate(el, \"JS:ignore_attrs\", {\n apply: (fromEl, toEl) => {\n Array.from(fromEl.attributes).forEach((attr) => {\n if (\n attrs.some(\n (toIgnore) =>\n attr.name == toIgnore ||\n (toIgnore.includes(\"*\") && attr.name.match(toIgnore) != null),\n )\n ) {\n toEl.setAttribute(attr.name, attr.value);\n }\n });\n },\n });\n },\n\n onBeforeElUpdated(fromEl, toEl) {\n const ignoreAttrs = DOM.private(fromEl, \"JS:ignore_attrs\");\n if (ignoreAttrs) {\n ignoreAttrs.apply(fromEl, toEl);\n }\n },\n\n // utils for commands\n\n show(eventType, view, el, display, transition, time, blocking) {\n if (!this.isVisible(el)) {\n this.toggle(\n eventType,\n view,\n el,\n display,\n transition,\n null,\n time,\n blocking,\n );\n }\n },\n\n hide(eventType, view, el, display, transition, time, blocking) {\n if (this.isVisible(el)) {\n this.toggle(\n eventType,\n view,\n el,\n display,\n null,\n transition,\n time,\n blocking,\n );\n }\n },\n\n toggle(eventType, view, el, display, ins, outs, time, blocking) {\n time = time || default_transition_time;\n const [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];\n const [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];\n if (inClasses.length > 0 || outClasses.length > 0) {\n if (this.isVisible(el)) {\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n outStartClasses,\n inClasses.concat(inStartClasses).concat(inEndClasses),\n );\n window.requestAnimationFrame(() => {\n this.addOrRemoveClasses(el, outClasses, []);\n window.requestAnimationFrame(() =>\n this.addOrRemoveClasses(el, outEndClasses, outStartClasses),\n );\n });\n };\n const onEnd = () => {\n this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = \"none\"),\n );\n el.dispatchEvent(new Event(\"phx:hide-end\"));\n };\n el.dispatchEvent(new Event(\"phx:hide-start\"));\n if (blocking === false) {\n onStart();\n setTimeout(onEnd, time);\n } else {\n view.transition(time, onStart, onEnd);\n }\n } else {\n if (eventType === \"remove\") {\n return;\n }\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n inStartClasses,\n outClasses.concat(outStartClasses).concat(outEndClasses),\n );\n const stickyDisplay = display || this.defaultDisplay(el);\n window.requestAnimationFrame(() => {\n // first add the starting + active class, THEN make the element visible\n // otherwise if we toggled the visibility earlier css animations\n // would flicker, as the element becomes visible before the active animation\n // class is set (see https://github.com/phoenixframework/phoenix_live_view/issues/3456)\n this.addOrRemoveClasses(el, inClasses, []);\n // addOrRemoveClasses uses a requestAnimationFrame itself, therefore we need to move the putSticky\n // into the next requestAnimationFrame...\n window.requestAnimationFrame(() => {\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = stickyDisplay),\n );\n this.addOrRemoveClasses(el, inEndClasses, inStartClasses);\n });\n });\n };\n const onEnd = () => {\n this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));\n el.dispatchEvent(new Event(\"phx:show-end\"));\n };\n el.dispatchEvent(new Event(\"phx:show-start\"));\n if (blocking === false) {\n onStart();\n setTimeout(onEnd, time);\n } else {\n view.transition(time, onStart, onEnd);\n }\n }\n } else {\n if (this.isVisible(el)) {\n window.requestAnimationFrame(() => {\n el.dispatchEvent(new Event(\"phx:hide-start\"));\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = \"none\"),\n );\n el.dispatchEvent(new Event(\"phx:hide-end\"));\n });\n } else {\n window.requestAnimationFrame(() => {\n el.dispatchEvent(new Event(\"phx:show-start\"));\n const stickyDisplay = display || this.defaultDisplay(el);\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = stickyDisplay),\n );\n el.dispatchEvent(new Event(\"phx:show-end\"));\n });\n }\n }\n },\n\n toggleClasses(el, classes, transition, time, view, blocking) {\n window.requestAnimationFrame(() => {\n const [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []]);\n const newAdds = classes.filter(\n (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name),\n );\n const newRemoves = classes.filter(\n (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name),\n );\n this.addOrRemoveClasses(\n el,\n newAdds,\n newRemoves,\n transition,\n time,\n view,\n blocking,\n );\n });\n },\n\n toggleAttr(el, attr, val1, val2) {\n if (el.hasAttribute(attr)) {\n if (val2 !== undefined) {\n // toggle between val1 and val2\n if (el.getAttribute(attr) === val1) {\n this.setOrRemoveAttrs(el, [[attr, val2]], []);\n } else {\n this.setOrRemoveAttrs(el, [[attr, val1]], []);\n }\n } else {\n // remove attr\n this.setOrRemoveAttrs(el, [], [attr]);\n }\n } else {\n this.setOrRemoveAttrs(el, [[attr, val1]], []);\n }\n },\n\n addOrRemoveClasses(el, adds, removes, transition, time, view, blocking) {\n time = time || default_transition_time;\n const [transitionRun, transitionStart, transitionEnd] = transition || [\n [],\n [],\n [],\n ];\n if (transitionRun.length > 0) {\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n transitionStart,\n [].concat(transitionRun).concat(transitionEnd),\n );\n window.requestAnimationFrame(() => {\n this.addOrRemoveClasses(el, transitionRun, []);\n window.requestAnimationFrame(() =>\n this.addOrRemoveClasses(el, transitionEnd, transitionStart),\n );\n });\n };\n const onDone = () =>\n this.addOrRemoveClasses(\n el,\n adds.concat(transitionEnd),\n removes.concat(transitionRun).concat(transitionStart),\n );\n if (blocking === false) {\n onStart();\n setTimeout(onDone, time);\n } else {\n view.transition(time, onStart, onDone);\n }\n return;\n }\n\n window.requestAnimationFrame(() => {\n const [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []]);\n const keepAdds = adds.filter(\n (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name),\n );\n const keepRemoves = removes.filter(\n (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name),\n );\n const newAdds = prevAdds\n .filter((name) => removes.indexOf(name) < 0)\n .concat(keepAdds);\n const newRemoves = prevRemoves\n .filter((name) => adds.indexOf(name) < 0)\n .concat(keepRemoves);\n\n DOM.putSticky(el, \"classes\", (currentEl) => {\n currentEl.classList.remove(...newRemoves);\n currentEl.classList.add(...newAdds);\n return [newAdds, newRemoves];\n });\n });\n },\n\n setOrRemoveAttrs(el, sets, removes) {\n const [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []]);\n\n const alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes);\n const newSets = prevSets\n .filter(([attr, _val]) => !alteredAttrs.includes(attr))\n .concat(sets);\n const newRemoves = prevRemoves\n .filter((attr) => !alteredAttrs.includes(attr))\n .concat(removes);\n\n DOM.putSticky(el, \"attrs\", (currentEl) => {\n newRemoves.forEach((attr) => currentEl.removeAttribute(attr));\n newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val));\n return [newSets, newRemoves];\n });\n },\n\n hasAllClasses(el, classes) {\n return classes.every((name) => el.classList.contains(name));\n },\n\n isToggledOut(el, outClasses) {\n return !this.isVisible(el) || this.hasAllClasses(el, outClasses);\n },\n\n filterToEls(liveSocket, sourceEl, { to }) {\n const defaultQuery = () => {\n if (typeof to === \"string\") {\n return document.querySelectorAll(to);\n } else if (to.closest) {\n const toEl = sourceEl.closest(to.closest);\n return toEl ? [toEl] : [];\n } else if (to.inner) {\n return sourceEl.querySelectorAll(to.inner);\n }\n };\n return to\n ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery)\n : [sourceEl];\n },\n\n defaultDisplay(el) {\n return (\n { tr: \"table-row\", td: \"table-cell\" }[el.tagName.toLowerCase()] || \"block\"\n );\n },\n\n transitionClasses(val) {\n if (!val) {\n return null;\n }\n\n let [trans, tStart, tEnd] = Array.isArray(val)\n ? val\n : [val.split(\" \"), [], []];\n trans = Array.isArray(trans) ? trans : trans.split(\" \");\n tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \");\n tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \");\n return [trans, tStart, tEnd];\n },\n};\n\nexport default JS;\n", "import JS from \"./js\";\nimport LiveSocket from \"./live_socket\";\n\ntype Transition = string | string[];\n\n// Base options for commands involving transitions and timing\ntype BaseOpts = {\n /**\n * The CSS transition classes to set.\n * Accepts a string of classes or a 3-tuple like:\n * `[\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]`\n */\n transition?: Transition;\n /** The transition duration in milliseconds. Defaults 200. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\ntype ShowOpts = BaseOpts & {\n /** The CSS display value to set. Defaults \"block\". */\n display?: string;\n};\n\ntype ToggleOpts = {\n /** The CSS display value to set. Defaults \"block\". */\n display?: string;\n /**\n * The CSS transition classes for showing.\n * Accepts either the string of classes to apply when toggling in, or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n * `[\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]`\n */\n in?: Transition;\n /**\n * The CSS transition classes for hiding.\n * Accepts either string of classes to apply when toggling out, or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n * `[\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]`\n */\n out?: Transition;\n /** The transition duration in milliseconds. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\n// Options specific to the 'transition' command\ntype TransitionCommandOpts = {\n /** The transition duration in milliseconds. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\ntype PushOpts = {\n /** Data to be merged into the event payload. */\n value?: any;\n /** For targeting a LiveComponent by its ID, a component ID (number), or a CSS selector string. */\n target?: HTMLElement | number | string;\n /** Indicates if a page loading state should be shown. */\n page_loading?: boolean;\n [key: string]: any; // Allow other properties like 'cid', 'redirect', etc.\n};\n\ntype NavigationOpts = {\n /** Whether to replace the current history entry instead of pushing a new one. */\n replace?: boolean;\n};\n\n/**\n * Represents all possible JS commands that can be generated by the factory.\n * This is used as a base for LiveSocketJSCommands and HookJSCommands.\n */\ninterface AllJSCommands {\n /**\n * Executes encoded JavaScript in the context of the element.\n * This version is for general use via liveSocket.js().\n *\n * @param el - The element in whose context to execute the JavaScript.\n * @param encodedJS - The encoded JavaScript string to execute.\n */\n exec(el: HTMLElement, encodedJS: string): void;\n\n /**\n * Shows an element.\n *\n * @param el - The element to show.\n * @param {ShowOpts} [opts={}] - Optional settings.\n * Accepts: `display`, `transition`, `time`, and `blocking`.\n */\n show(el: HTMLElement, opts?: ShowOpts): void;\n\n /**\n * Hides an element.\n *\n * @param el - The element to hide.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n hide(el: HTMLElement, opts?: BaseOpts): void;\n\n /**\n * Toggles the visibility of an element.\n *\n * @param el - The element to toggle.\n * @param [opts={}] - Optional settings.\n * Accepts: `display`, `in`, `out`, `time`, and `blocking`.\n */\n toggle(el: HTMLElement, opts?: ToggleOpts): void;\n\n /**\n * Adds CSS classes to an element.\n *\n * @param el - The element to add classes to.\n * @param names - The class name(s) to add.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n addClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Removes CSS classes from an element.\n *\n * @param el - The element to remove classes from.\n * @param names - The class name(s) to remove.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n removeClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Toggles CSS classes on an element.\n *\n * @param el - The element to toggle classes on.\n * @param names - The class name(s) to toggle.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n toggleClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Applies a CSS transition to an element.\n *\n * @param el - The element to apply the transition to.\n * @param transition - The transition class(es) to apply.\n * Accepts a string of classes to apply when transitioning or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n *\n * [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n *\n * @param [opts={}] - Optional settings for timing and blocking behavior.\n * Accepts: `time` and `blocking`.\n */\n transition(\n el: HTMLElement,\n transition: string | string[],\n opts?: TransitionCommandOpts,\n ): void;\n\n /**\n * Sets an attribute on an element.\n *\n * @param el - The element to set the attribute on.\n * @param attr - The attribute name to set.\n * @param val - The value to set for the attribute.\n */\n setAttribute(el: HTMLElement, attr: string, val: string): void;\n\n /**\n * Removes an attribute from an element.\n *\n * @param el - The element to remove the attribute from.\n * @param attr - The attribute name to remove.\n */\n removeAttribute(el: HTMLElement, attr: string): void;\n\n /**\n * Toggles an attribute on an element between two values.\n *\n * @param el - The element to toggle the attribute on.\n * @param attr - The attribute name to toggle.\n * @param val1 - The first value to toggle between.\n * @param val2 - The second value to toggle between.\n */\n toggleAttribute(\n el: HTMLElement,\n attr: string,\n val1: string,\n val2: string,\n ): void;\n\n /**\n * Pushes an event to the server.\n *\n * @param el - An element that belongs to the target LiveView / LiveComponent or a component ID.\n * To target a LiveComponent by its ID, pass a separate `target` in the options.\n * @param type - The event name to push.\n * @param [opts={}] - Optional settings.\n * Accepts: `value`, `target`, `page_loading`.\n */\n push(el: HTMLElement, type: string, opts?: PushOpts): void;\n\n /**\n * Sends a navigation event to the server and updates the browser's pushState history.\n *\n * @param href - The URL to navigate to.\n * @param [opts={}] - Optional settings.\n * Accepts: `replace`.\n */\n navigate(href: string, opts?: NavigationOpts): void;\n\n /**\n * Sends a patch event to the server and updates the browser's pushState history.\n *\n * @param href - The URL to patch to.\n * @param [opts={}] - Optional settings.\n * Accepts: `replace`.\n */\n patch(href: string, opts?: NavigationOpts): void;\n\n /**\n * Mark attributes as ignored, skipping them when patching the DOM.\n *\n * @param el - The element to ignore attributes on.\n * @param attrs - The attribute name or names to ignore.\n */\n ignoreAttributes(el: HTMLElement, attrs: string | string[]): void;\n}\n\nexport default (\n liveSocket: LiveSocket,\n eventType: string | null,\n): AllJSCommands => {\n return {\n exec(el, encodedJS) {\n liveSocket.execJS(el, encodedJS, eventType);\n },\n show(el, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.show(\n eventType,\n owner,\n el,\n opts.display,\n JS.transitionClasses(opts.transition),\n opts.time,\n opts.blocking,\n );\n },\n hide(el, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.hide(\n eventType,\n owner,\n el,\n null,\n JS.transitionClasses(opts.transition),\n opts.time,\n opts.blocking,\n );\n },\n toggle(el, opts = {}) {\n const owner = liveSocket.owner(el);\n const inTransition = JS.transitionClasses(opts.in);\n const outTransition = JS.transitionClasses(opts.out);\n JS.toggle(\n eventType,\n owner,\n el,\n opts.display,\n inTransition,\n outTransition,\n opts.time,\n opts.blocking,\n );\n },\n addClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n classNames,\n [],\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n removeClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n [],\n classNames,\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n toggleClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.toggleClasses(\n el,\n classNames,\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n transition(el, transition, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n [],\n [],\n JS.transitionClasses(transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n setAttribute(el, attr, val) {\n JS.setOrRemoveAttrs(el, [[attr, val]], []);\n },\n removeAttribute(el, attr) {\n JS.setOrRemoveAttrs(el, [], [attr]);\n },\n toggleAttribute(el, attr, val1, val2) {\n JS.toggleAttr(el, attr, val1, val2);\n },\n push(el, type, opts = {}) {\n liveSocket.withinOwners(el, (view) => {\n const data = opts.value || {};\n delete opts.value;\n let e = new CustomEvent(\"phx:exec\", { detail: { sourceElement: el } });\n JS.exec(e, eventType, type, view, el, [\"push\", { data, ...opts }]);\n });\n },\n navigate(href, opts = {}) {\n const customEvent = new CustomEvent(\"phx:exec\");\n liveSocket.historyRedirect(\n customEvent,\n href,\n opts.replace ? \"replace\" : \"push\",\n null,\n null,\n );\n },\n patch(href, opts = {}) {\n const customEvent = new CustomEvent(\"phx:exec\");\n liveSocket.pushHistoryPatch(\n customEvent,\n href,\n opts.replace ? \"replace\" : \"push\",\n null,\n );\n },\n ignoreAttributes(el, attrs) {\n JS.ignoreAttrs(el, Array.isArray(attrs) ? attrs : [attrs]);\n },\n };\n};\n\n/**\n * JSCommands for use with `liveSocket.js()`.\n * Includes the general `exec` command that requires an element.\n */\nexport type LiveSocketJSCommands = AllJSCommands;\n\n/**\n * JSCommands for use within a Hook.\n * The `exec` command is tailored for hooks, not requiring an explicit element.\n */\nexport interface HookJSCommands extends Omit<AllJSCommands, \"exec\"> {\n /**\n * Executes encoded JavaScript in the context of the hook's element.\n *\n * @param {string} encodedJS - The encoded JavaScript string to execute.\n */\n exec(encodedJS: string): void;\n}\n", "import jsCommands, { HookJSCommands } from \"./js_commands\";\nimport DOM from \"./dom\";\nimport LiveSocket from \"./live_socket\";\nimport View from \"./view\";\n\nconst HOOK_ID = \"hookId\";\nlet viewHookID = 1;\n\nexport type OnReply = (reply: any, ref: number) => any;\nexport type CallbackRef = { event: string; callback: (payload: any) => any };\n\nexport type PhxTarget = string | number | HTMLElement;\n\nexport interface HookInterface {\n /**\n * The DOM element that the hook is attached to.\n */\n el: HTMLElement;\n\n /**\n * The LiveSocket instance that the hook is attached to.\n */\n liveSocket: LiveSocket;\n\n /**\n * The mounted callback.\n *\n * Called when the element has been added to the DOM and its server LiveView has finished mounting.\n */\n mounted?: () => void;\n\n /**\n * The beforeUpdate callback.\n *\n * Called when the element is about to be updated in the DOM.\n * Note: any call here must be synchronous as the operation cannot be deferred or cancelled.\n */\n beforeUpdate?: () => void;\n\n /**\n * The updated callback.\n *\n * Called when the element has been updated in the DOM by the server\n */\n updated?: () => void;\n\n /**\n * The destroyed callback.\n *\n * Called when the element has been removed from the page, either by a parent update, or by the parent being removed entirely\n */\n destroyed?: () => void;\n\n /**\n * The disconnected callback.\n *\n * Called when the element's parent LiveView has disconnected from the server.\n */\n disconnected?: () => void;\n\n /**\n * The reconnected callback.\n *\n * Called when the element's parent LiveView has reconnected to the server.\n */\n reconnected?: () => void;\n\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n */\n js(): HookJSCommands;\n\n /**\n * Pushes an event to the server.\n *\n * @param event - The event name.\n * @param [payload] - The payload to send to the server. Defaults to an empty object.\n * @param [onReply] - A callback to handle the server's reply.\n *\n * When onReply is not provided, the method returns a Promise that\n * When onReply is provided, the method returns void.\n */\n pushEvent(event: string, payload: any, onReply: OnReply): void;\n pushEvent(event: string, payload?: any): Promise<any>;\n\n /**\n * Pushed a targeted event to the server.\n *\n * It sends the event to the LiveComponent or LiveView the `selectorOrTarget` is defined in,\n * where its value can be either a query selector, an actual DOM element, or a CID (component id)\n * returned by the `@myself` assign.\n *\n * If the query selector returns more than one element it will send the event to all of them,\n * even if all the elements are in the same LiveComponent or LiveView. Because of this,\n * if no callback is passed, a promise is returned that matches the return value of\n * [`Promise.allSettled()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled#return_value).\n * Individual fulfilled values are of the format `{ reply, ref }`, where `reply` is the server's reply.\n *\n * @param selectorOrTarget - The selector, element, or CID to target.\n * @param event - The event name.\n * @param [payload] - The payload to send to the server. Defaults to an empty object.\n * @param [onReply] - A callback to handle the server's reply.\n *\n * When onReply is not provided, the method returns a Promise.\n * When onReply is provided, the method returns void.\n */\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload: object,\n onReply: OnReply,\n ): void;\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload?: object,\n ): Promise<PromiseSettledResult<{ reply: any; ref: number }>[]>;\n\n /**\n * Allows to register a callback to be called when an event is received from the server.\n *\n * This is used to handle `pushEvent` calls from the server. The callback is called with the payload from the server.\n *\n * @param event - The event name.\n * @param callback - The callback to call when the event is received.\n *\n * @returns A reference to the callback, which can be used in `removeHandleEvent` to remove the callback.\n */\n handleEvent(event: string, callback: (payload: any) => any): CallbackRef;\n\n /**\n * Removes a callback registered with `handleEvent`.\n *\n * @param callbackRef - The reference to the callback to remove.\n */\n removeHandleEvent(ref: CallbackRef): void;\n\n /**\n * Allows to trigger a live file upload.\n *\n * @param name - The upload name corresponding to the `Phoenix.LiveView.allow_upload/3` call.\n * @param files - The files to upload.\n */\n upload(name: any, files: any): any;\n\n /**\n * Allows to trigger a live file upload to a specific target.\n *\n * @param selectorOrTarget - The target to upload the files to.\n * @param name - The upload name corresponding to the `Phoenix.LiveView.allow_upload/3` call.\n * @param files - The files to upload.\n */\n uploadTo(selectorOrTarget: PhxTarget, name: any, files: any): any;\n\n // allow unknown methods, as people can define them in their hooks\n [key: string]: any;\n}\n\n// based on https://github.com/DefinitelyTyped/DefinitelyTyped/blob/fac1aa75acdddbf4f1a95e98ee2297b54ce4b4c9/types/phoenix_live_view/hooks.d.ts#L26\n// licensed under MIT\nexport interface Hook<T = object> {\n /**\n * The mounted callback.\n *\n * Called when the element has been added to the DOM and its server LiveView has finished mounting.\n */\n mounted?: (this: T & HookInterface) => void;\n\n /**\n * The beforeUpdate callback.\n *\n * Called when the element is about to be updated in the DOM.\n * Note: any call here must be synchronous as the operation cannot be deferred or cancelled.\n */\n beforeUpdate?: (this: T & HookInterface) => void;\n\n /**\n * The updated callback.\n *\n * Called when the element has been updated in the DOM by the server\n */\n updated?: (this: T & HookInterface) => void;\n\n /**\n * The destroyed callback.\n *\n * Called when the element has been removed from the page, either by a parent update, or by the parent being removed entirely\n */\n destroyed?: (this: T & HookInterface) => void;\n\n /**\n * The disconnected callback.\n *\n * Called when the element's parent LiveView has disconnected from the server.\n */\n disconnected?: (this: T & HookInterface) => void;\n\n /**\n * The reconnected callback.\n *\n * Called when the element's parent LiveView has reconnected to the server.\n */\n reconnected?: (this: T & HookInterface) => void;\n\n // Allow custom methods with any signature and custom properties\n [key: string]: ((this: T & HookInterface, ...args: any[]) => any) | any;\n}\n\n/**\n * Base class for LiveView hooks. Users extend this class to define their hooks.\n *\n * Example:\n * ```typescript\n * class MyCustomHook extends ViewHook {\n * myState = \"initial\";\n *\n * mounted() {\n * console.log(\"Hook mounted on element:\", this.el);\n * this.el.addEventListener(\"click\", () => {\n * this.pushEvent(\"element-clicked\", { state: this.myState });\n * });\n * }\n *\n * updated() {\n * console.log(\"Hook updated\", this.el.id);\n * }\n *\n * myCustomMethod(someArg: string) {\n * console.log(\"myCustomMethod called with:\", someArg, \"Current state:\", this.myState);\n * }\n * }\n * ```\n *\n * The `this` context within the hook methods (mounted, updated, custom methods, etc.)\n * will refer to the hook instance, providing access to `this.el`, `this.liveSocket`,\n * `this.pushEvent()`, etc., as well as any properties or methods defined on the subclass.\n */\nexport class ViewHook implements HookInterface {\n el: HTMLElement;\n liveSocket: LiveSocket;\n\n private __listeners: Set<CallbackRef>;\n private __isDisconnected: boolean;\n private __view: () => View;\n\n static makeID() {\n return viewHookID++;\n }\n static elementID(el: HTMLElement) {\n return DOM.private(el, HOOK_ID);\n }\n\n constructor(view: View | null, el: HTMLElement, callbacks?: Hook) {\n this.el = el;\n this.__attachView(view);\n this.__listeners = new Set();\n this.__isDisconnected = false;\n DOM.putPrivate(this.el, HOOK_ID, ViewHook.makeID());\n\n if (callbacks) {\n // This instance is for an object-literal hook. Copy methods/properties.\n // These are properties that should NOT be overridden by the callbacks object.\n const protectedProps = new Set([\n \"el\",\n \"liveSocket\",\n \"__view\",\n \"__listeners\",\n \"__isDisconnected\",\n \"constructor\", // Standard object properties\n // Core ViewHook API methods\n \"js\",\n \"pushEvent\",\n \"pushEventTo\",\n \"handleEvent\",\n \"removeHandleEvent\",\n \"upload\",\n \"uploadTo\",\n // Internal lifecycle callers\n \"__mounted\",\n \"__updated\",\n \"__beforeUpdate\",\n \"__destroyed\",\n \"__reconnected\",\n \"__disconnected\",\n \"__cleanup__\",\n ]);\n\n for (const key in callbacks) {\n if (Object.prototype.hasOwnProperty.call(callbacks, key)) {\n (this as any)[key] = callbacks[key];\n // for backwards compatibility, we allow the overwrite, but we log a warning\n if (protectedProps.has(key)) {\n console.warn(\n `Hook object for element #${el.id} overwrites core property '${key}'!`,\n );\n }\n }\n }\n\n const lifecycleMethods: (keyof Hook)[] = [\n \"mounted\",\n \"beforeUpdate\",\n \"updated\",\n \"destroyed\",\n \"disconnected\",\n \"reconnected\",\n ];\n lifecycleMethods.forEach((methodName) => {\n if (\n callbacks[methodName] &&\n typeof callbacks[methodName] === \"function\"\n ) {\n (this as any)[methodName] = callbacks[methodName];\n }\n });\n }\n // If 'callbacks' is not provided, this is an instance of a user-defined class (e.g., MyHook).\n // Its methods (mounted, updated, custom) are already part of its prototype or instance,\n // and will correctly override the defaults from ViewHook.prototype.\n }\n\n /** @internal */\n __attachView(view: View | null) {\n if (view) {\n this.__view = () => view;\n this.liveSocket = view.liveSocket;\n } else {\n this.__view = () => {\n throw new Error(\n `hook not yet attached to a live view: ${this.el.outerHTML}`,\n );\n };\n this.liveSocket = null;\n }\n }\n\n // Default lifecycle methods\n mounted(): void {}\n beforeUpdate(): void {}\n updated(): void {}\n destroyed(): void {}\n disconnected(): void {}\n reconnected(): void {}\n\n // Internal lifecycle callers - called by the View\n\n /** @internal */\n __mounted() {\n this.mounted();\n }\n /** @internal */\n __updated() {\n this.updated();\n }\n /** @internal */\n __beforeUpdate() {\n this.beforeUpdate();\n }\n /** @internal */\n __destroyed() {\n this.destroyed();\n DOM.deletePrivate(this.el, HOOK_ID); // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n }\n /** @internal */\n __reconnected() {\n if (this.__isDisconnected) {\n this.__isDisconnected = false;\n this.reconnected();\n }\n }\n /** @internal */\n __disconnected() {\n this.__isDisconnected = true;\n this.disconnected();\n }\n\n js(): HookJSCommands {\n return {\n ...jsCommands(this.__view().liveSocket, \"hook\"),\n exec: (encodedJS: string) => {\n this.__view().liveSocket.execJS(this.el, encodedJS, \"hook\");\n },\n };\n }\n\n pushEvent(event: string, payload?: any, onReply?: OnReply) {\n const promise = this.__view().pushHookEvent(\n this.el,\n null,\n event,\n payload || {},\n );\n if (onReply === undefined) {\n return promise.then(({ reply }) => reply);\n }\n promise.then(({ reply, ref }) => onReply(reply, ref)).catch(() => {});\n return;\n }\n\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload?: object,\n onReply?: OnReply,\n ) {\n if (onReply === undefined) {\n const targetPair: { view: View; targetCtx: any }[] = [];\n this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n targetPair.push({ view, targetCtx });\n });\n const promises = targetPair.map(({ view, targetCtx }) => {\n return view.pushHookEvent(this.el, targetCtx, event, payload || {});\n });\n return Promise.allSettled(promises);\n }\n this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n view\n .pushHookEvent(this.el, targetCtx, event, payload || {})\n .then(({ reply, ref }) => onReply(reply, ref))\n .catch(() => {});\n });\n return;\n }\n\n handleEvent(event: string, callback: (payload: any) => any): CallbackRef {\n const callbackRef: CallbackRef = {\n event,\n callback: (customEvent: CustomEvent) => callback(customEvent.detail),\n };\n window.addEventListener(\n `phx:${event}`,\n callbackRef.callback as EventListener,\n );\n this.__listeners.add(callbackRef);\n return callbackRef;\n }\n\n removeHandleEvent(ref: CallbackRef): void {\n window.removeEventListener(\n `phx:${ref.event}`,\n ref.callback as EventListener,\n );\n this.__listeners.delete(ref);\n }\n\n upload(name: string, files: FileList): any {\n return this.__view().dispatchUploads(null, name, files);\n }\n\n uploadTo(selectorOrTarget: PhxTarget, name: string, files: FileList): any {\n return this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n view.dispatchUploads(targetCtx, name, files);\n });\n }\n\n /** @internal */\n __cleanup__() {\n this.__listeners.forEach((callbackRef) =>\n this.removeHandleEvent(callbackRef),\n );\n }\n}\n\nexport type HooksOptions = Record<string, typeof ViewHook | Hook>;\n\nexport default ViewHook;\n", "import {\n BEFORE_UNLOAD_LOADER_TIMEOUT,\n CHECKABLE_INPUTS,\n CONSECUTIVE_RELOADS,\n PHX_AUTO_RECOVER,\n PHX_COMPONENT,\n PHX_CONNECTED_CLASS,\n PHX_DISABLE_WITH,\n PHX_DISABLE_WITH_RESTORE,\n PHX_DISABLED,\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n PHX_HAS_FOCUSED,\n PHX_HAS_SUBMITTED,\n PHX_HOOK,\n PHX_PARENT_ID,\n PHX_PROGRESS,\n PHX_READONLY,\n PHX_REF_LOADING,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_STATIC,\n PHX_STICKY,\n PHX_TRACK_STATIC,\n PHX_TRACK_UPLOADS,\n PHX_UPDATE,\n PHX_UPLOAD_REF,\n PHX_VIEW_SELECTOR,\n PHX_MAIN,\n PHX_MOUNTED,\n PUSH_TIMEOUT,\n PHX_VIEWPORT_TOP,\n PHX_VIEWPORT_BOTTOM,\n MAX_CHILD_JOIN_ATTEMPTS,\n PHX_LV_PID,\n} from \"./constants\";\n\nimport {\n clone,\n closestPhxBinding,\n isEmpty,\n isEqualObj,\n logError,\n maybe,\n isCid,\n} from \"./utils\";\n\nimport Browser from \"./browser\";\nimport DOM from \"./dom\";\nimport ElementRef from \"./element_ref\";\nimport DOMPatch from \"./dom_patch\";\nimport LiveUploader from \"./live_uploader\";\nimport Rendered from \"./rendered\";\nimport { ViewHook } from \"./view_hook\";\nimport JS from \"./js\";\n\nimport morphdom from \"morphdom\";\n\nexport const prependFormDataKey = (key, prefix) => {\n const isArray = key.endsWith(\"[]\");\n // Remove the \"[]\" if it's an array\n let baseKey = isArray ? key.slice(0, -2) : key;\n // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`);\n // Add back the \"[]\" if it was an array\n if (isArray) {\n baseKey += \"[]\";\n }\n return baseKey;\n};\n\nconst serializeForm = (form, opts, onlyNames = []) => {\n const { submitter } = opts;\n\n // We must inject the submitter in the order that it exists in the DOM\n // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n let injectedElement;\n if (submitter && submitter.name) {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n // set the form attribute if the submitter has one;\n // this can happen if the element is outside the actual form element\n const formId = submitter.getAttribute(\"form\");\n if (formId) {\n input.setAttribute(\"form\", formId);\n }\n input.name = submitter.name;\n input.value = submitter.value;\n submitter.parentElement.insertBefore(input, submitter);\n injectedElement = input;\n }\n\n const formData = new FormData(form);\n const toRemove = [];\n\n formData.forEach((val, key, _index) => {\n if (val instanceof File) {\n toRemove.push(key);\n }\n });\n\n // Cleanup after building fileData\n toRemove.forEach((key) => formData.delete(key));\n\n const params = new URLSearchParams();\n\n const { inputsUnused, onlyHiddenInputs } = Array.from(form.elements).reduce(\n (acc, input) => {\n const { inputsUnused, onlyHiddenInputs } = acc;\n const key = input.name;\n if (!key) {\n return acc;\n }\n\n if (inputsUnused[key] === undefined) {\n inputsUnused[key] = true;\n }\n if (onlyHiddenInputs[key] === undefined) {\n onlyHiddenInputs[key] = true;\n }\n\n const isUsed =\n DOM.private(input, PHX_HAS_FOCUSED) ||\n DOM.private(input, PHX_HAS_SUBMITTED);\n const isHidden = input.type === \"hidden\";\n inputsUnused[key] = inputsUnused[key] && !isUsed;\n onlyHiddenInputs[key] = onlyHiddenInputs[key] && isHidden;\n\n return acc;\n },\n { inputsUnused: {}, onlyHiddenInputs: {} },\n );\n\n for (const [key, val] of formData.entries()) {\n if (onlyNames.length === 0 || onlyNames.indexOf(key) >= 0) {\n const isUnused = inputsUnused[key];\n const hidden = onlyHiddenInputs[key];\n if (isUnused && !(submitter && submitter.name == key) && !hidden) {\n params.append(prependFormDataKey(key, \"_unused_\"), \"\");\n }\n if (typeof val === \"string\") {\n params.append(key, val);\n }\n }\n }\n\n // remove the injected element again\n // (it would be removed by the next dom patch anyway, but this is cleaner)\n if (submitter && injectedElement) {\n submitter.parentElement.removeChild(injectedElement);\n }\n\n return params.toString();\n};\n\nexport default class View {\n static closestView(el) {\n const liveViewEl = el.closest(PHX_VIEW_SELECTOR);\n return liveViewEl ? DOM.private(liveViewEl, \"view\") : null;\n }\n\n constructor(el, liveSocket, parentView, flash, liveReferer) {\n this.isDead = false;\n this.liveSocket = liveSocket;\n this.flash = flash;\n this.parent = parentView;\n this.root = parentView ? parentView.root : this;\n this.el = el;\n // see https://github.com/phoenixframework/phoenix_live_view/pull/3721\n // check if the element is already bound to a view\n const boundView = DOM.private(this.el, \"view\");\n if (boundView !== undefined && boundView.isDead !== true) {\n logError(\n `The DOM element for this view has already been bound to a view.\n\n An element can only ever be associated with a single view!\n Please ensure that you are not trying to initialize multiple LiveSockets on the same page.\n This could happen if you're accidentally trying to render your root layout more than once.\n Ensure that the template set on the LiveView is different than the root layout.\n `,\n { view: boundView },\n );\n throw new Error(\"Cannot bind multiple views to the same DOM element.\");\n }\n // bind the view to the element\n DOM.putPrivate(this.el, \"view\", this);\n this.id = this.el.id;\n this.ref = 0;\n this.lastAckRef = null;\n this.childJoins = 0;\n this.loaderTimer = null;\n this.disconnectedTimer = null;\n this.pendingDiffs = [];\n this.pendingForms = new Set();\n this.redirect = false;\n this.href = null;\n this.joinCount = this.parent ? this.parent.joinCount - 1 : 0;\n this.joinAttempts = 0;\n this.joinPending = true;\n this.destroyed = false;\n this.joinCallback = function (onDone) {\n onDone && onDone();\n };\n this.stopCallback = function () {};\n this.pendingJoinOps = this.parent ? null : [];\n this.viewHooks = {};\n this.formSubmits = [];\n this.children = this.parent ? null : {};\n this.root.children[this.id] = {};\n this.formsForRecovery = {};\n this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n const url = this.href && this.expandURL(this.href);\n return {\n redirect: this.redirect ? url : undefined,\n url: this.redirect ? undefined : url || undefined,\n params: this.connectParams(liveReferer),\n session: this.getSession(),\n static: this.getStatic(),\n flash: this.flash,\n sticky: this.el.hasAttribute(PHX_STICKY),\n };\n });\n this.portalElementIds = new Set();\n }\n\n setHref(href) {\n this.href = href;\n }\n\n setRedirect(href) {\n this.redirect = true;\n this.href = href;\n }\n\n isMain() {\n return this.el.hasAttribute(PHX_MAIN);\n }\n\n connectParams(liveReferer) {\n const params = this.liveSocket.params(this.el);\n const manifest = DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n .map((node) => node.src || node.href)\n .filter((url) => typeof url === \"string\");\n\n if (manifest.length > 0) {\n params[\"_track_static\"] = manifest;\n }\n params[\"_mounts\"] = this.joinCount;\n params[\"_mount_attempts\"] = this.joinAttempts;\n params[\"_live_referer\"] = liveReferer;\n this.joinAttempts++;\n\n return params;\n }\n\n isConnected() {\n return this.channel.canPush();\n }\n\n getSession() {\n return this.el.getAttribute(PHX_SESSION);\n }\n\n getStatic() {\n const val = this.el.getAttribute(PHX_STATIC);\n return val === \"\" ? null : val;\n }\n\n destroy(callback = function () {}) {\n this.destroyAllChildren();\n this.destroyPortalElements();\n this.destroyed = true;\n DOM.deletePrivate(this.el, \"view\");\n delete this.root.children[this.id];\n if (this.parent) {\n delete this.root.children[this.parent.id][this.id];\n }\n clearTimeout(this.loaderTimer);\n const onFinished = () => {\n callback();\n for (const id in this.viewHooks) {\n this.destroyHook(this.viewHooks[id]);\n }\n };\n\n DOM.markPhxChildDestroyed(this.el);\n\n this.log(\"destroyed\", () => [\"the child has been removed from the parent\"]);\n this.channel\n .leave()\n .receive(\"ok\", onFinished)\n .receive(\"error\", onFinished)\n .receive(\"timeout\", onFinished);\n }\n\n setContainerClasses(...classes) {\n this.el.classList.remove(\n PHX_CONNECTED_CLASS,\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n );\n this.el.classList.add(...classes);\n }\n\n showLoader(timeout) {\n clearTimeout(this.loaderTimer);\n if (timeout) {\n this.loaderTimer = setTimeout(() => this.showLoader(), timeout);\n } else {\n for (const id in this.viewHooks) {\n this.viewHooks[id].__disconnected();\n }\n this.setContainerClasses(PHX_LOADING_CLASS);\n }\n }\n\n execAll(binding) {\n DOM.all(this.el, `[${binding}]`, (el) =>\n this.liveSocket.execJS(el, el.getAttribute(binding)),\n );\n }\n\n hideLoader() {\n clearTimeout(this.loaderTimer);\n clearTimeout(this.disconnectedTimer);\n this.setContainerClasses(PHX_CONNECTED_CLASS);\n this.execAll(this.binding(\"connected\"));\n }\n\n triggerReconnected() {\n for (const id in this.viewHooks) {\n this.viewHooks[id].__reconnected();\n }\n }\n\n log(kind, msgCallback) {\n this.liveSocket.log(this, kind, msgCallback);\n }\n\n transition(time, onStart, onDone = function () {}) {\n this.liveSocket.transition(time, onStart, onDone);\n }\n\n // calls the callback with the view and target element for the given phxTarget\n // targets can be:\n // * an element itself, then it is simply passed to liveSocket.owner;\n // * a CID (Component ID), then we first search the component's element in the DOM\n // * a selector, then we search the selector in the DOM and call the callback\n // for each element found with the corresponding owner view\n withinTargets(phxTarget, callback, dom = document) {\n // in the form recovery case we search in a template fragment instead of\n // the real dom, therefore we optionally pass dom and viewEl\n\n if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {\n return this.liveSocket.owner(phxTarget, (view) =>\n callback(view, phxTarget),\n );\n }\n\n if (isCid(phxTarget)) {\n const targets = DOM.findComponentNodeList(this.id, phxTarget, dom);\n if (targets.length === 0) {\n logError(`no component found matching phx-target of ${phxTarget}`);\n } else {\n callback(this, parseInt(phxTarget));\n }\n } else {\n const targets = Array.from(dom.querySelectorAll(phxTarget));\n if (targets.length === 0) {\n logError(\n `nothing found matching the phx-target selector \"${phxTarget}\"`,\n );\n }\n targets.forEach((target) =>\n this.liveSocket.owner(target, (view) => callback(view, target)),\n );\n }\n }\n\n applyDiff(type, rawDiff, callback) {\n this.log(type, () => [\"\", clone(rawDiff)]);\n const { diff, reply, events, title } = Rendered.extract(rawDiff);\n callback({ diff, reply, events });\n if (typeof title === \"string\" || type == \"mount\") {\n window.requestAnimationFrame(() => DOM.putTitle(title));\n }\n }\n\n onJoin(resp) {\n const { rendered, container, liveview_version, pid } = resp;\n if (container) {\n const [tag, attrs] = container;\n this.el = DOM.replaceRootContainer(this.el, tag, attrs);\n }\n this.childJoins = 0;\n this.joinPending = true;\n this.flash = null;\n if (this.root === this) {\n this.formsForRecovery = this.getFormsForRecovery();\n }\n if (this.isMain() && window.history.state === null) {\n // set initial history entry if this is the first page load (no history)\n Browser.pushState(\"replace\", {\n type: \"patch\",\n id: this.id,\n position: this.liveSocket.currentHistoryPosition,\n });\n }\n\n if (liveview_version !== this.liveSocket.version()) {\n console.error(\n `LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`,\n );\n }\n\n // The pid is only sent if\n //\n // config :phoenix_live_view, :debug_attributes\n //\n // if set to true. It is to help debugging in development.\n if (pid) {\n this.el.setAttribute(PHX_LV_PID, pid);\n }\n\n Browser.dropLocal(\n this.liveSocket.localStorage,\n window.location.pathname,\n CONSECUTIVE_RELOADS,\n );\n this.applyDiff(\"mount\", rendered, ({ diff, events }) => {\n this.rendered = new Rendered(this.id, diff);\n const [html, streams] = this.renderContainer(null, \"join\");\n this.dropPendingRefs();\n this.joinCount++;\n this.joinAttempts = 0;\n\n this.maybeRecoverForms(html, () => {\n this.onJoinComplete(resp, html, streams, events);\n });\n });\n }\n\n dropPendingRefs() {\n DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, (el) => {\n el.removeAttribute(PHX_REF_LOADING);\n el.removeAttribute(PHX_REF_SRC);\n el.removeAttribute(PHX_REF_LOCK);\n });\n }\n\n onJoinComplete({ live_patch }, html, streams, events) {\n // In order to provide a better experience, we want to join\n // all LiveViews first and only then apply their patches.\n if (this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())) {\n return this.applyJoinPatch(live_patch, html, streams, events);\n }\n\n // One downside of this approach is that we need to find phxChildren\n // in the html fragment, instead of directly on the DOM. The fragment\n // also does not include PHX_STATIC, so we need to copy it over from\n // the DOM.\n const newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(\n (toEl) => {\n const fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`);\n const phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC);\n if (phxStatic) {\n toEl.setAttribute(PHX_STATIC, phxStatic);\n }\n // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n // while the child join is still pending\n if (fromEl) {\n fromEl.setAttribute(PHX_ROOT_ID, this.root.id);\n }\n return this.joinChild(toEl);\n },\n );\n\n if (newChildren.length === 0) {\n if (this.parent) {\n this.root.pendingJoinOps.push([\n this,\n () => this.applyJoinPatch(live_patch, html, streams, events),\n ]);\n this.parent.ackJoin(this);\n } else {\n this.onAllChildJoinsComplete();\n this.applyJoinPatch(live_patch, html, streams, events);\n }\n } else {\n this.root.pendingJoinOps.push([\n this,\n () => this.applyJoinPatch(live_patch, html, streams, events),\n ]);\n }\n }\n\n attachTrueDocEl() {\n this.el = DOM.byId(this.id);\n this.el.setAttribute(PHX_ROOT_ID, this.root.id);\n }\n\n // this is invoked for dead and live views, so we must filter by\n // by owner to ensure we aren't duplicating hooks across disconnect\n // and connected states. This also handles cases where hooks exist\n // in a root layout with a LV in the body\n execNewMounted(parent = document) {\n let phxViewportTop = this.binding(PHX_VIEWPORT_TOP);\n let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM);\n this.all(\n parent,\n `[${phxViewportTop}], [${phxViewportBottom}]`,\n (hookEl) => {\n DOM.maintainPrivateHooks(\n hookEl,\n hookEl,\n phxViewportTop,\n phxViewportBottom,\n );\n this.maybeAddNewHook(hookEl);\n },\n );\n this.all(\n parent,\n `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`,\n (hookEl) => {\n this.maybeAddNewHook(hookEl);\n },\n );\n this.all(parent, `[${this.binding(PHX_MOUNTED)}]`, (el) => {\n this.maybeMounted(el);\n });\n }\n\n all(parent, selector, callback) {\n DOM.all(parent, selector, (el) => {\n if (this.ownsElement(el)) {\n callback(el);\n }\n });\n }\n\n applyJoinPatch(live_patch, html, streams, events) {\n this.attachTrueDocEl();\n const patch = new DOMPatch(this, this.el, this.id, html, streams, null);\n patch.markPrunableContentForRemoval();\n this.performPatch(patch, false, true);\n this.joinNewChildren();\n this.execNewMounted();\n\n this.joinPending = false;\n this.liveSocket.dispatchEvents(events);\n this.applyPendingUpdates();\n\n if (live_patch) {\n const { kind, to } = live_patch;\n this.liveSocket.historyPatch(to, kind);\n }\n this.hideLoader();\n if (this.joinCount > 1) {\n this.triggerReconnected();\n }\n this.stopCallback();\n }\n\n triggerBeforeUpdateHook(fromEl, toEl) {\n this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl]);\n const hook = this.getHook(fromEl);\n const isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE));\n if (\n hook &&\n !fromEl.isEqualNode(toEl) &&\n !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))\n ) {\n hook.__beforeUpdate();\n return hook;\n }\n }\n\n maybeMounted(el) {\n const phxMounted = el.getAttribute(this.binding(PHX_MOUNTED));\n const hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\");\n if (phxMounted && !hasBeenInvoked) {\n this.liveSocket.execJS(el, phxMounted);\n DOM.putPrivate(el, \"mounted\", true);\n }\n }\n\n maybeAddNewHook(el) {\n const newHook = this.addHook(el);\n if (newHook) {\n newHook.__mounted();\n }\n }\n\n performPatch(patch, pruneCids, isJoinPatch = false) {\n const removedEls = [];\n let phxChildrenAdded = false;\n const updatedHookIds = new Set();\n\n this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer]);\n\n patch.after(\"added\", (el) => {\n this.liveSocket.triggerDOM(\"onNodeAdded\", [el]);\n const phxViewportTop = this.binding(PHX_VIEWPORT_TOP);\n const phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM);\n DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom);\n this.maybeAddNewHook(el);\n if (el.getAttribute) {\n this.maybeMounted(el);\n }\n });\n\n patch.after(\"phxChildAdded\", (el) => {\n if (DOM.isPhxSticky(el)) {\n this.liveSocket.joinRootViews();\n } else {\n phxChildrenAdded = true;\n }\n });\n\n patch.before(\"updated\", (fromEl, toEl) => {\n const hook = this.triggerBeforeUpdateHook(fromEl, toEl);\n if (hook) {\n updatedHookIds.add(fromEl.id);\n }\n // trigger JS specific update logic (for example for JS.ignore_attributes)\n JS.onBeforeElUpdated(fromEl, toEl);\n });\n\n patch.after(\"updated\", (el) => {\n if (updatedHookIds.has(el.id)) {\n this.getHook(el).__updated();\n }\n });\n\n patch.after(\"discarded\", (el) => {\n if (el.nodeType === Node.ELEMENT_NODE) {\n removedEls.push(el);\n }\n });\n\n patch.after(\"transitionsDiscarded\", (els) =>\n this.afterElementsRemoved(els, pruneCids),\n );\n patch.perform(isJoinPatch);\n this.afterElementsRemoved(removedEls, pruneCids);\n\n this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer]);\n return phxChildrenAdded;\n }\n\n afterElementsRemoved(elements, pruneCids) {\n const destroyedCIDs = [];\n elements.forEach((parent) => {\n const components = DOM.all(parent, `[${PHX_COMPONENT}]`);\n const hooks = DOM.all(\n parent,\n `[${this.binding(PHX_HOOK)}], [data-phx-hook]`,\n );\n components.concat(parent).forEach((el) => {\n const cid = this.componentID(el);\n if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) {\n destroyedCIDs.push(cid);\n }\n });\n hooks.concat(parent).forEach((hookEl) => {\n const hook = this.getHook(hookEl);\n hook && this.destroyHook(hook);\n });\n });\n // We should not pruneCids on joins. Otherwise, in case of\n // rejoins, we may notify cids that no longer belong to the\n // current LiveView to be removed.\n if (pruneCids) {\n this.maybePushComponentsDestroyed(destroyedCIDs);\n }\n }\n\n joinNewChildren() {\n DOM.findPhxChildren(document, this.id).forEach((el) => this.joinChild(el));\n }\n\n maybeRecoverForms(html, callback) {\n const phxChange = this.binding(\"change\");\n const oldForms = this.root.formsForRecovery;\n // So why do we create a template element here?\n // One way to recover forms would be to immediately apply the mount\n // patch and then afterwards recover the forms. However, this would\n // cause a flicker, because the mount patch would remove the form content\n // until it is restored. Therefore LV decided to do form recovery with the\n // raw HTML before it is applied and delay the mount patch until the form\n // recovery events are done.\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n // because we work with a template element, we must manually copy the attributes\n // otherwise the owner / target helpers don't work properly\n const rootEl = template.content.firstElementChild;\n rootEl.id = this.id;\n rootEl.setAttribute(PHX_ROOT_ID, this.root.id);\n rootEl.setAttribute(PHX_SESSION, this.getSession());\n rootEl.setAttribute(PHX_STATIC, this.getStatic());\n rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null);\n\n // we go over all form elements in the new HTML for the LV\n // and look for old forms in the `formsForRecovery` object;\n // the formsForRecovery can also contain forms from child views\n const formsToRecover =\n // we go over all forms in the new DOM; because this is only the HTML for the current\n // view, we can be sure that all forms are owned by this view:\n DOM.all(template.content, \"form\")\n // only recover forms that have an id and are in the old DOM\n .filter((newForm) => newForm.id && oldForms[newForm.id])\n // abandon forms we already tried to recover to prevent looping a failed state\n .filter((newForm) => !this.pendingForms.has(newForm.id))\n // only recover if the form has the same phx-change value\n .filter(\n (newForm) =>\n oldForms[newForm.id].getAttribute(phxChange) ===\n newForm.getAttribute(phxChange),\n )\n .map((newForm) => {\n return [oldForms[newForm.id], newForm];\n });\n\n if (formsToRecover.length === 0) {\n return callback();\n }\n\n formsToRecover.forEach(([oldForm, newForm], i) => {\n this.pendingForms.add(newForm.id);\n // it is important to use the firstElementChild of the template content\n // because when traversing a documentFragment using parentNode, we won't ever arrive at\n // the fragment; as the template is always a LiveView, we can be sure that there is only\n // one child on the root level\n this.pushFormRecovery(\n oldForm,\n newForm,\n template.content.firstElementChild,\n () => {\n this.pendingForms.delete(newForm.id);\n // we only call the callback once all forms have been recovered\n if (i === formsToRecover.length - 1) {\n callback();\n }\n },\n );\n });\n }\n\n getChildById(id) {\n return this.root.children[this.id][id];\n }\n\n getDescendentByEl(el) {\n if (el.id === this.id) {\n return this;\n } else {\n return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id];\n }\n }\n\n destroyDescendent(id) {\n for (const parentId in this.root.children) {\n for (const childId in this.root.children[parentId]) {\n if (childId === id) {\n return this.root.children[parentId][childId].destroy();\n }\n }\n }\n }\n\n joinChild(el) {\n const child = this.getChildById(el.id);\n if (!child) {\n const view = new View(el, this.liveSocket, this);\n this.root.children[this.id][view.id] = view;\n view.join();\n this.childJoins++;\n return true;\n }\n }\n\n isJoinPending() {\n return this.joinPending;\n }\n\n ackJoin(_child) {\n this.childJoins--;\n\n if (this.childJoins === 0) {\n if (this.parent) {\n this.parent.ackJoin(this);\n } else {\n this.onAllChildJoinsComplete();\n }\n }\n }\n\n onAllChildJoinsComplete() {\n // we can clear pending form recoveries now that we've joined.\n // They either all resolved or were abandoned\n this.pendingForms.clear();\n // we can also clear the formsForRecovery object to not keep old form elements around\n this.formsForRecovery = {};\n this.joinCallback(() => {\n this.pendingJoinOps.forEach(([view, op]) => {\n if (!view.isDestroyed()) {\n op();\n }\n });\n this.pendingJoinOps = [];\n });\n }\n\n update(diff, events) {\n if (\n this.isJoinPending() ||\n (this.liveSocket.hasPendingLink() && this.root.isMain())\n ) {\n return this.pendingDiffs.push({ diff, events });\n }\n\n this.rendered.mergeDiff(diff);\n let phxChildrenAdded = false;\n\n // When the diff only contains component diffs, then walk components\n // and patch only the parent component containers found in the diff.\n // Otherwise, patch entire LV container.\n if (this.rendered.isComponentOnlyDiff(diff)) {\n this.liveSocket.time(\"component patch complete\", () => {\n const parentCids = DOM.findExistingParentCIDs(\n this.id,\n this.rendered.componentCIDs(diff),\n );\n parentCids.forEach((parentCID) => {\n if (\n this.componentPatch(\n this.rendered.getComponent(diff, parentCID),\n parentCID,\n )\n ) {\n phxChildrenAdded = true;\n }\n });\n });\n } else if (!isEmpty(diff)) {\n this.liveSocket.time(\"full patch complete\", () => {\n const [html, streams] = this.renderContainer(diff, \"update\");\n const patch = new DOMPatch(this, this.el, this.id, html, streams, null);\n phxChildrenAdded = this.performPatch(patch, true);\n });\n }\n\n this.liveSocket.dispatchEvents(events);\n if (phxChildrenAdded) {\n this.joinNewChildren();\n }\n }\n\n renderContainer(diff, kind) {\n return this.liveSocket.time(`toString diff (${kind})`, () => {\n const tag = this.el.tagName;\n // Don't skip any component in the diff nor any marked as pruned\n // (as they may have been added back)\n const cids = diff ? this.rendered.componentCIDs(diff) : null;\n const { buffer: html, streams } = this.rendered.toString(cids);\n return [`<${tag}>${html}</${tag}>`, streams];\n });\n }\n\n componentPatch(diff, cid) {\n if (isEmpty(diff)) return false;\n const { buffer: html, streams } = this.rendered.componentToString(cid);\n const patch = new DOMPatch(this, this.el, this.id, html, streams, cid);\n const childrenAdded = this.performPatch(patch, true);\n return childrenAdded;\n }\n\n getHook(el) {\n return this.viewHooks[ViewHook.elementID(el)];\n }\n\n addHook(el) {\n const hookElId = ViewHook.elementID(el);\n\n // only ever try to add hooks to elements owned by this view\n if (el.getAttribute && !this.ownsElement(el)) {\n return;\n }\n\n if (hookElId && !this.viewHooks[hookElId]) {\n // hook created, but not attached (createHook for web component)\n const hook =\n DOM.getCustomElHook(el) ||\n logError(`no hook found for custom element: ${el.id}`);\n this.viewHooks[hookElId] = hook;\n hook.__attachView(this);\n return hook;\n } else if (hookElId || !el.getAttribute) {\n // no hook found\n return;\n } else {\n // new hook found with phx-hook attribute\n const hookName =\n el.getAttribute(`data-phx-${PHX_HOOK}`) ||\n el.getAttribute(this.binding(PHX_HOOK));\n\n if (!hookName) {\n return;\n }\n\n const hookDefinition = this.liveSocket.getHookDefinition(hookName);\n\n if (hookDefinition) {\n if (!el.id) {\n logError(\n `no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`,\n el,\n );\n return;\n }\n\n let hookInstance;\n try {\n if (\n typeof hookDefinition === \"function\" &&\n hookDefinition.prototype instanceof ViewHook\n ) {\n // It's a class constructor (subclass of ViewHook)\n hookInstance = new hookDefinition(this, el); // `this` is the View instance\n } else if (\n typeof hookDefinition === \"object\" &&\n hookDefinition !== null\n ) {\n // It's an object literal, pass it to the ViewHook constructor for wrapping\n hookInstance = new ViewHook(this, el, hookDefinition);\n } else {\n logError(\n `Invalid hook definition for \"${hookName}\". Expected a class extending ViewHook or an object definition.`,\n el,\n );\n return;\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n logError(`Failed to create hook \"${hookName}\": ${errorMessage}`, el);\n return;\n }\n\n this.viewHooks[ViewHook.elementID(hookInstance.el)] = hookInstance;\n return hookInstance;\n } else if (hookName !== null) {\n logError(`unknown hook found for \"${hookName}\"`, el);\n }\n }\n }\n\n destroyHook(hook) {\n // __destroyed clears the elementID from the hook, therefore\n // we need to get it before calling __destroyed\n const hookId = ViewHook.elementID(hook.el);\n hook.__destroyed();\n hook.__cleanup__();\n delete this.viewHooks[hookId];\n }\n\n applyPendingUpdates() {\n // prevent race conditions where we might still be pending a new\n // navigation after applying the current one;\n // if we call update and a pendingDiff is not applied, it would\n // be silently dropped otherwise, as update would push it back to\n // pendingDiffs, but we clear it immediately after\n if (this.liveSocket.hasPendingLink() && this.root.isMain()) {\n return;\n }\n this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));\n this.pendingDiffs = [];\n this.eachChild((child) => child.applyPendingUpdates());\n }\n\n eachChild(callback) {\n const children = this.root.children[this.id] || {};\n for (const id in children) {\n callback(this.getChildById(id));\n }\n }\n\n onChannel(event, cb) {\n this.liveSocket.onChannel(this.channel, event, (resp) => {\n if (this.isJoinPending()) {\n this.root.pendingJoinOps.push([this, () => cb(resp)]);\n } else {\n this.liveSocket.requestDOMUpdate(() => cb(resp));\n }\n });\n }\n\n bindChannel() {\n // The diff event should be handled by the regular update operations.\n // All other operations are queued to be applied only after join.\n this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n this.liveSocket.requestDOMUpdate(() => {\n this.applyDiff(\"update\", rawDiff, ({ diff, events }) =>\n this.update(diff, events),\n );\n });\n });\n this.onChannel(\"redirect\", ({ to, flash }) =>\n this.onRedirect({ to, flash }),\n );\n this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir));\n this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir));\n this.channel.onError((reason) => this.onError(reason));\n this.channel.onClose((reason) => this.onClose(reason));\n }\n\n destroyAllChildren() {\n this.eachChild((child) => child.destroy());\n }\n\n onLiveRedirect(redir) {\n const { to, kind, flash } = redir;\n const url = this.expandURL(to);\n const e = new CustomEvent(\"phx:server-navigate\", {\n detail: { to, kind, flash },\n });\n this.liveSocket.historyRedirect(e, url, kind, flash);\n }\n\n onLivePatch(redir) {\n const { to, kind } = redir;\n this.href = this.expandURL(to);\n this.liveSocket.historyPatch(to, kind);\n }\n\n expandURL(to) {\n return to.startsWith(\"/\")\n ? `${window.location.protocol}//${window.location.host}${to}`\n : to;\n }\n\n /**\n * @param {{to: string, flash?: string, reloadToken?: string}} redirect\n */\n onRedirect({ to, flash, reloadToken }) {\n this.liveSocket.redirect(to, flash, reloadToken);\n }\n\n isDestroyed() {\n return this.destroyed;\n }\n\n joinDead() {\n this.isDead = true;\n }\n\n joinPush() {\n this.joinPush = this.joinPush || this.channel.join();\n return this.joinPush;\n }\n\n join(callback) {\n this.showLoader(this.liveSocket.loaderTimeout);\n this.bindChannel();\n if (this.isMain()) {\n this.stopCallback = this.liveSocket.withPageLoading({\n to: this.href,\n kind: \"initial\",\n });\n }\n this.joinCallback = (onDone) => {\n onDone = onDone || function () {};\n callback ? callback(this.joinCount, onDone) : onDone();\n };\n\n this.wrapPush(() => this.channel.join(), {\n ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n error: (error) => this.onJoinError(error),\n timeout: () => this.onJoinError({ reason: \"timeout\" }),\n });\n }\n\n onJoinError(resp) {\n if (resp.reason === \"reload\") {\n this.log(\"error\", () => [\n `failed mount with ${resp.status}. Falling back to page reload`,\n resp,\n ]);\n this.onRedirect({ to: this.root.href, reloadToken: resp.token });\n return;\n } else if (resp.reason === \"unauthorized\" || resp.reason === \"stale\") {\n this.log(\"error\", () => [\n \"unauthorized live_redirect. Falling back to page request\",\n resp,\n ]);\n this.onRedirect({ to: this.root.href, flash: this.flash });\n return;\n }\n if (resp.redirect || resp.live_redirect) {\n this.joinPending = false;\n this.channel.leave();\n }\n if (resp.redirect) {\n return this.onRedirect(resp.redirect);\n }\n if (resp.live_redirect) {\n return this.onLiveRedirect(resp.live_redirect);\n }\n this.log(\"error\", () => [\"unable to join\", resp]);\n if (this.isMain()) {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n if (this.liveSocket.isConnected()) {\n this.liveSocket.reloadWithJitter(this);\n }\n } else {\n if (this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS) {\n // put the root review into permanent error state, but don't destroy it as it can remain active\n this.root.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n this.log(\"error\", () => [\n `giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`,\n resp,\n ]);\n this.destroy();\n }\n const trueChildEl = DOM.byId(this.el.id);\n if (trueChildEl) {\n DOM.mergeAttrs(trueChildEl, this.el);\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n this.el = trueChildEl;\n } else {\n this.destroy();\n }\n }\n }\n\n onClose(reason) {\n if (this.isDestroyed()) {\n return;\n }\n if (\n this.isMain() &&\n this.liveSocket.hasPendingLink() &&\n reason !== \"leave\"\n ) {\n return this.liveSocket.reloadWithJitter(this);\n }\n this.destroyAllChildren();\n this.liveSocket.dropActiveElement(this);\n if (this.liveSocket.isUnloaded()) {\n this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT);\n }\n }\n\n onError(reason) {\n this.onClose(reason);\n if (this.liveSocket.isConnected()) {\n this.log(\"error\", () => [\"view crashed\", reason]);\n }\n if (!this.liveSocket.isUnloaded()) {\n if (this.liveSocket.isConnected()) {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n } else {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n ]);\n }\n }\n }\n\n displayError(classes) {\n if (this.isMain()) {\n DOM.dispatchEvent(window, \"phx:page-loading-start\", {\n detail: { to: this.href, kind: \"error\" },\n });\n }\n this.showLoader();\n this.setContainerClasses(...classes);\n this.delayedDisconnected();\n }\n\n delayedDisconnected() {\n this.disconnectedTimer = setTimeout(() => {\n this.execAll(this.binding(\"disconnected\"));\n }, this.liveSocket.disconnectedTimeout);\n }\n\n wrapPush(callerPush, receives) {\n const latency = this.liveSocket.getLatencySim();\n const withLatency = latency\n ? (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency)\n : (cb) => !this.isDestroyed() && cb();\n\n withLatency(() => {\n callerPush()\n .receive(\"ok\", (resp) =>\n withLatency(() => receives.ok && receives.ok(resp)),\n )\n .receive(\"error\", (reason) =>\n withLatency(() => receives.error && receives.error(reason)),\n )\n .receive(\"timeout\", () =>\n withLatency(() => receives.timeout && receives.timeout()),\n );\n });\n }\n\n pushWithReply(refGenerator, event, payload) {\n if (!this.isConnected()) {\n return Promise.reject(new Error(\"no connection\"));\n }\n\n const [ref, [el], opts] = refGenerator\n ? refGenerator({ payload })\n : [null, [], {}];\n const oldJoinCount = this.joinCount;\n let onLoadingDone = function () {};\n if (opts.page_loading) {\n onLoadingDone = this.liveSocket.withPageLoading({\n kind: \"element\",\n target: el,\n });\n }\n\n if (typeof payload.cid !== \"number\") {\n delete payload.cid;\n }\n\n return new Promise((resolve, reject) => {\n this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n ok: (resp) => {\n if (ref !== null) {\n this.lastAckRef = ref;\n }\n const finish = (hookReply) => {\n if (resp.redirect) {\n this.onRedirect(resp.redirect);\n }\n if (resp.live_patch) {\n this.onLivePatch(resp.live_patch);\n }\n if (resp.live_redirect) {\n this.onLiveRedirect(resp.live_redirect);\n }\n onLoadingDone();\n resolve({ resp: resp, reply: hookReply, ref });\n };\n if (resp.diff) {\n this.liveSocket.requestDOMUpdate(() => {\n this.applyDiff(\"update\", resp.diff, ({ diff, reply, events }) => {\n if (ref !== null) {\n this.undoRefs(ref, payload.event);\n }\n this.update(diff, events);\n finish(reply);\n });\n });\n } else {\n if (ref !== null) {\n this.undoRefs(ref, payload.event);\n }\n finish(null);\n }\n },\n error: (reason) => reject(new Error(`failed with reason: ${reason}`)),\n timeout: () => {\n reject(new Error(\"timeout\"));\n if (this.joinCount === oldJoinCount) {\n this.liveSocket.reloadWithJitter(this, () => {\n this.log(\"timeout\", () => [\n \"received timeout while communicating with server. Falling back to hard refresh for recovery\",\n ]);\n });\n }\n },\n });\n });\n }\n\n undoRefs(ref, phxEvent, onlyEls) {\n if (!this.isConnected()) {\n return;\n } // exit if external form triggered\n const selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`;\n\n if (onlyEls) {\n onlyEls = new Set(onlyEls);\n DOM.all(document, selector, (parent) => {\n if (onlyEls && !onlyEls.has(parent)) {\n return;\n }\n // undo any child refs within parent first\n DOM.all(parent, selector, (child) =>\n this.undoElRef(child, ref, phxEvent),\n );\n this.undoElRef(parent, ref, phxEvent);\n });\n } else {\n DOM.all(document, selector, (el) => this.undoElRef(el, ref, phxEvent));\n }\n }\n\n undoElRef(el, ref, phxEvent) {\n const elRef = new ElementRef(el);\n\n elRef.maybeUndo(ref, phxEvent, (clonedTree) => {\n // we need to perform a full patch on unlocked elements\n // to perform all the necessary logic (like calling updated for hooks, etc.)\n const patch = new DOMPatch(this, el, this.id, clonedTree, [], null, {\n undoRef: ref,\n });\n const phxChildrenAdded = this.performPatch(patch, true);\n DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, (child) =>\n this.undoElRef(child, ref, phxEvent),\n );\n if (phxChildrenAdded) {\n this.joinNewChildren();\n }\n });\n }\n\n refSrc() {\n return this.el.id;\n }\n\n putRef(elements, phxEvent, eventType, opts = {}) {\n const newRef = this.ref++;\n const disableWith = this.binding(PHX_DISABLE_WITH);\n if (opts.loading) {\n const loadingEls = DOM.all(document, opts.loading).map((el) => {\n return { el, lock: true, loading: true };\n });\n elements = elements.concat(loadingEls);\n }\n\n for (const { el, lock, loading } of elements) {\n if (!lock && !loading) {\n throw new Error(\"putRef requires lock or loading\");\n }\n el.setAttribute(PHX_REF_SRC, this.refSrc());\n if (loading) {\n el.setAttribute(PHX_REF_LOADING, newRef);\n }\n if (lock) {\n el.setAttribute(PHX_REF_LOCK, newRef);\n }\n\n if (\n !loading ||\n (opts.submitter && !(el === opts.submitter || el === opts.form))\n ) {\n continue;\n }\n\n const lockCompletePromise = new Promise((resolve) => {\n el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {\n once: true,\n });\n });\n\n const loadingCompletePromise = new Promise((resolve) => {\n el.addEventListener(\n `phx:undo-loading:${newRef}`,\n () => resolve(detail),\n { once: true },\n );\n });\n\n el.classList.add(`phx-${eventType}-loading`);\n const disableText = el.getAttribute(disableWith);\n if (disableText !== null) {\n if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) {\n el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText);\n }\n if (disableText !== \"\") {\n el.innerText = disableText;\n }\n // PHX_DISABLED could have already been set in disableForm\n el.setAttribute(\n PHX_DISABLED,\n el.getAttribute(PHX_DISABLED) || el.disabled,\n );\n el.setAttribute(\"disabled\", \"\");\n }\n\n const detail = {\n event: phxEvent,\n eventType: eventType,\n ref: newRef,\n isLoading: loading,\n isLocked: lock,\n lockElements: elements.filter(({ lock }) => lock).map(({ el }) => el),\n loadingElements: elements\n .filter(({ loading }) => loading)\n .map(({ el }) => el),\n unlock: (els) => {\n els = Array.isArray(els) ? els : [els];\n this.undoRefs(newRef, phxEvent, els);\n },\n lockComplete: lockCompletePromise,\n loadingComplete: loadingCompletePromise,\n lock: (lockEl) => {\n return new Promise((resolve) => {\n if (this.isAcked(newRef)) {\n return resolve(detail);\n }\n lockEl.setAttribute(PHX_REF_LOCK, newRef);\n lockEl.setAttribute(PHX_REF_SRC, this.refSrc());\n lockEl.addEventListener(\n `phx:lock-stop:${newRef}`,\n () => resolve(detail),\n { once: true },\n );\n });\n },\n };\n if (opts.payload) {\n detail[\"payload\"] = opts.payload;\n }\n if (opts.target) {\n detail[\"target\"] = opts.target;\n }\n if (opts.originalEvent) {\n detail[\"originalEvent\"] = opts.originalEvent;\n }\n el.dispatchEvent(\n new CustomEvent(\"phx:push\", {\n detail: detail,\n bubbles: true,\n cancelable: false,\n }),\n );\n if (phxEvent) {\n el.dispatchEvent(\n new CustomEvent(`phx:push:${phxEvent}`, {\n detail: detail,\n bubbles: true,\n cancelable: false,\n }),\n );\n }\n }\n return [newRef, elements.map(({ el }) => el), opts];\n }\n\n isAcked(ref) {\n return this.lastAckRef !== null && this.lastAckRef >= ref;\n }\n\n componentID(el) {\n const cid = el.getAttribute && el.getAttribute(PHX_COMPONENT);\n return cid ? parseInt(cid) : null;\n }\n\n targetComponentID(target, targetCtx, opts = {}) {\n if (isCid(targetCtx)) {\n return targetCtx;\n }\n\n const cidOrSelector =\n opts.target || target.getAttribute(this.binding(\"target\"));\n if (isCid(cidOrSelector)) {\n return parseInt(cidOrSelector);\n } else if (targetCtx && (cidOrSelector !== null || opts.target)) {\n return this.closestComponentID(targetCtx);\n } else {\n return null;\n }\n }\n\n closestComponentID(targetCtx) {\n if (isCid(targetCtx)) {\n return targetCtx;\n } else if (targetCtx) {\n return maybe(\n targetCtx.closest(`[${PHX_COMPONENT}]`),\n (el) => this.ownsElement(el) && this.componentID(el),\n );\n } else {\n return null;\n }\n }\n\n pushHookEvent(el, targetCtx, event, payload) {\n if (!this.isConnected()) {\n this.log(\"hook\", () => [\n \"unable to push hook event. LiveView not connected\",\n event,\n payload,\n ]);\n return Promise.reject(\n new Error(\"unable to push hook event. LiveView not connected\"),\n );\n }\n\n const refGenerator = () =>\n this.putRef([{ el, loading: true, lock: true }], event, \"hook\", {\n payload,\n target: targetCtx,\n });\n\n return this.pushWithReply(refGenerator, \"event\", {\n type: \"hook\",\n event: event,\n value: payload,\n cid: this.closestComponentID(targetCtx),\n }).then(({ resp: _resp, reply, ref }) => ({ reply, ref }));\n }\n\n extractMeta(el, meta, value) {\n const prefix = this.binding(\"value-\");\n for (let i = 0; i < el.attributes.length; i++) {\n if (!meta) {\n meta = {};\n }\n const name = el.attributes[i].name;\n if (name.startsWith(prefix)) {\n meta[name.replace(prefix, \"\")] = el.getAttribute(name);\n }\n }\n if (el.value !== undefined && !(el instanceof HTMLFormElement)) {\n if (!meta) {\n meta = {};\n }\n meta.value = el.value;\n\n if (\n el.tagName === \"INPUT\" &&\n CHECKABLE_INPUTS.indexOf(el.type) >= 0 &&\n !el.checked\n ) {\n delete meta.value;\n }\n }\n if (value) {\n if (!meta) {\n meta = {};\n }\n for (const key in value) {\n meta[key] = value[key];\n }\n }\n return meta;\n }\n\n pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply) {\n this.pushWithReply(\n (maybePayload) =>\n this.putRef([{ el, loading: true, lock: true }], phxEvent, type, {\n ...opts,\n payload: maybePayload?.payload,\n }),\n \"event\",\n {\n type: type,\n event: phxEvent,\n value: this.extractMeta(el, meta, opts.value),\n cid: this.targetComponentID(el, targetCtx, opts),\n },\n )\n .then(({ reply }) => onReply && onReply(reply))\n .catch((error) => logError(\"Failed to push event\", error));\n }\n\n pushFileProgress(fileEl, entryRef, progress, onReply = function () {}) {\n this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n view\n .pushWithReply(null, \"progress\", {\n event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n entry_ref: entryRef,\n progress: progress,\n cid: view.targetComponentID(fileEl.form, targetCtx),\n })\n .then(() => onReply())\n .catch((error) => logError(\"Failed to push file progress\", error));\n });\n }\n\n pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) {\n if (!inputEl.form) {\n throw new Error(\"form events require the input to be inside a form\");\n }\n\n let uploads;\n const cid = isCid(forceCid)\n ? forceCid\n : this.targetComponentID(inputEl.form, targetCtx, opts);\n const refGenerator = (maybePayload) => {\n return this.putRef(\n [\n { el: inputEl, loading: true, lock: true },\n { el: inputEl.form, loading: true, lock: true },\n ],\n phxEvent,\n \"change\",\n { ...opts, payload: maybePayload?.payload },\n );\n };\n let formData;\n const meta = this.extractMeta(inputEl.form, {}, opts.value);\n const serializeOpts = {};\n if (inputEl instanceof HTMLButtonElement) {\n serializeOpts.submitter = inputEl;\n }\n if (inputEl.getAttribute(this.binding(\"change\"))) {\n formData = serializeForm(inputEl.form, serializeOpts, [inputEl.name]);\n } else {\n formData = serializeForm(inputEl.form, serializeOpts);\n }\n if (\n DOM.isUploadInput(inputEl) &&\n inputEl.files &&\n inputEl.files.length > 0\n ) {\n LiveUploader.trackFiles(inputEl, Array.from(inputEl.files));\n }\n uploads = LiveUploader.serializeUploads(inputEl);\n\n const event = {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: {\n // no target was implicitly sent as \"undefined\" in LV <= 1.0.5, therefore\n // we have to keep it. In 1.0.6 we switched from passing meta as URL encoded data\n // to passing it directly in the event, but the JSON encode would drop keys with\n // undefined values.\n _target: opts._target || \"undefined\",\n ...meta,\n },\n uploads: uploads,\n cid: cid,\n };\n this.pushWithReply(refGenerator, \"event\", event)\n .then(({ resp }) => {\n if (DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)) {\n // the element could be inside a locked parent for other unrelated changes;\n // we can only start uploads when the tree is unlocked and the\n // necessary data attributes are set in the real DOM\n ElementRef.onUnlock(inputEl, () => {\n if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) {\n const [ref, _els] = refGenerator();\n this.undoRefs(ref, phxEvent, [inputEl.form]);\n this.uploadFiles(\n inputEl.form,\n phxEvent,\n targetCtx,\n ref,\n cid,\n (_uploads) => {\n callback && callback(resp);\n this.triggerAwaitingSubmit(inputEl.form, phxEvent);\n this.undoRefs(ref, phxEvent);\n },\n );\n }\n });\n } else {\n callback && callback(resp);\n }\n })\n .catch((error) => logError(\"Failed to push input event\", error));\n }\n\n triggerAwaitingSubmit(formEl, phxEvent) {\n const awaitingSubmit = this.getScheduledSubmit(formEl);\n if (awaitingSubmit) {\n const [_el, _ref, _opts, callback] = awaitingSubmit;\n this.cancelSubmit(formEl, phxEvent);\n callback();\n }\n }\n\n getScheduledSubmit(formEl) {\n return this.formSubmits.find(([el, _ref, _opts, _callback]) =>\n el.isSameNode(formEl),\n );\n }\n\n scheduleSubmit(formEl, ref, opts, callback) {\n if (this.getScheduledSubmit(formEl)) {\n return true;\n }\n this.formSubmits.push([formEl, ref, opts, callback]);\n }\n\n cancelSubmit(formEl, phxEvent) {\n this.formSubmits = this.formSubmits.filter(\n ([el, ref, _opts, _callback]) => {\n if (el.isSameNode(formEl)) {\n this.undoRefs(ref, phxEvent);\n return false;\n } else {\n return true;\n }\n },\n );\n }\n\n disableForm(formEl, phxEvent, opts = {}) {\n const filterIgnored = (el) => {\n const userIgnored = closestPhxBinding(\n el,\n `${this.binding(PHX_UPDATE)}=ignore`,\n el.form,\n );\n return !(\n userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form)\n );\n };\n const filterDisables = (el) => {\n return el.hasAttribute(this.binding(PHX_DISABLE_WITH));\n };\n const filterButton = (el) => el.tagName == \"BUTTON\";\n\n const filterInput = (el) =>\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName);\n\n const formElements = Array.from(formEl.elements);\n const disables = formElements.filter(filterDisables);\n const buttons = formElements.filter(filterButton).filter(filterIgnored);\n const inputs = formElements.filter(filterInput).filter(filterIgnored);\n\n buttons.forEach((button) => {\n button.setAttribute(PHX_DISABLED, button.disabled);\n button.disabled = true;\n });\n inputs.forEach((input) => {\n input.setAttribute(PHX_READONLY, input.readOnly);\n input.readOnly = true;\n if (input.files) {\n input.setAttribute(PHX_DISABLED, input.disabled);\n input.disabled = true;\n }\n });\n const formEls = disables\n .concat(buttons)\n .concat(inputs)\n .map((el) => {\n return { el, loading: true, lock: true };\n });\n\n // we reverse the order so form children are already locked by the time\n // the form is locked\n const els = [{ el: formEl, loading: true, lock: false }]\n .concat(formEls)\n .reverse();\n return this.putRef(els, phxEvent, \"submit\", opts);\n }\n\n pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply) {\n const refGenerator = (maybePayload) =>\n this.disableForm(formEl, phxEvent, {\n ...opts,\n form: formEl,\n payload: maybePayload?.payload,\n submitter: submitter,\n });\n // store the submitter in the form element in order to trigger it\n // for phx-trigger-action\n DOM.putPrivate(formEl, \"submitter\", submitter);\n const cid = this.targetComponentID(formEl, targetCtx);\n if (LiveUploader.hasUploadsInProgress(formEl)) {\n const [ref, _els] = refGenerator();\n const push = () =>\n this.pushFormSubmit(\n formEl,\n targetCtx,\n phxEvent,\n submitter,\n opts,\n onReply,\n );\n return this.scheduleSubmit(formEl, ref, opts, push);\n } else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {\n const [ref, els] = refGenerator();\n const proxyRefGen = () => [ref, els, opts];\n this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n // if we still having pending preflights it means we have invalid entries\n // and the phx-submit cannot be completed\n if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {\n return this.undoRefs(ref, phxEvent);\n }\n const meta = this.extractMeta(formEl, {}, opts.value);\n const formData = serializeForm(formEl, { submitter });\n this.pushWithReply(proxyRefGen, \"event\", {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: meta,\n cid: cid,\n })\n .then(({ resp }) => onReply(resp))\n .catch((error) => logError(\"Failed to push form submit\", error));\n });\n } else if (\n !(\n formEl.hasAttribute(PHX_REF_SRC) &&\n formEl.classList.contains(\"phx-submit-loading\")\n )\n ) {\n const meta = this.extractMeta(formEl, {}, opts.value);\n const formData = serializeForm(formEl, { submitter });\n this.pushWithReply(refGenerator, \"event\", {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: meta,\n cid: cid,\n })\n .then(({ resp }) => onReply(resp))\n .catch((error) => logError(\"Failed to push form submit\", error));\n }\n }\n\n uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete) {\n const joinCountAtUpload = this.joinCount;\n const inputEls = LiveUploader.activeFileInputs(formEl);\n let numFileInputsInProgress = inputEls.length;\n\n // get each file input\n inputEls.forEach((inputEl) => {\n const uploader = new LiveUploader(inputEl, this, () => {\n numFileInputsInProgress--;\n if (numFileInputsInProgress === 0) {\n onComplete();\n }\n });\n\n const entries = uploader\n .entries()\n .map((entry) => entry.toPreflightPayload());\n\n if (entries.length === 0) {\n numFileInputsInProgress--;\n return;\n }\n\n const payload = {\n ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n entries: entries,\n cid: this.targetComponentID(inputEl.form, targetCtx),\n };\n\n this.log(\"upload\", () => [\"sending preflight request\", payload]);\n\n this.pushWithReply(null, \"allow_upload\", payload)\n .then(({ resp }) => {\n this.log(\"upload\", () => [\"got preflight response\", resp]);\n // the preflight will reject entries beyond the max entries\n // so we error and cancel entries on the client that are missing from the response\n uploader.entries().forEach((entry) => {\n if (resp.entries && !resp.entries[entry.ref]) {\n this.handleFailedEntryPreflight(\n entry.ref,\n \"failed preflight\",\n uploader,\n );\n }\n });\n // for auto uploads, we may have an empty entries response from the server\n // for form submits that contain invalid entries\n if (resp.error || Object.keys(resp.entries).length === 0) {\n this.undoRefs(ref, phxEvent);\n const errors = resp.error || [];\n errors.map(([entry_ref, reason]) => {\n this.handleFailedEntryPreflight(entry_ref, reason, uploader);\n });\n } else {\n const onError = (callback) => {\n this.channel.onError(() => {\n if (this.joinCount === joinCountAtUpload) {\n callback();\n }\n });\n };\n uploader.initAdapterUpload(resp, onError, this.liveSocket);\n }\n })\n .catch((error) => logError(\"Failed to push upload\", error));\n });\n }\n\n handleFailedEntryPreflight(uploadRef, reason, uploader) {\n if (uploader.isAutoUpload()) {\n // uploadRef may be top level upload config ref or entry ref\n const entry = uploader\n .entries()\n .find((entry) => entry.ref === uploadRef.toString());\n if (entry) {\n entry.cancel();\n }\n } else {\n uploader.entries().map((entry) => entry.cancel());\n }\n this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason]);\n }\n\n dispatchUploads(targetCtx, name, filesOrBlobs) {\n const targetElement = this.targetCtxElement(targetCtx) || this.el;\n const inputs = DOM.findUploadInputs(targetElement).filter(\n (el) => el.name === name,\n );\n if (inputs.length === 0) {\n logError(`no live file inputs found matching the name \"${name}\"`);\n } else if (inputs.length > 1) {\n logError(`duplicate live file inputs found matching the name \"${name}\"`);\n } else {\n DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {\n detail: { files: filesOrBlobs },\n });\n }\n }\n\n targetCtxElement(targetCtx) {\n if (isCid(targetCtx)) {\n const [target] = DOM.findComponentNodeList(this.id, targetCtx);\n return target;\n } else if (targetCtx) {\n return targetCtx;\n } else {\n return null;\n }\n }\n\n pushFormRecovery(oldForm, newForm, templateDom, callback) {\n // we are only recovering forms inside the current view, therefore it is safe to\n // skip withinOwners here and always use this when referring to the view\n const phxChange = this.binding(\"change\");\n const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm;\n const phxEvent =\n newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) ||\n newForm.getAttribute(this.binding(\"change\"));\n const inputs = Array.from(oldForm.elements).filter(\n (el) => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange),\n );\n if (inputs.length === 0) {\n callback();\n return;\n }\n\n // we must clear tracked uploads before recovery as they no longer have valid refs\n inputs.forEach(\n (input) =>\n input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input),\n );\n // pushInput assumes that there is a source element that initiated the change;\n // because this is not the case when we recover forms, we provide the first input we find\n const input = inputs.find((el) => el.type !== \"hidden\") || inputs[0];\n\n // in the case that there are multiple targets, we count the number of pending recovery events\n // and only call the callback once all events have been processed\n let pending = 0;\n // withinTargets(phxTarget, callback, dom, viewEl)\n this.withinTargets(\n phxTarget,\n (targetView, targetCtx) => {\n const cid = this.targetComponentID(newForm, targetCtx);\n pending++;\n let e = new CustomEvent(\"phx:form-recovery\", {\n detail: { sourceElement: oldForm },\n });\n JS.exec(e, \"change\", phxEvent, this, input, [\n \"push\",\n {\n _target: input.name,\n targetView,\n targetCtx,\n newCid: cid,\n callback: () => {\n pending--;\n if (pending === 0) {\n callback();\n }\n },\n },\n ]);\n },\n templateDom,\n );\n }\n\n pushLinkPatch(e, href, targetEl, callback) {\n const linkRef = this.liveSocket.setPendingLink(href);\n // only add loading states if event is trusted (it was triggered by user, such as click) and\n // it's not a forward/back navigation from popstate\n const loading = e.isTrusted && e.type !== \"popstate\";\n const refGen = targetEl\n ? () =>\n this.putRef(\n [{ el: targetEl, loading: loading, lock: true }],\n null,\n \"click\",\n )\n : null;\n const fallback = () => this.liveSocket.redirect(window.location.href);\n const url = href.startsWith(\"/\")\n ? `${location.protocol}//${location.host}${href}`\n : href;\n\n this.pushWithReply(refGen, \"live_patch\", { url }).then(\n ({ resp }) => {\n this.liveSocket.requestDOMUpdate(() => {\n if (resp.link_redirect) {\n this.liveSocket.replaceMain(href, null, callback, linkRef);\n } else {\n if (this.liveSocket.commitPendingLink(linkRef)) {\n this.href = href;\n }\n this.applyPendingUpdates();\n callback && callback(linkRef);\n }\n });\n },\n ({ error: _error, timeout: _timeout }) => fallback(),\n );\n }\n\n getFormsForRecovery() {\n if (this.joinCount === 0) {\n return {};\n }\n\n const phxChange = this.binding(\"change\");\n\n return DOM.all(this.el, `form[${phxChange}]`)\n .filter((form) => form.id)\n .filter((form) => form.elements.length > 0)\n .filter(\n (form) =>\n form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\",\n )\n .map((form) => {\n // we perform a shallow clone and manually copy all elements\n const clonedForm = form.cloneNode(false);\n // we need to copy the private data as it contains\n // the information about touched fields\n DOM.copyPrivates(clonedForm, form);\n Array.from(form.elements).forEach((el) => {\n // we need to clone all child nodes as well,\n // because those could also be selects\n const clonedEl = el.cloneNode(true);\n // we call morphdom to copy any special state\n // like the selected option of a <select> element;\n // this should be plenty fast as we call it on a small subset of the DOM,\n // single inputs or a select with children\n morphdom(clonedEl, el);\n DOM.copyPrivates(clonedEl, el);\n clonedForm.appendChild(clonedEl);\n });\n return clonedForm;\n })\n .reduce((acc, form) => {\n acc[form.id] = form;\n return acc;\n }, {});\n }\n\n maybePushComponentsDestroyed(destroyedCIDs) {\n let willDestroyCIDs = destroyedCIDs.filter((cid) => {\n return DOM.findComponentNodeList(this.el, cid).length === 0;\n });\n\n const onError = (error) => {\n if (!this.isDestroyed()) {\n logError(\"Failed to push components destroyed\", error);\n }\n };\n\n if (willDestroyCIDs.length > 0) {\n // we must reset the render change tracking for cids that\n // could be added back from the server so we don't skip them\n willDestroyCIDs.forEach((cid) => this.rendered.resetRender(cid));\n\n this.pushWithReply(null, \"cids_will_destroy\", { cids: willDestroyCIDs })\n .then(() => {\n // we must wait for pending transitions to complete before determining\n // if the cids were added back to the DOM in the meantime (#3139)\n this.liveSocket.requestDOMUpdate(() => {\n // See if any of the cids we wanted to destroy were added back,\n // if they were added back, we don't actually destroy them.\n let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => {\n return DOM.findComponentNodeList(this.el, cid).length === 0;\n });\n\n if (completelyDestroyCIDs.length > 0) {\n this.pushWithReply(null, \"cids_destroyed\", {\n cids: completelyDestroyCIDs,\n })\n .then(({ resp }) => {\n this.rendered.pruneCIDs(resp.cids);\n })\n .catch(onError);\n }\n });\n })\n .catch(onError);\n }\n }\n\n ownsElement(el) {\n let parentViewEl = el.closest(PHX_VIEW_SELECTOR);\n return (\n el.getAttribute(PHX_PARENT_ID) === this.id ||\n (parentViewEl && parentViewEl.id === this.id) ||\n (!parentViewEl && this.isDead)\n );\n }\n\n submitForm(form, targetCtx, phxEvent, submitter, opts = {}) {\n DOM.putPrivate(form, PHX_HAS_SUBMITTED, true);\n const inputs = Array.from(form.elements);\n inputs.forEach((input) => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true));\n this.liveSocket.blurActiveElement(this);\n this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n this.liveSocket.restorePreviouslyActiveFocus();\n });\n }\n\n binding(kind) {\n return this.liveSocket.binding(kind);\n }\n\n // phx-portal\n pushPortalElementId(id) {\n this.portalElementIds.add(id);\n }\n\n dropPortalElementId(id) {\n this.portalElementIds.delete(id);\n }\n\n destroyPortalElements() {\n this.portalElementIds.forEach((id) => {\n const el = document.getElementById(id);\n if (el) {\n el.remove();\n }\n });\n }\n}\n", "import {\n BINDING_PREFIX,\n CONSECUTIVE_RELOADS,\n DEFAULTS,\n FAILSAFE_JITTER,\n LOADER_TIMEOUT,\n DISCONNECTED_TIMEOUT,\n MAX_RELOADS,\n PHX_DEBOUNCE,\n PHX_DROP_TARGET,\n PHX_HAS_FOCUSED,\n PHX_KEY,\n PHX_LINK_STATE,\n PHX_LIVE_LINK,\n PHX_LV_DEBUG,\n PHX_LV_LATENCY_SIM,\n PHX_LV_PROFILE,\n PHX_LV_HISTORY_POSITION,\n PHX_MAIN,\n PHX_PARENT_ID,\n PHX_VIEW_SELECTOR,\n PHX_ROOT_ID,\n PHX_THROTTLE,\n PHX_TRACK_UPLOADS,\n PHX_SESSION,\n RELOAD_JITTER_MIN,\n RELOAD_JITTER_MAX,\n PHX_REF_SRC,\n PHX_RELOAD_STATUS,\n PHX_RUNTIME_HOOK,\n} from \"./constants\";\n\nimport {\n clone,\n closestPhxBinding,\n closure,\n debug,\n maybe,\n logError,\n} from \"./utils\";\n\nimport Browser from \"./browser\";\nimport DOM from \"./dom\";\nimport Hooks from \"./hooks\";\nimport LiveUploader from \"./live_uploader\";\nimport View from \"./view\";\nimport JS from \"./js\";\nimport jsCommands from \"./js_commands\";\n\nexport const isUsedInput = (el) => DOM.isUsedInput(el);\n\nexport default class LiveSocket {\n constructor(url, phxSocket, opts = {}) {\n this.unloaded = false;\n if (!phxSocket || phxSocket.constructor.name === \"Object\") {\n throw new Error(`\n a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n import {Socket} from \"phoenix\"\n import {LiveSocket} from \"phoenix_live_view\"\n let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n `);\n }\n this.socket = new phxSocket(url, opts);\n this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX;\n this.opts = opts;\n this.params = closure(opts.params || {});\n this.viewLogger = opts.viewLogger;\n this.metadataCallbacks = opts.metadata || {};\n this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {});\n this.prevActive = null;\n this.silenced = false;\n this.main = null;\n this.outgoingMainEl = null;\n this.clickStartedAtTarget = null;\n this.linkRef = 1;\n this.roots = {};\n this.href = window.location.href;\n this.pendingLink = null;\n this.currentLocation = clone(window.location);\n this.hooks = opts.hooks || {};\n this.uploaders = opts.uploaders || {};\n this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT;\n this.disconnectedTimeout = opts.disconnectedTimeout || DISCONNECTED_TIMEOUT;\n this.reloadWithJitterTimer = null;\n this.maxReloads = opts.maxReloads || MAX_RELOADS;\n this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN;\n this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX;\n this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER;\n this.localStorage = opts.localStorage || window.localStorage;\n this.sessionStorage = opts.sessionStorage || window.sessionStorage;\n this.boundTopLevelEvents = false;\n this.boundEventNames = new Set();\n this.blockPhxChangeWhileComposing =\n opts.blockPhxChangeWhileComposing || false;\n this.serverCloseRef = null;\n this.domCallbacks = Object.assign(\n {\n jsQuerySelectorAll: null,\n onPatchStart: closure(),\n onPatchEnd: closure(),\n onNodeAdded: closure(),\n onBeforeElUpdated: closure(),\n },\n opts.dom || {},\n );\n this.transitions = new TransitionSet();\n this.currentHistoryPosition =\n parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0;\n window.addEventListener(\"pagehide\", (_e) => {\n this.unloaded = true;\n });\n this.socket.onOpen(() => {\n if (this.isUnloaded()) {\n // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n window.location.reload();\n }\n });\n }\n\n // public\n\n version() {\n return LV_VSN;\n }\n\n isProfileEnabled() {\n return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\";\n }\n\n isDebugEnabled() {\n return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\";\n }\n\n isDebugDisabled() {\n return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\";\n }\n\n enableDebug() {\n this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\");\n }\n\n enableProfiling() {\n this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\");\n }\n\n disableDebug() {\n this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\");\n }\n\n disableProfiling() {\n this.sessionStorage.removeItem(PHX_LV_PROFILE);\n }\n\n enableLatencySim(upperBoundMs) {\n this.enableDebug();\n console.log(\n \"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\",\n );\n this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs);\n }\n\n disableLatencySim() {\n this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM);\n }\n\n getLatencySim() {\n const str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM);\n return str ? parseInt(str) : null;\n }\n\n getSocket() {\n return this.socket;\n }\n\n connect() {\n // enable debug by default if on localhost and not explicitly disabled\n if (window.location.hostname === \"localhost\" && !this.isDebugDisabled()) {\n this.enableDebug();\n }\n const doConnect = () => {\n this.resetReloadStatus();\n if (this.joinRootViews()) {\n this.bindTopLevelEvents();\n this.socket.connect();\n } else if (this.main) {\n this.socket.connect();\n } else {\n this.bindTopLevelEvents({ dead: true });\n }\n this.joinDeadView();\n };\n if (\n [\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0\n ) {\n doConnect();\n } else {\n document.addEventListener(\"DOMContentLoaded\", () => doConnect());\n }\n }\n\n disconnect(callback) {\n clearTimeout(this.reloadWithJitterTimer);\n // remove the socket close listener to avoid trying to handle\n // a server close event when it is actually caused by us disconnecting\n if (this.serverCloseRef) {\n this.socket.off(this.serverCloseRef);\n this.serverCloseRef = null;\n }\n this.socket.disconnect(callback);\n }\n\n replaceTransport(transport) {\n clearTimeout(this.reloadWithJitterTimer);\n this.socket.replaceTransport(transport);\n this.connect();\n }\n\n execJS(el, encodedJS, eventType = null) {\n const e = new CustomEvent(\"phx:exec\", { detail: { sourceElement: el } });\n this.owner(el, (view) => JS.exec(e, eventType, encodedJS, view, el));\n }\n\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n *\n * @returns {import(\"./js_commands\").LiveSocketJSCommands}\n */\n js() {\n return jsCommands(this, \"js\");\n }\n\n // private\n\n unload() {\n if (this.unloaded) {\n return;\n }\n if (this.main && this.isConnected()) {\n this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]);\n }\n this.unloaded = true;\n this.destroyAllViews();\n this.disconnect();\n }\n\n triggerDOM(kind, args) {\n this.domCallbacks[kind](...args);\n }\n\n time(name, func) {\n if (!this.isProfileEnabled() || !console.time) {\n return func();\n }\n console.time(name);\n const result = func();\n console.timeEnd(name);\n return result;\n }\n\n log(view, kind, msgCallback) {\n if (this.viewLogger) {\n const [msg, obj] = msgCallback();\n this.viewLogger(view, kind, msg, obj);\n } else if (this.isDebugEnabled()) {\n const [msg, obj] = msgCallback();\n debug(view, kind, msg, obj);\n }\n }\n\n requestDOMUpdate(callback) {\n this.transitions.after(callback);\n }\n\n asyncTransition(promise) {\n this.transitions.addAsyncTransition(promise);\n }\n\n transition(time, onStart, onDone = function () {}) {\n this.transitions.addTransition(time, onStart, onDone);\n }\n\n onChannel(channel, event, cb) {\n channel.on(event, (data) => {\n const latency = this.getLatencySim();\n if (!latency) {\n cb(data);\n } else {\n setTimeout(() => cb(data), latency);\n }\n });\n }\n\n reloadWithJitter(view, log) {\n clearTimeout(this.reloadWithJitterTimer);\n this.disconnect();\n const minMs = this.reloadJitterMin;\n const maxMs = this.reloadJitterMax;\n let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;\n const tries = Browser.updateLocal(\n this.localStorage,\n window.location.pathname,\n CONSECUTIVE_RELOADS,\n 0,\n (count) => count + 1,\n );\n if (tries >= this.maxReloads) {\n afterMs = this.failsafeJitter;\n }\n this.reloadWithJitterTimer = setTimeout(() => {\n // if view has recovered, such as transport replaced, then cancel\n if (view.isDestroyed() || view.isConnected()) {\n return;\n }\n view.destroy();\n log\n ? log()\n : this.log(view, \"join\", () => [\n `encountered ${tries} consecutive reloads`,\n ]);\n if (tries >= this.maxReloads) {\n this.log(view, \"join\", () => [\n `exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`,\n ]);\n }\n if (this.hasPendingLink()) {\n window.location = this.pendingLink;\n } else {\n window.location.reload();\n }\n }, afterMs);\n }\n\n getHookDefinition(name) {\n if (!name) {\n return;\n }\n return (\n this.maybeInternalHook(name) ||\n this.hooks[name] ||\n this.maybeRuntimeHook(name)\n );\n }\n\n maybeInternalHook(name) {\n return name && name.startsWith(\"Phoenix.\") && Hooks[name.split(\".\")[1]];\n }\n\n maybeRuntimeHook(name) {\n const runtimeHook = document.querySelector(\n `script[${PHX_RUNTIME_HOOK}=\"${CSS.escape(name)}\"]`,\n );\n if (!runtimeHook) {\n return;\n }\n let callbacks = window[`phx_hook_${name}`];\n if (!callbacks || typeof callbacks !== \"function\") {\n logError(\"a runtime hook must be a function\", runtimeHook);\n return;\n }\n const hookDefiniton = callbacks();\n if (\n hookDefiniton &&\n (typeof hookDefiniton === \"object\" || typeof hookDefiniton === \"function\")\n ) {\n return hookDefiniton;\n }\n logError(\n \"runtime hook must return an object with hook callbacks or an instance of ViewHook\",\n runtimeHook,\n );\n }\n\n isUnloaded() {\n return this.unloaded;\n }\n\n isConnected() {\n return this.socket.isConnected();\n }\n\n getBindingPrefix() {\n return this.bindingPrefix;\n }\n\n binding(kind) {\n return `${this.getBindingPrefix()}${kind}`;\n }\n\n channel(topic, params) {\n return this.socket.channel(topic, params);\n }\n\n joinDeadView() {\n const body = document.body;\n if (\n body &&\n !this.isPhxView(body) &&\n !this.isPhxView(document.firstElementChild)\n ) {\n const view = this.newRootView(body);\n view.setHref(this.getHref());\n view.joinDead();\n if (!this.main) {\n this.main = view;\n }\n window.requestAnimationFrame(() => {\n view.execNewMounted();\n // restore scroll position when navigating from an external / non-live page\n this.maybeScroll(history.state?.scroll);\n });\n }\n }\n\n joinRootViews() {\n let rootsFound = false;\n DOM.all(\n document,\n `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`,\n (rootEl) => {\n if (!this.getRootById(rootEl.id)) {\n const view = this.newRootView(rootEl);\n // stickies cannot be mounted at the router and therefore should not\n // get a href set on them\n if (!DOM.isPhxSticky(rootEl)) {\n view.setHref(this.getHref());\n }\n view.join();\n if (rootEl.hasAttribute(PHX_MAIN)) {\n this.main = view;\n }\n }\n rootsFound = true;\n },\n );\n return rootsFound;\n }\n\n redirect(to, flash, reloadToken) {\n if (reloadToken) {\n Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60);\n }\n this.unload();\n Browser.redirect(to, flash);\n }\n\n replaceMain(\n href,\n flash,\n callback = null,\n linkRef = this.setPendingLink(href),\n ) {\n const liveReferer = this.currentLocation.href;\n this.outgoingMainEl = this.outgoingMainEl || this.main.el;\n\n const stickies = DOM.findPhxSticky(document) || [];\n const removeEls = DOM.all(\n this.outgoingMainEl,\n `[${this.binding(\"remove\")}]`,\n ).filter((el) => !DOM.isChildOfAny(el, stickies));\n\n const newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\");\n this.main.showLoader(this.loaderTimeout);\n this.main.destroy();\n\n this.main = this.newRootView(newMainEl, flash, liveReferer);\n this.main.setRedirect(href);\n this.transitionRemoves(removeEls);\n this.main.join((joinCount, onDone) => {\n if (joinCount === 1 && this.commitPendingLink(linkRef)) {\n this.requestDOMUpdate(() => {\n // remove phx-remove els right before we replace the main element\n removeEls.forEach((el) => el.remove());\n stickies.forEach((el) => newMainEl.appendChild(el));\n this.outgoingMainEl.replaceWith(newMainEl);\n this.outgoingMainEl = null;\n callback && callback(linkRef);\n onDone();\n });\n }\n });\n }\n\n transitionRemoves(elements, callback) {\n const removeAttr = this.binding(\"remove\");\n const silenceEvents = (e) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n elements.forEach((el) => {\n // prevent all listeners we care about from bubbling to window\n // since we are removing the element\n for (const event of this.boundEventNames) {\n el.addEventListener(event, silenceEvents, true);\n }\n this.execJS(el, el.getAttribute(removeAttr), \"remove\");\n });\n // remove the silenced listeners when transitions are done incase the element is re-used\n // and call caller's callback as soon as we are done with transitions\n this.requestDOMUpdate(() => {\n elements.forEach((el) => {\n for (const event of this.boundEventNames) {\n el.removeEventListener(event, silenceEvents, true);\n }\n });\n callback && callback();\n });\n }\n\n isPhxView(el) {\n return el.getAttribute && el.getAttribute(PHX_SESSION) !== null;\n }\n\n newRootView(el, flash, liveReferer) {\n const view = new View(el, this, null, flash, liveReferer);\n this.roots[view.id] = view;\n return view;\n }\n\n owner(childEl, callback) {\n let view;\n const viewEl = DOM.closestViewEl(childEl);\n if (viewEl) {\n // it can happen that we find a view that is already destroyed;\n // in that case we DO NOT want to fallback to the main element\n view = this.getViewByEl(viewEl);\n } else {\n view = this.main;\n }\n return view && callback ? callback(view) : view;\n }\n\n withinOwners(childEl, callback) {\n this.owner(childEl, (view) => callback(view, childEl));\n }\n\n getViewByEl(el) {\n const rootId = el.getAttribute(PHX_ROOT_ID);\n return maybe(this.getRootById(rootId), (root) =>\n root.getDescendentByEl(el),\n );\n }\n\n getRootById(id) {\n return this.roots[id];\n }\n\n destroyAllViews() {\n for (const id in this.roots) {\n this.roots[id].destroy();\n delete this.roots[id];\n }\n this.main = null;\n }\n\n destroyViewByEl(el) {\n const root = this.getRootById(el.getAttribute(PHX_ROOT_ID));\n if (root && root.id === el.id) {\n root.destroy();\n delete this.roots[root.id];\n } else if (root) {\n root.destroyDescendent(el.id);\n }\n }\n\n getActiveElement() {\n return document.activeElement;\n }\n\n dropActiveElement(view) {\n if (this.prevActive && view.ownsElement(this.prevActive)) {\n this.prevActive = null;\n }\n }\n\n restorePreviouslyActiveFocus() {\n if (\n this.prevActive &&\n this.prevActive !== document.body &&\n this.prevActive instanceof HTMLElement\n ) {\n this.prevActive.focus();\n }\n }\n\n blurActiveElement() {\n this.prevActive = this.getActiveElement();\n if (\n this.prevActive !== document.body &&\n this.prevActive instanceof HTMLElement\n ) {\n this.prevActive.blur();\n }\n }\n\n /**\n * @param {{dead?: boolean}} [options={}]\n */\n bindTopLevelEvents({ dead } = {}) {\n if (this.boundTopLevelEvents) {\n return;\n }\n\n this.boundTopLevelEvents = true;\n // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n this.serverCloseRef = this.socket.onClose((event) => {\n // failsafe reload if normal closure and we still have a main LV\n if (event && event.code === 1000 && this.main) {\n return this.reloadWithJitter(this.main);\n }\n });\n document.body.addEventListener(\"click\", function () {}); // ensure all click events bubble for mobile Safari\n window.addEventListener(\n \"pageshow\",\n (e) => {\n if (e.persisted) {\n // reload page if being restored from back/forward cache\n this.getSocket().disconnect();\n this.withPageLoading({ to: window.location.href, kind: \"redirect\" });\n window.location.reload();\n }\n },\n true,\n );\n if (!dead) {\n this.bindNav();\n }\n this.bindClicks();\n if (!dead) {\n this.bindForms();\n }\n this.bind(\n { keyup: \"keyup\", keydown: \"keydown\" },\n (e, type, view, targetEl, phxEvent, _phxTarget) => {\n const matchKey = targetEl.getAttribute(this.binding(PHX_KEY));\n const pressedKey = e.key && e.key.toLowerCase(); // chrome clicked autocompletes send a keydown without key\n if (matchKey && matchKey.toLowerCase() !== pressedKey) {\n return;\n }\n\n const data = { key: e.key, ...this.eventMeta(type, e, targetEl) };\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n },\n );\n this.bind(\n { blur: \"focusout\", focus: \"focusin\" },\n (e, type, view, targetEl, phxEvent, phxTarget) => {\n if (!phxTarget) {\n const data = { key: e.key, ...this.eventMeta(type, e, targetEl) };\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n }\n },\n );\n this.bind(\n { blur: \"blur\", focus: \"focus\" },\n (e, type, view, targetEl, phxEvent, phxTarget) => {\n // blur and focus are triggered on document and window. Discard one to avoid dups\n if (phxTarget === \"window\") {\n const data = this.eventMeta(type, e, targetEl);\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n }\n },\n );\n this.on(\"dragover\", (e) => e.preventDefault());\n this.on(\"drop\", (e) => {\n e.preventDefault();\n const dropTargetId = maybe(\n closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)),\n (trueTarget) => {\n return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET));\n },\n );\n const dropTarget = dropTargetId && document.getElementById(dropTargetId);\n const files = Array.from(e.dataTransfer.files || []);\n if (\n !dropTarget ||\n !(dropTarget instanceof HTMLInputElement) ||\n dropTarget.disabled ||\n files.length === 0 ||\n !(dropTarget.files instanceof FileList)\n ) {\n return;\n }\n\n LiveUploader.trackFiles(dropTarget, files, e.dataTransfer);\n dropTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n });\n this.on(PHX_TRACK_UPLOADS, (e) => {\n const uploadTarget = e.target;\n if (!DOM.isUploadInput(uploadTarget)) {\n return;\n }\n const files = Array.from(e.detail.files || []).filter(\n (f) => f instanceof File || f instanceof Blob,\n );\n LiveUploader.trackFiles(uploadTarget, files);\n uploadTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n });\n }\n\n eventMeta(eventName, e, targetEl) {\n const callback = this.metadataCallbacks[eventName];\n return callback ? callback(e, targetEl) : {};\n }\n\n setPendingLink(href) {\n this.linkRef++;\n this.pendingLink = href;\n this.resetReloadStatus();\n return this.linkRef;\n }\n\n // anytime we are navigating or connecting, drop reload cookie in case\n // we issue the cookie but the next request was interrupted and the server never dropped it\n resetReloadStatus() {\n Browser.deleteCookie(PHX_RELOAD_STATUS);\n }\n\n commitPendingLink(linkRef) {\n if (this.linkRef !== linkRef) {\n return false;\n } else {\n this.href = this.pendingLink;\n this.pendingLink = null;\n return true;\n }\n }\n\n getHref() {\n return this.href;\n }\n\n hasPendingLink() {\n return !!this.pendingLink;\n }\n\n bind(events, callback) {\n for (const event in events) {\n const browserEventName = events[event];\n\n this.on(browserEventName, (e) => {\n const binding = this.binding(event);\n const windowBinding = this.binding(`window-${event}`);\n const targetPhxEvent =\n e.target.getAttribute && e.target.getAttribute(binding);\n if (targetPhxEvent) {\n this.debounce(e.target, e, browserEventName, () => {\n this.withinOwners(e.target, (view) => {\n callback(e, event, view, e.target, targetPhxEvent, null);\n });\n });\n } else {\n DOM.all(document, `[${windowBinding}]`, (el) => {\n const phxEvent = el.getAttribute(windowBinding);\n this.debounce(el, e, browserEventName, () => {\n this.withinOwners(el, (view) => {\n callback(e, event, view, el, phxEvent, \"window\");\n });\n });\n });\n }\n });\n }\n }\n\n bindClicks() {\n this.on(\"mousedown\", (e) => (this.clickStartedAtTarget = e.target));\n this.bindClick(\"click\", \"click\");\n }\n\n bindClick(eventName, bindingName) {\n const click = this.binding(bindingName);\n window.addEventListener(\n eventName,\n (e) => {\n let target = null;\n // a synthetic click event (detail 0) will not have caused a mousedown event,\n // therefore the clickStartedAtTarget is stale\n if (e.detail === 0) this.clickStartedAtTarget = e.target;\n const clickStartedAtTarget = this.clickStartedAtTarget || e.target;\n // when searching the target for the click event, we always want to\n // use the actual event target, see #3372\n target = closestPhxBinding(e.target, click);\n this.dispatchClickAway(e, clickStartedAtTarget);\n this.clickStartedAtTarget = null;\n const phxEvent = target && target.getAttribute(click);\n if (!phxEvent) {\n if (DOM.isNewPageClick(e, window.location)) {\n this.unload();\n }\n return;\n }\n\n if (target.getAttribute(\"href\") === \"#\") {\n e.preventDefault();\n }\n\n // noop if we are in the middle of awaiting an ack for this el already\n if (target.hasAttribute(PHX_REF_SRC)) {\n return;\n }\n\n this.debounce(target, e, \"click\", () => {\n this.withinOwners(target, (view) => {\n JS.exec(e, \"click\", phxEvent, view, target, [\n \"push\",\n { data: this.eventMeta(\"click\", e, target) },\n ]);\n });\n });\n },\n false,\n );\n }\n\n dispatchClickAway(e, clickStartedAt) {\n const phxClickAway = this.binding(\"click-away\");\n DOM.all(document, `[${phxClickAway}]`, (el) => {\n if (!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))) {\n this.withinOwners(el, (view) => {\n const phxEvent = el.getAttribute(phxClickAway);\n if (JS.isVisible(el) && JS.isInViewport(el)) {\n JS.exec(e, \"click\", phxEvent, view, el, [\n \"push\",\n { data: this.eventMeta(\"click\", e, e.target) },\n ]);\n }\n });\n }\n });\n }\n\n bindNav() {\n if (!Browser.canPushState()) {\n return;\n }\n if (history.scrollRestoration) {\n history.scrollRestoration = \"manual\";\n }\n let scrollTimer = null;\n window.addEventListener(\"scroll\", (_e) => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(() => {\n Browser.updateCurrentState((state) =>\n Object.assign(state, { scroll: window.scrollY }),\n );\n }, 100);\n });\n window.addEventListener(\n \"popstate\",\n (event) => {\n if (!this.registerNewLocation(window.location)) {\n return;\n }\n const { type, backType, id, scroll, position } = event.state || {};\n const href = window.location.href;\n\n // Compare positions to determine direction\n const isForward = position > this.currentHistoryPosition;\n const navType = isForward ? type : backType || type;\n\n // Update current position\n this.currentHistoryPosition = position || 0;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: {\n href,\n patch: navType === \"patch\",\n pop: true,\n direction: isForward ? \"forward\" : \"backward\",\n },\n });\n this.requestDOMUpdate(() => {\n const callback = () => {\n this.maybeScroll(scroll);\n };\n if (\n this.main.isConnected() &&\n navType === \"patch\" &&\n id === this.main.id\n ) {\n this.main.pushLinkPatch(event, href, null, callback);\n } else {\n this.replaceMain(href, null, callback);\n }\n });\n },\n false,\n );\n window.addEventListener(\n \"click\",\n (e) => {\n const target = closestPhxBinding(e.target, PHX_LIVE_LINK);\n const type = target && target.getAttribute(PHX_LIVE_LINK);\n if (!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)) {\n return;\n }\n\n // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n const href =\n target.href instanceof SVGAnimatedString\n ? target.href.baseVal\n : target.href;\n\n const linkState = target.getAttribute(PHX_LINK_STATE);\n e.preventDefault();\n e.stopImmediatePropagation(); // do not bubble click to regular phx-click bindings\n if (this.pendingLink === href) {\n return;\n }\n\n this.requestDOMUpdate(() => {\n if (type === \"patch\") {\n this.pushHistoryPatch(e, href, linkState, target);\n } else if (type === \"redirect\") {\n this.historyRedirect(e, href, linkState, null, target);\n } else {\n throw new Error(\n `expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`,\n );\n }\n const phxClick = target.getAttribute(this.binding(\"click\"));\n if (phxClick) {\n this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"));\n }\n });\n },\n false,\n );\n }\n\n maybeScroll(scroll) {\n if (typeof scroll === \"number\") {\n requestAnimationFrame(() => {\n window.scrollTo(0, scroll);\n }); // the body needs to render before we scroll.\n }\n }\n\n dispatchEvent(event, payload = {}) {\n DOM.dispatchEvent(window, `phx:${event}`, { detail: payload });\n }\n\n dispatchEvents(events) {\n events.forEach(([event, payload]) => this.dispatchEvent(event, payload));\n }\n\n withPageLoading(info, callback) {\n DOM.dispatchEvent(window, \"phx:page-loading-start\", { detail: info });\n const done = () =>\n DOM.dispatchEvent(window, \"phx:page-loading-stop\", { detail: info });\n return callback ? callback(done) : done;\n }\n\n pushHistoryPatch(e, href, linkState, targetEl) {\n if (!this.isConnected() || !this.main.isMain()) {\n return Browser.redirect(href);\n }\n\n this.withPageLoading({ to: href, kind: \"patch\" }, (done) => {\n this.main.pushLinkPatch(e, href, targetEl, (linkRef) => {\n this.historyPatch(href, linkState, linkRef);\n done();\n });\n });\n }\n\n historyPatch(href, linkState, linkRef = this.setPendingLink(href)) {\n if (!this.commitPendingLink(linkRef)) {\n return;\n }\n\n // Increment position for new state\n this.currentHistoryPosition++;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n // store the type for back navigation\n Browser.updateCurrentState((state) => ({ ...state, backType: \"patch\" }));\n\n Browser.pushState(\n linkState,\n {\n type: \"patch\",\n id: this.main.id,\n position: this.currentHistoryPosition,\n },\n href,\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: { patch: true, href, pop: false, direction: \"forward\" },\n });\n this.registerNewLocation(window.location);\n }\n\n historyRedirect(e, href, linkState, flash, targetEl) {\n const clickLoading = targetEl && e.isTrusted && e.type !== \"popstate\";\n if (clickLoading) {\n targetEl.classList.add(\"phx-click-loading\");\n }\n if (!this.isConnected() || !this.main.isMain()) {\n return Browser.redirect(href, flash);\n }\n\n // convert to full href if only path prefix\n if (/^\\/$|^\\/[^\\/]+.*$/.test(href)) {\n const { protocol, host } = window.location;\n href = `${protocol}//${host}${href}`;\n }\n const scroll = window.scrollY;\n this.withPageLoading({ to: href, kind: \"redirect\" }, (done) => {\n this.replaceMain(href, flash, (linkRef) => {\n if (linkRef === this.linkRef) {\n // Increment position for new state\n this.currentHistoryPosition++;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n // store the type for back navigation\n Browser.updateCurrentState((state) => ({\n ...state,\n backType: \"redirect\",\n }));\n\n Browser.pushState(\n linkState,\n {\n type: \"redirect\",\n id: this.main.id,\n scroll: scroll,\n position: this.currentHistoryPosition,\n },\n href,\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: { href, patch: false, pop: false, direction: \"forward\" },\n });\n this.registerNewLocation(window.location);\n }\n // explicitly undo click-loading class\n // (in case it originated in a sticky live view, otherwise it would be removed anyway)\n if (clickLoading) {\n targetEl.classList.remove(\"phx-click-loading\");\n }\n done();\n });\n });\n }\n\n registerNewLocation(newLocation) {\n const { pathname, search } = this.currentLocation;\n if (pathname + search === newLocation.pathname + newLocation.search) {\n return false;\n } else {\n this.currentLocation = clone(newLocation);\n return true;\n }\n }\n\n bindForms() {\n let iterations = 0;\n let externalFormSubmitted = false;\n\n // disable forms on submit that track phx-change but perform external submit\n this.on(\"submit\", (e) => {\n const phxSubmit = e.target.getAttribute(this.binding(\"submit\"));\n const phxChange = e.target.getAttribute(this.binding(\"change\"));\n if (!externalFormSubmitted && phxChange && !phxSubmit) {\n externalFormSubmitted = true;\n e.preventDefault();\n this.withinOwners(e.target, (view) => {\n view.disableForm(e.target);\n // safari needs next tick\n window.requestAnimationFrame(() => {\n if (DOM.isUnloadableFormSubmit(e)) {\n this.unload();\n }\n e.target.submit();\n });\n });\n }\n });\n\n this.on(\"submit\", (e) => {\n const phxEvent = e.target.getAttribute(this.binding(\"submit\"));\n if (!phxEvent) {\n if (DOM.isUnloadableFormSubmit(e)) {\n this.unload();\n }\n return;\n }\n e.preventDefault();\n e.target.disabled = true;\n this.withinOwners(e.target, (view) => {\n JS.exec(e, \"submit\", phxEvent, view, e.target, [\n \"push\",\n { submitter: e.submitter },\n ]);\n });\n });\n\n for (const type of [\"change\", \"input\"]) {\n this.on(type, (e) => {\n if (\n e instanceof CustomEvent &&\n (e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLSelectElement ||\n e.target instanceof HTMLTextAreaElement) &&\n e.target.form === undefined\n ) {\n // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n if (e.detail && e.detail.dispatcher) {\n throw new Error(\n `dispatching a custom ${type} event is only supported on input elements inside a form`,\n );\n }\n return;\n }\n const phxChange = this.binding(\"change\");\n const input = e.target;\n if (this.blockPhxChangeWhileComposing && e.isComposing) {\n const key = `composition-listener-${type}`;\n if (!DOM.private(input, key)) {\n DOM.putPrivate(input, key, true);\n input.addEventListener(\n \"compositionend\",\n () => {\n // trigger a new input/change event\n input.dispatchEvent(new Event(type, { bubbles: true }));\n DOM.deletePrivate(input, key);\n },\n { once: true },\n );\n }\n return;\n }\n const inputEvent = input.getAttribute(phxChange);\n const formEvent = input.form && input.form.getAttribute(phxChange);\n const phxEvent = inputEvent || formEvent;\n if (!phxEvent) {\n return;\n }\n if (\n input.type === \"number\" &&\n input.validity &&\n input.validity.badInput\n ) {\n return;\n }\n\n const dispatcher = inputEvent ? input : input.form;\n const currentIterations = iterations;\n iterations++;\n const { at: at, type: lastType } =\n DOM.private(input, \"prev-iteration\") || {};\n // Browsers should always fire at least one \"input\" event before every \"change\"\n // Ignore \"change\" events, unless there was no prior \"input\" event.\n // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n if (\n at === currentIterations - 1 &&\n type === \"change\" &&\n lastType === \"input\"\n ) {\n return;\n }\n\n DOM.putPrivate(input, \"prev-iteration\", {\n at: currentIterations,\n type: type,\n });\n\n this.debounce(input, e, type, () => {\n this.withinOwners(dispatcher, (view) => {\n DOM.putPrivate(input, PHX_HAS_FOCUSED, true);\n JS.exec(e, \"change\", phxEvent, view, input, [\n \"push\",\n { _target: e.target.name, dispatcher: dispatcher },\n ]);\n });\n });\n });\n }\n this.on(\"reset\", (e) => {\n const form = e.target;\n DOM.resetForm(form);\n const input = Array.from(form.elements).find((el) => el.type === \"reset\");\n if (input) {\n // wait until next tick to get updated input value\n window.requestAnimationFrame(() => {\n input.dispatchEvent(\n new Event(\"input\", { bubbles: true, cancelable: false }),\n );\n });\n }\n });\n }\n\n debounce(el, event, eventType, callback) {\n if (eventType === \"blur\" || eventType === \"focusout\") {\n return callback();\n }\n\n const phxDebounce = this.binding(PHX_DEBOUNCE);\n const phxThrottle = this.binding(PHX_THROTTLE);\n const defaultDebounce = this.defaults.debounce.toString();\n const defaultThrottle = this.defaults.throttle.toString();\n\n this.withinOwners(el, (view) => {\n const asyncFilter = () =>\n !view.isDestroyed() && document.body.contains(el);\n DOM.debounce(\n el,\n event,\n phxDebounce,\n defaultDebounce,\n phxThrottle,\n defaultThrottle,\n asyncFilter,\n () => {\n callback();\n },\n );\n });\n }\n\n silenceEvents(callback) {\n this.silenced = true;\n callback();\n this.silenced = false;\n }\n\n on(event, callback) {\n this.boundEventNames.add(event);\n window.addEventListener(event, (e) => {\n if (!this.silenced) {\n callback(e);\n }\n });\n }\n\n jsQuerySelectorAll(sourceEl, query, defaultQuery) {\n const all = this.domCallbacks.jsQuerySelectorAll;\n return all ? all(sourceEl, query, defaultQuery) : defaultQuery();\n }\n}\n\nclass TransitionSet {\n constructor() {\n this.transitions = new Set();\n this.promises = new Set();\n this.pendingOps = [];\n }\n\n reset() {\n this.transitions.forEach((timer) => {\n clearTimeout(timer);\n this.transitions.delete(timer);\n });\n this.promises.clear();\n this.flushPendingOps();\n }\n\n after(callback) {\n if (this.size() === 0) {\n callback();\n } else {\n this.pushPendingOp(callback);\n }\n }\n\n addTransition(time, onStart, onDone) {\n onStart();\n const timer = setTimeout(() => {\n this.transitions.delete(timer);\n onDone();\n this.flushPendingOps();\n }, time);\n this.transitions.add(timer);\n }\n\n addAsyncTransition(promise) {\n this.promises.add(promise);\n promise.then(() => {\n this.promises.delete(promise);\n this.flushPendingOps();\n });\n }\n\n pushPendingOp(op) {\n this.pendingOps.push(op);\n }\n\n size() {\n return this.transitions.size + this.promises.size;\n }\n\n flushPendingOps() {\n if (this.size() > 0) {\n return;\n }\n const op = this.pendingOps.shift();\n if (op) {\n op();\n this.flushPendingOps();\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n================================================================================\nPhoenix LiveView JavaScript Client\n================================================================================\n\nSee the hexdocs at `https://hexdocs.pm/phoenix_live_view` for documentation.\n*/\n\nimport OriginalLiveSocket, { isUsedInput } from \"./live_socket\";\nimport DOM from \"./dom\";\nimport { ViewHook } from \"./view_hook\";\nimport View from \"./view\";\n\nimport type { LiveSocketJSCommands } from \"./js_commands\";\nimport type { Hook, HooksOptions } from \"./view_hook\";\nimport type { Socket as PhoenixSocket } from \"phoenix\";\n\n/**\n * Options for configuring the LiveSocket instance.\n */\nexport interface LiveSocketOptions {\n /**\n * Defaults for phx-debounce and phx-throttle.\n */\n defaults?: {\n /** The millisecond phx-debounce time. Defaults 300 */\n debounce?: number;\n /** The millisecond phx-throttle time. Defaults 300 */\n throttle?: number;\n };\n /**\n * An object or function for passing connect params.\n * The function receives the element associated with a given LiveView. For example:\n *\n * (el) => {view: el.getAttribute(\"data-my-view-name\", token: window.myToken}\n *\n */\n params?:\n | ((el: HTMLElement) => { [key: string]: any })\n | { [key: string]: any };\n /**\n * The optional prefix to use for all phx DOM annotations.\n *\n * Defaults to \"phx-\".\n */\n bindingPrefix?: string;\n /**\n * Callbacks for LiveView hooks.\n *\n * See [Client hooks via `phx-hook`](https://hexdocs.pm/phoenix_live_view/js-interop.html#client-hooks-via-phx-hook) for more information.\n */\n hooks?: HooksOptions;\n /** Callbacks for LiveView uploaders. */\n uploaders?: { [key: string]: any }; // TODO: define more specifically\n /** Delay in milliseconds before applying loading states. */\n loaderTimeout?: number;\n /** Delay in milliseconds before executing phx-disconnected commands. */\n disconnectedTimeout?: number;\n /** Maximum reloads before entering failsafe mode. */\n maxReloads?: number;\n /** Minimum time between normal reload attempts. */\n reloadJitterMin?: number;\n /** Maximum time between normal reload attempts. */\n reloadJitterMax?: number;\n /** Time between reload attempts in failsafe mode. */\n failsafeJitter?: number;\n /**\n * Function to log debug information. For example:\n *\n * (view, kind, msg, obj) => console.log(`${view.id} ${kind}: ${msg} - `, obj)\n */\n viewLogger?: (view: View, kind: string, msg: string, obj: any) => void;\n /**\n * Object mapping event names to functions for populating event metadata.\n *\n * metadata: {\n * click: (e, el) => {\n * return {\n * ctrlKey: e.ctrlKey,\n * metaKey: e.metaKey,\n * detail: e.detail || 1,\n * }\n * },\n * keydown: (e, el) => {\n * return {\n * key: e.key,\n * ctrlKey: e.ctrlKey,\n * metaKey: e.metaKey,\n * shiftKey: e.shiftKey\n * }\n * }\n * }\n *\n */\n metadata?: { [eventName: string]: (e: Event, el: HTMLElement) => object };\n /**\n * An optional Storage compatible object\n * Useful when LiveView won't have access to `sessionStorage`. For example, This could\n * happen if a site loads a cross-domain LiveView in an iframe.\n *\n * Example usage:\n *\n * class InMemoryStorage {\n * constructor() { this.storage = {} }\n * getItem(keyName) { return this.storage[keyName] || null }\n * removeItem(keyName) { delete this.storage[keyName] }\n * setItem(keyName, keyValue) { this.storage[keyName] = keyValue }\n * }\n */\n sessionStorage?: Storage;\n /**\n * An optional Storage compatible object\n * Useful when LiveView won't have access to `localStorage`.\n *\n * See `sessionStorage` for an example.\n */\n localStorage?: Storage;\n /**\n * If set to `true`, `phx-change` events will be blocked (will not fire)\n * while the user is composing input using an IME (Input Method Editor).\n * This is determined by the `e.isComposing` property on keyboard events,\n * which is `true` when the user is in the process of entering composed characters (for example,\n * when typing Japanese or Chinese using romaji or pinyin input methods).\n * By default, `phx-change` will not be blocked during a composition session,\n * but note that there were issues reported in older versions of Safari,\n * where a LiveView patch to the input caused unexpected behavior.\n *\n * For more information, see\n * - https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing\n * - https://github.com/phoenixframework/phoenix_live_view/issues/3322\n *\n * Defaults to `false`.\n */\n blockPhxChangeWhileComposing?: boolean;\n /** DOM callbacks. */\n dom?: {\n /**\n * An optional function to modify the behavior of querying elements in JS commands.\n * @param sourceEl - The source element, e.g. the button that was clicked.\n * @param query - The query value.\n * @param defaultQuery - A default query function that can be used if no custom query should be applied.\n * @returns A list of DOM elements.\n */\n jsQuerySelectorAll?: (\n sourceEl: HTMLElement,\n query: string,\n defaultQuery: () => Element[],\n ) => Element[];\n /**\n * Called immediately before a DOM patch is applied.\n */\n onPatchStart?: (container: HTMLElement) => void;\n /**\n * Called immediately after a DOM patch is applied.\n */\n onPatchEnd?: (container: HTMLElement) => void;\n /**\n * Called when a new DOM node is added.\n */\n onNodeAdded?: (node: Node) => void;\n /**\n * Called before an element is updated.\n */\n onBeforeElUpdated?: (fromEl: Element, toEl: Element) => void;\n };\n /** Allow passthrough of other options to the Phoenix Socket constructor. */\n [key: string]: any;\n}\n\n/**\n * Interface describing the public API of a LiveSocket instance.\n */\nexport interface LiveSocketInstanceInterface {\n /**\n * Returns the version of the LiveView client.\n */\n version(): string;\n /**\n * Returns true if profiling is enabled. See `enableProfiling` and `disableProfiling`.\n */\n isProfileEnabled(): boolean;\n /**\n * Returns true if debugging is enabled. See `enableDebug` and `disableDebug`.\n */\n isDebugEnabled(): boolean;\n /**\n * Returns true if debugging is disabled. See `enableDebug` and `disableDebug`.\n */\n isDebugDisabled(): boolean;\n /**\n * Enables debugging.\n *\n * When debugging is enabled, the LiveView client will log debug information to the console.\n * See [Debugging client events](https://hexdocs.pm/phoenix_live_view/js-interop.html#debugging-client-events) for more information.\n */\n enableDebug(): void;\n /**\n * Enables profiling.\n *\n * When profiling is enabled, the LiveView client will log profiling information to the console.\n */\n enableProfiling(): void;\n /**\n * Disables debugging.\n */\n disableDebug(): void;\n /**\n * Disables profiling.\n */\n disableProfiling(): void;\n /**\n * Enables latency simulation.\n *\n * When latency simulation is enabled, the LiveView client will add a delay to requests and responses from the server.\n * See [Simulating Latency](https://hexdocs.pm/phoenix_live_view/js-interop.html#simulating-latency) for more information.\n */\n enableLatencySim(upperBoundMs: number): void;\n /**\n * Disables latency simulation.\n */\n disableLatencySim(): void;\n /**\n * Returns the current latency simulation upper bound.\n */\n getLatencySim(): number | null;\n /**\n * Returns the Phoenix Socket instance.\n */\n getSocket(): PhoenixSocket;\n /**\n * Connects to the LiveView server.\n */\n connect(): void;\n /**\n * Disconnects from the LiveView server.\n */\n disconnect(callback?: () => void): void;\n /**\n * Can be used to replace the transport used by the underlying Phoenix Socket.\n */\n replaceTransport(transport: any): void;\n /**\n * Executes an encoded JS command, targeting the given element.\n *\n * See [`Phoenix.LiveView.JS`](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.JS.html) for more information.\n */\n execJS(el: HTMLElement, encodedJS: string, eventType?: string | null): void;\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n *\n * See [JavaScript interoperability](https://hexdocs.pm/phoenix_live_view/js-interop.html) for more information.\n */\n js(): LiveSocketJSCommands;\n}\n\n/**\n * Interface describing the LiveSocket constructor.\n */\nexport interface LiveSocketConstructor {\n /**\n * Creates a new LiveSocket instance.\n *\n * @param endpoint - The string WebSocket endpoint, ie, `\"wss://example.com/live\"`,\n * `\"/live\"` (inherited host & protocol)\n * @param socket - the required Phoenix Socket class imported from \"phoenix\". For example:\n *\n * import {Socket} from \"phoenix\"\n * import {LiveSocket} from \"phoenix_live_view\"\n * let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n *\n * @param opts - Optional configuration.\n */\n new (\n endpoint: string,\n socket: typeof PhoenixSocket,\n opts?: LiveSocketOptions,\n ): LiveSocketInstanceInterface;\n}\n\n// because LiveSocket is in JS (for now), we cast it to our defined TypeScript constructor.\nconst LiveSocket = OriginalLiveSocket as unknown as LiveSocketConstructor;\n\n/** Creates a hook instance for the given element and callbacks.\n *\n * @param el - The element to associate with the hook.\n * @param callbacks - The list of hook callbacks, such as mounted,\n * updated, destroyed, etc.\n *\n * *Note*: `createHook` must be called from the `connectedCallback` lifecycle\n * which is triggered after the element has been added to the DOM. If you try\n * to call `createHook` from the constructor, an error will be logged.\n *\n * @example\n *\n * class MyComponent extends HTMLElement {\n * connectedCallback(){\n * let onLiveViewMounted = () => this.hook.pushEvent(...))\n * this.hook = createHook(this, {mounted: onLiveViewMounted})\n * }\n * }\n *\n * @returns Returns the Hook instance for the custom element.\n */\nfunction createHook(el: HTMLElement, callbacks: Hook): ViewHook {\n let existingHook = DOM.getCustomElHook(el);\n if (existingHook) {\n return existingHook;\n }\n\n let hook = new ViewHook(View.closestView(el), el, callbacks);\n DOM.putCustomElHook(el, hook);\n return hook;\n}\n\nexport { LiveSocket, isUsedInput, createHook, ViewHook, Hook, HooksOptions };\n", "export const CONSECUTIVE_RELOADS = \"consecutive-reloads\";\nexport const MAX_RELOADS = 10;\nexport const RELOAD_JITTER_MIN = 5000;\nexport const RELOAD_JITTER_MAX = 10000;\nexport const FAILSAFE_JITTER = 30000;\nexport const PHX_EVENT_CLASSES = [\n \"phx-click-loading\",\n \"phx-change-loading\",\n \"phx-submit-loading\",\n \"phx-keydown-loading\",\n \"phx-keyup-loading\",\n \"phx-blur-loading\",\n \"phx-focus-loading\",\n \"phx-hook-loading\",\n];\nexport const PHX_COMPONENT = \"data-phx-component\";\nexport const PHX_VIEW_REF = \"data-phx-view\";\nexport const PHX_LIVE_LINK = \"data-phx-link\";\nexport const PHX_TRACK_STATIC = \"track-static\";\nexport const PHX_LINK_STATE = \"data-phx-link-state\";\nexport const PHX_REF_LOADING = \"data-phx-ref-loading\";\nexport const PHX_REF_SRC = \"data-phx-ref-src\";\nexport const PHX_REF_LOCK = \"data-phx-ref-lock\";\nexport const PHX_PENDING_REFS = \"phx-pending-refs\";\nexport const PHX_TRACK_UPLOADS = \"track-uploads\";\nexport const PHX_UPLOAD_REF = \"data-phx-upload-ref\";\nexport const PHX_PREFLIGHTED_REFS = \"data-phx-preflighted-refs\";\nexport const PHX_DONE_REFS = \"data-phx-done-refs\";\nexport const PHX_DROP_TARGET = \"drop-target\";\nexport const PHX_ACTIVE_ENTRY_REFS = \"data-phx-active-refs\";\nexport const PHX_LIVE_FILE_UPDATED = \"phx:live-file:updated\";\nexport const PHX_SKIP = \"data-phx-skip\";\nexport const PHX_MAGIC_ID = \"data-phx-id\";\nexport const PHX_PRUNE = \"data-phx-prune\";\nexport const PHX_CONNECTED_CLASS = \"phx-connected\";\nexport const PHX_LOADING_CLASS = \"phx-loading\";\nexport const PHX_ERROR_CLASS = \"phx-error\";\nexport const PHX_CLIENT_ERROR_CLASS = \"phx-client-error\";\nexport const PHX_SERVER_ERROR_CLASS = \"phx-server-error\";\nexport const PHX_PARENT_ID = \"data-phx-parent-id\";\nexport const PHX_MAIN = \"data-phx-main\";\nexport const PHX_ROOT_ID = \"data-phx-root-id\";\nexport const PHX_VIEWPORT_TOP = \"viewport-top\";\nexport const PHX_VIEWPORT_BOTTOM = \"viewport-bottom\";\nexport const PHX_TRIGGER_ACTION = \"trigger-action\";\nexport const PHX_HAS_FOCUSED = \"phx-has-focused\";\nexport const FOCUSABLE_INPUTS = [\n \"text\",\n \"textarea\",\n \"number\",\n \"email\",\n \"password\",\n \"search\",\n \"tel\",\n \"url\",\n \"date\",\n \"time\",\n \"datetime-local\",\n \"color\",\n \"range\",\n];\nexport const CHECKABLE_INPUTS = [\"checkbox\", \"radio\"];\nexport const PHX_HAS_SUBMITTED = \"phx-has-submitted\";\nexport const PHX_SESSION = \"data-phx-session\";\nexport const PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`;\nexport const PHX_STICKY = \"data-phx-sticky\";\nexport const PHX_STATIC = \"data-phx-static\";\nexport const PHX_READONLY = \"data-phx-readonly\";\nexport const PHX_DISABLED = \"data-phx-disabled\";\nexport const PHX_DISABLE_WITH = \"disable-with\";\nexport const PHX_DISABLE_WITH_RESTORE = \"data-phx-disable-with-restore\";\nexport const PHX_HOOK = \"hook\";\nexport const PHX_DEBOUNCE = \"debounce\";\nexport const PHX_THROTTLE = \"throttle\";\nexport const PHX_UPDATE = \"update\";\nexport const PHX_STREAM = \"stream\";\nexport const PHX_STREAM_REF = \"data-phx-stream\";\nexport const PHX_PORTAL = \"data-phx-portal\";\nexport const PHX_TELEPORTED_REF = \"data-phx-teleported\";\nexport const PHX_TELEPORTED_SRC = \"data-phx-teleported-src\";\nexport const PHX_RUNTIME_HOOK = \"data-phx-runtime-hook\";\nexport const PHX_LV_PID = \"data-phx-pid\";\nexport const PHX_KEY = \"key\";\nexport const PHX_PRIVATE = \"phxPrivate\";\nexport const PHX_AUTO_RECOVER = \"auto-recover\";\nexport const PHX_LV_DEBUG = \"phx:live-socket:debug\";\nexport const PHX_LV_PROFILE = \"phx:live-socket:profiling\";\nexport const PHX_LV_LATENCY_SIM = \"phx:live-socket:latency-sim\";\nexport const PHX_LV_HISTORY_POSITION = \"phx:nav-history-position\";\nexport const PHX_PROGRESS = \"progress\";\nexport const PHX_MOUNTED = \"mounted\";\nexport const PHX_RELOAD_STATUS = \"__phoenix_reload_status__\";\nexport const LOADER_TIMEOUT = 1;\nexport const MAX_CHILD_JOIN_ATTEMPTS = 3;\nexport const BEFORE_UNLOAD_LOADER_TIMEOUT = 200;\nexport const DISCONNECTED_TIMEOUT = 500;\nexport const BINDING_PREFIX = \"phx-\";\nexport const PUSH_TIMEOUT = 30000;\nexport const LINK_HEADER = \"x-requested-with\";\nexport const RESPONSE_URL_HEADER = \"x-response-url\";\nexport const DEBOUNCE_TRIGGER = \"debounce-trigger\";\nexport const THROTTLED = \"throttled\";\nexport const DEBOUNCE_PREV_KEY = \"debounce-prev-key\";\nexport const DEFAULTS = {\n debounce: 300,\n throttle: 300,\n};\nexport const PHX_PENDING_ATTRS = [PHX_REF_LOADING, PHX_REF_SRC, PHX_REF_LOCK];\n// Rendered\nexport const STATIC = \"s\";\nexport const ROOT = \"r\";\nexport const COMPONENTS = \"c\";\nexport const KEYED = \"k\";\nexport const KEYED_COUNT = \"kc\";\nexport const EVENTS = \"e\";\nexport const REPLY = \"r\";\nexport const TITLE = \"t\";\nexport const TEMPLATES = \"p\";\nexport const STREAM = \"stream\";\n", "import { logError } from \"./utils\";\n\nexport default class EntryUploader {\n constructor(entry, config, liveSocket) {\n const { chunk_size, chunk_timeout } = config;\n this.liveSocket = liveSocket;\n this.entry = entry;\n this.offset = 0;\n this.chunkSize = chunk_size;\n this.chunkTimeout = chunk_timeout;\n this.chunkTimer = null;\n this.errored = false;\n this.uploadChannel = liveSocket.channel(`lvu:${entry.ref}`, {\n token: entry.metadata(),\n });\n }\n\n error(reason) {\n if (this.errored) {\n return;\n }\n this.uploadChannel.leave();\n this.errored = true;\n clearTimeout(this.chunkTimer);\n this.entry.error(reason);\n }\n\n upload() {\n this.uploadChannel.onError((reason) => this.error(reason));\n this.uploadChannel\n .join()\n .receive(\"ok\", (_data) => this.readNextChunk())\n .receive(\"error\", (reason) => this.error(reason));\n }\n\n isDone() {\n return this.offset >= this.entry.file.size;\n }\n\n readNextChunk() {\n const reader = new window.FileReader();\n const blob = this.entry.file.slice(\n this.offset,\n this.chunkSize + this.offset,\n );\n reader.onload = (e) => {\n if (e.target.error === null) {\n this.offset += /** @type {ArrayBuffer} */ (e.target.result).byteLength;\n this.pushChunk(/** @type {ArrayBuffer} */ (e.target.result));\n } else {\n return logError(\"Read error: \" + e.target.error);\n }\n };\n reader.readAsArrayBuffer(blob);\n }\n\n pushChunk(chunk) {\n if (!this.uploadChannel.isJoined()) {\n return;\n }\n this.uploadChannel\n .push(\"chunk\", chunk, this.chunkTimeout)\n .receive(\"ok\", () => {\n this.entry.progress((this.offset / this.entry.file.size) * 100);\n if (!this.isDone()) {\n this.chunkTimer = setTimeout(\n () => this.readNextChunk(),\n this.liveSocket.getLatencySim() || 0,\n );\n }\n })\n .receive(\"error\", ({ reason }) => this.error(reason));\n }\n}\n", "import { PHX_VIEW_SELECTOR } from \"./constants\";\n\nimport EntryUploader from \"./entry_uploader\";\n\nexport const logError = (msg, obj) => console.error && console.error(msg, obj);\n\nexport const isCid = (cid) => {\n const type = typeof cid;\n return type === \"number\" || (type === \"string\" && /^(0|[1-9]\\d*)$/.test(cid));\n};\n\nexport function detectDuplicateIds() {\n const ids = new Set();\n const elems = document.querySelectorAll(\"*[id]\");\n for (let i = 0, len = elems.length; i < len; i++) {\n if (ids.has(elems[i].id)) {\n console.error(\n `Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`,\n );\n } else {\n ids.add(elems[i].id);\n }\n }\n}\n\nexport function detectInvalidStreamInserts(inserts) {\n const errors = new Set();\n Object.keys(inserts).forEach((id) => {\n const streamEl = document.getElementById(id);\n if (\n streamEl &&\n streamEl.parentElement &&\n streamEl.parentElement.getAttribute(\"phx-update\") !== \"stream\"\n ) {\n errors.add(\n `The stream container with id \"${streamEl.parentElement.id}\" is missing the phx-update=\"stream\" attribute. Ensure it is set for streams to work properly.`,\n );\n }\n });\n errors.forEach((error) => console.error(error));\n}\n\nexport const debug = (view, kind, msg, obj) => {\n if (view.liveSocket.isDebugEnabled()) {\n console.log(`${view.id} ${kind}: ${msg} - `, obj);\n }\n};\n\n// wraps value in closure or returns closure\nexport const closure = (val) =>\n typeof val === \"function\"\n ? val\n : function () {\n return val;\n };\n\nexport const clone = (obj) => {\n return JSON.parse(JSON.stringify(obj));\n};\n\nexport const closestPhxBinding = (el, binding, borderEl) => {\n do {\n if (el.matches(`[${binding}]`) && !el.disabled) {\n return el;\n }\n el = el.parentElement || el.parentNode;\n } while (\n el !== null &&\n el.nodeType === 1 &&\n !((borderEl && borderEl.isSameNode(el)) || el.matches(PHX_VIEW_SELECTOR))\n );\n return null;\n};\n\nexport const isObject = (obj) => {\n return obj !== null && typeof obj === \"object\" && !(obj instanceof Array);\n};\n\nexport const isEqualObj = (obj1, obj2) =>\n JSON.stringify(obj1) === JSON.stringify(obj2);\n\nexport const isEmpty = (obj) => {\n for (const x in obj) {\n return false;\n }\n return true;\n};\n\nexport const maybe = (el, callback) => el && callback(el);\n\nexport const channelUploader = function (entries, onError, resp, liveSocket) {\n entries.forEach((entry) => {\n const entryUploader = new EntryUploader(entry, resp.config, liveSocket);\n entryUploader.upload();\n });\n};\n", "const Browser = {\n canPushState() {\n return typeof history.pushState !== \"undefined\";\n },\n\n dropLocal(localStorage, namespace, subkey) {\n return localStorage.removeItem(this.localKey(namespace, subkey));\n },\n\n updateLocal(localStorage, namespace, subkey, initial, func) {\n const current = this.getLocal(localStorage, namespace, subkey);\n const key = this.localKey(namespace, subkey);\n const newVal = current === null ? initial : func(current);\n localStorage.setItem(key, JSON.stringify(newVal));\n return newVal;\n },\n\n getLocal(localStorage, namespace, subkey) {\n return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)));\n },\n\n updateCurrentState(callback) {\n if (!this.canPushState()) {\n return;\n }\n history.replaceState(\n callback(history.state || {}),\n \"\",\n window.location.href,\n );\n },\n\n pushState(kind, meta, to) {\n if (this.canPushState()) {\n if (to !== window.location.href) {\n if (meta.type == \"redirect\" && meta.scroll) {\n // If we're redirecting store the current scrollY for the current history state.\n const currentState = history.state || {};\n currentState.scroll = meta.scroll;\n history.replaceState(currentState, \"\", window.location.href);\n }\n\n delete meta.scroll; // Only store the scroll in the redirect case.\n history[kind + \"State\"](meta, \"\", to || null); // IE will coerce undefined to string\n\n // when using navigate, we'd call pushState immediately before patching the DOM,\n // jumping back to the top of the page, effectively ignoring the scrollIntoView;\n // therefore we wait for the next frame (after the DOM patch) and only then try\n // to scroll to the hashEl\n window.requestAnimationFrame(() => {\n const hashEl = this.getHashTargetEl(window.location.hash);\n\n if (hashEl) {\n hashEl.scrollIntoView();\n } else if (meta.type === \"redirect\") {\n window.scroll(0, 0);\n }\n });\n }\n } else {\n this.redirect(to);\n }\n },\n\n setCookie(name, value, maxAgeSeconds) {\n const expires =\n typeof maxAgeSeconds === \"number\" ? ` max-age=${maxAgeSeconds};` : \"\";\n document.cookie = `${name}=${value};${expires} path=/`;\n },\n\n getCookie(name) {\n return document.cookie.replace(\n new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`),\n \"$1\",\n );\n },\n\n deleteCookie(name) {\n document.cookie = `${name}=; max-age=-1; path=/`;\n },\n\n redirect(\n toURL,\n flash,\n navigate = (url) => {\n window.location.href = url;\n },\n ) {\n if (flash) {\n this.setCookie(\"__phoenix_flash__\", flash, 60);\n }\n navigate(toURL);\n },\n\n localKey(namespace, subkey) {\n return `${namespace}-${subkey}`;\n },\n\n getHashTargetEl(maybeHash) {\n const hash = maybeHash.toString().substring(1);\n if (hash === \"\") {\n return;\n }\n return (\n document.getElementById(hash) ||\n document.querySelector(`a[name=\"${hash}\"]`)\n );\n },\n};\n\nexport default Browser;\n", "import {\n CHECKABLE_INPUTS,\n DEBOUNCE_PREV_KEY,\n DEBOUNCE_TRIGGER,\n FOCUSABLE_INPUTS,\n PHX_COMPONENT,\n PHX_VIEW_REF,\n PHX_TELEPORTED_REF,\n PHX_HAS_FOCUSED,\n PHX_HAS_SUBMITTED,\n PHX_MAIN,\n PHX_PARENT_ID,\n PHX_PRIVATE,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_PENDING_ATTRS,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_STATIC,\n PHX_UPLOAD_REF,\n PHX_VIEW_SELECTOR,\n PHX_STICKY,\n PHX_EVENT_CLASSES,\n THROTTLED,\n PHX_PORTAL,\n PHX_STREAM,\n} from \"./constants\";\n\nimport { logError } from \"./utils\";\n\nconst DOM = {\n byId(id) {\n return document.getElementById(id) || logError(`no id found for ${id}`);\n },\n\n removeClass(el, className) {\n el.classList.remove(className);\n if (el.classList.length === 0) {\n el.removeAttribute(\"class\");\n }\n },\n\n all(node, query, callback) {\n if (!node) {\n return [];\n }\n const array = Array.from(node.querySelectorAll(query));\n if (callback) {\n array.forEach(callback);\n }\n return array;\n },\n\n childNodeLength(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content.childElementCount;\n },\n\n isUploadInput(el) {\n return el.type === \"file\" && el.getAttribute(PHX_UPLOAD_REF) !== null;\n },\n\n isAutoUpload(inputEl) {\n return inputEl.hasAttribute(\"data-phx-auto-upload\");\n },\n\n findUploadInputs(node) {\n const formId = node.id;\n const inputsOutsideForm = this.all(\n document,\n `input[type=\"file\"][${PHX_UPLOAD_REF}][form=\"${formId}\"]`,\n );\n return this.all(node, `input[type=\"file\"][${PHX_UPLOAD_REF}]`).concat(\n inputsOutsideForm,\n );\n },\n\n findComponentNodeList(viewId, cid, doc = document) {\n return this.all(\n doc,\n `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}=\"${cid}\"]`,\n );\n },\n\n isPhxDestroyed(node) {\n return node.id && DOM.private(node, \"destroyed\") ? true : false;\n },\n\n wantsNewTab(e) {\n const wantsNewTab =\n e.ctrlKey || e.shiftKey || e.metaKey || (e.button && e.button === 1);\n const isDownload =\n e.target instanceof HTMLAnchorElement &&\n e.target.hasAttribute(\"download\");\n const isTargetBlank =\n e.target.hasAttribute(\"target\") &&\n e.target.getAttribute(\"target\").toLowerCase() === \"_blank\";\n const isTargetNamedTab =\n e.target.hasAttribute(\"target\") &&\n !e.target.getAttribute(\"target\").startsWith(\"_\");\n return wantsNewTab || isTargetBlank || isDownload || isTargetNamedTab;\n },\n\n isUnloadableFormSubmit(e) {\n // Ignore form submissions intended to close a native <dialog> element\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog#usage_notes\n const isDialogSubmit =\n (e.target && e.target.getAttribute(\"method\") === \"dialog\") ||\n (e.submitter && e.submitter.getAttribute(\"formmethod\") === \"dialog\");\n\n if (isDialogSubmit) {\n return false;\n } else {\n return !e.defaultPrevented && !this.wantsNewTab(e);\n }\n },\n\n isNewPageClick(e, currentLocation) {\n const href =\n e.target instanceof HTMLAnchorElement\n ? e.target.getAttribute(\"href\")\n : null;\n let url;\n\n if (e.defaultPrevented || href === null || this.wantsNewTab(e)) {\n return false;\n }\n if (href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return false;\n }\n if (e.target.isContentEditable) {\n return false;\n }\n\n try {\n url = new URL(href);\n } catch {\n try {\n url = new URL(href, currentLocation);\n } catch {\n // bad URL, fallback to let browser try it as external\n return true;\n }\n }\n\n if (\n url.host === currentLocation.host &&\n url.protocol === currentLocation.protocol\n ) {\n if (\n url.pathname === currentLocation.pathname &&\n url.search === currentLocation.search\n ) {\n return url.hash === \"\" && !url.href.endsWith(\"#\");\n }\n }\n return url.protocol.startsWith(\"http\");\n },\n\n markPhxChildDestroyed(el) {\n if (this.isPhxChild(el)) {\n el.setAttribute(PHX_SESSION, \"\");\n }\n this.putPrivate(el, \"destroyed\", true);\n },\n\n findPhxChildrenInFragment(html, parentId) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return this.findPhxChildren(template.content, parentId);\n },\n\n isIgnored(el, phxUpdate) {\n return (\n (el.getAttribute(phxUpdate) || el.getAttribute(\"data-phx-update\")) ===\n \"ignore\"\n );\n },\n\n isPhxUpdate(el, phxUpdate, updateTypes) {\n return (\n el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0\n );\n },\n\n findPhxSticky(el) {\n return this.all(el, `[${PHX_STICKY}]`);\n },\n\n findPhxChildren(el, parentId) {\n return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}=\"${parentId}\"]`);\n },\n\n findExistingParentCIDs(viewId, cids) {\n // we only want to find parents that exist on the page\n // if a cid is not on the page, the only way it can be added back to the page\n // is if a parent adds it back, therefore if a cid does not exist on the page,\n // we should not try to render it by itself (because it would be rendered twice,\n // one by the parent, and a second time by itself)\n const parentCids = new Set();\n const childrenCids = new Set();\n\n cids.forEach((cid) => {\n this.all(\n document,\n `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}=\"${cid}\"]`,\n ).forEach((parent) => {\n parentCids.add(cid);\n this.all(parent, `[${PHX_VIEW_REF}=\"${viewId}\"][${PHX_COMPONENT}]`)\n .map((el) => parseInt(el.getAttribute(PHX_COMPONENT)))\n .forEach((childCID) => childrenCids.add(childCID));\n });\n });\n\n childrenCids.forEach((childCid) => parentCids.delete(childCid));\n\n return parentCids;\n },\n\n private(el, key) {\n return el[PHX_PRIVATE] && el[PHX_PRIVATE][key];\n },\n\n deletePrivate(el, key) {\n el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key];\n },\n\n putPrivate(el, key, value) {\n if (!el[PHX_PRIVATE]) {\n el[PHX_PRIVATE] = {};\n }\n el[PHX_PRIVATE][key] = value;\n },\n\n updatePrivate(el, key, defaultVal, updateFunc) {\n const existing = this.private(el, key);\n if (existing === undefined) {\n this.putPrivate(el, key, updateFunc(defaultVal));\n } else {\n this.putPrivate(el, key, updateFunc(existing));\n }\n },\n\n syncPendingAttrs(fromEl, toEl) {\n if (!fromEl.hasAttribute(PHX_REF_SRC)) {\n return;\n }\n PHX_EVENT_CLASSES.forEach((className) => {\n fromEl.classList.contains(className) && toEl.classList.add(className);\n });\n PHX_PENDING_ATTRS.filter((attr) => fromEl.hasAttribute(attr)).forEach(\n (attr) => {\n toEl.setAttribute(attr, fromEl.getAttribute(attr));\n },\n );\n },\n\n copyPrivates(target, source) {\n if (source[PHX_PRIVATE]) {\n target[PHX_PRIVATE] = source[PHX_PRIVATE];\n }\n },\n\n putTitle(str) {\n const titleEl = document.querySelector(\"title\");\n if (titleEl) {\n const { prefix, suffix, default: defaultTitle } = titleEl.dataset;\n const isEmpty = typeof str !== \"string\" || str.trim() === \"\";\n if (isEmpty && typeof defaultTitle !== \"string\") {\n return;\n }\n\n const inner = isEmpty ? defaultTitle : str;\n document.title = `${prefix || \"\"}${inner || \"\"}${suffix || \"\"}`;\n } else {\n document.title = str;\n }\n },\n\n debounce(\n el,\n event,\n phxDebounce,\n defaultDebounce,\n phxThrottle,\n defaultThrottle,\n asyncFilter,\n callback,\n ) {\n let debounce = el.getAttribute(phxDebounce);\n let throttle = el.getAttribute(phxThrottle);\n\n if (debounce === \"\") {\n debounce = defaultDebounce;\n }\n if (throttle === \"\") {\n throttle = defaultThrottle;\n }\n const value = debounce || throttle;\n switch (value) {\n case null:\n return callback();\n\n case \"blur\":\n this.incCycle(el, \"debounce-blur-cycle\", () => {\n if (asyncFilter()) {\n callback();\n }\n });\n if (this.once(el, \"debounce-blur\")) {\n el.addEventListener(\"blur\", () =>\n this.triggerCycle(el, \"debounce-blur-cycle\"),\n );\n }\n return;\n\n default:\n const timeout = parseInt(value);\n const trigger = () =>\n throttle ? this.deletePrivate(el, THROTTLED) : callback();\n const currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger);\n if (isNaN(timeout)) {\n return logError(`invalid throttle/debounce value: ${value}`);\n }\n if (throttle) {\n let newKeyDown = false;\n if (event.type === \"keydown\") {\n const prevKey = this.private(el, DEBOUNCE_PREV_KEY);\n this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key);\n newKeyDown = prevKey !== event.key;\n }\n\n if (!newKeyDown && this.private(el, THROTTLED)) {\n return false;\n } else {\n callback();\n const t = setTimeout(() => {\n if (asyncFilter()) {\n this.triggerCycle(el, DEBOUNCE_TRIGGER);\n }\n }, timeout);\n this.putPrivate(el, THROTTLED, t);\n }\n } else {\n setTimeout(() => {\n if (asyncFilter()) {\n this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle);\n }\n }, timeout);\n }\n\n const form = el.form;\n if (form && this.once(form, \"bind-debounce\")) {\n form.addEventListener(\"submit\", () => {\n Array.from(new FormData(form).entries(), ([name]) => {\n const input = form.querySelector(`[name=\"${name}\"]`);\n this.incCycle(input, DEBOUNCE_TRIGGER);\n this.deletePrivate(input, THROTTLED);\n });\n });\n }\n if (this.once(el, \"bind-debounce\")) {\n el.addEventListener(\"blur\", () => {\n // because we trigger the callback here,\n // we also clear the throttle timeout to prevent the callback\n // from being called again after the timeout fires\n clearTimeout(this.private(el, THROTTLED));\n this.triggerCycle(el, DEBOUNCE_TRIGGER);\n });\n }\n }\n },\n\n triggerCycle(el, key, currentCycle) {\n const [cycle, trigger] = this.private(el, key);\n if (!currentCycle) {\n currentCycle = cycle;\n }\n if (currentCycle === cycle) {\n this.incCycle(el, key);\n trigger();\n }\n },\n\n once(el, key) {\n if (this.private(el, key) === true) {\n return false;\n }\n this.putPrivate(el, key, true);\n return true;\n },\n\n incCycle(el, key, trigger = function () {}) {\n let [currentCycle] = this.private(el, key) || [0, trigger];\n currentCycle++;\n this.putPrivate(el, key, [currentCycle, trigger]);\n return currentCycle;\n },\n\n // maintains or adds privately used hook information\n // fromEl and toEl can be the same element in the case of a newly added node\n // fromEl and toEl can be any HTML node type, so we need to check if it's an element node\n maintainPrivateHooks(fromEl, toEl, phxViewportTop, phxViewportBottom) {\n // maintain the hooks created with createHook\n if (\n fromEl.hasAttribute &&\n fromEl.hasAttribute(\"data-phx-hook\") &&\n !toEl.hasAttribute(\"data-phx-hook\")\n ) {\n toEl.setAttribute(\"data-phx-hook\", fromEl.getAttribute(\"data-phx-hook\"));\n }\n // add hooks to elements with viewport attributes\n if (\n toEl.hasAttribute &&\n (toEl.hasAttribute(phxViewportTop) ||\n toEl.hasAttribute(phxViewportBottom))\n ) {\n toEl.setAttribute(\"data-phx-hook\", \"Phoenix.InfiniteScroll\");\n }\n },\n\n putCustomElHook(el, hook) {\n if (el.isConnected) {\n el.setAttribute(\"data-phx-hook\", \"\");\n } else {\n console.error(`\n hook attached to non-connected DOM element\n ensure you are calling createHook within your connectedCallback. ${el.outerHTML}\n `);\n }\n this.putPrivate(el, \"custom-el-hook\", hook);\n },\n\n getCustomElHook(el) {\n return this.private(el, \"custom-el-hook\");\n },\n\n isUsedInput(el) {\n return (\n el.nodeType === Node.ELEMENT_NODE &&\n (this.private(el, PHX_HAS_FOCUSED) || this.private(el, PHX_HAS_SUBMITTED))\n );\n },\n\n resetForm(form) {\n Array.from(form.elements).forEach((input) => {\n this.deletePrivate(input, PHX_HAS_FOCUSED);\n this.deletePrivate(input, PHX_HAS_SUBMITTED);\n });\n },\n\n isPhxChild(node) {\n return node.getAttribute && node.getAttribute(PHX_PARENT_ID);\n },\n\n isPhxSticky(node) {\n return node.getAttribute && node.getAttribute(PHX_STICKY) !== null;\n },\n\n isChildOfAny(el, parents) {\n return !!parents.find((parent) => parent.contains(el));\n },\n\n firstPhxChild(el) {\n return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0];\n },\n\n isPortalTemplate(el) {\n return el.tagName === \"TEMPLATE\" && el.hasAttribute(PHX_PORTAL);\n },\n\n closestViewEl(el) {\n // find the closest portal or view element, whichever comes first\n const portalOrViewEl = el.closest(\n `[${PHX_TELEPORTED_REF}],${PHX_VIEW_SELECTOR}`,\n );\n if (!portalOrViewEl) {\n return null;\n }\n if (portalOrViewEl.hasAttribute(PHX_TELEPORTED_REF)) {\n // PHX_TELEPORTED_REF is set to the id of the view that owns the portal element\n return this.byId(portalOrViewEl.getAttribute(PHX_TELEPORTED_REF));\n } else if (portalOrViewEl.hasAttribute(PHX_SESSION)) {\n return portalOrViewEl;\n }\n return null;\n },\n\n dispatchEvent(target, name, opts = {}) {\n let defaultBubble = true;\n const isUploadTarget =\n target.nodeName === \"INPUT\" && target.type === \"file\";\n if (isUploadTarget && name === \"click\") {\n defaultBubble = false;\n }\n const bubbles = opts.bubbles === undefined ? defaultBubble : !!opts.bubbles;\n const eventOpts = {\n bubbles: bubbles,\n cancelable: true,\n detail: opts.detail || {},\n };\n const event =\n name === \"click\"\n ? new MouseEvent(\"click\", eventOpts)\n : new CustomEvent(name, eventOpts);\n target.dispatchEvent(event);\n },\n\n cloneNode(node, html) {\n if (typeof html === \"undefined\") {\n return node.cloneNode(true);\n } else {\n const cloned = node.cloneNode(false);\n cloned.innerHTML = html;\n return cloned;\n }\n },\n\n // merge attributes from source to target\n // if an element is ignored, we only merge data attributes\n // including removing data attributes that are no longer in the source\n mergeAttrs(target, source, opts = {}) {\n const exclude = new Set(opts.exclude || []);\n const isIgnored = opts.isIgnored;\n const sourceAttrs = source.attributes;\n for (let i = sourceAttrs.length - 1; i >= 0; i--) {\n const name = sourceAttrs[i].name;\n if (!exclude.has(name)) {\n const sourceValue = source.getAttribute(name);\n if (\n target.getAttribute(name) !== sourceValue &&\n (!isIgnored || (isIgnored && name.startsWith(\"data-\")))\n ) {\n target.setAttribute(name, sourceValue);\n }\n } else {\n // We exclude the value from being merged on focused inputs, because the\n // user's input should always win.\n // We can still assign it as long as the value property is the same, though.\n // This prevents a situation where the updated hook is not being triggered\n // when an input is back in its \"original state\", because the attribute\n // was never changed, see:\n // https://github.com/phoenixframework/phoenix_live_view/issues/2163\n if (name === \"value\" && target.value === source.value) {\n // actually set the value attribute to sync it with the value property\n target.setAttribute(\"value\", source.getAttribute(name));\n }\n }\n }\n\n const targetAttrs = target.attributes;\n for (let i = targetAttrs.length - 1; i >= 0; i--) {\n const name = targetAttrs[i].name;\n if (isIgnored) {\n if (\n name.startsWith(\"data-\") &&\n !source.hasAttribute(name) &&\n !PHX_PENDING_ATTRS.includes(name)\n ) {\n target.removeAttribute(name);\n }\n } else {\n if (!source.hasAttribute(name)) {\n target.removeAttribute(name);\n }\n }\n }\n },\n\n mergeFocusedInput(target, source) {\n // skip selects because FF will reset highlighted index for any setAttribute\n if (!(target instanceof HTMLSelectElement)) {\n DOM.mergeAttrs(target, source, { exclude: [\"value\"] });\n }\n\n if (source.readOnly) {\n target.setAttribute(\"readonly\", true);\n } else {\n target.removeAttribute(\"readonly\");\n }\n },\n\n hasSelectionRange(el) {\n return (\n el.setSelectionRange && (el.type === \"text\" || el.type === \"textarea\")\n );\n },\n\n restoreFocus(focused, selectionStart, selectionEnd) {\n if (focused instanceof HTMLSelectElement) {\n focused.focus();\n }\n if (!DOM.isTextualInput(focused)) {\n return;\n }\n\n const wasFocused = focused.matches(\":focus\");\n if (!wasFocused) {\n focused.focus();\n }\n if (this.hasSelectionRange(focused)) {\n focused.setSelectionRange(selectionStart, selectionEnd);\n }\n },\n\n isFormInput(el) {\n if (el.localName && customElements.get(el.localName)) {\n // Custom Elements may be form associated. This allows them\n // to participate within a form's lifecycle, including form\n // validity and form submissions.\n // The spec for Form Associated custom elements requires the\n // custom element's class to contain a static boolean value of `formAssociated`\n // which identifies this class as allowed to associate to a form.\n // See https://html.spec.whatwg.org/dev/custom-elements.html#custom-elements-face-example\n // for details.\n return customElements.get(el.localName)[`formAssociated`];\n }\n\n return (\n /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== \"button\"\n );\n },\n\n syncAttrsToProps(el) {\n if (\n el instanceof HTMLInputElement &&\n CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0\n ) {\n el.checked = el.getAttribute(\"checked\") !== null;\n }\n },\n\n isTextualInput(el) {\n return FOCUSABLE_INPUTS.indexOf(el.type) >= 0;\n },\n\n isNowTriggerFormExternal(el, phxTriggerExternal) {\n return (\n el.getAttribute &&\n el.getAttribute(phxTriggerExternal) !== null &&\n document.body.contains(el)\n );\n },\n\n cleanChildNodes(container, phxUpdate) {\n if (\n DOM.isPhxUpdate(container, phxUpdate, [\"append\", \"prepend\", PHX_STREAM])\n ) {\n const toRemove = [];\n container.childNodes.forEach((childNode) => {\n if (!childNode.id) {\n // Skip warning if it's an empty text node (e.g. a new-line)\n const isEmptyTextNode =\n childNode.nodeType === Node.TEXT_NODE &&\n childNode.nodeValue.trim() === \"\";\n if (!isEmptyTextNode && childNode.nodeType !== Node.COMMENT_NODE) {\n logError(\n \"only HTML element tags with an id are allowed inside containers with phx-update.\\n\\n\" +\n `removing illegal node: \"${(childNode.outerHTML || childNode.nodeValue).trim()}\"\\n\\n`,\n );\n }\n toRemove.push(childNode);\n }\n });\n toRemove.forEach((childNode) => childNode.remove());\n }\n },\n\n replaceRootContainer(container, tagName, attrs) {\n const retainedAttrs = new Set([\n \"id\",\n PHX_SESSION,\n PHX_STATIC,\n PHX_MAIN,\n PHX_ROOT_ID,\n ]);\n if (container.tagName.toLowerCase() === tagName.toLowerCase()) {\n Array.from(container.attributes)\n .filter((attr) => !retainedAttrs.has(attr.name.toLowerCase()))\n .forEach((attr) => container.removeAttribute(attr.name));\n\n Object.keys(attrs)\n .filter((name) => !retainedAttrs.has(name.toLowerCase()))\n .forEach((attr) => container.setAttribute(attr, attrs[attr]));\n\n return container;\n } else {\n const newContainer = document.createElement(tagName);\n Object.keys(attrs).forEach((attr) =>\n newContainer.setAttribute(attr, attrs[attr]),\n );\n retainedAttrs.forEach((attr) =>\n newContainer.setAttribute(attr, container.getAttribute(attr)),\n );\n newContainer.innerHTML = container.innerHTML;\n container.replaceWith(newContainer);\n return newContainer;\n }\n },\n\n getSticky(el, name, defaultVal) {\n const op = (DOM.private(el, \"sticky\") || []).find(\n ([existingName]) => name === existingName,\n );\n if (op) {\n const [_name, _op, stashedResult] = op;\n return stashedResult;\n } else {\n return typeof defaultVal === \"function\" ? defaultVal() : defaultVal;\n }\n },\n\n deleteSticky(el, name) {\n this.updatePrivate(el, \"sticky\", [], (ops) => {\n return ops.filter(([existingName, _]) => existingName !== name);\n });\n },\n\n putSticky(el, name, op) {\n const stashedResult = op(el);\n this.updatePrivate(el, \"sticky\", [], (ops) => {\n const existingIndex = ops.findIndex(\n ([existingName]) => name === existingName,\n );\n if (existingIndex >= 0) {\n ops[existingIndex] = [name, op, stashedResult];\n } else {\n ops.push([name, op, stashedResult]);\n }\n return ops;\n });\n },\n\n applyStickyOperations(el) {\n const ops = DOM.private(el, \"sticky\");\n if (!ops) {\n return;\n }\n\n ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op));\n },\n\n isLocked(el) {\n return el.hasAttribute && el.hasAttribute(PHX_REF_LOCK);\n },\n};\n\nexport default DOM;\n", "import {\n PHX_ACTIVE_ENTRY_REFS,\n PHX_LIVE_FILE_UPDATED,\n PHX_PREFLIGHTED_REFS,\n} from \"./constants\";\n\nimport { channelUploader, logError } from \"./utils\";\n\nimport LiveUploader from \"./live_uploader\";\n\nexport default class UploadEntry {\n static isActive(fileEl, file) {\n const isNew = file._phxRef === undefined;\n const activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(\",\");\n const isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;\n return file.size > 0 && (isNew || isActive);\n }\n\n static isPreflighted(fileEl, file) {\n const preflightedRefs = fileEl\n .getAttribute(PHX_PREFLIGHTED_REFS)\n .split(\",\");\n const isPreflighted =\n preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;\n return isPreflighted && this.isActive(fileEl, file);\n }\n\n static isPreflightInProgress(file) {\n return file._preflightInProgress === true;\n }\n\n static markPreflightInProgress(file) {\n file._preflightInProgress = true;\n }\n\n constructor(fileEl, file, view, autoUpload) {\n this.ref = LiveUploader.genFileRef(file);\n this.fileEl = fileEl;\n this.file = file;\n this.view = view;\n this.meta = null;\n this._isCancelled = false;\n this._isDone = false;\n this._progress = 0;\n this._lastProgressSent = -1;\n this._onDone = function () {};\n this._onElUpdated = this.onElUpdated.bind(this);\n this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n this.autoUpload = autoUpload;\n }\n\n metadata() {\n return this.meta;\n }\n\n progress(progress) {\n this._progress = Math.floor(progress);\n if (this._progress > this._lastProgressSent) {\n if (this._progress >= 100) {\n this._progress = 100;\n this._lastProgressSent = 100;\n this._isDone = true;\n this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {\n LiveUploader.untrackFile(this.fileEl, this.file);\n this._onDone();\n });\n } else {\n this._lastProgressSent = this._progress;\n this.view.pushFileProgress(this.fileEl, this.ref, this._progress);\n }\n }\n }\n\n isCancelled() {\n return this._isCancelled;\n }\n\n cancel() {\n this.file._preflightInProgress = false;\n this._isCancelled = true;\n this._isDone = true;\n this._onDone();\n }\n\n isDone() {\n return this._isDone;\n }\n\n error(reason = \"failed\") {\n this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n this.view.pushFileProgress(this.fileEl, this.ref, { error: reason });\n if (!this.isAutoUpload()) {\n LiveUploader.clearFiles(this.fileEl);\n }\n }\n\n isAutoUpload() {\n return this.autoUpload;\n }\n\n //private\n\n onDone(callback) {\n this._onDone = () => {\n this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);\n callback();\n };\n }\n\n onElUpdated() {\n const activeRefs = this.fileEl\n .getAttribute(PHX_ACTIVE_ENTRY_REFS)\n .split(\",\");\n if (activeRefs.indexOf(this.ref) === -1) {\n LiveUploader.untrackFile(this.fileEl, this.file);\n this.cancel();\n }\n }\n\n toPreflightPayload() {\n return {\n last_modified: this.file.lastModified,\n name: this.file.name,\n relative_path: this.file.webkitRelativePath,\n size: this.file.size,\n type: this.file.type,\n ref: this.ref,\n meta: typeof this.file.meta === \"function\" ? this.file.meta() : undefined,\n };\n }\n\n uploader(uploaders) {\n if (this.meta.uploader) {\n const callback =\n uploaders[this.meta.uploader] ||\n logError(`no uploader configured for ${this.meta.uploader}`);\n return { name: this.meta.uploader, callback: callback };\n } else {\n return { name: \"channel\", callback: channelUploader };\n }\n }\n\n zipPostFlight(resp) {\n this.meta = resp.entries[this.ref];\n if (!this.meta) {\n logError(`no preflight upload response returned with ref ${this.ref}`, {\n input: this.fileEl,\n response: resp,\n });\n }\n }\n}\n", "import {\n PHX_DONE_REFS,\n PHX_PREFLIGHTED_REFS,\n PHX_UPLOAD_REF,\n} from \"./constants\";\n\nimport {} from \"./utils\";\n\nimport DOM from \"./dom\";\nimport UploadEntry from \"./upload_entry\";\n\nlet liveUploaderFileRef = 0;\n\nexport default class LiveUploader {\n static genFileRef(file) {\n const ref = file._phxRef;\n if (ref !== undefined) {\n return ref;\n } else {\n file._phxRef = (liveUploaderFileRef++).toString();\n return file._phxRef;\n }\n }\n\n static getEntryDataURL(inputEl, ref, callback) {\n const file = this.activeFiles(inputEl).find(\n (file) => this.genFileRef(file) === ref,\n );\n callback(URL.createObjectURL(file));\n }\n\n static hasUploadsInProgress(formEl) {\n let active = 0;\n DOM.findUploadInputs(formEl).forEach((input) => {\n if (\n input.getAttribute(PHX_PREFLIGHTED_REFS) !==\n input.getAttribute(PHX_DONE_REFS)\n ) {\n active++;\n }\n });\n return active > 0;\n }\n\n static serializeUploads(inputEl) {\n const files = this.activeFiles(inputEl);\n const fileData = {};\n files.forEach((file) => {\n const entry = { path: inputEl.name };\n const uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF);\n fileData[uploadRef] = fileData[uploadRef] || [];\n entry.ref = this.genFileRef(file);\n entry.last_modified = file.lastModified;\n entry.name = file.name || entry.ref;\n entry.relative_path = file.webkitRelativePath;\n entry.type = file.type;\n entry.size = file.size;\n if (typeof file.meta === \"function\") {\n entry.meta = file.meta();\n }\n fileData[uploadRef].push(entry);\n });\n return fileData;\n }\n\n static clearFiles(inputEl) {\n inputEl.value = null;\n inputEl.removeAttribute(PHX_UPLOAD_REF);\n DOM.putPrivate(inputEl, \"files\", []);\n }\n\n static untrackFile(inputEl, file) {\n DOM.putPrivate(\n inputEl,\n \"files\",\n DOM.private(inputEl, \"files\").filter((f) => !Object.is(f, file)),\n );\n }\n\n /**\n * @param {HTMLInputElement} inputEl\n * @param {Array<File|Blob>} files\n * @param {DataTransfer} [dataTransfer]\n */\n static trackFiles(inputEl, files, dataTransfer) {\n if (inputEl.getAttribute(\"multiple\") !== null) {\n const newFiles = files.filter(\n (file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)),\n );\n DOM.updatePrivate(inputEl, \"files\", [], (existing) =>\n existing.concat(newFiles),\n );\n inputEl.value = null;\n } else {\n // Reset inputEl files to align output with programmatic changes (i.e. drag and drop)\n if (dataTransfer && dataTransfer.files.length > 0) {\n inputEl.files = dataTransfer.files;\n }\n DOM.putPrivate(inputEl, \"files\", files);\n }\n }\n\n static activeFileInputs(formEl) {\n const fileInputs = DOM.findUploadInputs(formEl);\n return Array.from(fileInputs).filter(\n (el) => el.files && this.activeFiles(el).length > 0,\n );\n }\n\n static activeFiles(input) {\n return (DOM.private(input, \"files\") || []).filter((f) =>\n UploadEntry.isActive(input, f),\n );\n }\n\n static inputsAwaitingPreflight(formEl) {\n const fileInputs = DOM.findUploadInputs(formEl);\n return Array.from(fileInputs).filter(\n (input) => this.filesAwaitingPreflight(input).length > 0,\n );\n }\n\n static filesAwaitingPreflight(input) {\n return this.activeFiles(input).filter(\n (f) =>\n !UploadEntry.isPreflighted(input, f) &&\n !UploadEntry.isPreflightInProgress(f),\n );\n }\n\n static markPreflightInProgress(entries) {\n entries.forEach((entry) => UploadEntry.markPreflightInProgress(entry.file));\n }\n\n constructor(inputEl, view, onComplete) {\n this.autoUpload = DOM.isAutoUpload(inputEl);\n this.view = view;\n this.onComplete = onComplete;\n this._entries = Array.from(\n LiveUploader.filesAwaitingPreflight(inputEl) || [],\n ).map((file) => new UploadEntry(inputEl, file, view, this.autoUpload));\n\n // prevent sending duplicate preflight requests\n LiveUploader.markPreflightInProgress(this._entries);\n\n this.numEntriesInProgress = this._entries.length;\n }\n\n isAutoUpload() {\n return this.autoUpload;\n }\n\n entries() {\n return this._entries;\n }\n\n initAdapterUpload(resp, onError, liveSocket) {\n this._entries = this._entries.map((entry) => {\n if (entry.isCancelled()) {\n this.numEntriesInProgress--;\n if (this.numEntriesInProgress === 0) {\n this.onComplete();\n }\n } else {\n entry.zipPostFlight(resp);\n entry.onDone(() => {\n this.numEntriesInProgress--;\n if (this.numEntriesInProgress === 0) {\n this.onComplete();\n }\n });\n }\n return entry;\n });\n\n const groupedEntries = this._entries.reduce((acc, entry) => {\n if (!entry.meta) {\n return acc;\n }\n const { name, callback } = entry.uploader(liveSocket.uploaders);\n acc[name] = acc[name] || { callback: callback, entries: [] };\n acc[name].entries.push(entry);\n return acc;\n }, {});\n\n for (const name in groupedEntries) {\n const { callback, entries } = groupedEntries[name];\n callback(entries, onError, resp, liveSocket);\n }\n }\n}\n", "const ARIA = {\n anyOf(instance, classes) {\n return classes.find((name) => instance instanceof name);\n },\n\n isFocusable(el, interactiveOnly) {\n return (\n (el instanceof HTMLAnchorElement && el.rel !== \"ignore\") ||\n (el instanceof HTMLAreaElement && el.href !== undefined) ||\n (!el.disabled &&\n this.anyOf(el, [\n HTMLInputElement,\n HTMLSelectElement,\n HTMLTextAreaElement,\n HTMLButtonElement,\n ])) ||\n el instanceof HTMLIFrameElement ||\n (el.tabIndex >= 0 && el.getAttribute(\"aria-hidden\") !== \"true\") ||\n (!interactiveOnly &&\n el.getAttribute(\"tabindex\") !== null &&\n el.getAttribute(\"aria-hidden\") !== \"true\")\n );\n },\n\n attemptFocus(el, interactiveOnly) {\n if (this.isFocusable(el, interactiveOnly)) {\n try {\n el.focus();\n } catch {\n // that's fine\n }\n }\n return !!document.activeElement && document.activeElement.isSameNode(el);\n },\n\n focusFirstInteractive(el) {\n let child = el.firstElementChild;\n while (child) {\n if (this.attemptFocus(child, true) || this.focusFirstInteractive(child)) {\n return true;\n }\n child = child.nextElementSibling;\n }\n },\n\n focusFirst(el) {\n let child = el.firstElementChild;\n while (child) {\n if (this.attemptFocus(child) || this.focusFirst(child)) {\n return true;\n }\n child = child.nextElementSibling;\n }\n },\n\n focusLast(el) {\n let child = el.lastElementChild;\n while (child) {\n if (this.attemptFocus(child) || this.focusLast(child)) {\n return true;\n }\n child = child.previousElementSibling;\n }\n },\n};\nexport default ARIA;\n", "import {\n PHX_ACTIVE_ENTRY_REFS,\n PHX_LIVE_FILE_UPDATED,\n PHX_PREFLIGHTED_REFS,\n PHX_UPLOAD_REF,\n} from \"./constants\";\n\nimport LiveUploader from \"./live_uploader\";\nimport ARIA from \"./aria\";\n\nconst Hooks = {\n LiveFileUpload: {\n activeRefs() {\n return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS);\n },\n\n preflightedRefs() {\n return this.el.getAttribute(PHX_PREFLIGHTED_REFS);\n },\n\n mounted() {\n this.preflightedWas = this.preflightedRefs();\n },\n\n updated() {\n const newPreflights = this.preflightedRefs();\n if (this.preflightedWas !== newPreflights) {\n this.preflightedWas = newPreflights;\n if (newPreflights === \"\") {\n this.__view().cancelSubmit(this.el.form);\n }\n }\n\n if (this.activeRefs() === \"\") {\n this.el.value = null;\n }\n this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED));\n },\n },\n\n LiveImgPreview: {\n mounted() {\n this.ref = this.el.getAttribute(\"data-phx-entry-ref\");\n this.inputEl = document.getElementById(\n this.el.getAttribute(PHX_UPLOAD_REF),\n );\n LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => {\n this.url = url;\n this.el.src = url;\n });\n },\n destroyed() {\n URL.revokeObjectURL(this.url);\n },\n },\n FocusWrap: {\n mounted() {\n this.focusStart = this.el.firstElementChild;\n this.focusEnd = this.el.lastElementChild;\n this.focusStart.addEventListener(\"focus\", (e) => {\n if (!e.relatedTarget || !this.el.contains(e.relatedTarget)) {\n // Handle focus entering from outside (e.g. Tab when body is focused)\n // https://github.com/phoenixframework/phoenix_live_view/issues/3636\n const nextFocus = e.target.nextElementSibling;\n ARIA.attemptFocus(nextFocus) || ARIA.focusFirst(nextFocus);\n } else {\n ARIA.focusLast(this.el);\n }\n });\n this.focusEnd.addEventListener(\"focus\", (e) => {\n if (!e.relatedTarget || !this.el.contains(e.relatedTarget)) {\n // Handle focus entering from outside (e.g. Shift+Tab when body is focused)\n // https://github.com/phoenixframework/phoenix_live_view/issues/3636\n const nextFocus = e.target.previousElementSibling;\n ARIA.attemptFocus(nextFocus) || ARIA.focusLast(nextFocus);\n } else {\n ARIA.focusFirst(this.el);\n }\n });\n // only try to change the focus if it is not already inside\n if (!this.el.contains(document.activeElement)) {\n this.el.addEventListener(\"phx:show-end\", () => this.el.focus());\n if (window.getComputedStyle(this.el).display !== \"none\") {\n ARIA.focusFirst(this.el);\n }\n }\n },\n },\n};\n\nconst findScrollContainer = (el) => {\n // the scroll event won't be fired on the html/body element even if overflow is set\n // therefore we return null to instead listen for scroll events on document\n if ([\"HTML\", \"BODY\"].indexOf(el.nodeName.toUpperCase()) >= 0) return null;\n if ([\"scroll\", \"auto\"].indexOf(getComputedStyle(el).overflowY) >= 0)\n return el;\n return findScrollContainer(el.parentElement);\n};\n\nconst scrollTop = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.scrollTop;\n } else {\n return document.documentElement.scrollTop || document.body.scrollTop;\n }\n};\n\nconst bottom = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.getBoundingClientRect().bottom;\n } else {\n // when we have no container, the whole page scrolls,\n // therefore the bottom coordinate is the viewport height\n return window.innerHeight || document.documentElement.clientHeight;\n }\n};\n\nconst top = (scrollContainer) => {\n if (scrollContainer) {\n return scrollContainer.getBoundingClientRect().top;\n } else {\n // when we have no container the whole page scrolls,\n // therefore the top coordinate is 0\n return 0;\n }\n};\n\nconst isAtViewportTop = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.top) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.top) <= bottom(scrollContainer)\n );\n};\n\nconst isAtViewportBottom = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.bottom) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.bottom) <= bottom(scrollContainer)\n );\n};\n\nconst isWithinViewport = (el, scrollContainer) => {\n const rect = el.getBoundingClientRect();\n return (\n Math.ceil(rect.top) >= top(scrollContainer) &&\n Math.ceil(rect.left) >= 0 &&\n Math.floor(rect.top) <= bottom(scrollContainer)\n );\n};\n\nHooks.InfiniteScroll = {\n mounted() {\n this.scrollContainer = findScrollContainer(this.el);\n let scrollBefore = scrollTop(this.scrollContainer);\n let topOverran = false;\n const throttleInterval = 500;\n let pendingOp = null;\n\n const onTopOverrun = this.throttle(\n throttleInterval,\n (topEvent, firstChild) => {\n pendingOp = () => true;\n this.liveSocket.js().push(this.el, topEvent, {\n value: { id: firstChild.id, _overran: true },\n callback: () => {\n pendingOp = null;\n },\n });\n },\n );\n\n const onFirstChildAtTop = this.throttle(\n throttleInterval,\n (topEvent, firstChild) => {\n pendingOp = () => firstChild.scrollIntoView({ block: \"start\" });\n this.liveSocket.js().push(this.el, topEvent, {\n value: { id: firstChild.id },\n callback: () => {\n pendingOp = null;\n // make sure that the DOM is patched by waiting for the next tick\n window.requestAnimationFrame(() => {\n if (!isWithinViewport(firstChild, this.scrollContainer)) {\n firstChild.scrollIntoView({ block: \"start\" });\n }\n });\n },\n });\n },\n );\n\n const onLastChildAtBottom = this.throttle(\n throttleInterval,\n (bottomEvent, lastChild) => {\n pendingOp = () => lastChild.scrollIntoView({ block: \"end\" });\n this.liveSocket.js().push(this.el, bottomEvent, {\n value: { id: lastChild.id },\n callback: () => {\n pendingOp = null;\n // make sure that the DOM is patched by waiting for the next tick\n window.requestAnimationFrame(() => {\n if (!isWithinViewport(lastChild, this.scrollContainer)) {\n lastChild.scrollIntoView({ block: \"end\" });\n }\n });\n },\n });\n },\n );\n\n this.onScroll = (_e) => {\n const scrollNow = scrollTop(this.scrollContainer);\n\n if (pendingOp) {\n scrollBefore = scrollNow;\n return pendingOp();\n }\n const rect = this.el.getBoundingClientRect();\n const topEvent = this.el.getAttribute(\n this.liveSocket.binding(\"viewport-top\"),\n );\n const bottomEvent = this.el.getAttribute(\n this.liveSocket.binding(\"viewport-bottom\"),\n );\n const lastChild = this.el.lastElementChild;\n const firstChild = this.el.firstElementChild;\n const isScrollingUp = scrollNow < scrollBefore;\n const isScrollingDown = scrollNow > scrollBefore;\n\n // el overran while scrolling up\n if (isScrollingUp && topEvent && !topOverran && rect.top >= 0) {\n topOverran = true;\n onTopOverrun(topEvent, firstChild);\n } else if (isScrollingDown && topOverran && rect.top <= 0) {\n topOverran = false;\n }\n\n if (\n topEvent &&\n isScrollingUp &&\n isAtViewportTop(firstChild, this.scrollContainer)\n ) {\n onFirstChildAtTop(topEvent, firstChild);\n } else if (\n bottomEvent &&\n isScrollingDown &&\n isAtViewportBottom(lastChild, this.scrollContainer)\n ) {\n onLastChildAtBottom(bottomEvent, lastChild);\n }\n scrollBefore = scrollNow;\n };\n\n if (this.scrollContainer) {\n this.scrollContainer.addEventListener(\"scroll\", this.onScroll);\n } else {\n window.addEventListener(\"scroll\", this.onScroll);\n }\n },\n\n destroyed() {\n if (this.scrollContainer) {\n this.scrollContainer.removeEventListener(\"scroll\", this.onScroll);\n } else {\n window.removeEventListener(\"scroll\", this.onScroll);\n }\n },\n\n throttle(interval, callback) {\n let lastCallAt = 0;\n let timer;\n\n return (...args) => {\n const now = Date.now();\n const remainingTime = interval - (now - lastCallAt);\n\n if (remainingTime <= 0 || remainingTime > interval) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastCallAt = now;\n callback(...args);\n } else if (!timer) {\n timer = setTimeout(() => {\n lastCallAt = Date.now();\n timer = null;\n callback(...args);\n }, remainingTime);\n }\n };\n },\n};\nexport default Hooks;\n", "import {\n PHX_REF_LOADING,\n PHX_REF_LOCK,\n PHX_REF_SRC,\n PHX_PENDING_REFS,\n PHX_EVENT_CLASSES,\n PHX_DISABLED,\n PHX_READONLY,\n PHX_DISABLE_WITH_RESTORE,\n} from \"./constants\";\n\nimport DOM from \"./dom\";\n\nexport default class ElementRef {\n static onUnlock(el, callback) {\n if (!DOM.isLocked(el) && !el.closest(`[${PHX_REF_LOCK}]`)) {\n return callback();\n }\n const closestLock = el.closest(`[${PHX_REF_LOCK}]`);\n const ref = closestLock\n .closest(`[${PHX_REF_LOCK}]`)\n .getAttribute(PHX_REF_LOCK);\n closestLock.addEventListener(\n `phx:undo-lock:${ref}`,\n () => {\n callback();\n },\n { once: true },\n );\n }\n\n constructor(el) {\n this.el = el;\n this.loadingRef = el.hasAttribute(PHX_REF_LOADING)\n ? parseInt(el.getAttribute(PHX_REF_LOADING), 10)\n : null;\n this.lockRef = el.hasAttribute(PHX_REF_LOCK)\n ? parseInt(el.getAttribute(PHX_REF_LOCK), 10)\n : null;\n }\n\n // public\n\n maybeUndo(ref, phxEvent, eachCloneCallback) {\n if (!this.isWithin(ref)) {\n // we cannot undo the lock / loading now, as there is a newer one already set;\n // we need to store the original ref we tried to send the undo event later\n DOM.updatePrivate(this.el, PHX_PENDING_REFS, [], (pendingRefs) => {\n pendingRefs.push(ref);\n return pendingRefs;\n });\n return;\n }\n\n // undo locks and apply clones\n this.undoLocks(ref, phxEvent, eachCloneCallback);\n\n // undo loading states\n this.undoLoading(ref, phxEvent);\n\n // ensure undo events are fired for pending refs that\n // are resolved by the current ref, otherwise we'd leak event listeners\n DOM.updatePrivate(this.el, PHX_PENDING_REFS, [], (pendingRefs) => {\n return pendingRefs.filter((pendingRef) => {\n let opts = {\n detail: { ref: pendingRef, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n if (this.loadingRef && this.loadingRef > pendingRef) {\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-loading:${pendingRef}`, opts),\n );\n }\n if (this.lockRef && this.lockRef > pendingRef) {\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-lock:${pendingRef}`, opts),\n );\n }\n return pendingRef > ref;\n });\n });\n\n // clean up if fully resolved\n if (this.isFullyResolvedBy(ref)) {\n this.el.removeAttribute(PHX_REF_SRC);\n }\n }\n\n // private\n\n isWithin(ref) {\n return !(\n this.loadingRef !== null &&\n this.loadingRef > ref &&\n this.lockRef !== null &&\n this.lockRef > ref\n );\n }\n\n // Check for cloned PHX_REF_LOCK element that has been morphed behind\n // the scenes while this element was locked in the DOM.\n // When we apply the cloned tree to the active DOM element, we must\n //\n // 1. execute pending mounted hooks for nodes now in the DOM\n // 2. undo any ref inside the cloned tree that has since been ack'd\n undoLocks(ref, phxEvent, eachCloneCallback) {\n if (!this.isLockUndoneBy(ref)) {\n return;\n }\n\n const clonedTree = DOM.private(this.el, PHX_REF_LOCK);\n if (clonedTree) {\n eachCloneCallback(clonedTree);\n DOM.deletePrivate(this.el, PHX_REF_LOCK);\n }\n this.el.removeAttribute(PHX_REF_LOCK);\n\n const opts = {\n detail: { ref: ref, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-lock:${this.lockRef}`, opts),\n );\n }\n\n undoLoading(ref, phxEvent) {\n if (!this.isLoadingUndoneBy(ref)) {\n if (\n this.canUndoLoading(ref) &&\n this.el.classList.contains(\"phx-submit-loading\")\n ) {\n this.el.classList.remove(\"phx-change-loading\");\n }\n return;\n }\n\n if (this.canUndoLoading(ref)) {\n this.el.removeAttribute(PHX_REF_LOADING);\n const disabledVal = this.el.getAttribute(PHX_DISABLED);\n const readOnlyVal = this.el.getAttribute(PHX_READONLY);\n // restore inputs\n if (readOnlyVal !== null) {\n this.el.readOnly = readOnlyVal === \"true\" ? true : false;\n this.el.removeAttribute(PHX_READONLY);\n }\n if (disabledVal !== null) {\n this.el.disabled = disabledVal === \"true\" ? true : false;\n this.el.removeAttribute(PHX_DISABLED);\n }\n // restore disables\n const disableRestore = this.el.getAttribute(PHX_DISABLE_WITH_RESTORE);\n if (disableRestore !== null) {\n this.el.innerText = disableRestore;\n this.el.removeAttribute(PHX_DISABLE_WITH_RESTORE);\n }\n\n const opts = {\n detail: { ref: ref, event: phxEvent },\n bubbles: true,\n cancelable: false,\n };\n this.el.dispatchEvent(\n new CustomEvent(`phx:undo-loading:${this.loadingRef}`, opts),\n );\n }\n\n // remove classes\n PHX_EVENT_CLASSES.forEach((name) => {\n if (name !== \"phx-submit-loading\" || this.canUndoLoading(ref)) {\n DOM.removeClass(this.el, name);\n }\n });\n }\n\n isLoadingUndoneBy(ref) {\n return this.loadingRef === null ? false : this.loadingRef <= ref;\n }\n isLockUndoneBy(ref) {\n return this.lockRef === null ? false : this.lockRef <= ref;\n }\n\n isFullyResolvedBy(ref) {\n return (\n (this.loadingRef === null || this.loadingRef <= ref) &&\n (this.lockRef === null || this.lockRef <= ref)\n );\n }\n\n // only remove the phx-submit-loading class if we are not locked\n canUndoLoading(ref) {\n return this.lockRef === null || this.lockRef <= ref;\n }\n}\n", "import { maybe } from \"./utils\";\n\nimport DOM from \"./dom\";\n\nexport default class DOMPostMorphRestorer {\n constructor(containerBefore, containerAfter, updateType) {\n const idsBefore = new Set();\n const idsAfter = new Set(\n [...containerAfter.children].map((child) => child.id),\n );\n\n const elementsToModify = [];\n\n Array.from(containerBefore.children).forEach((child) => {\n if (child.id) {\n // all of our children should be elements with ids\n idsBefore.add(child.id);\n if (idsAfter.has(child.id)) {\n const previousElementId =\n child.previousElementSibling && child.previousElementSibling.id;\n elementsToModify.push({\n elementId: child.id,\n previousElementId: previousElementId,\n });\n }\n }\n });\n\n this.containerId = containerAfter.id;\n this.updateType = updateType;\n this.elementsToModify = elementsToModify;\n this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id));\n }\n\n // We do the following to optimize append/prepend operations:\n // 1) Track ids of modified elements & of new elements\n // 2) All the modified elements are put back in the correct position in the DOM tree\n // by storing the id of their previous sibling\n // 3) New elements are going to be put in the right place by morphdom during append.\n // For prepend, we move them to the first position in the container\n perform() {\n const container = DOM.byId(this.containerId);\n if (!container) {\n return;\n }\n this.elementsToModify.forEach((elementToModify) => {\n if (elementToModify.previousElementId) {\n maybe(\n document.getElementById(elementToModify.previousElementId),\n (previousElem) => {\n maybe(\n document.getElementById(elementToModify.elementId),\n (elem) => {\n const isInRightPlace =\n elem.previousElementSibling &&\n elem.previousElementSibling.id == previousElem.id;\n if (!isInRightPlace) {\n previousElem.insertAdjacentElement(\"afterend\", elem);\n }\n },\n );\n },\n );\n } else {\n // This is the first element in the container\n maybe(document.getElementById(elementToModify.elementId), (elem) => {\n const isInRightPlace = elem.previousElementSibling == null;\n if (!isInRightPlace) {\n container.insertAdjacentElement(\"afterbegin\", elem);\n }\n });\n }\n });\n\n if (this.updateType == \"prepend\") {\n this.elementIdsToAdd.reverse().forEach((elemId) => {\n maybe(document.getElementById(elemId), (elem) =>\n container.insertAdjacentElement(\"afterbegin\", elem),\n );\n });\n }\n }\n}\n", "var DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n\n // document-fragments dont have attributes so lets not do anything\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n // update attributes on original DOM element\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n if (fromValue !== attrValue) {\n if (attr.prefix === 'xmlns'){\n attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n\n // Remove any extra attributes found on the original DOM element that\n // weren't found on the target element.\n var fromNodeAttrs = fromNode.attributes;\n\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement('template');\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement('body');\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n // avoid restrictions on content for things like `<tr><th>Hi</th></tr>` which\n // createContextualFragment doesn't support\n // <template> support not available in IE\n return createFragmentFromTemplate(str);\n } else if (HAS_RANGE_SUPPORT) {\n return createFragmentFromRange(str);\n }\n\n return createFragmentFromWrap(str);\n}\n\n/**\n * Returns true if two node's names are the same.\n *\n * NOTE: We don't bother checking `namespaceURI` because you will never find two HTML elements with the same\n * nodeName and different namespace URIs.\n *\n * @param {Element} a\n * @param {Element} b The target element\n * @return {boolean}\n */\nfunction compareNodeNames(fromEl, toEl) {\n var fromNodeName = fromEl.nodeName;\n var toNodeName = toEl.nodeName;\n var fromCodeStart, toCodeStart;\n\n if (fromNodeName === toNodeName) {\n return true;\n }\n\n fromCodeStart = fromNodeName.charCodeAt(0);\n toCodeStart = toNodeName.charCodeAt(0);\n\n // If the target element is a virtual DOM node or SVG node then we may\n // need to normalize the tag name before comparing. Normal HTML elements that are\n // in the \"http://www.w3.org/1999/xhtml\"\n // are converted to upper case\n if (fromCodeStart <= 90 && toCodeStart >= 97) { // from is upper and to is lower\n return fromNodeName === toNodeName.toUpperCase();\n } else if (toCodeStart <= 90 && fromCodeStart >= 97) { // to is upper and from is lower\n return toNodeName === fromNodeName.toUpperCase();\n } else {\n return false;\n }\n}\n\n/**\n * Create an element, optionally with a known namespace URI.\n *\n * @param {string} name the element name, e.g. 'div' or 'svg'\n * @param {string} [namespaceURI] the element's namespace URI, i.e. the value of\n * its `xmlns` attribute or its inferred namespace.\n *\n * @return {Element}\n */\nfunction createElementNS(name, namespaceURI) {\n return !namespaceURI || namespaceURI === NS_XHTML ?\n doc.createElement(name) :\n doc.createElementNS(namespaceURI, name);\n}\n\n/**\n * Copies the children of one DOM element to another DOM element\n */\nfunction moveChildren(fromEl, toEl) {\n var curChild = fromEl.firstChild;\n while (curChild) {\n var nextChild = curChild.nextSibling;\n toEl.appendChild(curChild);\n curChild = nextChild;\n }\n return toEl;\n}\n\nfunction syncBooleanAttrProp(fromEl, toEl, name) {\n if (fromEl[name] !== toEl[name]) {\n fromEl[name] = toEl[name];\n if (fromEl[name]) {\n fromEl.setAttribute(name, '');\n } else {\n fromEl.removeAttribute(name);\n }\n }\n}\n\nvar specialElHandlers = {\n OPTION: function(fromEl, toEl) {\n var parentNode = fromEl.parentNode;\n if (parentNode) {\n var parentName = parentNode.nodeName.toUpperCase();\n if (parentName === 'OPTGROUP') {\n parentNode = parentNode.parentNode;\n parentName = parentNode && parentNode.nodeName.toUpperCase();\n }\n if (parentName === 'SELECT' && !parentNode.hasAttribute('multiple')) {\n if (fromEl.hasAttribute('selected') && !toEl.selected) {\n // Workaround for MS Edge bug where the 'selected' attribute can only be\n // removed if set to a non-empty value:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12087679/\n fromEl.setAttribute('selected', 'selected');\n fromEl.removeAttribute('selected');\n }\n // We have to reset select element's selectedIndex to -1, otherwise setting\n // fromEl.selected using the syncBooleanAttrProp below has no effect.\n // The correct selectedIndex will be set in the SELECT special handler below.\n parentNode.selectedIndex = -1;\n }\n }\n syncBooleanAttrProp(fromEl, toEl, 'selected');\n },\n /**\n * The \"value\" attribute is special for the <input> element since it sets\n * the initial value. Changing the \"value\" attribute without changing the\n * \"value\" property will have no effect since it is only used to the set the\n * initial value. Similar for the \"checked\" attribute, and \"disabled\".\n */\n INPUT: function(fromEl, toEl) {\n syncBooleanAttrProp(fromEl, toEl, 'checked');\n syncBooleanAttrProp(fromEl, toEl, 'disabled');\n\n if (fromEl.value !== toEl.value) {\n fromEl.value = toEl.value;\n }\n\n if (!toEl.hasAttribute('value')) {\n fromEl.removeAttribute('value');\n }\n },\n\n TEXTAREA: function(fromEl, toEl) {\n var newValue = toEl.value;\n if (fromEl.value !== newValue) {\n fromEl.value = newValue;\n }\n\n var firstChild = fromEl.firstChild;\n if (firstChild) {\n // Needed for IE. Apparently IE sets the placeholder as the\n // node value and vise versa. This ignores an empty update.\n var oldValue = firstChild.nodeValue;\n\n if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {\n return;\n }\n\n firstChild.nodeValue = newValue;\n }\n },\n SELECT: function(fromEl, toEl) {\n if (!toEl.hasAttribute('multiple')) {\n var selectedIndex = -1;\n var i = 0;\n // We have to loop through children of fromEl, not toEl since nodes can be moved\n // from toEl to fromEl directly when morphing.\n // At the time this special handler is invoked, all children have already been morphed\n // and appended to / removed from fromEl, so using fromEl here is safe and correct.\n var curChild = fromEl.firstChild;\n var optgroup;\n var nodeName;\n while(curChild) {\n nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();\n if (nodeName === 'OPTGROUP') {\n optgroup = curChild;\n curChild = optgroup.firstChild;\n // handle empty optgroups\n if (!curChild) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n } else {\n if (nodeName === 'OPTION') {\n if (curChild.hasAttribute('selected')) {\n selectedIndex = i;\n break;\n }\n i++;\n }\n curChild = curChild.nextSibling;\n if (!curChild && optgroup) {\n curChild = optgroup.nextSibling;\n optgroup = null;\n }\n }\n }\n\n fromEl.selectedIndex = selectedIndex;\n }\n }\n};\n\nvar ELEMENT_NODE = 1;\nvar DOCUMENT_FRAGMENT_NODE$1 = 11;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\n\nfunction noop() {}\n\nfunction defaultGetNodeKey(node) {\n if (node) {\n return (node.getAttribute && node.getAttribute('id')) || node.id;\n }\n}\n\nfunction morphdomFactory(morphAttrs) {\n\n return function morphdom(fromNode, toNode, options) {\n if (!options) {\n options = {};\n }\n\n if (typeof toNode === 'string') {\n if (fromNode.nodeName === '#document' || fromNode.nodeName === 'HTML' || fromNode.nodeName === 'BODY') {\n var toNodeHtml = toNode;\n toNode = doc.createElement('html');\n toNode.innerHTML = toNodeHtml;\n } else {\n toNode = toElement(toNode);\n }\n } else if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n toNode = toNode.firstElementChild;\n }\n\n var getNodeKey = options.getNodeKey || defaultGetNodeKey;\n var onBeforeNodeAdded = options.onBeforeNodeAdded || noop;\n var onNodeAdded = options.onNodeAdded || noop;\n var onBeforeElUpdated = options.onBeforeElUpdated || noop;\n var onElUpdated = options.onElUpdated || noop;\n var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop;\n var onNodeDiscarded = options.onNodeDiscarded || noop;\n var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop;\n var skipFromChildren = options.skipFromChildren || noop;\n var addChild = options.addChild || function(parent, child){ return parent.appendChild(child); };\n var childrenOnly = options.childrenOnly === true;\n\n // This object is used as a lookup to quickly find all keyed elements in the original DOM tree.\n var fromNodesLookup = Object.create(null);\n var keyedRemovalList = [];\n\n function addKeyedRemoval(key) {\n keyedRemovalList.push(key);\n }\n\n function walkDiscardedChildNodes(node, skipKeyedNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n var curChild = node.firstChild;\n while (curChild) {\n\n var key = undefined;\n\n if (skipKeyedNodes && (key = getNodeKey(curChild))) {\n // If we are skipping keyed nodes then we add the key\n // to a list so that it can be handled at the very end.\n addKeyedRemoval(key);\n } else {\n // Only report the node as discarded if it is not keyed. We do this because\n // at the end we loop through all keyed elements that were unmatched\n // and then discard them in one final pass.\n onNodeDiscarded(curChild);\n if (curChild.firstChild) {\n walkDiscardedChildNodes(curChild, skipKeyedNodes);\n }\n }\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n /**\n * Removes a DOM node out of the original DOM\n *\n * @param {Node} node The node to remove\n * @param {Node} parentNode The nodes parent\n * @param {Boolean} skipKeyedNodes If true then elements with keys will be skipped and not discarded.\n * @return {undefined}\n */\n function removeNode(node, parentNode, skipKeyedNodes) {\n if (onBeforeNodeDiscarded(node) === false) {\n return;\n }\n\n if (parentNode) {\n parentNode.removeChild(node);\n }\n\n onNodeDiscarded(node);\n walkDiscardedChildNodes(node, skipKeyedNodes);\n }\n\n // // TreeWalker implementation is no faster, but keeping this around in case this changes in the future\n // function indexTree(root) {\n // var treeWalker = document.createTreeWalker(\n // root,\n // NodeFilter.SHOW_ELEMENT);\n //\n // var el;\n // while((el = treeWalker.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n // // NodeIterator implementation is no faster, but keeping this around in case this changes in the future\n //\n // function indexTree(node) {\n // var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT);\n // var el;\n // while((el = nodeIterator.nextNode())) {\n // var key = getNodeKey(el);\n // if (key) {\n // fromNodesLookup[key] = el;\n // }\n // }\n // }\n\n function indexTree(node) {\n if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {\n var curChild = node.firstChild;\n while (curChild) {\n var key = getNodeKey(curChild);\n if (key) {\n fromNodesLookup[key] = curChild;\n }\n\n // Walk recursively\n indexTree(curChild);\n\n curChild = curChild.nextSibling;\n }\n }\n }\n\n indexTree(fromNode);\n\n function handleNodeAdded(el) {\n onNodeAdded(el);\n\n var curChild = el.firstChild;\n while (curChild) {\n var nextSibling = curChild.nextSibling;\n\n var key = getNodeKey(curChild);\n if (key) {\n var unmatchedFromEl = fromNodesLookup[key];\n // if we find a duplicate #id node in cache, replace `el` with cache value\n // and morph it to the child node.\n if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {\n curChild.parentNode.replaceChild(unmatchedFromEl, curChild);\n morphEl(unmatchedFromEl, curChild);\n } else {\n handleNodeAdded(curChild);\n }\n } else {\n // recursively call for curChild and it's children to see if we find something in\n // fromNodesLookup\n handleNodeAdded(curChild);\n }\n\n curChild = nextSibling;\n }\n }\n\n function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {\n // We have processed all of the \"to nodes\". If curFromNodeChild is\n // non-null then we still have some from nodes left over that need\n // to be removed\n while (curFromNodeChild) {\n var fromNextSibling = curFromNodeChild.nextSibling;\n if ((curFromNodeKey = getNodeKey(curFromNodeChild))) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n curFromNodeChild = fromNextSibling;\n }\n }\n\n function morphEl(fromEl, toEl, childrenOnly) {\n var toElKey = getNodeKey(toEl);\n\n if (toElKey) {\n // If an element with an ID is being morphed then it will be in the final\n // DOM so clear it out of the saved elements collection\n delete fromNodesLookup[toElKey];\n }\n\n if (!childrenOnly) {\n // optional\n var beforeUpdateResult = onBeforeElUpdated(fromEl, toEl);\n if (beforeUpdateResult === false) {\n return;\n } else if (beforeUpdateResult instanceof HTMLElement) {\n fromEl = beforeUpdateResult;\n // reindex the new fromEl in case it's not in the same\n // tree as the original fromEl\n // (Phoenix LiveView sometimes returns a cloned tree,\n // but keyed lookups would still point to the original tree)\n indexTree(fromEl);\n }\n\n // update attributes on original DOM element first\n morphAttrs(fromEl, toEl);\n // optional\n onElUpdated(fromEl);\n\n if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {\n return;\n }\n }\n\n if (fromEl.nodeName !== 'TEXTAREA') {\n morphChildren(fromEl, toEl);\n } else {\n specialElHandlers.TEXTAREA(fromEl, toEl);\n }\n }\n\n function morphChildren(fromEl, toEl) {\n var skipFrom = skipFromChildren(fromEl, toEl);\n var curToNodeChild = toEl.firstChild;\n var curFromNodeChild = fromEl.firstChild;\n var curToNodeKey;\n var curFromNodeKey;\n\n var fromNextSibling;\n var toNextSibling;\n var matchingFromEl;\n\n // walk the children\n outer: while (curToNodeChild) {\n toNextSibling = curToNodeChild.nextSibling;\n curToNodeKey = getNodeKey(curToNodeChild);\n\n // walk the fromNode children all the way through\n while (!skipFrom && curFromNodeChild) {\n fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n curFromNodeKey = getNodeKey(curFromNodeChild);\n\n var curFromNodeType = curFromNodeChild.nodeType;\n\n // this means if the curFromNodeChild doesnt have a match with the curToNodeChild\n var isCompatible = undefined;\n\n if (curFromNodeType === curToNodeChild.nodeType) {\n if (curFromNodeType === ELEMENT_NODE) {\n // Both nodes being compared are Element nodes\n\n if (curToNodeKey) {\n // The target node has a key so we want to match it up with the correct element\n // in the original DOM tree\n if (curToNodeKey !== curFromNodeKey) {\n // The current element in the original DOM tree does not have a matching key so\n // let's check our lookup to see if there is a matching element in the original\n // DOM tree\n if ((matchingFromEl = fromNodesLookup[curToNodeKey])) {\n if (fromNextSibling === matchingFromEl) {\n // Special case for single element removals. To avoid removing the original\n // DOM node out of the tree (since that can break CSS transitions, etc.),\n // we will instead discard the current node and wait until the next\n // iteration to properly match up the keyed target element with its matching\n // element in the original tree\n isCompatible = false;\n } else {\n // We found a matching keyed element somewhere in the original DOM tree.\n // Let's move the original DOM node into the current position and morph\n // it.\n\n // NOTE: We use insertBefore instead of replaceChild because we want to go through\n // the `removeNode()` function for the node that is being discarded so that\n // all lifecycle hooks are correctly invoked\n fromEl.insertBefore(matchingFromEl, curFromNodeChild);\n\n // fromNextSibling = curFromNodeChild.nextSibling;\n\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = matchingFromEl;\n curFromNodeKey = getNodeKey(curFromNodeChild);\n }\n } else {\n // The nodes are not compatible since the \"to\" node has a key and there\n // is no matching keyed node in the source tree\n isCompatible = false;\n }\n }\n } else if (curFromNodeKey) {\n // The original has a key\n isCompatible = false;\n }\n\n isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);\n if (isCompatible) {\n // We found compatible DOM elements so transform\n // the current \"from\" node to match the current\n // target DOM node.\n // MORPH\n morphEl(curFromNodeChild, curToNodeChild);\n }\n\n } else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {\n // Both nodes being compared are Text or Comment nodes\n isCompatible = true;\n // Simply update nodeValue on the original node to\n // change the text value\n if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {\n curFromNodeChild.nodeValue = curToNodeChild.nodeValue;\n }\n\n }\n }\n\n if (isCompatible) {\n // Advance both the \"to\" child and the \"from\" child since we found a match\n // Nothing else to do as we already recursively called morphChildren above\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n continue outer;\n }\n\n // No compatible match so remove the old node from the DOM and continue trying to find a\n // match in the original DOM. However, we only do this if the from node is not keyed\n // since it is possible that a keyed node might match up with a node somewhere else in the\n // target tree and we don't want to discard it just yet since it still might find a\n // home in the final DOM tree. After everything is done we will remove any keyed nodes\n // that didn't find a home\n if (curFromNodeKey) {\n // Since the node is keyed it might be matched up later so we defer\n // the actual removal to later\n addKeyedRemoval(curFromNodeKey);\n } else {\n // NOTE: we skip nested keyed nodes from being removed since there is\n // still a chance they will be matched up later\n removeNode(curFromNodeChild, fromEl, true /* skip keyed nodes */);\n }\n\n curFromNodeChild = fromNextSibling;\n } // END: while(curFromNodeChild) {}\n\n // If we got this far then we did not find a candidate match for\n // our \"to node\" and we exhausted all of the children \"from\"\n // nodes. Therefore, we will just append the current \"to\" node\n // to the end\n if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {\n // MORPH\n if(!skipFrom){ addChild(fromEl, matchingFromEl); }\n morphEl(matchingFromEl, curToNodeChild);\n } else {\n var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);\n if (onBeforeNodeAddedResult !== false) {\n if (onBeforeNodeAddedResult) {\n curToNodeChild = onBeforeNodeAddedResult;\n }\n\n if (curToNodeChild.actualize) {\n curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);\n }\n addChild(fromEl, curToNodeChild);\n handleNodeAdded(curToNodeChild);\n }\n }\n\n curToNodeChild = toNextSibling;\n curFromNodeChild = fromNextSibling;\n }\n\n cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);\n\n var specialElHandler = specialElHandlers[fromEl.nodeName];\n if (specialElHandler) {\n specialElHandler(fromEl, toEl);\n }\n } // END: morphChildren(...)\n\n var morphedNode = fromNode;\n var morphedNodeType = morphedNode.nodeType;\n var toNodeType = toNode.nodeType;\n\n if (!childrenOnly) {\n // Handle the case where we are given two DOM nodes that are not\n // compatible (e.g. <div> --> <span> or <div> --> TEXT)\n if (morphedNodeType === ELEMENT_NODE) {\n if (toNodeType === ELEMENT_NODE) {\n if (!compareNodeNames(fromNode, toNode)) {\n onNodeDiscarded(fromNode);\n morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));\n }\n } else {\n // Going from an element node to a text node\n morphedNode = toNode;\n }\n } else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) { // Text or comment node\n if (toNodeType === morphedNodeType) {\n if (morphedNode.nodeValue !== toNode.nodeValue) {\n morphedNode.nodeValue = toNode.nodeValue;\n }\n\n return morphedNode;\n } else {\n // Text node to something else\n morphedNode = toNode;\n }\n }\n }\n\n if (morphedNode === toNode) {\n // The \"to node\" was not compatible with the \"from node\" so we had to\n // toss out the \"from node\" and use the \"to node\"\n onNodeDiscarded(fromNode);\n } else {\n if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {\n return;\n }\n\n morphEl(morphedNode, toNode, childrenOnly);\n\n // We now need to loop over any keyed nodes that might need to be\n // removed. We only do the removal if we know that the keyed node\n // never found a match. When a keyed node is matched up we remove\n // it out of fromNodesLookup and we use fromNodesLookup to determine\n // if a keyed node has been matched up or not\n if (keyedRemovalList) {\n for (var i=0, len=keyedRemovalList.length; i<len; i++) {\n var elToRemove = fromNodesLookup[keyedRemovalList[i]];\n if (elToRemove) {\n removeNode(elToRemove, elToRemove.parentNode, false);\n }\n }\n }\n }\n\n if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {\n if (morphedNode.actualize) {\n morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);\n }\n // If we had to swap out the from node with a new node because the old\n // node was not compatible with the target node then we need to\n // replace the old DOM node in the original DOM tree. This is only\n // possible if the original DOM node was part of a DOM tree which\n // we know is the case if it has a parent node.\n fromNode.parentNode.replaceChild(morphedNode, fromNode);\n }\n\n return morphedNode;\n };\n}\n\nvar morphdom = morphdomFactory(morphAttrs);\n\nexport default morphdom;\n", "import {\n PHX_COMPONENT,\n PHX_PRUNE,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_SKIP,\n PHX_MAGIC_ID,\n PHX_STATIC,\n PHX_TRIGGER_ACTION,\n PHX_UPDATE,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_STREAM,\n PHX_STREAM_REF,\n PHX_VIEWPORT_TOP,\n PHX_VIEWPORT_BOTTOM,\n PHX_PORTAL,\n PHX_TELEPORTED_REF,\n PHX_TELEPORTED_SRC,\n PHX_RUNTIME_HOOK,\n} from \"./constants\";\n\nimport { detectDuplicateIds, detectInvalidStreamInserts, isCid } from \"./utils\";\nimport ElementRef from \"./element_ref\";\nimport DOM from \"./dom\";\nimport DOMPostMorphRestorer from \"./dom_post_morph_restorer\";\nimport morphdom from \"morphdom\";\n\nexport default class DOMPatch {\n constructor(view, container, id, html, streams, targetCID, opts = {}) {\n this.view = view;\n this.liveSocket = view.liveSocket;\n this.container = container;\n this.id = id;\n this.rootID = view.root.id;\n this.html = html;\n this.streams = streams;\n this.streamInserts = {};\n this.streamComponentRestore = {};\n this.targetCID = targetCID;\n this.cidPatch = isCid(this.targetCID);\n this.pendingRemoves = [];\n this.phxRemove = this.liveSocket.binding(\"remove\");\n this.targetContainer = this.isCIDPatch()\n ? this.targetCIDContainer(html)\n : container;\n this.callbacks = {\n beforeadded: [],\n beforeupdated: [],\n beforephxChildAdded: [],\n afteradded: [],\n afterupdated: [],\n afterdiscarded: [],\n afterphxChildAdded: [],\n aftertransitionsDiscarded: [],\n };\n this.withChildren = opts.withChildren || opts.undoRef || false;\n this.undoRef = opts.undoRef;\n }\n\n before(kind, callback) {\n this.callbacks[`before${kind}`].push(callback);\n }\n after(kind, callback) {\n this.callbacks[`after${kind}`].push(callback);\n }\n\n trackBefore(kind, ...args) {\n this.callbacks[`before${kind}`].forEach((callback) => callback(...args));\n }\n\n trackAfter(kind, ...args) {\n this.callbacks[`after${kind}`].forEach((callback) => callback(...args));\n }\n\n markPrunableContentForRemoval() {\n const phxUpdate = this.liveSocket.binding(PHX_UPDATE);\n DOM.all(\n this.container,\n `[${phxUpdate}=append] > *, [${phxUpdate}=prepend] > *`,\n (el) => {\n el.setAttribute(PHX_PRUNE, \"\");\n },\n );\n }\n\n perform(isJoinPatch) {\n const { view, liveSocket, html, container, targetContainer } = this;\n if (this.isCIDPatch() && !targetContainer) {\n return;\n }\n\n const focused = liveSocket.getActiveElement();\n const { selectionStart, selectionEnd } =\n focused && DOM.hasSelectionRange(focused) ? focused : {};\n const phxUpdate = liveSocket.binding(PHX_UPDATE);\n const phxViewportTop = liveSocket.binding(PHX_VIEWPORT_TOP);\n const phxViewportBottom = liveSocket.binding(PHX_VIEWPORT_BOTTOM);\n const phxTriggerExternal = liveSocket.binding(PHX_TRIGGER_ACTION);\n const added = [];\n const updates = [];\n const appendPrependUpdates = [];\n\n // as the portal target itself could be at the end of the DOM,\n // it may not be present while morphing previous parts;\n // therefore we apply all teleports after the morphing is done+\n const portalCallbacks = [];\n\n let externalFormTriggered = null;\n\n const morph = (\n targetContainer,\n source,\n withChildren = this.withChildren,\n ) => {\n const morphCallbacks = {\n // normally, we are running with childrenOnly, as the patch HTML for a LV\n // does not include the LV attrs (data-phx-session, etc.)\n // when we are patching a live component, we do want to patch the root element as well;\n // another case is the recursive patch of a stream item that was kept on reset (-> onBeforeNodeAdded)\n childrenOnly:\n targetContainer.getAttribute(PHX_COMPONENT) === null && !withChildren,\n getNodeKey: (node) => {\n if (DOM.isPhxDestroyed(node)) {\n return null;\n }\n // If we have a join patch, then by definition there was no PHX_MAGIC_ID.\n // This is important to reduce the amount of elements morphdom discards.\n if (isJoinPatch) {\n return node.id;\n }\n return (\n node.id || (node.getAttribute && node.getAttribute(PHX_MAGIC_ID))\n );\n },\n // skip indexing from children when container is stream\n skipFromChildren: (from) => {\n return from.getAttribute(phxUpdate) === PHX_STREAM;\n },\n // tell morphdom how to add a child\n addChild: (parent, child) => {\n const { ref, streamAt } = this.getStreamInsert(child);\n if (ref === undefined) {\n return parent.appendChild(child);\n }\n\n this.setStreamRef(child, ref);\n\n // streaming\n if (streamAt === 0) {\n parent.insertAdjacentElement(\"afterbegin\", child);\n } else if (streamAt === -1) {\n const lastChild = parent.lastElementChild;\n if (lastChild && !lastChild.hasAttribute(PHX_STREAM_REF)) {\n const nonStreamChild = Array.from(parent.children).find(\n (c) => !c.hasAttribute(PHX_STREAM_REF),\n );\n parent.insertBefore(child, nonStreamChild);\n } else {\n parent.appendChild(child);\n }\n } else if (streamAt > 0) {\n const sibling = Array.from(parent.children)[streamAt];\n parent.insertBefore(child, sibling);\n }\n },\n onBeforeNodeAdded: (el) => {\n // don't add update_only nodes if they did not already exist\n if (\n this.getStreamInsert(el)?.updateOnly &&\n !this.streamComponentRestore[el.id]\n ) {\n return false;\n }\n\n DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom);\n this.trackBefore(\"added\", el);\n\n let morphedEl = el;\n // this is a stream item that was kept on reset, recursively morph it\n if (this.streamComponentRestore[el.id]) {\n morphedEl = this.streamComponentRestore[el.id];\n delete this.streamComponentRestore[el.id];\n morph(morphedEl, el, true);\n }\n\n return morphedEl;\n },\n onNodeAdded: (el) => {\n if (el.getAttribute) {\n this.maybeReOrderStream(el, true);\n }\n // phx-portal handling\n if (DOM.isPortalTemplate(el)) {\n portalCallbacks.push(() => this.teleport(el, morph));\n }\n\n // hack to fix Safari handling of img srcset and video tags\n if (el instanceof HTMLImageElement && el.srcset) {\n // eslint-disable-next-line no-self-assign\n el.srcset = el.srcset;\n } else if (el instanceof HTMLVideoElement && el.autoplay) {\n el.play();\n }\n if (DOM.isNowTriggerFormExternal(el, phxTriggerExternal)) {\n externalFormTriggered = el;\n }\n\n // nested view handling\n if (\n (DOM.isPhxChild(el) && view.ownsElement(el)) ||\n (DOM.isPhxSticky(el) && view.ownsElement(el.parentNode))\n ) {\n this.trackAfter(\"phxChildAdded\", el);\n }\n\n // data-phx-runtime-hook\n if (el.nodeName === \"SCRIPT\" && el.hasAttribute(PHX_RUNTIME_HOOK)) {\n this.handleRuntimeHook(el, source);\n }\n\n added.push(el);\n },\n onNodeDiscarded: (el) => this.onNodeDiscarded(el),\n onBeforeNodeDiscarded: (el) => {\n if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) {\n return true;\n }\n if (\n el.parentElement !== null &&\n el.id &&\n DOM.isPhxUpdate(el.parentElement, phxUpdate, [\n PHX_STREAM,\n \"append\",\n \"prepend\",\n ])\n ) {\n return false;\n }\n // don't remove teleported elements\n if (el.getAttribute && el.getAttribute(PHX_TELEPORTED_REF)) {\n return false;\n }\n if (this.maybePendingRemove(el)) {\n return false;\n }\n if (this.skipCIDSibling(el)) {\n return false;\n }\n\n if (DOM.isPortalTemplate(el)) {\n // if the portal template itself is removed, remove the teleported element as well;\n // we also perform a check after morphdom is finished to catch parent removals\n const teleportedEl = document.getElementById(\n el.content.firstElementChild.id,\n );\n if (teleportedEl) {\n teleportedEl.remove();\n morphCallbacks.onNodeDiscarded(teleportedEl);\n this.view.dropPortalElementId(teleportedEl.id);\n }\n }\n\n return true;\n },\n onElUpdated: (el) => {\n if (DOM.isNowTriggerFormExternal(el, phxTriggerExternal)) {\n externalFormTriggered = el;\n }\n updates.push(el);\n this.maybeReOrderStream(el, false);\n },\n onBeforeElUpdated: (fromEl, toEl) => {\n // if we are patching the root target container and the id has changed, treat it as a new node\n // by replacing the fromEl with the toEl, which ensures hooks are torn down and re-created\n if (\n fromEl.id &&\n fromEl.isSameNode(targetContainer) &&\n fromEl.id !== toEl.id\n ) {\n morphCallbacks.onNodeDiscarded(fromEl);\n fromEl.replaceWith(toEl);\n return morphCallbacks.onNodeAdded(toEl);\n }\n DOM.syncPendingAttrs(fromEl, toEl);\n DOM.maintainPrivateHooks(\n fromEl,\n toEl,\n phxViewportTop,\n phxViewportBottom,\n );\n DOM.cleanChildNodes(toEl, phxUpdate);\n if (this.skipCIDSibling(toEl)) {\n // if this is a live component used in a stream, we may need to reorder it\n this.maybeReOrderStream(fromEl);\n return false;\n }\n if (DOM.isPhxSticky(fromEl)) {\n [PHX_SESSION, PHX_STATIC, PHX_ROOT_ID]\n .map((attr) => [\n attr,\n fromEl.getAttribute(attr),\n toEl.getAttribute(attr),\n ])\n .forEach(([attr, fromVal, toVal]) => {\n if (toVal && fromVal !== toVal) {\n fromEl.setAttribute(attr, toVal);\n }\n });\n\n return false;\n }\n if (\n DOM.isIgnored(fromEl, phxUpdate) ||\n (fromEl.form && fromEl.form.isSameNode(externalFormTriggered))\n ) {\n this.trackBefore(\"updated\", fromEl, toEl);\n DOM.mergeAttrs(fromEl, toEl, {\n isIgnored: DOM.isIgnored(fromEl, phxUpdate),\n });\n updates.push(fromEl);\n DOM.applyStickyOperations(fromEl);\n return false;\n }\n if (\n fromEl.type === \"number\" &&\n fromEl.validity &&\n fromEl.validity.badInput\n ) {\n return false;\n }\n // If the element has PHX_REF_SRC, it is loading or locked and awaiting an ack.\n // If it's locked, we clone the fromEl tree and instruct morphdom to use\n // the cloned tree as the source of the morph for this branch from here on out.\n // We keep a reference to the cloned tree in the element's private data, and\n // on ack (view.undoRefs), we morph the cloned tree with the true fromEl in the DOM to\n // apply any changes that happened while the element was locked.\n const isFocusedFormEl =\n focused && fromEl.isSameNode(focused) && DOM.isFormInput(fromEl);\n const focusedSelectChanged =\n isFocusedFormEl && this.isChangedSelect(fromEl, toEl);\n if (fromEl.hasAttribute(PHX_REF_SRC)) {\n const ref = new ElementRef(fromEl);\n // only perform the clone step if this is not a patch that unlocks\n if (\n ref.lockRef &&\n (!this.undoRef || !ref.isLockUndoneBy(this.undoRef))\n ) {\n if (DOM.isUploadInput(fromEl)) {\n DOM.mergeAttrs(fromEl, toEl, { isIgnored: true });\n this.trackBefore(\"updated\", fromEl, toEl);\n updates.push(fromEl);\n }\n DOM.applyStickyOperations(fromEl);\n const isLocked = fromEl.hasAttribute(PHX_REF_LOCK);\n const clone = isLocked\n ? DOM.private(fromEl, PHX_REF_LOCK) || fromEl.cloneNode(true)\n : null;\n if (clone) {\n DOM.putPrivate(fromEl, PHX_REF_LOCK, clone);\n if (!isFocusedFormEl) {\n fromEl = clone;\n }\n }\n }\n }\n\n // nested view handling\n if (DOM.isPhxChild(toEl)) {\n const prevSession = fromEl.getAttribute(PHX_SESSION);\n DOM.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] });\n if (prevSession !== \"\") {\n fromEl.setAttribute(PHX_SESSION, prevSession);\n }\n fromEl.setAttribute(PHX_ROOT_ID, this.rootID);\n DOM.applyStickyOperations(fromEl);\n return false;\n }\n\n // if we are undoing a lock, copy potentially nested clones over\n if (this.undoRef && DOM.private(toEl, PHX_REF_LOCK)) {\n DOM.putPrivate(\n fromEl,\n PHX_REF_LOCK,\n DOM.private(toEl, PHX_REF_LOCK),\n );\n }\n // now copy regular DOM.private data\n DOM.copyPrivates(toEl, fromEl);\n\n // phx-portal handling\n if (DOM.isPortalTemplate(toEl)) {\n portalCallbacks.push(() => this.teleport(toEl, morph));\n return false;\n }\n\n // skip patching focused inputs unless focus is a select that has changed options\n if (\n isFocusedFormEl &&\n fromEl.type !== \"hidden\" &&\n !focusedSelectChanged\n ) {\n this.trackBefore(\"updated\", fromEl, toEl);\n DOM.mergeFocusedInput(fromEl, toEl);\n DOM.syncAttrsToProps(fromEl);\n updates.push(fromEl);\n DOM.applyStickyOperations(fromEl);\n return false;\n } else {\n // blur focused select if it changed so native UI is updated (ie safari won't update visible options)\n if (focusedSelectChanged) {\n fromEl.blur();\n }\n if (DOM.isPhxUpdate(toEl, phxUpdate, [\"append\", \"prepend\"])) {\n appendPrependUpdates.push(\n new DOMPostMorphRestorer(\n fromEl,\n toEl,\n toEl.getAttribute(phxUpdate),\n ),\n );\n }\n\n DOM.syncAttrsToProps(toEl);\n DOM.applyStickyOperations(toEl);\n this.trackBefore(\"updated\", fromEl, toEl);\n return fromEl;\n }\n },\n };\n\n morphdom(targetContainer, source, morphCallbacks);\n };\n\n this.trackBefore(\"added\", container);\n this.trackBefore(\"updated\", container, container);\n\n liveSocket.time(\"morphdom\", () => {\n this.streams.forEach(([ref, inserts, deleteIds, reset]) => {\n inserts.forEach(([key, streamAt, limit, updateOnly]) => {\n this.streamInserts[key] = { ref, streamAt, limit, reset, updateOnly };\n });\n if (reset !== undefined) {\n DOM.all(container, `[${PHX_STREAM_REF}=\"${ref}\"]`, (child) => {\n this.removeStreamChildElement(child);\n });\n }\n deleteIds.forEach((id) => {\n const child = container.querySelector(`[id=\"${id}\"]`);\n if (child) {\n this.removeStreamChildElement(child);\n }\n });\n });\n\n // clear stream items from the dead render if they are not inserted again\n if (isJoinPatch) {\n DOM.all(this.container, `[${phxUpdate}=${PHX_STREAM}]`)\n // it is important to filter the element before removing them, as\n // it may happen that streams are nested and the owner check fails if\n // a parent is removed before a child\n .filter((el) => this.view.ownsElement(el))\n .forEach((el) => {\n Array.from(el.children).forEach((child) => {\n // we already performed the owner check, each child is guaranteed to be owned\n // by the view. To prevent the nested owner check from failing in case of nested\n // streams where the parent is removed before the child, we force the removal\n this.removeStreamChildElement(child, true);\n });\n });\n }\n\n morph(targetContainer, html);\n // normal patch complete, teleport elements now\n portalCallbacks.forEach((callback) => callback());\n // check for any teleported elements that are not in the view any more\n // and remove them\n this.view.portalElementIds.forEach((id) => {\n const el = document.getElementById(id);\n if (el) {\n const source = document.getElementById(\n el.getAttribute(PHX_TELEPORTED_SRC),\n );\n if (!source) {\n el.remove();\n this.onNodeDiscarded(el);\n this.view.dropPortalElementId(id);\n }\n }\n });\n });\n\n if (liveSocket.isDebugEnabled()) {\n detectDuplicateIds();\n detectInvalidStreamInserts(this.streamInserts);\n // warn if there are any inputs named \"id\"\n Array.from(document.querySelectorAll(\"input[name=id]\")).forEach(\n (node) => {\n if (node instanceof HTMLInputElement && node.form) {\n console.error(\n 'Detected an input with name=\"id\" inside a form! This will cause problems when patching the DOM.\\n',\n node,\n );\n }\n },\n );\n }\n\n if (appendPrependUpdates.length > 0) {\n liveSocket.time(\"post-morph append/prepend restoration\", () => {\n appendPrependUpdates.forEach((update) => update.perform());\n });\n }\n\n liveSocket.silenceEvents(() =>\n DOM.restoreFocus(focused, selectionStart, selectionEnd),\n );\n DOM.dispatchEvent(document, \"phx:update\");\n added.forEach((el) => this.trackAfter(\"added\", el));\n updates.forEach((el) => this.trackAfter(\"updated\", el));\n\n this.transitionPendingRemoves();\n\n if (externalFormTriggered) {\n liveSocket.unload();\n // check for submitter and inject it as hidden input for external submit;\n // In theory, it could happen that the stored submitter is outdated and doesn't\n // exist in the DOM any more, but this is unlikely, so we just accept it for now.\n const submitter = DOM.private(externalFormTriggered, \"submitter\");\n if (submitter && submitter.name && targetContainer.contains(submitter)) {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n const formId = submitter.getAttribute(\"form\");\n if (formId) {\n input.setAttribute(\"form\", formId);\n }\n input.name = submitter.name;\n input.value = submitter.value;\n submitter.parentElement.insertBefore(input, submitter);\n }\n // use prototype's submit in case there's a form control with name or id of \"submit\"\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit\n Object.getPrototypeOf(externalFormTriggered).submit.call(\n externalFormTriggered,\n );\n }\n return true;\n }\n\n onNodeDiscarded(el) {\n // nested view handling\n if (DOM.isPhxChild(el) || DOM.isPhxSticky(el)) {\n this.liveSocket.destroyViewByEl(el);\n }\n this.trackAfter(\"discarded\", el);\n }\n\n maybePendingRemove(node) {\n if (node.getAttribute && node.getAttribute(this.phxRemove) !== null) {\n this.pendingRemoves.push(node);\n return true;\n } else {\n return false;\n }\n }\n\n removeStreamChildElement(child, force = false) {\n // make sure to only remove elements owned by the current view\n // see https://github.com/phoenixframework/phoenix_live_view/issues/3047\n // and https://github.com/phoenixframework/phoenix_live_view/issues/3681\n if (!force && !this.view.ownsElement(child)) {\n return;\n }\n\n // we need to store the node if it is actually re-added in the same patch\n // we do NOT want to execute phx-remove, we do NOT want to call onNodeDiscarded\n if (this.streamInserts[child.id]) {\n this.streamComponentRestore[child.id] = child;\n child.remove();\n } else {\n // only remove the element now if it has no phx-remove binding\n if (!this.maybePendingRemove(child)) {\n child.remove();\n this.onNodeDiscarded(child);\n }\n }\n }\n\n getStreamInsert(el) {\n const insert = el.id ? this.streamInserts[el.id] : {};\n return insert || {};\n }\n\n setStreamRef(el, ref) {\n DOM.putSticky(el, PHX_STREAM_REF, (el) =>\n el.setAttribute(PHX_STREAM_REF, ref),\n );\n }\n\n maybeReOrderStream(el, isNew) {\n const { ref, streamAt, reset } = this.getStreamInsert(el);\n if (streamAt === undefined) {\n return;\n }\n\n // we need to set the PHX_STREAM_REF here as well as addChild is invoked only for parents\n this.setStreamRef(el, ref);\n\n if (!reset && !isNew) {\n // we only reorder if the element is new or it's a stream reset\n return;\n }\n\n // check if the element has a parent element;\n // it doesn't if we are currently recursively morphing (restoring a saved stream child)\n // because the element is not yet added to the real dom;\n // reordering does not make sense in that case anyway\n if (!el.parentElement) {\n return;\n }\n\n if (streamAt === 0) {\n el.parentElement.insertBefore(el, el.parentElement.firstElementChild);\n } else if (streamAt > 0) {\n const children = Array.from(el.parentElement.children);\n const oldIndex = children.indexOf(el);\n if (streamAt >= children.length - 1) {\n el.parentElement.appendChild(el);\n } else {\n const sibling = children[streamAt];\n if (oldIndex > streamAt) {\n el.parentElement.insertBefore(el, sibling);\n } else {\n el.parentElement.insertBefore(el, sibling.nextElementSibling);\n }\n }\n }\n\n this.maybeLimitStream(el);\n }\n\n maybeLimitStream(el) {\n const { limit } = this.getStreamInsert(el);\n const children = limit !== null && Array.from(el.parentElement.children);\n if (limit && limit < 0 && children.length > limit * -1) {\n children\n .slice(0, children.length + limit)\n .forEach((child) => this.removeStreamChildElement(child));\n } else if (limit && limit >= 0 && children.length > limit) {\n children\n .slice(limit)\n .forEach((child) => this.removeStreamChildElement(child));\n }\n }\n\n transitionPendingRemoves() {\n const { pendingRemoves, liveSocket } = this;\n if (pendingRemoves.length > 0) {\n liveSocket.transitionRemoves(pendingRemoves, () => {\n pendingRemoves.forEach((el) => {\n const child = DOM.firstPhxChild(el);\n if (child) {\n liveSocket.destroyViewByEl(child);\n }\n el.remove();\n });\n this.trackAfter(\"transitionsDiscarded\", pendingRemoves);\n });\n }\n }\n\n isChangedSelect(fromEl, toEl) {\n if (!(fromEl instanceof HTMLSelectElement) || fromEl.multiple) {\n return false;\n }\n if (fromEl.options.length !== toEl.options.length) {\n return true;\n }\n\n // keep the current value\n toEl.value = fromEl.value;\n\n // in general we have to be very careful with using isEqualNode as it does not a reliable\n // DOM tree equality check, but for selection attributes and options it works fine\n return !fromEl.isEqualNode(toEl);\n }\n\n isCIDPatch() {\n return this.cidPatch;\n }\n\n skipCIDSibling(el) {\n return el.nodeType === Node.ELEMENT_NODE && el.hasAttribute(PHX_SKIP);\n }\n\n targetCIDContainer(html) {\n if (!this.isCIDPatch()) {\n return;\n }\n const [first, ...rest] = DOM.findComponentNodeList(\n this.view.id,\n this.targetCID,\n );\n if (rest.length === 0 && DOM.childNodeLength(html) === 1) {\n return first;\n } else {\n return first && first.parentNode;\n }\n }\n\n indexOf(parent, child) {\n return Array.from(parent.children).indexOf(child);\n }\n\n teleport(el, morph) {\n const targetSelector = el.getAttribute(PHX_PORTAL);\n const portalContainer = document.querySelector(targetSelector);\n if (!portalContainer) {\n throw new Error(\n \"portal target with selector \" + targetSelector + \" not found\",\n );\n }\n // phx-portal templates must have a single root element, so we assume this to be\n // the case here\n const toTeleport = el.content.firstElementChild;\n // the PHX_SKIP optimization can also apply inside of the <template> elements\n if (this.skipCIDSibling(toTeleport)) {\n return;\n }\n if (!toTeleport?.id) {\n throw new Error(\n \"phx-portal template must have a single root element with ID!\",\n );\n }\n const existing = document.getElementById(toTeleport.id);\n let portalTarget;\n if (existing) {\n // check if the element needs to be moved to another target\n if (!portalContainer.contains(existing)) {\n portalContainer.appendChild(existing);\n }\n // we already teleported in a previous patch\n portalTarget = existing;\n } else {\n // create empty target and morph it recursively\n portalTarget = document.createElement(toTeleport.tagName);\n portalContainer.appendChild(portalTarget);\n }\n // mark the target as teleported;\n // to prevent unnecessary attribute modifications, we set the attribute\n // on the source and remove it after morphing (we could also just keep it)\n // otherwise morphdom would remove it, as the ref is not present in the source\n // and we'd need to set it back after each morph\n toTeleport.setAttribute(PHX_TELEPORTED_REF, this.view.id);\n toTeleport.setAttribute(PHX_TELEPORTED_SRC, el.id);\n morph(portalTarget, toTeleport, true);\n toTeleport.removeAttribute(PHX_TELEPORTED_REF);\n toTeleport.removeAttribute(PHX_TELEPORTED_SRC);\n // store a reference to the teleported element in the view\n // to cleanup when the view is destroyed, in case the portal target\n // is outside the view itself\n this.view.pushPortalElementId(toTeleport.id);\n }\n\n handleRuntimeHook(el, source) {\n // usually, scripts are not executed when morphdom adds them to the DOM\n // we special case runtime colocated hooks\n const name = el.getAttribute(PHX_RUNTIME_HOOK);\n let nonce = el.hasAttribute(\"nonce\") ? el.getAttribute(\"nonce\") : null;\n if (el.hasAttribute(\"nonce\")) {\n const template = document.createElement(\"template\");\n template.innerHTML = source;\n nonce = template.content\n .querySelector(`script[${PHX_RUNTIME_HOOK}=\"${CSS.escape(name)}\"]`)\n .getAttribute(\"nonce\");\n }\n const script = document.createElement(\"script\");\n script.textContent = el.textContent;\n DOM.mergeAttrs(script, el, { isIgnored: false });\n if (nonce) {\n script.nonce = nonce;\n }\n el.replaceWith(script);\n el = script;\n }\n}\n", "import {\n COMPONENTS,\n TEMPLATES,\n EVENTS,\n PHX_COMPONENT,\n PHX_VIEW_REF,\n PHX_SKIP,\n PHX_MAGIC_ID,\n REPLY,\n STATIC,\n TITLE,\n STREAM,\n ROOT,\n KEYED,\n KEYED_COUNT,\n} from \"./constants\";\n\nimport { isObject, logError, isCid } from \"./utils\";\n\nconst VOID_TAGS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\nconst quoteChars = new Set([\"'\", '\"']);\n\nexport const modifyRoot = (html, attrs, clearInnerHTML) => {\n let i = 0;\n let insideComment = false;\n let beforeTag, afterTag, tag, tagNameEndsAt, id, newHTML;\n\n const lookahead = html.match(/^(\\s*(?:<!--.*?-->\\s*)*)<([^\\s\\/>]+)/);\n if (lookahead === null) {\n throw new Error(`malformed html ${html}`);\n }\n\n i = lookahead[0].length;\n beforeTag = lookahead[1];\n tag = lookahead[2];\n tagNameEndsAt = i;\n\n // Scan the opening tag for id, if there is any\n for (i; i < html.length; i++) {\n if (html.charAt(i) === \">\") {\n break;\n }\n if (html.charAt(i) === \"=\") {\n const isId = html.slice(i - 3, i) === \" id\";\n i++;\n const char = html.charAt(i);\n if (quoteChars.has(char)) {\n const attrStartsAt = i;\n i++;\n for (i; i < html.length; i++) {\n if (html.charAt(i) === char) {\n break;\n }\n }\n if (isId) {\n id = html.slice(attrStartsAt + 1, i);\n break;\n }\n }\n }\n }\n\n let closeAt = html.length - 1;\n insideComment = false;\n while (closeAt >= beforeTag.length + tag.length) {\n const char = html.charAt(closeAt);\n if (insideComment) {\n if (char === \"-\" && html.slice(closeAt - 3, closeAt) === \"<!-\") {\n insideComment = false;\n closeAt -= 4;\n } else {\n closeAt -= 1;\n }\n } else if (char === \">\" && html.slice(closeAt - 2, closeAt) === \"--\") {\n insideComment = true;\n closeAt -= 3;\n } else if (char === \">\") {\n break;\n } else {\n closeAt -= 1;\n }\n }\n afterTag = html.slice(closeAt + 1, html.length);\n\n const attrsStr = Object.keys(attrs)\n .map((attr) => (attrs[attr] === true ? attr : `${attr}=\"${attrs[attr]}\"`))\n .join(\" \");\n\n if (clearInnerHTML) {\n // Keep the id if any\n const idAttrStr = id ? ` id=\"${id}\"` : \"\";\n if (VOID_TAGS.has(tag)) {\n newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}/>`;\n } else {\n newHTML = `<${tag}${idAttrStr}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}></${tag}>`;\n }\n } else {\n const rest = html.slice(tagNameEndsAt, closeAt + 1);\n newHTML = `<${tag}${attrsStr === \"\" ? \"\" : \" \"}${attrsStr}${rest}`;\n }\n\n return [newHTML, beforeTag, afterTag];\n};\n\nexport default class Rendered {\n static extract(diff) {\n const { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff;\n delete diff[REPLY];\n delete diff[EVENTS];\n delete diff[TITLE];\n return { diff, title, reply: reply || null, events: events || [] };\n }\n\n constructor(viewId, rendered) {\n this.viewId = viewId;\n this.rendered = {};\n this.magicId = 0;\n this.mergeDiff(rendered);\n }\n\n parentViewId() {\n return this.viewId;\n }\n\n toString(onlyCids) {\n const { buffer: str, streams: streams } = this.recursiveToString(\n this.rendered,\n this.rendered[COMPONENTS],\n onlyCids,\n true,\n {},\n );\n return { buffer: str, streams: streams };\n }\n\n recursiveToString(\n rendered,\n components = rendered[COMPONENTS],\n onlyCids,\n changeTracking,\n rootAttrs,\n ) {\n onlyCids = onlyCids ? new Set(onlyCids) : null;\n const output = {\n buffer: \"\",\n components: components,\n onlyCids: onlyCids,\n streams: new Set(),\n };\n this.toOutputBuffer(rendered, null, output, changeTracking, rootAttrs);\n return { buffer: output.buffer, streams: output.streams };\n }\n\n componentCIDs(diff) {\n return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i));\n }\n\n isComponentOnlyDiff(diff) {\n if (!diff[COMPONENTS]) {\n return false;\n }\n return Object.keys(diff).length === 1;\n }\n\n getComponent(diff, cid) {\n return diff[COMPONENTS][cid];\n }\n\n resetRender(cid) {\n // we are racing a component destroy, it could not exist, so\n // make sure that we don't try to set reset on undefined\n if (this.rendered[COMPONENTS][cid]) {\n this.rendered[COMPONENTS][cid].reset = true;\n }\n }\n\n mergeDiff(diff) {\n const newc = diff[COMPONENTS];\n const cache = {};\n delete diff[COMPONENTS];\n this.rendered = this.mutableMerge(this.rendered, diff);\n this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {};\n\n if (newc) {\n const oldc = this.rendered[COMPONENTS];\n\n for (const cid in newc) {\n newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);\n }\n\n for (const cid in newc) {\n oldc[cid] = newc[cid];\n }\n diff[COMPONENTS] = newc;\n }\n }\n\n cachedFindComponent(cid, cdiff, oldc, newc, cache) {\n if (cache[cid]) {\n return cache[cid];\n } else {\n let ndiff,\n stat,\n scid = cdiff[STATIC];\n\n if (isCid(scid)) {\n let tdiff;\n\n if (scid > 0) {\n tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache);\n } else {\n tdiff = oldc[-scid];\n }\n\n stat = tdiff[STATIC];\n ndiff = this.cloneMerge(tdiff, cdiff, true);\n ndiff[STATIC] = stat;\n } else {\n ndiff =\n cdiff[STATIC] !== undefined || oldc[cid] === undefined\n ? cdiff\n : this.cloneMerge(oldc[cid], cdiff, false);\n }\n\n cache[cid] = ndiff;\n return ndiff;\n }\n }\n\n mutableMerge(target, source) {\n if (source[STATIC] !== undefined) {\n return source;\n } else {\n this.doMutableMerge(target, source);\n return target;\n }\n }\n\n doMutableMerge(target, source) {\n if (source[KEYED]) {\n this.mergeKeyed(target, source);\n } else {\n for (const key in source) {\n const val = source[key];\n const targetVal = target[key];\n const isObjVal = isObject(val);\n if (isObjVal && val[STATIC] === undefined && isObject(targetVal)) {\n this.doMutableMerge(targetVal, val);\n } else {\n target[key] = val;\n }\n }\n }\n if (target[ROOT]) {\n target.newRender = true;\n }\n }\n\n clone(diff) {\n if (\"structuredClone\" in window) {\n return structuredClone(diff);\n } else {\n // fallback for jest\n return JSON.parse(JSON.stringify(diff));\n }\n }\n\n // keyed comprehensions\n mergeKeyed(target, source) {\n // we need to clone the target since elements can move and otherwise\n // it could happen that we modify an element that we'll need to refer to\n // later\n const clonedTarget = this.clone(target);\n Object.entries(source[KEYED]).forEach(([i, entry]) => {\n if (i === KEYED_COUNT) {\n return;\n }\n if (Array.isArray(entry)) {\n // [old_idx, diff]\n // moved with diff\n const [old_idx, diff] = entry;\n target[KEYED][i] = clonedTarget[KEYED][old_idx];\n this.doMutableMerge(target[KEYED][i], diff);\n } else if (typeof entry === \"number\") {\n // moved without diff\n const old_idx = entry;\n target[KEYED][i] = clonedTarget[KEYED][old_idx];\n } else if (typeof entry === \"object\") {\n // diff, same position\n if (!target[KEYED][i]) {\n target[KEYED][i] = {};\n }\n this.doMutableMerge(target[KEYED][i], entry);\n }\n });\n // drop extra entries\n if (source[KEYED][KEYED_COUNT] < target[KEYED][KEYED_COUNT]) {\n for (\n let i = source[KEYED][KEYED_COUNT];\n i < target[KEYED][KEYED_COUNT];\n i++\n ) {\n delete target[KEYED][i];\n }\n }\n target[KEYED][KEYED_COUNT] = source[KEYED][KEYED_COUNT];\n if (source[STREAM]) {\n target[STREAM] = source[STREAM];\n }\n if (source[TEMPLATES]) {\n target[TEMPLATES] = source[TEMPLATES];\n }\n }\n\n // Merges cid trees together, copying statics from source tree.\n //\n // The `pruneMagicId` is passed to control pruning the magicId of the\n // target. We must always prune the magicId when we are sharing statics\n // from another component. If not pruning, we replicate the logic from\n // mutableMerge, where we set newRender to true if there is a root\n // (effectively forcing the new version to be rendered instead of skipped)\n //\n cloneMerge(target, source, pruneMagicId) {\n const merged = { ...target, ...source };\n for (const key in merged) {\n const val = source[key];\n const targetVal = target[key];\n if (isObject(val) && val[STATIC] === undefined && isObject(targetVal)) {\n merged[key] = this.cloneMerge(targetVal, val, pruneMagicId);\n } else if (val === undefined && isObject(targetVal)) {\n merged[key] = this.cloneMerge(targetVal, {}, pruneMagicId);\n }\n }\n if (pruneMagicId) {\n delete merged.magicId;\n delete merged.newRender;\n } else if (target[ROOT]) {\n merged.newRender = true;\n }\n return merged;\n }\n\n componentToString(cid) {\n const { buffer: str, streams } = this.recursiveCIDToString(\n this.rendered[COMPONENTS],\n cid,\n null,\n );\n const [strippedHTML, _before, _after] = modifyRoot(str, {});\n return { buffer: strippedHTML, streams: streams };\n }\n\n pruneCIDs(cids) {\n cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]);\n }\n\n // private\n\n get() {\n return this.rendered;\n }\n\n isNewFingerprint(diff = {}) {\n return !!diff[STATIC];\n }\n\n templateStatic(part, templates) {\n if (typeof part === \"number\") {\n return templates[part];\n } else {\n return part;\n }\n }\n\n nextMagicID() {\n this.magicId++;\n return `m${this.magicId}-${this.parentViewId()}`;\n }\n\n // Converts rendered tree to output buffer.\n //\n // changeTracking controls if we can apply the PHX_SKIP optimization.\n toOutputBuffer(rendered, templates, output, changeTracking, rootAttrs = {}) {\n if (rendered[KEYED]) {\n return this.comprehensionToBuffer(\n rendered,\n templates,\n output,\n changeTracking,\n );\n }\n\n // Templates are a way of sharing statics between multiple rendered structs.\n // Since LiveView 1.1, those can also appear at the root - for example if one renders\n // two comprehensions that can share statics.\n // Whenever we find templates, we need to use them recursively. Also, templates can\n // be sent for each diff, not only for the initial one. We don't want to merge them\n // though, so we always resolve them and remove them from the rendered object.\n if (rendered[TEMPLATES]) {\n templates = rendered[TEMPLATES];\n delete rendered[TEMPLATES];\n }\n\n let { [STATIC]: statics } = rendered;\n statics = this.templateStatic(statics, templates);\n rendered[STATIC] = statics;\n const isRoot = rendered[ROOT];\n const prevBuffer = output.buffer;\n if (isRoot) {\n output.buffer = \"\";\n }\n\n // this condition is called when first rendering an optimizable function component.\n // LC have their magicId previously set\n if (changeTracking && isRoot && !rendered.magicId) {\n rendered.newRender = true;\n rendered.magicId = this.nextMagicID();\n }\n\n output.buffer += statics[0];\n for (let i = 1; i < statics.length; i++) {\n this.dynamicToBuffer(rendered[i - 1], templates, output, changeTracking);\n output.buffer += statics[i];\n }\n\n // Applies the root tag \"skip\" optimization if supported, which clears\n // the root tag attributes and innerHTML, and only maintains the magicId.\n // We can only skip when changeTracking is supported,\n // and when the root element hasn't experienced an unrendered merge (newRender true).\n if (isRoot) {\n let skip = false;\n let attrs;\n // When a LC is re-added to the page, we need to re-render the entire LC tree,\n // therefore changeTracking is false; however, we need to keep all the magicIds\n // from any function component so the next time the LC is updated, we can apply\n // the skip optimization\n if (changeTracking || rendered.magicId) {\n skip = changeTracking && !rendered.newRender;\n attrs = { [PHX_MAGIC_ID]: rendered.magicId, ...rootAttrs };\n } else {\n attrs = rootAttrs;\n }\n if (skip) {\n attrs[PHX_SKIP] = true;\n }\n const [newRoot, commentBefore, commentAfter] = modifyRoot(\n output.buffer,\n attrs,\n skip,\n );\n rendered.newRender = false;\n output.buffer = prevBuffer + commentBefore + newRoot + commentAfter;\n }\n }\n\n comprehensionToBuffer(rendered, templates, output, changeTracking) {\n const keyedTemplates = templates || rendered[TEMPLATES];\n const statics = this.templateStatic(rendered[STATIC], templates);\n rendered[STATIC] = statics;\n delete rendered[TEMPLATES];\n for (let i = 0; i < rendered[KEYED][KEYED_COUNT]; i++) {\n output.buffer += statics[0];\n for (let j = 1; j < statics.length; j++) {\n this.dynamicToBuffer(\n rendered[KEYED][i][j - 1],\n keyedTemplates,\n output,\n changeTracking,\n );\n output.buffer += statics[j];\n }\n }\n // we don't need to store the rendered tree for streams\n if (rendered[STREAM]) {\n const stream = rendered[STREAM];\n const [_ref, _inserts, deleteIds, reset] = stream || [null, {}, [], null];\n if (\n stream !== undefined &&\n (rendered[KEYED][KEYED_COUNT] > 0 || deleteIds.length > 0 || reset)\n ) {\n delete rendered[STREAM];\n rendered[KEYED] = {\n [KEYED_COUNT]: 0,\n };\n output.streams.add(stream);\n }\n }\n }\n\n dynamicToBuffer(rendered, templates, output, changeTracking) {\n if (typeof rendered === \"number\") {\n const { buffer: str, streams } = this.recursiveCIDToString(\n output.components,\n rendered,\n output.onlyCids,\n );\n output.buffer += str;\n output.streams = new Set([...output.streams, ...streams]);\n } else if (isObject(rendered)) {\n this.toOutputBuffer(rendered, templates, output, changeTracking, {});\n } else {\n output.buffer += rendered;\n }\n }\n\n recursiveCIDToString(components, cid, onlyCids) {\n const component =\n components[cid] || logError(`no component for CID ${cid}`, components);\n const attrs = { [PHX_COMPONENT]: cid, [PHX_VIEW_REF]: this.viewId };\n const skip = onlyCids && !onlyCids.has(cid);\n // Two optimization paths apply here:\n //\n // 1. The onlyCids optimization works by the server diff telling us only specific\n // cid's have changed. This allows us to skip rendering any component that hasn't changed,\n // which ultimately sets PHX_SKIP root attribute and avoids rendering the innerHTML.\n //\n // 2. The root PHX_SKIP optimization generalizes to all HEEx function components, and\n // works in the same PHX_SKIP attribute fashion as 1, but the newRender tracking is done\n // at the general diff merge level. If we merge a diff with new dynamics, we necessarily have\n // experienced a change which must be a newRender, and thus we can't skip the render.\n //\n // Both optimization flows apply here. newRender is set based on the onlyCids optimization, and\n // we track a deterministic magicId based on the cid.\n //\n // changeTracking is about the entire tree\n // newRender is about the current root in the tree\n //\n // By default changeTracking is enabled, but we special case the flow where the client is pruning\n // cids and the server adds the component back. In such cases, we explicitly disable changeTracking\n // with resetRender for this cid, then re-enable it after the recursive call to skip the optimization\n // for the entire component tree.\n component.newRender = !skip;\n component.magicId = `c${cid}-${this.parentViewId()}`;\n // enable change tracking as long as the component hasn't been reset\n const changeTracking = !component.reset;\n const { buffer: html, streams } = this.recursiveToString(\n component,\n components,\n onlyCids,\n changeTracking,\n attrs,\n );\n // disable reset after we've rendered\n delete component.reset;\n\n return { buffer: html, streams: streams };\n }\n}\n", "import DOM from \"./dom\";\nimport ARIA from \"./aria\";\n\nconst focusStack = [];\nconst default_transition_time = 200;\n\nconst JS = {\n // private\n exec(e, eventType, phxEvent, view, sourceEl, defaults) {\n const [defaultKind, defaultArgs] = defaults || [\n null,\n { callback: defaults && defaults.callback },\n ];\n const commands =\n phxEvent.charAt(0) === \"[\"\n ? JSON.parse(phxEvent)\n : [[defaultKind, defaultArgs]];\n\n commands.forEach(([kind, args]) => {\n if (kind === defaultKind) {\n // always prefer the args, but keep existing keys from the defaultArgs\n args = { ...defaultArgs, ...args };\n args.callback = args.callback || defaultArgs.callback;\n }\n this.filterToEls(view.liveSocket, sourceEl, args).forEach((el) => {\n this[`exec_${kind}`](e, eventType, phxEvent, view, sourceEl, el, args);\n });\n });\n },\n\n isVisible(el) {\n return !!(\n el.offsetWidth ||\n el.offsetHeight ||\n el.getClientRects().length > 0\n );\n },\n\n // returns true if any part of the element is inside the viewport\n isInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n const windowWidth =\n window.innerWidth || document.documentElement.clientWidth;\n\n return (\n rect.right > 0 &&\n rect.bottom > 0 &&\n rect.left < windowWidth &&\n rect.top < windowHeight\n );\n },\n\n // private\n\n // commands\n\n exec_exec(e, eventType, phxEvent, view, sourceEl, el, { attr, to }) {\n const encodedJS = el.getAttribute(attr);\n if (!encodedJS) {\n throw new Error(`expected ${attr} to contain JS command on \"${to}\"`);\n }\n view.liveSocket.execJS(el, encodedJS, eventType);\n },\n\n exec_dispatch(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { event, detail, bubbles, blocking },\n ) {\n detail = detail || {};\n detail.dispatcher = sourceEl;\n if (blocking) {\n const promise = new Promise((resolve, _reject) => {\n detail.done = resolve;\n });\n view.liveSocket.asyncTransition(promise);\n }\n DOM.dispatchEvent(el, event, { detail, bubbles });\n },\n\n exec_push(e, eventType, phxEvent, view, sourceEl, el, args) {\n const {\n event,\n data,\n target,\n page_loading,\n loading,\n value,\n dispatcher,\n callback,\n } = args;\n const pushOpts = {\n loading,\n value,\n target,\n page_loading: !!page_loading,\n originalEvent: e,\n };\n const targetSrc =\n eventType === \"change\" && dispatcher ? dispatcher : sourceEl;\n const phxTarget =\n target || targetSrc.getAttribute(view.binding(\"target\")) || targetSrc;\n const handler = (targetView, targetCtx) => {\n if (!targetView.isConnected()) {\n return;\n }\n if (eventType === \"change\") {\n let { newCid, _target } = args;\n _target =\n _target || (DOM.isFormInput(sourceEl) ? sourceEl.name : undefined);\n if (_target) {\n pushOpts._target = _target;\n }\n targetView.pushInput(\n sourceEl,\n targetCtx,\n newCid,\n event || phxEvent,\n pushOpts,\n callback,\n );\n } else if (eventType === \"submit\") {\n const { submitter } = args;\n targetView.submitForm(\n sourceEl,\n targetCtx,\n event || phxEvent,\n submitter,\n pushOpts,\n callback,\n );\n } else {\n targetView.pushEvent(\n eventType,\n sourceEl,\n targetCtx,\n event || phxEvent,\n data,\n pushOpts,\n callback,\n );\n }\n };\n // in case of formRecovery, targetView and targetCtx are passed as argument\n // as they are looked up in a template element, not the real DOM\n if (args.targetView && args.targetCtx) {\n handler(args.targetView, args.targetCtx);\n } else {\n view.withinTargets(phxTarget, handler);\n }\n },\n\n exec_navigate(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) {\n view.liveSocket.historyRedirect(\n e,\n href,\n replace ? \"replace\" : \"push\",\n null,\n sourceEl,\n );\n },\n\n exec_patch(e, eventType, phxEvent, view, sourceEl, el, { href, replace }) {\n view.liveSocket.pushHistoryPatch(\n e,\n href,\n replace ? \"replace\" : \"push\",\n sourceEl,\n );\n },\n\n exec_focus(e, eventType, phxEvent, view, sourceEl, el) {\n ARIA.attemptFocus(el);\n // in case the JS.focus command is in a JS.show/hide/toggle chain, for show we need\n // to wait for JS.show to have updated the element's display property (see exec_toggle)\n // but that run in nested animation frames, therefore we need to use them here as well\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => ARIA.attemptFocus(el));\n });\n },\n\n exec_focus_first(e, eventType, phxEvent, view, sourceEl, el) {\n ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el);\n // if you wonder about the nested animation frames, see exec_focus\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(\n () => ARIA.focusFirstInteractive(el) || ARIA.focusFirst(el),\n );\n });\n },\n\n exec_push_focus(e, eventType, phxEvent, view, sourceEl, el) {\n focusStack.push(el || sourceEl);\n },\n\n exec_pop_focus(_e, _eventType, _phxEvent, _view, _sourceEl, _el) {\n const el = focusStack.pop();\n if (el) {\n el.focus();\n // if you wonder about the nested animation frames, see exec_focus\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => el.focus());\n });\n }\n },\n\n exec_add_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.addOrRemoveClasses(el, names, [], transition, time, view, blocking);\n },\n\n exec_remove_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.addOrRemoveClasses(el, [], names, transition, time, view, blocking);\n },\n\n exec_toggle_class(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { names, transition, time, blocking },\n ) {\n this.toggleClasses(el, names, transition, time, view, blocking);\n },\n\n exec_toggle_attr(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { attr: [attr, val1, val2] },\n ) {\n this.toggleAttr(el, attr, val1, val2);\n },\n\n exec_ignore_attrs(e, eventType, phxEvent, view, sourceEl, el, { attrs }) {\n this.ignoreAttrs(el, attrs);\n },\n\n exec_transition(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { time, transition, blocking },\n ) {\n this.addOrRemoveClasses(el, [], [], transition, time, view, blocking);\n },\n\n exec_toggle(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, ins, outs, time, blocking },\n ) {\n this.toggle(eventType, view, el, display, ins, outs, time, blocking);\n },\n\n exec_show(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, transition, time, blocking },\n ) {\n this.show(eventType, view, el, display, transition, time, blocking);\n },\n\n exec_hide(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { display, transition, time, blocking },\n ) {\n this.hide(eventType, view, el, display, transition, time, blocking);\n },\n\n exec_set_attr(\n e,\n eventType,\n phxEvent,\n view,\n sourceEl,\n el,\n { attr: [attr, val] },\n ) {\n this.setOrRemoveAttrs(el, [[attr, val]], []);\n },\n\n exec_remove_attr(e, eventType, phxEvent, view, sourceEl, el, { attr }) {\n this.setOrRemoveAttrs(el, [], [attr]);\n },\n\n ignoreAttrs(el, attrs) {\n DOM.putPrivate(el, \"JS:ignore_attrs\", {\n apply: (fromEl, toEl) => {\n Array.from(fromEl.attributes).forEach((attr) => {\n if (\n attrs.some(\n (toIgnore) =>\n attr.name == toIgnore ||\n (toIgnore.includes(\"*\") && attr.name.match(toIgnore) != null),\n )\n ) {\n toEl.setAttribute(attr.name, attr.value);\n }\n });\n },\n });\n },\n\n onBeforeElUpdated(fromEl, toEl) {\n const ignoreAttrs = DOM.private(fromEl, \"JS:ignore_attrs\");\n if (ignoreAttrs) {\n ignoreAttrs.apply(fromEl, toEl);\n }\n },\n\n // utils for commands\n\n show(eventType, view, el, display, transition, time, blocking) {\n if (!this.isVisible(el)) {\n this.toggle(\n eventType,\n view,\n el,\n display,\n transition,\n null,\n time,\n blocking,\n );\n }\n },\n\n hide(eventType, view, el, display, transition, time, blocking) {\n if (this.isVisible(el)) {\n this.toggle(\n eventType,\n view,\n el,\n display,\n null,\n transition,\n time,\n blocking,\n );\n }\n },\n\n toggle(eventType, view, el, display, ins, outs, time, blocking) {\n time = time || default_transition_time;\n const [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];\n const [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];\n if (inClasses.length > 0 || outClasses.length > 0) {\n if (this.isVisible(el)) {\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n outStartClasses,\n inClasses.concat(inStartClasses).concat(inEndClasses),\n );\n window.requestAnimationFrame(() => {\n this.addOrRemoveClasses(el, outClasses, []);\n window.requestAnimationFrame(() =>\n this.addOrRemoveClasses(el, outEndClasses, outStartClasses),\n );\n });\n };\n const onEnd = () => {\n this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = \"none\"),\n );\n el.dispatchEvent(new Event(\"phx:hide-end\"));\n };\n el.dispatchEvent(new Event(\"phx:hide-start\"));\n if (blocking === false) {\n onStart();\n setTimeout(onEnd, time);\n } else {\n view.transition(time, onStart, onEnd);\n }\n } else {\n if (eventType === \"remove\") {\n return;\n }\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n inStartClasses,\n outClasses.concat(outStartClasses).concat(outEndClasses),\n );\n const stickyDisplay = display || this.defaultDisplay(el);\n window.requestAnimationFrame(() => {\n // first add the starting + active class, THEN make the element visible\n // otherwise if we toggled the visibility earlier css animations\n // would flicker, as the element becomes visible before the active animation\n // class is set (see https://github.com/phoenixframework/phoenix_live_view/issues/3456)\n this.addOrRemoveClasses(el, inClasses, []);\n // addOrRemoveClasses uses a requestAnimationFrame itself, therefore we need to move the putSticky\n // into the next requestAnimationFrame...\n window.requestAnimationFrame(() => {\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = stickyDisplay),\n );\n this.addOrRemoveClasses(el, inEndClasses, inStartClasses);\n });\n });\n };\n const onEnd = () => {\n this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));\n el.dispatchEvent(new Event(\"phx:show-end\"));\n };\n el.dispatchEvent(new Event(\"phx:show-start\"));\n if (blocking === false) {\n onStart();\n setTimeout(onEnd, time);\n } else {\n view.transition(time, onStart, onEnd);\n }\n }\n } else {\n if (this.isVisible(el)) {\n window.requestAnimationFrame(() => {\n el.dispatchEvent(new Event(\"phx:hide-start\"));\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = \"none\"),\n );\n el.dispatchEvent(new Event(\"phx:hide-end\"));\n });\n } else {\n window.requestAnimationFrame(() => {\n el.dispatchEvent(new Event(\"phx:show-start\"));\n const stickyDisplay = display || this.defaultDisplay(el);\n DOM.putSticky(\n el,\n \"toggle\",\n (currentEl) => (currentEl.style.display = stickyDisplay),\n );\n el.dispatchEvent(new Event(\"phx:show-end\"));\n });\n }\n }\n },\n\n toggleClasses(el, classes, transition, time, view, blocking) {\n window.requestAnimationFrame(() => {\n const [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []]);\n const newAdds = classes.filter(\n (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name),\n );\n const newRemoves = classes.filter(\n (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name),\n );\n this.addOrRemoveClasses(\n el,\n newAdds,\n newRemoves,\n transition,\n time,\n view,\n blocking,\n );\n });\n },\n\n toggleAttr(el, attr, val1, val2) {\n if (el.hasAttribute(attr)) {\n if (val2 !== undefined) {\n // toggle between val1 and val2\n if (el.getAttribute(attr) === val1) {\n this.setOrRemoveAttrs(el, [[attr, val2]], []);\n } else {\n this.setOrRemoveAttrs(el, [[attr, val1]], []);\n }\n } else {\n // remove attr\n this.setOrRemoveAttrs(el, [], [attr]);\n }\n } else {\n this.setOrRemoveAttrs(el, [[attr, val1]], []);\n }\n },\n\n addOrRemoveClasses(el, adds, removes, transition, time, view, blocking) {\n time = time || default_transition_time;\n const [transitionRun, transitionStart, transitionEnd] = transition || [\n [],\n [],\n [],\n ];\n if (transitionRun.length > 0) {\n const onStart = () => {\n this.addOrRemoveClasses(\n el,\n transitionStart,\n [].concat(transitionRun).concat(transitionEnd),\n );\n window.requestAnimationFrame(() => {\n this.addOrRemoveClasses(el, transitionRun, []);\n window.requestAnimationFrame(() =>\n this.addOrRemoveClasses(el, transitionEnd, transitionStart),\n );\n });\n };\n const onDone = () =>\n this.addOrRemoveClasses(\n el,\n adds.concat(transitionEnd),\n removes.concat(transitionRun).concat(transitionStart),\n );\n if (blocking === false) {\n onStart();\n setTimeout(onDone, time);\n } else {\n view.transition(time, onStart, onDone);\n }\n return;\n }\n\n window.requestAnimationFrame(() => {\n const [prevAdds, prevRemoves] = DOM.getSticky(el, \"classes\", [[], []]);\n const keepAdds = adds.filter(\n (name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name),\n );\n const keepRemoves = removes.filter(\n (name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name),\n );\n const newAdds = prevAdds\n .filter((name) => removes.indexOf(name) < 0)\n .concat(keepAdds);\n const newRemoves = prevRemoves\n .filter((name) => adds.indexOf(name) < 0)\n .concat(keepRemoves);\n\n DOM.putSticky(el, \"classes\", (currentEl) => {\n currentEl.classList.remove(...newRemoves);\n currentEl.classList.add(...newAdds);\n return [newAdds, newRemoves];\n });\n });\n },\n\n setOrRemoveAttrs(el, sets, removes) {\n const [prevSets, prevRemoves] = DOM.getSticky(el, \"attrs\", [[], []]);\n\n const alteredAttrs = sets.map(([attr, _val]) => attr).concat(removes);\n const newSets = prevSets\n .filter(([attr, _val]) => !alteredAttrs.includes(attr))\n .concat(sets);\n const newRemoves = prevRemoves\n .filter((attr) => !alteredAttrs.includes(attr))\n .concat(removes);\n\n DOM.putSticky(el, \"attrs\", (currentEl) => {\n newRemoves.forEach((attr) => currentEl.removeAttribute(attr));\n newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val));\n return [newSets, newRemoves];\n });\n },\n\n hasAllClasses(el, classes) {\n return classes.every((name) => el.classList.contains(name));\n },\n\n isToggledOut(el, outClasses) {\n return !this.isVisible(el) || this.hasAllClasses(el, outClasses);\n },\n\n filterToEls(liveSocket, sourceEl, { to }) {\n const defaultQuery = () => {\n if (typeof to === \"string\") {\n return document.querySelectorAll(to);\n } else if (to.closest) {\n const toEl = sourceEl.closest(to.closest);\n return toEl ? [toEl] : [];\n } else if (to.inner) {\n return sourceEl.querySelectorAll(to.inner);\n }\n };\n return to\n ? liveSocket.jsQuerySelectorAll(sourceEl, to, defaultQuery)\n : [sourceEl];\n },\n\n defaultDisplay(el) {\n return (\n { tr: \"table-row\", td: \"table-cell\" }[el.tagName.toLowerCase()] || \"block\"\n );\n },\n\n transitionClasses(val) {\n if (!val) {\n return null;\n }\n\n let [trans, tStart, tEnd] = Array.isArray(val)\n ? val\n : [val.split(\" \"), [], []];\n trans = Array.isArray(trans) ? trans : trans.split(\" \");\n tStart = Array.isArray(tStart) ? tStart : tStart.split(\" \");\n tEnd = Array.isArray(tEnd) ? tEnd : tEnd.split(\" \");\n return [trans, tStart, tEnd];\n },\n};\n\nexport default JS;\n", "import JS from \"./js\";\nimport LiveSocket from \"./live_socket\";\n\ntype Transition = string | string[];\n\n// Base options for commands involving transitions and timing\ntype BaseOpts = {\n /**\n * The CSS transition classes to set.\n * Accepts a string of classes or a 3-tuple like:\n * `[\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]`\n */\n transition?: Transition;\n /** The transition duration in milliseconds. Defaults 200. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\ntype ShowOpts = BaseOpts & {\n /** The CSS display value to set. Defaults \"block\". */\n display?: string;\n};\n\ntype ToggleOpts = {\n /** The CSS display value to set. Defaults \"block\". */\n display?: string;\n /**\n * The CSS transition classes for showing.\n * Accepts either the string of classes to apply when toggling in, or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n * `[\"ease-out duration-300\", \"opacity-0\", \"opacity-100\"]`\n */\n in?: Transition;\n /**\n * The CSS transition classes for hiding.\n * Accepts either string of classes to apply when toggling out, or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n * `[\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]`\n */\n out?: Transition;\n /** The transition duration in milliseconds. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\n// Options specific to the 'transition' command\ntype TransitionCommandOpts = {\n /** The transition duration in milliseconds. */\n time?: number;\n /** Whether to block UI during transition. Defaults `true`. */\n blocking?: boolean;\n};\n\ntype PushOpts = {\n /** Data to be merged into the event payload. */\n value?: any;\n /** For targeting a LiveComponent by its ID, a component ID (number), or a CSS selector string. */\n target?: HTMLElement | number | string;\n /** Indicates if a page loading state should be shown. */\n page_loading?: boolean;\n [key: string]: any; // Allow other properties like 'cid', 'redirect', etc.\n};\n\ntype NavigationOpts = {\n /** Whether to replace the current history entry instead of pushing a new one. */\n replace?: boolean;\n};\n\n/**\n * Represents all possible JS commands that can be generated by the factory.\n * This is used as a base for LiveSocketJSCommands and HookJSCommands.\n */\ninterface AllJSCommands {\n /**\n * Executes encoded JavaScript in the context of the element.\n * This version is for general use via liveSocket.js().\n *\n * @param el - The element in whose context to execute the JavaScript.\n * @param encodedJS - The encoded JavaScript string to execute.\n */\n exec(el: HTMLElement, encodedJS: string): void;\n\n /**\n * Shows an element.\n *\n * @param el - The element to show.\n * @param {ShowOpts} [opts={}] - Optional settings.\n * Accepts: `display`, `transition`, `time`, and `blocking`.\n */\n show(el: HTMLElement, opts?: ShowOpts): void;\n\n /**\n * Hides an element.\n *\n * @param el - The element to hide.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n hide(el: HTMLElement, opts?: BaseOpts): void;\n\n /**\n * Toggles the visibility of an element.\n *\n * @param el - The element to toggle.\n * @param [opts={}] - Optional settings.\n * Accepts: `display`, `in`, `out`, `time`, and `blocking`.\n */\n toggle(el: HTMLElement, opts?: ToggleOpts): void;\n\n /**\n * Adds CSS classes to an element.\n *\n * @param el - The element to add classes to.\n * @param names - The class name(s) to add.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n addClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Removes CSS classes from an element.\n *\n * @param el - The element to remove classes from.\n * @param names - The class name(s) to remove.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n removeClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Toggles CSS classes on an element.\n *\n * @param el - The element to toggle classes on.\n * @param names - The class name(s) to toggle.\n * @param [opts={}] - Optional settings.\n * Accepts: `transition`, `time`, and `blocking`.\n */\n toggleClass(el: HTMLElement, names: string | string[], opts?: BaseOpts): void;\n\n /**\n * Applies a CSS transition to an element.\n *\n * @param el - The element to apply the transition to.\n * @param transition - The transition class(es) to apply.\n * Accepts a string of classes to apply when transitioning or\n * a 3-tuple containing the transition class, the class to apply\n * to start the transition, and the ending transition class, such as:\n *\n * [\"ease-out duration-300\", \"opacity-100\", \"opacity-0\"]\n *\n * @param [opts={}] - Optional settings for timing and blocking behavior.\n * Accepts: `time` and `blocking`.\n */\n transition(\n el: HTMLElement,\n transition: string | string[],\n opts?: TransitionCommandOpts,\n ): void;\n\n /**\n * Sets an attribute on an element.\n *\n * @param el - The element to set the attribute on.\n * @param attr - The attribute name to set.\n * @param val - The value to set for the attribute.\n */\n setAttribute(el: HTMLElement, attr: string, val: string): void;\n\n /**\n * Removes an attribute from an element.\n *\n * @param el - The element to remove the attribute from.\n * @param attr - The attribute name to remove.\n */\n removeAttribute(el: HTMLElement, attr: string): void;\n\n /**\n * Toggles an attribute on an element between two values.\n *\n * @param el - The element to toggle the attribute on.\n * @param attr - The attribute name to toggle.\n * @param val1 - The first value to toggle between.\n * @param val2 - The second value to toggle between.\n */\n toggleAttribute(\n el: HTMLElement,\n attr: string,\n val1: string,\n val2: string,\n ): void;\n\n /**\n * Pushes an event to the server.\n *\n * @param el - An element that belongs to the target LiveView / LiveComponent or a component ID.\n * To target a LiveComponent by its ID, pass a separate `target` in the options.\n * @param type - The event name to push.\n * @param [opts={}] - Optional settings.\n * Accepts: `value`, `target`, `page_loading`.\n */\n push(el: HTMLElement, type: string, opts?: PushOpts): void;\n\n /**\n * Sends a navigation event to the server and updates the browser's pushState history.\n *\n * @param href - The URL to navigate to.\n * @param [opts={}] - Optional settings.\n * Accepts: `replace`.\n */\n navigate(href: string, opts?: NavigationOpts): void;\n\n /**\n * Sends a patch event to the server and updates the browser's pushState history.\n *\n * @param href - The URL to patch to.\n * @param [opts={}] - Optional settings.\n * Accepts: `replace`.\n */\n patch(href: string, opts?: NavigationOpts): void;\n\n /**\n * Mark attributes as ignored, skipping them when patching the DOM.\n *\n * @param el - The element to ignore attributes on.\n * @param attrs - The attribute name or names to ignore.\n */\n ignoreAttributes(el: HTMLElement, attrs: string | string[]): void;\n}\n\nexport default (\n liveSocket: LiveSocket,\n eventType: string | null,\n): AllJSCommands => {\n return {\n exec(el, encodedJS) {\n liveSocket.execJS(el, encodedJS, eventType);\n },\n show(el, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.show(\n eventType,\n owner,\n el,\n opts.display,\n JS.transitionClasses(opts.transition),\n opts.time,\n opts.blocking,\n );\n },\n hide(el, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.hide(\n eventType,\n owner,\n el,\n null,\n JS.transitionClasses(opts.transition),\n opts.time,\n opts.blocking,\n );\n },\n toggle(el, opts = {}) {\n const owner = liveSocket.owner(el);\n const inTransition = JS.transitionClasses(opts.in);\n const outTransition = JS.transitionClasses(opts.out);\n JS.toggle(\n eventType,\n owner,\n el,\n opts.display,\n inTransition,\n outTransition,\n opts.time,\n opts.blocking,\n );\n },\n addClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n classNames,\n [],\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n removeClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n [],\n classNames,\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n toggleClass(el, names, opts = {}) {\n const classNames = Array.isArray(names) ? names : names.split(\" \");\n const owner = liveSocket.owner(el);\n JS.toggleClasses(\n el,\n classNames,\n JS.transitionClasses(opts.transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n transition(el, transition, opts = {}) {\n const owner = liveSocket.owner(el);\n JS.addOrRemoveClasses(\n el,\n [],\n [],\n JS.transitionClasses(transition),\n opts.time,\n owner,\n opts.blocking,\n );\n },\n setAttribute(el, attr, val) {\n JS.setOrRemoveAttrs(el, [[attr, val]], []);\n },\n removeAttribute(el, attr) {\n JS.setOrRemoveAttrs(el, [], [attr]);\n },\n toggleAttribute(el, attr, val1, val2) {\n JS.toggleAttr(el, attr, val1, val2);\n },\n push(el, type, opts = {}) {\n liveSocket.withinOwners(el, (view) => {\n const data = opts.value || {};\n delete opts.value;\n let e = new CustomEvent(\"phx:exec\", { detail: { sourceElement: el } });\n JS.exec(e, eventType, type, view, el, [\"push\", { data, ...opts }]);\n });\n },\n navigate(href, opts = {}) {\n const customEvent = new CustomEvent(\"phx:exec\");\n liveSocket.historyRedirect(\n customEvent,\n href,\n opts.replace ? \"replace\" : \"push\",\n null,\n null,\n );\n },\n patch(href, opts = {}) {\n const customEvent = new CustomEvent(\"phx:exec\");\n liveSocket.pushHistoryPatch(\n customEvent,\n href,\n opts.replace ? \"replace\" : \"push\",\n null,\n );\n },\n ignoreAttributes(el, attrs) {\n JS.ignoreAttrs(el, Array.isArray(attrs) ? attrs : [attrs]);\n },\n };\n};\n\n/**\n * JSCommands for use with `liveSocket.js()`.\n * Includes the general `exec` command that requires an element.\n */\nexport type LiveSocketJSCommands = AllJSCommands;\n\n/**\n * JSCommands for use within a Hook.\n * The `exec` command is tailored for hooks, not requiring an explicit element.\n */\nexport interface HookJSCommands extends Omit<AllJSCommands, \"exec\"> {\n /**\n * Executes encoded JavaScript in the context of the hook's element.\n *\n * @param {string} encodedJS - The encoded JavaScript string to execute.\n */\n exec(encodedJS: string): void;\n}\n", "import jsCommands, { HookJSCommands } from \"./js_commands\";\nimport DOM from \"./dom\";\nimport LiveSocket from \"./live_socket\";\nimport View from \"./view\";\n\nconst HOOK_ID = \"hookId\";\nlet viewHookID = 1;\n\nexport type OnReply = (reply: any, ref: number) => any;\nexport type CallbackRef = { event: string; callback: (payload: any) => any };\n\nexport type PhxTarget = string | number | HTMLElement;\n\nexport interface HookInterface {\n /**\n * The DOM element that the hook is attached to.\n */\n el: HTMLElement;\n\n /**\n * The LiveSocket instance that the hook is attached to.\n */\n liveSocket: LiveSocket;\n\n /**\n * The mounted callback.\n *\n * Called when the element has been added to the DOM and its server LiveView has finished mounting.\n */\n mounted?: () => void;\n\n /**\n * The beforeUpdate callback.\n *\n * Called when the element is about to be updated in the DOM.\n * Note: any call here must be synchronous as the operation cannot be deferred or cancelled.\n */\n beforeUpdate?: () => void;\n\n /**\n * The updated callback.\n *\n * Called when the element has been updated in the DOM by the server\n */\n updated?: () => void;\n\n /**\n * The destroyed callback.\n *\n * Called when the element has been removed from the page, either by a parent update, or by the parent being removed entirely\n */\n destroyed?: () => void;\n\n /**\n * The disconnected callback.\n *\n * Called when the element's parent LiveView has disconnected from the server.\n */\n disconnected?: () => void;\n\n /**\n * The reconnected callback.\n *\n * Called when the element's parent LiveView has reconnected to the server.\n */\n reconnected?: () => void;\n\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n */\n js(): HookJSCommands;\n\n /**\n * Pushes an event to the server.\n *\n * @param event - The event name.\n * @param [payload] - The payload to send to the server. Defaults to an empty object.\n * @param [onReply] - A callback to handle the server's reply.\n *\n * When onReply is not provided, the method returns a Promise that\n * When onReply is provided, the method returns void.\n */\n pushEvent(event: string, payload: any, onReply: OnReply): void;\n pushEvent(event: string, payload?: any): Promise<any>;\n\n /**\n * Pushed a targeted event to the server.\n *\n * It sends the event to the LiveComponent or LiveView the `selectorOrTarget` is defined in,\n * where its value can be either a query selector, an actual DOM element, or a CID (component id)\n * returned by the `@myself` assign.\n *\n * If the query selector returns more than one element it will send the event to all of them,\n * even if all the elements are in the same LiveComponent or LiveView. Because of this,\n * if no callback is passed, a promise is returned that matches the return value of\n * [`Promise.allSettled()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled#return_value).\n * Individual fulfilled values are of the format `{ reply, ref }`, where `reply` is the server's reply.\n *\n * @param selectorOrTarget - The selector, element, or CID to target.\n * @param event - The event name.\n * @param [payload] - The payload to send to the server. Defaults to an empty object.\n * @param [onReply] - A callback to handle the server's reply.\n *\n * When onReply is not provided, the method returns a Promise.\n * When onReply is provided, the method returns void.\n */\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload: object,\n onReply: OnReply,\n ): void;\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload?: object,\n ): Promise<PromiseSettledResult<{ reply: any; ref: number }>[]>;\n\n /**\n * Allows to register a callback to be called when an event is received from the server.\n *\n * This is used to handle `pushEvent` calls from the server. The callback is called with the payload from the server.\n *\n * @param event - The event name.\n * @param callback - The callback to call when the event is received.\n *\n * @returns A reference to the callback, which can be used in `removeHandleEvent` to remove the callback.\n */\n handleEvent(event: string, callback: (payload: any) => any): CallbackRef;\n\n /**\n * Removes a callback registered with `handleEvent`.\n *\n * @param callbackRef - The reference to the callback to remove.\n */\n removeHandleEvent(ref: CallbackRef): void;\n\n /**\n * Allows to trigger a live file upload.\n *\n * @param name - The upload name corresponding to the `Phoenix.LiveView.allow_upload/3` call.\n * @param files - The files to upload.\n */\n upload(name: any, files: any): any;\n\n /**\n * Allows to trigger a live file upload to a specific target.\n *\n * @param selectorOrTarget - The target to upload the files to.\n * @param name - The upload name corresponding to the `Phoenix.LiveView.allow_upload/3` call.\n * @param files - The files to upload.\n */\n uploadTo(selectorOrTarget: PhxTarget, name: any, files: any): any;\n\n // allow unknown methods, as people can define them in their hooks\n [key: PropertyKey]: any;\n}\n\n// based on https://github.com/DefinitelyTyped/DefinitelyTyped/blob/fac1aa75acdddbf4f1a95e98ee2297b54ce4b4c9/types/phoenix_live_view/hooks.d.ts#L26\n// licensed under MIT\nexport interface Hook<T = object> {\n /**\n * The mounted callback.\n *\n * Called when the element has been added to the DOM and its server LiveView has finished mounting.\n */\n mounted?: (this: T & HookInterface) => void;\n\n /**\n * The beforeUpdate callback.\n *\n * Called when the element is about to be updated in the DOM.\n * Note: any call here must be synchronous as the operation cannot be deferred or cancelled.\n */\n beforeUpdate?: (this: T & HookInterface) => void;\n\n /**\n * The updated callback.\n *\n * Called when the element has been updated in the DOM by the server\n */\n updated?: (this: T & HookInterface) => void;\n\n /**\n * The destroyed callback.\n *\n * Called when the element has been removed from the page, either by a parent update, or by the parent being removed entirely\n */\n destroyed?: (this: T & HookInterface) => void;\n\n /**\n * The disconnected callback.\n *\n * Called when the element's parent LiveView has disconnected from the server.\n */\n disconnected?: (this: T & HookInterface) => void;\n\n /**\n * The reconnected callback.\n *\n * Called when the element's parent LiveView has reconnected to the server.\n */\n reconnected?: (this: T & HookInterface) => void;\n\n // Allow custom methods with any signature and custom properties\n [key: PropertyKey]: any;\n}\n\n/**\n * Base class for LiveView hooks. Users extend this class to define their hooks.\n *\n * Example:\n * ```typescript\n * class MyCustomHook extends ViewHook {\n * myState = \"initial\";\n *\n * mounted() {\n * console.log(\"Hook mounted on element:\", this.el);\n * this.el.addEventListener(\"click\", () => {\n * this.pushEvent(\"element-clicked\", { state: this.myState });\n * });\n * }\n *\n * updated() {\n * console.log(\"Hook updated\", this.el.id);\n * }\n *\n * myCustomMethod(someArg: string) {\n * console.log(\"myCustomMethod called with:\", someArg, \"Current state:\", this.myState);\n * }\n * }\n * ```\n *\n * The `this` context within the hook methods (mounted, updated, custom methods, etc.)\n * will refer to the hook instance, providing access to `this.el`, `this.liveSocket`,\n * `this.pushEvent()`, etc., as well as any properties or methods defined on the subclass.\n */\nexport class ViewHook implements HookInterface {\n el: HTMLElement;\n liveSocket: LiveSocket;\n\n private __listeners: Set<CallbackRef>;\n private __isDisconnected: boolean;\n private __view: () => View;\n\n static makeID() {\n return viewHookID++;\n }\n static elementID(el: HTMLElement) {\n return DOM.private(el, HOOK_ID);\n }\n\n constructor(view: View | null, el: HTMLElement, callbacks?: Hook) {\n this.el = el;\n this.__attachView(view);\n this.__listeners = new Set();\n this.__isDisconnected = false;\n DOM.putPrivate(this.el, HOOK_ID, ViewHook.makeID());\n\n if (callbacks) {\n // This instance is for an object-literal hook. Copy methods/properties.\n // These are properties that should NOT be overridden by the callbacks object.\n const protectedProps = new Set([\n \"el\",\n \"liveSocket\",\n \"__view\",\n \"__listeners\",\n \"__isDisconnected\",\n \"constructor\", // Standard object properties\n // Core ViewHook API methods\n \"js\",\n \"pushEvent\",\n \"pushEventTo\",\n \"handleEvent\",\n \"removeHandleEvent\",\n \"upload\",\n \"uploadTo\",\n // Internal lifecycle callers\n \"__mounted\",\n \"__updated\",\n \"__beforeUpdate\",\n \"__destroyed\",\n \"__reconnected\",\n \"__disconnected\",\n \"__cleanup__\",\n ]);\n\n for (const key in callbacks) {\n if (Object.prototype.hasOwnProperty.call(callbacks, key)) {\n (this as any)[key] = callbacks[key];\n // for backwards compatibility, we allow the overwrite, but we log a warning\n if (protectedProps.has(key)) {\n console.warn(\n `Hook object for element #${el.id} overwrites core property '${key}'!`,\n );\n }\n }\n }\n\n const lifecycleMethods: (keyof Hook)[] = [\n \"mounted\",\n \"beforeUpdate\",\n \"updated\",\n \"destroyed\",\n \"disconnected\",\n \"reconnected\",\n ];\n lifecycleMethods.forEach((methodName) => {\n if (\n callbacks[methodName] &&\n typeof callbacks[methodName] === \"function\"\n ) {\n (this as any)[methodName] = callbacks[methodName];\n }\n });\n }\n // If 'callbacks' is not provided, this is an instance of a user-defined class (e.g., MyHook).\n // Its methods (mounted, updated, custom) are already part of its prototype or instance,\n // and will correctly override the defaults from ViewHook.prototype.\n }\n\n /** @internal */\n __attachView(view: View | null) {\n if (view) {\n this.__view = () => view;\n this.liveSocket = view.liveSocket;\n } else {\n this.__view = () => {\n throw new Error(\n `hook not yet attached to a live view: ${this.el.outerHTML}`,\n );\n };\n this.liveSocket = null;\n }\n }\n\n // Default lifecycle methods\n mounted(): void {}\n beforeUpdate(): void {}\n updated(): void {}\n destroyed(): void {}\n disconnected(): void {}\n reconnected(): void {}\n\n // Internal lifecycle callers - called by the View\n\n /** @internal */\n __mounted() {\n this.mounted();\n }\n /** @internal */\n __updated() {\n this.updated();\n }\n /** @internal */\n __beforeUpdate() {\n this.beforeUpdate();\n }\n /** @internal */\n __destroyed() {\n this.destroyed();\n DOM.deletePrivate(this.el, HOOK_ID); // https://github.com/phoenixframework/phoenix_live_view/issues/3496\n }\n /** @internal */\n __reconnected() {\n if (this.__isDisconnected) {\n this.__isDisconnected = false;\n this.reconnected();\n }\n }\n /** @internal */\n __disconnected() {\n this.__isDisconnected = true;\n this.disconnected();\n }\n\n js(): HookJSCommands {\n return {\n ...jsCommands(this.__view().liveSocket, \"hook\"),\n exec: (encodedJS: string) => {\n this.__view().liveSocket.execJS(this.el, encodedJS, \"hook\");\n },\n };\n }\n\n pushEvent(event: string, payload?: any, onReply?: OnReply) {\n const promise = this.__view().pushHookEvent(\n this.el,\n null,\n event,\n payload || {},\n );\n if (onReply === undefined) {\n return promise.then(({ reply }) => reply);\n }\n promise.then(({ reply, ref }) => onReply(reply, ref)).catch(() => {});\n return;\n }\n\n pushEventTo(\n selectorOrTarget: PhxTarget,\n event: string,\n payload?: object,\n onReply?: OnReply,\n ) {\n if (onReply === undefined) {\n const targetPair: { view: View; targetCtx: any }[] = [];\n this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n targetPair.push({ view, targetCtx });\n });\n const promises = targetPair.map(({ view, targetCtx }) => {\n return view.pushHookEvent(this.el, targetCtx, event, payload || {});\n });\n return Promise.allSettled(promises);\n }\n this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n view\n .pushHookEvent(this.el, targetCtx, event, payload || {})\n .then(({ reply, ref }) => onReply(reply, ref))\n .catch(() => {});\n });\n return;\n }\n\n handleEvent(event: string, callback: (payload: any) => any): CallbackRef {\n const callbackRef: CallbackRef = {\n event,\n callback: (customEvent: CustomEvent) => callback(customEvent.detail),\n };\n window.addEventListener(\n `phx:${event}`,\n callbackRef.callback as EventListener,\n );\n this.__listeners.add(callbackRef);\n return callbackRef;\n }\n\n removeHandleEvent(ref: CallbackRef): void {\n window.removeEventListener(\n `phx:${ref.event}`,\n ref.callback as EventListener,\n );\n this.__listeners.delete(ref);\n }\n\n upload(name: string, files: FileList): any {\n return this.__view().dispatchUploads(null, name, files);\n }\n\n uploadTo(selectorOrTarget: PhxTarget, name: string, files: FileList): any {\n return this.__view().withinTargets(selectorOrTarget, (view, targetCtx) => {\n view.dispatchUploads(targetCtx, name, files);\n });\n }\n\n /** @internal */\n __cleanup__() {\n this.__listeners.forEach((callbackRef) =>\n this.removeHandleEvent(callbackRef),\n );\n }\n}\n\nexport type HooksOptions = Record<string, typeof ViewHook | Hook>;\n\nexport default ViewHook;\n", "import {\n BEFORE_UNLOAD_LOADER_TIMEOUT,\n CHECKABLE_INPUTS,\n CONSECUTIVE_RELOADS,\n PHX_AUTO_RECOVER,\n PHX_COMPONENT,\n PHX_CONNECTED_CLASS,\n PHX_DISABLE_WITH,\n PHX_DISABLE_WITH_RESTORE,\n PHX_DISABLED,\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n PHX_HAS_FOCUSED,\n PHX_HAS_SUBMITTED,\n PHX_HOOK,\n PHX_PARENT_ID,\n PHX_PROGRESS,\n PHX_READONLY,\n PHX_REF_LOADING,\n PHX_REF_SRC,\n PHX_REF_LOCK,\n PHX_ROOT_ID,\n PHX_SESSION,\n PHX_STATIC,\n PHX_STICKY,\n PHX_TRACK_STATIC,\n PHX_TRACK_UPLOADS,\n PHX_UPDATE,\n PHX_UPLOAD_REF,\n PHX_VIEW_SELECTOR,\n PHX_MAIN,\n PHX_MOUNTED,\n PUSH_TIMEOUT,\n PHX_VIEWPORT_TOP,\n PHX_VIEWPORT_BOTTOM,\n MAX_CHILD_JOIN_ATTEMPTS,\n PHX_LV_PID,\n} from \"./constants\";\n\nimport {\n clone,\n closestPhxBinding,\n isEmpty,\n isEqualObj,\n logError,\n maybe,\n isCid,\n} from \"./utils\";\n\nimport Browser from \"./browser\";\nimport DOM from \"./dom\";\nimport ElementRef from \"./element_ref\";\nimport DOMPatch from \"./dom_patch\";\nimport LiveUploader from \"./live_uploader\";\nimport Rendered from \"./rendered\";\nimport { ViewHook } from \"./view_hook\";\nimport JS from \"./js\";\n\nimport morphdom from \"morphdom\";\n\nexport const prependFormDataKey = (key, prefix) => {\n const isArray = key.endsWith(\"[]\");\n // Remove the \"[]\" if it's an array\n let baseKey = isArray ? key.slice(0, -2) : key;\n // Replace last occurrence of key before a closing bracket or the end with key plus suffix\n baseKey = baseKey.replace(/([^\\[\\]]+)(\\]?$)/, `${prefix}$1$2`);\n // Add back the \"[]\" if it was an array\n if (isArray) {\n baseKey += \"[]\";\n }\n return baseKey;\n};\n\nconst serializeForm = (form, opts, onlyNames = []) => {\n const { submitter } = opts;\n\n // We must inject the submitter in the order that it exists in the DOM\n // relative to other inputs. For example, for checkbox groups, the order must be maintained.\n let injectedElement;\n if (submitter && submitter.name) {\n const input = document.createElement(\"input\");\n input.type = \"hidden\";\n // set the form attribute if the submitter has one;\n // this can happen if the element is outside the actual form element\n const formId = submitter.getAttribute(\"form\");\n if (formId) {\n input.setAttribute(\"form\", formId);\n }\n input.name = submitter.name;\n input.value = submitter.value;\n submitter.parentElement.insertBefore(input, submitter);\n injectedElement = input;\n }\n\n const formData = new FormData(form);\n const toRemove = [];\n\n formData.forEach((val, key, _index) => {\n if (val instanceof File) {\n toRemove.push(key);\n }\n });\n\n // Cleanup after building fileData\n toRemove.forEach((key) => formData.delete(key));\n\n const params = new URLSearchParams();\n\n const { inputsUnused, onlyHiddenInputs } = Array.from(form.elements).reduce(\n (acc, input) => {\n const { inputsUnused, onlyHiddenInputs } = acc;\n const key = input.name;\n if (!key) {\n return acc;\n }\n\n if (inputsUnused[key] === undefined) {\n inputsUnused[key] = true;\n }\n if (onlyHiddenInputs[key] === undefined) {\n onlyHiddenInputs[key] = true;\n }\n\n const isUsed =\n DOM.private(input, PHX_HAS_FOCUSED) ||\n DOM.private(input, PHX_HAS_SUBMITTED);\n const isHidden = input.type === \"hidden\";\n inputsUnused[key] = inputsUnused[key] && !isUsed;\n onlyHiddenInputs[key] = onlyHiddenInputs[key] && isHidden;\n\n return acc;\n },\n { inputsUnused: {}, onlyHiddenInputs: {} },\n );\n\n for (const [key, val] of formData.entries()) {\n if (onlyNames.length === 0 || onlyNames.indexOf(key) >= 0) {\n const isUnused = inputsUnused[key];\n const hidden = onlyHiddenInputs[key];\n if (isUnused && !(submitter && submitter.name == key) && !hidden) {\n params.append(prependFormDataKey(key, \"_unused_\"), \"\");\n }\n if (typeof val === \"string\") {\n params.append(key, val);\n }\n }\n }\n\n // remove the injected element again\n // (it would be removed by the next dom patch anyway, but this is cleaner)\n if (submitter && injectedElement) {\n submitter.parentElement.removeChild(injectedElement);\n }\n\n return params.toString();\n};\n\nexport default class View {\n static closestView(el) {\n const liveViewEl = el.closest(PHX_VIEW_SELECTOR);\n return liveViewEl ? DOM.private(liveViewEl, \"view\") : null;\n }\n\n constructor(el, liveSocket, parentView, flash, liveReferer) {\n this.isDead = false;\n this.liveSocket = liveSocket;\n this.flash = flash;\n this.parent = parentView;\n this.root = parentView ? parentView.root : this;\n this.el = el;\n // see https://github.com/phoenixframework/phoenix_live_view/pull/3721\n // check if the element is already bound to a view\n const boundView = DOM.private(this.el, \"view\");\n if (boundView !== undefined && boundView.isDead !== true) {\n logError(\n `The DOM element for this view has already been bound to a view.\n\n An element can only ever be associated with a single view!\n Please ensure that you are not trying to initialize multiple LiveSockets on the same page.\n This could happen if you're accidentally trying to render your root layout more than once.\n Ensure that the template set on the LiveView is different than the root layout.\n `,\n { view: boundView },\n );\n throw new Error(\"Cannot bind multiple views to the same DOM element.\");\n }\n // bind the view to the element\n DOM.putPrivate(this.el, \"view\", this);\n this.id = this.el.id;\n this.ref = 0;\n this.lastAckRef = null;\n this.childJoins = 0;\n /**\n * @type {ReturnType<typeof setTimeout> | null}\n */\n this.loaderTimer = null;\n /**\n * @type {ReturnType<typeof setTimeout> | null}\n */\n this.disconnectedTimer = null;\n this.pendingDiffs = [];\n this.pendingForms = new Set();\n this.redirect = false;\n this.href = null;\n this.joinCount = this.parent ? this.parent.joinCount - 1 : 0;\n this.joinAttempts = 0;\n this.joinPending = true;\n this.destroyed = false;\n this.joinCallback = function (onDone) {\n onDone && onDone();\n };\n this.stopCallback = function () {};\n this.pendingJoinOps = this.parent ? null : [];\n this.viewHooks = {};\n this.formSubmits = [];\n this.children = this.parent ? null : {};\n this.root.children[this.id] = {};\n this.formsForRecovery = {};\n this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {\n const url = this.href && this.expandURL(this.href);\n return {\n redirect: this.redirect ? url : undefined,\n url: this.redirect ? undefined : url || undefined,\n params: this.connectParams(liveReferer),\n session: this.getSession(),\n static: this.getStatic(),\n flash: this.flash,\n sticky: this.el.hasAttribute(PHX_STICKY),\n };\n });\n this.portalElementIds = new Set();\n }\n\n setHref(href) {\n this.href = href;\n }\n\n setRedirect(href) {\n this.redirect = true;\n this.href = href;\n }\n\n isMain() {\n return this.el.hasAttribute(PHX_MAIN);\n }\n\n connectParams(liveReferer) {\n const params = this.liveSocket.params(this.el);\n const manifest = DOM.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`)\n .map((node) => node.src || node.href)\n .filter((url) => typeof url === \"string\");\n\n if (manifest.length > 0) {\n params[\"_track_static\"] = manifest;\n }\n params[\"_mounts\"] = this.joinCount;\n params[\"_mount_attempts\"] = this.joinAttempts;\n params[\"_live_referer\"] = liveReferer;\n this.joinAttempts++;\n\n return params;\n }\n\n isConnected() {\n return this.channel.canPush();\n }\n\n getSession() {\n return this.el.getAttribute(PHX_SESSION);\n }\n\n getStatic() {\n const val = this.el.getAttribute(PHX_STATIC);\n return val === \"\" ? null : val;\n }\n\n destroy(callback = function () {}) {\n this.destroyAllChildren();\n this.destroyPortalElements();\n this.destroyed = true;\n DOM.deletePrivate(this.el, \"view\");\n delete this.root.children[this.id];\n if (this.parent) {\n delete this.root.children[this.parent.id][this.id];\n }\n clearTimeout(this.loaderTimer);\n const onFinished = () => {\n callback();\n for (const id in this.viewHooks) {\n this.destroyHook(this.viewHooks[id]);\n }\n };\n\n DOM.markPhxChildDestroyed(this.el);\n\n this.log(\"destroyed\", () => [\"the child has been removed from the parent\"]);\n this.channel\n .leave()\n .receive(\"ok\", onFinished)\n .receive(\"error\", onFinished)\n .receive(\"timeout\", onFinished);\n }\n\n setContainerClasses(...classes) {\n this.el.classList.remove(\n PHX_CONNECTED_CLASS,\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n );\n this.el.classList.add(...classes);\n }\n\n showLoader(timeout) {\n clearTimeout(this.loaderTimer);\n if (timeout) {\n this.loaderTimer = setTimeout(() => this.showLoader(), timeout);\n } else {\n for (const id in this.viewHooks) {\n this.viewHooks[id].__disconnected();\n }\n this.setContainerClasses(PHX_LOADING_CLASS);\n }\n }\n\n execAll(binding) {\n DOM.all(this.el, `[${binding}]`, (el) =>\n this.liveSocket.execJS(el, el.getAttribute(binding)),\n );\n }\n\n hideLoader() {\n clearTimeout(this.loaderTimer);\n clearTimeout(this.disconnectedTimer);\n this.setContainerClasses(PHX_CONNECTED_CLASS);\n this.execAll(this.binding(\"connected\"));\n }\n\n triggerReconnected() {\n for (const id in this.viewHooks) {\n this.viewHooks[id].__reconnected();\n }\n }\n\n log(kind, msgCallback) {\n this.liveSocket.log(this, kind, msgCallback);\n }\n\n transition(time, onStart, onDone = function () {}) {\n this.liveSocket.transition(time, onStart, onDone);\n }\n\n // calls the callback with the view and target element for the given phxTarget\n // targets can be:\n // * an element itself, then it is simply passed to liveSocket.owner;\n // * a CID (Component ID), then we first search the component's element in the DOM\n // * a selector, then we search the selector in the DOM and call the callback\n // for each element found with the corresponding owner view\n withinTargets(phxTarget, callback, dom = document) {\n // in the form recovery case we search in a template fragment instead of\n // the real dom, therefore we optionally pass dom and viewEl\n\n if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {\n return this.liveSocket.owner(phxTarget, (view) =>\n callback(view, phxTarget),\n );\n }\n\n if (isCid(phxTarget)) {\n const targets = DOM.findComponentNodeList(this.id, phxTarget, dom);\n if (targets.length === 0) {\n logError(`no component found matching phx-target of ${phxTarget}`);\n } else {\n callback(this, parseInt(phxTarget));\n }\n } else {\n const targets = Array.from(dom.querySelectorAll(phxTarget));\n if (targets.length === 0) {\n logError(\n `nothing found matching the phx-target selector \"${phxTarget}\"`,\n );\n }\n targets.forEach((target) =>\n this.liveSocket.owner(target, (view) => callback(view, target)),\n );\n }\n }\n\n applyDiff(type, rawDiff, callback) {\n this.log(type, () => [\"\", clone(rawDiff)]);\n const { diff, reply, events, title } = Rendered.extract(rawDiff);\n callback({ diff, reply, events });\n if (typeof title === \"string\" || type == \"mount\") {\n window.requestAnimationFrame(() => DOM.putTitle(title));\n }\n }\n\n onJoin(resp) {\n const { rendered, container, liveview_version, pid } = resp;\n if (container) {\n const [tag, attrs] = container;\n this.el = DOM.replaceRootContainer(this.el, tag, attrs);\n }\n this.childJoins = 0;\n this.joinPending = true;\n this.flash = null;\n if (this.root === this) {\n this.formsForRecovery = this.getFormsForRecovery();\n }\n if (this.isMain() && window.history.state === null) {\n // set initial history entry if this is the first page load (no history)\n Browser.pushState(\"replace\", {\n type: \"patch\",\n id: this.id,\n position: this.liveSocket.currentHistoryPosition,\n });\n }\n\n if (liveview_version !== this.liveSocket.version()) {\n console.error(\n `LiveView asset version mismatch. JavaScript version ${this.liveSocket.version()} vs. server ${liveview_version}. To avoid issues, please ensure that your assets use the same version as the server.`,\n );\n }\n\n // The pid is only sent if\n //\n // config :phoenix_live_view, :debug_attributes\n //\n // if set to true. It is to help debugging in development.\n if (pid) {\n this.el.setAttribute(PHX_LV_PID, pid);\n }\n\n Browser.dropLocal(\n this.liveSocket.localStorage,\n window.location.pathname,\n CONSECUTIVE_RELOADS,\n );\n this.applyDiff(\"mount\", rendered, ({ diff, events }) => {\n this.rendered = new Rendered(this.id, diff);\n const [html, streams] = this.renderContainer(null, \"join\");\n this.dropPendingRefs();\n this.joinCount++;\n this.joinAttempts = 0;\n\n this.maybeRecoverForms(html, () => {\n this.onJoinComplete(resp, html, streams, events);\n });\n });\n }\n\n dropPendingRefs() {\n DOM.all(document, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, (el) => {\n el.removeAttribute(PHX_REF_LOADING);\n el.removeAttribute(PHX_REF_SRC);\n el.removeAttribute(PHX_REF_LOCK);\n });\n }\n\n onJoinComplete({ live_patch }, html, streams, events) {\n // In order to provide a better experience, we want to join\n // all LiveViews first and only then apply their patches.\n if (this.joinCount > 1 || (this.parent && !this.parent.isJoinPending())) {\n return this.applyJoinPatch(live_patch, html, streams, events);\n }\n\n // One downside of this approach is that we need to find phxChildren\n // in the html fragment, instead of directly on the DOM. The fragment\n // also does not include PHX_STATIC, so we need to copy it over from\n // the DOM.\n const newChildren = DOM.findPhxChildrenInFragment(html, this.id).filter(\n (toEl) => {\n const fromEl = toEl.id && this.el.querySelector(`[id=\"${toEl.id}\"]`);\n const phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC);\n if (phxStatic) {\n toEl.setAttribute(PHX_STATIC, phxStatic);\n }\n // set PHX_ROOT_ID to prevent events from being dispatched to the root view\n // while the child join is still pending\n if (fromEl) {\n fromEl.setAttribute(PHX_ROOT_ID, this.root.id);\n }\n return this.joinChild(toEl);\n },\n );\n\n if (newChildren.length === 0) {\n if (this.parent) {\n this.root.pendingJoinOps.push([\n this,\n () => this.applyJoinPatch(live_patch, html, streams, events),\n ]);\n this.parent.ackJoin(this);\n } else {\n this.onAllChildJoinsComplete();\n this.applyJoinPatch(live_patch, html, streams, events);\n }\n } else {\n this.root.pendingJoinOps.push([\n this,\n () => this.applyJoinPatch(live_patch, html, streams, events),\n ]);\n }\n }\n\n attachTrueDocEl() {\n this.el = DOM.byId(this.id);\n this.el.setAttribute(PHX_ROOT_ID, this.root.id);\n }\n\n // this is invoked for dead and live views, so we must filter by\n // by owner to ensure we aren't duplicating hooks across disconnect\n // and connected states. This also handles cases where hooks exist\n // in a root layout with a LV in the body\n execNewMounted(parent = document) {\n let phxViewportTop = this.binding(PHX_VIEWPORT_TOP);\n let phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM);\n this.all(\n parent,\n `[${phxViewportTop}], [${phxViewportBottom}]`,\n (hookEl) => {\n DOM.maintainPrivateHooks(\n hookEl,\n hookEl,\n phxViewportTop,\n phxViewportBottom,\n );\n this.maybeAddNewHook(hookEl);\n },\n );\n this.all(\n parent,\n `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`,\n (hookEl) => {\n this.maybeAddNewHook(hookEl);\n },\n );\n this.all(parent, `[${this.binding(PHX_MOUNTED)}]`, (el) => {\n this.maybeMounted(el);\n });\n }\n\n all(parent, selector, callback) {\n DOM.all(parent, selector, (el) => {\n if (this.ownsElement(el)) {\n callback(el);\n }\n });\n }\n\n applyJoinPatch(live_patch, html, streams, events) {\n this.attachTrueDocEl();\n const patch = new DOMPatch(this, this.el, this.id, html, streams, null);\n patch.markPrunableContentForRemoval();\n this.performPatch(patch, false, true);\n this.joinNewChildren();\n this.execNewMounted();\n\n this.joinPending = false;\n this.liveSocket.dispatchEvents(events);\n this.applyPendingUpdates();\n\n if (live_patch) {\n const { kind, to } = live_patch;\n this.liveSocket.historyPatch(to, kind);\n }\n this.hideLoader();\n if (this.joinCount > 1) {\n this.triggerReconnected();\n }\n this.stopCallback();\n }\n\n triggerBeforeUpdateHook(fromEl, toEl) {\n this.liveSocket.triggerDOM(\"onBeforeElUpdated\", [fromEl, toEl]);\n const hook = this.getHook(fromEl);\n const isIgnored = hook && DOM.isIgnored(fromEl, this.binding(PHX_UPDATE));\n if (\n hook &&\n !fromEl.isEqualNode(toEl) &&\n !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))\n ) {\n hook.__beforeUpdate();\n return hook;\n }\n }\n\n maybeMounted(el) {\n const phxMounted = el.getAttribute(this.binding(PHX_MOUNTED));\n const hasBeenInvoked = phxMounted && DOM.private(el, \"mounted\");\n if (phxMounted && !hasBeenInvoked) {\n this.liveSocket.execJS(el, phxMounted);\n DOM.putPrivate(el, \"mounted\", true);\n }\n }\n\n maybeAddNewHook(el) {\n const newHook = this.addHook(el);\n if (newHook) {\n newHook.__mounted();\n }\n }\n\n performPatch(patch, pruneCids, isJoinPatch = false) {\n const removedEls = [];\n let phxChildrenAdded = false;\n const updatedHookIds = new Set();\n\n this.liveSocket.triggerDOM(\"onPatchStart\", [patch.targetContainer]);\n\n patch.after(\"added\", (el) => {\n this.liveSocket.triggerDOM(\"onNodeAdded\", [el]);\n const phxViewportTop = this.binding(PHX_VIEWPORT_TOP);\n const phxViewportBottom = this.binding(PHX_VIEWPORT_BOTTOM);\n DOM.maintainPrivateHooks(el, el, phxViewportTop, phxViewportBottom);\n this.maybeAddNewHook(el);\n if (el.getAttribute) {\n this.maybeMounted(el);\n }\n });\n\n patch.after(\"phxChildAdded\", (el) => {\n if (DOM.isPhxSticky(el)) {\n this.liveSocket.joinRootViews();\n } else {\n phxChildrenAdded = true;\n }\n });\n\n patch.before(\"updated\", (fromEl, toEl) => {\n const hook = this.triggerBeforeUpdateHook(fromEl, toEl);\n if (hook) {\n updatedHookIds.add(fromEl.id);\n }\n // trigger JS specific update logic (for example for JS.ignore_attributes)\n JS.onBeforeElUpdated(fromEl, toEl);\n });\n\n patch.after(\"updated\", (el) => {\n if (updatedHookIds.has(el.id)) {\n this.getHook(el).__updated();\n }\n });\n\n patch.after(\"discarded\", (el) => {\n if (el.nodeType === Node.ELEMENT_NODE) {\n removedEls.push(el);\n }\n });\n\n patch.after(\"transitionsDiscarded\", (els) =>\n this.afterElementsRemoved(els, pruneCids),\n );\n patch.perform(isJoinPatch);\n this.afterElementsRemoved(removedEls, pruneCids);\n\n this.liveSocket.triggerDOM(\"onPatchEnd\", [patch.targetContainer]);\n return phxChildrenAdded;\n }\n\n afterElementsRemoved(elements, pruneCids) {\n const destroyedCIDs = [];\n elements.forEach((parent) => {\n const components = DOM.all(parent, `[${PHX_COMPONENT}]`);\n const hooks = DOM.all(\n parent,\n `[${this.binding(PHX_HOOK)}], [data-phx-hook]`,\n );\n components.concat(parent).forEach((el) => {\n const cid = this.componentID(el);\n if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) {\n destroyedCIDs.push(cid);\n }\n });\n hooks.concat(parent).forEach((hookEl) => {\n const hook = this.getHook(hookEl);\n hook && this.destroyHook(hook);\n });\n });\n // We should not pruneCids on joins. Otherwise, in case of\n // rejoins, we may notify cids that no longer belong to the\n // current LiveView to be removed.\n if (pruneCids) {\n this.maybePushComponentsDestroyed(destroyedCIDs);\n }\n }\n\n joinNewChildren() {\n DOM.findPhxChildren(document, this.id).forEach((el) => this.joinChild(el));\n }\n\n maybeRecoverForms(html, callback) {\n const phxChange = this.binding(\"change\");\n const oldForms = this.root.formsForRecovery;\n // So why do we create a template element here?\n // One way to recover forms would be to immediately apply the mount\n // patch and then afterwards recover the forms. However, this would\n // cause a flicker, because the mount patch would remove the form content\n // until it is restored. Therefore LV decided to do form recovery with the\n // raw HTML before it is applied and delay the mount patch until the form\n // recovery events are done.\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n // because we work with a template element, we must manually copy the attributes\n // otherwise the owner / target helpers don't work properly\n const rootEl = template.content.firstElementChild;\n rootEl.id = this.id;\n rootEl.setAttribute(PHX_ROOT_ID, this.root.id);\n rootEl.setAttribute(PHX_SESSION, this.getSession());\n rootEl.setAttribute(PHX_STATIC, this.getStatic());\n rootEl.setAttribute(PHX_PARENT_ID, this.parent ? this.parent.id : null);\n\n // we go over all form elements in the new HTML for the LV\n // and look for old forms in the `formsForRecovery` object;\n // the formsForRecovery can also contain forms from child views\n const formsToRecover =\n // we go over all forms in the new DOM; because this is only the HTML for the current\n // view, we can be sure that all forms are owned by this view:\n DOM.all(template.content, \"form\")\n // only recover forms that have an id and are in the old DOM\n .filter((newForm) => newForm.id && oldForms[newForm.id])\n // abandon forms we already tried to recover to prevent looping a failed state\n .filter((newForm) => !this.pendingForms.has(newForm.id))\n // only recover if the form has the same phx-change value\n .filter(\n (newForm) =>\n oldForms[newForm.id].getAttribute(phxChange) ===\n newForm.getAttribute(phxChange),\n )\n .map((newForm) => {\n return [oldForms[newForm.id], newForm];\n });\n\n if (formsToRecover.length === 0) {\n return callback();\n }\n\n formsToRecover.forEach(([oldForm, newForm], i) => {\n this.pendingForms.add(newForm.id);\n // it is important to use the firstElementChild of the template content\n // because when traversing a documentFragment using parentNode, we won't ever arrive at\n // the fragment; as the template is always a LiveView, we can be sure that there is only\n // one child on the root level\n this.pushFormRecovery(\n oldForm,\n newForm,\n template.content.firstElementChild,\n () => {\n this.pendingForms.delete(newForm.id);\n // we only call the callback once all forms have been recovered\n if (i === formsToRecover.length - 1) {\n callback();\n }\n },\n );\n });\n }\n\n getChildById(id) {\n return this.root.children[this.id][id];\n }\n\n getDescendentByEl(el) {\n if (el.id === this.id) {\n return this;\n } else {\n return this.children[el.getAttribute(PHX_PARENT_ID)]?.[el.id];\n }\n }\n\n destroyDescendent(id) {\n for (const parentId in this.root.children) {\n for (const childId in this.root.children[parentId]) {\n if (childId === id) {\n return this.root.children[parentId][childId].destroy();\n }\n }\n }\n }\n\n joinChild(el) {\n const child = this.getChildById(el.id);\n if (!child) {\n const view = new View(el, this.liveSocket, this);\n this.root.children[this.id][view.id] = view;\n view.join();\n this.childJoins++;\n return true;\n }\n }\n\n isJoinPending() {\n return this.joinPending;\n }\n\n ackJoin(_child) {\n this.childJoins--;\n\n if (this.childJoins === 0) {\n if (this.parent) {\n this.parent.ackJoin(this);\n } else {\n this.onAllChildJoinsComplete();\n }\n }\n }\n\n onAllChildJoinsComplete() {\n // we can clear pending form recoveries now that we've joined.\n // They either all resolved or were abandoned\n this.pendingForms.clear();\n // we can also clear the formsForRecovery object to not keep old form elements around\n this.formsForRecovery = {};\n this.joinCallback(() => {\n this.pendingJoinOps.forEach(([view, op]) => {\n if (!view.isDestroyed()) {\n op();\n }\n });\n this.pendingJoinOps = [];\n });\n }\n\n update(diff, events) {\n if (\n this.isJoinPending() ||\n (this.liveSocket.hasPendingLink() && this.root.isMain())\n ) {\n return this.pendingDiffs.push({ diff, events });\n }\n\n this.rendered.mergeDiff(diff);\n let phxChildrenAdded = false;\n\n // When the diff only contains component diffs, then walk components\n // and patch only the parent component containers found in the diff.\n // Otherwise, patch entire LV container.\n if (this.rendered.isComponentOnlyDiff(diff)) {\n this.liveSocket.time(\"component patch complete\", () => {\n const parentCids = DOM.findExistingParentCIDs(\n this.id,\n this.rendered.componentCIDs(diff),\n );\n parentCids.forEach((parentCID) => {\n if (\n this.componentPatch(\n this.rendered.getComponent(diff, parentCID),\n parentCID,\n )\n ) {\n phxChildrenAdded = true;\n }\n });\n });\n } else if (!isEmpty(diff)) {\n this.liveSocket.time(\"full patch complete\", () => {\n const [html, streams] = this.renderContainer(diff, \"update\");\n const patch = new DOMPatch(this, this.el, this.id, html, streams, null);\n phxChildrenAdded = this.performPatch(patch, true);\n });\n }\n\n this.liveSocket.dispatchEvents(events);\n if (phxChildrenAdded) {\n this.joinNewChildren();\n }\n }\n\n renderContainer(diff, kind) {\n return this.liveSocket.time(`toString diff (${kind})`, () => {\n const tag = this.el.tagName;\n // Don't skip any component in the diff nor any marked as pruned\n // (as they may have been added back)\n const cids = diff ? this.rendered.componentCIDs(diff) : null;\n const { buffer: html, streams } = this.rendered.toString(cids);\n return [`<${tag}>${html}</${tag}>`, streams];\n });\n }\n\n componentPatch(diff, cid) {\n if (isEmpty(diff)) return false;\n const { buffer: html, streams } = this.rendered.componentToString(cid);\n const patch = new DOMPatch(this, this.el, this.id, html, streams, cid);\n const childrenAdded = this.performPatch(patch, true);\n return childrenAdded;\n }\n\n getHook(el) {\n return this.viewHooks[ViewHook.elementID(el)];\n }\n\n addHook(el) {\n const hookElId = ViewHook.elementID(el);\n\n // only ever try to add hooks to elements owned by this view\n if (el.getAttribute && !this.ownsElement(el)) {\n return;\n }\n\n if (hookElId && !this.viewHooks[hookElId]) {\n // hook created, but not attached (createHook for web component)\n const hook =\n DOM.getCustomElHook(el) ||\n logError(`no hook found for custom element: ${el.id}`);\n this.viewHooks[hookElId] = hook;\n hook.__attachView(this);\n return hook;\n } else if (hookElId || !el.getAttribute) {\n // no hook found\n return;\n } else {\n // new hook found with phx-hook attribute\n const hookName =\n el.getAttribute(`data-phx-${PHX_HOOK}`) ||\n el.getAttribute(this.binding(PHX_HOOK));\n\n if (!hookName) {\n return;\n }\n\n const hookDefinition = this.liveSocket.getHookDefinition(hookName);\n\n if (hookDefinition) {\n if (!el.id) {\n logError(\n `no DOM ID for hook \"${hookName}\". Hooks require a unique ID on each element.`,\n el,\n );\n return;\n }\n\n let hookInstance;\n try {\n if (\n typeof hookDefinition === \"function\" &&\n hookDefinition.prototype instanceof ViewHook\n ) {\n // It's a class constructor (subclass of ViewHook)\n hookInstance = new hookDefinition(this, el); // `this` is the View instance\n } else if (\n typeof hookDefinition === \"object\" &&\n hookDefinition !== null\n ) {\n // It's an object literal, pass it to the ViewHook constructor for wrapping\n hookInstance = new ViewHook(this, el, hookDefinition);\n } else {\n logError(\n `Invalid hook definition for \"${hookName}\". Expected a class extending ViewHook or an object definition.`,\n el,\n );\n return;\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n logError(`Failed to create hook \"${hookName}\": ${errorMessage}`, el);\n return;\n }\n\n this.viewHooks[ViewHook.elementID(hookInstance.el)] = hookInstance;\n return hookInstance;\n } else if (hookName !== null) {\n logError(`unknown hook found for \"${hookName}\"`, el);\n }\n }\n }\n\n destroyHook(hook) {\n // __destroyed clears the elementID from the hook, therefore\n // we need to get it before calling __destroyed\n const hookId = ViewHook.elementID(hook.el);\n hook.__destroyed();\n hook.__cleanup__();\n delete this.viewHooks[hookId];\n }\n\n applyPendingUpdates() {\n // prevent race conditions where we might still be pending a new\n // navigation after applying the current one;\n // if we call update and a pendingDiff is not applied, it would\n // be silently dropped otherwise, as update would push it back to\n // pendingDiffs, but we clear it immediately after\n if (this.liveSocket.hasPendingLink() && this.root.isMain()) {\n return;\n }\n this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));\n this.pendingDiffs = [];\n this.eachChild((child) => child.applyPendingUpdates());\n }\n\n eachChild(callback) {\n const children = this.root.children[this.id] || {};\n for (const id in children) {\n callback(this.getChildById(id));\n }\n }\n\n onChannel(event, cb) {\n this.liveSocket.onChannel(this.channel, event, (resp) => {\n if (this.isJoinPending()) {\n this.root.pendingJoinOps.push([this, () => cb(resp)]);\n } else {\n this.liveSocket.requestDOMUpdate(() => cb(resp));\n }\n });\n }\n\n bindChannel() {\n // The diff event should be handled by the regular update operations.\n // All other operations are queued to be applied only after join.\n this.liveSocket.onChannel(this.channel, \"diff\", (rawDiff) => {\n this.liveSocket.requestDOMUpdate(() => {\n this.applyDiff(\"update\", rawDiff, ({ diff, events }) =>\n this.update(diff, events),\n );\n });\n });\n this.onChannel(\"redirect\", ({ to, flash }) =>\n this.onRedirect({ to, flash }),\n );\n this.onChannel(\"live_patch\", (redir) => this.onLivePatch(redir));\n this.onChannel(\"live_redirect\", (redir) => this.onLiveRedirect(redir));\n this.channel.onError((reason) => this.onError(reason));\n this.channel.onClose((reason) => this.onClose(reason));\n }\n\n destroyAllChildren() {\n this.eachChild((child) => child.destroy());\n }\n\n onLiveRedirect(redir) {\n const { to, kind, flash } = redir;\n const url = this.expandURL(to);\n const e = new CustomEvent(\"phx:server-navigate\", {\n detail: { to, kind, flash },\n });\n this.liveSocket.historyRedirect(e, url, kind, flash);\n }\n\n onLivePatch(redir) {\n const { to, kind } = redir;\n this.href = this.expandURL(to);\n this.liveSocket.historyPatch(to, kind);\n }\n\n expandURL(to) {\n return to.startsWith(\"/\")\n ? `${window.location.protocol}//${window.location.host}${to}`\n : to;\n }\n\n /**\n * @param {{to: string, flash?: string, reloadToken?: string}} redirect\n */\n onRedirect({ to, flash, reloadToken }) {\n this.liveSocket.redirect(to, flash, reloadToken);\n }\n\n isDestroyed() {\n return this.destroyed;\n }\n\n joinDead() {\n this.isDead = true;\n }\n\n joinPush() {\n this.joinPush = this.joinPush || this.channel.join();\n return this.joinPush;\n }\n\n join(callback) {\n this.showLoader(this.liveSocket.loaderTimeout);\n this.bindChannel();\n if (this.isMain()) {\n this.stopCallback = this.liveSocket.withPageLoading({\n to: this.href,\n kind: \"initial\",\n });\n }\n this.joinCallback = (onDone) => {\n onDone = onDone || function () {};\n callback ? callback(this.joinCount, onDone) : onDone();\n };\n\n this.wrapPush(() => this.channel.join(), {\n ok: (resp) => this.liveSocket.requestDOMUpdate(() => this.onJoin(resp)),\n error: (error) => this.onJoinError(error),\n timeout: () => this.onJoinError({ reason: \"timeout\" }),\n });\n }\n\n onJoinError(resp) {\n if (resp.reason === \"reload\") {\n this.log(\"error\", () => [\n `failed mount with ${resp.status}. Falling back to page reload`,\n resp,\n ]);\n this.onRedirect({ to: this.root.href, reloadToken: resp.token });\n return;\n } else if (resp.reason === \"unauthorized\" || resp.reason === \"stale\") {\n this.log(\"error\", () => [\n \"unauthorized live_redirect. Falling back to page request\",\n resp,\n ]);\n this.onRedirect({ to: this.root.href, flash: this.flash });\n return;\n }\n if (resp.redirect || resp.live_redirect) {\n this.joinPending = false;\n this.channel.leave();\n }\n if (resp.redirect) {\n return this.onRedirect(resp.redirect);\n }\n if (resp.live_redirect) {\n return this.onLiveRedirect(resp.live_redirect);\n }\n this.log(\"error\", () => [\"unable to join\", resp]);\n if (this.isMain()) {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n if (this.liveSocket.isConnected()) {\n this.liveSocket.reloadWithJitter(this);\n }\n } else {\n if (this.joinAttempts >= MAX_CHILD_JOIN_ATTEMPTS) {\n // put the root review into permanent error state, but don't destroy it as it can remain active\n this.root.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n this.log(\"error\", () => [\n `giving up trying to mount after ${MAX_CHILD_JOIN_ATTEMPTS} tries`,\n resp,\n ]);\n this.destroy();\n }\n const trueChildEl = DOM.byId(this.el.id);\n if (trueChildEl) {\n DOM.mergeAttrs(trueChildEl, this.el);\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n this.el = trueChildEl;\n } else {\n this.destroy();\n }\n }\n }\n\n onClose(reason) {\n if (this.isDestroyed()) {\n return;\n }\n if (\n this.isMain() &&\n this.liveSocket.hasPendingLink() &&\n reason !== \"leave\"\n ) {\n return this.liveSocket.reloadWithJitter(this);\n }\n this.destroyAllChildren();\n this.liveSocket.dropActiveElement(this);\n if (this.liveSocket.isUnloaded()) {\n this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT);\n }\n }\n\n onError(reason) {\n this.onClose(reason);\n if (this.liveSocket.isConnected()) {\n this.log(\"error\", () => [\"view crashed\", reason]);\n }\n if (!this.liveSocket.isUnloaded()) {\n if (this.liveSocket.isConnected()) {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_SERVER_ERROR_CLASS,\n ]);\n } else {\n this.displayError([\n PHX_LOADING_CLASS,\n PHX_ERROR_CLASS,\n PHX_CLIENT_ERROR_CLASS,\n ]);\n }\n }\n }\n\n displayError(classes) {\n if (this.isMain()) {\n DOM.dispatchEvent(window, \"phx:page-loading-start\", {\n detail: { to: this.href, kind: \"error\" },\n });\n }\n this.showLoader();\n this.setContainerClasses(...classes);\n this.delayedDisconnected();\n }\n\n delayedDisconnected() {\n this.disconnectedTimer = setTimeout(() => {\n this.execAll(this.binding(\"disconnected\"));\n }, this.liveSocket.disconnectedTimeout);\n }\n\n wrapPush(callerPush, receives) {\n const latency = this.liveSocket.getLatencySim();\n const withLatency = latency\n ? (cb) => setTimeout(() => !this.isDestroyed() && cb(), latency)\n : (cb) => !this.isDestroyed() && cb();\n\n withLatency(() => {\n callerPush()\n .receive(\"ok\", (resp) =>\n withLatency(() => receives.ok && receives.ok(resp)),\n )\n .receive(\"error\", (reason) =>\n withLatency(() => receives.error && receives.error(reason)),\n )\n .receive(\"timeout\", () =>\n withLatency(() => receives.timeout && receives.timeout()),\n );\n });\n }\n\n pushWithReply(refGenerator, event, payload) {\n if (!this.isConnected()) {\n return Promise.reject(new Error(\"no connection\"));\n }\n\n const [ref, [el], opts] = refGenerator\n ? refGenerator({ payload })\n : [null, [], {}];\n const oldJoinCount = this.joinCount;\n let onLoadingDone = function () {};\n if (opts.page_loading) {\n onLoadingDone = this.liveSocket.withPageLoading({\n kind: \"element\",\n target: el,\n });\n }\n\n if (typeof payload.cid !== \"number\") {\n delete payload.cid;\n }\n\n return new Promise((resolve, reject) => {\n this.wrapPush(() => this.channel.push(event, payload, PUSH_TIMEOUT), {\n ok: (resp) => {\n if (ref !== null) {\n this.lastAckRef = ref;\n }\n const finish = (hookReply) => {\n if (resp.redirect) {\n this.onRedirect(resp.redirect);\n }\n if (resp.live_patch) {\n this.onLivePatch(resp.live_patch);\n }\n if (resp.live_redirect) {\n this.onLiveRedirect(resp.live_redirect);\n }\n onLoadingDone();\n resolve({ resp: resp, reply: hookReply, ref });\n };\n if (resp.diff) {\n this.liveSocket.requestDOMUpdate(() => {\n this.applyDiff(\"update\", resp.diff, ({ diff, reply, events }) => {\n if (ref !== null) {\n this.undoRefs(ref, payload.event);\n }\n this.update(diff, events);\n finish(reply);\n });\n });\n } else {\n if (ref !== null) {\n this.undoRefs(ref, payload.event);\n }\n finish(null);\n }\n },\n error: (reason) => reject(new Error(`failed with reason: ${reason}`)),\n timeout: () => {\n reject(new Error(\"timeout\"));\n if (this.joinCount === oldJoinCount) {\n this.liveSocket.reloadWithJitter(this, () => {\n this.log(\"timeout\", () => [\n \"received timeout while communicating with server. Falling back to hard refresh for recovery\",\n ]);\n });\n }\n },\n });\n });\n }\n\n undoRefs(ref, phxEvent, onlyEls) {\n if (!this.isConnected()) {\n return;\n } // exit if external form triggered\n const selector = `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`;\n\n if (onlyEls) {\n onlyEls = new Set(onlyEls);\n DOM.all(document, selector, (parent) => {\n if (onlyEls && !onlyEls.has(parent)) {\n return;\n }\n // undo any child refs within parent first\n DOM.all(parent, selector, (child) =>\n this.undoElRef(child, ref, phxEvent),\n );\n this.undoElRef(parent, ref, phxEvent);\n });\n } else {\n DOM.all(document, selector, (el) => this.undoElRef(el, ref, phxEvent));\n }\n }\n\n undoElRef(el, ref, phxEvent) {\n const elRef = new ElementRef(el);\n\n elRef.maybeUndo(ref, phxEvent, (clonedTree) => {\n // we need to perform a full patch on unlocked elements\n // to perform all the necessary logic (like calling updated for hooks, etc.)\n const patch = new DOMPatch(this, el, this.id, clonedTree, [], null, {\n undoRef: ref,\n });\n const phxChildrenAdded = this.performPatch(patch, true);\n DOM.all(el, `[${PHX_REF_SRC}=\"${this.refSrc()}\"]`, (child) =>\n this.undoElRef(child, ref, phxEvent),\n );\n if (phxChildrenAdded) {\n this.joinNewChildren();\n }\n });\n }\n\n refSrc() {\n return this.el.id;\n }\n\n putRef(elements, phxEvent, eventType, opts = {}) {\n const newRef = this.ref++;\n const disableWith = this.binding(PHX_DISABLE_WITH);\n if (opts.loading) {\n const loadingEls = DOM.all(document, opts.loading).map((el) => {\n return { el, lock: true, loading: true };\n });\n elements = elements.concat(loadingEls);\n }\n\n for (const { el, lock, loading } of elements) {\n if (!lock && !loading) {\n throw new Error(\"putRef requires lock or loading\");\n }\n el.setAttribute(PHX_REF_SRC, this.refSrc());\n if (loading) {\n el.setAttribute(PHX_REF_LOADING, newRef);\n }\n if (lock) {\n el.setAttribute(PHX_REF_LOCK, newRef);\n }\n\n if (\n !loading ||\n (opts.submitter && !(el === opts.submitter || el === opts.form))\n ) {\n continue;\n }\n\n const lockCompletePromise = new Promise((resolve) => {\n el.addEventListener(`phx:undo-lock:${newRef}`, () => resolve(detail), {\n once: true,\n });\n });\n\n const loadingCompletePromise = new Promise((resolve) => {\n el.addEventListener(\n `phx:undo-loading:${newRef}`,\n () => resolve(detail),\n { once: true },\n );\n });\n\n el.classList.add(`phx-${eventType}-loading`);\n const disableText = el.getAttribute(disableWith);\n if (disableText !== null) {\n if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) {\n el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText);\n }\n if (disableText !== \"\") {\n el.innerText = disableText;\n }\n // PHX_DISABLED could have already been set in disableForm\n el.setAttribute(\n PHX_DISABLED,\n el.getAttribute(PHX_DISABLED) || el.disabled,\n );\n el.setAttribute(\"disabled\", \"\");\n }\n\n const detail = {\n event: phxEvent,\n eventType: eventType,\n ref: newRef,\n isLoading: loading,\n isLocked: lock,\n lockElements: elements.filter(({ lock }) => lock).map(({ el }) => el),\n loadingElements: elements\n .filter(({ loading }) => loading)\n .map(({ el }) => el),\n unlock: (els) => {\n els = Array.isArray(els) ? els : [els];\n this.undoRefs(newRef, phxEvent, els);\n },\n lockComplete: lockCompletePromise,\n loadingComplete: loadingCompletePromise,\n lock: (lockEl) => {\n return new Promise((resolve) => {\n if (this.isAcked(newRef)) {\n return resolve(detail);\n }\n lockEl.setAttribute(PHX_REF_LOCK, newRef);\n lockEl.setAttribute(PHX_REF_SRC, this.refSrc());\n lockEl.addEventListener(\n `phx:lock-stop:${newRef}`,\n () => resolve(detail),\n { once: true },\n );\n });\n },\n };\n if (opts.payload) {\n detail[\"payload\"] = opts.payload;\n }\n if (opts.target) {\n detail[\"target\"] = opts.target;\n }\n if (opts.originalEvent) {\n detail[\"originalEvent\"] = opts.originalEvent;\n }\n el.dispatchEvent(\n new CustomEvent(\"phx:push\", {\n detail: detail,\n bubbles: true,\n cancelable: false,\n }),\n );\n if (phxEvent) {\n el.dispatchEvent(\n new CustomEvent(`phx:push:${phxEvent}`, {\n detail: detail,\n bubbles: true,\n cancelable: false,\n }),\n );\n }\n }\n return [newRef, elements.map(({ el }) => el), opts];\n }\n\n isAcked(ref) {\n return this.lastAckRef !== null && this.lastAckRef >= ref;\n }\n\n componentID(el) {\n const cid = el.getAttribute && el.getAttribute(PHX_COMPONENT);\n return cid ? parseInt(cid) : null;\n }\n\n targetComponentID(target, targetCtx, opts = {}) {\n if (isCid(targetCtx)) {\n return targetCtx;\n }\n\n const cidOrSelector =\n opts.target || target.getAttribute(this.binding(\"target\"));\n if (isCid(cidOrSelector)) {\n return parseInt(cidOrSelector);\n } else if (targetCtx && (cidOrSelector !== null || opts.target)) {\n return this.closestComponentID(targetCtx);\n } else {\n return null;\n }\n }\n\n closestComponentID(targetCtx) {\n if (isCid(targetCtx)) {\n return targetCtx;\n } else if (targetCtx) {\n return maybe(\n targetCtx.closest(`[${PHX_COMPONENT}]`),\n (el) => this.ownsElement(el) && this.componentID(el),\n );\n } else {\n return null;\n }\n }\n\n pushHookEvent(el, targetCtx, event, payload) {\n if (!this.isConnected()) {\n this.log(\"hook\", () => [\n \"unable to push hook event. LiveView not connected\",\n event,\n payload,\n ]);\n return Promise.reject(\n new Error(\"unable to push hook event. LiveView not connected\"),\n );\n }\n\n const refGenerator = () =>\n this.putRef([{ el, loading: true, lock: true }], event, \"hook\", {\n payload,\n target: targetCtx,\n });\n\n return this.pushWithReply(refGenerator, \"event\", {\n type: \"hook\",\n event: event,\n value: payload,\n cid: this.closestComponentID(targetCtx),\n }).then(({ resp: _resp, reply, ref }) => ({ reply, ref }));\n }\n\n extractMeta(el, meta, value) {\n const prefix = this.binding(\"value-\");\n for (let i = 0; i < el.attributes.length; i++) {\n if (!meta) {\n meta = {};\n }\n const name = el.attributes[i].name;\n if (name.startsWith(prefix)) {\n meta[name.replace(prefix, \"\")] = el.getAttribute(name);\n }\n }\n if (el.value !== undefined && !(el instanceof HTMLFormElement)) {\n if (!meta) {\n meta = {};\n }\n meta.value = el.value;\n\n if (\n el.tagName === \"INPUT\" &&\n CHECKABLE_INPUTS.indexOf(el.type) >= 0 &&\n !el.checked\n ) {\n delete meta.value;\n }\n }\n if (value) {\n if (!meta) {\n meta = {};\n }\n for (const key in value) {\n meta[key] = value[key];\n }\n }\n return meta;\n }\n\n pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}, onReply) {\n this.pushWithReply(\n (maybePayload) =>\n this.putRef([{ el, loading: true, lock: true }], phxEvent, type, {\n ...opts,\n payload: maybePayload?.payload,\n }),\n \"event\",\n {\n type: type,\n event: phxEvent,\n value: this.extractMeta(el, meta, opts.value),\n cid: this.targetComponentID(el, targetCtx, opts),\n },\n )\n .then(({ reply }) => onReply && onReply(reply))\n .catch((error) => logError(\"Failed to push event\", error));\n }\n\n pushFileProgress(fileEl, entryRef, progress, onReply = function () {}) {\n this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {\n view\n .pushWithReply(null, \"progress\", {\n event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),\n ref: fileEl.getAttribute(PHX_UPLOAD_REF),\n entry_ref: entryRef,\n progress: progress,\n cid: view.targetComponentID(fileEl.form, targetCtx),\n })\n .then(() => onReply())\n .catch((error) => logError(\"Failed to push file progress\", error));\n });\n }\n\n pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) {\n if (!inputEl.form) {\n throw new Error(\"form events require the input to be inside a form\");\n }\n\n let uploads;\n const cid = isCid(forceCid)\n ? forceCid\n : this.targetComponentID(inputEl.form, targetCtx, opts);\n const refGenerator = (maybePayload) => {\n return this.putRef(\n [\n { el: inputEl, loading: true, lock: true },\n { el: inputEl.form, loading: true, lock: true },\n ],\n phxEvent,\n \"change\",\n { ...opts, payload: maybePayload?.payload },\n );\n };\n let formData;\n const meta = this.extractMeta(inputEl.form, {}, opts.value);\n const serializeOpts = {};\n if (inputEl instanceof HTMLButtonElement) {\n serializeOpts.submitter = inputEl;\n }\n if (inputEl.getAttribute(this.binding(\"change\"))) {\n formData = serializeForm(inputEl.form, serializeOpts, [inputEl.name]);\n } else {\n formData = serializeForm(inputEl.form, serializeOpts);\n }\n if (\n DOM.isUploadInput(inputEl) &&\n inputEl.files &&\n inputEl.files.length > 0\n ) {\n LiveUploader.trackFiles(inputEl, Array.from(inputEl.files));\n }\n uploads = LiveUploader.serializeUploads(inputEl);\n\n const event = {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: {\n // no target was implicitly sent as \"undefined\" in LV <= 1.0.5, therefore\n // we have to keep it. In 1.0.6 we switched from passing meta as URL encoded data\n // to passing it directly in the event, but the JSON encode would drop keys with\n // undefined values.\n _target: opts._target || \"undefined\",\n ...meta,\n },\n uploads: uploads,\n cid: cid,\n };\n this.pushWithReply(refGenerator, \"event\", event)\n .then(({ resp }) => {\n if (DOM.isUploadInput(inputEl) && DOM.isAutoUpload(inputEl)) {\n // the element could be inside a locked parent for other unrelated changes;\n // we can only start uploads when the tree is unlocked and the\n // necessary data attributes are set in the real DOM\n ElementRef.onUnlock(inputEl, () => {\n if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) {\n const [ref, _els] = refGenerator();\n this.undoRefs(ref, phxEvent, [inputEl.form]);\n this.uploadFiles(\n inputEl.form,\n phxEvent,\n targetCtx,\n ref,\n cid,\n (_uploads) => {\n callback && callback(resp);\n this.triggerAwaitingSubmit(inputEl.form, phxEvent);\n this.undoRefs(ref, phxEvent);\n },\n );\n }\n });\n } else {\n callback && callback(resp);\n }\n })\n .catch((error) => logError(\"Failed to push input event\", error));\n }\n\n triggerAwaitingSubmit(formEl, phxEvent) {\n const awaitingSubmit = this.getScheduledSubmit(formEl);\n if (awaitingSubmit) {\n const [_el, _ref, _opts, callback] = awaitingSubmit;\n this.cancelSubmit(formEl, phxEvent);\n callback();\n }\n }\n\n getScheduledSubmit(formEl) {\n return this.formSubmits.find(([el, _ref, _opts, _callback]) =>\n el.isSameNode(formEl),\n );\n }\n\n scheduleSubmit(formEl, ref, opts, callback) {\n if (this.getScheduledSubmit(formEl)) {\n return true;\n }\n this.formSubmits.push([formEl, ref, opts, callback]);\n }\n\n cancelSubmit(formEl, phxEvent) {\n this.formSubmits = this.formSubmits.filter(\n ([el, ref, _opts, _callback]) => {\n if (el.isSameNode(formEl)) {\n this.undoRefs(ref, phxEvent);\n return false;\n } else {\n return true;\n }\n },\n );\n }\n\n disableForm(formEl, phxEvent, opts = {}) {\n const filterIgnored = (el) => {\n const userIgnored = closestPhxBinding(\n el,\n `${this.binding(PHX_UPDATE)}=ignore`,\n el.form,\n );\n return !(\n userIgnored || closestPhxBinding(el, \"data-phx-update=ignore\", el.form)\n );\n };\n const filterDisables = (el) => {\n return el.hasAttribute(this.binding(PHX_DISABLE_WITH));\n };\n const filterButton = (el) => el.tagName == \"BUTTON\";\n\n const filterInput = (el) =>\n [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(el.tagName);\n\n const formElements = Array.from(formEl.elements);\n const disables = formElements.filter(filterDisables);\n const buttons = formElements.filter(filterButton).filter(filterIgnored);\n const inputs = formElements.filter(filterInput).filter(filterIgnored);\n\n buttons.forEach((button) => {\n button.setAttribute(PHX_DISABLED, button.disabled);\n button.disabled = true;\n });\n inputs.forEach((input) => {\n input.setAttribute(PHX_READONLY, input.readOnly);\n input.readOnly = true;\n if (input.files) {\n input.setAttribute(PHX_DISABLED, input.disabled);\n input.disabled = true;\n }\n });\n const formEls = disables\n .concat(buttons)\n .concat(inputs)\n .map((el) => {\n return { el, loading: true, lock: true };\n });\n\n // we reverse the order so form children are already locked by the time\n // the form is locked\n const els = [{ el: formEl, loading: true, lock: false }]\n .concat(formEls)\n .reverse();\n return this.putRef(els, phxEvent, \"submit\", opts);\n }\n\n pushFormSubmit(formEl, targetCtx, phxEvent, submitter, opts, onReply) {\n const refGenerator = (maybePayload) =>\n this.disableForm(formEl, phxEvent, {\n ...opts,\n form: formEl,\n payload: maybePayload?.payload,\n submitter: submitter,\n });\n // store the submitter in the form element in order to trigger it\n // for phx-trigger-action\n DOM.putPrivate(formEl, \"submitter\", submitter);\n const cid = this.targetComponentID(formEl, targetCtx);\n if (LiveUploader.hasUploadsInProgress(formEl)) {\n const [ref, _els] = refGenerator();\n const push = () =>\n this.pushFormSubmit(\n formEl,\n targetCtx,\n phxEvent,\n submitter,\n opts,\n onReply,\n );\n return this.scheduleSubmit(formEl, ref, opts, push);\n } else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {\n const [ref, els] = refGenerator();\n const proxyRefGen = () => [ref, els, opts];\n this.uploadFiles(formEl, phxEvent, targetCtx, ref, cid, (_uploads) => {\n // if we still having pending preflights it means we have invalid entries\n // and the phx-submit cannot be completed\n if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {\n return this.undoRefs(ref, phxEvent);\n }\n const meta = this.extractMeta(formEl, {}, opts.value);\n const formData = serializeForm(formEl, { submitter });\n this.pushWithReply(proxyRefGen, \"event\", {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: meta,\n cid: cid,\n })\n .then(({ resp }) => onReply(resp))\n .catch((error) => logError(\"Failed to push form submit\", error));\n });\n } else if (\n !(\n formEl.hasAttribute(PHX_REF_SRC) &&\n formEl.classList.contains(\"phx-submit-loading\")\n )\n ) {\n const meta = this.extractMeta(formEl, {}, opts.value);\n const formData = serializeForm(formEl, { submitter });\n this.pushWithReply(refGenerator, \"event\", {\n type: \"form\",\n event: phxEvent,\n value: formData,\n meta: meta,\n cid: cid,\n })\n .then(({ resp }) => onReply(resp))\n .catch((error) => logError(\"Failed to push form submit\", error));\n }\n }\n\n uploadFiles(formEl, phxEvent, targetCtx, ref, cid, onComplete) {\n const joinCountAtUpload = this.joinCount;\n const inputEls = LiveUploader.activeFileInputs(formEl);\n let numFileInputsInProgress = inputEls.length;\n\n // get each file input\n inputEls.forEach((inputEl) => {\n const uploader = new LiveUploader(inputEl, this, () => {\n numFileInputsInProgress--;\n if (numFileInputsInProgress === 0) {\n onComplete();\n }\n });\n\n const entries = uploader\n .entries()\n .map((entry) => entry.toPreflightPayload());\n\n if (entries.length === 0) {\n numFileInputsInProgress--;\n return;\n }\n\n const payload = {\n ref: inputEl.getAttribute(PHX_UPLOAD_REF),\n entries: entries,\n cid: this.targetComponentID(inputEl.form, targetCtx),\n };\n\n this.log(\"upload\", () => [\"sending preflight request\", payload]);\n\n this.pushWithReply(null, \"allow_upload\", payload)\n .then(({ resp }) => {\n this.log(\"upload\", () => [\"got preflight response\", resp]);\n // the preflight will reject entries beyond the max entries\n // so we error and cancel entries on the client that are missing from the response\n uploader.entries().forEach((entry) => {\n if (resp.entries && !resp.entries[entry.ref]) {\n this.handleFailedEntryPreflight(\n entry.ref,\n \"failed preflight\",\n uploader,\n );\n }\n });\n // for auto uploads, we may have an empty entries response from the server\n // for form submits that contain invalid entries\n if (resp.error || Object.keys(resp.entries).length === 0) {\n this.undoRefs(ref, phxEvent);\n const errors = resp.error || [];\n errors.map(([entry_ref, reason]) => {\n this.handleFailedEntryPreflight(entry_ref, reason, uploader);\n });\n } else {\n const onError = (callback) => {\n this.channel.onError(() => {\n if (this.joinCount === joinCountAtUpload) {\n callback();\n }\n });\n };\n uploader.initAdapterUpload(resp, onError, this.liveSocket);\n }\n })\n .catch((error) => logError(\"Failed to push upload\", error));\n });\n }\n\n handleFailedEntryPreflight(uploadRef, reason, uploader) {\n if (uploader.isAutoUpload()) {\n // uploadRef may be top level upload config ref or entry ref\n const entry = uploader\n .entries()\n .find((entry) => entry.ref === uploadRef.toString());\n if (entry) {\n entry.cancel();\n }\n } else {\n uploader.entries().map((entry) => entry.cancel());\n }\n this.log(\"upload\", () => [`error for entry ${uploadRef}`, reason]);\n }\n\n dispatchUploads(targetCtx, name, filesOrBlobs) {\n const targetElement = this.targetCtxElement(targetCtx) || this.el;\n const inputs = DOM.findUploadInputs(targetElement).filter(\n (el) => el.name === name,\n );\n if (inputs.length === 0) {\n logError(`no live file inputs found matching the name \"${name}\"`);\n } else if (inputs.length > 1) {\n logError(`duplicate live file inputs found matching the name \"${name}\"`);\n } else {\n DOM.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, {\n detail: { files: filesOrBlobs },\n });\n }\n }\n\n targetCtxElement(targetCtx) {\n if (isCid(targetCtx)) {\n const [target] = DOM.findComponentNodeList(this.id, targetCtx);\n return target;\n } else if (targetCtx) {\n return targetCtx;\n } else {\n return null;\n }\n }\n\n pushFormRecovery(oldForm, newForm, templateDom, callback) {\n // we are only recovering forms inside the current view, therefore it is safe to\n // skip withinOwners here and always use this when referring to the view\n const phxChange = this.binding(\"change\");\n const phxTarget = newForm.getAttribute(this.binding(\"target\")) || newForm;\n const phxEvent =\n newForm.getAttribute(this.binding(PHX_AUTO_RECOVER)) ||\n newForm.getAttribute(this.binding(\"change\"));\n const inputs = Array.from(oldForm.elements).filter(\n (el) => DOM.isFormInput(el) && el.name && !el.hasAttribute(phxChange),\n );\n if (inputs.length === 0) {\n callback();\n return;\n }\n\n // we must clear tracked uploads before recovery as they no longer have valid refs\n inputs.forEach(\n (input) =>\n input.hasAttribute(PHX_UPLOAD_REF) && LiveUploader.clearFiles(input),\n );\n // pushInput assumes that there is a source element that initiated the change;\n // because this is not the case when we recover forms, we provide the first input we find\n const input = inputs.find((el) => el.type !== \"hidden\") || inputs[0];\n\n // in the case that there are multiple targets, we count the number of pending recovery events\n // and only call the callback once all events have been processed\n let pending = 0;\n // withinTargets(phxTarget, callback, dom, viewEl)\n this.withinTargets(\n phxTarget,\n (targetView, targetCtx) => {\n const cid = this.targetComponentID(newForm, targetCtx);\n pending++;\n let e = new CustomEvent(\"phx:form-recovery\", {\n detail: { sourceElement: oldForm },\n });\n JS.exec(e, \"change\", phxEvent, this, input, [\n \"push\",\n {\n _target: input.name,\n targetView,\n targetCtx,\n newCid: cid,\n callback: () => {\n pending--;\n if (pending === 0) {\n callback();\n }\n },\n },\n ]);\n },\n templateDom,\n );\n }\n\n pushLinkPatch(e, href, targetEl, callback) {\n const linkRef = this.liveSocket.setPendingLink(href);\n // only add loading states if event is trusted (it was triggered by user, such as click) and\n // it's not a forward/back navigation from popstate\n const loading = e.isTrusted && e.type !== \"popstate\";\n const refGen = targetEl\n ? () =>\n this.putRef(\n [{ el: targetEl, loading: loading, lock: true }],\n null,\n \"click\",\n )\n : null;\n const fallback = () => this.liveSocket.redirect(window.location.href);\n const url = href.startsWith(\"/\")\n ? `${location.protocol}//${location.host}${href}`\n : href;\n\n this.pushWithReply(refGen, \"live_patch\", { url }).then(\n ({ resp }) => {\n this.liveSocket.requestDOMUpdate(() => {\n if (resp.link_redirect) {\n this.liveSocket.replaceMain(href, null, callback, linkRef);\n } else {\n if (this.liveSocket.commitPendingLink(linkRef)) {\n this.href = href;\n }\n this.applyPendingUpdates();\n callback && callback(linkRef);\n }\n });\n },\n ({ error: _error, timeout: _timeout }) => fallback(),\n );\n }\n\n getFormsForRecovery() {\n // Form recovery is complex in LiveView:\n // We want to support nested LiveViews and also provide a good user experience.\n // Therefore, when the channel rejoins, we copy all forms that are eligible for\n // recovery to be able to access them later.\n // Why do we need to copy them? Because when the main LiveView joins, any forms\n // in nested LiveViews would be lost.\n //\n // We should rework this in the future to serialize the form payload here\n // instead of cloning the DOM nodes, but making this work correctly is tedious,\n // as sending the correct form payload relies on JS.push to extract values\n // from JS commands (phx-change={JS.push(\"event\", value: ..., target: ...)}),\n // as well as view.pushInput, which expects DOM elements.\n\n if (this.joinCount === 0) {\n return {};\n }\n\n const phxChange = this.binding(\"change\");\n\n return DOM.all(this.el, `form[${phxChange}]`)\n .filter((form) => form.id)\n .filter((form) => form.elements.length > 0)\n .filter(\n (form) =>\n form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== \"ignore\",\n )\n .map((form) => {\n // We need to clone the whole form, as relying on form.elements can lead to\n // situations where we have\n //\n // <form><fieldset disabled><input name=\"foo\" value=\"bar\"></fieldset></form>\n //\n // and form.elements returns both the fieldset and the input separately.\n // Because the fieldset is disabled, the input should NOT be sent though.\n // We can only reliably serialize the form by cloning it fully.\n const clonedForm = form.cloneNode(true);\n // we call morphdom to copy any special state\n // like the selected option of a <select> element;\n // any also copy over privates (which contain information about touched fields)\n morphdom(clonedForm, form, {\n onBeforeElUpdated: (fromEl, toEl) => {\n DOM.copyPrivates(fromEl, toEl);\n return true;\n },\n });\n // next up, we also need to clone any elements with form=\"id\" parameter\n const externalElements = document.querySelectorAll(\n `[form=\"${form.id}\"]`,\n );\n Array.from(externalElements).forEach((el) => {\n if (form.contains(el)) {\n return;\n }\n const clonedEl = el.cloneNode(true);\n morphdom(clonedEl, el);\n DOM.copyPrivates(clonedEl, el);\n clonedForm.appendChild(clonedEl);\n });\n return clonedForm;\n })\n .reduce((acc, form) => {\n acc[form.id] = form;\n return acc;\n }, {});\n }\n\n maybePushComponentsDestroyed(destroyedCIDs) {\n let willDestroyCIDs = destroyedCIDs.filter((cid) => {\n return DOM.findComponentNodeList(this.el, cid).length === 0;\n });\n\n const onError = (error) => {\n if (!this.isDestroyed()) {\n logError(\"Failed to push components destroyed\", error);\n }\n };\n\n if (willDestroyCIDs.length > 0) {\n // we must reset the render change tracking for cids that\n // could be added back from the server so we don't skip them\n willDestroyCIDs.forEach((cid) => this.rendered.resetRender(cid));\n\n this.pushWithReply(null, \"cids_will_destroy\", { cids: willDestroyCIDs })\n .then(() => {\n // we must wait for pending transitions to complete before determining\n // if the cids were added back to the DOM in the meantime (#3139)\n this.liveSocket.requestDOMUpdate(() => {\n // See if any of the cids we wanted to destroy were added back,\n // if they were added back, we don't actually destroy them.\n let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => {\n return DOM.findComponentNodeList(this.el, cid).length === 0;\n });\n\n if (completelyDestroyCIDs.length > 0) {\n this.pushWithReply(null, \"cids_destroyed\", {\n cids: completelyDestroyCIDs,\n })\n .then(({ resp }) => {\n this.rendered.pruneCIDs(resp.cids);\n })\n .catch(onError);\n }\n });\n })\n .catch(onError);\n }\n }\n\n ownsElement(el) {\n let parentViewEl = el.closest(PHX_VIEW_SELECTOR);\n return (\n el.getAttribute(PHX_PARENT_ID) === this.id ||\n (parentViewEl && parentViewEl.id === this.id) ||\n (!parentViewEl && this.isDead)\n );\n }\n\n submitForm(form, targetCtx, phxEvent, submitter, opts = {}) {\n DOM.putPrivate(form, PHX_HAS_SUBMITTED, true);\n const inputs = Array.from(form.elements);\n inputs.forEach((input) => DOM.putPrivate(input, PHX_HAS_SUBMITTED, true));\n this.liveSocket.blurActiveElement(this);\n this.pushFormSubmit(form, targetCtx, phxEvent, submitter, opts, () => {\n this.liveSocket.restorePreviouslyActiveFocus();\n });\n }\n\n binding(kind) {\n return this.liveSocket.binding(kind);\n }\n\n // phx-portal\n pushPortalElementId(id) {\n this.portalElementIds.add(id);\n }\n\n dropPortalElementId(id) {\n this.portalElementIds.delete(id);\n }\n\n destroyPortalElements() {\n this.portalElementIds.forEach((id) => {\n const el = document.getElementById(id);\n if (el) {\n el.remove();\n }\n });\n }\n}\n", "import {\n BINDING_PREFIX,\n CONSECUTIVE_RELOADS,\n DEFAULTS,\n FAILSAFE_JITTER,\n LOADER_TIMEOUT,\n DISCONNECTED_TIMEOUT,\n MAX_RELOADS,\n PHX_DEBOUNCE,\n PHX_DROP_TARGET,\n PHX_HAS_FOCUSED,\n PHX_KEY,\n PHX_LINK_STATE,\n PHX_LIVE_LINK,\n PHX_LV_DEBUG,\n PHX_LV_LATENCY_SIM,\n PHX_LV_PROFILE,\n PHX_LV_HISTORY_POSITION,\n PHX_MAIN,\n PHX_PARENT_ID,\n PHX_VIEW_SELECTOR,\n PHX_ROOT_ID,\n PHX_THROTTLE,\n PHX_TRACK_UPLOADS,\n PHX_SESSION,\n RELOAD_JITTER_MIN,\n RELOAD_JITTER_MAX,\n PHX_REF_SRC,\n PHX_RELOAD_STATUS,\n PHX_RUNTIME_HOOK,\n} from \"./constants\";\n\nimport {\n clone,\n closestPhxBinding,\n closure,\n debug,\n maybe,\n logError,\n} from \"./utils\";\n\nimport Browser from \"./browser\";\nimport DOM from \"./dom\";\nimport Hooks from \"./hooks\";\nimport LiveUploader from \"./live_uploader\";\nimport View from \"./view\";\nimport JS from \"./js\";\nimport jsCommands from \"./js_commands\";\n\nexport const isUsedInput = (el) => DOM.isUsedInput(el);\n\nexport default class LiveSocket {\n constructor(url, phxSocket, opts = {}) {\n this.unloaded = false;\n if (!phxSocket || phxSocket.constructor.name === \"Object\") {\n throw new Error(`\n a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:\n\n import {Socket} from \"phoenix\"\n import {LiveSocket} from \"phoenix_live_view\"\n let liveSocket = new LiveSocket(\"/live\", Socket, {...})\n `);\n }\n this.socket = new phxSocket(url, opts);\n this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX;\n this.opts = opts;\n this.params = closure(opts.params || {});\n this.viewLogger = opts.viewLogger;\n this.metadataCallbacks = opts.metadata || {};\n this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {});\n this.prevActive = null;\n this.silenced = false;\n this.main = null;\n this.outgoingMainEl = null;\n this.clickStartedAtTarget = null;\n this.linkRef = 1;\n this.roots = {};\n this.href = window.location.href;\n this.pendingLink = null;\n this.currentLocation = clone(window.location);\n this.hooks = opts.hooks || {};\n this.uploaders = opts.uploaders || {};\n this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT;\n this.disconnectedTimeout = opts.disconnectedTimeout || DISCONNECTED_TIMEOUT;\n /**\n * @type {ReturnType<typeof setTimeout> | null}\n */\n this.reloadWithJitterTimer = null;\n this.maxReloads = opts.maxReloads || MAX_RELOADS;\n this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN;\n this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX;\n this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER;\n this.localStorage = opts.localStorage || window.localStorage;\n this.sessionStorage = opts.sessionStorage || window.sessionStorage;\n this.boundTopLevelEvents = false;\n this.boundEventNames = new Set();\n this.blockPhxChangeWhileComposing =\n opts.blockPhxChangeWhileComposing || false;\n this.serverCloseRef = null;\n this.domCallbacks = Object.assign(\n {\n jsQuerySelectorAll: null,\n onPatchStart: closure(),\n onPatchEnd: closure(),\n onNodeAdded: closure(),\n onBeforeElUpdated: closure(),\n },\n opts.dom || {},\n );\n this.transitions = new TransitionSet();\n this.currentHistoryPosition =\n parseInt(this.sessionStorage.getItem(PHX_LV_HISTORY_POSITION)) || 0;\n window.addEventListener(\"pagehide\", (_e) => {\n this.unloaded = true;\n });\n this.socket.onOpen(() => {\n if (this.isUnloaded()) {\n // reload page if being restored from back/forward cache and browser does not emit \"pageshow\"\n window.location.reload();\n }\n });\n }\n\n // public\n\n version() {\n return LV_VSN;\n }\n\n isProfileEnabled() {\n return this.sessionStorage.getItem(PHX_LV_PROFILE) === \"true\";\n }\n\n isDebugEnabled() {\n return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"true\";\n }\n\n isDebugDisabled() {\n return this.sessionStorage.getItem(PHX_LV_DEBUG) === \"false\";\n }\n\n enableDebug() {\n this.sessionStorage.setItem(PHX_LV_DEBUG, \"true\");\n }\n\n enableProfiling() {\n this.sessionStorage.setItem(PHX_LV_PROFILE, \"true\");\n }\n\n disableDebug() {\n this.sessionStorage.setItem(PHX_LV_DEBUG, \"false\");\n }\n\n disableProfiling() {\n this.sessionStorage.removeItem(PHX_LV_PROFILE);\n }\n\n enableLatencySim(upperBoundMs) {\n this.enableDebug();\n console.log(\n \"latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable\",\n );\n this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs);\n }\n\n disableLatencySim() {\n this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM);\n }\n\n getLatencySim() {\n const str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM);\n return str ? parseInt(str) : null;\n }\n\n getSocket() {\n return this.socket;\n }\n\n connect() {\n // enable debug by default if on localhost and not explicitly disabled\n if (window.location.hostname === \"localhost\" && !this.isDebugDisabled()) {\n this.enableDebug();\n }\n const doConnect = () => {\n this.resetReloadStatus();\n if (this.joinRootViews()) {\n this.bindTopLevelEvents();\n this.socket.connect();\n } else if (this.main) {\n this.socket.connect();\n } else {\n this.bindTopLevelEvents({ dead: true });\n }\n this.joinDeadView();\n };\n if (\n [\"complete\", \"loaded\", \"interactive\"].indexOf(document.readyState) >= 0\n ) {\n doConnect();\n } else {\n document.addEventListener(\"DOMContentLoaded\", () => doConnect());\n }\n }\n\n disconnect(callback) {\n clearTimeout(this.reloadWithJitterTimer);\n // remove the socket close listener to avoid trying to handle\n // a server close event when it is actually caused by us disconnecting\n if (this.serverCloseRef) {\n this.socket.off(this.serverCloseRef);\n this.serverCloseRef = null;\n }\n this.socket.disconnect(callback);\n }\n\n replaceTransport(transport) {\n clearTimeout(this.reloadWithJitterTimer);\n this.socket.replaceTransport(transport);\n this.connect();\n }\n\n execJS(el, encodedJS, eventType = null) {\n const e = new CustomEvent(\"phx:exec\", { detail: { sourceElement: el } });\n this.owner(el, (view) => JS.exec(e, eventType, encodedJS, view, el));\n }\n\n /**\n * Returns an object with methods to manipluate the DOM and execute JavaScript.\n * The applied changes integrate with server DOM patching.\n *\n * @returns {import(\"./js_commands\").LiveSocketJSCommands}\n */\n js() {\n return jsCommands(this, \"js\");\n }\n\n // private\n\n unload() {\n if (this.unloaded) {\n return;\n }\n if (this.main && this.isConnected()) {\n this.log(this.main, \"socket\", () => [\"disconnect for page nav\"]);\n }\n this.unloaded = true;\n this.destroyAllViews();\n this.disconnect();\n }\n\n triggerDOM(kind, args) {\n this.domCallbacks[kind](...args);\n }\n\n time(name, func) {\n if (!this.isProfileEnabled() || !console.time) {\n return func();\n }\n console.time(name);\n const result = func();\n console.timeEnd(name);\n return result;\n }\n\n log(view, kind, msgCallback) {\n if (this.viewLogger) {\n const [msg, obj] = msgCallback();\n this.viewLogger(view, kind, msg, obj);\n } else if (this.isDebugEnabled()) {\n const [msg, obj] = msgCallback();\n debug(view, kind, msg, obj);\n }\n }\n\n requestDOMUpdate(callback) {\n this.transitions.after(callback);\n }\n\n asyncTransition(promise) {\n this.transitions.addAsyncTransition(promise);\n }\n\n transition(time, onStart, onDone = function () {}) {\n this.transitions.addTransition(time, onStart, onDone);\n }\n\n onChannel(channel, event, cb) {\n channel.on(event, (data) => {\n const latency = this.getLatencySim();\n if (!latency) {\n cb(data);\n } else {\n setTimeout(() => cb(data), latency);\n }\n });\n }\n\n reloadWithJitter(view, log) {\n clearTimeout(this.reloadWithJitterTimer);\n this.disconnect();\n const minMs = this.reloadJitterMin;\n const maxMs = this.reloadJitterMax;\n let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;\n const tries = Browser.updateLocal(\n this.localStorage,\n window.location.pathname,\n CONSECUTIVE_RELOADS,\n 0,\n (count) => count + 1,\n );\n if (tries >= this.maxReloads) {\n afterMs = this.failsafeJitter;\n }\n this.reloadWithJitterTimer = setTimeout(() => {\n // if view has recovered, such as transport replaced, then cancel\n if (view.isDestroyed() || view.isConnected()) {\n return;\n }\n view.destroy();\n log\n ? log()\n : this.log(view, \"join\", () => [\n `encountered ${tries} consecutive reloads`,\n ]);\n if (tries >= this.maxReloads) {\n this.log(view, \"join\", () => [\n `exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`,\n ]);\n }\n if (this.hasPendingLink()) {\n window.location = this.pendingLink;\n } else {\n window.location.reload();\n }\n }, afterMs);\n }\n\n getHookDefinition(name) {\n if (!name) {\n return;\n }\n return (\n this.maybeInternalHook(name) ||\n this.hooks[name] ||\n this.maybeRuntimeHook(name)\n );\n }\n\n maybeInternalHook(name) {\n return name && name.startsWith(\"Phoenix.\") && Hooks[name.split(\".\")[1]];\n }\n\n maybeRuntimeHook(name) {\n const runtimeHook = document.querySelector(\n `script[${PHX_RUNTIME_HOOK}=\"${CSS.escape(name)}\"]`,\n );\n if (!runtimeHook) {\n return;\n }\n let callbacks = window[`phx_hook_${name}`];\n if (!callbacks || typeof callbacks !== \"function\") {\n logError(\"a runtime hook must be a function\", runtimeHook);\n return;\n }\n const hookDefiniton = callbacks();\n if (\n hookDefiniton &&\n (typeof hookDefiniton === \"object\" || typeof hookDefiniton === \"function\")\n ) {\n return hookDefiniton;\n }\n logError(\n \"runtime hook must return an object with hook callbacks or an instance of ViewHook\",\n runtimeHook,\n );\n }\n\n isUnloaded() {\n return this.unloaded;\n }\n\n isConnected() {\n return this.socket.isConnected();\n }\n\n getBindingPrefix() {\n return this.bindingPrefix;\n }\n\n binding(kind) {\n return `${this.getBindingPrefix()}${kind}`;\n }\n\n channel(topic, params) {\n return this.socket.channel(topic, params);\n }\n\n joinDeadView() {\n const body = document.body;\n if (\n body &&\n !this.isPhxView(body) &&\n !this.isPhxView(document.firstElementChild)\n ) {\n const view = this.newRootView(body);\n view.setHref(this.getHref());\n view.joinDead();\n if (!this.main) {\n this.main = view;\n }\n window.requestAnimationFrame(() => {\n view.execNewMounted();\n // restore scroll position when navigating from an external / non-live page\n this.maybeScroll(history.state?.scroll);\n });\n }\n }\n\n joinRootViews() {\n let rootsFound = false;\n DOM.all(\n document,\n `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`,\n (rootEl) => {\n if (!this.getRootById(rootEl.id)) {\n const view = this.newRootView(rootEl);\n // stickies cannot be mounted at the router and therefore should not\n // get a href set on them\n if (!DOM.isPhxSticky(rootEl)) {\n view.setHref(this.getHref());\n }\n view.join();\n if (rootEl.hasAttribute(PHX_MAIN)) {\n this.main = view;\n }\n }\n rootsFound = true;\n },\n );\n return rootsFound;\n }\n\n redirect(to, flash, reloadToken) {\n if (reloadToken) {\n Browser.setCookie(PHX_RELOAD_STATUS, reloadToken, 60);\n }\n this.unload();\n Browser.redirect(to, flash);\n }\n\n replaceMain(\n href,\n flash,\n callback = null,\n linkRef = this.setPendingLink(href),\n ) {\n const liveReferer = this.currentLocation.href;\n this.outgoingMainEl = this.outgoingMainEl || this.main.el;\n\n const stickies = DOM.findPhxSticky(document) || [];\n const removeEls = DOM.all(\n this.outgoingMainEl,\n `[${this.binding(\"remove\")}]`,\n ).filter((el) => !DOM.isChildOfAny(el, stickies));\n\n const newMainEl = DOM.cloneNode(this.outgoingMainEl, \"\");\n this.main.showLoader(this.loaderTimeout);\n this.main.destroy();\n\n this.main = this.newRootView(newMainEl, flash, liveReferer);\n this.main.setRedirect(href);\n this.transitionRemoves(removeEls);\n this.main.join((joinCount, onDone) => {\n if (joinCount === 1 && this.commitPendingLink(linkRef)) {\n this.requestDOMUpdate(() => {\n // remove phx-remove els right before we replace the main element\n removeEls.forEach((el) => el.remove());\n stickies.forEach((el) => newMainEl.appendChild(el));\n this.outgoingMainEl.replaceWith(newMainEl);\n this.outgoingMainEl = null;\n callback && callback(linkRef);\n onDone();\n });\n }\n });\n }\n\n transitionRemoves(elements, callback) {\n const removeAttr = this.binding(\"remove\");\n const silenceEvents = (e) => {\n e.preventDefault();\n e.stopImmediatePropagation();\n };\n elements.forEach((el) => {\n // prevent all listeners we care about from bubbling to window\n // since we are removing the element\n for (const event of this.boundEventNames) {\n el.addEventListener(event, silenceEvents, true);\n }\n this.execJS(el, el.getAttribute(removeAttr), \"remove\");\n });\n // remove the silenced listeners when transitions are done incase the element is re-used\n // and call caller's callback as soon as we are done with transitions\n this.requestDOMUpdate(() => {\n elements.forEach((el) => {\n for (const event of this.boundEventNames) {\n el.removeEventListener(event, silenceEvents, true);\n }\n });\n callback && callback();\n });\n }\n\n isPhxView(el) {\n return el.getAttribute && el.getAttribute(PHX_SESSION) !== null;\n }\n\n newRootView(el, flash, liveReferer) {\n const view = new View(el, this, null, flash, liveReferer);\n this.roots[view.id] = view;\n return view;\n }\n\n owner(childEl, callback) {\n let view;\n const viewEl = DOM.closestViewEl(childEl);\n if (viewEl) {\n // it can happen that we find a view that is already destroyed;\n // in that case we DO NOT want to fallback to the main element\n view = this.getViewByEl(viewEl);\n } else {\n view = this.main;\n }\n return view && callback ? callback(view) : view;\n }\n\n withinOwners(childEl, callback) {\n this.owner(childEl, (view) => callback(view, childEl));\n }\n\n getViewByEl(el) {\n const rootId = el.getAttribute(PHX_ROOT_ID);\n return maybe(this.getRootById(rootId), (root) =>\n root.getDescendentByEl(el),\n );\n }\n\n getRootById(id) {\n return this.roots[id];\n }\n\n destroyAllViews() {\n for (const id in this.roots) {\n this.roots[id].destroy();\n delete this.roots[id];\n }\n this.main = null;\n }\n\n destroyViewByEl(el) {\n const root = this.getRootById(el.getAttribute(PHX_ROOT_ID));\n if (root && root.id === el.id) {\n root.destroy();\n delete this.roots[root.id];\n } else if (root) {\n root.destroyDescendent(el.id);\n }\n }\n\n getActiveElement() {\n return document.activeElement;\n }\n\n dropActiveElement(view) {\n if (this.prevActive && view.ownsElement(this.prevActive)) {\n this.prevActive = null;\n }\n }\n\n restorePreviouslyActiveFocus() {\n if (\n this.prevActive &&\n this.prevActive !== document.body &&\n this.prevActive instanceof HTMLElement\n ) {\n this.prevActive.focus();\n }\n }\n\n blurActiveElement() {\n this.prevActive = this.getActiveElement();\n if (\n this.prevActive !== document.body &&\n this.prevActive instanceof HTMLElement\n ) {\n this.prevActive.blur();\n }\n }\n\n /**\n * @param {{dead?: boolean}} [options={}]\n */\n bindTopLevelEvents({ dead } = {}) {\n if (this.boundTopLevelEvents) {\n return;\n }\n\n this.boundTopLevelEvents = true;\n // enter failsafe reload if server has gone away intentionally, such as \"disconnect\" broadcast\n this.serverCloseRef = this.socket.onClose((event) => {\n // failsafe reload if normal closure and we still have a main LV\n if (event && event.code === 1000 && this.main) {\n return this.reloadWithJitter(this.main);\n }\n });\n document.body.addEventListener(\"click\", function () {}); // ensure all click events bubble for mobile Safari\n window.addEventListener(\n \"pageshow\",\n (e) => {\n if (e.persisted) {\n // reload page if being restored from back/forward cache\n this.getSocket().disconnect();\n this.withPageLoading({ to: window.location.href, kind: \"redirect\" });\n window.location.reload();\n }\n },\n true,\n );\n if (!dead) {\n this.bindNav();\n }\n this.bindClicks();\n if (!dead) {\n this.bindForms();\n }\n this.bind(\n { keyup: \"keyup\", keydown: \"keydown\" },\n (e, type, view, targetEl, phxEvent, _phxTarget) => {\n const matchKey = targetEl.getAttribute(this.binding(PHX_KEY));\n const pressedKey = e.key && e.key.toLowerCase(); // chrome clicked autocompletes send a keydown without key\n if (matchKey && matchKey.toLowerCase() !== pressedKey) {\n return;\n }\n\n const data = { key: e.key, ...this.eventMeta(type, e, targetEl) };\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n },\n );\n this.bind(\n { blur: \"focusout\", focus: \"focusin\" },\n (e, type, view, targetEl, phxEvent, phxTarget) => {\n if (!phxTarget) {\n const data = { key: e.key, ...this.eventMeta(type, e, targetEl) };\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n }\n },\n );\n this.bind(\n { blur: \"blur\", focus: \"focus\" },\n (e, type, view, targetEl, phxEvent, phxTarget) => {\n // blur and focus are triggered on document and window. Discard one to avoid dups\n if (phxTarget === \"window\") {\n const data = this.eventMeta(type, e, targetEl);\n JS.exec(e, type, phxEvent, view, targetEl, [\"push\", { data }]);\n }\n },\n );\n this.on(\"dragover\", (e) => e.preventDefault());\n this.on(\"drop\", (e) => {\n e.preventDefault();\n const dropTargetId = maybe(\n closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)),\n (trueTarget) => {\n return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET));\n },\n );\n const dropTarget = dropTargetId && document.getElementById(dropTargetId);\n const files = Array.from(e.dataTransfer.files || []);\n if (\n !dropTarget ||\n !(dropTarget instanceof HTMLInputElement) ||\n dropTarget.disabled ||\n files.length === 0 ||\n !(dropTarget.files instanceof FileList)\n ) {\n return;\n }\n\n LiveUploader.trackFiles(dropTarget, files, e.dataTransfer);\n dropTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n });\n this.on(PHX_TRACK_UPLOADS, (e) => {\n const uploadTarget = e.target;\n if (!DOM.isUploadInput(uploadTarget)) {\n return;\n }\n const files = Array.from(e.detail.files || []).filter(\n (f) => f instanceof File || f instanceof Blob,\n );\n LiveUploader.trackFiles(uploadTarget, files);\n uploadTarget.dispatchEvent(new Event(\"input\", { bubbles: true }));\n });\n }\n\n eventMeta(eventName, e, targetEl) {\n const callback = this.metadataCallbacks[eventName];\n return callback ? callback(e, targetEl) : {};\n }\n\n setPendingLink(href) {\n this.linkRef++;\n this.pendingLink = href;\n this.resetReloadStatus();\n return this.linkRef;\n }\n\n // anytime we are navigating or connecting, drop reload cookie in case\n // we issue the cookie but the next request was interrupted and the server never dropped it\n resetReloadStatus() {\n Browser.deleteCookie(PHX_RELOAD_STATUS);\n }\n\n commitPendingLink(linkRef) {\n if (this.linkRef !== linkRef) {\n return false;\n } else {\n this.href = this.pendingLink;\n this.pendingLink = null;\n return true;\n }\n }\n\n getHref() {\n return this.href;\n }\n\n hasPendingLink() {\n return !!this.pendingLink;\n }\n\n bind(events, callback) {\n for (const event in events) {\n const browserEventName = events[event];\n\n this.on(browserEventName, (e) => {\n const binding = this.binding(event);\n const windowBinding = this.binding(`window-${event}`);\n const targetPhxEvent =\n e.target.getAttribute && e.target.getAttribute(binding);\n if (targetPhxEvent) {\n this.debounce(e.target, e, browserEventName, () => {\n this.withinOwners(e.target, (view) => {\n callback(e, event, view, e.target, targetPhxEvent, null);\n });\n });\n } else {\n DOM.all(document, `[${windowBinding}]`, (el) => {\n const phxEvent = el.getAttribute(windowBinding);\n this.debounce(el, e, browserEventName, () => {\n this.withinOwners(el, (view) => {\n callback(e, event, view, el, phxEvent, \"window\");\n });\n });\n });\n }\n });\n }\n }\n\n bindClicks() {\n this.on(\"mousedown\", (e) => (this.clickStartedAtTarget = e.target));\n this.bindClick(\"click\", \"click\");\n }\n\n bindClick(eventName, bindingName) {\n const click = this.binding(bindingName);\n window.addEventListener(\n eventName,\n (e) => {\n let target = null;\n // a synthetic click event (detail 0) will not have caused a mousedown event,\n // therefore the clickStartedAtTarget is stale\n if (e.detail === 0) this.clickStartedAtTarget = e.target;\n const clickStartedAtTarget = this.clickStartedAtTarget || e.target;\n // when searching the target for the click event, we always want to\n // use the actual event target, see #3372\n target = closestPhxBinding(e.target, click);\n this.dispatchClickAway(e, clickStartedAtTarget);\n this.clickStartedAtTarget = null;\n const phxEvent = target && target.getAttribute(click);\n if (!phxEvent) {\n if (DOM.isNewPageClick(e, window.location)) {\n this.unload();\n }\n return;\n }\n\n if (target.getAttribute(\"href\") === \"#\") {\n e.preventDefault();\n }\n\n // noop if we are in the middle of awaiting an ack for this el already\n if (target.hasAttribute(PHX_REF_SRC)) {\n return;\n }\n\n this.debounce(target, e, \"click\", () => {\n this.withinOwners(target, (view) => {\n JS.exec(e, \"click\", phxEvent, view, target, [\n \"push\",\n { data: this.eventMeta(\"click\", e, target) },\n ]);\n });\n });\n },\n false,\n );\n }\n\n dispatchClickAway(e, clickStartedAt) {\n const phxClickAway = this.binding(\"click-away\");\n DOM.all(document, `[${phxClickAway}]`, (el) => {\n if (!(el.isSameNode(clickStartedAt) || el.contains(clickStartedAt))) {\n this.withinOwners(el, (view) => {\n const phxEvent = el.getAttribute(phxClickAway);\n if (JS.isVisible(el) && JS.isInViewport(el)) {\n JS.exec(e, \"click\", phxEvent, view, el, [\n \"push\",\n { data: this.eventMeta(\"click\", e, e.target) },\n ]);\n }\n });\n }\n });\n }\n\n bindNav() {\n if (!Browser.canPushState()) {\n return;\n }\n if (history.scrollRestoration) {\n history.scrollRestoration = \"manual\";\n }\n let scrollTimer = null;\n window.addEventListener(\"scroll\", (_e) => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(() => {\n Browser.updateCurrentState((state) =>\n Object.assign(state, { scroll: window.scrollY }),\n );\n }, 100);\n });\n window.addEventListener(\n \"popstate\",\n (event) => {\n if (!this.registerNewLocation(window.location)) {\n return;\n }\n const { type, backType, id, scroll, position } = event.state || {};\n const href = window.location.href;\n\n // Compare positions to determine direction\n const isForward = position > this.currentHistoryPosition;\n const navType = isForward ? type : backType || type;\n\n // Update current position\n this.currentHistoryPosition = position || 0;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: {\n href,\n patch: navType === \"patch\",\n pop: true,\n direction: isForward ? \"forward\" : \"backward\",\n },\n });\n this.requestDOMUpdate(() => {\n const callback = () => {\n this.maybeScroll(scroll);\n };\n if (\n this.main.isConnected() &&\n navType === \"patch\" &&\n id === this.main.id\n ) {\n this.main.pushLinkPatch(event, href, null, callback);\n } else {\n this.replaceMain(href, null, callback);\n }\n });\n },\n false,\n );\n window.addEventListener(\n \"click\",\n (e) => {\n const target = closestPhxBinding(e.target, PHX_LIVE_LINK);\n const type = target && target.getAttribute(PHX_LIVE_LINK);\n if (!type || !this.isConnected() || !this.main || DOM.wantsNewTab(e)) {\n return;\n }\n\n // When wrapping an SVG element in an anchor tag, the href can be an SVGAnimatedString\n const href =\n target.href instanceof SVGAnimatedString\n ? target.href.baseVal\n : target.href;\n\n const linkState = target.getAttribute(PHX_LINK_STATE);\n e.preventDefault();\n e.stopImmediatePropagation(); // do not bubble click to regular phx-click bindings\n if (this.pendingLink === href) {\n return;\n }\n\n this.requestDOMUpdate(() => {\n if (type === \"patch\") {\n this.pushHistoryPatch(e, href, linkState, target);\n } else if (type === \"redirect\") {\n this.historyRedirect(e, href, linkState, null, target);\n } else {\n throw new Error(\n `expected ${PHX_LIVE_LINK} to be \"patch\" or \"redirect\", got: ${type}`,\n );\n }\n const phxClick = target.getAttribute(this.binding(\"click\"));\n if (phxClick) {\n this.requestDOMUpdate(() => this.execJS(target, phxClick, \"click\"));\n }\n });\n },\n false,\n );\n }\n\n maybeScroll(scroll) {\n if (typeof scroll === \"number\") {\n requestAnimationFrame(() => {\n window.scrollTo(0, scroll);\n }); // the body needs to render before we scroll.\n }\n }\n\n dispatchEvent(event, payload = {}) {\n DOM.dispatchEvent(window, `phx:${event}`, { detail: payload });\n }\n\n dispatchEvents(events) {\n events.forEach(([event, payload]) => this.dispatchEvent(event, payload));\n }\n\n withPageLoading(info, callback) {\n DOM.dispatchEvent(window, \"phx:page-loading-start\", { detail: info });\n const done = () =>\n DOM.dispatchEvent(window, \"phx:page-loading-stop\", { detail: info });\n return callback ? callback(done) : done;\n }\n\n pushHistoryPatch(e, href, linkState, targetEl) {\n if (!this.isConnected() || !this.main.isMain()) {\n return Browser.redirect(href);\n }\n\n this.withPageLoading({ to: href, kind: \"patch\" }, (done) => {\n this.main.pushLinkPatch(e, href, targetEl, (linkRef) => {\n this.historyPatch(href, linkState, linkRef);\n done();\n });\n });\n }\n\n historyPatch(href, linkState, linkRef = this.setPendingLink(href)) {\n if (!this.commitPendingLink(linkRef)) {\n return;\n }\n\n // Increment position for new state\n this.currentHistoryPosition++;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n // store the type for back navigation\n Browser.updateCurrentState((state) => ({ ...state, backType: \"patch\" }));\n\n Browser.pushState(\n linkState,\n {\n type: \"patch\",\n id: this.main.id,\n position: this.currentHistoryPosition,\n },\n href,\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: { patch: true, href, pop: false, direction: \"forward\" },\n });\n this.registerNewLocation(window.location);\n }\n\n historyRedirect(e, href, linkState, flash, targetEl) {\n const clickLoading = targetEl && e.isTrusted && e.type !== \"popstate\";\n if (clickLoading) {\n targetEl.classList.add(\"phx-click-loading\");\n }\n if (!this.isConnected() || !this.main.isMain()) {\n return Browser.redirect(href, flash);\n }\n\n // convert to full href if only path prefix\n if (/^\\/$|^\\/[^\\/]+.*$/.test(href)) {\n const { protocol, host } = window.location;\n href = `${protocol}//${host}${href}`;\n }\n const scroll = window.scrollY;\n this.withPageLoading({ to: href, kind: \"redirect\" }, (done) => {\n this.replaceMain(href, flash, (linkRef) => {\n if (linkRef === this.linkRef) {\n // Increment position for new state\n this.currentHistoryPosition++;\n this.sessionStorage.setItem(\n PHX_LV_HISTORY_POSITION,\n this.currentHistoryPosition.toString(),\n );\n\n // store the type for back navigation\n Browser.updateCurrentState((state) => ({\n ...state,\n backType: \"redirect\",\n }));\n\n Browser.pushState(\n linkState,\n {\n type: \"redirect\",\n id: this.main.id,\n scroll: scroll,\n position: this.currentHistoryPosition,\n },\n href,\n );\n\n DOM.dispatchEvent(window, \"phx:navigate\", {\n detail: { href, patch: false, pop: false, direction: \"forward\" },\n });\n this.registerNewLocation(window.location);\n }\n // explicitly undo click-loading class\n // (in case it originated in a sticky live view, otherwise it would be removed anyway)\n if (clickLoading) {\n targetEl.classList.remove(\"phx-click-loading\");\n }\n done();\n });\n });\n }\n\n registerNewLocation(newLocation) {\n const { pathname, search } = this.currentLocation;\n if (pathname + search === newLocation.pathname + newLocation.search) {\n return false;\n } else {\n this.currentLocation = clone(newLocation);\n return true;\n }\n }\n\n bindForms() {\n let iterations = 0;\n let externalFormSubmitted = false;\n\n // disable forms on submit that track phx-change but perform external submit\n this.on(\"submit\", (e) => {\n const phxSubmit = e.target.getAttribute(this.binding(\"submit\"));\n const phxChange = e.target.getAttribute(this.binding(\"change\"));\n if (!externalFormSubmitted && phxChange && !phxSubmit) {\n externalFormSubmitted = true;\n e.preventDefault();\n this.withinOwners(e.target, (view) => {\n view.disableForm(e.target);\n // safari needs next tick\n window.requestAnimationFrame(() => {\n if (DOM.isUnloadableFormSubmit(e)) {\n this.unload();\n }\n e.target.submit();\n });\n });\n }\n });\n\n this.on(\"submit\", (e) => {\n const phxEvent = e.target.getAttribute(this.binding(\"submit\"));\n if (!phxEvent) {\n if (DOM.isUnloadableFormSubmit(e)) {\n this.unload();\n }\n return;\n }\n e.preventDefault();\n e.target.disabled = true;\n this.withinOwners(e.target, (view) => {\n JS.exec(e, \"submit\", phxEvent, view, e.target, [\n \"push\",\n { submitter: e.submitter },\n ]);\n });\n });\n\n for (const type of [\"change\", \"input\"]) {\n this.on(type, (e) => {\n if (\n e instanceof CustomEvent &&\n (e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLSelectElement ||\n e.target instanceof HTMLTextAreaElement) &&\n e.target.form === undefined\n ) {\n // throw on invalid JS.dispatch target and noop if CustomEvent triggered outside JS.dispatch\n if (e.detail && e.detail.dispatcher) {\n throw new Error(\n `dispatching a custom ${type} event is only supported on input elements inside a form`,\n );\n }\n return;\n }\n const phxChange = this.binding(\"change\");\n const input = e.target;\n if (this.blockPhxChangeWhileComposing && e.isComposing) {\n const key = `composition-listener-${type}`;\n if (!DOM.private(input, key)) {\n DOM.putPrivate(input, key, true);\n input.addEventListener(\n \"compositionend\",\n () => {\n // trigger a new input/change event\n input.dispatchEvent(new Event(type, { bubbles: true }));\n DOM.deletePrivate(input, key);\n },\n { once: true },\n );\n }\n return;\n }\n const inputEvent = input.getAttribute(phxChange);\n const formEvent = input.form && input.form.getAttribute(phxChange);\n const phxEvent = inputEvent || formEvent;\n if (!phxEvent) {\n return;\n }\n if (\n input.type === \"number\" &&\n input.validity &&\n input.validity.badInput\n ) {\n return;\n }\n\n const dispatcher = inputEvent ? input : input.form;\n const currentIterations = iterations;\n iterations++;\n const { at: at, type: lastType } =\n DOM.private(input, \"prev-iteration\") || {};\n // Browsers should always fire at least one \"input\" event before every \"change\"\n // Ignore \"change\" events, unless there was no prior \"input\" event.\n // This could happen if user code triggers a \"change\" event, or if the browser is non-conforming.\n if (\n at === currentIterations - 1 &&\n type === \"change\" &&\n lastType === \"input\"\n ) {\n return;\n }\n\n DOM.putPrivate(input, \"prev-iteration\", {\n at: currentIterations,\n type: type,\n });\n\n this.debounce(input, e, type, () => {\n this.withinOwners(dispatcher, (view) => {\n DOM.putPrivate(input, PHX_HAS_FOCUSED, true);\n JS.exec(e, \"change\", phxEvent, view, input, [\n \"push\",\n { _target: e.target.name, dispatcher: dispatcher },\n ]);\n });\n });\n });\n }\n this.on(\"reset\", (e) => {\n const form = e.target;\n DOM.resetForm(form);\n const input = Array.from(form.elements).find((el) => el.type === \"reset\");\n if (input) {\n // wait until next tick to get updated input value\n window.requestAnimationFrame(() => {\n input.dispatchEvent(\n new Event(\"input\", { bubbles: true, cancelable: false }),\n );\n });\n }\n });\n }\n\n debounce(el, event, eventType, callback) {\n if (eventType === \"blur\" || eventType === \"focusout\") {\n return callback();\n }\n\n const phxDebounce = this.binding(PHX_DEBOUNCE);\n const phxThrottle = this.binding(PHX_THROTTLE);\n const defaultDebounce = this.defaults.debounce.toString();\n const defaultThrottle = this.defaults.throttle.toString();\n\n this.withinOwners(el, (view) => {\n const asyncFilter = () =>\n !view.isDestroyed() && document.body.contains(el);\n DOM.debounce(\n el,\n event,\n phxDebounce,\n defaultDebounce,\n phxThrottle,\n defaultThrottle,\n asyncFilter,\n () => {\n callback();\n },\n );\n });\n }\n\n silenceEvents(callback) {\n this.silenced = true;\n callback();\n this.silenced = false;\n }\n\n on(event, callback) {\n this.boundEventNames.add(event);\n window.addEventListener(event, (e) => {\n if (!this.silenced) {\n callback(e);\n }\n });\n }\n\n jsQuerySelectorAll(sourceEl, query, defaultQuery) {\n const all = this.domCallbacks.jsQuerySelectorAll;\n return all ? all(sourceEl, query, defaultQuery) : defaultQuery();\n }\n}\n\nclass TransitionSet {\n constructor() {\n this.transitions = new Set();\n this.promises = new Set();\n this.pendingOps = [];\n }\n\n reset() {\n this.transitions.forEach((timer) => {\n clearTimeout(timer);\n this.transitions.delete(timer);\n });\n this.promises.clear();\n this.flushPendingOps();\n }\n\n after(callback) {\n if (this.size() === 0) {\n callback();\n } else {\n this.pushPendingOp(callback);\n }\n }\n\n addTransition(time, onStart, onDone) {\n onStart();\n const timer = setTimeout(() => {\n this.transitions.delete(timer);\n onDone();\n this.flushPendingOps();\n }, time);\n this.transitions.add(timer);\n }\n\n addAsyncTransition(promise) {\n this.promises.add(promise);\n promise.then(() => {\n this.promises.delete(promise);\n this.flushPendingOps();\n });\n }\n\n pushPendingOp(op) {\n this.pendingOps.push(op);\n }\n\n size() {\n return this.transitions.size + this.promises.size;\n }\n\n flushPendingOps() {\n if (this.size() > 0) {\n return;\n }\n const op = this.pendingOps.shift();\n if (op) {\n op();\n this.flushPendingOps();\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["LiveSocket", "doc", "isEmpty", "file", "morphAttrs", "morphdom", "childrenOnly", "targetContainer", "clone", "el", "inputsUnused", "onlyHiddenInputs", "lock", "el", "loading", "entry", "input", "LiveSocket"]
7
7
  }