{ "version": 3, "sources": ["../../../utils/better_ui_.ts", "../../../utils/utils.ts"], "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nconst d = document;\n\ntype EventHandler = (\n event: HTMLElementEventMap[T],\n) => unknown;\nconst addEventListener = (\n element: HTMLElement,\n type: T,\n fun: EventHandler,\n) => {\n element.addEventListener(type, fun);\n};\n\ntype DocumentEventHandler = (\n event: DocumentEventMap[T],\n) => unknown;\nconst addDocumentEventListener = (\n type: T,\n fun: DocumentEventHandler,\n) => {\n d.addEventListener(type, fun);\n};\n\nconst openPane = d.getElementById(\"open-pane\");\nconst sitePane = d.getElementById(\"site-pane\");\n\nif (!openPane || !sitePane) {\n throw Error(\"open-pane or site-pane not found\");\n}\n\nconst setSitePaneState = (state: \"open\" | \"close\") => {\n console.debug(`${state} sitePane`);\n sitePane.setAttribute(\"state\", state);\n};\n\nexport const showSitePane = () => {\n setSitePaneState(\"open\");\n};\nexport const hideSitePane = () => {\n setSitePaneState(\"close\");\n};\n\nconst belongsToSitePane = (el: HTMLElement) => (\n el === openPane || el === sitePane || sitePane.contains(el)\n);\n\n// mouse users\naddEventListener(openPane, \"mouseover\", showSitePane);\naddEventListener(openPane, \"mouseleave\", hideSitePane);\n\n// keyboard users\naddDocumentEventListener(\"focusin\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"showing site pane because of focus event\", event);\n showSitePane();\n } else {\n console.debug(\"hiding site pane because of focus event\", event);\n hideSitePane();\n }\n});\naddDocumentEventListener(\"focusout\", (event) => {\n if (belongsToSitePane(event.target as HTMLElement)) {\n console.debug(\"hiding site pane because of blur event\", event);\n hideSitePane();\n } else {\n console.debug(\"blur event\", event);\n }\n});\n\n// phone users\naddEventListener(openPane, \"click\", showSitePane);\naddDocumentEventListener(\"click\", (event) => {\n if (!belongsToSitePane(event.target as HTMLElement)) {\n hideSitePane();\n }\n});\n\n// swipe gestures (for phone users)\nconst startPos: { x: number | null; y: number | null } = {\n x: null,\n y: null,\n};\naddDocumentEventListener(\"touchstart\", (event) => {\n // save start pos of touch\n startPos.x = event.touches[0]?.clientX ?? null;\n startPos.y = event.touches[0]?.clientY ?? null;\n});\naddDocumentEventListener(\"touchmove\", (event) => {\n if (startPos.x === null || startPos.y === null) {\n return;\n }\n // calculate difference\n const diffX = startPos.x - (event.touches[0]?.clientX ?? 0);\n const diffY = startPos.y - (event.touches[0]?.clientY ?? 0);\n\n // early return if just clicked, not swiped\n if (diffX === 0 && diffY === 0) {\n return;\n }\n\n // reset start pos\n startPos.x = null;\n startPos.y = null;\n\n const minDiffX = Math.max(12, 0.01 * screen.width, diffY * 1.5);\n\n console.debug({ diffX, minDiffX });\n\n if (Math.abs(diffX) >= minDiffX) {\n if (diffX > 0) {\n showSitePane();\n } else {\n hideSitePane();\n }\n }\n});\n", "export { hideSitePane /*, showSitePane */ } from \"./better_ui_.js\";\n\nexport const d = document;\nfunction getElementById(id: string): HTMLElement | null {\n return d.getElementById(id);\n}\nexport const e = getElementById;\n\nlet lastLocation = String(location);\n\n// export function getLastLocation(): string { return lastLocation; }\n\nexport function setLastLocation(url: string): void {\n lastLocation = url;\n}\n\nexport function post(\n url: string,\n params = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n return fetch(url, {\n method: \"POST\",\n body: JSON.stringify(params),\n headers: {\n \"Accept\": accept,\n \"Content-Type\": \"application/json\",\n },\n })\n .then((response) => response.json())\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport function get(\n url: string,\n params: Record | string = {},\n ondata = console.log,\n onerror: (data: unknown) => void = console.error,\n accept = \"application/json\",\n): Promise {\n const paramsString = (new URLSearchParams(params)).toString();\n return fetch(paramsString ? `${url}?${paramsString}` : url, {\n method: \"GET\",\n headers: { Accept: accept },\n })\n .then(\n (response) => response.json(),\n )\n .catch(onerror)\n .then(ondata)\n .catch(onerror);\n}\n\nexport const PopStateHandlers: Record<\n string,\n (state: PopStateEvent) => unknown\n> = {\n // always reload the location if URLParamChange\n URLParamChange: () => {\n location.reload();\n },\n};\n\nexport function setURLParam(\n param: string,\n value: string,\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n return setMultipleURLParams([[param, value]], state, stateType, push);\n}\n\nexport function setMultipleURLParams(\n params: [string, string][],\n state: unknown,\n stateType = \"URLParamChange\",\n push = true,\n) {\n // log(\"setURLParam\", param, value, state, onpopstate);\n const urlParams = new URLSearchParams(location.search);\n for (const [param, value] of params) {\n urlParams.set(param, value);\n }\n const newUrl =\n `${location.origin}${location.pathname}?${urlParams.toString()}`;\n // log(\"newUrl\", newUrl);\n (state as { stateType: string }).stateType = stateType;\n if (push && newUrl !== location.href) {\n history.pushState(state, newUrl, newUrl);\n } else {\n history.replaceState(state, newUrl, newUrl);\n }\n lastLocation = location.href;\n return newUrl;\n}\n\nfunction scrollToId() {\n if (location.hash === \"\") {\n return;\n }\n const header = getElementById(\"header\");\n if (!header) {\n return;\n }\n const el = d.querySelector(location.hash);\n if (!el) {\n return;\n }\n\n scrollBy(\n 0,\n el.getBoundingClientRect().top - Math.floor(\n parseFloat(getComputedStyle(header).height),\n ),\n );\n}\n// scroll after few ms so the scroll is right on page load\nsetTimeout(scrollToId, 4);\nwindow.onhashchange = scrollToId;\n\nwindow.onpopstate = (event: PopStateEvent) => {\n if (lastLocation.split(\"#\")[0] === location.href.split(\"#\")[0]) {\n // Only hash changed\n lastLocation = location.href;\n scrollToId();\n return;\n }\n if (event.state) {\n const state = event.state as { stateType: string };\n const stateHandler = PopStateHandlers[state.stateType];\n if (stateHandler) {\n event.preventDefault();\n stateHandler(event);\n lastLocation = location.href;\n scrollToId();\n return;\n } else {\n console.error(\"Couldn't find state handler for state\", state);\n }\n }\n\n console.error(\"Couldn't handle state. \", event.state);\n lastLocation = location.href;\n location.reload();\n};\n"], "mappings": "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", "names": ["d", "addEventListener", "element", "type", "fun", "addDocumentEventListener", "openPane", "sitePane", "setSitePaneState", "state", "showSitePane", "hideSitePane", "belongsToSitePane", "el", "event", "startPos", "_a", "_b", "_c", "_d", "diffX", "diffY", "minDiffX", "d", "getElementById", "id", "e", "lastLocation", "setLastLocation", "url", "post", "params", "ondata", "onerror", "accept", "response", "get", "paramsString", "PopStateHandlers", "setURLParam", "param", "value", "state", "stateType", "push", "setMultipleURLParams", "urlParams", "newUrl", "scrollToId", "header", "el", "event", "stateHandler"] }