@tanstack/router-devtools 0.0.1-alpha.0 → 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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/build/cjs/Explorer.js +57 -81
  4. package/build/cjs/Explorer.js.map +1 -1
  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 +317 -272
  8. package/build/cjs/devtools.js.map +1 -1
  9. package/build/cjs/index.js +3 -3
  10. package/build/cjs/styledComponents.js +10 -38
  11. package/build/cjs/styledComponents.js.map +1 -1
  12. package/build/cjs/theme.js +5 -8
  13. package/build/cjs/theme.js.map +1 -1
  14. package/build/cjs/useLocalStorage.js +3 -10
  15. package/build/cjs/useLocalStorage.js.map +1 -1
  16. package/build/cjs/useMediaQuery.js +13 -12
  17. package/build/cjs/useMediaQuery.js.map +1 -1
  18. package/build/cjs/utils.js +30 -35
  19. package/build/cjs/utils.js.map +1 -1
  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/Logo.js +0 -73
  43. package/build/cjs/Logo.js.map +0 -1
  44. package/build/cjs/packages/react-location-devtools/src/Explorer.js +0 -240
  45. package/build/cjs/packages/react-location-devtools/src/Explorer.js.map +0 -1
  46. package/build/cjs/packages/react-location-devtools/src/Logo.js +0 -73
  47. package/build/cjs/packages/react-location-devtools/src/Logo.js.map +0 -1
  48. package/build/cjs/packages/react-location-devtools/src/devtools.js +0 -614
  49. package/build/cjs/packages/react-location-devtools/src/devtools.js.map +0 -1
  50. package/build/cjs/packages/react-location-devtools/src/index.js +0 -21
  51. package/build/cjs/packages/react-location-devtools/src/index.js.map +0 -1
  52. package/build/cjs/packages/react-location-devtools/src/styledComponents.js +0 -107
  53. package/build/cjs/packages/react-location-devtools/src/styledComponents.js.map +0 -1
  54. package/build/cjs/packages/react-location-devtools/src/theme.js +0 -54
  55. package/build/cjs/packages/react-location-devtools/src/theme.js.map +0 -1
  56. package/build/cjs/packages/react-location-devtools/src/useLocalStorage.js +0 -65
  57. package/build/cjs/packages/react-location-devtools/src/useLocalStorage.js.map +0 -1
  58. package/build/cjs/packages/react-location-devtools/src/useMediaQuery.js +0 -57
  59. package/build/cjs/packages/react-location-devtools/src/useMediaQuery.js.map +0 -1
  60. package/build/cjs/packages/react-location-devtools/src/utils.js +0 -117
  61. package/build/cjs/packages/react-location-devtools/src/utils.js.map +0 -1
  62. package/build/cjs/packages/react-router-devtools/src/Explorer.js +0 -245
  63. package/build/cjs/packages/react-router-devtools/src/Explorer.js.map +0 -1
  64. package/build/cjs/packages/react-router-devtools/src/Logo.js +0 -73
  65. package/build/cjs/packages/react-router-devtools/src/Logo.js.map +0 -1
  66. package/build/cjs/packages/react-router-devtools/src/devtools.js +0 -654
  67. package/build/cjs/packages/react-router-devtools/src/devtools.js.map +0 -1
  68. package/build/cjs/packages/react-router-devtools/src/index.js +0 -21
  69. package/build/cjs/packages/react-router-devtools/src/index.js.map +0 -1
  70. package/build/cjs/packages/react-router-devtools/src/styledComponents.js +0 -107
  71. package/build/cjs/packages/react-router-devtools/src/styledComponents.js.map +0 -1
  72. package/build/cjs/packages/react-router-devtools/src/theme.js +0 -54
  73. package/build/cjs/packages/react-router-devtools/src/theme.js.map +0 -1
  74. package/build/cjs/packages/react-router-devtools/src/useLocalStorage.js +0 -65
  75. package/build/cjs/packages/react-router-devtools/src/useLocalStorage.js.map +0 -1
  76. package/build/cjs/packages/react-router-devtools/src/useMediaQuery.js +0 -57
  77. package/build/cjs/packages/react-router-devtools/src/useMediaQuery.js.map +0 -1
  78. package/build/cjs/packages/react-router-devtools/src/utils.js +0 -117
  79. package/build/cjs/packages/react-router-devtools/src/utils.js.map +0 -1
  80. package/src/Logo.tsx +0 -37
