@chuvenger/devdock 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/{chunk-2IQRWZ7T.js → chunk-RO4CY6GJ.js} +3 -3
- package/dist/{chunk-2IQRWZ7T.js.map → chunk-RO4CY6GJ.js.map} +1 -1
- package/dist/{chunk-2YX4DI2D.js → chunk-V47DEXPS.js} +120 -29
- package/dist/chunk-V47DEXPS.js.map +1 -0
- package/dist/{dock-C7wZ8pQb.d.cts → dock-ClU_Wn2a.d.cts} +1 -1
- package/dist/{dock-DJZuGmih.d.ts → dock-DKknJBIF.d.ts} +1 -1
- package/dist/index.cjs +119 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -3
- package/dist/index.d.ts +19 -3
- package/dist/index.js +1 -1
- package/dist/{match-C8MsaP6h.d.ts → match-gTnXtOUP.d.ts} +1 -1
- package/dist/{match-Dw1CSS0G.d.cts → match-zABwk1Ai.d.cts} +1 -1
- package/dist/react-router.cjs +117 -26
- package/dist/react-router.cjs.map +1 -1
- package/dist/react-router.d.cts +2 -2
- package/dist/react-router.d.ts +2 -2
- package/dist/react-router.js +2 -2
- package/dist/react.cjs +117 -26
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +2 -2
- package/dist/svelte.cjs +117 -26
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.d.cts +3 -3
- package/dist/svelte.d.ts +3 -3
- package/dist/svelte.js +2 -2
- package/dist/sveltekit.cjs +117 -26
- package/dist/sveltekit.cjs.map +1 -1
- package/dist/sveltekit.d.cts +4 -4
- package/dist/sveltekit.d.ts +4 -4
- package/dist/sveltekit.js +2 -2
- package/dist/{types-B8WgSe7o.d.cts → types-D9BBBI7v.d.cts} +16 -4
- package/dist/{types-B8WgSe7o.d.ts → types-D9BBBI7v.d.ts} +16 -4
- package/package.json +1 -1
- package/dist/chunk-2YX4DI2D.js.map +0 -1
package/dist/sveltekit.cjs
CHANGED
|
@@ -5,21 +5,74 @@ var cn = require('cn');
|
|
|
5
5
|
// src/core/dock.ts
|
|
6
6
|
|
|
7
7
|
// src/core/hotkey.ts
|
|
8
|
+
var isMac = () => typeof navigator !== "undefined" && /mac/i.test(navigator.platform);
|
|
9
|
+
var KEY_CODES = {
|
|
10
|
+
".": "Period",
|
|
11
|
+
",": "Comma",
|
|
12
|
+
"/": "Slash",
|
|
13
|
+
"\\": "Backslash",
|
|
14
|
+
";": "Semicolon",
|
|
15
|
+
"'": "Quote",
|
|
16
|
+
"[": "BracketLeft",
|
|
17
|
+
"]": "BracketRight",
|
|
18
|
+
"-": "Minus",
|
|
19
|
+
"=": "Equal",
|
|
20
|
+
"`": "Backquote",
|
|
21
|
+
" ": "Space",
|
|
22
|
+
space: "Space"
|
|
23
|
+
};
|
|
24
|
+
var codeFor = (key) => {
|
|
25
|
+
if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;
|
|
26
|
+
if (/^[0-9]$/.test(key)) return `Digit${key}`;
|
|
27
|
+
return KEY_CODES[key];
|
|
28
|
+
};
|
|
8
29
|
function matchHotkey(spec, e) {
|
|
9
30
|
const parts = spec.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
|
|
10
31
|
if (parts.length === 0) return false;
|
|
11
32
|
const key = parts[parts.length - 1];
|
|
12
33
|
const mods = new Set(parts.slice(0, -1));
|
|
13
|
-
const
|
|
14
|
-
const wantMeta = mods.has("meta") || mods.has("cmd") || mods.has("mod") &&
|
|
15
|
-
const wantCtrl = mods.has("ctrl") || mods.has("control") || mods.has("mod") && !
|
|
34
|
+
const mac = isMac();
|
|
35
|
+
const wantMeta = mods.has("meta") || mods.has("cmd") || mods.has("mod") && mac;
|
|
36
|
+
const wantCtrl = mods.has("ctrl") || mods.has("control") || mods.has("mod") && !mac;
|
|
16
37
|
const wantShift = mods.has("shift");
|
|
17
38
|
const wantAlt = mods.has("alt") || mods.has("option");
|
|
18
39
|
if (e.metaKey !== wantMeta) return false;
|
|
19
40
|
if (e.ctrlKey !== wantCtrl) return false;
|
|
20
41
|
if (e.shiftKey !== wantShift) return false;
|
|
21
42
|
if (e.altKey !== wantAlt) return false;
|
|
22
|
-
|
|
43
|
+
if (e.key.toLowerCase() === key) return true;
|
|
44
|
+
return wantAlt && e.code === codeFor(key);
|
|
45
|
+
}
|
|
46
|
+
var DEFAULT_HOTKEY = "alt+shift+d";
|
|
47
|
+
var MAC_SYMBOL = {
|
|
48
|
+
meta: "\u2318",
|
|
49
|
+
cmd: "\u2318",
|
|
50
|
+
ctrl: "\u2303",
|
|
51
|
+
control: "\u2303",
|
|
52
|
+
shift: "\u21E7",
|
|
53
|
+
alt: "\u2325",
|
|
54
|
+
option: "\u2325"
|
|
55
|
+
};
|
|
56
|
+
var PC_NAME = {
|
|
57
|
+
meta: "Win",
|
|
58
|
+
cmd: "Win",
|
|
59
|
+
ctrl: "Ctrl",
|
|
60
|
+
control: "Ctrl",
|
|
61
|
+
shift: "Shift",
|
|
62
|
+
alt: "Alt",
|
|
63
|
+
option: "Alt"
|
|
64
|
+
};
|
|
65
|
+
function formatHotkey(spec) {
|
|
66
|
+
const parts = spec.toLowerCase().split("+").map((p) => p.trim()).filter(Boolean);
|
|
67
|
+
if (parts.length === 0) return "";
|
|
68
|
+
const key = parts[parts.length - 1];
|
|
69
|
+
const mods = parts.slice(0, -1);
|
|
70
|
+
const mac = isMac();
|
|
71
|
+
const label = key.length === 1 ? key.toUpperCase() : key;
|
|
72
|
+
const shown = mods.map(
|
|
73
|
+
(m) => mac ? MAC_SYMBOL[m] ?? (m === "mod" ? "\u2318" : m) : PC_NAME[m] ?? (m === "mod" ? "Ctrl" : m)
|
|
74
|
+
);
|
|
75
|
+
return mac ? [...shown, label].join("") : [...shown, label].join("+");
|
|
23
76
|
}
|
|
24
77
|
|
|
25
78
|
// src/core/theme.ts
|
|
@@ -30,6 +83,7 @@ var partClass = {
|
|
|
30
83
|
buttonLabel: "devdock-button-label",
|
|
31
84
|
panel: "devdock-panel",
|
|
32
85
|
title: "devdock-title",
|
|
86
|
+
hotkeyHint: "devdock-hotkey-hint",
|
|
33
87
|
inputWrap: "devdock-input-wrap",
|
|
34
88
|
input: "devdock-input",
|
|
35
89
|
body: "devdock-body",
|
|
@@ -91,6 +145,10 @@ var BASE_CSS = `
|
|
|
91
145
|
}
|
|
92
146
|
|
|
93
147
|
.devdock-title {
|
|
148
|
+
display: flex;
|
|
149
|
+
align-items: center;
|
|
150
|
+
justify-content: space-between;
|
|
151
|
+
gap: 8px;
|
|
94
152
|
padding: 10px 12px;
|
|
95
153
|
border-bottom: 1px solid var(--devdock-border, #2a2e37);
|
|
96
154
|
font-size: 12px;
|
|
@@ -100,6 +158,20 @@ var BASE_CSS = `
|
|
|
100
158
|
color: var(--devdock-muted, #8b909c);
|
|
101
159
|
}
|
|
102
160
|
|
|
161
|
+
.devdock-hotkey-hint {
|
|
162
|
+
flex-shrink: 0;
|
|
163
|
+
padding: 1px 5px;
|
|
164
|
+
font-family: inherit;
|
|
165
|
+
font-size: 10px;
|
|
166
|
+
font-weight: 600;
|
|
167
|
+
/* The heading's tracking and casing are for words, not for a key cap. */
|
|
168
|
+
letter-spacing: 0;
|
|
169
|
+
text-transform: none;
|
|
170
|
+
color: var(--devdock-subtle, #6b7280);
|
|
171
|
+
border: 1px solid var(--devdock-border, #2a2e37);
|
|
172
|
+
border-radius: var(--devdock-radius-xs, 4px);
|
|
173
|
+
}
|
|
174
|
+
|
|
103
175
|
.devdock-input-wrap { padding: 8px; }
|
|
104
176
|
|
|
105
177
|
.devdock-input {
|
|
@@ -240,27 +312,37 @@ function el(tag, props) {
|
|
|
240
312
|
return node;
|
|
241
313
|
}
|
|
242
314
|
var PARTS = Object.keys(partClass);
|
|
315
|
+
function edgesOf(position) {
|
|
316
|
+
return position.split("-");
|
|
317
|
+
}
|
|
318
|
+
var CENTER_ALONG = {
|
|
319
|
+
top: { left: "50%", transform: "translateX(-50%)" },
|
|
320
|
+
bottom: { left: "50%", transform: "translateX(-50%)" },
|
|
321
|
+
left: { top: "50%", transform: "translateY(-50%)" },
|
|
322
|
+
right: { top: "50%", transform: "translateY(-50%)" }
|
|
323
|
+
};
|
|
324
|
+
var CLEAR = { top: "", bottom: "", left: "", right: "", transform: "" };
|
|
243
325
|
function cornerStyle(position) {
|
|
244
326
|
const gap = "16px";
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
case "top-right":
|
|
251
|
-
return { top: gap, right: gap };
|
|
252
|
-
default:
|
|
253
|
-
return { bottom: gap, right: gap };
|
|
254
|
-
}
|
|
327
|
+
const edges = edgesOf(position);
|
|
328
|
+
const styles = { ...CLEAR };
|
|
329
|
+
for (const edge of edges) styles[edge] = gap;
|
|
330
|
+
if (edges.length === 1) Object.assign(styles, CENTER_ALONG[edges[0]]);
|
|
331
|
+
return styles;
|
|
255
332
|
}
|
|
256
333
|
function panelAnchor(position) {
|
|
257
|
-
const
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
[
|
|
262
|
-
[
|
|
263
|
-
|
|
334
|
+
const edges = edgesOf(position);
|
|
335
|
+
const styles = { ...CLEAR, position: "absolute" };
|
|
336
|
+
if (edges.length === 2) {
|
|
337
|
+
const [vertical, horizontal] = edges;
|
|
338
|
+
styles[vertical] = "calc(100% + 8px)";
|
|
339
|
+
styles[horizontal] = "0";
|
|
340
|
+
return styles;
|
|
341
|
+
}
|
|
342
|
+
const edge = edges[0];
|
|
343
|
+
styles[edge] = "calc(100% + 8px)";
|
|
344
|
+
Object.assign(styles, CENTER_ALONG[edge]);
|
|
345
|
+
return styles;
|
|
264
346
|
}
|
|
265
347
|
function keyViews(views) {
|
|
266
348
|
const used = /* @__PURE__ */ new Set();
|
|
@@ -305,6 +387,9 @@ function createDevDock(initial = {}) {
|
|
|
305
387
|
const panel = el("div");
|
|
306
388
|
panel.setAttribute("role", "dialog");
|
|
307
389
|
const heading = el("div");
|
|
390
|
+
const headingText = el("span");
|
|
391
|
+
const hotkeyHint = el("kbd");
|
|
392
|
+
heading.append(headingText, hotkeyHint);
|
|
308
393
|
const inputWrap = el("div");
|
|
309
394
|
const input = el("input");
|
|
310
395
|
input.placeholder = "Filter\u2026";
|
|
@@ -334,11 +419,13 @@ function createDevDock(initial = {}) {
|
|
|
334
419
|
buttonLabel.className = cls("buttonLabel");
|
|
335
420
|
panel.className = cls("panel");
|
|
336
421
|
heading.className = cls("title");
|
|
422
|
+
hotkeyHint.className = cls("hotkeyHint");
|
|
337
423
|
inputWrap.className = cls("inputWrap");
|
|
338
424
|
input.className = cls("input");
|
|
339
425
|
body.className = cls("body");
|
|
340
426
|
list.className = cls("list");
|
|
341
427
|
};
|
|
428
|
+
const hotkey = () => opts.hotkey === void 0 ? DEFAULT_HOTKEY : opts.hotkey;
|
|
342
429
|
const enabled = () => {
|
|
343
430
|
const e = opts.enabled;
|
|
344
431
|
if (typeof e === "function") return e();
|
|
@@ -622,15 +709,18 @@ function createDevDock(initial = {}) {
|
|
|
622
709
|
position: "fixed",
|
|
623
710
|
zIndex: String(zIndex),
|
|
624
711
|
top: "",
|
|
625
|
-
bottom: ""
|
|
626
|
-
left: "",
|
|
627
|
-
right: ""
|
|
712
|
+
bottom: ""
|
|
628
713
|
});
|
|
629
714
|
Object.assign(root.style, cornerStyle(position));
|
|
630
|
-
|
|
715
|
+
headingText.textContent = opts.title ?? "Dev Menu";
|
|
631
716
|
panel.setAttribute("aria-label", opts.title ?? "Dev Menu");
|
|
632
717
|
Object.assign(panel.style, panelAnchor(position));
|
|
633
718
|
buttonLabel.textContent = opts.label ?? "DEV";
|
|
719
|
+
const spec = hotkey();
|
|
720
|
+
const chord = spec ? formatHotkey(spec) : "";
|
|
721
|
+
hotkeyHint.textContent = chord;
|
|
722
|
+
hotkeyHint.hidden = !chord;
|
|
723
|
+
button.title = chord ? `${opts.title ?? "Dev Menu"} (${chord})` : opts.title ?? "Dev Menu";
|
|
634
724
|
button.setAttribute("aria-expanded", String(open));
|
|
635
725
|
paintClasses();
|
|
636
726
|
};
|
|
@@ -679,7 +769,8 @@ function createDevDock(initial = {}) {
|
|
|
679
769
|
if (open && !e.composedPath().includes(root)) setOpen(false);
|
|
680
770
|
};
|
|
681
771
|
const onKeyDown = (e) => {
|
|
682
|
-
|
|
772
|
+
const spec = hotkey();
|
|
773
|
+
if (spec && matchHotkey(spec, e)) {
|
|
683
774
|
e.preventDefault();
|
|
684
775
|
setOpen(!open);
|
|
685
776
|
}
|
package/dist/sveltekit.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/hotkey.ts","../src/core/theme.ts","../src/core/dock.ts","../src/core/match.ts","../src/svelte/sveltekit.ts"],"names":["cn"],"mappings":"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","file":"sveltekit.cjs","sourcesContent":["/** Parse a hotkey string like \"mod+.\" into a matcher predicate. */\nexport function matchHotkey(spec: string, e: KeyboardEvent): boolean {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return false;\n\n const key = parts[parts.length - 1];\n const mods = new Set(parts.slice(0, -1));\n\n const isMac =\n typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n\n const wantMeta = mods.has(\"meta\") || mods.has(\"cmd\") || (mods.has(\"mod\") && isMac);\n const wantCtrl = mods.has(\"ctrl\") || mods.has(\"control\") || (mods.has(\"mod\") && !isMac);\n const wantShift = mods.has(\"shift\");\n const wantAlt = mods.has(\"alt\") || mods.has(\"option\");\n\n if (e.metaKey !== wantMeta) return false;\n if (e.ctrlKey !== wantCtrl) return false;\n if (e.shiftKey !== wantShift) return false;\n if (e.altKey !== wantAlt) return false;\n\n return e.key.toLowerCase() === key;\n}\n","import type { DevDockClassNames } from \"./types\";\n\n/** One styleable piece of the dock. See {@link DevDockClassNames}. */\nexport type DockPart = keyof DevDockClassNames;\n\n/**\n * The class every part carries, whatever you pass in `classNames`. Stable\n * API: target `.devdock-row` from your own stylesheet if you'd rather not\n * thread class names through the options.\n *\n * `rowActive` has no class of its own — the highlighted row is marked with\n * `data-active`, so a base rule can reach it without one.\n */\nexport const partClass: Record<DockPart, string> = {\n root: \"devdock-root\",\n button: \"devdock-button\",\n dot: \"devdock-dot\",\n buttonLabel: \"devdock-button-label\",\n panel: \"devdock-panel\",\n title: \"devdock-title\",\n inputWrap: \"devdock-input-wrap\",\n input: \"devdock-input\",\n body: \"devdock-body\",\n list: \"devdock-list\",\n section: \"devdock-section\",\n group: \"devdock-group\",\n row: \"devdock-row\",\n rowActive: \"\",\n rowLabel: \"devdock-row-label\",\n rowPath: \"devdock-row-path\",\n check: \"devdock-check\",\n empty: \"devdock-empty\",\n viewLabel: \"devdock-view-label\",\n view: \"devdock-view\",\n};\n\n/** Marks the dock's own stylesheet, so the style-inheriting code can skip it. */\nexport const STYLE_MARKER = \"data-devdock-styles\";\n\nconst FONT =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\n\n/**\n * The dock's own styles.\n *\n * Two things make `classNames` work without `!important`:\n *\n * 1. **A cascade layer** (see {@link dockStyles}). Layered rules lose to\n * unlayered ones whatever their specificity, and Tailwind v4 puts its\n * utilities in `@layer utilities` — so the sheet declares a layer order\n * that sits the dock's layer after Tailwind's `base` (its reset can't strip\n * the dock's chrome) and before `utilities` (your classes land).\n * 2. **Exactly one class per rule** — one bare `.devdock-*`, with any state\n * selector tucked inside `:where()`, which contributes nothing. That is\n * what settles ties against unlayered CSS, which is the whole cascade when\n * the layer is turned off (`cssLayer: false`): a page-level reset\n * (`button { … }`, `*`) is worth less and loses, a class you pass is worth\n * the same and wins on order, because this sheet goes in first.\n *\n * Colours, sizes and the font come from `--devdock-*` custom properties, each\n * written as a `var(…, default)` fallback rather than declared anywhere. That\n * is the point: a property the page sets — on `:root`, or on the\n * `[data-devdock]` host for one dock — inherits *through* the shadow boundary\n * and is used, while a default of ours declared inside the shadow tree would\n * have beaten it. It also means retheming needs none of the machinery above:\n * no inherited stylesheet, no layer, no change to the isolation.\n *\n * What stays inline, and so can't be overridden by either: the corner\n * placement, the z-index, and the popup's anchoring — all of them computed\n * from `position`/`zIndex` rather than themed.\n */\nexport const BASE_CSS = `\n.devdock-root { font-family: var(--devdock-font, ${FONT}); }\n\n.devdock-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.6px;\n color: var(--devdock-button-fg, #fff);\n background: var(--devdock-button-bg, #111317);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: 999px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);\n cursor: pointer;\n}\n.devdock-button:where([aria-expanded=\"true\"]) {\n background: var(--devdock-accent, #2563eb);\n}\n\n.devdock-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--devdock-success, #22c55e);\n display: inline-block;\n}\n\n.devdock-panel {\n width: var(--devdock-width, 280px);\n max-height: var(--devdock-max-height, 70vh);\n display: flex;\n flex-direction: column;\n background: var(--devdock-bg, #16181d);\n color: var(--devdock-fg, #e7e9ee);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius, 12px);\n box-shadow: var(--devdock-shadow, 0 12px 40px rgba(0, 0, 0, 0.45));\n overflow: hidden;\n}\n\n.devdock-title {\n padding: 10px 12px;\n border-bottom: 1px solid var(--devdock-border, #2a2e37);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-input-wrap { padding: 8px; }\n\n.devdock-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: var(--devdock-input-bg, #0f1115);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-sm, 8px);\n outline: none;\n}\n\n.devdock-body {\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.devdock-list { padding: 0 6px 8px; }\n\n.devdock-section { margin-top: 6px; }\n\n.devdock-group {\n padding: 6px 8px 2px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.6px;\n text-transform: uppercase;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n text-align: left;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: transparent;\n border: none;\n border-radius: var(--devdock-radius-sm, 8px);\n cursor: pointer;\n}\n.devdock-row:where([data-active]) {\n background: var(--devdock-accent, #2563eb);\n color: var(--devdock-accent-fg, #e7e9ee);\n}\n\n.devdock-row-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.devdock-row-path {\n font-size: 11px;\n color: var(--devdock-subtle, #6b7280);\n font-family: ui-monospace, SFMono-Regular, monospace;\n flex-shrink: 0;\n}\n:where(.devdock-row[data-active]) .devdock-row-path {\n /* Whatever colour the row ended up with, stepped back: currentColor in the\n color property means the inherited one, so this tracks the row however it\n was set - a token, a class of yours - instead of guessing at the accent. */\n color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.devdock-check {\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n color: var(--devdock-success, #22c55e);\n}\n\n.devdock-empty {\n padding: 12px;\n font-size: 13px;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-view-label {\n padding: 4px 8px 0;\n font-size: 11px;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-view { padding: 2px 8px 6px; }\n`;\n\n/** The layer the dock's styles go in when `cssLayer` is left alone. */\nexport const DEFAULT_LAYER = \"devdock\";\n\n/**\n * The sheet text: {@link BASE_CSS}, in a cascade layer unless `layer` is\n * `false`.\n *\n * For the default layer the statement names Tailwind's four layers around\n * ours, which both fixes the relative order and is inert for a page that has\n * none of them — layer names are declared here, in a sheet that always goes in\n * first, so this is the order that stands. A layer *you* name gets no such\n * statement: put it where you want it in your own `@layer` line.\n */\nexport function dockStyles(layer: string | false): string {\n if (!layer) return BASE_CSS;\n const block = `@layer ${layer} {${BASE_CSS}}\\n`;\n // A layer you named is a layer you're placing yourself — ordering it from\n // in here, against names we'd be guessing at, is how the dock would end up\n // under your reset. Only the default layer gets an opinion.\n if (layer !== DEFAULT_LAYER) return block;\n const order = `@layer theme, base, components, ${layer}, utilities;`;\n return `${order}\\n${block}`;\n}\n","import { cn } from \"cn\";\nimport { matchHotkey } from \"./hotkey\";\nimport {\n DEFAULT_LAYER,\n STYLE_MARKER,\n dockStyles,\n partClass,\n type DockPart,\n} from \"./theme\";\nimport type {\n DevCommand,\n DevDockInstance,\n DevDockOptions,\n DevRoute,\n DevView,\n DockPosition,\n} from \"./types\";\n\n/**\n * Vite's own build-time flag. The Vite family (Vite, SvelteKit, React Router\n * 7, Astro…) statically replaces the full `import.meta.env.DEV` token with a\n * literal, so this collapses to a constant there. Anywhere else the read\n * throws — `import.meta.env` is undefined in plain Node and in our CJS build,\n * where esbuild rewrites `import.meta` to `{}` — and we report \"no opinion\"\n * so the caller can fall back to `NODE_ENV`.\n */\nconst viteDevFlag = (): boolean | undefined => {\n try {\n if (typeof import.meta.env.DEV === \"boolean\") return import.meta.env.DEV;\n } catch {\n // Not a Vite-built bundle.\n }\n return undefined;\n};\n\nconst isDevBuild = (): boolean => {\n // Vite knows better than NODE_ENV: `vite build` leaves NODE_ENV unreplaced\n // in some setups, and its dev server is a dev build regardless of NODE_ENV.\n const vite = viteDevFlag();\n if (vite !== undefined) return vite;\n // Bundlers (webpack, Next, esbuild…) statically replace the full\n // `process.env.NODE_ENV` token, even in browser builds where `process`\n // itself is undefined. Reading it directly lets that replacement work;\n // the try/catch covers runtimes where it's left as a real (missing) global.\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n};\n\n/** Loopback IPv4 (127/8) and the private LAN ranges 10/8, 172.16/12, 192.168/16. */\nconst isLocalIPv4 = (host: string): boolean => {\n const parts = /^(\\d{1,3})\\.(\\d{1,3})\\.\\d{1,3}\\.\\d{1,3}$/.exec(host);\n if (!parts) return false;\n const a = Number(parts[1]);\n const b = Number(parts[2]);\n return (\n a === 127 ||\n a === 10 ||\n (a === 192 && b === 168) ||\n (a === 172 && b >= 16 && b <= 31)\n );\n};\n\n/**\n * Whether the page is served from a developer's own machine. The build check\n * alone can't tell: a development build deployed somewhere real (a preview\n * URL, a staging box) still reports itself as a dev build.\n *\n * Dev hosts are loopback, mDNS `.local` names, and private LAN addresses — so\n * hitting the dev server from a phone on the same Wi-Fi still counts. Any\n * other hostname is treated as a deployed site.\n */\nconst isDevHost = (): boolean => {\n if (typeof location === \"undefined\") return true;\n // IPv6 literals arrive bracketed, e.g. \"[::1]\".\n const host = location.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n // No hostname at all (file://, about:blank…) is not a deployed site.\n if (!host) return true;\n return (\n host === \"localhost\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".local\") ||\n host === \"::1\" ||\n host === \"0.0.0.0\" ||\n isLocalIPv4(host)\n );\n};\n\n/**\n * A row in the list, resolved for this render. `label` and `checked` are\n * snapshots of whatever the caller's functions returned just now, while `sig`\n * is deliberately stable across those values — see {@link itemSig}.\n */\ntype Item = {\n key: string;\n label: string;\n group: string;\n /** Identity of the row's *shape*, not its live values. */\n sig: string;\n} & (\n | { kind: \"route\"; route: DevRoute }\n | { kind: \"command\"; checked: boolean | null; command: DevCommand }\n);\n\ntype Styles = Partial<CSSStyleDeclaration>;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: Partial<HTMLElementTagNameMap[K]>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props) Object.assign(node, props);\n return node;\n}\n\n/** Every part `classNames` can address, in a fixed order. */\nconst PARTS = Object.keys(partClass) as DockPart[];\n\nfunction cornerStyle(position: DockPosition): Styles {\n const gap = \"16px\";\n switch (position) {\n case \"bottom-left\":\n return { bottom: gap, left: gap };\n case \"top-left\":\n return { top: gap, left: gap };\n case \"top-right\":\n return { top: gap, right: gap };\n default:\n return { bottom: gap, right: gap };\n }\n}\n\nfunction panelAnchor(position: DockPosition): Styles {\n const isTop = position.startsWith(\"top\");\n const isRight = position.endsWith(\"right\");\n return {\n position: \"absolute\",\n [isTop ? \"top\" : \"bottom\"]: \"calc(100% + 8px)\",\n [isRight ? \"right\" : \"left\"]: \"0\",\n } as Styles;\n}\n\n/**\n * Pair each view with the key it is reconciled by: its `id`, or its index.\n * Duplicate ids are a caller mistake, but a silent one — two views sharing a\n * key would share a host element, so the collision is broken here instead.\n *\n * Generic over the view shape because the adapters have their own (React's\n * takes `render` in place of `mount`) and have to key their side of a view —\n * a portal, say — exactly the way the core keys its host. Not public API.\n *\n * @internal\n */\nexport function keyViews<T extends { id?: string }>(\n views: readonly T[],\n): { view: T; key: string }[] {\n const used = new Set<string>();\n return views.map((view, i) => {\n let key = view.id ?? `#${i}`;\n while (used.has(key)) key = `${key}#${i}`;\n used.add(key);\n return { view, key };\n });\n}\n\n/**\n * Create a framework-agnostic dev dock: a floating button that opens a popup\n * to jump between routes and run commands. Returns a handle to update its\n * options or tear it down. No-ops on the server (when there is no `document`).\n */\nexport function createDevDock(initial: DevDockOptions = {}): DevDockInstance {\n if (typeof document === \"undefined\") {\n return { update() {}, destroy() {} };\n }\n\n let opts: DevDockOptions = { ...initial };\n /**\n * A part's classes: the `devdock-*` one it always carries, then whatever\n * the caller passed for it. Read from `opts` at paint time, so `update()`\n * can change a class without rebuilding anything.\n *\n * `cn` rather than a plain join, because the merge is between Tailwind\n * classes and the last one has to win: `rowActive: \"text-emerald-900\"` over\n * `row: \"text-slate-700\"` is a conflict the class attribute can't settle on\n * its own — the stylesheet's order decides, and that isn't ours.\n */\n const cls = (...parts: DockPart[]): string =>\n cn(parts.map((part) => [partClass[part], opts.classNames?.[part]]));\n /**\n * Identity of the caller's classes, folded into the signatures that decide\n * whether the per-render DOM (rows, sections, view wrappers) is reusable.\n */\n const classSig = (): string =>\n PARTS.map((p) => cn(opts.classNames?.[p])).join(\"\\u0000\");\n\n let open = false;\n let query = \"\";\n let active = 0;\n let mounted = false;\n\n // Light-DOM host that gets appended to the page. When shadow DOM is used,\n // the actual UI lives inside its shadow root — fully isolated from the host\n // page's CSS. `data-devdock` stays on the host so it's discoverable.\n const host = el(\"div\");\n host.setAttribute(\"data-devdock\", \"\");\n // Classes are defined by a stylesheet of the caller's, which an isolated\n // shadow root would keep out — so passing `classNames` flips the default to\n // `\"inherit\"`. An explicit `shadow` still wins.\n const shadowMode = initial.shadow ?? (initial.classNames ? \"inherit\" : true);\n const useShadow =\n shadowMode !== false && typeof host.attachShadow === \"function\";\n const shadowRoot = useShadow ? host.attachShadow({ mode: \"open\" }) : null;\n const mountPoint: Node = shadowRoot ?? host;\n\n // The dock's own styles. They go in *first* — ahead of the inherited clones\n // below, at the top of `<head>` in light-DOM mode — because that is what\n // fixes the cascade layer order, and what settles a specificity tie in the\n // caller's favour. See `dockStyles`.\n const baseStyle = el(\"style\", {\n textContent: dockStyles(initial.cssLayer ?? DEFAULT_LAYER),\n });\n baseStyle.setAttribute(STYLE_MARKER, \"\");\n if (shadowRoot) mountPoint.appendChild(baseStyle);\n\n // `shadow: \"inherit\"` keeps the isolation boundary but copies the page's\n // styles across it, so a view can render the host app's own components.\n // The clones live in one wrapper so re-syncing is a single replaceChildren;\n // `display: contents` keeps it out of the layout.\n const styleSlot = shadowRoot && shadowMode === \"inherit\" ? el(\"div\") : null;\n if (styleSlot) {\n styleSlot.style.display = \"contents\";\n mountPoint.appendChild(styleSlot);\n }\n\n const root = el(\"div\");\n mountPoint.appendChild(root);\n\n const panel = el(\"div\");\n panel.setAttribute(\"role\", \"dialog\");\n\n const heading = el(\"div\");\n\n const inputWrap = el(\"div\");\n const input = el(\"input\");\n input.placeholder = \"Filter…\";\n inputWrap.appendChild(input);\n\n const list = el(\"div\");\n list.setAttribute(\"data-devdock-list\", \"\");\n\n const viewsBefore = el(\"div\");\n viewsBefore.setAttribute(\"data-devdock-views\", \"before\");\n const viewsAfter = el(\"div\");\n viewsAfter.setAttribute(\"data-devdock-views\", \"after\");\n\n // One scroller around the views and the list, so a tall view can't push the\n // panel past its max height.\n const body = el(\"div\");\n body.append(viewsBefore, list, viewsAfter);\n\n panel.append(heading, inputWrap, body);\n\n const button = el(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", \"Toggle dev menu\");\n const dot = el(\"span\");\n const buttonLabel = el(\"span\");\n button.append(dot, buttonLabel);\n\n root.appendChild(button);\n\n /** The small uppercase heading above a group of rows, or above a view. */\n const sectionHeading = (text: string) =>\n el(\"div\", { className: cls(\"group\"), textContent: text });\n\n /** A view's own label, when several views share one `group` heading. */\n const viewLabel = (text: string) =>\n el(\"div\", { className: cls(\"viewLabel\"), textContent: text });\n\n /** Classes for the parts that live as long as the dock does. */\n const paintClasses = () => {\n root.className = cls(\"root\");\n button.className = cls(\"button\");\n dot.className = cls(\"dot\");\n buttonLabel.className = cls(\"buttonLabel\");\n panel.className = cls(\"panel\");\n heading.className = cls(\"title\");\n inputWrap.className = cls(\"inputWrap\");\n input.className = cls(\"input\");\n body.className = cls(\"body\");\n list.className = cls(\"list\");\n };\n\n // ---- behavior ---------------------------------------------------------\n\n const enabled = (): boolean => {\n const e = opts.enabled;\n if (typeof e === \"function\") return e();\n if (e != null) return e;\n // Default gate: a dev build, served from a dev machine. `devHostOnly:\n // false` keeps the build check but allows any hostname.\n return isDevBuild() && (opts.devHostOnly === false || isDevHost());\n };\n\n const navigate = (path: string) => {\n if (opts.onNavigate) opts.onNavigate(path);\n else if (typeof window !== \"undefined\") window.location.assign(path);\n };\n\n const buildItems = (): Item[] => {\n const out: Item[] = [];\n (opts.routes ?? []).forEach((r, i) => {\n const key = `route:${r.path}:${i}`;\n const label = r.label ?? r.path;\n out.push({\n kind: \"route\",\n key,\n label,\n group: r.group ?? \"Routes\",\n sig: [key, r.group ?? \"Routes\", label, r.path].join(\"\\u0000\"),\n route: r,\n });\n });\n (opts.commands ?? []).forEach((c, i) => {\n // A function label is read fresh here, on every render of the open\n // panel. The row's signature uses a placeholder in its place so the new\n // text lands on the existing node instead of rebuilding the list — see\n // `renderList`. The same goes for `checked`: its presence is part of the\n // shape, its value isn't.\n const live = typeof c.label === \"function\";\n const label = typeof c.label === \"function\" ? c.label() : c.label;\n const checked = c.checked ? c.checked() === true : null;\n const key = `cmd:${c.id ?? (live ? \"\" : label)}:${i}`;\n const group = c.group ?? \"Commands\";\n out.push({\n kind: \"command\",\n key,\n label,\n group,\n sig: [\n key,\n group,\n live ? \"\\u0000live\" : label,\n checked === null ? \"\" : \"\\u0000checkable\",\n ].join(\"\\u0000\"),\n checked,\n command: c,\n });\n });\n return out;\n };\n\n const getFiltered = (): Item[] => {\n const q = query.trim().toLowerCase();\n const items = buildItems();\n if (!q) return items;\n return items.filter(\n (it) =>\n it.label.toLowerCase().includes(q) ||\n (it.kind === \"route\" && it.route.path.toLowerCase().includes(q)),\n );\n };\n\n const runItem = async (it: Item) => {\n if (it.kind === \"route\") {\n navigate(it.route.path);\n setOpen(false);\n return;\n }\n try {\n await it.command.run();\n } finally {\n if (!it.command.keepOpen) setOpen(false);\n }\n };\n\n type Row = {\n item: Item;\n node: HTMLButtonElement;\n labelSpan: HTMLSpanElement;\n pathSpan: HTMLSpanElement | null;\n checkSpan: HTMLSpanElement | null;\n };\n\n // The rendered rows, parallel to the current filtered list. They are kept\n // around so hovering or arrowing only repaints the highlight: rebuilding the\n // rows would destroy the node under the pointer, and the browser then never\n // dispatches a `click` on it (mousedown/mouseup retarget to the parent).\n let rows: Row[] = [];\n // Signature of the item list the rows were built from; identical signature\n // means the existing nodes can be reused as-is.\n let rowsSig: string | null = null;\n\n // Identity of a row's *shape*. Values that can change between renders\n // without changing the shape — a function `label`'s text, a `checked`\n // state — are excluded on purpose: those are written onto the existing node\n // by `paintRow`, because rebuilding the row would destroy the node under\n // the pointer and swallow the click.\n const itemSig = (it: Item): string => it.sig;\n\n /** Write a row's live values (dynamic label, check mark) onto its node. */\n const paintRow = (row: Row) => {\n const it = row.item;\n if (row.labelSpan.textContent !== it.label)\n row.labelSpan.textContent = it.label;\n if (row.checkSpan && it.kind === \"command\") {\n const on = it.checked === true;\n row.checkSpan.textContent = on ? \"\\u2713\" : \"\";\n row.node.setAttribute(\"aria-checked\", String(on));\n }\n };\n\n // The highlight is an attribute, not an inline colour: that keeps it in the\n // stylesheet, where `classNames.rowActive` (or a rule of your own on\n // `.devdock-row[data-active]`) can take it over.\n const paintActive = () => {\n rows.forEach((row, idx) => {\n const isActive = idx === active;\n if (isActive) row.node.setAttribute(\"data-active\", \"\");\n else row.node.removeAttribute(\"data-active\");\n row.node.className = isActive ? cls(\"row\", \"rowActive\") : cls(\"row\");\n });\n };\n\n const setActive = (next: number, scroll = false) => {\n if (next === active || next < 0 || next >= rows.length) return;\n active = next;\n paintActive();\n // `scrollIntoView` is absent in jsdom, hence the optional call.\n if (scroll) rows[active]?.node.scrollIntoView?.({ block: \"nearest\" });\n };\n\n const renderList = () => {\n const filtered = getFiltered();\n active = Math.min(active, Math.max(0, filtered.length - 1));\n\n const sig = [classSig(), ...filtered.map(itemSig)].join(\"\\n\");\n if (sig === rowsSig) {\n // Same items in the same order: keep the nodes, refresh the highlight.\n // The items themselves are rebuilt on every call, so re-point each row\n // at its current one (its `run`/`route` may have been swapped by\n // `update()`).\n filtered.forEach((it, idx) => {\n const row = rows[idx];\n if (!row) return;\n row.item = it;\n paintRow(row);\n });\n paintActive();\n return;\n }\n rowsSig = sig;\n rows = [];\n list.replaceChildren();\n\n if (filtered.length === 0) {\n list.appendChild(\n el(\"div\", { className: cls(\"empty\"), textContent: \"Nothing here.\" }),\n );\n return;\n }\n\n const groups = new Map<string, Item[]>();\n for (const it of filtered) {\n const arr = groups.get(it.group) ?? [];\n arr.push(it);\n groups.set(it.group, arr);\n }\n\n for (const [groupName, groupItems] of groups) {\n const section = el(\"div\", { className: cls(\"section\") });\n section.appendChild(sectionHeading(groupName));\n\n for (const it of groupItems) {\n const idx = filtered.indexOf(it);\n const row = el(\"button\", { className: cls(\"row\") });\n row.type = \"button\";\n\n const labelSpan = el(\"span\", { className: cls(\"rowLabel\") });\n row.appendChild(labelSpan);\n\n let pathSpan: HTMLSpanElement | null = null;\n if (it.kind === \"route\" && it.route.path !== it.label) {\n pathSpan = el(\"span\", {\n className: cls(\"rowPath\"),\n textContent: it.route.path,\n });\n row.appendChild(pathSpan);\n }\n\n // A command with `checked` is a toggle, not a one-shot action: say so\n // to assistive tech, and keep the mark's box reserved either way so\n // the label doesn't shift when it flips.\n let checkSpan: HTMLSpanElement | null = null;\n if (it.kind === \"command\" && it.checked !== null) {\n row.setAttribute(\"role\", \"checkbox\");\n checkSpan = el(\"span\", { className: cls(\"check\") });\n row.appendChild(checkSpan);\n }\n\n const rec: Row = { item: it, node: row, labelSpan, pathSpan, checkSpan };\n rows[idx] = rec;\n paintRow(rec);\n\n row.addEventListener(\"mouseenter\", () => setActive(idx));\n row.addEventListener(\"click\", () => void runItem(rec.item));\n section.appendChild(row);\n }\n list.appendChild(section);\n }\n\n paintActive();\n };\n\n // ---- views -------------------------------------------------------------\n\n type MountedView = { host: HTMLElement; teardown?: () => void };\n\n // Views live only while the panel is open: `setOpen(true)` mounts them and\n // `setOpen(false)` runs their teardowns, which is what makes a rAF loop or\n // an event listener inside a view correct rather than a leak.\n const mountedViews = new Map<string, MountedView>();\n // Shape of the view list the current DOM was built from — keys, placement\n // and headings, but nothing a view renders itself. An `update()` that\n // leaves this unchanged is a no-op, so a view is never remounted (or even\n // reparented) just because the options object is new.\n let viewsSig: string | null = null;\n\n type KeyedView = { view: DevView; key: string };\n\n const viewOrder = (v: DevView): \"before\" | \"after\" =>\n v.order === \"after\" ? \"after\" : \"before\";\n\n const unmountViews = () => {\n for (const mv of mountedViews.values()) {\n mv.teardown?.();\n mv.host.remove();\n }\n mountedViews.clear();\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n viewsSig = null;\n };\n\n const renderViews = () => {\n const keyed = keyViews(opts.views ?? []);\n const sig = [\n classSig(),\n ...keyed.map(({ view, key }) =>\n [key, viewOrder(view), view.group ?? \"\", view.label ?? \"\"].join(\n \"\\u0000\",\n ),\n ),\n ].join(\"\\n\");\n if (sig === viewsSig) return;\n viewsSig = sig;\n\n const live = new Set(keyed.map(({ key }) => key));\n for (const [key, mv] of mountedViews) {\n if (live.has(key)) continue;\n mv.teardown?.();\n mv.host.remove();\n mountedViews.delete(key);\n }\n\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n\n // Hosts are appended first and mounted afterwards, so `mount` is handed a\n // host that is already connected to the document.\n const pending: (KeyedView & { host: HTMLElement })[] = [];\n\n for (const placement of [\"before\", \"after\"] as const) {\n const container = placement === \"before\" ? viewsBefore : viewsAfter;\n const here = keyed.filter(({ view }) => viewOrder(view) === placement);\n\n // One section per `group`, in first-appearance order; a view without a\n // group gets its own section headed by its `label`.\n const sections = new Map<\n string,\n { heading?: string; items: KeyedView[] }\n >();\n for (const entry of here) {\n const groupKey = entry.view.group ?? `\\u0000${entry.key}`;\n const section = sections.get(groupKey);\n if (section) section.items.push(entry);\n else\n sections.set(groupKey, {\n heading: entry.view.group ?? entry.view.label,\n items: [entry],\n });\n }\n\n for (const section of sections.values()) {\n const wrap = el(\"div\", { className: cls(\"section\") });\n if (section.heading) wrap.appendChild(sectionHeading(section.heading));\n for (const { view, key } of section.items) {\n if (view.group != null && view.label)\n wrap.appendChild(viewLabel(view.label));\n const existing = mountedViews.get(key);\n if (existing) {\n wrap.appendChild(existing.host);\n continue;\n }\n const viewHost = el(\"div\", { className: cls(\"view\") });\n viewHost.setAttribute(\"data-devdock-view\", view.id ?? \"\");\n wrap.appendChild(viewHost);\n pending.push({ view, key, host: viewHost });\n }\n container.appendChild(wrap);\n }\n }\n\n for (const { view, key, host: viewHost } of pending) {\n const mv: MountedView = { host: viewHost };\n mountedViews.set(key, mv);\n const teardown = view.mount(viewHost);\n if (typeof teardown === \"function\") mv.teardown = teardown;\n }\n };\n\n // ---- inherited styles --------------------------------------------------\n\n // What the current clones were made from, so an unrelated head mutation\n // doesn't re-clone every <link> (and make the browser re-fetch it).\n let clonesSig: string | null = null;\n\n /**\n * Copy the document's styles into the shadow root (`shadow: \"inherit\"`).\n * Constructed sheets come across by reference; `<style>` and\n * `<link rel=\"stylesheet\">` nodes are cloned, which re-reads the style's\n * text or re-fetches the link's href inside the shadow tree.\n */\n const syncStyles = () => {\n if (!styleSlot || !shadowRoot) return;\n\n const adopted = (\n document as Document & { adoptedStyleSheets?: readonly unknown[] }\n ).adoptedStyleSheets;\n if (Array.isArray(adopted)) {\n try {\n const sr = shadowRoot as ShadowRoot & {\n adoptedStyleSheets: unknown[];\n };\n sr.adoptedStyleSheets = [...adopted];\n } catch {\n // A sheet the document adopted but this root may not (cross-document).\n }\n }\n\n // `:not([data-devdock-styles])`: in light-DOM mode a dock puts its own\n // sheet in the document, and re-cloning it here would be noise.\n const sheets = [\n ...document.querySelectorAll(\n `style:not([${STYLE_MARKER}]), link[rel~=\"stylesheet\" i]`,\n ),\n ];\n const sig = sheets\n .map((n) => `${n.tagName}\\u0000${n.getAttribute(\"href\") ?? n.textContent}`)\n .join(\"\\n\");\n if (sig === clonesSig) return;\n clonesSig = sig;\n styleSlot.replaceChildren(...sheets.map((n) => n.cloneNode(true)));\n };\n\n // Bundlers inject and mutate <style> tags in `document.head` as you edit —\n // without watching, an HMR'd stylesheet would stop reaching the views.\n let styleObserver: MutationObserver | null = null;\n let syncQueued = false;\n const watchStyles = () => {\n if (\n !styleSlot ||\n styleObserver ||\n !document.head ||\n typeof MutationObserver === \"undefined\"\n )\n return;\n styleObserver = new MutationObserver(() => {\n if (syncQueued) return;\n syncQueued = true;\n // Coalesce a burst of injections into one re-clone.\n queueMicrotask(() => {\n syncQueued = false;\n syncStyles();\n });\n });\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n };\n const unwatchStyles = () => {\n styleObserver?.disconnect();\n styleObserver = null;\n };\n\n const renderShell = () => {\n const position = opts.position ?? \"bottom-right\";\n const zIndex = opts.zIndex ?? 2147483000;\n\n Object.assign(root.style, {\n position: \"fixed\",\n zIndex: String(zIndex),\n top: \"\",\n bottom: \"\",\n left: \"\",\n right: \"\",\n });\n Object.assign(root.style, cornerStyle(position));\n\n heading.textContent = opts.title ?? \"Dev Menu\";\n panel.setAttribute(\"aria-label\", opts.title ?? \"Dev Menu\");\n Object.assign(panel.style, panelAnchor(position));\n\n buttonLabel.textContent = opts.label ?? \"DEV\";\n // The open state is `aria-expanded`, which the stylesheet also paints —\n // see `BASE_CSS`.\n button.setAttribute(\"aria-expanded\", String(open));\n paintClasses();\n };\n\n function setOpen(next: boolean) {\n if (open === next) return;\n open = next;\n if (open) {\n query = \"\";\n input.value = \"\";\n active = 0;\n panel.isConnected || root.insertBefore(panel, button);\n renderShell();\n renderList();\n // The panel is connected, so views mount into a live document; styles\n // may have changed while it was closed.\n syncStyles();\n renderViews();\n requestAnimationFrame(() => input.focus());\n } else {\n // Teardown runs while the panel is still in the document, so a view can\n // read the DOM it is about to lose.\n unmountViews();\n if (panel.isConnected) panel.remove();\n }\n renderShell();\n }\n\n // ---- listeners --------------------------------------------------------\n\n input.addEventListener(\"input\", () => {\n query = input.value;\n active = 0;\n renderList();\n });\n\n panel.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive(Math.min(active + 1, rows.length - 1), true);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive(Math.max(active - 1, 0), true);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const it = rows[active]?.item;\n if (it) void runItem(it);\n }\n });\n\n button.addEventListener(\"click\", () => setOpen(!open));\n\n const onDocMouseDown = (e: MouseEvent) => {\n // composedPath() sees through the shadow boundary; a plain\n // `contains(e.target)` would miss clicks inside the shadow root.\n if (open && !e.composedPath().includes(root)) setOpen(false);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (opts.hotkey && matchHotkey(opts.hotkey, e)) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n\n const addListeners = () => {\n document.addEventListener(\"mousedown\", onDocMouseDown);\n window.addEventListener(\"keydown\", onKeyDown);\n };\n const removeListeners = () => {\n document.removeEventListener(\"mousedown\", onDocMouseDown);\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n\n const mount = () => {\n if (mounted) return;\n // Light DOM: the sheet can't ride along inside the host, so it goes at the\n // very top of <head>, ahead of the page's own styles.\n if (!shadowRoot)\n (document.head ?? document.documentElement).prepend(baseStyle);\n (opts.container ?? document.body).appendChild(host);\n addListeners();\n syncStyles();\n watchStyles();\n mounted = true;\n };\n const unmount = () => {\n if (!mounted) return;\n removeListeners();\n unwatchStyles();\n if (!shadowRoot) baseStyle.remove();\n host.remove();\n mounted = false;\n };\n\n // ---- init -------------------------------------------------------------\n\n renderShell();\n if (enabled()) mount();\n\n return {\n update(next: DevDockOptions) {\n opts = { ...opts, ...next };\n if (enabled()) {\n mount();\n renderShell();\n if (open) {\n renderList();\n renderViews();\n }\n } else {\n setOpen(false);\n unmount();\n }\n },\n destroy() {\n setOpen(false);\n unmount();\n },\n };\n}\n","import type { DevRoute } from \"./types\";\n\n/**\n * Restricts which auto-detected routes appear. A string is treated as a glob\n * where `*` matches any characters (e.g. `\"/dev/*\"`, `\"/admin/*\"`); or pass a\n * `RegExp` tested against the path, or a predicate for full control.\n */\nexport type RouteMatcher = string | RegExp | ((route: DevRoute) => boolean);\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\n/** Normalize any {@link RouteMatcher} into a predicate. */\nexport function toPredicate(match: RouteMatcher): (route: DevRoute) => boolean {\n if (typeof match === \"function\") return match;\n const re = match instanceof RegExp ? match : globToRegExp(match);\n return (route) => re.test(route.path);\n}\n\nexport function isMatcher(value: object | RouteMatcher): value is RouteMatcher {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\n/**\n * Convention shared by every adapter: `/dev` and everything under it is a dev\n * destination, so a dev section needs no extra marker.\n */\nexport function isDevPath(path: string): boolean {\n return path === \"/dev\" || path.startsWith(\"/dev/\");\n}\n\n/** Drop later routes that repeat an earlier route's path. */\nexport function dedupeByPath(routes: DevRoute[]): DevRoute[] {\n const seen = new Set<string>();\n return routes.filter((r) =>\n seen.has(r.path) ? false : (seen.add(r.path), true),\n );\n}\n","import { createDevDock } from \"../core/dock\";\nimport type { DevDockOptions, DevRoute } from \"../core/types\";\nimport {\n dedupeByPath,\n isDevPath,\n isMatcher,\n toPredicate,\n type RouteMatcher,\n} from \"../core/match\";\nimport type { DevDockAction } from \"./index\";\n\nexport type { RouteMatcher };\n\n/**\n * What `import.meta.glob(\"/src/routes/**\\/+page.svelte\")` returns — only the\n * keys matter, so an array of file paths works too.\n */\nexport type RouteModules = Record<string, unknown> | string[];\n\nexport interface DetectOptions {\n /**\n * Only keep routes that match. A glob string (`*` = any characters), a\n * `RegExp`, or a predicate.\n */\n match?: RouteMatcher;\n /**\n * Also list the app's ordinary routes, not just the ones under `/dev`.\n * Default: `false`.\n */\n staticRoutes?: boolean;\n /**\n * Your routes directory, as a name or a trailing path (`\"routes\"`,\n * `\"app/pages\"`). Detected from the `src/routes` (or `routes`) segment of\n * each key by default; set it only if your routes live somewhere else.\n */\n routesDir?: string;\n}\n\n/** Page files SvelteKit renders: `+page.svelte`, `+page.ts`, `+page@(app).svelte`… */\nconst PAGE_FILE = /^\\+page(@[^.]*)?\\.[^.]+$/;\n\nfunction stripRoutesDir(file: string, routesDir?: string): string | null {\n const path = file.replace(/\\\\/g, \"/\");\n const dirs = routesDir ? [routesDir] : [\"src/routes\", \"routes\"];\n for (const dir of dirs) {\n const needle = `/${dir.replace(/^\\/|\\/$/g, \"\")}/`;\n const at = path.lastIndexOf(needle);\n if (at !== -1) return path.slice(at + needle.length);\n if (path.startsWith(needle.slice(1))) return path.slice(needle.length - 1);\n }\n // Relative glob from inside the routes directory, e.g. \"./dev/+page.svelte\".\n return routesDir ? null : path.replace(/^\\.?\\//, \"\");\n}\n\n/**\n * Turn a SvelteKit page file path into the route it serves, or `null` if it\n * isn't a navigable page.\n *\n * Layout groups (`(app)`) and optional params (`[[lang]]`) drop out of the\n * path; required (`[id]`), matched (`[id=int]`) and rest (`[...rest]`) params\n * make the route unnavigable without arguments, so it's skipped.\n */\nexport function routeFromFile(\n file: string,\n options: Pick<DetectOptions, \"routesDir\"> = {},\n): string | null {\n const relative = stripRoutesDir(file, options.routesDir);\n if (relative == null) return null;\n const segments = relative.split(\"/\");\n const filename = segments.pop();\n if (!filename || !PAGE_FILE.test(filename)) return null;\n const kept: string[] = [];\n for (const segment of segments) {\n if (!segment || segment === \".\") continue;\n // Layout group — organizes files, not URLs.\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) continue;\n // Optional param: the route is reachable without it.\n if (segment.startsWith(\"[[\") && segment.endsWith(\"]]\")) continue;\n if (segment.includes(\"[\")) return null;\n kept.push(segment);\n }\n return `/${kept.join(\"/\")}`;\n}\n\n/**\n * Flatten a SvelteKit `import.meta.glob` of page files into navigable\n * {@link DevRoute}s.\n *\n * Only dev destinations are returned — anything under `/dev`, by convention.\n * Pass `{ staticRoutes: true }` to list every page instead, and `{ match }`\n * to scope the results. A bare matcher is accepted as shorthand.\n *\n * ```ts\n * const routes = detectRoutes(import.meta.glob(\"/src/routes/**\\/+page.svelte\"));\n * ```\n */\nexport function detectRoutes(\n modules: RouteModules,\n options: DetectOptions | RouteMatcher = {},\n): DevRoute[] {\n const opts: DetectOptions = isMatcher(options) ? { match: options } : options;\n const files = Array.isArray(modules) ? modules : Object.keys(modules);\n const paths: string[] = [];\n for (const file of files) {\n const path = routeFromFile(file, opts);\n if (path != null && (opts.staticRoutes === true || isDevPath(path)))\n paths.push(path);\n }\n const routes = dedupeByPath(\n paths.sort().map((path) => ({ path, label: path })),\n );\n return opts.match ? routes.filter(toPredicate(opts.match)) : routes;\n}\n\nexport interface SvelteKitDevDockOptions extends DevDockOptions, DetectOptions {\n /**\n * Your page files, from `import.meta.glob`. The glob has to be written in\n * your app (Vite resolves it at build time), so pass the result in:\n *\n * ```ts\n * { modules: import.meta.glob(\"/src/routes/**\\/+page.svelte\") }\n * ```\n *\n * Detected routes come first; any `routes` you pass are appended.\n */\n modules?: RouteModules;\n}\n\nfunction resolveOptions(options: SvelteKitDevDockOptions): DevDockOptions {\n const { modules, match, staticRoutes, routesDir, ...rest } = options;\n if (!modules) return rest;\n const detected = detectRoutes(modules, { match, staticRoutes, routesDir });\n return { ...rest, routes: [...detected, ...(rest.routes ?? [])] };\n}\n\n/**\n * Svelte action that mounts a dev dock with the SvelteKit routes detected\n * from `modules`:\n *\n * ```svelte\n * <script lang=\"ts\">\n * import { goto } from \"$app/navigation\";\n * import { devdock } from \"@chuvenger/devdock/sveltekit\";\n *\n * const modules = import.meta.glob(\"/src/routes/**\\/+page.svelte\");\n * </script>\n *\n * <div use:devdock={{ modules, onNavigate: goto, hotkey: \"mod+.\" }}></div>\n * ```\n *\n * Same contract as the plain `devdock` action: the dock mounts into\n * `document.body` (or `options.container`), so the host element is just an\n * anchor, and reactive options flow through `update`.\n */\nexport function devdock(\n _node: HTMLElement,\n options: SvelteKitDevDockOptions = {},\n): DevDockAction {\n const instance = createDevDock(resolveOptions(options));\n return {\n update(next: SvelteKitDevDockOptions = {}) {\n instance.update(resolveOptions(next));\n },\n destroy() {\n instance.destroy();\n },\n };\n}\n\nexport { createDevDock } from \"../core/dock\";\nexport type { DevDockAction } from \"./index\";\nexport type {\n DevDockOptions,\n DevDockInstance,\n DevRoute,\n DevCommand,\n DevView,\n DockPosition,\n} from \"../core/types\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/hotkey.ts","../src/core/theme.ts","../src/core/dock.ts","../src/core/match.ts","../src/svelte/sveltekit.ts"],"names":["cn"],"mappings":"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","file":"sveltekit.cjs","sourcesContent":["/** Whether \"mod\" means ⌘ rather than Ctrl. */\nconst isMac = (): boolean =>\n typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n\n/**\n * `event.code` for the keys a spec can name, so an Alt combo can be matched by\n * physical key. Letters and digits are derived; these are the rest.\n */\nconst KEY_CODES: Record<string, string> = {\n \".\": \"Period\",\n \",\": \"Comma\",\n \"/\": \"Slash\",\n \"\\\\\": \"Backslash\",\n \";\": \"Semicolon\",\n \"'\": \"Quote\",\n \"[\": \"BracketLeft\",\n \"]\": \"BracketRight\",\n \"-\": \"Minus\",\n \"=\": \"Equal\",\n \"`\": \"Backquote\",\n \" \": \"Space\",\n space: \"Space\",\n};\n\nconst codeFor = (key: string): string | undefined => {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return KEY_CODES[key];\n};\n\n/** Parse a hotkey string like \"mod+.\" into a matcher predicate. */\nexport function matchHotkey(spec: string, e: KeyboardEvent): boolean {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return false;\n\n const key = parts[parts.length - 1];\n const mods = new Set(parts.slice(0, -1));\n\n const mac = isMac();\n\n const wantMeta = mods.has(\"meta\") || mods.has(\"cmd\") || (mods.has(\"mod\") && mac);\n const wantCtrl = mods.has(\"ctrl\") || mods.has(\"control\") || (mods.has(\"mod\") && !mac);\n const wantShift = mods.has(\"shift\");\n const wantAlt = mods.has(\"alt\") || mods.has(\"option\");\n\n if (e.metaKey !== wantMeta) return false;\n if (e.ctrlKey !== wantCtrl) return false;\n if (e.shiftKey !== wantShift) return false;\n if (e.altKey !== wantAlt) return false;\n\n if (e.key.toLowerCase() === key) return true;\n\n // With \\u2325 held, macOS hands the browser the composed character \\u2014 \\u2325\\u21e7D\n // arrives as \"\\u00ce\", not \"d\" \\u2014 so an Alt combo has to be matched by physical\n // key instead. Only when Alt is wanted: `code` ignores the layout, and\n // matching it everywhere would fire \\u2318+a for \\u2318+q on AZERTY.\n return wantAlt && e.code === codeFor(key);\n}\n\n/**\n * The shortcut the dock listens for when `hotkey` is left unset: ⌥⇧D on Mac,\n * Alt+Shift+D elsewhere.\n *\n * Deliberately off the beaten path. ⌘/Ctrl combos are the contested space —\n * ⌘K is Firefox's search bar and most apps' own palette, ⌘⇧I is devtools,\n * ⌘. is \"cancel\" in some Mac apps — while Alt+Shift+letter is claimed by\n * neither the browser chrome nor the OS, and an app's own bindings rarely\n * reach for it.\n */\nexport const DEFAULT_HOTKEY = \"alt+shift+d\";\n\nconst MAC_SYMBOL: Record<string, string> = {\n meta: \"⌘\",\n cmd: \"⌘\",\n ctrl: \"⌃\",\n control: \"⌃\",\n shift: \"⇧\",\n alt: \"⌥\",\n option: \"⌥\",\n};\n\nconst PC_NAME: Record<string, string> = {\n meta: \"Win\",\n cmd: \"Win\",\n ctrl: \"Ctrl\",\n control: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n option: \"Alt\",\n};\n\n/**\n * Human-readable form of a hotkey spec — \"⌥⇧D\" on Mac, \"Alt+Shift+D\"\n * elsewhere.\n */\nexport function formatHotkey(spec: string): string {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n const mac = isMac();\n\n const label = key.length === 1 ? key.toUpperCase() : key;\n const shown = mods.map((m) =>\n mac\n ? (MAC_SYMBOL[m] ?? (m === \"mod\" ? \"⌘\" : m))\n : (PC_NAME[m] ?? (m === \"mod\" ? \"Ctrl\" : m)),\n );\n\n // Mac stacks the glyphs (⌘⇧K); everywhere else they're joined with \"+\".\n return mac ? [...shown, label].join(\"\") : [...shown, label].join(\"+\");\n}\n","import type { DevDockClassNames } from \"./types\";\n\n/** One styleable piece of the dock. See {@link DevDockClassNames}. */\nexport type DockPart = keyof DevDockClassNames;\n\n/**\n * The class every part carries, whatever you pass in `classNames`. Stable\n * API: target `.devdock-row` from your own stylesheet if you'd rather not\n * thread class names through the options.\n *\n * `rowActive` has no class of its own — the highlighted row is marked with\n * `data-active`, so a base rule can reach it without one.\n */\nexport const partClass: Record<DockPart, string> = {\n root: \"devdock-root\",\n button: \"devdock-button\",\n dot: \"devdock-dot\",\n buttonLabel: \"devdock-button-label\",\n panel: \"devdock-panel\",\n title: \"devdock-title\",\n hotkeyHint: \"devdock-hotkey-hint\",\n inputWrap: \"devdock-input-wrap\",\n input: \"devdock-input\",\n body: \"devdock-body\",\n list: \"devdock-list\",\n section: \"devdock-section\",\n group: \"devdock-group\",\n row: \"devdock-row\",\n rowActive: \"\",\n rowLabel: \"devdock-row-label\",\n rowPath: \"devdock-row-path\",\n check: \"devdock-check\",\n empty: \"devdock-empty\",\n viewLabel: \"devdock-view-label\",\n view: \"devdock-view\",\n};\n\n/** Marks the dock's own stylesheet, so the style-inheriting code can skip it. */\nexport const STYLE_MARKER = \"data-devdock-styles\";\n\nconst FONT =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\n\n/**\n * The dock's own styles.\n *\n * Two things make `classNames` work without `!important`:\n *\n * 1. **A cascade layer** (see {@link dockStyles}). Layered rules lose to\n * unlayered ones whatever their specificity, and Tailwind v4 puts its\n * utilities in `@layer utilities` — so the sheet declares a layer order\n * that sits the dock's layer after Tailwind's `base` (its reset can't strip\n * the dock's chrome) and before `utilities` (your classes land).\n * 2. **Exactly one class per rule** — one bare `.devdock-*`, with any state\n * selector tucked inside `:where()`, which contributes nothing. That is\n * what settles ties against unlayered CSS, which is the whole cascade when\n * the layer is turned off (`cssLayer: false`): a page-level reset\n * (`button { … }`, `*`) is worth less and loses, a class you pass is worth\n * the same and wins on order, because this sheet goes in first.\n *\n * Colours, sizes and the font come from `--devdock-*` custom properties, each\n * written as a `var(…, default)` fallback rather than declared anywhere. That\n * is the point: a property the page sets — on `:root`, or on the\n * `[data-devdock]` host for one dock — inherits *through* the shadow boundary\n * and is used, while a default of ours declared inside the shadow tree would\n * have beaten it. It also means retheming needs none of the machinery above:\n * no inherited stylesheet, no layer, no change to the isolation.\n *\n * What stays inline, and so can't be overridden by either: the corner\n * placement, the z-index, and the popup's anchoring — all of them computed\n * from `position`/`zIndex` rather than themed.\n */\nexport const BASE_CSS = `\n.devdock-root { font-family: var(--devdock-font, ${FONT}); }\n\n.devdock-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.6px;\n color: var(--devdock-button-fg, #fff);\n background: var(--devdock-button-bg, #111317);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: 999px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);\n cursor: pointer;\n}\n.devdock-button:where([aria-expanded=\"true\"]) {\n background: var(--devdock-accent, #2563eb);\n}\n\n.devdock-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--devdock-success, #22c55e);\n display: inline-block;\n}\n\n.devdock-panel {\n width: var(--devdock-width, 280px);\n max-height: var(--devdock-max-height, 70vh);\n display: flex;\n flex-direction: column;\n background: var(--devdock-bg, #16181d);\n color: var(--devdock-fg, #e7e9ee);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius, 12px);\n box-shadow: var(--devdock-shadow, 0 12px 40px rgba(0, 0, 0, 0.45));\n overflow: hidden;\n}\n\n.devdock-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--devdock-border, #2a2e37);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-hotkey-hint {\n flex-shrink: 0;\n padding: 1px 5px;\n font-family: inherit;\n font-size: 10px;\n font-weight: 600;\n /* The heading's tracking and casing are for words, not for a key cap. */\n letter-spacing: 0;\n text-transform: none;\n color: var(--devdock-subtle, #6b7280);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-xs, 4px);\n}\n\n.devdock-input-wrap { padding: 8px; }\n\n.devdock-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: var(--devdock-input-bg, #0f1115);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-sm, 8px);\n outline: none;\n}\n\n.devdock-body {\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.devdock-list { padding: 0 6px 8px; }\n\n.devdock-section { margin-top: 6px; }\n\n.devdock-group {\n padding: 6px 8px 2px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.6px;\n text-transform: uppercase;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n text-align: left;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: transparent;\n border: none;\n border-radius: var(--devdock-radius-sm, 8px);\n cursor: pointer;\n}\n.devdock-row:where([data-active]) {\n background: var(--devdock-accent, #2563eb);\n color: var(--devdock-accent-fg, #e7e9ee);\n}\n\n.devdock-row-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.devdock-row-path {\n font-size: 11px;\n color: var(--devdock-subtle, #6b7280);\n font-family: ui-monospace, SFMono-Regular, monospace;\n flex-shrink: 0;\n}\n:where(.devdock-row[data-active]) .devdock-row-path {\n /* Whatever colour the row ended up with, stepped back: currentColor in the\n color property means the inherited one, so this tracks the row however it\n was set - a token, a class of yours - instead of guessing at the accent. */\n color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.devdock-check {\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n color: var(--devdock-success, #22c55e);\n}\n\n.devdock-empty {\n padding: 12px;\n font-size: 13px;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-view-label {\n padding: 4px 8px 0;\n font-size: 11px;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-view { padding: 2px 8px 6px; }\n`;\n\n/** The layer the dock's styles go in when `cssLayer` is left alone. */\nexport const DEFAULT_LAYER = \"devdock\";\n\n/**\n * The sheet text: {@link BASE_CSS}, in a cascade layer unless `layer` is\n * `false`.\n *\n * For the default layer the statement names Tailwind's four layers around\n * ours, which both fixes the relative order and is inert for a page that has\n * none of them — layer names are declared here, in a sheet that always goes in\n * first, so this is the order that stands. A layer *you* name gets no such\n * statement: put it where you want it in your own `@layer` line.\n */\nexport function dockStyles(layer: string | false): string {\n if (!layer) return BASE_CSS;\n const block = `@layer ${layer} {${BASE_CSS}}\\n`;\n // A layer you named is a layer you're placing yourself — ordering it from\n // in here, against names we'd be guessing at, is how the dock would end up\n // under your reset. Only the default layer gets an opinion.\n if (layer !== DEFAULT_LAYER) return block;\n const order = `@layer theme, base, components, ${layer}, utilities;`;\n return `${order}\\n${block}`;\n}\n","import { cn } from \"cn\";\nimport { DEFAULT_HOTKEY, formatHotkey, matchHotkey } from \"./hotkey\";\nimport {\n DEFAULT_LAYER,\n STYLE_MARKER,\n dockStyles,\n partClass,\n type DockPart,\n} from \"./theme\";\nimport type {\n DevCommand,\n DevDockInstance,\n DevDockOptions,\n DevRoute,\n DevView,\n DockPosition,\n} from \"./types\";\n\n/**\n * Vite's own build-time flag. The Vite family (Vite, SvelteKit, React Router\n * 7, Astro…) statically replaces the full `import.meta.env.DEV` token with a\n * literal, so this collapses to a constant there. Anywhere else the read\n * throws — `import.meta.env` is undefined in plain Node and in our CJS build,\n * where esbuild rewrites `import.meta` to `{}` — and we report \"no opinion\"\n * so the caller can fall back to `NODE_ENV`.\n */\nconst viteDevFlag = (): boolean | undefined => {\n try {\n if (typeof import.meta.env.DEV === \"boolean\") return import.meta.env.DEV;\n } catch {\n // Not a Vite-built bundle.\n }\n return undefined;\n};\n\nconst isDevBuild = (): boolean => {\n // Vite knows better than NODE_ENV: `vite build` leaves NODE_ENV unreplaced\n // in some setups, and its dev server is a dev build regardless of NODE_ENV.\n const vite = viteDevFlag();\n if (vite !== undefined) return vite;\n // Bundlers (webpack, Next, esbuild…) statically replace the full\n // `process.env.NODE_ENV` token, even in browser builds where `process`\n // itself is undefined. Reading it directly lets that replacement work;\n // the try/catch covers runtimes where it's left as a real (missing) global.\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n};\n\n/** Loopback IPv4 (127/8) and the private LAN ranges 10/8, 172.16/12, 192.168/16. */\nconst isLocalIPv4 = (host: string): boolean => {\n const parts = /^(\\d{1,3})\\.(\\d{1,3})\\.\\d{1,3}\\.\\d{1,3}$/.exec(host);\n if (!parts) return false;\n const a = Number(parts[1]);\n const b = Number(parts[2]);\n return (\n a === 127 ||\n a === 10 ||\n (a === 192 && b === 168) ||\n (a === 172 && b >= 16 && b <= 31)\n );\n};\n\n/**\n * Whether the page is served from a developer's own machine. The build check\n * alone can't tell: a development build deployed somewhere real (a preview\n * URL, a staging box) still reports itself as a dev build.\n *\n * Dev hosts are loopback, mDNS `.local` names, and private LAN addresses — so\n * hitting the dev server from a phone on the same Wi-Fi still counts. Any\n * other hostname is treated as a deployed site.\n */\nconst isDevHost = (): boolean => {\n if (typeof location === \"undefined\") return true;\n // IPv6 literals arrive bracketed, e.g. \"[::1]\".\n const host = location.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n // No hostname at all (file://, about:blank…) is not a deployed site.\n if (!host) return true;\n return (\n host === \"localhost\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".local\") ||\n host === \"::1\" ||\n host === \"0.0.0.0\" ||\n isLocalIPv4(host)\n );\n};\n\n/**\n * A row in the list, resolved for this render. `label` and `checked` are\n * snapshots of whatever the caller's functions returned just now, while `sig`\n * is deliberately stable across those values — see {@link itemSig}.\n */\ntype Item = {\n key: string;\n label: string;\n group: string;\n /** Identity of the row's *shape*, not its live values. */\n sig: string;\n} & (\n | { kind: \"route\"; route: DevRoute }\n | { kind: \"command\"; checked: boolean | null; command: DevCommand }\n);\n\ntype Styles = Partial<CSSStyleDeclaration>;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: Partial<HTMLElementTagNameMap[K]>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props) Object.assign(node, props);\n return node;\n}\n\n/** Every part `classNames` can address, in a fixed order. */\nconst PARTS = Object.keys(partClass) as DockPart[];\n\ntype Edge = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/**\n * Split a position into the edges it hugs. A corner hugs two; a bare edge hugs\n * one and is centered along it.\n */\nfunction edgesOf(position: DockPosition): Edge[] {\n return position.split(\"-\") as Edge[];\n}\n\nconst CENTER_ALONG: Record<Edge, Styles> = {\n top: { left: \"50%\", transform: \"translateX(-50%)\" },\n bottom: { left: \"50%\", transform: \"translateX(-50%)\" },\n left: { top: \"50%\", transform: \"translateY(-50%)\" },\n right: { top: \"50%\", transform: \"translateY(-50%)\" },\n};\n\nconst CLEAR: Styles = { top: \"\", bottom: \"\", left: \"\", right: \"\", transform: \"\" };\n\nfunction cornerStyle(position: DockPosition): Styles {\n const gap = \"16px\";\n const edges = edgesOf(position);\n const styles: Styles = { ...CLEAR };\n for (const edge of edges) styles[edge] = gap;\n if (edges.length === 1) Object.assign(styles, CENTER_ALONG[edges[0]!]);\n return styles;\n}\n\nfunction panelAnchor(position: DockPosition): Styles {\n const edges = edgesOf(position);\n // Start from a clean slate so moving between positions leaves nothing stale.\n const styles: Styles = { ...CLEAR, position: \"absolute\" };\n if (edges.length === 2) {\n // Corner: open away from the vertical edge, aligned to the horizontal one.\n const [vertical, horizontal] = edges as [\"top\" | \"bottom\", \"left\" | \"right\"];\n styles[vertical] = \"calc(100% + 8px)\";\n styles[horizontal] = \"0\";\n return styles;\n }\n // Edge: open inward, centered on the button.\n const edge = edges[0]!;\n styles[edge] = \"calc(100% + 8px)\";\n Object.assign(styles, CENTER_ALONG[edge]);\n return styles;\n}\n\n/**\n * Pair each view with the key it is reconciled by: its `id`, or its index.\n * Duplicate ids are a caller mistake, but a silent one — two views sharing a\n * key would share a host element, so the collision is broken here instead.\n *\n * Generic over the view shape because the adapters have their own (React's\n * takes `render` in place of `mount`) and have to key their side of a view —\n * a portal, say — exactly the way the core keys its host. Not public API.\n *\n * @internal\n */\nexport function keyViews<T extends { id?: string }>(\n views: readonly T[],\n): { view: T; key: string }[] {\n const used = new Set<string>();\n return views.map((view, i) => {\n let key = view.id ?? `#${i}`;\n while (used.has(key)) key = `${key}#${i}`;\n used.add(key);\n return { view, key };\n });\n}\n\n/**\n * Create a framework-agnostic dev dock: a floating button that opens a popup\n * to jump between routes and run commands. Returns a handle to update its\n * options or tear it down. No-ops on the server (when there is no `document`).\n */\nexport function createDevDock(initial: DevDockOptions = {}): DevDockInstance {\n if (typeof document === \"undefined\") {\n return { update() {}, destroy() {} };\n }\n\n let opts: DevDockOptions = { ...initial };\n /**\n * A part's classes: the `devdock-*` one it always carries, then whatever\n * the caller passed for it. Read from `opts` at paint time, so `update()`\n * can change a class without rebuilding anything.\n *\n * `cn` rather than a plain join, because the merge is between Tailwind\n * classes and the last one has to win: `rowActive: \"text-emerald-900\"` over\n * `row: \"text-slate-700\"` is a conflict the class attribute can't settle on\n * its own — the stylesheet's order decides, and that isn't ours.\n */\n const cls = (...parts: DockPart[]): string =>\n cn(parts.map((part) => [partClass[part], opts.classNames?.[part]]));\n /**\n * Identity of the caller's classes, folded into the signatures that decide\n * whether the per-render DOM (rows, sections, view wrappers) is reusable.\n */\n const classSig = (): string =>\n PARTS.map((p) => cn(opts.classNames?.[p])).join(\"\\u0000\");\n\n let open = false;\n let query = \"\";\n let active = 0;\n let mounted = false;\n\n // Light-DOM host that gets appended to the page. When shadow DOM is used,\n // the actual UI lives inside its shadow root — fully isolated from the host\n // page's CSS. `data-devdock` stays on the host so it's discoverable.\n const host = el(\"div\");\n host.setAttribute(\"data-devdock\", \"\");\n // Classes are defined by a stylesheet of the caller's, which an isolated\n // shadow root would keep out — so passing `classNames` flips the default to\n // `\"inherit\"`. An explicit `shadow` still wins.\n const shadowMode = initial.shadow ?? (initial.classNames ? \"inherit\" : true);\n const useShadow =\n shadowMode !== false && typeof host.attachShadow === \"function\";\n const shadowRoot = useShadow ? host.attachShadow({ mode: \"open\" }) : null;\n const mountPoint: Node = shadowRoot ?? host;\n\n // The dock's own styles. They go in *first* — ahead of the inherited clones\n // below, at the top of `<head>` in light-DOM mode — because that is what\n // fixes the cascade layer order, and what settles a specificity tie in the\n // caller's favour. See `dockStyles`.\n const baseStyle = el(\"style\", {\n textContent: dockStyles(initial.cssLayer ?? DEFAULT_LAYER),\n });\n baseStyle.setAttribute(STYLE_MARKER, \"\");\n if (shadowRoot) mountPoint.appendChild(baseStyle);\n\n // `shadow: \"inherit\"` keeps the isolation boundary but copies the page's\n // styles across it, so a view can render the host app's own components.\n // The clones live in one wrapper so re-syncing is a single replaceChildren;\n // `display: contents` keeps it out of the layout.\n const styleSlot = shadowRoot && shadowMode === \"inherit\" ? el(\"div\") : null;\n if (styleSlot) {\n styleSlot.style.display = \"contents\";\n mountPoint.appendChild(styleSlot);\n }\n\n const root = el(\"div\");\n mountPoint.appendChild(root);\n\n const panel = el(\"div\");\n panel.setAttribute(\"role\", \"dialog\");\n\n // The heading is a row: the title, and the shortcut as a key cap. A tooltip\n // on the button only pays off for someone hovering a button they were about\n // to click, so the hint goes where it is read instead.\n const heading = el(\"div\");\n const headingText = el(\"span\");\n const hotkeyHint = el(\"kbd\");\n heading.append(headingText, hotkeyHint);\n\n const inputWrap = el(\"div\");\n const input = el(\"input\");\n input.placeholder = \"Filter…\";\n inputWrap.appendChild(input);\n\n const list = el(\"div\");\n list.setAttribute(\"data-devdock-list\", \"\");\n\n const viewsBefore = el(\"div\");\n viewsBefore.setAttribute(\"data-devdock-views\", \"before\");\n const viewsAfter = el(\"div\");\n viewsAfter.setAttribute(\"data-devdock-views\", \"after\");\n\n // One scroller around the views and the list, so a tall view can't push the\n // panel past its max height.\n const body = el(\"div\");\n body.append(viewsBefore, list, viewsAfter);\n\n panel.append(heading, inputWrap, body);\n\n const button = el(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", \"Toggle dev menu\");\n const dot = el(\"span\");\n const buttonLabel = el(\"span\");\n button.append(dot, buttonLabel);\n\n root.appendChild(button);\n\n /** The small uppercase heading above a group of rows, or above a view. */\n const sectionHeading = (text: string) =>\n el(\"div\", { className: cls(\"group\"), textContent: text });\n\n /** A view's own label, when several views share one `group` heading. */\n const viewLabel = (text: string) =>\n el(\"div\", { className: cls(\"viewLabel\"), textContent: text });\n\n /** Classes for the parts that live as long as the dock does. */\n const paintClasses = () => {\n root.className = cls(\"root\");\n button.className = cls(\"button\");\n dot.className = cls(\"dot\");\n buttonLabel.className = cls(\"buttonLabel\");\n panel.className = cls(\"panel\");\n heading.className = cls(\"title\");\n hotkeyHint.className = cls(\"hotkeyHint\");\n inputWrap.className = cls(\"inputWrap\");\n input.className = cls(\"input\");\n body.className = cls(\"body\");\n list.className = cls(\"list\");\n };\n\n // ---- behavior ---------------------------------------------------------\n\n /**\n * The toggle shortcut. Unset means the default; `null` (or an empty string)\n * means the dock claims no key at all.\n */\n const hotkey = (): string | null =>\n opts.hotkey === undefined ? DEFAULT_HOTKEY : opts.hotkey;\n\n const enabled = (): boolean => {\n const e = opts.enabled;\n if (typeof e === \"function\") return e();\n if (e != null) return e;\n // Default gate: a dev build, served from a dev machine. `devHostOnly:\n // false` keeps the build check but allows any hostname.\n return isDevBuild() && (opts.devHostOnly === false || isDevHost());\n };\n\n const navigate = (path: string) => {\n if (opts.onNavigate) opts.onNavigate(path);\n else if (typeof window !== \"undefined\") window.location.assign(path);\n };\n\n const buildItems = (): Item[] => {\n const out: Item[] = [];\n (opts.routes ?? []).forEach((r, i) => {\n const key = `route:${r.path}:${i}`;\n const label = r.label ?? r.path;\n out.push({\n kind: \"route\",\n key,\n label,\n group: r.group ?? \"Routes\",\n sig: [key, r.group ?? \"Routes\", label, r.path].join(\"\\u0000\"),\n route: r,\n });\n });\n (opts.commands ?? []).forEach((c, i) => {\n // A function label is read fresh here, on every render of the open\n // panel. The row's signature uses a placeholder in its place so the new\n // text lands on the existing node instead of rebuilding the list — see\n // `renderList`. The same goes for `checked`: its presence is part of the\n // shape, its value isn't.\n const live = typeof c.label === \"function\";\n const label = typeof c.label === \"function\" ? c.label() : c.label;\n const checked = c.checked ? c.checked() === true : null;\n const key = `cmd:${c.id ?? (live ? \"\" : label)}:${i}`;\n const group = c.group ?? \"Commands\";\n out.push({\n kind: \"command\",\n key,\n label,\n group,\n sig: [\n key,\n group,\n live ? \"\\u0000live\" : label,\n checked === null ? \"\" : \"\\u0000checkable\",\n ].join(\"\\u0000\"),\n checked,\n command: c,\n });\n });\n return out;\n };\n\n const getFiltered = (): Item[] => {\n const q = query.trim().toLowerCase();\n const items = buildItems();\n if (!q) return items;\n return items.filter(\n (it) =>\n it.label.toLowerCase().includes(q) ||\n (it.kind === \"route\" && it.route.path.toLowerCase().includes(q)),\n );\n };\n\n const runItem = async (it: Item) => {\n if (it.kind === \"route\") {\n navigate(it.route.path);\n setOpen(false);\n return;\n }\n try {\n await it.command.run();\n } finally {\n if (!it.command.keepOpen) setOpen(false);\n }\n };\n\n type Row = {\n item: Item;\n node: HTMLButtonElement;\n labelSpan: HTMLSpanElement;\n pathSpan: HTMLSpanElement | null;\n checkSpan: HTMLSpanElement | null;\n };\n\n // The rendered rows, parallel to the current filtered list. They are kept\n // around so hovering or arrowing only repaints the highlight: rebuilding the\n // rows would destroy the node under the pointer, and the browser then never\n // dispatches a `click` on it (mousedown/mouseup retarget to the parent).\n let rows: Row[] = [];\n // Signature of the item list the rows were built from; identical signature\n // means the existing nodes can be reused as-is.\n let rowsSig: string | null = null;\n\n // Identity of a row's *shape*. Values that can change between renders\n // without changing the shape — a function `label`'s text, a `checked`\n // state — are excluded on purpose: those are written onto the existing node\n // by `paintRow`, because rebuilding the row would destroy the node under\n // the pointer and swallow the click.\n const itemSig = (it: Item): string => it.sig;\n\n /** Write a row's live values (dynamic label, check mark) onto its node. */\n const paintRow = (row: Row) => {\n const it = row.item;\n if (row.labelSpan.textContent !== it.label)\n row.labelSpan.textContent = it.label;\n if (row.checkSpan && it.kind === \"command\") {\n const on = it.checked === true;\n row.checkSpan.textContent = on ? \"\\u2713\" : \"\";\n row.node.setAttribute(\"aria-checked\", String(on));\n }\n };\n\n // The highlight is an attribute, not an inline colour: that keeps it in the\n // stylesheet, where `classNames.rowActive` (or a rule of your own on\n // `.devdock-row[data-active]`) can take it over.\n const paintActive = () => {\n rows.forEach((row, idx) => {\n const isActive = idx === active;\n if (isActive) row.node.setAttribute(\"data-active\", \"\");\n else row.node.removeAttribute(\"data-active\");\n row.node.className = isActive ? cls(\"row\", \"rowActive\") : cls(\"row\");\n });\n };\n\n const setActive = (next: number, scroll = false) => {\n if (next === active || next < 0 || next >= rows.length) return;\n active = next;\n paintActive();\n // `scrollIntoView` is absent in jsdom, hence the optional call.\n if (scroll) rows[active]?.node.scrollIntoView?.({ block: \"nearest\" });\n };\n\n const renderList = () => {\n const filtered = getFiltered();\n active = Math.min(active, Math.max(0, filtered.length - 1));\n\n const sig = [classSig(), ...filtered.map(itemSig)].join(\"\\n\");\n if (sig === rowsSig) {\n // Same items in the same order: keep the nodes, refresh the highlight.\n // The items themselves are rebuilt on every call, so re-point each row\n // at its current one (its `run`/`route` may have been swapped by\n // `update()`).\n filtered.forEach((it, idx) => {\n const row = rows[idx];\n if (!row) return;\n row.item = it;\n paintRow(row);\n });\n paintActive();\n return;\n }\n rowsSig = sig;\n rows = [];\n list.replaceChildren();\n\n if (filtered.length === 0) {\n list.appendChild(\n el(\"div\", { className: cls(\"empty\"), textContent: \"Nothing here.\" }),\n );\n return;\n }\n\n const groups = new Map<string, Item[]>();\n for (const it of filtered) {\n const arr = groups.get(it.group) ?? [];\n arr.push(it);\n groups.set(it.group, arr);\n }\n\n for (const [groupName, groupItems] of groups) {\n const section = el(\"div\", { className: cls(\"section\") });\n section.appendChild(sectionHeading(groupName));\n\n for (const it of groupItems) {\n const idx = filtered.indexOf(it);\n const row = el(\"button\", { className: cls(\"row\") });\n row.type = \"button\";\n\n const labelSpan = el(\"span\", { className: cls(\"rowLabel\") });\n row.appendChild(labelSpan);\n\n let pathSpan: HTMLSpanElement | null = null;\n if (it.kind === \"route\" && it.route.path !== it.label) {\n pathSpan = el(\"span\", {\n className: cls(\"rowPath\"),\n textContent: it.route.path,\n });\n row.appendChild(pathSpan);\n }\n\n // A command with `checked` is a toggle, not a one-shot action: say so\n // to assistive tech, and keep the mark's box reserved either way so\n // the label doesn't shift when it flips.\n let checkSpan: HTMLSpanElement | null = null;\n if (it.kind === \"command\" && it.checked !== null) {\n row.setAttribute(\"role\", \"checkbox\");\n checkSpan = el(\"span\", { className: cls(\"check\") });\n row.appendChild(checkSpan);\n }\n\n const rec: Row = { item: it, node: row, labelSpan, pathSpan, checkSpan };\n rows[idx] = rec;\n paintRow(rec);\n\n row.addEventListener(\"mouseenter\", () => setActive(idx));\n row.addEventListener(\"click\", () => void runItem(rec.item));\n section.appendChild(row);\n }\n list.appendChild(section);\n }\n\n paintActive();\n };\n\n // ---- views -------------------------------------------------------------\n\n type MountedView = { host: HTMLElement; teardown?: () => void };\n\n // Views live only while the panel is open: `setOpen(true)` mounts them and\n // `setOpen(false)` runs their teardowns, which is what makes a rAF loop or\n // an event listener inside a view correct rather than a leak.\n const mountedViews = new Map<string, MountedView>();\n // Shape of the view list the current DOM was built from — keys, placement\n // and headings, but nothing a view renders itself. An `update()` that\n // leaves this unchanged is a no-op, so a view is never remounted (or even\n // reparented) just because the options object is new.\n let viewsSig: string | null = null;\n\n type KeyedView = { view: DevView; key: string };\n\n const viewOrder = (v: DevView): \"before\" | \"after\" =>\n v.order === \"after\" ? \"after\" : \"before\";\n\n const unmountViews = () => {\n for (const mv of mountedViews.values()) {\n mv.teardown?.();\n mv.host.remove();\n }\n mountedViews.clear();\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n viewsSig = null;\n };\n\n const renderViews = () => {\n const keyed = keyViews(opts.views ?? []);\n const sig = [\n classSig(),\n ...keyed.map(({ view, key }) =>\n [key, viewOrder(view), view.group ?? \"\", view.label ?? \"\"].join(\n \"\\u0000\",\n ),\n ),\n ].join(\"\\n\");\n if (sig === viewsSig) return;\n viewsSig = sig;\n\n const live = new Set(keyed.map(({ key }) => key));\n for (const [key, mv] of mountedViews) {\n if (live.has(key)) continue;\n mv.teardown?.();\n mv.host.remove();\n mountedViews.delete(key);\n }\n\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n\n // Hosts are appended first and mounted afterwards, so `mount` is handed a\n // host that is already connected to the document.\n const pending: (KeyedView & { host: HTMLElement })[] = [];\n\n for (const placement of [\"before\", \"after\"] as const) {\n const container = placement === \"before\" ? viewsBefore : viewsAfter;\n const here = keyed.filter(({ view }) => viewOrder(view) === placement);\n\n // One section per `group`, in first-appearance order; a view without a\n // group gets its own section headed by its `label`.\n const sections = new Map<\n string,\n { heading?: string; items: KeyedView[] }\n >();\n for (const entry of here) {\n const groupKey = entry.view.group ?? `\\u0000${entry.key}`;\n const section = sections.get(groupKey);\n if (section) section.items.push(entry);\n else\n sections.set(groupKey, {\n heading: entry.view.group ?? entry.view.label,\n items: [entry],\n });\n }\n\n for (const section of sections.values()) {\n const wrap = el(\"div\", { className: cls(\"section\") });\n if (section.heading) wrap.appendChild(sectionHeading(section.heading));\n for (const { view, key } of section.items) {\n if (view.group != null && view.label)\n wrap.appendChild(viewLabel(view.label));\n const existing = mountedViews.get(key);\n if (existing) {\n wrap.appendChild(existing.host);\n continue;\n }\n const viewHost = el(\"div\", { className: cls(\"view\") });\n viewHost.setAttribute(\"data-devdock-view\", view.id ?? \"\");\n wrap.appendChild(viewHost);\n pending.push({ view, key, host: viewHost });\n }\n container.appendChild(wrap);\n }\n }\n\n for (const { view, key, host: viewHost } of pending) {\n const mv: MountedView = { host: viewHost };\n mountedViews.set(key, mv);\n const teardown = view.mount(viewHost);\n if (typeof teardown === \"function\") mv.teardown = teardown;\n }\n };\n\n // ---- inherited styles --------------------------------------------------\n\n // What the current clones were made from, so an unrelated head mutation\n // doesn't re-clone every <link> (and make the browser re-fetch it).\n let clonesSig: string | null = null;\n\n /**\n * Copy the document's styles into the shadow root (`shadow: \"inherit\"`).\n * Constructed sheets come across by reference; `<style>` and\n * `<link rel=\"stylesheet\">` nodes are cloned, which re-reads the style's\n * text or re-fetches the link's href inside the shadow tree.\n */\n const syncStyles = () => {\n if (!styleSlot || !shadowRoot) return;\n\n const adopted = (\n document as Document & { adoptedStyleSheets?: readonly unknown[] }\n ).adoptedStyleSheets;\n if (Array.isArray(adopted)) {\n try {\n const sr = shadowRoot as ShadowRoot & {\n adoptedStyleSheets: unknown[];\n };\n sr.adoptedStyleSheets = [...adopted];\n } catch {\n // A sheet the document adopted but this root may not (cross-document).\n }\n }\n\n // `:not([data-devdock-styles])`: in light-DOM mode a dock puts its own\n // sheet in the document, and re-cloning it here would be noise.\n const sheets = [\n ...document.querySelectorAll(\n `style:not([${STYLE_MARKER}]), link[rel~=\"stylesheet\" i]`,\n ),\n ];\n const sig = sheets\n .map((n) => `${n.tagName}\\u0000${n.getAttribute(\"href\") ?? n.textContent}`)\n .join(\"\\n\");\n if (sig === clonesSig) return;\n clonesSig = sig;\n styleSlot.replaceChildren(...sheets.map((n) => n.cloneNode(true)));\n };\n\n // Bundlers inject and mutate <style> tags in `document.head` as you edit —\n // without watching, an HMR'd stylesheet would stop reaching the views.\n let styleObserver: MutationObserver | null = null;\n let syncQueued = false;\n const watchStyles = () => {\n if (\n !styleSlot ||\n styleObserver ||\n !document.head ||\n typeof MutationObserver === \"undefined\"\n )\n return;\n styleObserver = new MutationObserver(() => {\n if (syncQueued) return;\n syncQueued = true;\n // Coalesce a burst of injections into one re-clone.\n queueMicrotask(() => {\n syncQueued = false;\n syncStyles();\n });\n });\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n };\n const unwatchStyles = () => {\n styleObserver?.disconnect();\n styleObserver = null;\n };\n\n const renderShell = () => {\n const position = opts.position ?? \"bottom-right\";\n const zIndex = opts.zIndex ?? 2147483000;\n\n Object.assign(root.style, {\n position: \"fixed\",\n zIndex: String(zIndex),\n top: \"\",\n bottom: \"\",\n });\n Object.assign(root.style, cornerStyle(position));\n\n headingText.textContent = opts.title ?? \"Dev Menu\";\n panel.setAttribute(\"aria-label\", opts.title ?? \"Dev Menu\");\n Object.assign(panel.style, panelAnchor(position));\n\n buttonLabel.textContent = opts.label ?? \"DEV\";\n\n // An unguessable default is only as good as its hint: the heading shows\n // the chord while the panel is open, the tooltip while it is shut.\n const spec = hotkey();\n const chord = spec ? formatHotkey(spec) : \"\";\n hotkeyHint.textContent = chord;\n hotkeyHint.hidden = !chord;\n button.title = chord\n ? `${opts.title ?? \"Dev Menu\"} (${chord})`\n : (opts.title ?? \"Dev Menu\");\n // The open state is `aria-expanded`, which the stylesheet also paints —\n // see `BASE_CSS`.\n button.setAttribute(\"aria-expanded\", String(open));\n paintClasses();\n };\n\n function setOpen(next: boolean) {\n if (open === next) return;\n open = next;\n if (open) {\n query = \"\";\n input.value = \"\";\n active = 0;\n panel.isConnected || root.insertBefore(panel, button);\n renderShell();\n renderList();\n // The panel is connected, so views mount into a live document; styles\n // may have changed while it was closed.\n syncStyles();\n renderViews();\n requestAnimationFrame(() => input.focus());\n } else {\n // Teardown runs while the panel is still in the document, so a view can\n // read the DOM it is about to lose.\n unmountViews();\n if (panel.isConnected) panel.remove();\n }\n renderShell();\n }\n\n // ---- listeners --------------------------------------------------------\n\n input.addEventListener(\"input\", () => {\n query = input.value;\n active = 0;\n renderList();\n });\n\n panel.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive(Math.min(active + 1, rows.length - 1), true);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive(Math.max(active - 1, 0), true);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const it = rows[active]?.item;\n if (it) void runItem(it);\n }\n });\n\n button.addEventListener(\"click\", () => setOpen(!open));\n\n const onDocMouseDown = (e: MouseEvent) => {\n // composedPath() sees through the shadow boundary; a plain\n // `contains(e.target)` would miss clicks inside the shadow root.\n if (open && !e.composedPath().includes(root)) setOpen(false);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const spec = hotkey();\n if (spec && matchHotkey(spec, e)) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n\n const addListeners = () => {\n document.addEventListener(\"mousedown\", onDocMouseDown);\n window.addEventListener(\"keydown\", onKeyDown);\n };\n const removeListeners = () => {\n document.removeEventListener(\"mousedown\", onDocMouseDown);\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n\n const mount = () => {\n if (mounted) return;\n // Light DOM: the sheet can't ride along inside the host, so it goes at the\n // very top of <head>, ahead of the page's own styles.\n if (!shadowRoot)\n (document.head ?? document.documentElement).prepend(baseStyle);\n (opts.container ?? document.body).appendChild(host);\n addListeners();\n syncStyles();\n watchStyles();\n mounted = true;\n };\n const unmount = () => {\n if (!mounted) return;\n removeListeners();\n unwatchStyles();\n if (!shadowRoot) baseStyle.remove();\n host.remove();\n mounted = false;\n };\n\n // ---- init -------------------------------------------------------------\n\n renderShell();\n if (enabled()) mount();\n\n return {\n update(next: DevDockOptions) {\n opts = { ...opts, ...next };\n if (enabled()) {\n mount();\n renderShell();\n if (open) {\n renderList();\n renderViews();\n }\n } else {\n setOpen(false);\n unmount();\n }\n },\n destroy() {\n setOpen(false);\n unmount();\n },\n };\n}\n","import type { DevRoute } from \"./types\";\n\n/**\n * Restricts which auto-detected routes appear. A string is treated as a glob\n * where `*` matches any characters (e.g. `\"/dev/*\"`, `\"/admin/*\"`); or pass a\n * `RegExp` tested against the path, or a predicate for full control.\n */\nexport type RouteMatcher = string | RegExp | ((route: DevRoute) => boolean);\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\n/** Normalize any {@link RouteMatcher} into a predicate. */\nexport function toPredicate(match: RouteMatcher): (route: DevRoute) => boolean {\n if (typeof match === \"function\") return match;\n const re = match instanceof RegExp ? match : globToRegExp(match);\n return (route) => re.test(route.path);\n}\n\nexport function isMatcher(value: object | RouteMatcher): value is RouteMatcher {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\n/**\n * Convention shared by every adapter: `/dev` and everything under it is a dev\n * destination, so a dev section needs no extra marker.\n */\nexport function isDevPath(path: string): boolean {\n return path === \"/dev\" || path.startsWith(\"/dev/\");\n}\n\n/** Drop later routes that repeat an earlier route's path. */\nexport function dedupeByPath(routes: DevRoute[]): DevRoute[] {\n const seen = new Set<string>();\n return routes.filter((r) =>\n seen.has(r.path) ? false : (seen.add(r.path), true),\n );\n}\n","import { createDevDock } from \"../core/dock\";\nimport type { DevDockOptions, DevRoute } from \"../core/types\";\nimport {\n dedupeByPath,\n isDevPath,\n isMatcher,\n toPredicate,\n type RouteMatcher,\n} from \"../core/match\";\nimport type { DevDockAction } from \"./index\";\n\nexport type { RouteMatcher };\n\n/**\n * What `import.meta.glob(\"/src/routes/**\\/+page.svelte\")` returns — only the\n * keys matter, so an array of file paths works too.\n */\nexport type RouteModules = Record<string, unknown> | string[];\n\nexport interface DetectOptions {\n /**\n * Only keep routes that match. A glob string (`*` = any characters), a\n * `RegExp`, or a predicate.\n */\n match?: RouteMatcher;\n /**\n * Also list the app's ordinary routes, not just the ones under `/dev`.\n * Default: `false`.\n */\n staticRoutes?: boolean;\n /**\n * Your routes directory, as a name or a trailing path (`\"routes\"`,\n * `\"app/pages\"`). Detected from the `src/routes` (or `routes`) segment of\n * each key by default; set it only if your routes live somewhere else.\n */\n routesDir?: string;\n}\n\n/** Page files SvelteKit renders: `+page.svelte`, `+page.ts`, `+page@(app).svelte`… */\nconst PAGE_FILE = /^\\+page(@[^.]*)?\\.[^.]+$/;\n\nfunction stripRoutesDir(file: string, routesDir?: string): string | null {\n const path = file.replace(/\\\\/g, \"/\");\n const dirs = routesDir ? [routesDir] : [\"src/routes\", \"routes\"];\n for (const dir of dirs) {\n const needle = `/${dir.replace(/^\\/|\\/$/g, \"\")}/`;\n const at = path.lastIndexOf(needle);\n if (at !== -1) return path.slice(at + needle.length);\n if (path.startsWith(needle.slice(1))) return path.slice(needle.length - 1);\n }\n // Relative glob from inside the routes directory, e.g. \"./dev/+page.svelte\".\n return routesDir ? null : path.replace(/^\\.?\\//, \"\");\n}\n\n/**\n * Turn a SvelteKit page file path into the route it serves, or `null` if it\n * isn't a navigable page.\n *\n * Layout groups (`(app)`) and optional params (`[[lang]]`) drop out of the\n * path; required (`[id]`), matched (`[id=int]`) and rest (`[...rest]`) params\n * make the route unnavigable without arguments, so it's skipped.\n */\nexport function routeFromFile(\n file: string,\n options: Pick<DetectOptions, \"routesDir\"> = {},\n): string | null {\n const relative = stripRoutesDir(file, options.routesDir);\n if (relative == null) return null;\n const segments = relative.split(\"/\");\n const filename = segments.pop();\n if (!filename || !PAGE_FILE.test(filename)) return null;\n const kept: string[] = [];\n for (const segment of segments) {\n if (!segment || segment === \".\") continue;\n // Layout group — organizes files, not URLs.\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) continue;\n // Optional param: the route is reachable without it.\n if (segment.startsWith(\"[[\") && segment.endsWith(\"]]\")) continue;\n if (segment.includes(\"[\")) return null;\n kept.push(segment);\n }\n return `/${kept.join(\"/\")}`;\n}\n\n/**\n * Flatten a SvelteKit `import.meta.glob` of page files into navigable\n * {@link DevRoute}s.\n *\n * Only dev destinations are returned — anything under `/dev`, by convention.\n * Pass `{ staticRoutes: true }` to list every page instead, and `{ match }`\n * to scope the results. A bare matcher is accepted as shorthand.\n *\n * ```ts\n * const routes = detectRoutes(import.meta.glob(\"/src/routes/**\\/+page.svelte\"));\n * ```\n */\nexport function detectRoutes(\n modules: RouteModules,\n options: DetectOptions | RouteMatcher = {},\n): DevRoute[] {\n const opts: DetectOptions = isMatcher(options) ? { match: options } : options;\n const files = Array.isArray(modules) ? modules : Object.keys(modules);\n const paths: string[] = [];\n for (const file of files) {\n const path = routeFromFile(file, opts);\n if (path != null && (opts.staticRoutes === true || isDevPath(path)))\n paths.push(path);\n }\n const routes = dedupeByPath(\n paths.sort().map((path) => ({ path, label: path })),\n );\n return opts.match ? routes.filter(toPredicate(opts.match)) : routes;\n}\n\nexport interface SvelteKitDevDockOptions extends DevDockOptions, DetectOptions {\n /**\n * Your page files, from `import.meta.glob`. The glob has to be written in\n * your app (Vite resolves it at build time), so pass the result in:\n *\n * ```ts\n * { modules: import.meta.glob(\"/src/routes/**\\/+page.svelte\") }\n * ```\n *\n * Detected routes come first; any `routes` you pass are appended.\n */\n modules?: RouteModules;\n}\n\nfunction resolveOptions(options: SvelteKitDevDockOptions): DevDockOptions {\n const { modules, match, staticRoutes, routesDir, ...rest } = options;\n if (!modules) return rest;\n const detected = detectRoutes(modules, { match, staticRoutes, routesDir });\n return { ...rest, routes: [...detected, ...(rest.routes ?? [])] };\n}\n\n/**\n * Svelte action that mounts a dev dock with the SvelteKit routes detected\n * from `modules`:\n *\n * ```svelte\n * <script lang=\"ts\">\n * import { goto } from \"$app/navigation\";\n * import { devdock } from \"@chuvenger/devdock/sveltekit\";\n *\n * const modules = import.meta.glob(\"/src/routes/**\\/+page.svelte\");\n * </script>\n *\n * <div use:devdock={{ modules, onNavigate: goto, hotkey: \"mod+.\" }}></div>\n * ```\n *\n * Same contract as the plain `devdock` action: the dock mounts into\n * `document.body` (or `options.container`), so the host element is just an\n * anchor, and reactive options flow through `update`.\n */\nexport function devdock(\n _node: HTMLElement,\n options: SvelteKitDevDockOptions = {},\n): DevDockAction {\n const instance = createDevDock(resolveOptions(options));\n return {\n update(next: SvelteKitDevDockOptions = {}) {\n instance.update(resolveOptions(next));\n },\n destroy() {\n instance.destroy();\n },\n };\n}\n\nexport { createDevDock } from \"../core/dock\";\nexport type { DevDockAction } from \"./index\";\nexport type {\n DevDockOptions,\n DevDockInstance,\n DevRoute,\n DevCommand,\n DevView,\n DockPosition,\n} from \"../core/types\";\n"]}
|
package/dist/sveltekit.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { c as DevDockOptions, d as DevRoute } from './types-
|
|
2
|
-
export { D as DevCommand, b as DevDockInstance, e as DevView, f as DockPosition } from './types-
|
|
3
|
-
import { R as RouteMatcher } from './match-
|
|
1
|
+
import { c as DevDockOptions, d as DevRoute } from './types-D9BBBI7v.cjs';
|
|
2
|
+
export { D as DevCommand, b as DevDockInstance, e as DevView, f as DockPosition } from './types-D9BBBI7v.cjs';
|
|
3
|
+
import { R as RouteMatcher } from './match-zABwk1Ai.cjs';
|
|
4
4
|
import { DevDockAction } from './svelte.cjs';
|
|
5
|
-
export { c as createDevDock } from './dock-
|
|
5
|
+
export { c as createDevDock } from './dock-ClU_Wn2a.cjs';
|
|
6
6
|
import 'cn';
|
|
7
7
|
|
|
8
8
|
/**
|