@tanstack/pacer-devtools 1.1.3 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +7 -7
  2. package/dist/components-ByKT1JiI.js +1147 -0
  3. package/dist/components-DDmnxkL2.js +1315 -0
  4. package/dist/index.d.ts +6 -8
  5. package/dist/index.js +5 -6
  6. package/dist/production/index.d.ts +19 -0
  7. package/dist/{core.js → production/index.js} +3 -6
  8. package/dist/production/server.js +6 -0
  9. package/dist/server.js +9 -0
  10. package/package.json +38 -5
  11. package/src/components/index.tsx +19 -0
  12. package/src/core.tsx +3 -4
  13. package/dist/PacerContextProvider.js +0 -142
  14. package/dist/PacerContextProvider.js.map +0 -1
  15. package/dist/PacerDevtools.js +0 -14
  16. package/dist/PacerDevtools.js.map +0 -1
  17. package/dist/components/ActionButtons.js +0 -154
  18. package/dist/components/ActionButtons.js.map +0 -1
  19. package/dist/components/DetailsPanel.js +0 -76
  20. package/dist/components/DetailsPanel.js.map +0 -1
  21. package/dist/components/Shell.js +0 -107
  22. package/dist/components/Shell.js.map +0 -1
  23. package/dist/components/StateHeader.js +0 -85
  24. package/dist/components/StateHeader.js.map +0 -1
  25. package/dist/components/UtilList.js +0 -72
  26. package/dist/components/UtilList.js.map +0 -1
  27. package/dist/components/util-groups.js +0 -57
  28. package/dist/components/util-groups.js.map +0 -1
  29. package/dist/core.d.ts +0 -24
  30. package/dist/core.js.map +0 -1
  31. package/dist/index.js.map +0 -1
  32. package/dist/production.d.ts +0 -2
  33. package/dist/production.js +0 -5
  34. package/dist/styles/tokens.js +0 -301
  35. package/dist/styles/tokens.js.map +0 -1
  36. package/dist/styles/use-styles.js +0 -364
  37. package/dist/styles/use-styles.js.map +0 -1
  38. package/src/PacerDevtools.tsx +0 -10
