@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.
@@ -0,0 +1,3584 @@
1
+ import { usePiPWindow, keyboardModifiers, getAllPermutations, TANSTACK_DEVTOOLS, DevtoolsContext, PLUGIN_TITLE_CONTAINER_ID, PLUGIN_CONTAINER_ID, uppercaseFirstLetter } from '../chunk/XF4JFOLU.js';
2
+ import { createComponent, Portal, ssr, ssrAttribute, escape, ssrStyle } from 'solid-js/web';
3
+ import { createContext, createSignal, createEffect, Show, createMemo, For, useContext, onCleanup, onMount } from 'solid-js';
4
+ import { createShortcut, useKeyDownList } from '@solid-primitives/keyboard';
5
+ import { ThemeContextProvider, MainPanel as MainPanel$1, Section, SectionTitle, SectionIcon, SectionDescription, Checkbox, Input, Select, Button, ChevronDownIcon, CloseIcon, SearchIcon, SettingsIcon, PackageIcon, ExternalLinkIcon, CheckCircleIcon, XCircleIcon } 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
+ import { devtoolsEventClient } from '@tanstack/devtools-client';
10
+ import { createStore } from 'solid-js/store';
11
+ import { createElementSize } from '@solid-primitives/resize-observer';
12
+ import { createEventListener } from '@solid-primitives/event-listener';
13
+
14
+ var useDraw = (props) => {
15
+ const [activeHover, setActiveHover] = createSignal(false);
16
+ const [forceExpand, setForceExpand] = createSignal(false);
17
+ const expanded = createMemo(() => activeHover() || forceExpand());
18
+ let hoverTimeout = null;
19
+ onCleanup(() => {
20
+ if (hoverTimeout) clearTimeout(hoverTimeout);
21
+ });
22
+ const hoverUtils = {
23
+ enter: () => {
24
+ if (hoverTimeout) {
25
+ clearTimeout(hoverTimeout);
26
+ hoverTimeout = null;
27
+ }
28
+ setActiveHover(true);
29
+ },
30
+ leave: () => {
31
+ hoverTimeout = setTimeout(() => {
32
+ setActiveHover(false);
33
+ }, props.animationMs);
34
+ }
35
+ };
36
+ return {
37
+ expanded,
38
+ setForceExpand,
39
+ hoverUtils,
40
+ animationMs: props.animationMs
41
+ };
42
+ };
43
+ var DrawContext = createContext(void 0);
44
+ var DrawClientProvider = (props) => {
45
+ const value = useDraw({
46
+ animationMs: props.animationMs
47
+ });
48
+ return createComponent(DrawContext.Provider, {
49
+ value,
50
+ get children() {
51
+ return props.children;
52
+ }
53
+ });
54
+ };
55
+ function useDrawContext() {
56
+ const context = useContext(DrawContext);
57
+ if (context === void 0) {
58
+ throw new Error(`useDrawContext must be used within a DrawClientProvider`);
59
+ }
60
+ return context;
61
+ }
62
+
63
+ // src/context/use-devtools-context.ts
64
+ var useDevtoolsContext = () => {
65
+ const context = useContext(DevtoolsContext);
66
+ if (context === void 0) {
67
+ throw new Error(
68
+ "useDevtoolsShellContext must be used within a ShellContextProvider"
69
+ );
70
+ }
71
+ return context;
72
+ };
73
+ function useTheme() {
74
+ const { settings, setSettings } = useDevtoolsSettings();
75
+ const theme = createMemo(() => settings().theme);
76
+ return {
77
+ theme,
78
+ setTheme: (theme2) => setSettings({ theme: theme2 })
79
+ };
80
+ }
81
+ var usePlugins = () => {
82
+ const { store, setStore } = useDevtoolsContext();
83
+ const { setForceExpand } = useDrawContext();
84
+ const plugins = createMemo(() => store.plugins);
85
+ const activePlugins = createMemo(() => store.state.activePlugins);
86
+ createEffect(() => {
87
+ if (activePlugins().length === 0) {
88
+ setForceExpand(true);
89
+ } else {
90
+ setForceExpand(false);
91
+ }
92
+ });
93
+ const toggleActivePlugins = (pluginId) => {
94
+ setStore((prev) => {
95
+ const isActive = prev.state.activePlugins.includes(pluginId);
96
+ const updatedPlugins = isActive ? prev.state.activePlugins.filter((id) => id !== pluginId) : [...prev.state.activePlugins, pluginId];
97
+ if (updatedPlugins.length > 3) return prev;
98
+ return {
99
+ ...prev,
100
+ state: {
101
+ ...prev.state,
102
+ activePlugins: updatedPlugins
103
+ }
104
+ };
105
+ });
106
+ };
107
+ return { plugins, toggleActivePlugins, activePlugins };
108
+ };
109
+ var useDevtoolsState = () => {
110
+ const { store, setStore } = useDevtoolsContext();
111
+ const state = createMemo(() => store.state);
112
+ const setState = (newState) => {
113
+ setStore((prev) => ({
114
+ ...prev,
115
+ state: {
116
+ ...prev.state,
117
+ ...newState
118
+ }
119
+ }));
120
+ };
121
+ return { state, setState };
122
+ };
123
+ var useDevtoolsSettings = () => {
124
+ const { store, setStore } = useDevtoolsContext();
125
+ const settings = createMemo(() => store.settings);
126
+ const setSettings = (newSettings) => {
127
+ setStore((prev) => ({
128
+ ...prev,
129
+ settings: {
130
+ ...prev.settings,
131
+ ...newSettings
132
+ }
133
+ }));
134
+ };
135
+ return { setSettings, settings };
136
+ };
137
+ var usePersistOpen = () => {
138
+ const { state, setState } = useDevtoolsState();
139
+ const persistOpen = createMemo(() => state().persistOpen);
140
+ const setPersistOpen = (value) => {
141
+ setState({ persistOpen: value });
142
+ };
143
+ return { persistOpen, setPersistOpen };
144
+ };
145
+ var useHeight = () => {
146
+ const { state, setState } = useDevtoolsState();
147
+ const height = createMemo(() => state().height);
148
+ const setHeight = (newHeight) => {
149
+ setState({ height: newHeight });
150
+ };
151
+ return { height, setHeight };
152
+ };
153
+ var recursivelyChangeTabIndex = (node, remove = true) => {
154
+ if (remove) {
155
+ node.setAttribute("tabIndex", "-1");
156
+ } else {
157
+ node.removeAttribute("tabIndex");
158
+ }
159
+ for (const child of node.children) {
160
+ recursivelyChangeTabIndex(child, remove);
161
+ }
162
+ };
163
+ var useDisableTabbing = (isOpen) => {
164
+ createEffect(() => {
165
+ const el = document.getElementById(TANSTACK_DEVTOOLS);
166
+ if (!el) return;
167
+ recursivelyChangeTabIndex(el, !isOpen());
168
+ });
169
+ };
170
+
171
+ // src/styles/tokens.ts
172
+ var tokens = {
173
+ colors: {
174
+ inherit: "inherit",
175
+ current: "currentColor",
176
+ transparent: "transparent",
177
+ black: "#000000",
178
+ white: "#ffffff",
179
+ neutral: {
180
+ 50: "#f9fafb",
181
+ 100: "#f2f4f7",
182
+ 200: "#eaecf0",
183
+ 300: "#d0d5dd",
184
+ 400: "#98a2b3",
185
+ 500: "#667085",
186
+ 600: "#475467",
187
+ 700: "#344054",
188
+ 800: "#1d2939",
189
+ 900: "#101828"
190
+ },
191
+ darkGray: {
192
+ 50: "#525c7a",
193
+ 100: "#49536e",
194
+ 200: "#414962",
195
+ 300: "#394056",
196
+ 400: "#313749",
197
+ 500: "#292e3d",
198
+ 600: "#212530",
199
+ 700: "#191c24",
200
+ 800: "#111318",
201
+ 900: "#0b0d10"
202
+ },
203
+ gray: {
204
+ 50: "#f9fafb",
205
+ 100: "#f2f4f7",
206
+ 200: "#eaecf0",
207
+ 300: "#d0d5dd",
208
+ 400: "#98a2b3",
209
+ 500: "#667085",
210
+ 600: "#475467",
211
+ 700: "#344054",
212
+ 800: "#1d2939",
213
+ 900: "#101828"
214
+ },
215
+ blue: {
216
+ 25: "#F5FAFF",
217
+ 50: "#EFF8FF",
218
+ 100: "#D1E9FF",
219
+ 200: "#B2DDFF",
220
+ 300: "#84CAFF",
221
+ 400: "#53B1FD",
222
+ 500: "#2E90FA",
223
+ 600: "#1570EF",
224
+ 700: "#175CD3",
225
+ 800: "#1849A9",
226
+ 900: "#194185"
227
+ },
228
+ green: {
229
+ 25: "#F6FEF9",
230
+ 50: "#ECFDF3",
231
+ 100: "#D1FADF",
232
+ 200: "#A6F4C5",
233
+ 300: "#6CE9A6",
234
+ 400: "#32D583",
235
+ 500: "#12B76A",
236
+ 600: "#039855",
237
+ 700: "#027A48",
238
+ 800: "#05603A",
239
+ 900: "#054F31"
240
+ },
241
+ red: {
242
+ 50: "#fef2f2",
243
+ 100: "#fee2e2",
244
+ 200: "#fecaca",
245
+ 300: "#fca5a5",
246
+ 400: "#f87171",
247
+ 500: "#ef4444",
248
+ 600: "#dc2626",
249
+ 700: "#b91c1c",
250
+ 800: "#991b1b",
251
+ 900: "#7f1d1d",
252
+ 950: "#450a0a"
253
+ },
254
+ yellow: {
255
+ 25: "#FFFCF5",
256
+ 50: "#FFFAEB",
257
+ 100: "#FEF0C7",
258
+ 200: "#FEDF89",
259
+ 300: "#FEC84B",
260
+ 400: "#FDB022",
261
+ 500: "#F79009",
262
+ 600: "#DC6803",
263
+ 700: "#B54708",
264
+ 800: "#93370D",
265
+ 900: "#7A2E0E"
266
+ },
267
+ purple: {
268
+ 25: "#FAFAFF",
269
+ 50: "#F4F3FF",
270
+ 100: "#EBE9FE",
271
+ 200: "#D9D6FE",
272
+ 300: "#BDB4FE",
273
+ 400: "#9B8AFB",
274
+ 500: "#7A5AF8",
275
+ 600: "#6938EF",
276
+ 700: "#5925DC",
277
+ 800: "#4A1FB8",
278
+ 900: "#3E1C96"
279
+ },
280
+ teal: {
281
+ 25: "#F6FEFC",
282
+ 50: "#F0FDF9",
283
+ 100: "#CCFBEF",
284
+ 200: "#99F6E0",
285
+ 300: "#5FE9D0",
286
+ 400: "#2ED3B7",
287
+ 500: "#15B79E",
288
+ 600: "#0E9384",
289
+ 700: "#107569",
290
+ 800: "#125D56",
291
+ 900: "#134E48"
292
+ },
293
+ pink: {
294
+ 25: "#fdf2f8",
295
+ 50: "#fce7f3",
296
+ 100: "#fbcfe8",
297
+ 200: "#f9a8d4",
298
+ 300: "#f472b6",
299
+ 400: "#ec4899",
300
+ 500: "#db2777",
301
+ 600: "#be185d",
302
+ 700: "#9d174d",
303
+ 800: "#831843",
304
+ 900: "#500724"
305
+ },
306
+ cyan: {
307
+ 25: "#ecfeff",
308
+ 50: "#cffafe",
309
+ 100: "#a5f3fc",
310
+ 200: "#67e8f9",
311
+ 300: "#22d3ee",
312
+ 400: "#06b6d4",
313
+ 500: "#0891b2",
314
+ 600: "#0e7490",
315
+ 700: "#155e75",
316
+ 800: "#164e63",
317
+ 900: "#083344"
318
+ }
319
+ },
320
+ alpha: {
321
+ 100: "ff",
322
+ 90: "e5",
323
+ 80: "cc",
324
+ 70: "b3",
325
+ 60: "99",
326
+ 50: "80",
327
+ 40: "66",
328
+ 30: "4d",
329
+ 20: "33",
330
+ 10: "1a",
331
+ 0: "00"
332
+ },
333
+ font: {
334
+ size: {
335
+ "2xs": "calc(var(--tsrd-font-size) * 0.625)",
336
+ xs: "calc(var(--tsrd-font-size) * 0.75)",
337
+ sm: "calc(var(--tsrd-font-size) * 0.875)",
338
+ md: "var(--tsrd-font-size)",
339
+ lg: "calc(var(--tsrd-font-size) * 1.125)",
340
+ xl: "calc(var(--tsrd-font-size) * 1.25)",
341
+ "2xl": "calc(var(--tsrd-font-size) * 1.5)",
342
+ "3xl": "calc(var(--tsrd-font-size) * 1.875)",
343
+ "4xl": "calc(var(--tsrd-font-size) * 2.25)",
344
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
345
+ "6xl": "calc(var(--tsrd-font-size) * 3.75)",
346
+ "7xl": "calc(var(--tsrd-font-size) * 4.5)",
347
+ "8xl": "calc(var(--tsrd-font-size) * 6)",
348
+ "9xl": "calc(var(--tsrd-font-size) * 8)"
349
+ },
350
+ lineHeight: {
351
+ "3xs": "calc(var(--tsrd-font-size) * 0.75)",
352
+ "2xs": "calc(var(--tsrd-font-size) * 0.875)",
353
+ xs: "calc(var(--tsrd-font-size) * 1)",
354
+ sm: "calc(var(--tsrd-font-size) * 1.25)",
355
+ md: "calc(var(--tsrd-font-size) * 1.5)",
356
+ lg: "calc(var(--tsrd-font-size) * 1.75)",
357
+ xl: "calc(var(--tsrd-font-size) * 2)",
358
+ "2xl": "calc(var(--tsrd-font-size) * 2.25)",
359
+ "3xl": "calc(var(--tsrd-font-size) * 2.5)",
360
+ "4xl": "calc(var(--tsrd-font-size) * 2.75)",
361
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
362
+ "6xl": "calc(var(--tsrd-font-size) * 3.25)",
363
+ "7xl": "calc(var(--tsrd-font-size) * 3.5)",
364
+ "8xl": "calc(var(--tsrd-font-size) * 3.75)",
365
+ "9xl": "calc(var(--tsrd-font-size) * 4)"
366
+ },
367
+ weight: {
368
+ thin: "100",
369
+ extralight: "200",
370
+ light: "300",
371
+ normal: "400",
372
+ medium: "500",
373
+ semibold: "600",
374
+ bold: "700",
375
+ extrabold: "800",
376
+ black: "900"
377
+ },
378
+ fontFamily: {
379
+ sans: "ui-sans-serif, Inter, system-ui, sans-serif, sans-serif",
380
+ mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`
381
+ }
382
+ },
383
+ breakpoints: {
384
+ xs: "320px",
385
+ sm: "640px",
386
+ md: "768px",
387
+ lg: "1024px",
388
+ xl: "1280px",
389
+ "2xl": "1536px"
390
+ },
391
+ border: {
392
+ radius: {
393
+ none: "0px",
394
+ xs: "calc(var(--tsrd-font-size) * 0.125)",
395
+ sm: "calc(var(--tsrd-font-size) * 0.25)",
396
+ md: "calc(var(--tsrd-font-size) * 0.375)",
397
+ lg: "calc(var(--tsrd-font-size) * 0.5)",
398
+ xl: "calc(var(--tsrd-font-size) * 0.75)",
399
+ "2xl": "calc(var(--tsrd-font-size) * 1)",
400
+ "3xl": "calc(var(--tsrd-font-size) * 1.5)",
401
+ full: "9999px"
402
+ }
403
+ },
404
+ size: {
405
+ 0: "0px",
406
+ 0.25: "calc(var(--tsrd-font-size) * 0.0625)",
407
+ 0.5: "calc(var(--tsrd-font-size) * 0.125)",
408
+ 1: "calc(var(--tsrd-font-size) * 0.25)",
409
+ 1.5: "calc(var(--tsrd-font-size) * 0.375)",
410
+ 2: "calc(var(--tsrd-font-size) * 0.5)",
411
+ 2.5: "calc(var(--tsrd-font-size) * 0.625)",
412
+ 3: "calc(var(--tsrd-font-size) * 0.75)",
413
+ 3.5: "calc(var(--tsrd-font-size) * 0.875)",
414
+ 4: "calc(var(--tsrd-font-size) * 1)",
415
+ 4.5: "calc(var(--tsrd-font-size) * 1.125)",
416
+ 5: "calc(var(--tsrd-font-size) * 1.25)",
417
+ 5.5: "calc(var(--tsrd-font-size) * 1.375)",
418
+ 6: "calc(var(--tsrd-font-size) * 1.5)",
419
+ 6.5: "calc(var(--tsrd-font-size) * 1.625)",
420
+ 7: "calc(var(--tsrd-font-size) * 1.75)",
421
+ 8: "calc(var(--tsrd-font-size) * 2)",
422
+ 9: "calc(var(--tsrd-font-size) * 2.25)",
423
+ 10: "calc(var(--tsrd-font-size) * 2.5)",
424
+ 11: "calc(var(--tsrd-font-size) * 2.75)",
425
+ 12: "calc(var(--tsrd-font-size) * 3)",
426
+ 14: "calc(var(--tsrd-font-size) * 3.5)",
427
+ 16: "calc(var(--tsrd-font-size) * 4)",
428
+ 20: "calc(var(--tsrd-font-size) * 5)",
429
+ 24: "calc(var(--tsrd-font-size) * 6)",
430
+ 28: "calc(var(--tsrd-font-size) * 7)",
431
+ 32: "calc(var(--tsrd-font-size) * 8)",
432
+ 36: "calc(var(--tsrd-font-size) * 9)",
433
+ 40: "calc(var(--tsrd-font-size) * 10)",
434
+ 44: "calc(var(--tsrd-font-size) * 11)",
435
+ 48: "calc(var(--tsrd-font-size) * 12)",
436
+ 52: "calc(var(--tsrd-font-size) * 13)",
437
+ 56: "calc(var(--tsrd-font-size) * 14)",
438
+ 60: "calc(var(--tsrd-font-size) * 15)",
439
+ 64: "calc(var(--tsrd-font-size) * 16)",
440
+ 72: "calc(var(--tsrd-font-size) * 18)",
441
+ 80: "calc(var(--tsrd-font-size) * 20)",
442
+ 96: "calc(var(--tsrd-font-size) * 24)"
443
+ },
444
+ shadow: {
445
+ xs: (_ = "rgb(0 0 0 / 0.1)") => `0 1px 2px 0 rgb(0 0 0 / 0.05)`,
446
+ sm: (color = "rgb(0 0 0 / 0.1)") => `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}`,
447
+ md: (color = "rgb(0 0 0 / 0.1)") => `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}`,
448
+ lg: (color = "rgb(0 0 0 / 0.1)") => `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}`,
449
+ xl: (color = "rgb(0 0 0 / 0.1)") => `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}`,
450
+ "2xl": (color = "rgb(0 0 0 / 0.25)") => `0 25px 50px -12px ${color}`,
451
+ inner: (color = "rgb(0 0 0 / 0.05)") => `inset 0 2px 4px 0 ${color}`,
452
+ none: () => `none`
453
+ },
454
+ zIndices: {
455
+ hide: -1,
456
+ auto: "auto",
457
+ base: 0,
458
+ docked: 10,
459
+ dropdown: 1e3,
460
+ sticky: 1100,
461
+ banner: 1200,
462
+ overlay: 1300,
463
+ modal: 1400,
464
+ popover: 1500,
465
+ skipLink: 1600,
466
+ toast: 1700,
467
+ tooltip: 1800
468
+ }
469
+ };
470
+
471
+ // src/styles/use-styles.ts
472
+ var mSecondsToCssSeconds = (mSeconds) => `${(mSeconds / 1e3).toFixed(2)}s`;
473
+ var stylesFactory = (theme) => {
474
+ const { colors, font, size, border } = tokens;
475
+ const { fontFamily, size: fontSize } = font;
476
+ const css2 = goober.css;
477
+ const t = (light, dark) => theme === "light" ? light : dark;
478
+ return {
479
+ seoTabContainer: css2`
480
+ padding: 0;
481
+ margin: 0 auto;
482
+ background: ${t(colors.white, colors.darkGray[700])};
483
+ border-radius: 8px;
484
+ box-shadow: none;
485
+ overflow-y: auto;
486
+ height: 100%;
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 0;
490
+ width: 100%;
491
+ overflow-y: auto;
492
+ `,
493
+ seoTabTitle: css2`
494
+ font-size: 1.25rem;
495
+ font-weight: 600;
496
+ color: ${t(colors.gray[900], colors.gray[100])};
497
+ margin: 0;
498
+ padding: 1rem 1.5rem 0.5rem 1.5rem;
499
+ text-align: left;
500
+ border-bottom: 1px solid ${t(colors.gray[200], colors.gray[800])};
501
+ `,
502
+ seoTabSection: css2`
503
+ padding: 1.5rem;
504
+ background: ${t(colors.gray[50], colors.darkGray[800])};
505
+ border: 1px solid ${t(colors.gray[200], colors.gray[800])};
506
+ display: flex;
507
+ flex-direction: column;
508
+ gap: 0.5rem;
509
+ margin-bottom: 2rem;
510
+ border-radius: 0.75rem;
511
+ `,
512
+ seoPreviewSection: css2`
513
+ display: flex;
514
+ flex-direction: row;
515
+ gap: 16px;
516
+ margin-bottom: 0;
517
+ justify-content: flex-start;
518
+ align-items: flex-start;
519
+ overflow-x: auto;
520
+ flex-wrap: wrap;
521
+ padding-bottom: 0.5rem;
522
+ `,
523
+ seoPreviewCard: css2`
524
+ border: 1px solid ${t(colors.gray[200], colors.gray[800])};
525
+ border-radius: 8px;
526
+ padding: 12px 10px;
527
+ background: ${t(colors.white, colors.darkGray[900])};
528
+ margin-bottom: 0;
529
+ box-shadow: 0 1px 3px ${t("rgba(0,0,0,0.05)", "rgba(0,0,0,0.1)")};
530
+ display: flex;
531
+ flex-direction: column;
532
+ align-items: flex-start;
533
+ min-width: 200px;
534
+ max-width: 240px;
535
+ font-size: 0.95rem;
536
+ gap: 4px;
537
+ `,
538
+ seoPreviewHeader: css2`
539
+ font-size: 0.875rem;
540
+ font-weight: 600;
541
+ margin-bottom: 0;
542
+ color: ${t(colors.gray[700], colors.gray[300])};
543
+ `,
544
+ seoPreviewImage: css2`
545
+ max-width: 100%;
546
+ border-radius: 6px;
547
+ margin-bottom: 6px;
548
+ box-shadow: 0 1px 2px ${t("rgba(0,0,0,0.03)", "rgba(0,0,0,0.06)")};
549
+ height: 160px;
550
+ object-fit: cover;
551
+ `,
552
+ seoPreviewTitle: css2`
553
+ font-size: 0.9rem;
554
+ font-weight: 600;
555
+ margin-bottom: 4px;
556
+ color: ${t(colors.gray[900], colors.gray[100])};
557
+ `,
558
+ seoPreviewDesc: css2`
559
+ color: ${t(colors.gray[600], colors.gray[400])};
560
+ margin-bottom: 4px;
561
+ font-size: 0.8rem;
562
+ `,
563
+ seoPreviewUrl: css2`
564
+ color: ${t(colors.gray[500], colors.gray[500])};
565
+ font-size: 0.75rem;
566
+ margin-bottom: 0;
567
+ word-break: break-all;
568
+ `,
569
+ seoMissingTagsSection: css2`
570
+ margin-top: 4px;
571
+ font-size: 0.875rem;
572
+ color: ${t(colors.red[500], colors.red[400])};
573
+ `,
574
+ seoMissingTagsList: css2`
575
+ margin: 4px 0 0 0;
576
+ padding: 0;
577
+ list-style: none;
578
+ display: flex;
579
+ flex-wrap: wrap;
580
+ gap: 4px;
581
+ max-width: 240px;
582
+ `,
583
+ seoMissingTag: css2`
584
+ background: ${t(colors.red[100], colors.red[500] + "22")};
585
+ color: ${t(colors.red[700], colors.red[500])};
586
+ border-radius: 3px;
587
+ padding: 2px 6px;
588
+ font-size: 0.75rem;
589
+ font-weight: 500;
590
+ `,
591
+ seoAllTagsFound: css2`
592
+ color: ${t(colors.green[700], colors.green[500])};
593
+ font-weight: 500;
594
+ margin-left: 0;
595
+ padding: 0 10px 8px 10px;
596
+ font-size: 0.875rem;
597
+ `,
598
+ devtoolsPanelContainer: (panelLocation, isDetached) => css2`
599
+ direction: ltr;
600
+ position: fixed;
601
+ overflow-y: hidden;
602
+ overflow-x: hidden;
603
+ ${panelLocation}: 0;
604
+ right: 0;
605
+ z-index: 99999;
606
+ width: 100%;
607
+ ${isDetached ? "" : "max-height: 90%;"}
608
+ border-top: 1px solid ${t(colors.gray[200], colors.gray[800])};
609
+ transform-origin: top;
610
+ `,
611
+ devtoolsPanelContainerVisibility: (isOpen) => {
612
+ return css2`
613
+ visibility: ${isOpen ? "visible" : "hidden"};
614
+ height: ${isOpen ? "auto" : "0"};
615
+ `;
616
+ },
617
+ devtoolsPanelContainerResizing: (isResizing) => {
618
+ if (isResizing()) {
619
+ return css2`
620
+ transition: none;
621
+ `;
622
+ }
623
+ return css2`
624
+ transition: all 0.4s ease;
625
+ `;
626
+ },
627
+ devtoolsPanelContainerAnimation: (isOpen, height, panelLocation) => {
628
+ if (isOpen) {
629
+ return css2`
630
+ pointer-events: auto;
631
+ transform: translateY(0);
632
+ `;
633
+ }
634
+ return css2`
635
+ pointer-events: none;
636
+ transform: translateY(${panelLocation === "top" ? -height : height}px);
637
+ `;
638
+ },
639
+ devtoolsPanel: css2`
640
+ display: flex;
641
+ font-size: ${fontSize.sm};
642
+ font-family: ${fontFamily.sans};
643
+ background-color: ${t(colors.white, colors.darkGray[700])};
644
+ color: ${t(colors.gray[900], colors.gray[300])};
645
+ width: w-screen;
646
+ flex-direction: row;
647
+ overflow-x: hidden;
648
+ overflow-y: hidden;
649
+ height: 100%;
650
+ `,
651
+ dragHandle: (panelLocation) => css2`
652
+ position: absolute;
653
+ left: 0;
654
+ ${panelLocation === "bottom" ? "top" : "bottom"}: 0;
655
+ width: 100%;
656
+ height: 4px;
657
+ cursor: row-resize;
658
+ user-select: none;
659
+ z-index: 100000;
660
+ &:hover {
661
+ background-color: ${t(colors.gray[400], colors.gray[500])};
662
+ }
663
+ `,
664
+ mainCloseBtn: css2`
665
+ background: transparent;
666
+ position: fixed;
667
+ z-index: 99999;
668
+ display: inline-flex;
669
+ width: fit-content;
670
+ cursor: pointer;
671
+ appearance: none;
672
+ border: 0;
673
+ align-items: center;
674
+ padding: 0;
675
+ font-size: ${font.size.xs};
676
+ cursor: pointer;
677
+ transition: all 0.25s ease-out;
678
+ & > img {
679
+ width: 56px;
680
+ height: 56px;
681
+ transition: all 0.3s ease;
682
+ outline-offset: 2px;
683
+ border-radius: ${border.radius.full};
684
+ outline: 2px solid transparent;
685
+ }
686
+ &:hide-until-hover {
687
+ opacity: 0;
688
+ pointer-events: none;
689
+ visibility: hidden;
690
+ }
691
+ &:hide-until-hover:hover {
692
+ opacity: 1;
693
+ pointer-events: auto;
694
+ visibility: visible;
695
+ }
696
+ & > img:focus-visible,
697
+ img:hover {
698
+ outline: 2px solid ${t(colors.black, colors.black)};
699
+ }
700
+ `,
701
+ mainCloseBtnPosition: (position) => {
702
+ const base = css2`
703
+ ${position === "top-left" ? `top: ${size[2]}; left: ${size[2]};` : ""}
704
+ ${position === "top-right" ? `top: ${size[2]}; right: ${size[2]};` : ""}
705
+ ${position === "middle-left" ? `top: 50%; left: ${size[2]}; transform: translateY(-50%);` : ""}
706
+ ${position === "middle-right" ? `top: 50%; right: ${size[2]}; transform: translateY(-50%);` : ""}
707
+ ${position === "bottom-left" ? `bottom: ${size[2]}; left: ${size[2]};` : ""}
708
+ ${position === "bottom-right" ? `bottom: ${size[2]}; right: ${size[2]};` : ""}
709
+ `;
710
+ return base;
711
+ },
712
+ mainCloseBtnAnimation: (isOpen, hideUntilHover) => {
713
+ if (!isOpen) {
714
+ return hideUntilHover ? css2`
715
+ opacity: 0;
716
+
717
+ &:hover {
718
+ opacity: 1;
719
+ pointer-events: auto;
720
+ visibility: visible;
721
+ }
722
+ ` : css2`
723
+ opacity: 1;
724
+ pointer-events: auto;
725
+ visibility: visible;
726
+ `;
727
+ }
728
+ return css2`
729
+ opacity: 0;
730
+ pointer-events: none;
731
+ visibility: hidden;
732
+ `;
733
+ },
734
+ tabContainer: css2`
735
+ display: flex;
736
+ flex-direction: column;
737
+ align-items: center;
738
+ justify-content: flex-start;
739
+ height: 100%;
740
+ background-color: ${t(colors.gray[50], colors.darkGray[900])};
741
+ border-right: 1px solid ${t(colors.gray[200], colors.gray[800])};
742
+ box-shadow: none;
743
+ position: relative;
744
+ width: ${size[10]};
745
+ `,
746
+ tab: css2`
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: center;
750
+ width: 100%;
751
+ height: ${size[10]};
752
+ cursor: pointer;
753
+ font-size: ${fontSize.sm};
754
+ font-family: ${fontFamily.sans};
755
+ color: ${t(colors.gray[600], colors.gray[400])};
756
+ background-color: transparent;
757
+ border: none;
758
+ transition: all 0.15s ease;
759
+ border-left: 2px solid transparent;
760
+ &:hover:not(.close):not(.active):not(.detach) {
761
+ background-color: ${t(colors.gray[100], colors.gray[800])};
762
+ color: ${t(colors.gray[900], colors.gray[100])};
763
+ border-left: 2px solid ${t(colors.gray[900], colors.gray[100])};
764
+ }
765
+ &.active {
766
+ background-color: ${t(colors.gray[100], colors.gray[800])};
767
+ color: ${t(colors.gray[900], colors.gray[100])};
768
+ border-left: 2px solid ${t(colors.gray[900], colors.gray[100])};
769
+ }
770
+ &.detach {
771
+ &:hover {
772
+ background-color: ${t(colors.gray[100], colors.gray[800])};
773
+ }
774
+ &:hover {
775
+ color: ${t(colors.green[700], colors.green[500])};
776
+ }
777
+ }
778
+ &.close {
779
+ margin-top: auto;
780
+ &:hover {
781
+ background-color: ${t(colors.gray[100], colors.gray[800])};
782
+ }
783
+ &:hover {
784
+ color: ${t(colors.red[700], colors.red[500])};
785
+ }
786
+ }
787
+ &.disabled {
788
+ cursor: not-allowed;
789
+ opacity: 0.2;
790
+ pointer-events: none;
791
+ }
792
+ &.disabled:hover {
793
+ background-color: transparent;
794
+ color: ${colors.gray[300]};
795
+ }
796
+ `,
797
+ tabContent: css2`
798
+ transition: all 0.2s ease-in-out;
799
+ width: 100%;
800
+ height: 100%;
801
+ `,
802
+ pluginsTabPanel: css2`
803
+ display: flex;
804
+ flex-direction: row;
805
+ width: 100%;
806
+ height: 100%;
807
+ overflow: hidden;
808
+ `,
809
+ pluginsTabDraw: (isExpanded) => css2`
810
+ width: ${isExpanded ? size[48] : 0};
811
+ height: 100%;
812
+ background-color: ${t(colors.white, colors.darkGray[900])};
813
+ box-shadow: none;
814
+ ${isExpanded ? `border-right: 1px solid ${t(colors.gray[200], colors.gray[800])};` : ""}
815
+ `,
816
+ pluginsTabDrawExpanded: css2`
817
+ width: ${size[48]};
818
+ border-right: 1px solid ${t(colors.gray[200], colors.gray[800])};
819
+ `,
820
+ pluginsTabDrawTransition: (mSeconds) => {
821
+ return css2`
822
+ transition: width ${mSecondsToCssSeconds(mSeconds)} ease;
823
+ `;
824
+ },
825
+ pluginsTabSidebar: (isExpanded) => css2`
826
+ width: ${size[48]};
827
+ overflow-y: auto;
828
+ transform: ${isExpanded ? "translateX(0)" : "translateX(-100%)"};
829
+ display: flex;
830
+ flex-direction: column;
831
+ `,
832
+ pluginsTabSidebarTransition: (mSeconds) => {
833
+ return css2`
834
+ transition: transform ${mSecondsToCssSeconds(mSeconds)} ease;
835
+ `;
836
+ },
837
+ pluginsList: css2`
838
+ flex: 1;
839
+ overflow-y: auto;
840
+ `,
841
+ pluginName: css2`
842
+ font-size: ${fontSize.xs};
843
+ font-family: ${fontFamily.sans};
844
+ color: ${t(colors.gray[600], colors.gray[400])};
845
+ padding: ${size[2]};
846
+ cursor: pointer;
847
+ text-align: center;
848
+ transition: all 0.15s ease;
849
+ border-left: 2px solid transparent;
850
+
851
+ &:hover {
852
+ background-color: ${t(colors.gray[100], colors.gray[800])};
853
+ color: ${t(colors.gray[900], colors.gray[100])};
854
+ padding: ${size[2]};
855
+ }
856
+ &.active {
857
+ background-color: ${t(colors.gray[100], colors.gray[800])};
858
+ color: ${t(colors.gray[900], colors.gray[100])};
859
+ border-left: 2px solid ${t(colors.gray[900], colors.gray[100])};
860
+ }
861
+ &.active:hover {
862
+ background-color: ${t(colors.gray[200], colors.gray[700])};
863
+ }
864
+ `,
865
+ pluginsTabContent: css2`
866
+ width: 100%;
867
+ height: 100%;
868
+ overflow-y: auto;
869
+
870
+ &:not(:last-child) {
871
+ border-right: 5px solid ${t(colors.purple[200], colors.purple[800])};
872
+ }
873
+ `,
874
+ settingsGroup: css2`
875
+ display: flex;
876
+ flex-direction: column;
877
+ gap: 0.75rem;
878
+ `,
879
+ conditionalSetting: css2`
880
+ margin-left: 1.5rem;
881
+ padding-left: 1rem;
882
+ border-left: 2px solid ${t(colors.gray[300], colors.gray[600])};
883
+ background-color: ${t(colors.gray[50], colors.darkGray[900])};
884
+ padding: 0.75rem;
885
+ border-radius: 0.375rem;
886
+ margin-top: 0.5rem;
887
+ `,
888
+ settingRow: css2`
889
+ display: grid;
890
+ grid-template-columns: 1fr 1fr;
891
+ gap: 1rem;
892
+
893
+ @media (max-width: 768px) {
894
+ grid-template-columns: 1fr;
895
+ }
896
+ `,
897
+ settingsModifiers: css2`
898
+ display: flex;
899
+ gap: 0.5rem;
900
+ `,
901
+ // No Plugins Fallback Styles
902
+ noPluginsFallback: css2`
903
+ display: flex;
904
+ align-items: center;
905
+ justify-content: center;
906
+ min-height: 400px;
907
+ padding: 2rem;
908
+ background: ${t(colors.gray[50], colors.darkGray[700])};
909
+ width: 100%;
910
+ height: 100%;
911
+ `,
912
+ noPluginsFallbackContent: css2`
913
+ max-width: 600px;
914
+ text-align: center;
915
+ display: flex;
916
+ flex-direction: column;
917
+ align-items: center;
918
+ gap: 1rem;
919
+ `,
920
+ noPluginsFallbackIcon: css2`
921
+ width: 64px;
922
+ height: 64px;
923
+ color: ${t(colors.gray[400], colors.gray[600])};
924
+ margin-bottom: 0.5rem;
925
+
926
+ svg {
927
+ width: 100%;
928
+ height: 100%;
929
+ }
930
+ `,
931
+ noPluginsFallbackTitle: css2`
932
+ font-size: 1.5rem;
933
+ font-weight: 600;
934
+ color: ${t(colors.gray[900], colors.gray[100])};
935
+ margin: 0;
936
+ `,
937
+ noPluginsFallbackDescription: css2`
938
+ font-size: 0.95rem;
939
+ color: ${t(colors.gray[600], colors.gray[400])};
940
+ line-height: 1.5;
941
+ margin: 0;
942
+ `,
943
+ noPluginsSuggestions: css2`
944
+ width: 100%;
945
+ margin-top: 1.5rem;
946
+ padding: 1.5rem;
947
+ background: ${t(colors.white, colors.darkGray[800])};
948
+ border: 1px solid ${t(colors.gray[200], colors.gray[700])};
949
+ border-radius: 0.5rem;
950
+ `,
951
+ noPluginsSuggestionsTitle: css2`
952
+ font-size: 1.125rem;
953
+ font-weight: 600;
954
+ color: ${t(colors.gray[900], colors.gray[100])};
955
+ margin: 0 0 0.5rem 0;
956
+ `,
957
+ noPluginsSuggestionsDesc: css2`
958
+ font-size: 0.875rem;
959
+ color: ${t(colors.gray[600], colors.gray[400])};
960
+ margin: 0 0 1rem 0;
961
+ `,
962
+ noPluginsSuggestionsList: css2`
963
+ display: flex;
964
+ flex-direction: column;
965
+ gap: 0.75rem;
966
+ `,
967
+ noPluginsSuggestionCard: css2`
968
+ display: flex;
969
+ align-items: center;
970
+ justify-content: space-between;
971
+ padding: 1rem;
972
+ background: ${t(colors.gray[50], colors.darkGray[900])};
973
+ border: 1px solid ${t(colors.gray[200], colors.gray[700])};
974
+ border-radius: 0.375rem;
975
+ transition: all 0.15s ease;
976
+
977
+ &:hover {
978
+ border-color: ${t(colors.gray[300], colors.gray[600])};
979
+ background: ${t(colors.gray[100], colors.darkGray[800])};
980
+ }
981
+ `,
982
+ noPluginsSuggestionInfo: css2`
983
+ display: flex;
984
+ flex-direction: column;
985
+ align-items: flex-start;
986
+ gap: 0.25rem;
987
+ flex: 1;
988
+ `,
989
+ noPluginsSuggestionPackage: css2`
990
+ font-size: 0.95rem;
991
+ font-weight: 600;
992
+ color: ${t(colors.gray[900], colors.gray[100])};
993
+ margin: 0;
994
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
995
+ `,
996
+ noPluginsSuggestionSource: css2`
997
+ font-size: 0.8rem;
998
+ color: ${t(colors.gray[500], colors.gray[500])};
999
+ margin: 0;
1000
+ `,
1001
+ noPluginsSuggestionStatus: css2`
1002
+ display: flex;
1003
+ align-items: center;
1004
+ gap: 0.5rem;
1005
+ color: ${t(colors.green[600], colors.green[400])};
1006
+
1007
+ svg {
1008
+ width: 18px;
1009
+ height: 18px;
1010
+ }
1011
+ `,
1012
+ noPluginsSuggestionStatusText: css2`
1013
+ font-size: 0.875rem;
1014
+ font-weight: 500;
1015
+ `,
1016
+ noPluginsSuggestionStatusTextError: css2`
1017
+ font-size: 0.875rem;
1018
+ font-weight: 500;
1019
+ color: ${t(colors.red[600], colors.red[400])};
1020
+ `,
1021
+ noPluginsEmptyState: css2`
1022
+ margin-top: 1.5rem;
1023
+ padding: 1.5rem;
1024
+ background: ${t(colors.white, colors.darkGray[800])};
1025
+ border: 1px solid ${t(colors.gray[200], colors.gray[700])};
1026
+ border-radius: 0.5rem;
1027
+ `,
1028
+ noPluginsEmptyStateText: css2`
1029
+ font-size: 0.875rem;
1030
+ color: ${t(colors.gray[600], colors.gray[400])};
1031
+ margin: 0;
1032
+ line-height: 1.5;
1033
+ `,
1034
+ noPluginsFallbackLinks: css2`
1035
+ display: flex;
1036
+ align-items: center;
1037
+ gap: 0.75rem;
1038
+ margin-top: 1.5rem;
1039
+ `,
1040
+ noPluginsFallbackLink: css2`
1041
+ font-size: 0.875rem;
1042
+ color: ${t(colors.gray[700], colors.gray[300])};
1043
+ text-decoration: none;
1044
+ transition: color 0.15s ease;
1045
+
1046
+ &:hover {
1047
+ color: ${t(colors.gray[900], colors.gray[100])};
1048
+ text-decoration: underline;
1049
+ }
1050
+ `,
1051
+ noPluginsFallbackLinkSeparator: css2`
1052
+ color: ${t(colors.gray[400], colors.gray[600])};
1053
+ `,
1054
+ // Plugin Marketplace Styles (for "Add More" tab)
1055
+ pluginMarketplace: css2`
1056
+ width: 100%;
1057
+ overflow-y: auto;
1058
+ padding: 2rem;
1059
+ background: ${t(
1060
+ "linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%)",
1061
+ "linear-gradient(135deg, #1a1d23 0%, #13161a 100%)"
1062
+ )};
1063
+ animation: fadeIn 0.3s ease;
1064
+
1065
+ @keyframes fadeIn {
1066
+ from {
1067
+ opacity: 0;
1068
+ transform: translateY(10px);
1069
+ }
1070
+ to {
1071
+ opacity: 1;
1072
+ transform: translateY(0);
1073
+ }
1074
+ }
1075
+ `,
1076
+ pluginMarketplaceHeader: css2`
1077
+ margin-bottom: 2rem;
1078
+ padding-bottom: 1rem;
1079
+ border-bottom: 2px solid ${t(colors.gray[200], colors.gray[700])};
1080
+ `,
1081
+ pluginMarketplaceTitleRow: css2`
1082
+ display: flex;
1083
+ align-items: center;
1084
+ justify-content: space-between;
1085
+ gap: 2rem;
1086
+ margin-bottom: 0.5rem;
1087
+ `,
1088
+ pluginMarketplaceTitle: css2`
1089
+ font-size: 1.5rem;
1090
+ font-weight: 700;
1091
+ color: ${t(colors.gray[900], colors.gray[100])};
1092
+ margin: 0;
1093
+ letter-spacing: -0.02em;
1094
+ `,
1095
+ pluginMarketplaceDescription: css2`
1096
+ font-size: 0.95rem;
1097
+ color: ${t(colors.gray[600], colors.gray[400])};
1098
+ margin: 0 0 1rem 0;
1099
+ line-height: 1.5;
1100
+ `,
1101
+ pluginMarketplaceSearchWrapper: css2`
1102
+ position: relative;
1103
+ display: flex;
1104
+ align-items: center;
1105
+ max-width: 400px;
1106
+ flex-shrink: 0;
1107
+
1108
+ svg {
1109
+ position: absolute;
1110
+ left: 1rem;
1111
+ color: ${t(colors.gray[400], colors.gray[500])};
1112
+ pointer-events: none;
1113
+ }
1114
+ `,
1115
+ pluginMarketplaceSearch: css2`
1116
+ width: 100%;
1117
+ padding: 0.75rem 1rem 0.75rem 2.75rem;
1118
+ background: ${t(colors.gray[50], colors.darkGray[900])};
1119
+ border: 2px solid ${t(colors.gray[200], colors.gray[700])};
1120
+ border-radius: 0.5rem;
1121
+ color: ${t(colors.gray[900], colors.gray[100])};
1122
+ font-size: 0.875rem;
1123
+ font-family: ${fontFamily.sans};
1124
+ transition: all 0.2s ease;
1125
+
1126
+ &::placeholder {
1127
+ color: ${t(colors.gray[400], colors.gray[500])};
1128
+ }
1129
+
1130
+ &:focus {
1131
+ outline: none;
1132
+ border-color: ${t(colors.blue[500], colors.blue[400])};
1133
+ background: ${t(colors.white, colors.darkGray[800])};
1134
+ box-shadow: 0 0 0 3px
1135
+ ${t("rgba(59, 130, 246, 0.1)", "rgba(96, 165, 250, 0.1)")};
1136
+ }
1137
+ `,
1138
+ pluginMarketplaceFilters: css2`
1139
+ margin-top: 1.5rem;
1140
+ padding-top: 1rem;
1141
+ `,
1142
+ pluginMarketplaceTagsContainer: css2`
1143
+ display: flex;
1144
+ flex-wrap: wrap;
1145
+ gap: 0.5rem;
1146
+ margin-top: 1.5rem;
1147
+ padding: 1rem;
1148
+ background: ${t(colors.gray[50], colors.darkGray[800])};
1149
+ border: 1px solid ${t(colors.gray[200], colors.gray[700])};
1150
+ border-radius: 0.5rem;
1151
+ `,
1152
+ pluginMarketplaceTagButton: css2`
1153
+ padding: 0.5rem 1rem;
1154
+ font-size: 0.875rem;
1155
+ font-weight: 500;
1156
+ background: ${t(colors.white, colors.darkGray[700])};
1157
+ border: 2px solid ${t(colors.gray[300], colors.gray[600])};
1158
+ border-radius: 0.375rem;
1159
+ color: ${t(colors.gray[700], colors.gray[300])};
1160
+ cursor: pointer;
1161
+ transition: all 0.15s ease;
1162
+
1163
+ &:hover {
1164
+ background: ${t(colors.gray[100], colors.darkGray[600])};
1165
+ border-color: ${t(colors.gray[400], colors.gray[500])};
1166
+ color: ${t(colors.gray[900], colors.gray[100])};
1167
+ }
1168
+ `,
1169
+ pluginMarketplaceTagButtonActive: css2`
1170
+ background: ${t(
1171
+ "linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)",
1172
+ "linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%)"
1173
+ )} !important;
1174
+ border-color: ${t("#2563eb", "#3b82f6")} !important;
1175
+ color: white !important;
1176
+
1177
+ &:hover {
1178
+ background: ${t(
1179
+ "linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%)",
1180
+ "linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)"
1181
+ )} !important;
1182
+ border-color: ${t("#1d4ed8", "#2563eb")} !important;
1183
+ }
1184
+ `,
1185
+ pluginMarketplaceSettingsButton: css2`
1186
+ display: flex;
1187
+ align-items: center;
1188
+ justify-content: center;
1189
+ padding: 0.75rem;
1190
+ background: ${t(colors.gray[100], colors.darkGray[800])};
1191
+ border: 2px solid ${t(colors.gray[200], colors.gray[700])};
1192
+ border-radius: 0.5rem;
1193
+ color: ${t(colors.gray[700], colors.gray[300])};
1194
+ cursor: pointer;
1195
+ transition: all 0.2s ease;
1196
+ margin-left: 0.5rem;
1197
+
1198
+ &:hover {
1199
+ background: ${t(colors.gray[200], colors.darkGray[700])};
1200
+ border-color: ${t(colors.gray[300], colors.gray[600])};
1201
+ color: ${t(colors.gray[900], colors.gray[100])};
1202
+ }
1203
+
1204
+ &:active {
1205
+ transform: scale(0.95);
1206
+ }
1207
+ `,
1208
+ pluginMarketplaceSettingsPanel: css2`
1209
+ position: fixed;
1210
+ top: 0;
1211
+ right: 0;
1212
+ bottom: 0;
1213
+ width: 350px;
1214
+ background: ${t(colors.white, colors.darkGray[800])};
1215
+ border-left: 1px solid ${t(colors.gray[200], colors.gray[700])};
1216
+ box-shadow: -4px 0 12px ${t("rgba(0, 0, 0, 0.1)", "rgba(0, 0, 0, 0.4)")};
1217
+ z-index: 1000;
1218
+ display: flex;
1219
+ flex-direction: column;
1220
+ animation: slideInRight 0.3s ease;
1221
+
1222
+ @keyframes slideInRight {
1223
+ from {
1224
+ transform: translateX(100%);
1225
+ }
1226
+ to {
1227
+ transform: translateX(0);
1228
+ }
1229
+ }
1230
+ `,
1231
+ pluginMarketplaceSettingsPanelHeader: css2`
1232
+ display: flex;
1233
+ align-items: center;
1234
+ justify-content: space-between;
1235
+ padding: 1.5rem;
1236
+ border-bottom: 1px solid ${t(colors.gray[200], colors.gray[700])};
1237
+ `,
1238
+ pluginMarketplaceSettingsPanelTitle: css2`
1239
+ font-size: 1.125rem;
1240
+ font-weight: 600;
1241
+ color: ${t(colors.gray[900], colors.gray[100])};
1242
+ margin: 0;
1243
+ `,
1244
+ pluginMarketplaceSettingsPanelClose: css2`
1245
+ display: flex;
1246
+ align-items: center;
1247
+ justify-content: center;
1248
+ padding: 0.5rem;
1249
+ background: transparent;
1250
+ border: none;
1251
+ color: ${t(colors.gray[600], colors.gray[400])};
1252
+ cursor: pointer;
1253
+ border-radius: 0.375rem;
1254
+ transition: all 0.15s ease;
1255
+
1256
+ &:hover {
1257
+ background: ${t(colors.gray[100], colors.darkGray[700])};
1258
+ color: ${t(colors.gray[900], colors.gray[100])};
1259
+ }
1260
+ `,
1261
+ pluginMarketplaceSettingsPanelContent: css2`
1262
+ flex: 1;
1263
+ padding: 1.5rem;
1264
+ overflow-y: auto;
1265
+ `,
1266
+ pluginMarketplaceGrid: css2`
1267
+ display: grid;
1268
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
1269
+ gap: 1.25rem;
1270
+ animation: slideUp 0.4s ease;
1271
+
1272
+ @keyframes slideUp {
1273
+ from {
1274
+ opacity: 0;
1275
+ transform: translateY(20px);
1276
+ }
1277
+ to {
1278
+ opacity: 1;
1279
+ transform: translateY(0);
1280
+ }
1281
+ }
1282
+ `,
1283
+ pluginMarketplaceCard: css2`
1284
+ background: ${t(colors.white, colors.darkGray[800])};
1285
+ border: 2px solid ${t(colors.gray[200], colors.gray[700])};
1286
+ border-radius: 0.75rem;
1287
+ padding: 1.5rem;
1288
+ display: flex;
1289
+ flex-direction: column;
1290
+ gap: 1rem;
1291
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1292
+ position: relative;
1293
+ overflow: hidden;
1294
+
1295
+ &::before {
1296
+ content: '';
1297
+ position: absolute;
1298
+ top: 0;
1299
+ left: 0;
1300
+ right: 0;
1301
+ height: 3px;
1302
+ background: ${t(
1303
+ "linear-gradient(90deg, #3b82f6 0%, #8b5cf6 100%)",
1304
+ "linear-gradient(90deg, #60a5fa 0%, #a78bfa 100%)"
1305
+ )};
1306
+ transform: scaleX(0);
1307
+ transform-origin: left;
1308
+ transition: transform 0.25s ease;
1309
+ }
1310
+
1311
+ &:hover {
1312
+ border-color: ${t(colors.gray[400], colors.gray[500])};
1313
+ box-shadow: 0 8px 24px ${t("rgba(0,0,0,0.1)", "rgba(0,0,0,0.4)")};
1314
+ transform: translateY(-4px);
1315
+
1316
+ &::before {
1317
+ transform: scaleX(1);
1318
+ }
1319
+ }
1320
+ `,
1321
+ pluginMarketplaceCardIcon: css2`
1322
+ width: 40px;
1323
+ height: 40px;
1324
+ display: flex;
1325
+ align-items: center;
1326
+ justify-content: center;
1327
+ background: ${t(
1328
+ "linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%)",
1329
+ "linear-gradient(135deg, #60a5fa 0%, #a78bfa 100%)"
1330
+ )};
1331
+ border-radius: 0.5rem;
1332
+ color: white;
1333
+ transition: transform 0.25s ease;
1334
+
1335
+ svg {
1336
+ width: 20px;
1337
+ height: 20px;
1338
+ }
1339
+
1340
+ &.custom-logo {
1341
+ }
1342
+ `,
1343
+ pluginMarketplaceCardHeader: css2`
1344
+ flex: 1;
1345
+ `,
1346
+ pluginMarketplaceCardTitle: css2`
1347
+ font-size: 0.95rem;
1348
+ font-weight: 600;
1349
+ color: ${t(colors.gray[900], colors.gray[100])};
1350
+ margin: 0 0 0.5rem 0;
1351
+ line-height: 1.4;
1352
+ `,
1353
+ pluginMarketplaceCardDescription: css2`
1354
+ font-size: 0.8rem;
1355
+ color: ${t(colors.gray[500], colors.gray[500])};
1356
+ margin: 0;
1357
+ padding: 0;
1358
+ background: transparent;
1359
+ border-radius: 0.375rem;
1360
+ display: block;
1361
+ font-weight: 500;
1362
+ `,
1363
+ pluginMarketplaceCardPackageBadge: css2`
1364
+ margin-top: 4px;
1365
+ margin-bottom: 8px;
1366
+ font-size: 0.6875rem;
1367
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1368
+ opacity: 0.6;
1369
+ padding: 4px 8px;
1370
+ padding-left: 0;
1371
+ background-color: var(--bg-tertiary);
1372
+ border-radius: 4px;
1373
+ word-break: break-all;
1374
+ display: inline-block;
1375
+ `,
1376
+ pluginMarketplaceCardDescriptionText: css2`
1377
+ line-height: 1.5;
1378
+ margin-top: 0;
1379
+ `,
1380
+ pluginMarketplaceCardVersionInfo: css2`
1381
+ margin-top: 8px;
1382
+ font-size: 0.6875rem;
1383
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1384
+ `,
1385
+ pluginMarketplaceCardVersionSatisfied: css2`
1386
+ color: ${t(colors.green[600], colors.green[400])};
1387
+ `,
1388
+ pluginMarketplaceCardVersionUnsatisfied: css2`
1389
+ color: ${t(colors.red[600], colors.red[400])};
1390
+ `,
1391
+ pluginMarketplaceCardDocsLink: css2`
1392
+ display: inline-flex;
1393
+ align-items: center;
1394
+ gap: 0.25rem;
1395
+ font-size: 0.75rem;
1396
+ color: ${t(colors.blue[600], colors.blue[400])};
1397
+ text-decoration: none;
1398
+ margin-top: 0.5rem;
1399
+ transition: color 0.15s ease;
1400
+
1401
+ &:hover {
1402
+ color: ${t(colors.blue[700], colors.blue[300])};
1403
+ text-decoration: underline;
1404
+ }
1405
+
1406
+ svg {
1407
+ width: 12px;
1408
+ height: 12px;
1409
+ }
1410
+ `,
1411
+ pluginMarketplaceCardTags: css2`
1412
+ display: flex;
1413
+ flex-wrap: wrap;
1414
+ gap: 0.375rem;
1415
+ margin-top: 0.75rem;
1416
+ `,
1417
+ pluginMarketplaceCardTag: css2`
1418
+ font-size: 0.6875rem;
1419
+ font-weight: 500;
1420
+ padding: 0.25rem 0.5rem;
1421
+ background: ${t(colors.gray[100], colors.darkGray[700])};
1422
+ border: 1px solid ${t(colors.gray[300], colors.gray[600])};
1423
+ border-radius: 0.25rem;
1424
+ color: ${t(colors.gray[700], colors.gray[300])};
1425
+ `,
1426
+ pluginMarketplaceCardImage: css2`
1427
+ width: 28px;
1428
+ height: 28px;
1429
+ object-fit: contain;
1430
+ `,
1431
+ pluginMarketplaceNewBanner: css2`
1432
+ position: absolute;
1433
+ top: 12px;
1434
+ right: -35px;
1435
+ background-color: ${t(colors.green[500], colors.green[500])};
1436
+ color: white;
1437
+ padding: 4px 40px;
1438
+ font-size: 0.6875rem;
1439
+ font-weight: bold;
1440
+ text-transform: uppercase;
1441
+ transform: rotate(45deg);
1442
+ box-shadow: 0 2px 8px rgba(16, 185, 129, 0.5);
1443
+ z-index: 10;
1444
+ letter-spacing: 0.5px;
1445
+ `,
1446
+ pluginMarketplaceCardFeatured: css2`
1447
+ border-color: ${t(colors.blue[500], colors.blue[400])};
1448
+ border-width: 2px;
1449
+ `,
1450
+ pluginMarketplaceCardActive: css2`
1451
+ border-color: ${t(colors.green[500], colors.green[600])};
1452
+ border-width: 2px;
1453
+
1454
+ &:hover {
1455
+ border-color: ${t(colors.green[500], colors.green[600])};
1456
+ box-shadow: none;
1457
+ transform: none;
1458
+
1459
+ &::before {
1460
+ transform: scaleX(0);
1461
+ }
1462
+ }
1463
+ `,
1464
+ pluginMarketplaceCardStatus: css2`
1465
+ display: flex;
1466
+ align-items: center;
1467
+ gap: 0.5rem;
1468
+ color: ${t(colors.green[600], colors.green[400])};
1469
+ animation: statusFadeIn 0.3s ease;
1470
+
1471
+ @keyframes statusFadeIn {
1472
+ from {
1473
+ opacity: 0;
1474
+ }
1475
+ to {
1476
+ opacity: 1;
1477
+ }
1478
+ }
1479
+
1480
+ svg {
1481
+ width: 18px;
1482
+ height: 18px;
1483
+ animation: iconPop 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
1484
+ }
1485
+
1486
+ @keyframes iconPop {
1487
+ 0% {
1488
+ transform: scale(0);
1489
+ }
1490
+ 50% {
1491
+ transform: scale(1.2);
1492
+ }
1493
+ 100% {
1494
+ transform: scale(1);
1495
+ }
1496
+ }
1497
+ `,
1498
+ pluginMarketplaceCardSpinner: css2`
1499
+ width: 18px;
1500
+ height: 18px;
1501
+ border: 2px solid ${t(colors.gray[200], colors.gray[700])};
1502
+ border-top-color: ${t(colors.blue[600], colors.blue[400])};
1503
+ border-radius: 50%;
1504
+ animation: spin 0.8s linear infinite;
1505
+
1506
+ @keyframes spin {
1507
+ to {
1508
+ transform: rotate(360deg);
1509
+ }
1510
+ }
1511
+ `,
1512
+ pluginMarketplaceCardStatusText: css2`
1513
+ font-size: 0.875rem;
1514
+ font-weight: 600;
1515
+ `,
1516
+ pluginMarketplaceCardStatusTextError: css2`
1517
+ font-size: 0.875rem;
1518
+ font-weight: 600;
1519
+ color: ${t(colors.red[600], colors.red[400])};
1520
+ `,
1521
+ pluginMarketplaceEmpty: css2`
1522
+ padding: 3rem 2rem;
1523
+ text-align: center;
1524
+ background: ${t(colors.white, colors.darkGray[800])};
1525
+ border: 2px dashed ${t(colors.gray[300], colors.gray[700])};
1526
+ border-radius: 0.75rem;
1527
+ animation: fadeIn 0.3s ease;
1528
+ `,
1529
+ pluginMarketplaceEmptyText: css2`
1530
+ font-size: 0.95rem;
1531
+ color: ${t(colors.gray[600], colors.gray[400])};
1532
+ margin: 0;
1533
+ line-height: 1.6;
1534
+ `,
1535
+ // Framework sections
1536
+ pluginMarketplaceSection: css2`
1537
+ margin-bottom: 2.5rem;
1538
+
1539
+ &:last-child {
1540
+ margin-bottom: 0;
1541
+ }
1542
+ `,
1543
+ pluginMarketplaceSectionHeader: css2`
1544
+ margin-bottom: 1rem;
1545
+ padding: 1rem 1.25rem;
1546
+ display: flex;
1547
+ align-items: center;
1548
+ gap: 0.75rem;
1549
+ cursor: pointer;
1550
+ user-select: none;
1551
+ background: ${t(colors.gray[50], colors.darkGray[800])};
1552
+ border: 1px solid ${t(colors.gray[200], colors.gray[700])};
1553
+ border-radius: 0.5rem;
1554
+ transition: all 0.15s ease;
1555
+
1556
+ &:hover {
1557
+ background: ${t(colors.gray[100], colors.darkGray[700])};
1558
+ border-color: ${t(colors.gray[300], colors.gray[600])};
1559
+ }
1560
+ `,
1561
+ pluginMarketplaceSectionHeaderLeft: css2`
1562
+ display: flex;
1563
+ align-items: center;
1564
+ gap: 0.5rem;
1565
+ `,
1566
+ pluginMarketplaceSectionChevron: css2`
1567
+ width: 24px;
1568
+ height: 24px;
1569
+ display: flex;
1570
+ align-items: center;
1571
+ justify-content: center;
1572
+ color: ${t(colors.gray[700], colors.gray[300])};
1573
+ transition: transform 0.2s ease;
1574
+ `,
1575
+ pluginMarketplaceSectionChevronCollapsed: css2`
1576
+ transform: rotate(-90deg);
1577
+ `,
1578
+ pluginMarketplaceSectionTitle: css2`
1579
+ font-size: 1.25rem;
1580
+ font-weight: 700;
1581
+ color: ${t(colors.gray[900], colors.gray[50])};
1582
+ margin: 0;
1583
+ display: flex;
1584
+ align-items: center;
1585
+ gap: 0.5rem;
1586
+ `,
1587
+ pluginMarketplaceSectionBadge: css2`
1588
+ font-size: 0.75rem;
1589
+ font-weight: 600;
1590
+ padding: 0.25rem 0.5rem;
1591
+ background: ${t(
1592
+ "linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)",
1593
+ "linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%)"
1594
+ )};
1595
+ color: white;
1596
+ border-radius: 0.25rem;
1597
+ text-transform: uppercase;
1598
+ letter-spacing: 0.05em;
1599
+ `,
1600
+ pluginMarketplaceCardDisabled: css2`
1601
+ opacity: 0.6;
1602
+ filter: grayscale(0.3);
1603
+ cursor: not-allowed;
1604
+
1605
+ &:hover {
1606
+ transform: none;
1607
+ box-shadow: none;
1608
+ }
1609
+ `,
1610
+ // Card state badges
1611
+ pluginMarketplaceCardBadge: css2`
1612
+ position: absolute;
1613
+ top: 1rem;
1614
+ right: 1rem;
1615
+ padding: 0.25rem 0.5rem;
1616
+ font-size: 0.65rem;
1617
+ font-weight: 600;
1618
+ text-transform: uppercase;
1619
+ border-radius: 0.25rem;
1620
+ letter-spacing: 0.05em;
1621
+ `,
1622
+ pluginMarketplaceCardBadgeInstall: css2`
1623
+ background: ${t(colors.green[100], colors.green[900])};
1624
+ color: ${t(colors.green[700], colors.green[300])};
1625
+ `,
1626
+ pluginMarketplaceCardBadgeAdd: css2`
1627
+ background: ${t(colors.blue[100], colors.blue[900])};
1628
+ color: ${t(colors.blue[700], colors.blue[300])};
1629
+ `,
1630
+ pluginMarketplaceCardBadgeRequires: css2`
1631
+ background: ${t(colors.gray[100], colors.gray[800])};
1632
+ color: ${t(colors.gray[600], colors.gray[400])};
1633
+ `,
1634
+ // Button style for already installed plugins
1635
+ pluginMarketplaceButtonInstalled: css2`
1636
+ opacity: 0.5;
1637
+ `,
1638
+ // Add More Tab Style (visually distinct from regular plugins)
1639
+ pluginNameAddMore: css2`
1640
+ font-size: ${fontSize.xs};
1641
+ font-family: ${fontFamily.sans};
1642
+ color: ${t(colors.gray[600], colors.gray[400])};
1643
+ padding: ${size[3]} ${size[2]};
1644
+ cursor: pointer;
1645
+ text-align: center;
1646
+ transition: all 0.15s ease;
1647
+ border-left: 2px solid transparent;
1648
+ background: ${t(
1649
+ "linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%)",
1650
+ "linear-gradient(135deg, #1f2937 0%, #111827 100%)"
1651
+ )};
1652
+ font-weight: 600;
1653
+ position: relative;
1654
+ margin-top: auto;
1655
+
1656
+ h3 {
1657
+ margin: 0;
1658
+ display: flex;
1659
+ align-items: center;
1660
+ justify-content: center;
1661
+ gap: 0.25rem;
1662
+
1663
+ &::before {
1664
+ content: '✨';
1665
+ font-size: 0.875rem;
1666
+ animation: sparkle 2s ease-in-out infinite;
1667
+ }
1668
+ }
1669
+
1670
+ @keyframes sparkle {
1671
+ 0%,
1672
+ 100% {
1673
+ opacity: 1;
1674
+ transform: scale(1) rotate(0deg);
1675
+ }
1676
+ 50% {
1677
+ opacity: 0.6;
1678
+ transform: scale(1.1) rotate(10deg);
1679
+ }
1680
+ }
1681
+
1682
+ &:hover {
1683
+ background: ${t(
1684
+ "linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%)",
1685
+ "linear-gradient(135deg, #374151 0%, #1f2937 100%)"
1686
+ )};
1687
+ color: ${t(colors.gray[900], colors.gray[100])};
1688
+ border-left-color: ${t(colors.blue[500], colors.blue[400])};
1689
+
1690
+ h3::before {
1691
+ animation: sparkle 0.5s ease-in-out infinite;
1692
+ }
1693
+ }
1694
+
1695
+ &.active {
1696
+ background: ${t(
1697
+ "linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)",
1698
+ "linear-gradient(135deg, #60a5fa 0%, #3b82f6 100%)"
1699
+ )};
1700
+ color: ${t(colors.white, colors.white)};
1701
+ border-left: 2px solid ${t(colors.blue[600], colors.blue[300])};
1702
+ box-shadow: 0 4px 12px
1703
+ ${t("rgba(59, 130, 246, 0.3)", "rgba(96, 165, 250, 0.3)")};
1704
+
1705
+ h3::before {
1706
+ filter: brightness(0) invert(1);
1707
+ }
1708
+ }
1709
+
1710
+ &.active:hover {
1711
+ background: ${t(
1712
+ "linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%)",
1713
+ "linear-gradient(135deg, #3b82f6 0%, #2563eb 100%)"
1714
+ )};
1715
+ }
1716
+ `
1717
+ };
1718
+ };
1719
+ function useStyles() {
1720
+ const { theme } = useTheme();
1721
+ const [styles, setStyles] = createSignal(stylesFactory(theme()));
1722
+ createEffect(() => {
1723
+ setStyles(stylesFactory(theme()));
1724
+ });
1725
+ return styles;
1726
+ }
1727
+
1728
+ // src/components/tanstack-logo.png
1729
+ var tanstack_logo_default = "data:image/png;base64,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";
1730
+
1731
+ // src/components/trigger.tsx
1732
+ var _tmpl$ = ['<button type="button" aria-label="Open TanStack Devtools"', "><img", ' alt="TanStack Devtools"></button>'];
1733
+ var Trigger = ({
1734
+ isOpen,
1735
+ setIsOpen,
1736
+ image = tanstack_logo_default
1737
+ }) => {
1738
+ const {
1739
+ settings
1740
+ } = useDevtoolsSettings();
1741
+ const styles = useStyles();
1742
+ const buttonStyle = createMemo(() => {
1743
+ return clsx3(styles().mainCloseBtn, styles().mainCloseBtnPosition(settings().position), styles().mainCloseBtnAnimation(isOpen(), settings().hideUntilHover));
1744
+ });
1745
+ return createComponent(Show, {
1746
+ get when() {
1747
+ return !settings().triggerHidden;
1748
+ },
1749
+ get children() {
1750
+ return ssr(_tmpl$, ssrAttribute("class", escape(buttonStyle(), true), false), ssrAttribute("src", escape(image, true) || escape(tanstack_logo_default, true), false));
1751
+ }
1752
+ });
1753
+ };
1754
+ var _tmpl$2 = ["<div", ' style="', '"', ">", "</div>"];
1755
+ var MainPanel = (props) => {
1756
+ const styles = useStyles();
1757
+ const {
1758
+ height
1759
+ } = useHeight();
1760
+ const {
1761
+ settings
1762
+ } = useDevtoolsSettings();
1763
+ const pip = usePiPWindow();
1764
+ 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, {
1765
+ animationMs: 400,
1766
+ get children() {
1767
+ return props.children;
1768
+ }
1769
+ })));
1770
+ };
1771
+ var _tmpl$3 = ["<div", ">", "", "</div>"];
1772
+ var _tmpl$22 = ["<div", "></div>"];
1773
+ var ContentPanel = (props) => {
1774
+ const styles = useStyles();
1775
+ const {
1776
+ settings
1777
+ } = useDevtoolsSettings();
1778
+ 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));
1779
+ };
1780
+ var _tmpl$4 = ["<div", ">", "", "", "", "", "</div>"];
1781
+ var _tmpl$23 = ["<div", ">", "</div>"];
1782
+ var _tmpl$32 = ["<div", ">", "", "</div>"];
1783
+ var _tmpl$42 = ["<div", "><div", ">", "</div>", "Final shortcut is: ", "</div>"];
1784
+ var _tmpl$5 = ["<div", "><div", ">", "", "</div></div>"];
1785
+ var SettingsTab = () => {
1786
+ const {
1787
+ setSettings,
1788
+ settings
1789
+ } = useDevtoolsSettings();
1790
+ const styles = useStyles();
1791
+ const hotkey = createMemo(() => settings().openHotkey);
1792
+ const modifiers = ["Control", "Alt", "Meta", "Shift"];
1793
+ const changeHotkey = (newHotkey) => () => {
1794
+ if (hotkey().includes(newHotkey)) {
1795
+ return setSettings({
1796
+ openHotkey: hotkey().filter((key) => key !== newHotkey)
1797
+ });
1798
+ }
1799
+ const existingModifiers = hotkey().filter((key) => modifiers.includes(key));
1800
+ const otherModifiers = hotkey().filter((key) => !modifiers.includes(key));
1801
+ setSettings({
1802
+ openHotkey: [...existingModifiers, newHotkey, ...otherModifiers]
1803
+ });
1804
+ };
1805
+ return createComponent(MainPanel$1, {
1806
+ withPadding: true,
1807
+ get children() {
1808
+ return [createComponent(Section, {
1809
+ get children() {
1810
+ return [createComponent(SectionTitle, {
1811
+ get children() {
1812
+ return [createComponent(SectionIcon, {
1813
+ get children() {
1814
+ return createComponent(SettingsCog, {});
1815
+ }
1816
+ }), "General"];
1817
+ }
1818
+ }), createComponent(SectionDescription, {
1819
+ children: "Configure general behavior of the devtools panel."
1820
+ }), ssr(_tmpl$4, ssrAttribute("class", escape(styles().settingsGroup, true), false), escape(createComponent(Checkbox, {
1821
+ label: "Default open",
1822
+ description: "Automatically open the devtools panel when the page loads",
1823
+ onChange: () => setSettings({
1824
+ defaultOpen: !settings().defaultOpen
1825
+ }),
1826
+ get checked() {
1827
+ return settings().defaultOpen;
1828
+ }
1829
+ })), escape(createComponent(Checkbox, {
1830
+ label: "Hide trigger until hovered",
1831
+ description: "Keep the devtools trigger button hidden until you hover over its area",
1832
+ onChange: () => setSettings({
1833
+ hideUntilHover: !settings().hideUntilHover
1834
+ }),
1835
+ get checked() {
1836
+ return settings().hideUntilHover;
1837
+ }
1838
+ })), escape(createComponent(Checkbox, {
1839
+ label: "Completely hide trigger",
1840
+ description: "Completely removes the trigger from the DOM (you can still open it with the hotkey)",
1841
+ onChange: () => setSettings({
1842
+ triggerHidden: !settings().triggerHidden
1843
+ }),
1844
+ get checked() {
1845
+ return settings().triggerHidden;
1846
+ }
1847
+ })), escape(createComponent(Input, {
1848
+ label: "Trigger Image",
1849
+ description: "Specify the URL of the image to use for the trigger",
1850
+ get value() {
1851
+ return settings().triggerImage;
1852
+ },
1853
+ placeholder: "Default TanStack Logo",
1854
+ onChange: (value) => setSettings({
1855
+ triggerImage: value
1856
+ })
1857
+ })), escape(createComponent(Select, {
1858
+ label: "Theme",
1859
+ description: "Choose the theme for the devtools panel",
1860
+ get value() {
1861
+ return settings().theme;
1862
+ },
1863
+ options: [{
1864
+ label: "Dark",
1865
+ value: "dark"
1866
+ }, {
1867
+ label: "Light",
1868
+ value: "light"
1869
+ }],
1870
+ onChange: (value) => setSettings({
1871
+ theme: value
1872
+ })
1873
+ })))];
1874
+ }
1875
+ }), createComponent(Section, {
1876
+ get children() {
1877
+ return [createComponent(SectionTitle, {
1878
+ get children() {
1879
+ return [createComponent(SectionIcon, {
1880
+ get children() {
1881
+ return createComponent(Link, {});
1882
+ }
1883
+ }), "URL Configuration"];
1884
+ }
1885
+ }), createComponent(SectionDescription, {
1886
+ children: "Control when devtools are available based on URL parameters."
1887
+ }), ssr(_tmpl$32, ssrAttribute("class", escape(styles().settingsGroup, true), false), escape(createComponent(Checkbox, {
1888
+ label: "Require URL Flag",
1889
+ description: "Only show devtools when a specific URL parameter is present",
1890
+ get checked() {
1891
+ return settings().requireUrlFlag;
1892
+ },
1893
+ onChange: (checked) => setSettings({
1894
+ requireUrlFlag: checked
1895
+ })
1896
+ })), escape(createComponent(Show, {
1897
+ get when() {
1898
+ return settings().requireUrlFlag;
1899
+ },
1900
+ get children() {
1901
+ return ssr(_tmpl$23, ssrAttribute("class", escape(styles().conditionalSetting, true), false), escape(createComponent(Input, {
1902
+ label: "URL flag",
1903
+ description: "Enter the URL parameter name (e.g., 'debug' for ?debug=true)",
1904
+ placeholder: "debug",
1905
+ get value() {
1906
+ return settings().urlFlag;
1907
+ },
1908
+ onChange: (e) => setSettings({
1909
+ urlFlag: e
1910
+ })
1911
+ })));
1912
+ }
1913
+ })))];
1914
+ }
1915
+ }), createComponent(Section, {
1916
+ get children() {
1917
+ return [createComponent(SectionTitle, {
1918
+ get children() {
1919
+ return [createComponent(SectionIcon, {
1920
+ get children() {
1921
+ return createComponent(Keyboard, {});
1922
+ }
1923
+ }), "Keyboard"];
1924
+ }
1925
+ }), createComponent(SectionDescription, {
1926
+ children: "Customize keyboard shortcuts for quick access."
1927
+ }), ssr(_tmpl$42, ssrAttribute("class", escape(styles().settingsGroup, true), false), ssrAttribute("class", escape(styles().settingsModifiers, true), false), escape(createComponent(Show, {
1928
+ keyed: true,
1929
+ get when() {
1930
+ return hotkey();
1931
+ },
1932
+ get children() {
1933
+ return [createComponent(Button, {
1934
+ variant: "success",
1935
+ get onclick() {
1936
+ return changeHotkey("Shift");
1937
+ },
1938
+ get outline() {
1939
+ return !hotkey().includes("Shift");
1940
+ },
1941
+ children: "Shift"
1942
+ }), createComponent(Button, {
1943
+ variant: "success",
1944
+ get onclick() {
1945
+ return changeHotkey("Alt");
1946
+ },
1947
+ get outline() {
1948
+ return !hotkey().includes("Alt");
1949
+ },
1950
+ children: "Alt"
1951
+ }), createComponent(Button, {
1952
+ variant: "success",
1953
+ get onclick() {
1954
+ return changeHotkey("Meta");
1955
+ },
1956
+ get outline() {
1957
+ return !hotkey().includes("Meta");
1958
+ },
1959
+ children: "Meta"
1960
+ }), createComponent(Button, {
1961
+ variant: "success",
1962
+ get onclick() {
1963
+ return changeHotkey("Control");
1964
+ },
1965
+ get outline() {
1966
+ return !hotkey().includes("Control");
1967
+ },
1968
+ children: "Control"
1969
+ })];
1970
+ }
1971
+ })), escape(createComponent(Input, {
1972
+ label: "Hotkey to open/close devtools",
1973
+ description: "Use '+' to combine keys (e.g., 'a+b' or 'd'). This will be used with the enabled modifiers from above",
1974
+ placeholder: "a",
1975
+ get value() {
1976
+ return hotkey().filter((key) => !["Shift", "Meta", "Alt", "Ctrl"].includes(key)).join("+");
1977
+ },
1978
+ onChange: (e) => {
1979
+ const makeModifierArray = (key) => {
1980
+ if (key.length === 1) return [uppercaseFirstLetter(key)];
1981
+ const modifiers3 = [];
1982
+ for (const character of key) {
1983
+ const newLetter = uppercaseFirstLetter(character);
1984
+ if (!modifiers3.includes(newLetter)) modifiers3.push(newLetter);
1985
+ }
1986
+ return modifiers3;
1987
+ };
1988
+ const modifiers2 = e.split("+").flatMap((key) => makeModifierArray(key)).filter(Boolean);
1989
+ return setSettings({
1990
+ openHotkey: [...hotkey().filter((key) => ["Shift", "Meta", "Alt", "Ctrl"].includes(key)), ...modifiers2]
1991
+ });
1992
+ }
1993
+ })), escape(hotkey().join(" + ")))];
1994
+ }
1995
+ }), createComponent(Section, {
1996
+ get children() {
1997
+ return [createComponent(SectionTitle, {
1998
+ get children() {
1999
+ return [createComponent(SectionIcon, {
2000
+ get children() {
2001
+ return createComponent(GeoTag, {});
2002
+ }
2003
+ }), "Position"];
2004
+ }
2005
+ }), createComponent(SectionDescription, {
2006
+ children: "Adjust the position of the trigger button and devtools panel."
2007
+ }), ssr(_tmpl$5, ssrAttribute("class", escape(styles().settingsGroup, true), false), ssrAttribute("class", escape(styles().settingRow, true), false), escape(createComponent(Select, {
2008
+ label: "Trigger Position",
2009
+ options: [{
2010
+ label: "Bottom Right",
2011
+ value: "bottom-right"
2012
+ }, {
2013
+ label: "Bottom Left",
2014
+ value: "bottom-left"
2015
+ }, {
2016
+ label: "Top Right",
2017
+ value: "top-right"
2018
+ }, {
2019
+ label: "Top Left",
2020
+ value: "top-left"
2021
+ }, {
2022
+ label: "Middle Right",
2023
+ value: "middle-right"
2024
+ }, {
2025
+ label: "Middle Left",
2026
+ value: "middle-left"
2027
+ }],
2028
+ get value() {
2029
+ return settings().position;
2030
+ },
2031
+ onChange: (value) => setSettings({
2032
+ position: value
2033
+ })
2034
+ })), escape(createComponent(Select, {
2035
+ label: "Panel Position",
2036
+ get value() {
2037
+ return settings().panelLocation;
2038
+ },
2039
+ options: [{
2040
+ label: "Top",
2041
+ value: "top"
2042
+ }, {
2043
+ label: "Bottom",
2044
+ value: "bottom"
2045
+ }],
2046
+ onChange: (value) => setSettings({
2047
+ panelLocation: value
2048
+ })
2049
+ })))];
2050
+ }
2051
+ })];
2052
+ }
2053
+ });
2054
+ };
2055
+
2056
+ // src/tabs/marketplace/card-utils.ts
2057
+ var getButtonText = (card) => {
2058
+ if (card.status === "installing") return "Installing...";
2059
+ if (card.status === "success") return "Installed!";
2060
+ if (card.status === "error") return "Error";
2061
+ switch (card.actionType) {
2062
+ case "install":
2063
+ return "Install";
2064
+ case "install-devtools":
2065
+ return "Install Devtools";
2066
+ case "add-to-devtools":
2067
+ return "Add to Devtools";
2068
+ case "requires-package":
2069
+ return `Requires ${card.requiredPackageName}`;
2070
+ case "wrong-framework":
2071
+ return "Different Framework";
2072
+ case "already-installed":
2073
+ return "Already Installed";
2074
+ case "bump-version":
2075
+ return "Bump Version";
2076
+ case "version-mismatch":
2077
+ return "Version Mismatch";
2078
+ default:
2079
+ return "Install";
2080
+ }
2081
+ };
2082
+ var getButtonVariant = (card) => {
2083
+ if (card.actionType === "requires-package" || card.actionType === "wrong-framework" || card.actionType === "version-mismatch")
2084
+ return "danger";
2085
+ if (card.actionType === "bump-version") return "warning";
2086
+ if (card.actionType === "already-installed") return "secondary";
2087
+ return "primary";
2088
+ };
2089
+ var getBadgeClass = (card, styles) => {
2090
+ const s = styles();
2091
+ const base = s.pluginMarketplaceCardBadge;
2092
+ switch (card.actionType) {
2093
+ case "install":
2094
+ case "install-devtools":
2095
+ return `${base} ${s.pluginMarketplaceCardBadgeInstall}`;
2096
+ case "add-to-devtools":
2097
+ return `${base} ${s.pluginMarketplaceCardBadgeAdd}`;
2098
+ case "already-installed":
2099
+ return `${base} ${s.pluginMarketplaceCardBadgeAdd}`;
2100
+ case "bump-version":
2101
+ return `${base} ${s.pluginMarketplaceCardBadgeRequires}`;
2102
+ case "version-mismatch":
2103
+ return `${base} ${s.pluginMarketplaceCardBadgeRequires}`;
2104
+ case "requires-package":
2105
+ case "wrong-framework":
2106
+ return `${base} ${s.pluginMarketplaceCardBadgeRequires}`;
2107
+ default:
2108
+ return base;
2109
+ }
2110
+ };
2111
+ var getBadgeText = (card) => {
2112
+ switch (card.actionType) {
2113
+ case "install":
2114
+ case "install-devtools":
2115
+ return "Available";
2116
+ case "add-to-devtools":
2117
+ return "Installed";
2118
+ case "already-installed":
2119
+ return "Active";
2120
+ case "version-mismatch":
2121
+ return "Incompatible";
2122
+ case "requires-package":
2123
+ return "Unavailable";
2124
+ case "wrong-framework":
2125
+ return "Other Framework";
2126
+ default:
2127
+ return "";
2128
+ }
2129
+ };
2130
+
2131
+ // src/tabs/marketplace/plugin-card.tsx
2132
+ var _tmpl$6 = ["<div", ">New</div>"];
2133
+ var _tmpl$24 = ["<img", ">"];
2134
+ var _tmpl$33 = ["<span", ">\u2713 v", " \u2022 Min v", "</span>"];
2135
+ var _tmpl$43 = ["<p", ">", "</p>"];
2136
+ var _tmpl$52 = ["<a", ' target="_blank" rel="noopener noreferrer"', ">Documentation ", "</a>"];
2137
+ var _tmpl$62 = ["<div", ">", "</div>"];
2138
+ var _tmpl$7 = ['<div class="', '" style="', '">', "<span", ">", '</span><div class="', '">', "</div><div", "><h3", ">", "</h3><p", ">", "</p><p", ">", "</p>", "", "", "</div>", "</div>"];
2139
+ var _tmpl$8 = ["<span", ">\u26A0\uFE0F v", " \u2022 Requires v", "+</span>"];
2140
+ var _tmpl$9 = ["<span", ">", "</span>"];
2141
+ var _tmpl$0 = ["<div", "></div>"];
2142
+ var _tmpl$1 = ["<span", ">Installing...</span>"];
2143
+ var _tmpl$10 = ["<span", ">Installed!</span>"];
2144
+ var _tmpl$11 = ["<div", ">", "", "", "</div>"];
2145
+ var PluginCardComponent = (props) => {
2146
+ const styles = useStyles();
2147
+ const {
2148
+ card
2149
+ } = props;
2150
+ return ssr(_tmpl$7, `${escape(styles().pluginMarketplaceCard, true) || ""} ${!card.isCurrentFramework && card.actionType !== "already-installed" ? escape(escape(styles().pluginMarketplaceCardDisabled, true), true) : ""} ${!!card.metadata?.featured && card.actionType !== "already-installed" ? escape(escape(styles().pluginMarketplaceCardFeatured, true), true) : ""} ${card.actionType === "already-installed" ? escape(escape(styles().pluginMarketplaceCardActive, true), true) : ""}`, "position:relative", escape(createComponent(Show, {
2151
+ get when() {
2152
+ return card.metadata?.isNew;
2153
+ },
2154
+ get children() {
2155
+ return ssr(_tmpl$6, ssrAttribute("class", escape(styles().pluginMarketplaceNewBanner, true), false));
2156
+ }
2157
+ })), ssrAttribute("class", escape(getBadgeClass(card, styles), true), false), escape(getBadgeText(card)), `${escape(styles().pluginMarketplaceCardIcon, true) || ""} ${!!card.metadata?.logoUrl ? "custom-logo" : ""}`, escape(createComponent(Show, {
2158
+ get when() {
2159
+ return card.metadata?.logoUrl;
2160
+ },
2161
+ get fallback() {
2162
+ return createComponent(PackageIcon, {});
2163
+ },
2164
+ get children() {
2165
+ return ssr(_tmpl$24, ssrAttribute("src", escape(card.metadata?.logoUrl, true), false) + ssrAttribute("alt", escape(card.metadata?.title, true) || escape(card.devtoolsPackage, true), false) + ssrAttribute("class", escape(styles().pluginMarketplaceCardImage, true), false));
2166
+ }
2167
+ })), ssrAttribute("class", escape(styles().pluginMarketplaceCardHeader, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceCardTitle, true), false), escape(card.metadata?.title) || escape(card.devtoolsPackage), ssrAttribute("class", escape(styles().pluginMarketplaceCardPackageBadge, true), false), escape(card.devtoolsPackage), ssrAttribute("class", escape(styles().pluginMarketplaceCardDescriptionText, true), false), card.actionType === "requires-package" ? `Requires ${escape(card.requiredPackageName)}` : card.actionType === "wrong-framework" ? `For different framework projects` : card.actionType === "already-installed" ? `Active in your devtools` : card.actionType === "version-mismatch" ? escape(card.versionInfo?.reason) || "Version incompatible" : escape(card.metadata?.description) || `For ${escape(card.requiredPackageName)}`, escape(createComponent(Show, {
2168
+ get when() {
2169
+ return card.versionInfo;
2170
+ },
2171
+ get children() {
2172
+ return ssr(_tmpl$43, ssrAttribute("class", escape(styles().pluginMarketplaceCardVersionInfo, true), false), escape(createComponent(Show, {
2173
+ get when() {
2174
+ return card.versionInfo?.satisfied;
2175
+ },
2176
+ get fallback() {
2177
+ return ssr(_tmpl$8, ssrAttribute("class", escape(styles().pluginMarketplaceCardVersionUnsatisfied, true), false), escape(card.versionInfo?.current), escape(card.versionInfo?.required));
2178
+ },
2179
+ get children() {
2180
+ return ssr(_tmpl$33, ssrAttribute("class", escape(styles().pluginMarketplaceCardVersionSatisfied, true), false), escape(card.versionInfo?.current), escape(card.versionInfo?.required));
2181
+ }
2182
+ })));
2183
+ }
2184
+ })), escape(createComponent(Show, {
2185
+ get when() {
2186
+ return card.metadata?.docsUrl;
2187
+ },
2188
+ get children() {
2189
+ return ssr(_tmpl$52, ssrAttribute("href", escape(card.metadata?.docsUrl, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceCardDocsLink, true), false), escape(createComponent(ExternalLinkIcon, {})));
2190
+ }
2191
+ })), escape(createComponent(Show, {
2192
+ get when() {
2193
+ return card.metadata?.tags && card.metadata.tags.length > 0;
2194
+ },
2195
+ get children() {
2196
+ return ssr(_tmpl$62, ssrAttribute("class", escape(styles().pluginMarketplaceCardTags, true), false), escape(createComponent(For, {
2197
+ get each() {
2198
+ return card.metadata?.tags;
2199
+ },
2200
+ children: (tag) => ssr(_tmpl$9, ssrAttribute("class", escape(styles().pluginMarketplaceCardTag, true), false), escape(tag))
2201
+ })));
2202
+ }
2203
+ })), escape(createComponent(Show, {
2204
+ get when() {
2205
+ return card.status === "idle";
2206
+ },
2207
+ get fallback() {
2208
+ return ssr(_tmpl$11, ssrAttribute("class", escape(styles().pluginMarketplaceCardStatus, true), false), escape(createComponent(Show, {
2209
+ get when() {
2210
+ return card.status === "installing";
2211
+ },
2212
+ get children() {
2213
+ return [ssr(_tmpl$0, ssrAttribute("class", escape(styles().pluginMarketplaceCardSpinner, true), false)), ssr(_tmpl$1, ssrAttribute("class", escape(styles().pluginMarketplaceCardStatusText, true), false))];
2214
+ }
2215
+ })), escape(createComponent(Show, {
2216
+ get when() {
2217
+ return card.status === "success";
2218
+ },
2219
+ get children() {
2220
+ return [createComponent(CheckCircleIcon, {}), ssr(_tmpl$10, ssrAttribute("class", escape(styles().pluginMarketplaceCardStatusText, true), false))];
2221
+ }
2222
+ })), escape(createComponent(Show, {
2223
+ get when() {
2224
+ return card.status === "error";
2225
+ },
2226
+ get children() {
2227
+ return [createComponent(XCircleIcon, {}), ssr(_tmpl$9, ssrAttribute("class", escape(styles().pluginMarketplaceCardStatusTextError, true), false), escape(card.error) || "Failed to install")];
2228
+ }
2229
+ })));
2230
+ },
2231
+ get children() {
2232
+ return createComponent(Button, {
2233
+ get variant() {
2234
+ return getButtonVariant(card);
2235
+ },
2236
+ onClick: () => props.onAction(card),
2237
+ get disabled() {
2238
+ return card.status !== "idle" || card.actionType === "requires-package" || card.actionType === "wrong-framework" || card.actionType === "already-installed" || card.actionType === "version-mismatch";
2239
+ },
2240
+ get ["class"]() {
2241
+ return card.actionType === "already-installed" ? styles().pluginMarketplaceButtonInstalled : "";
2242
+ },
2243
+ get children() {
2244
+ return getButtonText(card);
2245
+ }
2246
+ });
2247
+ }
2248
+ })));
2249
+ };
2250
+
2251
+ // src/tabs/marketplace/plugin-section.tsx
2252
+ var _tmpl$12 = ["<div", ">", "</div>"];
2253
+ var _tmpl$25 = ["<div", "><div", "><div", '><div class="', '">', "</div><h3", ">", "</h3></div></div>", "</div>"];
2254
+ var PluginSectionComponent = (props) => {
2255
+ const styles = useStyles();
2256
+ return ssr(_tmpl$25, ssrAttribute("class", escape(styles().pluginMarketplaceSection, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSectionHeader, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSectionHeaderLeft, true), false), `${escape(styles().pluginMarketplaceSectionChevron, true) || ""} ${props.isCollapsed() ? escape(escape(styles().pluginMarketplaceSectionChevronCollapsed, true), true) : ""}`, escape(createComponent(ChevronDownIcon, {})), ssrAttribute("class", escape(styles().pluginMarketplaceSectionTitle, true), false), escape(props.section.displayName), escape(createComponent(Show, {
2257
+ get when() {
2258
+ return !props.isCollapsed();
2259
+ },
2260
+ get children() {
2261
+ return ssr(_tmpl$12, ssrAttribute("class", escape(styles().pluginMarketplaceGrid, true), false), escape(createComponent(For, {
2262
+ get each() {
2263
+ return props.section.cards;
2264
+ },
2265
+ children: (card) => createComponent(PluginCardComponent, {
2266
+ card,
2267
+ get onAction() {
2268
+ return props.onCardAction;
2269
+ }
2270
+ })
2271
+ })));
2272
+ }
2273
+ })));
2274
+ };
2275
+ var _tmpl$13 = ["<div", "><div", "><h3", ">Marketplace Settings</h3><button", ">", "</button></div><div", ">", "</div></div>"];
2276
+ var SettingsPanel = (props) => {
2277
+ const styles = useStyles();
2278
+ return createComponent(Show, {
2279
+ get when() {
2280
+ return props.isOpen();
2281
+ },
2282
+ get children() {
2283
+ return ssr(_tmpl$13, ssrAttribute("class", escape(styles().pluginMarketplaceSettingsPanel, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSettingsPanelHeader, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSettingsPanelTitle, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSettingsPanelClose, true), false), escape(createComponent(CloseIcon, {})), ssrAttribute("class", escape(styles().pluginMarketplaceSettingsPanelContent, true), false), escape(createComponent(Checkbox, {
2284
+ label: "Show active plugins",
2285
+ description: "Display installed plugins in a separate section",
2286
+ get checked() {
2287
+ return props.showActivePlugins();
2288
+ },
2289
+ onChange: (checked) => props.setShowActivePlugins(checked)
2290
+ })));
2291
+ }
2292
+ });
2293
+ };
2294
+ var _tmpl$14 = ["<div", ">", "</div>"];
2295
+ var _tmpl$26 = ['<button class="', '">', "</button>"];
2296
+ var TagFilters = (props) => {
2297
+ const styles = useStyles();
2298
+ return createComponent(Show, {
2299
+ get when() {
2300
+ return props.tags().length > 0;
2301
+ },
2302
+ get children() {
2303
+ return ssr(_tmpl$14, ssrAttribute("class", escape(styles().pluginMarketplaceTagsContainer, true), false), escape(createComponent(For, {
2304
+ get each() {
2305
+ return props.tags();
2306
+ },
2307
+ children: (tag) => ssr(_tmpl$26, `${escape(styles().pluginMarketplaceTagButton, true) || ""} ${props.selectedTags().has(tag) ? escape(escape(styles().pluginMarketplaceTagButtonActive, true), true) : ""}`, escape(tag))
2308
+ })));
2309
+ }
2310
+ });
2311
+ };
2312
+
2313
+ // src/tabs/marketplace/marketplace-header.tsx
2314
+ var _tmpl$15 = ["<div", "><div", "><h2", '>Plugin Marketplace</h2><div style="', '"><div', ">", '<input type="text"', ' placeholder="Search plugins..."', "></div><button", ">", "</button></div></div><p", ">Discover and install devtools for TanStack Query, Router, Form, and Pacer</p>", "</div>"];
2315
+ var MarketplaceHeader = (props) => {
2316
+ const styles = useStyles();
2317
+ return ssr(_tmpl$15, ssrAttribute("class", escape(styles().pluginMarketplaceHeader, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceTitleRow, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceTitle, true), false), "display:flex;align-items:center", ssrAttribute("class", escape(styles().pluginMarketplaceSearchWrapper, true), false), escape(createComponent(SearchIcon, {})), ssrAttribute("class", escape(styles().pluginMarketplaceSearch, true), false), ssrAttribute("value", escape(props.searchInput(), true), false), ssrAttribute("class", escape(styles().pluginMarketplaceSettingsButton, true), false), escape(createComponent(SettingsIcon, {})), ssrAttribute("class", escape(styles().pluginMarketplaceDescription, true), false), escape(createComponent(TagFilters, {
2318
+ get tags() {
2319
+ return props.tags;
2320
+ },
2321
+ get selectedTags() {
2322
+ return props.selectedTags;
2323
+ },
2324
+ get onToggleTag() {
2325
+ return props.onToggleTag;
2326
+ }
2327
+ })));
2328
+ };
2329
+
2330
+ // src/tabs/marketplace/types.ts
2331
+ var FRAMEWORKS = [
2332
+ "react",
2333
+ "solid",
2334
+ "vue",
2335
+ "svelte",
2336
+ "angular"
2337
+ ];
2338
+
2339
+ // src/tabs/plugin-registry.ts
2340
+ var PLUGIN_REGISTRY = {
2341
+ // TanStack Query
2342
+ "@tanstack/react-query-devtools": {
2343
+ packageName: "@tanstack/react-query-devtools",
2344
+ title: "TanStack Query Devtools",
2345
+ description: "Powerful devtools for TanStack Query - inspect queries, mutations, and cache",
2346
+ requires: {
2347
+ packageName: "@tanstack/react-query",
2348
+ minVersion: "5.0.0"
2349
+ },
2350
+ pluginId: "tanstack-query",
2351
+ docsUrl: "https://tanstack.com/query/latest/docs/devtools",
2352
+ author: "TanStack",
2353
+ framework: "react",
2354
+ featured: true,
2355
+ // Featured plugin
2356
+ tags: ["TanStack", "data-fetching", "caching", "state-management"]
2357
+ },
2358
+ "@tanstack/solid-query-devtools": {
2359
+ packageName: "@tanstack/solid-query-devtools",
2360
+ title: "TanStack Query Devtools",
2361
+ description: "Powerful devtools for TanStack Query - inspect queries, mutations, and cache",
2362
+ requires: {
2363
+ packageName: "@tanstack/solid-query",
2364
+ minVersion: "5.0.0"
2365
+ },
2366
+ pluginId: "tanstack-query",
2367
+ docsUrl: "https://tanstack.com/query/latest/docs/devtools",
2368
+ author: "TanStack",
2369
+ framework: "solid",
2370
+ tags: ["TanStack", "data-fetching", "caching", "state-management"]
2371
+ },
2372
+ // TanStack Router
2373
+ "@tanstack/react-router-devtools": {
2374
+ packageName: "@tanstack/react-router-devtools",
2375
+ title: "TanStack Router Devtools",
2376
+ description: "Inspect routes, navigation, and router state in real-time",
2377
+ requires: {
2378
+ packageName: "@tanstack/react-router",
2379
+ minVersion: "1.0.0"
2380
+ },
2381
+ pluginId: "tanstack-router",
2382
+ docsUrl: "https://tanstack.com/router/latest/docs/devtools",
2383
+ author: "TanStack",
2384
+ framework: "react",
2385
+ featured: true,
2386
+ // Featured plugin
2387
+ tags: ["TanStack", "routing", "navigation"]
2388
+ },
2389
+ "@tanstack/solid-router-devtools": {
2390
+ packageName: "@tanstack/solid-router-devtools",
2391
+ title: "TanStack Router Devtools",
2392
+ description: "Inspect routes, navigation, and router state in real-time",
2393
+ requires: {
2394
+ packageName: "@tanstack/solid-router",
2395
+ minVersion: "1.0.0"
2396
+ },
2397
+ pluginId: "tanstack-router",
2398
+ docsUrl: "https://tanstack.com/router/latest/docs/devtools",
2399
+ author: "TanStack",
2400
+ framework: "solid",
2401
+ tags: ["TanStack", "routing", "navigation"]
2402
+ },
2403
+ // TanStack Form
2404
+ "@tanstack/react-form-devtools": {
2405
+ packageName: "@tanstack/react-form-devtools",
2406
+ title: "TanStack Form Devtools",
2407
+ description: "Debug form state, validation, and field values",
2408
+ requires: {
2409
+ packageName: "@tanstack/react-form",
2410
+ minVersion: "1.23.0"
2411
+ },
2412
+ pluginImport: {
2413
+ importName: "FormDevtoolsPlugin",
2414
+ type: "function"
2415
+ },
2416
+ pluginId: "tanstack-form",
2417
+ docsUrl: "https://tanstack.com/form/latest/docs/devtools",
2418
+ author: "TanStack",
2419
+ framework: "react",
2420
+ isNew: true,
2421
+ tags: ["TanStack", "forms", "validation"]
2422
+ },
2423
+ "@tanstack/solid-form-devtools": {
2424
+ packageName: "@tanstack/solid-form-devtools",
2425
+ title: "TanStack Form Devtools",
2426
+ description: "Debug form state, validation, and field values",
2427
+ requires: {
2428
+ packageName: "@tanstack/solid-form",
2429
+ minVersion: "1.23.0"
2430
+ },
2431
+ pluginImport: {
2432
+ importName: "FormDevtoolsPlugin",
2433
+ type: "function"
2434
+ },
2435
+ pluginId: "tanstack-form",
2436
+ docsUrl: "https://tanstack.com/form/latest/docs/devtools",
2437
+ author: "TanStack",
2438
+ isNew: true,
2439
+ framework: "solid",
2440
+ tags: ["TanStack", "forms", "validation"]
2441
+ },
2442
+ // TanStack Pacer (Example - adjust as needed)
2443
+ "@tanstack/react-pacer-devtools": {
2444
+ packageName: "@tanstack/react-pacer-devtools",
2445
+ title: "Pacer Devtools",
2446
+ description: "Monitor and debug your Pacer animations and transitions",
2447
+ requires: {
2448
+ packageName: "@tanstack/react-pacer",
2449
+ minVersion: "0.16.4"
2450
+ },
2451
+ author: "TanStack",
2452
+ framework: "react",
2453
+ isNew: true,
2454
+ // New plugin banner
2455
+ tags: ["TanStack"]
2456
+ },
2457
+ "@tanstack/solid-pacer-devtools": {
2458
+ packageName: "@tanstack/solid-pacer-devtools",
2459
+ title: "Pacer Devtools",
2460
+ description: "Monitor and debug your Pacer animations and transitions",
2461
+ requires: {
2462
+ packageName: "@tanstack/solid-pacer",
2463
+ minVersion: "0.14.4"
2464
+ },
2465
+ author: "TanStack",
2466
+ framework: "solid",
2467
+ isNew: true,
2468
+ // New plugin banner
2469
+ tags: ["TanStack"]
2470
+ }
2471
+ // ==========================================
2472
+ // THIRD-PARTY PLUGINS - Examples
2473
+ // ==========================================
2474
+ // External contributors can add their plugins below!
2475
+ };
2476
+ function getAllPluginMetadata() {
2477
+ return Object.values(PLUGIN_REGISTRY);
2478
+ }
2479
+
2480
+ // src/tabs/semver-utils.ts
2481
+ function parseVersion(version) {
2482
+ if (!version) return null;
2483
+ const cleanVersion = version.replace(/^[v^~]/, "").split("-")[0]?.split("+")[0];
2484
+ if (!cleanVersion) return null;
2485
+ const parts = cleanVersion.split(".");
2486
+ if (parts.length < 2) return null;
2487
+ const major = parseInt(parts[0] ?? "0", 10);
2488
+ const minor = parseInt(parts[1] ?? "0", 10);
2489
+ const patch = parseInt(parts[2] ?? "0", 10);
2490
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
2491
+ return null;
2492
+ }
2493
+ return {
2494
+ major,
2495
+ minor,
2496
+ patch,
2497
+ raw: version
2498
+ };
2499
+ }
2500
+ function compareVersions(v1, v2) {
2501
+ if (v1.major !== v2.major) return v1.major - v2.major;
2502
+ if (v1.minor !== v2.minor) return v1.minor - v2.minor;
2503
+ return v1.patch - v2.patch;
2504
+ }
2505
+ function satisfiesMinVersion(currentVersion, minVersion) {
2506
+ const current = parseVersion(currentVersion);
2507
+ const min = parseVersion(minVersion);
2508
+ if (!current || !min) return true;
2509
+ return compareVersions(current, min) >= 0;
2510
+ }
2511
+ function satisfiesMaxVersion(currentVersion, maxVersion) {
2512
+ const current = parseVersion(currentVersion);
2513
+ const max = parseVersion(maxVersion);
2514
+ if (!current || !max) return true;
2515
+ return compareVersions(current, max) <= 0;
2516
+ }
2517
+ function satisfiesVersionRange(currentVersion, minVersion, maxVersion) {
2518
+ if (!minVersion && !maxVersion) {
2519
+ return { satisfied: true };
2520
+ }
2521
+ if (minVersion && !satisfiesMinVersion(currentVersion, minVersion)) {
2522
+ return {
2523
+ satisfied: false,
2524
+ reason: `Requires v${minVersion} or higher (current: v${currentVersion})`
2525
+ };
2526
+ }
2527
+ if (maxVersion && !satisfiesMaxVersion(currentVersion, maxVersion)) {
2528
+ return {
2529
+ satisfied: false,
2530
+ reason: `Requires v${maxVersion} or lower (current: v${currentVersion})`
2531
+ };
2532
+ }
2533
+ return { satisfied: true };
2534
+ }
2535
+
2536
+ // src/tabs/marketplace/plugin-utils.ts
2537
+ var detectFramework = (pkg, frameworks) => {
2538
+ const allDeps = {
2539
+ ...pkg.dependencies,
2540
+ ...pkg.devDependencies
2541
+ };
2542
+ const frameworkPackageMap = {
2543
+ react: ["react", "react-dom"],
2544
+ vue: ["vue", "@vue/core"],
2545
+ solid: ["solid-js"],
2546
+ svelte: ["svelte"],
2547
+ angular: ["@angular/core"]
2548
+ };
2549
+ for (const framework of frameworks) {
2550
+ const frameworkPackages = frameworkPackageMap[framework];
2551
+ if (frameworkPackages && frameworkPackages.some((pkg2) => allDeps[pkg2])) {
2552
+ return framework;
2553
+ }
2554
+ }
2555
+ return "unknown";
2556
+ };
2557
+ var isPluginRegistered = (registeredPlugins, packageName, pluginName, framework, pluginId) => {
2558
+ if (pluginId) {
2559
+ return Array.from(registeredPlugins).some((id) => {
2560
+ const idLower = id.toLowerCase();
2561
+ const pluginIdLower = pluginId.toLowerCase();
2562
+ return idLower.startsWith(pluginIdLower) || idLower.includes(pluginIdLower);
2563
+ });
2564
+ }
2565
+ if (registeredPlugins.has(packageName)) return true;
2566
+ const pluginWords = pluginName.toLowerCase().split(/[-_/@]/).filter((word) => word.length > 0);
2567
+ const frameworkPart = framework.toLowerCase();
2568
+ return Array.from(registeredPlugins).some((id) => {
2569
+ const idLower = id.toLowerCase();
2570
+ if (idLower.includes(pluginName.toLowerCase())) {
2571
+ return true;
2572
+ }
2573
+ const matchedWords = pluginWords.filter((word) => idLower.includes(word));
2574
+ if (matchedWords.length >= 2) {
2575
+ return true;
2576
+ }
2577
+ if (idLower.includes(frameworkPart) && matchedWords.length >= 1) {
2578
+ return true;
2579
+ }
2580
+ return false;
2581
+ });
2582
+ };
2583
+ var buildPluginCards = (pkg, currentFramework, registeredPlugins, existingCards) => {
2584
+ const allDeps = {
2585
+ ...pkg.dependencies,
2586
+ ...pkg.devDependencies
2587
+ };
2588
+ const allCards = [];
2589
+ const allPlugins = getAllPluginMetadata();
2590
+ allPlugins.forEach((metadata) => {
2591
+ const devtoolsPackage = metadata.packageName;
2592
+ const isCurrentFramework = metadata.framework === currentFramework || metadata.framework === "other";
2593
+ const requiredPackageName = metadata.requires?.packageName;
2594
+ const hasPackage = requiredPackageName ? !!allDeps[requiredPackageName] : false;
2595
+ const hasDevtools = !!allDeps[devtoolsPackage];
2596
+ let versionInfo;
2597
+ if (hasPackage && metadata.requires) {
2598
+ const currentVersion = requiredPackageName ? allDeps[requiredPackageName] : void 0;
2599
+ if (currentVersion) {
2600
+ const versionCheck = satisfiesVersionRange(
2601
+ currentVersion,
2602
+ metadata.requires.minVersion,
2603
+ metadata.requires.maxVersion
2604
+ );
2605
+ versionInfo = {
2606
+ current: currentVersion,
2607
+ required: metadata.requires.minVersion,
2608
+ satisfied: versionCheck.satisfied,
2609
+ reason: versionCheck.reason
2610
+ };
2611
+ }
2612
+ }
2613
+ const isRegistered = isPluginRegistered(
2614
+ registeredPlugins,
2615
+ devtoolsPackage,
2616
+ metadata.packageName,
2617
+ metadata.framework,
2618
+ metadata.pluginId
2619
+ );
2620
+ let actionType;
2621
+ if (!isCurrentFramework) {
2622
+ actionType = "wrong-framework";
2623
+ } else if (metadata.requires && !hasPackage) {
2624
+ actionType = "requires-package";
2625
+ } else if (versionInfo && !versionInfo.satisfied) {
2626
+ actionType = "bump-version";
2627
+ } else if (hasDevtools && isRegistered) {
2628
+ actionType = "already-installed";
2629
+ } else if (hasDevtools && !isRegistered) {
2630
+ actionType = "add-to-devtools";
2631
+ } else if (!hasDevtools && metadata.requires && hasPackage) {
2632
+ actionType = "install-devtools";
2633
+ } else if (!hasDevtools) {
2634
+ actionType = "install";
2635
+ } else {
2636
+ actionType = "install";
2637
+ }
2638
+ const existing = existingCards.find(
2639
+ (c) => c.devtoolsPackage === devtoolsPackage
2640
+ );
2641
+ allCards.push({
2642
+ requiredPackageName: requiredPackageName || "",
2643
+ devtoolsPackage,
2644
+ framework: metadata.framework,
2645
+ hasPackage,
2646
+ hasDevtools,
2647
+ isRegistered,
2648
+ actionType,
2649
+ status: existing?.status || "idle",
2650
+ error: existing?.error,
2651
+ isCurrentFramework,
2652
+ metadata,
2653
+ versionInfo
2654
+ });
2655
+ });
2656
+ return allCards;
2657
+ };
2658
+ var groupIntoSections = (allCards) => {
2659
+ const sections = [];
2660
+ const activeCards = allCards.filter(
2661
+ (c) => c.actionType === "already-installed" && c.isRegistered
2662
+ );
2663
+ if (activeCards.length > 0) {
2664
+ sections.push({
2665
+ id: "active",
2666
+ displayName: "\u2713 Active Plugins",
2667
+ cards: activeCards
2668
+ });
2669
+ }
2670
+ const featuredCards = allCards.filter(
2671
+ (c) => c.metadata?.featured && c.actionType !== "already-installed" && c.isCurrentFramework
2672
+ // Only show featured plugins for current framework
2673
+ );
2674
+ if (featuredCards.length > 0) {
2675
+ sections.push({
2676
+ id: "featured",
2677
+ displayName: "\u2B50 Featured",
2678
+ cards: featuredCards
2679
+ });
2680
+ }
2681
+ const availableCards = allCards.filter(
2682
+ (c) => c.isCurrentFramework && c.actionType !== "already-installed" && !c.metadata?.featured
2683
+ // Not featured (already in featured section)
2684
+ );
2685
+ if (availableCards.length > 0) {
2686
+ sections.push({
2687
+ id: "available",
2688
+ displayName: "Available Plugins",
2689
+ cards: availableCards
2690
+ });
2691
+ }
2692
+ return sections;
2693
+ };
2694
+
2695
+ // src/tabs/plugin-marketplace.tsx
2696
+ var _tmpl$16 = ["<div", "><p", ">", "</p></div>"];
2697
+ var _tmpl$27 = ["<div", ">", "", "", "", "</div>"];
2698
+ var PluginMarketplace = () => {
2699
+ const styles = useStyles();
2700
+ const {
2701
+ plugins
2702
+ } = usePlugins();
2703
+ const [pluginSections, setPluginSections] = createSignal([]);
2704
+ const [currentPackageJson, setCurrentPackageJson] = createSignal(null);
2705
+ const [searchInput, setSearchInput] = createSignal("");
2706
+ const [searchQuery, setSearchQuery] = createSignal("");
2707
+ const [collapsedSections, setCollapsedSections] = createSignal(/* @__PURE__ */ new Set());
2708
+ const [showActivePlugins, setShowActivePlugins] = createSignal(true);
2709
+ const [selectedTags, setSelectedTags] = createSignal(/* @__PURE__ */ new Set());
2710
+ const [isSettingsOpen, setIsSettingsOpen] = createSignal(false);
2711
+ let debounceTimeout;
2712
+ const handleSearchInput = (value) => {
2713
+ setSearchInput(value);
2714
+ if (debounceTimeout) {
2715
+ clearTimeout(debounceTimeout);
2716
+ }
2717
+ debounceTimeout = setTimeout(() => {
2718
+ setSearchQuery(value);
2719
+ }, 300);
2720
+ };
2721
+ const toggleSection = (framework) => {
2722
+ setCollapsedSections((prev) => {
2723
+ const newSet = new Set(prev);
2724
+ if (newSet.has(framework)) {
2725
+ newSet.delete(framework);
2726
+ } else {
2727
+ newSet.add(framework);
2728
+ }
2729
+ return newSet;
2730
+ });
2731
+ };
2732
+ const matchesSearch = (card, query) => {
2733
+ if (!query) return true;
2734
+ const lowerQuery = query.toLowerCase();
2735
+ return card.devtoolsPackage.toLowerCase().includes(lowerQuery) || card.requiredPackageName.toLowerCase().includes(lowerQuery) || card.framework.toLowerCase().includes(lowerQuery);
2736
+ };
2737
+ const getFilteredSections = () => {
2738
+ const query = searchQuery();
2739
+ const showActive = showActivePlugins();
2740
+ const tags = selectedTags();
2741
+ const pkg = currentPackageJson();
2742
+ if (!pkg) return [];
2743
+ const currentFramework = detectFramework(pkg, FRAMEWORKS);
2744
+ const registeredPlugins = new Set(plugins()?.map((p) => p.id || "") || []);
2745
+ const allCards = buildPluginCards(
2746
+ pkg,
2747
+ currentFramework,
2748
+ registeredPlugins,
2749
+ pluginSections().flatMap((s) => s.cards)
2750
+ // Preserve status from existing cards
2751
+ );
2752
+ let sections = groupIntoSections(allCards);
2753
+ if (!showActive) {
2754
+ sections = sections.filter((section) => section.id !== "active");
2755
+ }
2756
+ if (tags.size > 0) {
2757
+ sections = sections.map((section) => ({
2758
+ ...section,
2759
+ cards: section.cards.filter((card) => {
2760
+ if (!card.metadata?.tags) return false;
2761
+ return card.metadata.tags.some((tag) => tags.has(tag));
2762
+ })
2763
+ })).filter((section) => section.cards.length > 0);
2764
+ }
2765
+ if (!query) return sections;
2766
+ return sections.map((section) => ({
2767
+ ...section,
2768
+ cards: section.cards.filter((card) => matchesSearch(card, query))
2769
+ })).filter((section) => section.cards.length > 0);
2770
+ };
2771
+ onMount(() => {
2772
+ const cleanupJsonRead = devtoolsEventClient.on("package-json-read", (event) => {
2773
+ setCurrentPackageJson(event.payload.packageJson);
2774
+ updatePluginCards(event.payload.packageJson);
2775
+ });
2776
+ const cleanupJsonUpdated = devtoolsEventClient.on("package-json-updated", (event) => {
2777
+ setCurrentPackageJson(event.payload.packageJson);
2778
+ updatePluginCards(event.payload.packageJson);
2779
+ });
2780
+ const cleanupDevtoolsInstalled = devtoolsEventClient.on("devtools-installed", (event) => {
2781
+ setPluginSections((prevSections) => prevSections.map((section) => ({
2782
+ ...section,
2783
+ cards: section.cards.map((card) => card.devtoolsPackage === event.payload.packageName ? {
2784
+ ...card,
2785
+ status: event.payload.success ? "success" : "error",
2786
+ error: event.payload.error
2787
+ } : card)
2788
+ })));
2789
+ });
2790
+ const cleanupPluginAdded = devtoolsEventClient.on("plugin-added", (event) => {
2791
+ setPluginSections((prevSections) => prevSections.map((section) => ({
2792
+ ...section,
2793
+ cards: section.cards.map((card) => card.devtoolsPackage === event.payload.packageName ? {
2794
+ ...card,
2795
+ status: event.payload.success ? "success" : "error",
2796
+ error: event.payload.error
2797
+ } : card)
2798
+ })));
2799
+ if (event.payload.success) {
2800
+ const pkg = currentPackageJson();
2801
+ if (pkg) {
2802
+ updatePluginCards(pkg);
2803
+ }
2804
+ }
2805
+ });
2806
+ onCleanup(() => {
2807
+ cleanupJsonRead();
2808
+ cleanupJsonUpdated();
2809
+ cleanupDevtoolsInstalled();
2810
+ cleanupPluginAdded();
2811
+ });
2812
+ devtoolsEventClient.emit("mounted", void 0);
2813
+ });
2814
+ const updatePluginCards = (pkg) => {
2815
+ if (!pkg) return;
2816
+ const currentFramework = detectFramework(pkg, FRAMEWORKS);
2817
+ const registeredPlugins = new Set(plugins()?.map((p) => p.id || "") || []);
2818
+ const allCards = buildPluginCards(pkg, currentFramework, registeredPlugins, pluginSections().flatMap((s) => s.cards));
2819
+ const sections = groupIntoSections(allCards);
2820
+ setPluginSections(sections);
2821
+ };
2822
+ const handleAction = (card) => {
2823
+ if (card.actionType === "requires-package" || card.actionType === "wrong-framework" || card.actionType === "already-installed" || card.actionType === "version-mismatch") {
2824
+ return;
2825
+ }
2826
+ setPluginSections((prevSections) => prevSections.map((section) => ({
2827
+ ...section,
2828
+ cards: section.cards.map((c) => c.devtoolsPackage === card.devtoolsPackage ? {
2829
+ ...c,
2830
+ status: "installing"
2831
+ } : c)
2832
+ })));
2833
+ if (card.actionType === "bump-version") {
2834
+ devtoolsEventClient.emit("bump-package-version", {
2835
+ packageName: card.requiredPackageName,
2836
+ devtoolsPackage: card.devtoolsPackage,
2837
+ pluginName: card.metadata?.title || card.devtoolsPackage,
2838
+ minVersion: card.metadata?.requires?.minVersion,
2839
+ pluginImport: card.metadata?.pluginImport
2840
+ });
2841
+ return;
2842
+ }
2843
+ if (card.actionType === "add-to-devtools") {
2844
+ devtoolsEventClient.emit("add-plugin-to-devtools", {
2845
+ packageName: card.devtoolsPackage,
2846
+ // should always be defined
2847
+ pluginName: card.metadata?.title ?? card.devtoolsPackage,
2848
+ pluginImport: card.metadata?.pluginImport
2849
+ });
2850
+ return;
2851
+ }
2852
+ devtoolsEventClient.emit("install-devtools", {
2853
+ packageName: card.devtoolsPackage,
2854
+ // should always be defined
2855
+ pluginName: card.metadata?.title ?? card.devtoolsPackage,
2856
+ pluginImport: card.metadata?.pluginImport
2857
+ });
2858
+ };
2859
+ const getAllTags = () => {
2860
+ const tags = /* @__PURE__ */ new Set();
2861
+ pluginSections().forEach((section) => {
2862
+ if (section.id === "featured" || section.id === "available") {
2863
+ section.cards.forEach((card) => {
2864
+ if (card.metadata?.tags) {
2865
+ card.metadata.tags.forEach((tag) => tags.add(tag));
2866
+ }
2867
+ });
2868
+ }
2869
+ });
2870
+ return Array.from(tags).sort();
2871
+ };
2872
+ const toggleTag = (tag) => {
2873
+ setSelectedTags((prev) => {
2874
+ const newTags = new Set(prev);
2875
+ if (newTags.has(tag)) {
2876
+ newTags.delete(tag);
2877
+ } else {
2878
+ newTags.add(tag);
2879
+ }
2880
+ return newTags;
2881
+ });
2882
+ };
2883
+ return ssr(_tmpl$27, ssrAttribute("class", escape(styles().pluginMarketplace, true), false), escape(createComponent(SettingsPanel, {
2884
+ isOpen: isSettingsOpen,
2885
+ onClose: () => setIsSettingsOpen(false),
2886
+ showActivePlugins,
2887
+ setShowActivePlugins
2888
+ })), escape(createComponent(MarketplaceHeader, {
2889
+ searchInput,
2890
+ onSearchInput: handleSearchInput,
2891
+ onSettingsClick: () => setIsSettingsOpen(!isSettingsOpen()),
2892
+ tags: getAllTags,
2893
+ selectedTags,
2894
+ onToggleTag: toggleTag
2895
+ })), escape(createComponent(Show, {
2896
+ get when() {
2897
+ return getFilteredSections().length > 0;
2898
+ },
2899
+ get children() {
2900
+ return createComponent(For, {
2901
+ get each() {
2902
+ return getFilteredSections();
2903
+ },
2904
+ children: (section) => createComponent(PluginSectionComponent, {
2905
+ section,
2906
+ isCollapsed: () => collapsedSections().has(section.id),
2907
+ onToggleCollapse: () => toggleSection(section.id),
2908
+ onCardAction: handleAction
2909
+ })
2910
+ });
2911
+ }
2912
+ })), escape(createComponent(Show, {
2913
+ get when() {
2914
+ return getFilteredSections().length === 0;
2915
+ },
2916
+ get children() {
2917
+ return ssr(_tmpl$16, ssrAttribute("class", escape(styles().pluginMarketplaceEmpty, true), false), ssrAttribute("class", escape(styles().pluginMarketplaceEmptyText, true), false), searchQuery() ? `No plugins found matching "${escape(searchQuery())}"` : "No additional plugins available. You have all compatible devtools installed and registered!");
2918
+ }
2919
+ })));
2920
+ };
2921
+
2922
+ // src/tabs/plugins-tab.tsx
2923
+ var _tmpl$17 = ["<div", "><div", "><div", "><div", ">", "</div><div", "><h3>Add More</h3></div></div></div>", "</div>"];
2924
+ var _tmpl$28 = ["<div", '><h3 id="', '"></h3></div>'];
2925
+ var _tmpl$34 = ['<div id="', '"', "></div>"];
2926
+ var PluginsTab = () => {
2927
+ const {
2928
+ plugins,
2929
+ activePlugins,
2930
+ toggleActivePlugins
2931
+ } = usePlugins();
2932
+ const {
2933
+ expanded,
2934
+ hoverUtils,
2935
+ animationMs,
2936
+ setForceExpand
2937
+ } = useDrawContext();
2938
+ const [pluginRefs, setPluginRefs] = createSignal(/* @__PURE__ */ new Map());
2939
+ const [showMarketplace, setShowMarketplace] = createSignal(false);
2940
+ const styles = useStyles();
2941
+ const {
2942
+ theme
2943
+ } = useTheme();
2944
+ const hasPlugins = createMemo(() => plugins()?.length && plugins().length > 0);
2945
+ createEffect(() => {
2946
+ setForceExpand(showMarketplace());
2947
+ });
2948
+ createEffect(() => {
2949
+ const currentActivePlugins = plugins()?.filter((plugin) => activePlugins().includes(plugin.id));
2950
+ currentActivePlugins?.forEach((plugin) => {
2951
+ const ref = pluginRefs().get(plugin.id);
2952
+ if (ref) {
2953
+ plugin.render(ref, theme());
2954
+ }
2955
+ });
2956
+ });
2957
+ return createComponent(Show, {
2958
+ get when() {
2959
+ return hasPlugins();
2960
+ },
2961
+ get fallback() {
2962
+ return createComponent(PluginMarketplace, {});
2963
+ },
2964
+ get children() {
2965
+ return ssr(_tmpl$17, ssrAttribute("class", escape(styles().pluginsTabPanel, true), false), ssrAttribute("class", escape(clsx3(styles().pluginsTabDraw(expanded()), {
2966
+ [styles().pluginsTabDraw(expanded())]: expanded()
2967
+ }, styles().pluginsTabDrawTransition(animationMs)), true), false), ssrAttribute("class", escape(clsx3(styles().pluginsTabSidebar(expanded()), styles().pluginsTabSidebarTransition(animationMs)), true), false), ssrAttribute("class", escape(styles().pluginsList, true), false), escape(createComponent(For, {
2968
+ get each() {
2969
+ return plugins();
2970
+ },
2971
+ children: (plugin) => {
2972
+ createEffect(() => {
2973
+ });
2974
+ const isActive = createMemo(() => activePlugins().includes(plugin.id));
2975
+ return ssr(_tmpl$28, ssrAttribute("class", escape(clsx3(styles().pluginName, {
2976
+ active: isActive()
2977
+ }), true), false), `${escape(PLUGIN_TITLE_CONTAINER_ID, true)}-${escape(plugin.id, true)}`);
2978
+ }
2979
+ })), ssrAttribute("class", escape(clsx3(styles().pluginNameAddMore, {
2980
+ active: showMarketplace()
2981
+ }), true), false), escape(createComponent(Show, {
2982
+ get when() {
2983
+ return showMarketplace();
2984
+ },
2985
+ get fallback() {
2986
+ return createComponent(For, {
2987
+ get each() {
2988
+ return activePlugins();
2989
+ },
2990
+ children: (pluginId) => ssr(_tmpl$34, `${escape(PLUGIN_CONTAINER_ID, true)}-${escape(pluginId, true)}`, ssrAttribute("class", escape(styles().pluginsTabContent, true), false))
2991
+ });
2992
+ },
2993
+ get children() {
2994
+ return createComponent(PluginMarketplace, {});
2995
+ }
2996
+ })));
2997
+ }
2998
+ });
2999
+ };
3000
+ function useHeadChanges(onChange, opts = {}) {
3001
+ const {
3002
+ attributes = true,
3003
+ childList = true,
3004
+ subtree = true,
3005
+ observeTitle = true
3006
+ } = opts;
3007
+ onMount(() => {
3008
+ const headObserver = new MutationObserver((mutations) => {
3009
+ for (const m of mutations) {
3010
+ if (m.type === "childList") {
3011
+ m.addedNodes.forEach((node) => onChange({ kind: "added", node }, m));
3012
+ m.removedNodes.forEach(
3013
+ (node) => onChange({ kind: "removed", node }, m)
3014
+ );
3015
+ } else if (m.type === "attributes") {
3016
+ const el = m.target;
3017
+ onChange(
3018
+ {
3019
+ kind: "attr",
3020
+ target: el,
3021
+ name: m.attributeName,
3022
+ oldValue: m.oldValue ?? null
3023
+ },
3024
+ m
3025
+ );
3026
+ } else {
3027
+ const isInTitle = m.target.parentNode && m.target.parentNode.tagName.toLowerCase() === "title";
3028
+ if (isInTitle) onChange({ kind: "title", title: document.title }, m);
3029
+ }
3030
+ }
3031
+ });
3032
+ headObserver.observe(document.head, {
3033
+ childList,
3034
+ attributes,
3035
+ subtree,
3036
+ attributeOldValue: attributes,
3037
+ characterData: true,
3038
+ // helps catch <title> text node edits
3039
+ characterDataOldValue: false
3040
+ });
3041
+ let titleObserver;
3042
+ if (observeTitle) {
3043
+ const titleEl = document.head.querySelector("title") || // create a <title> if missing so future changes are observable
3044
+ document.head.appendChild(document.createElement("title"));
3045
+ titleObserver = new MutationObserver(() => {
3046
+ onChange({ kind: "title", title: document.title });
3047
+ });
3048
+ titleObserver.observe(titleEl, {
3049
+ childList: true,
3050
+ characterData: true,
3051
+ subtree: true
3052
+ });
3053
+ }
3054
+ onCleanup(() => {
3055
+ headObserver.disconnect();
3056
+ titleObserver?.disconnect();
3057
+ });
3058
+ });
3059
+ }
3060
+
3061
+ // src/tabs/seo-tab.tsx
3062
+ var _tmpl$18 = ["<div", ' style="', '"><div', ' style="', '">', " Preview</div>", "<div", ">", "</div><div", ">", "</div><div", ">", "</div></div>"];
3063
+ var _tmpl$29 = ["<img", ' alt="Preview"', ">"];
3064
+ var _tmpl$35 = ["<div", ' style="', '">No Image</div>'];
3065
+ var _tmpl$44 = ["<div", ">", "</div>"];
3066
+ var _tmpl$53 = ["<div>", "", "</div>"];
3067
+ var _tmpl$63 = ["<div", "><strong>Missing tags for ", ":</strong><ul", ">", "</ul></div>"];
3068
+ var _tmpl$72 = ["<li", ">", "</li>"];
3069
+ var SOCIALS = [
3070
+ {
3071
+ network: "Facebook",
3072
+ tags: [{
3073
+ key: "og:title",
3074
+ prop: "title"
3075
+ }, {
3076
+ key: "og:description",
3077
+ prop: "description"
3078
+ }, {
3079
+ key: "og:image",
3080
+ prop: "image"
3081
+ }, {
3082
+ key: "og:url",
3083
+ prop: "url"
3084
+ }],
3085
+ color: "#4267B2"
3086
+ },
3087
+ {
3088
+ network: "X/Twitter",
3089
+ tags: [{
3090
+ key: "twitter:title",
3091
+ prop: "title"
3092
+ }, {
3093
+ key: "twitter:description",
3094
+ prop: "description"
3095
+ }, {
3096
+ key: "twitter:image",
3097
+ prop: "image"
3098
+ }, {
3099
+ key: "twitter:url",
3100
+ prop: "url"
3101
+ }],
3102
+ color: "#1DA1F2"
3103
+ },
3104
+ {
3105
+ network: "LinkedIn",
3106
+ tags: [{
3107
+ key: "og:title",
3108
+ prop: "title"
3109
+ }, {
3110
+ key: "og:description",
3111
+ prop: "description"
3112
+ }, {
3113
+ key: "og:image",
3114
+ prop: "image"
3115
+ }, {
3116
+ key: "og:url",
3117
+ prop: "url"
3118
+ }],
3119
+ color: "#0077B5"
3120
+ },
3121
+ {
3122
+ network: "Discord",
3123
+ tags: [{
3124
+ key: "og:title",
3125
+ prop: "title"
3126
+ }, {
3127
+ key: "og:description",
3128
+ prop: "description"
3129
+ }, {
3130
+ key: "og:image",
3131
+ prop: "image"
3132
+ }, {
3133
+ key: "og:url",
3134
+ prop: "url"
3135
+ }],
3136
+ color: "#5865F2"
3137
+ },
3138
+ {
3139
+ network: "Slack",
3140
+ tags: [{
3141
+ key: "og:title",
3142
+ prop: "title"
3143
+ }, {
3144
+ key: "og:description",
3145
+ prop: "description"
3146
+ }, {
3147
+ key: "og:image",
3148
+ prop: "image"
3149
+ }, {
3150
+ key: "og:url",
3151
+ prop: "url"
3152
+ }],
3153
+ color: "#4A154B"
3154
+ },
3155
+ {
3156
+ network: "Mastodon",
3157
+ tags: [{
3158
+ key: "og:title",
3159
+ prop: "title"
3160
+ }, {
3161
+ key: "og:description",
3162
+ prop: "description"
3163
+ }, {
3164
+ key: "og:image",
3165
+ prop: "image"
3166
+ }, {
3167
+ key: "og:url",
3168
+ prop: "url"
3169
+ }],
3170
+ color: "#6364FF"
3171
+ },
3172
+ {
3173
+ network: "Bluesky",
3174
+ tags: [{
3175
+ key: "og:title",
3176
+ prop: "title"
3177
+ }, {
3178
+ key: "og:description",
3179
+ prop: "description"
3180
+ }, {
3181
+ key: "og:image",
3182
+ prop: "image"
3183
+ }, {
3184
+ key: "og:url",
3185
+ prop: "url"
3186
+ }],
3187
+ color: "#1185FE"
3188
+ }
3189
+ // Add more networks as needed
3190
+ ];
3191
+ function SocialPreview(props) {
3192
+ const styles = useStyles();
3193
+ return ssr(_tmpl$18, 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$29, ssrAttribute("src", escape(props.meta.image, true), false), ssrAttribute("class", escape(styles().seoPreviewImage, true), false)) : ssr(_tmpl$35, 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));
3194
+ }
3195
+ var SeoTab = () => {
3196
+ const [reports, setReports] = createSignal(analyzeHead());
3197
+ const styles = useStyles();
3198
+ function analyzeHead() {
3199
+ const metaTags = Array.from(document.head.querySelectorAll("meta"));
3200
+ const reports2 = [];
3201
+ for (const social of SOCIALS) {
3202
+ const found = {};
3203
+ const missing = [];
3204
+ for (const tag of social.tags) {
3205
+ const meta = metaTags.find((m) => (tag.key.includes("twitter:") ? false : m.getAttribute("property") === tag.key) || m.getAttribute("name") === tag.key);
3206
+ if (meta && meta.getAttribute("content")) {
3207
+ found[tag.prop] = meta.getAttribute("content") || void 0;
3208
+ } else {
3209
+ missing.push(tag.key);
3210
+ }
3211
+ }
3212
+ reports2.push({
3213
+ network: social.network,
3214
+ found,
3215
+ missing
3216
+ });
3217
+ }
3218
+ return reports2;
3219
+ }
3220
+ useHeadChanges(() => {
3221
+ setReports(analyzeHead());
3222
+ });
3223
+ return createComponent(MainPanel$1, {
3224
+ withPadding: true,
3225
+ get children() {
3226
+ return createComponent(Section, {
3227
+ get children() {
3228
+ return [createComponent(SectionTitle, {
3229
+ get children() {
3230
+ return [createComponent(SectionIcon, {
3231
+ get children() {
3232
+ return createComponent(SocialBubble, {});
3233
+ }
3234
+ }), "Social previews"];
3235
+ }
3236
+ }), createComponent(SectionDescription, {
3237
+ 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."
3238
+ }), ssr(_tmpl$44, ssrAttribute("class", escape(styles().seoPreviewSection, true), false), escape(createComponent(For, {
3239
+ get each() {
3240
+ return reports();
3241
+ },
3242
+ children: (report, i) => {
3243
+ const social = SOCIALS[i()];
3244
+ return ssr(_tmpl$53, escape(createComponent(SocialPreview, {
3245
+ get meta() {
3246
+ return report.found;
3247
+ },
3248
+ get color() {
3249
+ return social.color;
3250
+ },
3251
+ get network() {
3252
+ return social.network;
3253
+ }
3254
+ })), report.missing.length > 0 ? escape(ssr(_tmpl$63, ssrAttribute("class", escape(styles().seoMissingTagsSection, true), false), escape(social?.network), ssrAttribute("class", escape(styles().seoMissingTagsList, true), false), escape(createComponent(For, {
3255
+ get each() {
3256
+ return report.missing;
3257
+ },
3258
+ children: (tag) => ssr(_tmpl$72, ssrAttribute("class", escape(styles().seoMissingTag, true), false), escape(tag))
3259
+ })))) : escape(null));
3260
+ }
3261
+ })))];
3262
+ }
3263
+ });
3264
+ }
3265
+ });
3266
+ };
3267
+
3268
+ // src/tabs/index.tsx
3269
+ var tabs = [{
3270
+ name: "Plugins",
3271
+ id: "plugins",
3272
+ component: () => createComponent(PluginsTab, {}),
3273
+ icon: () => createComponent(List, {})
3274
+ }, {
3275
+ name: "SEO",
3276
+ id: "seo",
3277
+ component: () => createComponent(SeoTab, {}),
3278
+ icon: () => createComponent(PageSearch, {})
3279
+ }, {
3280
+ name: "Settings",
3281
+ id: "settings",
3282
+ component: () => createComponent(SettingsTab, {}),
3283
+ icon: () => createComponent(Cogs, {})
3284
+ }];
3285
+
3286
+ // src/components/tabs.tsx
3287
+ var _tmpl$19 = ["<div", ">", "", "</div>"];
3288
+ var _tmpl$210 = ['<button type="button"', ">", "</button>"];
3289
+ var _tmpl$36 = ['<div style="', '"><button type="button"', ">", '</button><button type="button"', ">", "</button></div>"];
3290
+ var Tabs = (props) => {
3291
+ const styles = useStyles();
3292
+ const {
3293
+ state,
3294
+ setState
3295
+ } = useDevtoolsState();
3296
+ const pipWindow = usePiPWindow();
3297
+ const {
3298
+ hoverUtils
3299
+ } = useDrawContext();
3300
+ return ssr(_tmpl$19, ssrAttribute("class", escape(styles().tabContainer, true), false), escape(createComponent(For, {
3301
+ each: tabs,
3302
+ children: (tab) => ssr(_tmpl$210, ssrAttribute("class", escape(clsx3(styles().tab, {
3303
+ active: state().activeTab === tab.id
3304
+ }), true), false), escape(tab.icon()))
3305
+ })), pipWindow().pipWindow !== null ? escape(null) : ssr(_tmpl$36, "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, {}))));
3306
+ };
3307
+ var _tmpl$20 = ["<div", ">", "</div>"];
3308
+ var TabContent = () => {
3309
+ const {
3310
+ state
3311
+ } = useDevtoolsState();
3312
+ const styles = useStyles();
3313
+ const component = createMemo(() => tabs.find((t) => t.id === state().activeTab)?.component || null);
3314
+ return ssr(_tmpl$20, ssrAttribute("class", escape(styles().tabContent, true), false), escape(component()?.()));
3315
+ };
3316
+ var _tmpl$21 = ['<div style="', '">', "</div>"];
3317
+ var _tmpl$211 = ['<div style="', '"></div>'];
3318
+ var SourceInspector = () => {
3319
+ const highlightStateInit = () => ({
3320
+ element: null,
3321
+ bounding: {
3322
+ width: 0,
3323
+ height: 0,
3324
+ left: 0,
3325
+ top: 0
3326
+ },
3327
+ dataSource: ""
3328
+ });
3329
+ const [highlightState, setHighlightState] = createStore(highlightStateInit());
3330
+ const resetHighlight = () => {
3331
+ setHighlightState(highlightStateInit());
3332
+ };
3333
+ const [nameTagRef, setNameTagRef] = createSignal(null);
3334
+ const nameTagSize = createElementSize(() => nameTagRef());
3335
+ const [mousePosition, setMousePosition] = createStore({
3336
+ x: 0,
3337
+ y: 0
3338
+ });
3339
+ createEventListener(document, "mousemove", (e) => {
3340
+ setMousePosition({
3341
+ x: e.clientX,
3342
+ y: e.clientY
3343
+ });
3344
+ });
3345
+ const downList = useKeyDownList();
3346
+ const isHighlightingKeysHeld = createMemo(() => {
3347
+ const keys = downList();
3348
+ const isShiftHeld = keys.includes("SHIFT");
3349
+ const isCtrlHeld = keys.includes("CONTROL");
3350
+ const isMetaHeld = keys.includes("META");
3351
+ return isShiftHeld && (isCtrlHeld || isMetaHeld);
3352
+ });
3353
+ createEffect(() => {
3354
+ if (!isHighlightingKeysHeld()) {
3355
+ resetHighlight();
3356
+ return;
3357
+ }
3358
+ const target = document.elementFromPoint(mousePosition.x, mousePosition.y);
3359
+ if (!(target instanceof HTMLElement)) {
3360
+ resetHighlight();
3361
+ return;
3362
+ }
3363
+ if (target === highlightState.element) {
3364
+ return;
3365
+ }
3366
+ const dataSource = target.getAttribute("data-tsd-source");
3367
+ if (!dataSource) {
3368
+ resetHighlight();
3369
+ return;
3370
+ }
3371
+ const rect = target.getBoundingClientRect();
3372
+ const bounding = {
3373
+ width: rect.width,
3374
+ height: rect.height,
3375
+ left: rect.left,
3376
+ top: rect.top
3377
+ };
3378
+ setHighlightState({
3379
+ element: target,
3380
+ bounding,
3381
+ dataSource
3382
+ });
3383
+ });
3384
+ createEventListener(document, "click", (e) => {
3385
+ if (!highlightState.element) return;
3386
+ window.getSelection()?.removeAllRanges();
3387
+ e.preventDefault();
3388
+ e.stopPropagation();
3389
+ fetch(`${location.origin}/__tsd/open-source?source=${encodeURIComponent(highlightState.dataSource)}`).catch(() => {
3390
+ });
3391
+ });
3392
+ const currentElementBoxStyles = createMemo(() => {
3393
+ if (highlightState.element) {
3394
+ return {
3395
+ display: "block",
3396
+ width: `${highlightState.bounding.width}px`,
3397
+ height: `${highlightState.bounding.height}px`,
3398
+ left: `${highlightState.bounding.left}px`,
3399
+ top: `${highlightState.bounding.top}px`,
3400
+ "background-color": "oklch(55.4% 0.046 257.417 /0.25)",
3401
+ transition: "all 0.05s linear",
3402
+ position: "fixed",
3403
+ "z-index": 9999
3404
+ };
3405
+ }
3406
+ return {
3407
+ display: "none"
3408
+ };
3409
+ });
3410
+ const fileNameStyles = createMemo(() => {
3411
+ if (highlightState.element && nameTagRef()) {
3412
+ const windowWidth = window.innerWidth;
3413
+ const nameTagHeight = nameTagSize.height || 26;
3414
+ const nameTagWidth = nameTagSize.width || 0;
3415
+ let left = highlightState.bounding.left;
3416
+ let top = highlightState.bounding.top - nameTagHeight - 4;
3417
+ if (top < 0) {
3418
+ top = highlightState.bounding.top + highlightState.bounding.height + 4;
3419
+ }
3420
+ if (left + nameTagWidth > windowWidth) {
3421
+ left = windowWidth - nameTagWidth - 4;
3422
+ }
3423
+ if (left < 0) {
3424
+ left = 4;
3425
+ }
3426
+ return {
3427
+ position: "fixed",
3428
+ left: `${left}px`,
3429
+ top: `${top}px`,
3430
+ "background-color": "oklch(55.4% 0.046 257.417 /0.80)",
3431
+ color: "white",
3432
+ padding: "2px 4px",
3433
+ fontSize: "12px",
3434
+ "border-radius": "2px",
3435
+ "z-index": 1e4,
3436
+ visibility: "visible",
3437
+ transition: "all 0.05s linear"
3438
+ };
3439
+ }
3440
+ return {
3441
+ display: "none"
3442
+ };
3443
+ });
3444
+ return [ssr(_tmpl$21, ssrStyle({
3445
+ ...fileNameStyles(),
3446
+ "pointer-events": "none"
3447
+ }), escape(highlightState.dataSource)), ssr(_tmpl$211, ssrStyle({
3448
+ ...currentElementBoxStyles(),
3449
+ "pointer-events": "none"
3450
+ }))];
3451
+ };
3452
+
3453
+ // src/devtools.tsx
3454
+ var _tmpl$30 = ["<div", ">", "", "</div>"];
3455
+ function DevTools() {
3456
+ const {
3457
+ settings
3458
+ } = useDevtoolsSettings();
3459
+ const {
3460
+ setHeight
3461
+ } = useHeight();
3462
+ const {
3463
+ persistOpen,
3464
+ setPersistOpen
3465
+ } = usePersistOpen();
3466
+ const [rootEl, setRootEl] = createSignal();
3467
+ const [isOpen, setIsOpen] = createSignal(settings().defaultOpen || persistOpen());
3468
+ const pip = usePiPWindow();
3469
+ let panelRef = void 0;
3470
+ const [isResizing, setIsResizing] = createSignal(false);
3471
+ const toggleOpen = () => {
3472
+ if (pip().pipWindow) {
3473
+ return;
3474
+ }
3475
+ const open = isOpen();
3476
+ setIsOpen(!open);
3477
+ setPersistOpen(!open);
3478
+ };
3479
+ const handleDragStart = (panelElement, startEvent) => {
3480
+ if (startEvent.button !== 0) return;
3481
+ return;
3482
+ };
3483
+ createEffect(() => {
3484
+ if (isOpen()) {
3485
+ const previousValue = rootEl()?.parentElement?.style.paddingBottom;
3486
+ const run = () => {
3487
+ return;
3488
+ };
3489
+ if (typeof window !== "undefined") {
3490
+ (pip().pipWindow ?? window).addEventListener("resize", run);
3491
+ return () => {
3492
+ (pip().pipWindow ?? window).removeEventListener("resize", run);
3493
+ if (rootEl()?.parentElement && typeof previousValue === "string") {
3494
+ setRootEl((prev) => {
3495
+ return prev;
3496
+ });
3497
+ }
3498
+ };
3499
+ }
3500
+ } else {
3501
+ if (rootEl()?.parentElement) {
3502
+ setRootEl((prev) => {
3503
+ if (prev?.parentElement) {
3504
+ prev.parentElement.removeAttribute("style");
3505
+ }
3506
+ return prev;
3507
+ });
3508
+ }
3509
+ }
3510
+ return;
3511
+ });
3512
+ createEffect(() => {
3513
+ window.addEventListener("keydown", (e) => {
3514
+ if (e.key === "Escape" && isOpen()) {
3515
+ toggleOpen();
3516
+ }
3517
+ });
3518
+ });
3519
+ useDisableTabbing(isOpen);
3520
+ createEffect(() => {
3521
+ if (rootEl()) {
3522
+ const el = rootEl();
3523
+ const fontSize = getComputedStyle(el).fontSize;
3524
+ el?.style.setProperty("--tsrd-font-size", fontSize);
3525
+ }
3526
+ });
3527
+ createEffect(() => {
3528
+ const modifiers = settings().openHotkey.filter((key) => keyboardModifiers.includes(key));
3529
+ const nonModifiers = settings().openHotkey.filter((key) => !keyboardModifiers.includes(key));
3530
+ const allModifierCombinations = getAllPermutations(modifiers);
3531
+ for (const combination of allModifierCombinations) {
3532
+ const permutation = [...combination, ...nonModifiers];
3533
+ createShortcut(permutation, () => {
3534
+ toggleOpen();
3535
+ });
3536
+ }
3537
+ });
3538
+ const {
3539
+ theme
3540
+ } = useTheme();
3541
+ return createComponent(ThemeContextProvider, {
3542
+ get theme() {
3543
+ return theme();
3544
+ },
3545
+ get children() {
3546
+ return createComponent(Portal, {
3547
+ get mount() {
3548
+ return (pip().pipWindow ?? window).document.body;
3549
+ },
3550
+ get children() {
3551
+ return ssr(_tmpl$30, ssrAttribute("data-testid", escape(TANSTACK_DEVTOOLS, true), false), escape(createComponent(Show, {
3552
+ get when() {
3553
+ return pip().pipWindow !== null ? true : settings().requireUrlFlag ? window.location.search.includes(settings().urlFlag) : true;
3554
+ },
3555
+ get children() {
3556
+ return [createComponent(Trigger, {
3557
+ isOpen,
3558
+ setIsOpen: toggleOpen,
3559
+ get image() {
3560
+ return settings().triggerImage;
3561
+ }
3562
+ }), createComponent(MainPanel, {
3563
+ isResizing,
3564
+ isOpen,
3565
+ get children() {
3566
+ return createComponent(ContentPanel, {
3567
+ handleDragStart: (e) => handleDragStart(panelRef, e),
3568
+ get children() {
3569
+ return [createComponent(Tabs, {
3570
+ toggleOpen
3571
+ }), createComponent(TabContent, {})];
3572
+ }
3573
+ });
3574
+ }
3575
+ })];
3576
+ }
3577
+ })), escape(createComponent(SourceInspector, {})));
3578
+ }
3579
+ });
3580
+ }
3581
+ });
3582
+ }
3583
+
3584
+ export { DevTools as default };