@lax-wp/design-system 0.13.41 → 0.13.42
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/components/data-display/code-editor/CodeEditor.cjs.js +1 -1
- package/dist/components/data-display/code-editor/CodeEditor.cjs.js.map +1 -1
- package/dist/components/data-display/code-editor/CodeEditor.es.js +38 -38
- package/dist/components/data-display/code-editor/CodeEditor.es.js.map +1 -1
- package/dist/components/data-display/tag/Tag.cjs.js +1 -1
- package/dist/components/data-display/tag/Tag.cjs.js.map +1 -1
- package/dist/components/data-display/tag/Tag.es.js +9 -9
- package/dist/components/data-display/tag/Tag.es.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.es.js +1 -1
- package/dist/components/floating-bar/FloatingBar.es.js.map +1 -1
- package/dist/components/forms/search-bar/SearchBar.cjs.js +1 -1
- package/dist/components/forms/search-bar/SearchBar.cjs.js.map +1 -1
- package/dist/components/forms/search-bar/SearchBar.es.js +1 -1
- package/dist/components/forms/search-bar/SearchBar.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
`),e=e.split(`
|
|
4
4
|
`).map(n=>n.trimEnd()).join(`
|
|
5
5
|
`),e=e.replace(/\n+$/,"")+`
|
|
6
|
-
`),navigator?.clipboard?.writeText(e).then(()=>{}).catch(n=>{const r=n;A.toast.error(r?.message||L.systemMessages.copyFailure("Python Code"),{toastId:L.systemMessages.copyFailure("Python Code")})})}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("Python Code"),{toastId:L.systemMessages.copyFailure("Python Code")})}else if(i==="json")try{const e=JSON.parse(o),n=JSON.stringify(e,null,4);navigator?.clipboard?.writeText(n)}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("JSON Code"),{toastId:L.systemMessages.copyFailure("JSON Code")})}else navigator?.clipboard?.writeText(o)},ee=e=>e==="python"?{type:"text/x-python",extension:"py"}:e==="json"?{type:"application/json",extension:"json"}:{type:"text/plain",extension:"txt"},te=(e,n)=>e.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").replace(/\.{2,}/g,".").replace(/^\.+|\.+$/g,"").trim()||n,Ie=()=>{try{const e=new Blob([o],{type:ee(i)?.type}),n=URL.createObjectURL(e),r=document.createElement("a");r.href=n;const c=ee(i)?.extension||"txt",a=te(c,"txt");r.download=te(`code_${Date.now()}.${a}`,`code_${Date.now()}.${a}`),document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("Code download"),{toastId:L.systemMessages.copyFailure("Code download")})}};return t.jsx(oe.FullScreen,{handle:S,className:"h-full",children:t.jsxs("div",{className:qe.cn("relative border border-neutral-200 dark:border-neutral-700 rounded-lg h-full overflow-hidden",he),id:"code-editor-container-with-json-grid",children:[t.jsxs("div",{className:B("px-3 py-2 flex items-center bg-neutral-50 dark:bg-neutral-800","border-b border-neutral-200 dark:border-neutral-700",Y?"justify-between":"justify-end"),children:[Y&&J?t.jsx(Je.Toggle,{isChecked:N==="Grid",onChange:e=>Me(e?"Grid":"JSON"),statusText:"",hideStatus:!0,withIcon:!0,tooltip:N==="JSON"?"Grid view":"Code view",icon:{checkedIcon:t.jsx(re.GridOnIcon,{
|
|
6
|
+
`),navigator?.clipboard?.writeText(e).then(()=>{}).catch(n=>{const r=n;A.toast.error(r?.message||L.systemMessages.copyFailure("Python Code"),{toastId:L.systemMessages.copyFailure("Python Code")})})}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("Python Code"),{toastId:L.systemMessages.copyFailure("Python Code")})}else if(i==="json")try{const e=JSON.parse(o),n=JSON.stringify(e,null,4);navigator?.clipboard?.writeText(n)}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("JSON Code"),{toastId:L.systemMessages.copyFailure("JSON Code")})}else navigator?.clipboard?.writeText(o)},ee=e=>e==="python"?{type:"text/x-python",extension:"py"}:e==="json"?{type:"application/json",extension:"json"}:{type:"text/plain",extension:"txt"},te=(e,n)=>e.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").replace(/\.{2,}/g,".").replace(/^\.+|\.+$/g,"").trim()||n,Ie=()=>{try{const e=new Blob([o],{type:ee(i)?.type}),n=URL.createObjectURL(e),r=document.createElement("a");r.href=n;const c=ee(i)?.extension||"txt",a=te(c,"txt");r.download=te(`code_${Date.now()}.${a}`,`code_${Date.now()}.${a}`),document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(n)}catch(e){const n=e;A.toast.error(n?.message||L.systemMessages.copyFailure("Code download"),{toastId:L.systemMessages.copyFailure("Code download")})}};return t.jsx(oe.FullScreen,{handle:S,className:"h-full",children:t.jsxs("div",{className:qe.cn("relative border border-neutral-200 dark:border-neutral-700 rounded-lg h-full overflow-hidden",he),id:"code-editor-container-with-json-grid",children:[t.jsxs("div",{className:B("px-3 py-2 flex items-center bg-neutral-50 dark:bg-neutral-800","border-b border-neutral-200 dark:border-neutral-700",Y?"justify-between":"justify-end"),children:[Y&&J?t.jsx(Je.Toggle,{isChecked:N==="Grid",onChange:e=>Me(e?"Grid":"JSON"),statusText:"",hideStatus:!0,withIcon:!0,tooltip:N==="JSON"?"Grid view":"Code view",icon:{checkedIcon:t.jsx(re.GridOnIcon,{className:"cursor-pointer !block text-primary-600 dark:text-neutral-300 h-2xs w-2xs lg:h-xs lg:w-xs"}),uncheckedIcon:t.jsx(re.CodeIcon,{className:"cursor-pointer !block text-neutral-700 dark:text-neutral-400 h-2xs w-2xs lg:h-xs lg:w-xs"})}}):null,t.jsxs("div",{className:"flex items-center gap-0.5",children:[xe?.({editor:F.current,value:o,onChange:R,language:i,isEditMode:O,activeTab:N}),N==="Grid"&&O&&J&&t.jsx("span",{className:"flex items-center justify-center border-r border-neutral-200 dark:border-neutral-700 mr-1.5 pr-1.5",children:t.jsx(k,{title:"Add key",children:t.jsx("button",{type:"button",id:"btn-code-editor-json-grid-up",onClick:()=>X(!0),className:B("p-0.5 rounded-md flex items-center justify-center","hover:bg-primary-100 hover:dark:bg-neutral-800 text-primary-600 dark:text-neutral-100"),children:t.jsx(Ae,{fontSize:16})})})}),N==="Grid"?t.jsxs(t.Fragment,{children:[t.jsx(k,{title:"Collapse all",children:t.jsx("button",{type:"button",id:"btn-code-editor-json-grid-up",onClick:()=>P(!1),className:z,children:t.jsx(_e,{fontSize:16})})}),t.jsx(k,{title:"Expand all",children:t.jsx("button",{type:"button",id:"btn-code-editor-json-grid-down",onClick:()=>P(!0),className:z,children:t.jsx($e,{fontSize:16})})})]}):null,N==="JSON"&&J?t.jsx(k,{title:"Format",children:t.jsx("button",{type:"button",id:"btn-code-editor-format-code",onClick:Z,className:z,children:t.jsx(Ke,{fontSize:14})})}):null,ie&&N==="JSON"&&J?t.jsx(k,{title:q==="vs"?"Dark mode":"Light mode",children:t.jsx("button",{type:"button",id:"btn-code-editor-with-theme",onClick:()=>je(q==="vs"?"vs-dark":"vs"),className:z,children:q==="vs"?t.jsx(Ve,{fontSize:14}):t.jsx(Ge,{fontSize:14})})}):null,(i==="python"||i==="json")&&ce?t.jsx(k,{title:"Copy",children:t.jsx("button",{type:"button",id:"btn-code-editor-copy-code",onClick:Ee,className:z,children:t.jsx(Be,{fontSize:14})})}):null,(i==="python"||i==="json")&&le?t.jsx(k,{title:"Download",children:t.jsx("button",{type:"button",id:"btn-code-editor-download-code",onClick:Ie,className:z,children:t.jsx(De,{fontSize:14})})}):null,se?t.jsx(k,{title:"Fullscreen",children:t.jsx("button",{onClick:ke,type:"button",id:"btn-code-editor-fullscreen",className:z,children:t.jsx(Pe,{fontSize:14})})}):null]})]}),N==="Grid"&&i==="json"?t.jsx("div",{children:t.jsx(He.JsonGridViewer,{isFullScreen:S?.active,allExpanded:ve,toggleAll:()=>P(e=>!e),isEditMode:!!O,isDarkMode:ye==="dark",style:{height:S?.active?"100vh":$},value:o,onChange:R,setIsAddKeyModalOpen:X,isAddKeyModalOpen:Le})}):t.jsx(Re.default,{height:S?.active?"100vh":$,language:i,value:o,onChange:Fe,theme:q,onMount:Se,options:{fontSize:16,folding:!0,fontFamily:"Menlo, Monaco, 'Courier New', monospace",fontLigatures:!0,readOnly:!O}})]})})};exports.CodeEditor=Ue;
|
|
7
7
|
//# sourceMappingURL=CodeEditor.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.cjs.js","sources":["../../../../src/components/data-display/code-editor/CodeEditor.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport Editor, { type OnMount } from '@monaco-editor/react';\nimport classNames from 'classnames';\nimport { type FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { FullScreen, useFullScreenHandle } from 'react-full-screen';\nimport { toast } from 'react-toastify';\nimport { useMonaco } from '../../../hooks/useMonaco';\nimport { usePythonSyntax } from '../../../hooks/usePythonSyntax';\nimport { type CodeEditorProps } from '../../../types';\nimport { systemMessages } from '../../../utils/messageConstants';\nimport { JsonGrid } from './JsonGrid';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { Toggle } from '../../forms/toggle/Toggle';\nimport { cn } from '../../../lib/utils';\nimport { CodeIcon, GridOnIcon } from '../../icon';\n\n// Icon class styling (matching web portal)\nconst iconClass = classNames(\n 'text-neutral-600 cursor-pointer hover:text-neutral-800',\n 'dark:text-neutral-300 dark:hover:text-neutral-50'\n);\n\n// Material Icons converted to SVG components (matching web portal icons)\nconst AddIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </svg>\n);\n\nconst ContentPasteRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>\n);\n\nconst DarkModeOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M9.5 2c-1.82 0-3.53.5-5 1.35 2.99 1.73 5 4.95 5 8.65s-2.01 6.92-5 8.65c1.47.85 3.18 1.35 5 1.35 5.52 0 10-4.48 10-10S15.02 2 9.5 2z\" />\n </svg>\n);\n\nconst FileDownloadRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-5 5-5-5h3V4h4v7h3z\" />\n </svg>\n);\n\nconst FullscreenRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\n </svg>\n);\n\nconst KeyboardDoubleArrowDownIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M18 6.41 16.59 5 12 9.58 7.41 5 6 6.41l6 6z\" />\n <path d=\"m18 13-1.41-1.41L12 16.17l-4.59-4.58L6 13l6 6z\" />\n </svg>\n);\n\nconst KeyboardDoubleArrowUpIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M6 17.59 7.41 19 12 14.42 16.59 19 18 17.59l-6-6z\" />\n <path d=\"m6 11 1.41 1.41L12 7.83l4.59 4.58L18 11l-6-6z\" />\n </svg>\n);\n\nconst LightModeOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M12 9c1.65 0 3 1.35 3 3s-1.35 3-3 3-3-1.35-3-3 1.35-3 3-3m0-2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z\" />\n </svg>\n);\n\nconst SubjectOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z\" />\n </svg>\n);\n\ntype TTabKey = 'JSON' | 'Grid';\n\nexport const CodeEditor: FC<CodeEditorProps> = ({\n value,\n onChange = () => false,\n withFullScreen = true,\n withTheme = true,\n isEditMode = false,\n height = \"55vh\",\n language = \"json\",\n monacoEditor,\n isShowCopy = true,\n isShowDownload = true,\n setIsDisableSave,\n withJsonGrid = true,\n editorTheme: externalEditorTheme,\n setEditorTheme: externalSetEditorTheme,\n theme: externalTheme,\n className,\n enableAutoFormatting = true,\n renderToolbarActions,\n onBlockClick,\n focusBlock,\n focusBlockTopLevelOnly = false,\n}) => {\n const editorRef = useRef<any>(null);\n\n // Internal theme state (used when not provided by parent)\n const [internalEditorTheme, setInternalEditorTheme] = useState<\n \"vs\" | \"vs-dark\"\n >(\"vs\");\n const [internalTheme, setInternalTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n // Use external theme if provided, otherwise use internal\n const editorTheme = externalEditorTheme ?? internalEditorTheme;\n const theme = externalTheme ?? internalTheme;\n const setEditorTheme =\n externalSetEditorTheme ??\n ((newTheme: \"vs\" | \"vs-dark\") => {\n setInternalEditorTheme(newTheme);\n setInternalTheme(newTheme === \"vs-dark\" ? \"dark\" : \"light\");\n });\n\n const [allExpanded, setAllExpanded] = useState<boolean>(false);\n const [currentEditorModel, setCurrentEditorModel] = useState<any>(null);\n const monacoInstance = useMonaco();\n\n // Use provided monacoEditor prop or fall back to our managed instance\n const activeMonacoEditor = monacoEditor || monacoInstance;\n\n const {\n handleFormatCode: handleFormatPythonCode,\n pythonError,\n pythonLoading,\n } = usePythonSyntax({\n code: value,\n setCode: onChange,\n currentEditorModel,\n monacoEditor: activeMonacoEditor,\n enable: isEditMode === true && language === \"python\",\n });\n\n const fullScreenHandle = useFullScreenHandle();\n const [activeTab, setActiveTab] = useState<TTabKey>(\"JSON\");\n const [isAddKeyModalOpen, setIsAddKeyModalOpen] = useState(false);\n const isLanguageJson = language === \"json\";\n\n const toggleFocusMode = () => {\n if (fullScreenHandle?.active) {\n fullScreenHandle.exit();\n } else {\n fullScreenHandle.enter();\n }\n };\n\n const onBlockClickRef = useRef(onBlockClick);\n onBlockClickRef.current = onBlockClick;\n\n const detectBlock = useCallback(\n async (editor: any, lineNumber: number, column: number) => {\n if (!onBlockClickRef.current) return;\n\n const model = editor.getModel();\n if (!model) return;\n\n const getTextForRange = (startLine: number, endLine: number) =>\n model.getValueInRange({\n startLineNumber: startLine,\n startColumn: 1,\n endLineNumber: endLine,\n endColumn: model.getLineMaxColumn(endLine),\n });\n\n const emitBlock = (\n startLine: number,\n endLine: number,\n text: string,\n kind?: string,\n parentBlock?: { startLine: number; endLine: number; text: string; kind?: string }\n ) => {\n onBlockClickRef.current!({\n startLine,\n endLine,\n text,\n kind,\n cursorLine: lineNumber,\n cursorColumn: column,\n parentBlock,\n });\n };\n\n try {\n const foldingContrib = editor.getContribution(\n \"editor.contrib.folding\"\n );\n if (foldingContrib) {\n const foldingModel = await (foldingContrib as any).getFoldingModel();\n if (foldingModel?.regions) {\n const regions = foldingModel.regions;\n const totalLines = model.getLineCount();\n\n // Collect all folding ranges that contain the cursor line\n const containingRanges: {\n start: number;\n end: number;\n size: number;\n kind?: string;\n }[] = [];\n\n for (let i = 0; i < regions.length; i++) {\n const start = regions.getStartLineNumber(i);\n const foldEnd = regions.getEndLineNumber(i);\n const end = Math.min(foldEnd + 1, totalLines);\n const size = end - start;\n\n if (lineNumber >= start && lineNumber <= end) {\n const rawKind = regions.getType(i);\n const kind =\n rawKind === 1\n ? \"comment\"\n : rawKind === 2\n ? \"imports\"\n : rawKind === 3\n ? \"region\"\n : undefined;\n containingRanges.push({ start, end, size, kind });\n }\n }\n\n if (containingRanges.length > 0) {\n // Sort by size: smallest first (innermost) → largest last (outermost)\n containingRanges.sort((a, b) => a.size - b.size);\n\n const innermost = containingRanges[0];\n const text = getTextForRange(innermost.start, innermost.end);\n\n // Find the outermost block that isn't the root document range.\n // Walk from largest to smallest, skip any range that starts at\n // line 1 and ends at the last line (that's the root `{}`).\n let outermost: typeof containingRanges[number] | undefined;\n for (let j = containingRanges.length - 1; j > 0; j--) {\n const r = containingRanges[j];\n const isRoot = r.start <= 1 && r.end >= totalLines;\n if (!isRoot) {\n outermost = r;\n break;\n }\n }\n\n const parentBlock =\n outermost && outermost !== innermost\n ? {\n startLine: outermost.start,\n endLine: outermost.end,\n text: getTextForRange(outermost.start, outermost.end),\n kind: outermost.kind,\n }\n : undefined;\n\n emitBlock(innermost.start, innermost.end, text, innermost.kind, parentBlock);\n return;\n }\n }\n }\n\n // Bracket matching fallback — no parent detection available\n const position = { lineNumber, column };\n const brackets = model.bracketPairs?.findEnclosingBrackets?.(position);\n\n if (brackets && brackets.length === 2) {\n const [openRange, closeRange] = brackets;\n const startLine = openRange.startLineNumber;\n const endLine = closeRange.endLineNumber;\n const text = getTextForRange(startLine, endLine);\n emitBlock(startLine, endLine, text);\n return;\n }\n\n // Full document fallback\n const totalLines = model.getLineCount();\n const text = model.getValue();\n emitBlock(1, totalLines, text);\n } catch {\n // Editor not ready — ignore silently\n }\n },\n []\n );\n\n // Navigate to a block when focusBlock changes\n useEffect(() => {\n if (!focusBlock || !editorRef.current) return;\n\n const editor = editorRef.current;\n const model = editor.getModel();\n if (!model) return;\n\n const allMatches = model.findMatches(\n focusBlock,\n true,\n false,\n true,\n null,\n false\n );\n\n if (allMatches.length === 0) return;\n\n let match = allMatches[0];\n\n if (focusBlockTopLevelOnly && allMatches.length > 1) {\n // A top-level key in formatted JSON has minimal leading whitespace\n // (one indent level). Find the match closest to column 1.\n let bestCol = Infinity;\n for (const m of allMatches) {\n const lineContent = model.getLineContent(m.range.startLineNumber);\n const leadingSpaces = lineContent.length - lineContent.trimStart().length;\n if (leadingSpaces < bestCol) {\n bestCol = leadingSpaces;\n match = m;\n }\n }\n }\n\n const matchLine = match.range.startLineNumber;\n const matchCol = match.range.startColumn;\n\n // Move cursor to the match with smooth scroll\n editor.setPosition({ lineNumber: matchLine, column: matchCol });\n editor.revealLineInCenter(matchLine, 1);\n\n // Find the enclosing block and highlight it\n const findAndHighlightBlock = async () => {\n try {\n // Try folding ranges first\n const foldingContrib = editor.getContribution(\n \"editor.contrib.folding\"\n );\n if (foldingContrib) {\n const foldingModel = await (foldingContrib as any).getFoldingModel();\n if (foldingModel?.regions) {\n const regions = foldingModel.regions;\n let bestStart = -1;\n let bestEnd = -1;\n let bestSize = Infinity;\n\n for (let i = 0; i < regions.length; i++) {\n const start = regions.getStartLineNumber(i);\n const foldEnd = regions.getEndLineNumber(i);\n const end = Math.min(foldEnd + 1, model.getLineCount());\n const size = end - start;\n\n if (\n matchLine >= start &&\n matchLine <= end &&\n size < bestSize\n ) {\n bestStart = start;\n bestEnd = end;\n bestSize = size;\n }\n }\n\n if (bestStart !== -1) {\n editor.setSelection({\n startLineNumber: bestStart,\n startColumn: 1,\n endLineNumber: bestEnd,\n endColumn: model.getLineMaxColumn(bestEnd),\n });\n editor.revealRangeInCenter({\n startLineNumber: bestStart,\n startColumn: 1,\n endLineNumber: bestEnd,\n endColumn: model.getLineMaxColumn(bestEnd),\n }, 1);\n return;\n }\n }\n }\n\n // Fall back to bracket matching\n const position = { lineNumber: matchLine, column: matchCol };\n const brackets =\n model.bracketPairs?.findEnclosingBrackets?.(position);\n\n if (brackets && brackets.length === 2) {\n const [openRange, closeRange] = brackets;\n editor.setSelection({\n startLineNumber: openRange.startLineNumber,\n startColumn: 1,\n endLineNumber: closeRange.endLineNumber,\n endColumn: model.getLineMaxColumn(closeRange.endLineNumber),\n });\n editor.revealRangeInCenter({\n startLineNumber: openRange.startLineNumber,\n startColumn: 1,\n endLineNumber: closeRange.endLineNumber,\n endColumn: model.getLineMaxColumn(closeRange.endLineNumber),\n }, 1);\n return;\n }\n\n // Last resort — just highlight the matched text\n editor.setSelection(match.range);\n } catch {\n // Folding model not ready — just highlight the match\n editor.setSelection(match.range);\n }\n };\n\n // Small delay to let folding model compute after content may have changed\n requestAnimationFrame(() => {\n findAndHighlightBlock();\n });\n }, [focusBlock, focusBlockTopLevelOnly]);\n\n const handleEditorDidMount: OnMount = (editor) => {\n editorRef.current = editor;\n\n const initializeEditor = () => {\n try {\n if (language === \"python\") {\n const model = editor.getModel();\n if (model) {\n setCurrentEditorModel(model);\n }\n }\n\n if (language === \"json\" && enableAutoFormatting) {\n requestAnimationFrame(() => {\n handleFormatCode();\n });\n }\n } catch (error) {\n console.warn(\"Failed to initialize editor:\", error);\n }\n };\n\n if (editor.getModel()) {\n initializeEditor();\n } else {\n const disposable = editor.onDidChangeModel(() => {\n initializeEditor();\n disposable.dispose();\n });\n }\n\n // Detect block on mouse click — use onMouseDown + small delay so cursor\n // position is settled before we read it\n if (onBlockClickRef.current) {\n editor.onMouseDown(() => {\n requestAnimationFrame(() => {\n const pos = editor.getPosition();\n if (pos) {\n detectBlock(editor, pos.lineNumber, pos.column);\n }\n });\n });\n }\n };\n\n const handleFormatJsonCode = () => {\n try {\n const parsedJson = JSON.parse(value);\n const formattedJson = JSON.stringify(parsedJson, null, 4);\n onChange(formattedJson);\n\n // Also update the editor model if it exists\n if (currentEditorModel && activeMonacoEditor) {\n activeMonacoEditor.editor.setModelMarkers(\n currentEditorModel,\n \"json\",\n []\n );\n }\n } catch (error) {\n // Display error visually instead of logging to console\n if (currentEditorModel && activeMonacoEditor) {\n const errorMessage =\n error instanceof Error ? error.message : \"Invalid JSON\";\n try {\n activeMonacoEditor.editor.setModelMarkers(\n currentEditorModel,\n \"json\",\n [\n {\n startLineNumber: 1,\n startColumn: 1,\n endLineNumber: 1,\n endColumn: 1,\n message: `Cannot format: ${errorMessage}`,\n severity: activeMonacoEditor.MarkerSeverity.Error,\n },\n ]\n );\n } catch (markerError) {\n console.warn(\"Failed to set JSON error markers:\", markerError);\n }\n }\n }\n };\n\n const handleFormatCode = () => {\n if (language === \"python\") {\n handleFormatPythonCode();\n return;\n }\n\n if (language === \"json\") {\n handleFormatJsonCode();\n return;\n }\n\n if (editorRef.current) {\n try {\n const formatAction = editorRef.current.getAction(\n \"editor.action.formatDocument\"\n );\n if (formatAction) {\n formatAction.run();\n }\n } catch (error) {\n console.warn(\"Failed to format document:\", error);\n }\n }\n };\n\n const handleChange = (newValue: string | undefined) => {\n if (typeof newValue === \"string\") {\n onChange(newValue);\n }\n };\n\n useEffect(() => {\n if (setIsDisableSave) {\n setIsDisableSave(pythonError || pythonLoading);\n }\n }, [pythonError, pythonLoading, setIsDisableSave]);\n\n // Don't render the editor until Monaco is ready (unless we have a provided instance)\n if (!monacoEditor && !monacoInstance) {\n return (\n <div className=\"flex items-center justify-center p-8 border border-neutral-200 dark:border-neutral-700 rounded-lg\">\n <div className=\"text-neutral-600 dark:text-neutral-400\">\n Loading editor...\n </div>\n </div>\n );\n }\n\n const hoverClass = classNames(\n \"hover:bg-neutral-300 hover:dark:bg-neutral-700 p-0.5 rounded-md flex items-center justify-center\"\n );\n\n const handleCopyCode = () => {\n if (language === \"python\") {\n try {\n let formattedCode = value;\n if (formattedCode) {\n formattedCode = formattedCode\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\");\n formattedCode = formattedCode\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .join(\"\\n\");\n formattedCode = formattedCode.replace(/\\n+$/, \"\") + \"\\n\";\n }\n\n navigator?.clipboard\n ?.writeText(formattedCode)\n .then(() => {\n // show success toast (kept silent as in web portal)\n })\n .catch((_error: unknown) => {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Python Code\"),\n {\n toastId: systemMessages.copyFailure(\"Python Code\"),\n }\n );\n });\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Python Code\"),\n {\n toastId: systemMessages.copyFailure(\"Python Code\"),\n }\n );\n }\n } else if (language === \"json\") {\n try {\n const parsedJson = JSON.parse(value);\n const formattedJson = JSON.stringify(parsedJson, null, 4);\n navigator?.clipboard?.writeText(formattedJson);\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(error?.message || systemMessages.copyFailure(\"JSON Code\"), {\n toastId: systemMessages.copyFailure(\"JSON Code\"),\n });\n }\n } else {\n navigator?.clipboard?.writeText(value);\n }\n };\n\n const getConfig = (code: string) => {\n if (code === \"python\") {\n return {\n type: \"text/x-python\",\n extension: \"py\",\n };\n }\n if (code === \"json\") {\n return {\n type: \"application/json\",\n extension: \"json\",\n };\n }\n return {\n type: \"text/plain\",\n extension: \"txt\",\n };\n };\n\n // Sanitize filename utility (matching web portal implementation)\n const sanitizeFilename = (filename: string, fallback: string): string => {\n // Remove or replace potentially dangerous characters\n const sanitized = filename\n .replace(/[<>:\"/\\\\|?*\\x00-\\x1f]/g, \"_\") // Replace illegal chars\n .replace(/\\.{2,}/g, \".\") // Replace multiple dots\n .replace(/^\\.+|\\.+$/g, \"\") // Remove leading/trailing dots\n .trim();\n\n return sanitized || fallback;\n };\n\n const handleDownloadCode = () => {\n try {\n const blob = new Blob([value], { type: getConfig(language)?.type });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n const extension = getConfig(language)?.extension || \"txt\";\n const sanitizedExtension = sanitizeFilename(extension, \"txt\");\n anchor.download = sanitizeFilename(\n `code_${Date.now()}.${sanitizedExtension}`,\n `code_${Date.now()}.${sanitizedExtension}`\n );\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(url);\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Code download\"),\n {\n toastId: systemMessages.copyFailure(\"Code download\"),\n }\n );\n }\n };\n\n return (\n <FullScreen handle={fullScreenHandle} className=\"h-full\">\n <div\n className={cn(\n \"relative border border-neutral-200 dark:border-neutral-700 rounded-lg h-full overflow-hidden\",\n className\n )}\n id=\"code-editor-container-with-json-grid\"\n >\n <div\n className={classNames(\n `px-3 py-2 flex items-center bg-neutral-50 dark:bg-neutral-800`,\n // withJsonGrid\n // ? \"border-none\"\n // : \"border-b border-neutral-200 dark:border-neutral-700\",\n \"border-b border-neutral-200 dark:border-neutral-700\",\n isLanguageJson ? \"justify-between\" : \"justify-end\"\n )}\n >\n {isLanguageJson && withJsonGrid ? (\n <Toggle\n isChecked={activeTab === \"Grid\"}\n onChange={(checked) => setActiveTab(checked ? \"Grid\" : \"JSON\")}\n statusText=''\n hideStatus\n withIcon\n tooltip={activeTab === \"JSON\" ? \"Grid view\" : \"Code view\"}\n icon={{\n checkedIcon: <GridOnIcon fontSize={6} className=\"cursor-pointer !block text-primary-600 dark:text-neutral-300\" />,\n uncheckedIcon: <CodeIcon fontSize={10} className=\"cursor-pointer !block text-neutral-700 dark:text-neutral-400\" />,\n }}\n />\n ) : null}\n <div className=\"flex items-center gap-0.5\">\n {renderToolbarActions?.({\n editor: editorRef.current,\n value,\n onChange,\n language,\n isEditMode,\n activeTab,\n })}\n {activeTab === \"Grid\" && isEditMode && withJsonGrid && (\n <span className=\"flex items-center justify-center border-r border-neutral-200 dark:border-neutral-700 mr-1.5 pr-1.5\">\n <Tooltip title=\"Add key\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-up\"\n onClick={() => setIsAddKeyModalOpen(true)}\n className={classNames(\n \"p-0.5 rounded-md flex items-center justify-center\",\n \"hover:bg-primary-100 hover:dark:bg-neutral-800 text-primary-600 dark:text-neutral-100\"\n )}\n >\n <AddIcon fontSize={16} />\n </button>\n </Tooltip>\n </span>\n )}\n {activeTab === \"Grid\" ? (\n <>\n <Tooltip title=\"Collapse all\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-up\"\n onClick={() => setAllExpanded(false)}\n className={hoverClass}\n >\n <KeyboardDoubleArrowUpIcon fontSize={16} />\n </button>\n </Tooltip>\n\n <Tooltip title=\"Expand all\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-down\"\n onClick={() => setAllExpanded(true)}\n className={hoverClass}\n >\n <KeyboardDoubleArrowDownIcon fontSize={16} />\n </button>\n </Tooltip>\n </>\n ) : null}\n {activeTab === \"JSON\" && withJsonGrid ? (\n <Tooltip title=\"Format\">\n <button\n type='button'\n id=\"btn-code-editor-format-code\"\n onClick={handleFormatCode}\n className={hoverClass}\n >\n <SubjectOutlinedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {withTheme && activeTab === \"JSON\" && withJsonGrid ? (\n <Tooltip\n title={editorTheme === \"vs\" ? \"Dark mode\" : \"Light mode\"}\n >\n <button\n type='button'\n id=\"btn-code-editor-with-theme\"\n onClick={() =>\n setEditorTheme(editorTheme === \"vs\" ? \"vs-dark\" : \"vs\")\n }\n className={hoverClass}\n >\n {editorTheme === \"vs\" ? (\n <DarkModeOutlinedIcon fontSize={14} />\n ) : (\n <LightModeOutlinedIcon fontSize={14} />\n )}\n </button>\n </Tooltip>\n ) : null}\n {(language === \"python\" || language === \"json\") && isShowCopy ? (\n <Tooltip title=\"Copy\">\n <button\n type='button'\n id=\"btn-code-editor-copy-code\"\n onClick={handleCopyCode}\n className={hoverClass}\n >\n <ContentPasteRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {(language === \"python\" || language === \"json\") &&\n isShowDownload ? (\n <Tooltip title=\"Download\">\n <button\n type='button'\n id=\"btn-code-editor-download-code\"\n onClick={handleDownloadCode}\n className={hoverClass}\n >\n <FileDownloadRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {withFullScreen ? (\n <Tooltip title=\"Fullscreen\">\n <button\n onClick={toggleFocusMode}\n type='button'\n id=\"btn-code-editor-fullscreen\"\n className={hoverClass}\n >\n <FullscreenRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n {activeTab === \"Grid\" && language === \"json\" ? (\n <div>\n <JsonGrid\n isFullScreen={fullScreenHandle?.active}\n allExpanded={allExpanded}\n toggleAll={() => setAllExpanded((prev) => !prev)}\n isEditMode={Boolean(isEditMode)}\n isDarkMode={theme === \"dark\"}\n style={{\n height: fullScreenHandle?.active ? \"100vh\" : height,\n }}\n value={value}\n onChange={onChange}\n setIsAddKeyModalOpen={setIsAddKeyModalOpen}\n isAddKeyModalOpen={isAddKeyModalOpen}\n />\n </div>\n ) : (\n <Editor\n height={fullScreenHandle?.active ? \"100vh\" : height}\n language={language}\n value={value}\n onChange={handleChange}\n theme={editorTheme}\n onMount={handleEditorDidMount}\n options={{\n fontSize: 16,\n folding: true,\n fontFamily: \"Menlo, Monaco, 'Courier New', monospace\",\n fontLigatures: true,\n readOnly: !isEditMode,\n }}\n />\n )}\n </div>\n </FullScreen>\n );\n};\n"],"names":["iconClass","classNames","AddIcon","fontSize","jsx","ContentPasteRoundedIcon","DarkModeOutlinedIcon","FileDownloadRoundedIcon","FullscreenRoundedIcon","KeyboardDoubleArrowDownIcon","KeyboardDoubleArrowUpIcon","LightModeOutlinedIcon","SubjectOutlinedIcon","CodeEditor","value","onChange","withFullScreen","withTheme","isEditMode","height","language","monacoEditor","isShowCopy","isShowDownload","setIsDisableSave","withJsonGrid","externalEditorTheme","externalSetEditorTheme","externalTheme","className","enableAutoFormatting","renderToolbarActions","onBlockClick","focusBlock","focusBlockTopLevelOnly","editorRef","useRef","internalEditorTheme","setInternalEditorTheme","useState","internalTheme","setInternalTheme","editorTheme","theme","setEditorTheme","newTheme","allExpanded","setAllExpanded","currentEditorModel","setCurrentEditorModel","monacoInstance","useMonaco","activeMonacoEditor","handleFormatPythonCode","pythonError","pythonLoading","usePythonSyntax","fullScreenHandle","useFullScreenHandle","activeTab","setActiveTab","isAddKeyModalOpen","setIsAddKeyModalOpen","isLanguageJson","toggleFocusMode","onBlockClickRef","detectBlock","useCallback","editor","lineNumber","column","model","getTextForRange","startLine","endLine","emitBlock","text","kind","parentBlock","foldingContrib","foldingModel","regions","totalLines","containingRanges","i","start","foldEnd","end","size","rawKind","a","b","innermost","outermost","j","r","position","brackets","openRange","closeRange","useEffect","allMatches","match","bestCol","m","lineContent","leadingSpaces","matchLine","matchCol","findAndHighlightBlock","bestStart","bestEnd","bestSize","handleEditorDidMount","initializeEditor","handleFormatCode","error","disposable","pos","handleFormatJsonCode","parsedJson","formattedJson","errorMessage","markerError","formatAction","handleChange","newValue","hoverClass","handleCopyCode","formattedCode","line","_error","toast","systemMessages","getConfig","code","sanitizeFilename","filename","fallback","handleDownloadCode","blob","url","anchor","extension","sanitizedExtension","FullScreen","jsxs","cn","Toggle","checked","GridOnIcon","CodeIcon","Tooltip","Fragment","JsonGrid","prev","Editor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeEditor.cjs.js","sources":["../../../../src/components/data-display/code-editor/CodeEditor.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport Editor, { type OnMount } from '@monaco-editor/react';\nimport classNames from 'classnames';\nimport { type FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { FullScreen, useFullScreenHandle } from 'react-full-screen';\nimport { toast } from 'react-toastify';\nimport { useMonaco } from '../../../hooks/useMonaco';\nimport { usePythonSyntax } from '../../../hooks/usePythonSyntax';\nimport { type CodeEditorProps } from '../../../types';\nimport { systemMessages } from '../../../utils/messageConstants';\nimport { JsonGrid } from './JsonGrid';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { Toggle } from '../../forms/toggle/Toggle';\nimport { cn } from '../../../lib/utils';\nimport { CodeIcon, GridOnIcon } from '../../icon';\n\n// Icon class styling (matching web portal)\nconst iconClass = classNames(\n 'text-neutral-600 cursor-pointer hover:text-neutral-800',\n 'dark:text-neutral-300 dark:hover:text-neutral-50'\n);\n\n// Material Icons converted to SVG components (matching web portal icons)\nconst AddIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </svg>\n);\n\nconst ContentPasteRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M19 2h-4.18C14.4.84 13.3 0 12 0S9.6.84 9.18 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z\" />\n </svg>\n);\n\nconst DarkModeOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M9.5 2c-1.82 0-3.53.5-5 1.35 2.99 1.73 5 4.95 5 8.65s-2.01 6.92-5 8.65c1.47.85 3.18 1.35 5 1.35 5.52 0 10-4.48 10-10S15.02 2 9.5 2z\" />\n </svg>\n);\n\nconst FileDownloadRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-5 5-5-5h3V4h4v7h3z\" />\n </svg>\n);\n\nconst FullscreenRoundedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\n </svg>\n);\n\nconst KeyboardDoubleArrowDownIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M18 6.41 16.59 5 12 9.58 7.41 5 6 6.41l6 6z\" />\n <path d=\"m18 13-1.41-1.41L12 16.17l-4.59-4.58L6 13l6 6z\" />\n </svg>\n);\n\nconst KeyboardDoubleArrowUpIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M6 17.59 7.41 19 12 14.42 16.59 19 18 17.59l-6-6z\" />\n <path d=\"m6 11 1.41 1.41L12 7.83l4.59 4.58L18 11l-6-6z\" />\n </svg>\n);\n\nconst LightModeOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M12 9c1.65 0 3 1.35 3 3s-1.35 3-3 3-3-1.35-3-3 1.35-3 3-3m0-2c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zM2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1zm18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1zM11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1zm0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1zM5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41L5.99 4.58zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41l-1.06-1.06zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0l1.06-1.06z\" />\n </svg>\n);\n\nconst SubjectOutlinedIcon = ({ fontSize }: { fontSize: number }) => (\n <svg width={fontSize} height={fontSize} viewBox=\"0 0 24 24\" fill=\"currentColor\" className={iconClass}>\n <path d=\"M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z\" />\n </svg>\n);\n\ntype TTabKey = 'JSON' | 'Grid';\n\nexport const CodeEditor: FC<CodeEditorProps> = ({\n value,\n onChange = () => false,\n withFullScreen = true,\n withTheme = true,\n isEditMode = false,\n height = \"55vh\",\n language = \"json\",\n monacoEditor,\n isShowCopy = true,\n isShowDownload = true,\n setIsDisableSave,\n withJsonGrid = true,\n editorTheme: externalEditorTheme,\n setEditorTheme: externalSetEditorTheme,\n theme: externalTheme,\n className,\n enableAutoFormatting = true,\n renderToolbarActions,\n onBlockClick,\n focusBlock,\n focusBlockTopLevelOnly = false,\n}) => {\n const editorRef = useRef<any>(null);\n\n // Internal theme state (used when not provided by parent)\n const [internalEditorTheme, setInternalEditorTheme] = useState<\n \"vs\" | \"vs-dark\"\n >(\"vs\");\n const [internalTheme, setInternalTheme] = useState<\"light\" | \"dark\">(\"light\");\n\n // Use external theme if provided, otherwise use internal\n const editorTheme = externalEditorTheme ?? internalEditorTheme;\n const theme = externalTheme ?? internalTheme;\n const setEditorTheme =\n externalSetEditorTheme ??\n ((newTheme: \"vs\" | \"vs-dark\") => {\n setInternalEditorTheme(newTheme);\n setInternalTheme(newTheme === \"vs-dark\" ? \"dark\" : \"light\");\n });\n\n const [allExpanded, setAllExpanded] = useState<boolean>(false);\n const [currentEditorModel, setCurrentEditorModel] = useState<any>(null);\n const monacoInstance = useMonaco();\n\n // Use provided monacoEditor prop or fall back to our managed instance\n const activeMonacoEditor = monacoEditor || monacoInstance;\n\n const {\n handleFormatCode: handleFormatPythonCode,\n pythonError,\n pythonLoading,\n } = usePythonSyntax({\n code: value,\n setCode: onChange,\n currentEditorModel,\n monacoEditor: activeMonacoEditor,\n enable: isEditMode === true && language === \"python\",\n });\n\n const fullScreenHandle = useFullScreenHandle();\n const [activeTab, setActiveTab] = useState<TTabKey>(\"JSON\");\n const [isAddKeyModalOpen, setIsAddKeyModalOpen] = useState(false);\n const isLanguageJson = language === \"json\";\n\n const toggleFocusMode = () => {\n if (fullScreenHandle?.active) {\n fullScreenHandle.exit();\n } else {\n fullScreenHandle.enter();\n }\n };\n\n const onBlockClickRef = useRef(onBlockClick);\n onBlockClickRef.current = onBlockClick;\n\n const detectBlock = useCallback(\n async (editor: any, lineNumber: number, column: number) => {\n if (!onBlockClickRef.current) return;\n\n const model = editor.getModel();\n if (!model) return;\n\n const getTextForRange = (startLine: number, endLine: number) =>\n model.getValueInRange({\n startLineNumber: startLine,\n startColumn: 1,\n endLineNumber: endLine,\n endColumn: model.getLineMaxColumn(endLine),\n });\n\n const emitBlock = (\n startLine: number,\n endLine: number,\n text: string,\n kind?: string,\n parentBlock?: { startLine: number; endLine: number; text: string; kind?: string }\n ) => {\n onBlockClickRef.current!({\n startLine,\n endLine,\n text,\n kind,\n cursorLine: lineNumber,\n cursorColumn: column,\n parentBlock,\n });\n };\n\n try {\n const foldingContrib = editor.getContribution(\n \"editor.contrib.folding\"\n );\n if (foldingContrib) {\n const foldingModel = await (foldingContrib as any).getFoldingModel();\n if (foldingModel?.regions) {\n const regions = foldingModel.regions;\n const totalLines = model.getLineCount();\n\n // Collect all folding ranges that contain the cursor line\n const containingRanges: {\n start: number;\n end: number;\n size: number;\n kind?: string;\n }[] = [];\n\n for (let i = 0; i < regions.length; i++) {\n const start = regions.getStartLineNumber(i);\n const foldEnd = regions.getEndLineNumber(i);\n const end = Math.min(foldEnd + 1, totalLines);\n const size = end - start;\n\n if (lineNumber >= start && lineNumber <= end) {\n const rawKind = regions.getType(i);\n const kind =\n rawKind === 1\n ? \"comment\"\n : rawKind === 2\n ? \"imports\"\n : rawKind === 3\n ? \"region\"\n : undefined;\n containingRanges.push({ start, end, size, kind });\n }\n }\n\n if (containingRanges.length > 0) {\n // Sort by size: smallest first (innermost) → largest last (outermost)\n containingRanges.sort((a, b) => a.size - b.size);\n\n const innermost = containingRanges[0];\n const text = getTextForRange(innermost.start, innermost.end);\n\n // Find the outermost block that isn't the root document range.\n // Walk from largest to smallest, skip any range that starts at\n // line 1 and ends at the last line (that's the root `{}`).\n let outermost: typeof containingRanges[number] | undefined;\n for (let j = containingRanges.length - 1; j > 0; j--) {\n const r = containingRanges[j];\n const isRoot = r.start <= 1 && r.end >= totalLines;\n if (!isRoot) {\n outermost = r;\n break;\n }\n }\n\n const parentBlock =\n outermost && outermost !== innermost\n ? {\n startLine: outermost.start,\n endLine: outermost.end,\n text: getTextForRange(outermost.start, outermost.end),\n kind: outermost.kind,\n }\n : undefined;\n\n emitBlock(innermost.start, innermost.end, text, innermost.kind, parentBlock);\n return;\n }\n }\n }\n\n // Bracket matching fallback — no parent detection available\n const position = { lineNumber, column };\n const brackets = model.bracketPairs?.findEnclosingBrackets?.(position);\n\n if (brackets && brackets.length === 2) {\n const [openRange, closeRange] = brackets;\n const startLine = openRange.startLineNumber;\n const endLine = closeRange.endLineNumber;\n const text = getTextForRange(startLine, endLine);\n emitBlock(startLine, endLine, text);\n return;\n }\n\n // Full document fallback\n const totalLines = model.getLineCount();\n const text = model.getValue();\n emitBlock(1, totalLines, text);\n } catch {\n // Editor not ready — ignore silently\n }\n },\n []\n );\n\n // Navigate to a block when focusBlock changes\n useEffect(() => {\n if (!focusBlock || !editorRef.current) return;\n\n const editor = editorRef.current;\n const model = editor.getModel();\n if (!model) return;\n\n const allMatches = model.findMatches(\n focusBlock,\n true,\n false,\n true,\n null,\n false\n );\n\n if (allMatches.length === 0) return;\n\n let match = allMatches[0];\n\n if (focusBlockTopLevelOnly && allMatches.length > 1) {\n // A top-level key in formatted JSON has minimal leading whitespace\n // (one indent level). Find the match closest to column 1.\n let bestCol = Infinity;\n for (const m of allMatches) {\n const lineContent = model.getLineContent(m.range.startLineNumber);\n const leadingSpaces = lineContent.length - lineContent.trimStart().length;\n if (leadingSpaces < bestCol) {\n bestCol = leadingSpaces;\n match = m;\n }\n }\n }\n\n const matchLine = match.range.startLineNumber;\n const matchCol = match.range.startColumn;\n\n // Move cursor to the match with smooth scroll\n editor.setPosition({ lineNumber: matchLine, column: matchCol });\n editor.revealLineInCenter(matchLine, 1);\n\n // Find the enclosing block and highlight it\n const findAndHighlightBlock = async () => {\n try {\n // Try folding ranges first\n const foldingContrib = editor.getContribution(\n \"editor.contrib.folding\"\n );\n if (foldingContrib) {\n const foldingModel = await (foldingContrib as any).getFoldingModel();\n if (foldingModel?.regions) {\n const regions = foldingModel.regions;\n let bestStart = -1;\n let bestEnd = -1;\n let bestSize = Infinity;\n\n for (let i = 0; i < regions.length; i++) {\n const start = regions.getStartLineNumber(i);\n const foldEnd = regions.getEndLineNumber(i);\n const end = Math.min(foldEnd + 1, model.getLineCount());\n const size = end - start;\n\n if (\n matchLine >= start &&\n matchLine <= end &&\n size < bestSize\n ) {\n bestStart = start;\n bestEnd = end;\n bestSize = size;\n }\n }\n\n if (bestStart !== -1) {\n editor.setSelection({\n startLineNumber: bestStart,\n startColumn: 1,\n endLineNumber: bestEnd,\n endColumn: model.getLineMaxColumn(bestEnd),\n });\n editor.revealRangeInCenter({\n startLineNumber: bestStart,\n startColumn: 1,\n endLineNumber: bestEnd,\n endColumn: model.getLineMaxColumn(bestEnd),\n }, 1);\n return;\n }\n }\n }\n\n // Fall back to bracket matching\n const position = { lineNumber: matchLine, column: matchCol };\n const brackets =\n model.bracketPairs?.findEnclosingBrackets?.(position);\n\n if (brackets && brackets.length === 2) {\n const [openRange, closeRange] = brackets;\n editor.setSelection({\n startLineNumber: openRange.startLineNumber,\n startColumn: 1,\n endLineNumber: closeRange.endLineNumber,\n endColumn: model.getLineMaxColumn(closeRange.endLineNumber),\n });\n editor.revealRangeInCenter({\n startLineNumber: openRange.startLineNumber,\n startColumn: 1,\n endLineNumber: closeRange.endLineNumber,\n endColumn: model.getLineMaxColumn(closeRange.endLineNumber),\n }, 1);\n return;\n }\n\n // Last resort — just highlight the matched text\n editor.setSelection(match.range);\n } catch {\n // Folding model not ready — just highlight the match\n editor.setSelection(match.range);\n }\n };\n\n // Small delay to let folding model compute after content may have changed\n requestAnimationFrame(() => {\n findAndHighlightBlock();\n });\n }, [focusBlock, focusBlockTopLevelOnly]);\n\n const handleEditorDidMount: OnMount = (editor) => {\n editorRef.current = editor;\n\n const initializeEditor = () => {\n try {\n if (language === \"python\") {\n const model = editor.getModel();\n if (model) {\n setCurrentEditorModel(model);\n }\n }\n\n if (language === \"json\" && enableAutoFormatting) {\n requestAnimationFrame(() => {\n handleFormatCode();\n });\n }\n } catch (error) {\n console.warn(\"Failed to initialize editor:\", error);\n }\n };\n\n if (editor.getModel()) {\n initializeEditor();\n } else {\n const disposable = editor.onDidChangeModel(() => {\n initializeEditor();\n disposable.dispose();\n });\n }\n\n // Detect block on mouse click — use onMouseDown + small delay so cursor\n // position is settled before we read it\n if (onBlockClickRef.current) {\n editor.onMouseDown(() => {\n requestAnimationFrame(() => {\n const pos = editor.getPosition();\n if (pos) {\n detectBlock(editor, pos.lineNumber, pos.column);\n }\n });\n });\n }\n };\n\n const handleFormatJsonCode = () => {\n try {\n const parsedJson = JSON.parse(value);\n const formattedJson = JSON.stringify(parsedJson, null, 4);\n onChange(formattedJson);\n\n // Also update the editor model if it exists\n if (currentEditorModel && activeMonacoEditor) {\n activeMonacoEditor.editor.setModelMarkers(\n currentEditorModel,\n \"json\",\n []\n );\n }\n } catch (error) {\n // Display error visually instead of logging to console\n if (currentEditorModel && activeMonacoEditor) {\n const errorMessage =\n error instanceof Error ? error.message : \"Invalid JSON\";\n try {\n activeMonacoEditor.editor.setModelMarkers(\n currentEditorModel,\n \"json\",\n [\n {\n startLineNumber: 1,\n startColumn: 1,\n endLineNumber: 1,\n endColumn: 1,\n message: `Cannot format: ${errorMessage}`,\n severity: activeMonacoEditor.MarkerSeverity.Error,\n },\n ]\n );\n } catch (markerError) {\n console.warn(\"Failed to set JSON error markers:\", markerError);\n }\n }\n }\n };\n\n const handleFormatCode = () => {\n if (language === \"python\") {\n handleFormatPythonCode();\n return;\n }\n\n if (language === \"json\") {\n handleFormatJsonCode();\n return;\n }\n\n if (editorRef.current) {\n try {\n const formatAction = editorRef.current.getAction(\n \"editor.action.formatDocument\"\n );\n if (formatAction) {\n formatAction.run();\n }\n } catch (error) {\n console.warn(\"Failed to format document:\", error);\n }\n }\n };\n\n const handleChange = (newValue: string | undefined) => {\n if (typeof newValue === \"string\") {\n onChange(newValue);\n }\n };\n\n useEffect(() => {\n if (setIsDisableSave) {\n setIsDisableSave(pythonError || pythonLoading);\n }\n }, [pythonError, pythonLoading, setIsDisableSave]);\n\n // Don't render the editor until Monaco is ready (unless we have a provided instance)\n if (!monacoEditor && !monacoInstance) {\n return (\n <div className=\"flex items-center justify-center p-8 border border-neutral-200 dark:border-neutral-700 rounded-lg\">\n <div className=\"text-neutral-600 dark:text-neutral-400\">\n Loading editor...\n </div>\n </div>\n );\n }\n\n const hoverClass = classNames(\n \"hover:bg-neutral-300 hover:dark:bg-neutral-700 p-0.5 rounded-md flex items-center justify-center\"\n );\n\n const handleCopyCode = () => {\n if (language === \"python\") {\n try {\n let formattedCode = value;\n if (formattedCode) {\n formattedCode = formattedCode\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\");\n formattedCode = formattedCode\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .join(\"\\n\");\n formattedCode = formattedCode.replace(/\\n+$/, \"\") + \"\\n\";\n }\n\n navigator?.clipboard\n ?.writeText(formattedCode)\n .then(() => {\n // show success toast (kept silent as in web portal)\n })\n .catch((_error: unknown) => {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Python Code\"),\n {\n toastId: systemMessages.copyFailure(\"Python Code\"),\n }\n );\n });\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Python Code\"),\n {\n toastId: systemMessages.copyFailure(\"Python Code\"),\n }\n );\n }\n } else if (language === \"json\") {\n try {\n const parsedJson = JSON.parse(value);\n const formattedJson = JSON.stringify(parsedJson, null, 4);\n navigator?.clipboard?.writeText(formattedJson);\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(error?.message || systemMessages.copyFailure(\"JSON Code\"), {\n toastId: systemMessages.copyFailure(\"JSON Code\"),\n });\n }\n } else {\n navigator?.clipboard?.writeText(value);\n }\n };\n\n const getConfig = (code: string) => {\n if (code === \"python\") {\n return {\n type: \"text/x-python\",\n extension: \"py\",\n };\n }\n if (code === \"json\") {\n return {\n type: \"application/json\",\n extension: \"json\",\n };\n }\n return {\n type: \"text/plain\",\n extension: \"txt\",\n };\n };\n\n // Sanitize filename utility (matching web portal implementation)\n const sanitizeFilename = (filename: string, fallback: string): string => {\n // Remove or replace potentially dangerous characters\n const sanitized = filename\n .replace(/[<>:\"/\\\\|?*\\x00-\\x1f]/g, \"_\") // Replace illegal chars\n .replace(/\\.{2,}/g, \".\") // Replace multiple dots\n .replace(/^\\.+|\\.+$/g, \"\") // Remove leading/trailing dots\n .trim();\n\n return sanitized || fallback;\n };\n\n const handleDownloadCode = () => {\n try {\n const blob = new Blob([value], { type: getConfig(language)?.type });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n const extension = getConfig(language)?.extension || \"txt\";\n const sanitizedExtension = sanitizeFilename(extension, \"txt\");\n anchor.download = sanitizeFilename(\n `code_${Date.now()}.${sanitizedExtension}`,\n `code_${Date.now()}.${sanitizedExtension}`\n );\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(url);\n } catch (_error: unknown) {\n const error = _error as Error;\n toast.error(\n error?.message || systemMessages.copyFailure(\"Code download\"),\n {\n toastId: systemMessages.copyFailure(\"Code download\"),\n }\n );\n }\n };\n\n return (\n <FullScreen handle={fullScreenHandle} className=\"h-full\">\n <div\n className={cn(\n \"relative border border-neutral-200 dark:border-neutral-700 rounded-lg h-full overflow-hidden\",\n className\n )}\n id=\"code-editor-container-with-json-grid\"\n >\n <div\n className={classNames(\n `px-3 py-2 flex items-center bg-neutral-50 dark:bg-neutral-800`,\n // withJsonGrid\n // ? \"border-none\"\n // : \"border-b border-neutral-200 dark:border-neutral-700\",\n \"border-b border-neutral-200 dark:border-neutral-700\",\n isLanguageJson ? \"justify-between\" : \"justify-end\"\n )}\n >\n {isLanguageJson && withJsonGrid ? (\n <Toggle\n isChecked={activeTab === \"Grid\"}\n onChange={(checked) => setActiveTab(checked ? \"Grid\" : \"JSON\")}\n statusText=''\n hideStatus\n withIcon\n tooltip={activeTab === \"JSON\" ? \"Grid view\" : \"Code view\"}\n icon={{\n checkedIcon: <GridOnIcon className=\"cursor-pointer !block text-primary-600 dark:text-neutral-300 h-2xs w-2xs lg:h-xs lg:w-xs\" />,\n uncheckedIcon: <CodeIcon className=\"cursor-pointer !block text-neutral-700 dark:text-neutral-400 h-2xs w-2xs lg:h-xs lg:w-xs\" />,\n }}\n />\n ) : null}\n <div className=\"flex items-center gap-0.5\">\n {renderToolbarActions?.({\n editor: editorRef.current,\n value,\n onChange,\n language,\n isEditMode,\n activeTab,\n })}\n {activeTab === \"Grid\" && isEditMode && withJsonGrid && (\n <span className=\"flex items-center justify-center border-r border-neutral-200 dark:border-neutral-700 mr-1.5 pr-1.5\">\n <Tooltip title=\"Add key\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-up\"\n onClick={() => setIsAddKeyModalOpen(true)}\n className={classNames(\n \"p-0.5 rounded-md flex items-center justify-center\",\n \"hover:bg-primary-100 hover:dark:bg-neutral-800 text-primary-600 dark:text-neutral-100\"\n )}\n >\n <AddIcon fontSize={16} />\n </button>\n </Tooltip>\n </span>\n )}\n {activeTab === \"Grid\" ? (\n <>\n <Tooltip title=\"Collapse all\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-up\"\n onClick={() => setAllExpanded(false)}\n className={hoverClass}\n >\n <KeyboardDoubleArrowUpIcon fontSize={16} />\n </button>\n </Tooltip>\n\n <Tooltip title=\"Expand all\">\n <button\n type='button'\n id=\"btn-code-editor-json-grid-down\"\n onClick={() => setAllExpanded(true)}\n className={hoverClass}\n >\n <KeyboardDoubleArrowDownIcon fontSize={16} />\n </button>\n </Tooltip>\n </>\n ) : null}\n {activeTab === \"JSON\" && withJsonGrid ? (\n <Tooltip title=\"Format\">\n <button\n type='button'\n id=\"btn-code-editor-format-code\"\n onClick={handleFormatCode}\n className={hoverClass}\n >\n <SubjectOutlinedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {withTheme && activeTab === \"JSON\" && withJsonGrid ? (\n <Tooltip\n title={editorTheme === \"vs\" ? \"Dark mode\" : \"Light mode\"}\n >\n <button\n type='button'\n id=\"btn-code-editor-with-theme\"\n onClick={() =>\n setEditorTheme(editorTheme === \"vs\" ? \"vs-dark\" : \"vs\")\n }\n className={hoverClass}\n >\n {editorTheme === \"vs\" ? (\n <DarkModeOutlinedIcon fontSize={14} />\n ) : (\n <LightModeOutlinedIcon fontSize={14} />\n )}\n </button>\n </Tooltip>\n ) : null}\n {(language === \"python\" || language === \"json\") && isShowCopy ? (\n <Tooltip title=\"Copy\">\n <button\n type='button'\n id=\"btn-code-editor-copy-code\"\n onClick={handleCopyCode}\n className={hoverClass}\n >\n <ContentPasteRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {(language === \"python\" || language === \"json\") &&\n isShowDownload ? (\n <Tooltip title=\"Download\">\n <button\n type='button'\n id=\"btn-code-editor-download-code\"\n onClick={handleDownloadCode}\n className={hoverClass}\n >\n <FileDownloadRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n {withFullScreen ? (\n <Tooltip title=\"Fullscreen\">\n <button\n onClick={toggleFocusMode}\n type='button'\n id=\"btn-code-editor-fullscreen\"\n className={hoverClass}\n >\n <FullscreenRoundedIcon fontSize={14} />\n </button>\n </Tooltip>\n ) : null}\n </div>\n </div>\n\n {activeTab === \"Grid\" && language === \"json\" ? (\n <div>\n <JsonGrid\n isFullScreen={fullScreenHandle?.active}\n allExpanded={allExpanded}\n toggleAll={() => setAllExpanded((prev) => !prev)}\n isEditMode={Boolean(isEditMode)}\n isDarkMode={theme === \"dark\"}\n style={{\n height: fullScreenHandle?.active ? \"100vh\" : height,\n }}\n value={value}\n onChange={onChange}\n setIsAddKeyModalOpen={setIsAddKeyModalOpen}\n isAddKeyModalOpen={isAddKeyModalOpen}\n />\n </div>\n ) : (\n <Editor\n height={fullScreenHandle?.active ? \"100vh\" : height}\n language={language}\n value={value}\n onChange={handleChange}\n theme={editorTheme}\n onMount={handleEditorDidMount}\n options={{\n fontSize: 16,\n folding: true,\n fontFamily: \"Menlo, Monaco, 'Courier New', monospace\",\n fontLigatures: true,\n readOnly: !isEditMode,\n }}\n />\n )}\n </div>\n </FullScreen>\n );\n};\n"],"names":["iconClass","classNames","AddIcon","fontSize","jsx","ContentPasteRoundedIcon","DarkModeOutlinedIcon","FileDownloadRoundedIcon","FullscreenRoundedIcon","KeyboardDoubleArrowDownIcon","KeyboardDoubleArrowUpIcon","LightModeOutlinedIcon","SubjectOutlinedIcon","CodeEditor","value","onChange","withFullScreen","withTheme","isEditMode","height","language","monacoEditor","isShowCopy","isShowDownload","setIsDisableSave","withJsonGrid","externalEditorTheme","externalSetEditorTheme","externalTheme","className","enableAutoFormatting","renderToolbarActions","onBlockClick","focusBlock","focusBlockTopLevelOnly","editorRef","useRef","internalEditorTheme","setInternalEditorTheme","useState","internalTheme","setInternalTheme","editorTheme","theme","setEditorTheme","newTheme","allExpanded","setAllExpanded","currentEditorModel","setCurrentEditorModel","monacoInstance","useMonaco","activeMonacoEditor","handleFormatPythonCode","pythonError","pythonLoading","usePythonSyntax","fullScreenHandle","useFullScreenHandle","activeTab","setActiveTab","isAddKeyModalOpen","setIsAddKeyModalOpen","isLanguageJson","toggleFocusMode","onBlockClickRef","detectBlock","useCallback","editor","lineNumber","column","model","getTextForRange","startLine","endLine","emitBlock","text","kind","parentBlock","foldingContrib","foldingModel","regions","totalLines","containingRanges","i","start","foldEnd","end","size","rawKind","a","b","innermost","outermost","j","r","position","brackets","openRange","closeRange","useEffect","allMatches","match","bestCol","m","lineContent","leadingSpaces","matchLine","matchCol","findAndHighlightBlock","bestStart","bestEnd","bestSize","handleEditorDidMount","initializeEditor","handleFormatCode","error","disposable","pos","handleFormatJsonCode","parsedJson","formattedJson","errorMessage","markerError","formatAction","handleChange","newValue","hoverClass","handleCopyCode","formattedCode","line","_error","toast","systemMessages","getConfig","code","sanitizeFilename","filename","fallback","handleDownloadCode","blob","url","anchor","extension","sanitizedExtension","FullScreen","jsxs","cn","Toggle","checked","GridOnIcon","CodeIcon","Tooltip","Fragment","JsonGrid","prev","Editor"],"mappings":"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"}
|
|
@@ -44,9 +44,9 @@ const w = V(
|
|
|
44
44
|
focusBlock: $,
|
|
45
45
|
focusBlockTopLevelOnly: q = !1
|
|
46
46
|
}) => {
|
|
47
|
-
const
|
|
47
|
+
const S = re(null), [ge, be] = E("vs"), [ve, Ce] = E("light"), A = ae ?? ge, ye = he ?? ve, xe = ue ?? ((e) => {
|
|
48
48
|
be(e), Ce(e === "vs-dark" ? "dark" : "light");
|
|
49
|
-
}), [
|
|
49
|
+
}), [Ne, _] = E(!1), [H, Le] = E(null), Q = Be(), j = K || Q, {
|
|
50
50
|
handleFormatCode: ke,
|
|
51
51
|
pythonError: W,
|
|
52
52
|
pythonLoading: X
|
|
@@ -56,11 +56,11 @@ const w = V(
|
|
|
56
56
|
currentEditorModel: H,
|
|
57
57
|
monacoEditor: j,
|
|
58
58
|
enable: J === !0 && s === "python"
|
|
59
|
-
}), z = Te(), [
|
|
59
|
+
}), z = Te(), [N, Me] = E("JSON"), [we, Y] = E(!1), Z = s === "json", ze = () => {
|
|
60
60
|
z?.active ? z.exit() : z.enter();
|
|
61
61
|
}, B = re(U);
|
|
62
62
|
B.current = U;
|
|
63
|
-
const
|
|
63
|
+
const Fe = He(
|
|
64
64
|
async (e, n, r) => {
|
|
65
65
|
if (!B.current) return;
|
|
66
66
|
const c = e.getModel();
|
|
@@ -92,18 +92,18 @@ const w = V(
|
|
|
92
92
|
for (let i = 0; i < f.length; i++) {
|
|
93
93
|
const C = f.getStartLineNumber(i), m = f.getEndLineNumber(i), y = Math.min(m + 1, p), v = y - C;
|
|
94
94
|
if (n >= C && n <= y) {
|
|
95
|
-
const
|
|
95
|
+
const x = f.getType(i), oe = x === 1 ? "comment" : x === 2 ? "imports" : x === 3 ? "region" : void 0;
|
|
96
96
|
h.push({ start: C, end: y, size: v, kind: oe });
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
if (h.length > 0) {
|
|
100
|
-
h.sort((v,
|
|
100
|
+
h.sort((v, x) => v.size - x.size);
|
|
101
101
|
const i = h[0], C = d(i.start, i.end);
|
|
102
102
|
let m;
|
|
103
103
|
for (let v = h.length - 1; v > 0; v--) {
|
|
104
|
-
const
|
|
105
|
-
if (!(
|
|
106
|
-
m =
|
|
104
|
+
const x = h[v];
|
|
105
|
+
if (!(x.start <= 1 && x.end >= p)) {
|
|
106
|
+
m = x;
|
|
107
107
|
break;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -132,8 +132,8 @@ const w = V(
|
|
|
132
132
|
[]
|
|
133
133
|
);
|
|
134
134
|
ie(() => {
|
|
135
|
-
if (!$ || !
|
|
136
|
-
const e =
|
|
135
|
+
if (!$ || !S.current) return;
|
|
136
|
+
const e = S.current, n = e.getModel();
|
|
137
137
|
if (!n) return;
|
|
138
138
|
const r = n.findMatches(
|
|
139
139
|
$,
|
|
@@ -209,8 +209,8 @@ const w = V(
|
|
|
209
209
|
L();
|
|
210
210
|
});
|
|
211
211
|
}, [$, q]);
|
|
212
|
-
const
|
|
213
|
-
|
|
212
|
+
const Se = (e) => {
|
|
213
|
+
S.current = e;
|
|
214
214
|
const n = () => {
|
|
215
215
|
try {
|
|
216
216
|
if (s === "python") {
|
|
@@ -234,7 +234,7 @@ const w = V(
|
|
|
234
234
|
B.current && e.onMouseDown(() => {
|
|
235
235
|
requestAnimationFrame(() => {
|
|
236
236
|
const r = e.getPosition();
|
|
237
|
-
r &&
|
|
237
|
+
r && Fe(e, r.lineNumber, r.column);
|
|
238
238
|
});
|
|
239
239
|
});
|
|
240
240
|
}, je = () => {
|
|
@@ -277,9 +277,9 @@ const w = V(
|
|
|
277
277
|
je();
|
|
278
278
|
return;
|
|
279
279
|
}
|
|
280
|
-
if (
|
|
280
|
+
if (S.current)
|
|
281
281
|
try {
|
|
282
|
-
const e =
|
|
282
|
+
const e = S.current.getAction(
|
|
283
283
|
"editor.action.formatDocument"
|
|
284
284
|
);
|
|
285
285
|
e && e.run();
|
|
@@ -293,7 +293,7 @@ const w = V(
|
|
|
293
293
|
P && P(W || X);
|
|
294
294
|
}, [W, X, P]), !K && !Q)
|
|
295
295
|
return /* @__PURE__ */ t("div", { className: "flex items-center justify-center p-8 border border-neutral-200 dark:border-neutral-700 rounded-lg", children: /* @__PURE__ */ t("div", { className: "text-neutral-600 dark:text-neutral-400", children: "Loading editor..." }) });
|
|
296
|
-
const
|
|
296
|
+
const F = V(
|
|
297
297
|
"hover:bg-neutral-300 hover:dark:bg-neutral-700 p-0.5 rounded-md flex items-center justify-center"
|
|
298
298
|
), Ee = () => {
|
|
299
299
|
if (s === "python")
|
|
@@ -387,28 +387,28 @@ const w = V(
|
|
|
387
387
|
Z && T ? /* @__PURE__ */ t(
|
|
388
388
|
Ve,
|
|
389
389
|
{
|
|
390
|
-
isChecked:
|
|
390
|
+
isChecked: N === "Grid",
|
|
391
391
|
onChange: (e) => Me(e ? "Grid" : "JSON"),
|
|
392
392
|
statusText: "",
|
|
393
393
|
hideStatus: !0,
|
|
394
394
|
withIcon: !0,
|
|
395
|
-
tooltip:
|
|
395
|
+
tooltip: N === "JSON" ? "Grid view" : "Code view",
|
|
396
396
|
icon: {
|
|
397
|
-
checkedIcon: /* @__PURE__ */ t(_e, {
|
|
398
|
-
uncheckedIcon: /* @__PURE__ */ t($e, {
|
|
397
|
+
checkedIcon: /* @__PURE__ */ t(_e, { className: "cursor-pointer !block text-primary-600 dark:text-neutral-300 h-2xs w-2xs lg:h-xs lg:w-xs" }),
|
|
398
|
+
uncheckedIcon: /* @__PURE__ */ t($e, { className: "cursor-pointer !block text-neutral-700 dark:text-neutral-400 h-2xs w-2xs lg:h-xs lg:w-xs" })
|
|
399
399
|
}
|
|
400
400
|
}
|
|
401
401
|
) : null,
|
|
402
402
|
/* @__PURE__ */ O("div", { className: "flex items-center gap-0.5", children: [
|
|
403
403
|
pe?.({
|
|
404
|
-
editor:
|
|
404
|
+
editor: S.current,
|
|
405
405
|
value: o,
|
|
406
406
|
onChange: R,
|
|
407
407
|
language: s,
|
|
408
408
|
isEditMode: J,
|
|
409
|
-
activeTab:
|
|
409
|
+
activeTab: N
|
|
410
410
|
}),
|
|
411
|
-
|
|
411
|
+
N === "Grid" && J && T && /* @__PURE__ */ t("span", { className: "flex items-center justify-center border-r border-neutral-200 dark:border-neutral-700 mr-1.5 pr-1.5", children: /* @__PURE__ */ t(M, { title: "Add key", children: /* @__PURE__ */ t(
|
|
412
412
|
"button",
|
|
413
413
|
{
|
|
414
414
|
type: "button",
|
|
@@ -421,14 +421,14 @@ const w = V(
|
|
|
421
421
|
children: /* @__PURE__ */ t(Ke, { fontSize: 16 })
|
|
422
422
|
}
|
|
423
423
|
) }) }),
|
|
424
|
-
|
|
424
|
+
N === "Grid" ? /* @__PURE__ */ O(Re, { children: [
|
|
425
425
|
/* @__PURE__ */ t(M, { title: "Collapse all", children: /* @__PURE__ */ t(
|
|
426
426
|
"button",
|
|
427
427
|
{
|
|
428
428
|
type: "button",
|
|
429
429
|
id: "btn-code-editor-json-grid-up",
|
|
430
430
|
onClick: () => _(!1),
|
|
431
|
-
className:
|
|
431
|
+
className: F,
|
|
432
432
|
children: /* @__PURE__ */ t(Ye, { fontSize: 16 })
|
|
433
433
|
}
|
|
434
434
|
) }),
|
|
@@ -438,22 +438,22 @@ const w = V(
|
|
|
438
438
|
type: "button",
|
|
439
439
|
id: "btn-code-editor-json-grid-down",
|
|
440
440
|
onClick: () => _(!0),
|
|
441
|
-
className:
|
|
441
|
+
className: F,
|
|
442
442
|
children: /* @__PURE__ */ t(Xe, { fontSize: 16 })
|
|
443
443
|
}
|
|
444
444
|
) })
|
|
445
445
|
] }) : null,
|
|
446
|
-
|
|
446
|
+
N === "JSON" && T ? /* @__PURE__ */ t(M, { title: "Format", children: /* @__PURE__ */ t(
|
|
447
447
|
"button",
|
|
448
448
|
{
|
|
449
449
|
type: "button",
|
|
450
450
|
id: "btn-code-editor-format-code",
|
|
451
451
|
onClick: ee,
|
|
452
|
-
className:
|
|
452
|
+
className: F,
|
|
453
453
|
children: /* @__PURE__ */ t(et, { fontSize: 14 })
|
|
454
454
|
}
|
|
455
455
|
) }) : null,
|
|
456
|
-
ce &&
|
|
456
|
+
ce && N === "JSON" && T ? /* @__PURE__ */ t(
|
|
457
457
|
M,
|
|
458
458
|
{
|
|
459
459
|
title: A === "vs" ? "Dark mode" : "Light mode",
|
|
@@ -462,8 +462,8 @@ const w = V(
|
|
|
462
462
|
{
|
|
463
463
|
type: "button",
|
|
464
464
|
id: "btn-code-editor-with-theme",
|
|
465
|
-
onClick: () =>
|
|
466
|
-
className:
|
|
465
|
+
onClick: () => xe(A === "vs" ? "vs-dark" : "vs"),
|
|
466
|
+
className: F,
|
|
467
467
|
children: A === "vs" ? /* @__PURE__ */ t(qe, { fontSize: 14 }) : /* @__PURE__ */ t(Ze, { fontSize: 14 })
|
|
468
468
|
}
|
|
469
469
|
)
|
|
@@ -475,7 +475,7 @@ const w = V(
|
|
|
475
475
|
type: "button",
|
|
476
476
|
id: "btn-code-editor-copy-code",
|
|
477
477
|
onClick: Ee,
|
|
478
|
-
className:
|
|
478
|
+
className: F,
|
|
479
479
|
children: /* @__PURE__ */ t(Ue, { fontSize: 14 })
|
|
480
480
|
}
|
|
481
481
|
) }) : null,
|
|
@@ -485,7 +485,7 @@ const w = V(
|
|
|
485
485
|
type: "button",
|
|
486
486
|
id: "btn-code-editor-download-code",
|
|
487
487
|
onClick: Oe,
|
|
488
|
-
className:
|
|
488
|
+
className: F,
|
|
489
489
|
children: /* @__PURE__ */ t(Qe, { fontSize: 14 })
|
|
490
490
|
}
|
|
491
491
|
) }) : null,
|
|
@@ -495,7 +495,7 @@ const w = V(
|
|
|
495
495
|
onClick: ze,
|
|
496
496
|
type: "button",
|
|
497
497
|
id: "btn-code-editor-fullscreen",
|
|
498
|
-
className:
|
|
498
|
+
className: F,
|
|
499
499
|
children: /* @__PURE__ */ t(We, { fontSize: 14 })
|
|
500
500
|
}
|
|
501
501
|
) }) : null
|
|
@@ -503,11 +503,11 @@ const w = V(
|
|
|
503
503
|
]
|
|
504
504
|
}
|
|
505
505
|
),
|
|
506
|
-
|
|
506
|
+
N === "Grid" && s === "json" ? /* @__PURE__ */ t("div", { children: /* @__PURE__ */ t(
|
|
507
507
|
Ge,
|
|
508
508
|
{
|
|
509
509
|
isFullScreen: z?.active,
|
|
510
|
-
allExpanded:
|
|
510
|
+
allExpanded: Ne,
|
|
511
511
|
toggleAll: () => _((e) => !e),
|
|
512
512
|
isEditMode: !!J,
|
|
513
513
|
isDarkMode: ye === "dark",
|
|
@@ -527,7 +527,7 @@ const w = V(
|
|
|
527
527
|
value: o,
|
|
528
528
|
onChange: Ie,
|
|
529
529
|
theme: A,
|
|
530
|
-
onMount:
|
|
530
|
+
onMount: Se,
|
|
531
531
|
options: {
|
|
532
532
|
fontSize: 16,
|
|
533
533
|
folding: !0,
|