@metricinsights/pp-dev 1.1.1 → 1.2.1
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/CHANGELOG.md +30 -0
- package/README.md +42 -1
- package/TEMPLATE_VARIABLES.md +125 -0
- package/dist/CHANGELOG.md +30 -0
- package/dist/README.md +42 -1
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/index-XIFH2ace.js +2 -0
- package/dist/cjs/index-XIFH2ace.js.map +1 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/package.json +9 -5
- package/dist/cjs/plugin-lLb1ogcl.js +2 -0
- package/dist/cjs/plugin-lLb1ogcl.js.map +1 -0
- package/dist/cjs/plugin.js +1 -1
- package/dist/cjs/{version-plugin-Bhywa-Hu.js → version-plugin-C0xv4wbw.js} +2 -2
- package/dist/cjs/{version-plugin-Bhywa-Hu.js.map → version-plugin-C0xv4wbw.js.map} +1 -1
- package/dist/client/client.css +1 -1
- package/dist/client/client.css.map +1 -1
- package/dist/client/client.js +128 -2
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.html +1 -0
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index-BtZKQ3Ni.js +2 -0
- package/dist/esm/index-BtZKQ3Ni.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/package.json +9 -5
- package/dist/esm/plugin-BtTlYPNc.js +2 -0
- package/dist/esm/plugin-BtTlYPNc.js.map +1 -0
- package/dist/esm/plugin.js +1 -1
- package/dist/esm/{version-plugin-Lyuzh4c2.js → version-plugin-7_CHPYR-.js} +2 -2
- package/dist/esm/{version-plugin-Lyuzh4c2.js.map → version-plugin-7_CHPYR-.js.map} +1 -1
- package/docs/features.md +99 -0
- package/docs/screenshots/01-panel-expanded.png +0 -0
- package/docs/screenshots/02-panel-minimized.png +0 -0
- package/docs/screenshots/03-panel-settings.png +0 -0
- package/docs/screenshots/04-inspector-list.png +0 -0
- package/docs/screenshots/05-inspector-detail.png +0 -0
- package/docs/screenshots/06-editor-schema.png +0 -0
- package/docs/screenshots/07-editor-schema-advanced.png +0 -0
- package/docs/screenshots/08-editor-schema-help-modal.png +0 -0
- package/docs/screenshots/09-editor-values.png +0 -0
- package/docs/screenshots/10-editor-values-json.png +0 -0
- package/docs/screenshots/11-editor-theme-light.png +0 -0
- package/docs/screenshots/12-editor-theme-dark.png +0 -0
- package/package.json +10 -6
- package/scripts/patch-npm-bundled-vulnerabilities.mjs +66 -11
- package/dist/cjs/index-ctxv-2Kt.js +0 -2
- package/dist/cjs/index-ctxv-2Kt.js.map +0 -1
- package/dist/cjs/plugin-cgWPoZgR.js +0 -2
- package/dist/cjs/plugin-cgWPoZgR.js.map +0 -1
- package/dist/esm/index-N58WZBr_.js +0 -2
- package/dist/esm/index-N58WZBr_.js.map +0 -1
- package/dist/esm/plugin-ClbE2EOy.js +0 -2
- package/dist/esm/plugin-ClbE2EOy.js.map +0 -1
package/dist/client/client.js
CHANGED
|
@@ -137,6 +137,8 @@ const STORAGE_KEYS = {
|
|
|
137
137
|
position: 'pp-dev-info-position',
|
|
138
138
|
autoHide: 'pp-dev-info-auto-hide',
|
|
139
139
|
hidden: 'pp-dev-info-hidden',
|
|
140
|
+
/** Shared with the standalone Inspector/Variables Editor pages — same key, same values. */
|
|
141
|
+
theme: 'pp-dev-info-theme',
|
|
140
142
|
};
|
|
141
143
|
function checkLocalStorage() {
|
|
142
144
|
try {
|
|
@@ -441,13 +443,41 @@ function initAutoHide($panel, isActive) {
|
|
|
441
443
|
};
|
|
442
444
|
}
|
|
443
445
|
|
|
446
|
+
// Theme override (Auto/Dark/Light), shared across the dev panel and the standalone
|
|
447
|
+
// Inspector/Variables Editor pages via the same localStorage key (see STORAGE_KEYS.theme) and
|
|
448
|
+
// the same `data-pp-dev-theme` attribute convention (prefixed to avoid colliding with a host
|
|
449
|
+
// Portal Page's own theme attribute, since the panel is injected into pages pp-dev doesn't own).
|
|
450
|
+
const THEME_ATTR = 'data-pp-dev-theme';
|
|
451
|
+
function getStoredTheme() {
|
|
452
|
+
const value = getStorageItem(STORAGE_KEYS.theme);
|
|
453
|
+
return value === 'dark' || value === 'light' ? value : 'auto';
|
|
454
|
+
}
|
|
455
|
+
function applyTheme(theme) {
|
|
456
|
+
if (theme === 'dark' || theme === 'light') {
|
|
457
|
+
document.documentElement.setAttribute(THEME_ATTR, theme);
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
document.documentElement.removeAttribute(THEME_ATTR);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
function setTheme(theme) {
|
|
464
|
+
setStorageItem(STORAGE_KEYS.theme, theme);
|
|
465
|
+
applyTheme(theme);
|
|
466
|
+
}
|
|
467
|
+
/** Call once on page load to apply whatever was last chosen (defaults to 'auto', a no-op). */
|
|
468
|
+
function initTheme() {
|
|
469
|
+
applyTheme(getStoredTheme());
|
|
470
|
+
}
|
|
471
|
+
|
|
444
472
|
const CORNER_TITLES = {
|
|
445
473
|
'top-left': 'Top left',
|
|
446
474
|
'top-right': 'Top right',
|
|
447
475
|
'bottom-left': 'Bottom left',
|
|
448
476
|
'bottom-right': 'Bottom right',
|
|
449
477
|
};
|
|
450
|
-
|
|
478
|
+
const THEME_CHOICES = ['auto', 'dark', 'light'];
|
|
479
|
+
const THEME_LABELS = { auto: 'Auto', dark: 'Dark', light: 'Light' };
|
|
480
|
+
function buildPopover(controller, showPageVariablesGroup) {
|
|
451
481
|
const state = controller.getState();
|
|
452
482
|
const $popover = document.createElement('div');
|
|
453
483
|
$popover.classList.add('pp-dev-info__settings');
|
|
@@ -455,6 +485,21 @@ function buildPopover(controller) {
|
|
|
455
485
|
const active = corner === state.position ? ' active' : '';
|
|
456
486
|
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>`;
|
|
457
487
|
}).join('');
|
|
488
|
+
const currentTheme = getStoredTheme();
|
|
489
|
+
const themeButtons = THEME_CHOICES.map((choice) => {
|
|
490
|
+
const active = choice === currentTheme ? ' active' : '';
|
|
491
|
+
return `<button type="button" class="pp-dev-info__theme-btn${active}" data-theme-choice="${choice}" aria-pressed="${choice === currentTheme}">${THEME_LABELS[choice]}</button>`;
|
|
492
|
+
}).join('');
|
|
493
|
+
const pageVariablesRow = showPageVariablesGroup
|
|
494
|
+
? `
|
|
495
|
+
<div class="pp-dev-info__settings-group">
|
|
496
|
+
<span class="pp-dev-info__settings-label">Page variables</span>
|
|
497
|
+
<div class="pp-dev-info__vars-buttons" role="group" aria-label="Page variables">
|
|
498
|
+
<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>
|
|
499
|
+
<button type="button" class="pp-dev-info__vars-btn pp-dev-info__open-editor-btn">Open variables editor…</button>
|
|
500
|
+
</div>
|
|
501
|
+
</div>`
|
|
502
|
+
: '';
|
|
458
503
|
$popover.innerHTML = `
|
|
459
504
|
<div class="pp-dev-info__settings-title">Panel settings</div>
|
|
460
505
|
<div class="pp-dev-info__settings-row">
|
|
@@ -470,6 +515,17 @@ function buildPopover(controller) {
|
|
|
470
515
|
${state.autoHide ? 'checked' : ''}
|
|
471
516
|
/>
|
|
472
517
|
</div>
|
|
518
|
+
<div class="pp-dev-info__settings-row">
|
|
519
|
+
<span class="pp-dev-info__settings-label">Theme</span>
|
|
520
|
+
<div class="pp-dev-info__theme-grid" role="group" aria-label="Theme">${themeButtons}</div>
|
|
521
|
+
</div>
|
|
522
|
+
${pageVariablesRow}
|
|
523
|
+
<div class="pp-dev-info__settings-group">
|
|
524
|
+
<span class="pp-dev-info__settings-label">Dev tools</span>
|
|
525
|
+
<div class="pp-dev-info__vars-buttons" role="group" aria-label="Dev tools">
|
|
526
|
+
<button type="button" class="pp-dev-info__vars-btn pp-dev-info__open-inspector-btn">Open request inspector…</button>
|
|
527
|
+
</div>
|
|
528
|
+
</div>
|
|
473
529
|
<button type="button" class="pp-dev-info__settings-hide-btn">Hide panel</button>
|
|
474
530
|
<div class="pp-dev-info__settings-hint">Restore with <code>?pp-dev-panel=show</code> in the URL</div>
|
|
475
531
|
<span class="pp-dev-info__settings-reset" role="button" tabindex="0">Reset to config defaults</span>
|
|
@@ -517,7 +573,8 @@ function initPanelSettings($panel, controller, hooks) {
|
|
|
517
573
|
hooks?.onOpenChange?.(false);
|
|
518
574
|
};
|
|
519
575
|
const open = () => {
|
|
520
|
-
|
|
576
|
+
const showPageVariablesGroup = $panel.dataset.templateLess !== 'true';
|
|
577
|
+
$popover = buildPopover(controller, showPageVariablesGroup);
|
|
521
578
|
$popover.querySelectorAll('.pp-dev-info__corner-btn').forEach(($cornerBtn) => {
|
|
522
579
|
$cornerBtn.addEventListener('click', (ev) => {
|
|
523
580
|
ev.preventDefault();
|
|
@@ -527,11 +584,34 @@ function initPanelSettings($panel, controller, hooks) {
|
|
|
527
584
|
$popover.querySelector('.pp-dev-info__settings-toggle')?.addEventListener('change', (ev) => {
|
|
528
585
|
controller.setAutoHide(ev.target.checked);
|
|
529
586
|
});
|
|
587
|
+
$popover.querySelectorAll('.pp-dev-info__theme-btn').forEach(($themeBtn) => {
|
|
588
|
+
$themeBtn.addEventListener('click', (ev) => {
|
|
589
|
+
ev.preventDefault();
|
|
590
|
+
setTheme($themeBtn.dataset.themeChoice);
|
|
591
|
+
$popover.querySelectorAll('.pp-dev-info__theme-btn').forEach(($btn) => {
|
|
592
|
+
const active = $btn === $themeBtn;
|
|
593
|
+
$btn.classList.toggle('active', active);
|
|
594
|
+
$btn.setAttribute('aria-pressed', String(active));
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
});
|
|
530
598
|
$popover.querySelector('.pp-dev-info__settings-hide-btn')?.addEventListener('click', (ev) => {
|
|
531
599
|
ev.preventDefault();
|
|
532
600
|
close();
|
|
533
601
|
controller.setHidden(true);
|
|
534
602
|
});
|
|
603
|
+
const actions = [
|
|
604
|
+
['.pp-dev-info__open-editor-btn', hooks?.onOpenVariablesEditorClick],
|
|
605
|
+
['.pp-dev-info__reload-vars-btn', hooks?.onReloadVariablesClick],
|
|
606
|
+
['.pp-dev-info__open-inspector-btn', hooks?.onOpenInspectorClick],
|
|
607
|
+
];
|
|
608
|
+
actions.forEach(([selector, hook]) => {
|
|
609
|
+
$popover.querySelector(selector)?.addEventListener('click', (ev) => {
|
|
610
|
+
ev.preventDefault();
|
|
611
|
+
close();
|
|
612
|
+
hook?.();
|
|
613
|
+
});
|
|
614
|
+
});
|
|
535
615
|
const $reset = $popover.querySelector('.pp-dev-info__settings-reset');
|
|
536
616
|
$reset?.addEventListener('click', (ev) => {
|
|
537
617
|
ev.preventDefault();
|
|
@@ -565,6 +645,9 @@ function initPanelSettings($panel, controller, hooks) {
|
|
|
565
645
|
}
|
|
566
646
|
|
|
567
647
|
/// <reference types="vite/client" />
|
|
648
|
+
// Applied unconditionally (even if the panel itself is hidden) — this is what makes the
|
|
649
|
+
// override affect the whole injected panel, not just its own markup.
|
|
650
|
+
initTheme();
|
|
568
651
|
const POPUP_OFFSET = 10;
|
|
569
652
|
const POPUP_HEIGHT = 100;
|
|
570
653
|
const ANIMATION_DURATION = 300;
|
|
@@ -621,6 +704,8 @@ function createPopupElement(opts) {
|
|
|
621
704
|
return $popup;
|
|
622
705
|
}
|
|
623
706
|
let panelController = null;
|
|
707
|
+
let startReloadVariablesFlow = null;
|
|
708
|
+
let pendingReloadVariablesPopup = null;
|
|
624
709
|
function updatePopupPositions() {
|
|
625
710
|
const popups = document.querySelectorAll('.pp-dev-info-namespace:not(.pp-dev-info)');
|
|
626
711
|
const position = panelController?.getState().position ?? 'bottom-right';
|
|
@@ -710,6 +795,7 @@ function infoPopup(opts) {
|
|
|
710
795
|
});
|
|
711
796
|
requestAnimationFrame(scheduleDismiss);
|
|
712
797
|
}
|
|
798
|
+
return { close: removePopup };
|
|
713
799
|
}
|
|
714
800
|
function closeAllConfirmModals() {
|
|
715
801
|
for (const overlay of [...activeConfirmModals.keys()]) {
|
|
@@ -784,6 +870,9 @@ if ($infoPanel) {
|
|
|
784
870
|
const autoHide = initAutoHide($infoPanel, () => panelController.getState().autoHide);
|
|
785
871
|
initPanelSettings($infoPanel, panelController, {
|
|
786
872
|
onOpenChange: (open) => autoHide.keepPeeked(open),
|
|
873
|
+
onOpenVariablesEditorClick: () => window.open(window.location.origin + '/@pp-dev/variables-editor', '_blank'),
|
|
874
|
+
onOpenInspectorClick: () => window.open(window.location.origin + '/@pp-dev/inspector', '_blank'),
|
|
875
|
+
onReloadVariablesClick: () => startReloadVariablesFlow?.(),
|
|
787
876
|
});
|
|
788
877
|
panelController.onChange((state) => {
|
|
789
878
|
if (!state.autoHide) {
|
|
@@ -903,5 +992,42 @@ if (hot) {
|
|
|
903
992
|
hot.send('template:sync', {});
|
|
904
993
|
});
|
|
905
994
|
}
|
|
995
|
+
hot.on('page-variables:reload:response', (payload) => {
|
|
996
|
+
pendingReloadVariablesPopup?.close();
|
|
997
|
+
pendingReloadVariablesPopup = null;
|
|
998
|
+
if ('error' in payload) {
|
|
999
|
+
infoPopup({
|
|
1000
|
+
title: 'Reload variables error',
|
|
1001
|
+
content: payload.error,
|
|
1002
|
+
type: 'danger',
|
|
1003
|
+
});
|
|
1004
|
+
return;
|
|
1005
|
+
}
|
|
1006
|
+
if (payload.skipped) {
|
|
1007
|
+
infoPopup({
|
|
1008
|
+
title: 'Nothing to reload',
|
|
1009
|
+
content: 'This page has no template variables to refresh.',
|
|
1010
|
+
type: 'warning',
|
|
1011
|
+
});
|
|
1012
|
+
return;
|
|
1013
|
+
}
|
|
1014
|
+
infoPopup({
|
|
1015
|
+
title: 'Variables reloaded',
|
|
1016
|
+
content: `Refetched ${payload.count} variable(s) from MI. Reloading the page…`,
|
|
1017
|
+
type: 'success',
|
|
1018
|
+
duration: 1200,
|
|
1019
|
+
});
|
|
1020
|
+
setTimeout(() => window.location.reload(), 600);
|
|
1021
|
+
});
|
|
1022
|
+
startReloadVariablesFlow = () => {
|
|
1023
|
+
pendingReloadVariablesPopup?.close();
|
|
1024
|
+
pendingReloadVariablesPopup = infoPopup({
|
|
1025
|
+
title: 'Reloading variables',
|
|
1026
|
+
content: 'Refetching live values from MI…',
|
|
1027
|
+
type: 'info',
|
|
1028
|
+
duration: 0,
|
|
1029
|
+
});
|
|
1030
|
+
hot.send('page-variables:reload', {});
|
|
1031
|
+
};
|
|
906
1032
|
}
|
|
907
1033
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../src/client/hot-context.ts","../../src/client/storage.ts","../../src/client/panel-state.ts","../../src/client/panel-position.ts","../../src/client/panel-settings.ts","../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\n\n/**\n * Minimal `import.meta.hot`-compatible context for environments without Vite HMR\n * (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and\n * `hot.send()`; this shim implements those over a raw WebSocket using the same\n * custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.\n *\n * Used only as a fallback: when `import.meta.hot` exists (Vite), that is used\n * instead and this code never runs.\n */\n\n/**\n * WebSocket path the pp-dev Next.js server listens on for dev-panel messages.\n * Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).\n */\nconst PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\ntype CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\ntype Handler = (payload: any) => void;\n\nconst MAX_OUTBOX_SIZE = 50;\n\nfunction resolveWebSocketUrl(): string {\n const { protocol, host } = window.location;\n const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';\n\n return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;\n}\n\nexport function createPPDevHotContext(): ViteHotContext {\n const handlers = new Map<string, Set<Handler>>();\n /** Outgoing messages queued while the socket is not OPEN; flushed on connect. */\n const outbox: string[] = [];\n\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectDelay = 1_000;\n const MAX_RECONNECT_DELAY = 10_000;\n\n const flushOutbox = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n while (outbox.length > 0) {\n socket.send(outbox.shift()!);\n }\n };\n\n const dispatch = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n\n if (!eventHandlers) {\n return;\n }\n\n for (const handler of eventHandlers) {\n try {\n handler(data);\n } catch (err) {\n // A failing handler must not break dispatch to the others.\n console.error(`[pp-dev] hot handler for \"${event}\" failed`, err);\n }\n }\n };\n\n const connect = () => {\n try {\n socket = new WebSocket(resolveWebSocketUrl());\n } catch (err) {\n console.error('[pp-dev] failed to open dev-panel WebSocket', err);\n scheduleReconnect();\n\n return;\n }\n\n socket.addEventListener('open', () => {\n reconnectDelay = 1_000;\n flushOutbox();\n });\n\n socket.addEventListener('message', (ev) => {\n let message: CustomMessage;\n\n try {\n message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n\n if (message && message.type === 'custom' && typeof message.event === 'string') {\n dispatch(message.event, message.data);\n }\n });\n\n socket.addEventListener('close', () => {\n socket = null;\n scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n // `close` follows `error`; reconnect is scheduled there.\n socket?.close();\n });\n };\n\n const scheduleReconnect = () => {\n if (reconnectTimer) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);\n connect();\n }, reconnectDelay);\n };\n\n connect();\n\n const noop = () => {};\n\n const context: Pick<ViteHotContext, 'on' | 'off' | 'send'> & Partial<ViteHotContext> = {\n on(event, cb) {\n let set = handlers.get(event);\n\n if (!set) {\n set = new Set();\n handlers.set(event, set);\n }\n\n set.add(cb as Handler);\n },\n off(event, cb) {\n handlers.get(event)?.delete(cb as Handler);\n },\n send(event, data) {\n const payload = JSON.stringify({ type: 'custom', event, data } satisfies CustomMessage);\n\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(payload);\n } else {\n if (outbox.length >= MAX_OUTBOX_SIZE) {\n outbox.shift();\n }\n\n outbox.push(payload);\n }\n },\n // Unused by the dev-panel client; provided as no-ops to satisfy the shape.\n accept: noop as ViteHotContext['accept'],\n acceptExports: noop as ViteHotContext['acceptExports'],\n dispose: noop,\n prune: noop,\n invalidate: noop,\n data: {},\n };\n\n return context as ViteHotContext;\n}\n","// localStorage helpers guarded against environments where storage is unavailable\n// (e.g. sandboxed iframes). Keys follow the original `pp-dev-info-closed` naming.\n\nexport const STORAGE_KEYS = {\n closed: 'pp-dev-info-closed',\n position: 'pp-dev-info-position',\n autoHide: 'pp-dev-info-auto-hide',\n hidden: 'pp-dev-info-hidden',\n} 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","import type { Corner, PanelStateController } from './panel-state.js';\nimport { CORNERS } from './panel-state.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\nfunction buildPopover(controller: PanelStateController): 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 $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 <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}\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 $popover = buildPopover(controller);\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.querySelector<HTMLButtonElement>('.pp-dev-info__settings-hide-btn')?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n controller.setHidden(true);\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","/// <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';\n\ninterface 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\ninterface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ninterface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\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\nconst ICON_SIZE = 16;\nconst CLOSE_ICON_SIZE = 12;\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\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\nfunction createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const typeClass = opts.type ? `pp-dev-info__popup--${opts.type}` : '';\n const iconHtml = opts.type ? `<div class=\"pp-dev-info__popup-title-icon\">${TYPE_ICONS[opts.type]}</div>` : '';\n\n const template = `\n <div class=\"pp-dev-info__popup ${typeClass} ${opts.className || ''}\" style=\"${opts.style || ''}\">\n <div class=\"pp-dev-info__popup-title\">\n ${iconHtml}\n <div class=\"pp-dev-info__popup-title-text\">${opts.title}</div>\n <div class=\"pp-dev-info__popup-title-close\">\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 </div>\n </div>\n <div class=\"pp-dev-info__popup-content\">${opts.content}</div>\n </div>\n `;\n\n $popup.innerHTML = template;\n\n return $popup;\n}\n\nlet panelController: PanelStateController | 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) {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n const scheduleDismiss = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n requestAnimationFrame(scheduleDismiss);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(scheduleDismiss);\n }\n });\n\n requestAnimationFrame(scheduleDismiss);\n }\n}\n\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 });\n\n panelController.onChange((state) => {\n if (!state.autoHide) {\n $infoPanel.classList.remove('is-peeking');\n }\n\n updatePopupPositions();\n });\n\n // Minimize button; in auto-hide mode it acts as \"pin\" (disables auto-hide).\n const $minimizeButtonWrap = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($minimizeButtonWrap && $minimizeButtonSVG) {\n let isClosed = getStorageItem(STORAGE_KEYS.closed) === 'true' && !panelController.getState().autoHide;\n\n const updateTitle = () => {\n $minimizeButtonWrap.title = panelController!.getState().autoHide ? 'Pin panel' : 'Minimize';\n };\n\n updateTitle();\n panelController.onChange(updateTitle);\n\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n if (panelController!.getState().autoHide) {\n isClosed = false;\n panelController!.setAutoHide(false);\n\n return;\n }\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(STORAGE_KEYS.closed, isClosed ? 'true' : 'false');\n });\n }\n}\n\n// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket\n// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).\nconst hot = import.meta.hot ?? createPPDevHotContext();\n\nif (hot) {\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n hot.on('client:config:update', (data: { config: { [key: string]: any } }) => {\n if (typeof data.config?.canSync === 'boolean') {\n if (data.config.canSync) {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = false;\n $syncButton.classList.remove('disabled');\n $syncButton.title = 'Sync template';\n }\n } else {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n }\n }\n });\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n // Keep the sync spinner running while a confirmation modal is shown — the sync\n // process is still in progress and only ends on `template:sync:response`.\n const approved = await confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', {\n requestId: payload.requestId,\n approved,\n });\n });\n\n hot.on(\n 'template:sync:response',\n (\n payload:\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; config?: { [p: string]: any }; refresh?: boolean }\n | { cancelled: boolean; message: string },\n ) => {\n closeAllConfirmModals();\n $syncButton.classList.remove('syncing');\n\n if ('cancelled' in payload && payload.cancelled) {\n infoPopup({\n title: 'Sync cancelled',\n content: payload.message,\n type: 'warning',\n });\n } else if ('error' in payload && typeof payload.error !== 'undefined') {\n infoPopup({\n title: 'Sync error',\n content: payload.error,\n type: 'danger',\n });\n\n if (payload.refresh) {\n setTimeout(() => {\n window.location.reload();\n });\n } else {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n } else if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.<br />Backup filename: ${\n payload.backupFilename\n }`,\n type: 'success',\n });\n }\n },\n );\n\n $syncButton.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n $syncButton.classList.add('syncing');\n\n hot.send('template:sync', {});\n });\n }\n}\n"],"names":["CLOSED_CLASS"],"mappings":"AAGA;;;;;;;;AAQG;AAEH;;;AAGG;AACH,MAAM,kBAAkB,GAAG,cAAc;AAMzC,MAAM,eAAe,GAAG,EAAE;AAE1B,SAAS,mBAAmB,GAAA;IAC1B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ;AAC1C,IAAA,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK;AAEzD,IAAA,OAAO,GAAG,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,kBAAkB,EAAE;AACtD;SAEgB,qBAAqB,GAAA;AACnC,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB;;IAEhD,MAAM,MAAM,GAAa,EAAE;IAE3B,IAAI,MAAM,GAAqB,IAAI;IACnC,IAAI,cAAc,GAAyC,IAAI;IAC/D,IAAI,cAAc,GAAG,KAAK;IAC1B,MAAM,mBAAmB,GAAG,MAAM;IAElC,MAAM,WAAW,GAAG,MAAK;QACvB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;YACnD;QACF;AAEA,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAG,CAAC;QAC9B;AACF,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;QAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAEzC,IAAI,CAAC,aAAa,EAAE;YAClB;QACF;AAEA,QAAA,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;AACnC,YAAA,IAAI;gBACF,OAAO,CAAC,IAAI,CAAC;YACf;YAAE,OAAO,GAAG,EAAE;;gBAEZ,OAAO,CAAC,KAAK,CAAC,CAAA,0BAAA,EAA6B,KAAK,CAAA,QAAA,CAAU,EAAE,GAAG,CAAC;YAClE;QACF;AACF,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,IAAI,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAC/C;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC;AACjE,YAAA,iBAAiB,EAAE;YAEnB;QACF;AAEA,QAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAK;YACnC,cAAc,GAAG,KAAK;AACtB,YAAA,WAAW,EAAE;AACf,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAI;AACxC,YAAA,IAAI,OAAsB;AAE1B,YAAA,IAAI;gBACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;YAClE;AAAE,YAAA,MAAM;gBACN;YACF;AAEA,YAAA,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;gBAC7E,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;YACpC,MAAM,GAAG,IAAI;AACb,YAAA,iBAAiB,EAAE;AACrB,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;;YAEpC,MAAM,EAAE,KAAK,EAAE;AACjB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAK;QAC7B,IAAI,cAAc,EAAE;YAClB;QACF;AAEA,QAAA,cAAc,GAAG,UAAU,CAAC,MAAK;YAC/B,cAAc,GAAG,IAAI;YACrB,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,mBAAmB,CAAC;AAClE,YAAA,OAAO,EAAE;QACX,CAAC,EAAE,cAAc,CAAC;AACpB,IAAA,CAAC;AAED,IAAA,OAAO,EAAE;AAET,IAAA,MAAM,IAAI,GAAG,MAAK,EAAE,CAAC;AAErB,IAAA,MAAM,OAAO,GAA0E;QACrF,EAAE,CAAC,KAAK,EAAE,EAAE,EAAA;YACV,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAE7B,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,GAAG,GAAG,IAAI,GAAG,EAAE;AACf,gBAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;YAC1B;AAEA,YAAA,GAAG,CAAC,GAAG,CAAC,EAAa,CAAC;QACxB,CAAC;QACD,GAAG,CAAC,KAAK,EAAE,EAAE,EAAA;YACX,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAa,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,IAAI,EAAA;AACd,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAA0B,CAAC;YAEvF,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;AAClD,gBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB;iBAAO;AACL,gBAAA,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE;oBACpC,MAAM,CAAC,KAAK,EAAE;gBAChB;AAEA,gBAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACtB;QACF,CAAC;;AAED,QAAA,MAAM,EAAE,IAAgC;AACxC,QAAA,aAAa,EAAE,IAAuC;AACtD,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,IAAI,EAAE,EAAE;KACT;AAED,IAAA,OAAO,OAAyB;AAClC;;AClKA;AACA;AAEO,MAAM,YAAY,GAAG;AAC1B,IAAA,MAAM,EAAE,oBAAoB;AAC5B,IAAA,QAAQ,EAAE,sBAAsB;AAChC,IAAA,QAAQ,EAAE,uBAAuB;AACjC,IAAA,MAAM,EAAE,oBAAoB;CACpB;SAEM,iBAAiB,GAAA;AAC/B,IAAA,IAAI;AACF,QAAA,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;AACpC,QAAA,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;AAE/B,QAAA,OAAO,IAAI;IACb;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,KAAK;IACd;AACF;AAEM,SAAU,cAAc,CAAC,GAAW,EAAE,KAAa,EAAA;IACvD,IAAI,iBAAiB,EAAE,EAAE;AACvB,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;IAClC;AACF;AAEM,SAAU,cAAc,CAAC,GAAW,EAAA;IACxC,IAAI,iBAAiB,EAAE,EAAE;AACvB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;IAClC;AAEA,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,iBAAiB,CAAC,GAAW,EAAA;IAC3C,IAAI,iBAAiB,EAAE,EAAE;AACvB,QAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;IAC9B;AACF;;ACnCO,MAAM,OAAO,GAAsB,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC;AAkBlG,MAAM,qBAAqB,GAAG,eAAe;AAC7C,MAAM,eAAe,GAAG,wBAAwB;AAChD,MAAM,YAAY,GAAG,qBAAqB;AAC1C,MAAMA,cAAY,GAAG,QAAQ;AAC7B,MAAM,mBAAmB,GAAG,aAAa;AAEnC,SAAU,QAAQ,CAAC,KAAc,EAAA;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpF;AAEA,SAAS,kBAAkB,CAAC,MAAmB,EAAA;IAC7C,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,cAAc;AACtF,QAAA,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM;AAC5C,QAAA,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;KACzC;AACH;AAEA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,MAAmB,EAAA;AACnD,IAAA,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;AAE7E,IAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AACpB,QAAA,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9C;AAAO,SAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAC3B,QAAA,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;IAC7C;AAEA,IAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC;IAE3C,MAAM,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC;IAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC;IAC5D,MAAM,YAAY,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC;IAExD,OAAO;AACL,QAAA,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,cAAc,GAAG,QAAQ,CAAC,QAAQ;AACvE,QAAA,QAAQ,EAAE,cAAc,KAAK,IAAI,GAAG,cAAc,KAAK,MAAM,GAAG,QAAQ,CAAC,QAAQ;AACjF,QAAA,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,YAAY,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM;KAC1E;AACH;SAEgB,eAAe,CAAC,MAAmB,EAAE,KAAiB,EAAE,IAA4B,EAAA;IAClG,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,YAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,GAAG,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC;QACpF;QAEA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC;QACxD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,IAAI,IAAI,EAAE,OAAO,EAAE;;;;AAIjB,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACzC,QAAA,KAAK,EAAE;AAGP,QAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC;AAEjE,QAAA,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE;YAC/C,qBAAqB,CAAC,MAAM,CAAC;QAC/B;aAAO;AACL,YAAA,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACvB;IACF;SAAO;AACL,QAAA,KAAK,EAAE;IACT;AACF;AAEA,SAAS,WAAW,CAAC,MAAmB,EAAA;AACtC,IAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAACA,cAAY,CAAC;AACrC,IAAA,MAAM,CAAC,aAAa,CAAC,4BAA4B,CAAC,EAAE,SAAS,CAAC,MAAM,CAACA,cAAY,CAAC;AAClF,IAAA,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC;AACxC;AAEM,SAAU,0BAA0B,CAAC,MAAmB,EAAA;AAC5D,IAAA,IAAI,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC;IACrC,MAAM,SAAS,GAAmC,EAAE;AAEpD,IAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;;;QAGlB,WAAW,CAAC,MAAM,CAAC;IACrB;IAEA,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAG,MAAK;AAClB,QAAA,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC;AAE9B,QAAA,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;YAC1B,EAAE,CAAC,KAAK,CAAC;QACX;AACF,IAAA,CAAC;IAED,OAAO;AACL,QAAA,QAAQ,EAAE,MAAM,KAAK;AAErB,QAAA,WAAW,CAAC,MAAM,EAAA;YAChB,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;AACtC,YAAA,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC7C,YAAA,MAAM,EAAE;QACV,CAAC;AAED,QAAA,WAAW,CAAC,EAAE,EAAA;YACZ,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;YAClC,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAEjD,IAAI,EAAE,EAAE;gBACN,WAAW,CAAC,MAAM,CAAC;YACrB;AAEA,YAAA,MAAM,EAAE;QACV,CAAC;AAED,QAAA,SAAS,CAAC,EAAE,EAAA;YACV,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;YAChC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAC/C,YAAA,MAAM,EAAE;QACV,CAAC;QAED,KAAK,GAAA;AACH,YAAA,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC;AACxC,YAAA,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC;AACxC,YAAA,iBAAiB,CAAC,YAAY,CAAC,MAAM,CAAC;YACtC,WAAW,CAAC,MAAM,CAAC;;;AAInB,YAAA,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;AAClC,YAAA,MAAM,EAAE;QACV,CAAC;AAED,QAAA,QAAQ,CAAC,EAAE,EAAA;AACT,YAAA,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,CAAC;KACF;AACH;;ACpKO,MAAM,oBAAoB,GAAG,GAAG;AAChC,MAAM,oBAAoB,GAAG,GAAG;AAEvC,MAAM,aAAa,GAAG,YAAY;AAClC,MAAM,cAAc,GAAG,aAAa;AAEpC;AACM,SAAU,aAAa,CAAC,CAAS,EAAE,CAAS,EAAE,aAAqB,EAAE,cAAsB,EAAA;AAC/F,IAAA,MAAM,IAAI,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC;AAClC,IAAA,MAAM,GAAG,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC;IAElC,IAAI,GAAG,EAAE;QACP,OAAO,IAAI,GAAG,UAAU,GAAG,WAAW;IACxC;IAEA,OAAO,IAAI,GAAG,aAAa,GAAG,cAAc;AAC9C;AAEA,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAA;AACpD,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;AAC5C;AAEA;;;AAGG;SACa,QAAQ,CAAC,MAAmB,EAAE,OAAoB,EAAE,MAAgC,EAAA;IAClG,IAAI,QAAQ,GAAG,KAAK;AACpB,IAAA,IAAI,SAAS,GAAG,EAAE;IAClB,IAAI,OAAO,GAAG,CAAC;IACf,IAAI,OAAO,GAAG,CAAC;IACf,IAAI,UAAU,GAAG,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC;AAEnB,IAAA,MAAM,SAAS,GAAG,CAAC,EAAiB,KAAI;AACtC,QAAA,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC;QACb;AACF,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,EAAiB,KAAI;QAChD,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;QAEA,QAAQ,GAAG,KAAK;AAEhB,QAAA,IAAI;AACF,YAAA,OAAO,CAAC,qBAAqB,CAAC,SAAS,CAAC;QAC1C;AAAE,QAAA,MAAM;;QAER;QAEA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QACnC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;;AAGxD,QAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;AACtB,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;AACrB,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACvB,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;AACxB,QAAA,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAE3B,QAAA,IAAI,IAAI,IAAI,EAAE,EAAE;YACd,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACtF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,EAAgB,KAAI;QAClC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;QACrF,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC;QAEvF,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,MAAA,CAAQ;AAC3D,IAAA,CAAC;IAED,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,EAAgB,KAAI;AAC3D,QAAA,IAAI,EAAE,CAAC,WAAW,KAAK,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YACjD;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAE3C,QAAQ,GAAG,IAAI;AACf,QAAA,SAAS,GAAG,EAAE,CAAC,SAAS;QACxB,OAAO,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAChC,OAAO,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAC/B,QAAA,UAAU,GAAG,IAAI,CAAC,KAAK;AACvB,QAAA,WAAW,GAAG,IAAI,CAAC,MAAM;AAEzB,QAAA,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC;AACvC,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC;;;AAIpC,QAAA,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AACvB,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACtB,QAAA,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AAC3B,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QAE5B,MAAM,CAAC,EAAE,CAAC;QAEV,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;QACvC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;QACrD,EAAE,CAAC,cAAc,EAAE;AACrB,IAAA,CAAC,CAAC;IAEF,OAAO,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,EAAgB,KAAI;QAC3D,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,EAAE,CAAC;QACZ;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,EAAgB,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3E,IAAA,OAAO,CAAC,gBAAgB,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D;AAOA;;;;AAIG;AACG,SAAU,YAAY,CAAC,MAAmB,EAAE,QAAuB,EAAA;AACvE,IAAA,IAAI,SAA6B;AACjC,IAAA,IAAI,SAA6B;IACjC,IAAI,WAAW,GAAG,KAAK;IAEvB,MAAM,gBAAgB,GAAG,MACvB,WAAW,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC;IAE7F,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,QAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AACjC,YAAA,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACpD,gBAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC;YACxC;QACF,CAAC,EAAE,oBAAoB,CAAC;AAC1B,IAAA,CAAC;AAED,IAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAK;AAC3C,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE;YACf;QACF;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,QAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;AAChG,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAK;AAC3C,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE;YACf;QACF;AAEA,QAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,QAAA,YAAY,EAAE;AAChB,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAK;QACtC,IAAI,QAAQ,EAAE,EAAE;AACd,YAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,YAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;QACrC;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAK;QACvC,IAAI,QAAQ,EAAE,EAAE;AACd,YAAA,YAAY,EAAE;QAChB;AACF,IAAA,CAAC,CAAC;IAEF,OAAO;AACL,QAAA,UAAU,CAAC,EAAW,EAAA;YACpB,WAAW,GAAG,EAAE;AAEhB,YAAA,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACf;YACF;YAEA,IAAI,EAAE,EAAE;AACN,gBAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,gBAAA,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC;AAC9B,gBAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC;YACrC;iBAAO;AACL,gBAAA,YAAY,EAAE;YAChB;QACF,CAAC;KACF;AACH;;AC/LA,MAAM,aAAa,GAA2B;AAC5C,IAAA,UAAU,EAAE,UAAU;AACtB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,aAAa,EAAE,aAAa;AAC5B,IAAA,cAAc,EAAE,cAAc;CAC/B;AAED,SAAS,YAAY,CAAC,UAAgC,EAAA;AACpD,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE9C,IAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAE/C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAI;AAC3C,QAAA,MAAM,MAAM,GAAG,MAAM,KAAK,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE;AAEzD,QAAA,OAAO,iFAAiF,MAAM,CAAA,EAAG,MAAM,CAAA,eAAA,EAAkB,MAAM,YAAY,aAAa,CAAC,MAAM,CAAC,mBAAmB,MAAM,KAAK,KAAK,CAAC,QAAQ,aAAa;AAC3N,IAAA,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAEX,QAAQ,CAAC,SAAS,GAAG;;;;8CAIuB,aAAa,CAAA;;;;;;;;UAQjD,KAAK,CAAC,QAAQ,GAAG,SAAS,GAAG,EAAE;;;;;;GAMtC;AAED,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,WAAW,CAAC,QAAwB,EAAE,UAAgC,EAAA;AAC7E,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE;IAEnC,QAAQ,CAAC,gBAAgB,CAAoB,0BAA0B,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QACxF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ;QAErD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACnD,IAAA,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAmB,+BAA+B,CAAC;IAEzF,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,QAAQ;IAClC;AACF;AAMA;SACgB,iBAAiB,CAC/B,MAAmB,EACnB,UAAgC,EAChC,KAA0B,EAAA;IAE1B,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAoB,4BAA4B,CAAC;IAElF,IAAI,CAAC,IAAI,EAAE;QACT;IACF;IAEA,IAAI,QAAQ,GAA0B,IAAI;AAE1C,IAAA,MAAM,UAAU,GAAG,CAAC,EAAc,KAAI;AACpC,QAAA,MAAM,MAAM,GAAG,EAAE,CAAC,MAAc;AAEhC,QAAA,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpE,YAAA,KAAK,EAAE;QACT;AACF,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,EAAiB,KAAI;AACtC,QAAA,IAAI,EAAE,CAAC,GAAG,KAAK,QAAQ,EAAE;AACvB,YAAA,KAAK,EAAE;QACT;AACF,IAAA,CAAC;IAED,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,CAAC,QAAQ,EAAE;YACb;QACF;QAEA,QAAQ,CAAC,MAAM,EAAE;QACjB,QAAQ,GAAG,IAAI;QACf,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC;QACvD,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;AACxD,QAAA,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;AAC9B,IAAA,CAAC;IAED,MAAM,IAAI,GAAG,MAAK;AAChB,QAAA,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC;QAEnC,QAAQ,CAAC,gBAAgB,CAAoB,0BAA0B,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;YAC9F,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,KAAI;gBAC1C,EAAE,CAAC,cAAc,EAAE;gBACnB,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,MAAgB,CAAC;AAC7D,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,aAAa,CAAmB,+BAA+B,CAAC,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAI;YAC3G,UAAU,CAAC,WAAW,CAAE,EAAE,CAAC,MAA2B,CAAC,OAAO,CAAC;AACjE,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,aAAa,CAAoB,iCAAiC,CAAC,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,KAAI;YAC7G,EAAE,CAAC,cAAc,EAAE;AACnB,YAAA,KAAK,EAAE;AACP,YAAA,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAc,8BAA8B,CAAC;QAElF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,KAAI;YACvC,EAAE,CAAC,cAAc,EAAE;YACnB,UAAU,CAAC,KAAK,EAAE;AACpB,QAAA,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAiB,KAAI;AACxD,YAAA,IAAI,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,EAAE,CAAC,GAAG,KAAK,GAAG,EAAE;gBACxC,EAAE,CAAC,cAAc,EAAE;gBACnB,UAAU,CAAC,KAAK,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC;QACpD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;AACrD,QAAA,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;AAC7B,IAAA,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,KAAI;QACpC,EAAE,CAAC,cAAc,EAAE;QAEnB,IAAI,QAAQ,EAAE;AACZ,YAAA,KAAK,EAAE;QACT;aAAO;AACL,YAAA,IAAI,EAAE;QACR;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,UAAU,CAAC,QAAQ,CAAC,MAAK;QACvB,IAAI,QAAQ,EAAE;AACZ,YAAA,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC;QACnC;AACF,IAAA,CAAC,CAAC;AACJ;;AChKA;AAmCA,MAAM,YAAY,GAAG,EAAE;AACvB,MAAM,YAAY,GAAG,GAAG;AACxB,MAAM,kBAAkB,GAAG,GAAG;AAC9B,MAAM,2BAA2B,GAAG,8BAA8B;AAElE,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAGhC;AAEH,MAAM,SAAS,GAAG,EAAE;AACpB,MAAM,eAAe,GAAG,EAAE;AAE1B,SAAS,oBAAoB,CAAC,OAAuB,EAAE,MAAe,EAAA;IACpE,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE;QACV;IACF;IAEA,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;AAExD,IAAA,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,OAAO,CAAC,MAAM,EAAE;AAChB,IAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AACvB;AAEA,MAAM,UAAU,GAA0D;AACxE,IAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,SAAS,CAAA,UAAA,EAAa,SAAS,CAAA,qKAAA,CAAuK;AAClP,IAAA,MAAM,EAAE,CAAA,gCAAA,EAAmC,SAAS,CAAA,UAAA,EAAa,SAAS,CAAA,qLAAA,CAAuL;AACjQ,IAAA,OAAO,EAAE,CAAA,gCAAA,EAAmC,SAAS,CAAA,UAAA,EAAa,SAAS,CAAA,yPAAA,CAA2P;AACtU,IAAA,IAAI,EAAE,CAAA,gCAAA,EAAmC,SAAS,CAAA,UAAA,EAAa,SAAS,CAAA,sLAAA,CAAwL;CACjQ;AAED,SAAS,kBAAkB,CAAC,IAAsB,EAAA;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE5C,IAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAE7C,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,CAAA,oBAAA,EAAuB,IAAI,CAAC,IAAI,CAAA,CAAE,GAAG,EAAE;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,CAAA,2CAAA,EAA8C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,MAAA,CAAQ,GAAG,EAAE;AAE7G,IAAA,MAAM,QAAQ,GAAG;qCACkB,SAAS,CAAA,CAAA,EAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAA,SAAA,EAAY,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;;UAExF,QAAQ;AACmC,mDAAA,EAAA,IAAI,CAAC,KAAK,CAAA;;;;qBAI1C,eAAe,CAAA;sBACd,eAAe,CAAA;;;;;;;;;;;;AAYW,8CAAA,EAAA,IAAI,CAAC,OAAO,CAAA;;GAEzD;AAED,IAAA,MAAM,CAAC,SAAS,GAAG,QAAQ;AAE3B,IAAA,OAAO,MAAM;AACf;AAEA,IAAI,eAAe,GAAgC,IAAI;AAEvD,SAAS,oBAAoB,GAAA;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAc,0CAA0C,CAAC;IACjG,MAAM,QAAQ,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,QAAQ,IAAI,cAAc;IACvE,MAAM,MAAM,GAAG,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,aAAa;IACpE,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,WAAW;;;IAIjE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAa,KAAI;QACtC,MAAM,MAAM,GAAG,YAAY,GAAG,KAAK,IAAI,YAAY,GAAG,YAAY,CAAC;QACnE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAc,qBAAqB,CAAC;QAE7E,IAAI,CAAC,aAAa,EAAE;YAClB;QACF;QAEA,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC;QAElE,IAAI,KAAK,EAAE;AACT,YAAA,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM;YAChC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,CAAA,EAAG,MAAM,IAAI;QAC5C;aAAO;AACL,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;YACnC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,MAAM,IAAI;QACzC;AACF,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,YAAY,CAAC,MAAsB,EAAE,IAAsB,EAAA;AAClE,IAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;QACnC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC;QAEjE,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO,OAAO,EAAE;QAClB;AAEA,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACpB,YAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAEvC,qBAAqB,CAAC,MAAK;AACzB,gBAAA,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AAE1C,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;YAEtC,UAAU,CAAC,MAAK;AACd,gBAAA,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;AAEzC,gBAAA,OAAO,EAAE;YACX,CAAC,EAAE,kBAAkB,CAAC;QACxB;AACF,IAAA,CAAC,CAAC;AACJ;AAEA,SAAS,SAAS,CAAC,IAAsB,EAAA;AACvC,IAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,iCAAiC,CAAC;AAE5E,IAAA,MAAM,WAAW,GAAG,YAAW;AAC7B,QAAA,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;QAElC,MAAM,CAAC,MAAM,EAAE;AAIf,QAAA,oBAAoB,EAAE;AAEtB,QAAA,IAAI,CAAC,OAAO,IAAI;AAClB,IAAA,CAAC;AAED,IAAA,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;AACpD,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AAIjC,IAAA,oBAAoB,EAAE;;AAGtB,IAAA,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;AAE7B,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK;AAEvC,IAAA,IAAI,QAAQ,GAAG,CAAC,EAAE;QAChB,IAAI,aAAa,GAAG,QAAQ;AAC5B,QAAA,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3B,IAAI,SAAS,GAAG,IAAI;QAEpB,MAAM,eAAe,GAAG,MAAK;YAC3B,IAAI,CAAC,SAAS,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,YAAA,MAAM,OAAO,GAAG,GAAG,GAAG,UAAU;YAEhC,aAAa,IAAI,OAAO;YACxB,UAAU,GAAG,GAAG;AAEhB,YAAA,IAAI,aAAa,IAAI,CAAC,EAAE;AACtB,gBAAA,WAAW,EAAE;gBAEb;YACF;YAEA,qBAAqB,CAAC,eAAe,CAAC;AACxC,QAAA,CAAC;;AAGD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAK;AACjD,YAAA,SAAS,GAAG,CAAC,QAAQ,CAAC,MAAM;YAE5B,IAAI,SAAS,EAAE;AACb,gBAAA,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE;gBACvB,qBAAqB,CAAC,eAAe,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;QAEF,qBAAqB,CAAC,eAAe,CAAC;IACxC;AACF;AAEA,SAAS,qBAAqB,GAAA;IAC5B,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,mBAAmB,CAAC,IAAI,EAAE,CAAC,EAAE;AACrD,QAAA,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC;IACtC;AACF;AAEA,SAAS,YAAY,CAAC,IAAyB,EAAA;AAC7C,IAAA,qBAAqB,EAAE;AAEvB,IAAA,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,KAAI;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QAE9C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;QAE5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE9C,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;QAE9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE5C,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC;AAClD,QAAA,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK;QAE/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE9C,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,8BAA8B,CAAC;AACtD,QAAA,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO;QAEnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE9C,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAEtD,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEtD,QAAA,aAAa,CAAC,IAAI,GAAG,QAAQ;QAC7B,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,EAAE,kCAAkC,CAAC;AAC3F,QAAA,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU;QAE3C,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAEvD,QAAA,cAAc,CAAC,IAAI,GAAG,QAAQ;QAC9B,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,EAAE,mCAAmC,CAAC;AAC7F,QAAA,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AAE7C,QAAA,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC;QAC9C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAC3C,QAAA,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC;AAE9B,QAAA,MAAM,SAAS,GAAG,CAAC,KAAoB,KAAI;AACzC,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AAC1B,gBAAA,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC;YACvC;AACF,QAAA,CAAC;QAED,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAEzD,QAAA,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5C,YAAA,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC;AACtC,QAAA,CAAC,CAAC;AAEF,QAAA,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC3C,YAAA,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC;AACvC,QAAA,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AAC3C,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC7B,gBAAA,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC;YACvC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;AAC/C,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AACrC,IAAA,CAAC,CAAC;AACJ;AAEA;AACA;AACA;AACA,CAAC,SAAS,oBAAoB,GAAA;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,oBAAoB;AAEzD,IAAA,OAAO,CAAC,GAAG,CACT,2CAA2C,EAC3C,gGAAgG,EAChG,8BAA8B,EAC9B,wDAAwD,EACxD,GAAG,CACJ;AACH,CAAC,GAAG;AAEJ;AACA;AACA;AACA,MAAM,YAAY,GAAG,QAAQ;AAE7B,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAc,cAAc,CAAC;AAEtE,IAAI,UAAU,EAAE;AACd,IAAA,eAAe,GAAG,0BAA0B,CAAC,UAAU,CAAC;IAExD,MAAM,WAAW,GAAG,UAAU,CAAC,aAAa,CAAc,2BAA2B,CAAC;IAEtF,IAAI,WAAW,EAAE;AACf,QAAA,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,MAAM,KAAK,eAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACrF;AAEA,IAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,eAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;AAErF,IAAA,iBAAiB,CAAC,UAAU,EAAE,eAAe,EAAE;QAC7C,YAAY,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;AAClD,KAAA,CAAC;AAEF,IAAA,eAAe,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAI;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACnB,YAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;QAC3C;AAEA,QAAA,oBAAoB,EAAE;AACxB,IAAA,CAAC,CAAC;;IAGF,MAAM,mBAAmB,GAAG,UAAU,CAAC,aAAa,CAAc,wBAAwB,CAAC;IAC3F,MAAM,kBAAkB,GAAG,mBAAmB,EAAE,aAAa,CAAC,KAAK,CAAC;AAEpE,IAAA,IAAI,mBAAmB,IAAI,kBAAkB,EAAE;AAC7C,QAAA,IAAI,QAAQ,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ;QAErG,MAAM,WAAW,GAAG,MAAK;AACvB,YAAA,mBAAmB,CAAC,KAAK,GAAG,eAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,GAAG,WAAW,GAAG,UAAU;AAC7F,QAAA,CAAC;AAED,QAAA,WAAW,EAAE;AACb,QAAA,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC;QAErC,IAAI,QAAQ,EAAE;AACZ,YAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;AACtC,YAAA,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC;QAChD;QAEA,mBAAmB,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAQ,KAAI;YACzD,CAAC,CAAC,cAAc,EAAE;AAElB,YAAA,IAAI,eAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;gBACxC,QAAQ,GAAG,KAAK;AAChB,gBAAA,eAAgB,CAAC,WAAW,CAAC,KAAK,CAAC;gBAEnC;YACF;AAEA,YAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;AACzC,YAAA,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;YAEjD,QAAQ,GAAG,CAAC,QAAQ;AAEpB,YAAA,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAClE,QAAA,CAAC,CAAC;IACJ;AACF;AAEA;AACA;AACA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,EAAE;AAEtD,IAAI,GAAG,EAAE;IACP,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAqB,KAAI;QAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG;AACjC,IAAA,CAAC,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,IAAwC,KAAI;QAC1E,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,SAAS,EAAE;AAC7C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAA6B;gBAExF,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,QAAQ,GAAG,KAAK;AAC5B,oBAAA,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACxC,oBAAA,WAAW,CAAC,KAAK,GAAG,eAAe;gBACrC;YACF;iBAAO;gBACL,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAA6B;gBAExF,IAAI,WAAW,EAAE;AACf,oBAAA,WAAW,CAAC,QAAQ,GAAG,IAAI;AAC3B,oBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACrC,oBAAA,WAAW,CAAC,KAAK,GAAG,sCAAsC;gBAC5D;YACF;QACF;AACF,IAAA,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAA6B;IAExF,IAAI,WAAW,EAAE;QACf,GAAG,CAAC,EAAE,CAAC,+BAA+B,EAAE,OAAO,OAAkC,KAAI;;;AAGnF,YAAA,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;AAC/B,aAAA,CAAC;AAEF,YAAA,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE;gBACxC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ;AACT,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,GAAG,CAAC,EAAE,CACJ,wBAAwB,EACxB,CACE,OAG2C,KACzC;AACF,YAAA,qBAAqB,EAAE;AACvB,YAAA,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YAEvC,IAAI,WAAW,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE;AAC/C,gBAAA,SAAS,CAAC;AACR,oBAAA,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,oBAAA,IAAI,EAAE,SAAS;AAChB,iBAAA,CAAC;YACJ;iBAAO,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,WAAW,EAAE;AACrE,gBAAA,SAAS,CAAC;AACR,oBAAA,KAAK,EAAE,YAAY;oBACnB,OAAO,EAAE,OAAO,CAAC,KAAK;AACtB,oBAAA,IAAI,EAAE,QAAQ;AACf,iBAAA,CAAC;AAEF,gBAAA,IAAI,OAAO,CAAC,OAAO,EAAE;oBACnB,UAAU,CAAC,MAAK;AACd,wBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC1B,oBAAA,CAAC,CAAC;gBACJ;qBAAO;AACL,oBAAA,WAAW,CAAC,QAAQ,GAAG,IAAI;AAC3B,oBAAA,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACrC,oBAAA,WAAW,CAAC,KAAK,GAAG,sCAAsC;gBAC5D;YACF;iBAAO,IAAI,UAAU,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,WAAW,EAAE;AAC3E,gBAAA,SAAS,CAAC;AACR,oBAAA,KAAK,EAAE,cAAc;AACrB,oBAAA,OAAO,EAAE,CAAA,UAAA,EAAa,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,CAAA,wBAAA,EAC/D,OAAO,CAAC,cACV,CAAA,CAAE;AACF,oBAAA,IAAI,EAAE,SAAS;AAChB,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC,CACF;QAED,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAS,KAAI;YAClD,EAAE,CAAC,cAAc,EAAE;AAEnB,YAAA,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAEpC,YAAA,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;AACF","x_google_ignoreList":[0,1,2,3,4,5]}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../src/client/hot-context.ts","../../src/client/storage.ts","../../src/client/panel-state.ts","../../src/client/panel-position.ts","../../src/client/theme.ts","../../src/client/panel-settings.ts","../../src/client/index.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\nimport type { ViteHotContext } from 'vite/types/hot.js';\n\n/**\n * Minimal `import.meta.hot`-compatible context for environments without Vite HMR\n * (e.g. the `pp-dev next` server). The dev-panel client only uses `hot.on()` and\n * `hot.send()`; this shim implements those over a raw WebSocket using the same\n * custom-event wire shape Vite uses: `{ type: 'custom', event, data }`.\n *\n * Used only as a fallback: when `import.meta.hot` exists (Vite), that is used\n * instead and this code never runs.\n */\n\n/**\n * WebSocket path the pp-dev Next.js server listens on for dev-panel messages.\n * Kept in sync with `PP_DEV_HMR_WS_PATH` in `src/constants.ts` (server side).\n */\nconst PP_DEV_HMR_WS_PATH = '/@pp-dev-hmr';\n\ntype CustomMessage = { type: 'custom'; event: string; data?: unknown };\n\ntype Handler = (payload: any) => void;\n\nconst MAX_OUTBOX_SIZE = 50;\n\nfunction resolveWebSocketUrl(): string {\n const { protocol, host } = window.location;\n const wsProtocol = protocol === 'https:' ? 'wss:' : 'ws:';\n\n return `${wsProtocol}//${host}${PP_DEV_HMR_WS_PATH}`;\n}\n\nexport function createPPDevHotContext(): ViteHotContext {\n const handlers = new Map<string, Set<Handler>>();\n /** Outgoing messages queued while the socket is not OPEN; flushed on connect. */\n const outbox: string[] = [];\n\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let reconnectDelay = 1_000;\n const MAX_RECONNECT_DELAY = 10_000;\n\n const flushOutbox = () => {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n\n while (outbox.length > 0) {\n socket.send(outbox.shift()!);\n }\n };\n\n const dispatch = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n\n if (!eventHandlers) {\n return;\n }\n\n for (const handler of eventHandlers) {\n try {\n handler(data);\n } catch (err) {\n // A failing handler must not break dispatch to the others.\n console.error(`[pp-dev] hot handler for \"${event}\" failed`, err);\n }\n }\n };\n\n const connect = () => {\n try {\n socket = new WebSocket(resolveWebSocketUrl());\n } catch (err) {\n console.error('[pp-dev] failed to open dev-panel WebSocket', err);\n scheduleReconnect();\n\n return;\n }\n\n socket.addEventListener('open', () => {\n reconnectDelay = 1_000;\n flushOutbox();\n });\n\n socket.addEventListener('message', (ev) => {\n let message: CustomMessage;\n\n try {\n message = JSON.parse(typeof ev.data === 'string' ? ev.data : '');\n } catch {\n return;\n }\n\n if (message && message.type === 'custom' && typeof message.event === 'string') {\n dispatch(message.event, message.data);\n }\n });\n\n socket.addEventListener('close', () => {\n socket = null;\n scheduleReconnect();\n });\n\n socket.addEventListener('error', () => {\n // `close` follows `error`; reconnect is scheduled there.\n socket?.close();\n });\n };\n\n const scheduleReconnect = () => {\n if (reconnectTimer) {\n return;\n }\n\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);\n connect();\n }, reconnectDelay);\n };\n\n connect();\n\n const noop = () => {};\n\n const context: Pick<ViteHotContext, 'on' | 'off' | 'send'> & Partial<ViteHotContext> = {\n on(event, cb) {\n let set = handlers.get(event);\n\n if (!set) {\n set = new Set();\n handlers.set(event, set);\n }\n\n set.add(cb as Handler);\n },\n off(event, cb) {\n handlers.get(event)?.delete(cb as Handler);\n },\n send(event, data) {\n const payload = JSON.stringify({ type: 'custom', event, data } satisfies CustomMessage);\n\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(payload);\n } else {\n if (outbox.length >= MAX_OUTBOX_SIZE) {\n outbox.shift();\n }\n\n outbox.push(payload);\n }\n },\n // Unused by the dev-panel client; provided as no-ops to satisfy the shape.\n accept: noop as ViteHotContext['accept'],\n acceptExports: noop as ViteHotContext['acceptExports'],\n dispose: noop,\n prune: noop,\n invalidate: noop,\n data: {},\n };\n\n return context as ViteHotContext;\n}\n","// localStorage helpers guarded against environments where storage is unavailable\n// (e.g. sandboxed iframes). Keys follow the original `pp-dev-info-closed` naming.\n\nexport const STORAGE_KEYS = {\n closed: 'pp-dev-info-closed',\n position: 'pp-dev-info-position',\n autoHide: 'pp-dev-info-auto-hide',\n hidden: 'pp-dev-info-hidden',\n /** Shared with the standalone Inspector/Variables Editor pages — same key, same values. */\n theme: 'pp-dev-info-theme',\n} as const;\n\nexport function checkLocalStorage() {\n try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport function setStorageItem(key: string, value: string) {\n if (checkLocalStorage()) {\n localStorage.setItem(key, value);\n }\n}\n\nexport function getStorageItem(key: string) {\n if (checkLocalStorage()) {\n return localStorage.getItem(key);\n }\n\n return null;\n}\n\nexport function removeStorageItem(key: string) {\n if (checkLocalStorage()) {\n localStorage.removeItem(key);\n }\n}\n","import { STORAGE_KEYS, getStorageItem, setStorageItem, removeStorageItem } from './storage.js';\n\nexport type Corner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport const CORNERS: readonly Corner[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n\nexport interface PanelState {\n position: Corner;\n autoHide: boolean;\n hidden: boolean;\n}\n\nexport interface PanelStateController {\n getState(): PanelState;\n setPosition(corner: Corner): void;\n setAutoHide(on: boolean): void;\n setHidden(on: boolean): void;\n /** Clear all persisted overrides and re-resolve from the server-rendered config. */\n reset(): void;\n onChange(cb: (state: PanelState) => void): void;\n}\n\nconst POSITION_CLASS_PREFIX = 'pp-dev-info--';\nconst AUTO_HIDE_CLASS = 'pp-dev-info--auto-hide';\nconst HIDDEN_CLASS = 'pp-dev-info--hidden';\nconst CLOSED_CLASS = 'closed';\nconst NO_TRANSITION_CLASS = 'is-dragging';\n\nexport function isCorner(value: unknown): value is Corner {\n return typeof value === 'string' && (CORNERS as readonly string[]).includes(value);\n}\n\nfunction stateFromDataAttrs($panel: HTMLElement): PanelState {\n return {\n position: isCorner($panel.dataset.position) ? $panel.dataset.position : 'bottom-right',\n autoHide: $panel.dataset.autoHide === 'true',\n hidden: $panel.dataset.hidden === 'true',\n };\n}\n\n/**\n * Resolve the effective panel state. Precedence per setting:\n * localStorage (runtime user choice) → data-* attribute (config) → built-in default.\n * The `?pp-dev-panel=show|hide` URL param writes a persistent localStorage override\n * before resolution, so it both restores a hidden panel and survives reloads.\n */\nexport function resolvePanelState($panel: HTMLElement): PanelState {\n const param = new URLSearchParams(window.location.search).get('pp-dev-panel');\n\n if (param === 'show') {\n setStorageItem(STORAGE_KEYS.hidden, 'false');\n } else if (param === 'hide') {\n setStorageItem(STORAGE_KEYS.hidden, 'true');\n }\n\n const defaults = stateFromDataAttrs($panel);\n\n const storedPosition = getStorageItem(STORAGE_KEYS.position);\n const storedAutoHide = getStorageItem(STORAGE_KEYS.autoHide);\n const storedHidden = getStorageItem(STORAGE_KEYS.hidden);\n\n return {\n position: isCorner(storedPosition) ? storedPosition : defaults.position,\n autoHide: storedAutoHide !== null ? storedAutoHide === 'true' : defaults.autoHide,\n hidden: storedHidden !== null ? storedHidden === 'true' : defaults.hidden,\n };\n}\n\nexport function applyPanelState($panel: HTMLElement, state: PanelState, opts?: { instant?: boolean }): void {\n const apply = () => {\n for (const corner of CORNERS) {\n $panel.classList.toggle(POSITION_CLASS_PREFIX + corner, corner === state.position);\n }\n\n $panel.classList.toggle(AUTO_HIDE_CLASS, state.autoHide);\n $panel.classList.toggle(HIDDEN_CLASS, state.hidden);\n };\n\n if (opts?.instant) {\n // No-transition guard: when localStorage differs from the server-rendered corner,\n // the panel must not visibly slide across the screen on load. `is-dragging`\n // disables transitions; a reflow makes the class swap land before it is removed.\n $panel.classList.add(NO_TRANSITION_CLASS);\n apply();\n void $panel.offsetWidth;\n\n const unlock = () => $panel.classList.remove(NO_TRANSITION_CLASS);\n\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(unlock);\n } else {\n setTimeout(unlock, 0);\n }\n } else {\n apply();\n }\n}\n\nfunction clearClosed($panel: HTMLElement): void {\n $panel.classList.remove(CLOSED_CLASS);\n $panel.querySelector('.pp-dev-info__wrap-btn svg')?.classList.remove(CLOSED_CLASS);\n removeStorageItem(STORAGE_KEYS.closed);\n}\n\nexport function createPanelStateController($panel: HTMLElement): PanelStateController {\n let state = resolvePanelState($panel);\n const listeners: Array<(s: PanelState) => void> = [];\n\n if (state.autoHide) {\n // Auto-hide and minimize are mutually exclusive; a stale persisted `closed`\n // state must not combine with the auto-hide transform.\n clearClosed($panel);\n }\n\n applyPanelState($panel, state, { instant: true });\n\n const commit = () => {\n applyPanelState($panel, state);\n\n for (const cb of listeners) {\n cb(state);\n }\n };\n\n return {\n getState: () => state,\n\n setPosition(corner) {\n state = { ...state, position: corner };\n setStorageItem(STORAGE_KEYS.position, corner);\n commit();\n },\n\n setAutoHide(on) {\n state = { ...state, autoHide: on };\n setStorageItem(STORAGE_KEYS.autoHide, String(on));\n\n if (on) {\n clearClosed($panel);\n }\n\n commit();\n },\n\n setHidden(on) {\n state = { ...state, hidden: on };\n setStorageItem(STORAGE_KEYS.hidden, String(on));\n commit();\n },\n\n reset() {\n removeStorageItem(STORAGE_KEYS.position);\n removeStorageItem(STORAGE_KEYS.autoHide);\n removeStorageItem(STORAGE_KEYS.hidden);\n clearClosed($panel);\n\n // Re-resolve purely from the server-rendered config (bypass the URL param,\n // which would immediately re-write its localStorage override).\n state = stateFromDataAttrs($panel);\n commit();\n },\n\n onChange(cb) {\n listeners.push(cb);\n },\n };\n}\n","import type { Corner } from './panel-state.js';\n\nexport const AUTO_HIDE_SHOW_DELAY = 300;\nexport const AUTO_HIDE_HIDE_DELAY = 500;\n\nconst PEEKING_CLASS = 'is-peeking';\nconst DRAGGING_CLASS = 'is-dragging';\n\n/** Nearest screen corner for a viewport point; ties resolve toward bottom-right. */\nexport function nearestCorner(x: number, y: number, viewportWidth: number, viewportHeight: number): Corner {\n const left = x < viewportWidth / 2;\n const top = y < viewportHeight / 2;\n\n if (top) {\n return left ? 'top-left' : 'top-right';\n }\n\n return left ? 'bottom-left' : 'bottom-right';\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Drag the panel by its handle and snap to the nearest corner on release.\n * Pointer capture keeps the drag tracking over iframes and outside the window.\n */\nexport function initDrag($panel: HTMLElement, $handle: HTMLElement, onSnap: (corner: Corner) => void): void {\n let dragging = false;\n let pointerId = -1;\n let offsetX = 0;\n let offsetY = 0;\n let panelWidth = 0;\n let panelHeight = 0;\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n stop(false);\n }\n };\n\n const stop = (snap: boolean, ev?: PointerEvent) => {\n if (!dragging) {\n return;\n }\n\n dragging = false;\n\n try {\n $handle.releasePointerCapture(pointerId);\n } catch {\n // pointer already released\n }\n\n document.body.style.userSelect = '';\n document.removeEventListener('keydown', onKeyDown, true);\n\n // Re-enable transitions before clearing the inline placement so the snap animates.\n $panel.classList.remove(DRAGGING_CLASS);\n $panel.style.left = '';\n $panel.style.top = '';\n $panel.style.right = '';\n $panel.style.bottom = '';\n $panel.style.transform = '';\n\n if (snap && ev) {\n onSnap(nearestCorner(ev.clientX, ev.clientY, window.innerWidth, window.innerHeight));\n }\n };\n\n const moveTo = (ev: PointerEvent) => {\n const x = clamp(ev.clientX - offsetX, 0, Math.max(0, window.innerWidth - panelWidth));\n const y = clamp(ev.clientY - offsetY, 0, Math.max(0, window.innerHeight - panelHeight));\n\n $panel.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n };\n\n $handle.addEventListener('pointerdown', (ev: PointerEvent) => {\n if (ev.pointerType === 'mouse' && ev.button !== 0) {\n return;\n }\n\n const rect = $panel.getBoundingClientRect();\n\n dragging = true;\n pointerId = ev.pointerId;\n offsetX = ev.clientX - rect.left;\n offsetY = ev.clientY - rect.top;\n panelWidth = rect.width;\n panelHeight = rect.height;\n\n $handle.setPointerCapture(ev.pointerId);\n $panel.classList.add(DRAGGING_CLASS);\n\n // Anchor to the top-left origin so translate3d coordinates are viewport-absolute;\n // inline styles override the corner-class placement for the duration of the drag.\n $panel.style.left = '0';\n $panel.style.top = '0';\n $panel.style.right = 'auto';\n $panel.style.bottom = 'auto';\n\n moveTo(ev);\n\n document.body.style.userSelect = 'none';\n document.addEventListener('keydown', onKeyDown, true);\n ev.preventDefault();\n });\n\n $handle.addEventListener('pointermove', (ev: PointerEvent) => {\n if (dragging) {\n moveTo(ev);\n }\n });\n\n $handle.addEventListener('pointerup', (ev: PointerEvent) => stop(true, ev));\n $handle.addEventListener('pointercancel', () => stop(false));\n}\n\nexport interface AutoHideHandle {\n /** Force the panel to stay revealed (e.g. while the settings popover is open). */\n keepPeeked(on: boolean): void;\n}\n\n/**\n * Hover-reveal behavior for the auto-hide mode: pointer over the exposed strip for\n * AUTO_HIDE_SHOW_DELAY slides the panel out; leaving re-hides it after a grace period.\n * Keyboard focus inside the panel also keeps it revealed.\n */\nexport function initAutoHide($panel: HTMLElement, isActive: () => boolean): AutoHideHandle {\n let showTimer: number | undefined;\n let hideTimer: number | undefined;\n let popoverOpen = false;\n\n const shouldStayPeeked = () =>\n popoverOpen || $panel.matches(':focus-within') || $panel.classList.contains(DRAGGING_CLASS);\n\n const scheduleHide = () => {\n window.clearTimeout(hideTimer);\n hideTimer = window.setTimeout(() => {\n if (!shouldStayPeeked() && !$panel.matches(':hover')) {\n $panel.classList.remove(PEEKING_CLASS);\n }\n }, AUTO_HIDE_HIDE_DELAY);\n };\n\n $panel.addEventListener('pointerenter', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(hideTimer);\n showTimer = window.setTimeout(() => $panel.classList.add(PEEKING_CLASS), AUTO_HIDE_SHOW_DELAY);\n });\n\n $panel.addEventListener('pointerleave', () => {\n if (!isActive()) {\n return;\n }\n\n window.clearTimeout(showTimer);\n scheduleHide();\n });\n\n $panel.addEventListener('focusin', () => {\n if (isActive()) {\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n }\n });\n\n $panel.addEventListener('focusout', () => {\n if (isActive()) {\n scheduleHide();\n }\n });\n\n return {\n keepPeeked(on: boolean) {\n popoverOpen = on;\n\n if (!isActive()) {\n return;\n }\n\n if (on) {\n window.clearTimeout(showTimer);\n window.clearTimeout(hideTimer);\n $panel.classList.add(PEEKING_CLASS);\n } else {\n scheduleHide();\n }\n },\n };\n}\n","// Theme override (Auto/Dark/Light), shared across the dev panel and the standalone\n// Inspector/Variables Editor pages via the same localStorage key (see STORAGE_KEYS.theme) and\n// the same `data-pp-dev-theme` attribute convention (prefixed to avoid colliding with a host\n// Portal Page's own theme attribute, since the panel is injected into pages pp-dev doesn't own).\nimport { STORAGE_KEYS, getStorageItem, setStorageItem } from './storage.js';\n\nexport type ThemeChoice = 'auto' | 'dark' | 'light';\n\nconst THEME_ATTR = 'data-pp-dev-theme';\n\nexport function getStoredTheme(): ThemeChoice {\n const value = getStorageItem(STORAGE_KEYS.theme);\n\n return value === 'dark' || value === 'light' ? value : 'auto';\n}\n\nexport function applyTheme(theme: ThemeChoice): void {\n if (theme === 'dark' || theme === 'light') {\n document.documentElement.setAttribute(THEME_ATTR, theme);\n } else {\n document.documentElement.removeAttribute(THEME_ATTR);\n }\n}\n\nexport function setTheme(theme: ThemeChoice): void {\n setStorageItem(STORAGE_KEYS.theme, theme);\n applyTheme(theme);\n}\n\n/** Call once on page load to apply whatever was last chosen (defaults to 'auto', a no-op). */\nexport function initTheme(): void {\n applyTheme(getStoredTheme());\n}\n","import type { Corner, PanelStateController } from './panel-state.js';\nimport { CORNERS } from './panel-state.js';\nimport { getStoredTheme, setTheme, type ThemeChoice } from './theme.js';\n\nconst CORNER_TITLES: Record<Corner, string> = {\n 'top-left': 'Top left',\n 'top-right': 'Top right',\n 'bottom-left': 'Bottom left',\n 'bottom-right': 'Bottom right',\n};\n\nconst THEME_CHOICES: ThemeChoice[] = ['auto', 'dark', 'light'];\nconst THEME_LABELS: Record<ThemeChoice, string> = { auto: 'Auto', dark: 'Dark', light: 'Light' };\n\nfunction buildPopover(controller: PanelStateController, showPageVariablesGroup: boolean): HTMLDivElement {\n const state = controller.getState();\n const $popover = document.createElement('div');\n\n $popover.classList.add('pp-dev-info__settings');\n\n const cornerButtons = CORNERS.map((corner) => {\n const active = corner === state.position ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__corner-btn pp-dev-info__corner-btn--${corner}${active}\" data-corner=\"${corner}\" title=\"${CORNER_TITLES[corner]}\" aria-pressed=\"${corner === state.position}\"></button>`;\n }).join('');\n\n const currentTheme = getStoredTheme();\n const themeButtons = THEME_CHOICES.map((choice) => {\n const active = choice === currentTheme ? ' active' : '';\n\n return `<button type=\"button\" class=\"pp-dev-info__theme-btn${active}\" data-theme-choice=\"${choice}\" aria-pressed=\"${choice === currentTheme}\">${THEME_LABELS[choice]}</button>`;\n }).join('');\n\n const pageVariablesRow = showPageVariablesGroup\n ? `\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Page variables</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Page variables\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__reload-vars-btn\" title=\"Refetch live values from MI now, then reload the page\">Reload variables</button>\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-editor-btn\">Open variables editor…</button>\n </div>\n </div>`\n : '';\n\n $popover.innerHTML = `\n <div class=\"pp-dev-info__settings-title\">Panel settings</div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Position</span>\n <div class=\"pp-dev-info__corner-grid\">${cornerButtons}</div>\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <label class=\"pp-dev-info__settings-label\" for=\"pp-dev-auto-hide-toggle\">Auto-hide</label>\n <input\n type=\"checkbox\"\n id=\"pp-dev-auto-hide-toggle\"\n class=\"pp-dev-info__settings-toggle\"\n ${state.autoHide ? 'checked' : ''}\n />\n </div>\n <div class=\"pp-dev-info__settings-row\">\n <span class=\"pp-dev-info__settings-label\">Theme</span>\n <div class=\"pp-dev-info__theme-grid\" role=\"group\" aria-label=\"Theme\">${themeButtons}</div>\n </div>\n ${pageVariablesRow}\n <div class=\"pp-dev-info__settings-group\">\n <span class=\"pp-dev-info__settings-label\">Dev tools</span>\n <div class=\"pp-dev-info__vars-buttons\" role=\"group\" aria-label=\"Dev tools\">\n <button type=\"button\" class=\"pp-dev-info__vars-btn pp-dev-info__open-inspector-btn\">Open request inspector…</button>\n </div>\n </div>\n <button type=\"button\" class=\"pp-dev-info__settings-hide-btn\">Hide panel</button>\n <div class=\"pp-dev-info__settings-hint\">Restore with <code>?pp-dev-panel=show</code> in the URL</div>\n <span class=\"pp-dev-info__settings-reset\" role=\"button\" tabindex=\"0\">Reset to config defaults</span>\n `;\n\n return $popover;\n}\n\nfunction syncPopover($popover: HTMLDivElement, controller: PanelStateController): void {\n const state = controller.getState();\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($btn) => {\n const active = $btn.dataset.corner === state.position;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n\n const $toggle = $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle');\n\n if ($toggle) {\n $toggle.checked = state.autoHide;\n }\n}\n\nexport interface PanelSettingsHooks {\n onOpenChange?: (open: boolean) => void;\n onOpenVariablesEditorClick?: () => void;\n onOpenInspectorClick?: () => void;\n onReloadVariablesClick?: () => void;\n}\n\n/** Settings popover: corner picker, auto-hide toggle, hide button, reset. */\nexport function initPanelSettings(\n $panel: HTMLElement,\n controller: PanelStateController,\n hooks?: PanelSettingsHooks,\n): void {\n const $btn = $panel.querySelector<HTMLButtonElement>('.pp-dev-info__settings-btn');\n\n if (!$btn) {\n return;\n }\n\n let $popover: HTMLDivElement | null = null;\n\n const onDocClick = (ev: MouseEvent) => {\n const target = ev.target as Node;\n\n if ($popover && !$popover.contains(target) && !$btn.contains(target)) {\n close();\n }\n };\n\n const onKeyDown = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') {\n close();\n }\n };\n\n const close = () => {\n if (!$popover) {\n return;\n }\n\n $popover.remove();\n $popover = null;\n document.removeEventListener('click', onDocClick, true);\n document.removeEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(false);\n };\n\n const open = () => {\n const showPageVariablesGroup = $panel.dataset.templateLess !== 'true';\n\n $popover = buildPopover(controller, showPageVariablesGroup);\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__corner-btn').forEach(($cornerBtn) => {\n $cornerBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.setPosition($cornerBtn.dataset.corner as Corner);\n });\n });\n\n $popover.querySelector<HTMLInputElement>('.pp-dev-info__settings-toggle')?.addEventListener('change', (ev) => {\n controller.setAutoHide((ev.target as HTMLInputElement).checked);\n });\n\n $popover.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($themeBtn) => {\n $themeBtn.addEventListener('click', (ev) => {\n ev.preventDefault();\n setTheme($themeBtn.dataset.themeChoice as ThemeChoice);\n\n $popover!.querySelectorAll<HTMLButtonElement>('.pp-dev-info__theme-btn').forEach(($btn) => {\n const active = $btn === $themeBtn;\n\n $btn.classList.toggle('active', active);\n $btn.setAttribute('aria-pressed', String(active));\n });\n });\n });\n\n $popover.querySelector<HTMLButtonElement>('.pp-dev-info__settings-hide-btn')?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n controller.setHidden(true);\n });\n\n const actions: [string, (() => void) | undefined][] = [\n ['.pp-dev-info__open-editor-btn', hooks?.onOpenVariablesEditorClick],\n ['.pp-dev-info__reload-vars-btn', hooks?.onReloadVariablesClick],\n ['.pp-dev-info__open-inspector-btn', hooks?.onOpenInspectorClick],\n ];\n\n actions.forEach(([selector, hook]) => {\n $popover!.querySelector<HTMLButtonElement>(selector)?.addEventListener('click', (ev) => {\n ev.preventDefault();\n close();\n hook?.();\n });\n });\n\n const $reset = $popover.querySelector<HTMLElement>('.pp-dev-info__settings-reset');\n\n $reset?.addEventListener('click', (ev) => {\n ev.preventDefault();\n controller.reset();\n });\n $reset?.addEventListener('keydown', (ev: KeyboardEvent) => {\n if (ev.key === 'Enter' || ev.key === ' ') {\n ev.preventDefault();\n controller.reset();\n }\n });\n\n $panel.appendChild($popover);\n document.addEventListener('click', onDocClick, true);\n document.addEventListener('keydown', onKeyDown, true);\n hooks?.onOpenChange?.(true);\n };\n\n $btn.addEventListener('click', (ev) => {\n ev.preventDefault();\n\n if ($popover) {\n close();\n } else {\n open();\n }\n });\n\n controller.onChange(() => {\n if ($popover) {\n syncPopover($popover, controller);\n }\n });\n}\n","/// <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 { initTheme } from './theme.js';\n\n// Applied unconditionally (even if the panel itself is hidden) — this is what makes the\n// override affect the whole injected panel, not just its own markup.\ninitTheme();\n\ninterface 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\ninterface SyncActionRequiredPayload {\n requestId: string;\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ninterface ConfirmModalOptions {\n title: string;\n content: string;\n confirmText: string;\n cancelText: string;\n}\n\ntype PageVariablesReloadResponsePayload = { ok: true; count: number; skipped: boolean } | { error: string };\n\nlet activePopups = 0;\nconst POPUP_OFFSET = 10;\nconst POPUP_HEIGHT = 100;\nconst ANIMATION_DURATION = 300;\nconst CONFIRM_MODAL_OVERLAY_CLASS = 'pp-dev-info__confirm-overlay';\n\nconst activeConfirmModals = new Map<\n HTMLDivElement,\n { resolve: (value: boolean) => void; onKeyDown: (event: KeyboardEvent) => void }\n>();\n\nconst ICON_SIZE = 16;\nconst CLOSE_ICON_SIZE = 12;\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\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\nfunction createPopupElement(opts: InfoPopupOptions): HTMLDivElement {\n const $popup = document.createElement('div');\n\n $popup.classList.add('pp-dev-info-namespace');\n\n const typeClass = opts.type ? `pp-dev-info__popup--${opts.type}` : '';\n const iconHtml = opts.type ? `<div class=\"pp-dev-info__popup-title-icon\">${TYPE_ICONS[opts.type]}</div>` : '';\n\n const template = `\n <div class=\"pp-dev-info__popup ${typeClass} ${opts.className || ''}\" style=\"${opts.style || ''}\">\n <div class=\"pp-dev-info__popup-title\">\n ${iconHtml}\n <div class=\"pp-dev-info__popup-title-text\">${opts.title}</div>\n <div class=\"pp-dev-info__popup-title-close\">\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 </div>\n </div>\n <div class=\"pp-dev-info__popup-content\">${opts.content}</div>\n </div>\n `;\n\n $popup.innerHTML = template;\n\n return $popup;\n}\n\nlet panelController: PanelStateController | null = null;\nlet startReloadVariablesFlow: (() => void) | null = null;\nlet pendingReloadVariablesPopup: { close: () => void } | null = null;\n\nfunction updatePopupPositions() {\n const popups = document.querySelectorAll<HTMLElement>('.pp-dev-info-namespace:not(.pp-dev-info)');\n const position = panelController?.getState().position ?? 'bottom-right';\n const isLeft = position === 'top-left' || position === 'bottom-left';\n const isTop = position === 'top-left' || position === 'top-right';\n\n // Anchor popups to the panel's horizontal side and stack them from the vertically\n // opposite edge so they never cover the panel.\n popups.forEach((popup, index: number) => {\n const offset = POPUP_OFFSET + index * (POPUP_HEIGHT + POPUP_OFFSET);\n const $popupContent = popup.querySelector<HTMLElement>('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return;\n }\n\n $popupContent.classList.toggle('pp-dev-info__popup--left', isLeft);\n\n if (isTop) {\n $popupContent.style.top = 'auto';\n $popupContent.style.bottom = `${offset}px`;\n } else {\n $popupContent.style.bottom = 'auto';\n $popupContent.style.top = `${offset}px`;\n }\n });\n}\n\nfunction animatePopup($popup: HTMLDivElement, type: 'enter' | 'exit') {\n return new Promise<void>((resolve) => {\n const $popupContent = $popup.querySelector('.pp-dev-info__popup');\n\n if (!$popupContent) {\n return resolve();\n }\n\n if (type === 'enter') {\n $popupContent.classList.add('entering');\n\n requestAnimationFrame(() => {\n $popupContent.classList.remove('entering');\n\n resolve();\n });\n } else {\n $popupContent.classList.add('exiting');\n\n setTimeout(() => {\n $popupContent.classList.remove('exiting');\n\n resolve();\n }, ANIMATION_DURATION);\n }\n });\n}\n\nfunction infoPopup(opts: InfoPopupOptions): { close: () => void } {\n const $popup = createPopupElement(opts);\n const $closeButton = $popup.querySelector('.pp-dev-info__popup-title-close');\n\n const removePopup = async () => {\n await animatePopup($popup, 'exit');\n\n $popup.remove();\n\n activePopups--;\n\n updatePopupPositions();\n\n opts.onClose?.();\n };\n\n $closeButton?.addEventListener('click', removePopup);\n document.body.appendChild($popup);\n\n // Position the popup\n activePopups++;\n updatePopupPositions();\n\n // Animate entrance\n animatePopup($popup, 'enter');\n\n const duration = opts.duration ?? 10000;\n\n if (duration > 0) {\n let remainingTime = duration;\n let lastUpdate = Date.now();\n let isVisible = true;\n\n const scheduleDismiss = () => {\n if (!isVisible) {\n return;\n }\n\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n remainingTime -= elapsed;\n lastUpdate = now;\n\n if (remainingTime <= 0) {\n removePopup();\n\n return;\n }\n\n requestAnimationFrame(scheduleDismiss);\n };\n\n // Handle visibility change\n document.addEventListener('visibilitychange', () => {\n isVisible = !document.hidden;\n\n if (isVisible) {\n lastUpdate = Date.now();\n requestAnimationFrame(scheduleDismiss);\n }\n });\n\n requestAnimationFrame(scheduleDismiss);\n }\n\n return { close: removePopup };\n}\n\nfunction closeAllConfirmModals() {\n for (const overlay of [...activeConfirmModals.keys()]) {\n teardownConfirmModal(overlay, false);\n }\n}\n\nfunction confirmModal(opts: ConfirmModalOptions): Promise<boolean> {\n closeAllConfirmModals();\n\n return new Promise<boolean>((resolve) => {\n const $overlay = document.createElement('div');\n\n $overlay.classList.add('pp-dev-info-namespace', CONFIRM_MODAL_OVERLAY_CLASS);\n\n const $confirm = document.createElement('div');\n\n $confirm.classList.add('pp-dev-info__confirm');\n\n const $title = document.createElement('div');\n\n $title.classList.add('pp-dev-info__confirm-title');\n $title.textContent = opts.title;\n\n const $content = document.createElement('div');\n\n $content.classList.add('pp-dev-info__confirm-content');\n $content.textContent = opts.content;\n\n const $actions = document.createElement('div');\n\n $actions.classList.add('pp-dev-info__confirm-actions');\n\n const $cancelButton = document.createElement('button');\n\n $cancelButton.type = 'button';\n $cancelButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--cancel');\n $cancelButton.textContent = opts.cancelText;\n\n const $confirmButton = document.createElement('button');\n\n $confirmButton.type = 'button';\n $confirmButton.classList.add('pp-dev-info__confirm-btn', 'pp-dev-info__confirm-btn--confirm');\n $confirmButton.textContent = opts.confirmText;\n\n $actions.append($cancelButton, $confirmButton);\n $confirm.append($title, $content, $actions);\n $overlay.appendChild($confirm);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n teardownConfirmModal($overlay, false);\n }\n };\n\n activeConfirmModals.set($overlay, { resolve, onKeyDown });\n\n $confirmButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, true);\n });\n\n $cancelButton.addEventListener('click', () => {\n teardownConfirmModal($overlay, false);\n });\n\n $overlay.addEventListener('click', (event) => {\n if (event.target === $overlay) {\n teardownConfirmModal($overlay, false);\n }\n });\n\n document.addEventListener('keydown', onKeyDown);\n document.body.appendChild($overlay);\n });\n}\n\n// ── Inspector console banner ──────────────────────────────────────────────────\n// Logged once on page load so it is visible in DevTools history when the console\n// is opened. The message is harmless if the inspector is disabled.\n(function printInspectorBanner() {\n const url = window.location.origin + '/@pp-dev/inspector';\n\n console.log(\n '%cpp-dev%c 🔍 Request Inspector → %c%s',\n 'background:#6e8efb;color:#fff;padding:2px 8px;border-radius:4px;font-weight:700;font-size:11px',\n 'color:#a0a0b8;font-size:11px',\n 'color:#a78bfa;font-size:11px;text-decoration:underline',\n url,\n );\n})();\n\n// ── Panel UI: position, auto-hide, hide, minimize ─────────────────────────────\n// Initialized outside the hot-context guard — panel placement and visibility must\n// not depend on the WebSocket transport being available.\nconst CLOSED_CLASS = 'closed';\n\nconst $infoPanel = document.querySelector<HTMLElement>('.pp-dev-info');\n\nif ($infoPanel) {\n panelController = createPanelStateController($infoPanel);\n\n const $dragHandle = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__drag-handle');\n\n if ($dragHandle) {\n initDrag($infoPanel, $dragHandle, (corner) => panelController!.setPosition(corner));\n }\n\n const autoHide = initAutoHide($infoPanel, () => panelController!.getState().autoHide);\n\n initPanelSettings($infoPanel, panelController, {\n onOpenChange: (open) => autoHide.keepPeeked(open),\n onOpenVariablesEditorClick: () => window.open(window.location.origin + '/@pp-dev/variables-editor', '_blank'),\n onOpenInspectorClick: () => window.open(window.location.origin + '/@pp-dev/inspector', '_blank'),\n onReloadVariablesClick: () => startReloadVariablesFlow?.(),\n });\n\n panelController.onChange((state) => {\n if (!state.autoHide) {\n $infoPanel.classList.remove('is-peeking');\n }\n\n updatePopupPositions();\n });\n\n // Minimize button; in auto-hide mode it acts as \"pin\" (disables auto-hide).\n const $minimizeButtonWrap = $infoPanel.querySelector<HTMLElement>('.pp-dev-info__wrap-btn');\n const $minimizeButtonSVG = $minimizeButtonWrap?.querySelector('svg');\n\n if ($minimizeButtonWrap && $minimizeButtonSVG) {\n let isClosed = getStorageItem(STORAGE_KEYS.closed) === 'true' && !panelController.getState().autoHide;\n\n const updateTitle = () => {\n $minimizeButtonWrap.title = panelController!.getState().autoHide ? 'Pin panel' : 'Minimize';\n };\n\n updateTitle();\n panelController.onChange(updateTitle);\n\n if (isClosed) {\n $infoPanel.classList.add(CLOSED_CLASS);\n $minimizeButtonSVG.classList.add(CLOSED_CLASS);\n }\n\n $minimizeButtonWrap.addEventListener('click', (e: Event) => {\n e.preventDefault();\n\n if (panelController!.getState().autoHide) {\n isClosed = false;\n panelController!.setAutoHide(false);\n\n return;\n }\n\n $infoPanel.classList.toggle(CLOSED_CLASS);\n $minimizeButtonSVG.classList.toggle(CLOSED_CLASS);\n\n isClosed = !isClosed;\n\n setStorageItem(STORAGE_KEYS.closed, isClosed ? 'true' : 'false');\n });\n }\n}\n\n// Use Vite's HMR context when available; otherwise fall back to a raw-WebSocket\n// shim so the dev panel also works under the `pp-dev next` server (no Vite HMR).\nconst hot = import.meta.hot ?? createPPDevHotContext();\n\nif (hot) {\n hot.on('redirect', (data: { url: string }) => {\n window.location.href = data.url;\n });\n\n hot.on('client:config:update', (data: { config: { [key: string]: any } }) => {\n if (typeof data.config?.canSync === 'boolean') {\n if (data.config.canSync) {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = false;\n $syncButton.classList.remove('disabled');\n $syncButton.title = 'Sync template';\n }\n } else {\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n }\n }\n });\n\n const $syncButton = document.getElementById('sync-template') as HTMLButtonElement | null;\n\n if ($syncButton) {\n hot.on('template:sync:action-required', async (payload: SyncActionRequiredPayload) => {\n // Keep the sync spinner running while a confirmation modal is shown — the sync\n // process is still in progress and only ends on `template:sync:response`.\n const approved = await confirmModal({\n title: payload.title,\n content: payload.content,\n confirmText: payload.confirmText,\n cancelText: payload.cancelText,\n });\n\n hot.send('template:sync:action-response', {\n requestId: payload.requestId,\n approved,\n });\n });\n\n hot.on(\n 'template:sync:response',\n (\n payload:\n | { syncedAt: string; currentHash: string; backupFilename: string }\n | { error: string; config?: { [p: string]: any }; refresh?: boolean }\n | { cancelled: boolean; message: string },\n ) => {\n closeAllConfirmModals();\n $syncButton.classList.remove('syncing');\n\n if ('cancelled' in payload && payload.cancelled) {\n infoPopup({\n title: 'Sync cancelled',\n content: payload.message,\n type: 'warning',\n });\n } else if ('error' in payload && typeof payload.error !== 'undefined') {\n infoPopup({\n title: 'Sync error',\n content: payload.error,\n type: 'danger',\n });\n\n if (payload.refresh) {\n setTimeout(() => {\n window.location.reload();\n });\n } else {\n $syncButton.disabled = true;\n $syncButton.classList.add('disabled');\n $syncButton.title = 'Sync is unavailable on this instance';\n }\n } else if ('syncedAt' in payload && typeof payload.syncedAt !== 'undefined') {\n infoPopup({\n title: 'Sync success',\n content: `Synced at ${new Date(payload.syncedAt).toLocaleString()}.<br />Backup filename: ${\n payload.backupFilename\n }`,\n type: 'success',\n });\n }\n },\n );\n\n $syncButton.addEventListener('click', (ev: Event) => {\n ev.preventDefault();\n\n $syncButton.classList.add('syncing');\n\n hot.send('template:sync', {});\n });\n }\n\n hot.on('page-variables:reload:response', (payload: PageVariablesReloadResponsePayload) => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = null;\n\n if ('error' in payload) {\n infoPopup({\n title: 'Reload variables error',\n content: payload.error,\n type: 'danger',\n });\n\n return;\n }\n\n if (payload.skipped) {\n infoPopup({\n title: 'Nothing to reload',\n content: 'This page has no template variables to refresh.',\n type: 'warning',\n });\n\n return;\n }\n\n infoPopup({\n title: 'Variables reloaded',\n content: `Refetched ${payload.count} variable(s) from MI. Reloading the page…`,\n type: 'success',\n duration: 1200,\n });\n\n setTimeout(() => window.location.reload(), 600);\n });\n\n startReloadVariablesFlow = () => {\n pendingReloadVariablesPopup?.close();\n pendingReloadVariablesPopup = infoPopup({\n title: 'Reloading variables',\n content: 'Refetching live values from MI…',\n type: 'info',\n duration: 0,\n });\n\n hot.send('page-variables:reload', {});\n };\n}\n"],"names":["CLOSED_CLASS"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}
|