diff --git a/.changeset/silent-beds-create.md b/.changeset/silent-beds-create.md
new file mode 100644
index 00000000..b583e2b7
--- /dev/null
+++ b/.changeset/silent-beds-create.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/devtools-ui': patch
+---
+
+Improvements to the json tree component, now supports expansion length config
diff --git a/.changeset/tricky-cloths-joke.md b/.changeset/tricky-cloths-joke.md
new file mode 100644
index 00000000..0ec6cdd8
--- /dev/null
+++ b/.changeset/tricky-cloths-joke.md
@@ -0,0 +1,6 @@
+---
+'@tanstack/devtools': patch
+'@tanstack/devtools-vite': patch
+---
+
+improve open-source by using location origin
diff --git a/packages/devtools-ui/src/components/tree.tsx b/packages/devtools-ui/src/components/tree.tsx
index b8a4e0d6..546d8842 100644
--- a/packages/devtools-ui/src/components/tree.tsx
+++ b/packages/devtools-ui/src/components/tree.tsx
@@ -3,97 +3,19 @@ import clsx from 'clsx'
import { css, useStyles } from '../styles/use-styles'
import { CopiedCopier, Copier, ErrorCopier } from './icons'
-export function JsonTree(props: { value: any; copyable?: boolean }) {
- return
-}
-type CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'
-
-const CopyButton = (props: { value: unknown }) => {
- const styles = useStyles()
- const [copyState, setCopyState] = createSignal('NoCopy')
-
- return (
-
- )
-}
-
-const Expander = (props: { expanded: boolean }) => {
- const styles = useStyles()
+export function JsonTree(props: {
+ value: any
+ copyable?: boolean
+ defaultExpansionDepth?: number
+}) {
return (
-
-
-
+
)
}
@@ -103,8 +25,18 @@ function JsonValue(props: {
isRoot?: boolean
isLastKey?: boolean
copyable?: boolean
+ defaultExpansionDepth: number
+ depth: number
}) {
- const { value, keyName, isRoot = false, isLastKey, copyable } = props
+ const {
+ value,
+ keyName,
+ isRoot = false,
+ isLastKey,
+ copyable,
+ defaultExpansionDepth,
+ depth,
+ } = props
const styles = useStyles()
return (
@@ -137,12 +69,24 @@ function JsonValue(props: {
}
if (Array.isArray(value)) {
return (
-
+
)
}
if (typeof value === 'object') {
return (
-
+
)
}
return
@@ -161,16 +105,36 @@ const ArrayValue = ({
value,
keyName,
copyable,
+ defaultExpansionDepth,
+ depth,
}: {
value: Array
copyable?: boolean
keyName?: string
+ defaultExpansionDepth: number
+ depth: number
}) => {
const styles = useStyles()
- const [expanded, setExpanded] = createSignal(true)
+ const [expanded, setExpanded] = createSignal(depth <= defaultExpansionDepth)
+
+ if (value.length === 0) {
+ return (
+
+ {keyName && (
+
+ "{keyName}":{' '}
+
+ )}
+ []
+
+ )
+ }
return (
-
+ setExpanded(!expanded())}
+ expanded={expanded()}
+ />
{keyName && (
{
@@ -195,6 +159,8 @@ const ArrayValue = ({
copyable={copyable}
value={item}
isLastKey={isLastKey}
+ defaultExpansionDepth={defaultExpansionDepth}
+ depth={depth + 1}
/>
)
}}
@@ -222,19 +188,40 @@ const ObjectValue = ({
value,
keyName,
copyable,
+ defaultExpansionDepth,
+ depth,
}: {
value: Record
keyName?: string
copyable?: boolean
+ defaultExpansionDepth: number
+ depth: number
}) => {
const styles = useStyles()
- const [expanded, setExpanded] = createSignal(true)
+ const [expanded, setExpanded] = createSignal(depth <= defaultExpansionDepth)
const keys = Object.keys(value)
const lastKeyName = keys[keys.length - 1]
+ if (keys.length === 0) {
+ return (
+
+ {keyName && (
+
+ "{keyName}":{' '}
+
+ )}
+ {'{}'}
+
+ )
+ }
return (
- {keyName && }
+ {keyName && (
+ setExpanded(!expanded())}
+ expanded={expanded()}
+ />
+ )}
{keyName && (
{
@@ -259,6 +246,8 @@ const ObjectValue = ({
keyName={k}
isLastKey={lastKeyName === k}
copyable={copyable}
+ defaultExpansionDepth={defaultExpansionDepth}
+ depth={depth + 1}
/>
>
)}
@@ -281,3 +270,95 @@ const ObjectValue = ({
)
}
+
+type CopyState = 'NoCopy' | 'SuccessCopy' | 'ErrorCopy'
+
+const CopyButton = (props: { value: unknown }) => {
+ const styles = useStyles()
+ const [copyState, setCopyState] = createSignal('NoCopy')
+
+ return (
+
+ )
+}
+
+const Expander = (props: { expanded: boolean; onClick: () => void }) => {
+ const styles = useStyles()
+ return (
+
+
+
+ )
+}
diff --git a/packages/devtools-ui/src/styles/use-styles.ts b/packages/devtools-ui/src/styles/use-styles.ts
index 9155a379..ef309351 100644
--- a/packages/devtools-ui/src/styles/use-styles.ts
+++ b/packages/devtools-ui/src/styles/use-styles.ts
@@ -393,6 +393,7 @@ const stylesFactory = (theme: Theme = 'dark') => {
`,
expander: css`
position: absolute;
+ cursor: pointer;
left: -16px;
top: 3px;
& path {