@@ -0,0 +1,1315 @@
1
+ import { className, createComponent, delegateEvents, effect, insert, memo, setStyleProperty, template } from "solid-js/web";
2
+ import { Header, HeaderLogo, JsonTree, MainPanel, ThemeContextProvider, useTheme } from "@tanstack/devtools-ui";
3
+ import { createStore } from "solid-js/store";
4
+ import { For, createContext, createEffect, createMemo, createSignal, onCleanup, onMount, useContext } from "solid-js";
5
+ import { pacerEventClient } from "@tanstack/pacer/event-client";
6
+ import * as goober from "goober";
7
+ import { useStore } from "@tanstack/solid-store";
8
+ import clsx from "clsx";
9
+ import { pacerEventClient as pacerEventClient$1 } from "@tanstack/pacer";
10
+ import dayjs from "dayjs";
11
+ import relativeTime from "dayjs/plugin/relativeTime.js";
12
+ //#region src/PacerContextProvider.tsx
13
+ const initialPacerDevtoolsStore = {
14
+ asyncBatchers: [],
15
+ asyncDebouncers: [],
16
+ asyncQueuers: [],
17
+ asyncRateLimiters: [],
18
+ asyncThrottlers: [],
19
+ batchers: [],
20
+ debouncers: [],
21
+ queuers: [],
22
+ rateLimiters: [],
23
+ throttlers: [],
24
+ lastUpdatedByKey: {}
25
+ };
26
+ const PacerDevtoolsContext = createContext([initialPacerDevtoolsStore, () => {}]);
27
+ const updateOrAddToArray = (oldArray, newItem) => {
28
+ const index = oldArray.findIndex((item) => item.key === newItem.key);
29
+ if (index !== -1) return oldArray.map((item, i) => i === index ? newItem : item);
30
+ return [...oldArray, newItem];
31
+ };
32
+ function PacerContextProvider(props) {
33
+ const [store, setStore] = createStore(initialPacerDevtoolsStore);
34
+ createEffect(() => {
35
+ onCleanup(pacerEventClient.onAllPluginEvents((_e) => {
36
+ const e = _e;
37
+ switch (e.type) {
38
+ case "pacer:AsyncBatcher":
39
+ setStore({
40
+ asyncBatchers: updateOrAddToArray(store.asyncBatchers, e.payload),
41
+ lastUpdatedByKey: {
42
+ ...store.lastUpdatedByKey,
43
+ [e.payload.key]: Date.now()
44
+ }
45
+ });
46
+ break;
47
+ case "pacer:AsyncDebouncer":
48
+ setStore({
49
+ asyncDebouncers: updateOrAddToArray(store.asyncDebouncers, e.payload),
50
+ lastUpdatedByKey: {
51
+ ...store.lastUpdatedByKey,
52
+ [e.payload.key]: Date.now()
53
+ }
54
+ });
55
+ break;
56
+ case "pacer:AsyncQueuer":
57
+ setStore({
58
+ asyncQueuers: updateOrAddToArray(store.asyncQueuers, e.payload),
59
+ lastUpdatedByKey: {
60
+ ...store.lastUpdatedByKey,
61
+ [e.payload.key]: Date.now()
62
+ }
63
+ });
64
+ break;
65
+ case "pacer:AsyncRateLimiter":
66
+ setStore({
67
+ asyncRateLimiters: updateOrAddToArray(store.asyncRateLimiters, e.payload),
68
+ lastUpdatedByKey: {
69
+ ...store.lastUpdatedByKey,
70
+ [e.payload.key]: Date.now()
71
+ }
72
+ });
73
+ break;
74
+ case "pacer:AsyncThrottler":
75
+ setStore({
76
+ asyncThrottlers: updateOrAddToArray(store.asyncThrottlers, e.payload),
77
+ lastUpdatedByKey: {
78
+ ...store.lastUpdatedByKey,
79
+ [e.payload.key]: Date.now()
80
+ }
81
+ });
82
+ break;
83
+ case "pacer:Batcher":
84
+ setStore({
85
+ batchers: updateOrAddToArray(store.batchers, e.payload),
86
+ lastUpdatedByKey: {
87
+ ...store.lastUpdatedByKey,
88
+ [e.payload.key]: Date.now()
89
+ }
90
+ });
91
+ break;
92
+ case "pacer:Debouncer":
93
+ setStore({
94
+ debouncers: updateOrAddToArray(store.debouncers, e.payload),
95
+ lastUpdatedByKey: {
96
+ ...store.lastUpdatedByKey,
97
+ [e.payload.key]: Date.now()
98
+ }
99
+ });
100
+ break;
101
+ case "pacer:Queuer":
102
+ setStore({
103
+ queuers: updateOrAddToArray(store.queuers, e.payload),
104
+ lastUpdatedByKey: {
105
+ ...store.lastUpdatedByKey,
106
+ [e.payload.key]: Date.now()
107
+ }
108
+ });
109
+ break;
110
+ case "pacer:RateLimiter":
111
+ setStore({
112
+ rateLimiters: updateOrAddToArray(store.rateLimiters, e.payload),
113
+ lastUpdatedByKey: {
114
+ ...store.lastUpdatedByKey,
115
+ [e.payload.key]: Date.now()
116
+ }
117
+ });
118
+ break;
119
+ case "pacer:Throttler":
120
+ setStore({
121
+ throttlers: updateOrAddToArray(store.throttlers, e.payload),
122
+ lastUpdatedByKey: {
123
+ ...store.lastUpdatedByKey,
124
+ [e.payload.key]: Date.now()
125
+ }
126
+ });
127
+ break;
128
+ }
129
+ }));
130
+ });
131
+ return createComponent(PacerDevtoolsContext.Provider, {
132
+ value: [store, setStore],
133
+ get children() {
134
+ return props.children;
135
+ }
136
+ });
137
+ }
138
+ const usePacerDevtoolsContext = () => {
139
+ return useContext(PacerDevtoolsContext);
140
+ };
141
+ const usePacerDevtoolsState = () => {
142
+ const [state] = usePacerDevtoolsContext();
143
+ return state;
144
+ };
145
+ //#endregion
146
+ //#region src/styles/tokens.ts
147
+ const tokens = {
148
+ colors: {
149
+ inherit: "inherit",
150
+ current: "currentColor",
151
+ transparent: "transparent",
152
+ black: "#000000",
153
+ white: "#ffffff",
154
+ neutral: {
155
+ 50: "#f9fafb",
156
+ 100: "#f2f4f7",
157
+ 200: "#eaecf0",
158
+ 300: "#d0d5dd",
159
+ 400: "#98a2b3",
160
+ 500: "#667085",
161
+ 600: "#475467",
162
+ 700: "#344054",
163
+ 800: "#1d2939",
164
+ 900: "#101828"
165
+ },
166
+ darkGray: {
167
+ 50: "#525c7a",
168
+ 100: "#49536e",
169
+ 200: "#414962",
170
+ 300: "#394056",
171
+ 400: "#313749",
172
+ 500: "#292e3d",
173
+ 600: "#212530",
174
+ 700: "#191c24",
175
+ 800: "#111318",
176
+ 900: "#0b0d10"
177
+ },
178
+ gray: {
179
+ 50: "#f9fafb",
180
+ 100: "#f2f4f7",
181
+ 200: "#eaecf0",
182
+ 300: "#d0d5dd",
183
+ 400: "#98a2b3",
184
+ 500: "#667085",
185
+ 600: "#475467",
186
+ 700: "#344054",
187
+ 800: "#1d2939",
188
+ 900: "#101828"
189
+ },
190
+ blue: {
191
+ 25: "#F5FAFF",
192
+ 50: "#EFF8FF",
193
+ 100: "#D1E9FF",
194
+ 200: "#B2DDFF",
195
+ 300: "#84CAFF",
196
+ 400: "#53B1FD",
197
+ 500: "#2E90FA",
198
+ 600: "#1570EF",
199
+ 700: "#175CD3",
200
+ 800: "#1849A9",
201
+ 900: "#194185"
202
+ },
203
+ green: {
204
+ 25: "#F6FEF9",
205
+ 50: "#ECFDF3",
206
+ 100: "#D1FADF",
207
+ 200: "#A6F4C5",
208
+ 300: "#6CE9A6",
209
+ 400: "#32D583",
210
+ 500: "#12B76A",
211
+ 600: "#039855",
212
+ 700: "#027A48",
213
+ 800: "#05603A",
214
+ 900: "#054F31"
215
+ },
216
+ red: {
217
+ 50: "#fef2f2",
218
+ 100: "#fee2e2",
219
+ 200: "#fecaca",
220
+ 300: "#fca5a5",
221
+ 400: "#f87171",
222
+ 500: "#ef4444",
223
+ 600: "#dc2626",
224
+ 700: "#b91c1c",
225
+ 800: "#991b1b",
226
+ 900: "#7f1d1d",
227
+ 950: "#450a0a"
228
+ },
229
+ yellow: {
230
+ 25: "#FFFCF5",
231
+ 50: "#FFFAEB",
232
+ 100: "#FEF0C7",
233
+ 200: "#FEDF89",
234
+ 300: "#FEC84B",
235
+ 400: "#FDB022",
236
+ 500: "#F79009",
237
+ 600: "#DC6803",
238
+ 700: "#B54708",
239
+ 800: "#93370D",
240
+ 900: "#7A2E0E"
241
+ },
242
+ purple: {
243
+ 25: "#FAFAFF",
244
+ 50: "#F4F3FF",
245
+ 100: "#EBE9FE",
246
+ 200: "#D9D6FE",
247
+ 300: "#BDB4FE",
248
+ 400: "#9B8AFB",
249
+ 500: "#7A5AF8",
250
+ 600: "#6938EF",
251
+ 700: "#5925DC",
252
+ 800: "#4A1FB8",
253
+ 900: "#3E1C96"
254
+ },
255
+ teal: {
256
+ 25: "#F6FEFC",
257
+ 50: "#F0FDF9",
258
+ 100: "#CCFBEF",
259
+ 200: "#99F6E0",
260
+ 300: "#5FE9D0",
261
+ 400: "#2ED3B7",
262
+ 500: "#15B79E",
263
+ 600: "#0E9384",
264
+ 700: "#107569",
265
+ 800: "#125D56",
266
+ 900: "#134E48"
267
+ },
268
+ pink: {
269
+ 25: "#fdf2f8",
270
+ 50: "#fce7f3",
271
+ 100: "#fbcfe8",
272
+ 200: "#f9a8d4",
273
+ 300: "#f472b6",
274
+ 400: "#ec4899",
275
+ 500: "#db2777",
276
+ 600: "#be185d",
277
+ 700: "#9d174d",
278
+ 800: "#831843",
279
+ 900: "#500724"
280
+ },
281
+ cyan: {
282
+ 25: "#ecfeff",
283
+ 50: "#cffafe",
284
+ 100: "#a5f3fc",
285
+ 200: "#67e8f9",
286
+ 300: "#22d3ee",
287
+ 400: "#06b6d4",
288
+ 500: "#0891b2",
289
+ 600: "#0e7490",
290
+ 700: "#155e75",
291
+ 800: "#164e63",
292
+ 900: "#083344"
293
+ }
294
+ },
295
+ alpha: {
296
+ 100: "ff",
297
+ 90: "e5",
298
+ 80: "cc",
299
+ 70: "b3",
300
+ 60: "99",
301
+ 50: "80",
302
+ 40: "66",
303
+ 30: "4d",
304
+ 20: "33",
305
+ 10: "1a",
306
+ 0: "00"
307
+ },
308
+ font: {
309
+ size: {
310
+ "2xs": "calc(var(--tsrd-font-size) * 0.625)",
311
+ xs: "calc(var(--tsrd-font-size) * 0.75)",
312
+ sm: "calc(var(--tsrd-font-size) * 0.875)",
313
+ md: "var(--tsrd-font-size)",
314
+ lg: "calc(var(--tsrd-font-size) * 1.125)",
315
+ xl: "calc(var(--tsrd-font-size) * 1.25)",
316
+ "2xl": "calc(var(--tsrd-font-size) * 1.5)",
317
+ "3xl": "calc(var(--tsrd-font-size) * 1.875)",
318
+ "4xl": "calc(var(--tsrd-font-size) * 2.25)",
319
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
320
+ "6xl": "calc(var(--tsrd-font-size) * 3.75)",
321
+ "7xl": "calc(var(--tsrd-font-size) * 4.5)",
322
+ "8xl": "calc(var(--tsrd-font-size) * 6)",
323
+ "9xl": "calc(var(--tsrd-font-size) * 8)"
324
+ },
325
+ lineHeight: {
326
+ "3xs": "calc(var(--tsrd-font-size) * 0.75)",
327
+ "2xs": "calc(var(--tsrd-font-size) * 0.875)",
328
+ xs: "calc(var(--tsrd-font-size) * 1)",
329
+ sm: "calc(var(--tsrd-font-size) * 1.25)",
330
+ md: "calc(var(--tsrd-font-size) * 1.5)",
331
+ lg: "calc(var(--tsrd-font-size) * 1.75)",
332
+ xl: "calc(var(--tsrd-font-size) * 2)",
333
+ "2xl": "calc(var(--tsrd-font-size) * 2.25)",
334
+ "3xl": "calc(var(--tsrd-font-size) * 2.5)",
335
+ "4xl": "calc(var(--tsrd-font-size) * 2.75)",
336
+ "5xl": "calc(var(--tsrd-font-size) * 3)",
337
+ "6xl": "calc(var(--tsrd-font-size) * 3.25)",
338
+ "7xl": "calc(var(--tsrd-font-size) * 3.5)",
339
+ "8xl": "calc(var(--tsrd-font-size) * 3.75)",
340
+ "9xl": "calc(var(--tsrd-font-size) * 4)"
341
+ },
342
+ weight: {
343
+ thin: "100",
344
+ extralight: "200",
345
+ light: "300",
346
+ normal: "400",
347
+ medium: "500",
348
+ semibold: "600",
349
+ bold: "700",
350
+ extrabold: "800",
351
+ black: "900"
352
+ },
353
+ fontFamily: {
354
+ sans: "ui-sans-serif, Inter, system-ui, sans-serif, sans-serif",
355
+ mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`
356
+ }
357
+ },
358
+ breakpoints: {
359
+ xs: "320px",
360
+ sm: "640px",
361
+ md: "768px",
362
+ lg: "1024px",
363
+ xl: "1280px",
364
+ "2xl": "1536px"
365
+ },
366
+ border: { radius: {
367
+ none: "0px",
368
+ xs: "calc(var(--tsrd-font-size) * 0.125)",
369
+ sm: "calc(var(--tsrd-font-size) * 0.25)",
370
+ md: "calc(var(--tsrd-font-size) * 0.375)",
371
+ lg: "calc(var(--tsrd-font-size) * 0.5)",
372
+ xl: "calc(var(--tsrd-font-size) * 0.75)",
373
+ "2xl": "calc(var(--tsrd-font-size) * 1)",
374
+ "3xl": "calc(var(--tsrd-font-size) * 1.5)",
375
+ full: "9999px"
376
+ } },
377
+ size: {
378
+ 0: "0px",
379
+ .25: "calc(var(--tsrd-font-size) * 0.0625)",
380
+ .5: "calc(var(--tsrd-font-size) * 0.125)",
381
+ 1: "calc(var(--tsrd-font-size) * 0.25)",
382
+ 1.5: "calc(var(--tsrd-font-size) * 0.375)",
383
+ 2: "calc(var(--tsrd-font-size) * 0.5)",
384
+ 2.5: "calc(var(--tsrd-font-size) * 0.625)",
385
+ 3: "calc(var(--tsrd-font-size) * 0.75)",
386
+ 3.5: "calc(var(--tsrd-font-size) * 0.875)",
387
+ 4: "calc(var(--tsrd-font-size) * 1)",
388
+ 4.5: "calc(var(--tsrd-font-size) * 1.125)",
389
+ 5: "calc(var(--tsrd-font-size) * 1.25)",
390
+ 5.5: "calc(var(--tsrd-font-size) * 1.375)",
391
+ 6: "calc(var(--tsrd-font-size) * 1.5)",
392
+ 6.5: "calc(var(--tsrd-font-size) * 1.625)",
393
+ 7: "calc(var(--tsrd-font-size) * 1.75)",
394
+ 8: "calc(var(--tsrd-font-size) * 2)",
395
+ 9: "calc(var(--tsrd-font-size) * 2.25)",
396
+ 10: "calc(var(--tsrd-font-size) * 2.5)",
397
+ 11: "calc(var(--tsrd-font-size) * 2.75)",
398
+ 12: "calc(var(--tsrd-font-size) * 3)",
399
+ 14: "calc(var(--tsrd-font-size) * 3.5)",
400
+ 16: "calc(var(--tsrd-font-size) * 4)",
401
+ 20: "calc(var(--tsrd-font-size) * 5)",
402
+ 24: "calc(var(--tsrd-font-size) * 6)",
403
+ 28: "calc(var(--tsrd-font-size) * 7)",
404
+ 32: "calc(var(--tsrd-font-size) * 8)",
405
+ 36: "calc(var(--tsrd-font-size) * 9)",
406
+ 40: "calc(var(--tsrd-font-size) * 10)",
407
+ 44: "calc(var(--tsrd-font-size) * 11)",
408
+ 48: "calc(var(--tsrd-font-size) * 12)",
409
+ 52: "calc(var(--tsrd-font-size) * 13)",
410
+ 56: "calc(var(--tsrd-font-size) * 14)",
411
+ 60: "calc(var(--tsrd-font-size) * 15)",
412
+ 64: "calc(var(--tsrd-font-size) * 16)",
413
+ 72: "calc(var(--tsrd-font-size) * 18)",
414
+ 80: "calc(var(--tsrd-font-size) * 20)",
415
+ 96: "calc(var(--tsrd-font-size) * 24)"
416
+ },
417
+ shadow: {
418
+ xs: (_ = "rgb(0 0 0 / 0.1)") => `0 1px 2px 0 rgb(0 0 0 / 0.05)`,
419
+ sm: (color = "rgb(0 0 0 / 0.1)") => `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}`,
420
+ md: (color = "rgb(0 0 0 / 0.1)") => `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}`,
421
+ lg: (color = "rgb(0 0 0 / 0.1)") => `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}`,
422
+ xl: (color = "rgb(0 0 0 / 0.1)") => `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}`,
423
+ "2xl": (color = "rgb(0 0 0 / 0.25)") => `0 25px 50px -12px ${color}`,
424
+ inner: (color = "rgb(0 0 0 / 0.05)") => `inset 0 2px 4px 0 ${color}`,
425
+ none: () => `none`
426
+ },
427
+ zIndices: {
428
+ hide: -1,
429
+ auto: "auto",
430
+ base: 0,
431
+ docked: 10,
432
+ dropdown: 1e3,
433
+ sticky: 1100,
434
+ banner: 1200,
435
+ overlay: 1300,
436
+ modal: 1400,
437
+ popover: 1500,
438
+ skipLink: 1600,
439
+ toast: 1700,
440
+ tooltip: 1800
441
+ }
442
+ };
443
+ //#endregion
444
+ //#region src/styles/use-styles.ts
445
+ const stylesFactory = (theme) => {
446
+ const { colors, font, size, alpha, border } = tokens;
447
+ const { fontFamily, size: fontSize } = font;
448
+ const css = goober.css;
449
+ const t = (light, dark) => theme === "light" ? light : dark;
450
+ return {
451
+ mainContainer: css`
452
+ display: flex;
453
+ flex: 1;
454
+ min-height: 0;
455
+ overflow: hidden;
456
+ padding: ${size[2]};
457
+ padding-top: 0;
458
+ margin-top: ${size[2]};
459
+ `,
460
+ dragHandle: css`
461
+ width: 8px;
462
+ background: ${t(colors.gray[300], colors.darkGray[600])};
463
+ cursor: col-resize;
464
+ position: relative;
465
+ transition: all 0.2s ease;
466
+ user-select: none;
467
+ pointer-events: all;
468
+ margin: 0 ${size[1]};
469
+ border-radius: 2px;
470
+
471
+ &:hover {
472
+ background: ${t(colors.blue[600], colors.blue[500])};
473
+ margin: 0 ${size[1]};
474
+ }
475
+
476
+ &.dragging {
477
+ background: ${t(colors.blue[700], colors.blue[600])};
478
+ margin: 0 ${size[1]};
479
+ }
480
+
481
+ &::after {
482
+ content: '';
483
+ position: absolute;
484
+ top: 50%;
485
+ left: 50%;
486
+ transform: translate(-50%, -50%);
487
+ width: 2px;
488
+ height: 20px;
489
+ background: ${t(colors.gray[400], colors.darkGray[400])};
490
+ border-radius: 1px;
491
+ pointer-events: none;
492
+ }
493
+
494
+ &:hover::after,
495
+ &.dragging::after {
496
+ background: ${t(colors.blue[500], colors.blue[300])};
497
+ }
498
+ `,
499
+ leftPanel: css`
500
+ background: ${t(colors.gray[100], colors.darkGray[800])};
501
+ border-radius: ${border.radius.lg};
502
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
503
+ display: flex;
504
+ flex-direction: column;
505
+ overflow: hidden;
506
+ min-height: 0;
507
+ flex-shrink: 0;
508
+ `,
509
+ rightPanel: css`
510
+ background: ${t(colors.gray[100], colors.darkGray[800])};
511
+ border-radius: ${border.radius.lg};
512
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
513
+ display: flex;
514
+ flex-direction: column;
515
+ overflow: hidden;
516
+ min-height: 0;
517
+ flex: 1;
518
+ `,
519
+ panelHeader: css`
520
+ font-size: ${fontSize.md};
521
+ font-weight: ${font.weight.bold};
522
+ color: ${t(colors.blue[700], colors.blue[400])};
523
+ padding: ${size[2]};
524
+ border-bottom: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
525
+ background: ${t(colors.gray[100], colors.darkGray[800])};
526
+ flex-shrink: 0;
527
+ `,
528
+ utilList: css`
529
+ flex: 1;
530
+ overflow-y: auto;
531
+ padding: ${size[1]};
532
+ min-height: 0;
533
+ `,
534
+ utilGroup: css`
535
+ margin-bottom: ${size[2]};
536
+ `,
537
+ utilGroupHeader: css`
538
+ font-size: ${fontSize.xs};
539
+ font-weight: ${font.weight.semibold};
540
+ color: ${t(colors.gray[600], colors.gray[400])};
541
+ text-transform: uppercase;
542
+ letter-spacing: 0.05em;
543
+ margin-bottom: ${size[1]};
544
+ padding: ${size[1]} ${size[2]};
545
+ background: ${t(colors.gray[200], colors.darkGray[700])};
546
+ border-radius: ${border.radius.md};
547
+ `,
548
+ utilRow: css`
549
+ display: flex;
550
+ justify-content: space-between;
551
+ align-items: center;
552
+ padding: ${size[2]};
553
+ margin-bottom: ${size[1]};
554
+ background: ${t(colors.gray[200], colors.darkGray[700])};
555
+ border-radius: ${border.radius.md};
556
+ cursor: pointer;
557
+ transition: all 0.2s ease;
558
+ border: 1px solid transparent;
559
+
560
+ &:hover {
561
+ background: ${t(colors.gray[300], colors.darkGray[600])};
562
+ border-color: ${t(colors.gray[400], colors.darkGray[500])};
563
+ }
564
+ `,
565
+ utilRowSelected: css`
566
+ background: ${t(colors.blue[100], colors.blue[900] + alpha[20])};
567
+ border-color: ${t(colors.blue[600], colors.blue[500])};
568
+ box-shadow: 0 0 0 1px
569
+ ${t(colors.blue[600] + alpha[30], colors.blue[500] + alpha[30])};
570
+ `,
571
+ utilKey: css`
572
+ font-family: ${fontFamily.mono};
573
+ font-size: ${fontSize.xs};
574
+ color: ${t(colors.gray[900], colors.gray[100])};
575
+ flex: 1;
576
+ overflow: hidden;
577
+ text-overflow: ellipsis;
578
+ white-space: nowrap;
579
+ `,
580
+ utilStatus: css`
581
+ font-size: ${fontSize.xs};
582
+ color: ${t(colors.gray[600], colors.gray[400])};
583
+ text-transform: uppercase;
584
+ letter-spacing: 0.05em;
585
+ padding: ${size[1]} ${size[1]};
586
+ background: ${t(colors.gray[300], colors.darkGray[600])};
587
+ border-radius: ${border.radius.sm};
588
+ margin-left: ${size[1]};
589
+ `,
590
+ stateDetails: css`
591
+ flex: 1;
592
+ overflow-y: auto;
593
+ padding: ${size[2]};
594
+ min-height: 0;
595
+ `,
596
+ stateHeader: css`
597
+ margin-bottom: ${size[2]};
598
+ padding-bottom: ${size[2]};
599
+ border-bottom: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
600
+ `,
601
+ stateTitle: css`
602
+ font-size: ${fontSize.md};
603
+ font-weight: ${font.weight.bold};
604
+ color: ${t(colors.blue[700], colors.blue[400])};
605
+ margin-bottom: ${size[1]};
606
+ `,
607
+ stateKey: css`
608
+ font-family: ${fontFamily.mono};
609
+ font-size: ${fontSize.xs};
610
+ color: ${t(colors.gray[600], colors.gray[400])};
611
+ word-break: break-all;
612
+ `,
613
+ stateContent: css`
614
+ background: ${t(colors.gray[100], colors.darkGray[700])};
615
+ border-radius: ${border.radius.md};
616
+ padding: ${size[2]};
617
+ border: 1px solid ${t(colors.gray[300], colors.darkGray[600])};
618
+ `,
619
+ detailsGrid: css`
620
+ display: grid;
621
+ grid-template-columns: 1fr;
622
+ gap: ${size[2]};
623
+ align-items: start;
624
+ `,
625
+ detailSection: css`
626
+ background: ${t(colors.white, colors.darkGray[700])};
627
+ border: 1px solid ${t(colors.gray[300], colors.darkGray[600])};
628
+ border-radius: ${border.radius.md};
629
+ padding: ${size[2]};
630
+ `,
631
+ detailSectionHeader: css`
632
+ font-size: ${fontSize.sm};
633
+ font-weight: ${font.weight.bold};
634
+ color: ${t(colors.gray[800], colors.gray[200])};
635
+ margin-bottom: ${size[1]};
636
+ text-transform: uppercase;
637
+ letter-spacing: 0.04em;
638
+ `,
639
+ actionsRow: css`
640
+ display: flex;
641
+ flex-wrap: wrap;
642
+ gap: ${size[2]};
643
+ `,
644
+ actionButton: css`
645
+ display: inline-flex;
646
+ align-items: center;
647
+ gap: ${size[1]};
648
+ padding: ${size[1]} ${size[2]};
649
+ border-radius: ${border.radius.md};
650
+ border: 1px solid ${t(colors.gray[300], colors.darkGray[500])};
651
+ background: ${t(colors.gray[200], colors.darkGray[600])};
652
+ color: ${t(colors.gray[900], colors.gray[100])};
653
+ font-size: ${fontSize.xs};
654
+ cursor: pointer;
655
+ user-select: none;
656
+ transition:
657
+ background 0.15s,
658
+ border-color 0.15s;
659
+ &:hover {
660
+ background: ${t(colors.gray[300], colors.darkGray[500])};
661
+ border-color: ${t(colors.gray[400], colors.darkGray[400])};
662
+ }
663
+ &:disabled {
664
+ opacity: 0.5;
665
+ cursor: not-allowed;
666
+ &:hover {
667
+ background: ${t(colors.gray[200], colors.darkGray[600])};
668
+ border-color: ${t(colors.gray[300], colors.darkGray[500])};
669
+ }
670
+ }
671
+ `,
672
+ actionDotBlue: css`
673
+ width: 6px;
674
+ height: 6px;
675
+ border-radius: 9999px;
676
+ background: ${colors.blue[400]};
677
+ `,
678
+ actionDotGreen: css`
679
+ width: 6px;
680
+ height: 6px;
681
+ border-radius: 9999px;
682
+ background: ${colors.green[400]};
683
+ `,
684
+ actionDotRed: css`
685
+ width: 6px;
686
+ height: 6px;
687
+ border-radius: 9999px;
688
+ background: ${colors.red[400]};
689
+ `,
690
+ actionDotYellow: css`
691
+ width: 6px;
692
+ height: 6px;
693
+ border-radius: 9999px;
694
+ background: ${colors.yellow[400]};
695
+ `,
696
+ actionDotOrange: css`
697
+ width: 6px;
698
+ height: 6px;
699
+ border-radius: 9999px;
700
+ background: ${colors.pink[400]};
701
+ `,
702
+ actionDotPurple: css`
703
+ width: 6px;
704
+ height: 6px;
705
+ border-radius: 9999px;
706
+ background: ${colors.purple[400]};
707
+ `,
708
+ infoGrid: css`
709
+ display: grid;
710
+ grid-template-columns: auto 1fr;
711
+ gap: ${size[1]};
712
+ row-gap: ${size[1]};
713
+ align-items: center;
714
+ `,
715
+ infoLabel: css`
716
+ color: ${t(colors.gray[600], colors.gray[400])};
717
+ font-size: ${fontSize.xs};
718
+ text-transform: uppercase;
719
+ letter-spacing: 0.05em;
720
+ `,
721
+ infoValueMono: css`
722
+ font-family: ${fontFamily.mono};
723
+ font-size: ${fontSize.xs};
724
+ color: ${t(colors.gray[900], colors.gray[100])};
725
+ word-break: break-all;
726
+ `,
727
+ noSelection: css`
728
+ flex: 1;
729
+ display: flex;
730
+ align-items: center;
731
+ justify-content: center;
732
+ color: ${t(colors.gray[500], colors.gray[500])};
733
+ font-style: italic;
734
+ text-align: center;
735
+ padding: ${size[4]};
736
+ `,
737
+ sectionContainer: css`
738
+ display: flex;
739
+ flex-wrap: wrap;
740
+ gap: ${size[4]};
741
+ `,
742
+ section: css`
743
+ background: ${t(colors.gray[100], colors.darkGray[800])};
744
+ border-radius: ${border.radius.lg};
745
+ box-shadow: ${tokens.shadow.md(t(colors.gray[400] + alpha[80], colors.black + alpha[80]))};
746
+ padding: ${size[4]};
747
+ margin-bottom: ${size[4]};
748
+ border: 1px solid ${t(colors.gray[200], colors.darkGray[700])};
749
+ min-width: 0;
750
+ max-width: 33%;
751
+ max-height: fit-content;
752
+ `,
753
+ sectionHeader: css`
754
+ font-size: ${fontSize.lg};
755
+ font-weight: ${font.weight.bold};
756
+ margin-bottom: ${size[2]};
757
+ color: ${t(colors.blue[600], colors.blue[400])};
758
+ letter-spacing: 0.01em;
759
+ display: flex;
760
+ align-items: center;
761
+ gap: ${size[2]};
762
+ `,
763
+ sectionEmpty: css`
764
+ color: ${t(colors.gray[500], colors.gray[500])};
765
+ font-size: ${fontSize.sm};
766
+ font-style: italic;
767
+ margin: ${size[2]} 0;
768
+ `,
769
+ instanceList: css`
770
+ display: flex;
771
+ flex-direction: column;
772
+ gap: ${size[2]};
773
+ background: ${t(colors.gray[200], colors.darkGray[700])};
774
+ border: 1px solid ${t(colors.gray[300], colors.darkGray[600])};
775
+ `,
776
+ instanceCard: css`
777
+ background: ${t(colors.gray[200], colors.darkGray[700])};
778
+ border-radius: ${border.radius.md};
779
+ padding: ${size[3]};
780
+ border: 1px solid ${t(colors.gray[300], colors.darkGray[600])};
781
+ font-size: ${fontSize.sm};
782
+ color: ${t(colors.gray[900], colors.gray[100])};
783
+ font-family: ${fontFamily.mono};
784
+ overflow-x: auto;
785
+ transition:
786
+ box-shadow 0.3s,
787
+ background 0.3s;
788
+ `
789
+ };
790
+ };
791
+ function useStyles() {
792
+ const { theme } = useTheme();
793
+ const [styles, setStyles] = createSignal(stylesFactory(theme()));
794
+ createEffect(() => {
795
+ setStyles(stylesFactory(theme()));
796
+ });
797
+ return styles;
798
+ }
799
+ //#endregion
800
+ //#region src/components/util-groups.ts
801
+ const UTIL_GROUPS = [
802
+ {
803
+ key: "debouncers",
804
+ label: "Debouncers",
805
+ displayName: "Debouncer"
806
+ },
807
+ {
808
+ key: "throttlers",
809
+ label: "Throttlers",
810
+ displayName: "Throttler"
811
+ },
812
+ {
813
+ key: "batchers",
814
+ label: "Batchers",
815
+ displayName: "Batcher"
816
+ },
817
+ {
818
+ key: "queuers",
819
+ label: "Queuers",
820
+ displayName: "Queuer"
821
+ },
822
+ {
823
+ key: "rateLimiters",
824
+ label: "Rate Limiters",
825
+ displayName: "Rate Limiter"
826
+ },
827
+ {
828
+ key: "asyncDebouncers",
829
+ label: "Async Debouncers",
830
+ displayName: "Async Debouncer"
831
+ },
832
+ {
833
+ key: "asyncThrottlers",
834
+ label: "Async Throttlers",
835
+ displayName: "Async Throttler"
836
+ },
837
+ {
838
+ key: "asyncBatchers",
839
+ label: "Async Batchers",
840
+ displayName: "Async Batcher"
841
+ },
842
+ {
843
+ key: "asyncQueuers",
844
+ label: "Async Queuers",
845
+ displayName: "Async Queuer"
846
+ },
847
+ {
848
+ key: "asyncRateLimiters",
849
+ label: "Async Rate Limiters",
850
+ displayName: "Async Rate Limiter"
851
+ }
852
+ ];
853
+ //#endregion
854
+ //#region src/components/UtilList.tsx
855
+ var _tmpl$$4 = /* @__PURE__ */ template(`<div>`), _tmpl$2$2 = /* @__PURE__ */ template(`<div><div>`), _tmpl$3$2 = /* @__PURE__ */ template(`<div><div></div><div>`);
856
+ function UtilList(props) {
857
+ const styles = useStyles();
858
+ return (() => {
859
+ var _el$ = _tmpl$$4();
860
+ insert(_el$, createComponent(For, {
861
+ each: UTIL_GROUPS,
862
+ children: (group) => memo(() => memo(() => props.utilState()[group.key].length > 0)() && (() => {
863
+ var _el$2 = _tmpl$2$2(), _el$3 = _el$2.firstChild;
864
+ insert(_el$3, () => group.label);
865
+ insert(_el$2, createComponent(For, {
866
+ get each() {
867
+ return props.utilState()[group.key];
868
+ },
869
+ children: (instance) => {
870
+ const status = (() => {
871
+ try {
872
+ const statusAccessor = useStore(instance.store, (s) => s.status);
873
+ return () => statusAccessor() ?? "unknown";
874
+ } catch {
875
+ return () => "unknown";
876
+ }
877
+ })();
878
+ return (() => {
879
+ var _el$4 = _tmpl$3$2(), _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling;
880
+ _el$4.$$click = () => props.setSelectedKey(instance.key ?? null);
881
+ insert(_el$5, () => instance.key);
882
+ insert(_el$6, status);
883
+ effect((_p$) => {
884
+ var _v$3 = clsx(styles().utilRow, props.selectedKey() === instance.key && styles().utilRowSelected), _v$4 = styles().utilKey, _v$5 = styles().utilStatus;
885
+ _v$3 !== _p$.e && className(_el$4, _p$.e = _v$3);
886
+ _v$4 !== _p$.t && className(_el$5, _p$.t = _v$4);
887
+ _v$5 !== _p$.a && className(_el$6, _p$.a = _v$5);
888
+ return _p$;
889
+ }, {
890
+ e: void 0,
891
+ t: void 0,
892
+ a: void 0
893
+ });
894
+ return _el$4;
895
+ })();
896
+ }
897
+ }), null);
898
+ effect((_p$) => {
899
+ var _v$ = styles().utilGroup, _v$2 = styles().utilGroupHeader;
900
+ _v$ !== _p$.e && className(_el$2, _p$.e = _v$);
901
+ _v$2 !== _p$.t && className(_el$3, _p$.t = _v$2);
902
+ return _p$;
903
+ }, {
904
+ e: void 0,
905
+ t: void 0
906
+ });
907
+ return _el$2;
908
+ })())
909
+ }));
910
+ effect(() => className(_el$, styles().utilList));
911
+ return _el$;
912
+ })();
913
+ }
914
+ delegateEvents(["click"]);
915
+ //#endregion
916
+ //#region src/components/ActionButtons.tsx
917
+ var _tmpl$$3 = /* @__PURE__ */ template(`<div>No actions available for this util`), _tmpl$2$1 = /* @__PURE__ */ template(`<div>`), _tmpl$3$1 = /* @__PURE__ */ template(`<button><span>`), _tmpl$4 = /* @__PURE__ */ template(`<button><span></span>Flush`), _tmpl$5 = /* @__PURE__ */ template(`<button><span></span>Cancel`), _tmpl$6 = /* @__PURE__ */ template(`<button><span></span>Reset`), _tmpl$7 = /* @__PURE__ */ template(`<button><span></span>Clear`);
918
+ function ActionButtons(props) {
919
+ const styles = useStyles();
920
+ const utilInstance = props.instance;
921
+ const utilState = utilInstance?.store?.state;
922
+ const hasPending = utilState && "isPending" in utilState;
923
+ const hasEmpty = utilState && "isEmpty" in utilState;
924
+ const isPending = hasPending ? !!utilState.isPending : false;
925
+ const isEmpty = hasEmpty ? utilState.isEmpty : void 0;
926
+ const hasFlush = typeof utilInstance.flush === "function";
927
+ const hasCancel = typeof utilInstance.cancel === "function";
928
+ const hasReset = typeof utilInstance.reset === "function";
929
+ const hasClear = typeof utilInstance.clear === "function";
930
+ const hasStart = typeof utilInstance.start === "function";
931
+ const hasStop = typeof utilInstance.stop === "function";
932
+ const hasStartStop = hasStart && hasStop;
933
+ const isRunning = utilState?.isRunning ?? true;
934
+ if (!hasPending && !hasFlush && !hasCancel && !hasReset && !hasClear) return (() => {
935
+ var _el$ = _tmpl$$3();
936
+ effect(() => className(_el$, styles().sectionEmpty));
937
+ return _el$;
938
+ })();
939
+ const emitName = `d-${props.utilName}`;
940
+ return (() => {
941
+ var _el$2 = _tmpl$2$1();
942
+ insert(_el$2, hasPending && (() => {
943
+ var _el$3 = _tmpl$3$1(), _el$4 = _el$3.firstChild;
944
+ _el$3.$$mousedown = () => {
945
+ const next = !isPending;
946
+ utilInstance.store.setState((prev) => ({
947
+ ...prev,
948
+ isPending: next
949
+ }));
950
+ pacerEventClient$1.emit(emitName, utilInstance);
951
+ };
952
+ insert(_el$3, isPending ? "Restore Pending" : "Trigger Pending", null);
953
+ effect((_p$) => {
954
+ var _v$ = styles().actionButton, _v$2 = styles().actionDotBlue;
955
+ _v$ !== _p$.e && className(_el$3, _p$.e = _v$);
956
+ _v$2 !== _p$.t && className(_el$4, _p$.t = _v$2);
957
+ return _p$;
958
+ }, {
959
+ e: void 0,
960
+ t: void 0
961
+ });
962
+ return _el$3;
963
+ })(), null);
964
+ insert(_el$2, hasFlush && (() => {
965
+ var _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild;
966
+ _el$5.$$mousedown = () => {
967
+ utilInstance.flush();
968
+ pacerEventClient$1.emit(emitName, utilInstance);
969
+ };
970
+ effect((_p$) => {
971
+ var _v$3 = styles().actionButton, _v$4 = props.utilName.toLowerCase().includes("debouncer") && !isPending || props.utilName.toLowerCase().includes("throttler") && !isPending || props.utilName.toLowerCase().includes("batcher") && isEmpty || props.utilName.toLowerCase().includes("queuer") && isEmpty, _v$5 = styles().actionDotGreen;
972
+ _v$3 !== _p$.e && className(_el$5, _p$.e = _v$3);
973
+ _v$4 !== _p$.t && (_el$5.disabled = _p$.t = _v$4);
974
+ _v$5 !== _p$.a && className(_el$6, _p$.a = _v$5);
975
+ return _p$;
976
+ }, {
977
+ e: void 0,
978
+ t: void 0,
979
+ a: void 0
980
+ });
981
+ return _el$5;
982
+ })(), null);
983
+ insert(_el$2, hasCancel && (() => {
984
+ var _el$7 = _tmpl$5(), _el$8 = _el$7.firstChild;
985
+ _el$7.$$mousedown = () => {
986
+ utilInstance.cancel();
987
+ pacerEventClient$1.emit(emitName, utilInstance);
988
+ };
989
+ effect((_p$) => {
990
+ var _v$6 = styles().actionButton, _v$7 = props.utilName.toLowerCase().includes("debouncer") && !isPending || props.utilName.toLowerCase().includes("throttler") && !isPending || props.utilName.toLowerCase().includes("batcher") && isEmpty || props.utilName.toLowerCase().includes("queuer") && isEmpty, _v$8 = styles().actionDotRed;
991
+ _v$6 !== _p$.e && className(_el$7, _p$.e = _v$6);
992
+ _v$7 !== _p$.t && (_el$7.disabled = _p$.t = _v$7);
993
+ _v$8 !== _p$.a && className(_el$8, _p$.a = _v$8);
994
+ return _p$;
995
+ }, {
996
+ e: void 0,
997
+ t: void 0,
998
+ a: void 0
999
+ });
1000
+ return _el$7;
1001
+ })(), null);
1002
+ insert(_el$2, hasReset && (() => {
1003
+ var _el$9 = _tmpl$6(), _el$0 = _el$9.firstChild;
1004
+ _el$9.$$mousedown = () => {
1005
+ utilInstance.reset();
1006
+ pacerEventClient$1.emit(emitName, utilInstance);
1007
+ };
1008
+ effect((_p$) => {
1009
+ var _v$9 = styles().actionButton, _v$0 = styles().actionDotYellow;
1010
+ _v$9 !== _p$.e && className(_el$9, _p$.e = _v$9);
1011
+ _v$0 !== _p$.t && className(_el$0, _p$.t = _v$0);
1012
+ return _p$;
1013
+ }, {
1014
+ e: void 0,
1015
+ t: void 0
1016
+ });
1017
+ return _el$9;
1018
+ })(), null);
1019
+ insert(_el$2, hasClear && (() => {
1020
+ var _el$1 = _tmpl$7(), _el$10 = _el$1.firstChild;
1021
+ _el$1.$$mousedown = () => {
1022
+ utilInstance.clear();
1023
+ pacerEventClient$1.emit(emitName, utilInstance);
1024
+ };
1025
+ effect((_p$) => {
1026
+ var _v$1 = styles().actionButton, _v$10 = props.utilName.toLowerCase().includes("batcher") && isEmpty || props.utilName.toLowerCase().includes("queuer") && isEmpty, _v$11 = styles().actionDotOrange;
1027
+ _v$1 !== _p$.e && className(_el$1, _p$.e = _v$1);
1028
+ _v$10 !== _p$.t && (_el$1.disabled = _p$.t = _v$10);
1029
+ _v$11 !== _p$.a && className(_el$10, _p$.a = _v$11);
1030
+ return _p$;
1031
+ }, {
1032
+ e: void 0,
1033
+ t: void 0,
1034
+ a: void 0
1035
+ });
1036
+ return _el$1;
1037
+ })(), null);
1038
+ insert(_el$2, hasStartStop && (() => {
1039
+ var _el$11 = _tmpl$3$1(), _el$12 = _el$11.firstChild;
1040
+ _el$11.$$mousedown = () => {
1041
+ if (isRunning) utilInstance.stop();
1042
+ else utilInstance.start();
1043
+ pacerEventClient$1.emit(emitName, utilInstance);
1044
+ };
1045
+ insert(_el$11, isRunning ? "Stop" : "Start", null);
1046
+ effect((_p$) => {
1047
+ var _v$12 = styles().actionButton, _v$13 = styles().actionDotPurple;
1048
+ _v$12 !== _p$.e && className(_el$11, _p$.e = _v$12);
1049
+ _v$13 !== _p$.t && className(_el$12, _p$.t = _v$13);
1050
+ return _p$;
1051
+ }, {
1052
+ e: void 0,
1053
+ t: void 0
1054
+ });
1055
+ return _el$11;
1056
+ })(), null);
1057
+ effect(() => className(_el$2, styles().actionsRow));
1058
+ return _el$2;
1059
+ })();
1060
+ }
1061
+ delegateEvents(["mousedown"]);
1062
+ //#endregion
1063
+ //#region src/components/StateHeader.tsx
1064
+ var _tmpl$$2 = /* @__PURE__ */ template(`<div><div></div><div style=display:flex;align-items:center;gap:16px><div><div>Key</div><div></div><div>Last Updated</div><div> (<!>)</div></div><div style=margin-left:auto;font-weight:bold>% reduction`);
1065
+ dayjs.extend(relativeTime);
1066
+ function StateHeader(props) {
1067
+ const styles = useStyles();
1068
+ const [now, setNow] = createSignal(Date.now());
1069
+ onMount(() => {
1070
+ const interval = setInterval(() => {
1071
+ setNow(Date.now());
1072
+ }, 1e3);
1073
+ onCleanup(() => {
1074
+ clearInterval(interval);
1075
+ });
1076
+ });
1077
+ const entry = props.selectedInstance();
1078
+ if (!entry) return null;
1079
+ const key = entry.instance.key;
1080
+ const updatedAt = props.utilState().lastUpdatedByKey[key] ?? Date.now();
1081
+ const getRelativeTime = () => {
1082
+ const diffMs = now() - updatedAt;
1083
+ const diffSeconds = Math.floor(diffMs / 1e3);
1084
+ if (diffSeconds < 60) return `${diffSeconds} second${diffSeconds !== 1 ? "s" : ""} ago`;
1085
+ return dayjs(updatedAt).fromNow();
1086
+ };
1087
+ const getReductionPercentage = () => {
1088
+ const state = entry.instance.store?.state || entry.instance.state;
1089
+ if (!state) return 0;
1090
+ const completedExecutions = entry.type.toLowerCase().includes("async") ? state.settleCount || 0 : state.executionCount || 0;
1091
+ if (entry.type.toLowerCase().includes("batcher")) {
1092
+ const totalItemsProcessed = state.totalItemsProcessed || 0;
1093
+ if (totalItemsProcessed === 0) return 0;
1094
+ return Math.round((totalItemsProcessed - completedExecutions) / totalItemsProcessed * 100);
1095
+ }
1096
+ let requestCount = 0;
1097
+ if (state.maybeExecuteCount !== void 0) requestCount = state.maybeExecuteCount;
1098
+ else if (state.addItemCount !== void 0) requestCount = state.addItemCount;
1099
+ else return 0;
1100
+ if (requestCount === 0) return 0;
1101
+ const reduction = requestCount - completedExecutions;
1102
+ return Math.round(reduction / requestCount * 100);
1103
+ };
1104
+ const reductionPercentage = getReductionPercentage();
1105
+ return (() => {
1106
+ var _el$ = _tmpl$$2(), _el$2 = _el$.firstChild, _el$4 = _el$2.nextSibling.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$8 = _el$7.nextSibling, _el$9 = _el$8.firstChild, _el$1 = _el$9.nextSibling;
1107
+ _el$1.nextSibling;
1108
+ var _el$10 = _el$4.nextSibling, _el$11 = _el$10.firstChild;
1109
+ insert(_el$2, () => entry.type);
1110
+ insert(_el$6, key);
1111
+ insert(_el$8, () => new Date(updatedAt).toLocaleTimeString(), _el$9);
1112
+ insert(_el$8, getRelativeTime, _el$1);
1113
+ insert(_el$10, reductionPercentage, _el$11);
1114
+ effect((_p$) => {
1115
+ var _v$ = styles().stateHeader, _v$2 = styles().stateTitle, _v$3 = styles().infoGrid, _v$4 = styles().infoLabel, _v$5 = styles().infoValueMono, _v$6 = styles().infoLabel, _v$7 = styles().infoValueMono, _v$8 = styles().infoValueMono;
1116
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
1117
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
1118
+ _v$3 !== _p$.a && className(_el$4, _p$.a = _v$3);
1119
+ _v$4 !== _p$.o && className(_el$5, _p$.o = _v$4);
1120
+ _v$5 !== _p$.i && className(_el$6, _p$.i = _v$5);
1121
+ _v$6 !== _p$.n && className(_el$7, _p$.n = _v$6);
1122
+ _v$7 !== _p$.s && className(_el$8, _p$.s = _v$7);
1123
+ _v$8 !== _p$.h && className(_el$10, _p$.h = _v$8);
1124
+ return _p$;
1125
+ }, {
1126
+ e: void 0,
1127
+ t: void 0,
1128
+ a: void 0,
1129
+ o: void 0,
1130
+ i: void 0,
1131
+ n: void 0,
1132
+ s: void 0,
1133
+ h: void 0
1134
+ });
1135
+ return _el$;
1136
+ })();
1137
+ }
1138
+ //#endregion
1139
+ //#region src/components/DetailsPanel.tsx
1140
+ var _tmpl$$1 = /* @__PURE__ */ template(`<div>`), _tmpl$2 = /* @__PURE__ */ template(`<div>Select a util from the left panel to view its state`), _tmpl$3 = /* @__PURE__ */ template(`<div><div><div>Actions</div></div><div><div>State</div><div></div></div><div><div>Options</div><div>`);
1141
+ function DetailsPanel(props) {
1142
+ const styles = useStyles();
1143
+ return (() => {
1144
+ var _el$ = _tmpl$$1();
1145
+ insert(_el$, () => {
1146
+ const entry = props.selectedInstance();
1147
+ if (!entry) return (() => {
1148
+ var _el$2 = _tmpl$2();
1149
+ effect(() => className(_el$2, styles().noSelection));
1150
+ return _el$2;
1151
+ })();
1152
+ return [createComponent(StateHeader, {
1153
+ get selectedInstance() {
1154
+ return props.selectedInstance;
1155
+ },
1156
+ get utilState() {
1157
+ return props.utilState;
1158
+ }
1159
+ }), (() => {
1160
+ var _el$3 = _tmpl$3(), _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$4.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$9 = _el$6.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
1161
+ insert(_el$4, createComponent(ActionButtons, {
1162
+ get instance() {
1163
+ return entry.instance;
1164
+ },
1165
+ get utilName() {
1166
+ return entry.type;
1167
+ }
1168
+ }), null);
1169
+ insert(_el$8, createComponent(JsonTree, { get value() {
1170
+ return entry.instance.store?.state;
1171
+ } }));
1172
+ insert(_el$1, createComponent(JsonTree, { get value() {
1173
+ return entry.instance.options;
1174
+ } }));
1175
+ effect((_p$) => {
1176
+ var _v$ = styles().detailsGrid, _v$2 = styles().detailSection, _v$3 = styles().detailSectionHeader, _v$4 = styles().detailSection, _v$5 = styles().detailSectionHeader, _v$6 = styles().stateContent, _v$7 = styles().detailSection, _v$8 = styles().detailSectionHeader, _v$9 = styles().stateContent;
1177
+ _v$ !== _p$.e && className(_el$3, _p$.e = _v$);
1178
+ _v$2 !== _p$.t && className(_el$4, _p$.t = _v$2);
1179
+ _v$3 !== _p$.a && className(_el$5, _p$.a = _v$3);
1180
+ _v$4 !== _p$.o && className(_el$6, _p$.o = _v$4);
1181
+ _v$5 !== _p$.i && className(_el$7, _p$.i = _v$5);
1182
+ _v$6 !== _p$.n && className(_el$8, _p$.n = _v$6);
1183
+ _v$7 !== _p$.s && className(_el$9, _p$.s = _v$7);
1184
+ _v$8 !== _p$.h && className(_el$0, _p$.h = _v$8);
1185
+ _v$9 !== _p$.r && className(_el$1, _p$.r = _v$9);
1186
+ return _p$;
1187
+ }, {
1188
+ e: void 0,
1189
+ t: void 0,
1190
+ a: void 0,
1191
+ o: void 0,
1192
+ i: void 0,
1193
+ n: void 0,
1194
+ s: void 0,
1195
+ h: void 0,
1196
+ r: void 0
1197
+ });
1198
+ return _el$3;
1199
+ })()];
1200
+ });
1201
+ effect(() => className(_el$, styles().stateDetails));
1202
+ return _el$;
1203
+ })();
1204
+ }
1205
+ //#endregion
1206
+ //#region src/components/Shell.tsx
1207
+ var _tmpl$ = /* @__PURE__ */ template(`<div><div style=min-width:150px;max-width:800px></div><div></div><div style=flex:1><div>Details`);
1208
+ function Shell() {
1209
+ const styles = useStyles();
1210
+ const state = usePacerDevtoolsState();
1211
+ const utilState = () => state;
1212
+ const [selectedKey, setSelectedKey] = createSignal(null);
1213
+ const [leftPanelWidth, setLeftPanelWidth] = createSignal(300);
1214
+ const [isDragging, setIsDragging] = createSignal(false);
1215
+ const selectedInstance = createMemo(() => {
1216
+ const key = selectedKey();
1217
+ if (!key) return null;
1218
+ for (const group of UTIL_GROUPS) {
1219
+ const instance = utilState()[group.key].find((inst) => inst.key === key);
1220
+ if (instance) return {
1221
+ instance,
1222
+ type: group.displayName
1223
+ };
1224
+ }
1225
+ return null;
1226
+ });
1227
+ let dragStartX = 0;
1228
+ let dragStartWidth = 0;
1229
+ const handleMouseDown = (e) => {
1230
+ e.preventDefault();
1231
+ e.stopPropagation();
1232
+ setIsDragging(true);
1233
+ document.body.style.cursor = "col-resize";
1234
+ document.body.style.userSelect = "none";
1235
+ dragStartX = e.clientX;
1236
+ dragStartWidth = leftPanelWidth();
1237
+ };
1238
+ const handleMouseMove = (e) => {
1239
+ if (!isDragging()) return;
1240
+ e.preventDefault();
1241
+ const deltaX = e.clientX - dragStartX;
1242
+ setLeftPanelWidth(Math.max(150, Math.min(800, dragStartWidth + deltaX)));
1243
+ };
1244
+ const handleMouseUp = () => {
1245
+ setIsDragging(false);
1246
+ document.body.style.cursor = "";
1247
+ document.body.style.userSelect = "";
1248
+ };
1249
+ onMount(() => {
1250
+ document.addEventListener("mousemove", handleMouseMove);
1251
+ document.addEventListener("mouseup", handleMouseUp);
1252
+ });
1253
+ onCleanup(() => {
1254
+ document.removeEventListener("mousemove", handleMouseMove);
1255
+ document.removeEventListener("mouseup", handleMouseUp);
1256
+ });
1257
+ return createComponent(MainPanel, { get children() {
1258
+ return [createComponent(Header, { get children() {
1259
+ return createComponent(HeaderLogo, {
1260
+ flavor: {
1261
+ light: "#84cc16",
1262
+ dark: "#84cc16"
1263
+ },
1264
+ children: "TanStack Pacer"
1265
+ });
1266
+ } }), (() => {
1267
+ var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild;
1268
+ insert(_el$2, createComponent(UtilList, {
1269
+ selectedKey,
1270
+ setSelectedKey,
1271
+ utilState
1272
+ }));
1273
+ _el$3.$$mousedown = handleMouseDown;
1274
+ insert(_el$4, createComponent(DetailsPanel, {
1275
+ selectedInstance,
1276
+ utilState
1277
+ }), null);
1278
+ effect((_p$) => {
1279
+ var _v$ = styles().mainContainer, _v$2 = styles().leftPanel, _v$3 = `${leftPanelWidth()}px`, _v$4 = `${styles().dragHandle} ${isDragging() ? "dragging" : ""}`, _v$5 = styles().rightPanel, _v$6 = styles().panelHeader;
1280
+ _v$ !== _p$.e && className(_el$, _p$.e = _v$);
1281
+ _v$2 !== _p$.t && className(_el$2, _p$.t = _v$2);
1282
+ _v$3 !== _p$.a && setStyleProperty(_el$2, "width", _p$.a = _v$3);
1283
+ _v$4 !== _p$.o && className(_el$3, _p$.o = _v$4);
1284
+ _v$5 !== _p$.i && className(_el$4, _p$.i = _v$5);
1285
+ _v$6 !== _p$.n && className(_el$5, _p$.n = _v$6);
1286
+ return _p$;
1287
+ }, {
1288
+ e: void 0,
1289
+ t: void 0,
1290
+ a: void 0,
1291
+ o: void 0,
1292
+ i: void 0,
1293
+ n: void 0
1294
+ });
1295
+ return _el$;
1296
+ })()];
1297
+ } });
1298
+ }
1299
+ delegateEvents(["mousedown"]);
1300
+ //#endregion
1301
+ //#region src/components/index.tsx
1302
+ function PacerDevtools(props) {
1303
+ return createComponent(ThemeContextProvider, {
1304
+ get theme() {
1305
+ return props.theme;
1306
+ },
1307
+ get children() {
1308
+ return createComponent(PacerContextProvider, { get children() {
1309
+ return createComponent(Shell, {});
1310
+ } });
1311
+ }
1312
+ });
1313
+ }
1314
+ //#endregion
1315
+ export { PacerDevtools as default };