@@ -1,5 +1,5 @@
1
1
  /**
2
- * react-location-devtools
2
+ * router-devtools
3
3
  *
4
4
  * Copyright (c) TanStack
5
5
  *
@@ -14,97 +14,108 @@ Object.defineProperty(exports, '__esModule', { value: true });
14
14
 
15
15
  var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.js');
16
16
  var React = require('react');
17
- var reactLocation = require('@tanstack/react-location');
17
+ var router = require('@tanstack/router');
18
18
  var useLocalStorage = require('./useLocalStorage.js');
19
19
  var utils = require('./utils.js');
20
20
  var styledComponents = require('./styledComponents.js');
21
21
  var theme = require('./theme.js');
22
22
  var Explorer = require('./Explorer.js');
23
- var Logo = require('./Logo.js');
24
23
 
25
24
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
26
25
 
27
26
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
28
27
 
29
- const _excluded = ["style"],
30
- _excluded2 = ["style", "onClick"],
31
- _excluded3 = ["style", "onClick"],
32
- _excluded4 = ["isOpen", "setIsOpen", "handleDragStart", "useRouter"],
33
- _excluded5 = ["listeners", "buildLocation", "mount", "update", "buildNext", "navigate", "cancelMatches", "loadLocation", "cleanPreloadCache", "loadRoute", "matchRoutes", "resolveMatches", "loadMatches", "invalidateRoute", "getOutletElement", "resolvePath", "matchRoute", "loaderData", "getLoaderData", "buildLinkInfo", "__experimental__createSnapshot", "stringifySearch", "parseSearch", "destroy", "defaultPendingElement", "rootMatch"],
34
- _excluded6 = ["abortController", "resolve", "ready", "cancel", "startPending", "cancelPending", "setParentMatch", "load", "router", "element", "errorElement", "pendingElement", "dataPromise", "onExit"];
35
28
  const isServer = typeof window === 'undefined';
36
- function ReactLocationDevtools(_ref) {
37
- let {
38
- initialIsOpen,
39
- panelProps = {},
40
- closeButtonProps = {},
41
- toggleButtonProps = {},
42
- position = 'bottom-left',
43
- containerElement: Container = 'footer',
44
- useRouter: useRouterImpl = reactLocation.useRouter
45
- } = _ref;
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
+ }) {
46
67
  const rootRef = React__default["default"].useRef(null);
47
68
  const panelRef = React__default["default"].useRef(null);
48
- const [isOpen, setIsOpen] = useLocalStorage["default"]('reactLocationDevtoolsOpen', initialIsOpen);
49
- const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage["default"]('reactLocationDevtoolsHeight', null);
69
+ const [isOpen, setIsOpen] = useLocalStorage["default"]('tanstackRouterDevtoolsOpen', initialIsOpen);
70
+ const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage["default"]('tanstackRouterDevtoolsHeight', null);
50
71
  const [isResolvedOpen, setIsResolvedOpen] = utils.useSafeState(false);
51
72
  const [isResizing, setIsResizing] = utils.useSafeState(false);
52
73
  const isMounted = utils.useIsMounted();
53
-
54
- const _handleDragStart = (panelElement, startEvent) => {
55
- var _panelElement$getBoun;
56
-
74
+ const handleDragStart = (panelElement, startEvent) => {
57
75
  if (startEvent.button !== 0) return; // Only allow left click for drag
58
76
 
59
77
  setIsResizing(true);
60
78
  const dragInfo = {
61
- originalHeight: (_panelElement$getBoun = panelElement == null ? void 0 : panelElement.getBoundingClientRect().height) != null ? _panelElement$getBoun : 0,
79
+ originalHeight: panelElement?.getBoundingClientRect().height ?? 0,
62
80
  pageY: startEvent.pageY
63
81
  };
64
-
65
82
  const run = moveEvent => {
66
83
  const delta = dragInfo.pageY - moveEvent.pageY;
67
- const newHeight = (dragInfo == null ? void 0 : dragInfo.originalHeight) + delta;
84
+ const newHeight = dragInfo?.originalHeight + delta;
68
85
  setDevtoolsHeight(newHeight);
69
-
70
86
  if (newHeight < 70) {
71
87
  setIsOpen(false);
72
88
  } else {
73
89
  setIsOpen(true);
74
90
  }
75
91
  };
76
-
77
92
  const unsub = () => {
78
93
  setIsResizing(false);
79
94
  document.removeEventListener('mousemove', run);
80
95
  document.removeEventListener('mouseUp', unsub);
81
96
  };
82
-
83
97
  document.addEventListener('mousemove', run);
84
98
  document.addEventListener('mouseup', unsub);
85
99
  };
86
-
87
100
  React__default["default"].useEffect(() => {
88
- setIsResolvedOpen(isOpen != null ? isOpen : false);
89
- }, [isOpen, isResolvedOpen, setIsResolvedOpen]); // Toggle panel visibility before/after transition (depending on direction).
90
- // Prevents focusing in a closed panel.
101
+ setIsResolvedOpen(isOpen ?? false);
102
+ }, [isOpen, isResolvedOpen, setIsResolvedOpen]);
91
103
 
104
+ // Toggle panel visibility before/after transition (depending on direction).
105
+ // Prevents focusing in a closed panel.
92
106
  React__default["default"].useEffect(() => {
93
107
  const ref = panelRef.current;
94
-
95
108
  if (ref) {
96
109
  const handlePanelTransitionStart = () => {
97
110
  if (ref && isResolvedOpen) {
98
111
  ref.style.visibility = 'visible';
99
112
  }
100
113
  };
101
-
102
114
  const handlePanelTransitionEnd = () => {
103
115
  if (ref && !isResolvedOpen) {
104
116
  ref.style.visibility = 'hidden';
105
117
  }
106
118
  };
107
-
108
119
  ref.addEventListener('transitionstart', handlePanelTransitionStart);
109
120
  ref.addEventListener('transitionend', handlePanelTransitionEnd);
110
121
  return () => {
@@ -112,128 +123,122 @@ function ReactLocationDevtools(_ref) {
112
123
  ref.removeEventListener('transitionend', handlePanelTransitionEnd);
113
124
  };
114
125
  }
126
+ return;
115
127
  }, [isResolvedOpen]);
116
128
  React__default["default"][isServer ? 'useEffect' : 'useLayoutEffect'](() => {
117
129
  if (isResolvedOpen) {
118
- var _rootRef$current, _rootRef$current$pare;
119
-
120
- const previousValue = (_rootRef$current = rootRef.current) == null ? void 0 : (_rootRef$current$pare = _rootRef$current.parentElement) == null ? void 0 : _rootRef$current$pare.style.paddingBottom;
121
-
130
+ const previousValue = rootRef.current?.parentElement?.style.paddingBottom;
122
131
  const run = () => {
123
- var _panelRef$current, _rootRef$current2;
124
-
125
- const containerHeight = (_panelRef$current = panelRef.current) == null ? void 0 : _panelRef$current.getBoundingClientRect().height;
126
-
127
- if ((_rootRef$current2 = rootRef.current) != null && _rootRef$current2.parentElement) {
128
- rootRef.current.parentElement.style.paddingBottom = containerHeight + "px";
132
+ const containerHeight = panelRef.current?.getBoundingClientRect().height;
133
+ if (rootRef.current?.parentElement) {
134
+ rootRef.current.parentElement.style.paddingBottom = `${containerHeight}px`;
129
135
  }
130
136
  };
131
-
132
137
  run();
133
-
134
138
  if (typeof window !== 'undefined') {
135
139
  window.addEventListener('resize', run);
136
140
  return () => {
137
- var _rootRef$current3;
138
-
139
141
  window.removeEventListener('resize', run);
140
-
141
- if ((_rootRef$current3 = rootRef.current) != null && _rootRef$current3.parentElement && typeof previousValue === 'string') {
142
+ if (rootRef.current?.parentElement && typeof previousValue === 'string') {
142
143
  rootRef.current.parentElement.style.paddingBottom = previousValue;
143
144
  }
144
145
  };
145
146
  }
146
147
  }
148
+ return;
147
149
  }, [isResolvedOpen]);
148
-
149
150
  const {
150
- style: panelStyle = {}
151
- } = panelProps,
152
- otherPanelProps = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(panelProps, _excluded);
153
-
151
+ style: panelStyle = {},
152
+ ...otherPanelProps
153
+ } = panelProps;
154
154
  const {
155
155
  style: closeButtonStyle = {},
156
- onClick: onCloseClick
157
- } = closeButtonProps,
158
- otherCloseButtonProps = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(closeButtonProps, _excluded2);
159
-
156
+ onClick: onCloseClick,
157
+ ...otherCloseButtonProps
158
+ } = closeButtonProps;
160
159
  const {
161
160
  style: toggleButtonStyle = {},
162
- onClick: onToggleClick
163
- } = toggleButtonProps,
164
- otherToggleButtonProps = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(toggleButtonProps, _excluded3); // Do not render on the server
165
-
161
+ onClick: onToggleClick,
162
+ ...otherToggleButtonProps
163
+ } = toggleButtonProps;
166
164
 
165
+ // Do not render on the server
167
166
  if (!isMounted()) return null;
168
167
  return /*#__PURE__*/React__default["default"].createElement(Container, {
169
168
  ref: rootRef,
170
- className: "ReactLocationDevtools"
169
+ className: "TanStackRouterDevtools"
171
170
  }, /*#__PURE__*/React__default["default"].createElement(theme.ThemeProvider, {
172
171
  theme: theme.defaultTheme
173
- }, /*#__PURE__*/React__default["default"].createElement(ReactLocationDevtoolsPanel, _rollupPluginBabelHelpers["extends"]({
172
+ }, /*#__PURE__*/React__default["default"].createElement(TanStackRouterDevtoolsPanel, _rollupPluginBabelHelpers["extends"]({
174
173
  ref: panelRef
175
174
  }, otherPanelProps, {
176
- useRouter: useRouterImpl,
177
- style: _rollupPluginBabelHelpers["extends"]({
175
+ router: router,
176
+ style: {
178
177
  position: 'fixed',
179
178
  bottom: '0',
180
179
  right: '0',
181
180
  zIndex: 99999,
182
181
  width: '100%',
183
- height: devtoolsHeight != null ? devtoolsHeight : 500,
182
+ height: devtoolsHeight ?? 500,
184
183
  maxHeight: '90%',
185
184
  boxShadow: '0 0 20px rgba(0,0,0,.3)',
186
- borderTop: "1px solid " + theme.defaultTheme.gray,
185
+ borderTop: `1px solid ${theme.defaultTheme.gray}`,
187
186
  transformOrigin: 'top',
188
187
  // visibility will be toggled after transitions, but set initial state here
189
- visibility: isOpen ? 'visible' : 'hidden'
190
- }, panelStyle, isResizing ? {
191
- transition: "none"
192
- } : {
193
- transition: "all .2s ease"
194
- }, isResolvedOpen ? {
195
- opacity: 1,
196
- pointerEvents: 'all',
197
- transform: "translateY(0) scale(1)"
198
- } : {
199
- opacity: 0,
200
- pointerEvents: 'none',
201
- transform: "translateY(15px) scale(1.02)"
202
- }),
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
+ },
203
205
  isOpen: isResolvedOpen,
204
206
  setIsOpen: setIsOpen,
205
- handleDragStart: e => _handleDragStart(panelRef.current, e)
207
+ handleDragStart: e => handleDragStart(panelRef.current, e)
206
208
  })), isResolvedOpen ? /*#__PURE__*/React__default["default"].createElement(styledComponents.Button, _rollupPluginBabelHelpers["extends"]({
207
209
  type: "button",
208
- "aria-label": "Close TanStack Location Devtools"
210
+ "aria-label": "Close TanStack Router Devtools"
209
211
  }, otherCloseButtonProps, {
210
212
  onClick: e => {
211
213
  setIsOpen(false);
212
214
  onCloseClick && onCloseClick(e);
213
215
  },
214
- style: _rollupPluginBabelHelpers["extends"]({
216
+ style: {
215
217
  position: 'fixed',
216
218
  zIndex: 99999,
217
219
  margin: '.5em',
218
- bottom: 0
219
- }, position === 'top-right' ? {
220
- right: '0'
221
- } : position === 'top-left' ? {
222
- left: '0'
223
- } : position === 'bottom-right' ? {
224
- right: '0'
225
- } : {
226
- left: '0'
227
- }, closeButtonStyle)
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
+ }
228
232
  }), "Close") : null), !isResolvedOpen ? /*#__PURE__*/React__default["default"].createElement("button", _rollupPluginBabelHelpers["extends"]({
229
233
  type: "button"
230
234
  }, otherToggleButtonProps, {
231
- "aria-label": "Open TanStack Location Devtools",
235
+ "aria-label": "Open TanStack Router Devtools",
232
236
  onClick: e => {
233
237
  setIsOpen(true);
234
238
  onToggleClick && onToggleClick(e);
235
239
  },
236
- style: _rollupPluginBabelHelpers["extends"]({
240
+ style: {
241
+ appearance: 'none',
237
242
  background: 'none',
238
243
  border: 0,
239
244
  padding: 0,
@@ -243,45 +248,148 @@ function ReactLocationDevtools(_ref) {
243
248
  fontSize: '1.5em',
244
249
  margin: '.5em',
245
250
  cursor: 'pointer',
246
- width: 'fit-content'
247
- }, position === 'top-right' ? {
248
- top: '0',
249
- right: '0'
250
- } : position === 'top-left' ? {
251
- top: '0',
252
- left: '0'
253
- } : position === 'bottom-right' ? {
254
- bottom: '0',
255
- right: '0'
256
- } : {
257
- bottom: '0',
258
- left: '0'
259
- }, toggleButtonStyle)
260
- }), /*#__PURE__*/React__default["default"].createElement(Logo["default"], {
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, {
261
268
  "aria-hidden": true
262
269
  })) : null);
263
270
  }
264
- const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwardRef(function ReactLocationDevtoolsPanel(props, ref) {
265
- var _router$state$current, _router$state$pending;
266
-
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) {
267
323
  const {
268
324
  isOpen = true,
325
+ setIsOpen,
269
326
  handleDragStart,
270
- useRouter
271
- } = props,
272
- panelProps = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(props, _excluded4);
273
-
274
- const router = useRouter();
275
- const [activeMatchId, setActiveRouteId] = useLocalStorage["default"]('reactLocationDevtoolsActiveRouteId', '');
276
- const activeMatch = (_router$state$current = router.state.current.matches) == null ? void 0 : _router$state$current.find(d => d.id === activeMatchId);
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;
277
343
  return /*#__PURE__*/React__default["default"].createElement(theme.ThemeProvider, {
278
344
  theme: theme.defaultTheme
279
345
  }, /*#__PURE__*/React__default["default"].createElement(styledComponents.Panel, _rollupPluginBabelHelpers["extends"]({
280
346
  ref: ref,
281
- className: "ReactLocationDevtoolsPanel"
347
+ className: "TanStackRouterDevtoolsPanel"
282
348
  }, panelProps), /*#__PURE__*/React__default["default"].createElement("style", {
283
349
  dangerouslySetInnerHTML: {
284
- __html: "\n\n .ReactLocationDevtoolsPanel * {\n scrollbar-color: " + theme.defaultTheme.backgroundAlt + " " + theme.defaultTheme.gray + ";\n }\n\n .ReactLocationDevtoolsPanel *::-webkit-scrollbar, .ReactLocationDevtoolsPanel scrollbar {\n width: 1em;\n height: 1em;\n }\n\n .ReactLocationDevtoolsPanel *::-webkit-scrollbar-track, .ReactLocationDevtoolsPanel scrollbar-track {\n background: " + theme.defaultTheme.backgroundAlt + ";\n }\n\n .ReactLocationDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactLocationDevtoolsPanel scrollbar-thumb {\n background: " + theme.defaultTheme.gray + ";\n border-radius: .5em;\n border: 3px solid " + theme.defaultTheme.backgroundAlt + ";\n }\n\n .ReactLocationDevtoolsPanel table {\n width: 100%;\n }\n\n .ReactLocationDevtoolsPanel table tr {\n border-bottom: 2px dotted rgba(255, 255, 255, .2);\n }\n\n .ReactLocationDevtoolsPanel table tr:last-child {\n border-bottom: none\n }\n\n .ReactLocationDevtoolsPanel table td {\n padding: .25rem .5rem;\n border-right: 2px dotted rgba(255, 255, 255, .05);\n }\n\n .ReactLocationDevtoolsPanel table td:last-child {\n border-right: none\n }\n\n "
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
+ `
285
393
  }
286
394
  }), /*#__PURE__*/React__default["default"].createElement("div", {
287
395
  style: {
@@ -301,39 +409,31 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
301
409
  minHeight: '40%',
302
410
  maxHeight: '100%',
303
411
  overflow: 'auto',
304
- borderRight: "1px solid " + theme.defaultTheme.grayAlt,
412
+ borderRight: `1px solid ${theme.defaultTheme.grayAlt}`,
305
413
  display: 'flex',
306
414
  flexDirection: 'column'
307
415
  }
308
416
  }, /*#__PURE__*/React__default["default"].createElement("div", {
309
417
  style: {
310
- padding: '.5em',
311
- background: theme.defaultTheme.backgroundAlt,
312
418
  display: 'flex',
313
- justifyContent: 'space-between',
314
- alignItems: 'center'
315
- }
316
- }, /*#__PURE__*/React__default["default"].createElement(Logo["default"], {
317
- "aria-hidden": true,
318
- style: {
319
- marginRight: '.5em'
419
+ justifyContent: 'start',
420
+ gap: '1rem',
421
+ padding: '1rem',
422
+ alignItems: 'center',
423
+ background: theme.defaultTheme.backgroundAlt
320
424
  }
425
+ }, /*#__PURE__*/React__default["default"].createElement(Logo, {
426
+ "aria-hidden": true
321
427
  }), /*#__PURE__*/React__default["default"].createElement("div", {
322
428
  style: {
323
- marginRight: 'auto',
324
429
  fontSize: 'clamp(.8rem, 2vw, 1.3rem)',
325
430
  fontWeight: 'bold'
326
431
  }
327
- }, "TanStack Location", ' ', /*#__PURE__*/React__default["default"].createElement("span", {
432
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
328
433
  style: {
329
434
  fontWeight: 100
330
435
  }
331
- }, "Devtools")), /*#__PURE__*/React__default["default"].createElement("div", {
332
- style: {
333
- display: 'flex',
334
- flexDirection: 'column'
335
- }
336
- })), /*#__PURE__*/React__default["default"].createElement("div", {
436
+ }, "Devtools"))), /*#__PURE__*/React__default["default"].createElement("div", {
337
437
  style: {
338
438
  overflowY: 'auto',
339
439
  flex: '1'
@@ -344,11 +444,7 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
344
444
  }
345
445
  }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
346
446
  label: "Router",
347
- value: (() => {
348
- const rest = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(router, _excluded5);
349
-
350
- return rest;
351
- })(),
447
+ value: router$1,
352
448
  defaultExpanded: {}
353
449
  })))), /*#__PURE__*/React__default["default"].createElement("div", {
354
450
  style: {
@@ -356,7 +452,7 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
356
452
  minHeight: '40%',
357
453
  maxHeight: '100%',
358
454
  overflow: 'auto',
359
- borderRight: "1px solid " + theme.defaultTheme.grayAlt,
455
+ borderRight: `1px solid ${theme.defaultTheme.grayAlt}`,
360
456
  display: 'flex',
361
457
  flexDirection: 'column'
362
458
  }
@@ -366,45 +462,42 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
366
462
  background: theme.defaultTheme.backgroundAlt,
367
463
  position: 'sticky',
368
464
  top: 0,
369
- zIndex: 1
370
- }
371
- }, "Loader Data"), /*#__PURE__*/React__default["default"].createElement("div", {
372
- style: {
373
- padding: '.5em'
465
+ zIndex: 1,
466
+ display: 'flex',
467
+ alignItems: 'center',
468
+ gap: '.5rem'
374
469
  }
375
- }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
376
- value: router.getLoaderData(),
377
- defaultExpanded: Object.keys(router.getLoaderData()).reduce((obj, next) => {
378
- obj[next] = {};
379
- return obj;
380
- }, {})
381
- }))), /*#__PURE__*/React__default["default"].createElement("div", {
470
+ }, /*#__PURE__*/React__default["default"].createElement("button", {
471
+ type: "button",
472
+ onClick: () => {
473
+ setShowMatches(false);
474
+ },
475
+ disabled: !showMatches,
382
476
  style: {
383
- flex: '1 1 500px',
384
- minHeight: '40%',
385
- maxHeight: '100%',
386
- overflow: 'auto',
387
- borderRight: "1px solid " + theme.defaultTheme.grayAlt,
388
- display: 'flex',
389
- flexDirection: 'column'
477
+ opacity: showMatches ? 0.5 : 1
390
478
  }
391
- }, /*#__PURE__*/React__default["default"].createElement("div", {
479
+ }, "Routes"), "/", /*#__PURE__*/React__default["default"].createElement("button", {
480
+ type: "button",
481
+ onClick: () => {
482
+ setShowMatches(true);
483
+ },
484
+ disabled: showMatches,
392
485
  style: {
393
- padding: '.5em',
394
- background: theme.defaultTheme.backgroundAlt,
395
- position: 'sticky',
396
- top: 0,
397
- zIndex: 1
486
+ opacity: !showMatches ? 0.5 : 1
398
487
  }
399
- }, "Current Matches"), router.state.current.matches.map((match, i) => {
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) => {
400
493
  return /*#__PURE__*/React__default["default"].createElement("div", {
401
- key: match.id || i,
494
+ key: match.route.id || i,
402
495
  role: "button",
403
- "aria-label": "Open match details for " + match.id,
404
- onClick: () => setActiveRouteId(activeMatchId === match.id ? '' : match.id),
496
+ "aria-label": `Open match details for ${match.route.id}`,
497
+ onClick: () => setActiveRouteId(activeRouteId === match.route.id ? '' : match.route.id),
405
498
  style: {
406
499
  display: 'flex',
407
- borderBottom: "solid 1px " + theme.defaultTheme.grayAlt,
500
+ borderBottom: `solid 1px ${theme.defaultTheme.grayAlt}`,
408
501
  cursor: 'pointer',
409
502
  alignItems: 'center',
410
503
  background: match === activeMatch ? 'rgba(255,255,255,.1)' : undefined
@@ -426,8 +519,8 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
426
519
  style: {
427
520
  padding: '.5em'
428
521
  }
429
- }, "" + match.id));
430
- }), /*#__PURE__*/React__default["default"].createElement("div", {
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", {
431
524
  style: {
432
525
  marginTop: '2rem',
433
526
  padding: '.5em',
@@ -436,15 +529,15 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
436
529
  top: 0,
437
530
  zIndex: 1
438
531
  }
439
- }, "Pending Matches"), (_router$state$pending = router.state.pending) == null ? void 0 : _router$state$pending.matches.map((match, i) => {
532
+ }, "Pending Matches"), router$1.state.pendingMatches?.map((match, i) => {
440
533
  return /*#__PURE__*/React__default["default"].createElement("div", {
441
- key: match.id || i,
534
+ key: match.route.id || i,
442
535
  role: "button",
443
- "aria-label": "Open match details for " + match.id,
444
- onClick: () => setActiveRouteId(activeMatchId === match.id ? '' : match.id),
536
+ "aria-label": `Open match details for ${match.route.id}`,
537
+ onClick: () => setActiveRouteId(activeRouteId === match.route.id ? '' : match.route.id),
445
538
  style: {
446
539
  display: 'flex',
447
- borderBottom: "solid 1px " + theme.defaultTheme.grayAlt,
540
+ borderBottom: `solid 1px ${theme.defaultTheme.grayAlt}`,
448
541
  cursor: 'pointer',
449
542
  background: match === activeMatch ? 'rgba(255,255,255,.1)' : undefined
450
543
  }
@@ -465,64 +558,14 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
465
558
  style: {
466
559
  padding: '.5em'
467
560
  }
468
- }, "" + match.id));
469
- }), /*#__PURE__*/React__default["default"].createElement("div", {
470
- style: {
471
- marginTop: '2rem',
472
- padding: '.5em',
473
- background: theme.defaultTheme.backgroundAlt,
474
- position: 'sticky',
475
- top: 0,
476
- zIndex: 1
477
- }
478
- }, "Preloading Matches"), Object.keys(router.preloadCache).map((key, i) => {
479
- const {
480
- match,
481
- expiresAt
482
- } = router.preloadCache[key];
483
- return /*#__PURE__*/React__default["default"].createElement("div", {
484
- key: match.id || i,
485
- role: "button",
486
- "aria-label": "Open match details for " + match.id,
487
- onClick: () => setActiveRouteId(activeMatchId === match.id ? '' : match.id),
488
- style: {
489
- display: 'flex',
490
- borderBottom: "solid 1px " + theme.defaultTheme.grayAlt,
491
- cursor: 'pointer',
492
- background: match === activeMatch ? 'rgba(255,255,255,.1)' : undefined
493
- }
494
- }, /*#__PURE__*/React__default["default"].createElement("div", {
495
- style: {
496
- display: 'flex',
497
- flexDirection: 'column',
498
- padding: '.5rem',
499
- gap: '.3rem'
500
- }
501
- }, /*#__PURE__*/React__default["default"].createElement("div", {
502
- style: {
503
- display: 'flex',
504
- alignItems: 'center',
505
- gap: '.5rem'
506
- }
507
- }, /*#__PURE__*/React__default["default"].createElement("div", {
508
- style: {
509
- flex: '0 0 auto',
510
- width: '1.3rem',
511
- height: '1.3rem',
512
- background: utils.getStatusColor(match, theme.defaultTheme),
513
- alignItems: 'center',
514
- justifyContent: 'center',
515
- fontWeight: 'bold',
516
- borderRadius: '.25rem',
517
- transition: 'all .2s ease-out'
518
- }
519
- }), /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, null, "" + match.id)), /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, null, "Expires: ", new Date(expiresAt).toLocaleTimeString())));
520
- })), activeMatch ? /*#__PURE__*/React__default["default"].createElement(styledComponents.ActivePanel, null, /*#__PURE__*/React__default["default"].createElement("div", {
561
+ }, `${match.id}`));
562
+ })) : null)), activeMatch ? /*#__PURE__*/React__default["default"].createElement(styledComponents.ActivePanel, null, /*#__PURE__*/React__default["default"].createElement("div", {
521
563
  style: {
522
564
  padding: '.5em',
523
565
  background: theme.defaultTheme.backgroundAlt,
524
566
  position: 'sticky',
525
567
  top: 0,
568
+ bottom: 0,
526
569
  zIndex: 1
527
570
  }
528
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", {
@@ -537,57 +580,59 @@ const ReactLocationDevtoolsPanel = /*#__PURE__*/React__default["default"].forwar
537
580
  style: {
538
581
  opacity: '.5'
539
582
  }
540
- }, "Last Updated"), /*#__PURE__*/React__default["default"].createElement("td", null, activeMatch.updatedAt ? /*#__PURE__*/React__default["default"].createElement(styledComponents.Code, null, new Date(activeMatch.updatedAt).toLocaleTimeString()) : 'N/A'))))), /*#__PURE__*/React__default["default"].createElement("div", {
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", {
541
588
  style: {
542
589
  background: theme.defaultTheme.backgroundAlt,
543
590
  padding: '.5em',
544
591
  position: 'sticky',
545
592
  top: 0,
593
+ bottom: 0,
546
594
  zIndex: 1
547
595
  }
548
- }, "Actions"), /*#__PURE__*/React__default["default"].createElement("div", {
549
- style: {
550
- padding: '0.5em'
551
- }
552
- }, /*#__PURE__*/React__default["default"].createElement(styledComponents.Button, {
553
- type: "button",
554
- onClick: () => {
555
- router.invalidateRoute(activeMatch);
556
- router.notify();
557
- },
596
+ }, "Explorer"), /*#__PURE__*/React__default["default"].createElement("div", {
558
597
  style: {
559
- background: theme.defaultTheme.warning,
560
- color: theme.defaultTheme.inputTextColor
598
+ padding: '.5em'
561
599
  }
562
- }, "Invalidate"), ' ', /*#__PURE__*/React__default["default"].createElement(styledComponents.Button, {
563
- type: "button",
564
- onClick: () => router.reload(),
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", {
565
605
  style: {
566
- background: theme.defaultTheme.gray
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'
567
613
  }
568
- }, "Reload")), /*#__PURE__*/React__default["default"].createElement("div", {
614
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
569
615
  style: {
570
- background: theme.defaultTheme.backgroundAlt,
571
616
  padding: '.5em',
617
+ background: theme.defaultTheme.backgroundAlt,
572
618
  position: 'sticky',
573
619
  top: 0,
620
+ bottom: 0,
574
621
  zIndex: 1
575
622
  }
576
- }, "Explorer"), /*#__PURE__*/React__default["default"].createElement("div", {
623
+ }, "Search Params"), /*#__PURE__*/React__default["default"].createElement("div", {
577
624
  style: {
578
625
  padding: '.5em'
579
626
  }
580
627
  }, /*#__PURE__*/React__default["default"].createElement(Explorer["default"], {
581
- label: "Match",
582
- value: (() => {
583
- const rest = _rollupPluginBabelHelpers.objectWithoutPropertiesLoose(activeMatch, _excluded6);
584
-
585
- return rest;
586
- })(),
587
- defaultExpanded: {}
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
+ }, {})
588
633
  }))) : null));
589
634
  });
590
635
 
591
- exports.ReactLocationDevtools = ReactLocationDevtools;
592
- exports.ReactLocationDevtoolsPanel = ReactLocationDevtoolsPanel;
636
+ exports.TanStackRouterDevtools = TanStackRouterDevtools;
637
+ exports.TanStackRouterDevtoolsPanel = TanStackRouterDevtoolsPanel;
593
638
  //# sourceMappingURL=devtools.js.map