@tanstack/devtools 0.6.7 → 0.6.8

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.
Files changed (80) hide show
  1. package/dist/chunk/CEHNENNI.js +251 -0
  2. package/dist/{esm/core.js → dev.js} +10 -12
  3. package/dist/devtools/DJF65R3Y.js +1674 -0
  4. package/dist/devtools/ITBBRMTQ.js +1966 -0
  5. package/dist/index.d.ts +168 -0
  6. package/dist/index.js +76 -0
  7. package/dist/server.js +44 -0
  8. package/package.json +21 -12
  9. package/src/core.tsx +3 -0
  10. package/dist/esm/components/content-panel.d.ts +0 -6
  11. package/dist/esm/components/content-panel.js +0 -32
  12. package/dist/esm/components/content-panel.js.map +0 -1
  13. package/dist/esm/components/main-panel.d.ts +0 -6
  14. package/dist/esm/components/main-panel.js +0 -42
  15. package/dist/esm/components/main-panel.js.map +0 -1
  16. package/dist/esm/components/tab-content.d.ts +0 -2
  17. package/dist/esm/components/tab-content.js +0 -23
  18. package/dist/esm/components/tab-content.js.map +0 -1
  19. package/dist/esm/components/tabs.d.ts +0 -5
  20. package/dist/esm/components/tabs.js +0 -75
  21. package/dist/esm/components/tabs.js.map +0 -1
  22. package/dist/esm/components/trigger.d.ts +0 -5
  23. package/dist/esm/components/trigger.js +0 -31
  24. package/dist/esm/components/trigger.js.map +0 -1
  25. package/dist/esm/constants.d.ts +0 -2
  26. package/dist/esm/constants.js +0 -7
  27. package/dist/esm/constants.js.map +0 -1
  28. package/dist/esm/context/devtools-context.d.ts +0 -62
  29. package/dist/esm/context/devtools-context.js +0 -77
  30. package/dist/esm/context/devtools-context.js.map +0 -1
  31. package/dist/esm/context/devtools-store.d.ts +0 -59
  32. package/dist/esm/context/devtools-store.js +0 -29
  33. package/dist/esm/context/devtools-store.js.map +0 -1
  34. package/dist/esm/context/draw-context.d.ts +0 -13
  35. package/dist/esm/context/draw-context.js +0 -55
  36. package/dist/esm/context/draw-context.js.map +0 -1
  37. package/dist/esm/context/pip-context.d.ts +0 -14
  38. package/dist/esm/context/pip-context.js +0 -117
  39. package/dist/esm/context/pip-context.js.map +0 -1
  40. package/dist/esm/context/use-devtools-context.d.ts +0 -40
  41. package/dist/esm/context/use-devtools-context.js +0 -96
  42. package/dist/esm/context/use-devtools-context.js.map +0 -1
  43. package/dist/esm/core.d.ts +0 -39
  44. package/dist/esm/core.js.map +0 -1
  45. package/dist/esm/devtools.d.ts +0 -1
  46. package/dist/esm/devtools.js +0 -200
  47. package/dist/esm/devtools.js.map +0 -1
  48. package/dist/esm/hooks/use-disable-tabbing.d.ts +0 -6
  49. package/dist/esm/hooks/use-disable-tabbing.js +0 -23
  50. package/dist/esm/hooks/use-disable-tabbing.js.map +0 -1
  51. package/dist/esm/hooks/use-head-changes.d.ts +0 -39
  52. package/dist/esm/hooks/use-head-changes.js +0 -65
  53. package/dist/esm/hooks/use-head-changes.js.map +0 -1
  54. package/dist/esm/index.d.ts +0 -4
  55. package/dist/esm/index.js +0 -8
  56. package/dist/esm/index.js.map +0 -1
  57. package/dist/esm/styles/tokens.d.ts +0 -298
  58. package/dist/esm/styles/tokens.js +0 -63
  59. package/dist/esm/styles/tokens.js.map +0 -1
  60. package/dist/esm/styles/use-styles.d.ts +0 -42
  61. package/dist/esm/styles/use-styles.js +0 -422
  62. package/dist/esm/styles/use-styles.js.map +0 -1
  63. package/dist/esm/tabs/index.d.ts +0 -17
  64. package/dist/esm/tabs/index.js +0 -25
  65. package/dist/esm/tabs/index.js.map +0 -1
  66. package/dist/esm/tabs/plugins-tab.d.ts +0 -1
  67. package/dist/esm/tabs/plugins-tab.js +0 -88
  68. package/dist/esm/tabs/plugins-tab.js.map +0 -1
  69. package/dist/esm/tabs/seo-tab.d.ts +0 -1
  70. package/dist/esm/tabs/seo-tab.js +0 -296
  71. package/dist/esm/tabs/seo-tab.js.map +0 -1
  72. package/dist/esm/tabs/settings-tab.d.ts +0 -1
  73. package/dist/esm/tabs/settings-tab.js +0 -308
  74. package/dist/esm/tabs/settings-tab.js.map +0 -1
  75. package/dist/esm/utils/sanitize.d.ts +0 -3
  76. package/dist/esm/utils/sanitize.js +0 -31
  77. package/dist/esm/utils/sanitize.js.map +0 -1
  78. package/dist/esm/utils/storage.d.ts +0 -5
  79. package/dist/esm/utils/storage.js +0 -19
  80. package/dist/esm/utils/storage.js.map +0 -1
