@djangocfg/ui-tools 2.1.246 → 2.1.248
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/JsonTree-F27RMYSI.cjs +11 -0
- package/dist/{JsonTree-63J76I75.mjs.map → JsonTree-F27RMYSI.cjs.map} +1 -1
- package/dist/JsonTree-QTJYSHCV.mjs +5 -0
- package/dist/{JsonTree-BJVX7XUH.cjs.map → JsonTree-QTJYSHCV.mjs.map} +1 -1
- package/dist/{Mermaid.client-Z25LMNPA.cjs → Mermaid.client-RSWUUHIL.cjs} +6 -6
- package/dist/{Mermaid.client-Z25LMNPA.cjs.map → Mermaid.client-RSWUUHIL.cjs.map} +1 -1
- package/dist/{Mermaid.client-5EKULAUZ.mjs → Mermaid.client-XFQ74OYN.mjs} +3 -3
- package/dist/{Mermaid.client-5EKULAUZ.mjs.map → Mermaid.client-XFQ74OYN.mjs.map} +1 -1
- package/dist/{PlaygroundLayout-KE2ME6WH.cjs → PlaygroundLayout-FKXSULJ3.cjs} +21 -21
- package/dist/{PlaygroundLayout-KE2ME6WH.cjs.map → PlaygroundLayout-FKXSULJ3.cjs.map} +1 -1
- package/dist/{PlaygroundLayout-4TCSESTD.mjs → PlaygroundLayout-XMMHPZYP.mjs} +5 -5
- package/dist/{PlaygroundLayout-4TCSESTD.mjs.map → PlaygroundLayout-XMMHPZYP.mjs.map} +1 -1
- package/dist/{PrettyCode.client-K45ON7DD.mjs → PrettyCode.client-OO3KAJSM.mjs} +3 -3
- package/dist/{PrettyCode.client-K45ON7DD.mjs.map → PrettyCode.client-OO3KAJSM.mjs.map} +1 -1
- package/dist/{PrettyCode.client-EMBU27DJ.cjs → PrettyCode.client-V2ZN5DTH.cjs} +5 -5
- package/dist/{PrettyCode.client-EMBU27DJ.cjs.map → PrettyCode.client-V2ZN5DTH.cjs.map} +1 -1
- package/dist/{chunk-G2A6SX5L.cjs → chunk-2SMCH62O.cjs} +34 -82
- package/dist/chunk-2SMCH62O.cjs.map +1 -0
- package/dist/{chunk-TNTCWAVZ.cjs → chunk-33AMWFBZ.cjs} +7 -7
- package/dist/{chunk-TNTCWAVZ.cjs.map → chunk-33AMWFBZ.cjs.map} +1 -1
- package/dist/{chunk-N7EDSU3Z.cjs → chunk-CRHHUOVJ.cjs} +3 -3
- package/dist/{chunk-N7EDSU3Z.cjs.map → chunk-CRHHUOVJ.cjs.map} +1 -1
- package/dist/{chunk-C5PVPPR7.mjs → chunk-LFWQ36LJ.mjs} +3 -3
- package/dist/{chunk-C5PVPPR7.mjs.map → chunk-LFWQ36LJ.mjs.map} +1 -1
- package/dist/{chunk-MBFBVGUP.mjs → chunk-SSUOENAZ.mjs} +35 -83
- package/dist/chunk-SSUOENAZ.mjs.map +1 -0
- package/dist/{chunk-TSDCMPCW.mjs → chunk-SZ2CZEQZ.mjs} +3 -3
- package/dist/{chunk-TSDCMPCW.mjs.map → chunk-SZ2CZEQZ.mjs.map} +1 -1
- package/dist/index.cjs +14 -14
- package/dist/index.mjs +10 -10
- package/package.json +6 -6
- package/src/components/FloatingToolbar/index.tsx +36 -56
- package/dist/JsonTree-63J76I75.mjs +0 -5
- package/dist/JsonTree-BJVX7XUH.cjs +0 -11
- package/dist/chunk-G2A6SX5L.cjs.map +0 -1
- package/dist/chunk-MBFBVGUP.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2SMCH62O_cjs = require('./chunk-2SMCH62O.cjs');
|
|
4
4
|
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
5
5
|
var prismReactRenderer = require('prism-react-renderer');
|
|
6
6
|
var react = require('react');
|
|
@@ -124,12 +124,12 @@ var PrettyCode = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ data, language, cla
|
|
|
124
124
|
const borderClass = isDarkMode ? "border-zinc-700" : "border-border";
|
|
125
125
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: `relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ""}`, children: [
|
|
126
126
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
127
|
-
|
|
127
|
+
chunk2SMCH62O_cjs.FloatingToolbar,
|
|
128
128
|
{
|
|
129
129
|
containerRef,
|
|
130
130
|
scrollIsolation,
|
|
131
131
|
label: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm", children: displayLanguage }),
|
|
132
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
132
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.CopyAction, { value: contentJson, title: labels.copyCode })
|
|
133
133
|
}
|
|
134
134
|
),
|
|
135
135
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(prismReactRenderer.Highlight, { theme: prismTheme, code: contentJson, language: normalizedLanguage, children: ({ className: className2, style, tokens, getLineProps, getTokenProps }) => {
|
|
@@ -158,5 +158,5 @@ var PrettyCode = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ data, language, cla
|
|
|
158
158
|
var PrettyCode_client_default = PrettyCode;
|
|
159
159
|
|
|
160
160
|
module.exports = PrettyCode_client_default;
|
|
161
|
-
//# sourceMappingURL=PrettyCode.client-
|
|
162
|
-
//# sourceMappingURL=PrettyCode.client-
|
|
161
|
+
//# sourceMappingURL=PrettyCode.client-V2ZN5DTH.cjs.map
|
|
162
|
+
//# sourceMappingURL=PrettyCode.client-V2ZN5DTH.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["__name","useRef","useAppT","useResolvedTheme","useMemo","themes","jsx","Highlight","className","jsxs","FloatingToolbar","CopyAction"],"mappings":"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","file":"PrettyCode.client-EMBU27DJ.cjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo, useRef } from 'react';\n\nimport { useAppT } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction } from '../../components/FloatingToolbar/actions';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n scrollIsolation?: boolean; // Block scroll capture until user clicks (default: true)\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false, scrollIsolation }: PrettyCodeProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const t = useAppT();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div ref={containerRef} className={`relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n <FloatingToolbar\n containerRef={containerRef}\n scrollIsolation={scrollIsolation}\n label={\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n }\n >\n <CopyAction value={contentJson} title={labels.copyCode} />\n </FloatingToolbar>\n\n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
|
|
1
|
+
{"version":3,"sources":["../src/tools/PrettyCode/PrettyCode.client.tsx"],"names":["__name","useRef","useAppT","useResolvedTheme","useMemo","themes","jsx","Highlight","className","jsxs","FloatingToolbar","CopyAction"],"mappings":"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","file":"PrettyCode.client-V2ZN5DTH.cjs","sourcesContent":["'use client';\n\nimport { Highlight, Language, themes } from 'prism-react-renderer';\nimport React, { useMemo, useRef } from 'react';\n\nimport { useAppT } from '@djangocfg/i18n';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction } from '../../components/FloatingToolbar/actions';\n\ninterface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string; // Custom background class\n isCompact?: boolean; // Compact mode for smaller font sizes\n scrollIsolation?: boolean; // Block scroll capture until user clicks (default: true)\n}\n\nconst PrettyCode = ({ data, language, className, mode, inline = false, customBg, isCompact = false, scrollIsolation }: PrettyCodeProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const t = useAppT();\n const detectedTheme = useResolvedTheme();\n\n const labels = useMemo(() => ({\n copyCode: t('tools.code.copyCode'),\n noContent: t('tools.code.noContent'),\n }), [t]);\n\n // Font size based on compact mode\n const fontSize = isCompact ? '0.75rem' : '0.875rem'; // 12px vs 14px\n\n // Use provided mode or fall back to detected theme\n const currentTheme = mode || detectedTheme;\n const isDarkMode = currentTheme === 'dark';\n\n // Select the Prism theme based on the current theme\n const prismTheme = isDarkMode ? themes.vsDark : themes.vsLight;\n\n // Convert form object to JSON string with proper formatting\n const contentJson = typeof data === 'string' ? data : JSON.stringify(data || {}, null, 2);\n \n // Handle empty content\n if (!contentJson || contentJson.trim() === '') {\n const emptyBgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const emptyBorderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n return (\n <div className={`relative h-full ${emptyBgClass} rounded-sm border ${emptyBorderClass} ${className || ''}`}>\n <div className=\"h-full overflow-auto p-4\">\n <p className=\"text-muted-foreground text-sm italic\">{labels.noContent}</p>\n </div>\n </div>\n );\n }\n\n // Get display name for language badge\n const getLanguageDisplayName = (lang: string): string => {\n switch (lang.toLowerCase()) {\n case 'bash':\n case 'shell':\n return 'Bash';\n case 'python':\n case 'py':\n return 'Python';\n case 'javascript':\n case 'js':\n return 'JavaScript';\n case 'typescript':\n case 'ts':\n return 'TypeScript';\n case 'json':\n return 'JSON';\n case 'yaml':\n case 'yml':\n return 'YAML';\n case 'html':\n return 'HTML';\n case 'css':\n return 'CSS';\n case 'sql':\n return 'SQL';\n case 'xml':\n return 'XML';\n case 'markdown':\n case 'md':\n return 'Markdown';\n case 'plaintext':\n case 'text':\n return 'Text';\n case 'mermaid':\n return 'Mermaid';\n default:\n return lang.charAt(0).toUpperCase() + lang.slice(1);\n }\n };\n\n // Normalize language for Prism - use only basic supported languages\n const normalizedLanguage = (() => {\n const lang = language.toLowerCase();\n \n // Try basic languages that are definitely supported\n switch (lang) {\n case 'javascript':\n case 'js':\n return 'javascript';\n case 'typescript':\n case 'ts':\n return 'typescript'; // Try TypeScript first\n case 'python':\n case 'py':\n return 'python';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n case 'html':\n return 'markup';\n case 'xml':\n return 'markup';\n case 'bash':\n case 'shell':\n return 'bash';\n case 'sql':\n return 'sql';\n case 'yaml':\n case 'yml':\n return 'yaml';\n case 'markdown':\n case 'md':\n return 'markdown';\n case 'mermaid':\n return 'text'; // Mermaid is handled separately in MarkdownMessage\n default:\n // For unknown languages, try to use the original name first\n // If it doesn't work, Prism will fallback to plain text\n return lang || 'text';\n }\n })();\n\n const displayLanguage = getLanguageDisplayName(language);\n\n if (inline) {\n const inlineBgClass = customBg || (isDarkMode ? 'bg-zinc-800' : 'bg-zinc-100');\n return (\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getTokenProps }) => (\n <code\n className={`${className} ${inlineBgClass} px-2 py-1 rounded ${isCompact ? 'text-xs' : 'text-sm'} font-mono inline-block`}\n style={{\n ...style,\n fontSize,\n fontFamily: 'monospace',\n }}\n >\n {tokens.map((line) => (\n line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))\n ))}\n </code>\n )}\n </Highlight>\n );\n }\n\n // Different backgrounds for dark/light - light mode uses white for better contrast with vsLight theme\n const bgClass = customBg || (isDarkMode ? 'bg-zinc-900' : 'bg-white');\n const borderClass = isDarkMode ? 'border-zinc-700' : 'border-border';\n\n return (\n <div ref={containerRef} className={`relative h-full ${bgClass} rounded-lg border ${borderClass} ${className || ''}`}>\n <FloatingToolbar\n containerRef={containerRef}\n scrollIsolation={scrollIsolation}\n label={\n <span className=\"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-muted/80 text-muted-foreground border border-border/50 backdrop-blur-sm\">\n {displayLanguage}\n </span>\n }\n >\n <CopyAction value={contentJson} title={labels.copyCode} />\n </FloatingToolbar>\n\n <div className=\"h-full overflow-auto\">\n <Highlight theme={prismTheme} code={contentJson} language={normalizedLanguage as Language}>\n {({ className, style, tokens, getLineProps, getTokenProps }) => {\n // Remove background from Prism theme - we use our own via CSS\n const { backgroundColor: _bg, ...restStyle } = style;\n return (\n <pre\n className={`${className} rounded-lg`}\n style={{\n ...restStyle,\n margin: 0,\n padding: '2.5rem 1rem 1rem 1rem',\n fontSize,\n lineHeight: isCompact ? 1.4 : 1.5,\n fontFamily: 'monospace',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n }}\n >\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}}\n </Highlight>\n </div>\n </div>\n );\n};\n\nexport default PrettyCode; "]}
|
|
@@ -6,47 +6,6 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
6
6
|
var components = require('@djangocfg/ui-core/components');
|
|
7
7
|
var lucideReact = require('lucide-react');
|
|
8
8
|
|
|
9
|
-
function useElementCorner(ref) {
|
|
10
|
-
const [corner, setCorner] = react.useState(null);
|
|
11
|
-
const updateRef = react.useRef(() => {
|
|
12
|
-
});
|
|
13
|
-
updateRef.current = () => {
|
|
14
|
-
if (!ref.current) return;
|
|
15
|
-
const rect = ref.current.getBoundingClientRect();
|
|
16
|
-
const viewportWidth = window.visualViewport?.width ?? document.documentElement.clientWidth;
|
|
17
|
-
setCorner({
|
|
18
|
-
top: rect.top,
|
|
19
|
-
right: viewportWidth - rect.right,
|
|
20
|
-
bottom: rect.bottom
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
react.useEffect(() => {
|
|
24
|
-
const handler = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => updateRef.current(), "handler");
|
|
25
|
-
handler();
|
|
26
|
-
const ro = new ResizeObserver(handler);
|
|
27
|
-
if (ref.current) ro.observe(ref.current);
|
|
28
|
-
window.addEventListener("scroll", handler, { capture: true, passive: true });
|
|
29
|
-
const vv = window.visualViewport;
|
|
30
|
-
if (vv) {
|
|
31
|
-
vv.addEventListener("resize", handler);
|
|
32
|
-
vv.addEventListener("scroll", handler);
|
|
33
|
-
} else {
|
|
34
|
-
window.addEventListener("resize", handler, { passive: true });
|
|
35
|
-
}
|
|
36
|
-
return () => {
|
|
37
|
-
ro.disconnect();
|
|
38
|
-
window.removeEventListener("scroll", handler, { capture: true });
|
|
39
|
-
if (vv) {
|
|
40
|
-
vv.removeEventListener("resize", handler);
|
|
41
|
-
vv.removeEventListener("scroll", handler);
|
|
42
|
-
} else {
|
|
43
|
-
window.removeEventListener("resize", handler);
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
}, [ref]);
|
|
47
|
-
return corner;
|
|
48
|
-
}
|
|
49
|
-
chunkWGEGR3DF_cjs.__name(useElementCorner, "useElementCorner");
|
|
50
9
|
var UNLOCKED_CLASS = "scroll-unlocked";
|
|
51
10
|
function useScrollIsolation(ref, enabled) {
|
|
52
11
|
const [locked, setLocked] = react.useState(true);
|
|
@@ -79,7 +38,6 @@ function useScrollIsolation(ref, enabled) {
|
|
|
79
38
|
return { locked, unlock };
|
|
80
39
|
}
|
|
81
40
|
chunkWGEGR3DF_cjs.__name(useScrollIsolation, "useScrollIsolation");
|
|
82
|
-
var MIN_HEIGHT = 40;
|
|
83
41
|
var FloatingToolbar = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
|
|
84
42
|
containerRef,
|
|
85
43
|
children,
|
|
@@ -89,7 +47,6 @@ var FloatingToolbar = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
|
|
|
89
47
|
zIndex = 30,
|
|
90
48
|
scrollIsolation = true
|
|
91
49
|
}) => {
|
|
92
|
-
const corner = useElementCorner(containerRef);
|
|
93
50
|
const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);
|
|
94
51
|
const [overlayHovered, setOverlayHovered] = react.useState(false);
|
|
95
52
|
const overlay = scrollIsolation && locked ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -109,47 +66,42 @@ var FloatingToolbar = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
|
|
|
109
66
|
justifyContent: "center",
|
|
110
67
|
transition: "background 150ms"
|
|
111
68
|
},
|
|
112
|
-
children: overlayHovered && /* @__PURE__ */ jsxRuntime.jsx(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
69
|
+
children: overlayHovered && /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
"span",
|
|
71
|
+
{
|
|
72
|
+
style: {
|
|
73
|
+
fontSize: "0.75rem",
|
|
74
|
+
padding: "0.25rem 0.625rem",
|
|
75
|
+
borderRadius: "9999px",
|
|
76
|
+
background: "rgba(0,0,0,0.55)",
|
|
77
|
+
color: "#fff",
|
|
78
|
+
pointerEvents: "none",
|
|
79
|
+
userSelect: "none"
|
|
80
|
+
},
|
|
81
|
+
children: "Click to scroll"
|
|
82
|
+
}
|
|
83
|
+
)
|
|
121
84
|
}
|
|
122
85
|
) : null;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
right: right + offset,
|
|
86
|
+
const positionStyle = position === "bottom-right" ? { bottom: offset, right: offset } : { top: offset, right: offset };
|
|
87
|
+
const toolbar = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
className: "flex items-center gap-1",
|
|
91
|
+
style: {
|
|
92
|
+
position: "absolute",
|
|
93
|
+
...positionStyle,
|
|
132
94
|
zIndex
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
if (style.bottom !== void 0 || style.top !== void 0) {
|
|
143
|
-
toolbar = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", style, children: [
|
|
144
|
-
label && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
145
|
-
label,
|
|
146
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-px h-4 bg-border/50 mx-0.5" })
|
|
147
|
-
] }),
|
|
148
|
-
children
|
|
149
|
-
] });
|
|
150
|
-
}
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
98
|
+
label,
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-px h-4 bg-border/50 mx-0.5" })
|
|
100
|
+
] }),
|
|
101
|
+
children
|
|
102
|
+
]
|
|
151
103
|
}
|
|
152
|
-
|
|
104
|
+
);
|
|
153
105
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
154
106
|
overlay,
|
|
155
107
|
toolbar
|
|
@@ -231,5 +183,5 @@ exports.DownloadAction = DownloadAction;
|
|
|
231
183
|
exports.ExpandAction = ExpandAction;
|
|
232
184
|
exports.FloatingToolbar = FloatingToolbar;
|
|
233
185
|
exports.FullscreenAction = FullscreenAction;
|
|
234
|
-
//# sourceMappingURL=chunk-
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
186
|
+
//# sourceMappingURL=chunk-2SMCH62O.cjs.map
|
|
187
|
+
//# sourceMappingURL=chunk-2SMCH62O.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FloatingToolbar/hooks/useScrollIsolation.ts","../src/components/FloatingToolbar/index.tsx","../src/components/FloatingToolbar/actions/CopyAction.tsx","../src/components/FloatingToolbar/actions/DownloadAction.tsx","../src/components/FloatingToolbar/actions/ExpandAction.tsx","../src/components/FloatingToolbar/actions/FullscreenAction.tsx"],"names":["useState","useCallback","useEffect","__name","jsx","jsxs","Fragment","CopyButton","BUTTON_CLASS","Button","Download","ChevronUp","ChevronDown","Minimize2","Maximize2"],"mappings":"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","file":"chunk-2SMCH62O.cjs","sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nconst UNLOCKED_CLASS = 'scroll-unlocked';\n\n/**\n * Scroll isolation — prevents the container from capturing wheel scroll\n * until the user explicitly clicks inside it (like Google Maps).\n *\n * Locked (overlay visible): wheel events on container scroll the PAGE.\n * Unlocked: normal scroll inside the container.\n *\n * Unlock: click anywhere inside the container.\n * Re-lock: click outside the container.\n *\n * When unlocked, adds `scroll-unlocked` class to the container element\n * so it can be styled (e.g. focus ring) via CSS.\n */\nexport function useScrollIsolation(\n ref: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n) {\n const [locked, setLocked] = useState(true);\n\n const unlock = useCallback(() => setLocked(false), []);\n\n // Re-lock when clicking outside the container\n useEffect(() => {\n if (!enabled) return;\n\n const handleDocClick = (e: MouseEvent) => {\n const el = ref.current;\n if (!el) return;\n if (!el.contains(e.target as Node)) {\n setLocked(true);\n }\n };\n\n document.addEventListener('click', handleDocClick, true);\n return () => document.removeEventListener('click', handleDocClick, true);\n }, [enabled, ref]);\n\n // Toggle class on container to allow CSS-driven focus ring\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n if (locked) {\n el.classList.remove(UNLOCKED_CLASS);\n } else {\n el.classList.add(UNLOCKED_CLASS);\n }\n return () => el.classList.remove(UNLOCKED_CLASS);\n }, [locked, enabled, ref]);\n\n // Reset to locked when feature toggled on\n useEffect(() => {\n if (enabled) setLocked(true);\n }, [enabled]);\n\n return { locked, unlock };\n}\n","'use client';\n\nimport React, { useState } from 'react';\n\nimport './FloatingToolbar.css';\nimport { useScrollIsolation } from './hooks/useScrollIsolation';\n\nexport interface FloatingToolbarProps {\n /** Ref to the container element the toolbar anchors to */\n containerRef: React.RefObject<HTMLElement | null>;\n /** Action buttons to render (right side) */\n children: React.ReactNode;\n /** Optional label shown left of the buttons (e.g. language badge) */\n label?: React.ReactNode;\n /** Where to anchor relative to the container (default: bottom-right) */\n position?: 'top-right' | 'bottom-right';\n /** Offset from the edge in px (default: 8) */\n offset?: number;\n /** z-index (default: 30) */\n zIndex?: number;\n /**\n * Block wheel scroll inside the container until user clicks into it.\n * Re-locks when mouse leaves. Like Google Maps scroll isolation.\n * @default true\n */\n scrollIsolation?: boolean;\n}\n\n/**\n * Toolbar is anchored with `position: absolute` inside the container (PrettyCode, etc.).\n * `position: fixed` + viewport coordinates breaks embedded layouts (e.g. chat composer overlap).\n */\nexport const FloatingToolbar: React.FC<FloatingToolbarProps> = ({\n containerRef,\n children,\n label,\n position = 'bottom-right',\n offset = 8,\n zIndex = 30,\n scrollIsolation = true,\n}) => {\n const { locked, unlock } = useScrollIsolation(containerRef, scrollIsolation);\n const [overlayHovered, setOverlayHovered] = useState(false);\n\n const overlay =\n scrollIsolation && locked ? (\n <div\n onClick={unlock}\n onMouseEnter={() => setOverlayHovered(true)}\n onMouseLeave={() => setOverlayHovered(false)}\n style={{\n position: 'absolute',\n inset: 0,\n zIndex: zIndex - 1,\n cursor: 'pointer',\n background: overlayHovered ? 'rgba(0,0,0,0.04)' : 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background 150ms',\n }}\n >\n {overlayHovered && (\n <span\n style={{\n fontSize: '0.75rem',\n padding: '0.25rem 0.625rem',\n borderRadius: '9999px',\n background: 'rgba(0,0,0,0.55)',\n color: '#fff',\n pointerEvents: 'none',\n userSelect: 'none',\n }}\n >\n Click to scroll\n </span>\n )}\n </div>\n ) : null;\n\n const positionStyle: React.CSSProperties =\n position === 'bottom-right'\n ? { bottom: offset, right: offset }\n : { top: offset, right: offset };\n\n const toolbar = (\n <div\n className=\"flex items-center gap-1\"\n style={{\n position: 'absolute',\n ...positionStyle,\n zIndex,\n }}\n >\n {label && (\n <>\n {label}\n <div className=\"w-px h-4 bg-border/50 mx-0.5\" />\n </>\n )}\n {children}\n </div>\n );\n\n return (\n <>\n {overlay}\n {toolbar}\n </>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\ninterface CopyActionProps {\n value: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const CopyAction: React.FC<CopyActionProps> = ({ value, title = 'Copy' }) => (\n <CopyButton\n value={value}\n variant=\"ghost\"\n size=\"icon\"\n className={BUTTON_CLASS}\n iconClassName=\"h-3 w-3\"\n title={title}\n />\n);\n","'use client';\n\nimport { Download } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface DownloadActionProps {\n value: string;\n filename?: string;\n mimeType?: string;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const DownloadAction: React.FC<DownloadActionProps> = ({\n value,\n filename = 'download.txt',\n mimeType = 'text/plain',\n title = 'Download',\n}) => {\n const handleDownload = () => {\n const blob = new Blob([value], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n return (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDownload}\n className={BUTTON_CLASS}\n title={title}\n >\n <Download className=\"h-3 w-3\" />\n </Button>\n );\n};\n","'use client';\n\nimport { ChevronDown, ChevronUp } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface ExpandActionProps {\n isExpanded: boolean;\n onToggle: () => void;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const ExpandAction: React.FC<ExpandActionProps> = ({ isExpanded, onToggle }) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={isExpanded ? 'Collapse All' : 'Expand All'}\n >\n {isExpanded ? <ChevronUp className=\"h-3 w-3\" /> : <ChevronDown className=\"h-3 w-3\" />}\n </Button>\n);\n","'use client';\n\nimport { Maximize2, Minimize2 } from 'lucide-react';\nimport React from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\n\ninterface FullscreenActionProps {\n isFullscreen?: boolean;\n onToggle: () => void;\n title?: string;\n}\n\nconst BUTTON_CLASS = 'h-6 w-6 rounded-sm bg-muted/80 hover:bg-muted border border-border/50 backdrop-blur-sm';\n\nexport const FullscreenAction: React.FC<FullscreenActionProps> = ({\n isFullscreen = false,\n onToggle,\n title,\n}) => (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onToggle}\n className={BUTTON_CLASS}\n title={title ?? (isFullscreen ? 'Exit fullscreen' : 'Fullscreen')}\n >\n {isFullscreen ? <Minimize2 className=\"h-3 w-3\" /> : <Maximize2 className=\"h-3 w-3\" />}\n </Button>\n);\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk2SMCH62O_cjs = require('./chunk-2SMCH62O.cjs');
|
|
4
4
|
var chunkWGEGR3DF_cjs = require('./chunk-WGEGR3DF.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var reactJsonTree = require('react-json-tree');
|
|
@@ -181,11 +181,11 @@ var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
|
|
|
181
181
|
const contentPadding = mode === "full" ? "p-4" : mode === "compact" ? "p-2" : "p-1";
|
|
182
182
|
const showControls = (showExpandControls || showActionButtons) && mode === "full";
|
|
183
183
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: containerClasses, children: [
|
|
184
|
-
showControls && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
185
|
-
showExpandControls && /* @__PURE__ */ jsxRuntime.jsx(
|
|
184
|
+
showControls && /* @__PURE__ */ jsxRuntime.jsxs(chunk2SMCH62O_cjs.FloatingToolbar, { containerRef, children: [
|
|
185
|
+
showExpandControls && /* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.ExpandAction, { isExpanded, onToggle: toggle }),
|
|
186
186
|
showActionButtons && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
187
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.CopyAction, { value: jsonString, title: "Copy JSON" }),
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunk2SMCH62O_cjs.DownloadAction, { value: jsonString, filename: "data.json", mimeType: "application/json", title: "Download JSON" })
|
|
189
189
|
] })
|
|
190
190
|
] }),
|
|
191
191
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -210,5 +210,5 @@ var JsonTreeComponent = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({
|
|
|
210
210
|
var JsonTree_default = JsonTreeComponent;
|
|
211
211
|
|
|
212
212
|
exports.JsonTree_default = JsonTree_default;
|
|
213
|
-
//# sourceMappingURL=chunk-
|
|
214
|
-
//# sourceMappingURL=chunk-
|
|
213
|
+
//# sourceMappingURL=chunk-33AMWFBZ.cjs.map
|
|
214
|
+
//# sourceMappingURL=chunk-33AMWFBZ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/JsonTree/components/JsonContent.tsx","../src/tools/JsonTree/hooks/useJsonExpand.ts","../src/tools/JsonTree/types.ts","../src/tools/JsonTree/index.tsx"],"names":["__name","jsxs","jsx","JSONTree","useState","useRef","useMemo","FloatingToolbar","ExpandAction","Fragment","CopyAction","DownloadAction"],"mappings":"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","file":"chunk-TNTCWAVZ.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nconst JSON_TREE_THEME = {\n scheme: 'djangocfg-dark',\n base00: 'transparent',\n base01: '#1a1a1a',\n base02: '#2a2a2a',\n base03: '#6b7280',\n base04: '#9ca3af',\n base05: '#e5e7eb',\n base06: '#f3f4f6',\n base07: '#ffffff',\n base08: '#ef4444', // null, undefined\n base09: '#f97316', // numbers\n base0A: '#eab308', // strings\n base0B: '#22c55e', // booleans\n base0C: '#06b6d4', // dates, regex\n base0D: '#3b82f6', // keys\n base0E: '#a855f7', // functions\n base0F: '#f43f5e', // deprecations\n};\n\ninterface JsonContentProps {\n data: unknown;\n renderKey: number;\n title?: string;\n showTitle: boolean;\n padding: string;\n collectionLimit: number;\n preserveKeyOrder: boolean;\n showCollectionInfo: boolean;\n maxStringLength: number;\n fontSize?: string;\n shouldExpandNodeInitially: (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => boolean;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const JsonContent: React.FC<JsonContentProps> = ({\n data,\n renderKey,\n title,\n showTitle,\n padding,\n collectionLimit,\n preserveKeyOrder,\n showCollectionInfo,\n maxStringLength,\n fontSize,\n shouldExpandNodeInitially,\n jsonTreeProps = {},\n}) => {\n const getItemString = showCollectionInfo\n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-xs\">({length})</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-xs\">{`{${keys.length}}`}</span> : null;\n }\n return null;\n }\n : () => null;\n\n const postprocessValue = (value: unknown) => {\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n const isCustomNode = (value: unknown) =>\n typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'));\n\n return (\n <div className={`overflow-auto h-full ${padding}`} style={fontSize ? { fontSize } : undefined}>\n {showTitle && title && (\n <h6 className=\"text-sm font-semibold text-foreground mb-2\">{title}</h6>\n )}\n <JSONTree\n key={renderKey}\n data={data}\n theme={JSON_TREE_THEME}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n );\n};\n","'use client';\n\nimport { useState } from 'react';\n\ninterface UseJsonExpandOptions {\n maxAutoExpandDepth: number;\n maxAutoExpandArrayItems: number;\n maxAutoExpandObjectKeys: number;\n}\n\n/**\n * Manages expand/collapse state for JsonTree.\n * null = smart auto-expand mode (uses depth/size heuristics)\n * true = all expanded (user override)\n * false = all collapsed (user override)\n */\nexport function useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n}: UseJsonExpandOptions) {\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n\n // Reflects the effective visual state — used to show correct icon\n const isExpanded = expandAll === true || (expandAll === null && maxAutoExpandDepth > 0);\n\n const toggle = () => {\n setExpandAll(isExpanded ? false : true);\n setRenderKey(prev => prev + 1);\n };\n\n const shouldExpandNodeInitially = (\n _keyPath: readonly (string | number)[],\n nodeData: unknown,\n level: number,\n ): boolean => {\n if (expandAll === true) return true;\n if (expandAll === false) return false;\n // null = auto mode\n if (level <= maxAutoExpandDepth) return true;\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n return Object.keys(nodeData).length <= maxAutoExpandObjectKeys;\n }\n return false;\n };\n\n return { isExpanded, toggle, renderKey, shouldExpandNodeInitially };\n}\n","import { CommonExternalProps } from 'react-json-tree';\n\nexport type JsonTreeMode = 'full' | 'compact' | 'inline';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n /** Font size for tree nodes (default: '12px' for compact/inline, '13px' for full) */\n fontSize?: string;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n /**\n * Extra top offset in px for the floating toolbar — use when your layout\n * has a non-sticky header that useNavbarHeight cannot auto-detect.\n * Adds to the auto-detected navbar height.\n */\n toolbarOffset?: number;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const MODE_PRESETS: Record<JsonTreeMode, Partial<JsonTreeConfig>> = {\n full: {\n showExpandControls: true,\n showActionButtons: true,\n showCollectionInfo: true,\n fontSize: '13px',\n },\n compact: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: true,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n inline: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: false,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n};\n","'use client';\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction, DownloadAction, ExpandAction } from '../../components/FloatingToolbar/actions';\nimport { JsonContent } from './components/JsonContent';\nimport { useJsonExpand } from './hooks/useJsonExpand';\nimport { JsonTreeComponentProps, MODE_PRESETS } from './types';\n\nexport type { Language } from 'prism-react-renderer';\nexport type { JsonTreeConfig, JsonTreeComponentProps, JsonTreeMode } from './types';\n\nconst JsonTreeComponent = ({\n title,\n data,\n mode = 'full',\n config = {},\n jsonTreeProps = {},\n}: JsonTreeComponentProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const mergedConfig = useMemo(() => ({ ...MODE_PRESETS[mode], ...config }), [mode, config]);\n\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n fontSize,\n } = mergedConfig;\n\n const { isExpanded, toggle, renderKey, shouldExpandNodeInitially } = useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n });\n\n const jsonString = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const containerClasses = useMemo(() => {\n const base = 'relative w-full';\n switch (mode) {\n case 'full': return `${base} border border-border rounded-sm ${className}`;\n case 'compact': return `${base} border border-border/50 rounded-md ${className}`;\n default: return `${base} ${className}`;\n }\n }, [mode, className]);\n\n const contentPadding = mode === 'full' ? 'p-4' : mode === 'compact' ? 'p-2' : 'p-1';\n const showControls = (showExpandControls || showActionButtons) && mode === 'full';\n\n return (\n <div ref={containerRef} className={containerClasses}>\n {showControls && (\n <FloatingToolbar containerRef={containerRef}>\n {showExpandControls && <ExpandAction isExpanded={isExpanded} onToggle={toggle} />}\n {showActionButtons && (\n <>\n <CopyAction value={jsonString} title=\"Copy JSON\" />\n <DownloadAction value={jsonString} filename=\"data.json\" mimeType=\"application/json\" title=\"Download JSON\" />\n </>\n )}\n </FloatingToolbar>\n )}\n\n <JsonContent\n data={data}\n renderKey={renderKey}\n title={title}\n showTitle={mode === 'full'}\n padding={contentPadding}\n collectionLimit={collectionLimit}\n preserveKeyOrder={preserveKeyOrder}\n showCollectionInfo={showCollectionInfo}\n maxStringLength={maxStringLength}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n fontSize={fontSize}\n jsonTreeProps={jsonTreeProps}\n />\n </div>\n );\n};\n\nexport default JsonTreeComponent;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tools/JsonTree/components/JsonContent.tsx","../src/tools/JsonTree/hooks/useJsonExpand.ts","../src/tools/JsonTree/types.ts","../src/tools/JsonTree/index.tsx"],"names":["__name","jsxs","jsx","JSONTree","useState","useRef","useMemo","FloatingToolbar","ExpandAction","Fragment","CopyAction","DownloadAction"],"mappings":"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","file":"chunk-33AMWFBZ.cjs","sourcesContent":["'use client';\n\nimport React from 'react';\nimport { CommonExternalProps, JSONTree } from 'react-json-tree';\n\nconst JSON_TREE_THEME = {\n scheme: 'djangocfg-dark',\n base00: 'transparent',\n base01: '#1a1a1a',\n base02: '#2a2a2a',\n base03: '#6b7280',\n base04: '#9ca3af',\n base05: '#e5e7eb',\n base06: '#f3f4f6',\n base07: '#ffffff',\n base08: '#ef4444', // null, undefined\n base09: '#f97316', // numbers\n base0A: '#eab308', // strings\n base0B: '#22c55e', // booleans\n base0C: '#06b6d4', // dates, regex\n base0D: '#3b82f6', // keys\n base0E: '#a855f7', // functions\n base0F: '#f43f5e', // deprecations\n};\n\ninterface JsonContentProps {\n data: unknown;\n renderKey: number;\n title?: string;\n showTitle: boolean;\n padding: string;\n collectionLimit: number;\n preserveKeyOrder: boolean;\n showCollectionInfo: boolean;\n maxStringLength: number;\n fontSize?: string;\n shouldExpandNodeInitially: (keyPath: readonly (string | number)[], nodeData: unknown, level: number) => boolean;\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const JsonContent: React.FC<JsonContentProps> = ({\n data,\n renderKey,\n title,\n showTitle,\n padding,\n collectionLimit,\n preserveKeyOrder,\n showCollectionInfo,\n maxStringLength,\n fontSize,\n shouldExpandNodeInitially,\n jsonTreeProps = {},\n}) => {\n const getItemString = showCollectionInfo\n ? (nodeType: string, nodeData: unknown) => {\n if (nodeType === 'Array') {\n const length = Array.isArray(nodeData) ? nodeData.length : 0;\n return length > 0 ? <span className=\"text-muted-foreground text-xs\">({length})</span> : null;\n }\n if (nodeType === 'Object') {\n const keys = nodeData && typeof nodeData === 'object' ? Object.keys(nodeData) : [];\n return keys.length > 0 ? <span className=\"text-muted-foreground text-xs\">{`{${keys.length}}`}</span> : null;\n }\n return null;\n }\n : () => null;\n\n const postprocessValue = (value: unknown) => {\n if (typeof value === 'string' && value.length > maxStringLength) {\n return value.substring(0, maxStringLength) + '... (truncated)';\n }\n return value;\n };\n\n const isCustomNode = (value: unknown) =>\n typeof value === 'string' && (value.startsWith('http://') || value.startsWith('https://'));\n\n return (\n <div className={`overflow-auto h-full ${padding}`} style={fontSize ? { fontSize } : undefined}>\n {showTitle && title && (\n <h6 className=\"text-sm font-semibold text-foreground mb-2\">{title}</h6>\n )}\n <JSONTree\n key={renderKey}\n data={data}\n theme={JSON_TREE_THEME}\n invertTheme={false}\n hideRoot={true}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n getItemString={getItemString}\n postprocessValue={postprocessValue}\n isCustomNode={isCustomNode}\n collectionLimit={collectionLimit}\n sortObjectKeys={!preserveKeyOrder}\n {...jsonTreeProps}\n />\n </div>\n );\n};\n","'use client';\n\nimport { useState } from 'react';\n\ninterface UseJsonExpandOptions {\n maxAutoExpandDepth: number;\n maxAutoExpandArrayItems: number;\n maxAutoExpandObjectKeys: number;\n}\n\n/**\n * Manages expand/collapse state for JsonTree.\n * null = smart auto-expand mode (uses depth/size heuristics)\n * true = all expanded (user override)\n * false = all collapsed (user override)\n */\nexport function useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n}: UseJsonExpandOptions) {\n const [expandAll, setExpandAll] = useState<boolean | null>(null);\n const [renderKey, setRenderKey] = useState(0);\n\n // Reflects the effective visual state — used to show correct icon\n const isExpanded = expandAll === true || (expandAll === null && maxAutoExpandDepth > 0);\n\n const toggle = () => {\n setExpandAll(isExpanded ? false : true);\n setRenderKey(prev => prev + 1);\n };\n\n const shouldExpandNodeInitially = (\n _keyPath: readonly (string | number)[],\n nodeData: unknown,\n level: number,\n ): boolean => {\n if (expandAll === true) return true;\n if (expandAll === false) return false;\n // null = auto mode\n if (level <= maxAutoExpandDepth) return true;\n if (Array.isArray(nodeData) && nodeData.length <= maxAutoExpandArrayItems) return true;\n if (nodeData && typeof nodeData === 'object' && !Array.isArray(nodeData)) {\n return Object.keys(nodeData).length <= maxAutoExpandObjectKeys;\n }\n return false;\n };\n\n return { isExpanded, toggle, renderKey, shouldExpandNodeInitially };\n}\n","import { CommonExternalProps } from 'react-json-tree';\n\nexport type JsonTreeMode = 'full' | 'compact' | 'inline';\n\nexport interface JsonTreeConfig {\n /** Maximum depth to expand automatically (default: 2) */\n maxAutoExpandDepth?: number;\n /** Maximum items in array to auto-expand (default: 10) */\n maxAutoExpandArrayItems?: number;\n /** Maximum object keys to auto-expand (default: 5) */\n maxAutoExpandObjectKeys?: number;\n /** Maximum string length before truncation (default: 200) */\n maxStringLength?: number;\n /** Collection limit for performance (default: 50) */\n collectionLimit?: number;\n /** Whether to show collection info (array length, object keys count) */\n showCollectionInfo?: boolean;\n /** Whether to show expand/collapse all buttons */\n showExpandControls?: boolean;\n /** Whether to show copy/download buttons */\n showActionButtons?: boolean;\n /** Custom CSS classes for the container */\n className?: string;\n /** Whether to preserve object key order (default: true) */\n preserveKeyOrder?: boolean;\n /** Font size for tree nodes (default: '12px' for compact/inline, '13px' for full) */\n fontSize?: string;\n}\n\nexport interface JsonTreeComponentProps {\n title?: string;\n data: unknown;\n /**\n * Extra top offset in px for the floating toolbar — use when your layout\n * has a non-sticky header that useNavbarHeight cannot auto-detect.\n * Adds to the auto-detected navbar height.\n */\n toolbarOffset?: number;\n /**\n * Display mode:\n * - \"full\" (default): With toolbar and border\n * - \"compact\": No toolbar, subtle styling\n * - \"inline\": Minimal, no border\n */\n mode?: JsonTreeMode;\n config?: JsonTreeConfig;\n /** Override for react-json-tree props */\n jsonTreeProps?: Partial<CommonExternalProps>;\n}\n\nexport const MODE_PRESETS: Record<JsonTreeMode, Partial<JsonTreeConfig>> = {\n full: {\n showExpandControls: true,\n showActionButtons: true,\n showCollectionInfo: true,\n fontSize: '13px',\n },\n compact: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: true,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n inline: {\n showExpandControls: false,\n showActionButtons: false,\n showCollectionInfo: false,\n fontSize: '11px',\n maxAutoExpandDepth: 1,\n },\n};\n","'use client';\n\nimport React, { useMemo, useRef } from 'react';\n\nimport { FloatingToolbar } from '../../components/FloatingToolbar';\nimport { CopyAction, DownloadAction, ExpandAction } from '../../components/FloatingToolbar/actions';\nimport { JsonContent } from './components/JsonContent';\nimport { useJsonExpand } from './hooks/useJsonExpand';\nimport { JsonTreeComponentProps, MODE_PRESETS } from './types';\n\nexport type { Language } from 'prism-react-renderer';\nexport type { JsonTreeConfig, JsonTreeComponentProps, JsonTreeMode } from './types';\n\nconst JsonTreeComponent = ({\n title,\n data,\n mode = 'full',\n config = {},\n jsonTreeProps = {},\n}: JsonTreeComponentProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const mergedConfig = useMemo(() => ({ ...MODE_PRESETS[mode], ...config }), [mode, config]);\n\n const {\n maxAutoExpandDepth = 2,\n maxAutoExpandArrayItems = 10,\n maxAutoExpandObjectKeys = 5,\n maxStringLength = 200,\n collectionLimit = 50,\n showCollectionInfo = true,\n showExpandControls = true,\n showActionButtons = true,\n className = '',\n preserveKeyOrder = true,\n fontSize,\n } = mergedConfig;\n\n const { isExpanded, toggle, renderKey, shouldExpandNodeInitially } = useJsonExpand({\n maxAutoExpandDepth,\n maxAutoExpandArrayItems,\n maxAutoExpandObjectKeys,\n });\n\n const jsonString = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const containerClasses = useMemo(() => {\n const base = 'relative w-full';\n switch (mode) {\n case 'full': return `${base} border border-border rounded-sm ${className}`;\n case 'compact': return `${base} border border-border/50 rounded-md ${className}`;\n default: return `${base} ${className}`;\n }\n }, [mode, className]);\n\n const contentPadding = mode === 'full' ? 'p-4' : mode === 'compact' ? 'p-2' : 'p-1';\n const showControls = (showExpandControls || showActionButtons) && mode === 'full';\n\n return (\n <div ref={containerRef} className={containerClasses}>\n {showControls && (\n <FloatingToolbar containerRef={containerRef}>\n {showExpandControls && <ExpandAction isExpanded={isExpanded} onToggle={toggle} />}\n {showActionButtons && (\n <>\n <CopyAction value={jsonString} title=\"Copy JSON\" />\n <DownloadAction value={jsonString} filename=\"data.json\" mimeType=\"application/json\" title=\"Download JSON\" />\n </>\n )}\n </FloatingToolbar>\n )}\n\n <JsonContent\n data={data}\n renderKey={renderKey}\n title={title}\n showTitle={mode === 'full'}\n padding={contentPadding}\n collectionLimit={collectionLimit}\n preserveKeyOrder={preserveKeyOrder}\n showCollectionInfo={showCollectionInfo}\n maxStringLength={maxStringLength}\n shouldExpandNodeInitially={shouldExpandNodeInitially}\n fontSize={fontSize}\n jsonTreeProps={jsonTreeProps}\n />\n </div>\n );\n};\n\nexport default JsonTreeComponent;\n"]}
|
|
@@ -10,7 +10,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
10
10
|
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
11
11
|
var consola__default = /*#__PURE__*/_interopDefault(consola);
|
|
12
12
|
|
|
13
|
-
var PrettyCodeClient = React2.lazy(() => import('./PrettyCode.client-
|
|
13
|
+
var PrettyCodeClient = React2.lazy(() => import('./PrettyCode.client-V2ZN5DTH.cjs'));
|
|
14
14
|
var LoadingFallback = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
15
15
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20" }),
|
|
16
16
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Loading code..." })
|
|
@@ -391,5 +391,5 @@ exports.getStatusColor = getStatusColor;
|
|
|
391
391
|
exports.isValidJson = isValidJson;
|
|
392
392
|
exports.parseRequestHeaders = parseRequestHeaders;
|
|
393
393
|
exports.usePlaygroundContext = usePlaygroundContext;
|
|
394
|
-
//# sourceMappingURL=chunk-
|
|
395
|
-
//# sourceMappingURL=chunk-
|
|
394
|
+
//# sourceMappingURL=chunk-CRHHUOVJ.cjs.map
|
|
395
|
+
//# sourceMappingURL=chunk-CRHHUOVJ.cjs.map
|