@tanstack/pacer-devtools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/PacerContextProvider.cjs +156 -0
  3. package/dist/cjs/PacerContextProvider.cjs.map +1 -0
  4. package/dist/cjs/PacerContextProvider.d.cts +19 -0
  5. package/dist/cjs/PacerDevtools.cjs +13 -0
  6. package/dist/cjs/PacerDevtools.cjs.map +1 -0
  7. package/dist/cjs/PacerDevtools.d.cts +1 -0
  8. package/dist/cjs/components/ActionButtons.cjs +157 -0
  9. package/dist/cjs/components/ActionButtons.cjs.map +1 -0
  10. package/dist/cjs/components/ActionButtons.d.cts +6 -0
  11. package/dist/cjs/components/DetailsPanel.cjs +80 -0
  12. package/dist/cjs/components/DetailsPanel.cjs.map +1 -0
  13. package/dist/cjs/components/DetailsPanel.d.cts +11 -0
  14. package/dist/cjs/components/Shell.cjs +102 -0
  15. package/dist/cjs/components/Shell.cjs.map +1 -0
  16. package/dist/cjs/components/Shell.d.cts +1 -0
  17. package/dist/cjs/components/StateHeader.cjs +95 -0
  18. package/dist/cjs/components/StateHeader.cjs.map +1 -0
  19. package/dist/cjs/components/StateHeader.d.cts +11 -0
  20. package/dist/cjs/components/UtilList.cjs +70 -0
  21. package/dist/cjs/components/UtilList.cjs.map +1 -0
  22. package/dist/cjs/components/UtilList.d.cts +8 -0
  23. package/dist/cjs/components/util-groups.cjs +40 -0
  24. package/dist/cjs/components/util-groups.cjs.map +1 -0
  25. package/dist/cjs/components/util-groups.d.cts +8 -0
  26. package/dist/cjs/core.cjs +43 -0
  27. package/dist/cjs/core.cjs.map +1 -0
  28. package/dist/cjs/core.d.cts +8 -0
  29. package/dist/cjs/index.cjs +15 -0
  30. package/dist/cjs/index.cjs.map +1 -0
  31. package/dist/cjs/index.d.cts +3 -0
  32. package/dist/cjs/production.cjs +7 -0
  33. package/dist/cjs/production.cjs.map +1 -0
  34. package/dist/cjs/production.d.cts +3 -0
  35. package/dist/cjs/styles/tokens.cjs +90 -0
  36. package/dist/cjs/styles/tokens.cjs.map +1 -0
  37. package/dist/cjs/styles/tokens.d.cts +298 -0
  38. package/dist/cjs/styles/use-styles.cjs +397 -0
  39. package/dist/cjs/styles/use-styles.cjs.map +1 -0
  40. package/dist/cjs/styles/use-styles.d.cts +42 -0
  41. package/dist/esm/PacerContextProvider.d.ts +19 -0
  42. package/dist/esm/PacerContextProvider.js +156 -0
  43. package/dist/esm/PacerContextProvider.js.map +1 -0
  44. package/dist/esm/PacerDevtools.d.ts +1 -0
  45. package/dist/esm/PacerDevtools.js +14 -0
  46. package/dist/esm/PacerDevtools.js.map +1 -0
  47. package/dist/esm/components/ActionButtons.d.ts +6 -0
  48. package/dist/esm/components/ActionButtons.js +157 -0
  49. package/dist/esm/components/ActionButtons.js.map +1 -0
  50. package/dist/esm/components/DetailsPanel.d.ts +11 -0
  51. package/dist/esm/components/DetailsPanel.js +80 -0
  52. package/dist/esm/components/DetailsPanel.js.map +1 -0
  53. package/dist/esm/components/Shell.d.ts +1 -0
  54. package/dist/esm/components/Shell.js +102 -0
  55. package/dist/esm/components/Shell.js.map +1 -0
  56. package/dist/esm/components/StateHeader.d.ts +11 -0
  57. package/dist/esm/components/StateHeader.js +95 -0
  58. package/dist/esm/components/StateHeader.js.map +1 -0
  59. package/dist/esm/components/UtilList.d.ts +8 -0
  60. package/dist/esm/components/UtilList.js +70 -0
  61. package/dist/esm/components/UtilList.js.map +1 -0
  62. package/dist/esm/components/util-groups.d.ts +8 -0
  63. package/dist/esm/components/util-groups.js +40 -0
  64. package/dist/esm/components/util-groups.js.map +1 -0
  65. package/dist/esm/core.d.ts +8 -0
  66. package/dist/esm/core.js +42 -0
  67. package/dist/esm/core.js.map +1 -0
  68. package/dist/esm/index.d.ts +3 -0
  69. package/dist/esm/index.js +15 -0
  70. package/dist/esm/index.js.map +1 -0
  71. package/dist/esm/production.d.ts +3 -0
  72. package/dist/esm/production.js +7 -0
  73. package/dist/esm/production.js.map +1 -0
  74. package/dist/esm/styles/tokens.d.ts +298 -0
  75. package/dist/esm/styles/tokens.js +90 -0
  76. package/dist/esm/styles/tokens.js.map +1 -0
  77. package/dist/esm/styles/use-styles.d.ts +42 -0
  78. package/dist/esm/styles/use-styles.js +380 -0
  79. package/dist/esm/styles/use-styles.js.map +1 -0
  80. package/package.json +84 -0
  81. package/src/PacerContextProvider.tsx +203 -0
  82. package/src/PacerDevtools.tsx +10 -0
  83. package/src/components/ActionButtons.tsx +143 -0
  84. package/src/components/DetailsPanel.tsx +61 -0
  85. package/src/components/Shell.tsx +102 -0
  86. package/src/components/StateHeader.tsx +106 -0
  87. package/src/components/UtilList.tsx +62 -0
  88. package/src/components/util-groups.ts +54 -0
  89. package/src/core.tsx +41 -0
  90. package/src/index.ts +17 -0
  91. package/src/production.ts +7 -0
  92. package/src/styles/tokens.ts +305 -0
  93. package/src/styles/use-styles.ts +379 -0
