@tanstack/devtools 0.6.19 → 0.6.21

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