@metricinsights/pp-dev 1.5.0-beta.1 → 1.5.0-beta.11
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.
- package/README.md +11 -5
- package/dist/README.md +11 -5
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/index-DZYClNrq.js +2 -0
- package/dist/cjs/index-DZYClNrq.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{migrate-pmX6NEmP.js → migrate-CWaA9822.js} +2 -2
- package/dist/cjs/{migrate-pmX6NEmP.js.map → migrate-CWaA9822.js.map} +1 -1
- package/dist/cjs/package.json +8 -8
- package/dist/cjs/plugin-C9wKTJUJ.js +106 -0
- package/dist/cjs/plugin-C9wKTJUJ.js.map +1 -0
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/{version-plugin-0EjcUgtP.js → version-plugin-BYlQIq9P.js} +2 -2
- package/dist/cjs/{version-plugin-0EjcUgtP.js.map → version-plugin-BYlQIq9P.js.map} +1 -1
- package/dist/client/client.css +1 -1
- package/dist/client/client.css.map +1 -1
- package/dist/client/client.js +208 -82
- package/dist/client/client.js.map +1 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index-D-UQbBcq.js +2 -0
- package/dist/esm/index-D-UQbBcq.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/{migrate-Dsd7Aqx-.js → migrate-Brx9j28S.js} +2 -2
- package/dist/esm/{migrate-Dsd7Aqx-.js.map → migrate-Brx9j28S.js.map} +1 -1
- package/dist/esm/package.json +8 -8
- package/dist/esm/plugin-B936Mkft.js +106 -0
- package/dist/esm/plugin-B936Mkft.js.map +1 -0
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/{version-plugin-pYbaqnAH.js → version-plugin-CA0tX4h3.js} +2 -2
- package/dist/esm/{version-plugin-pYbaqnAH.js.map → version-plugin-CA0tX4h3.js.map} +1 -1
- package/dist/types/index.d.ts +7 -0
- package/docs/features.md +9 -5
- package/package.json +16 -16
- package/dist/cjs/index-FgUi7Fqw.js +0 -2
- package/dist/cjs/index-FgUi7Fqw.js.map +0 -1
- package/dist/cjs/plugin-yWlSj5sK.js +0 -2
- package/dist/cjs/plugin-yWlSj5sK.js.map +0 -1
- package/dist/esm/index-BA9vecJD.js +0 -2
- package/dist/esm/index-BA9vecJD.js.map +0 -1
- package/dist/esm/plugin-CFtRWPwU.js +0 -2
- package/dist/esm/plugin-CFtRWPwU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../src/client/hot-context.ts","../../src/client/storage.ts","../../src/client/panel-state.ts","../../src/client/panel-position.ts","../../src/client/theme.ts","../../src/client/panel-settings.ts","../../src/client/users-panel.ts","../../src/client/popup.ts","../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\n\n/**\n * Minimal `import.meta.hot`-compatible context for environments without Vite HMR\n * (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and\n * `hot.send()`; this shim implements those over a raw WebSocket using the same\n * custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.\n *\n * Used only as a fallback: when `import.meta.hot` exists (Vite), that is used\n * instead and this code never runs.\n */\n\n/**\n * WebSocket path the pp-dev Next.js server listens on for dev-panel messages.\n * Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).\n */\nconst PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\ntype CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\ntype Handler = (payload: any) => void;\n\nconst MAX_OUTBOX_SIZE = 50;\n\nfunction resolveWebSocketUrl(): string {\n const { protocol, host } = window.location;\n const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';\n\n return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;\n}\n\nexport function createPPDevHotContext(): ViteHotContext {\n const handlers = new Map<string, Set<Handler>>();\n /** Outgoing messages queued while the socket is not OPEN; flushed on connect. */\n const outbox: string[] = [];\n\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectDelay = 1_000;\n const MAX_RECONNECT_DELAY = 10_000;\n\n const flushOutbox = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n while (outbox.length > 0) {\n socket.send(outbox.shift()!);\n }\n };\n\n const dispatch = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n\n if (!eventHandlers) {\n return;\n }\n\n for (const handler of eventHandlers) {\n try {\n handler(data);\n } catch (err) {\n // A failing handler must not break dispatch to the others.\n console.error(`[pp-dev] hot handler for \"${event}\" failed`, err);\n }\n }\n };\n\n const connect = () => {\n try {\n socket = new WebSocket(resolveWebSocketUrl());\n } catch (err) {\n console.error('[pp-dev] failed to open dev-panel WebSocket', err);\n scheduleReconnect();\n\n return;\n }\n\n socket.addEventListener('open', () => {\n reconnectDelay = 1_000;\n flushOutbox();\n });\n\n socket.addEventListener('message', (ev) => {\n let message: CustomMessage;\n\n try {\n message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n\n if (message && message.type === 'custom' && typeof message.event === 'string') {\n dispatch(message.event, message.data);\n }\n });\n\n socket.addEventListener('close', () => {\n socket = null;\n scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n // `close` follows `error`; reconnect is scheduled there.\n socket?.close();\n });\n };\n\n const scheduleReconnect = () => {\n if (reconnectTimer) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);\n connect();\n }, reconnectDelay);\n };\n\n connect();\n\n const noop = () => {};\n\n const context: Pick<ViteHotContext, 'on' | 'off' | 'send'> & Partial<ViteHotContext> = {\n on(event, cb) {\n let set = handlers.get(event);\n\n if (!set) {\n set = new Set();\n handlers.set(event, set);\n }\n\n set.add(cb as Handler);\n },\n off(event, cb) {\n handlers.get(event)?.delete(cb as Handler);\n },\n send(event, data) {\n const payload = JSON.stringify({ type: 'custom', event, data } satisfies CustomMessage);\n\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(payload);\n } else {\n if (outbox.length >= MAX_OUTBOX_SIZE) {\n outbox.shift();\n }\n\n outbox.push(payload);\n }\n },\n // Unused by the dev-panel client; provided as no-ops to satisfy the shape.\n accept: noop as ViteHotContext['accept'],\n acceptExports: noop as ViteHotContext['acceptExports'],\n dispose: noop,\n prune: noop,\n invalidate: noop,\n data: {},\n };\n\n return context as ViteHotContext;\n}\n","// localStorage helpers guarded against environments where storage is unavailable\n// (e.g. sandboxed iframes). Keys follow the original `pp-dev-info-closed` naming.\n\nexport const STORAGE_KEYS = {\n closed: 'pp-dev-info-closed',\n position: 'pp-dev-info-position',\n autoHide: 'pp-dev-info-auto-hide',\n hidden: 'pp-dev-info-hidden',\n /** Shared with the standalone Inspector/Variables Editor pages — same key, same values. */\n theme: 'pp-dev-info-theme',\n} as const;\n\nexport function checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nexport function getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nexport function removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n","import { STORAGE_KEYS, getStorageItem, setStorageItem, removeStorageItem } from './storage.js';\n\nexport type Corner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport const CORNERS: readonly Corner[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n\nexport interface PanelState {\n position: Corner;\n autoHide: boolean;\n hidden: boolean;\n}\n\nexport interface PanelStateController {\n getState(): PanelState;\n setPosition(corner: Corner): void;\n setAutoHide(on: boolean): void;\n setHidden(on: boolean): void;\n /** Clear all persisted overrides and re-resolve from the server-rendered config. */\n reset(): void;\n onChange(cb: (state: PanelState) => void): void;\n}\n\nconst POSITION_CLASS_PREFIX = 'pp-dev-info--';\nconst AUTO_HIDE_CLASS = 'pp-dev-info--auto-hide';\nconst HIDDEN_CLASS = 'pp-dev-info--hidden';\nconst CLOSED_CLASS = 'closed';\nconst NO_TRANSITION_CLASS = 'is-dragging';\n\nexport function isCorner(value: unknown): value is Corner {\n return typeof value === 'string' && (CORNERS as readonly string[]).includes(value);\n}\n\nfunction stateFromDataAttrs($panel: HTMLElement): PanelState {\n return {\n position: isCorner($panel.dataset.position) ? $panel.dataset.position : 'bottom-right',\n autoHide: $panel.dataset.autoHide === 'true',\n hidden: $panel.dataset.hidden === 'true',\n };\n}\n\n/**\n * Resolve the effective panel state. Precedence per setting:\n * localStorage (runtime user choice) → data-* attribute (config) → built-in default.\n * The `?pp-dev-panel=show|hide` URL param writes a persistent localStorage override\n * before resolution, so it both restores a hidden panel and survives reloads.\n */\nexport function resolvePanelState($panel: HTMLElement): PanelState {\n const param = new URLSearchParams(window.location.search).get('pp-dev-panel');\n\n if (param === 'show') {\n setStorageItem(STORAGE_KEYS.hidden, 'false');\n } else if (param === 'hide') {\n setStorageItem(STORAGE_KEYS.hidden, 'true');\n }\n\n const defaults = stateFromDataAttrs($panel);\n\n const storedPosition = getStorageItem(STORAGE_KEYS.position);\n const storedAutoHide = getStorageItem(STORAGE_KEYS.autoHide);\n const storedHidden = getStorageItem(STORAGE_KEYS.hidden);\n\n return {\n position: isCorner(storedPosition) ? storedPosition : defaults.position,\n autoHide: storedAutoHide !== null ? storedAutoHide === 'true' : defaults.autoHide,\n hidden: storedHidden !== null ? storedHidden === 'true' : defaults.hidden,\n };\n}\n\nexport function applyPanelState($panel: HTMLElement, state: PanelState, opts?: { instant?: boolean }): void {\n const apply = () => {\n for (const corner of CORNERS) {\n $panel.classList.toggle(POSITION_CLASS_PREFIX + corner, corner === state.position);\n }\n\n $panel.classList.toggle(AUTO_HIDE_CLASS, state.autoHide);\n $panel.classList.toggle(HIDDEN_CLASS, state.hidden);\n };\n\n if (opts?.instant) {\n // No-transition guard: when localStorage differs from the server-rendered corner,\n // the panel must not visibly slide across the screen on load. `is-dragging`\n // disables transitions; a reflow makes the class swap land before it is removed.\n $panel.classList.add(NO_TRANSITION_CLASS);\n apply();\n void $panel.offsetWidth;\n\n const unlock = () => $panel.classList.remove(NO_TRANSITION_CLASS);\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(unlock);\n } else {\n setTimeout(unlock, 0);\n }\n } else {\n apply();\n }\n}\n\nfunction clearClosed($panel: HTMLElement): void {\n $panel.classList.remove(CLOSED_CLASS);\n $panel.querySelector('.pp-dev-info__wrap-btn svg')?.classList.remove(CLOSED_CLASS);\n removeStorageItem(STORAGE_KEYS.closed);\n}\n\nexport function createPanelStateController($panel: HTMLElement): PanelStateController {\n let state = resolvePanelState($panel);\n const listeners: Array<(s: PanelState) => void> = [];\n\n if (state.autoHide) {\n // Auto-hide and minimize are mutually exclusive; a stale persisted `closed`\n // state must not combine with the auto-hide transform.\n clearClosed($panel);\n }\n\n applyPanelState($panel, state, { instant: true });\n\n const commit = () => {\n applyPanelState($panel, state);\n\n for (const cb of listeners) {\n cb(state);\n }\n };\n\n return {\n getState: () => state,\n\n setPosition(corner) {\n state = { ...state, position: corner };\n setStorageItem(STORAGE_KEYS.position, corner);\n commit();\n },\n\n setAutoHide(on) {\n state = { ...state, autoHide: on };\n setStorageItem(STORAGE_KEYS.autoHide, String(on));\n\n if (on) {\n clearClosed($panel);\n }\n\n commit();\n },\n\n setHidden(on) {\n state = { ...state, hidden: on };\n setStorageItem(STORAGE_KEYS.hidden, String(on));\n commit();\n },\n\n reset() {\n removeStorageItem(STORAGE_KEYS.position);\n removeStorageItem(STORAGE_KEYS.autoHide);\n removeStorageItem(STORAGE_KEYS.hidden);\n clearClosed($panel);\n\n // Re-resolve purely from the server-rendered config (bypass the URL param,\n // which would immediately re-write its localStorage override).\n state = stateFromDataAttrs($panel);\n commit();\n },\n\n onChange(cb) {\n listeners.push(cb);\n },\n };\n}\n","import type { Corner } from './panel-state.js';\n\nexport const AUTO_HIDE_SHOW_DELAY = 300;\nexport const AUTO_HIDE_HIDE_DELAY = 500;\n\nconst PEEKING_CLASS = 'is-peeking';\nconst DRAGGING_CLASS = 'is-dragging';\n\n/** Nearest screen corner for a viewport point; ties resolve toward bottom-right. */\nexport function nearestCorner(x: number, y: number, viewportWidth: number, viewportHeight: number): Corner {\n const left = x < viewportWidth / 2;\n const top = y < viewportHeight / 2;\n\n if (top) {\n return left ? 'top-left' : 'top-right';\n }\n\n return left ? 'bottom-left' : 'bottom-right';\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Drag the panel by its handle and snap to the nearest corner on release.\n * Pointer capture keeps the drag tracking over iframes and outside the window.\n */\nexport function initDrag($panel: HTMLElement, $handle: HTMLElement, onSnap: (corner: Corner) => void): void {\n let dragging = false;\n let pointerId = -1;\n let offsetX = 0;\n let offsetY = 0;\n let panelWidth = 0;\n let panelHeight = 0;\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n stop(false);\n }\n };\n\n const stop = (snap: boolean, ev?: PointerEvent) => {\n if (!dragging) {\n return;\n }\n\n dragging = false;\n\n try {\n $handle.releasePointerCapture(pointerId);\n } catch {\n // pointer already released\n }\n\n document.body.style.userSelect = '';\n document.removeEventListener('keydown', onKeyDown, true);\n\n // Re-enable transitions before clearing the inline placement so the snap animates.\n $panel.classList.remove(DRAGGING_CLASS);\n $panel.style.left = '';\n $panel.style.top = '';\n $panel.style.right = '';\n $panel.style.bottom = '';\n $panel.style.transform = '';\n\n if (snap && ev) {\n onSnap(nearestCorner(ev.clientX, ev.clientY, window.innerWidth, window.innerHeight));\n }\n };\n\n const moveTo = (ev: PointerEvent) => {\n const x = clamp(ev.clientX - offsetX, 0, Math.max(0, window.innerWidth - panelWidth));\n const y = clamp(ev.clientY - offsetY, 0, Math.max(0, window.innerHeight - panelHeight));\n\n $panel.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n };\n\n $handle.addEventListener('pointerdown', (ev: PointerEvent) => {\n if (ev.pointerType === 'mouse' && ev.button !== 0) {\n return;\n }\n\n const rect = $panel.getBoundingClientRect();\n\n dragging = true;\n pointerId = ev.pointerId;\n offsetX = ev.clientX - rect.left;\n offsetY = ev.clientY - rect.top;\n panelWidth = rect.width;\n panelHeight = rect.height;\n\n $handle.setPointerCapture(ev.pointerId);\n $panel.classList.add(DRAGGING_CLASS);\n\n // Anchor to the top-left origin so translate3d coordinates are viewport-absolute;\n // inline styles override the corner-class placement for the duration of the drag.\n $panel.style.left = '0';\n $panel.style.top = '0';\n $panel.style.right = 'auto';\n $panel.style.bottom = 'auto';\n\n moveTo(ev);\n\n document.body.style.userSelect = 'none';\n document.addEventListener('keydown', onKeyDown, true);\n ev.preventDefault();\n });\n\n $handle.addEventListener('pointermove', (ev: PointerEvent) => {\n if (dragging) {\n moveTo(ev);\n }\n });\n\n $handle.addEventListener('pointerup', (ev: PointerEvent) => stop(true, ev));\n $handle.addEventListener('pointercancel', () => stop(false));\n}\n\nexport interface AutoHideHandle {\n /** Force the panel to stay revealed (e.g. while the settings popover is open). */\n keepPeeked(on: boolean): void;\n}\n\n/**\n * Hover-reveal behavior for the auto-hide mode: pointer over the exposed strip for\n * AUTO_HIDE_SHOW_DELAY slides the panel out; leaving re-hides it after a grace period.\n * Keyboard focus inside the panel also keeps it revealed.\n */\nexport function initAutoHide($panel: HTMLElement, isActive: () => boolean): AutoHideHandle {\n let showTimer: number | undefined;\n let hideTimer: number | undefined;\n let popoverOpen = false;\n\n const shouldStayPeeked = () =>\n popoverOpen || $panel.matches(':focus-within') || $panel.classList.contains(DRAGGING_CLASS);\n\n const scheduleHide = () => {\n window.clearTimeout(hideTimer);\n hideTimer = window.setTimeout(() => {\n if (!shouldStayPeeked() && !$panel.matches(':hover')) {\n $panel.classList.remove(PEEKING_CLASS);\n }\n }, AUTO_HIDE_HIDE_DELAY);\n };\n\n $panel.addEventListener('pointerenter', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(hideTimer);\n showTimer = window.setTimeout(() => $panel.classList.add(PEEKING_CLASS), AUTO_HIDE_SHOW_DELAY);\n });\n\n $panel.addEventListener('pointerleave', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(showTimer);\n scheduleHide();\n });\n\n $panel.addEventListener('focusin', () => {\n if (isActive()) {\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n }\n });\n\n $panel.addEventListener('focusout', () => {\n if (isActive()) {\n scheduleHide();\n }\n });\n\n return {\n keepPeeked(on: boolean) {\n popoverOpen = on;\n\n if (!isActive()) {\n return;\n }\n\n if (on) {\n window.clearTimeout(showTimer);\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n } else {\n scheduleHide();\n }\n },\n };\n}\n","// Theme override (Auto/Dark/Light), shared across the dev panel and the standalone\n// Inspector/Variables Editor pages via the same localStorage key (see STORAGE_KEYS.theme) and\n// the same `data-pp-dev-theme` attribute convention (prefixed to avoid colliding with a host\n// Portal Page's own theme attribute, since the panel is injected into pages pp-dev doesn't own).\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\n\nexport type ThemeChoice = 'auto' | 'dark' | 'light';\n\nconst THEME_ATTR = 'data-pp-dev-theme';\n\nexport function getStoredTheme(): ThemeChoice {\n const value = getStorageItem(STORAGE_KEYS.theme);\n\n return value === 'dark' || value === 'light' ? value : 'auto';\n}\n\nexport function applyTheme(theme: ThemeChoice): void {\n if (theme === 'dark' || theme === 'light') {\n document.documentElement.setAttribute(THEME_ATTR, theme);\n } else {\n document.documentElement.removeAttribute(THEME_ATTR);\n }\n}\n\nexport function setTheme(theme: ThemeChoice): void {\n setStorageItem(STORAGE_KEYS.theme, theme);\n applyTheme(theme);\n}\n\n/** Call once on page load to apply whatever was last chosen (defaults to 'auto', a no-op). */\nexport function initTheme(): void {\n applyTheme(getStoredTheme());\n}\n","import type { Corner, PanelStateController } from './panel-state.js';\nimport { CORNERS } from './panel-state.js';\nimport { getStoredTheme, setTheme, type ThemeChoice } from './theme.js';\n\nconst CORNER_TITLES: Record<Corner, string> = {\n 'top-left': 'Top left',\n 'top-right': 'Top right',\n 'bottom-left': 'Bottom left',\n 'bottom-right': 'Bottom right',\n};\n\nconst THEME_CHOICES: ThemeChoice[] = ['auto', 'dark', 'light'];\nconst THEME_LABELS: Record<ThemeChoice, string> = { auto: 'Auto', dark: 'Dark', light: 'Light' };\n\nfunction buildPopover(controller: PanelStateController, showPageVariablesGroup: boolean): HTMLDivElement {\n const state = controller.getState();\n const $popover = document.createElement('div');\n\n $popover.classList.add('pp-dev-info__settings');\n\n const cornerButtons = CORNERS.map((corner) => {\n const active = corner === state.position ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__corner-btn pp-dev-info__corner-btn--${corner}${active}\" data-corner=\"${corner}\" title=\"${CORNER_TITLES[corner]}\" aria-pressed=\"${corner === state.position}\"></button>`;\n }).join('');\n\n const currentTheme = getStoredTheme();\n const themeButtons = THEME_CHOICES.map((choice) => {\n const active = choice === currentTheme ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__theme-btn${active}\" data-theme-choice=\"${choice}\" aria-pressed=\"${choice === currentTheme}\">${THEME_LABELS[choice]}</button>`;\n }).join('');\n\n const pageVariablesRow = showPageVariablesGroup\n ? `\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Page variables</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Page variables\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__reload-vars-btn\" title=\"Refetch live values from MI now, then reload the page\">Reload variables</button>\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-editor-btn\">Open variables editor…</button>\n </div>\n </div>`\n : '';\n\n $popover.innerHTML = `\n <div class=\"pp-dev-info__settings-title\">Panel settings</div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Position</span>\n <div class=\"pp-dev-info__corner-grid\">${cornerButtons}</div>\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <label class=\"pp-dev-info__settings-label\" for=\"pp-dev-auto-hide-toggle\">Auto-hide</label>\n <input\n type=\"checkbox\"\n id=\"pp-dev-auto-hide-toggle\"\n class=\"pp-dev-info__settings-toggle\"\n ${state.autoHide ? 'checked' : ''}\n />\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Theme</span>\n <div class=\"pp-dev-info__theme-grid\" role=\"group\" aria-label=\"Theme\">${themeButtons}</div>\n </div>\n ${pageVariablesRow}\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Dev tools</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Dev tools\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-inspector-btn\">Open request inspector…</button>\n </div>\n </div>\n <button type=\"button\" class=\"pp-dev-info__settings-hide-btn\">Hide panel</button>\n <div class=\"pp-dev-info__settings-hint\">Restore with <code>?pp-dev-panel=show</code> in the URL</div>\n <span class=\"pp-dev-info__settings-reset\" role=\"button\" tabindex=\"0\">Reset to config defaults</span>\n `;\n\n return $popover;\n}\n\nfunction syncPopover($popover: HTMLDivElement, controller: PanelStateController): void {\n const state = controller.getState();\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($btn) => {\n const active = $btn.dataset.corner === state.position;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n\n const $toggle = $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle');\n\n if ($toggle) {\n $toggle.checked = state.autoHide;\n }\n}\n\nexport interface PanelSettingsHooks {\n onOpenChange?: (open: boolean) => void;\n onOpenVariablesEditorClick?: () => void;\n onOpenInspectorClick?: () => void;\n onReloadVariablesClick?: () => void;\n}\n\n/** Settings popover: corner picker, auto-hide toggle, hide button, reset. */\nexport function initPanelSettings(\n $panel: HTMLElement,\n controller: PanelStateController,\n hooks?: PanelSettingsHooks,\n): void {\n const $btn = $panel.querySelector<HTMLButtonElement>('.pp-dev-info__settings-btn');\n\n if (!$btn) {\n return;\n }\n\n let $popover: HTMLDivElement | null = null;\n\n const onDocClick = (ev: MouseEvent) => {\n const target = ev.target as Node;\n\n if ($popover && !$popover.contains(target) && !$btn.contains(target)) {\n close();\n }\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n close();\n }\n };\n\n const close = () => {\n if (!$popover) {\n return;\n }\n\n $popover.remove();\n $popover = null;\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(false);\n };\n\n const open = () => {\n const showPageVariablesGroup = $panel.dataset.templateLess !== 'true';\n\n $popover = buildPopover(controller, showPageVariablesGroup);\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($cornerBtn) => {\n $cornerBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.setPosition($cornerBtn.dataset.corner as Corner);\n });\n });\n\n $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle')?.addEventListener('change', (ev) => {\n controller.setAutoHide((ev.target as HTMLInputElement).checked);\n });\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($themeBtn) => {\n $themeBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n setTheme($themeBtn.dataset.themeChoice as ThemeChoice);\n\n $popover!.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($btn) => {\n const active = $btn === $themeBtn;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n });\n });\n\n $popover.querySelector<HTMLButtonElement>('.pp-dev-info__settings-hide-btn')?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n controller.setHidden(true);\n });\n\n const actions: [string, (() => void) | undefined][] = [\n ['.pp-dev-info__open-editor-btn', hooks?.onOpenVariablesEditorClick],\n ['.pp-dev-info__reload-vars-btn', hooks?.onReloadVariablesClick],\n ['.pp-dev-info__open-inspector-btn', hooks?.onOpenInspectorClick],\n ];\n\n actions.forEach(([selector, hook]) => {\n $popover!.querySelector<HTMLButtonElement>(selector)?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n hook?.();\n });\n });\n\n const $reset = $popover.querySelector<HTMLElement>('.pp-dev-info__settings-reset');\n\n $reset?.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.reset();\n });\n $reset?.addEventListener('keydown', (ev: KeyboardEvent) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n controller.reset();\n }\n });\n\n $panel.appendChild($popover);\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(true);\n };\n\n $btn.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n if ($popover) {\n close();\n } else {\n open();\n }\n });\n\n controller.onChange(() => {\n if ($popover) {\n syncPopover($popover, controller);\n }\n });\n}\n","/**\n * The dev panel's \"Users\" popover (PP-4597): the user of this tab, the saved users (open as, log\n * in, make default, remove) and adding a user by API token or by username + password. Each user\n * works on its own host, `<name>.localhost:<port>`; see src/lib/user-registry.ts.\n */\n\ninterface PublicUser {\n name: string;\n kind: 'token' | 'session';\n state?: 'pending' | 'active' | 'expired';\n miUser?: { id: number; username: string };\n origin: string;\n loginUrl?: string;\n}\n\ninterface UsersResponse {\n available: boolean;\n users: PublicUser[];\n defaultUser: string | null;\n}\n\nconst USERS_API = '/@api/users';\nconst REFRESH_INTERVAL = 3000;\n\nconst USER_HOST_REGEXP = /^([a-z](?:[a-z0-9-]*[a-z0-9])?)\\.localhost$/;\n\nconst STATE_LABELS: Record<NonNullable<PublicUser['state']>, string> = {\n pending: 'not logged in yet',\n active: 'logged in',\n expired: 'session expired',\n};\n\n/** The saved user this tab belongs to, from its host; `undefined` on the main host. */\nexport function getTabUserName(hostname = window.location.hostname): string | undefined {\n return USER_HOST_REGEXP.exec(hostname)?.[1];\n}\n\n/** Users need `*.localhost` hosts, which only exist when the dev server is opened on localhost. */\nfunction isOnLocalhost(hostname = window.location.hostname): boolean {\n return hostname === 'localhost' || hostname.endsWith('.localhost');\n}\n\nfunction mainOrigin(): string {\n const { protocol, port } = window.location;\n\n return `${protocol}//localhost${port ? `:${port}` : ''}`;\n}\n\n/** The current page on another origin, so \"open as\" keeps the page you are on. */\nfunction samePageOn(origin: string): string {\n const { pathname, search, hash } = window.location;\n\n return `${origin}${pathname}${search}${hash}`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (ch) => `&#${ch.charCodeAt(0)};`);\n}\n\nfunction describeUser(user: PublicUser): string {\n const who = user.miUser?.username || (user.miUser ? `MI user ${user.miUser.id}` : '');\n const how =\n user.kind === 'token'\n ? user.state === 'expired'\n ? 'API token turned down by MI'\n : 'API token'\n : STATE_LABELS[user.state ?? 'pending'];\n\n return [who, how].filter(Boolean).join(' · ');\n}\n\nasync function readError(response: Response): Promise<string> {\n try {\n const body = await response.json();\n\n return body?.error || `Request failed (${response.status})`;\n } catch {\n return `Request failed (${response.status})`;\n }\n}\n\nexport interface UsersPanelHooks {\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function initUsersPanel($panel: HTMLElement, hooks?: UsersPanelHooks): void {\n const $btn = $panel.querySelector<HTMLButtonElement>('.pp-dev-info__users-btn');\n\n if (!$btn) {\n return;\n }\n\n const tabUser = getTabUserName();\n\n // On a saved user's host the button stands out (the name is in its tooltip and the popover, so a\n // long name doesn't widen the panel), so the tab is never mistaken for your own.\n if (tabUser) {\n $panel.classList.add('pp-dev-info--user-tab');\n $btn.title = `This tab works as ${tabUser}. Users…`;\n $btn.setAttribute('aria-label', `Users (this tab works as ${tabUser})`);\n }\n\n let $popover: HTMLDivElement | null = null;\n let refreshTimer: number | undefined;\n let addKind: PublicUser['kind'] = 'token';\n let data: UsersResponse | null = null;\n // What the list shows now, so a refresh with the same data leaves it (and the focus) alone.\n let renderedData = '';\n\n const onDocClick = (ev: MouseEvent) => {\n const target = ev.target as Node;\n\n if ($popover && !$popover.contains(target) && !$btn.contains(target)) {\n close();\n }\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n close();\n }\n };\n\n const close = () => {\n if (!$popover) {\n return;\n }\n\n window.clearInterval(refreshTimer);\n $popover.remove();\n $popover = null;\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(false);\n };\n\n const setError = (message: string) => {\n const $error = $popover?.querySelector<HTMLElement>('.pp-dev-info__users-error');\n\n if ($error) {\n $error.textContent = message;\n $error.hidden = !message;\n }\n };\n\n const request = async (method: string, path: string, body?: unknown): Promise<Response | null> => {\n try {\n const response = await fetch(path, {\n method,\n headers: body === undefined ? undefined : { 'Content-Type': 'application/json' },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!response.ok) {\n setError(await readError(response));\n\n return null;\n }\n\n setError('');\n\n return response;\n } catch {\n setError('pp-dev is not reachable');\n\n return null;\n }\n };\n\n const renderList = () => {\n const $list = $popover?.querySelector<HTMLElement>('.pp-dev-info__users-list');\n\n if (!$popover || !$list || !data) {\n return;\n }\n\n const snapshot = JSON.stringify(data);\n\n if (snapshot === renderedData) {\n return;\n }\n\n renderedData = snapshot;\n\n // The control that has the keyboard focus, to focus its counterpart in the new list.\n const focusKey =\n document.activeElement instanceof HTMLElement && $list.contains(document.activeElement)\n ? document.activeElement.dataset.focusKey\n : undefined;\n\n const defaultUser = data.defaultUser;\n // The main host (localhost) works as the default user, a user's host as that user, and an IP\n // address or a custom domain as you.\n const currentUser = tabUser ?? (window.location.hostname === 'localhost' ? defaultUser : null) ?? undefined;\n const $tab = $popover.querySelector<HTMLElement>('.pp-dev-info__users-tab strong');\n\n if ($tab) {\n $tab.textContent = currentUser ?? 'you';\n }\n\n const rows = [\n `<div class=\"pp-dev-info__users-row${currentUser ? '' : ' is-current'}\">\n <input type=\"radio\" name=\"pp-dev-default-user\" class=\"pp-dev-info__users-default\" value=\"\" data-focus-key=\":default\"\n title=\"Make the main host (localhost) work as you\" ${defaultUser ? '' : 'checked'} />\n <div class=\"pp-dev-info__users-who\">\n <span class=\"pp-dev-info__users-name\">You</span>\n <span class=\"pp-dev-info__users-meta\">original user · the dev panel always works as you</span>\n </div>\n ${\n // The main host works as you only while no other user is the default; then that user's\n // row is the one to open.\n tabUser && !defaultUser\n ? `<button type=\"button\" class=\"pp-dev-info__users-action\" data-open=\"${escapeHtml(mainOrigin())}\" data-focus-key=\":open\" title=\"Open this page on the main host\">Open</button>`\n : ''\n }\n </div>`,\n ...data.users.map((user) => {\n const canBeDefault = user.kind === 'token' ? user.state !== 'expired' : user.state === 'active';\n const needsLogin = user.kind === 'session' && user.state !== 'active';\n const needsAttention = needsLogin || user.state === 'expired';\n const name = escapeHtml(user.name);\n let defaultTitle = `Make the main host (localhost) work as ${name}`;\n\n if (!canBeDefault) {\n defaultTitle =\n user.kind === 'token' ? `MI turned down the API token of ${name}` : `${name} has to log in first`;\n }\n\n return `<div class=\"pp-dev-info__users-row${user.name === currentUser ? ' is-current' : ''}${\n needsAttention ? ' needs-login' : ''\n }\" data-user=\"${name}\">\n <input type=\"radio\" name=\"pp-dev-default-user\" class=\"pp-dev-info__users-default\" value=\"${name}\" data-focus-key=\"${name}:default\"\n title=\"${defaultTitle}\"\n ${user.name === defaultUser ? 'checked' : ''} ${canBeDefault ? '' : 'disabled'} />\n <div class=\"pp-dev-info__users-who\">\n <span class=\"pp-dev-info__users-name\">${name}</span>\n <span class=\"pp-dev-info__users-meta\">${escapeHtml(describeUser(user))}</span>\n </div>\n ${\n needsLogin && user.loginUrl\n ? `<button type=\"button\" class=\"pp-dev-info__users-action pp-dev-info__users-action--accent\" data-open=\"${escapeHtml(user.loginUrl)}\" data-raw=\"true\" data-focus-key=\"${name}:login\">Log in</button>`\n : ''\n }\n <button type=\"button\" class=\"pp-dev-info__users-action\" data-open=\"${escapeHtml(user.origin)}\" data-focus-key=\"${name}:open\" title=\"Open this page as ${name}\">Open</button>\n <button type=\"button\" class=\"pp-dev-info__users-remove\" data-remove=\"${name}\" data-focus-key=\"${name}:remove\" title=\"Remove ${name}\" aria-label=\"Remove ${name}\">×</button>\n </div>`;\n }),\n ];\n\n $list.innerHTML = rows.join('');\n\n if (focusKey !== undefined) {\n // The same control of the same user, or the list's first control if it is gone.\n const $same = [...$list.querySelectorAll<HTMLElement>('[data-focus-key]')].find(\n ($el) => $el.dataset.focusKey === focusKey,\n );\n\n ($same ?? $list.querySelector<HTMLElement>('[data-focus-key]'))?.focus();\n }\n\n $list.querySelectorAll<HTMLButtonElement>('[data-open]').forEach(($open) => {\n $open.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n const target = $open.dataset.open!;\n\n window.open($open.dataset.raw ? target : samePageOn(target), '_blank');\n });\n });\n\n $list.querySelectorAll<HTMLButtonElement>('[data-remove]').forEach(($remove) => {\n $remove.addEventListener('click', async (ev) => {\n ev.preventDefault();\n\n if (await request('DELETE', `${USERS_API}/${encodeURIComponent($remove.dataset.remove!)}`)) {\n await refresh();\n }\n });\n });\n\n $list.querySelectorAll<HTMLInputElement>('.pp-dev-info__users-default').forEach(($radio) => {\n $radio.addEventListener('change', async () => {\n await request('PUT', `${USERS_API}/default`, { name: $radio.value || null });\n // Redrawn even if refused: the radio the click checked must go back.\n renderedData = '';\n await refresh();\n });\n });\n };\n\n const renderAvailability = () => {\n if (!$popover || !data) {\n return;\n }\n\n const $form = $popover.querySelector<HTMLElement>('.pp-dev-info__users-add');\n const $unavailable = $popover.querySelector<HTMLElement>('.pp-dev-info__users-unavailable');\n let reason = '';\n\n if (!isOnLocalhost()) {\n reason = 'Users open on <name>.localhost hosts: open the dev server on localhost to use them.';\n } else if (!data.available) {\n reason = 'Adding users needs your own API token: set mi.token or MI_ACCESS_TOKEN.';\n }\n\n if ($form) {\n $form.hidden = Boolean(reason);\n }\n\n if ($unavailable) {\n $unavailable.textContent = reason;\n $unavailable.hidden = !reason;\n }\n };\n\n const refresh = async () => {\n try {\n const response = await fetch(USERS_API);\n\n if (!response.ok) {\n return;\n }\n\n data = (await response.json()) as UsersResponse;\n renderList();\n renderAvailability();\n } catch {\n // The next refresh tries again.\n }\n };\n\n const renderKind = () => {\n if (!$popover) {\n return;\n }\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__users-kind').forEach(($kind) => {\n const active = $kind.dataset.kind === addKind;\n\n $kind.classList.toggle('active', active);\n $kind.setAttribute('aria-pressed', String(active));\n });\n\n const $token = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-token');\n const $submit = $popover.querySelector<HTMLButtonElement>('.pp-dev-info__users-submit');\n const $kindHint = $popover.querySelector<HTMLElement>('.pp-dev-info__users-kind-hint');\n\n if ($token) {\n $token.hidden = addKind !== 'token';\n }\n\n if ($submit) {\n $submit.textContent = addKind === 'token' ? 'Add user' : 'Add and log in…';\n }\n\n if ($kindHint) {\n $kindHint.textContent =\n addKind === 'token'\n ? 'Checked with MI before the user is added. SSO users can only be added this way.'\n : \"Opens MI's login page on the user's own host. pp-dev never sees the password.\";\n }\n };\n\n const submit = async () => {\n if (!$popover) {\n return;\n }\n\n const $name = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-name-input')!;\n const $token = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-token')!;\n const $submit = $popover.querySelector<HTMLButtonElement>('.pp-dev-info__users-submit')!;\n const body =\n addKind === 'token'\n ? { name: $name.value.trim(), token: $token.value }\n : { name: $name.value.trim(), kind: 'session' };\n\n $submit.disabled = true;\n\n const response = await request('POST', USERS_API, body);\n\n $submit.disabled = false;\n\n if (!response) {\n return;\n }\n\n const { user } = (await response.json()) as { user: PublicUser };\n\n $name.value = '';\n $token.value = '';\n\n if (user.kind === 'session' && user.loginUrl) {\n window.open(user.loginUrl, '_blank');\n }\n\n await refresh();\n };\n\n const open = () => {\n renderedData = '';\n $popover = document.createElement('div');\n $popover.classList.add('pp-dev-info__settings', 'pp-dev-info__users');\n $popover.innerHTML = `\n <div class=\"pp-dev-info__settings-title\">Users</div>\n <div class=\"pp-dev-info__users-tab\">\n This tab works as <strong>${escapeHtml(tabUser ?? 'you')}</strong>.\n <span>localhost works as the checked user; each user's own host as that user.</span>\n </div>\n <div class=\"pp-dev-info__users-list\" role=\"radiogroup\" aria-label=\"Default user\"></div>\n <div class=\"pp-dev-info__users-unavailable\" hidden></div>\n <form class=\"pp-dev-info__settings-group pp-dev-info__users-add\" hidden>\n <span class=\"pp-dev-info__settings-label\">Add user</span>\n <div class=\"pp-dev-info__theme-grid\" role=\"group\" aria-label=\"How the user logs in\">\n <button type=\"button\" class=\"pp-dev-info__theme-btn pp-dev-info__users-kind\" data-kind=\"token\">API token</button>\n <button type=\"button\" class=\"pp-dev-info__theme-btn pp-dev-info__users-kind\" data-kind=\"session\">Username + password</button>\n </div>\n <input class=\"pp-dev-info__users-input pp-dev-info__users-name-input\" placeholder=\"Name, e.g. viewer\" maxlength=\"32\"\n autocomplete=\"off\" spellcheck=\"false\" pattern=\"[a-z]([a-z0-9-]*[a-z0-9])?\"\n title=\"Lowercase latin letters, digits and -, starting with a letter. The user opens on <name>.localhost.\" />\n <input class=\"pp-dev-info__users-input pp-dev-info__users-token\" type=\"password\" placeholder=\"API token\" autocomplete=\"off\" />\n <button type=\"submit\" class=\"pp-dev-info__vars-btn pp-dev-info__users-submit\">Add user</button>\n <div class=\"pp-dev-info__settings-hint pp-dev-info__users-kind-hint\"></div>\n </form>\n <div class=\"pp-dev-info__users-error\" role=\"alert\" hidden></div>\n <div class=\"pp-dev-info__settings-hint\">Each user opens on <code><name>.localhost</code> and is kept until the dev server stops.</div>\n `;\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__users-kind').forEach(($kind) => {\n $kind.addEventListener('click', (ev) => {\n ev.preventDefault();\n addKind = $kind.dataset.kind as PublicUser['kind'];\n renderKind();\n });\n });\n\n $popover.querySelector<HTMLFormElement>('.pp-dev-info__users-add')!.addEventListener('submit', (ev) => {\n ev.preventDefault();\n submit();\n });\n\n renderKind();\n $panel.appendChild($popover);\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(true);\n\n refresh();\n // Picks up logins and expired sessions while the popover is open.\n refreshTimer = window.setInterval(refresh, REFRESH_INTERVAL);\n };\n\n $btn.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n if ($popover) {\n close();\n } else {\n open();\n }\n });\n}\n","export interface InfoPopupOptions {\n title: string;\n content: string;\n style?: string;\n className?: string;\n duration?: number;\n onClose?: () => void;\n type?: 'success' | 'danger' | 'info' | 'warning';\n}\n\nconst ICON_SIZE = 16;\nconst CLOSE_ICON_SIZE = 12;\n\nconst TYPE_ICONS: Record<NonNullable<InfoPopupOptions['type']>, string> = {\n success: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 8v4\"/><path d=\"M12 16h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n info: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n};\n\nexport function createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const $popupContent = document.createElement('div');\n\n $popupContent.classList.add('pp-dev-info__popup');\n\n if (opts.type) {\n $popupContent.classList.add(`pp-dev-info__popup--${opts.type}`);\n }\n\n if (opts.className) {\n $popupContent.classList.add(...opts.className.split(/\\s+/).filter(Boolean));\n }\n\n if (opts.style) {\n $popupContent.style.cssText = opts.style;\n }\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__popup-title');\n\n if (opts.type) {\n const $icon = document.createElement('div');\n\n $icon.classList.add('pp-dev-info__popup-title-icon');\n $icon.innerHTML = TYPE_ICONS[opts.type];\n $title.appendChild($icon);\n }\n\n const $titleText = document.createElement('div');\n\n $titleText.classList.add('pp-dev-info__popup-title-text');\n $titleText.textContent = opts.title;\n\n const $close = document.createElement('button');\n\n $close.type = 'button';\n $close.setAttribute('aria-label', 'Close');\n $close.classList.add('pp-dev-info__popup-title-close');\n $close.innerHTML = `\n <svg\n viewBox=\"0 0 24 24\"\n width=\"${CLOSE_ICON_SIZE}\"\n height=\"${CLOSE_ICON_SIZE}\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18\"></path>\n <path d=\"M6 6l12 12\"></path>\n </svg>\n `;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__popup-content');\n $content.textContent = opts.content;\n\n $title.append($titleText, $close);\n $popupContent.append($title, $content);\n $popup.appendChild($popupContent);\n\n return $popup;\n}\n","/// <reference types=\"vite/client\" />\nimport './assets/css/client.scss';\nimport './index.html';\nimport { createPPDevHotContext } from './hot-context.js';\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\nimport { createPanelStateController, type PanelStateController } from './panel-state.js';\nimport { initDrag, initAutoHide } from './panel-position.js';\nimport { initPanelSettings } from './panel-settings.js';\nimport { initUsersPanel } from './users-panel.js';\nimport { initTheme } from './theme.js';\nimport { createPopupElement, type InfoPopupOptions } from './popup.js';\n\n// Applied unconditionally (even if the panel itself is hidden) — this is what makes the\n// override affect the whole injected panel, not just its own markup.\ninitTheme();\n\ninterface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ninterface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ntype PageVariablesReloadResponsePayload = { ok: true; count: number; skipped: boolean } | { error: string };\n\nlet activePopups = 0;\nconst POPUP_OFFSET = 10;\nconst POPUP_HEIGHT = 100;\nconst ANIMATION_DURATION = 300;\nconst CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';\n\nconst activeConfirmModals = new Map<\n HTMLDivElement,\n { resolve: (value: boolean) => void; onKeyDown: (event: KeyboardEvent) => void }\n>();\n\nfunction teardownConfirmModal(overlay: HTMLDivElement, result: boolean) {\n const entry = activeConfirmModals.get(overlay);\n\n if (!entry) {\n return;\n }\n\n document.removeEventListener('keydown', entry.onKeyDown);\n\n activeConfirmModals.delete(overlay);\n overlay.remove();\n entry.resolve(result);\n}\n\nlet panelController: PanelStateController | null = null;\nlet startReloadVariablesFlow: (() => void) | null = null;\nlet pendingReloadVariablesPopup: { close: () => void } | null = null;\n\nfunction updatePopupPositions() {\n const popups = document.querySelectorAll<HTMLElement>('.pp-dev-info-namespace:not(.pp-dev-info)');\n const position = panelController?.getState().position ?? 'bottom-right';\n const isLeft = position === 'top-left' || position === 'bottom-left';\n const isTop = position === 'top-left' || position === 'top-right';\n\n // Anchor popups to the panel's horizontal side and stack them from the vertically\n // opposite edge so they never cover the panel.\n popups.forEach((popup, index: number) => {\n const offset = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);\n const $popupContent = popup.querySelector<HTMLElement>('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return;\n }\n\n $popupContent.classList.toggle('pp-dev-info__popup--left', isLeft);\n\n if (isTop) {\n $popupContent.style.top = 'auto';\n $popupContent.style.bottom = `${offset}px`;\n } else {\n $popupContent.style.bottom = 'auto';\n $popupContent.style.top = `${offset}px`;\n }\n });\n}\n\nfunction animatePopup($popup: HTMLDivElement, type: 'enter' | 'exit') {\n return new Promise<void>((resolve) => {\n const $popupContent = $popup.querySelector('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return resolve();\n }\n\n if (type === 'enter') {\n $popupContent.classList.add('entering');\n\n requestAnimationFrame(() => {\n $popupContent.classList.remove('entering');\n\n resolve();\n });\n } else {\n $popupContent.classList.add('exiting');\n\n setTimeout(() => {\n $popupContent.classList.remove('exiting');\n\n resolve();\n }, ANIMATION_DURATION);\n }\n });\n}\n\nfunction infoPopup(opts: InfoPopupOptions): { close: () => void } {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n const scheduleDismiss = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n requestAnimationFrame(scheduleDismiss);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(scheduleDismiss);\n }\n });\n\n requestAnimationFrame(scheduleDismiss);\n }\n\n return { close: removePopup };\n}\n\nfunction closeAllConfirmModals() {\n for (const overlay of [...activeConfirmModals.keys()]) {\n teardownConfirmModal(overlay, false);\n }\n}\n\nfunction confirmModal(opts: ConfirmModalOptions): Promise<boolean> {\n closeAllConfirmModals();\n\n return new Promise<boolean>((resolve) => {\n const $overlay = document.createElement('div');\n\n $overlay.classList.add('pp-dev-info-namespace', CONFIRM_MODAL_OVERLAY_CLASS);\n\n const $confirm = document.createElement('div');\n\n $confirm.classList.add('pp-dev-info__confirm');\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__confirm-title');\n $title.textContent = opts.title;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__confirm-content');\n $content.textContent = opts.content;\n\n const $actions = document.createElement('div');\n\n $actions.classList.add('pp-dev-info__confirm-actions');\n\n const $cancelButton = document.createElement('button');\n\n $cancelButton.type = 'button';\n $cancelButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--cancel');\n $cancelButton.textContent = opts.cancelText;\n\n const $confirmButton = document.createElement('button');\n\n $confirmButton.type = 'button';\n $confirmButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--confirm');\n $confirmButton.textContent = opts.confirmText;\n\n $actions.append($cancelButton, $confirmButton);\n $confirm.append($title, $content, $actions);\n $overlay.appendChild($confirm);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n teardownConfirmModal($overlay, false);\n }\n };\n\n activeConfirmModals.set($overlay, { resolve, onKeyDown });\n\n $confirmButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, true);\n });\n\n $cancelButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, false);\n });\n\n $overlay.addEventListener('click', (event) => {\n if (event.target === $overlay) {\n teardownConfirmModal($overlay, false);\n }\n });\n\n document.addEventListener('keydown', onKeyDown);\n document.body.appendChild($overlay);\n });\n}\n\n// ── Inspector console banner ──────────────────────────────────────────────────\n// Logged once on page load so it is visible in DevTools history when the console\n// is opened. The message is harmless if the inspector is disabled.\n(function printInspectorBanner() {\n const url = window.location.origin + '/@pp-dev/inspector';\n\n console.log(\n '%cpp-dev%c 🔍 Request Inspector → %c%s',\n 'background:#6e8efb;color:#fff;padding:2px 8px;border-radius:4px;font-weight:700;font-size:11px',\n 'color:#a0a0b8;font-size:11px',\n 'color:#a78bfa;font-size:11px;text-decoration:underline',\n url,\n );\n})();\n\n// ── Panel UI: position, auto-hide, hide, minimize ─────────────────────────────\n// Initialized outside the hot-context guard — panel placement and visibility must\n// not depend on the WebSocket transport being available.\nconst CLOSED_CLASS = 'closed';\n\nconst $infoPanel = document.querySelector<HTMLElement>('.pp-dev-info');\n\nif ($infoPanel) {\n panelController = createPanelStateController($infoPanel);\n\n const $dragHandle = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__drag-handle');\n\n if ($dragHandle) {\n initDrag($infoPanel, $dragHandle, (corner) => panelController!.setPosition(corner));\n }\n\n const autoHide = initAutoHide($infoPanel, () => panelController!.getState().autoHide);\n\n initPanelSettings($infoPanel, panelController, {\n onOpenChange: (open) => autoHide.keepPeeked(open),\n onOpenVariablesEditorClick: () => window.open(window.location.origin + '/@pp-dev/variables-editor', '_blank'),\n onOpenInspectorClick: () => window.open(window.location.origin + '/@pp-dev/inspector', '_blank'),\n onReloadVariablesClick: () => startReloadVariablesFlow?.(),\n });\n\n initUsersPanel($infoPanel, { onOpenChange: (open) => autoHide.keepPeeked(open) });\n\n panelController.onChange((state) => {\n if (!state.autoHide) {\n $infoPanel.classList.remove('is-peeking');\n }\n\n updatePopupPositions();\n });\n\n // Minimize button; in auto-hide mode it acts as \"pin\" (disables auto-hide).\n const $minimizeButtonWrap = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($minimizeButtonWrap && $minimizeButtonSVG) {\n let isClosed = getStorageItem(STORAGE_KEYS.closed) === 'true' && !panelController.getState().autoHide;\n\n const updateTitle = () => {\n $minimizeButtonWrap.title = panelController!.getState().autoHide ? 'Pin panel' : 'Minimize';\n };\n\n updateTitle();\n panelController.onChange(updateTitle);\n\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n if (panelController!.getState().autoHide) {\n isClosed = false;\n panelController!.setAutoHide(false);\n\n return;\n }\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(STORAGE_KEYS.closed, isClosed ? 'true' : 'false');\n });\n }\n}\n\n// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket\n// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).\nconst hot = import.meta.hot ?? createPPDevHotContext();\n\nif (hot) {\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n hot.on('client:config:update', (data: { config: { [key: string]: any } }) => {\n if (typeof data.config?.canSync === 'boolean') {\n if (data.config.canSync) {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = false;\n $syncButton.classList.remove('disabled');\n $syncButton.title = 'Sync template';\n }\n } else {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n }\n }\n });\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n // Keep the sync spinner running while a confirmation modal is shown — the sync\n // process is still in progress and only ends on `template:sync:response`.\n const approved = await confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', {\n requestId: payload.requestId,\n approved,\n });\n });\n\n hot.on(\n 'template:sync:response',\n (\n payload:\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; config?: { [p: string]: any }; refresh?: boolean }\n | { cancelled: boolean; message: string },\n ) => {\n closeAllConfirmModals();\n $syncButton.classList.remove('syncing');\n\n if ('cancelled' in payload && payload.cancelled) {\n infoPopup({\n title: 'Sync cancelled',\n content: payload.message,\n type: 'warning',\n });\n } else if ('error' in payload && typeof payload.error !== 'undefined') {\n infoPopup({\n title: 'Sync error',\n content: payload.error,\n type: 'danger',\n });\n\n if (payload.refresh) {\n setTimeout(() => {\n window.location.reload();\n });\n } else {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n } else if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.\\nBackup filename: ${\n payload.backupFilename\n }`,\n type: 'success',\n });\n }\n },\n );\n\n $syncButton.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n $syncButton.classList.add('syncing');\n\n hot.send('template:sync', {});\n });\n }\n\n hot.on('page-variables:reload:response', (payload: PageVariablesReloadResponsePayload) => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = null;\n\n if ('error' in payload) {\n infoPopup({\n title: 'Reload variables error',\n content: payload.error,\n type: 'danger',\n });\n\n return;\n }\n\n if (payload.skipped) {\n infoPopup({\n title: 'Nothing to reload',\n content: 'This page has no template variables to refresh.',\n type: 'warning',\n });\n\n return;\n }\n\n infoPopup({\n title: 'Variables reloaded',\n content: `Refetched ${payload.count} variable(s) from MI. Reloading the page…`,\n type: 'success',\n duration: 1200,\n });\n\n setTimeout(() => window.location.reload(), 600);\n });\n\n startReloadVariablesFlow = () => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = infoPopup({\n title: 'Reloading variables',\n content: 'Refetching live values from MI…',\n type: 'info',\n duration: 0,\n });\n\n hot.send('page-variables:reload', {});\n };\n}\n"],"names":["CLOSED_CLASS"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../src/client/hot-context.ts","../../src/client/storage.ts","../../src/client/panel-state.ts","../../src/client/panel-position.ts","../../src/client/theme.ts","../../src/client/panel-settings.ts","../../src/client/users-panel.ts","../../src/client/popup.ts","../../src/client/sync-button.ts","../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\n\n/**\n * Minimal `import.meta.hot`-compatible context for environments without Vite HMR\n * (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and\n * `hot.send()`; this shim implements those over a raw WebSocket using the same\n * custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.\n *\n * Used only as a fallback: when `import.meta.hot` exists (Vite), that is used\n * instead and this code never runs.\n */\n\n/**\n * WebSocket path the pp-dev Next.js server listens on for dev-panel messages.\n * Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).\n */\nconst PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\ntype CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\ntype Handler = (payload: any) => void;\n\nconst MAX_OUTBOX_SIZE = 50;\n\nfunction resolveWebSocketUrl(): string {\n const { protocol, host } = window.location;\n const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';\n\n return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;\n}\n\nexport function createPPDevHotContext(): ViteHotContext {\n const handlers = new Map<string, Set<Handler>>();\n /** Outgoing messages queued while the socket is not OPEN; flushed on connect. */\n const outbox: string[] = [];\n\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectDelay = 1_000;\n const MAX_RECONNECT_DELAY = 10_000;\n\n const flushOutbox = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n while (outbox.length > 0) {\n socket.send(outbox.shift()!);\n }\n };\n\n const dispatch = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n\n if (!eventHandlers) {\n return;\n }\n\n for (const handler of eventHandlers) {\n try {\n handler(data);\n } catch (err) {\n // A failing handler must not break dispatch to the others.\n console.error(`[pp-dev] hot handler for \"${event}\" failed`, err);\n }\n }\n };\n\n const connect = () => {\n try {\n socket = new WebSocket(resolveWebSocketUrl());\n } catch (err) {\n console.error('[pp-dev] failed to open dev-panel WebSocket', err);\n scheduleReconnect();\n\n return;\n }\n\n let opened = false;\n\n socket.addEventListener('open', () => {\n opened = true;\n reconnectDelay = 1_000;\n dispatch('vite:ws:connect', {});\n flushOutbox();\n });\n\n socket.addEventListener('message', (ev) => {\n let message: CustomMessage;\n\n try {\n message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n\n if (message && message.type === 'custom' && typeof message.event === 'string') {\n dispatch(message.event, message.data);\n }\n });\n\n socket.addEventListener('close', () => {\n socket = null;\n\n // Same events as Vite's own HMR client, so the panel can tell a lost connection apart\n // (e.g. a sync whose response will never arrive). Only for a socket that was open: a\n // failed reconnect attempt is not a new disconnect.\n if (opened) {\n dispatch('vite:ws:disconnect', {});\n }\n\n scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n // `close` follows `error`; reconnect is scheduled there.\n socket?.close();\n });\n };\n\n const scheduleReconnect = () => {\n if (reconnectTimer) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);\n connect();\n }, reconnectDelay);\n };\n\n connect();\n\n const noop = () => {};\n\n const context: Pick<ViteHotContext, 'on' | 'off' | 'send'> & Partial<ViteHotContext> = {\n on(event, cb) {\n let set = handlers.get(event);\n\n if (!set) {\n set = new Set();\n handlers.set(event, set);\n }\n\n set.add(cb as Handler);\n },\n off(event, cb) {\n handlers.get(event)?.delete(cb as Handler);\n },\n send(event, data) {\n const payload = JSON.stringify({ type: 'custom', event, data } satisfies CustomMessage);\n\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(payload);\n } else {\n if (outbox.length >= MAX_OUTBOX_SIZE) {\n outbox.shift();\n }\n\n outbox.push(payload);\n }\n },\n // Unused by the dev-panel client; provided as no-ops to satisfy the shape.\n accept: noop as ViteHotContext['accept'],\n acceptExports: noop as ViteHotContext['acceptExports'],\n dispose: noop,\n prune: noop,\n invalidate: noop,\n data: {},\n };\n\n return context as ViteHotContext;\n}\n","// localStorage helpers guarded against environments where storage is unavailable\n// (e.g. sandboxed iframes). Keys follow the original `pp-dev-info-closed` naming.\n\nexport const STORAGE_KEYS = {\n closed: 'pp-dev-info-closed',\n position: 'pp-dev-info-position',\n autoHide: 'pp-dev-info-auto-hide',\n hidden: 'pp-dev-info-hidden',\n /** Shared with the standalone Inspector/Variables Editor pages — same key, same values. */\n theme: 'pp-dev-info-theme',\n} as const;\n\nexport function checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nexport function getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nexport function removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n","import { STORAGE_KEYS, getStorageItem, setStorageItem, removeStorageItem } from './storage.js';\n\nexport type Corner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport const CORNERS: readonly Corner[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n\nexport interface PanelState {\n position: Corner;\n autoHide: boolean;\n hidden: boolean;\n}\n\nexport interface PanelStateController {\n getState(): PanelState;\n setPosition(corner: Corner): void;\n setAutoHide(on: boolean): void;\n setHidden(on: boolean): void;\n /** Clear all persisted overrides and re-resolve from the server-rendered config. */\n reset(): void;\n onChange(cb: (state: PanelState) => void): void;\n}\n\nconst POSITION_CLASS_PREFIX = 'pp-dev-info--';\nconst AUTO_HIDE_CLASS = 'pp-dev-info--auto-hide';\nconst HIDDEN_CLASS = 'pp-dev-info--hidden';\nconst CLOSED_CLASS = 'closed';\nconst NO_TRANSITION_CLASS = 'is-dragging';\n\nexport function isCorner(value: unknown): value is Corner {\n return typeof value === 'string' && (CORNERS as readonly string[]).includes(value);\n}\n\nfunction stateFromDataAttrs($panel: HTMLElement): PanelState {\n return {\n position: isCorner($panel.dataset.position) ? $panel.dataset.position : 'bottom-right',\n autoHide: $panel.dataset.autoHide === 'true',\n hidden: $panel.dataset.hidden === 'true',\n };\n}\n\n/**\n * Resolve the effective panel state. Precedence per setting:\n * localStorage (runtime user choice) → data-* attribute (config) → built-in default.\n * The `?pp-dev-panel=show|hide` URL param writes a persistent localStorage override\n * before resolution, so it both restores a hidden panel and survives reloads.\n */\nexport function resolvePanelState($panel: HTMLElement): PanelState {\n const param = new URLSearchParams(window.location.search).get('pp-dev-panel');\n\n if (param === 'show') {\n setStorageItem(STORAGE_KEYS.hidden, 'false');\n } else if (param === 'hide') {\n setStorageItem(STORAGE_KEYS.hidden, 'true');\n }\n\n const defaults = stateFromDataAttrs($panel);\n\n const storedPosition = getStorageItem(STORAGE_KEYS.position);\n const storedAutoHide = getStorageItem(STORAGE_KEYS.autoHide);\n const storedHidden = getStorageItem(STORAGE_KEYS.hidden);\n\n return {\n position: isCorner(storedPosition) ? storedPosition : defaults.position,\n autoHide: storedAutoHide !== null ? storedAutoHide === 'true' : defaults.autoHide,\n hidden: storedHidden !== null ? storedHidden === 'true' : defaults.hidden,\n };\n}\n\nexport function applyPanelState($panel: HTMLElement, state: PanelState, opts?: { instant?: boolean }): void {\n const apply = () => {\n for (const corner of CORNERS) {\n $panel.classList.toggle(POSITION_CLASS_PREFIX + corner, corner === state.position);\n }\n\n $panel.classList.toggle(AUTO_HIDE_CLASS, state.autoHide);\n $panel.classList.toggle(HIDDEN_CLASS, state.hidden);\n };\n\n if (opts?.instant) {\n // No-transition guard: when localStorage differs from the server-rendered corner,\n // the panel must not visibly slide across the screen on load. `is-dragging`\n // disables transitions; a reflow makes the class swap land before it is removed.\n $panel.classList.add(NO_TRANSITION_CLASS);\n apply();\n void $panel.offsetWidth;\n\n const unlock = () => $panel.classList.remove(NO_TRANSITION_CLASS);\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(unlock);\n } else {\n setTimeout(unlock, 0);\n }\n } else {\n apply();\n }\n}\n\nfunction clearClosed($panel: HTMLElement): void {\n $panel.classList.remove(CLOSED_CLASS);\n $panel.querySelector('.pp-dev-info__wrap-btn svg')?.classList.remove(CLOSED_CLASS);\n removeStorageItem(STORAGE_KEYS.closed);\n}\n\nexport function createPanelStateController($panel: HTMLElement): PanelStateController {\n let state = resolvePanelState($panel);\n const listeners: Array<(s: PanelState) => void> = [];\n\n if (state.autoHide) {\n // Auto-hide and minimize are mutually exclusive; a stale persisted `closed`\n // state must not combine with the auto-hide transform.\n clearClosed($panel);\n }\n\n applyPanelState($panel, state, { instant: true });\n\n const commit = () => {\n applyPanelState($panel, state);\n\n for (const cb of listeners) {\n cb(state);\n }\n };\n\n return {\n getState: () => state,\n\n setPosition(corner) {\n state = { ...state, position: corner };\n setStorageItem(STORAGE_KEYS.position, corner);\n commit();\n },\n\n setAutoHide(on) {\n state = { ...state, autoHide: on };\n setStorageItem(STORAGE_KEYS.autoHide, String(on));\n\n if (on) {\n clearClosed($panel);\n }\n\n commit();\n },\n\n setHidden(on) {\n state = { ...state, hidden: on };\n setStorageItem(STORAGE_KEYS.hidden, String(on));\n commit();\n },\n\n reset() {\n removeStorageItem(STORAGE_KEYS.position);\n removeStorageItem(STORAGE_KEYS.autoHide);\n removeStorageItem(STORAGE_KEYS.hidden);\n clearClosed($panel);\n\n // Re-resolve purely from the server-rendered config (bypass the URL param,\n // which would immediately re-write its localStorage override).\n state = stateFromDataAttrs($panel);\n commit();\n },\n\n onChange(cb) {\n listeners.push(cb);\n },\n };\n}\n","import type { Corner } from './panel-state.js';\n\nexport const AUTO_HIDE_SHOW_DELAY = 300;\nexport const AUTO_HIDE_HIDE_DELAY = 500;\n\nconst PEEKING_CLASS = 'is-peeking';\nconst DRAGGING_CLASS = 'is-dragging';\n\n/** Nearest screen corner for a viewport point; ties resolve toward bottom-right. */\nexport function nearestCorner(x: number, y: number, viewportWidth: number, viewportHeight: number): Corner {\n const left = x < viewportWidth / 2;\n const top = y < viewportHeight / 2;\n\n if (top) {\n return left ? 'top-left' : 'top-right';\n }\n\n return left ? 'bottom-left' : 'bottom-right';\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Drag the panel by its handle and snap to the nearest corner on release.\n * Pointer capture keeps the drag tracking over iframes and outside the window.\n */\nexport function initDrag($panel: HTMLElement, $handle: HTMLElement, onSnap: (corner: Corner) => void): void {\n let dragging = false;\n let pointerId = -1;\n let offsetX = 0;\n let offsetY = 0;\n let panelWidth = 0;\n let panelHeight = 0;\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n stop(false);\n }\n };\n\n const stop = (snap: boolean, ev?: PointerEvent) => {\n if (!dragging) {\n return;\n }\n\n dragging = false;\n\n try {\n $handle.releasePointerCapture(pointerId);\n } catch {\n // pointer already released\n }\n\n document.body.style.userSelect = '';\n document.removeEventListener('keydown', onKeyDown, true);\n\n // Re-enable transitions before clearing the inline placement so the snap animates.\n $panel.classList.remove(DRAGGING_CLASS);\n $panel.style.left = '';\n $panel.style.top = '';\n $panel.style.right = '';\n $panel.style.bottom = '';\n $panel.style.transform = '';\n\n if (snap && ev) {\n onSnap(nearestCorner(ev.clientX, ev.clientY, window.innerWidth, window.innerHeight));\n }\n };\n\n const moveTo = (ev: PointerEvent) => {\n const x = clamp(ev.clientX - offsetX, 0, Math.max(0, window.innerWidth - panelWidth));\n const y = clamp(ev.clientY - offsetY, 0, Math.max(0, window.innerHeight - panelHeight));\n\n $panel.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n };\n\n $handle.addEventListener('pointerdown', (ev: PointerEvent) => {\n if (ev.pointerType === 'mouse' && ev.button !== 0) {\n return;\n }\n\n const rect = $panel.getBoundingClientRect();\n\n dragging = true;\n pointerId = ev.pointerId;\n offsetX = ev.clientX - rect.left;\n offsetY = ev.clientY - rect.top;\n panelWidth = rect.width;\n panelHeight = rect.height;\n\n $handle.setPointerCapture(ev.pointerId);\n $panel.classList.add(DRAGGING_CLASS);\n\n // Anchor to the top-left origin so translate3d coordinates are viewport-absolute;\n // inline styles override the corner-class placement for the duration of the drag.\n $panel.style.left = '0';\n $panel.style.top = '0';\n $panel.style.right = 'auto';\n $panel.style.bottom = 'auto';\n\n moveTo(ev);\n\n document.body.style.userSelect = 'none';\n document.addEventListener('keydown', onKeyDown, true);\n ev.preventDefault();\n });\n\n $handle.addEventListener('pointermove', (ev: PointerEvent) => {\n if (dragging) {\n moveTo(ev);\n }\n });\n\n $handle.addEventListener('pointerup', (ev: PointerEvent) => stop(true, ev));\n $handle.addEventListener('pointercancel', () => stop(false));\n}\n\nexport interface AutoHideHandle {\n /** Force the panel to stay revealed (e.g. while the settings popover is open). */\n keepPeeked(on: boolean): void;\n}\n\n/**\n * Hover-reveal behavior for the auto-hide mode: pointer over the exposed strip for\n * AUTO_HIDE_SHOW_DELAY slides the panel out; leaving re-hides it after a grace period.\n * Keyboard focus inside the panel also keeps it revealed.\n */\nexport function initAutoHide($panel: HTMLElement, isActive: () => boolean): AutoHideHandle {\n let showTimer: number | undefined;\n let hideTimer: number | undefined;\n let popoverOpen = false;\n\n const shouldStayPeeked = () =>\n popoverOpen || $panel.matches(':focus-within') || $panel.classList.contains(DRAGGING_CLASS);\n\n const scheduleHide = () => {\n window.clearTimeout(hideTimer);\n hideTimer = window.setTimeout(() => {\n if (!shouldStayPeeked() && !$panel.matches(':hover')) {\n $panel.classList.remove(PEEKING_CLASS);\n }\n }, AUTO_HIDE_HIDE_DELAY);\n };\n\n $panel.addEventListener('pointerenter', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(hideTimer);\n showTimer = window.setTimeout(() => $panel.classList.add(PEEKING_CLASS), AUTO_HIDE_SHOW_DELAY);\n });\n\n $panel.addEventListener('pointerleave', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(showTimer);\n scheduleHide();\n });\n\n $panel.addEventListener('focusin', () => {\n if (isActive()) {\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n }\n });\n\n $panel.addEventListener('focusout', () => {\n if (isActive()) {\n scheduleHide();\n }\n });\n\n return {\n keepPeeked(on: boolean) {\n popoverOpen = on;\n\n if (!isActive()) {\n return;\n }\n\n if (on) {\n window.clearTimeout(showTimer);\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n } else {\n scheduleHide();\n }\n },\n };\n}\n","// Theme override (Auto/Dark/Light), shared across the dev panel and the standalone\n// Inspector/Variables Editor pages via the same localStorage key (see STORAGE_KEYS.theme) and\n// the same `data-pp-dev-theme` attribute convention (prefixed to avoid colliding with a host\n// Portal Page's own theme attribute, since the panel is injected into pages pp-dev doesn't own).\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\n\nexport type ThemeChoice = 'auto' | 'dark' | 'light';\n\nconst THEME_ATTR = 'data-pp-dev-theme';\n\nexport function getStoredTheme(): ThemeChoice {\n const value = getStorageItem(STORAGE_KEYS.theme);\n\n return value === 'dark' || value === 'light' ? value : 'auto';\n}\n\nexport function applyTheme(theme: ThemeChoice): void {\n if (theme === 'dark' || theme === 'light') {\n document.documentElement.setAttribute(THEME_ATTR, theme);\n } else {\n document.documentElement.removeAttribute(THEME_ATTR);\n }\n}\n\nexport function setTheme(theme: ThemeChoice): void {\n setStorageItem(STORAGE_KEYS.theme, theme);\n applyTheme(theme);\n}\n\n/** Call once on page load to apply whatever was last chosen (defaults to 'auto', a no-op). */\nexport function initTheme(): void {\n applyTheme(getStoredTheme());\n}\n","import type { Corner, PanelStateController } from './panel-state.js';\nimport { CORNERS } from './panel-state.js';\nimport { getStoredTheme, setTheme, type ThemeChoice } from './theme.js';\n\nconst CORNER_TITLES: Record<Corner, string> = {\n 'top-left': 'Top left',\n 'top-right': 'Top right',\n 'bottom-left': 'Bottom left',\n 'bottom-right': 'Bottom right',\n};\n\nconst THEME_CHOICES: ThemeChoice[] = ['auto', 'dark', 'light'];\nconst THEME_LABELS: Record<ThemeChoice, string> = { auto: 'Auto', dark: 'Dark', light: 'Light' };\n\nfunction buildPopover(controller: PanelStateController, showPageVariablesGroup: boolean): HTMLDivElement {\n const state = controller.getState();\n const $popover = document.createElement('div');\n\n $popover.classList.add('pp-dev-info__settings');\n\n const cornerButtons = CORNERS.map((corner) => {\n const active = corner === state.position ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__corner-btn pp-dev-info__corner-btn--${corner}${active}\" data-corner=\"${corner}\" title=\"${CORNER_TITLES[corner]}\" aria-pressed=\"${corner === state.position}\"></button>`;\n }).join('');\n\n const currentTheme = getStoredTheme();\n const themeButtons = THEME_CHOICES.map((choice) => {\n const active = choice === currentTheme ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__theme-btn${active}\" data-theme-choice=\"${choice}\" aria-pressed=\"${choice === currentTheme}\">${THEME_LABELS[choice]}</button>`;\n }).join('');\n\n const pageVariablesRow = showPageVariablesGroup\n ? `\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Page variables</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Page variables\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__reload-vars-btn\" title=\"Refetch live values from MI now, then reload the page\">Reload variables</button>\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-editor-btn\">Open variables editor…</button>\n </div>\n </div>`\n : '';\n\n $popover.innerHTML = `\n <div class=\"pp-dev-info__settings-title\">Panel settings</div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Position</span>\n <div class=\"pp-dev-info__corner-grid\">${cornerButtons}</div>\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <label class=\"pp-dev-info__settings-label\" for=\"pp-dev-auto-hide-toggle\">Auto-hide</label>\n <input\n type=\"checkbox\"\n id=\"pp-dev-auto-hide-toggle\"\n class=\"pp-dev-info__settings-toggle\"\n ${state.autoHide ? 'checked' : ''}\n />\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Theme</span>\n <div class=\"pp-dev-info__theme-grid\" role=\"group\" aria-label=\"Theme\">${themeButtons}</div>\n </div>\n ${pageVariablesRow}\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Dev tools</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Dev tools\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-inspector-btn\">Open request inspector…</button>\n </div>\n </div>\n <button type=\"button\" class=\"pp-dev-info__settings-hide-btn\">Hide panel</button>\n <div class=\"pp-dev-info__settings-hint\">Restore with <code>?pp-dev-panel=show</code> in the URL</div>\n <span class=\"pp-dev-info__settings-reset\" role=\"button\" tabindex=\"0\">Reset to config defaults</span>\n `;\n\n return $popover;\n}\n\nfunction syncPopover($popover: HTMLDivElement, controller: PanelStateController): void {\n const state = controller.getState();\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($btn) => {\n const active = $btn.dataset.corner === state.position;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n\n const $toggle = $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle');\n\n if ($toggle) {\n $toggle.checked = state.autoHide;\n }\n}\n\nexport interface PanelSettingsHooks {\n onOpenChange?: (open: boolean) => void;\n onOpenVariablesEditorClick?: () => void;\n onOpenInspectorClick?: () => void;\n onReloadVariablesClick?: () => void;\n}\n\n/** Settings popover: corner picker, auto-hide toggle, hide button, reset. */\nexport function initPanelSettings(\n $panel: HTMLElement,\n controller: PanelStateController,\n hooks?: PanelSettingsHooks,\n): void {\n const $btn = $panel.querySelector<HTMLButtonElement>('.pp-dev-info__settings-btn');\n\n if (!$btn) {\n return;\n }\n\n let $popover: HTMLDivElement | null = null;\n\n const onDocClick = (ev: MouseEvent) => {\n const target = ev.target as Node;\n\n if ($popover && !$popover.contains(target) && !$btn.contains(target)) {\n close();\n }\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n close();\n }\n };\n\n const close = () => {\n if (!$popover) {\n return;\n }\n\n $popover.remove();\n $popover = null;\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(false);\n };\n\n const open = () => {\n const showPageVariablesGroup = $panel.dataset.templateLess !== 'true';\n\n $popover = buildPopover(controller, showPageVariablesGroup);\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($cornerBtn) => {\n $cornerBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.setPosition($cornerBtn.dataset.corner as Corner);\n });\n });\n\n $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle')?.addEventListener('change', (ev) => {\n controller.setAutoHide((ev.target as HTMLInputElement).checked);\n });\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($themeBtn) => {\n $themeBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n setTheme($themeBtn.dataset.themeChoice as ThemeChoice);\n\n $popover!.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($btn) => {\n const active = $btn === $themeBtn;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n });\n });\n\n $popover.querySelector<HTMLButtonElement>('.pp-dev-info__settings-hide-btn')?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n controller.setHidden(true);\n });\n\n const actions: [string, (() => void) | undefined][] = [\n ['.pp-dev-info__open-editor-btn', hooks?.onOpenVariablesEditorClick],\n ['.pp-dev-info__reload-vars-btn', hooks?.onReloadVariablesClick],\n ['.pp-dev-info__open-inspector-btn', hooks?.onOpenInspectorClick],\n ];\n\n actions.forEach(([selector, hook]) => {\n $popover!.querySelector<HTMLButtonElement>(selector)?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n hook?.();\n });\n });\n\n const $reset = $popover.querySelector<HTMLElement>('.pp-dev-info__settings-reset');\n\n $reset?.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.reset();\n });\n $reset?.addEventListener('keydown', (ev: KeyboardEvent) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n controller.reset();\n }\n });\n\n $panel.appendChild($popover);\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(true);\n };\n\n $btn.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n if ($popover) {\n close();\n } else {\n open();\n }\n });\n\n controller.onChange(() => {\n if ($popover) {\n syncPopover($popover, controller);\n }\n });\n}\n","/**\n * The dev panel's \"Users\" popover (PP-4597): the user of this tab, the saved users (open as, log\n * in, make default, remove) and adding a user by API token or by username + password. Each user\n * works on its own host, `<name>.localhost:<port>`; see src/lib/user-registry.ts.\n */\n\ninterface PublicUser {\n name: string;\n kind: 'token' | 'session';\n state?: 'pending' | 'active' | 'expired';\n miUser?: { id: number; username: string };\n origin: string;\n loginUrl?: string;\n}\n\ninterface UsersResponse {\n available: boolean;\n users: PublicUser[];\n defaultUser: string | null;\n}\n\nconst USERS_API = '/@api/users';\nconst REFRESH_INTERVAL = 3000;\n\nconst USER_HOST_REGEXP = /^([a-z](?:[a-z0-9-]*[a-z0-9])?)\\.localhost$/;\n\n/** Marks the user this tab works as, apart from the radio, which picks localhost's user. */\nconst THIS_TAB_BADGE = '<span class=\"pp-dev-info__users-badge\">this tab</span>';\n\nconst STATE_LABELS: Record<NonNullable<PublicUser['state']>, string> = {\n pending: 'not logged in yet',\n active: 'logged in',\n expired: 'session expired',\n};\n\n/** The saved user this tab belongs to, from its host; `undefined` on the main host. */\nexport function getTabUserName(hostname = window.location.hostname): string | undefined {\n return USER_HOST_REGEXP.exec(hostname)?.[1];\n}\n\n/** Users need `*.localhost` hosts, which only exist when the dev server is opened on localhost. */\nfunction isOnLocalhost(hostname = window.location.hostname): boolean {\n return hostname === 'localhost' || hostname.endsWith('.localhost');\n}\n\nfunction mainOrigin(): string {\n const { protocol, port } = window.location;\n\n return `${protocol}//localhost${port ? `:${port}` : ''}`;\n}\n\n/** The current page on another origin, so \"open as\" keeps the page you are on. */\nfunction samePageOn(origin: string): string {\n const { pathname, search, hash } = window.location;\n\n return `${origin}${pathname}${search}${hash}`;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (ch) => `&#${ch.charCodeAt(0)};`);\n}\n\nfunction describeUser(user: PublicUser): string {\n const who = user.miUser?.username || (user.miUser ? `MI user ${user.miUser.id}` : '');\n const how =\n user.kind === 'token'\n ? user.state === 'expired'\n ? 'API token turned down by MI'\n : 'API token'\n : STATE_LABELS[user.state ?? 'pending'];\n\n return [who, how].filter(Boolean).join(' · ');\n}\n\nasync function readError(response: Response): Promise<string> {\n try {\n const body = await response.json();\n\n return body?.error || `Request failed (${response.status})`;\n } catch {\n return `Request failed (${response.status})`;\n }\n}\n\nexport interface UsersPanelHooks {\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function initUsersPanel($panel: HTMLElement, hooks?: UsersPanelHooks): void {\n const $btn = $panel.querySelector<HTMLButtonElement>('.pp-dev-info__users-btn');\n\n if (!$btn) {\n return;\n }\n\n const tabUser = getTabUserName();\n\n // On a saved user's host the button stands out (the name is in its tooltip and the popover, so a\n // long name doesn't widen the panel), so the tab is never mistaken for your own.\n if (tabUser) {\n $panel.classList.add('pp-dev-info--user-tab');\n $btn.title = `This tab works as ${tabUser}. Users…`;\n $btn.setAttribute('aria-label', `Users (this tab works as ${tabUser})`);\n }\n\n let $popover: HTMLDivElement | null = null;\n let refreshTimer: number | undefined;\n let addKind: PublicUser['kind'] = 'token';\n let data: UsersResponse | null = null;\n // What the list shows now, so a refresh with the same data leaves it (and the focus) alone.\n let renderedData = '';\n // The token user being edited, whose row shows the edit form instead.\n let editing: string | null = null;\n\n const onDocClick = (ev: MouseEvent) => {\n const target = ev.target as Node;\n\n if ($popover && !$popover.contains(target) && !$btn.contains(target)) {\n close();\n }\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n close();\n }\n };\n\n const close = () => {\n if (!$popover) {\n return;\n }\n\n editing = null;\n window.clearInterval(refreshTimer);\n $popover.remove();\n $popover = null;\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(false);\n };\n\n const setError = (message: string) => {\n const $error = $popover?.querySelector<HTMLElement>('.pp-dev-info__users-error');\n\n if ($error) {\n $error.textContent = message;\n $error.hidden = !message;\n }\n };\n\n const request = async (method: string, path: string, body?: unknown): Promise<Response | null> => {\n try {\n const response = await fetch(path, {\n method,\n headers: body === undefined ? undefined : { 'Content-Type': 'application/json' },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!response.ok) {\n setError(await readError(response));\n\n return null;\n }\n\n setError('');\n\n return response;\n } catch {\n setError('pp-dev is not reachable');\n\n return null;\n }\n };\n\n /**\n * Who this tab works as: on a user's host that user, on localhost the default user, and on an IP\n * address or a custom domain you (`undefined`). Before the users are loaded, a user's host only.\n */\n const getCurrentUser = (): string | undefined =>\n tabUser ?? (window.location.hostname === 'localhost' ? data?.defaultUser : null) ?? undefined;\n\n const renderList = () => {\n const $list = $popover?.querySelector<HTMLElement>('.pp-dev-info__users-list');\n\n if (!$popover || !$list || !data) {\n return;\n }\n\n // The user being edited is gone (removed, logged out): nothing to edit any more.\n if (editing && !data.users.some((user) => user.name === editing && user.kind === 'token')) {\n editing = null;\n } else if (editing && $list.querySelector<HTMLElement>('.pp-dev-info__users-edit')?.dataset.user === editing) {\n // A refresh must not wipe what is being typed into the edit form. (Edit on another user\n // redraws it for that one.)\n return;\n }\n\n const snapshot = JSON.stringify(data);\n\n if (snapshot === renderedData) {\n return;\n }\n\n renderedData = snapshot;\n\n // The control that has the keyboard focus, to focus its counterpart in the new list.\n const focusKey =\n document.activeElement instanceof HTMLElement && $list.contains(document.activeElement)\n ? document.activeElement.dataset.focusKey\n : undefined;\n\n const defaultUser = data.defaultUser;\n const currentUser = getCurrentUser();\n const $tab = $popover.querySelector<HTMLElement>('.pp-dev-info__users-tab strong');\n\n if ($tab) {\n $tab.textContent = currentUser ?? 'you';\n }\n\n const rows = [\n `<div class=\"pp-dev-info__users-row${currentUser ? '' : ' is-current'}\">\n <input type=\"radio\" name=\"pp-dev-default-user\" class=\"pp-dev-info__users-default\" value=\"\" data-focus-key=\":default\"\n title=\"Make the main host (localhost) work as you\" ${defaultUser ? '' : 'checked'} />\n <div class=\"pp-dev-info__users-who\">\n <span class=\"pp-dev-info__users-name\">You${currentUser ? '' : THIS_TAB_BADGE}</span>\n <span class=\"pp-dev-info__users-meta\">original user · the dev panel always works as you</span>\n </div>\n ${\n // The main host works as you only while no other user is the default; then that user's\n // row is the one to open.\n tabUser && !defaultUser\n ? `<button type=\"button\" class=\"pp-dev-info__users-action\" data-open=\"${escapeHtml(mainOrigin())}\" data-focus-key=\":open\" title=\"Open this page on the main host\">Open</button>`\n : ''\n }\n </div>`,\n ...data.users.map((user) => {\n const canBeDefault = user.kind === 'token' ? user.state !== 'expired' : user.state === 'active';\n const needsLogin = user.kind === 'session' && user.state !== 'active';\n const needsAttention = needsLogin || user.state === 'expired';\n const name = escapeHtml(user.name);\n\n if (user.kind === 'token' && user.name === editing) {\n return `<form class=\"pp-dev-info__users-row pp-dev-info__users-edit\" data-user=\"${name}\">\n <input class=\"pp-dev-info__users-input pp-dev-info__users-edit-name\" value=\"${name}\" maxlength=\"32\"\n autocomplete=\"off\" spellcheck=\"false\" aria-label=\"Name\" data-focus-key=\"${name}:edit-name\"\n title=\"Lowercase latin letters, digits and -, starting with a letter. The user opens on <name>.localhost.\" />\n <input class=\"pp-dev-info__users-input pp-dev-info__users-edit-token\" type=\"password\" autocomplete=\"off\"\n placeholder=\"New API token (empty keeps the current one)\" aria-label=\"New API token\" data-focus-key=\"${name}:edit-token\" />\n <div class=\"pp-dev-info__users-edit-actions\">\n <button type=\"submit\" class=\"pp-dev-info__users-action pp-dev-info__users-action--accent\" data-focus-key=\"${name}:save\">Save</button>\n <button type=\"button\" class=\"pp-dev-info__users-action\" data-cancel-edit data-focus-key=\"${name}:cancel\">Cancel</button>\n </div>\n </form>`;\n }\n\n let defaultTitle = `Make the main host (localhost) work as ${name}`;\n\n if (!canBeDefault) {\n defaultTitle =\n user.kind === 'token' ? `MI turned down the API token of ${name}` : `${name} has to log in first`;\n }\n\n return `<div class=\"pp-dev-info__users-row${user.name === currentUser ? ' is-current' : ''}${\n needsAttention ? ' needs-login' : ''\n }\" data-user=\"${name}\">\n <input type=\"radio\" name=\"pp-dev-default-user\" class=\"pp-dev-info__users-default\" value=\"${name}\" data-focus-key=\"${name}:default\"\n title=\"${defaultTitle}\"\n ${user.name === defaultUser ? 'checked' : ''} ${canBeDefault ? '' : 'disabled'} />\n <div class=\"pp-dev-info__users-who\">\n <span class=\"pp-dev-info__users-name\">${name}${user.name === currentUser ? THIS_TAB_BADGE : ''}</span>\n <span class=\"pp-dev-info__users-meta\">${escapeHtml(describeUser(user))}</span>\n </div>\n ${\n needsLogin && user.loginUrl\n ? `<button type=\"button\" class=\"pp-dev-info__users-action pp-dev-info__users-action--accent\" data-open=\"${escapeHtml(user.loginUrl)}\" data-raw=\"true\" data-focus-key=\"${name}:login\">Log in</button>`\n : ''\n }\n ${\n user.kind === 'token'\n ? `<button type=\"button\" class=\"pp-dev-info__users-action\" data-edit=\"${name}\" data-focus-key=\"${name}:edit\" title=\"Rename ${name} or replace its API token\">Edit</button>`\n : ''\n }\n <button type=\"button\" class=\"pp-dev-info__users-action\" data-open=\"${escapeHtml(user.origin)}\" data-focus-key=\"${name}:open\" title=\"Open this page as ${name}\">Open</button>\n <button type=\"button\" class=\"pp-dev-info__users-remove\" data-remove=\"${name}\" data-focus-key=\"${name}:remove\" title=\"Remove ${name}\" aria-label=\"Remove ${name}\">×</button>\n </div>`;\n }),\n ];\n\n $list.innerHTML = rows.join('');\n\n if (focusKey !== undefined) {\n // The same control of the same user, or the list's first control if it is gone.\n const $same = [...$list.querySelectorAll<HTMLElement>('[data-focus-key]')].find(\n ($el) => $el.dataset.focusKey === focusKey,\n );\n\n ($same ?? $list.querySelector<HTMLElement>('[data-focus-key]'))?.focus();\n }\n\n $list.querySelectorAll<HTMLButtonElement>('[data-open]').forEach(($open) => {\n $open.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n const target = $open.dataset.open!;\n\n window.open($open.dataset.raw ? target : samePageOn(target), '_blank');\n });\n });\n\n const startEditing = (name: string | null) => {\n editing = name;\n renderedData = '';\n renderList();\n $list.querySelector<HTMLInputElement>('.pp-dev-info__users-edit-name')?.focus();\n };\n\n $list.querySelectorAll<HTMLButtonElement>('[data-edit]').forEach(($edit) => {\n $edit.addEventListener('click', (ev) => {\n ev.preventDefault();\n startEditing($edit.dataset.edit!);\n });\n });\n\n $list.querySelector<HTMLButtonElement>('[data-cancel-edit]')?.addEventListener('click', (ev) => {\n ev.preventDefault();\n setError('');\n startEditing(null);\n });\n\n $list.querySelector<HTMLFormElement>('.pp-dev-info__users-edit')?.addEventListener('submit', async (ev) => {\n ev.preventDefault();\n\n const name = editing!;\n const $form = ev.currentTarget as HTMLFormElement;\n const newName = $form.querySelector<HTMLInputElement>('.pp-dev-info__users-edit-name')!.value.trim();\n const token = $form.querySelector<HTMLInputElement>('.pp-dev-info__users-edit-token')!.value.trim();\n const response = await request('PATCH', `${USERS_API}/${encodeURIComponent(name)}`, {\n name: newName,\n ...(token ? { token } : {}),\n });\n\n if (!response) {\n return;\n }\n\n const { user } = (await response.json()) as { user: PublicUser };\n\n // This tab's own user got a new host: go on there (the old one would only send it on).\n if (tabUser === name && user.name !== name) {\n window.location.href = samePageOn(user.origin);\n\n return;\n }\n\n editing = null;\n renderedData = '';\n await refresh();\n });\n\n $list.querySelectorAll<HTMLButtonElement>('[data-remove]').forEach(($remove) => {\n $remove.addEventListener('click', async (ev) => {\n ev.preventDefault();\n\n if (await request('DELETE', `${USERS_API}/${encodeURIComponent($remove.dataset.remove!)}`)) {\n await refresh();\n }\n });\n });\n\n $list.querySelectorAll<HTMLInputElement>('.pp-dev-info__users-default').forEach(($radio) => {\n $radio.addEventListener('change', async () => {\n await request('PUT', `${USERS_API}/default`, { name: $radio.value || null });\n // Redrawn even if refused: the radio the click checked must go back.\n renderedData = '';\n await refresh();\n });\n });\n };\n\n const renderAvailability = () => {\n if (!$popover || !data) {\n return;\n }\n\n const $form = $popover.querySelector<HTMLElement>('.pp-dev-info__users-add');\n const $unavailable = $popover.querySelector<HTMLElement>('.pp-dev-info__users-unavailable');\n let reason = '';\n\n if (!isOnLocalhost()) {\n reason = 'Users open on <name>.localhost hosts: open the dev server on localhost to use them.';\n } else if (!data.available) {\n reason = 'Adding users needs your own API token: set mi.token or MI_ACCESS_TOKEN.';\n }\n\n if ($form) {\n $form.hidden = Boolean(reason);\n }\n\n if ($unavailable) {\n $unavailable.textContent = reason;\n $unavailable.hidden = !reason;\n }\n };\n\n const refresh = async () => {\n try {\n const response = await fetch(USERS_API);\n\n if (!response.ok) {\n return;\n }\n\n data = (await response.json()) as UsersResponse;\n renderList();\n renderAvailability();\n } catch {\n // The next refresh tries again.\n }\n };\n\n const renderKind = () => {\n if (!$popover) {\n return;\n }\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__users-kind').forEach(($kind) => {\n const active = $kind.dataset.kind === addKind;\n\n $kind.classList.toggle('active', active);\n $kind.setAttribute('aria-pressed', String(active));\n });\n\n const $token = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-token');\n const $submit = $popover.querySelector<HTMLButtonElement>('.pp-dev-info__users-submit');\n const $kindHint = $popover.querySelector<HTMLElement>('.pp-dev-info__users-kind-hint');\n\n if ($token) {\n $token.hidden = addKind !== 'token';\n }\n\n if ($submit) {\n $submit.textContent = addKind === 'token' ? 'Add user' : 'Add and log in…';\n }\n\n if ($kindHint) {\n $kindHint.textContent =\n addKind === 'token'\n ? 'Checked with MI before the user is added. SSO users can only be added this way.'\n : \"Opens MI's login page on the user's own host. pp-dev never sees the password.\";\n }\n };\n\n const submit = async () => {\n if (!$popover) {\n return;\n }\n\n const $name = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-name-input')!;\n const $token = $popover.querySelector<HTMLInputElement>('.pp-dev-info__users-token')!;\n const $submit = $popover.querySelector<HTMLButtonElement>('.pp-dev-info__users-submit')!;\n const body =\n addKind === 'token'\n ? { name: $name.value.trim(), token: $token.value }\n : { name: $name.value.trim(), kind: 'session' };\n\n $submit.disabled = true;\n\n const response = await request('POST', USERS_API, body);\n\n $submit.disabled = false;\n\n if (!response) {\n return;\n }\n\n const { user } = (await response.json()) as { user: PublicUser };\n\n $name.value = '';\n $token.value = '';\n\n if (user.kind === 'session' && user.loginUrl) {\n window.open(user.loginUrl, '_blank');\n }\n\n await refresh();\n };\n\n const open = () => {\n renderedData = '';\n $popover = document.createElement('div');\n $popover.classList.add('pp-dev-info__settings', 'pp-dev-info__users');\n $popover.innerHTML = `\n <div class=\"pp-dev-info__settings-title\">Users</div>\n <div class=\"pp-dev-info__users-tab\">\n This tab works as <strong>${escapeHtml(getCurrentUser() ?? 'you')}</strong>.\n </div>\n <div class=\"pp-dev-info__users-list-head\" aria-hidden=\"true\">localhost</div>\n <div class=\"pp-dev-info__users-list\" role=\"radiogroup\" aria-label=\"Who localhost works as\">\n <span class=\"pp-dev-info__users-meta\">Loading users…</span>\n </div>\n <div class=\"pp-dev-info__settings-hint\">The radio picks who localhost works as; each user's own host always works as that user.</div>\n <div class=\"pp-dev-info__users-unavailable\" hidden></div>\n <form class=\"pp-dev-info__settings-group pp-dev-info__users-add\" hidden>\n <span class=\"pp-dev-info__settings-label\">Add user</span>\n <div class=\"pp-dev-info__theme-grid\" role=\"group\" aria-label=\"How the user logs in\">\n <button type=\"button\" class=\"pp-dev-info__theme-btn pp-dev-info__users-kind\" data-kind=\"token\">API token</button>\n <button type=\"button\" class=\"pp-dev-info__theme-btn pp-dev-info__users-kind\" data-kind=\"session\">Username + password</button>\n </div>\n <input class=\"pp-dev-info__users-input pp-dev-info__users-name-input\" placeholder=\"Name, e.g. viewer\" maxlength=\"32\"\n autocomplete=\"off\" spellcheck=\"false\" pattern=\"[a-z]([a-z0-9-]*[a-z0-9])?\"\n title=\"Lowercase latin letters, digits and -, starting with a letter. The user opens on <name>.localhost.\" />\n <input class=\"pp-dev-info__users-input pp-dev-info__users-token\" type=\"password\" placeholder=\"API token\" autocomplete=\"off\" />\n <button type=\"submit\" class=\"pp-dev-info__vars-btn pp-dev-info__users-submit\">Add user</button>\n <div class=\"pp-dev-info__settings-hint pp-dev-info__users-kind-hint\"></div>\n </form>\n <div class=\"pp-dev-info__users-error\" role=\"alert\" hidden></div>\n <div class=\"pp-dev-info__settings-hint\">Each user opens on <code><name>.localhost</code> and is kept until the dev server stops.</div>\n `;\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__users-kind').forEach(($kind) => {\n $kind.addEventListener('click', (ev) => {\n ev.preventDefault();\n addKind = $kind.dataset.kind as PublicUser['kind'];\n renderKind();\n });\n });\n\n $popover.querySelector<HTMLFormElement>('.pp-dev-info__users-add')!.addEventListener('submit', (ev) => {\n ev.preventDefault();\n submit();\n });\n\n renderKind();\n $panel.appendChild($popover);\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(true);\n\n // Shown right away from what was loaded with the panel, then brought up to date.\n renderList();\n renderAvailability();\n refresh();\n // Picks up logins and expired sessions while the popover is open.\n refreshTimer = window.setInterval(refresh, REFRESH_INTERVAL);\n };\n\n // Loaded with the panel, so the popover opens with its list.\n refresh();\n\n $btn.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n if ($popover) {\n close();\n } else {\n open();\n }\n });\n}\n","export interface InfoPopupOptions {\n title: string;\n content: string;\n style?: string;\n className?: string;\n duration?: number;\n onClose?: () => void;\n type?: 'success' | 'danger' | 'info' | 'warning';\n}\n\nconst ICON_SIZE = 16;\nconst CLOSE_ICON_SIZE = 12;\n\nconst TYPE_ICONS: Record<NonNullable<InfoPopupOptions['type']>, string> = {\n success: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"m9 12 2 2 4-4\"/></svg>`,\n danger: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 8v4\"/><path d=\"M12 16h.01\"/></svg>`,\n warning: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`,\n info: `<svg viewBox=\"0 0 24 24\" width=\"${ICON_SIZE}\" height=\"${ICON_SIZE}\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n};\n\nexport function createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const $popupContent = document.createElement('div');\n\n $popupContent.classList.add('pp-dev-info__popup');\n\n if (opts.type) {\n $popupContent.classList.add(`pp-dev-info__popup--${opts.type}`);\n }\n\n if (opts.className) {\n $popupContent.classList.add(...opts.className.split(/\\s+/).filter(Boolean));\n }\n\n if (opts.style) {\n $popupContent.style.cssText = opts.style;\n }\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__popup-title');\n\n if (opts.type) {\n const $icon = document.createElement('div');\n\n $icon.classList.add('pp-dev-info__popup-title-icon');\n $icon.innerHTML = TYPE_ICONS[opts.type];\n $title.appendChild($icon);\n }\n\n const $titleText = document.createElement('div');\n\n $titleText.classList.add('pp-dev-info__popup-title-text');\n $titleText.textContent = opts.title;\n\n const $close = document.createElement('button');\n\n $close.type = 'button';\n $close.setAttribute('aria-label', 'Close');\n $close.classList.add('pp-dev-info__popup-title-close');\n $close.innerHTML = `\n <svg\n viewBox=\"0 0 24 24\"\n width=\"${CLOSE_ICON_SIZE}\"\n height=\"${CLOSE_ICON_SIZE}\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n fill=\"none\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18\"></path>\n <path d=\"M6 6l12 12\"></path>\n </svg>\n `;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__popup-content');\n $content.textContent = opts.content;\n\n $title.append($titleText, $close);\n $popupContent.append($title, $content);\n $popup.appendChild($popupContent);\n\n return $popup;\n}\n","import type { ViteHotContext } from 'vite/types/hot.js';\nimport type { InfoPopupOptions } from './popup.js';\n\n/**\n * `template:sync:response` code for a sync requested while another one runs. Kept in sync with\n * `SYNC_IN_PROGRESS_CODE` in `src/lib/client.service.ts` (server side, not importable here).\n */\nconst SYNC_IN_PROGRESS_CODE = 'SYNC_IN_PROGRESS';\n\nconst TITLE_AVAILABLE = 'Sync template';\nconst TITLE_UNAVAILABLE = 'Sync is unavailable on this instance';\n\nexport interface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\nexport interface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\nexport type TemplateSyncResponsePayload =\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; code?: string; config?: { canSync?: boolean; [key: string]: unknown }; refresh?: boolean }\n | { cancelled: boolean; message: string };\n\nexport interface SyncButtonDeps {\n infoPopup: (opts: InfoPopupOptions) => unknown;\n confirmModal: (opts: ConfirmModalOptions) => Promise<boolean>;\n closeAllConfirmModals: () => void;\n /** Reloads the page (an expired session); `window.location.reload` by default. */\n reload?: () => void;\n}\n\n/**\n * Wires the dev panel's \"Sync template\" button to the dev server.\n *\n * The button is disabled while a sync runs, so a double click can't start a second build, and is\n * enabled again by whatever ends the sync: its response, or a lost connection. It stays disabled\n * only when the server says sync is unavailable on this instance (`config.canSync === false`);\n * a failed sync (MI unreachable, a build error) can simply be retried.\n */\nexport function initSyncButton(\n hot: Pick<ViteHotContext, 'on' | 'send'>,\n $button: HTMLButtonElement,\n deps: SyncButtonDeps,\n): void {\n const reload = deps.reload ?? (() => window.location.reload());\n\n let available = !$button.disabled && !$button.classList.contains('disabled');\n let syncing = false;\n\n const applyState = () => {\n $button.disabled = syncing || !available;\n $button.classList.toggle('syncing', syncing);\n $button.classList.toggle('disabled', !available);\n $button.title = available ? TITLE_AVAILABLE : TITLE_UNAVAILABLE;\n\n if (syncing) {\n $button.setAttribute('aria-busy', 'true');\n } else {\n $button.removeAttribute('aria-busy');\n }\n };\n\n const endSync = () => {\n syncing = false;\n applyState();\n };\n\n hot.on('client:config:update', (data: { config?: { canSync?: unknown } }) => {\n if (typeof data?.config?.canSync !== 'boolean') {\n return;\n }\n\n // The server sends `canSync: true` at the start of every sync: it must not enable the\n // button while that sync runs, which `applyState` takes care of.\n available = data.config.canSync;\n applyState();\n });\n\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n // The spinner keeps running while a confirmation modal is shown: the sync is still in\n // progress and only ends on `template:sync:response`.\n const approved = await deps.confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', { requestId: payload.requestId, approved });\n });\n\n hot.on('template:sync:response', (payload: TemplateSyncResponsePayload) => {\n deps.closeAllConfirmModals();\n\n if ('error' in payload && payload.config?.canSync === false) {\n available = false;\n }\n\n endSync();\n\n if ('cancelled' in payload && payload.cancelled) {\n deps.infoPopup({ title: 'Sync cancelled', content: payload.message, type: 'warning' });\n\n return;\n }\n\n if ('error' in payload && typeof payload.error !== 'undefined') {\n if (payload.code === SYNC_IN_PROGRESS_CODE) {\n deps.infoPopup({ title: 'Sync already running', content: payload.error, type: 'warning' });\n\n return;\n }\n\n deps.infoPopup({ title: 'Sync error', content: payload.error, type: 'danger' });\n\n if (payload.refresh) {\n setTimeout(reload);\n }\n\n return;\n }\n\n if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n deps.infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.\\nBackup filename: ${payload.backupFilename}`,\n type: 'success',\n });\n }\n });\n\n // A response sent to a socket that has closed never arrives. Without this, the button would\n // spin, disabled, until the page is reloaded.\n hot.on('vite:ws:disconnect', () => {\n if (!syncing) {\n return;\n }\n\n deps.closeAllConfirmModals();\n endSync();\n deps.infoPopup({\n title: 'Sync result unknown',\n content:\n 'The connection to the dev server was lost during the sync. Check its terminal for the result before syncing again.',\n type: 'warning',\n });\n });\n\n $button.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n if (syncing || !available) {\n return;\n }\n\n syncing = true;\n applyState();\n hot.send('template:sync', {});\n });\n}\n","/// <reference types=\"vite/client\" />\nimport './assets/css/client.scss';\nimport './index.html';\nimport { createPPDevHotContext } from './hot-context.js';\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\nimport { createPanelStateController, type PanelStateController } from './panel-state.js';\nimport { initDrag, initAutoHide } from './panel-position.js';\nimport { initPanelSettings } from './panel-settings.js';\nimport { initUsersPanel } from './users-panel.js';\nimport { initTheme } from './theme.js';\nimport { createPopupElement, type InfoPopupOptions } from './popup.js';\nimport { initSyncButton, type ConfirmModalOptions } from './sync-button.js';\n\n// Applied unconditionally (even if the panel itself is hidden) — this is what makes the\n// override affect the whole injected panel, not just its own markup.\ninitTheme();\n\ntype PageVariablesReloadResponsePayload = { ok: true; count: number; skipped: boolean } | { error: string };\n\nlet activePopups = 0;\nconst POPUP_OFFSET = 10;\nconst POPUP_HEIGHT = 100;\nconst ANIMATION_DURATION = 300;\nconst CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';\n\nconst activeConfirmModals = new Map<\n HTMLDivElement,\n { resolve: (value: boolean) => void; onKeyDown: (event: KeyboardEvent) => void }\n>();\n\nfunction teardownConfirmModal(overlay: HTMLDivElement, result: boolean) {\n const entry = activeConfirmModals.get(overlay);\n\n if (!entry) {\n return;\n }\n\n document.removeEventListener('keydown', entry.onKeyDown);\n\n activeConfirmModals.delete(overlay);\n overlay.remove();\n entry.resolve(result);\n}\n\nlet panelController: PanelStateController | null = null;\nlet startReloadVariablesFlow: (() => void) | null = null;\nlet pendingReloadVariablesPopup: { close: () => void } | null = null;\n\nfunction updatePopupPositions() {\n const popups = document.querySelectorAll<HTMLElement>('.pp-dev-info-namespace:not(.pp-dev-info)');\n const position = panelController?.getState().position ?? 'bottom-right';\n const isLeft = position === 'top-left' || position === 'bottom-left';\n const isTop = position === 'top-left' || position === 'top-right';\n\n // Anchor popups to the panel's horizontal side and stack them from the vertically\n // opposite edge so they never cover the panel.\n popups.forEach((popup, index: number) => {\n const offset = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);\n const $popupContent = popup.querySelector<HTMLElement>('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return;\n }\n\n $popupContent.classList.toggle('pp-dev-info__popup--left', isLeft);\n\n if (isTop) {\n $popupContent.style.top = 'auto';\n $popupContent.style.bottom = `${offset}px`;\n } else {\n $popupContent.style.bottom = 'auto';\n $popupContent.style.top = `${offset}px`;\n }\n });\n}\n\nfunction animatePopup($popup: HTMLDivElement, type: 'enter' | 'exit') {\n return new Promise<void>((resolve) => {\n const $popupContent = $popup.querySelector('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return resolve();\n }\n\n if (type === 'enter') {\n $popupContent.classList.add('entering');\n\n requestAnimationFrame(() => {\n $popupContent.classList.remove('entering');\n\n resolve();\n });\n } else {\n $popupContent.classList.add('exiting');\n\n setTimeout(() => {\n $popupContent.classList.remove('exiting');\n\n resolve();\n }, ANIMATION_DURATION);\n }\n });\n}\n\nfunction infoPopup(opts: InfoPopupOptions): { close: () => void } {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n const scheduleDismiss = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n requestAnimationFrame(scheduleDismiss);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(scheduleDismiss);\n }\n });\n\n requestAnimationFrame(scheduleDismiss);\n }\n\n return { close: removePopup };\n}\n\nfunction closeAllConfirmModals() {\n for (const overlay of [...activeConfirmModals.keys()]) {\n teardownConfirmModal(overlay, false);\n }\n}\n\nfunction confirmModal(opts: ConfirmModalOptions): Promise<boolean> {\n closeAllConfirmModals();\n\n return new Promise<boolean>((resolve) => {\n const $overlay = document.createElement('div');\n\n $overlay.classList.add('pp-dev-info-namespace', CONFIRM_MODAL_OVERLAY_CLASS);\n\n const $confirm = document.createElement('div');\n\n $confirm.classList.add('pp-dev-info__confirm');\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__confirm-title');\n $title.textContent = opts.title;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__confirm-content');\n $content.textContent = opts.content;\n\n const $actions = document.createElement('div');\n\n $actions.classList.add('pp-dev-info__confirm-actions');\n\n const $cancelButton = document.createElement('button');\n\n $cancelButton.type = 'button';\n $cancelButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--cancel');\n $cancelButton.textContent = opts.cancelText;\n\n const $confirmButton = document.createElement('button');\n\n $confirmButton.type = 'button';\n $confirmButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--confirm');\n $confirmButton.textContent = opts.confirmText;\n\n $actions.append($cancelButton, $confirmButton);\n $confirm.append($title, $content, $actions);\n $overlay.appendChild($confirm);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n teardownConfirmModal($overlay, false);\n }\n };\n\n activeConfirmModals.set($overlay, { resolve, onKeyDown });\n\n $confirmButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, true);\n });\n\n $cancelButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, false);\n });\n\n $overlay.addEventListener('click', (event) => {\n if (event.target === $overlay) {\n teardownConfirmModal($overlay, false);\n }\n });\n\n document.addEventListener('keydown', onKeyDown);\n document.body.appendChild($overlay);\n });\n}\n\n// ── Inspector console banner ──────────────────────────────────────────────────\n// Logged once on page load so it is visible in DevTools history when the console\n// is opened. The message is harmless if the inspector is disabled.\n(function printInspectorBanner() {\n const url = window.location.origin + '/@pp-dev/inspector';\n\n console.log(\n '%cpp-dev%c 🔍 Request Inspector → %c%s',\n 'background:#6e8efb;color:#fff;padding:2px 8px;border-radius:4px;font-weight:700;font-size:11px',\n 'color:#a0a0b8;font-size:11px',\n 'color:#a78bfa;font-size:11px;text-decoration:underline',\n url,\n );\n})();\n\n// ── Panel UI: position, auto-hide, hide, minimize ─────────────────────────────\n// Initialized outside the hot-context guard — panel placement and visibility must\n// not depend on the WebSocket transport being available.\nconst CLOSED_CLASS = 'closed';\n\nconst $infoPanel = document.querySelector<HTMLElement>('.pp-dev-info');\n\nif ($infoPanel) {\n panelController = createPanelStateController($infoPanel);\n\n const $dragHandle = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__drag-handle');\n\n if ($dragHandle) {\n initDrag($infoPanel, $dragHandle, (corner) => panelController!.setPosition(corner));\n }\n\n const autoHide = initAutoHide($infoPanel, () => panelController!.getState().autoHide);\n\n initPanelSettings($infoPanel, panelController, {\n onOpenChange: (open) => autoHide.keepPeeked(open),\n onOpenVariablesEditorClick: () => window.open(window.location.origin + '/@pp-dev/variables-editor', '_blank'),\n onOpenInspectorClick: () => window.open(window.location.origin + '/@pp-dev/inspector', '_blank'),\n onReloadVariablesClick: () => startReloadVariablesFlow?.(),\n });\n\n initUsersPanel($infoPanel, { onOpenChange: (open) => autoHide.keepPeeked(open) });\n\n panelController.onChange((state) => {\n if (!state.autoHide) {\n $infoPanel.classList.remove('is-peeking');\n }\n\n updatePopupPositions();\n });\n\n // Minimize button; in auto-hide mode it acts as \"pin\" (disables auto-hide).\n const $minimizeButtonWrap = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($minimizeButtonWrap && $minimizeButtonSVG) {\n let isClosed = getStorageItem(STORAGE_KEYS.closed) === 'true' && !panelController.getState().autoHide;\n\n const updateTitle = () => {\n $minimizeButtonWrap.title = panelController!.getState().autoHide ? 'Pin panel' : 'Minimize';\n };\n\n updateTitle();\n panelController.onChange(updateTitle);\n\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n if (panelController!.getState().autoHide) {\n isClosed = false;\n panelController!.setAutoHide(false);\n\n return;\n }\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(STORAGE_KEYS.closed, isClosed ? 'true' : 'false');\n });\n }\n}\n\n// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket\n// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).\nconst hot = import.meta.hot ?? createPPDevHotContext();\n\nif (hot) {\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n initSyncButton(hot, $syncButton, { infoPopup, confirmModal, closeAllConfirmModals });\n }\n\n hot.on('page-variables:reload:response', (payload: PageVariablesReloadResponsePayload) => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = null;\n\n if ('error' in payload) {\n infoPopup({\n title: 'Reload variables error',\n content: payload.error,\n type: 'danger',\n });\n\n return;\n }\n\n if (payload.skipped) {\n infoPopup({\n title: 'Nothing to reload',\n content: 'This page has no template variables to refresh.',\n type: 'warning',\n });\n\n return;\n }\n\n infoPopup({\n title: 'Variables reloaded',\n content: `Refetched ${payload.count} variable(s) from MI. Reloading the page…`,\n type: 'success',\n duration: 1200,\n });\n\n setTimeout(() => window.location.reload(), 600);\n });\n\n startReloadVariablesFlow = () => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = infoPopup({\n title: 'Reloading variables',\n content: 'Refetching live values from MI…',\n type: 'info',\n duration: 0,\n });\n\n hot.send('page-variables:reload', {});\n };\n}\n"],"names":["CLOSED_CLASS"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
|