@@ -0,0 +1,380 @@
1
+ import * as goober from "goober";
2
+ import { createSignal } from "solid-js";
3
+ import { tokens } from "./tokens.js";
4
+ const stylesFactory = () => {
5
+ const { colors, font, size, alpha, border } = tokens;
6
+ const { fontFamily, size: fontSize } = font;
7
+ const css = goober.css;
8
+ return {
9
+ devtoolsPanel: css`
10
+ background: ${colors.darkGray[900]};
11
+ color: ${colors.gray[100]};
12
+ font-family: ${fontFamily.sans};
13
+ font-size: ${fontSize.sm};
14
+ box-sizing: border-box;
15
+ display: flex;
16
+ flex-direction: column;
17
+ width: 100%;
18
+ height: 100%;
19
+ overflow: hidden;
20
+ `,
21
+ stickyHeader: css`
22
+ position: sticky;
23
+ top: 0;
24
+ z-index: 10;
25
+ background: ${colors.darkGray[900]};
26
+ padding: ${size[2]};
27
+ font-size: ${fontSize.lg};
28
+ font-weight: ${font.weight.bold};
29
+ color: #84cc16;
30
+ letter-spacing: 0.04em;
31
+ text-transform: uppercase;
32
+ border-bottom: 1px solid ${colors.darkGray[700]};
33
+ box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]};
34
+ flex-shrink: 0;
35
+ `,
36
+ mainContainer: css`
37
+ display: flex;
38
+ flex: 1;
39
+ min-height: 0;
40
+ overflow: hidden;
41
+ padding: ${size[2]};
42
+ padding-top: 0;
43
+ `,
44
+ dragHandle: css`
45
+ width: 8px;
46
+ background: ${colors.darkGray[600]};
47
+ cursor: col-resize;
48
+ position: relative;
49
+ transition: all 0.2s ease;
50
+ user-select: none;
51
+ pointer-events: all;
52
+ margin: 0 ${size[1]};
53
+ border-radius: 2px;
54
+
55
+ &:hover {
56
+ background: ${colors.blue[500]};
57
+ margin: 0 ${size[1]};
58
+ }
59
+
60
+ &.dragging {
61
+ background: ${colors.blue[600]};
62
+ margin: 0 ${size[1]};
63
+ }
64
+
65
+ &::after {
66
+ content: '';
67
+ position: absolute;
68
+ top: 50%;
69
+ left: 50%;
70
+ transform: translate(-50%, -50%);
71
+ width: 2px;
72
+ height: 20px;
73
+ background: ${colors.darkGray[400]};
74
+ border-radius: 1px;
75
+ pointer-events: none;
76
+ }
77
+
78
+ &:hover::after,
79
+ &.dragging::after {
80
+ background: ${colors.blue[300]};
81
+ }
82
+ `,
83
+ leftPanel: css`
84
+ background: ${colors.darkGray[800]};
85
+ border-radius: ${border.radius.lg};
86
+ border: 1px solid ${colors.darkGray[700]};
87
+ display: flex;
88
+ flex-direction: column;
89
+ overflow: hidden;
90
+ min-height: 0;
91
+ flex-shrink: 0;
92
+ `,
93
+ rightPanel: css`
94
+ background: ${colors.darkGray[800]};
95
+ border-radius: ${border.radius.lg};
96
+ border: 1px solid ${colors.darkGray[700]};
97
+ display: flex;
98
+ flex-direction: column;
99
+ overflow: hidden;
100
+ min-height: 0;
101
+ flex: 1;
102
+ `,
103
+ panelHeader: css`
104
+ font-size: ${fontSize.md};
105
+ font-weight: ${font.weight.bold};
106
+ color: ${colors.blue[400]};
107
+ padding: ${size[2]};
108
+ border-bottom: 1px solid ${colors.darkGray[700]};
109
+ background: ${colors.darkGray[800]};
110
+ flex-shrink: 0;
111
+ `,
112
+ utilList: css`
113
+ flex: 1;
114
+ overflow-y: auto;
115
+ padding: ${size[1]};
116
+ min-height: 0;
117
+ `,
118
+ utilGroup: css`
119
+ margin-bottom: ${size[2]};
120
+ `,
121
+ utilGroupHeader: css`
122
+ font-size: ${fontSize.xs};
123
+ font-weight: ${font.weight.semibold};
124
+ color: ${colors.gray[400]};
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.05em;
127
+ margin-bottom: ${size[1]};
128
+ padding: ${size[1]} ${size[2]};
129
+ background: ${colors.darkGray[700]};
130
+ border-radius: ${border.radius.md};
131
+ `,
132
+ utilRow: css`
133
+ display: flex;
134
+ justify-content: space-between;
135
+ align-items: center;
136
+ padding: ${size[2]};
137
+ margin-bottom: ${size[1]};
138
+ background: ${colors.darkGray[700]};
139
+ border-radius: ${border.radius.md};
140
+ cursor: pointer;
141
+ transition: all 0.2s ease;
142
+ border: 1px solid transparent;
143
+
144
+ &:hover {
145
+ background: ${colors.darkGray[600]};
146
+ border-color: ${colors.darkGray[500]};
147
+ }
148
+ `,
149
+ utilRowSelected: css`
150
+ background: ${colors.blue[900] + alpha[20]};
151
+ border-color: ${colors.blue[500]};
152
+ box-shadow: 0 0 0 1px ${colors.blue[500] + alpha[30]};
153
+ `,
154
+ utilKey: css`
155
+ font-family: ${fontFamily.mono};
156
+ font-size: ${fontSize.xs};
157
+ color: ${colors.gray[100]};
158
+ flex: 1;
159
+ overflow: hidden;
160
+ text-overflow: ellipsis;
161
+ white-space: nowrap;
162
+ `,
163
+ utilStatus: css`
164
+ font-size: ${fontSize.xs};
165
+ color: ${colors.gray[400]};
166
+ text-transform: uppercase;
167
+ letter-spacing: 0.05em;
168
+ padding: ${size[1]} ${size[1]};
169
+ background: ${colors.darkGray[600]};
170
+ border-radius: ${border.radius.sm};
171
+ margin-left: ${size[1]};
172
+ `,
173
+ stateDetails: css`
174
+ flex: 1;
175
+ overflow-y: auto;
176
+ padding: ${size[2]};
177
+ min-height: 0;
178
+ `,
179
+ stateHeader: css`
180
+ margin-bottom: ${size[2]};
181
+ padding-bottom: ${size[2]};
182
+ border-bottom: 1px solid ${colors.darkGray[700]};
183
+ `,
184
+ stateTitle: css`
185
+ font-size: ${fontSize.md};
186
+ font-weight: ${font.weight.bold};
187
+ color: ${colors.blue[400]};
188
+ margin-bottom: ${size[1]};
189
+ `,
190
+ stateKey: css`
191
+ font-family: ${fontFamily.mono};
192
+ font-size: ${fontSize.xs};
193
+ color: ${colors.gray[400]};
194
+ word-break: break-all;
195
+ `,
196
+ stateContent: css`
197
+ background: ${colors.darkGray[700]};
198
+ border-radius: ${border.radius.md};
199
+ padding: ${size[2]};
200
+ border: 1px solid ${colors.darkGray[600]};
201
+ `,
202
+ detailsGrid: css`
203
+ display: grid;
204
+ grid-template-columns: 1fr;
205
+ gap: ${size[2]};
206
+ align-items: start;
207
+ `,
208
+ detailSection: css`
209
+ background: ${colors.darkGray[700]};
210
+ border: 1px solid ${colors.darkGray[600]};
211
+ border-radius: ${border.radius.md};
212
+ padding: ${size[2]};
213
+ `,
214
+ detailSectionHeader: css`
215
+ font-size: ${fontSize.sm};
216
+ font-weight: ${font.weight.bold};
217
+ color: ${colors.gray[200]};
218
+ margin-bottom: ${size[1]};
219
+ text-transform: uppercase;
220
+ letter-spacing: 0.04em;
221
+ `,
222
+ actionsRow: css`
223
+ display: flex;
224
+ flex-wrap: wrap;
225
+ gap: ${size[2]};
226
+ `,
227
+ actionButton: css`
228
+ display: inline-flex;
229
+ align-items: center;
230
+ gap: ${size[1]};
231
+ padding: ${size[1]} ${size[2]};
232
+ border-radius: ${border.radius.md};
233
+ border: 1px solid ${colors.darkGray[500]};
234
+ background: ${colors.darkGray[600]};
235
+ color: ${colors.gray[100]};
236
+ font-size: ${fontSize.xs};
237
+ cursor: pointer;
238
+ user-select: none;
239
+ transition:
240
+ background 0.15s,
241
+ border-color 0.15s;
242
+ &:hover {
243
+ background: ${colors.darkGray[500]};
244
+ border-color: ${colors.darkGray[400]};
245
+ }
246
+ &:disabled {
247
+ opacity: 0.5;
248
+ cursor: not-allowed;
249
+ &:hover {
250
+ background: ${colors.darkGray[600]};
251
+ border-color: ${colors.darkGray[500]};
252
+ }
253
+ }
254
+ `,
255
+ actionDotBlue: css`
256
+ width: 6px;
257
+ height: 6px;
258
+ border-radius: 9999px;
259
+ background: ${colors.blue[400]};
260
+ `,
261
+ actionDotGreen: css`
262
+ width: 6px;
263
+ height: 6px;
264
+ border-radius: 9999px;
265
+ background: ${colors.green[400]};
266
+ `,
267
+ actionDotRed: css`
268
+ width: 6px;
269
+ height: 6px;
270
+ border-radius: 9999px;
271
+ background: ${colors.red[400]};
272
+ `,
273
+ actionDotYellow: css`
274
+ width: 6px;
275
+ height: 6px;
276
+ border-radius: 9999px;
277
+ background: ${colors.yellow[400]};
278
+ `,
279
+ actionDotOrange: css`
280
+ width: 6px;
281
+ height: 6px;
282
+ border-radius: 9999px;
283
+ background: ${colors.pink[400]};
284
+ `,
285
+ actionDotPurple: css`
286
+ width: 6px;
287
+ height: 6px;
288
+ border-radius: 9999px;
289
+ background: ${colors.purple[400]};
290
+ `,
291
+ infoGrid: css`
292
+ display: grid;
293
+ grid-template-columns: auto 1fr;
294
+ gap: ${size[1]};
295
+ row-gap: ${size[1]};
296
+ align-items: center;
297
+ `,
298
+ infoLabel: css`
299
+ color: ${colors.gray[400]};
300
+ font-size: ${fontSize.xs};
301
+ text-transform: uppercase;
302
+ letter-spacing: 0.05em;
303
+ `,
304
+ infoValueMono: css`
305
+ font-family: ${fontFamily.mono};
306
+ font-size: ${fontSize.xs};
307
+ color: ${colors.gray[100]};
308
+ word-break: break-all;
309
+ `,
310
+ noSelection: css`
311
+ flex: 1;
312
+ display: flex;
313
+ align-items: center;
314
+ justify-content: center;
315
+ color: ${colors.gray[500]};
316
+ font-style: italic;
317
+ text-align: center;
318
+ padding: ${size[4]};
319
+ `,
320
+ // Keep existing styles for backward compatibility
321
+ sectionContainer: css`
322
+ display: flex;
323
+ flex-wrap: wrap;
324
+ gap: ${size[4]};
325
+ `,
326
+ section: css`
327
+ background: ${colors.darkGray[800]};
328
+ border-radius: ${border.radius.lg};
329
+ box-shadow: ${tokens.shadow.md(colors.black + alpha[80])};
330
+ padding: ${size[4]};
331
+ margin-bottom: ${size[4]};
332
+ border: 1px solid ${colors.darkGray[700]};
333
+ min-width: 0;
334
+ max-width: 33%;
335
+ max-height: fit-content;
336
+ `,
337
+ sectionHeader: css`
338
+ font-size: ${fontSize.lg};
339
+ font-weight: ${font.weight.bold};
340
+ margin-bottom: ${size[2]};
341
+ color: ${colors.blue[400]};
342
+ letter-spacing: 0.01em;
343
+ display: flex;
344
+ align-items: center;
345
+ gap: ${size[2]};
346
+ `,
347
+ sectionEmpty: css`
348
+ color: ${colors.gray[500]};
349
+ font-size: ${fontSize.sm};
350
+ font-style: italic;
351
+ margin: ${size[2]} 0;
352
+ `,
353
+ instanceList: css`
354
+ display: flex;
355
+ flex-direction: column;
356
+ gap: ${size[2]};
357
+ `,
358
+ instanceCard: css`
359
+ background: ${colors.darkGray[700]};
360
+ border-radius: ${border.radius.md};
361
+ padding: ${size[3]};
362
+ border: 1px solid ${colors.darkGray[600]};
363
+ font-size: ${fontSize.sm};
364
+ color: ${colors.gray[100]};
365
+ font-family: ${fontFamily.mono};
366
+ overflow-x: auto;
367
+ transition:
368
+ box-shadow 0.3s,
369
+ background 0.3s;
370
+ `
371
+ };
372
+ };
373
+ function useStyles() {
374
+ const [_styles] = createSignal(stylesFactory());
375
+ return _styles;
376
+ }
377
+ export {
378
+ useStyles
379
+ };
380
+ //# sourceMappingURL=use-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-styles.js","sources":["../../../src/styles/use-styles.ts"],"sourcesContent":["import * as goober from 'goober'\nimport { createSignal } from 'solid-js'\nimport { tokens } from './tokens'\n\nconst stylesFactory = () => {\n const { colors, font, size, alpha, border } = tokens\n const { fontFamily, size: fontSize } = font\n const css = goober.css\n\n return {\n devtoolsPanel: css`\n background: ${colors.darkGray[900]};\n color: ${colors.gray[100]};\n font-family: ${fontFamily.sans};\n font-size: ${fontSize.sm};\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n `,\n stickyHeader: css`\n position: sticky;\n top: 0;\n z-index: 10;\n background: ${colors.darkGray[900]};\n padding: ${size[2]};\n font-size: ${fontSize.lg};\n font-weight: ${font.weight.bold};\n color: #84cc16;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n border-bottom: 1px solid ${colors.darkGray[700]};\n box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]};\n flex-shrink: 0;\n `,\n mainContainer: css`\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n padding: ${size[2]};\n padding-top: 0;\n `,\n dragHandle: css`\n width: 8px;\n background: ${colors.darkGray[600]};\n cursor: col-resize;\n position: relative;\n transition: all 0.2s ease;\n user-select: none;\n pointer-events: all;\n margin: 0 ${size[1]};\n border-radius: 2px;\n\n &:hover {\n background: ${colors.blue[500]};\n margin: 0 ${size[1]};\n }\n\n &.dragging {\n background: ${colors.blue[600]};\n margin: 0 ${size[1]};\n }\n\n &::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 2px;\n height: 20px;\n background: ${colors.darkGray[400]};\n border-radius: 1px;\n pointer-events: none;\n }\n\n &:hover::after,\n &.dragging::after {\n background: ${colors.blue[300]};\n }\n `,\n leftPanel: css`\n background: ${colors.darkGray[800]};\n border-radius: ${border.radius.lg};\n border: 1px solid ${colors.darkGray[700]};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n flex-shrink: 0;\n `,\n rightPanel: css`\n background: ${colors.darkGray[800]};\n border-radius: ${border.radius.lg};\n border: 1px solid ${colors.darkGray[700]};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n flex: 1;\n `,\n panelHeader: css`\n font-size: ${fontSize.md};\n font-weight: ${font.weight.bold};\n color: ${colors.blue[400]};\n padding: ${size[2]};\n border-bottom: 1px solid ${colors.darkGray[700]};\n background: ${colors.darkGray[800]};\n flex-shrink: 0;\n `,\n utilList: css`\n flex: 1;\n overflow-y: auto;\n padding: ${size[1]};\n min-height: 0;\n `,\n utilGroup: css`\n margin-bottom: ${size[2]};\n `,\n utilGroupHeader: css`\n font-size: ${fontSize.xs};\n font-weight: ${font.weight.semibold};\n color: ${colors.gray[400]};\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: ${size[1]};\n padding: ${size[1]} ${size[2]};\n background: ${colors.darkGray[700]};\n border-radius: ${border.radius.md};\n `,\n utilRow: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: ${size[2]};\n margin-bottom: ${size[1]};\n background: ${colors.darkGray[700]};\n border-radius: ${border.radius.md};\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid transparent;\n\n &:hover {\n background: ${colors.darkGray[600]};\n border-color: ${colors.darkGray[500]};\n }\n `,\n utilRowSelected: css`\n background: ${colors.blue[900] + alpha[20]};\n border-color: ${colors.blue[500]};\n box-shadow: 0 0 0 1px ${colors.blue[500] + alpha[30]};\n `,\n utilKey: css`\n font-family: ${fontFamily.mono};\n font-size: ${fontSize.xs};\n color: ${colors.gray[100]};\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n utilStatus: css`\n font-size: ${fontSize.xs};\n color: ${colors.gray[400]};\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: ${size[1]} ${size[1]};\n background: ${colors.darkGray[600]};\n border-radius: ${border.radius.sm};\n margin-left: ${size[1]};\n `,\n stateDetails: css`\n flex: 1;\n overflow-y: auto;\n padding: ${size[2]};\n min-height: 0;\n `,\n stateHeader: css`\n margin-bottom: ${size[2]};\n padding-bottom: ${size[2]};\n border-bottom: 1px solid ${colors.darkGray[700]};\n `,\n stateTitle: css`\n font-size: ${fontSize.md};\n font-weight: ${font.weight.bold};\n color: ${colors.blue[400]};\n margin-bottom: ${size[1]};\n `,\n stateKey: css`\n font-family: ${fontFamily.mono};\n font-size: ${fontSize.xs};\n color: ${colors.gray[400]};\n word-break: break-all;\n `,\n stateContent: css`\n background: ${colors.darkGray[700]};\n border-radius: ${border.radius.md};\n padding: ${size[2]};\n border: 1px solid ${colors.darkGray[600]};\n `,\n detailsGrid: css`\n display: grid;\n grid-template-columns: 1fr;\n gap: ${size[2]};\n align-items: start;\n `,\n detailSection: css`\n background: ${colors.darkGray[700]};\n border: 1px solid ${colors.darkGray[600]};\n border-radius: ${border.radius.md};\n padding: ${size[2]};\n `,\n detailSectionHeader: css`\n font-size: ${fontSize.sm};\n font-weight: ${font.weight.bold};\n color: ${colors.gray[200]};\n margin-bottom: ${size[1]};\n text-transform: uppercase;\n letter-spacing: 0.04em;\n `,\n actionsRow: css`\n display: flex;\n flex-wrap: wrap;\n gap: ${size[2]};\n `,\n actionButton: css`\n display: inline-flex;\n align-items: center;\n gap: ${size[1]};\n padding: ${size[1]} ${size[2]};\n border-radius: ${border.radius.md};\n border: 1px solid ${colors.darkGray[500]};\n background: ${colors.darkGray[600]};\n color: ${colors.gray[100]};\n font-size: ${fontSize.xs};\n cursor: pointer;\n user-select: none;\n transition:\n background 0.15s,\n border-color 0.15s;\n &:hover {\n background: ${colors.darkGray[500]};\n border-color: ${colors.darkGray[400]};\n }\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n &:hover {\n background: ${colors.darkGray[600]};\n border-color: ${colors.darkGray[500]};\n }\n }\n `,\n actionDotBlue: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.blue[400]};\n `,\n actionDotGreen: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.green[400]};\n `,\n actionDotRed: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.red[400]};\n `,\n actionDotYellow: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.yellow[400]};\n `,\n actionDotOrange: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.pink[400]};\n `,\n actionDotPurple: css`\n width: 6px;\n height: 6px;\n border-radius: 9999px;\n background: ${colors.purple[400]};\n `,\n infoGrid: css`\n display: grid;\n grid-template-columns: auto 1fr;\n gap: ${size[1]};\n row-gap: ${size[1]};\n align-items: center;\n `,\n infoLabel: css`\n color: ${colors.gray[400]};\n font-size: ${fontSize.xs};\n text-transform: uppercase;\n letter-spacing: 0.05em;\n `,\n infoValueMono: css`\n font-family: ${fontFamily.mono};\n font-size: ${fontSize.xs};\n color: ${colors.gray[100]};\n word-break: break-all;\n `,\n noSelection: css`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${colors.gray[500]};\n font-style: italic;\n text-align: center;\n padding: ${size[4]};\n `,\n // Keep existing styles for backward compatibility\n sectionContainer: css`\n display: flex;\n flex-wrap: wrap;\n gap: ${size[4]};\n `,\n section: css`\n background: ${colors.darkGray[800]};\n border-radius: ${border.radius.lg};\n box-shadow: ${tokens.shadow.md(colors.black + alpha[80])};\n padding: ${size[4]};\n margin-bottom: ${size[4]};\n border: 1px solid ${colors.darkGray[700]};\n min-width: 0;\n max-width: 33%;\n max-height: fit-content;\n `,\n sectionHeader: css`\n font-size: ${fontSize.lg};\n font-weight: ${font.weight.bold};\n margin-bottom: ${size[2]};\n color: ${colors.blue[400]};\n letter-spacing: 0.01em;\n display: flex;\n align-items: center;\n gap: ${size[2]};\n `,\n sectionEmpty: css`\n color: ${colors.gray[500]};\n font-size: ${fontSize.sm};\n font-style: italic;\n margin: ${size[2]} 0;\n `,\n instanceList: css`\n display: flex;\n flex-direction: column;\n gap: ${size[2]};\n `,\n instanceCard: css`\n background: ${colors.darkGray[700]};\n border-radius: ${border.radius.md};\n padding: ${size[3]};\n border: 1px solid ${colors.darkGray[600]};\n font-size: ${fontSize.sm};\n color: ${colors.gray[100]};\n font-family: ${fontFamily.mono};\n overflow-x: auto;\n transition:\n box-shadow 0.3s,\n background 0.3s;\n `,\n }\n}\n\nexport function useStyles() {\n const [_styles] = createSignal(stylesFactory())\n return _styles\n}\n"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@tanstack/pacer-devtools",
3
+ "version": "0.1.0",
4
+ "description": "Devtools for Pacer.",
5
+ "author": "Tanner Linsley",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/TanStack/pacer.git",
10
+ "directory": "packages/pacer"
11
+ },
12
+ "homepage": "https://tanstack.com/pacer",
13
+ "funding": {
14
+ "type": "github",
15
+ "url": "https://github.com/sponsors/tannerlinsley"
16
+ },
17
+ "keywords": [
18
+ "debounce",
19
+ "throttle",
20
+ "rate-limit",
21
+ "queuer",
22
+ "queue",
23
+ "pacer"
24
+ ],
25
+ "type": "module",
26
+ "types": "dist/esm/index.d.ts",
27
+ "main": "dist/cjs/index.cjs",
28
+ "module": "dist/esm/index.js",
29
+ "exports": {
30
+ ".": {
31
+ "import": {
32
+ "types": "./dist/esm/index.d.ts",
33
+ "default": "./dist/esm/index.js"
34
+ },
35
+ "require": {
36
+ "types": "./dist/cjs/index.d.cts",
37
+ "default": "./dist/cjs/index.cjs"
38
+ }
39
+ },
40
+ "./production": {
41
+ "import": {
42
+ "types": "./dist/esm/production.d.ts",
43
+ "default": "./dist/esm/production.js"
44
+ },
45
+ "require": {
46
+ "types": "./dist/cjs/production.d.cts",
47
+ "default": "./dist/cjs/production.cjs"
48
+ }
49
+ },
50
+ "./package.json": "./package.json"
51
+ },
52
+ "sideEffects": false,
53
+ "engines": {
54
+ "node": ">=18"
55
+ },
56
+ "files": [
57
+ "dist/",
58
+ "src"
59
+ ],
60
+ "peerDependencies": {
61
+ "@tanstack/pacer": ">=0.15.0"
62
+ },
63
+ "dependencies": {
64
+ "@tanstack/devtools-ui": "^0.3.1",
65
+ "@tanstack/solid-store": "^0.7.3",
66
+ "clsx": "^2.1.1",
67
+ "dayjs": "^1.11.13",
68
+ "goober": "^2.1.16",
69
+ "solid-js": "^1.9.9"
70
+ },
71
+ "devDependencies": {
72
+ "vite-plugin-solid": "^2.11.8"
73
+ },
74
+ "scripts": {
75
+ "clean": "premove ./build ./dist",
76
+ "lint:fix": "eslint ./src --fix",
77
+ "test:eslint": "eslint ./src",
78
+ "test:lib": "vitest",
79
+ "test:lib:dev": "pnpm test:lib --watch",
80
+ "test:types": "tsc",
81
+ "test:build": "publint --strict",
82
+ "build": "vite build"
83
+ }
84
+ }
@@ -0,0 +1,203 @@
1
+ import { createStore } from 'solid-js/store'
2
+ import { createContext, createEffect, onCleanup, useContext } from 'solid-js'
3
+ import { pacerEventClient } from '@tanstack/pacer/event-client'
4
+ import type {
5
+ AsyncBatcher,
6
+ AsyncDebouncer,
7
+ AsyncQueuer,
8
+ AsyncRateLimiter,
9
+ AsyncThrottler,
10
+ Batcher,
11
+ Debouncer,
12
+ Queuer,
13
+ RateLimiter,
14
+ Throttler,
15
+ } from '@tanstack/pacer'
16
+
17
+ interface PacerDevtoolsContextType {
18
+ asyncBatchers: Array<AsyncBatcher<any>>
19
+ asyncDebouncers: Array<AsyncDebouncer<any>>
20
+ asyncQueuers: Array<AsyncQueuer<any>>
21
+ asyncRateLimiters: Array<AsyncRateLimiter<any>>
22
+ asyncThrottlers: Array<AsyncThrottler<any>>
23
+ batchers: Array<Batcher<any>>
24
+ debouncers: Array<Debouncer<any>>
25
+ queuers: Array<Queuer<any>>
26
+ rateLimiters: Array<RateLimiter<any>>
27
+ throttlers: Array<Throttler<any>>
28
+ lastUpdatedByKey: Record<string, number>
29
+ }
30
+
31
+ const initialPacerDevtoolsStore = {
32
+ asyncBatchers: [],
33
+ asyncDebouncers: [],
34
+ asyncQueuers: [],
35
+ asyncRateLimiters: [],
36
+ asyncThrottlers: [],
37
+ batchers: [],
38
+ debouncers: [],
39
+ queuers: [],
40
+ rateLimiters: [],
41
+ throttlers: [],
42
+ lastUpdatedByKey: {},
43
+ }
44
+
45
+ const PacerDevtoolsContext = createContext<
46
+ [
47
+ PacerDevtoolsContextType,
48
+ (newState: Partial<PacerDevtoolsContextType>) => void,
49
+ ]
50
+ >([initialPacerDevtoolsStore, () => {}])
51
+
52
+ const updateOrAddToArray = <T extends { key: string }>(
53
+ oldArray: Array<T>,
54
+ newItem: T,
55
+ ) => {
56
+ const index = oldArray.findIndex((item) => item.key === newItem.key)
57
+ if (index !== -1) {
58
+ // Update existing item
59
+ return oldArray.map((item, i) => (i === index ? newItem : item))
60
+ }
61
+ // Add new item
62
+ return [...oldArray, newItem]
63
+ }
64
+
65
+ export function PacerContextProvider(props: { children: any }) {
66
+ const [store, setStore] = createStore<PacerDevtoolsContextType>(
67
+ initialPacerDevtoolsStore,
68
+ )
69
+
70
+ createEffect(() => {
71
+ const cleanup = pacerEventClient.onAllPluginEvents((_e) => {
72
+ const e = _e as unknown as { type: string; payload: any }
73
+ switch (e.type) {
74
+ case 'pacer:AsyncBatcher': {
75
+ setStore({
76
+ asyncBatchers: updateOrAddToArray(store.asyncBatchers, e.payload),
77
+ lastUpdatedByKey: {
78
+ ...store.lastUpdatedByKey,
79
+ [e.payload.key]: Date.now(),
80
+ },
81
+ })
82
+ break
83
+ }
84
+ case 'pacer:AsyncDebouncer': {
85
+ setStore({
86
+ asyncDebouncers: updateOrAddToArray(
87
+ store.asyncDebouncers,
88
+ e.payload,
89
+ ),
90
+ lastUpdatedByKey: {
91
+ ...store.lastUpdatedByKey,
92
+ [e.payload.key]: Date.now(),
93
+ },
94
+ })
95
+ break
96
+ }
97
+ case 'pacer:AsyncQueuer': {
98
+ setStore({
99
+ asyncQueuers: updateOrAddToArray(store.asyncQueuers, e.payload),
100
+ lastUpdatedByKey: {
101
+ ...store.lastUpdatedByKey,
102
+ [e.payload.key]: Date.now(),
103
+ },
104
+ })
105
+ break
106
+ }
107
+ case 'pacer:AsyncRateLimiter': {
108
+ setStore({
109
+ asyncRateLimiters: updateOrAddToArray(
110
+ store.asyncRateLimiters,
111
+ e.payload,
112
+ ),
113
+ lastUpdatedByKey: {
114
+ ...store.lastUpdatedByKey,
115
+ [e.payload.key]: Date.now(),
116
+ },
117
+ })
118
+ break
119
+ }
120
+ case 'pacer:AsyncThrottler': {
121
+ setStore({
122
+ asyncThrottlers: updateOrAddToArray(
123
+ store.asyncThrottlers,
124
+ e.payload,
125
+ ),
126
+ lastUpdatedByKey: {
127
+ ...store.lastUpdatedByKey,
128
+ [e.payload.key]: Date.now(),
129
+ },
130
+ })
131
+ break
132
+ }
133
+ case 'pacer:Batcher': {
134
+ setStore({
135
+ batchers: updateOrAddToArray(store.batchers, e.payload),
136
+ lastUpdatedByKey: {
137
+ ...store.lastUpdatedByKey,
138
+ [e.payload.key]: Date.now(),
139
+ },
140
+ })
141
+ break
142
+ }
143
+ case 'pacer:Debouncer': {
144
+ setStore({
145
+ debouncers: updateOrAddToArray(store.debouncers, e.payload),
146
+ lastUpdatedByKey: {
147
+ ...store.lastUpdatedByKey,
148
+ [e.payload.key]: Date.now(),
149
+ },
150
+ })
151
+ break
152
+ }
153
+ case 'pacer:Queuer': {
154
+ setStore({
155
+ queuers: updateOrAddToArray(store.queuers, e.payload),
156
+ lastUpdatedByKey: {
157
+ ...store.lastUpdatedByKey,
158
+ [e.payload.key]: Date.now(),
159
+ },
160
+ })
161
+ break
162
+ }
163
+ case 'pacer:RateLimiter': {
164
+ setStore({
165
+ rateLimiters: updateOrAddToArray(store.rateLimiters, e.payload),
166
+ lastUpdatedByKey: {
167
+ ...store.lastUpdatedByKey,
168
+ [e.payload.key]: Date.now(),
169
+ },
170
+ })
171
+ break
172
+ }
173
+ case 'pacer:Throttler': {
174
+ setStore({
175
+ throttlers: updateOrAddToArray(store.throttlers, e.payload),
176
+ lastUpdatedByKey: {
177
+ ...store.lastUpdatedByKey,
178
+ [e.payload.key]: Date.now(),
179
+ },
180
+ })
181
+ break
182
+ }
183
+ }
184
+ })
185
+ onCleanup(cleanup)
186
+ })
187
+ return (
188
+ <PacerDevtoolsContext.Provider value={[store, setStore]}>
189
+ {props.children}
190
+ </PacerDevtoolsContext.Provider>
191
+ )
192
+ }
193
+
194
+ const usePacerDevtoolsContext = () => {
195
+ const context = useContext(PacerDevtoolsContext)
196
+
197
+ return context
198
+ }
199
+
200
+ export const usePacerDevtoolsState = () => {
201
+ const [state] = usePacerDevtoolsContext()
202
+ return state
203
+ }