{ "version": 3, "sources": ["../../../../vendor/javascript/html-parsed-element.js", "../../javascripts/web-ui/elements/local-time.js", "../../javascripts/web-ui/elements/persistent-scroll.js"], "sourcesContent": ["/*! (c) Andrea Giammarchi - ISC */\nconst HTMLParsedElement = (() => {\n const DCL = 'DOMContentLoaded';\n const init = new WeakMap;\n const queue = [];\n const isParsed = el => {\n do {\n if (el.nextSibling)\n return true;\n } while (el = el.parentNode);\n return false;\n };\n const upgrade = () => {\n queue.splice(0).forEach(info => {\n if (init.get(info[0]) !== true) {\n init.set(info[0], true);\n info[0][info[1]]();\n }\n });\n };\n document.addEventListener(DCL, upgrade);\n class HTMLParsedElement extends HTMLElement {\n static withParsedCallback(Class, name = 'parsed') {\n const {prototype} = Class;\n const {connectedCallback} = prototype;\n const method = name + 'Callback';\n const cleanUp = (el, observer, ownerDocument, onDCL) => {\n observer.disconnect();\n ownerDocument.removeEventListener(DCL, onDCL);\n parsedCallback(el);\n };\n const parsedCallback = el => {\n if (!queue.length)\n requestAnimationFrame(upgrade);\n queue.push([el, method]);\n };\n Object.defineProperties(\n prototype,\n {\n connectedCallback: {\n configurable: true,\n writable: true,\n value() {\n if (connectedCallback)\n connectedCallback.apply(this, arguments);\n if (method in this && !init.has(this)) {\n const self = this;\n const {ownerDocument} = self;\n init.set(self, false);\n if (ownerDocument.readyState === 'complete' || isParsed(self))\n parsedCallback(self);\n else {\n const onDCL = () => cleanUp(self, observer, ownerDocument, onDCL);\n ownerDocument.addEventListener(DCL, onDCL);\n const observer = new MutationObserver(() => {\n /* istanbul ignore else */\n if (isParsed(self))\n cleanUp(self, observer, ownerDocument, onDCL);\n });\n observer.observe(self.parentNode, {childList: true, subtree: true});\n }\n }\n }\n },\n [name]: {\n configurable: true,\n get() {\n return init.get(this) === true;\n }\n }\n }\n );\n return Class;\n }\n }\n return HTMLParsedElement.withParsedCallback(HTMLParsedElement);\n})();\nexport default HTMLParsedElement;;\n", "import HTMLParsedElement from \"html-parsed-element\"\n\nconst weekdays = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n]\n\nconst months = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n]\n\nfunction pad(num, flag) {\n return flag ? num : `0${num}`.slice(-2)\n}\n\nfunction strftime(time, directiveFormat) {\n const day = time.getDay()\n const date = time.getDate()\n const month = time.getMonth()\n const year = time.getFullYear()\n const hour = time.getHours()\n const minute = time.getMinutes()\n const second = time.getSeconds()\n\n const directiveCaptures = /%(-?)([%aAbBcdeHIlmMpPSwyYZ])/g\n\n const directiveReplacements = (_match, flag, modifier) =>\n ({\n \"%\": () => \"%\",\n a: () => weekdays[day].slice(0, 3),\n A: () => weekdays[day],\n b: () => months[month].slice(0, 3),\n B: () => months[month],\n c: () => time.toString(),\n d: () => pad(date, flag),\n e: () => String(date),\n H: () => pad(hour, flag),\n I: () => pad(strftime(time, \"%l\")),\n l: () =>\n hour === 0 || hour === 12 ? String(12) : String((hour + 12) % 12),\n m: () => pad(month + 1, flag),\n M: () => pad(minute, flag),\n p: () => (hour > 11 ? \"PM\" : \"AM\"),\n P: () => (hour > 11 ? \"pm\" : \"am\"),\n S: () => pad(second),\n w: () => String(day),\n y: () => pad(year % 100, flag),\n Y: () => String(year),\n undefined: () => \"\",\n }[modifier]())\n\n return directiveFormat.replace(directiveCaptures, directiveReplacements)\n}\n\nclass LocalTimeElement extends HTMLParsedElement {\n static get observedAttributes() {\n return [\"datetime\", \"format\"]\n }\n\n parsed = false\n date = null\n\n attributeChangedCallback(attrName, _oldValue, newValue) {\n if (attrName === \"datetime\") {\n const millis = Date.parse(newValue)\n\n isNaN(millis)\n ? this.date = null\n : this.date = new Date(millis)\n }\n\n if (this.parsed) {\n this.updateDate()\n }\n }\n\n parsedCallback() {\n this.parsed = true\n this.updateDate()\n }\n\n updateDate() {\n const text = this.getFormattedDate()\n\n if (text) {\n const node = this.children[0]\n node.textContent = text\n }\n }\n\n getFormattedDate() {\n const date = this.date\n\n if (!date) return\n\n const format = this.getAttribute(\"format\")\n const formattedDatetime = strftime(date, format)\n\n return formattedDatetime\n }\n}\n\nif (!window.customElements.get(\"local-time\")) {\n window.LocalTimeElement = LocalTimeElement\n window.customElements.define(\"local-time\", LocalTimeElement)\n}\n", "import HTMLParsedElement from \"html-parsed-element\"\n\nconst DEFAULT_ANCHOR_TOLERANCE = 1\n\nclass PersistentScroll extends HTMLParsedElement {\n parsedCallback() {\n this.restoreScrollPosition(this)\n\n this.addEventListener(\"scroll\", () => {\n this.saveScrollPosition(this)\n })\n }\n\n saveScrollPosition() {\n const key = this.getStorageKey()\n\n let scrollPosition = this.scrollTop\n let anchorPosition\n let anchored = false\n\n console.log({\n tolerance: this.anchorTolerance\n })\n\n if (this.anchor === \"bottom\") {\n anchorPosition = this.scrollHeight - this.clientHeight\n anchorPosition -= this.anchorTolerance\n\n console.log({\n scrollPosition: scrollPosition, anchorPosition: anchorPosition\n })\n\n if (scrollPosition >= anchorPosition) {\n anchored = true\n }\n } else {\n anchorPosition = 0\n anchorPosition += this.anchorTolerance\n\n if (scrollPosition <= anchorPosition) {\n anchored = true\n }\n }\n\n if (anchored) {\n sessionStorage.removeItem(key)\n return\n }\n\n sessionStorage.setItem(key, scrollPosition)\n }\n\n restoreScrollPosition() {\n const key = this.getStorageKey()\n const scrollPosition = sessionStorage.getItem(key)\n\n if (scrollPosition != null) {\n if (this.scrollTop != scrollPosition) {\n this.setAttribute(\"scroll-position-restored\", scrollPosition)\n this.scrollTo(0, scrollPosition)\n }\n } else {\n if (this.anchor === \"bottom\") {\n let bottomPosition = this.scrollHeight - this.clientHeight\n\n this.scrollTo(0, bottomPosition)\n }\n }\n }\n\n getStorageKey() {\n let key = this.getAttribute(\"key\")\n key ||= this.id\n\n if (!key) {\n throw new Error(\"persistent-scroll requires a key or id attribute\")\n }\n\n return `persistent-scroll:${key}`\n }\n\n get anchor() {\n return this.getAttribute(\"anchor\")\n }\n\n get anchorTolerance() {\n let tolerance = this.getAttribute(\"anchor-tolerance\")\n\n if (tolerance == null) {\n return DEFAULT_ANCHOR_TOLERANCE\n }\n\n return parseInt(tolerance, 10)\n }\n}\n\n// This happens synchronously after turbo does its rendering, which is necessary\n// to prevent a flash of the initial scroll position. The web component uses\n// requestAnimationFrame to invoke the parsedCallback, which sometimes causes a\n// delay in restoring the scroll position. - Aaron, Thu Jun 27 2024\nwindow.addEventListener(\"turbo:render\", () => {\n const elements = document.querySelectorAll(\"persistent-scroll\")\n\n for (const element of elements) {\n element.restoreScrollPosition()\n }\n})\n\nif (!window.customElements.get(\"persistent-scroll\")) {\n window.PersistentScroll = PersistentScroll\n window.customElements.define(\"persistent-scroll\", PersistentScroll)\n}\n"], "mappings": "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", "names": ["HTMLParsedElement", "DCL", "init", "queue", "isParsed", "el", "upgrade", "info", "Class", "name", "prototype", "connectedCallback", "method", "cleanUp", "observer", "ownerDocument", "onDCL", "parsedCallback", "self", "html_parsed_element_default", "weekdays", "months", "pad", "num", "flag", "strftime", "time", "directiveFormat", "day", "date", "month", "year", "hour", "minute", "second", "directiveCaptures", "directiveReplacements", "_match", "modifier", "LocalTimeElement", "html_parsed_element_default", "attrName", "_oldValue", "newValue", "millis", "text", "node", "format", "DEFAULT_ANCHOR_TOLERANCE", "PersistentScroll", "html_parsed_element_default", "key", "scrollPosition", "anchorPosition", "anchored", "bottomPosition", "tolerance", "elements", "element"] }