@tanstack/router-devtools 1.112.18 → 1.114.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.
- package/dist/cjs/index.cjs +12 -4
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +2 -2
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +6 -4
- package/dist/esm/index.js.map +1 -1
- package/package.json +3 -2
- package/src/index.tsx +6 -2
- package/dist/cjs/AgeTicker.cjs +0 -58
- package/dist/cjs/AgeTicker.cjs.map +0 -1
- package/dist/cjs/AgeTicker.d.cts +0 -5
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.cjs +0 -421
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.cjs.map +0 -1
- package/dist/cjs/BaseTanStackRouterDevtoolsPanel.d.cts +0 -3
- package/dist/cjs/Explorer.cjs +0 -310
- package/dist/cjs/Explorer.cjs.map +0 -1
- package/dist/cjs/Explorer.d.cts +0 -46
- package/dist/cjs/TanStackRouterDevtools.cjs +0 -177
- package/dist/cjs/TanStackRouterDevtools.cjs.map +0 -1
- package/dist/cjs/TanStackRouterDevtools.d.cts +0 -41
- package/dist/cjs/TanStackRouterDevtoolsPanel.cjs +0 -21
- package/dist/cjs/TanStackRouterDevtoolsPanel.cjs.map +0 -1
- package/dist/cjs/TanStackRouterDevtoolsPanel.d.cts +0 -33
- package/dist/cjs/context.cjs +0 -18
- package/dist/cjs/context.cjs.map +0 -1
- package/dist/cjs/context.d.cts +0 -8
- package/dist/cjs/logo.cjs +0 -1012
- package/dist/cjs/logo.cjs.map +0 -1
- package/dist/cjs/logo.d.cts +0 -1
- package/dist/cjs/theme.d.cts +0 -34
- package/dist/cjs/tokens.cjs +0 -201
- package/dist/cjs/tokens.cjs.map +0 -1
- package/dist/cjs/tokens.d.cts +0 -298
- package/dist/cjs/useLocalStorage.cjs +0 -45
- package/dist/cjs/useLocalStorage.cjs.map +0 -1
- package/dist/cjs/useLocalStorage.d.cts +0 -1
- package/dist/cjs/useMediaQuery.d.cts +0 -1
- package/dist/cjs/useStyles.cjs +0 -570
- package/dist/cjs/useStyles.cjs.map +0 -1
- package/dist/cjs/useStyles.d.cts +0 -52
- package/dist/cjs/utils.cjs +0 -84
- package/dist/cjs/utils.cjs.map +0 -1
- package/dist/cjs/utils.d.cts +0 -23
- package/dist/esm/AgeTicker.d.ts +0 -5
- package/dist/esm/AgeTicker.js +0 -58
- package/dist/esm/AgeTicker.js.map +0 -1
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.d.ts +0 -3
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.js +0 -421
- package/dist/esm/BaseTanStackRouterDevtoolsPanel.js.map +0 -1
- package/dist/esm/Explorer.d.ts +0 -46
- package/dist/esm/Explorer.js +0 -292
- package/dist/esm/Explorer.js.map +0 -1
- package/dist/esm/TanStackRouterDevtools.d.ts +0 -41
- package/dist/esm/TanStackRouterDevtools.js +0 -177
- package/dist/esm/TanStackRouterDevtools.js.map +0 -1
- package/dist/esm/TanStackRouterDevtoolsPanel.d.ts +0 -33
- package/dist/esm/TanStackRouterDevtoolsPanel.js +0 -21
- package/dist/esm/TanStackRouterDevtoolsPanel.js.map +0 -1
- package/dist/esm/context.d.ts +0 -8
- package/dist/esm/context.js +0 -18
- package/dist/esm/context.js.map +0 -1
- package/dist/esm/logo.d.ts +0 -1
- package/dist/esm/logo.js +0 -1012
- package/dist/esm/logo.js.map +0 -1
- package/dist/esm/theme.d.ts +0 -34
- package/dist/esm/tokens.d.ts +0 -298
- package/dist/esm/tokens.js +0 -201
- package/dist/esm/tokens.js.map +0 -1
- package/dist/esm/useLocalStorage.d.ts +0 -1
- package/dist/esm/useLocalStorage.js +0 -46
- package/dist/esm/useLocalStorage.js.map +0 -1
- package/dist/esm/useMediaQuery.d.ts +0 -1
- package/dist/esm/useStyles.d.ts +0 -52
- package/dist/esm/useStyles.js +0 -553
- package/dist/esm/useStyles.js.map +0 -1
- package/dist/esm/utils.d.ts +0 -23
- package/dist/esm/utils.js +0 -84
- package/dist/esm/utils.js.map +0 -1
- package/src/AgeTicker.tsx +0 -73
- package/src/BaseTanStackRouterDevtoolsPanel.tsx +0 -488
- package/src/Explorer.tsx +0 -362
- package/src/TanStackRouterDevtools.tsx +0 -250
- package/src/TanStackRouterDevtoolsPanel.tsx +0 -54
- package/src/context.ts +0 -22
- package/src/logo.tsx +0 -817
- package/src/theme.tsx +0 -31
- package/src/tokens.ts +0 -305
- package/src/useLocalStorage.ts +0 -52
- package/src/useMediaQuery.ts +0 -41
- package/src/useStyles.tsx +0 -589
- package/src/utils.ts +0 -188
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseTanStackRouterDevtoolsPanel.js","sources":["../../src/BaseTanStackRouterDevtoolsPanel.tsx"],"sourcesContent":["import React from 'react'\nimport { clsx as cx } from 'clsx'\nimport {\n invariant,\n rootRouteId,\n trimPath,\n useRouter,\n useRouterState,\n} from '@tanstack/react-router'\nimport { useDevtoolsOnClose } from './context'\nimport { useStyles } from './useStyles'\nimport useLocalStorage from './useLocalStorage'\nimport Explorer from './Explorer'\nimport { getRouteStatusColor, getStatusColor, multiSortBy } from './utils'\nimport { AgeTicker } from './AgeTicker'\nimport type { DevtoolsPanelOptions } from './TanStackRouterDevtoolsPanel'\n\nimport type {\n AnyRootRoute,\n AnyRoute,\n AnyRouter,\n Route,\n} from '@tanstack/react-router'\n\nfunction Logo(props: React.HTMLAttributes<HTMLButtonElement>) {\n const { className, ...rest } = props\n const styles = useStyles()\n return (\n <button {...rest} className={cx(styles.logo, className)}>\n <div className={styles.tanstackLogo}>TANSTACK</div>\n <div className={styles.routerLogo}>React Router v1</div>\n </button>\n )\n}\n\nfunction RouteComp({\n router,\n route,\n isRoot,\n activeId,\n setActiveId,\n}: {\n router: AnyRouter\n route: AnyRootRoute | AnyRoute\n isRoot?: boolean\n activeId: string | undefined\n setActiveId: (id: string) => void\n}) {\n const routerState = useRouterState({\n router,\n } as any)\n const styles = useStyles()\n const matches = routerState.pendingMatches || routerState.matches\n const match = routerState.matches.find((d) => d.routeId === route.id)\n\n const param = React.useMemo(() => {\n try {\n if (match?.params) {\n const p = match.params\n const r: string = route.path || trimPath(route.id)\n if (r.startsWith('$')) {\n const trimmed = r.slice(1)\n if (p[trimmed]) {\n return `(${p[trimmed]})`\n }\n }\n }\n return ''\n } catch (error) {\n return ''\n }\n }, [match, route])\n\n return (\n <div>\n <div\n role=\"button\"\n aria-label={`Open match details for ${route.id}`}\n onClick={() => {\n if (match) {\n setActiveId(activeId === route.id ? '' : route.id)\n }\n }}\n className={cx(\n styles.routesRowContainer(route.id === activeId, !!match),\n )}\n >\n <div\n className={cx(\n styles.matchIndicator(getRouteStatusColor(matches, route)),\n )}\n />\n <div className={cx(styles.routesRow(!!match))}>\n <div>\n <code className={styles.code}>\n {isRoot ? rootRouteId : route.path || trimPath(route.id)}{' '}\n </code>\n <code className={styles.routeParamInfo}>{param}</code>\n </div>\n <AgeTicker match={match} router={router} />\n </div>\n </div>\n {route.children?.length ? (\n <div className={styles.nestedRouteRow(!!isRoot)}>\n {[...(route.children as Array<Route>)]\n .sort((a, b) => {\n return a.rank - b.rank\n })\n .map((r) => (\n <RouteComp\n key={r.id}\n router={router}\n route={r}\n activeId={activeId}\n setActiveId={setActiveId}\n />\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport const BaseTanStackRouterDevtoolsPanel = React.forwardRef<\n HTMLDivElement,\n DevtoolsPanelOptions\n>(function BaseTanStackRouterDevtoolsPanel(props, ref): React.ReactElement {\n const {\n isOpen = true,\n setIsOpen,\n handleDragStart,\n router: userRouter,\n shadowDOMTarget,\n ...panelProps\n } = props\n\n const { onCloseClick } = useDevtoolsOnClose()\n const styles = useStyles()\n const { className, ...otherPanelProps } = panelProps\n\n const contextRouter = useRouter({ warn: false })\n const router = userRouter ?? contextRouter\n const routerState = useRouterState({\n router,\n } as any)\n\n invariant(\n router,\n '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.',\n )\n\n // useStore(router.__store)\n\n const [showMatches, setShowMatches] = useLocalStorage(\n 'tanstackRouterDevtoolsShowMatches',\n true,\n )\n\n const [activeId, setActiveId] = useLocalStorage(\n 'tanstackRouterDevtoolsActiveRouteId',\n '',\n )\n\n const activeMatch = React.useMemo(() => {\n const matches = [\n ...(routerState.pendingMatches ?? []),\n ...routerState.matches,\n ...routerState.cachedMatches,\n ]\n return matches.find((d) => d.routeId === activeId || d.id === activeId)\n }, [\n activeId,\n routerState.cachedMatches,\n routerState.matches,\n routerState.pendingMatches,\n ])\n\n const hasSearch = Object.keys(routerState.location.search).length\n\n const explorerState = {\n ...router,\n state: router.state,\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n styles.devtoolsPanel,\n 'TanStackRouterDevtoolsPanel',\n className,\n )}\n {...otherPanelProps}\n >\n {handleDragStart ? (\n <div className={styles.dragHandle} onMouseDown={handleDragStart}></div>\n ) : null}\n <button\n className={styles.panelCloseBtn}\n onClick={(e) => {\n setIsOpen(false)\n onCloseClick(e)\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"6\"\n fill=\"none\"\n viewBox=\"0 0 10 6\"\n className={styles.panelCloseBtnIcon}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.667\"\n d=\"M1 1l4 4 4-4\"\n ></path>\n </svg>\n </button>\n <div className={styles.firstContainer}>\n <div className={styles.row}>\n <Logo\n aria-hidden\n onClick={(e) => {\n setIsOpen(false)\n onCloseClick(e)\n }}\n />\n </div>\n <div className={styles.routerExplorerContainer}>\n <div className={styles.routerExplorer}>\n <Explorer\n label=\"Router\"\n value={Object.fromEntries(\n multiSortBy(\n Object.keys(explorerState),\n (\n [\n 'state',\n 'routesById',\n 'routesByPath',\n 'flatRoutes',\n 'options',\n 'manifest',\n ] as const\n ).map((d) => (dd) => dd !== d),\n )\n .map((key) => [key, (explorerState as any)[key]])\n .filter(\n (d) =>\n typeof d[1] !== 'function' &&\n ![\n '__store',\n 'basepath',\n 'injectedHtml',\n 'subscribers',\n 'latestLoadPromise',\n 'navigateTimeout',\n 'resetNextScroll',\n 'tempLocationKey',\n 'latestLocation',\n 'routeTree',\n 'history',\n ].includes(d[0]),\n ),\n )}\n defaultExpanded={{\n state: {} as any,\n context: {} as any,\n options: {} as any,\n }}\n filterSubEntries={(subEntries) => {\n return subEntries.filter((d) => typeof d.value !== 'function')\n }}\n />\n </div>\n </div>\n </div>\n <div className={styles.secondContainer}>\n <div className={styles.matchesContainer}>\n <div className={styles.detailsHeader}>\n <span>Pathname</span>\n {routerState.location.maskedLocation ? (\n <div className={styles.maskedBadgeContainer}>\n <span className={styles.maskedBadge}>masked</span>\n </div>\n ) : null}\n </div>\n <div className={styles.detailsContent}>\n <code>{routerState.location.pathname}</code>\n {routerState.location.maskedLocation ? (\n <code className={styles.maskedLocation}>\n {routerState.location.maskedLocation.pathname}\n </code>\n ) : null}\n </div>\n <div className={styles.detailsHeader}>\n <div className={styles.routeMatchesToggle}>\n <button\n type=\"button\"\n onClick={() => {\n setShowMatches(false)\n }}\n disabled={!showMatches}\n className={cx(styles.routeMatchesToggleBtn(!showMatches, true))}\n >\n Routes\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setShowMatches(true)\n }}\n disabled={showMatches}\n className={cx(\n styles.routeMatchesToggleBtn(!!showMatches, false),\n )}\n >\n Matches\n </button>\n </div>\n <div className={styles.detailsHeaderInfo}>\n <div>age / staleTime / gcTime</div>\n </div>\n </div>\n <div className={cx(styles.routesContainer)}>\n {!showMatches ? (\n <RouteComp\n router={router}\n route={router.routeTree}\n isRoot\n activeId={activeId}\n setActiveId={setActiveId}\n />\n ) : (\n <div>\n {(routerState.pendingMatches?.length\n ? routerState.pendingMatches\n : routerState.matches\n ).map((match, i) => {\n return (\n <div\n key={match.id || i}\n role=\"button\"\n aria-label={`Open match details for ${match.id}`}\n onClick={() =>\n setActiveId(activeId === match.id ? '' : match.id)\n }\n className={cx(styles.matchRow(match === activeMatch))}\n >\n <div\n className={cx(\n styles.matchIndicator(getStatusColor(match)),\n )}\n />\n\n <code\n className={styles.matchID}\n >{`${match.routeId === rootRouteId ? rootRouteId : match.pathname}`}</code>\n <AgeTicker match={match} router={router} />\n </div>\n )\n })}\n </div>\n )}\n </div>\n </div>\n {routerState.cachedMatches.length ? (\n <div className={styles.cachedMatchesContainer}>\n <div className={styles.detailsHeader}>\n <div>Cached Matches</div>\n <div className={styles.detailsHeaderInfo}>\n age / staleTime / gcTime\n </div>\n </div>\n <div>\n {routerState.cachedMatches.map((match) => {\n return (\n <div\n key={match.id}\n role=\"button\"\n aria-label={`Open match details for ${match.id}`}\n onClick={() =>\n setActiveId(activeId === match.id ? '' : match.id)\n }\n className={cx(styles.matchRow(match === activeMatch))}\n >\n <div\n className={cx(\n styles.matchIndicator(getStatusColor(match)),\n )}\n />\n\n <code className={styles.matchID}>{`${match.id}`}</code>\n\n <AgeTicker match={match} router={router} />\n </div>\n )\n })}\n </div>\n </div>\n ) : null}\n </div>\n {activeMatch ? (\n <div className={styles.thirdContainer}>\n <div className={styles.detailsHeader}>Match Details</div>\n <div>\n <div className={styles.matchDetails}>\n <div\n className={styles.matchStatus(\n activeMatch.status,\n activeMatch.isFetching,\n )}\n >\n <div>\n {activeMatch.status === 'success' && activeMatch.isFetching\n ? 'fetching'\n : activeMatch.status}\n </div>\n </div>\n <div className={styles.matchDetailsInfoLabel}>\n <div>ID:</div>\n <div className={styles.matchDetailsInfo}>\n <code>{activeMatch.id}</code>\n </div>\n </div>\n <div className={styles.matchDetailsInfoLabel}>\n <div>State:</div>\n <div className={styles.matchDetailsInfo}>\n {routerState.pendingMatches?.find(\n (d) => d.id === activeMatch.id,\n )\n ? 'Pending'\n : routerState.matches.find((d) => d.id === activeMatch.id)\n ? 'Active'\n : 'Cached'}\n </div>\n </div>\n <div className={styles.matchDetailsInfoLabel}>\n <div>Last Updated:</div>\n <div className={styles.matchDetailsInfo}>\n {activeMatch.updatedAt\n ? new Date(activeMatch.updatedAt).toLocaleTimeString()\n : 'N/A'}\n </div>\n </div>\n </div>\n </div>\n {activeMatch.loaderData ? (\n <>\n <div className={styles.detailsHeader}>Loader Data</div>\n <div className={styles.detailsContent}>\n <Explorer\n label=\"loaderData\"\n value={activeMatch.loaderData}\n defaultExpanded={{}}\n />\n </div>\n </>\n ) : null}\n <div className={styles.detailsHeader}>Explorer</div>\n <div className={styles.detailsContent}>\n <Explorer label=\"Match\" value={activeMatch} defaultExpanded={{}} />\n </div>\n </div>\n ) : null}\n {hasSearch ? (\n <div className={styles.fourthContainer}>\n <div className={styles.detailsHeader}>Search Params</div>\n <div className={styles.detailsContent}>\n <Explorer\n value={routerState.location.search}\n defaultExpanded={Object.keys(routerState.location.search).reduce(\n (obj: any, next) => {\n obj[next] = {}\n return obj\n },\n {},\n )}\n />\n </div>\n </div>\n ) : null}\n </div>\n )\n})\n"],"names":["cx","React","BaseTanStackRouterDevtoolsPanel"],"mappings":"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"}
|
package/dist/esm/Explorer.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
type ExpanderProps = {
|
|
3
|
-
expanded: boolean;
|
|
4
|
-
style?: React.CSSProperties;
|
|
5
|
-
};
|
|
6
|
-
export declare const Expander: ({ expanded, style }: ExpanderProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
type Entry = {
|
|
8
|
-
label: string;
|
|
9
|
-
};
|
|
10
|
-
type RendererProps = {
|
|
11
|
-
handleEntry: HandleEntryFn;
|
|
12
|
-
label?: React.ReactNode;
|
|
13
|
-
value: unknown;
|
|
14
|
-
subEntries: Array<Entry>;
|
|
15
|
-
subEntryPages: Array<Array<Entry>>;
|
|
16
|
-
type: string;
|
|
17
|
-
expanded: boolean;
|
|
18
|
-
toggleExpanded: () => void;
|
|
19
|
-
pageSize: number;
|
|
20
|
-
renderer?: Renderer;
|
|
21
|
-
filterSubEntries?: (subEntries: Array<Property>) => Array<Property>;
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Chunk elements in the array by size
|
|
25
|
-
*
|
|
26
|
-
* when the array cannot be chunked evenly by size, the last chunk will be
|
|
27
|
-
* filled with the remaining elements
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]
|
|
31
|
-
*/
|
|
32
|
-
export declare function chunkArray<T>(array: Array<T>, size: number): Array<Array<T>>;
|
|
33
|
-
type Renderer = (props: RendererProps) => React.JSX.Element;
|
|
34
|
-
export declare const DefaultRenderer: Renderer;
|
|
35
|
-
type HandleEntryFn = (entry: Entry) => React.ReactNode;
|
|
36
|
-
type ExplorerProps = Partial<RendererProps> & {
|
|
37
|
-
renderer?: Renderer;
|
|
38
|
-
defaultExpanded?: true | Record<string, boolean>;
|
|
39
|
-
};
|
|
40
|
-
type Property = {
|
|
41
|
-
defaultExpanded?: boolean | Record<string, boolean>;
|
|
42
|
-
label: string;
|
|
43
|
-
value: unknown;
|
|
44
|
-
};
|
|
45
|
-
export default function Explorer({ value, defaultExpanded, renderer, pageSize, filterSubEntries, ...rest }: ExplorerProps): React.JSX.Element;
|
|
46
|
-
export {};
|
package/dist/esm/Explorer.js
DELETED
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import * as React from "react";
|
|
3
|
-
import { clsx } from "clsx";
|
|
4
|
-
import * as goober from "goober";
|
|
5
|
-
import { tokens } from "./tokens.js";
|
|
6
|
-
import { displayValue } from "./utils.js";
|
|
7
|
-
import { ShadowDomTargetContext } from "./context.js";
|
|
8
|
-
const Expander = ({ expanded, style = {} }) => {
|
|
9
|
-
const styles = useStyles();
|
|
10
|
-
return /* @__PURE__ */ jsx("span", { className: styles.expander, children: /* @__PURE__ */ jsx(
|
|
11
|
-
"svg",
|
|
12
|
-
{
|
|
13
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
14
|
-
width: "12",
|
|
15
|
-
height: "12",
|
|
16
|
-
fill: "none",
|
|
17
|
-
viewBox: "0 0 24 24",
|
|
18
|
-
className: clsx(styles.expanderIcon(expanded)),
|
|
19
|
-
children: /* @__PURE__ */ jsx(
|
|
20
|
-
"path",
|
|
21
|
-
{
|
|
22
|
-
stroke: "currentColor",
|
|
23
|
-
strokeLinecap: "round",
|
|
24
|
-
strokeLinejoin: "round",
|
|
25
|
-
strokeWidth: "2",
|
|
26
|
-
d: "M9 18l6-6-6-6"
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
) });
|
|
31
|
-
};
|
|
32
|
-
function chunkArray(array, size) {
|
|
33
|
-
if (size < 1) return [];
|
|
34
|
-
let i = 0;
|
|
35
|
-
const result = [];
|
|
36
|
-
while (i < array.length) {
|
|
37
|
-
result.push(array.slice(i, i + size));
|
|
38
|
-
i = i + size;
|
|
39
|
-
}
|
|
40
|
-
return result;
|
|
41
|
-
}
|
|
42
|
-
const DefaultRenderer = ({
|
|
43
|
-
handleEntry,
|
|
44
|
-
label,
|
|
45
|
-
value,
|
|
46
|
-
subEntries = [],
|
|
47
|
-
subEntryPages = [],
|
|
48
|
-
type,
|
|
49
|
-
expanded = false,
|
|
50
|
-
toggleExpanded,
|
|
51
|
-
pageSize,
|
|
52
|
-
renderer
|
|
53
|
-
}) => {
|
|
54
|
-
const [expandedPages, setExpandedPages] = React.useState([]);
|
|
55
|
-
const [valueSnapshot, setValueSnapshot] = React.useState(void 0);
|
|
56
|
-
const styles = useStyles();
|
|
57
|
-
const refreshValueSnapshot = () => {
|
|
58
|
-
setValueSnapshot(value());
|
|
59
|
-
};
|
|
60
|
-
return /* @__PURE__ */ jsx("div", { className: styles.entry, children: subEntryPages.length ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
61
|
-
/* @__PURE__ */ jsxs(
|
|
62
|
-
"button",
|
|
63
|
-
{
|
|
64
|
-
className: styles.expandButton,
|
|
65
|
-
onClick: () => toggleExpanded(),
|
|
66
|
-
children: [
|
|
67
|
-
/* @__PURE__ */ jsx(Expander, { expanded }),
|
|
68
|
-
label,
|
|
69
|
-
/* @__PURE__ */ jsxs("span", { className: styles.info, children: [
|
|
70
|
-
String(type).toLowerCase() === "iterable" ? "(Iterable) " : "",
|
|
71
|
-
subEntries.length,
|
|
72
|
-
" ",
|
|
73
|
-
subEntries.length > 1 ? `items` : `item`
|
|
74
|
-
] })
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
),
|
|
78
|
-
expanded ? subEntryPages.length === 1 ? /* @__PURE__ */ jsx("div", { className: styles.subEntries, children: subEntries.map((entry, index) => handleEntry(entry)) }) : /* @__PURE__ */ jsx("div", { className: styles.subEntries, children: subEntryPages.map((entries, index) => {
|
|
79
|
-
return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: styles.entry, children: [
|
|
80
|
-
/* @__PURE__ */ jsxs(
|
|
81
|
-
"button",
|
|
82
|
-
{
|
|
83
|
-
className: clsx(styles.labelButton, "labelButton"),
|
|
84
|
-
onClick: () => setExpandedPages(
|
|
85
|
-
(old) => old.includes(index) ? old.filter((d) => d !== index) : [...old, index]
|
|
86
|
-
),
|
|
87
|
-
children: [
|
|
88
|
-
/* @__PURE__ */ jsx(Expander, { expanded: expandedPages.includes(index) }),
|
|
89
|
-
" ",
|
|
90
|
-
"[",
|
|
91
|
-
index * pageSize,
|
|
92
|
-
" ...",
|
|
93
|
-
" ",
|
|
94
|
-
index * pageSize + pageSize - 1,
|
|
95
|
-
"]"
|
|
96
|
-
]
|
|
97
|
-
}
|
|
98
|
-
),
|
|
99
|
-
expandedPages.includes(index) ? /* @__PURE__ */ jsx("div", { className: styles.subEntries, children: entries.map((entry) => handleEntry(entry)) }) : null
|
|
100
|
-
] }) }, index);
|
|
101
|
-
}) }) : null
|
|
102
|
-
] }) : type === "function" ? /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
103
|
-
Explorer,
|
|
104
|
-
{
|
|
105
|
-
renderer,
|
|
106
|
-
label: /* @__PURE__ */ jsxs(
|
|
107
|
-
"button",
|
|
108
|
-
{
|
|
109
|
-
onClick: refreshValueSnapshot,
|
|
110
|
-
className: styles.refreshValueBtn,
|
|
111
|
-
children: [
|
|
112
|
-
/* @__PURE__ */ jsx("span", { children: label }),
|
|
113
|
-
" 🔄",
|
|
114
|
-
" "
|
|
115
|
-
]
|
|
116
|
-
}
|
|
117
|
-
),
|
|
118
|
-
value: valueSnapshot,
|
|
119
|
-
defaultExpanded: {}
|
|
120
|
-
}
|
|
121
|
-
) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
122
|
-
/* @__PURE__ */ jsxs("span", { children: [
|
|
123
|
-
label,
|
|
124
|
-
":"
|
|
125
|
-
] }),
|
|
126
|
-
" ",
|
|
127
|
-
/* @__PURE__ */ jsx("span", { className: styles.value, children: displayValue(value) })
|
|
128
|
-
] }) });
|
|
129
|
-
};
|
|
130
|
-
function isIterable(x) {
|
|
131
|
-
return Symbol.iterator in x;
|
|
132
|
-
}
|
|
133
|
-
function Explorer({
|
|
134
|
-
value,
|
|
135
|
-
defaultExpanded,
|
|
136
|
-
renderer = DefaultRenderer,
|
|
137
|
-
pageSize = 100,
|
|
138
|
-
filterSubEntries,
|
|
139
|
-
...rest
|
|
140
|
-
}) {
|
|
141
|
-
const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded));
|
|
142
|
-
const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), []);
|
|
143
|
-
let type = typeof value;
|
|
144
|
-
let subEntries = [];
|
|
145
|
-
const makeProperty = (sub) => {
|
|
146
|
-
const subDefaultExpanded = defaultExpanded === true ? { [sub.label]: true } : defaultExpanded == null ? void 0 : defaultExpanded[sub.label];
|
|
147
|
-
return {
|
|
148
|
-
...sub,
|
|
149
|
-
defaultExpanded: subDefaultExpanded
|
|
150
|
-
};
|
|
151
|
-
};
|
|
152
|
-
if (Array.isArray(value)) {
|
|
153
|
-
type = "array";
|
|
154
|
-
subEntries = value.map(
|
|
155
|
-
(d, i) => makeProperty({
|
|
156
|
-
label: i.toString(),
|
|
157
|
-
value: d
|
|
158
|
-
})
|
|
159
|
-
);
|
|
160
|
-
} else if (value !== null && typeof value === "object" && isIterable(value) && typeof value[Symbol.iterator] === "function") {
|
|
161
|
-
type = "Iterable";
|
|
162
|
-
subEntries = Array.from(
|
|
163
|
-
value,
|
|
164
|
-
(val, i) => makeProperty({
|
|
165
|
-
label: i.toString(),
|
|
166
|
-
value: val
|
|
167
|
-
})
|
|
168
|
-
);
|
|
169
|
-
} else if (typeof value === "object" && value !== null) {
|
|
170
|
-
type = "object";
|
|
171
|
-
subEntries = Object.entries(value).map(
|
|
172
|
-
([key, val]) => makeProperty({
|
|
173
|
-
label: key,
|
|
174
|
-
value: val
|
|
175
|
-
})
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
subEntries = filterSubEntries ? filterSubEntries(subEntries) : subEntries;
|
|
179
|
-
const subEntryPages = chunkArray(subEntries, pageSize);
|
|
180
|
-
return renderer({
|
|
181
|
-
handleEntry: (entry) => /* @__PURE__ */ jsx(
|
|
182
|
-
Explorer,
|
|
183
|
-
{
|
|
184
|
-
value,
|
|
185
|
-
renderer,
|
|
186
|
-
filterSubEntries,
|
|
187
|
-
...rest,
|
|
188
|
-
...entry
|
|
189
|
-
},
|
|
190
|
-
entry.label
|
|
191
|
-
),
|
|
192
|
-
type,
|
|
193
|
-
subEntries,
|
|
194
|
-
subEntryPages,
|
|
195
|
-
value,
|
|
196
|
-
expanded,
|
|
197
|
-
toggleExpanded,
|
|
198
|
-
pageSize,
|
|
199
|
-
...rest
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
const stylesFactory = (shadowDOMTarget) => {
|
|
203
|
-
const { colors, font, size } = tokens;
|
|
204
|
-
const { fontFamily, lineHeight, size: fontSize } = font;
|
|
205
|
-
const css = shadowDOMTarget ? goober.css.bind({ target: shadowDOMTarget }) : goober.css;
|
|
206
|
-
return {
|
|
207
|
-
entry: css`
|
|
208
|
-
font-family: ${fontFamily.mono};
|
|
209
|
-
font-size: ${fontSize.xs};
|
|
210
|
-
line-height: ${lineHeight.sm};
|
|
211
|
-
outline: none;
|
|
212
|
-
word-break: break-word;
|
|
213
|
-
`,
|
|
214
|
-
labelButton: css`
|
|
215
|
-
cursor: pointer;
|
|
216
|
-
color: inherit;
|
|
217
|
-
font: inherit;
|
|
218
|
-
outline: inherit;
|
|
219
|
-
background: transparent;
|
|
220
|
-
border: none;
|
|
221
|
-
padding: 0;
|
|
222
|
-
`,
|
|
223
|
-
expander: css`
|
|
224
|
-
display: inline-flex;
|
|
225
|
-
align-items: center;
|
|
226
|
-
justify-content: center;
|
|
227
|
-
width: ${size[3]};
|
|
228
|
-
height: ${size[3]};
|
|
229
|
-
padding-left: 3px;
|
|
230
|
-
box-sizing: content-box;
|
|
231
|
-
`,
|
|
232
|
-
expanderIcon: (expanded) => {
|
|
233
|
-
if (expanded) {
|
|
234
|
-
return css`
|
|
235
|
-
transform: rotate(90deg);
|
|
236
|
-
transition: transform 0.1s ease;
|
|
237
|
-
`;
|
|
238
|
-
}
|
|
239
|
-
return css`
|
|
240
|
-
transform: rotate(0deg);
|
|
241
|
-
transition: transform 0.1s ease;
|
|
242
|
-
`;
|
|
243
|
-
},
|
|
244
|
-
expandButton: css`
|
|
245
|
-
display: flex;
|
|
246
|
-
gap: ${size[1]};
|
|
247
|
-
align-items: center;
|
|
248
|
-
cursor: pointer;
|
|
249
|
-
color: inherit;
|
|
250
|
-
font: inherit;
|
|
251
|
-
outline: inherit;
|
|
252
|
-
background: transparent;
|
|
253
|
-
border: none;
|
|
254
|
-
padding: 0;
|
|
255
|
-
`,
|
|
256
|
-
value: css`
|
|
257
|
-
color: ${colors.purple[400]};
|
|
258
|
-
`,
|
|
259
|
-
subEntries: css`
|
|
260
|
-
margin-left: ${size[2]};
|
|
261
|
-
padding-left: ${size[2]};
|
|
262
|
-
border-left: 2px solid ${colors.darkGray[400]};
|
|
263
|
-
`,
|
|
264
|
-
info: css`
|
|
265
|
-
color: ${colors.gray[500]};
|
|
266
|
-
font-size: ${fontSize["2xs"]};
|
|
267
|
-
padding-left: ${size[1]};
|
|
268
|
-
`,
|
|
269
|
-
refreshValueBtn: css`
|
|
270
|
-
appearance: none;
|
|
271
|
-
border: 0;
|
|
272
|
-
cursor: pointer;
|
|
273
|
-
background: transparent;
|
|
274
|
-
color: inherit;
|
|
275
|
-
padding: 0;
|
|
276
|
-
font-family: ${fontFamily.mono};
|
|
277
|
-
font-size: ${fontSize.xs};
|
|
278
|
-
`
|
|
279
|
-
};
|
|
280
|
-
};
|
|
281
|
-
function useStyles() {
|
|
282
|
-
const shadowDomTarget = React.useContext(ShadowDomTargetContext);
|
|
283
|
-
const [_styles] = React.useState(() => stylesFactory(shadowDomTarget));
|
|
284
|
-
return _styles;
|
|
285
|
-
}
|
|
286
|
-
export {
|
|
287
|
-
DefaultRenderer,
|
|
288
|
-
Expander,
|
|
289
|
-
chunkArray,
|
|
290
|
-
Explorer as default
|
|
291
|
-
};
|
|
292
|
-
//# sourceMappingURL=Explorer.js.map
|
package/dist/esm/Explorer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Explorer.js","sources":["../../src/Explorer.tsx"],"sourcesContent":["import * as React from 'react'\nimport { clsx as cx } from 'clsx'\nimport * as goober from 'goober'\nimport { tokens } from './tokens'\nimport { displayValue } from './utils'\nimport { ShadowDomTargetContext } from './context'\n\ntype ExpanderProps = {\n expanded: boolean\n style?: React.CSSProperties\n}\n\nexport const Expander = ({ expanded, style = {} }: ExpanderProps) => {\n const styles = useStyles()\n return (\n <span className={styles.expander}>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n className={cx(styles.expanderIcon(expanded))}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M9 18l6-6-6-6\"\n ></path>\n </svg>\n </span>\n )\n}\n\ntype Entry = {\n label: string\n}\n\ntype RendererProps = {\n handleEntry: HandleEntryFn\n label?: React.ReactNode\n value: unknown\n subEntries: Array<Entry>\n subEntryPages: Array<Array<Entry>>\n type: string\n expanded: boolean\n toggleExpanded: () => void\n pageSize: number\n renderer?: Renderer\n filterSubEntries?: (subEntries: Array<Property>) => Array<Property>\n}\n\n/**\n * Chunk elements in the array by size\n *\n * when the array cannot be chunked evenly by size, the last chunk will be\n * filled with the remaining elements\n *\n * @example\n * chunkArray(['a','b', 'c', 'd', 'e'], 2) // returns [['a','b'], ['c', 'd'], ['e']]\n */\nexport function chunkArray<T>(array: Array<T>, size: number): Array<Array<T>> {\n if (size < 1) return []\n let i = 0\n const result: Array<Array<T>> = []\n while (i < array.length) {\n result.push(array.slice(i, i + size))\n i = i + size\n }\n return result\n}\n\ntype Renderer = (props: RendererProps) => React.JSX.Element\n\nexport const DefaultRenderer: Renderer = ({\n handleEntry,\n label,\n value,\n subEntries = [],\n subEntryPages = [],\n type,\n expanded = false,\n toggleExpanded,\n pageSize,\n renderer,\n}) => {\n const [expandedPages, setExpandedPages] = React.useState<Array<number>>([])\n const [valueSnapshot, setValueSnapshot] = React.useState(undefined)\n const styles = useStyles()\n\n const refreshValueSnapshot = () => {\n setValueSnapshot((value as () => any)())\n }\n\n return (\n <div className={styles.entry}>\n {subEntryPages.length ? (\n <>\n <button\n className={styles.expandButton}\n onClick={() => toggleExpanded()}\n >\n <Expander expanded={expanded} />\n {label}\n <span className={styles.info}>\n {String(type).toLowerCase() === 'iterable' ? '(Iterable) ' : ''}\n {subEntries.length} {subEntries.length > 1 ? `items` : `item`}\n </span>\n </button>\n {expanded ? (\n subEntryPages.length === 1 ? (\n <div className={styles.subEntries}>\n {subEntries.map((entry, index) => handleEntry(entry))}\n </div>\n ) : (\n <div className={styles.subEntries}>\n {subEntryPages.map((entries, index) => {\n return (\n <div key={index}>\n <div className={styles.entry}>\n <button\n className={cx(styles.labelButton, 'labelButton')}\n onClick={() =>\n setExpandedPages((old) =>\n old.includes(index)\n ? old.filter((d) => d !== index)\n : [...old, index],\n )\n }\n >\n <Expander expanded={expandedPages.includes(index)} />{' '}\n [{index * pageSize} ...{' '}\n {index * pageSize + pageSize - 1}]\n </button>\n {expandedPages.includes(index) ? (\n <div className={styles.subEntries}>\n {entries.map((entry) => handleEntry(entry))}\n </div>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n )\n ) : null}\n </>\n ) : type === 'function' ? (\n <>\n <Explorer\n renderer={renderer}\n label={\n <button\n onClick={refreshValueSnapshot}\n className={styles.refreshValueBtn}\n >\n <span>{label}</span> 🔄{' '}\n </button>\n }\n value={valueSnapshot}\n defaultExpanded={{}}\n />\n </>\n ) : (\n <>\n <span>{label}:</span>{' '}\n <span className={styles.value}>{displayValue(value)}</span>\n </>\n )}\n </div>\n )\n}\n\ntype HandleEntryFn = (entry: Entry) => React.ReactNode\n\ntype ExplorerProps = Partial<RendererProps> & {\n renderer?: Renderer\n defaultExpanded?: true | Record<string, boolean>\n}\n\ntype Property = {\n defaultExpanded?: boolean | Record<string, boolean>\n label: string\n value: unknown\n}\n\nfunction isIterable(x: any): x is Iterable<unknown> {\n return Symbol.iterator in x\n}\n\nexport default function Explorer({\n value,\n defaultExpanded,\n renderer = DefaultRenderer,\n pageSize = 100,\n filterSubEntries,\n ...rest\n}: ExplorerProps) {\n const [expanded, setExpanded] = React.useState(Boolean(defaultExpanded))\n const toggleExpanded = React.useCallback(() => setExpanded((old) => !old), [])\n\n let type: string = typeof value\n let subEntries: Array<Property> = []\n\n const makeProperty = (sub: { label: string; value: unknown }): Property => {\n const subDefaultExpanded =\n defaultExpanded === true\n ? { [sub.label]: true }\n : defaultExpanded?.[sub.label]\n return {\n ...sub,\n defaultExpanded: subDefaultExpanded,\n }\n }\n\n if (Array.isArray(value)) {\n type = 'array'\n subEntries = value.map((d, i) =>\n makeProperty({\n label: i.toString(),\n value: d,\n }),\n )\n } else if (\n value !== null &&\n typeof value === 'object' &&\n isIterable(value) &&\n typeof value[Symbol.iterator] === 'function'\n ) {\n type = 'Iterable'\n subEntries = Array.from(value, (val, i) =>\n makeProperty({\n label: i.toString(),\n value: val,\n }),\n )\n } else if (typeof value === 'object' && value !== null) {\n type = 'object'\n subEntries = Object.entries(value).map(([key, val]) =>\n makeProperty({\n label: key,\n value: val,\n }),\n )\n }\n\n subEntries = filterSubEntries ? filterSubEntries(subEntries) : subEntries\n\n const subEntryPages = chunkArray(subEntries, pageSize)\n\n return renderer({\n handleEntry: (entry) => (\n <Explorer\n key={entry.label}\n value={value}\n renderer={renderer}\n filterSubEntries={filterSubEntries}\n {...rest}\n {...entry}\n />\n ),\n type,\n subEntries,\n subEntryPages,\n value,\n expanded,\n toggleExpanded,\n pageSize,\n ...rest,\n })\n}\n\nconst stylesFactory = (shadowDOMTarget?: ShadowRoot) => {\n const { colors, font, size, alpha, shadow, border } = tokens\n const { fontFamily, lineHeight, size: fontSize } = font\n const css = shadowDOMTarget\n ? goober.css.bind({ target: shadowDOMTarget })\n : goober.css\n\n return {\n entry: css`\n font-family: ${fontFamily.mono};\n font-size: ${fontSize.xs};\n line-height: ${lineHeight.sm};\n outline: none;\n word-break: break-word;\n `,\n labelButton: css`\n cursor: pointer;\n color: inherit;\n font: inherit;\n outline: inherit;\n background: transparent;\n border: none;\n padding: 0;\n `,\n expander: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${size[3]};\n height: ${size[3]};\n padding-left: 3px;\n box-sizing: content-box;\n `,\n expanderIcon: (expanded: boolean) => {\n if (expanded) {\n return css`\n transform: rotate(90deg);\n transition: transform 0.1s ease;\n `\n }\n return css`\n transform: rotate(0deg);\n transition: transform 0.1s ease;\n `\n },\n expandButton: css`\n display: flex;\n gap: ${size[1]};\n align-items: center;\n cursor: pointer;\n color: inherit;\n font: inherit;\n outline: inherit;\n background: transparent;\n border: none;\n padding: 0;\n `,\n value: css`\n color: ${colors.purple[400]};\n `,\n subEntries: css`\n margin-left: ${size[2]};\n padding-left: ${size[2]};\n border-left: 2px solid ${colors.darkGray[400]};\n `,\n info: css`\n color: ${colors.gray[500]};\n font-size: ${fontSize['2xs']};\n padding-left: ${size[1]};\n `,\n refreshValueBtn: css`\n appearance: none;\n border: 0;\n cursor: pointer;\n background: transparent;\n color: inherit;\n padding: 0;\n font-family: ${fontFamily.mono};\n font-size: ${fontSize.xs};\n `,\n }\n}\n\nfunction useStyles() {\n const shadowDomTarget = React.useContext(ShadowDomTargetContext)\n const [_styles] = React.useState(() => stylesFactory(shadowDomTarget))\n return _styles\n}\n"],"names":["cx"],"mappings":"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"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
import { AnyRouter } from '@tanstack/react-router';
|
|
3
|
-
interface DevtoolsOptions {
|
|
4
|
-
/**
|
|
5
|
-
* Set this true if you want the dev tools to default to being open
|
|
6
|
-
*/
|
|
7
|
-
initialIsOpen?: boolean;
|
|
8
|
-
/**
|
|
9
|
-
* Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc.
|
|
10
|
-
*/
|
|
11
|
-
panelProps?: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
|
|
12
|
-
/**
|
|
13
|
-
* Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.
|
|
14
|
-
*/
|
|
15
|
-
closeButtonProps?: React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
|
|
16
|
-
/**
|
|
17
|
-
* Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.
|
|
18
|
-
*/
|
|
19
|
-
toggleButtonProps?: React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
|
|
20
|
-
/**
|
|
21
|
-
* The position of the TanStack Router logo to open and close the devtools panel.
|
|
22
|
-
* Defaults to 'bottom-left'.
|
|
23
|
-
*/
|
|
24
|
-
position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
25
|
-
/**
|
|
26
|
-
* Use this to render the devtools inside a different type of container element for a11y purposes.
|
|
27
|
-
* Any string which corresponds to a valid intrinsic JSX element is allowed.
|
|
28
|
-
* Defaults to 'footer'.
|
|
29
|
-
*/
|
|
30
|
-
containerElement?: string | any;
|
|
31
|
-
/**
|
|
32
|
-
* A boolean variable indicating if the "lite" version of the library is being used
|
|
33
|
-
*/
|
|
34
|
-
router?: AnyRouter;
|
|
35
|
-
/**
|
|
36
|
-
* Use this to attach the devtool's styles to specific element in the DOM.
|
|
37
|
-
*/
|
|
38
|
-
shadowDOMTarget?: ShadowRoot;
|
|
39
|
-
}
|
|
40
|
-
export declare function TanStackRouterDevtools(props: DevtoolsOptions): React.ReactElement | null;
|
|
41
|
-
export {};
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { clsx } from "clsx";
|
|
3
|
-
import React__default from "react";
|
|
4
|
-
import { ShadowDomTargetContext, DevtoolsOnCloseContext } from "./context.js";
|
|
5
|
-
import { useSafeState, useIsMounted } from "./utils.js";
|
|
6
|
-
import { BaseTanStackRouterDevtoolsPanel } from "./BaseTanStackRouterDevtoolsPanel.js";
|
|
7
|
-
import useLocalStorage from "./useLocalStorage.js";
|
|
8
|
-
import { TanStackLogo } from "./logo.js";
|
|
9
|
-
import { useStyles } from "./useStyles.js";
|
|
10
|
-
function TanStackRouterDevtools(props) {
|
|
11
|
-
const { shadowDOMTarget } = props;
|
|
12
|
-
return /* @__PURE__ */ jsx(ShadowDomTargetContext.Provider, { value: shadowDOMTarget, children: /* @__PURE__ */ jsx(FloatingTanStackRouterDevtools, { ...props }) });
|
|
13
|
-
}
|
|
14
|
-
function FloatingTanStackRouterDevtools({
|
|
15
|
-
initialIsOpen,
|
|
16
|
-
panelProps = {},
|
|
17
|
-
closeButtonProps = {},
|
|
18
|
-
toggleButtonProps = {},
|
|
19
|
-
position = "bottom-left",
|
|
20
|
-
containerElement: Container = "footer",
|
|
21
|
-
router,
|
|
22
|
-
shadowDOMTarget
|
|
23
|
-
}) {
|
|
24
|
-
const [rootEl, setRootEl] = React__default.useState();
|
|
25
|
-
const panelRef = React__default.useRef(null);
|
|
26
|
-
const [isOpen, setIsOpen] = useLocalStorage(
|
|
27
|
-
"tanstackRouterDevtoolsOpen",
|
|
28
|
-
initialIsOpen
|
|
29
|
-
);
|
|
30
|
-
const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage(
|
|
31
|
-
"tanstackRouterDevtoolsHeight",
|
|
32
|
-
null
|
|
33
|
-
);
|
|
34
|
-
const [isResolvedOpen, setIsResolvedOpen] = useSafeState(false);
|
|
35
|
-
const [isResizing, setIsResizing] = useSafeState(false);
|
|
36
|
-
const isMounted = useIsMounted();
|
|
37
|
-
const styles = useStyles();
|
|
38
|
-
const handleDragStart = (panelElement, startEvent) => {
|
|
39
|
-
if (startEvent.button !== 0) return;
|
|
40
|
-
setIsResizing(true);
|
|
41
|
-
const dragInfo = {
|
|
42
|
-
originalHeight: (panelElement == null ? void 0 : panelElement.getBoundingClientRect().height) ?? 0,
|
|
43
|
-
pageY: startEvent.pageY
|
|
44
|
-
};
|
|
45
|
-
const run = (moveEvent) => {
|
|
46
|
-
const delta = dragInfo.pageY - moveEvent.pageY;
|
|
47
|
-
const newHeight = dragInfo.originalHeight + delta;
|
|
48
|
-
setDevtoolsHeight(newHeight);
|
|
49
|
-
if (newHeight < 70) {
|
|
50
|
-
setIsOpen(false);
|
|
51
|
-
} else {
|
|
52
|
-
setIsOpen(true);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const unsub = () => {
|
|
56
|
-
setIsResizing(false);
|
|
57
|
-
document.removeEventListener("mousemove", run);
|
|
58
|
-
document.removeEventListener("mouseUp", unsub);
|
|
59
|
-
};
|
|
60
|
-
document.addEventListener("mousemove", run);
|
|
61
|
-
document.addEventListener("mouseup", unsub);
|
|
62
|
-
};
|
|
63
|
-
const isButtonClosed = isOpen ?? false;
|
|
64
|
-
React__default.useEffect(() => {
|
|
65
|
-
setIsResolvedOpen(isOpen ?? false);
|
|
66
|
-
}, [isOpen, isResolvedOpen, setIsResolvedOpen]);
|
|
67
|
-
React__default.useEffect(() => {
|
|
68
|
-
var _a;
|
|
69
|
-
if (isResolvedOpen) {
|
|
70
|
-
const previousValue = (_a = rootEl == null ? void 0 : rootEl.parentElement) == null ? void 0 : _a.style.paddingBottom;
|
|
71
|
-
const run = () => {
|
|
72
|
-
var _a2;
|
|
73
|
-
const containerHeight = (_a2 = panelRef.current) == null ? void 0 : _a2.getBoundingClientRect().height;
|
|
74
|
-
if (rootEl == null ? void 0 : rootEl.parentElement) {
|
|
75
|
-
rootEl.parentElement.style.paddingBottom = `${containerHeight}px`;
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
run();
|
|
79
|
-
if (typeof window !== "undefined") {
|
|
80
|
-
window.addEventListener("resize", run);
|
|
81
|
-
return () => {
|
|
82
|
-
window.removeEventListener("resize", run);
|
|
83
|
-
if ((rootEl == null ? void 0 : rootEl.parentElement) && typeof previousValue === "string") {
|
|
84
|
-
rootEl.parentElement.style.paddingBottom = previousValue;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return;
|
|
90
|
-
}, [isResolvedOpen, rootEl == null ? void 0 : rootEl.parentElement]);
|
|
91
|
-
React__default.useEffect(() => {
|
|
92
|
-
if (rootEl) {
|
|
93
|
-
const el = rootEl;
|
|
94
|
-
const fontSize = getComputedStyle(el).fontSize;
|
|
95
|
-
el.style.setProperty("--tsrd-font-size", fontSize);
|
|
96
|
-
}
|
|
97
|
-
}, [rootEl]);
|
|
98
|
-
const { style: panelStyle = {}, ...otherPanelProps } = panelProps;
|
|
99
|
-
const {
|
|
100
|
-
style: closeButtonStyle = {},
|
|
101
|
-
onClick: onCloseClick,
|
|
102
|
-
...otherCloseButtonProps
|
|
103
|
-
} = closeButtonProps;
|
|
104
|
-
const {
|
|
105
|
-
onClick: onToggleClick,
|
|
106
|
-
className: toggleButtonClassName,
|
|
107
|
-
...otherToggleButtonProps
|
|
108
|
-
} = toggleButtonProps;
|
|
109
|
-
if (!isMounted) return null;
|
|
110
|
-
const resolvedHeight = devtoolsHeight ?? 500;
|
|
111
|
-
return /* @__PURE__ */ jsxs(Container, { ref: setRootEl, className: "TanStackRouterDevtools", children: [
|
|
112
|
-
/* @__PURE__ */ jsx(
|
|
113
|
-
DevtoolsOnCloseContext.Provider,
|
|
114
|
-
{
|
|
115
|
-
value: {
|
|
116
|
-
onCloseClick: onCloseClick ?? (() => {
|
|
117
|
-
})
|
|
118
|
-
},
|
|
119
|
-
children: /* @__PURE__ */ jsx(
|
|
120
|
-
BaseTanStackRouterDevtoolsPanel,
|
|
121
|
-
{
|
|
122
|
-
ref: panelRef,
|
|
123
|
-
...otherPanelProps,
|
|
124
|
-
router,
|
|
125
|
-
className: clsx(
|
|
126
|
-
styles.devtoolsPanelContainer,
|
|
127
|
-
styles.devtoolsPanelContainerVisibility(!!isOpen),
|
|
128
|
-
styles.devtoolsPanelContainerResizing(isResizing),
|
|
129
|
-
styles.devtoolsPanelContainerAnimation(
|
|
130
|
-
isResolvedOpen,
|
|
131
|
-
resolvedHeight + 16
|
|
132
|
-
)
|
|
133
|
-
),
|
|
134
|
-
style: {
|
|
135
|
-
height: resolvedHeight,
|
|
136
|
-
...panelStyle
|
|
137
|
-
},
|
|
138
|
-
isOpen: isResolvedOpen,
|
|
139
|
-
setIsOpen,
|
|
140
|
-
handleDragStart: (e) => handleDragStart(panelRef.current, e),
|
|
141
|
-
shadowDOMTarget
|
|
142
|
-
}
|
|
143
|
-
)
|
|
144
|
-
}
|
|
145
|
-
),
|
|
146
|
-
/* @__PURE__ */ jsxs(
|
|
147
|
-
"button",
|
|
148
|
-
{
|
|
149
|
-
type: "button",
|
|
150
|
-
...otherToggleButtonProps,
|
|
151
|
-
"aria-label": "Open TanStack Router Devtools",
|
|
152
|
-
onClick: (e) => {
|
|
153
|
-
setIsOpen(true);
|
|
154
|
-
onToggleClick && onToggleClick(e);
|
|
155
|
-
},
|
|
156
|
-
className: clsx(
|
|
157
|
-
styles.mainCloseBtn,
|
|
158
|
-
styles.mainCloseBtnPosition(position),
|
|
159
|
-
styles.mainCloseBtnAnimation(!isButtonClosed),
|
|
160
|
-
toggleButtonClassName
|
|
161
|
-
),
|
|
162
|
-
children: [
|
|
163
|
-
/* @__PURE__ */ jsxs("div", { className: styles.mainCloseBtnIconContainer, children: [
|
|
164
|
-
/* @__PURE__ */ jsx("div", { className: styles.mainCloseBtnIconOuter, children: /* @__PURE__ */ jsx(TanStackLogo, {}) }),
|
|
165
|
-
/* @__PURE__ */ jsx("div", { className: styles.mainCloseBtnIconInner, children: /* @__PURE__ */ jsx(TanStackLogo, {}) })
|
|
166
|
-
] }),
|
|
167
|
-
/* @__PURE__ */ jsx("div", { className: styles.mainCloseBtnDivider, children: "-" }),
|
|
168
|
-
/* @__PURE__ */ jsx("div", { className: styles.routerLogoCloseButton, children: "TanStack Router" })
|
|
169
|
-
]
|
|
170
|
-
}
|
|
171
|
-
)
|
|
172
|
-
] });
|
|
173
|
-
}
|
|
174
|
-
export {
|
|
175
|
-
TanStackRouterDevtools
|
|
176
|
-
};
|
|
177
|
-
//# sourceMappingURL=TanStackRouterDevtools.js.map
|