@tanstack/devtools 0.0.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 (142) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/components/content-panel.cjs +28 -0
  3. package/dist/cjs/components/content-panel.cjs.map +1 -0
  4. package/dist/cjs/components/content-panel.d.cts +6 -0
  5. package/dist/cjs/components/logo.cjs +95 -0
  6. package/dist/cjs/components/logo.cjs.map +1 -0
  7. package/dist/cjs/components/logo.d.cts +1 -0
  8. package/dist/cjs/components/main-panel.cjs +31 -0
  9. package/dist/cjs/components/main-panel.cjs.map +1 -0
  10. package/dist/cjs/components/main-panel.d.cts +7 -0
  11. package/dist/cjs/components/tab-content.cjs +28 -0
  12. package/dist/cjs/components/tab-content.cjs.map +1 -0
  13. package/dist/cjs/components/tab-content.d.cts +2 -0
  14. package/dist/cjs/components/tabs.cjs +47 -0
  15. package/dist/cjs/components/tabs.cjs.map +1 -0
  16. package/dist/cjs/components/tabs.d.cts +5 -0
  17. package/dist/cjs/components/trigger.cjs +31 -0
  18. package/dist/cjs/components/trigger.cjs.map +1 -0
  19. package/dist/cjs/components/trigger.d.cts +5 -0
  20. package/dist/cjs/context/devtools-context.cjs +62 -0
  21. package/dist/cjs/context/devtools-context.cjs.map +1 -0
  22. package/dist/cjs/context/devtools-context.d.cts +20 -0
  23. package/dist/cjs/context/devtools-store.cjs +21 -0
  24. package/dist/cjs/context/devtools-store.cjs.map +1 -0
  25. package/dist/cjs/context/devtools-store.d.cts +53 -0
  26. package/dist/cjs/context/use-devtools-context.cjs +78 -0
  27. package/dist/cjs/context/use-devtools-context.cjs.map +1 -0
  28. package/dist/cjs/context/use-devtools-context.d.cts +36 -0
  29. package/dist/cjs/core.cjs +81 -0
  30. package/dist/cjs/core.cjs.map +1 -0
  31. package/dist/cjs/core.d.cts +13 -0
  32. package/dist/cjs/devtools.cjs +146 -0
  33. package/dist/cjs/devtools.cjs.map +1 -0
  34. package/dist/cjs/devtools.d.cts +1 -0
  35. package/dist/cjs/hooks/use-disable-tabbing.cjs +23 -0
  36. package/dist/cjs/hooks/use-disable-tabbing.cjs.map +1 -0
  37. package/dist/cjs/hooks/use-disable-tabbing.d.cts +6 -0
  38. package/dist/cjs/index.cjs +5 -0
  39. package/dist/cjs/index.cjs.map +1 -0
  40. package/dist/cjs/index.d.cts +3 -0
  41. package/dist/cjs/styles/tokens.cjs +51 -0
  42. package/dist/cjs/styles/tokens.cjs.map +1 -0
  43. package/dist/cjs/styles/tokens.d.cts +298 -0
  44. package/dist/cjs/styles/use-styles.cjs +256 -0
  45. package/dist/cjs/styles/use-styles.cjs.map +1 -0
  46. package/dist/cjs/styles/use-styles.d.cts +21 -0
  47. package/dist/cjs/tabs/index.cjs +19 -0
  48. package/dist/cjs/tabs/index.cjs.map +1 -0
  49. package/dist/cjs/tabs/index.d.cts +12 -0
  50. package/dist/cjs/tabs/plugins-tab.cjs +73 -0
  51. package/dist/cjs/tabs/plugins-tab.cjs.map +1 -0
  52. package/dist/cjs/tabs/plugins-tab.d.cts +1 -0
  53. package/dist/cjs/tabs/settings-tab.cjs +9 -0
  54. package/dist/cjs/tabs/settings-tab.cjs.map +1 -0
  55. package/dist/cjs/tabs/settings-tab.d.cts +1 -0
  56. package/dist/cjs/utils/sanitize.cjs +12 -0
  57. package/dist/cjs/utils/sanitize.cjs.map +1 -0
  58. package/dist/cjs/utils/sanitize.d.cts +1 -0
  59. package/dist/cjs/utils/storage.cjs +19 -0
  60. package/dist/cjs/utils/storage.cjs.map +1 -0
  61. package/dist/cjs/utils/storage.d.cts +5 -0
  62. package/dist/esm/components/content-panel.d.ts +6 -0
  63. package/dist/esm/components/content-panel.js +28 -0
  64. package/dist/esm/components/content-panel.js.map +1 -0
  65. package/dist/esm/components/logo.d.ts +1 -0
  66. package/dist/esm/components/logo.js +95 -0
  67. package/dist/esm/components/logo.js.map +1 -0
  68. package/dist/esm/components/main-panel.d.ts +7 -0
  69. package/dist/esm/components/main-panel.js +31 -0
  70. package/dist/esm/components/main-panel.js.map +1 -0
  71. package/dist/esm/components/tab-content.d.ts +2 -0
  72. package/dist/esm/components/tab-content.js +28 -0
  73. package/dist/esm/components/tab-content.js.map +1 -0
  74. package/dist/esm/components/tabs.d.ts +5 -0
  75. package/dist/esm/components/tabs.js +47 -0
  76. package/dist/esm/components/tabs.js.map +1 -0
  77. package/dist/esm/components/trigger.d.ts +5 -0
  78. package/dist/esm/components/trigger.js +31 -0
  79. package/dist/esm/components/trigger.js.map +1 -0
  80. package/dist/esm/context/devtools-context.d.ts +20 -0
  81. package/dist/esm/context/devtools-context.js +62 -0
  82. package/dist/esm/context/devtools-context.js.map +1 -0
  83. package/dist/esm/context/devtools-store.d.ts +53 -0
  84. package/dist/esm/context/devtools-store.js +21 -0
  85. package/dist/esm/context/devtools-store.js.map +1 -0
  86. package/dist/esm/context/use-devtools-context.d.ts +36 -0
  87. package/dist/esm/context/use-devtools-context.js +78 -0
  88. package/dist/esm/context/use-devtools-context.js.map +1 -0
  89. package/dist/esm/core.d.ts +13 -0
  90. package/dist/esm/core.js +80 -0
  91. package/dist/esm/core.js.map +1 -0
  92. package/dist/esm/devtools.d.ts +1 -0
  93. package/dist/esm/devtools.js +147 -0
  94. package/dist/esm/devtools.js.map +1 -0
  95. package/dist/esm/hooks/use-disable-tabbing.d.ts +6 -0
  96. package/dist/esm/hooks/use-disable-tabbing.js +23 -0
  97. package/dist/esm/hooks/use-disable-tabbing.js.map +1 -0
  98. package/dist/esm/index.d.ts +3 -0
  99. package/dist/esm/index.js +5 -0
  100. package/dist/esm/index.js.map +1 -0
  101. package/dist/esm/styles/tokens.d.ts +298 -0
  102. package/dist/esm/styles/tokens.js +51 -0
  103. package/dist/esm/styles/tokens.js.map +1 -0
  104. package/dist/esm/styles/use-styles.d.ts +21 -0
  105. package/dist/esm/styles/use-styles.js +239 -0
  106. package/dist/esm/styles/use-styles.js.map +1 -0
  107. package/dist/esm/tabs/index.d.ts +12 -0
  108. package/dist/esm/tabs/index.js +19 -0
  109. package/dist/esm/tabs/index.js.map +1 -0
  110. package/dist/esm/tabs/plugins-tab.d.ts +1 -0
  111. package/dist/esm/tabs/plugins-tab.js +73 -0
  112. package/dist/esm/tabs/plugins-tab.js.map +1 -0
  113. package/dist/esm/tabs/settings-tab.d.ts +1 -0
  114. package/dist/esm/tabs/settings-tab.js +9 -0
  115. package/dist/esm/tabs/settings-tab.js.map +1 -0
  116. package/dist/esm/utils/sanitize.d.ts +1 -0
  117. package/dist/esm/utils/sanitize.js +12 -0
  118. package/dist/esm/utils/sanitize.js.map +1 -0
  119. package/dist/esm/utils/storage.d.ts +5 -0
  120. package/dist/esm/utils/storage.js +19 -0
  121. package/dist/esm/utils/storage.js.map +1 -0
  122. package/package.json +69 -0
  123. package/src/components/content-panel.tsx +21 -0
  124. package/src/components/logo.tsx +820 -0
  125. package/src/components/main-panel.tsx +31 -0
  126. package/src/components/tab-content.tsx +20 -0
  127. package/src/components/tabs.tsx +50 -0
  128. package/src/components/trigger.tsx +34 -0
  129. package/src/context/devtools-context.tsx +93 -0
  130. package/src/context/devtools-store.ts +79 -0
  131. package/src/context/use-devtools-context.ts +95 -0
  132. package/src/core.tsx +71 -0
  133. package/src/devtools.tsx +146 -0
  134. package/src/hooks/use-disable-tabbing.ts +28 -0
  135. package/src/index.ts +3 -0
  136. package/src/styles/tokens.ts +305 -0
  137. package/src/styles/use-styles.ts +252 -0
  138. package/src/tabs/index.tsx +62 -0
  139. package/src/tabs/plugins-tab.tsx +47 -0
  140. package/src/tabs/settings-tab.tsx +3 -0
  141. package/src/utils/sanitize.ts +8 -0
  142. package/src/utils/storage.ts +12 -0
