@tanstack/router-devtools 0.0.1-alpha.1 → 0.0.1-beta.100

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/build/cjs/{packages/react-router-devtools/src/Explorer.js → Explorer.js} +52 -81
  4. package/build/cjs/Explorer.js.map +1 -0
  5. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +1 -19
  6. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  7. package/build/cjs/devtools.js +638 -0
  8. package/build/cjs/devtools.js.map +1 -0
  9. package/build/cjs/{packages/react-router-devtools/src/index.js → index.js} +1 -1
  10. package/build/cjs/{packages/react-router-devtools/src/styledComponents.js → styledComponents.js} +10 -38
  11. package/build/cjs/styledComponents.js.map +1 -0
  12. package/build/cjs/{packages/react-router-devtools/src/theme.js → theme.js} +6 -9
  13. package/build/cjs/theme.js.map +1 -0
  14. package/build/cjs/{packages/react-router-devtools/src/useLocalStorage.js → useLocalStorage.js} +3 -10
  15. package/build/cjs/useLocalStorage.js.map +1 -0
  16. package/build/cjs/{packages/react-router-devtools/src/useMediaQuery.js → useMediaQuery.js} +13 -12
  17. package/build/cjs/useMediaQuery.js.map +1 -0
  18. package/build/cjs/{packages/react-router-devtools/src/utils.js → utils.js} +30 -35
  19. package/build/cjs/utils.js.map +1 -0
  20. package/build/esm/index.js +391 -1361
  21. package/build/esm/index.js.map +1 -1
  22. package/build/stats-html.html +59 -49
  23. package/build/stats-react.json +223 -9444
  24. package/build/types/Explorer.d.ts +47 -0
  25. package/build/types/devtools.d.ts +65 -0
  26. package/build/types/index.d.ts +1 -76
  27. package/build/types/styledComponents.d.ts +7 -0
  28. package/build/types/theme.d.ts +34 -0
  29. package/build/types/useLocalStorage.d.ts +1 -0
  30. package/build/types/useMediaQuery.d.ts +1 -0
  31. package/build/types/utils.d.ts +23 -0
  32. package/build/umd/index.development.js +430 -1340
  33. package/build/umd/index.development.js.map +1 -1
  34. package/build/umd/index.production.js +22 -2
  35. package/build/umd/index.production.js.map +1 -1
  36. package/package.json +11 -10
  37. package/src/Explorer.tsx +14 -12
  38. package/src/devtools.tsx +349 -345
  39. package/src/useLocalStorage.ts +5 -5
  40. package/src/useMediaQuery.ts +3 -0
  41. package/src/utils.ts +57 -16
  42. package/build/cjs/packages/react-router-devtools/src/Explorer.js.map +0 -1
  43. package/build/cjs/packages/react-router-devtools/src/Logo.js +0 -73
  44. package/build/cjs/packages/react-router-devtools/src/Logo.js.map +0 -1
  45. package/build/cjs/packages/react-router-devtools/src/devtools.js +0 -654
  46. package/build/cjs/packages/react-router-devtools/src/devtools.js.map +0 -1
  47. package/build/cjs/packages/react-router-devtools/src/styledComponents.js.map +0 -1
  48. package/build/cjs/packages/react-router-devtools/src/theme.js.map +0 -1
  49. package/build/cjs/packages/react-router-devtools/src/useLocalStorage.js.map +0 -1
  50. package/build/cjs/packages/react-router-devtools/src/useMediaQuery.js.map +0 -1
  51. package/build/cjs/packages/react-router-devtools/src/utils.js.map +0 -1
  52. package/src/Logo.tsx +0 -37
  53. /package/build/cjs/{packages/react-router-devtools/src/index.js.map → index.js.map} +0 -0
