@gfazioli/mantine-json-tree 0.10.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/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +18 -0
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/cjs/JsonTree.cjs +120 -0
- package/dist/cjs/JsonTree.cjs.map +1 -0
- package/dist/cjs/JsonTree.module.css.cjs +7 -0
- package/dist/cjs/JsonTree.module.css.cjs.map +1 -0
- package/dist/cjs/index.cjs +9 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/lib/render.cjs +143 -0
- package/dist/cjs/lib/render.cjs.map +1 -0
- package/dist/cjs/lib/utils.cjs +72 -0
- package/dist/cjs/lib/utils.cjs.map +1 -0
- package/dist/esm/JsonTree.mjs +117 -0
- package/dist/esm/JsonTree.mjs.map +1 -0
- package/dist/esm/JsonTree.module.css.mjs +5 -0
- package/dist/esm/JsonTree.module.css.mjs.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/lib/render.mjs +141 -0
- package/dist/esm/lib/render.mjs.map +1 -0
- package/dist/esm/lib/utils.mjs +66 -0
- package/dist/esm/lib/utils.mjs.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/styles.layer.css +1 -0
- package/dist/types/JsonTree.d.ts +51 -0
- package/dist/types/index.d.mts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/render.d.ts +7 -0
- package/dist/types/lib/utils.d.ts +35 -0
- package/package.json +44 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../src/lib/utils.tsx"],"sourcesContent":["import { type TreeNodeData } from '@mantine/core';\n\nexport interface JSONTreeNodeData extends TreeNodeData {\n nodeData?: {\n type: ValueType;\n value: any;\n key?: string;\n path: string;\n itemCount?: number;\n depth?: number;\n };\n}\n\n/**\n * Type of a JSON value for rendering purposes.\n */\nexport type ValueType = 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null' | 'undefined';\n\n/**\n * Get the type of a value for display purposes.\n */\nexport function getValueType(value: any): ValueType {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (Array.isArray(value)) {\n return 'array';\n }\n return typeof value as ValueType;\n}\n\n/**\n * Check if a value is expandable (object or array with content).\n */\nexport function isExpandable(value: any): boolean {\n const type = getValueType(value);\n if (type === 'object') {\n return Object.keys(value).length > 0;\n }\n if (type === 'array') {\n return value.length > 0;\n }\n return false;\n}\n\n/**\n * Format a primitive value for display.\n */\nexport function formatValue(value: any, type: ValueType): string {\n if (type === 'string') {\n return `\"${value}\"`;\n }\n if (type === 'null') {\n return 'null';\n }\n if (type === 'undefined') {\n return 'undefined';\n }\n return String(value);\n}\n\n/**\n * Get the count of items in an object or array.\n */\nexport function getItemCount(value: any): number {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (typeof value === 'object' && value !== null) {\n return Object.keys(value).length;\n return 0;\n }\n}\n\n/**\n * Convert JSON data to Mantine Tree format.\n */\nexport function convertToTreeData(\n value: any,\n key?: string,\n path: string = 'root',\n depth: number = 0\n): JSONTreeNodeData {\n const type = getValueType(value);\n const expandable = isExpandable(value);\n const nodeValue = path;\n\n if (!expandable) {\n return {\n value: nodeValue,\n label: key || 'root',\n nodeData: { type, value, key, path, depth },\n };\n }\n\n const entries: [string, any][] =\n type === 'array'\n ? value.map((item: any, index: number) => [String(index), item] as [string, any])\n : Object.entries(value);\n\n const children = entries.map(([k, v]) => convertToTreeData(v, k, `${path}.${k}`, depth + 1));\n\n return {\n value: nodeValue,\n label: key || 'root',\n children,\n nodeData: { type, value, key, path, itemCount: getItemCount(value), depth },\n };\n}\n"],"names":[],"mappings":"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"}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.me_e3fe2989{font-family:var(--json-tree-font-family);font-size:var(--json-tree-font-size)}.me_93bdc4d8{color:var(--json-tree-color-key);font-size:inherit;font-weight:500}.me_9bf8fdaa{background-color:transparent;border-radius:var(--mantine-radius-sm);font-family:var(--json-tree-font-family);font-size:inherit;padding:2px 6px}.me_9bf8fdaa[data-type=string]{color:var(--json-tree-color-string)}.me_9bf8fdaa[data-type=number]{color:var(--json-tree-color-number)}.me_9bf8fdaa[data-type=boolean]{color:var(--json-tree-color-boolean)}.me_9bf8fdaa[data-type=null],.me_9bf8fdaa[data-type=undefined]{color:var(--json-tree-color-null);font-style:italic}.me_cb75fd74{background-color:var(--json-tree-header-background-color,inherit);padding:var(--mantine-spacing-xs)}.me_cb75fd74[data-sticky=true]{position:sticky;top:var(--json-tree-header-sticky-offset,0);z-index:3}.me_7c12eea1{color:var(--json-tree-color-bracket);font-family:var(--json-tree-font-family);font-size:inherit;font-weight:700;user-select:none}.me_338ae66e{opacity:0;transition:opacity .15s ease}.me_338ae66e:focus,.me_e3fe2989:hover .me_338ae66e{opacity:1}.me_c97b8329{bottom:0;opacity:.4;pointer-events:none;position:absolute;top:0;width:1px}.me_c97b8329[data-color-index="0"]{background-color:var(--json-tree-indent-guide-color-0)}.me_c97b8329[data-color-index="1"]{background-color:var(--json-tree-indent-guide-color-1)}.me_c97b8329[data-color-index="2"]{background-color:var(--json-tree-indent-guide-color-2)}.me_c97b8329[data-color-index="3"]{background-color:var(--json-tree-indent-guide-color-3)}.me_c97b8329[data-color-index="4"]{background-color:var(--json-tree-indent-guide-color-4)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer mantine-json-tree {.me_e3fe2989{font-family:var(--json-tree-font-family);font-size:var(--json-tree-font-size)}.me_93bdc4d8{color:var(--json-tree-color-key);font-size:inherit;font-weight:500}.me_9bf8fdaa{background-color:transparent;border-radius:var(--mantine-radius-sm);font-family:var(--json-tree-font-family);font-size:inherit;padding:2px 6px}.me_9bf8fdaa[data-type=string]{color:var(--json-tree-color-string)}.me_9bf8fdaa[data-type=number]{color:var(--json-tree-color-number)}.me_9bf8fdaa[data-type=boolean]{color:var(--json-tree-color-boolean)}.me_9bf8fdaa[data-type=null],.me_9bf8fdaa[data-type=undefined]{color:var(--json-tree-color-null);font-style:italic}.me_cb75fd74{background-color:var(--json-tree-header-background-color,inherit);padding:var(--mantine-spacing-xs)}.me_cb75fd74[data-sticky=true]{position:sticky;top:var(--json-tree-header-sticky-offset,0);z-index:3}.me_7c12eea1{color:var(--json-tree-color-bracket);font-family:var(--json-tree-font-family);font-size:inherit;font-weight:700;user-select:none}.me_338ae66e{opacity:0;transition:opacity .15s ease}.me_338ae66e:focus,.me_e3fe2989:hover .me_338ae66e{opacity:1}.me_c97b8329{bottom:0;opacity:.4;pointer-events:none;position:absolute;top:0;width:1px}.me_c97b8329[data-color-index="0"]{background-color:var(--json-tree-indent-guide-color-0)}.me_c97b8329[data-color-index="1"]{background-color:var(--json-tree-indent-guide-color-1)}.me_c97b8329[data-color-index="2"]{background-color:var(--json-tree-indent-guide-color-2)}.me_c97b8329[data-color-index="3"]{background-color:var(--json-tree-indent-guide-color-3)}.me_c97b8329[data-color-index="4"]{background-color:var(--json-tree-indent-guide-color-4)}}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Factory, MantineSize, StylesApiProps, type BoxProps } from '@mantine/core';
|
|
3
|
+
export type JsonTreeDirection = 'clockwise' | 'counter-clockwise';
|
|
4
|
+
export type JsonTreeStylesNames = 'root' | 'header';
|
|
5
|
+
export type JsonTreeCssVariables = {
|
|
6
|
+
root: '--json-tree-font-family' | '--json-tree-color-string' | '--json-tree-color-number' | '--json-tree-color-boolean' | '--json-tree-color-null' | '--json-tree-color-key' | '--json-tree-font-size' | '--json-tree-color-bracket' | '--json-tree-indent-guide-color-0' | '--json-tree-indent-guide-color-1' | '--json-tree-indent-guide-color-2' | '--json-tree-indent-guide-color-3' | '--json-tree-indent-guide-color-4';
|
|
7
|
+
header: '--json-tree-header-background-color' | '--json-tree-header-sticky-offset';
|
|
8
|
+
};
|
|
9
|
+
export interface JsonTreeBaseProps {
|
|
10
|
+
/** The data to display (object, array, or any JSON-serializable value) */
|
|
11
|
+
data: unknown;
|
|
12
|
+
/** Whether nodes should be expanded by default @default false */
|
|
13
|
+
defaultExpanded?: boolean;
|
|
14
|
+
/** Maximum depth to auto-expand (0 = collapsed, -1 = expand all) @default 2 */
|
|
15
|
+
maxDepth?: number;
|
|
16
|
+
/** Callback when a node is clicked */
|
|
17
|
+
onNodeClick?: (path: string, value: any) => void;
|
|
18
|
+
/** Callback when a value is copied to clipboard */
|
|
19
|
+
onCopy?: (copy: string, value: unknown) => void;
|
|
20
|
+
/** Whether to show the root expand/collapse all button @default false */
|
|
21
|
+
withExpandAll?: boolean;
|
|
22
|
+
/** Size of the font @default 'xs' */
|
|
23
|
+
size?: MantineSize | (string & {}) | number;
|
|
24
|
+
/** Title displayed above the JSON tree */
|
|
25
|
+
title?: React.ReactNode;
|
|
26
|
+
/** Whether to show item counts for objects and arrays @default false */
|
|
27
|
+
showItemsCount?: boolean;
|
|
28
|
+
/** Whether to show a copy to clipboard button for each node @default false */
|
|
29
|
+
withCopyToClipboard?: boolean;
|
|
30
|
+
/** Whether to show indent guides (vertical lines) for nested nodes @default false */
|
|
31
|
+
showIndentGuides?: boolean;
|
|
32
|
+
/** If set, the header is sticky @default `false` */
|
|
33
|
+
stickyHeader?: boolean;
|
|
34
|
+
/** Offset for the sticky header (e.g. to account for a fixed navbar) @default 0*/
|
|
35
|
+
stickyHeaderOffset?: number | string;
|
|
36
|
+
}
|
|
37
|
+
export interface JsonTreeProps extends BoxProps, JsonTreeBaseProps, StylesApiProps<JsonTreeFactory> {
|
|
38
|
+
}
|
|
39
|
+
export type JsonTreeFactory = Factory<{
|
|
40
|
+
props: JsonTreeProps;
|
|
41
|
+
ref: HTMLDivElement;
|
|
42
|
+
stylesNames: JsonTreeStylesNames;
|
|
43
|
+
vars: JsonTreeCssVariables;
|
|
44
|
+
}>;
|
|
45
|
+
export declare const defaultProps: Partial<JsonTreeProps>;
|
|
46
|
+
export declare const JsonTree: import("@mantine/core").MantineComponent<{
|
|
47
|
+
props: JsonTreeProps;
|
|
48
|
+
ref: HTMLDivElement;
|
|
49
|
+
stylesNames: JsonTreeStylesNames;
|
|
50
|
+
vars: JsonTreeCssVariables;
|
|
51
|
+
}>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type MantineTheme, type RenderTreeNodePayload } from '@mantine/core';
|
|
3
|
+
import type { JsonTreeProps } from '../JsonTree';
|
|
4
|
+
/**
|
|
5
|
+
* Custom render function for Tree nodes with JSON formatting.
|
|
6
|
+
*/
|
|
7
|
+
export declare function renderJSONNode({ node, expanded, hasChildren, elementProps, tree }: RenderTreeNodePayload, _: MantineTheme, props: JsonTreeProps, onNodeClick?: (path: string, value: any) => void): React.JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type TreeNodeData } from '@mantine/core';
|
|
2
|
+
export interface JSONTreeNodeData extends TreeNodeData {
|
|
3
|
+
nodeData?: {
|
|
4
|
+
type: ValueType;
|
|
5
|
+
value: any;
|
|
6
|
+
key?: string;
|
|
7
|
+
path: string;
|
|
8
|
+
itemCount?: number;
|
|
9
|
+
depth?: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type of a JSON value for rendering purposes.
|
|
14
|
+
*/
|
|
15
|
+
export type ValueType = 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null' | 'undefined';
|
|
16
|
+
/**
|
|
17
|
+
* Get the type of a value for display purposes.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getValueType(value: any): ValueType;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a value is expandable (object or array with content).
|
|
22
|
+
*/
|
|
23
|
+
export declare function isExpandable(value: any): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Format a primitive value for display.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatValue(value: any, type: ValueType): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get the count of items in an object or array.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getItemCount(value: any): number;
|
|
32
|
+
/**
|
|
33
|
+
* Convert JSON data to Mantine Tree format.
|
|
34
|
+
*/
|
|
35
|
+
export declare function convertToTreeData(value: any, key?: string, path?: string, depth?: number): JSONTreeNodeData;
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gfazioli/mantine-json-tree",
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "A Mantine extension component that renders interactive JSON trees with syntax highlighting, collapsible nodes, copy-to-clipboard, and configurable expansion depth.",
|
|
5
|
+
"homepage": "https://gfazioli.github.io/mantine-json-tree/",
|
|
6
|
+
"packageManager": "yarn@4.0.1",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"author": "Giovambattista Fazioli <giovambattista.fazioli@gmail.com>",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"extension",
|
|
11
|
+
"json-tree",
|
|
12
|
+
"json-view",
|
|
13
|
+
"mantine",
|
|
14
|
+
"react",
|
|
15
|
+
"react-component",
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
"main": "./dist/cjs/index.cjs",
|
|
19
|
+
"module": "./dist/esm/index.mjs",
|
|
20
|
+
"types": "./dist/types/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"import": {
|
|
24
|
+
"types": "./dist/types/index.d.mts",
|
|
25
|
+
"default": "./dist/esm/index.mjs"
|
|
26
|
+
},
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./dist/types/index.d.ts",
|
|
29
|
+
"default": "./dist/cjs/index.cjs"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"./styles.css": "./dist/styles.css",
|
|
33
|
+
"./styles.layer.css": "./dist/styles.layer.css"
|
|
34
|
+
},
|
|
35
|
+
"repository": "https://github.com/gfazioli/mantine-json-tree.git",
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"@mantine/core": ">=7.0.0",
|
|
38
|
+
"@mantine/hooks": ">=7.0.0",
|
|
39
|
+
"@tabler/icons-react": "^3.34.0",
|
|
40
|
+
"react": "^18.x || ^19.x",
|
|
41
|
+
"react-dom": "^18.x || ^19.x"
|
|
42
|
+
},
|
|
43
|
+
"bugs": "https://github.com/gfazioli/mantine-json-tree/issues"
|
|
44
|
+
}
|