@@ -0,0 +1,1966 @@
1
+ import { usePiPWindow, keyboardModifiers, getAllPermutations, TANSTACK_DEVTOOLS, DevtoolsContext, PLUGIN_TITLE_CONTAINER_ID, PLUGIN_CONTAINER_ID, uppercaseFirstLetter } from '../chunk/CEHNENNI.js';
2
+ import { delegateEvents, createComponent, Portal, template, use, setAttribute, insert, memo, effect, className, addEventListener } from 'solid-js/web';
3
+ import { createContext, createSignal, createEffect, onCleanup, Show, createMemo, For, useContext, onMount } from 'solid-js';
4
+ import { createShortcut } from '@solid-primitives/keyboard';
5
+ import { ThemeContextProvider, TanStackLogo, MainPanel as MainPanel$1, Section, SectionTitle, SectionIcon, SectionDescription, Checkbox, Select, Input, Button } from '@tanstack/devtools-ui';
6
+ import clsx3 from 'clsx';
7
+ import * as goober from 'goober';
8
+ import { PiP, X, List, PageSearch, Cogs, SettingsCog, Link, Keyboard, GeoTag, SocialBubble } from '@tanstack/devtools-ui/icons';
9
+
10
+ var useDraw = (props) => {
11
+ const [activeHover, setActiveHover] = createSignal(false);
12
+ const [forceExpand, setForceExpand] = createSignal(false);
13
+ const expanded = createMemo(() => activeHover() || forceExpand());
14
+ let hoverTimeout = null;
15
+ onCleanup(() => {
16
+ if (hoverTimeout) clearTimeout(hoverTimeout);
17
+ });
18
+ const hoverUtils = {
19
+ enter: () => {
20
+ if (hoverTimeout) {
21
+ clearTimeout(hoverTimeout);
22
+ hoverTimeout = null;
23
+ }
24
+ setActiveHover(true);
25
+ },
26
+ leave: () => {
27
+ hoverTimeout = setTimeout(() => {
28
+ setActiveHover(false);
29
+ }, props.animationMs);
30
+ }
31
+ };
32
+ return {
33
+ expanded,
34
+ setForceExpand,
35
+ hoverUtils,
36
+ animationMs: props.animationMs
37
+ };
38
+ };
39
+ var DrawContext = createContext(void 0);
40
+ var DrawClientProvider = (props) => {
41
+ const value = useDraw({
42
+ animationMs: props.animationMs
43
+ });
44
+ return createComponent(DrawContext.Provider, {
45
+ value,
46
+ get children() {
47
+ return props.children;
48
+ }
49
+ });
50
+ };
51
+ function useDrawContext() {
52
+ const context = useContext(DrawContext);
53
+ if (context === void 0) {
54
+ throw new Error(`useDrawContext must be used within a DrawClientProvider`);
55
+ }
56
+ return context;
57
+ }
58
+
59
+ // src/context/use-devtools-context.ts
60
+ var useDevtoolsContext = () => {
61
+ const context = useContext(DevtoolsContext);
62
+ if (context === void 0) {
63
+ throw new Error(
64
+ "useDevtoolsShellContext must be used within a ShellContextProvider"
65
+ );
66
+ }
67
+ return context;
68
+ };
69
+ function useTheme() {
70
+ const { settings, setSettings } = useDevtoolsSettings();
71
+ const theme = createMemo(() => settings().theme);
72
+ return {
73
+ theme,
74
+ setTheme: (theme2) => setSettings({ theme: theme2 })
75
+ };
76
+ }
77
+ var usePlugins = () => {
78
+ const { store, setStore } = useDevtoolsContext();
79
+ const { setForceExpand } = useDrawContext();
80
+ const plugins = createMemo(() => store.plugins);
81
+ const activePlugin = createMemo(() => store.state.activePlugin);
82
+ createEffect(() => {
83
+ if (activePlugin() == null) {
84
+ setForceExpand(false);
85
+ } else {
86
+ setForceExpand(true);
87
+ }
88
+ });
89
+ const setActivePlugin = (pluginId) => {
90
+ setStore((prev) => ({
91
+ ...prev,
92
+ state: {
93
+ ...prev.state,
94
+ activePlugin: pluginId
95
+ }
96
+ }));
97
+ };
98
+ return { plugins, setActivePlugin, activePlugin };
99
+ };
100
+ var useDevtoolsState = () => {
101
+ const { store, setStore } = useDevtoolsContext();
102
+ const state = createMemo(() => store.state);
103
+ const setState = (newState) => {
104
+ setStore((prev) => ({
105
+ ...prev,
106
+ state: {
107
+ ...prev.state,
108
+ ...newState
109
+ }
110
+ }));
111
+ };
112
+ return { state, setState };
113
+ };
114
+ var useDevtoolsSettings = () => {
115
+ const { store, setStore } = useDevtoolsContext();
116
+ const settings = createMemo(() => store.settings);
117
+ const setSettings = (newSettings) => {
118
+ setStore((prev) => ({
119
+ ...prev,
120
+ settings: {
121
+ ...prev.settings,
122
+ ...newSettings
123
+ }
124
+ }));
125
+ };
126
+ return { setSettings, settings };
127
+ };
128
+ var usePersistOpen = () => {
129
+ const { state, setState } = useDevtoolsState();
130
+ const persistOpen = createMemo(() => state().persistOpen);
131
+ const setPersistOpen = (value) => {
132
+ setState({ persistOpen: value });
133
+ };
134
+ return { persistOpen, setPersistOpen };
135
+ };
136
+ var useHeight = () => {
137
+ const { state, setState } = useDevtoolsState();
138
+ const height = createMemo(() => state().height);
139
+ const setHeight = (newHeight) => {
140
+ setState({ height: newHeight });
141
+ };
142
+ return { height, setHeight };
143
+ };
144
+ var recursivelyChangeTabIndex = (node, remove = true) => {
145
+ if (remove) {
146
+ node.setAttribute("tabIndex", "-1");
147
+ } else {
148
+ node.removeAttribute("tabIndex");
149
+ }
150
+ for (const child of node.children) {
151
+ recursivelyChangeTabIndex(child, remove);
152
+ }
153
+ };
154
+ var useDisableTabbing = (isOpen) => {
155
+ createEffect(() => {
156
+ const el = document.getElementById(TANSTACK_DEVTOOLS);
157
+ if (!el) return;
158
+ recursivelyChangeTabIndex(el, !isOpen());
159
+ });
160
+ };
161
+
162
+ // src/styles/tokens.ts
163
+ var tokens = {
164
+ colors: {
165
+ inherit: "inherit",
166
+ current: "currentColor",
167
+ transparent: "transparent",
168
+ black: "#000000",
169
+ white: "#ffffff",
170
+ neutral: {
171
+ 50: "#f9fafb",
172
+ 100: "#f2f4f7",
173
+ 200: "#eaecf0",
174
+ 300: "#d0d5dd",
175
+ 400: "#98a2b3",
176
+ 500: "#667085",
177
+ 600: "#475467",
178
+ 700: "#344054",
179
+ 800: "#1d2939",
180
+ 900: "#101828"
181
+ },
182
+ darkGray: {
183
+ 50: "#525c7a",
184
+ 100: "#49536e",
185
+ 200: "#414962",
186
+ 300: "#394056",
187
+ 400: "#313749",
188
+ 500: "#292e3d",
189
+ 600: "#212530",
190
+ 700: "#191c24",
191
+ 800: "#111318",
192
+ 900: "#0b0d10"
193
+ },
194
+ gray: {
195
+ 50: "#f9fafb",
196
+ 100: "#f2f4f7",
197
+ 200: "#eaecf0",
198
+ 300: "#d0d5dd",
199
+ 400: "#98a2b3",
200
+ 500: "#667085",
201
+ 600: "#475467",
202
+ 700: "#344054",
203
+ 800: "#1d2939",
204
+ 900: "#101828"
205
+ },
206
+ blue: {
207
+ 25: "#F5FAFF",
208
+ 50: "#EFF8FF",
209
+ 100: "#D1E9FF",
210
+ 200: "#B2DDFF",
211
+ 300: "#84CAFF",
212
+ 400: "#53B1FD",
213
+ 500: "#2E90FA",
214
+ 600: "#1570EF",
215
+ 700: "#175CD3",
216
+ 800: "#1849A9",
217
+ 900: "#194185"
218
+ },
219
+ green: {
220
+ 25: "#F6FEF9",
221
+ 50: "#ECFDF3",
222
+ 100: "#D1FADF",
223
+ 200: "#A6F4C5",
224
+ 300: "#6CE9A6",
225
+ 400: "#32D583",
226
+ 500: "#12B76A",
227
+ 600: "#039855",
228
+ 700: "#027A48",
229
+ 800: "#05603A",
230
+ 900: "#054F31"
231
+ },
232
+ red: {
233
+ 50: "#fef2f2",
234
+ 100: "#fee2e2",
235
+ 200: "#fecaca",
236
+ 300: "#fca5a5",
237
+ 400: "#f87171",
238
+ 500: "#ef4444",
239
+ 600: "#dc2626",
240
+ 700: "#b91c1c",
241
+ 800: "#991b1b",
242
+ 900: "#7f1d1d",
243
+ 950: "#450a0a"
244
+ },
245
+ yellow: {
246
+ 25: "#FFFCF5",
247
+ 50: "#FFFAEB",
248
+ 100: "#FEF0C7",
249
+ 200: "#FEDF89",
250
+ 300: "#FEC84B",
251
+ 400: "#FDB022",
252
+ 500: "#F79009",
253
+ 600: "#DC6803",
254
+ 700: "#B54708",
255
+ 800: "#93370D",
256
+ 900: "#7A2E0E"
257
+ },
258
+ purple: {
259
+ 25: "#FAFAFF",
260
+ 50: "#F4F3FF",
261
+ 100: "#EBE9FE",
262
+ 200: "#D9D6FE",
263
+ 300: "#BDB4FE",
264
+ 400: "#9B8AFB",
265
+ 500: "#7A5AF8",
266
+ 600: "#6938EF",
267
+ 700: "#5925DC",
268
+ 800: "#4A1FB8",
269
+ 900: "#3E1C96"
270
+ },
271
+ teal: {
272
+ 25: "#F6FEFC",
273
+ 50: "#F0FDF9",
274
+ 100: "#CCFBEF",
275
+ 200: "#99F6E0",
276
+ 300: "#5FE9D0",
277
+ 400: "#2ED3B7",
278
+ 500: "#15B79E",
279
+ 600: "#0E9384",
280
+ 700: "#107569",
281
+ 800: "#125D56",
282
+ 900: "#134E48"
283
+ },
284
+ pink: {
285
+ 25: "#fdf2f8",
286
+ 50: "#fce7f3",
287
+ 100: "#fbcfe8",
288
+ 200: "#f9a8d4",
289
+ 300: "#f472b6",
290
+ 400: "#ec4899",
291
+ 500: "#db2777",
292
+ 600: "#be185d",
293
+ 700: "#9d174d",
294
+ 800: "#831843",
295
+ 900: "#500724"
296
+ },
297
+ cyan: {
298
+ 25: "#ecfeff",
299
+ 50: "#cffafe",
300
+ 100: "#a5f3fc",
301
+ 200: "#67e8f9",
302
+ 300: "#22d3ee",
303
+ 400: "#06b6d4",
304
+ 500: "#0891b2",
305
+ 600: "#0e7490",
306
+ 700: "#155e75",
307
+ 800: "#164e63",
308
+ 900: "#083344"
309
+ }
310
+ },
311
+ alpha: {
312
+ 100: "ff",
313
+ 90: "e5",
314
+ 80: "cc",
315
+ 70: "b3",
316
+ 60: "99",
317
+ 50: "80",
318
+ 40: "66",
319
+ 30: "4d",
320
+ 20: "33",
321
+ 10: "1a",
322
+ 0: "00"
323
+ },
324
+ font: {
325
+ size: {
326
+ "2xs": "calc(var(--tsrd-font-size) * 0.625)",
327
+ xs: "calc(var(--tsrd-font-size) * 0.75)",
328
+ sm: "calc(var(--tsrd-font-size) * 0.875)",
329
+ md: "var(--tsrd-font-size)",
330
+ lg: "calc(var(--tsrd-font-size) * 1.125)",
331
+ xl: "calc(var(--tsrd-font-size) * 1.25)",
332
+ "2xl": "calc(var(--tsrd-font-size) * 1.5)",
333
+ "3xl": "calc(var(--tsrd-font-size) * 1.875)",
334
+ "4xl": "calc(var(--tsrd-font-size) * 2.25)",
335
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
336
+ "6xl": "calc(var(--tsrd-font-size) * 3.75)",
337
+ "7xl": "calc(var(--tsrd-font-size) * 4.5)",
338
+ "8xl": "calc(var(--tsrd-font-size) * 6)",
339
+ "9xl": "calc(var(--tsrd-font-size) * 8)"
340
+ },
341
+ lineHeight: {
342
+ "3xs": "calc(var(--tsrd-font-size) * 0.75)",
343
+ "2xs": "calc(var(--tsrd-font-size) * 0.875)",
344
+ xs: "calc(var(--tsrd-font-size) * 1)",
345
+ sm: "calc(var(--tsrd-font-size) * 1.25)",
346
+ md: "calc(var(--tsrd-font-size) * 1.5)",
347
+ lg: "calc(var(--tsrd-font-size) * 1.75)",
348
+ xl: "calc(var(--tsrd-font-size) * 2)",
349
+ "2xl": "calc(var(--tsrd-font-size) * 2.25)",
350
+ "3xl": "calc(var(--tsrd-font-size) * 2.5)",
351
+ "4xl": "calc(var(--tsrd-font-size) * 2.75)",
352
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
353
+ "6xl": "calc(var(--tsrd-font-size) * 3.25)",
354
+ "7xl": "calc(var(--tsrd-font-size) * 3.5)",
355
+ "8xl": "calc(var(--tsrd-font-size) * 3.75)",
356
+ "9xl": "calc(var(--tsrd-font-size) * 4)"
357
+ },
358
+ weight: {
359
+ thin: "100",
360
+ extralight: "200",
361
+ light: "300",
362
+ normal: "400",
363
+ medium: "500",
364
+ semibold: "600",
365
+ bold: "700",
366
+ extrabold: "800",
367
+ black: "900"
368
+ },
369
+ fontFamily: {
370
+ sans: "ui-sans-serif, Inter, system-ui, sans-serif, sans-serif",
371
+ mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`
372
+ }
373
+ },
374
+ breakpoints: {
375
+ xs: "320px",
376
+ sm: "640px",
377
+ md: "768px",
378
+ lg: "1024px",
379
+ xl: "1280px",
380
+ "2xl": "1536px"
381
+ },
382
+ border: {
383
+ radius: {
384
+ none: "0px",
385
+ xs: "calc(var(--tsrd-font-size) * 0.125)",
386
+ sm: "calc(var(--tsrd-font-size) * 0.25)",
387
+ md: "calc(var(--tsrd-font-size) * 0.375)",
388
+ lg: "calc(var(--tsrd-font-size) * 0.5)",
389
+ xl: "calc(var(--tsrd-font-size) * 0.75)",
390
+ "2xl": "calc(var(--tsrd-font-size) * 1)",
391
+ "3xl": "calc(var(--tsrd-font-size) * 1.5)",
392
+ full: "9999px"
393
+ }
394
+ },
395
+ size: {
396
+ 0: "0px",
397
+ 0.25: "calc(var(--tsrd-font-size) * 0.0625)",
398
+ 0.5: "calc(var(--tsrd-font-size) * 0.125)",
399
+ 1: "calc(var(--tsrd-font-size) * 0.25)",
400
+ 1.5: "calc(var(--tsrd-font-size) * 0.375)",
401
+ 2: "calc(var(--tsrd-font-size) * 0.5)",
402
+ 2.5: "calc(var(--tsrd-font-size) * 0.625)",
403
+ 3: "calc(var(--tsrd-font-size) * 0.75)",
404
+ 3.5: "calc(var(--tsrd-font-size) * 0.875)",
405
+ 4: "calc(var(--tsrd-font-size) * 1)",
406
+ 4.5: "calc(var(--tsrd-font-size) * 1.125)",
407
+ 5: "calc(var(--tsrd-font-size) * 1.25)",
408
+ 5.5: "calc(var(--tsrd-font-size) * 1.375)",
409
+ 6: "calc(var(--tsrd-font-size) * 1.5)",
410
+ 6.5: "calc(var(--tsrd-font-size) * 1.625)",
411
+ 7: "calc(var(--tsrd-font-size) * 1.75)",
412
+ 8: "calc(var(--tsrd-font-size) * 2)",
413
+ 9: "calc(var(--tsrd-font-size) * 2.25)",
414
+ 10: "calc(var(--tsrd-font-size) * 2.5)",
415
+ 11: "calc(var(--tsrd-font-size) * 2.75)",
416
+ 12: "calc(var(--tsrd-font-size) * 3)",
417
+ 14: "calc(var(--tsrd-font-size) * 3.5)",
418
+ 16: "calc(var(--tsrd-font-size) * 4)",
419
+ 20: "calc(var(--tsrd-font-size) * 5)",
420
+ 24: "calc(var(--tsrd-font-size) * 6)",
421
+ 28: "calc(var(--tsrd-font-size) * 7)",
422
+ 32: "calc(var(--tsrd-font-size) * 8)",
423
+ 36: "calc(var(--tsrd-font-size) * 9)",
424
+ 40: "calc(var(--tsrd-font-size) * 10)",
425
+ 44: "calc(var(--tsrd-font-size) * 11)",
426
+ 48: "calc(var(--tsrd-font-size) * 12)",
427
+ 52: "calc(var(--tsrd-font-size) * 13)",
428
+ 56: "calc(var(--tsrd-font-size) * 14)",
429
+ 60: "calc(var(--tsrd-font-size) * 15)",
430
+ 64: "calc(var(--tsrd-font-size) * 16)",
431
+ 72: "calc(var(--tsrd-font-size) * 18)",
432
+ 80: "calc(var(--tsrd-font-size) * 20)",
433
+ 96: "calc(var(--tsrd-font-size) * 24)"
434
+ },
435
+ shadow: {
436
+ xs: (_ = "rgb(0 0 0 / 0.1)") => `0 1px 2px 0 rgb(0 0 0 / 0.05)`,
437
+ sm: (color = "rgb(0 0 0 / 0.1)") => `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}`,
438
+ md: (color = "rgb(0 0 0 / 0.1)") => `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}`,
439
+ lg: (color = "rgb(0 0 0 / 0.1)") => `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}`,
440
+ xl: (color = "rgb(0 0 0 / 0.1)") => `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}`,
441
+ "2xl": (color = "rgb(0 0 0 / 0.25)") => `0 25px 50px -12px ${color}`,
442
+ inner: (color = "rgb(0 0 0 / 0.05)") => `inset 0 2px 4px 0 ${color}`,
443
+ none: () => `none`
444
+ },
445
+ zIndices: {
446
+ hide: -1,
447
+ auto: "auto",
448
+ base: 0,
449
+ docked: 10,
450
+ dropdown: 1e3,
451
+ sticky: 1100,
452
+ banner: 1200,
453
+ overlay: 1300,
454
+ modal: 1400,
455
+ popover: 1500,
456
+ skipLink: 1600,
457
+ toast: 1700,
458
+ tooltip: 1800
459
+ }
460
+ };
461
+
462
+ // src/styles/use-styles.ts
463
+ var mSecondsToCssSeconds = (mSeconds) => `${(mSeconds / 1e3).toFixed(2)}s`;
464
+ var stylesFactory = (theme) => {
465
+ const { colors, font, size, border } = tokens;
466
+ const { fontFamily, size: fontSize } = font;
467
+ const css2 = goober.css;
468
+ const t = (light, dark) => theme === "light" ? light : dark;
469
+ return {
470
+ seoTabContainer: css2`
471
+ padding: 0;
472
+ margin: 0 auto;
473
+ background: ${t(colors.white, colors.darkGray[700])};
474
+ border-radius: 12px;
475
+ box-shadow: 0 2px 16px ${t("rgba(0, 0, 0, 0.04)", "rgba(0, 0, 0, 0.08)")};
476
+ overflow-y: auto;
477
+ height: 100%;
478
+ display: flex;
479
+ flex-direction: column;
480
+ gap: 0;
481
+ width: 100%;
482
+ overflow-y: auto;
483
+ `,
484
+ seoTabTitle: css2`
485
+ font-size: 1.25rem;
486
+ font-weight: 600;
487
+ color: ${t(colors.purple[500], colors.purple[400])};
488
+ margin: 0;
489
+ padding: 1rem 1.5rem 0.5rem 1.5rem;
490
+ text-align: left;
491
+ border-bottom: 1px solid ${t(colors.gray[300], colors.gray[700])};
492
+ `,
493
+ seoTabSection: css2`
494
+ padding: 1.5rem;
495
+ background: ${t(colors.gray[100], colors.gray[800])};
496
+ border: 1px solid ${t(colors.gray[300], colors.gray[700])};
497
+ display: flex;
498
+ flex-direction: column;
499
+ gap: 0.5rem;
500
+ margin-bottom: 2rem;
501
+ border-radius: 0.75rem;
502
+ `,
503
+ seoPreviewSection: css2`
504
+ display: flex;
505
+ flex-direction: row;
506
+ gap: 16px;
507
+ margin-bottom: 0;
508
+ justify-content: flex-start;
509
+ align-items: flex-start;
510
+ overflow-x: auto;
511
+ flex-wrap: wrap;
512
+ padding-bottom: 0.5rem;
513
+ `,
514
+ seoPreviewCard: css2`
515
+ border: 1px solid ${t(colors.gray[300], colors.gray[700])};
516
+ border-radius: 8px;
517
+ padding: 12px 10px;
518
+ background: ${t(colors.white, colors.darkGray[900])};
519
+ margin-bottom: 0;
520
+ box-shadow: 0 1px 4px ${t("rgba(0,0,0,0.02)", "rgba(0,0,0,0.04)")};
521
+ display: flex;
522
+ flex-direction: column;
523
+ align-items: flex-start;
524
+ min-width: 200px;
525
+ max-width: 240px;
526
+ font-size: 0.95rem;
527
+ gap: 4px;
528
+ `,
529
+ seoPreviewHeader: css2`
530
+ font-size: 1rem;
531
+ font-weight: 500;
532
+ margin-bottom: 6px;
533
+ color: ${t(colors.purple[500], colors.purple[400])};
534
+ `,
535
+ seoPreviewImage: css2`
536
+ max-width: 100%;
537
+ border-radius: 6px;
538
+ margin-bottom: 6px;
539
+ box-shadow: 0 1px 2px ${t("rgba(0,0,0,0.03)", "rgba(0,0,0,0.06)")};
540
+ height: 160px;
541
+ `,
542
+ seoPreviewTitle: css2`
543
+ font-size: 1rem;
544
+ font-weight: 600;
545
+ margin-bottom: 2px;
546
+ color: ${t(colors.gray[900], colors.gray[100])};
547
+ `,
548
+ seoPreviewDesc: css2`
549
+ color: ${t(colors.gray[700], colors.gray[300])};
550
+ margin-bottom: 2px;
551
+ font-size: 0.95rem;
552
+ `,
553
+ seoPreviewUrl: css2`
554
+ color: ${t(colors.gray[500], colors.gray[500])};
555
+ font-size: 0.9rem;
556
+ margin-bottom: 2px;
557
+ word-break: break-all;
558
+ `,
559
+ seoMissingTagsSection: css2`
560
+ margin-top: 4px;
561
+ font-size: 0.95rem;
562
+ color: ${t(colors.red[400], colors.red[400])};
563
+ `,
564
+ seoMissingTagsList: css2`
565
+ margin: 4px 0 0 0;
566
+ padding: 0;
567
+ list-style: none;
568
+ display: flex;
569
+ flex-wrap: wrap;
570
+ gap: 6px;
571
+ max-width: 240px;
572
+ `,
573
+ seoMissingTag: css2`
574
+ background: ${t(colors.red[100], colors.red[500] + "22")};
575
+ color: ${t(colors.red[700], colors.red[500])};
576
+ border-radius: 4px;
577
+ padding: 1px 6px;
578
+ font-size: 0.9rem;
579
+ font-weight: 500;
580
+ `,
581
+ seoAllTagsFound: css2`
582
+ color: ${t(colors.green[700], colors.green[500])};
583
+ font-weight: 500;
584
+ margin-left: 6px;
585
+ font-size: 0.95rem;
586
+ `,
587
+ devtoolsPanelContainer: (panelLocation, isDetached) => css2`
588
+ direction: ltr;
589
+ position: fixed;
590
+ overflow-y: hidden;
591
+ overflow-x: hidden;
592
+ ${panelLocation}: 0;
593
+ right: 0;
594
+ z-index: 99999;
595
+ width: 100%;
596
+ ${isDetached ? "" : "max-height: 90%;"}
597
+ border-top: 1px solid ${t(colors.gray[300], colors.gray[700])};
598
+ transform-origin: top;
599
+ `,
600
+ devtoolsPanelContainerVisibility: (isOpen) => {
601
+ return css2`
602
+ visibility: ${isOpen ? "visible" : "hidden"};
603
+ height: ${isOpen ? "auto" : "0"};
604
+ `;
605
+ },
606
+ devtoolsPanelContainerResizing: (isResizing) => {
607
+ if (isResizing()) {
608
+ return css2`
609
+ transition: none;
610
+ `;
611
+ }
612
+ return css2`
613
+ transition: all 0.4s ease;
614
+ `;
615
+ },
616
+ devtoolsPanelContainerAnimation: (isOpen, height) => {
617
+ if (isOpen) {
618
+ return css2`
619
+ pointer-events: auto;
620
+ transform: translateY(0);
621
+ `;
622
+ }
623
+ return css2`
624
+ pointer-events: none;
625
+ transform: translateY(${height}px);
626
+ `;
627
+ },
628
+ devtoolsPanel: css2`
629
+ display: flex;
630
+ font-size: ${fontSize.sm};
631
+ font-family: ${fontFamily.sans};
632
+ background-color: ${t(colors.white, colors.darkGray[700])};
633
+ color: ${t(colors.gray[900], colors.gray[300])};
634
+ width: w-screen;
635
+ flex-direction: row;
636
+ overflow-x: hidden;
637
+ overflow-y: hidden;
638
+ height: 100%;
639
+ `,
640
+ dragHandle: (panelLocation) => css2`
641
+ position: absolute;
642
+ left: 0;
643
+ ${panelLocation === "bottom" ? "top" : "bottom"}: 0;
644
+ width: 100%;
645
+ height: 4px;
646
+ cursor: row-resize;
647
+ user-select: none;
648
+ z-index: 100000;
649
+ &:hover {
650
+ background-color: ${t(colors.purple[700], colors.purple[400])};
651
+ }
652
+ `,
653
+ mainCloseBtn: css2`
654
+ background: transparent;
655
+ position: fixed;
656
+ z-index: 99999;
657
+ display: inline-flex;
658
+ width: fit-content;
659
+ cursor: pointer;
660
+ appearance: none;
661
+ border: 0;
662
+ align-items: center;
663
+ padding: 0;
664
+ font-size: ${font.size.xs};
665
+ cursor: pointer;
666
+ transition: all 0.25s ease-out;
667
+ &:hide-until-hover {
668
+ opacity: 0;
669
+ pointer-events: none;
670
+ visibility: hidden;
671
+ }
672
+ &:hide-until-hover:hover {
673
+ opacity: 1;
674
+ pointer-events: auto;
675
+ visibility: visible;
676
+ }
677
+ &:focus-visible {
678
+ outline-offset: 2px;
679
+ border-radius: ${border.radius.full};
680
+ outline: 2px solid ${t(colors.blue[700], colors.blue[800])};
681
+ }
682
+ `,
683
+ mainCloseBtnPosition: (position) => {
684
+ const base = css2`
685
+ ${position === "top-left" ? `top: ${size[2]}; left: ${size[2]};` : ""}
686
+ ${position === "top-right" ? `top: ${size[2]}; right: ${size[2]};` : ""}
687
+ ${position === "middle-left" ? `top: 50%; left: ${size[2]}; transform: translateY(-50%);` : ""}
688
+ ${position === "middle-right" ? `top: 50%; right: ${size[2]}; transform: translateY(-50%);` : ""}
689
+ ${position === "bottom-left" ? `bottom: ${size[2]}; left: ${size[2]};` : ""}
690
+ ${position === "bottom-right" ? `bottom: ${size[2]}; right: ${size[2]};` : ""}
691
+ `;
692
+ return base;
693
+ },
694
+ mainCloseBtnAnimation: (isOpen, hideUntilHover) => {
695
+ if (!isOpen) {
696
+ return hideUntilHover ? css2`
697
+ opacity: 0;
698
+
699
+ &:hover {
700
+ opacity: 1;
701
+ pointer-events: auto;
702
+ visibility: visible;
703
+ }
704
+ ` : css2`
705
+ opacity: 1;
706
+ pointer-events: auto;
707
+ visibility: visible;
708
+ `;
709
+ }
710
+ return css2`
711
+ opacity: 0;
712
+ pointer-events: none;
713
+ visibility: hidden;
714
+ `;
715
+ },
716
+ tabContainer: css2`
717
+ display: flex;
718
+ flex-direction: column;
719
+ align-items: center;
720
+ justify-content: flex-start;
721
+ height: 100%;
722
+ background-color: ${t(colors.gray[100], colors.darkGray[800])};
723
+ border-right: 1px solid ${t(colors.gray[300], colors.gray[700])};
724
+ box-shadow: 0 1px 0 ${t(colors.gray[200], colors.gray[700])};
725
+ position: relative;
726
+ width: ${size[10]};
727
+ `,
728
+ tab: css2`
729
+ display: flex;
730
+ align-items: center;
731
+ justify-content: center;
732
+ width: 100%;
733
+ height: ${size[10]};
734
+ cursor: pointer;
735
+ font-size: ${fontSize.sm};
736
+ font-family: ${fontFamily.sans};
737
+ color: ${t(colors.gray[700], colors.gray[300])};
738
+ background-color: transparent;
739
+ border: none;
740
+ transition: all 0.2s ease-in-out;
741
+ border-left: 2px solid transparent;
742
+ &:hover:not(.close):not(.active):not(.detach) {
743
+ background-color: ${t(colors.gray[200], colors.gray[700])};
744
+ color: ${t(colors.gray[900], colors.gray[100])};
745
+ border-left: 2px solid ${t(colors.purple[700], colors.purple[500])};
746
+ }
747
+ &.active {
748
+ background-color: ${t(colors.purple[200], colors.purple[500])};
749
+ color: ${t(colors.gray[900], colors.gray[100])};
750
+ border-left: 2px solid ${t(colors.purple[700], colors.purple[500])};
751
+ }
752
+ &.detach {
753
+ &:hover {
754
+ background-color: ${t(colors.gray[200], colors.gray[700])};
755
+ }
756
+ &:hover {
757
+ color: ${t(colors.green[700], colors.green[500])};
758
+ }
759
+ }
760
+ &.close {
761
+ margin-top: auto;
762
+ &:hover {
763
+ background-color: ${t(colors.gray[200], colors.gray[700])};
764
+ }
765
+ &:hover {
766
+ color: ${t(colors.red[700], colors.red[500])};
767
+ }
768
+ }
769
+ &.disabled {
770
+ cursor: not-allowed;
771
+ opacity: 0.2;
772
+ pointer-events: none;
773
+ }
774
+ &.disabled:hover {
775
+ background-color: transparent;
776
+ color: ${colors.gray[300]};
777
+ }
778
+ `,
779
+ tabContent: css2`
780
+ transition: all 0.2s ease-in-out;
781
+ width: 100%;
782
+ height: 100%;
783
+ `,
784
+ pluginsTabPanel: css2`
785
+ display: flex;
786
+ flex-direction: row;
787
+ width: 100%;
788
+ height: 100%;
789
+ overflow: hidden;
790
+ `,
791
+ pluginsTabDraw: (isExpanded) => css2`
792
+ width: ${isExpanded ? size[48] : 0};
793
+ height: 100%;
794
+ background-color: ${t(colors.white, colors.darkGray[800])};
795
+ box-shadow: 0 1px 0 ${colors.gray[700]};
796
+ ${isExpanded ? `border-right: 1px solid ${t(colors.gray[300], colors.gray[700])};` : ""}
797
+ `,
798
+ pluginsTabDrawExpanded: css2`
799
+ width: ${size[48]};
800
+ border-right: 1px solid ${t(colors.gray[300], colors.gray[700])};
801
+ `,
802
+ pluginsTabDrawTransition: (mSeconds) => {
803
+ return css2`
804
+ transition: width ${mSecondsToCssSeconds(mSeconds)} ease;
805
+ `;
806
+ },
807
+ pluginsTabSidebar: (isExpanded) => css2`
808
+ width: ${size[48]};
809
+ overflow-y: auto;
810
+ transform: ${isExpanded ? "translateX(0)" : "translateX(-100%)"};
811
+ `,
812
+ pluginsTabSidebarTransition: (mSeconds) => {
813
+ return css2`
814
+ transition: transform ${mSecondsToCssSeconds(mSeconds)} ease;
815
+ `;
816
+ },
817
+ pluginName: css2`
818
+ font-size: ${fontSize.xs};
819
+ font-family: ${fontFamily.sans};
820
+ color: ${t(colors.gray[700], colors.gray[300])};
821
+ padding: ${size[2]};
822
+ cursor: pointer;
823
+ text-align: center;
824
+ transition: all 0.2s ease-in-out;
825
+ &:hover {
826
+ background-color: ${t(colors.gray[200], colors.gray[700])};
827
+ color: ${t(colors.gray[900], colors.gray[100])};
828
+ padding: ${size[2]};
829
+ }
830
+ &.active {
831
+ background-color: ${t(colors.purple[200], colors.purple[500])};
832
+ color: ${t(colors.gray[900], colors.gray[100])};
833
+ }
834
+ `,
835
+ pluginsTabContent: css2`
836
+ width: 100%;
837
+ height: 100%;
838
+ overflow-y: auto;
839
+ `,
840
+ settingsGroup: css2`
841
+ display: flex;
842
+ flex-direction: column;
843
+ gap: 1rem;
844
+ `,
845
+ conditionalSetting: css2`
846
+ margin-left: 1.5rem;
847
+ padding-left: 1rem;
848
+ border-left: 2px solid ${t(colors.purple[600], colors.purple[400])};
849
+ background-color: ${t(colors.gray[100], colors.darkGray[800])};
850
+ padding: 1rem;
851
+ border-radius: 0.5rem;
852
+ margin-top: 0.5rem;
853
+ `,
854
+ settingRow: css2`
855
+ display: grid;
856
+ grid-template-columns: 1fr 1fr;
857
+ gap: 1rem;
858
+
859
+ @media (max-width: 768px) {
860
+ grid-template-columns: 1fr;
861
+ }
862
+ `,
863
+ settingsModifiers: css2`
864
+ display: flex;
865
+ gap: 0.5rem;
866
+ `
867
+ };
868
+ };
869
+ function useStyles() {
870
+ const { theme } = useTheme();
871
+ const [styles, setStyles] = createSignal(stylesFactory(theme()));
872
+ createEffect(() => {
873
+ setStyles(stylesFactory(theme()));
874
+ });
875
+ return styles;
876
+ }
877
+
878
+ // src/components/trigger.tsx
879
+ var _tmpl$ = /* @__PURE__ */ template(`<button type=button aria-label="Open TanStack Devtools">`);
880
+ var Trigger = ({
881
+ isOpen,
882
+ setIsOpen
883
+ }) => {
884
+ const {
885
+ settings
886
+ } = useDevtoolsSettings();
887
+ const styles = useStyles();
888
+ const buttonStyle = createMemo(() => {
889
+ return clsx3(styles().mainCloseBtn, styles().mainCloseBtnPosition(settings().position), styles().mainCloseBtnAnimation(isOpen(), settings().hideUntilHover));
890
+ });
891
+ return (() => {
892
+ var _el$ = _tmpl$();
893
+ _el$.$$click = () => setIsOpen(!isOpen());
894
+ insert(_el$, createComponent(TanStackLogo, {}));
895
+ effect(() => className(_el$, buttonStyle()));
896
+ return _el$;
897
+ })();
898
+ };
899
+ delegateEvents(["click"]);
900
+ var _tmpl$2 = /* @__PURE__ */ template(`<div>`);
901
+ var MainPanel = (props) => {
902
+ const styles = useStyles();
903
+ const {
904
+ height
905
+ } = useHeight();
906
+ const {
907
+ settings
908
+ } = useDevtoolsSettings();
909
+ const pip = usePiPWindow();
910
+ return (() => {
911
+ var _el$ = _tmpl$2();
912
+ setAttribute(_el$, "id", TANSTACK_DEVTOOLS);
913
+ insert(_el$, createComponent(DrawClientProvider, {
914
+ animationMs: 400,
915
+ get children() {
916
+ return props.children;
917
+ }
918
+ }));
919
+ effect((_p$) => {
920
+ var _v$ = pip().pipWindow ? "100vh" : height() + "px", _v$2 = clsx3(styles().devtoolsPanelContainer(settings().panelLocation, Boolean(pip().pipWindow)), styles().devtoolsPanelContainerAnimation(props.isOpen(), height()), styles().devtoolsPanelContainerVisibility(props.isOpen()), styles().devtoolsPanelContainerResizing(props.isResizing));
921
+ _v$ !== _p$.e && ((_p$.e = _v$) != null ? _el$.style.setProperty("height", _v$) : _el$.style.removeProperty("height"));
922
+ _v$2 !== _p$.t && className(_el$, _p$.t = _v$2);
923
+ return _p$;
924
+ }, {
925
+ e: void 0,
926
+ t: void 0
927
+ });
928
+ return _el$;
929
+ })();
930
+ };
931
+ var _tmpl$3 = /* @__PURE__ */ template(`<div>`);
932
+ var ContentPanel = (props) => {
933
+ const styles = useStyles();
934
+ const {
935
+ settings
936
+ } = useDevtoolsSettings();
937
+ return (() => {
938
+ var _el$ = _tmpl$3();
939
+ var _ref$ = props.ref;
940
+ typeof _ref$ === "function" ? use(_ref$, _el$) : props.ref = _el$;
941
+ insert(_el$, (() => {
942
+ var _c$ = memo(() => !!props.handleDragStart);
943
+ return () => _c$() ? (() => {
944
+ var _el$2 = _tmpl$3();
945
+ addEventListener(_el$2, "mousedown", props.handleDragStart, true);
946
+ effect(() => className(_el$2, styles().dragHandle(settings().panelLocation)));
947
+ return _el$2;
948
+ })() : null;
949
+ })(), null);
950
+ insert(_el$, () => props.children, null);
951
+ effect(() => className(_el$, styles().devtoolsPanel));
952
+ return _el$;
953
+ })();
954
+ };
955
+ delegateEvents(["mousedown"]);
956
+ var _tmpl$4 = /* @__PURE__ */ template(`<div>`);
957
+ var _tmpl$22 = /* @__PURE__ */ template(`<div><div></div>Final shortcut is: `);
958
+ var _tmpl$32 = /* @__PURE__ */ template(`<div><div>`);
959
+ var SettingsTab = () => {
960
+ const {
961
+ setSettings,
962
+ settings
963
+ } = useDevtoolsSettings();
964
+ const styles = useStyles();
965
+ const hotkey = createMemo(() => settings().openHotkey);
966
+ const modifiers = ["Control", "Alt", "Meta", "Shift"];
967
+ const changeHotkey = (newHotkey) => () => {
968
+ if (hotkey().includes(newHotkey)) {
969
+ return setSettings({
970
+ openHotkey: hotkey().filter((key) => key !== newHotkey)
971
+ });
972
+ }
973
+ const existingModifiers = hotkey().filter((key) => modifiers.includes(key));
974
+ const otherModifiers = hotkey().filter((key) => !modifiers.includes(key));
975
+ setSettings({
976
+ openHotkey: [...existingModifiers, newHotkey, ...otherModifiers]
977
+ });
978
+ };
979
+ return createComponent(MainPanel$1, {
980
+ withPadding: true,
981
+ get children() {
982
+ return [createComponent(Section, {
983
+ get children() {
984
+ return [createComponent(SectionTitle, {
985
+ get children() {
986
+ return [createComponent(SectionIcon, {
987
+ get children() {
988
+ return createComponent(SettingsCog, {});
989
+ }
990
+ }), "General"];
991
+ }
992
+ }), createComponent(SectionDescription, {
993
+ children: "Configure general behavior of the devtools panel."
994
+ }), (() => {
995
+ var _el$ = _tmpl$4();
996
+ insert(_el$, createComponent(Checkbox, {
997
+ label: "Default open",
998
+ description: "Automatically open the devtools panel when the page loads",
999
+ onChange: () => setSettings({
1000
+ defaultOpen: !settings().defaultOpen
1001
+ }),
1002
+ get checked() {
1003
+ return settings().defaultOpen;
1004
+ }
1005
+ }), null);
1006
+ insert(_el$, createComponent(Checkbox, {
1007
+ label: "Hide trigger until hovered",
1008
+ description: "Keep the devtools trigger button hidden until you hover over its area",
1009
+ onChange: () => setSettings({
1010
+ hideUntilHover: !settings().hideUntilHover
1011
+ }),
1012
+ get checked() {
1013
+ return settings().hideUntilHover;
1014
+ }
1015
+ }), null);
1016
+ insert(_el$, createComponent(Select, {
1017
+ label: "Theme",
1018
+ description: "Choose the theme for the devtools panel",
1019
+ get value() {
1020
+ return settings().theme;
1021
+ },
1022
+ options: [{
1023
+ label: "Dark",
1024
+ value: "dark"
1025
+ }, {
1026
+ label: "Light",
1027
+ value: "light"
1028
+ }],
1029
+ onChange: (value) => setSettings({
1030
+ theme: value
1031
+ })
1032
+ }), null);
1033
+ effect(() => className(_el$, styles().settingsGroup));
1034
+ return _el$;
1035
+ })()];
1036
+ }
1037
+ }), createComponent(Section, {
1038
+ get children() {
1039
+ return [createComponent(SectionTitle, {
1040
+ get children() {
1041
+ return [createComponent(SectionIcon, {
1042
+ get children() {
1043
+ return createComponent(Link, {});
1044
+ }
1045
+ }), "URL Configuration"];
1046
+ }
1047
+ }), createComponent(SectionDescription, {
1048
+ children: "Control when devtools are available based on URL parameters."
1049
+ }), (() => {
1050
+ var _el$2 = _tmpl$4();
1051
+ insert(_el$2, createComponent(Checkbox, {
1052
+ label: "Require URL Flag",
1053
+ description: "Only show devtools when a specific URL parameter is present",
1054
+ get checked() {
1055
+ return settings().requireUrlFlag;
1056
+ },
1057
+ onChange: (checked) => setSettings({
1058
+ requireUrlFlag: checked
1059
+ })
1060
+ }), null);
1061
+ insert(_el$2, createComponent(Show, {
1062
+ get when() {
1063
+ return settings().requireUrlFlag;
1064
+ },
1065
+ get children() {
1066
+ var _el$3 = _tmpl$4();
1067
+ insert(_el$3, createComponent(Input, {
1068
+ label: "URL flag",
1069
+ description: "Enter the URL parameter name (e.g., 'debug' for ?debug=true)",
1070
+ placeholder: "debug",
1071
+ get value() {
1072
+ return settings().urlFlag;
1073
+ },
1074
+ onChange: (e) => setSettings({
1075
+ urlFlag: e
1076
+ })
1077
+ }));
1078
+ effect(() => className(_el$3, styles().conditionalSetting));
1079
+ return _el$3;
1080
+ }
1081
+ }), null);
1082
+ effect(() => className(_el$2, styles().settingsGroup));
1083
+ return _el$2;
1084
+ })()];
1085
+ }
1086
+ }), createComponent(Section, {
1087
+ get children() {
1088
+ return [createComponent(SectionTitle, {
1089
+ get children() {
1090
+ return [createComponent(SectionIcon, {
1091
+ get children() {
1092
+ return createComponent(Keyboard, {});
1093
+ }
1094
+ }), "Keyboard"];
1095
+ }
1096
+ }), createComponent(SectionDescription, {
1097
+ children: "Customize keyboard shortcuts for quick access."
1098
+ }), (() => {
1099
+ var _el$4 = _tmpl$22(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
1100
+ insert(_el$5, createComponent(Show, {
1101
+ keyed: true,
1102
+ get when() {
1103
+ return hotkey();
1104
+ },
1105
+ get children() {
1106
+ return [createComponent(Button, {
1107
+ variant: "success",
1108
+ get onclick() {
1109
+ return changeHotkey("Shift");
1110
+ },
1111
+ get outline() {
1112
+ return !hotkey().includes("Shift");
1113
+ },
1114
+ children: "Shift"
1115
+ }), createComponent(Button, {
1116
+ variant: "success",
1117
+ get onclick() {
1118
+ return changeHotkey("Alt");
1119
+ },
1120
+ get outline() {
1121
+ return !hotkey().includes("Alt");
1122
+ },
1123
+ children: "Alt"
1124
+ }), createComponent(Button, {
1125
+ variant: "success",
1126
+ get onclick() {
1127
+ return changeHotkey("Meta");
1128
+ },
1129
+ get outline() {
1130
+ return !hotkey().includes("Meta");
1131
+ },
1132
+ children: "Meta"
1133
+ }), createComponent(Button, {
1134
+ variant: "success",
1135
+ get onclick() {
1136
+ return changeHotkey("Control");
1137
+ },
1138
+ get outline() {
1139
+ return !hotkey().includes("Control");
1140
+ },
1141
+ children: "Control"
1142
+ })];
1143
+ }
1144
+ }));
1145
+ insert(_el$4, createComponent(Input, {
1146
+ label: "Hotkey to open/close devtools",
1147
+ description: "Use '+' to combine keys (e.g., 'a+b' or 'd'). This will be used with the enabled modifiers from above",
1148
+ placeholder: "a",
1149
+ get value() {
1150
+ return hotkey().filter((key) => !["Shift", "Meta", "Alt", "Ctrl"].includes(key)).join("+");
1151
+ },
1152
+ onChange: (e) => {
1153
+ const makeModifierArray = (key) => {
1154
+ if (key.length === 1) return [uppercaseFirstLetter(key)];
1155
+ const modifiers3 = [];
1156
+ for (const character of key) {
1157
+ const newLetter = uppercaseFirstLetter(character);
1158
+ if (!modifiers3.includes(newLetter)) modifiers3.push(newLetter);
1159
+ }
1160
+ return modifiers3;
1161
+ };
1162
+ const modifiers2 = e.split("+").flatMap((key) => makeModifierArray(key)).filter(Boolean);
1163
+ return setSettings({
1164
+ openHotkey: [...hotkey().filter((key) => ["Shift", "Meta", "Alt", "Ctrl"].includes(key)), ...modifiers2]
1165
+ });
1166
+ }
1167
+ }), _el$6);
1168
+ insert(_el$4, () => hotkey().join(" + "), null);
1169
+ effect((_p$) => {
1170
+ var _v$ = styles().settingsGroup, _v$2 = styles().settingsModifiers;
1171
+ _v$ !== _p$.e && className(_el$4, _p$.e = _v$);
1172
+ _v$2 !== _p$.t && className(_el$5, _p$.t = _v$2);
1173
+ return _p$;
1174
+ }, {
1175
+ e: void 0,
1176
+ t: void 0
1177
+ });
1178
+ return _el$4;
1179
+ })()];
1180
+ }
1181
+ }), createComponent(Section, {
1182
+ get children() {
1183
+ return [createComponent(SectionTitle, {
1184
+ get children() {
1185
+ return [createComponent(SectionIcon, {
1186
+ get children() {
1187
+ return createComponent(GeoTag, {});
1188
+ }
1189
+ }), "Position"];
1190
+ }
1191
+ }), createComponent(SectionDescription, {
1192
+ children: "Adjust the position of the trigger button and devtools panel."
1193
+ }), (() => {
1194
+ var _el$7 = _tmpl$32(), _el$8 = _el$7.firstChild;
1195
+ insert(_el$8, createComponent(Select, {
1196
+ label: "Trigger Position",
1197
+ options: [{
1198
+ label: "Bottom Right",
1199
+ value: "bottom-right"
1200
+ }, {
1201
+ label: "Bottom Left",
1202
+ value: "bottom-left"
1203
+ }, {
1204
+ label: "Top Right",
1205
+ value: "top-right"
1206
+ }, {
1207
+ label: "Top Left",
1208
+ value: "top-left"
1209
+ }, {
1210
+ label: "Middle Right",
1211
+ value: "middle-right"
1212
+ }, {
1213
+ label: "Middle Left",
1214
+ value: "middle-left"
1215
+ }],
1216
+ get value() {
1217
+ return settings().position;
1218
+ },
1219
+ onChange: (value) => setSettings({
1220
+ position: value
1221
+ })
1222
+ }), null);
1223
+ insert(_el$8, createComponent(Select, {
1224
+ label: "Panel Position",
1225
+ get value() {
1226
+ return settings().panelLocation;
1227
+ },
1228
+ options: [{
1229
+ label: "Top",
1230
+ value: "top"
1231
+ }, {
1232
+ label: "Bottom",
1233
+ value: "bottom"
1234
+ }],
1235
+ onChange: (value) => setSettings({
1236
+ panelLocation: value
1237
+ })
1238
+ }), null);
1239
+ effect((_p$) => {
1240
+ var _v$3 = styles().settingsGroup, _v$4 = styles().settingRow;
1241
+ _v$3 !== _p$.e && className(_el$7, _p$.e = _v$3);
1242
+ _v$4 !== _p$.t && className(_el$8, _p$.t = _v$4);
1243
+ return _p$;
1244
+ }, {
1245
+ e: void 0,
1246
+ t: void 0
1247
+ });
1248
+ return _el$7;
1249
+ })()];
1250
+ }
1251
+ })];
1252
+ }
1253
+ });
1254
+ };
1255
+ var _tmpl$5 = /* @__PURE__ */ template(`<div><div><div></div></div><div>`);
1256
+ var _tmpl$23 = /* @__PURE__ */ template(`<div><h3>`);
1257
+ var PluginsTab = () => {
1258
+ const {
1259
+ plugins,
1260
+ activePlugin,
1261
+ setActivePlugin
1262
+ } = usePlugins();
1263
+ const {
1264
+ expanded,
1265
+ hoverUtils,
1266
+ animationMs
1267
+ } = useDrawContext();
1268
+ let activePluginRef;
1269
+ const {
1270
+ theme
1271
+ } = useTheme();
1272
+ createEffect(() => {
1273
+ const currentActivePlugin = plugins()?.find((plugin) => plugin.id === activePlugin());
1274
+ if (activePluginRef && currentActivePlugin) {
1275
+ currentActivePlugin.render(activePluginRef, theme());
1276
+ }
1277
+ });
1278
+ const styles = useStyles();
1279
+ return (() => {
1280
+ var _el$ = _tmpl$5(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling;
1281
+ _el$2.addEventListener("mouseleave", () => {
1282
+ hoverUtils.leave();
1283
+ });
1284
+ _el$2.addEventListener("mouseenter", () => {
1285
+ hoverUtils.enter();
1286
+ });
1287
+ insert(_el$3, createComponent(For, {
1288
+ get each() {
1289
+ return plugins();
1290
+ },
1291
+ children: (plugin) => {
1292
+ let pluginHeading;
1293
+ createEffect(() => {
1294
+ if (pluginHeading) {
1295
+ typeof plugin.name === "string" ? pluginHeading.textContent = plugin.name : plugin.name(pluginHeading, theme());
1296
+ }
1297
+ });
1298
+ return (() => {
1299
+ var _el$5 = _tmpl$23(), _el$6 = _el$5.firstChild;
1300
+ _el$5.$$click = () => setActivePlugin(plugin.id);
1301
+ var _ref$2 = pluginHeading;
1302
+ typeof _ref$2 === "function" ? use(_ref$2, _el$6) : pluginHeading = _el$6;
1303
+ setAttribute(_el$6, "id", PLUGIN_TITLE_CONTAINER_ID);
1304
+ effect(() => className(_el$5, clsx3(styles().pluginName, {
1305
+ active: activePlugin() === plugin.id
1306
+ })));
1307
+ return _el$5;
1308
+ })();
1309
+ }
1310
+ }));
1311
+ var _ref$ = activePluginRef;
1312
+ typeof _ref$ === "function" ? use(_ref$, _el$4) : activePluginRef = _el$4;
1313
+ setAttribute(_el$4, "id", PLUGIN_CONTAINER_ID);
1314
+ effect((_p$) => {
1315
+ var _v$ = styles().pluginsTabPanel, _v$2 = clsx3(styles().pluginsTabDraw(expanded()), {
1316
+ [styles().pluginsTabDraw(expanded())]: expanded()
1317
+ }, styles().pluginsTabDrawTransition(animationMs)), _v$3 = clsx3(styles().pluginsTabSidebar(expanded()), styles().pluginsTabSidebarTransition(animationMs)), _v$4 = styles().pluginsTabContent;
1318
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
1319
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
1320
+ _v$3 !== _p$.a && className(_el$3, _p$.a = _v$3);
1321
+ _v$4 !== _p$.o && className(_el$4, _p$.o = _v$4);
1322
+ return _p$;
1323
+ }, {
1324
+ e: void 0,
1325
+ t: void 0,
1326
+ a: void 0,
1327
+ o: void 0
1328
+ });
1329
+ return _el$;
1330
+ })();
1331
+ };
1332
+ delegateEvents(["click"]);
1333
+ function useHeadChanges(onChange, opts = {}) {
1334
+ const {
1335
+ attributes = true,
1336
+ childList = true,
1337
+ subtree = true,
1338
+ observeTitle = true
1339
+ } = opts;
1340
+ onMount(() => {
1341
+ const headObserver = new MutationObserver((mutations) => {
1342
+ for (const m of mutations) {
1343
+ if (m.type === "childList") {
1344
+ m.addedNodes.forEach((node) => onChange({ kind: "added", node }, m));
1345
+ m.removedNodes.forEach(
1346
+ (node) => onChange({ kind: "removed", node }, m)
1347
+ );
1348
+ } else if (m.type === "attributes") {
1349
+ const el = m.target;
1350
+ onChange(
1351
+ {
1352
+ kind: "attr",
1353
+ target: el,
1354
+ name: m.attributeName,
1355
+ oldValue: m.oldValue ?? null
1356
+ },
1357
+ m
1358
+ );
1359
+ } else {
1360
+ const isInTitle = m.target.parentNode && m.target.parentNode.tagName.toLowerCase() === "title";
1361
+ if (isInTitle) onChange({ kind: "title", title: document.title }, m);
1362
+ }
1363
+ }
1364
+ });
1365
+ headObserver.observe(document.head, {
1366
+ childList,
1367
+ attributes,
1368
+ subtree,
1369
+ attributeOldValue: attributes,
1370
+ characterData: true,
1371
+ // helps catch <title> text node edits
1372
+ characterDataOldValue: false
1373
+ });
1374
+ let titleObserver;
1375
+ if (observeTitle) {
1376
+ const titleEl = document.head.querySelector("title") || // create a <title> if missing so future changes are observable
1377
+ document.head.appendChild(document.createElement("title"));
1378
+ titleObserver = new MutationObserver(() => {
1379
+ onChange({ kind: "title", title: document.title });
1380
+ });
1381
+ titleObserver.observe(titleEl, {
1382
+ childList: true,
1383
+ characterData: true,
1384
+ subtree: true
1385
+ });
1386
+ }
1387
+ onCleanup(() => {
1388
+ headObserver.disconnect();
1389
+ titleObserver?.disconnect();
1390
+ });
1391
+ });
1392
+ }
1393
+
1394
+ // src/tabs/seo-tab.tsx
1395
+ var _tmpl$6 = /* @__PURE__ */ template(`<div><div> Preview</div><div></div><div></div><div>`);
1396
+ var _tmpl$24 = /* @__PURE__ */ template(`<img alt=Preview>`);
1397
+ var _tmpl$33 = /* @__PURE__ */ template(`<div>No Image`);
1398
+ var _tmpl$42 = /* @__PURE__ */ template(`<div>`);
1399
+ var _tmpl$52 = /* @__PURE__ */ template(`<div><strong>Missing tags for <!>:</strong><ul>`);
1400
+ var _tmpl$62 = /* @__PURE__ */ template(`<li>`);
1401
+ var SOCIALS = [
1402
+ {
1403
+ network: "Facebook",
1404
+ tags: [{
1405
+ key: "og:title",
1406
+ prop: "title"
1407
+ }, {
1408
+ key: "og:description",
1409
+ prop: "description"
1410
+ }, {
1411
+ key: "og:image",
1412
+ prop: "image"
1413
+ }, {
1414
+ key: "og:url",
1415
+ prop: "url"
1416
+ }],
1417
+ color: "#4267B2"
1418
+ },
1419
+ {
1420
+ network: "X/Twitter",
1421
+ tags: [{
1422
+ key: "twitter:title",
1423
+ prop: "title"
1424
+ }, {
1425
+ key: "twitter:description",
1426
+ prop: "description"
1427
+ }, {
1428
+ key: "twitter:image",
1429
+ prop: "image"
1430
+ }, {
1431
+ key: "twitter:url",
1432
+ prop: "url"
1433
+ }],
1434
+ color: "#1DA1F2"
1435
+ },
1436
+ {
1437
+ network: "LinkedIn",
1438
+ tags: [{
1439
+ key: "og:title",
1440
+ prop: "title"
1441
+ }, {
1442
+ key: "og:description",
1443
+ prop: "description"
1444
+ }, {
1445
+ key: "og:image",
1446
+ prop: "image"
1447
+ }, {
1448
+ key: "og:url",
1449
+ prop: "url"
1450
+ }],
1451
+ color: "#0077B5"
1452
+ },
1453
+ {
1454
+ network: "Discord",
1455
+ tags: [{
1456
+ key: "og:title",
1457
+ prop: "title"
1458
+ }, {
1459
+ key: "og:description",
1460
+ prop: "description"
1461
+ }, {
1462
+ key: "og:image",
1463
+ prop: "image"
1464
+ }, {
1465
+ key: "og:url",
1466
+ prop: "url"
1467
+ }],
1468
+ color: "#5865F2"
1469
+ },
1470
+ {
1471
+ network: "Slack",
1472
+ tags: [{
1473
+ key: "og:title",
1474
+ prop: "title"
1475
+ }, {
1476
+ key: "og:description",
1477
+ prop: "description"
1478
+ }, {
1479
+ key: "og:image",
1480
+ prop: "image"
1481
+ }, {
1482
+ key: "og:url",
1483
+ prop: "url"
1484
+ }],
1485
+ color: "#4A154B"
1486
+ },
1487
+ {
1488
+ network: "Mastodon",
1489
+ tags: [{
1490
+ key: "og:title",
1491
+ prop: "title"
1492
+ }, {
1493
+ key: "og:description",
1494
+ prop: "description"
1495
+ }, {
1496
+ key: "og:image",
1497
+ prop: "image"
1498
+ }, {
1499
+ key: "og:url",
1500
+ prop: "url"
1501
+ }],
1502
+ color: "#6364FF"
1503
+ },
1504
+ {
1505
+ network: "Bluesky",
1506
+ tags: [{
1507
+ key: "og:title",
1508
+ prop: "title"
1509
+ }, {
1510
+ key: "og:description",
1511
+ prop: "description"
1512
+ }, {
1513
+ key: "og:image",
1514
+ prop: "image"
1515
+ }, {
1516
+ key: "og:url",
1517
+ prop: "url"
1518
+ }],
1519
+ color: "#1185FE"
1520
+ }
1521
+ // Add more networks as needed
1522
+ ];
1523
+ function SocialPreview(props) {
1524
+ const styles = useStyles();
1525
+ return (() => {
1526
+ var _el$ = _tmpl$6(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$2.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.nextSibling;
1527
+ insert(_el$2, () => props.network, _el$3);
1528
+ insert(_el$, (() => {
1529
+ var _c$ = memo(() => !!props.meta.image);
1530
+ return () => _c$() ? (() => {
1531
+ var _el$7 = _tmpl$24();
1532
+ effect((_p$) => {
1533
+ var _v$8 = props.meta.image, _v$9 = styles().seoPreviewImage;
1534
+ _v$8 !== _p$.e && setAttribute(_el$7, "src", _p$.e = _v$8);
1535
+ _v$9 !== _p$.t && className(_el$7, _p$.t = _v$9);
1536
+ return _p$;
1537
+ }, {
1538
+ e: void 0,
1539
+ t: void 0
1540
+ });
1541
+ return _el$7;
1542
+ })() : (() => {
1543
+ var _el$8 = _tmpl$33();
1544
+ _el$8.style.setProperty("background", "#222");
1545
+ _el$8.style.setProperty("color", "#888");
1546
+ _el$8.style.setProperty("display", "flex");
1547
+ _el$8.style.setProperty("align-items", "center");
1548
+ _el$8.style.setProperty("justify-content", "center");
1549
+ _el$8.style.setProperty("min-height", "80px");
1550
+ _el$8.style.setProperty("width", "100%");
1551
+ effect(() => className(_el$8, styles().seoPreviewImage));
1552
+ return _el$8;
1553
+ })();
1554
+ })(), _el$4);
1555
+ insert(_el$4, () => props.meta.title || "No Title");
1556
+ insert(_el$5, () => props.meta.description || "No Description");
1557
+ insert(_el$6, () => props.meta.url || window.location.href);
1558
+ effect((_p$) => {
1559
+ var _v$ = styles().seoPreviewCard, _v$2 = props.color, _v$3 = styles().seoPreviewHeader, _v$4 = props.color, _v$5 = styles().seoPreviewTitle, _v$6 = styles().seoPreviewDesc, _v$7 = styles().seoPreviewUrl;
1560
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
1561
+ _v$2 !== _p$.t && ((_p$.t = _v$2) != null ? _el$.style.setProperty("border-color", _v$2) : _el$.style.removeProperty("border-color"));
1562
+ _v$3 !== _p$.a && className(_el$2, _p$.a = _v$3);
1563
+ _v$4 !== _p$.o && ((_p$.o = _v$4) != null ? _el$2.style.setProperty("color", _v$4) : _el$2.style.removeProperty("color"));
1564
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
1565
+ _v$6 !== _p$.n && className(_el$5, _p$.n = _v$6);
1566
+ _v$7 !== _p$.s && className(_el$6, _p$.s = _v$7);
1567
+ return _p$;
1568
+ }, {
1569
+ e: void 0,
1570
+ t: void 0,
1571
+ a: void 0,
1572
+ o: void 0,
1573
+ i: void 0,
1574
+ n: void 0,
1575
+ s: void 0
1576
+ });
1577
+ return _el$;
1578
+ })();
1579
+ }
1580
+ var SeoTab = () => {
1581
+ const [reports, setReports] = createSignal(analyzeHead());
1582
+ const styles = useStyles();
1583
+ function analyzeHead() {
1584
+ const metaTags = Array.from(document.head.querySelectorAll("meta"));
1585
+ const reports2 = [];
1586
+ for (const social of SOCIALS) {
1587
+ const found = {};
1588
+ const missing = [];
1589
+ for (const tag of social.tags) {
1590
+ const meta = metaTags.find((m) => (tag.key.includes("twitter:") ? false : m.getAttribute("property") === tag.key) || m.getAttribute("name") === tag.key);
1591
+ if (meta && meta.getAttribute("content")) {
1592
+ found[tag.prop] = meta.getAttribute("content") || void 0;
1593
+ } else {
1594
+ missing.push(tag.key);
1595
+ }
1596
+ }
1597
+ reports2.push({
1598
+ network: social.network,
1599
+ found,
1600
+ missing
1601
+ });
1602
+ }
1603
+ return reports2;
1604
+ }
1605
+ useHeadChanges(() => {
1606
+ setReports(analyzeHead());
1607
+ });
1608
+ return createComponent(MainPanel$1, {
1609
+ withPadding: true,
1610
+ get children() {
1611
+ return createComponent(Section, {
1612
+ get children() {
1613
+ return [createComponent(SectionTitle, {
1614
+ get children() {
1615
+ return [createComponent(SectionIcon, {
1616
+ get children() {
1617
+ return createComponent(SocialBubble, {});
1618
+ }
1619
+ }), "Social previews"];
1620
+ }
1621
+ }), createComponent(SectionDescription, {
1622
+ children: "See how your current page will look when shared on popular social networks. The tool checks for essential meta tags and highlights any that are missing."
1623
+ }), (() => {
1624
+ var _el$9 = _tmpl$42();
1625
+ insert(_el$9, createComponent(For, {
1626
+ get each() {
1627
+ return reports();
1628
+ },
1629
+ children: (report, i) => {
1630
+ const social = SOCIALS[i()];
1631
+ return (() => {
1632
+ var _el$0 = _tmpl$42();
1633
+ insert(_el$0, createComponent(SocialPreview, {
1634
+ get meta() {
1635
+ return report.found;
1636
+ },
1637
+ get color() {
1638
+ return social.color;
1639
+ },
1640
+ get network() {
1641
+ return social.network;
1642
+ }
1643
+ }), null);
1644
+ insert(_el$0, (() => {
1645
+ var _c$2 = memo(() => report.missing.length > 0);
1646
+ return () => _c$2() ? (() => {
1647
+ var _el$1 = _tmpl$52(), _el$10 = _el$1.firstChild, _el$11 = _el$10.firstChild, _el$13 = _el$11.nextSibling; _el$13.nextSibling; var _el$14 = _el$10.nextSibling;
1648
+ insert(_el$10, () => social?.network, _el$13);
1649
+ insert(_el$14, createComponent(For, {
1650
+ get each() {
1651
+ return report.missing;
1652
+ },
1653
+ children: (tag) => (() => {
1654
+ var _el$15 = _tmpl$62();
1655
+ insert(_el$15, tag);
1656
+ effect(() => className(_el$15, styles().seoMissingTag));
1657
+ return _el$15;
1658
+ })()
1659
+ }));
1660
+ effect((_p$) => {
1661
+ var _v$0 = styles().seoMissingTagsSection, _v$1 = styles().seoMissingTagsList;
1662
+ _v$0 !== _p$.e && className(_el$1, _p$.e = _v$0);
1663
+ _v$1 !== _p$.t && className(_el$14, _p$.t = _v$1);
1664
+ return _p$;
1665
+ }, {
1666
+ e: void 0,
1667
+ t: void 0
1668
+ });
1669
+ return _el$1;
1670
+ })() : null;
1671
+ })(), null);
1672
+ return _el$0;
1673
+ })();
1674
+ }
1675
+ }));
1676
+ effect(() => className(_el$9, styles().seoPreviewSection));
1677
+ return _el$9;
1678
+ })()];
1679
+ }
1680
+ });
1681
+ }
1682
+ });
1683
+ };
1684
+
1685
+ // src/tabs/index.tsx
1686
+ var tabs = [{
1687
+ name: "Plugins",
1688
+ id: "plugins",
1689
+ component: () => createComponent(PluginsTab, {}),
1690
+ icon: () => createComponent(List, {})
1691
+ }, {
1692
+ name: "SEO",
1693
+ id: "seo",
1694
+ component: () => createComponent(SeoTab, {}),
1695
+ icon: () => createComponent(PageSearch, {})
1696
+ }, {
1697
+ name: "Settings",
1698
+ id: "settings",
1699
+ component: () => createComponent(SettingsTab, {}),
1700
+ icon: () => createComponent(Cogs, {})
1701
+ }];
1702
+
1703
+ // src/components/tabs.tsx
1704
+ var _tmpl$7 = /* @__PURE__ */ template(`<div>`);
1705
+ var _tmpl$25 = /* @__PURE__ */ template(`<button type=button>`);
1706
+ var _tmpl$34 = /* @__PURE__ */ template(`<div><button type=button></button><button type=button>`);
1707
+ var Tabs = (props) => {
1708
+ const styles = useStyles();
1709
+ const {
1710
+ state,
1711
+ setState
1712
+ } = useDevtoolsState();
1713
+ const pipWindow = usePiPWindow();
1714
+ const handleDetachment = () => {
1715
+ pipWindow().requestPipWindow(`width=${window.innerWidth},height=${state().height},top=${window.screen.height},left=${window.screenLeft}}`);
1716
+ };
1717
+ const {
1718
+ hoverUtils
1719
+ } = useDrawContext();
1720
+ return (() => {
1721
+ var _el$ = _tmpl$7();
1722
+ insert(_el$, createComponent(For, {
1723
+ each: tabs,
1724
+ children: (tab) => (() => {
1725
+ var _el$2 = _tmpl$25();
1726
+ _el$2.addEventListener("mouseleave", () => {
1727
+ if (tab.id === "plugins") hoverUtils.leave();
1728
+ });
1729
+ _el$2.addEventListener("mouseenter", () => {
1730
+ if (tab.id === "plugins") hoverUtils.enter();
1731
+ });
1732
+ _el$2.$$click = () => setState({
1733
+ activeTab: tab.id
1734
+ });
1735
+ insert(_el$2, () => tab.icon());
1736
+ effect(() => className(_el$2, clsx3(styles().tab, {
1737
+ active: state().activeTab === tab.id
1738
+ })));
1739
+ return _el$2;
1740
+ })()
1741
+ }), null);
1742
+ insert(_el$, (() => {
1743
+ var _c$ = memo(() => pipWindow().pipWindow !== null);
1744
+ return () => _c$() ? null : (() => {
1745
+ var _el$3 = _tmpl$34(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
1746
+ _el$3.style.setProperty("margin-top", "auto");
1747
+ _el$4.$$click = handleDetachment;
1748
+ insert(_el$4, createComponent(PiP, {}));
1749
+ _el$5.$$click = () => props.toggleOpen();
1750
+ insert(_el$5, createComponent(X, {}));
1751
+ effect((_p$) => {
1752
+ var _v$ = clsx3(styles().tab, "detach"), _v$2 = clsx3(styles().tab, "close");
1753
+ _v$ !== _p$.e && className(_el$4, _p$.e = _v$);
1754
+ _v$2 !== _p$.t && className(_el$5, _p$.t = _v$2);
1755
+ return _p$;
1756
+ }, {
1757
+ e: void 0,
1758
+ t: void 0
1759
+ });
1760
+ return _el$3;
1761
+ })();
1762
+ })(), null);
1763
+ effect(() => className(_el$, styles().tabContainer));
1764
+ return _el$;
1765
+ })();
1766
+ };
1767
+ delegateEvents(["click"]);
1768
+ var _tmpl$8 = /* @__PURE__ */ template(`<div>`);
1769
+ var TabContent = () => {
1770
+ const {
1771
+ state
1772
+ } = useDevtoolsState();
1773
+ const styles = useStyles();
1774
+ const component = createMemo(() => tabs.find((t) => t.id === state().activeTab)?.component || null);
1775
+ return (() => {
1776
+ var _el$ = _tmpl$8();
1777
+ insert(_el$, () => component()?.());
1778
+ effect(() => className(_el$, styles().tabContent));
1779
+ return _el$;
1780
+ })();
1781
+ };
1782
+
1783
+ // src/devtools.tsx
1784
+ var _tmpl$9 = /* @__PURE__ */ template(`<div>`);
1785
+ function DevTools() {
1786
+ const {
1787
+ settings
1788
+ } = useDevtoolsSettings();
1789
+ const {
1790
+ setHeight
1791
+ } = useHeight();
1792
+ const {
1793
+ persistOpen,
1794
+ setPersistOpen
1795
+ } = usePersistOpen();
1796
+ const [rootEl, setRootEl] = createSignal();
1797
+ const [isOpen, setIsOpen] = createSignal(settings().defaultOpen || persistOpen());
1798
+ const pip = usePiPWindow();
1799
+ let panelRef = void 0;
1800
+ const [isResizing, setIsResizing] = createSignal(false);
1801
+ const toggleOpen = () => {
1802
+ if (pip().pipWindow) {
1803
+ return;
1804
+ }
1805
+ const open = isOpen();
1806
+ setIsOpen(!open);
1807
+ setPersistOpen(!open);
1808
+ };
1809
+ const handleDragStart = (panelElement, startEvent) => {
1810
+ if (startEvent.button !== 0) return;
1811
+ if (!panelElement) return;
1812
+ setIsResizing(true);
1813
+ const dragInfo = {
1814
+ originalHeight: panelElement.getBoundingClientRect().height,
1815
+ pageY: startEvent.pageY
1816
+ };
1817
+ const run = (moveEvent) => {
1818
+ const delta = dragInfo.pageY - moveEvent.pageY;
1819
+ const newHeight = settings().panelLocation === "bottom" ? dragInfo.originalHeight + delta : dragInfo.originalHeight - delta;
1820
+ setHeight(newHeight);
1821
+ if (newHeight < 70) {
1822
+ setIsOpen(false);
1823
+ } else {
1824
+ setIsOpen(true);
1825
+ }
1826
+ };
1827
+ const unsub = () => {
1828
+ setIsResizing(false);
1829
+ document.removeEventListener("mousemove", run);
1830
+ document.removeEventListener("mouseUp", unsub);
1831
+ };
1832
+ document.addEventListener("mousemove", run);
1833
+ document.addEventListener("mouseup", unsub);
1834
+ };
1835
+ createEffect(() => {
1836
+ if (isOpen()) {
1837
+ const previousValue = rootEl()?.parentElement?.style.paddingBottom;
1838
+ const run = () => {
1839
+ if (!panelRef) return;
1840
+ if (rootEl()?.parentElement) {
1841
+ setRootEl((prev) => {
1842
+ if (prev?.parentElement) ;
1843
+ return prev;
1844
+ });
1845
+ }
1846
+ };
1847
+ run();
1848
+ if (typeof window !== "undefined") {
1849
+ (pip().pipWindow ?? window).addEventListener("resize", run);
1850
+ return () => {
1851
+ (pip().pipWindow ?? window).removeEventListener("resize", run);
1852
+ if (rootEl()?.parentElement && typeof previousValue === "string") {
1853
+ setRootEl((prev) => {
1854
+ return prev;
1855
+ });
1856
+ }
1857
+ };
1858
+ }
1859
+ } else {
1860
+ if (rootEl()?.parentElement) {
1861
+ setRootEl((prev) => {
1862
+ if (prev?.parentElement) {
1863
+ prev.parentElement.removeAttribute("style");
1864
+ }
1865
+ return prev;
1866
+ });
1867
+ }
1868
+ }
1869
+ return;
1870
+ });
1871
+ createEffect(() => {
1872
+ window.addEventListener("keydown", (e) => {
1873
+ if (e.key === "Escape" && isOpen()) {
1874
+ toggleOpen();
1875
+ }
1876
+ });
1877
+ });
1878
+ useDisableTabbing(isOpen);
1879
+ createEffect(() => {
1880
+ if (rootEl()) {
1881
+ const el = rootEl();
1882
+ const fontSize = getComputedStyle(el).fontSize;
1883
+ el?.style.setProperty("--tsrd-font-size", fontSize);
1884
+ }
1885
+ });
1886
+ createEffect(() => {
1887
+ const modifiers = settings().openHotkey.filter((key) => keyboardModifiers.includes(key));
1888
+ const nonModifiers = settings().openHotkey.filter((key) => !keyboardModifiers.includes(key));
1889
+ const allModifierCombinations = getAllPermutations(modifiers);
1890
+ for (const combination of allModifierCombinations) {
1891
+ const permutation = [...combination, ...nonModifiers];
1892
+ createShortcut(permutation, () => {
1893
+ toggleOpen();
1894
+ });
1895
+ }
1896
+ });
1897
+ createEffect(() => {
1898
+ const openSourceHandler = (e) => {
1899
+ const isShiftHeld = e.shiftKey;
1900
+ const isCtrlHeld = e.ctrlKey || e.metaKey;
1901
+ if (!isShiftHeld || !isCtrlHeld) return;
1902
+ if (e.target instanceof HTMLElement) {
1903
+ const dataSource = e.target.getAttribute("data-tsd-source");
1904
+ window.getSelection()?.removeAllRanges();
1905
+ if (dataSource) {
1906
+ e.preventDefault();
1907
+ e.stopPropagation();
1908
+ fetch(`__TSD_HOST__://localhost:__TSD_PORT__/__tsd/open-source?source=${encodeURIComponent(dataSource)}`).catch(() => {
1909
+ });
1910
+ }
1911
+ }
1912
+ };
1913
+ window.addEventListener("click", openSourceHandler);
1914
+ onCleanup(() => {
1915
+ window.removeEventListener("click", openSourceHandler);
1916
+ });
1917
+ });
1918
+ const {
1919
+ theme
1920
+ } = useTheme();
1921
+ return createComponent(ThemeContextProvider, {
1922
+ get theme() {
1923
+ return theme();
1924
+ },
1925
+ get children() {
1926
+ return createComponent(Portal, {
1927
+ get mount() {
1928
+ return (pip().pipWindow ?? window).document.body;
1929
+ },
1930
+ get children() {
1931
+ var _el$ = _tmpl$9();
1932
+ use(setRootEl, _el$);
1933
+ setAttribute(_el$, "data-testid", TANSTACK_DEVTOOLS);
1934
+ insert(_el$, createComponent(Show, {
1935
+ get when() {
1936
+ return memo(() => pip().pipWindow !== null)() ? true : memo(() => !!settings().requireUrlFlag)() ? window.location.search.includes(settings().urlFlag) : true;
1937
+ },
1938
+ get children() {
1939
+ return [createComponent(Trigger, {
1940
+ isOpen,
1941
+ setIsOpen: toggleOpen
1942
+ }), createComponent(MainPanel, {
1943
+ isResizing,
1944
+ isOpen,
1945
+ get children() {
1946
+ return createComponent(ContentPanel, {
1947
+ ref: (ref) => panelRef = ref,
1948
+ handleDragStart: (e) => handleDragStart(panelRef, e),
1949
+ get children() {
1950
+ return [createComponent(Tabs, {
1951
+ toggleOpen
1952
+ }), createComponent(TabContent, {})];
1953
+ }
1954
+ });
1955
+ }
1956
+ })];
1957
+ }
1958
+ }));
1959
+ return _el$;
1960
+ }
1961
+ });
1962
+ }
1963
+ });
1964
+ }
1965
+
1966
+ export { DevTools as default };