@@ -0,0 +1,638 @@
1
+ /**
2
+ * router-devtools
3
+ *
4
+ * Copyright (c) TanStack
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ 'use strict';
12
+
13
+ Object.defineProperty(exports, '__esModule', { value: true });
14
+
15
+ var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.js');
16
+ var React = require('react');
17
+ var router = require('@tanstack/router');
18
+ var useLocalStorage = require('./useLocalStorage.js');
19
+ var utils = require('./utils.js');
20
+ var styledComponents = require('./styledComponents.js');
21
+ var theme = require('./theme.js');
22
+ var Explorer = require('./Explorer.js');
23
+
24
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
25
+
26
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
27
+
28
+ const isServer = typeof window === 'undefined';
29
+ function Logo(props) {
30
+ return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, props, {
31
+ style: {
32
+ ...(props.style ?? {}),
33
+ display: 'flex',
34
+ alignItems: 'center',
35
+ flexDirection: 'column',
36
+ fontSize: '0.8rem',
37
+ fontWeight: 'bolder',
38
+ lineHeight: '1'
39
+ }
40
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
41
+ style: {
42
+ letterSpacing: '-0.05rem'
43
+ }
44
+ }, "TANSTACK"), /*#__PURE__*/React__default["default"].createElement("div", {
45
+ style: {
46
+ backgroundImage: 'linear-gradient(to right, var(--tw-gradient-stops))',
47
+ // @ts-ignore
48
+ '--tw-gradient-from': '#84cc16',
49
+ '--tw-gradient-stops': 'var(--tw-gradient-from), var(--tw-gradient-to)',
50
+ '--tw-gradient-to': '#10b981',
51
+ WebkitBackgroundClip: 'text',
52
+ color: 'transparent',
53
+ letterSpacing: '0.1rem',
54
+ marginRight: '-0.2rem'
55
+ }
56
+ }, "ROUTER"));
57
+ }
58
+ function TanStackRouterDevtools({
59
+ initialIsOpen,
60
+ panelProps = {},
61
+ closeButtonProps = {},
62
+ toggleButtonProps = {},
63
+ position = 'bottom-left',
64
+ containerElement: Container = 'footer',
65
+ router
66
+ }) {
67
+ const rootRef = React__default["default"].useRef(null);
68
+ const panelRef = React__default["default"].useRef(null);
69
+ const [isOpen, setIsOpen] = useLocalStorage["default"]('tanstackRouterDevtoolsOpen', initialIsOpen);
70
+ const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage["default"]('tanstackRouterDevtoolsHeight', null);
71
+ const [isResolvedOpen, setIsResolvedOpen] = utils.useSafeState(false);
72
+ const [isResizing, setIsResizing] = utils.useSafeState(false);
73
+ const isMounted = utils.useIsMounted();
74
+ const handleDragStart = (panelElement, startEvent) => {
75
+ if (startEvent.button !== 0) return; // Only allow left click for drag
76
+
77
+ setIsResizing(true);
78
+ const dragInfo = {
79
+ originalHeight: panelElement?.getBoundingClientRect().height ?? 0,
80
+ pageY: startEvent.pageY
81
+ };
82
+ const run = moveEvent => {
83
+ const delta = dragInfo.pageY - moveEvent.pageY;
84
+ const newHeight = dragInfo?.originalHeight + delta;
85
+ setDevtoolsHeight(newHeight);
86
+ if (newHeight < 70) {
87
+ setIsOpen(false);
88
+ } else {
89
+ setIsOpen(true);
90
+ }
91
+ };
92
+ const unsub = () => {
93
+ setIsResizing(false);
94
+ document.removeEventListener('mousemove', run);
95
+ document.removeEventListener('mouseUp', unsub);
96
+ };
97
+ document.addEventListener('mousemove', run);
98
+ document.addEventListener('mouseup', unsub);
99
+ };
100
+ React__default["default"].useEffect(() => {
101
+ setIsResolvedOpen(isOpen ?? false);
102
+ }, [isOpen, isResolvedOpen, setIsResolvedOpen]);
103
+
104
+ // Toggle panel visibility before/after transition (depending on direction).
105
+ // Prevents focusing in a closed panel.
106
+ React__default["default"].useEffect(() => {
107
+ const ref = panelRef.current;
108
+ if (ref) {
109
+ const handlePanelTransitionStart = () => {
110
+ if (ref && isResolvedOpen) {
111
+ ref.style.visibility = 'visible';
112
+ }
113
+ };
114
+ const handlePanelTransitionEnd = () => {
115
+ if (ref && !isResolvedOpen) {
116
+ ref.style.visibility = 'hidden';
117
+ }
118
+ };
119
+ ref.addEventListener('transitionstart', handlePanelTransitionStart);
120
+ ref.addEventListener('transitionend', handlePanelTransitionEnd);
121
+ return () => {
122
+ ref.removeEventListener('transitionstart', handlePanelTransitionStart);
123
+ ref.removeEventListener('transitionend', handlePanelTransitionEnd);
124
+ };
125
+ }
126
+ return;
127
+ }, [isResolvedOpen]);
128
+ React__default["default"][isServer ? 'useEffect' : 'useLayoutEffect'](() => {
129
+ if (isResolvedOpen) {
130
+ const previousValue = rootRef.current?.parentElement?.style.paddingBottom;
131
+ const run = () => {
132
+ const containerHeight = panelRef.current?.getBoundingClientRect().height;
133
+ if (rootRef.current?.parentElement) {
134
+ rootRef.current.parentElement.style.paddingBottom = `${containerHeight}px`;
135
+ }
136
+ };
137
+ run();
138
+ if (typeof window !== 'undefined') {
139
+ window.addEventListener('resize', run);
140
+ return () => {
141
+ window.removeEventListener('resize', run);
142
+ if (rootRef.current?.parentElement && typeof previousValue === 'string') {
143
+ rootRef.current.parentElement.style.paddingBottom = previousValue;
144
+ }
145
+ };
146
+ }
147
+ }
148
+ return;
149
+ }, [isResolvedOpen]);
150
+ const {
151
+ style: panelStyle = {},
152
+ ...otherPanelProps
153
+ } = panelProps;
154
+ const {
155
+ style: closeButtonStyle = {},
156
+ onClick: onCloseClick,
157
+ ...otherCloseButtonProps
158
+ } = closeButtonProps;
159
+ const {
160
+ style: toggleButtonStyle = {},
161
+ onClick: onToggleClick,
162
+ ...otherToggleButtonProps
163
+ } = toggleButtonProps;
164
+
165
+ // Do not render on the server
166
+ if (!isMounted()) return null;
167
+ return /*#__PURE__*/React__default["default"].createElement(Container, {
168
+ ref: rootRef,
169
+ className: "TanStackRouterDevtools"
170
+ }, /*#__PURE__*/React__default["default"].createElement(theme.ThemeProvider, {
171
+ theme: theme.defaultTheme
172
+ }, /*#__PURE__*/React__default["default"].createElement(TanStackRouterDevtoolsPanel, _rollupPluginBabelHelpers["extends"]({
173
+ ref: panelRef
174
+ }, otherPanelProps, {
175
+ router: router,
176
+ style: {
177
+ position: 'fixed',
178
+ bottom: '0',
179
+ right: '0',
180
+ zIndex: 99999,
181
+ width: '100%',
182
+ height: devtoolsHeight ?? 500,
183
+ maxHeight: '90%',
184
+ boxShadow: '0 0 20px rgba(0,0,0,.3)',
185
+ borderTop: `1px solid ${theme.defaultTheme.gray}`,
186
+ transformOrigin: 'top',
187
+ // visibility will be toggled after transitions, but set initial state here
188
+ visibility: isOpen ? 'visible' : 'hidden',
189
+ ...panelStyle,
190
+ ...(isResizing ? {
191
+ transition: `none`
192
+ } : {
193
+ transition: `all .2s ease`
194
+ }),
195
+ ...(isResolvedOpen ? {
196
+ opacity: 1,
197
+ pointerEvents: 'all',
198
+ transform: `translateY(0) scale(1)`
199
+ } : {
200
+ opacity: 0,
201
+ pointerEvents: 'none',
202
+ transform: `translateY(15px) scale(1.02)`
203
+ })
204
+ },
205
+ isOpen: isResolvedOpen,
206
+ setIsOpen: setIsOpen,
207
+ handleDragStart: e => handleDragStart(panelRef.current, e)
208
+ })), isResolvedOpen ? /*#__PURE__*/React__default["default"].createElement(styledComponents.Button, _rollupPluginBabelHelpers["extends"]({
209
+ type: "button",
210
+ "aria-label": "Close TanStack Router Devtools"
211
+ }, otherCloseButtonProps, {
212
+ onClick: e => {
213
+ setIsOpen(false);
214
+ onCloseClick && onCloseClick(e);
215
+ },
216
+ style: {
217
+ position: 'fixed',
218
+ zIndex: 99999,
219
+ margin: '.5em',
220
+ bottom: 0,
221
+ ...(position === 'top-right' ? {
222
+ right: '0'
223
+ } : position === 'top-left' ? {
224
+ left: '0'
225
+ } : position === 'bottom-right' ? {
226
+ right: '0'
227
+ } : {
228
+ left: '0'
229
+ }),
230
+ ...closeButtonStyle
231
+ }
232
+ }), "Close") : null), !isResolvedOpen ? /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({
233
+ type: "button"
234
+ }, otherToggleButtonProps, {
235
+ "aria-label": "Open TanStack Router Devtools",
236
+ onClick: e => {
237
+ setIsOpen(true);
238
+ onToggleClick && onToggleClick(e);
239
+ },
240
+ style: {
241
+ appearance: 'none',
242
+ background: 'none',
243
+ border: 0,
244
+ padding: 0,
245
+ position: 'fixed',
246
+ zIndex: 99999,
247
+ display: 'inline-flex',
248
+ fontSize: '1.5em',
249
+ margin: '.5em',
250
+ cursor: 'pointer',
251
+ width: 'fit-content',
252
+ ...(position === 'top-right' ? {
253
+ top: '0',
254
+ right: '0'
255
+ } : position === 'top-left' ? {
256
+ top: '0',
257
+ left: '0'
258
+ } : position === 'bottom-right' ? {
259
+ bottom: '0',
260
+ right: '0'
261
+ } : {
262
+ bottom: '0',
263
+ left: '0'
264
+ }),
265
+ ...toggleButtonStyle
266
+ }
267
+ }), /*#__PURE__*/React__default["default"].createElement(Logo, {
268
+ "aria-hidden": true
269
+ })) : null);
270
+ }
271
+ function RouteComp({
272
+ route,
273
+ isRoot,
274
+ matches
275
+ }) {
276
+ const isActive = matches.find(d => d.route === route);
277
+ return /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement("div", {
278
+ // role="button"
279
+ // aria-label={`Open match details for ${route.id}`}
280
+ // onClick={() =>
281
+ // setActiveRouteId(activeRouteId === route.id ? '' : route.id)
282
+ // }
283
+ style: {
284
+ display: 'flex',
285
+ borderBottom: `solid 1px ${theme.defaultTheme.grayAlt}`,
286
+ cursor: 'pointer',
287
+ alignItems: 'center'
288
+ // background:
289
+ // route === activeMatch ? 'rgba(255,255,255,.1)' : undefined,
290
+ }
291
+ }, isRoot ? null : /*#__PURE__*/React__default["default"].createElement("div", {
292
+ style: {
293
+ flex: '0 0 auto',
294
+ width: '.7rem',
295
+ height: '.7rem',
296
+ margin: '.5rem .75rem',
297
+ alignItems: 'center',
298
+ justifyContent: 'center',
299
+ fontWeight: 'bold',
300
+ borderRadius: '100%',
301
+ transition: 'all .2s ease-out',
302
+ background: utils.getRouteStatusColor(matches, route, theme.defaultTheme),
303
+ opacity: isActive ? 1 : 0.3
304
+ }
305
+ }), /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, {
306
+ style: {
307
+ padding: '.25rem 0',
308
+ paddingLeft: isRoot ? '.5rem' : 0,
309
+ opacity: isActive ? 1 : 0.7
310
+ }
311
+ }, `${route.id}`)), route.children?.length ? /*#__PURE__*/React__default["default"].createElement("div", {
312
+ style: {
313
+ marginLeft: isRoot ? 0 : '1rem',
314
+ borderLeft: isRoot ? '' : `solid 1px ${theme.defaultTheme.grayAlt}`
315
+ }
316
+ }, route.children.map(r => /*#__PURE__*/React__default["default"].createElement(RouteComp, {
317
+ key: r.id,
318
+ route: r,
319
+ matches: matches
320
+ }))) : null);
321
+ }
322
+ const TanStackRouterDevtoolsPanel = /*#__PURE__*/React__default["default"].forwardRef(function TanStackRouterDevtoolsPanel(props, ref) {
323
+ const {
324
+ isOpen = true,
325
+ setIsOpen,
326
+ handleDragStart,
327
+ router: userRouter,
328
+ ...panelProps
329
+ } = props;
330
+ const routerContextValue = React__default["default"].useContext(router.routerContext);
331
+ const router$1 = userRouter ?? routerContextValue?.router;
332
+ router.invariant(router$1, 'No router was found for the TanStack Router Devtools. Please place the devtools in the <RouterProvider> component tree or pass the router instance to the devtools manually.');
333
+ router.useStore(router$1.__store);
334
+ const [showMatches, setShowMatches] = useLocalStorage["default"]('tanstackRouterDevtoolsShowMatches', true);
335
+ const [activeRouteId, setActiveRouteId] = useLocalStorage["default"]('tanstackRouterDevtoolsActiveRouteId', '');
336
+ const [activeMatchId, setActiveMatchId] = useLocalStorage["default"]('tanstackRouterDevtoolsActiveMatchId', '');
337
+ React__default["default"].useEffect(() => {
338
+ setActiveMatchId('');
339
+ }, [activeRouteId]);
340
+ const allMatches = React__default["default"].useMemo(() => [...Object.values(router$1.state.currentMatches), ...Object.values(router$1.state.pendingMatches ?? [])], [router$1.state.currentMatches, router$1.state.pendingMatches]);
341
+ const activeMatch = allMatches?.find(d => d.id === activeMatchId) || allMatches?.find(d => d.route.id === activeRouteId);
342
+ const hasSearch = Object.keys(router.last(router$1.state.currentMatches)?.state.search || {}).length;
343
+ return /*#__PURE__*/React__default["default"].createElement(theme.ThemeProvider, {
344
+ theme: theme.defaultTheme
345
+ }, /*#__PURE__*/React__default["default"].createElement(styledComponents.Panel, _rollupPluginBabelHelpers["extends"]({
346
+ ref: ref,
347
+ className: "TanStackRouterDevtoolsPanel"
348
+ }, panelProps), /*#__PURE__*/React__default["default"].createElement("style", {
349
+ dangerouslySetInnerHTML: {
350
+ __html: `
351
+
352
+ .TanStackRouterDevtoolsPanel * {
353
+ scrollbar-color: ${theme.defaultTheme.backgroundAlt} ${theme.defaultTheme.gray};
354
+ }
355
+
356
+ .TanStackRouterDevtoolsPanel *::-webkit-scrollbar, .TanStackRouterDevtoolsPanel scrollbar {
357
+ width: 1em;
358
+ height: 1em;
359
+ }
360
+
361
+ .TanStackRouterDevtoolsPanel *::-webkit-scrollbar-track, .TanStackRouterDevtoolsPanel scrollbar-track {
362
+ background: ${theme.defaultTheme.backgroundAlt};
363
+ }
364
+
365
+ .TanStackRouterDevtoolsPanel *::-webkit-scrollbar-thumb, .TanStackRouterDevtoolsPanel scrollbar-thumb {
366
+ background: ${theme.defaultTheme.gray};
367
+ border-radius: .5em;
368
+ border: 3px solid ${theme.defaultTheme.backgroundAlt};
369
+ }
370
+
371
+ .TanStackRouterDevtoolsPanel table {
372
+ width: 100%;
373
+ }
374
+
375
+ .TanStackRouterDevtoolsPanel table tr {
376
+ border-bottom: 2px dotted rgba(255, 255, 255, .2);
377
+ }
378
+
379
+ .TanStackRouterDevtoolsPanel table tr:last-child {
380
+ border-bottom: none
381
+ }
382
+
383
+ .TanStackRouterDevtoolsPanel table td {
384
+ padding: .25rem .5rem;
385
+ border-right: 2px dotted rgba(255, 255, 255, .05);
386
+ }
387
+
388
+ .TanStackRouterDevtoolsPanel table td:last-child {
389
+ border-right: none
390
+ }
391
+
392
+ `
393
+ }
394
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
395
+ style: {
396
+ position: 'absolute',
397
+ left: 0,
398
+ top: 0,
399
+ width: '100%',
400
+ height: '4px',
401
+ marginBottom: '-4px',
402
+ cursor: 'row-resize',
403
+ zIndex: 100000
404
+ },
405
+ onMouseDown: handleDragStart
406
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
407
+ style: {
408
+ flex: '1 1 500px',
409
+ minHeight: '40%',
410
+ maxHeight: '100%',
411
+ overflow: 'auto',
412
+ borderRight: `1px solid ${theme.defaultTheme.grayAlt}`,
413
+ display: 'flex',
414
+ flexDirection: 'column'
415
+ }
416
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
417
+ style: {
418
+ display: 'flex',
419
+ justifyContent: 'start',
420
+ gap: '1rem',
421
+ padding: '1rem',
422
+ alignItems: 'center',
423
+ background: theme.defaultTheme.backgroundAlt
424
+ }
425
+ }, /*#__PURE__*/React__default["default"].createElement(Logo, {
426
+ "aria-hidden": true
427
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
428
+ style: {
429
+ fontSize: 'clamp(.8rem, 2vw, 1.3rem)',
430
+ fontWeight: 'bold'
431
+ }
432
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
433
+ style: {
434
+ fontWeight: 100
435
+ }
436
+ }, "Devtools"))), /*#__PURE__*/React__default["default"].createElement("div", {
437
+ style: {
438
+ overflowY: 'auto',
439
+ flex: '1'
440
+ }
441
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
442
+ style: {
443
+ padding: '.5em'
444
+ }
445
+ }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
446
+ label: "Router",
447
+ value: router$1,
448
+ defaultExpanded: {}
449
+ })))), /*#__PURE__*/React__default["default"].createElement("div", {
450
+ style: {
451
+ flex: '1 1 500px',
452
+ minHeight: '40%',
453
+ maxHeight: '100%',
454
+ overflow: 'auto',
455
+ borderRight: `1px solid ${theme.defaultTheme.grayAlt}`,
456
+ display: 'flex',
457
+ flexDirection: 'column'
458
+ }
459
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
460
+ style: {
461
+ padding: '.5em',
462
+ background: theme.defaultTheme.backgroundAlt,
463
+ position: 'sticky',
464
+ top: 0,
465
+ zIndex: 1,
466
+ display: 'flex',
467
+ alignItems: 'center',
468
+ gap: '.5rem'
469
+ }
470
+ }, /*#__PURE__*/React__default["default"].createElement("button", {
471
+ type: "button",
472
+ onClick: () => {
473
+ setShowMatches(false);
474
+ },
475
+ disabled: !showMatches,
476
+ style: {
477
+ opacity: showMatches ? 0.5 : 1
478
+ }
479
+ }, "Routes"), "/", /*#__PURE__*/React__default["default"].createElement("button", {
480
+ type: "button",
481
+ onClick: () => {
482
+ setShowMatches(true);
483
+ },
484
+ disabled: showMatches,
485
+ style: {
486
+ opacity: !showMatches ? 0.5 : 1
487
+ }
488
+ }, "Matches")), !showMatches ? /*#__PURE__*/React__default["default"].createElement(RouteComp, {
489
+ route: router$1.routeTree,
490
+ isRoot: true,
491
+ matches: allMatches
492
+ }) : /*#__PURE__*/React__default["default"].createElement("div", null, router$1.state.currentMatches.map((match, i) => {
493
+ return /*#__PURE__*/React__default["default"].createElement("div", {
494
+ key: match.route.id || i,
495
+ role: "button",
496
+ "aria-label": `Open match details for ${match.route.id}`,
497
+ onClick: () => setActiveRouteId(activeRouteId === match.route.id ? '' : match.route.id),
498
+ style: {
499
+ display: 'flex',
500
+ borderBottom: `solid 1px ${theme.defaultTheme.grayAlt}`,
501
+ cursor: 'pointer',
502
+ alignItems: 'center',
503
+ background: match === activeMatch ? 'rgba(255,255,255,.1)' : undefined
504
+ }
505
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
506
+ style: {
507
+ flex: '0 0 auto',
508
+ width: '1.3rem',
509
+ height: '1.3rem',
510
+ marginLeft: '.25rem',
511
+ background: utils.getStatusColor(match, theme.defaultTheme),
512
+ alignItems: 'center',
513
+ justifyContent: 'center',
514
+ fontWeight: 'bold',
515
+ borderRadius: '.25rem',
516
+ transition: 'all .2s ease-out'
517
+ }
518
+ }), /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, {
519
+ style: {
520
+ padding: '.5em'
521
+ }
522
+ }, `${match.id}`));
523
+ }), router$1.state.pendingMatches?.length ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
524
+ style: {
525
+ marginTop: '2rem',
526
+ padding: '.5em',
527
+ background: theme.defaultTheme.backgroundAlt,
528
+ position: 'sticky',
529
+ top: 0,
530
+ zIndex: 1
531
+ }
532
+ }, "Pending Matches"), router$1.state.pendingMatches?.map((match, i) => {
533
+ return /*#__PURE__*/React__default["default"].createElement("div", {
534
+ key: match.route.id || i,
535
+ role: "button",
536
+ "aria-label": `Open match details for ${match.route.id}`,
537
+ onClick: () => setActiveRouteId(activeRouteId === match.route.id ? '' : match.route.id),
538
+ style: {
539
+ display: 'flex',
540
+ borderBottom: `solid 1px ${theme.defaultTheme.grayAlt}`,
541
+ cursor: 'pointer',
542
+ background: match === activeMatch ? 'rgba(255,255,255,.1)' : undefined
543
+ }
544
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
545
+ style: {
546
+ flex: '0 0 auto',
547
+ width: '1.3rem',
548
+ height: '1.3rem',
549
+ marginLeft: '.25rem',
550
+ background: utils.getStatusColor(match, theme.defaultTheme),
551
+ alignItems: 'center',
552
+ justifyContent: 'center',
553
+ fontWeight: 'bold',
554
+ borderRadius: '.25rem',
555
+ transition: 'all .2s ease-out'
556
+ }
557
+ }), /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, {
558
+ style: {
559
+ padding: '.5em'
560
+ }
561
+ }, `${match.id}`));
562
+ })) : null)), activeMatch ? /*#__PURE__*/React__default["default"].createElement(styledComponents.ActivePanel, null, /*#__PURE__*/React__default["default"].createElement("div", {
563
+ style: {
564
+ padding: '.5em',
565
+ background: theme.defaultTheme.backgroundAlt,
566
+ position: 'sticky',
567
+ top: 0,
568
+ bottom: 0,
569
+ zIndex: 1
570
+ }
571
+ }, "Match Details"), /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement("table", null, /*#__PURE__*/React__default["default"].createElement("tbody", null, /*#__PURE__*/React__default["default"].createElement("tr", null, /*#__PURE__*/React__default["default"].createElement("td", {
572
+ style: {
573
+ opacity: '.5'
574
+ }
575
+ }, "ID"), /*#__PURE__*/React__default["default"].createElement("td", null, /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, {
576
+ style: {
577
+ lineHeight: '1.8em'
578
+ }
579
+ }, JSON.stringify(activeMatch.id, null, 2)))), /*#__PURE__*/React__default["default"].createElement("tr", null, /*#__PURE__*/React__default["default"].createElement("td", {
580
+ style: {
581
+ opacity: '.5'
582
+ }
583
+ }, "Status"), /*#__PURE__*/React__default["default"].createElement("td", null, activeMatch.state.status)), /*#__PURE__*/React__default["default"].createElement("tr", null, /*#__PURE__*/React__default["default"].createElement("td", {
584
+ style: {
585
+ opacity: '.5'
586
+ }
587
+ }, "Last Updated"), /*#__PURE__*/React__default["default"].createElement("td", null, activeMatch.state.updatedAt ? new Date(activeMatch.state.updatedAt).toLocaleTimeString() : 'N/A'))))), /*#__PURE__*/React__default["default"].createElement("div", {
588
+ style: {
589
+ background: theme.defaultTheme.backgroundAlt,
590
+ padding: '.5em',
591
+ position: 'sticky',
592
+ top: 0,
593
+ bottom: 0,
594
+ zIndex: 1
595
+ }
596
+ }, "Explorer"), /*#__PURE__*/React__default["default"].createElement("div", {
597
+ style: {
598
+ padding: '.5em'
599
+ }
600
+ }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
601
+ label: "Match",
602
+ value: activeMatch,
603
+ defaultExpanded: {}
604
+ }))) : null, hasSearch ? /*#__PURE__*/React__default["default"].createElement("div", {
605
+ style: {
606
+ flex: '1 1 500px',
607
+ minHeight: '40%',
608
+ maxHeight: '100%',
609
+ overflow: 'auto',
610
+ borderRight: `1px solid ${theme.defaultTheme.grayAlt}`,
611
+ display: 'flex',
612
+ flexDirection: 'column'
613
+ }
614
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
615
+ style: {
616
+ padding: '.5em',
617
+ background: theme.defaultTheme.backgroundAlt,
618
+ position: 'sticky',
619
+ top: 0,
620
+ bottom: 0,
621
+ zIndex: 1
622
+ }
623
+ }, "Search Params"), /*#__PURE__*/React__default["default"].createElement("div", {
624
+ style: {
625
+ padding: '.5em'
626
+ }
627
+ }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
628
+ value: router.last(router$1.state.currentMatches)?.state.search || {},
629
+ defaultExpanded: Object.keys(router.last(router$1.state.currentMatches)?.state.search || {}).reduce((obj, next) => {
630
+ obj[next] = {};
631
+ return obj;
632
+ }, {})
633
+ }))) : null));
634
+ });
635
+
636
+ exports.TanStackRouterDevtools = TanStackRouterDevtools;
637
+ exports.TanStackRouterDevtoolsPanel = TanStackRouterDevtoolsPanel;
638
+ //# sourceMappingURL=devtools.js.map