@@ -0,0 +1,305 @@
1
+ export const tokens = {
2
+ colors: {
3
+ inherit: 'inherit',
4
+ current: 'currentColor',
5
+ transparent: 'transparent',
6
+ black: '#000000',
7
+ white: '#ffffff',
8
+ neutral: {
9
+ 50: '#f9fafb',
10
+ 100: '#f2f4f7',
11
+ 200: '#eaecf0',
12
+ 300: '#d0d5dd',
13
+ 400: '#98a2b3',
14
+ 500: '#667085',
15
+ 600: '#475467',
16
+ 700: '#344054',
17
+ 800: '#1d2939',
18
+ 900: '#101828',
19
+ },
20
+ darkGray: {
21
+ 50: '#525c7a',
22
+ 100: '#49536e',
23
+ 200: '#414962',
24
+ 300: '#394056',
25
+ 400: '#313749',
26
+ 500: '#292e3d',
27
+ 600: '#212530',
28
+ 700: '#191c24',
29
+ 800: '#111318',
30
+ 900: '#0b0d10',
31
+ },
32
+ gray: {
33
+ 50: '#f9fafb',
34
+ 100: '#f2f4f7',
35
+ 200: '#eaecf0',
36
+ 300: '#d0d5dd',
37
+ 400: '#98a2b3',
38
+ 500: '#667085',
39
+ 600: '#475467',
40
+ 700: '#344054',
41
+ 800: '#1d2939',
42
+ 900: '#101828',
43
+ },
44
+ blue: {
45
+ 25: '#F5FAFF',
46
+ 50: '#EFF8FF',
47
+ 100: '#D1E9FF',
48
+ 200: '#B2DDFF',
49
+ 300: '#84CAFF',
50
+ 400: '#53B1FD',
51
+ 500: '#2E90FA',
52
+ 600: '#1570EF',
53
+ 700: '#175CD3',
54
+ 800: '#1849A9',
55
+ 900: '#194185',
56
+ },
57
+ green: {
58
+ 25: '#F6FEF9',
59
+ 50: '#ECFDF3',
60
+ 100: '#D1FADF',
61
+ 200: '#A6F4C5',
62
+ 300: '#6CE9A6',
63
+ 400: '#32D583',
64
+ 500: '#12B76A',
65
+ 600: '#039855',
66
+ 700: '#027A48',
67
+ 800: '#05603A',
68
+ 900: '#054F31',
69
+ },
70
+ red: {
71
+ 50: '#fef2f2',
72
+ 100: '#fee2e2',
73
+ 200: '#fecaca',
74
+ 300: '#fca5a5',
75
+ 400: '#f87171',
76
+ 500: '#ef4444',
77
+ 600: '#dc2626',
78
+ 700: '#b91c1c',
79
+ 800: '#991b1b',
80
+ 900: '#7f1d1d',
81
+ 950: '#450a0a',
82
+ },
83
+ yellow: {
84
+ 25: '#FFFCF5',
85
+ 50: '#FFFAEB',
86
+ 100: '#FEF0C7',
87
+ 200: '#FEDF89',
88
+ 300: '#FEC84B',
89
+ 400: '#FDB022',
90
+ 500: '#F79009',
91
+ 600: '#DC6803',
92
+ 700: '#B54708',
93
+ 800: '#93370D',
94
+ 900: '#7A2E0E',
95
+ },
96
+ purple: {
97
+ 25: '#FAFAFF',
98
+ 50: '#F4F3FF',
99
+ 100: '#EBE9FE',
100
+ 200: '#D9D6FE',
101
+ 300: '#BDB4FE',
102
+ 400: '#9B8AFB',
103
+ 500: '#7A5AF8',
104
+ 600: '#6938EF',
105
+ 700: '#5925DC',
106
+ 800: '#4A1FB8',
107
+ 900: '#3E1C96',
108
+ },
109
+ teal: {
110
+ 25: '#F6FEFC',
111
+ 50: '#F0FDF9',
112
+ 100: '#CCFBEF',
113
+ 200: '#99F6E0',
114
+ 300: '#5FE9D0',
115
+ 400: '#2ED3B7',
116
+ 500: '#15B79E',
117
+ 600: '#0E9384',
118
+ 700: '#107569',
119
+ 800: '#125D56',
120
+ 900: '#134E48',
121
+ },
122
+ pink: {
123
+ 25: '#fdf2f8',
124
+ 50: '#fce7f3',
125
+ 100: '#fbcfe8',
126
+ 200: '#f9a8d4',
127
+ 300: '#f472b6',
128
+ 400: '#ec4899',
129
+ 500: '#db2777',
130
+ 600: '#be185d',
131
+ 700: '#9d174d',
132
+ 800: '#831843',
133
+ 900: '#500724',
134
+ },
135
+ cyan: {
136
+ 25: '#ecfeff',
137
+ 50: '#cffafe',
138
+ 100: '#a5f3fc',
139
+ 200: '#67e8f9',
140
+ 300: '#22d3ee',
141
+ 400: '#06b6d4',
142
+ 500: '#0891b2',
143
+ 600: '#0e7490',
144
+ 700: '#155e75',
145
+ 800: '#164e63',
146
+ 900: '#083344',
147
+ },
148
+ },
149
+ alpha: {
150
+ 100: 'ff',
151
+ 90: 'e5',
152
+ 80: 'cc',
153
+ 70: 'b3',
154
+ 60: '99',
155
+ 50: '80',
156
+ 40: '66',
157
+ 30: '4d',
158
+ 20: '33',
159
+ 10: '1a',
160
+ 0: '00',
161
+ },
162
+ font: {
163
+ size: {
164
+ '2xs': 'calc(var(--tsrd-font-size) * 0.625)',
165
+ xs: 'calc(var(--tsrd-font-size) * 0.75)',
166
+ sm: 'calc(var(--tsrd-font-size) * 0.875)',
167
+ md: 'var(--tsrd-font-size)',
168
+ lg: 'calc(var(--tsrd-font-size) * 1.125)',
169
+ xl: 'calc(var(--tsrd-font-size) * 1.25)',
170
+ '2xl': 'calc(var(--tsrd-font-size) * 1.5)',
171
+ '3xl': 'calc(var(--tsrd-font-size) * 1.875)',
172
+ '4xl': 'calc(var(--tsrd-font-size) * 2.25)',
173
+ '5xl': 'calc(var(--tsrd-font-size) * 3)',
174
+ '6xl': 'calc(var(--tsrd-font-size) * 3.75)',
175
+ '7xl': 'calc(var(--tsrd-font-size) * 4.5)',
176
+ '8xl': 'calc(var(--tsrd-font-size) * 6)',
177
+ '9xl': 'calc(var(--tsrd-font-size) * 8)',
178
+ },
179
+ lineHeight: {
180
+ '3xs': 'calc(var(--tsrd-font-size) * 0.75)',
181
+ '2xs': 'calc(var(--tsrd-font-size) * 0.875)',
182
+ xs: 'calc(var(--tsrd-font-size) * 1)',
183
+ sm: 'calc(var(--tsrd-font-size) * 1.25)',
184
+ md: 'calc(var(--tsrd-font-size) * 1.5)',
185
+ lg: 'calc(var(--tsrd-font-size) * 1.75)',
186
+ xl: 'calc(var(--tsrd-font-size) * 2)',
187
+ '2xl': 'calc(var(--tsrd-font-size) * 2.25)',
188
+ '3xl': 'calc(var(--tsrd-font-size) * 2.5)',
189
+ '4xl': 'calc(var(--tsrd-font-size) * 2.75)',
190
+ '5xl': 'calc(var(--tsrd-font-size) * 3)',
191
+ '6xl': 'calc(var(--tsrd-font-size) * 3.25)',
192
+ '7xl': 'calc(var(--tsrd-font-size) * 3.5)',
193
+ '8xl': 'calc(var(--tsrd-font-size) * 3.75)',
194
+ '9xl': 'calc(var(--tsrd-font-size) * 4)',
195
+ },
196
+ weight: {
197
+ thin: '100',
198
+ extralight: '200',
199
+ light: '300',
200
+ normal: '400',
201
+ medium: '500',
202
+ semibold: '600',
203
+ bold: '700',
204
+ extrabold: '800',
205
+ black: '900',
206
+ },
207
+ fontFamily: {
208
+ sans: 'ui-sans-serif, Inter, system-ui, sans-serif, sans-serif',
209
+ mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`,
210
+ },
211
+ },
212
+ breakpoints: {
213
+ xs: '320px',
214
+ sm: '640px',
215
+ md: '768px',
216
+ lg: '1024px',
217
+ xl: '1280px',
218
+ '2xl': '1536px',
219
+ },
220
+ border: {
221
+ radius: {
222
+ none: '0px',
223
+ xs: 'calc(var(--tsrd-font-size) * 0.125)',
224
+ sm: 'calc(var(--tsrd-font-size) * 0.25)',
225
+ md: 'calc(var(--tsrd-font-size) * 0.375)',
226
+ lg: 'calc(var(--tsrd-font-size) * 0.5)',
227
+ xl: 'calc(var(--tsrd-font-size) * 0.75)',
228
+ '2xl': 'calc(var(--tsrd-font-size) * 1)',
229
+ '3xl': 'calc(var(--tsrd-font-size) * 1.5)',
230
+ full: '9999px',
231
+ },
232
+ },
233
+ size: {
234
+ 0: '0px',
235
+ 0.25: 'calc(var(--tsrd-font-size) * 0.0625)',
236
+ 0.5: 'calc(var(--tsrd-font-size) * 0.125)',
237
+ 1: 'calc(var(--tsrd-font-size) * 0.25)',
238
+ 1.5: 'calc(var(--tsrd-font-size) * 0.375)',
239
+ 2: 'calc(var(--tsrd-font-size) * 0.5)',
240
+ 2.5: 'calc(var(--tsrd-font-size) * 0.625)',
241
+ 3: 'calc(var(--tsrd-font-size) * 0.75)',
242
+ 3.5: 'calc(var(--tsrd-font-size) * 0.875)',
243
+ 4: 'calc(var(--tsrd-font-size) * 1)',
244
+ 4.5: 'calc(var(--tsrd-font-size) * 1.125)',
245
+ 5: 'calc(var(--tsrd-font-size) * 1.25)',
246
+ 5.5: 'calc(var(--tsrd-font-size) * 1.375)',
247
+ 6: 'calc(var(--tsrd-font-size) * 1.5)',
248
+ 6.5: 'calc(var(--tsrd-font-size) * 1.625)',
249
+ 7: 'calc(var(--tsrd-font-size) * 1.75)',
250
+ 8: 'calc(var(--tsrd-font-size) * 2)',
251
+ 9: 'calc(var(--tsrd-font-size) * 2.25)',
252
+ 10: 'calc(var(--tsrd-font-size) * 2.5)',
253
+ 11: 'calc(var(--tsrd-font-size) * 2.75)',
254
+ 12: 'calc(var(--tsrd-font-size) * 3)',
255
+ 14: 'calc(var(--tsrd-font-size) * 3.5)',
256
+ 16: 'calc(var(--tsrd-font-size) * 4)',
257
+ 20: 'calc(var(--tsrd-font-size) * 5)',
258
+ 24: 'calc(var(--tsrd-font-size) * 6)',
259
+ 28: 'calc(var(--tsrd-font-size) * 7)',
260
+ 32: 'calc(var(--tsrd-font-size) * 8)',
261
+ 36: 'calc(var(--tsrd-font-size) * 9)',
262
+ 40: 'calc(var(--tsrd-font-size) * 10)',
263
+ 44: 'calc(var(--tsrd-font-size) * 11)',
264
+ 48: 'calc(var(--tsrd-font-size) * 12)',
265
+ 52: 'calc(var(--tsrd-font-size) * 13)',
266
+ 56: 'calc(var(--tsrd-font-size) * 14)',
267
+ 60: 'calc(var(--tsrd-font-size) * 15)',
268
+ 64: 'calc(var(--tsrd-font-size) * 16)',
269
+ 72: 'calc(var(--tsrd-font-size) * 18)',
270
+ 80: 'calc(var(--tsrd-font-size) * 20)',
271
+ 96: 'calc(var(--tsrd-font-size) * 24)',
272
+ },
273
+ shadow: {
274
+ xs: (_: string = 'rgb(0 0 0 / 0.1)') =>
275
+ `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const,
276
+ sm: (color: string = 'rgb(0 0 0 / 0.1)') =>
277
+ `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const,
278
+ md: (color: string = 'rgb(0 0 0 / 0.1)') =>
279
+ `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const,
280
+ lg: (color: string = 'rgb(0 0 0 / 0.1)') =>
281
+ `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const,
282
+ xl: (color: string = 'rgb(0 0 0 / 0.1)') =>
283
+ `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const,
284
+ '2xl': (color: string = 'rgb(0 0 0 / 0.25)') =>
285
+ `0 25px 50px -12px ${color}` as const,
286
+ inner: (color: string = 'rgb(0 0 0 / 0.05)') =>
287
+ `inset 0 2px 4px 0 ${color}` as const,
288
+ none: () => `none` as const,
289
+ },
290
+ zIndices: {
291
+ hide: -1,
292
+ auto: 'auto',
293
+ base: 0,
294
+ docked: 10,
295
+ dropdown: 1000,
296
+ sticky: 1100,
297
+ banner: 1200,
298
+ overlay: 1300,
299
+ modal: 1400,
300
+ popover: 1500,
301
+ skipLink: 1600,
302
+ toast: 1700,
303
+ tooltip: 1800,
304
+ },
305
+ } as const
@@ -0,0 +1,252 @@
1
+ import * as goober from 'goober'
2
+ import { createSignal } from 'solid-js'
3
+ import { tokens } from './tokens'
4
+ import type { DevtoolsSettings } from '../context/devtools-context'
5
+ import type { Accessor } from 'solid-js'
6
+
7
+ const stylesFactory = () => {
8
+ const { colors, font, size, alpha, border } = tokens
9
+ const { fontFamily, size: fontSize } = font
10
+ const css = goober.css
11
+
12
+ return {
13
+ devtoolsPanelContainer: css`
14
+ direction: ltr;
15
+ position: fixed;
16
+ bottom: 0;
17
+ right: 0;
18
+ z-index: 99999;
19
+ width: 100%;
20
+
21
+ max-height: 90%;
22
+ border-top: 1px solid ${colors.gray[700]};
23
+ transform-origin: top;
24
+ `,
25
+ devtoolsPanelContainerVisibility: (isOpen: boolean) => {
26
+ return css`
27
+ visibility: ${isOpen ? 'visible' : 'hidden'};
28
+ height: ${isOpen ? 'auto' : '0'};
29
+ `
30
+ },
31
+ devtoolsPanelContainerResizing: (isResizing: Accessor<boolean>) => {
32
+ if (isResizing()) {
33
+ return css`
34
+ transition: none;
35
+ `
36
+ }
37
+
38
+ return css`
39
+ transition: all 0.4s ease;
40
+ `
41
+ },
42
+ devtoolsPanelContainerAnimation: (isOpen: boolean, height: number) => {
43
+ if (isOpen) {
44
+ return css`
45
+ pointer-events: auto;
46
+ transform: translateY(0);
47
+ `
48
+ }
49
+ return css`
50
+ pointer-events: none;
51
+ transform: translateY(${height}px);
52
+ `
53
+ },
54
+ logo: css`
55
+ cursor: pointer;
56
+ display: flex;
57
+ flex-direction: column;
58
+ background-color: transparent;
59
+ border: none;
60
+ width: ${size[12]};
61
+ height: ${size[12]};
62
+ font-family: ${fontFamily.sans};
63
+ gap: ${tokens.size[0.5]};
64
+ padding: 0px;
65
+ &:hover {
66
+ opacity: 0.7;
67
+ }
68
+ `,
69
+
70
+ devtoolsPanel: css`
71
+ display: flex;
72
+ font-size: ${fontSize.sm};
73
+ font-family: ${fontFamily.sans};
74
+ background-color: ${colors.darkGray[700]};
75
+ color: ${colors.gray[300]};
76
+ width: w-screen;
77
+ flex-direction: row;
78
+ overflow: auto;
79
+ height: 100%;
80
+ `,
81
+ dragHandle: css`
82
+ position: absolute;
83
+ left: 0;
84
+ top: 0;
85
+ width: 100%;
86
+ height: 4px;
87
+ cursor: row-resize;
88
+ z-index: 100000;
89
+ &:hover {
90
+ background-color: ${colors.purple[400]}${alpha[90]};
91
+ }
92
+ `,
93
+
94
+ mainCloseBtn: css`
95
+ background: transparent;
96
+ position: fixed;
97
+ z-index: 99999;
98
+ display: inline-flex;
99
+ width: fit-content;
100
+ cursor: pointer;
101
+ appearance: none;
102
+ border: 0;
103
+ align-items: center;
104
+ padding: 0;
105
+ font-size: ${font.size.xs};
106
+ cursor: pointer;
107
+ transition: all 0.25s ease-out;
108
+ &:focus-visible {
109
+ outline-offset: 2px;
110
+ border-radius: ${border.radius.full};
111
+ outline: 2px solid ${colors.blue[800]};
112
+ }
113
+ `,
114
+ mainCloseBtnPosition: (position: DevtoolsSettings['position']) => {
115
+ const base = css`
116
+ ${position === 'top-left' ? `top: ${size[2]}; left: ${size[2]};` : ''}
117
+ ${position === 'top-right' ? `top: ${size[2]}; right: ${size[2]};` : ''}
118
+ ${position === 'middle-left'
119
+ ? `top: 50%; left: ${size[2]}; transform: translateY(-50%);`
120
+ : ''}
121
+ ${position === 'middle-right'
122
+ ? `top: 50%; right: ${size[2]}; transform: translateY(-50%);`
123
+ : ''}
124
+ ${position === 'bottom-left'
125
+ ? `bottom: ${size[2]}; left: ${size[2]};`
126
+ : ''}
127
+ ${position === 'bottom-right'
128
+ ? `bottom: ${size[2]}; right: ${size[2]};`
129
+ : ''}
130
+ `
131
+ return base
132
+ },
133
+ mainCloseBtnAnimation: (isOpen: boolean) => {
134
+ if (!isOpen) {
135
+ return css`
136
+ opacity: 1;
137
+ pointer-events: auto;
138
+ visibility: visible;
139
+ `
140
+ }
141
+ return css`
142
+ opacity: 0;
143
+ pointer-events: none;
144
+ visibility: hidden;
145
+ `
146
+ },
147
+ tabContainer: css`
148
+ display: flex;
149
+ flex-direction: column;
150
+ align-items: center;
151
+ justify-content: flex-start;
152
+ height: 100%;
153
+ background-color: ${colors.darkGray[800]};
154
+ border-right: 1px solid ${colors.gray[700]};
155
+ box-shadow: 0 1px 0 ${colors.gray[700]};
156
+ position: relative;
157
+ width: ${size[10]};
158
+ `,
159
+
160
+ tab: css`
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: center;
164
+ width: 100%;
165
+ height: ${size[10]};
166
+ cursor: pointer;
167
+ font-size: ${fontSize.sm};
168
+ font-family: ${fontFamily.sans};
169
+ color: ${colors.gray[300]};
170
+ background-color: transparent;
171
+ border: none;
172
+ transition: all 0.2s ease-in-out;
173
+ border-left: 2px solid transparent;
174
+ &:hover:not(.close):not(.active) {
175
+ background-color: ${colors.gray[700]};
176
+ color: ${colors.gray[100]};
177
+ border-left: 2px solid ${colors.purple[500]};
178
+ }
179
+ &.active {
180
+ background-color: ${colors.purple[500]};
181
+ color: ${colors.gray[100]};
182
+ border-left: 2px solid ${colors.purple[500]};
183
+ }
184
+ &.close {
185
+ margin-top: auto;
186
+ &:hover {
187
+ background-color: ${colors.gray[700]};
188
+ }
189
+ &:hover {
190
+ color: ${colors.red[500]};
191
+ }
192
+ }
193
+
194
+ &.disabled {
195
+ cursor: not-allowed;
196
+ opacity: 0.2;
197
+ pointer-events: none;
198
+ }
199
+ &.disabled:hover {
200
+ background-color: transparent;
201
+ color: ${colors.gray[300]};
202
+ }
203
+ `,
204
+ tabContent: css`
205
+ transition: all 0.2s ease-in-out;
206
+ width: 100%;
207
+ height: 100%;
208
+ `,
209
+ pluginsTabPanel: css`
210
+ display: flex;
211
+ flex-direction: row;
212
+ width: 100%;
213
+ height: 100%;
214
+ overflow: hidden;
215
+ `,
216
+ pluginsTabSidebar: css`
217
+ width: ${size[48]};
218
+ background-color: ${colors.darkGray[800]};
219
+ border-right: 1px solid ${colors.gray[700]};
220
+ box-shadow: 0 1px 0 ${colors.gray[700]};
221
+ overflow-y: auto;
222
+ `,
223
+ pluginName: css`
224
+ font-size: ${fontSize.xs};
225
+ font-family: ${fontFamily.sans};
226
+ color: ${colors.gray[300]};
227
+ padding: ${size[2]};
228
+ cursor: pointer;
229
+ text-align: center;
230
+ transition: all 0.2s ease-in-out;
231
+ &:hover {
232
+ background-color: ${colors.gray[700]};
233
+ color: ${colors.gray[100]};
234
+ padding: ${size[2]};
235
+ }
236
+ &.active {
237
+ background-color: ${colors.purple[500]};
238
+ color: ${colors.gray[100]};
239
+ }
240
+ `,
241
+ pluginsTabContent: css`
242
+ width: 100%;
243
+ height: 100%;
244
+ overflow-y: auto;
245
+ `,
246
+ }
247
+ }
248
+
249
+ export function useStyles() {
250
+ const [_styles] = createSignal(stylesFactory())
251
+ return _styles
252
+ }
@@ -0,0 +1,62 @@
1
+ import { SettingsTab } from './settings-tab'
2
+ import { PluginsTab } from './plugins-tab'
3
+
4
+ export const tabs = [
5
+ {
6
+ name: 'Plugins',
7
+ id: 'plugins',
8
+ component: () => <PluginsTab />,
9
+ icon: (
10
+ <svg
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ width="24"
13
+ height="24"
14
+ viewBox="0 0 24 24"
15
+ fill="none"
16
+ stroke="currentColor"
17
+ stroke-width="2"
18
+ stroke-linecap="round"
19
+ stroke-linejoin="round"
20
+ >
21
+ <path d="M8 6h10" />
22
+ <path d="M6 12h9" />
23
+ <path d="M11 18h7" />
24
+ </svg>
25
+ ),
26
+ },
27
+ {
28
+ name: 'Settings',
29
+ id: 'settings',
30
+ component: () => <SettingsTab />,
31
+ icon: (
32
+ <svg
33
+ xmlns="http://www.w3.org/2000/svg"
34
+ width="24"
35
+ height="24"
36
+ viewBox="0 0 24 24"
37
+ fill="none"
38
+ stroke="currentColor"
39
+ stroke-width="2"
40
+ stroke-linecap="round"
41
+ stroke-linejoin="round"
42
+ >
43
+ <path d="M12 20a8 8 0 1 0 0-16 8 8 0 0 0 0 16Z" />
44
+ <path d="M12 14a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z" />
45
+ <path d="M12 2v2" />
46
+ <path d="M12 22v-2" />
47
+ <path d="m17 20.66-1-1.73" />
48
+ <path d="M11 10.27 7 3.34" />
49
+ <path d="m20.66 17-1.73-1" />
50
+ <path d="m3.34 7 1.73 1" />
51
+ <path d="M14 12h8" />
52
+ <path d="M2 12h2" />
53
+ <path d="m20.66 7-1.73 1" />
54
+ <path d="m3.34 17 1.73-1" />
55
+ <path d="m17 3.34-1 1.73" />
56
+ <path d="m11 13.73-4 6.93" />
57
+ </svg>
58
+ ),
59
+ },
60
+ ] as const
61
+
62
+ export type TabName = (typeof tabs)[number]['id']
@@ -0,0 +1,47 @@
1
+ import { For, createEffect } from 'solid-js'
2
+ import clsx from 'clsx'
3
+ import { usePlugins } from '../context/use-devtools-context'
4
+ import { useStyles } from '../styles/use-styles'
5
+
6
+ export const PluginsTab = () => {
7
+ const { plugins, activePlugin, setActivePlugin } = usePlugins()
8
+ let activePluginRef: HTMLDivElement | undefined
9
+ createEffect(() => {
10
+ const currentActivePlugin = plugins()?.find(
11
+ (plugin) => plugin.id === activePlugin()?.id,
12
+ )
13
+ if (activePluginRef && currentActivePlugin) {
14
+ currentActivePlugin.render(activePluginRef)
15
+ }
16
+ })
17
+ const styles = useStyles()
18
+ return (
19
+ <div class={styles().pluginsTabPanel}>
20
+ <div class={styles().pluginsTabSidebar}>
21
+ <For each={plugins()}>
22
+ {(plugin) => {
23
+ let pluginHeading: HTMLHeadingElement | undefined
24
+ createEffect(() => {
25
+ if (pluginHeading) {
26
+ typeof plugin.name === 'string'
27
+ ? (pluginHeading.textContent = plugin.name)
28
+ : plugin.name(pluginHeading)
29
+ }
30
+ })
31
+ return (
32
+ <div
33
+ onClick={() => setActivePlugin(plugin)}
34
+ class={clsx(styles().pluginName, {
35
+ active: activePlugin()?.id === plugin.id,
36
+ })}
37
+ >
38
+ <h3 ref={pluginHeading} />
39
+ </div>
40
+ )
41
+ }}
42
+ </For>
43
+ </div>
44
+ <div ref={activePluginRef} class={styles().pluginsTabContent}></div>
45
+ </div>
46
+ )
47
+ }
@@ -0,0 +1,3 @@
1
+ export const SettingsTab = () => {
2
+ return <div>Settings</div>
3
+ }
@@ -0,0 +1,8 @@
1
+ export const tryParseJson = <T>(json: string | null): T | undefined => {
2
+ if (!json) return undefined
3
+ try {
4
+ return JSON.parse(json)
5
+ } catch (_e) {
6
+ return undefined
7
+ }
8
+ }
@@ -0,0 +1,12 @@
1
+ export const getStorageItem = (key: string) => localStorage.getItem(key)
2
+ export const setStorageItem = (key: string, value: string) => {
3
+ try {
4
+ localStorage.setItem(key, value)
5
+ } catch (_e) {
6
+ return
7
+ }
8
+ }
9
+
10
+ export const TANSTACK_DEVTOOLS = 'tanstack_devtools'
11
+ export const TANSTACK_DEVTOOLS_STATE = 'tanstack_devtools_state'
12
+ export const TANSTACK_DEVTOOLS_SETTINGS = 'tanstack_devtools_settings'