@metricinsights/pp-dev 1.5.0-beta.34 → 1.5.0-beta.36
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 +17 -9
- package/dist/cjs/auth.provider-D5AI-ujG.js +2 -0
- package/dist/cjs/auth.provider-D5AI-ujG.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/cjs/{version-manifest-DdWlzzZ6.js → version-manifest-DuXhzqGr.js} +2 -2
- package/dist/cjs/{version-manifest-DdWlzzZ6.js.map → version-manifest-DuXhzqGr.js.map} +1 -1
- package/dist/cjs/version-plugin-DrG2-mQf.js +2 -0
- package/dist/cjs/{version-plugin-B1Sb07cW.js.map → version-plugin-DrG2-mQf.js.map} +1 -1
- package/dist/client/client.js +113 -53
- package/dist/client/client.js.map +1 -1
- package/dist/client/request-inspector.js +12 -1
- package/dist/client/request-inspector.js.map +1 -1
- package/dist/client/variables-editor.js +169 -36
- package/dist/client/variables-editor.js.map +1 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/{internal.middleware-CC20He9L.js → internal.middleware-wi0Mb4oZ.js} +2 -2
- package/dist/esm/internal.middleware-wi0Mb4oZ.js.map +1 -0
- package/dist/esm/plugin.js +1 -1
- package/package.json +6 -8
- package/dist/cjs/auth.provider-6rZUaR33.js +0 -2
- package/dist/cjs/auth.provider-6rZUaR33.js.map +0 -1
- package/dist/cjs/cli.js +0 -2
- package/dist/cjs/cli.js.map +0 -1
- package/dist/cjs/index-Cc-bAhnE.js +0 -2
- package/dist/cjs/index-Cc-bAhnE.js.map +0 -1
- package/dist/cjs/internal.middleware-BlM7gqkq.js +0 -2
- package/dist/cjs/internal.middleware-BlM7gqkq.js.map +0 -1
- package/dist/cjs/migrate-DDdeB-Fj.js +0 -2
- package/dist/cjs/migrate-DDdeB-Fj.js.map +0 -1
- package/dist/cjs/version-plugin-B1Sb07cW.js +0 -2
- package/dist/esm/internal.middleware-CC20He9L.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../../src/shared/ws-messages.ts","../../../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/shared/user-names.ts","../../../src/client/users-panel.ts","../../../src/client/popup.ts","../../../src/client/sync-button.ts","../../../src/client/index.ts"],"sourcesContent":["/**\n * The WebSocket messages between the dev server and the dev panel, for both sides: the server\n * (`src/lib/client.service.ts`, `src/lib/pp-ws-server.ts`) and the panel (`src/client/**`) import\n * them from here, so they can't drift apart. No Node or DOM imports: the panel bundle includes it.\n */\n\n/** WebSocket path the `pp-dev next` server listens on for dev-panel messages. */\nexport const PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\n/**\n * A dev-panel message on the wire, in Vite's custom-event shape: the panel's `import.meta.hot` shim\n * (`src/client/hot-context.ts`) and the `pp-dev next` server (`src/lib/pp-ws-server.ts`) both speak it.\n */\nexport type CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\n/** `template:sync:response` code for a sync requested while another one runs. */\nexport const SYNC_IN_PROGRESS_CODE = 'SYNC_IN_PROGRESS';\n\n/** `template:sync:action-required`: the server asks the panel to confirm a step of the sync. */\nexport interface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\n/** `template:sync:action-response`: the panel's answer to {@link SyncActionRequiredPayload}. */\nexport interface SyncActionResponsePayload {\n requestId: string;\n approved: boolean;\n}\n\n/** `template:sync:response`: how a sync ended. */\nexport type TemplateSyncResponsePayload =\n | { syncedAt: string; backupFilename: string }\n | { error: string; code?: string; config?: { canSync?: boolean; [key: string]: unknown }; refresh?: boolean }\n | { cancelled: boolean; message: string };\n","/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\nimport { PP_DEV_HMR_WS_PATH, type CustomMessage } from '../shared/ws-messages.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/** {@link ViteHotContext}, plus whether the socket is open right now. */\nexport type PPDevHotContext = ViteHotContext & { isConnected(): boolean };\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(): PPDevHotContext {\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 /** The connection state last reported to the panel, so each change is reported once. */\n let reported: 'connected' | 'disconnected' | 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 reported = 'connected';\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, or a click that can't be sent). Once per\n // loss: each failed reconnect attempt is not a new one, but a first connection that never\n // opened is.\n if (reported !== 'disconnected') {\n reported = 'disconnected';\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<PPDevHotContext, 'on' | 'off' | 'send' | 'isConnected'> & 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 // Not part of Vite's API: lets the panel tell an open connection from one still connecting, whose\n // queued messages would go out whenever it opens (see `src/client/sync-button.ts`).\n isConnected: () => socket?.readyState === WebSocket.OPEN,\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 PPDevHotContext;\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 rules for a saved user's name, which is also its host (`<name>.localhost`), for both sides:\n * the server checks them (`src/lib/user-registry.ts`) and the dev panel's Users popover\n * (`src/client/users-panel.ts`) checks them as you type. No Node or DOM imports: the panel bundle\n * includes it.\n */\n\n/** Longest user name; well under the 63 characters a DNS label allows. */\nexport const MAX_USER_NAME_LENGTH = 32;\n\n/**\n * A DNS label: lowercase latin letters, digits and `-`, starting with a letter and not ending with\n * `-`. Also used as an input's `pattern`, which browsers compile with the `v` flag: there an\n * unescaped `-` in a class is a syntax error, and the whole pattern was silently ignored.\n */\nexport const USER_NAME_PATTERN = String.raw`[a-z](?:[a-z0-9\\-]*[a-z0-9])?`;\n\nconst USER_NAME_REGEXP = new RegExp(`^(?:${USER_NAME_PATTERN})$`);\n\n/** The suffix of a user's host: `viewer` works on `viewer.localhost`. */\nexport const USER_HOST_SUFFIX = '.localhost';\n\n/** Why `name` can't be a user name, or `undefined` if it can. */\nexport function getUserNameError(name: string): string | undefined {\n if (!name) {\n return 'The name is required';\n }\n\n if (name.length > MAX_USER_NAME_LENGTH) {\n return `The name must be at most ${MAX_USER_NAME_LENGTH} characters long`;\n }\n\n if (!USER_NAME_REGEXP.test(name)) {\n return 'The name may contain only lowercase latin letters, digits and \"-\", must start with a letter and must not end with \"-\"';\n }\n\n return undefined;\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\nimport { MAX_USER_NAME_LENGTH, USER_HOST_SUFFIX, USER_NAME_PATTERN, getUserNameError } from '../shared/user-names.js';\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\n// The server's name rules (src/shared/user-names.ts), not a copy of them.\nconst USER_HOST_REGEXP = new RegExp(`^(${USER_NAME_PATTERN})${USER_HOST_SUFFIX.replace('.', '\\\\.')}$`);\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 // Only the latest refresh paints: two quick default switches sent two, and the first one's\n // answer, arriving last, drew the state before the second.\n let refreshSeq = 0;\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=\"${MAX_USER_NAME_LENGTH}\" pattern=\"${USER_NAME_PATTERN}\"\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 if (!target) {\n return;\n }\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 ?? null);\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\n if (!name) {\n return;\n }\n\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 const name = $remove.dataset.remove;\n\n if (name && (await request('DELETE', `${USERS_API}/${encodeURIComponent(name)}`))) {\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 const seq = ++refreshSeq;\n\n try {\n const response = await fetch(USERS_API);\n\n if (!response.ok) {\n return;\n }\n\n const loaded = (await response.json()) as UsersResponse;\n\n if (seq !== refreshSeq) {\n return;\n }\n\n data = loaded;\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\n if (!$name || !$token || !$submit) {\n return;\n }\n\n const name = $name.value.trim();\n const nameError = getUserNameError(name);\n\n if (nameError) {\n setError(nameError);\n\n return;\n }\n\n const body = addKind === 'token' ? { name, token: $token.value } : { name, kind: 'session' };\n // A session user logs in on a tab of its own. Opened here, while the click still counts as the\n // user's: opened after the request, Safari and Chrome blocked it as a popup.\n const loginTab = addKind === 'session' ? window.open('', '_blank') : null;\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 loginTab?.close();\n\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 && loginTab) {\n loginTab.location.href = user.loginUrl;\n } else {\n loginTab?.close();\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=\"${MAX_USER_NAME_LENGTH}\"\n autocomplete=\"off\" spellcheck=\"false\" pattern=\"${USER_NAME_PATTERN}\"\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\n/**\n * Calls `onElapsed` once the page has been visible for `duration` ms in all (time in a hidden tab\n * doesn't count). Returns a function that stops waiting, which also removes the page's\n * `visibilitychange` listener: one used to stay behind for every popup ever shown.\n */\nexport function startAutoDismiss(duration: number, onElapsed: () => void): () => void {\n let remaining = duration;\n let lastUpdate = Date.now();\n let visible = true;\n let frame: number | undefined;\n\n const tick = () => {\n frame = undefined;\n\n if (!visible) {\n return;\n }\n\n const now = Date.now();\n\n remaining -= now - lastUpdate;\n lastUpdate = now;\n\n if (remaining <= 0) {\n stop();\n onElapsed();\n\n return;\n }\n\n frame = requestAnimationFrame(tick);\n };\n\n const onVisibilityChange = () => {\n visible = !document.hidden;\n\n if (visible) {\n lastUpdate = Date.now();\n frame ??= requestAnimationFrame(tick);\n }\n };\n\n const stop = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange);\n\n if (frame !== undefined) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n frame = requestAnimationFrame(tick);\n\n return stop;\n}\n","import type { ViteHotContext } from 'vite/types/hot.js';\nimport type { InfoPopupOptions } from './popup.js';\nimport {\n SYNC_IN_PROGRESS_CODE,\n type SyncActionRequiredPayload,\n type SyncActionResponsePayload,\n type TemplateSyncResponsePayload,\n} from '../shared/ws-messages.js';\n\nexport type { SyncActionRequiredPayload, TemplateSyncResponsePayload };\n\nconst TITLE_AVAILABLE = 'Sync template';\nconst TITLE_UNAVAILABLE = 'Sync is unavailable on this instance';\n\nexport interface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\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'> & { isConnected?: () => boolean },\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 // Vite's connection is taken as open until reported lost: it may have opened before these handlers\n // were registered, and its client reloads the page once a lost one is back. The `pp-dev next`\n // transport says itself whether its socket is open, also while the first one is still connecting.\n let connected = true;\n const isConnected = () => connected && (hot.isConnected?.() ?? true);\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', {\n requestId: payload.requestId,\n approved,\n } satisfies SyncActionResponsePayload);\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:connect', () => {\n connected = true;\n });\n\n hot.on('vite:ws:disconnect', () => {\n connected = false;\n\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 // Sent now, the request would wait for a reconnect with the button spinning, and start a sync\n // whenever that happens. Say so instead, and let the click be repeated once connected.\n if (!isConnected()) {\n deps.infoPopup({\n title: 'No connection',\n content: 'The dev server is not connected. Check that it is running, then try again.',\n type: 'warning',\n });\n\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, startAutoDismiss, 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 let removed = false;\n let stopAutoDismiss: (() => void) | undefined;\n\n // Once only: closing it by hand used to leave its timer running, which removed it again and\n // counted it out of `activePopups` twice.\n const removePopup = async () => {\n if (removed) {\n return;\n }\n\n removed = true;\n stopAutoDismiss?.();\n\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 stopAutoDismiss = startAutoDismiss(duration, removePopup);\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,10,11]}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../../src/shared/ws-messages.ts","../../../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/shared/user-names.ts","../../../src/client/users-panel.ts","../../../src/client/popup.ts","../../../src/client/sync-button.ts","../../../src/client/reload-variables.ts","../../../src/client/index.ts"],"sourcesContent":["/**\n * The WebSocket messages between the dev server and the dev panel, for both sides: the server\n * (`src/lib/client.service.ts`, `src/lib/pp-ws-server.ts`) and the panel (`src/client/**`) import\n * them from here, so they can't drift apart. No Node or DOM imports: the panel bundle includes it.\n */\n\n/** WebSocket path the `pp-dev next` server listens on for dev-panel messages. */\nexport const PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\n/**\n * A dev-panel message on the wire, in Vite's custom-event shape: the panel's `import.meta.hot` shim\n * (`src/client/hot-context.ts`) and the `pp-dev next` server (`src/lib/pp-ws-server.ts`) both speak it.\n */\nexport type CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\n/** `template:sync:response` code for a sync requested while another one runs. */\nexport const SYNC_IN_PROGRESS_CODE = 'SYNC_IN_PROGRESS';\n\n/** `template:sync:action-required`: the server asks the panel to confirm a step of the sync. */\nexport interface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\n/** `template:sync:action-response`: the panel's answer to {@link SyncActionRequiredPayload}. */\nexport interface SyncActionResponsePayload {\n requestId: string;\n approved: boolean;\n}\n\n/** `template:sync:response`: how a sync ended. */\nexport type TemplateSyncResponsePayload =\n | { syncedAt: string; backupFilename: string }\n | { error: string; code?: string; config?: { canSync?: boolean; [key: string]: unknown }; refresh?: boolean }\n | { cancelled: boolean; message: string };\n","/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\nimport { PP_DEV_HMR_WS_PATH, type CustomMessage } from '../shared/ws-messages.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/** {@link ViteHotContext}, plus whether the socket is open right now. */\nexport type PPDevHotContext = ViteHotContext & { isConnected(): boolean };\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(): PPDevHotContext {\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 /** The connection state last reported to the panel, so each change is reported once. */\n let reported: 'connected' | 'disconnected' | 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 reported = 'connected';\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, or a click that can't be sent). Once per\n // loss: each failed reconnect attempt is not a new one, but a first connection that never\n // opened is.\n if (reported !== 'disconnected') {\n reported = 'disconnected';\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<PPDevHotContext, 'on' | 'off' | 'send' | 'isConnected'> & 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 // Not part of Vite's API: lets the panel tell an open connection from one still connecting, whose\n // queued messages would go out whenever it opens (see `src/client/sync-button.ts`).\n isConnected: () => socket?.readyState === WebSocket.OPEN,\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 PPDevHotContext;\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 rules for a saved user's name, which is also its host (`<name>.localhost`), for both sides:\n * the server checks them (`src/lib/user-registry.ts`) and the dev panel's Users popover\n * (`src/client/users-panel.ts`) checks them as you type. No Node or DOM imports: the panel bundle\n * includes it.\n */\n\n/** Longest user name; well under the 63 characters a DNS label allows. */\nexport const MAX_USER_NAME_LENGTH = 32;\n\n/**\n * A DNS label: lowercase latin letters, digits and `-`, starting with a letter and not ending with\n * `-`. Also used as an input's `pattern`, which browsers compile with the `v` flag: there an\n * unescaped `-` in a class is a syntax error, and the whole pattern was silently ignored.\n */\nexport const USER_NAME_PATTERN = String.raw`[a-z](?:[a-z0-9\\-]*[a-z0-9])?`;\n\nconst USER_NAME_REGEXP = new RegExp(`^(?:${USER_NAME_PATTERN})$`);\n\n/** The suffix of a user's host: `viewer` works on `viewer.localhost`. */\nexport const USER_HOST_SUFFIX = '.localhost';\n\n/** Why `name` can't be a user name, or `undefined` if it can. */\nexport function getUserNameError(name: string): string | undefined {\n if (!name) {\n return 'The name is required';\n }\n\n if (name.length > MAX_USER_NAME_LENGTH) {\n return `The name must be at most ${MAX_USER_NAME_LENGTH} characters long`;\n }\n\n if (!USER_NAME_REGEXP.test(name)) {\n return 'The name may contain only lowercase latin letters, digits and \"-\", must start with a letter and must not end with \"-\"';\n }\n\n return undefined;\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\nimport { MAX_USER_NAME_LENGTH, USER_HOST_SUFFIX, USER_NAME_PATTERN, getUserNameError } from '../shared/user-names.js';\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\n// The server's name rules (src/shared/user-names.ts), not a copy of them.\nconst USER_HOST_REGEXP = new RegExp(`^(${USER_NAME_PATTERN})${USER_HOST_SUFFIX.replace('.', '\\\\.')}$`);\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 // Only the latest refresh paints: two quick default switches sent two, and the first one's\n // answer, arriving last, drew the state before the second.\n let refreshSeq = 0;\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=\"${MAX_USER_NAME_LENGTH}\" pattern=\"${USER_NAME_PATTERN}\"\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 if (!target) {\n return;\n }\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 ?? null);\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 $save = $form.querySelector<HTMLButtonElement>('button[type=\"submit\"]');\n\n // One request at a time, as the Add form does: Enter twice sent a second PATCH, which a\n // rename answered with 404, shown as \"not found\" although the rename had gone through.\n if (!name || $form.dataset.submitting === 'true') {\n return;\n }\n\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\n $form.dataset.submitting = 'true';\n\n if ($save) {\n $save.disabled = true;\n }\n\n // Held until the answer is read and the list refreshed: released when the headers came, a\n // second Enter while a rename's body was on its way sent a PATCH to the old name (404).\n try {\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 } finally {\n delete $form.dataset.submitting;\n\n if ($save) {\n $save.disabled = false;\n }\n }\n });\n\n $list.querySelectorAll<HTMLButtonElement>('[data-remove]').forEach(($remove) => {\n $remove.addEventListener('click', async (ev) => {\n ev.preventDefault();\n\n const name = $remove.dataset.remove;\n\n if (name && (await request('DELETE', `${USERS_API}/${encodeURIComponent(name)}`))) {\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 const seq = ++refreshSeq;\n\n try {\n const response = await fetch(USERS_API);\n\n if (!response.ok) {\n return;\n }\n\n const loaded = (await response.json()) as UsersResponse;\n\n if (seq !== refreshSeq) {\n return;\n }\n\n data = loaded;\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\n if (!$name || !$token || !$submit) {\n return;\n }\n\n const name = $name.value.trim();\n const nameError = getUserNameError(name);\n\n if (nameError) {\n setError(nameError);\n\n return;\n }\n\n const body = addKind === 'token' ? { name, token: $token.value } : { name, kind: 'session' };\n // A session user logs in on a tab of its own. Opened here, while the click still counts as the\n // user's: opened after the request, Safari and Chrome blocked it as a popup.\n const loginTab = addKind === 'session' ? window.open('', '_blank') : null;\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 loginTab?.close();\n\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 && loginTab) {\n loginTab.location.href = user.loginUrl;\n } else {\n loginTab?.close();\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=\"${MAX_USER_NAME_LENGTH}\"\n autocomplete=\"off\" spellcheck=\"false\" pattern=\"${USER_NAME_PATTERN}\"\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\n/**\n * Calls `onElapsed` once the page has been visible for `duration` ms in all (time in a hidden tab\n * doesn't count). Returns a function that stops waiting, which also removes the page's\n * `visibilitychange` listener: one used to stay behind for every popup ever shown.\n */\nexport function startAutoDismiss(duration: number, onElapsed: () => void): () => void {\n let remaining = duration;\n let lastUpdate = Date.now();\n let visible = true;\n let frame: number | undefined;\n\n const tick = () => {\n frame = undefined;\n\n if (!visible) {\n return;\n }\n\n const now = Date.now();\n\n remaining -= now - lastUpdate;\n lastUpdate = now;\n\n if (remaining <= 0) {\n stop();\n onElapsed();\n\n return;\n }\n\n frame = requestAnimationFrame(tick);\n };\n\n const onVisibilityChange = () => {\n visible = !document.hidden;\n\n if (visible) {\n lastUpdate = Date.now();\n frame ??= requestAnimationFrame(tick);\n }\n };\n\n const stop = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange);\n\n if (frame !== undefined) {\n cancelAnimationFrame(frame);\n frame = undefined;\n }\n };\n\n document.addEventListener('visibilitychange', onVisibilityChange);\n frame = requestAnimationFrame(tick);\n\n return stop;\n}\n","import type { ViteHotContext } from 'vite/types/hot.js';\nimport type { InfoPopupOptions } from './popup.js';\nimport {\n SYNC_IN_PROGRESS_CODE,\n type SyncActionRequiredPayload,\n type SyncActionResponsePayload,\n type TemplateSyncResponsePayload,\n} from '../shared/ws-messages.js';\n\nexport type { SyncActionRequiredPayload, TemplateSyncResponsePayload };\n\nconst TITLE_AVAILABLE = 'Sync template';\nconst TITLE_UNAVAILABLE = 'Sync is unavailable on this instance';\n\nexport interface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\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'> & { isConnected?: () => boolean },\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 // Vite's connection is taken as open until reported lost: it may have opened before these handlers\n // were registered, and its client reloads the page once a lost one is back. The `pp-dev next`\n // transport says itself whether its socket is open, also while the first one is still connecting.\n let connected = true;\n const isConnected = () => connected && (hot.isConnected?.() ?? true);\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', {\n requestId: payload.requestId,\n approved,\n } satisfies SyncActionResponsePayload);\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:connect', () => {\n connected = true;\n });\n\n hot.on('vite:ws:disconnect', () => {\n connected = false;\n\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 // Sent now, the request would wait for a reconnect with the button spinning, and start a sync\n // whenever that happens. Say so instead, and let the click be repeated once connected.\n if (!isConnected()) {\n deps.infoPopup({\n title: 'No connection',\n content: 'The dev server is not connected. Check that it is running, then try again.',\n type: 'warning',\n });\n\n return;\n }\n\n syncing = true;\n applyState();\n hot.send('template:sync', {});\n });\n}\n","import type { ViteHotContext } from 'vite/types/hot.js';\nimport type { InfoPopupOptions } from './popup.js';\n\ntype PageVariablesReloadResponsePayload = { ok: true; count: number; skipped: boolean } | { error: string };\n\nexport interface ReloadVariablesDeps {\n infoPopup: (opts: InfoPopupOptions) => { close: () => void };\n /** Reloads the page once the variables are reloaded; `window.location.reload` by default. */\n reload?: () => void;\n}\n\n/**\n * Wires the dev panel's \"Reload variables\" action to the dev server, and returns what starts it.\n *\n * Like the sync button, it refuses to start while the dev server is not connected: both transports\n * keep a message until the socket is back, so the \"Reloading variables\" popup, which stays until\n * an answer comes, stayed until a reconnect — and the page then reloaded on its own, unasked. A\n * connection lost while waiting ends the wait the same way.\n */\nexport function initReloadVariables(\n hot: Pick<ViteHotContext, 'on' | 'send'> & { isConnected?: () => boolean },\n deps: ReloadVariablesDeps,\n): () => void {\n const reload = deps.reload ?? (() => window.location.reload());\n // As the sync button takes it: Vite's connection is open until reported lost; the `pp-dev next`\n // transport says itself whether its socket is open.\n let connected = true;\n let pending: { close: () => void } | null = null;\n const isConnected = () => connected && (hot.isConnected?.() ?? true);\n\n const endWait = () => {\n pending?.close();\n pending = null;\n };\n\n hot.on('vite:ws:connect', () => {\n connected = true;\n });\n\n hot.on('vite:ws:disconnect', () => {\n connected = false;\n\n if (!pending) {\n return;\n }\n\n endWait();\n deps.infoPopup({\n title: 'Reload variables interrupted',\n content: 'The connection to the dev server was lost. Try again once it is back.',\n type: 'warning',\n });\n });\n\n hot.on('page-variables:reload:response', (payload: PageVariablesReloadResponsePayload) => {\n endWait();\n\n if ('error' in payload) {\n deps.infoPopup({\n title: 'Reload variables error',\n content: payload.error,\n type: 'danger',\n });\n\n return;\n }\n\n if (payload.skipped) {\n deps.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 deps.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(reload, 600);\n });\n\n return () => {\n if (!isConnected()) {\n deps.infoPopup({\n title: 'No connection',\n content: 'The dev server is not connected. Check that it is running, then try again.',\n type: 'warning',\n });\n\n return;\n }\n\n endWait();\n pending = deps.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","/// <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, startAutoDismiss, type InfoPopupOptions } from './popup.js';\nimport { initSyncButton, type ConfirmModalOptions } from './sync-button.js';\nimport { initReloadVariables } from './reload-variables.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\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;\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 let removed = false;\n let stopAutoDismiss: (() => void) | undefined;\n\n // Once only: closing it by hand used to leave its timer running, which removed it again and\n // counted it out of `activePopups` twice.\n const removePopup = async () => {\n if (removed) {\n return;\n }\n\n removed = true;\n stopAutoDismiss?.();\n\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 stopAutoDismiss = startAutoDismiss(duration, removePopup);\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 startReloadVariablesFlow = initReloadVariables(hot, { infoPopup });\n}\n"],"names":["CLOSED_CLASS"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12]}
|