\r\n
0 ? \"\" : \"no-text-editor\"\r\n }\r\n style={{\r\n cursor: !editor?.isFocused ? 'move' : \"text\",\r\n width: isRightAngleTriangle ? \"50%\" : \"100%\",\r\n height: \"100%\",\r\n display: isShowBottomEditor ? \"none\" : \"flex\",\r\n justifyContent: isRightAngleTriangle\r\n ? \"left\"\r\n : \"center\",\r\n alignItems: \"center\",\r\n textAlign: \"center\",\r\n fontSize: node?.data?.style?.fontSize ?? (isTriangleNode ? 12 : 15),\r\n wordBreak: \"break-word\",\r\n maxHeight:\r\n `${node?.style?.height + 12\r\n }px !important` || \"100% !important\",\r\n pointerEvents: editor?.isFocused ? \"auto\" : 'none',\r\n lineHeight: 'normal'\r\n }}\r\n />\r\n
\r\n )\r\n})\r\n\r\nexport default CenterEditor","import React, { useMemo } from 'react'\r\nimport { leftCurlyNode, rightCurlyNode, thinNode } from './constants'\r\n\r\nconst BottomEditor = React.forwardRef(({ node, editor }, ref) => {\r\n const width = useMemo(() => {\r\n return node?.width + 40\r\n }, [node])\r\n return (\r\n
\r\n )\r\n})\r\n\r\nexport default BottomEditor","import React from 'react';\r\nimport UmlComponentBoxInner from '../../../Utils/Icons/shapes/uml/UmlComponentBoxInner';\r\nimport UmlComponentInner from '../../../Utils/Icons/shapes/uml/UmlComponentInner';\r\nimport { Box } from '@mui/material';\r\nimport { iconTypes } from '../const';\r\n\r\n\r\n\r\nconst UmlComponent = ({ node }) => {\r\n\r\n if (![\"Uml_Component_Box\", \"Uml_Component\"].includes(node?.data?.key)) return null;\r\n\r\n const UmlComponents = {\r\n Uml_Component_Box: {\r\n component: UmlComponentBoxInner,\r\n containerStyles: {\r\n position: \"absolute\",\r\n top: \"15px\",\r\n right: \"15px\",\r\n zIndex: 1,\r\n }\r\n },\r\n Uml_Component: {\r\n component: UmlComponentInner,\r\n containerStyles: {\r\n position: \"absolute\",\r\n top: \"50%\",\r\n transform: \"translateY(-50%)\",\r\n left: \"-12px\",\r\n zIndex: 1,\r\n }\r\n }\r\n }\r\n\r\n const RenderUmlComponent = UmlComponents[node?.data?.key].component;\r\n const containerStyles = UmlComponents[node?.data?.key].containerStyles;\r\n return (\r\n
\r\n \r\n \r\n )\r\n}\r\n\r\nexport default React.memo(UmlComponent)","import React, { useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { Box } from \"@mui/material\";\r\nimport { useReactFlow, useUpdateNodeInternals } from \"reactflow\";\r\nimport { useLocation, useParams } from \"react-router-dom\";\r\n\r\nimport { useSelector, useDispatch } from \"react-redux\";\r\nimport { useUndoRedo } from \"../dndUndoRedo/UndoRedoProvider\";\r\nimport {\r\n removeHTMLTags,\r\n updateJson,\r\n} from \"../../../CommanFunctions/commanFunctions\";\r\nimport { debounce, omit, throttle } from \"lodash\";\r\nimport { useEditor } from \"@tiptap/react\";\r\nimport MindMapNodesToolbar from \"../../Node/common-components/nodeTopToolbar/MindMapNodesToolbar/MindMapNodesToolbar\";\r\nimport { iconTypes } from \"../const\";\r\nimport { Icons } from \"../../../Utils/Icons\";\r\nimport * as ICONS from \"../../../Utils/Icons\"; // new logic load component\r\nimport VotingCommon from \"../../mind-map/VotingCommon\";\r\nimport {\r\n editorDisabled,\r\n iconMapping,\r\n leftCurlyNode,\r\n noEditorShow,\r\n rightCurlyNode,\r\n ShapesForBottomEditor,\r\n} from \"./constants\";\r\nimport { tipTapExtensions } from \"../tip-tap-editor\";\r\nimport useZoomPercentages from \"../../../Utils/hooks/useZoomPercentages\";\r\nimport CustomNodeResizeControl from \"./CustomNodeResizeControl\";\r\nimport CustomNodeHandles from \"./CustomNodeHandles\";\r\nimport CenterEditor from \"./CenterEditor\";\r\nimport BottomEditor from \"./BottomEditor\";\r\nimport UmlComponent from \"./UmlComponent\";\r\nimport clsx from \"clsx\";\r\nimport { sanitizeHtml, updateLocalStorage } from \"../utils\";\r\nimport useNodeSelectionStarted from \"../../../Utils/hooks/useNodeSelectionStarted\";\r\nimport { color } from \"../../../Utils/style/color/color\";\r\n\r\nconst ResizableNodeSelected = ({ id: nodeId, data }) => {\r\n const { setNodes, getNodes, getNode } = useReactFlow();\r\n const node = getNode(nodeId);\r\n const location = useLocation();\r\n const { permission, showExport, copyAsImage, isDownload } = useSelector(\r\n (state) => state?.mindMapStore\r\n );\r\n const startVoting = useSelector(\r\n ({ archBoard }) => archBoard?.votingData?.startVotingSession\r\n );\r\n\r\n const { isNodeSelectionStarted } = useNodeSelectionStarted({\r\n selected: node?.selected,\r\n });\r\n\r\n const { id } = useParams();\r\n const user_data = localStorage.getItem(\"user_data\");\r\n const { undo, takeSnapshot } = useUndoRedo();\r\n const dispatch = useDispatch();\r\n const mainRef = useRef(null);\r\n const textRef = useRef(null);\r\n\r\n const userRowData = localStorage.getItem(\"user_data\");\r\n const userData = userRowData ? JSON.parse(userRowData) : {};\r\n const selectedNodes = getNodes()?.filter((val) => val?.selected)?.length > 1;\r\n\r\n const { isItemToSmall } = useZoomPercentages({ selected: node.selected });\r\n\r\n const [showDots, setShowDots] = useState(false);\r\n\r\n const isAutoFont = false;\r\n // const isAutoFont = node?.data?.isAutoFont || true;\r\n\r\n const isShowBottomEditor = ShapesForBottomEditor?.includes(node?.name);\r\n const extensions = tipTapExtensions();\r\n const editorContentRef = useRef(node?.name);\r\n\r\n const shouldShowCenteredEditor =\r\n !noEditorShow?.includes(node?.name) &&\r\n node?.data?.provider === \"shapes\" &&\r\n !isShowBottomEditor;\r\n\r\n const shouldShowBottomEditor =\r\n (!node?.data?.isGroupHead && node?.data?.provider !== \"shapes\") ||\r\n isShowBottomEditor;\r\n\r\n const editor = useEditor(\r\n {\r\n element: textRef.current,\r\n editable: false,\r\n autofocus: true,\r\n extensions: extensions,\r\n content: sanitizeHtml(node?.data?.editorHTML, \"font-size\") ?? node?.name,\r\n onBlur: ({ editor }) => {\r\n editor.setEditable(false);\r\n\r\n if (editorContentRef.current !== editor?.getText()) {\r\n takeSnapshot({ nodes: getNodes(), edges: null });\r\n }\r\n },\r\n onUpdate: ({ editor }) => {\r\n if (\r\n node?.data?.provider === \"shapes\" &&\r\n editor?.getText() === node?.name\r\n )\r\n return;\r\n\r\n // onEditorUpdateAdjustFontSize();\r\n debouncedUpdateHTML(editor?.getHTML(), isAutoFont);\r\n },\r\n onFocus: ({ editor }) => {\r\n if (\r\n !node?.data?.editorHTML &&\r\n node?.data?.provider === \"shapes\" &&\r\n editor?.getText() === node?.name\r\n )\r\n editor.commands.clearContent();\r\n\r\n editorContentRef.current = editor.getText();\r\n },\r\n editorProps: {\r\n handlePaste: (view, event) => {\r\n const pastedContent = event.clipboardData.getData(\"text/plain\");\r\n try {\r\n JSON.parse(pastedContent);\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n },\r\n },\r\n },\r\n [textRef.current, node?.data?.hideDescriptions]\r\n );\r\n\r\n useEffect(() => {\r\n if (editor && !editor.isFocused && node?.data?.editorHTML) {\r\n editor.commands.setContent(\r\n sanitizeHtml(node?.data?.editorHTML, \"font-size\")\r\n );\r\n } else {\r\n if (!editor?.isFocused) editor?.commands?.setContent(node?.name);\r\n }\r\n }, [editor, node?.data?.editorHTML]);\r\n\r\n const updateFontSize = debounce((fontSize = null) => {\r\n setNodes((prev) => {\r\n const updatedNodes = prev?.map((prev) => {\r\n if (prev.id === node.id) {\r\n return {\r\n ...prev,\r\n data: {\r\n ...omit(prev.data, [\"lastFontSize\"]),\r\n isResized: true,\r\n style: {\r\n ...prev.data?.style,\r\n fontSize: fontSize || textRef?.current?.style?.fontSize,\r\n },\r\n },\r\n style: {\r\n ...omit(prev.style, [\"maxWidth\"]),\r\n fontSize: fontSize || textRef?.current?.style?.fontSize,\r\n },\r\n };\r\n }\r\n return prev;\r\n });\r\n\r\n updateLocalStorage(\r\n \"architectureJson\",\r\n JSON.stringify({\r\n architecture_json: {\r\n nodes: updatedNodes,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n nodes: updatedNodes,\r\n lastUpdatedBy: userData?.user_id,\r\n lastEvent: `editor_changed_${node?.id}`,\r\n },\r\n },\r\n id,\r\n dispatch,\r\n undo,\r\n takeSnapshot,\r\n a_id,\r\n });\r\n\r\n return updatedNodes;\r\n });\r\n }, 100);\r\n\r\n const debouncedUpdateHTML = useMemo(\r\n () =>\r\n debounce((value, isAutoFont) => {\r\n if (!editor?.getText()?.trim()?.length) return;\r\n if (!node.selected) return;\r\n const oldContent = sanitizeHtml(node?.data?.editorHTML, \"font-size\");\r\n const currentContent = sanitizeHtml(value, 'font-size');\r\n if (oldContent === currentContent) return;\r\n\r\n localStorage.setItem(\r\n \"architectureJson\",\r\n JSON.stringify({\r\n architecture_json: {\r\n nodes: getNodes(),\r\n lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n let updatedNode;\r\n const prev = getNodes()?.map((_) => {\r\n if (_?.id === node?.id) {\r\n _ = JSON.parse(JSON.stringify(_));\r\n _.data = {\r\n ...(omit(_?.data, [\"initial, lastFontSize\", \"editorState\"]) ||\r\n {}),\r\n isAiGenerated: false,\r\n editorHTML: currentContent,\r\n isAutoFont: isAutoFont,\r\n // style: {\r\n // ..._?.data?.style,\r\n // fontSize: textRef.current.style.fontSize\r\n // }\r\n };\r\n updatedNode = _;\r\n return _;\r\n } else {\r\n _ = JSON.parse(JSON.stringify(_));\r\n _.data = {\r\n ...(omit(_?.data, [\"editorState\"]) || {}),\r\n isAiGenerated: false,\r\n };\r\n return _;\r\n }\r\n });\r\n setNodes(prev);\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n\r\n const shouldTakeSnapshot =\r\n removeHTMLTags(oldContent) ===\r\n removeHTMLTags(currentContent)\r\n ? { takeSnapshot }\r\n : {};\r\n\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n nodes: prev,\r\n lastUpdatedBy: userData?.user_id,\r\n lastEvent: `editor_changed_${node?.id}`,\r\n },\r\n },\r\n id,\r\n dispatch,\r\n undo,\r\n ...shouldTakeSnapshot,\r\n a_id,\r\n });\r\n }, 500),\r\n [editor, node.selected, node?.data?.editorHTML, node?.id, getNodes, userData?.user_id, setNodes, location.search, takeSnapshot, id, dispatch, undo]\r\n );\r\n\r\n const onResizeEnd = (event, node) => {\r\n let parsedData = {};\r\n if (user_data) {\r\n parsedData = JSON.parse(user_data);\r\n }\r\n\r\n const nodes = getNodes().map((n) => {\r\n if (n.id === node.id) {\r\n return {\r\n ...n,\r\n data: {\r\n ...omit(n.data, [\"lastFontSize\"]),\r\n style: {\r\n ...n.data.style,\r\n fontSize:\r\n textRef.current.style.fontSize || node?.data?.style.fontSize,\r\n },\r\n },\r\n style: {\r\n ...n.style,\r\n fontSize: textRef.current.style.fontSize || node?.style.fontSize,\r\n },\r\n };\r\n }\r\n return n;\r\n });\r\n\r\n // Call updateJson once\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n // nodes: updatedNode,\r\n nodes: nodes,\r\n lastUpdatedBy: parsedData?.user_id,\r\n lastEvent: `editor_changed_${node?.id}`,\r\n },\r\n },\r\n id,\r\n dispatch,\r\n undo,\r\n a_id,\r\n takeSnapshot,\r\n });\r\n };\r\n\r\n const Icon = iconMapping?.[node?.data?.key];\r\n const ICON =\r\n ICONS[\"Icons\"]?.[node?.data.provider]?.[node?.data?.catagory]?.[\r\n node?.data?.key\r\n ]; // gettting icons component\r\n\r\n // useEffect(() => {\r\n // if (socket) {\r\n // socket.on(socketEvents.NODE_UPDATED, (data) => {\r\n // const jsonData = data?.architecture_json;\r\n // const currNode = jsonData?.nodes?.find((data) => data?.id === node?.id);\r\n // if (currNode) {\r\n // const currentNode =\r\n // jsonData?.lastEvent === `editor_changed_${node?.id}`\r\n // ? jsonData?.nodes?.find((val) => val?.id === node?.id)\r\n // : null;\r\n // if (\r\n // jsonData?.lastUpdatedBy !== userData?.user_id &&\r\n // currentNode?.data?.editorHTML &&\r\n // currentNode?.data?.editorHTML !== editor?.getHTML()\r\n // ) {\r\n // editor.commands.setContent(sanitizeHtml(currentNode?.data?.editorHTML));\r\n // setSocketCount((prev) => prev + 1);\r\n // }\r\n // }\r\n // });\r\n // }\r\n // }, [node?.id, socket]);\r\n\r\n const [imageData, setImageData] = useState(null);\r\n\r\n useEffect(() => {\r\n const fetchImageData = async () => {\r\n try {\r\n const response = await fetch(node?.data?.url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch image: ${response.statusText}`);\r\n }\r\n\r\n const blob = await response.blob();\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const base64Data = reader.result;\r\n // const imageType = response.headers.get(\"content-type\");\r\n\r\n setImageData(base64Data);\r\n };\r\n\r\n reader.readAsDataURL(blob);\r\n } catch (error) { }\r\n };\r\n if (node?.data?.url) {\r\n fetchImageData();\r\n }\r\n }, [node?.data?.url]);\r\n\r\n let fileType = \"\";\r\n const nodeUrl = node?.data?.url;\r\n if (nodeUrl) {\r\n const imageTypes = [\"jpeg\", \"png\", \"jpg\", \"svg\", \"gif\"];\r\n const splittedStr = nodeUrl?.split(\".\");\r\n const extension = splittedStr?.[splittedStr?.length - 1];\r\n fileType =\r\n imageTypes?.includes(extension) ||\r\n nodeUrl?.includes(\"giphy\") ||\r\n nodeUrl?.includes(\"bing\") ||\r\n node?.data?.urlType === \"image\"\r\n ? \"image\"\r\n : \"video\";\r\n }\r\n\r\n const borderWidth = node?.data?.border?.width;\r\n const borderStyle = node?.data?.border?.type;\r\n const borderColor = node?.data?.border?.borderColor;\r\n const opacity = node?.data?.border?.opacity;\r\n\r\n const adjustOpacity = (rgba, newOpacity) => {\r\n const parts = rgba.match(/rgba?\\((\\d+), (\\d+), (\\d+), ([\\d.]+)\\)/);\r\n if (!parts) return rgba;\r\n return `rgba(${parts[1]}, ${parts[2]}, ${parts[3]}, ${newOpacity})`;\r\n };\r\n\r\n const newBorderColor =\r\n borderColor && opacity ? adjustOpacity(borderColor, opacity) : \"\";\r\n\r\n const showNodeHandles =\r\n !node?.data?.locked &&\r\n !node?.dragging &&\r\n !showExport &&\r\n !isItemToSmall &&\r\n !copyAsImage &&\r\n !isDownload;\r\n\r\n const showResizeControlHandles =\r\n !node?.data?.locked &&\r\n node?.selected &&\r\n !showExport &&\r\n !isItemToSmall &&\r\n !isNodeSelectionStarted &&\r\n !copyAsImage &&\r\n !isDownload;\r\n\r\n useEffect(() => {\r\n if (node.data.locked) return;\r\n if (!editor) return;\r\n if (!node.selected) {\r\n editor.setEditable(false);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [node.selected, editor]);\r\n\r\n useEffect(() => {\r\n const currentNodeDom = document.querySelector(`[data-id=\"${nodeId}\"]`);\r\n if (!currentNodeDom || !editor) return;\r\n\r\n const handleNodeKeyDown = (e) => {\r\n if (!node.selected) return; // Prevent typing if node is not selected\r\n const isValidKey = /^[a-zA-Z\\d~!@#$%^&*()_+\\-={}\\[\\]|\\\\:;\"'<>,.?/]$/.test(\r\n e.key\r\n );\r\n\r\n if (!editor.isFocused && isValidKey) {\r\n editor.setEditable(true); // Enable editing\r\n editor.commands.clearContent(); // Clear existing content\r\n editor.commands.focus(\"end\"); // Focus on the editor\r\n editor.commands.insertContent(e.key);\r\n }\r\n };\r\n\r\n if (node.selected && !editor?.isEditable && !editor?.isFocused) {\r\n currentNodeDom.addEventListener(\"keydown\", handleNodeKeyDown, {\r\n once: true,\r\n });\r\n }\r\n if (!node.selected) {\r\n currentNodeDom.removeEventListener(\"keydown\", handleNodeKeyDown);\r\n }\r\n return () => {\r\n currentNodeDom.removeEventListener(\"keydown\", handleNodeKeyDown);\r\n if (!node.selected) {\r\n editor.setEditable(false);\r\n }\r\n };\r\n }, [node.selected, editor, nodeId]);\r\n\r\n const handleSingleClick = () => {\r\n if (node.data.locked) return;\r\n if (editor.isEditable) return;\r\n if (!node.selected) return;\r\n if (noEditorShow?.includes(node?.name)) return;\r\n if (node?.data?.hideDescriptions) return;\r\n editor.setEditable(true);\r\n if (!editor.isFocused) {\r\n editor.commands.focus(\"end\");\r\n }\r\n };\r\n\r\n const handleDoubleClick = () => {\r\n if (node.data.locked) return;\r\n if (noEditorShow?.includes(node?.name)) return;\r\n if (node?.data?.hideDescriptions) return;\r\n editor.setEditable(true);\r\n editor.commands.selectAll();\r\n };\r\n\r\n useEffect(() => {\r\n if (node.data.locked) editor?.setEditable(false);\r\n }, [node.data.locked, editor]);\r\n\r\n const shouldRenderToolbar =\r\n node.selected &&\r\n !node.dragging &&\r\n !isNodeSelectionStarted &&\r\n !selectedNodes &&\r\n editor &&\r\n !startVoting &&\r\n !editorDisabled?.includes(node.name);\r\n\r\n const onEditorUpdateAdjustFontSize = (fontSize = 100) => {\r\n if (!node.selected) return;\r\n if (shouldShowBottomEditor) return;\r\n if (!isAutoFont) return;\r\n\r\n const container = document.querySelector(`#sticky_notes_${node?.id}`);\r\n const textElement = textRef.current;\r\n if (container && textElement) {\r\n const containerWidth = container.offsetWidth;\r\n const containerHeight = container.offsetHeight;\r\n\r\n const min = Math.min(containerWidth, containerHeight) * 0.025;\r\n\r\n let calculatedFontSize = fontSize / min; // Start with a large font size\r\n textElement.style.fontSize = `${calculatedFontSize}cqmin`;\r\n\r\n // Reduce font size until content fits\r\n while (\r\n (textElement.scrollWidth > containerWidth ||\r\n textElement.scrollHeight > containerHeight) &&\r\n calculatedFontSize > 1\r\n ) {\r\n calculatedFontSize -= calculatedFontSize / min;\r\n textElement.style.fontSize = `${calculatedFontSize}cqmin`;\r\n }\r\n }\r\n };\r\n\r\n const toggleCustomHandles = () => setShowDots((prev) => !prev);\r\n\r\n const adjustFontSizeOnResize = throttle(\r\n () => onEditorUpdateAdjustFontSize(300),\r\n 80,\r\n { leading: true }\r\n );\r\n\r\n const handleOnResize = (_, { height, width }) => {\r\n // if (node.selected && isAutoFont && shouldShowCenteredEditor) adjustFontSizeOnResize({ height, width })\r\n };\r\n\r\n useEffect(() => {\r\n if (!node.selected) setShowDots(false);\r\n }, [node.selected]);\r\n\r\n const updateNodeInternals = useUpdateNodeInternals();\r\n\r\n // ! Do not remove this line. added to fix the edge position for the node. If this line is removed then edge position will not start from the handle position.\r\n useEffect(() => {\r\n updateNodeInternals(nodeId);\r\n }, [nodeId, updateNodeInternals]);\r\n\r\n function addPreserveAspectRatioIfMissing(svgElement) {\r\n if (!svgElement || svgElement.tagName !== \"svg\") {\r\n return;\r\n }\r\n\r\n if (!svgElement.hasAttribute(\"preserveAspectRatio\")) {\r\n svgElement.setAttribute(\"preserveAspectRatio\", \"none\");\r\n }\r\n }\r\n\r\n // !Add preserveAspectRatio=\"none\" to SVG elements if not exists to prevent shape resize issue\r\n useEffect(() => {\r\n if (mainRef.current && node.selected) {\r\n const svgElement = mainRef?.current.querySelector(\"svg\");\r\n addPreserveAspectRatioIfMissing(svgElement);\r\n }\r\n }, [node.id, mainRef.current, node.selected]);\r\n\r\n return (\r\n <>\r\n
setShowDots(true)}\r\n onMouseOut={() => setShowDots(false)}\r\n >\r\n {showResizeControlHandles && (\r\n
\r\n )}\r\n {!node?.data?.isTextArea && (\r\n
\r\n {[\"Uml_Component_Box\", \"Uml_Component\"].includes(\r\n node?.data?.key\r\n ) && }\r\n\r\n {iconMapping?.[node?.data?.key] ? (\r\n \r\n \r\n
\r\n ) : !Icons[node?.data.provider]?.[node?.data?.catagory]?.[\r\n node?.data?.key\r\n ]\r\n ?.toString()\r\n ?.includes(\".svg\") && ICON ? ( // to load ICON Components Example >> drop AWS >> Games >> first icon \"Game Kit\"\r\n \r\n \r\n
\r\n ) : (\r\n <>\r\n {Icons[node?.data.provider]?.[node?.data?.catagory]?.[\r\n node?.data?.key\r\n ] &&\r\n Icons[node?.data.provider]?.[node?.data?.catagory]?.[\r\n node?.data?.key\r\n ]\r\n ?.toString()\r\n ?.includes(\".svg\") ? (\r\n
\r\n ) : (\r\n <>\r\n {node?.data?.url ? (\r\n fileType === \"image\" ? (\r\n
\r\n ) : (\r\n \r\n )\r\n ) : (\r\n \"\"\r\n )}\r\n >\r\n )}\r\n >\r\n )}\r\n \r\n )}\r\n\r\n {shouldRenderToolbar && (\r\n
\r\n )}\r\n\r\n {shouldShowCenteredEditor && (\r\n
\r\n )}\r\n\r\n {shouldShowBottomEditor && !node?.data?.hideDescriptions && (\r\n
\r\n )}\r\n
\r\n\r\n {showNodeHandles && (\r\n
\r\n )}\r\n
\r\n >\r\n );\r\n};\r\n\r\nexport default React.memo(ResizableNodeSelected, (prevProps, nextProps) => {\r\n return prevProps.data.globalDragging && nextProps.data.globalDragging;\r\n});\r\n","import ResizableNodeSelected from './resizables';\r\n\r\nexport default ResizableNodeSelected;","import { Extension } from '@tiptap/react';\r\n\r\n/**\r\n * FontSize - Custom Extension\r\n * editor.commands.setFontSize(e.target.value) :set the font-size.\r\n */\r\n\r\n\r\nconst FontSize = Extension.create({\r\n name: 'fontSize',\r\n addOptions() {\r\n return {\r\n types: ['textStyle'],\r\n };\r\n },\r\n addGlobalAttributes() {\r\n return [\r\n {\r\n types: this.options.types,\r\n attributes: {\r\n fontSize: {\r\n default: null,\r\n parseHTML: element => element.style.fontSize.replace(/['\"]+/g, ''),\r\n renderHTML: attributes => {\r\n if (!attributes.fontSize) {\r\n return {};\r\n }\r\n return {\r\n style: `font-size: ${attributes.fontSize}`,\r\n };\r\n },\r\n },\r\n },\r\n },\r\n ];\r\n },\r\n addCommands() {\r\n return {\r\n setFontSize: fontSize => ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize: fontSize })\r\n .run();\r\n },\r\n unsetFontSize: () => ({ chain }) => {\r\n return chain()\r\n .setMark('textStyle', { fontSize: null })\r\n .removeEmptyTextStyle()\r\n .run();\r\n },\r\n getFontSize: () => ({ editor }) => {\r\n const { fontSize } = editor.getAttributes('textStyle');\r\n return fontSize || null; // return 'null' if no font size is set\r\n },\r\n };\r\n },\r\n});\r\n\r\nexport default FontSize;\r\n","import { Color } from \"@tiptap/extension-color\";\r\nimport ListItem from \"@tiptap/extension-list-item\";\r\nimport TextStyle from \"@tiptap/extension-text-style\";\r\nimport Underline from \"@tiptap/extension-underline\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport Highlight from \"@tiptap/extension-highlight\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport FontSize from \"./fontSize\";\r\nimport Paragraph from \"@tiptap/extension-paragraph\";\r\nimport Link from \"@tiptap/extension-link\";\r\nimport FontFamily from \"@tiptap/extension-font-family\";\r\nimport TaskList from \"@tiptap/extension-task-list\";\r\nimport TaskItem from \"@tiptap/extension-task-item\";\r\n\r\nexport const tipTapExtensions = (placeholder = \"\", nodeType) => {\r\n return [\r\n Color.configure({ types: [TextStyle.name, ListItem.name] }),\r\n TextStyle.configure({ types: [ListItem.name] }),\r\n ...(nodeType === \"stickyNoteEditor\"\r\n ? [\r\n Paragraph.extend({\r\n addKeyboardShortcuts() {\r\n return {\r\n Enter: () => this.editor.commands.insertContent(\"
\"),\r\n \"Control-A\": () => this.editor.commands.selectAll(), // Use
instead of
\r\n };\r\n },\r\n }),\r\n ]\r\n : []),\r\n StarterKit.configure({\r\n bulletList: {\r\n keepMarks: true,\r\n keepAttributes: false, // TODO : Making this as `false` because marks are not preserved when I try to preserve attrs, awaiting a bit of help\r\n },\r\n orderedList: {\r\n keepMarks: true,\r\n keepAttributes: false, // TODO : Making this as `false` because marks are not preserved when I try to preserve attrs, awaiting a bit of help\r\n },\r\n }),\r\n Underline.configure(),\r\n Highlight.configure({\r\n multicolor: true,\r\n }),\r\n TextAlign.configure({\r\n // types: [\"heading\", \"paragraph\", \"left\", \"center\", \"right\", \"justify\"],\r\n types: [\"heading\", \"paragraph\"],\r\n alignments: [\"left\", \"center\", \"right\", \"justify\"],\r\n }),\r\n FontSize.configure(),\r\n Placeholder.configure({\r\n placeholder: placeholder,\r\n showOnlyWhenEditable: false,\r\n considerAnyAsEmpty: false,\r\n }),\r\n FontFamily.configure({\r\n types: [\"textStyle\"],\r\n }),\r\n Link.configure({\r\n openOnClick: true,\r\n linkOnPaste: false,\r\n }),\r\n TaskList,\r\n TaskItem.configure({\r\n nested: true,\r\n }),\r\n ];\r\n};\r\n","import styled from \"@emotion/styled\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport { tooltipClasses } from \"@mui/material\";\r\n\r\nexport const CustomTooltip = styled(\r\n ({\r\n className,\r\n mt = 7,\r\n bg = \"#FFFFFF\",\r\n arrowLeft = \"50%\",\r\n top = \"0px\",\r\n width = \"32.44px\",\r\n height = \"22.8px\",\r\n marginTop = \"0px\",\r\n transform,\r\n ...props\r\n }) => \r\n)(\r\n ({\r\n theme,\r\n mt = 7,\r\n transform,\r\n border = \"#EFF0F3\",\r\n arrowLeft = \"50%\",\r\n top = \"0px\",\r\n width = \"32.44px\",\r\n height = \"22.8px\",\r\n bg = \"#FFFFFF\",\r\n marginTop = \"0px\",\r\n maxWidth = 300,\r\n }) => ({\r\n [`& .${tooltipClasses.tooltip}`]: {\r\n padding: \"0px !important\",\r\n minWidth: \"40px !important\",\r\n backgroundColor: `${bg} !important`,\r\n borderRadius: \"10px !important\",\r\n margin: `${mt}px 8px 8px !important`,\r\n maxWidth: `${maxWidth}px !important`,\r\n },\r\n [`& .${tooltipClasses.arrow}`]: {\r\n transform: \"translate(-50%, -13px) !important\",\r\n left: `${arrowLeft} !important`,\r\n width: `${width}`,\r\n height: `${height}`,\r\n top: `${top} !important`,\r\n \"&::before\": {\r\n backgroundColor: `${bg} !important`,\r\n boxShadow: \"0px 2px 12px 0px #18181B0A !important\",\r\n border: `1px solid ${border} !important`,\r\n },\r\n },\r\n boxShadow: \"none\",\r\n borderRadius: \"10px !important\",\r\n marginTop: `${marginTop} !important`,\r\n ...(transform ? { transform } : {}),\r\n })\r\n);\r\n\r\nexport const CustomNameTooltip = styled(\r\n ({ className, mt = null, ml = null, ...props }) => (\r\n \r\n )\r\n)(({ theme, mt = null, ml = null }) => ({\r\n [`& .${tooltipClasses.tooltip}`]: {\r\n padding: \"3px 5px !important\",\r\n wordBreak: \"break-all\",\r\n minWidth: \"40px !important\",\r\n backgroundColor: \"#030B16 !important\",\r\n borderRadius: \"4px !important\",\r\n fontSize: 10,\r\n minHeight : \"22px\",\r\n color: \"#EFEFEF\",\r\n textAlign: \"center\",\r\n marginTop: mt ? `${mt}px !important` : \"0px\",\r\n marginLeft: ml ? `${ml}px !important` : \"0px\",\r\n },\r\n [`& .${tooltipClasses.arrow}`]: { color: \"#030B16\" },\r\n borderRadius: 0,\r\n boxShadow: \"none\",\r\n}));\r\n","import React from \"react\";\r\nimport { CustomNameTooltip } from \"./CustomTooltip\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nconst ToolTipWithDisabled = ({\r\n tooltipTitle = \"\",\r\n children,\r\n disabled = false,\r\n placement = \"bottom\",\r\n}) => {\r\n return (\r\n <>\r\n {disabled ? (\r\n {children}\r\n ) : (\r\n \r\n {children}\r\n \r\n )}\r\n >\r\n );\r\n};\r\n\r\nexport default ToolTipWithDisabled;\r\n","import { debounce } from \"lodash\";\r\n\r\nexport function getChildrenAndSelf(data, parentId, visited = new Set()) {\r\n const children = [];\r\n\r\n data.forEach((obj) => {\r\n if (\r\n !visited.has(obj.id) &&\r\n (obj.id === parentId || obj.parentNode === parentId)\r\n ) {\r\n children.push(obj);\r\n visited.add(obj.id);\r\n if (obj.hasOwnProperty(\"parentNode\")) {\r\n children.push(...getChildrenAndSelf(data, obj.id, visited));\r\n }\r\n }\r\n });\r\n\r\n return children;\r\n}\r\n\r\nexport function sanitizeHtml(htmlString = null, tagToRemove = null) {\r\n if (!htmlString) {\r\n return htmlString;\r\n }\r\n if (!tagToRemove) {\r\n return htmlString;\r\n }\r\n if (typeof htmlString !== \"string\") {\r\n console.warn(\"tag to remove shoule be string\");\r\n return htmlString;\r\n }\r\n // Create a temporary DOM element to parse the HTML string\r\n const tempElement = document.createElement(\"div\");\r\n tempElement.innerHTML = htmlString;\r\n\r\n // Select all elements with a style attribute\r\n const styledElements = tempElement.querySelectorAll(\"[style]\");\r\n\r\n // Iterate over the elements and remove font-size from the style\r\n styledElements.forEach((element) => {\r\n const styles = element.style.cssText.split(\";\").filter((style) => {\r\n return style.trim().length && !style.trim().startsWith(tagToRemove);\r\n });\r\n\r\n if (styles.length > 1) {\r\n element.style.cssText = styles.join(\";\");\r\n } else {\r\n element.style.cssText = styles;\r\n }\r\n if (!element.getAttribute(\"style\")) {\r\n element.removeAttribute(\"style\");\r\n }\r\n });\r\n\r\n // Select all span elements\r\n const spanElements = tempElement.querySelectorAll(\"span\");\r\n\r\n // Iterate over the span elements and remove those without attributes\r\n spanElements.forEach((span) => {\r\n if (!span.attributes.length) {\r\n // Replace the span with its content\r\n const parent = span.parentNode;\r\n while (span.firstChild) {\r\n parent.insertBefore(span.firstChild, span);\r\n }\r\n parent.removeChild(span);\r\n }\r\n });\r\n\r\n // Trim unnecessary spaces inside elements\r\n tempElement.querySelectorAll(\"*\").forEach((element) => {\r\n element.childNodes.forEach((node) => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n node.textContent = node.textContent.replace(/\\s+/g, \" \").trim();\r\n }\r\n });\r\n });\r\n\r\n // Return the modified HTML string\r\n return tempElement.innerHTML;\r\n}\r\n\r\nexport const updateLocalStorage = debounce((key = null, value = null) => {\r\n try {\r\n if (key && value) localStorage.setItem(key, value);\r\n } catch (error) {}\r\n}, 50);\r\n\r\n// export const pxToCqmin = (px) => {\r\n// if (!px) return null;\r\n\r\n// // Extract numeric value if px is a string like \"12px\"\r\n// const numericValue = typeof px === 'string' ?\r\n// parseFloat(px.replace('px', '')) : px;\r\n\r\n// // Convert px to cqmin (approximate ratio)\r\n// const cqminValue = Math.round(numericValue * 0.2000);\r\n\r\n// return `${cqminValue}cqmin`;\r\n// };\r\n\r\nexport const pxToCqmin = (\r\n pxValue = null,\r\n nodeId = null,\r\n { container = null } = {}\r\n) => {\r\n if (!pxValue) throw new Error(\"font pixel value is required\");\r\n if (!nodeId) throw new Error(\"nodeId is required\");\r\n // Remove 'px' if present and convert to number\r\n const numericValue =\r\n typeof pxValue === \"string\"\r\n ? parseFloat(pxValue.replace(\"px\", \"\"))\r\n : pxValue;\r\n\r\n // Get container width (assuming parent container width)\r\n const containerElement =\r\n container ?? document.querySelector(`#sticky_notes_${nodeId}`);\r\n const containerWidth = containerElement?.offsetWidth;\r\n\r\n // Convert to cqmin (as percentage of container width)\r\n const cqminValue = (numericValue / containerWidth) * 100;\r\n\r\n // Return formatted string with 2 decimal places\r\n return `${cqminValue.toFixed(2)}cqmin`;\r\n};\r\n\r\nexport const cqminToPx = (cqminValue, nodeId) => {\r\n // Handle null/undefined\r\n if (!cqminValue) throw new Error(\"font cqmin value is required\");\r\n if (!nodeId) throw new Error(\"nodeId is required\");\r\n\r\n // Extract numeric value from string (e.g. \"4cqmin\")\r\n const numericValue =\r\n typeof cqminValue === \"string\"\r\n ? parseFloat(cqminValue.replace(\"cqmin\", \"\"))\r\n : cqminValue;\r\n\r\n // Get container width\r\n const containerWidth =\r\n document.querySelector(`#sticky_notes_${nodeId}`)?.offsetWidth || 1000;\r\n\r\n // Convert cqmin to px: (cqmin * containerWidth) / 100\r\n const pxValue = (numericValue * containerWidth) / 100;\r\n\r\n // Return formatted px value\r\n return `${Math.round(pxValue)}px`;\r\n};\r\n\r\nexport const calculateOptimalFontSize = (\r\n container,\r\n textElement,\r\n initialFontSize = 100\r\n) => {\r\n // Validation\r\n if (!container || !textElement) return null;\r\n\r\n // Get dimensions\r\n const containerWidth = container.offsetWidth;\r\n const containerHeight = container.offsetHeight;\r\n\r\n // Calculate minimum dimension ratio\r\n const min = Math.min(containerWidth, containerHeight) * 0.035;\r\n\r\n // Binary search bounds\r\n let minSize = 1;\r\n let maxSize = initialFontSize / min;\r\n let iterations = 0;\r\n const MAX_ITERATIONS = 10;\r\n\r\n // Test size function\r\n const testSize = (size) => {\r\n textElement.style.fontSize = `${size}cqmin`;\r\n return !(\r\n textElement.scrollWidth > containerWidth ||\r\n textElement.scrollHeight > containerHeight\r\n );\r\n };\r\n\r\n // Binary search\r\n while (iterations < MAX_ITERATIONS) {\r\n const mid = (minSize + maxSize) / 2;\r\n\r\n if (!testSize(mid)) {\r\n maxSize = mid;\r\n } else {\r\n minSize = mid;\r\n }\r\n\r\n if (Math.abs(maxSize - minSize) < 0.1) break;\r\n iterations++;\r\n }\r\n\r\n return minSize;\r\n};\r\n\r\nexport const getCalculatedFontSize = (\r\n fontSize,\r\n nodeId,\r\n { container = null } = {}\r\n) => {\r\n const isFontSizeInPx =\r\n typeof fontSize === \"string\" && fontSize.includes(\"px\");\r\n const isFontSizeInNumber = typeof fontSize === \"number\";\r\n if (isFontSizeInPx) {\r\n return pxToCqmin(fontSize, nodeId, { container });\r\n }\r\n if (isFontSizeInNumber) {\r\n return pxToCqmin(fontSize, nodeId, { container });\r\n }\r\n return fontSize;\r\n};\r\n\r\nexport const onEditorUpdateAdjustFontSize = (textElement, containerElement) => {\r\n requestAnimationFrame(() => {\r\n const fontSize = calculateOptimalFontSize(containerElement, textElement);\r\n if (fontSize) {\r\n textElement.style.fontSize = `${fontSize}cqmin`;\r\n }\r\n });\r\n};\r\n\r\nexport const getFontFaceRulesFromDom = () => {\r\n const targetUrl =\r\n \"https://cloudairy-template-storage.s3.us-east-1.amazonaws.com\";\r\n const matchingFontFaces = [];\r\n\r\n // Iterate through all stylesheets in the document\r\n for (const sheet of document.styleSheets) {\r\n try {\r\n const rules = sheet.cssRules || sheet.rules;\r\n\r\n // Iterate through the rules\r\n for (const rule of rules) {\r\n // Check if the rule is a CSSFontFaceRule\r\n if (rule instanceof CSSFontFaceRule) {\r\n const src = rule.style.getPropertyValue(\"src\").trim();\r\n\r\n // Check if the src contains the target URL and the keyword\r\n if (src.includes(targetUrl)) {\r\n const fontFamily = rule.style\r\n .getPropertyValue(\"font-family\")\r\n .trim();\r\n const urlPattern = /url\\([\"']?(.*?)[\"']?\\)/;\r\n\r\n // Execute the regular expression on the input string\r\n const match = urlPattern.exec(src);\r\n\r\n if (match && match[1]) {\r\n matchingFontFaces.push({ fontFamily, src: match[1] });\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.warn(`Unable to access stylesheet: ${sheet.href}`, e);\r\n continue;\r\n }\r\n }\r\n\r\n return matchingFontFaces;\r\n};\r\n\r\nexport const downloadFontAndCovertToBase64 = async (fontSrcUrl) => {\r\n try {\r\n // Fetch the font file\r\n const response = await fetch(fontSrcUrl);\r\n if (!response.ok) {\r\n return null;\r\n }\r\n\r\n // Read the response as a Blob\r\n const blob = await response.blob();\r\n\r\n // Create a FileReader to read the Blob as a Data URL\r\n const reader = new FileReader();\r\n const dataUrlPromise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => resolve(reader.result);\r\n reader.onerror = reject;\r\n });\r\n\r\n // Start reading the Blob\r\n reader.readAsDataURL(blob);\r\n\r\n // Wait for the Data URL to be generated\r\n const dataUrl = await dataUrlPromise;\r\n return dataUrl;\r\n } catch (error) {\r\n console.error(\"Error:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nexport function getAllFontFamiliesFromBoard(rootElement) {\r\n const fontFamilies = new Set();\r\n\r\n function traverse(element) {\r\n if (element.nodeType === Node.ELEMENT_NODE) {\r\n const computedStyle = window.getComputedStyle(element);\r\n const fontFamily = computedStyle.fontFamily;\r\n if (fontFamily) {\r\n fontFamilies.add(fontFamily);\r\n }\r\n\r\n // Recursively traverse child nodes\r\n Array.from(element.children).forEach(traverse);\r\n }\r\n }\r\n\r\n traverse(rootElement);\r\n return Array.from(fontFamilies);\r\n}\r\n\r\nexport const generateFontEmbedCss = async () => {\r\n const fontFamiliesFromBoard = getAllFontFamiliesFromBoard(\r\n document.querySelector(\".react-flow__container\")\r\n );\r\n const fontFaces = getFontFaceRulesFromDom().filter((fontFace) =>\r\n fontFamiliesFromBoard.includes(fontFace.fontFamily)\r\n );\r\n\r\n const formattedFontFaces = [];\r\n\r\n for (const fontFace of fontFaces) {\r\n const fontSrc = fontFace.src;\r\n const response = await downloadFontAndCovertToBase64(fontSrc);\r\n const fontFaceString = `\r\n @font-face {\r\n font-family: ${String(fontFace.fontFamily)};\r\n src: url('${response}');\r\n }\r\n `;\r\n\r\n formattedFontFaces.push(fontFaceString);\r\n }\r\n return formattedFontFaces.join(\"\\n\");\r\n};\r\n\r\nexport function isFirefoxOrSafari() {\r\n const userAgent = navigator.userAgent;\r\n return (\r\n userAgent.includes(\"Firefox\") ||\r\n (userAgent.includes(\"Safari\") && !userAgent.includes(\"Chrome\"))\r\n );\r\n}\r\n"],"names":["proOptions","account","hideAttribution","nodeTypes","rotatableNode","RotatableNode","resizable","ResizableNodeSelected","stickyNoteEditor","StickyNoteEditor","simpleText","SimpleText","group","GroupNode","shape","resizables","TreeView","TreeViewNode","resizeLink","ResizeLink","embedIframe","EmbedIframe","todoList","ListNode","columnNode","ColumnNode","comment","Comment","document","Document","Upload","uploadImage","UploadImage","Table","TableNode","frame","Frame","kanbanSmartContainor","KanbanContainorNode","drawingNode","DrawingNode","dotVoting","DotVoting","dotVotingNode","DotVotingNode","storyPoints","StoryPoint","storyPointNode","StoryPointNode","polling","Polling","orgChart","OrgChartNode","card","CardNode","chart","ChartNode","userCard","UserCardNode","userStoryMap","UserStoryMapNode","people","PeopleNode","PeopleDraggingNode","shapeTable","ShapeTableNode","pipe","PipeNode","edgeTypes","animatedBall","EdgeWithAminatedBall","animatedDash","AnimatedDashedEdge","smoothstep","edge","_jsx","CustomEdge","type","straight","default","EditableEdge","StepEdge","treeNodeEdgeType1","TreeNodeEdgeType1","treeNodeEdgeType2","TreeNodeEdgeType2","treeNodeEdgeType3","TreeNodeEdgeType3","treeNodeEdgeType5","TreeNodeEdgeType5","treeNodeEdgeType8","TreeNodeEdgeType8","initialState","mainBackgroundStyles","background","reducer","state","_ref","payload","dndActions","change_bg_styles","stateLocal","_objectSpread","DNDContextCreate","createContext","DNDContext","props","dispatch","useReducer","Provider","value","children","useDNDContext","cb","useContext","useShortcut","keyCode","callback","isEnabled","keyPressRef","useRef","useEffect","handleKeyDown","event","hasSelectedTextInInput","some","key","modifier","letter","split","ctrlKey","metaKey","toLowerCase","current","preventDefault","handleKeyUp","endsWith","window","addEventListener","removeEventListener","setShowShapesLimitModal","mousePosRef","x","y","rfDomNode","useStore","domNode","id","useParams","location","useLocation","useDispatch","isMainPickerOpen","useSelector","mindMapStore","currentSubscriptionData","common","lastPastePosition","pasteCount","undo","takeSnapshot","useUndoRedo","getNodes","setNodes","getEdges","setEdges","screenToFlowPosition","useReactFlow","debouncedUpdateJson","useMemo","debounce","architecture_json","a_id","URLSearchParams","search","get","updateJson","json","handlePasteEvent","useCallback","async","_currentSubscriptionD","isColorPickerOpen","getElementById","isAnyInputFocused","isInputFocused","currentNodes","pasteX","pasteY","offsetX","offsetY","items","clipboardData","imageItems","Array","from","filter","item","indexOf","subscriptionData","package","length","newImageNodes","Promise","all","map","readImageWithDimensions","blob","getAsFile","resolve","reject","reader","FileReader","onloadend","img","Image","onload","dataUrl","result","width","height","onerror","src","readAsDataURL","reduce","nodes","imageInfo","index","pastePosition","position","data","imageNode","getId","positionAbsolute","url","filename","provider","Label","scale","imageShow","hide","showBorder","frameName","frameNo","label","locked","zIndex","border","opacity","borderColor","style","selected","navigator","clipboard","read","types","updatedNodes","node","paste","error","events","e","onMouseMove","clientX","clientY","onPaste","getNodesInsideSelected","allNodes","selectedNodes","insideNodes","Set","forEach","selectedNode","isNodeInside","innerNode","outerNode","_innerNode$style","_outerNode$style","_innerNode$style2","_outerNode$style2","add","assignRootParentIds","assignToChildren","parentNode","rootParentId","copy","nodesToCopy","addNodeAndChildren","has","getChildrenAndSelf","child","nodesToCopyArray","selectedEdges","getConnectedEdges","n","source","target","copyData","edges","writeText","JSON","stringify","cut","_updatedNodes","nodesToCut","nodesToCutArray","cutData","updatedEdges","deletedNodes","deletedEdges","localStorage","setItem","lastEvent","isRemove","push","ed","should_delete","arguments","undefined","nodeCounts","clipboardItems","textItems","fileItems","includes","text","getType","then","fileItem","files","file","startsWith","_currentSubscriptionD2","imageItem","find","formData","FormData","append","name","concat","Date","now","newId","commanService","uploadApi","_currentSubscriptionD3","clipboardContent","join","pasteData","parse","nodeId","newNode","editorState","EditorState","createWithContent","ContentState","createFromText","editorHTML","maxPosition","minWidth","color","fontSize","fontWeight","fontStyle","textDecoration","textAlign","backgroundColor","lineHeight","boxShadow","borderRadius","padding","outline","fields","teraFormData","draggable","nd","minX","Math","min","s","minY","idMapping","newNodes","removeDuplicatesById","nodeIds","topChildrenOrder","bottomChildrenOrder","leftChildrenOrder","rightChildrenOrder","side","childrenOrder","updateParentIds","stickyNodeId","_node$data","_node$data6","_node$data2","_node$data3","_node$data4","_node$data5","_node$data7","_node$data7$childrenO","hiddenBy","isInside","_node$style","_group$style","_node$style2","_group$style2","newParentNode","potentialParents","potentialParent","originalParent","p","dragging","newEdges","_edge$data","_edge$data$points","edgeDataPoints","points","val","isCopied","_extractShapeTableEdg","_extractShapeTableEdg2","sourceNode","getNodeById","targetNode","sourceHandle","extractShapeTableEdgeHandleId","targetHandle","UndoRedoContext","UndoRedoProvider","architectureId","user_data","getItem","newState","activeElement","classList","contains","captureSnapShot","_parsedData","parsedData","lastUpdatedBy","user_id","isDeleted","previousState","undoWithPreviousState","pathname","redo","nextState","redoWithNextState","isAnyDialogOpen","querySelector","checkEditorFocus","shiftKey","context","Error","top","left","transform","xs","md","xl","bgcolor","maxHeight","open","handleClose","setOpen","project_id","isReload","isCloudChartTemplate","isHideCategory","showBoardLocation","projects","setProjects","useState","loading","setLoading","setFormData","category_id","new_category_name","errors","setErrors","folder","selectedDocs","setSelectedDocs","showLimitModal","setShowLimitModal","openedFolders","setOpenedFolders","isCloudChart","setIsCloudChart","openDropdown","setOpenDropdown","isAddNewProject","setIsAddNewProject","selectedOption","setSelectedOption","folderIsCreating","setFolderIsCreating","form","setForm","formErrors","setFormErrors","openUpgradePopup","setOpenUpgradePopup","activeTeam","_state$sidebar","sidebar","currentTeam","projectList","refetch","refetchProjectList","useGetProjectsListQuery","team_id","skip","resData","_projectList$resData","selectedSpace","spaceData","_makeData","_makeData2","makeData","project_data","project_name","parent","handleSubmit","validateForm","valid","trim","prev","_projects$","_response$data$data$","response","postApi","architecture_name","icon","updateBoardCountInCurrentSubscription","isMinus","href","architecture_id","account_id","_error$response","_error$response$data","_error$response$data$","_error$response2","_error$response2$data","_error$response$data2","message","status","warningToast","errorToast","validateField","fieldName","fieldValidationErrors","getLabelStyle","option","titleDark","subTitle","_jsxs","_Fragment","CustomModal","sx","Box","onClick","Stack","direction","alignItems","justifyContent","Typography","fontSizes","titleFont","modelTitle","modelTitle1","weight800","letterSpacing","IconButton","right","transition","IcCloseThin","fill","weight400","mt","flexDirection","gap","LargeSimpleInput","placeholder","autoFocus","onChange","errorMessage","weight600","fontSize14","RadioGroup","row","_projectList$resData2","firstProject","FormControlLabel","marginRight","control","Radio","checkRadioBorder","primaryColor","SaveToAutoSelect","handleAddProject","_ref2","successToast","parent_project_id","catch","_error$response3","_error$response3$data","finally","isDropDown","BtnColoredOutlined","greyHover","commonBorderColor","px","hoverSx","darkGray","fontSize13","btnTextHeight","BtnGradient","UpgradeModel","isNavigateOnClose","title","subtitle","handleChoosePlanClose","UpgradePlanAccess","onClose","isModel","setSearchValue","mainCategoryList","filteredCategories","selectedUseCase","templates","useCaseList","setUseCaseList","setCategories","_res$data","res","getApi","getUseCase","setSelectedUseCase","py","overflow","pr","mb","cursor","lightPrimary","content","inset","WebkitMask","WebkitMaskComposite","maskComposite","setWithoutUseCaseTemplateData","pageNumber","Ic3StarsColored","resetState","is_new","is_premium","weight700","category","i","setIsCustomCategorySelected","setSelectedCategory","category_name","marginBottom","theme","useTheme","match1180","useMediaQuery","breakpoints","down","match1080","commonStyles","borderRadius10","s3AssetsUrl","backgroundPosition","backgroundRepeat","backgroundSize","bottom","className","alt","variant","WebkitBackgroundClip","WebkitTextFillColor","lg","weight500","whiteColor","IcRightShortArrow","TemplatesBoardPlaceHolder","showTab","isPersonal","searchValue","matchDown1281","matchDown1581","setSelectedTemplateData","userData","setShowUseTemplate","setViewTemplate","viewTemplate","handleTemplateData","isBoard","searchCustomValue","setSearchCustomValue","navigate","useNavigate","isXLarge","up","isLarge","numCards","select","setSelect","setTemplates","pageNum","setPageNum","totalPages","setTotalPages","isScrollLoading","setIsScrollLoading","templatesContainerRef","teamId","handleCreateTemplateChart","setOpenBoardFromTemplate","setOpenViewTemplate","setTimeout","setTemplateData","_error$response2$data2","_error$response4","_error$response5","_error$response6","_error$response6$data","_error$response7","_error$response7$data","getCreateTemplateChart","currentPage","personal","workspace","is_admin","_response$data","_response$data$data","total_pages","_response$data2","_response$data2$data","_response$data3","_response$data3$data","_response$data4","_response$data4$data","_response$data5","_response$data5$data","removeItem","_response$data6","_response$data6$data","_response$data7","_response$data7$data","_error$response8","_error$response9","_error$response9$data","_error$response9$data2","_error$response10","_error$response10$dat","debouncedSearch","deleteData","handleScroll","scrollEle","scrollHeight","scrollTop","clientHeight","filteredTemplate","overflowY","fontSize20","btnColor","cardLiteBgColor","fontSize30","blackColor","fontSize16","my","backgroundImage","backgroundOrigin","backgroundClip","display","flexWrap","_","Card","Skeleton","CardContent","Grid","container","spacing","marginTop","paddingRight","ref","sm","marginLeft","pt","pl","maxWidth","visibility","IcPlusSquaredOutlinedLarge","IcPlusSquareFillLarge","template","scrollbarWidth","TemplateUI","backToTemplate","SimpleCircularProgress","Loader","forwardRef","_ref3","_selectedCategoryName","getTemplateList","selectedCategory","categories","templateState","isForYou","globalTheme","selectedCategoryName","ForYou","fontSize18px","CommonPlaceHolder","imgWidth","imgHeight","imgXsWidth","imgXsHeight","imageAndDescGapXl","titleFontSize","descFontSize","desc","pb","memo","_useCaseList$","isSidebar","isShowCreateSection","selectedTemplateData","showUseTemplate","match1220","match1500","match950","templatesOpt","setTemplatesOpt","updateShowWhenCreateBoard","useUpdateShowWhenCreateBoardMutation","showWhenCreateBoard","useGetShowWhenCreateBoardQuery","isCustomCategorySelected","customCategory","useGetCategoriesQuery","use_case_id","categoryIds","cat","String","filteredCategorieIds","templatesOpt2","setTemplatesOpt2","anchorEl2","setAnchorEl2","openCreateBlankModal","setOpenCreateBlankModal","getFavouriteTemplates","_templateState$withou","temp","withoutUseCaseTemplateData","getTemplatesWithoutUseCase","deleteTemplate","setDeleteTemplate","open2","Boolean","id2","handleCloseMenu","_useCaseList$2","_templatesList$data","_templatesList$data$d","templatesList","encodeURIComponent","_templatesList$data2","_templatesList$data2$","_templatesList$data3","_templatesList$data3$","queries","_templatesList$data4","_templatesList$data4$","queryParams","replace","_templatesList$data5","_templatesList$data5$","_templatesList$data6","_templatesList$data6$","_templatesList$data7","_templatesList$data7$","_templatesList$data8","_templatesList$data8$","_templatesList$data9","_templatesList$data9$","_res$data$data","_res$data$data$find","_res$data2","useCase","handleCloseDelete","handleSearchChange","SearchInput","isdoubleborder","formControlSx","SimpleCheckBox","labelStyle","checked","show_template_modal","CreateBoardModelSideBar","TemplateListComponent","xsHeight","Select","size","MenuProps","PaperProps","MenuItem","DeleteDialog","handleOk","deleteApi","prevTemplate","template_id","heading","CreateBlankBoard","handleCloseCreateBlankBoard","UseTemplate","Popover","anchorEl","anchorOrigin","vertical","horizontal","ml","templateData","template_name","showPlans","setShowPlans","msOverflowStyle","IcCloudCollabLogoColored","IcCheckCircleOutlined","component","IcUpgrade","ChoosePlan","iconMapping","IcAddWithThreeSquare","IcCircleOutlined","IcDownArrow","IcGroupOutlined","IcHexagonOutlined","IcPentagonOutlined","IcRectangleOutlined","IcRhombusOutlined","IcExternalEntity","IcProcess","IcProcess1","IcProcess2","IcDataStore1","IcDataStore2","IcDataStore","IcShapesOutlined","IcSquareOutlined","IcStarFilled","IcStarOutlined","IcStickyNoteOutlined","IcTextSquaredColoredOutline","IcTriangleOutlined","ShapesForBottomEditor","noEditorShow","editorDisabled","thinNode","leftCurlyNode","rightCurlyNode","topHandleMapping","Merge","Terminator","rightHandleMapping","Data","Triangle","Star","Pentagon","bottomHandleMapping","leftHandleMapping","defaultHandlePosition","CustomNodeResizeControl","handleOnResize","onResizeEnd","isWidthLessthan100","isWidthLessthan50","isWidthLessthan25","useZoomPercentages","NodeResizer","minHeight","keepAspectRatio","onResize","NodeResizeControl","React","CustomNodeHandles","_topHandleMapping$nod","_leftHandleMapping$no","_rightHandleMapping$n","_bottomHandleMapping$","isNodeSelectionStarted","showDots","setShowDots","hoveredItem","setHoveredItem","Handle","connectionMode","isConnectable","onConnect","params","onMouseOver","onMouseLeave","pointerEvents","_editor$getText","_node$name","_node$name2","_node$data4$style","_node$data$style$font","_node$data5$style","editor","isShowBottomEditor","newTextLength","getText","isRightAngleTriangle","nodeIsProcessOrConnector","needLeftPadding","isTriangleNode","isMergeNode","paddingLeft","isFocused","wordBreak","_node$data$style","_ref$current","_ref$current$style","paddingTop","UmlComponent","_node$data6$style","_node$data8","UmlComponents","Uml_Component_Box","UmlComponentBoxInner","containerStyles","Uml_Component","UmlComponentInner","RenderUmlComponent","iconStyle","iconType","iconTypes","THIRD_DIMENSION","_getNodes","_getNodes$filter","_sanitizeHtml","_node$data11","_node$data13","_node$data15","_ICONS$Icons","_ICONS$Icons$node$dat","_ICONS$Icons$node$dat2","_node$data16","_node$data17","_node$data20","_node$data21","_node$data23","_node$data23$border","_node$data24","_node$data24$border","_node$data25","_node$data25$border","_node$data26","_node$data26$border","_node$data27","_node$data28","_node$data31","_node$data32","_node$data33","_node$data34","_node$data35","_node$data36","_editor$getHTML","_node$data37","_node$data38","_node$data39","_node$data40","_node$data41","_node$data42","_node$data43","_node$data44","_node$data45","_node$data46","_node$data47","_Icons$node$data$prov","_Icons$node$data$prov2","_Icons$node$data$prov3","_Icons$node$data$prov4","_node$data48","_node$data49","_node$data50","_node$data51","_node$data52","_node$data53","_node$data54","_node$data55","_node$data55$style","_node$data56","_node$data56$style","_node$data57","_node$data57$style","_node$data58","_node$data59","_Icons$node$data$prov5","_Icons$node$data$prov6","_node$data60","_node$data61","_Icons$node$data$prov7","_Icons$node$data$prov8","_Icons$node$data$prov9","_Icons$node$data$prov10","_node$data62","_node$data63","_Icons$node$data$prov11","_Icons$node$data$prov12","_node$data64","_node$data65","_node$data66","_node$data67","_node$data68","_node$data69","_node$data70","_node$data71","_ref10","_node$data72","_node$data72$style","_textRef$current3","_textRef$current3$sty","_node$data73","getNode","permission","showExport","copyAsImage","isDownload","startVoting","_archBoard$votingData","archBoard","votingData","startVotingSession","useNodeSelectionStarted","mainRef","textRef","userRowData","isItemToSmall","isAutoFont","extensions","tipTapExtensions","editorContentRef","shouldShowCenteredEditor","shouldShowBottomEditor","isGroupHead","useEditor","element","editable","autofocus","sanitizeHtml","onBlur","setEditable","onUpdate","_ref4","debouncedUpdateHTML","getHTML","onFocus","_ref5","commands","clearContent","editorProps","handlePaste","view","pastedContent","getData","hideDescriptions","_node$data9","_node$data10","_editor$commands","setContent","updateFontSize","_prev$data","_textRef$current","_textRef$current$styl","_textRef$current2","_textRef$current2$sty","omit","isResized","updateLocalStorage","_editor$getText$trim","_node$data12","_getNodes2","oldContent","currentContent","updatedNode","_ref6","_ref7","_ref8","isAiGenerated","shouldTakeSnapshot","removeHTMLTags","Icon","ICON","ICONS","catagory","imageData","setImageData","_node$data19","_node$data18","fetch","ok","statusText","base64Data","fetchImageData","fileType","nodeUrl","_node$data22","imageTypes","splittedStr","extension","urlType","borderWidth","borderStyle","newBorderColor","adjustOpacity","rgba","newOpacity","parts","match","showNodeHandles","showResizeControlHandles","currentNodeDom","handleNodeKeyDown","isValidKey","test","focus","insertContent","isEditable","once","shouldRenderToolbar","throttle","leading","updateNodeInternals","useUpdateNodeInternals","svgElement","tagName","hasAttribute","setAttribute","addPreserveAspectRatioIfMissing","containerType","contain","clsx","custom_node","nodrag","handleSingleClick","_node$data29","onDoubleClick","handleDoubleClick","_node$data30","selectAll","onMouseOut","_ref9","_node$data14","isTextArea","nodeBorderStyle","bgColor","Icons","toString","objectFit","autoPlay","loop","isNewIcon","unit","MindMapNodesToolbar","currFontSize","isSticky","simpleRef","CenterEditor","BottomEditor","VotingCommon","prevProps","nextProps","globalDragging","Extension","create","addOptions","addGlobalAttributes","this","options","attributes","parseHTML","renderHTML","addCommands","setFontSize","chain","setMark","run","unsetFontSize","removeEmptyTextStyle","getFontSize","getAttributes","nodeType","Color","configure","TextStyle","ListItem","Paragraph","extend","addKeyboardShortcuts","Enter","Control-A","StarterKit","bulletList","keepMarks","keepAttributes","orderedList","Underline","Highlight","multicolor","TextAlign","alignments","FontSize","Placeholder","showOnlyWhenEditable","considerAnyAsEmpty","FontFamily","Link","openOnClick","linkOnPaste","TaskList","TaskItem","nested","CustomTooltip","styled","bg","arrowLeft","_objectWithoutProperties","_excluded","Tooltip","classes","popper","tooltipClasses","tooltip","margin","arrow","CustomNameTooltip","_excluded2","tooltipTitle","disabled","placement","parentId","visited","obj","hasOwnProperty","htmlString","tagToRemove","tempElement","createElement","innerHTML","querySelectorAll","styles","cssText","getAttribute","removeAttribute","span","firstChild","insertBefore","removeChild","childNodes","Node","TEXT_NODE","textContent","downloadFontAndCovertToBase64","fontSrcUrl","dataUrlPromise","generateFontEmbedCss","fontFamiliesFromBoard","rootElement","fontFamilies","traverse","ELEMENT_NODE","fontFamily","getComputedStyle","getAllFontFamiliesFromBoard","fontFaces","getFontFaceRulesFromDom","matchingFontFaces","sheet","styleSheets","rules","cssRules","rule","CSSFontFaceRule","getPropertyValue","exec","fontFace","formattedFontFaces","fontSrc","fontFaceString","isFirefoxOrSafari","userAgent"],"sourceRoot":""}