@cyber-harbour/ui 1.1.44-dev.0 → 1.1.45-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +45 -45
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -46
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Layouts/PageLayout/PageLayout.tsx","../src/Layouts/PageLayout/PageContent.tsx","../src/Layouts/PageLayout/SubNav.tsx","../src/Layouts/Container/Container.tsx","../src/Layouts/SplitterLayout/SplitterLayout.tsx","../src/Graph2D/GraphLoader.tsx","../src/Graph2D/wrapText.ts","../src/Graph2D/Graph2D.tsx","../src/FullscreenCard/FullscreenCard.tsx","../src/FileViewer/drivers/ImageDriver.tsx","../src/FileViewer/drivers/AudioDriver.tsx","../src/FileViewer/drivers/PdfDriver/PdfDriverWrapper.tsx","../src/FileViewer/drivers/DocxDriver.tsx","../src/FileViewer/drivers/TextDriver.tsx","../src/FileViewer/drivers/VideoDriver.tsx","../src/FileViewer/Driver.tsx","../src/FileViewer/FileViewer.tsx"],"names":["PageLayout","__name","children","className","jsx","StyledContainer","styled","PageContent","StyledMain","theme","SubNav","top","Styled","e","$top","Container","createComponent","maxWidth","props","createStyledComponent","$maxWidth","px","generatePropertySpaceStyle","pxToRem","MIN_WIDTH","STORAGE_KEY","getSavedWidths","key","length","initialWidths","saved","parsed","SplitterLayout","columns","style","splitterClassName","minWidth","storageKey","widths","setWidths","useState","containerRef","useRef","activeIndex","minWidthRef","widthsRef","handleMove","useCallback","clientX","container","totalWidth","x","newWidths","left","right","prevWidthsSum","a","b","leftWidth","rightWidth","handleMouseMove","handleTouchMove","stopResizing","startResizing","index","handleTouchStart","useEffect","content","colClassName","colStyle","i","jsxs","Fragment","Column","Splitter","SplitterHandle","LoaderWrapper","GraphLoader","width","height","useTheme","ContentLoader","GraphLoader_default","wrapText","ctx","text","paragraphs","lines","paragraph","words","line","n","testLine","RATIO","prepareButtonImages","buttons","button","config","getNodeSize","node","getLinkWidth","link","isHighlighted","Graph2D","forwardRef","loading","graphData","enableGrid","onNodeClick","onBackgroundClick","onNodeHover","onLinkHover","onLinkClick","onChangeSelectedNodeIds","ref","isRendering","setIsRendering","tooltipPosition","setTooltipPosition","tooltipContent","setTooltipContent","stateRef","nodes","links","useMemo","cloneDeep","buttonImages","setButtonImages","canvasRef","simulationRef","ctx2dRef","color","scaleOrdinal","schemeCategory10","init2DCanvas","getNodes","getLinks","linkForce","renderGrid","canvasWidth","canvasHeight","gridSpacing","dotSize","y","truncateText","truncated","ellipsis","calculateFontSize","scale","fontSizeRatio","renderLinks","source","target","start","end","dx","dy","distance","unitDx","unitDy","sourceRadius","targetRadius","arrowHeadLength","adjustedStart","adjustedEnd","adjusteArrowdEnd","lineColor","lineWidth","middleX","middleY","angle","globalScale","scaledFontSize","textWidth","padding","beforeTextDistance","pointBeforeText","afterTextDistance","pointAfterText","arrowHeadWidth","arrowHeadLengthScaled","drawIconWithOptionalCounter","icon","iconX","iconY","iconSize","counter","textColor","fontSize","counterText","spacing","offsetX","error","renderNodeButtons","nodeSize","buttonRadius","buttonCount","sectorAngle","startAngle","endAngle","isHovered","midAngle","iconDistance","buttonImage","getImageUrl","imgValue","normalImgUrl","hoverImgUrl","getOrCreateImage","url","img","normalImg","hoverImg","spinnerRadius","dotRadius","j","alpha","dotX","dotY","hexToRgba","renderCanvas2D","renderTooltip","borderRadius","lineHeight","offsetY","textHeight","tooltipWidth","tooltipHeight","tooltipX","tooltipY","rect","shadowMatch","renderNodes","nodeColor","fontColor","label","isSelected","size","radius","ringRadius","truncatedLabel","addNodes","newNodes","newLinks","options","callback","smoothAppearance","transitionDuration","existingNodeIds","filteredNewNodes","existingLinkIds","filteredNewLinks","linkId","updatedNodes","updatedLinks","connectedLinks","sourceId","targetId","someLink","connectedNodeId","connectedNode","randomOffset","randomAngle","centerX","centerY","removeNodes","nodeIds","nodeIdsToRemove","id","remainingNodes","remainingLinks","highlightLinksToRemove","zoomToFit","duration","minX","minY","maxX","maxY","contentWidth","contentHeight","scaleX","scaleY","newTransform","startTransform","startTime","animateZoom","t","easedT","interpolatedTransform","zoomToSelected","selectedIds","selectedNodes","zoomToNodes","nodeIdsSet","targetNodes","setSelectedNodes","setNodeSizes","forceCollide","setNodeColors","setLinkWidths","linkIds","setLinkColors","findShortestPath","sourceNode","targetNode","adjacencyMap","sourceNodeId","targetNodeId","queue","visited","current","nodeId","arrangeSelectedInGrid","nodesToArrange","sum","rows","gridWidth","gridHeight","startX","startY","col","row","newX","newY","arrangeNodesByTypeInGrid","typeKey","groupSpacing","groups","value","groupKey","groupCount","groupGridColumns","totalCenterX","totalCenterY","groupIndex","groupDimensions","groupNodes","groupColumns","maxGroupWidth","d","maxGroupHeight","groupGridRows","totalGridWidth","totalGridHeight","groupGridStartX","groupGridStartY","groupCol","groupRow","groupCenterX","groupCenterY","getNodeAtPosition","pixelRatio","scaledX","scaledY","nodeRadius","getLinkAtPosition","threshold","sourceX","sourceY","targetX","targetY","A","B","C","D","dot","lenSq","param","xx","yy","isPointInButtonSector","mouseX","mouseY","nodeX","nodeY","isInRadius","isInAngle","handleNodeHover","handleLinkHover","event","newHighlightNodes","newHighlightLinks","handleLinkClick","handleNodeClick","handleBackgroundClick","handleMouseDown","getHoveredIndex","hoveredIndex","canvasScaleX","canvasScaleY","scaledMouseX","scaledMouseY","worldX","worldY","shouldRender","hoveredNode","hoveredLink","shouldRenderLink","handleClick","handleMouseUp","wasDragging","isButtonClick","clickedLink","alphaValue","alphaDecayValue","velocityDecayValue","handleWheel","scaleFactor","currentTransform","newScale","newK","convertTouchToMouseEvent","touch","syntheticEvent","handleTouchEnd","useImperativeHandle","canvasElement","linkDistance","simulation","forceSimulation","forceLink","forceManyBody","forceX","forceY","forceCenter","useLayoutEffect","canvas","Wrapper","Canvas","FullscreenCard","isActive","position","bottom","offset","StyledBackdrop","$left","$right","$bottom","$position","$offset","offsetTop","offsetLeft","offsetRight","offsetBottom","$isActive","ImageDriver","setScale","scaleBy","setScaleBy","imgRef","React","Controls","Button","MinusIcon","prev","Box","PlusIcon","ScrollArea","AudioDriver","PdfDriverWrapper","PdfDriverComponent","setPdfDriverComponent","isClient","setIsClient","setLoading","setError","module","err","placeholder","MAX_SIZE_MB","TIMEOUT_MS","DocxDriver","blob","wrapperRef","userHasZoomedRef","naturalSize","setNaturalSize","naturalWidthRef","handleZoomIn","handleZoomOut","docBlob","renderPromise","renderAsync","timeoutPromise","_","reject","resolve","docxWrapper","autoScale","handleResize","throttle","entries","entry","observer","ErrorMsg","LoadingMsg","ScaleContainer","DocxContent","_spinKeyframe","keyframes","getLanguageExtension","extension","javascript","json","html","css","python","java","cpp","php","rust","xml","yaml","markdown","sql","TextDriver","setContent","containerHeight","setContainerHeight","response","update","StatusMsg","CodeMirror","vscodeDark","VideoDriver","Driver","memo","path","buffer","not_supported_message","normalizedExtension","NotSupported","Typography","FileViewer"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ReactElement } from 'react';\nimport { styled } from 'styled-components';\n\ninterface PageLayoutProps {\n children?: any;\n className?: string;\n}\n\nexport const PageLayout = ({ children, className }: PageLayoutProps) => {\n return <StyledContainer className={className}>{children}</StyledContainer>;\n};\n\nexport const StyledContainer = styled.div`\n display: grid;\n min-height: 100dvh;\n position: relative;\n grid-template-columns: auto auto 1fr;\n grid-template-rows: auto 1fr;\n grid-template-areas: 'sidebar header header' 'sidebar sub-nav content';\n\n & > header {\n grid-area: header;\n }\n`;\n","import { styled } from 'styled-components';\n\ninterface ContentProps {\n children: any;\n className?: string;\n}\nexport const PageContent = ({ children, className }: ContentProps) => {\n return <StyledMain className={className}>{children}</StyledMain>;\n};\n\nexport const StyledMain = styled.main`\n grid-area: content;\n min-width: 0;\n background: ${({ theme }) => theme.colors.backgroundBase};\n`;\n","import { styled } from 'styled-components';\n\ninterface SubNavProps {\n children?: any;\n className?: string;\n top?: number;\n}\nexport const SubNav = ({ children, className, top = 0 }: SubNavProps) => {\n return (\n <Styled className={className} $top={top} onClick={(e) => e.stopPropagation()}>\n {children}\n </Styled>\n );\n};\ntype StyledProps = {\n $top: number;\n};\nexport const Styled = styled.div<StyledProps>(\n ({ theme, $top }) => `\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n position: fixed;\n left: 0;\n grid-area: sub-nav;\n min-width: 0;\n background: ${theme.colors.background};\n max-height: calc(100dvh - ${$top}px);\n height: 100%;\n z-index: 1001;\n top: ${$top}px;\n overflow: auto;\n @media (min-width: ${theme.breakpoints.xl}px){\n position: sticky;\n border-right: 1px solid ${theme.colors.stroke.light};\n }\n`\n);\n","import {\n createComponent,\n createStyledComponent,\n FabricComponent,\n generatePropertySpaceStyle,\n pxToRem,\n} from '../../Theme';\nimport { styled } from 'styled-components';\n\ntype ContainerProps = {\n children: any;\n maxWidth?: string | number;\n};\n\ntype StyledContainerProps = {\n $maxWidth?: string | number;\n};\n\nexport const Container = createComponent<ContainerProps>(({ maxWidth, ...props }) => {\n return <StyledContainer {...props} $maxWidth={maxWidth} />;\n});\n\nconst StyledContainer = createStyledComponent<FabricComponent<StyledContainerProps>>(\n styled.div(({ theme, $maxWidth, px = 20 }) => {\n return `\n ${generatePropertySpaceStyle(theme, 'padding-inline', px)}\n width: 100%;\n min-width: 0;\n max-width: ${typeof $maxWidth === 'number' ? pxToRem($maxWidth, theme.baseSize) : $maxWidth || '100%'};\n `;\n }),\n { ignoreStyles: ['padding-inline'] }\n);\n","import { Fragment, useCallback, useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\n\ntype SplitterLayoutProps = {\n columns: { content: React.ReactNode; className?: string; style?: React.CSSProperties }[];\n style?: React.CSSProperties;\n className?: string;\n splitterClassName?: string;\n initialWidths: number[];\n minWidth?: number;\n storageKey?: string;\n};\n\nconst MIN_WIDTH = 20;\nconst STORAGE_KEY = 'splitter_columns_widths';\n\nconst getSavedWidths = (key: string, length: number, initialWidths: number[]): number[] => {\n const saved = localStorage.getItem(key);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length === length) return parsed;\n } catch {\n // ignore\n }\n } else if (initialWidths.length === length) {\n return initialWidths;\n }\n return Array(length).fill(100 / length);\n};\n\nexport const SplitterLayout = ({\n columns,\n initialWidths,\n style,\n className,\n splitterClassName,\n minWidth = MIN_WIDTH,\n storageKey = STORAGE_KEY,\n}: SplitterLayoutProps) => {\n const [widths, setWidths] = useState<number[]>(() => getSavedWidths(storageKey, columns.length, initialWidths));\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeIndex = useRef<number | null>(null);\n const minWidthRef = useRef<number>(minWidth);\n const widthsRef = useRef<number[]>(widths);\n\n const handleMove = useCallback((clientX: number) => {\n if (activeIndex.current === null || !containerRef.current) return;\n\n const container = containerRef.current.getBoundingClientRect();\n const totalWidth = container.width;\n const x = clientX - container.left;\n\n const newWidths = [...widthsRef.current];\n const left = activeIndex.current;\n const right = left + 1;\n\n const prevWidthsSum = newWidths.slice(0, left).reduce((a, b) => a + b, 0);\n const leftWidth = (x / totalWidth) * 100 - prevWidthsSum;\n const rightWidth = newWidths[left] + newWidths[right] - leftWidth;\n\n if (leftWidth >= minWidthRef.current && rightWidth >= minWidthRef.current) {\n newWidths[left] = leftWidth;\n newWidths[right] = rightWidth;\n setWidths(newWidths);\n widthsRef.current = newWidths;\n }\n }, []);\n\n const handleMouseMove = useCallback((e: MouseEvent) => handleMove(e.clientX), [handleMove]);\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n e.preventDefault();\n handleMove(e.touches[0].clientX);\n },\n [handleMove]\n );\n\n const stopResizing = useCallback(() => {\n activeIndex.current = null;\n localStorage.setItem(storageKey, JSON.stringify(widthsRef.current));\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', stopResizing);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', stopResizing);\n }, [handleMouseMove, handleTouchMove, storageKey]);\n\n const startResizing = useCallback(\n (index: number) => (e: React.MouseEvent) => {\n e.preventDefault();\n activeIndex.current = index;\n document.addEventListener('mousemove', handleMouseMove, { passive: false });\n document.addEventListener('mouseup', stopResizing);\n },\n [handleMouseMove, stopResizing]\n );\n\n const handleTouchStart = useCallback(\n (index: number) => (e: React.TouchEvent) => {\n e.preventDefault();\n activeIndex.current = index;\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', stopResizing);\n },\n [handleTouchMove, stopResizing]\n );\n\n useEffect(() => {\n const saved = getSavedWidths(storageKey, columns.length, initialWidths);\n widthsRef.current = saved;\n setWidths(saved);\n }, [columns.length, initialWidths, storageKey]);\n\n return (\n <Container ref={containerRef} style={style} className={className}>\n {columns.map(({ content, className: colClassName, style: colStyle }, i) => (\n <Fragment key={i}>\n <Column style={{ flex: `${widths[i]} 1 0%`, ...colStyle }} className={colClassName}>\n {content}\n </Column>\n {i < columns.length - 1 && (\n <Splitter onMouseDown={startResizing(i)} onTouchStart={handleTouchStart(i)} className={splitterClassName}>\n <SplitterHandle>\n <svg\n style={{ width: 14, height: 14, flexShrink: 0 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </svg>\n </SplitterHandle>\n </Splitter>\n )}\n </Fragment>\n ))}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n user-select: none;\n`;\n\nconst Column = styled.div`\n min-width: 0;\n`;\n\nconst Splitter = styled.div(\n ({ theme }) => `\n position: relative;\n z-index: 100;\n display: none;\n border-left: 1px solid ${theme.colors.stroke.light};\n\n @media (min-width: 1024px) {\n display: flex;\n position: sticky;\n top: 0;\n }\n`\n);\n\nconst SplitterHandle = styled.span(\n ({ theme }) => `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 24px;\n background: ${theme.colors.background};\n border: 1px solid ${theme.colors.stroke.light};\n color: ${theme.colors.text.lighter};\n border-radius: 6px;\n cursor: col-resize;\n\n &:hover {\n background: ${theme.colors.stroke.lighter};\n }\n`\n);\n","import React from 'react';\nimport ContentLoader from 'react-content-loader';\nimport styled, { useTheme } from 'styled-components';\n\nconst LoaderWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\ninterface GraphLoaderProps {\n width?: number;\n height?: number;\n}\n\nconst GraphLoader: React.FC<GraphLoaderProps> = ({ width = 280, height = 280 }) => {\n // Допоміжна функція для створення rect з координат лінії\n const theme = useTheme();\n\n return (\n <LoaderWrapper>\n <ContentLoader\n foregroundColor={theme.contentLoader.foreground}\n backgroundColor={theme.contentLoader.background}\n width={width}\n height={height}\n viewBox=\"0 0 280 280\"\n >\n <path d=\"m55 38-0.97266 0.22852 7.0801 30.092-18.355-20.979-0.75195 0.6582 19.596 22.395 0.43164 1.834 0.97266-0.22852 0.75195-0.6582-0.37695-0.42969 9.625-27.912-0.94531-0.32617-9.4375 27.371-0.10547-0.12109zm8 34-0.78516 0.61914 0.0957 0.12305-12.311 13.258 0.73242 0.67969 12.205-13.145 14.277 18.084 0.78516-0.61914-14.373-18.207 0.10547-0.11328zm15 19-0.48438 0.875 46.992 25.996 8e-3 4e-3 20.506 11.592-28.182 4.5449 0.15998 0.98819 29.418-4.7441 0.25 0.14062-12.555 24.143 0.88672 0.46094 13-25 15 25 26 30v18l-11 18 0.85352 0.52148 9.8008-16.039-4.6543 33.518 0.99023 0.13867 4.7793-34.408 7.2305 16.27 0.91406-0.40625-7.9141-17.807v-17.104l18 12.316 0.56445-0.82617-18.896-12.928-25.855-29.836-14.633-24.387 0.01562-0.02344h23.805v-1h-23.152l13.848-21.234 55.201-28.791-0.45898-0.88476 0.77734 0.62305 11.402-14.25 16.668-11.842-0.58008-0.81641-16.785 11.928-11.486 14.355-55.434 28.912-14.277 21.893-7.7617-27.166-0.96094 0.27344 7.7227 27.031-1.1191 0.17969-21.604-12.211zm140.43-12.912-6.957-17.338-0.92773 0.37305 6.957 17.338zm-6.957-17.338 0.72266 0.69336 16.232-16.896-0.7207-0.69336zm-3.4766 137.25 5 15 0.94922-0.31641-5-15zm-91-63-0.48047-0.87695-31 17 0.48047 0.87695zm-31 17 5 18 0.96289-0.26758-5-18zm0 0-0.70703-0.70703-12.898 12.898-17.881 9.9336 0.48633 0.875 18-10zm5 18-0.64062-0.76758-18 15 0.64062 0.76758z\" />\n <circle cx=\"229.92\" cy=\"63.7318\" r=\"5\" transform=\"rotate(173.661 229.92 63.7318)\" />\n <circle cx=\"227.711\" cy=\"43.8541\" r=\"5\" transform=\"rotate(173.661 227.711 43.8541)\" />\n <circle cx=\"211.478\" cy=\"60.7499\" r=\"5\" transform=\"rotate(173.661 211.478 60.7499)\" />\n <circle cx=\"218.434\" cy=\"78.0877\" r=\"5\" transform=\"rotate(173.661 218.434 78.0877)\" />\n <circle cx=\"246.705\" cy=\"51.8054\" r=\"5\" transform=\"rotate(173.661 246.705 51.8054)\" />\n <circle cx=\"42\" cy=\"48\" r=\"5\" />\n <circle cx=\"55\" cy=\"38\" r=\"5\" />\n <circle cx=\"73\" cy=\"43\" r=\"5\" />\n <circle cx=\"63\" cy=\"72\" r=\"5\" />\n <circle cx=\"50\" cy=\"86\" r=\"5\" />\n <circle cx=\"78\" cy=\"91\" r=\"5\" />\n <circle cx=\"73\" cy=\"165\" r=\"5\" />\n <circle cx=\"73\" cy=\"185\" r=\"5\" />\n <circle cx=\"91\" cy=\"170\" r=\"5\" />\n <circle cx=\"86\" cy=\"152\" r=\"5\" />\n <circle cx=\"148\" cy=\"130\" r=\"5\" />\n <circle cx=\"189\" cy=\"185\" r=\"5\" />\n <circle cx=\"163\" cy=\"107\" r=\"5\" />\n <circle cx=\"140\" cy=\"102\" r=\"5\" />\n <circle cx=\"117\" cy=\"135\" r=\"5\" />\n <circle cx=\"125\" cy=\"117\" r=\"5\" />\n <circle cx=\"208\" cy=\"198\" r=\"5\" />\n <circle cx=\"189\" cy=\"203\" r=\"5\" />\n <circle cx=\"198\" cy=\"221\" r=\"5\" />\n <circle cx=\"178\" cy=\"221\" r=\"5\" />\n <circle cx=\"184\" cy=\"239\" r=\"5\" />\n <circle cx=\"213\" cy=\"213\" r=\"5\" />\n <circle cx=\"173\" cy=\"130\" r=\"5\" />\n <circle cx=\"163\" cy=\"155\" r=\"5\" />\n <circle cx=\"135\" cy=\"155\" r=\"5\" />\n <circle cx=\"55\" cy=\"175\" r=\"5\" />\n </ContentLoader>\n </LoaderWrapper>\n );\n};\n\nexport default GraphLoader;\n","// Функція для переносу тексту по maxWidth для canvas\nexport function wrapText(ctx: CanvasRenderingContext2D, text: string, maxWidth: number): string[] {\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n paragraphs.forEach((paragraph) => {\n let words = paragraph.split(' ');\n let line = '';\n for (let n = 0; n < words.length; n++) {\n let testLine = line + (line ? ' ' : '') + words[n];\n let metrics = ctx.measureText(testLine);\n let testWidth = metrics.width;\n if (testWidth > maxWidth && line) {\n lines.push(line);\n line = words[n];\n } else {\n line = testLine;\n }\n }\n lines.push(line);\n });\n return lines;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useLayoutEffect,\n} from 'react';\nimport { Graph2DProps, LinkObject, NodeObject, Graph2DRef, GraphState } from './types';\n\nimport cloneDeep from 'lodash.clonedeep';\n\nimport {\n forceCenter,\n forceLink,\n forceManyBody,\n forceSimulation,\n forceCollide,\n forceX,\n forceY,\n Simulation,\n ForceLink,\n scaleOrdinal,\n schemeCategory10,\n} from 'd3';\nimport { styled, useTheme } from 'styled-components';\nimport GraphLoader from './GraphLoader';\nimport { hexToRgba } from '../Theme';\nimport { wrapText } from './wrapText';\n\nconst RATIO = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n// Завантаження та підготовка зображень кнопок\nfunction prepareButtonImages(buttons: Graph2DProps['buttons']) {\n if (!buttons || buttons.length === 0) return [];\n\n return buttons.map((button) => {\n return {\n ...button,\n imageCache: new Map<string, HTMLImageElement>(),\n };\n });\n}\n\n// Конфігурація подібна до Graph2D\nconst config = {\n fontSize: 4,\n nodeSizeBase: 30,\n nodeAreaFactor: 2,\n nodeBorderWidth: 1,\n textPaddingFactor: 0.9,\n gridSpacing: 20,\n dotSize: 1,\n maxZoom: 4,\n};\n\n// Helper функція для отримання розміру ноди\nconst getNodeSize = (node: NodeObject): number => {\n return node.size ?? config.nodeSizeBase;\n};\n\n// Helper функція для отримання ширини лінії\nconst getLinkWidth = (link: LinkObject, isHighlighted: boolean): number => {\n if (link.width !== undefined) {\n return isHighlighted ? link.width * 2 : link.width;\n }\n return isHighlighted ? 1.5 : 0.5;\n};\n\nexport const Graph2D: any = forwardRef<Graph2DRef, Graph2DProps>(\n (\n {\n loading,\n width,\n height,\n graphData,\n buttons = [],\n enableGrid = true,\n onNodeClick,\n onBackgroundClick,\n onNodeHover,\n onLinkHover,\n onLinkClick,\n onChangeSelectedNodeIds,\n },\n ref\n ) => {\n const theme = useTheme();\n const [isRendering, setIsRendering] = useState(true);\n const [tooltipPosition, setTooltipPosition] = useState<{ x: number; y: number } | null>(null);\n const [tooltipContent, setTooltipContent] = useState<any>(null);\n\n const stateRef = useRef<GraphState>({\n transform: { x: 0, y: 0, k: 1 }, // x, y для переміщення, k для масштабу\n isPanning: false,\n hoveredNode: null,\n hoveredLink: null,\n draggedNode: null,\n selectedNodeIds: new Set(),\n hoveredButtonIndex: null,\n highlightNodes: new Set(),\n highlightLinks: new Set(),\n lastMousePos: { x: 0, y: 0 },\n mustBeStoppedPropagation: false,\n mouseStartPos: null,\n isDragging: false,\n width: width * RATIO,\n height: height * RATIO,\n animation: {\n id: null,\n buttonIndex: null,\n },\n spinnerAngle: 0,\n });\n\n const { nodes, links } = useMemo(() => cloneDeep(graphData), [graphData]);\n\n // Стани кнопок\n const [buttonImages, setButtonImages] = useState<any[]>([]);\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const simulationRef = useRef<Simulation<NodeObject, LinkObject> | null>(null);\n\n // Контекст Canvas для 2D рендерингу\n const ctx2dRef = useRef<CanvasRenderingContext2D | null>(null);\n const color = scaleOrdinal(schemeCategory10);\n\n // Ініціалізація контексту Canvas 2D\n const init2DCanvas = useCallback(() => {\n if (!canvasRef.current) return false;\n\n try {\n const ctx = canvasRef.current.getContext('2d');\n if (!ctx) {\n console.error('Failed to get 2D context');\n return false;\n }\n\n ctx2dRef.current = ctx;\n return true;\n } catch (e) {\n console.error('Error initializing Canvas 2D context:', e);\n return false;\n }\n }, []);\n\n const getNodes = useCallback(() => {\n if (!simulationRef.current) return null;\n return simulationRef.current.nodes();\n }, []);\n\n const getLinks = useCallback(() => {\n if (!simulationRef.current) return null;\n\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n const links = linkForce ? linkForce.links() : null;\n return links;\n }, []);\n\n // Рендеринг сітки на полотні\n const renderGrid = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n // Перевіряємо, чи увімкнена сітка\n if (!enableGrid) return;\n\n // Зберігаємо поточний стан контексту\n ctx.save();\n\n // Скидаємо трансформацію для малювання фону в координатах екрану\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n\n // Малюємо фонові крапки\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n const gridSpacing = config.gridSpacing;\n const dotSize = config.dotSize;\n\n ctx.fillStyle = theme.graph2D.grid.dotColor;\n\n for (let x = gridSpacing / 2; x <= canvasWidth; x += gridSpacing) {\n for (let y = gridSpacing / 2; y <= canvasHeight; y += gridSpacing) {\n ctx.beginPath();\n ctx.arc(x, y, dotSize, 0, 2 * Math.PI);\n ctx.fill();\n }\n }\n\n // Відновлюємо оригінальну трансформацію для іншого рендерингу\n ctx.restore();\n },\n [enableGrid, theme.graph2D.grid.dotColor, config.gridSpacing, config.dotSize]\n );\n\n // Функція для обрізання тексту з додаванням трикрапки\n const truncateText = useCallback((text: string, maxWidth: number, ctx: CanvasRenderingContext2D): string => {\n if (!text) return '';\n\n // Вимірюємо ширину тексту\n const textWidth = ctx.measureText(text).width;\n\n // Повертаємо як є, якщо коротше за максимальну ширину\n if (textWidth <= maxWidth) return text;\n\n // Інакше обрізаємо і додаємо трикрапку\n let truncated = text;\n const ellipsis = '...';\n\n // Поступово зменшуємо текст, поки він не поміститься\n while (ctx.measureText(truncated + ellipsis).width > maxWidth && truncated.length > 0) {\n truncated = truncated.slice(0, -1);\n }\n\n return truncated + ellipsis;\n }, []);\n\n // Розрахунок розміру шрифту на основі масштабу/зуму\n const calculateFontSize = (scale: number): number => {\n // Обмежуємо масштаб до максимального зуму\n const limitedScale = Math.min(scale, config.maxZoom);\n\n // Масштабуємо розмір шрифту пропорційно\n const fontSizeRatio = limitedScale / config.maxZoom;\n\n return Math.max(config.fontSize * fontSizeRatio, config.fontSize);\n };\n\n // Рендеринг зв'язків на полотні - подібно до реалізації Graph2D\n const renderLinks = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n const links = getLinks();\n const nodes = getNodes();\n if (!links || links.length === 0 || !nodes || nodes.length === 0) return;\n ctx.lineWidth = 0.5;\n ctx.globalAlpha = 1.0;\n\n links.forEach((link) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Координати для початку і кінця\n const start = { x: source.x || 0, y: source.y || 0 };\n const end = { x: target.x || 0, y: target.y || 0 };\n\n // Обчислення відстані і напрямку\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n // Нормалізований вектор напрямку\n const unitDx = dx / distance;\n const unitDy = dy / distance;\n\n // Коригування радіусу вузлів\n const sourceRadius = getNodeSize(source) / 2;\n const targetRadius = getNodeSize(target) / 2;\n const arrowHeadLength = 4;\n\n // Коригуємо початкову і кінцеву позиції, щоб починалися/закінчувалися на краях вузлів\n const adjustedStart = {\n x: start.x + unitDx * sourceRadius,\n y: start.y + unitDy * sourceRadius,\n };\n\n const adjustedEnd = {\n x: end.x - unitDx * (targetRadius + arrowHeadLength),\n y: end.y - unitDy * (targetRadius + arrowHeadLength),\n };\n\n const adjusteArrowdEnd = {\n x: end.x - unitDx * (targetRadius + 1),\n y: end.y - unitDy * (targetRadius + 1),\n };\n\n // Колір лінії залежить від стану виділення\n const isHighlighted = stateRef.current.highlightLinks.has(link);\n const lineColor = isHighlighted ? theme.graph2D.link.highlighted : link.color || theme.graph2D.link.normal;\n const lineWidth = getLinkWidth(link, isHighlighted);\n\n // Обчислення середини лінії для розміщення тексту\n const middleX = start.x + (end.x - start.x) / 2;\n const middleY = start.y + (end.y - start.y) / 2;\n const angle = Math.atan2(dy, dx);\n\n // Малюємо лінію у дві частини, якщо є мітка\n if (link.label) {\n // Обчислюємо ширину тексту для проміжку\n const globalScale = stateRef.current.transform.k;\n const scaledFontSize = calculateFontSize(globalScale);\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n const textWidth = ctx.measureText(link.label).width;\n const padding = 10; // Додатковий простір навколо тексту\n\n // Перша частина лінії\n ctx.beginPath();\n ctx.moveTo(adjustedStart.x, adjustedStart.y);\n\n // Обчислюємо точку перед текстом\n const beforeTextDistance = distance / 2 - (textWidth + padding) / 2;\n const pointBeforeText = {\n x: start.x + unitDx * beforeTextDistance,\n y: start.y + unitDy * beforeTextDistance,\n };\n ctx.lineTo(pointBeforeText.x, pointBeforeText.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n\n // Друга частина лінії\n ctx.beginPath();\n // Обчислюємо точку після тексту\n const afterTextDistance = distance / 2 + (textWidth + padding) / 2;\n const pointAfterText = {\n x: start.x + unitDx * afterTextDistance,\n y: start.y + unitDy * afterTextDistance,\n };\n ctx.moveTo(pointAfterText.x, pointAfterText.y);\n ctx.lineTo(adjustedEnd.x, adjustedEnd.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n } else {\n // Малюємо суцільну лінію якщо немає мітки\n ctx.beginPath();\n ctx.moveTo(adjustedStart.x, adjustedStart.y);\n ctx.lineTo(adjustedEnd.x, adjustedEnd.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n }\n\n // Малюємо стрілку\n const arrowHeadWidth = Math.max(2, lineWidth * 2);\n const arrowHeadLengthScaled = Math.max(4, lineWidth * 4);\n\n ctx.save();\n ctx.translate(adjusteArrowdEnd.x, adjusteArrowdEnd.y);\n ctx.rotate(angle);\n\n // Наконечник стрілки\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(-arrowHeadLengthScaled, arrowHeadWidth);\n ctx.lineTo(-arrowHeadLengthScaled, 0);\n ctx.lineTo(-arrowHeadLengthScaled, -arrowHeadWidth);\n ctx.closePath();\n\n ctx.fillStyle = lineColor;\n ctx.fill();\n ctx.restore();\n\n // Малюємо мітку, якщо вона є\n if (link.label) {\n // Ми вже обчислили ці значення раніше\n // const середнєX = start.x + (end.x - start.x) / 2;\n // const середнєY = start.y + (end.y - start.y) / 2;\n\n const globalScale = stateRef.current.transform.k; // Використовуємо поточний рівень масштабування\n const scaledFontSize = calculateFontSize(globalScale);\n\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n // Повертаємо текст, щоб він співпадав з кутом лінії\n ctx.save();\n ctx.translate(middleX, middleY);\n\n // Коригуємо обертання, якщо текст буде перевернутим\n if (Math.abs(angle) > Math.PI / 2) {\n ctx.rotate(angle + Math.PI);\n } else {\n ctx.rotate(angle);\n }\n\n // Видалено фон для чистішого вигляду\n\n // Малюємо текст\n ctx.fillStyle = isHighlighted ? theme.graph2D.link.highlightedTextColor : theme.graph2D.link.textColor;\n\n ctx.fillText(link.label, 0, 0);\n ctx.restore();\n }\n });\n },\n [config, theme.graph2D.link]\n );\n\n const drawIconWithOptionalCounter = (\n ctx: CanvasRenderingContext2D,\n icon: HTMLImageElement,\n iconX: number,\n iconY: number,\n iconSize: number,\n counter: number | null | undefined,\n textColor?: string\n ) => {\n try {\n if (counter !== null && counter !== undefined) {\n const fontSize = iconSize * 0.8;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'left';\n\n const counterText = new Intl.NumberFormat('en', {\n notation: 'compact',\n maximumFractionDigits: 1,\n minimumFractionDigits: 0,\n compactDisplay: 'short',\n }).format(counter);\n\n const textWidth = ctx.measureText(counterText).width;\n const spacing = iconSize * 0.3;\n const totalWidth = iconSize + spacing + textWidth;\n const offsetX = totalWidth / 2;\n\n ctx.drawImage(icon, iconX - offsetX, iconY - iconSize / 2, iconSize, iconSize);\n ctx.fillStyle = textColor || '#99989C';\n ctx.fillText(counterText, iconX - offsetX + iconSize + spacing, iconY);\n } else {\n ctx.drawImage(icon, iconX - iconSize / 2, iconY - iconSize / 2, iconSize, iconSize);\n }\n } catch (error) {\n console.warn('Error rendering icon:', error);\n }\n };\n // Функція для рендерингу кнопок навколо вузла\n const renderNodeButtons = useCallback(\n (node: NodeObject, ctx: CanvasRenderingContext2D) => {\n if (!buttonImages || buttonImages.length === 0) return;\n if (!node || !node.x || !node.y) return;\n\n const { x, y } = node;\n const nodeSize = getNodeSize(node);\n const buttonRadius = (nodeSize * config.nodeAreaFactor) / 2;\n\n // Зберігаємо стан канвасу\n ctx.save();\n\n // Обчислюємо кількість кнопок і їхніх секторів\n const buttonCount = Math.min(buttonImages.length, 8); // Обмежуємо до максимум 8 кнопок для ясності інтерфейсу\n const sectorAngle = Math.min((Math.PI * 2) / buttonCount, Math.PI); // Максимальний кут сектора - півколо (PI)\n\n // Малюємо кнопки як сектори навколо вузла\n for (let i = 0; i < buttonCount; i++) {\n const startAngle = i * sectorAngle;\n const endAngle = (i + 1) * sectorAngle;\n const isHovered = stateRef.current.hoveredButtonIndex === i;\n\n // Малюємо фон сектора кнопки\n ctx.beginPath();\n ctx.arc(x, y, buttonRadius, startAngle, endAngle, false);\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.lineWidth = 1;\n ctx.strokeStyle = theme.graph2D?.button?.stroke || '#FFFFFF';\n ctx.stroke();\n ctx.fillStyle = isHovered\n ? theme.graph2D?.button?.hoverFill || 'rgba(255, 255, 255, 0.3)'\n : theme.graph2D?.button?.normalFill || 'rgba(255, 255, 255, 0.1)';\n ctx.fill();\n\n // Обчислюємо позицію для іконки\n // Розташовуємо іконку в середині сектора\n const iconSize = buttonRadius * 0.2;\n const midAngle = (startAngle + endAngle) / 2;\n const iconDistance = buttonRadius - nodeSize / 2 + iconSize; // Коригуємо відстань, щоб уникнути перекриття з вузлом\n const iconX = x + Math.cos(midAngle) * iconDistance;\n const iconY = y + Math.sin(midAngle) * iconDistance;\n\n // Вибираємо відповідну іконку залежно від стану наведення\n const buttonImage = buttonImages[i];\n // Якщо кнопка в лоадінгу — малюємо спінер\n const loading = typeof buttonImage.loading === 'function' ? buttonImage.loading(node) : buttonImage.loading;\n\n // Отримуємо URL зображення (може бути функцією або рядком)\n const getImageUrl = (imgValue: string | ((node: NodeObject) => string)) => {\n return typeof imgValue === 'function' ? imgValue(node) : imgValue;\n };\n\n const normalImgUrl = getImageUrl(buttonImage.img);\n const hoverImgUrl = getImageUrl(buttonImage.hoverImg);\n\n // Отримуємо або створюємо зображення з кешу\n const getOrCreateImage = (url: string) => {\n if (!buttonImage.imageCache.has(url)) {\n const img = new Image();\n img.src = url;\n buttonImage.imageCache.set(url, img);\n }\n return buttonImage.imageCache.get(url)!;\n };\n\n const normalImg = getOrCreateImage(normalImgUrl);\n const hoverImg = getOrCreateImage(hoverImgUrl);\n\n if (loading) {\n const spinnerRadius = iconSize / 2;\n const dotRadius = iconSize / 12;\n\n ctx.save();\n ctx.translate(iconX, iconY);\n ctx.rotate(stateRef.current.spinnerAngle);\n\n // Малюємо кілька променів (ліній) по колу\n for (let j = 0; j < 12; j++) {\n const angle = (Math.PI * 2 * j) / 12;\n const alpha = j / 12;\n\n const dotX = Math.cos(angle) * spinnerRadius;\n const dotY = Math.sin(angle) * spinnerRadius;\n\n ctx.beginPath();\n ctx.fillStyle = hexToRgba(theme.graph2D?.button?.spinnerColor, alpha);\n ctx.arc(dotX, dotY, dotRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n ctx.restore();\n\n stateRef.current.spinnerAngle += 0.1;\n if (stateRef.current.spinnerAngle > Math.PI * 2) {\n stateRef.current.spinnerAngle -= Math.PI * 2;\n }\n if (stateRef.current.animation.id !== null) {\n cancelAnimationFrame(stateRef.current.animation.id);\n stateRef.current.animation.id = null;\n stateRef.current.animation.buttonIndex = null;\n }\n\n stateRef.current.animation.id = requestAnimationFrame(renderCanvas2D);\n stateRef.current.animation.buttonIndex = i;\n } else {\n if (stateRef.current.animation.id && stateRef.current.animation.buttonIndex === i) {\n cancelAnimationFrame(stateRef.current.animation.id);\n stateRef.current.animation.id = null;\n stateRef.current.animation.buttonIndex = null;\n }\n const icon = isHovered ? hoverImg : normalImg;\n //каунтер може не існувати\n const counter = buttonImage.getCount ? buttonImage.getCount(node) : null;\n // Малюємо іконку\n if (icon.complete) {\n drawIconWithOptionalCounter(ctx, icon, iconX, iconY, iconSize, counter, theme.graph2D?.button?.textColor);\n } else {\n // Встановлюємо обробник onload, якщо зображення ще не завантажено\n icon.onload = () => {\n if (ctx2dRef.current) {\n drawIconWithOptionalCounter(\n ctx,\n icon,\n iconX,\n iconY,\n iconSize,\n counter,\n theme.graph2D?.button?.textColor\n );\n }\n };\n }\n }\n }\n\n ctx.restore();\n },\n [buttonImages, theme.graph2D?.button]\n );\n\n // Рендеринг tooltip в canvas\n const renderTooltip = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n if (!tooltipContent || !tooltipPosition) return;\n\n const padding = Number(theme.tooltip.padding) || 10;\n const maxWidth = Number(theme.tooltip.maxWidth) || 200;\n const fontSize = Number(theme.tooltip.fontSize) || 14;\n const borderRadius = Number(theme.tooltip.borderRadius) || 4;\n const lineHeight = 1.4;\n const offsetY = 10; // Зміщення вище курсора\n\n ctx.save();\n\n // Встановлюємо шрифт для вимірювання тексту\n ctx.font = `${fontSize}px Sans-Serif`;\n\n // Вимірюємо текст і обчислюємо розміри tooltip\n const text = typeof tooltipContent === 'string' ? tooltipContent : String(tooltipContent);\n const lines = wrapText(ctx, text, maxWidth);\n const textWidth = Math.min(maxWidth, Math.max(...lines.map((line) => ctx.measureText(line).width)));\n const textHeight = lines.length * fontSize * lineHeight;\n\n const tooltipWidth = textWidth + padding * 2;\n const tooltipHeight = textHeight + padding * 2;\n\n // Позиція tooltip (трішки вище курсора)\n let tooltipX = tooltipPosition.x - tooltipWidth / 2;\n let tooltipY = tooltipPosition.y - tooltipHeight - offsetY;\n\n // Перевіряємо, щоб tooltip не виходив за межі canvas\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n if (tooltipX < 5) tooltipX = 5;\n if (tooltipX + tooltipWidth > rect.width - 5) tooltipX = rect.width - tooltipWidth - 5;\n if (tooltipY < 5) tooltipY = tooltipPosition.y + offsetY; // Показуємо знизу якщо не вміщається зверху\n }\n\n // Малюємо фон tooltip з тінню\n // Парсимо box-shadow з theme (наприклад \"0px 4px 10px 0px rgba(0, 0, 0, 0.15)\")\n // Формат: offsetX offsetY blur [spread] color\n const shadowMatch = theme.tooltip.shadow?.match(\n /(-?\\d+(?:\\.\\d+)?(?:px)?)\\s+(-?\\d+(?:\\.\\d+)?(?:px)?)\\s+(-?\\d+(?:\\.\\d+)?(?:px)?)(?:\\s+(-?\\d+(?:\\.\\d+)?(?:px)?))?\\s+(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|\\w+)/\n );\n\n if (shadowMatch) {\n ctx.shadowOffsetX = parseFloat(shadowMatch[1]);\n ctx.shadowOffsetY = parseFloat(shadowMatch[2]);\n ctx.shadowBlur = parseFloat(shadowMatch[3]);\n // shadowMatch[4] - це spread (ігноруємо, canvas не підтримує spread)\n ctx.shadowColor = shadowMatch[5]; // колір тепер в 5-й групі\n }\n\n ctx.fillStyle = theme.tooltip.background;\n ctx.beginPath();\n ctx.roundRect(tooltipX, tooltipY, tooltipWidth, tooltipHeight, borderRadius);\n ctx.fill();\n\n // Скидаємо тінь для тексту\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n\n // Малюємо текст\n ctx.fillStyle = theme.tooltip.color;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n lines.forEach((line, index) => {\n ctx.fillText(line, tooltipX + padding, tooltipY + fontSize / 4 + padding + index * fontSize * lineHeight);\n });\n\n ctx.restore();\n },\n [tooltipContent, tooltipPosition, theme.tooltip]\n );\n\n const renderNodes = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n ctx.globalAlpha = 1.0;\n // Малюємо всі вузли\n nodes.forEach((node) => {\n const { x, y, color: nodeColor, fontColor, label } = node;\n const isSelected = node.id && stateRef.current.selectedNodeIds.has(node.id);\n const isHovered = node.id && stateRef.current.hoveredNode?.id === node.id;\n\n // Розмір та позиція вузла\n const size = getNodeSize(node);\n const radius = size / 2;\n\n // Якщо наведено вузол, малюємо кільце вибору та кнопки\n if (isHovered) {\n // Малюємо кнопки навколо обраного вузла, якщо кнопки доступні\n if (buttons && buttons.length > 0) {\n renderNodeButtons(node, ctx);\n }\n }\n\n // Якщо вузол виділено, малюємо кільце підсвічування\n if (isSelected) {\n const ringRadius = size / 2 + config.nodeBorderWidth;\n const borderRadius = size / 2 + config.nodeBorderWidth / 2;\n // Зберігаємо стан контексту для ефекту світіння\n ctx.save();\n\n // Налаштовуємо ефект світіння (glow)\n ctx.shadowBlur = config.nodeBorderWidth * 10;\n ctx.shadowColor = theme.graph2D.ring.selectionFill;\n\n // Малюємо основне кільце вибору з ефектом світіння\n ctx.beginPath();\n ctx.arc(x as number, y as number, ringRadius, 0, 2 * Math.PI, false);\n ctx.fillStyle = theme.graph2D.ring.selectionFill;\n ctx.fill();\n\n // Відновлюємо стан контексту (прибираємо shadow для інших елементів)\n ctx.restore();\n\n // Малюємо основне кільце вибору з ефектом світіння\n ctx.beginPath();\n ctx.arc(x as number, y as number, borderRadius, 0, 2 * Math.PI, false);\n ctx.fillStyle = theme.graph2D.ring.borderFill;\n ctx.fill();\n }\n\n // Малюємо коло вузла\n ctx.beginPath();\n ctx.arc(x as number, y as number, radius, 0, 2 * Math.PI);\n ctx.fillStyle = nodeColor || color(node.group || '0');\n ctx.fill();\n\n // Малюємо мітку, якщо вона доступна\n if (label) {\n ctx.save();\n ctx.translate(x as number, y as number);\n\n const globalScale = stateRef.current.transform.k;\n const scaledFontSize = calculateFontSize(globalScale);\n const maxWidth = size * config.textPaddingFactor;\n\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = fontColor || '#000';\n\n const truncatedLabel = truncateText(label, maxWidth, ctx);\n ctx.fillText(truncatedLabel, 0, 0);\n\n ctx.restore();\n }\n });\n },\n [theme.graph2D.ring, buttons, renderNodeButtons]\n );\n\n // 2D Canvas рендеринг для всього\n const renderCanvas2D = useCallback(() => {\n const ctx = ctx2dRef.current;\n if (!ctx) return;\n\n // Отримуємо відношення пікселів пристрою для коректного рендерингу\n\n // Очищуємо весь канвас перед новим рендерингом.\n ctx.clearRect(0, 0, stateRef.current.width, stateRef.current.height);\n\n // Спочатку відображаємо сітку (фон)\n renderGrid(ctx);\n\n // Застосовуємо трансформацію (масштабування та панорамування) - використовуємо матричну трансформацію для кращої продуктивності\n ctx.save();\n\n // Спочатку переміщуємо до позиції панорамування, потім масштабуємо навколо цієї точки\n ctx.setTransform(\n stateRef.current.transform.k,\n 0,\n 0,\n stateRef.current.transform.k,\n stateRef.current.transform.x,\n stateRef.current.transform.y\n );\n\n // Відображаємо зв'язки та вузли\n renderLinks(ctx);\n renderNodes(ctx);\n\n // Відновлюємо контекст\n ctx.restore();\n\n // Рендеримо tooltip поверх всього (без трансформації)\n renderTooltip(ctx);\n }, [renderLinks, renderNodes, renderGrid, renderTooltip]);\n\n /**\n * Функція для додавання нових вузлів до графа з опціональною плавною анімацією появи\n * @param newNodes Нові вузли для додавання до графа\n * @param newLinks Опціональні нові зв'язки для додавання з вузлами\n * @param options Параметри конфігурації для додавання вузлів\n */\n const addNodes = useCallback(\n (\n newNodes: NodeObject[],\n newLinks: LinkObject[] = [],\n options?: {\n smoothAppearance?: boolean;\n transitionDuration?: number;\n },\n callback?: () => void\n ) => {\n const links = getLinks() || [];\n const nodes = getNodes() || [];\n if (!simulationRef.current || !newNodes.length) return;\n\n const { width: canvasWidth, height: canvasHeight } = stateRef.current; // Опції по умолчанню\n const smoothAppearance = options?.smoothAppearance ?? false;\n const transitionDuration = options?.transitionDuration ?? 1000; // 1 секунда по умолчанню\n\n // Обробляємо нові вузли, щоб уникнути дублікатів\n const existingNodeIds = new Set(nodes.map((node) => node.id));\n const filteredNewNodes = newNodes.filter((node) => !existingNodeIds.has(node.id));\n\n // Обробляємо нові зв'язки, щоб уникнути дублікатів та переконатися, що вони посилаються на дійсні вузли\n const existingLinkIds = new Set(\n links.map(\n (link) =>\n `${typeof link.source === 'object' ? link.source.id : link.source}-${\n typeof link.target === 'object' ? link.target.id : link.target\n }`\n )\n );\n\n const filteredNewLinks = newLinks.filter((link) => {\n const linkId = `${typeof link.source === 'object' ? link.source.id : link.source}-${\n typeof link.target === 'object' ? link.target.id : link.target\n }`;\n return !existingLinkIds.has(linkId);\n });\n\n if (filteredNewNodes.length === 0 && filteredNewLinks.length === 0) return;\n\n const updatedNodes = [...nodes, ...filteredNewNodes];\n const updatedLinks = [...links, ...filteredNewLinks];\n\n // Попереднє позиціонування нових вузлів тільки коли плавна поява увімкнена\n if (smoothAppearance) {\n // Попередньо позиціонуємо нові вузли біля підключених вузлів\n filteredNewNodes.forEach((node) => {\n // Перевіряємо, чи є зв'язки, що поєднують цей вузол з існуючими вузлами\n const connectedLinks = filteredNewLinks.filter((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n return (\n (sourceId === node.id && existingNodeIds.has(targetId)) ||\n (targetId === node.id && existingNodeIds.has(sourceId))\n );\n });\n\n if (connectedLinks.length > 0) {\n // Знаходимо існуючий підключений вузол для розташування поряд\n const someLink = connectedLinks[0];\n const connectedNodeId =\n typeof someLink.source === 'object'\n ? someLink.source.id === node.id\n ? someLink.target\n : someLink.source.id\n : someLink.source === node.id\n ? someLink.target\n : someLink.source;\n\n const connectedNode = updatedNodes.find((n) => n.id === connectedNodeId);\n\n if (connectedNode && connectedNode.x !== undefined && connectedNode.y !== undefined) {\n // Розташовуємо новий вузол біля підключеного вузла з невеликою рандомізацією\n const randomOffset = 30 + Math.random() * 20;\n const randomAngle = Math.random() * Math.PI * 2;\n\n // Встановлюємо початкову позицію\n node.x = connectedNode.x + Math.cos(randomAngle) * randomOffset;\n node.y = connectedNode.y + Math.sin(randomAngle) * randomOffset;\n\n // Встановлюємо початкову швидкість в нуль для плавнішої появи\n node.vx = 0;\n node.vy = 0;\n }\n } else {\n // Для непідключених вузлів розміщуємо їх у полі зору у випадкових позиціях\n const centerX = canvasWidth / 2;\n const centerY = canvasHeight / 2;\n const radius = Math.min(canvasWidth, canvasHeight) / 4;\n const angle = Math.random() * Math.PI * 2;\n\n node.x = centerX + Math.cos(angle) * (radius * Math.random());\n node.y = centerY + Math.sin(angle) * (radius * Math.random());\n node.vx = 0;\n node.vy = 0;\n }\n });\n\n // Фіксуємо позиції існуючих вузлів, щоб запобігти їхньому руху\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n });\n }\n\n // Оновлюємо симуляцію з новими вузлами та зв'язками\n simulationRef.current.nodes(updatedNodes);\n\n // Отримуємо силу зв'язків із правильним типом\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n if (linkForce) {\n linkForce.links(updatedLinks);\n }\n\n // Підключаємо нові вузли до їхніх сусідів та зв'язків\n filteredNewLinks.forEach((link: any) => {\n const source =\n typeof link.source === 'object' ? link.source : updatedNodes.find((n: any) => n.id === link.source);\n const target =\n typeof link.target === 'object' ? link.target : updatedNodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Ініціалізуємо масиви, якщо вони не існують\n !source.neighbors && (source.neighbors = []);\n !target.neighbors && (target.neighbors = []);\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n !source.links && (source.links = []);\n !target.links && (target.links = []);\n source.links.push(link);\n target.links.push(link);\n });\n\n if (smoothAppearance) {\n // Налаштовуємо симуляцію для плавної появи нових вузлів\n simulationRef.current.alphaTarget(0.3);\n simulationRef.current.alpha(0.3);\n simulationRef.current.velocityDecay(0.7); // Більше загасання для плавнішого руху\n simulationRef.current.restart();\n\n // Через короткий час відфіксовуємо всі вузли та скидаємо параметри симуляції\n setTimeout(() => {\n // Звільняємо існуючі вузли, щоб дозволити їм природний рух\n nodes.forEach((node) => {\n node.fx = undefined;\n node.fy = undefined;\n });\n\n // Скидаємо симуляцію до нормальних налаштувань\n simulationRef.current?.alphaTarget(0);\n simulationRef.current?.alpha(0.1);\n simulationRef.current?.velocityDecay(0.6); // Скидаємо до значення за замовчуванням\n }, transitionDuration);\n } else {\n // Стандартний перезапуск з низькою енергією для мінімального руху\n simulationRef.current.alpha(0.1).restart();\n }\n\n // Перемальовуємо канвас\n renderCanvas2D();\n callback?.();\n },\n [nodes, renderCanvas2D]\n );\n\n /**\n * Функція для видалення вузлів з графа з опціональною плавною анімацією зникнення\n * @param nodeIds Масив ID вузлів для видалення\n * @param options Параметри конфігурації для видалення вузлів\n */\n const removeNodes = useCallback(\n (nodeIds: (string | number)[]) => {\n const nodes = getNodes();\n const links = getLinks();\n if (!simulationRef.current || !nodeIds.length || !nodes || nodes.length === 0 || !links || links.length === 0)\n return;\n\n // Створюємо набір ID вузлів для швидкого пошуку\n const nodeIdsToRemove = new Set(nodeIds);\n\n // Спочатку перевіряємо, чи видаляємо який-небудь виділений/наведений вузол\n nodeIds.forEach((id) => stateRef.current.selectedNodeIds.delete(id));\n\n if (\n stateRef.current.hoveredNode &&\n stateRef.current.hoveredNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.hoveredNode.id)\n ) {\n stateRef.current.hoveredNode = null;\n // Очищаємо tooltip, якщо він був для видаленого вузла\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n\n // Очищаємо наведений зв'язок, якщо він включає видалені ноди\n if (stateRef.current.hoveredLink) {\n const source =\n typeof stateRef.current.hoveredLink.source === 'object'\n ? stateRef.current.hoveredLink.source.id\n : stateRef.current.hoveredLink.source;\n const target =\n typeof stateRef.current.hoveredLink.target === 'object'\n ? stateRef.current.hoveredLink.target.id\n : stateRef.current.hoveredLink.target;\n\n if (\n (source !== undefined && nodeIdsToRemove.has(source)) ||\n (target !== undefined && nodeIdsToRemove.has(target))\n ) {\n stateRef.current.hoveredLink = null;\n }\n }\n\n if (\n stateRef.current.draggedNode &&\n stateRef.current.draggedNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.draggedNode.id)\n ) {\n stateRef.current.draggedNode = null;\n }\n\n // Отримуємо всі вузли, які залишаться після видалення\n const remainingNodes = nodes.filter((node) => node.id !== undefined && !nodeIdsToRemove.has(node.id));\n\n // Отримуємо всі зв'язки, які не підключаються до видалених вузлів\n const remainingLinks = links.filter((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n\n return (\n sourceId !== undefined &&\n !nodeIdsToRemove.has(sourceId) &&\n targetId !== undefined &&\n !nodeIdsToRemove.has(targetId)\n );\n });\n\n // Очищаємо підсвічені зв'язки, якщо вони включають видалені ноди\n const highlightLinksToRemove: LinkObject[] = [];\n stateRef.current.highlightLinks.forEach((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n\n if (\n (sourceId !== undefined && nodeIdsToRemove.has(sourceId)) ||\n (targetId !== undefined && nodeIdsToRemove.has(targetId))\n ) {\n highlightLinksToRemove.push(link);\n }\n });\n highlightLinksToRemove.forEach((link) => stateRef.current.highlightLinks.delete(link));\n\n // Перебудовуємо відносини вузлів (сусіди та зв'язки) для вузлів, що залишилися\n // Спочатку очищаємо існуючі відносини\n remainingNodes.forEach((node) => {\n node.neighbors = [];\n node.links = [];\n });\n\n // Потім перебудовуємо на основі зв'язків, що залишилися\n remainingLinks.forEach((link: any) => {\n const source =\n typeof link.source === 'object' ? link.source : remainingNodes.find((n: any) => n.id === link.source);\n const target =\n typeof link.target === 'object' ? link.target : remainingNodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Додаємо до масивів сусідів\n source.neighbors = source.neighbors || [];\n target.neighbors = target.neighbors || [];\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n // Додаємо до масивів зв'язків\n source.links = source.links || [];\n target.links = target.links || [];\n source.links.push(link);\n target.links.push(link);\n });\n\n // Оновлюємо симуляцію з відфільтрованими вузлами та зв'язками\n // але не змінюємо їхні позиції\n simulationRef.current.nodes(remainingNodes);\n\n // Отримуємо та оновлюємо силу зв'язків\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n if (linkForce) {\n linkForce.links(remainingLinks);\n }\n\n // Сповіщаємо про зміну виділених вузлів\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n\n // Просто перемальовуємо canvas з новими даними\n renderCanvas2D();\n },\n [renderCanvas2D, onChangeSelectedNodeIds]\n );\n // Функція для масштабування, щоб усі вузли помістилися в полі зору з відступами\n const zoomToFit = useCallback((duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n if (!ctx || !canvasRef.current || !nodes || !nodes.length) return;\n\n // Знаходимо межі всіх вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n // Розраховуємо область, що містить усі вузли\n nodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n const x = node.x;\n const y = node.y;\n\n // Оновлюємо мін/макс координати\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n });\n\n // Якщо у нас валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n // Розраховуємо необхідний масштаб, щоб вмістити всі вузли\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи до області\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n // Розраховуємо ширину та висоту вмісту\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Розраховуємо масштаб, необхідний для розміщення вмісту\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, 10); // Обмежуємо масштаб до 10x\n\n // Розраховуємо центр вмісту\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n // Розраховуємо нову трансформацію для правильного центрування та масштабування\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімуємо перехід, якщо вказана тривалість\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n\n // Використовуємо функцію пом'якшення для плавнішого переходу\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3); // Кубічне пом'якшення\n\n // Інтерполюємо між початковою та кінцевою трансформаціями\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Застосовуємо трансформацію негайно, якщо немає тривалості\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n }, []);\n\n /**\n * Функція для масштабування графа так, щоб виділені вузли були видимі\n * @param duration Тривалість анімації масштабування в мілісекундах\n * @param padding Відступ від країв в пікселях\n */\n const zoomToSelected = useCallback(\n (duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n const selectedIds = stateRef.current.selectedNodeIds;\n\n // Перевіряємо, чи є виділені вузли\n if (!ctx || !canvasRef.current || !nodes || !nodes.length || selectedIds.size === 0) {\n return;\n }\n\n // Фільтруємо тільки виділені вузли\n const selectedNodes = nodes.filter((node) => node.id && selectedIds.has(node.id));\n\n if (selectedNodes.length === 0) return;\n\n // Знаходимо межі виділених вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n minX = Math.min(minX, node.x);\n minY = Math.min(minY, node.y);\n maxX = Math.max(maxX, node.x);\n maxY = Math.max(maxY, node.y);\n });\n\n // Якщо є тільки один вузол, додаємо мінімальну область\n if (minX === maxX && minY === maxY) {\n const expandSize = 100; // мінімальна область навколо одного вузла\n minX -= expandSize;\n minY -= expandSize;\n maxX += expandSize;\n maxY += expandSize;\n }\n\n // Якщо валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Обчислюємо масштаб\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, config.maxZoom); // обмежуємо максимальний зум\n\n // Центруємо виділені вузли\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімація\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3);\n\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Без анімації\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Функція для масштабування графа так, щоб певні вузли були видимі\n * @param nodeIds Масив ID вузлів для відображення\n * @param duration Тривалість анімації масштабування в мілісекундах\n * @param padding Відступ від країв в пікселях\n */\n const zoomToNodes = useCallback(\n (nodeIds: (string | number)[], duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n\n // Перевіряємо, чи є вузли для відображення\n if (!ctx || !canvasRef.current || !nodes || !nodes.length || !nodeIds || nodeIds.length === 0) {\n return;\n }\n\n // Створюємо Set для швидкого пошуку\n const nodeIdsSet = new Set(nodeIds);\n\n // Фільтруємо тільки потрібні вузли\n const targetNodes = nodes.filter((node) => node.id && nodeIdsSet.has(node.id));\n\n if (targetNodes.length === 0) return;\n\n // Знаходимо межі вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n targetNodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n minX = Math.min(minX, node.x);\n minY = Math.min(minY, node.y);\n maxX = Math.max(maxX, node.x);\n maxY = Math.max(maxY, node.y);\n });\n\n // Якщо є тільки один вузол, додаємо мінімальну область\n if (minX === maxX && minY === maxY) {\n const expandSize = 100; // мінімальна область навколо одного вузла\n minX -= expandSize;\n minY -= expandSize;\n maxX += expandSize;\n maxY += expandSize;\n }\n\n // Якщо валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Обчислюємо масштаб\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, config.maxZoom); // обмежуємо максимальний зум\n\n // Центруємо вузли\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімація\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3);\n\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Без анімації\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Функція для встановлення виділених вузлів за їхніми ID\n * @param nodeIds Масив ID вузлів для виділення\n */\n\n const setSelectedNodes = useCallback(\n (nodeIds: (string | number)[]) => {\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n nodeIds.forEach((id) => stateRef.current.selectedNodeIds.add(id));\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n },\n [renderCanvas2D, onChangeSelectedNodeIds]\n );\n\n /**\n * Встановлює розмір для вузлів за їх ідентифікаторами\n */\n const setNodeSizes = useCallback(\n (nodeIds: (string | number)[], size: number) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n // Встановлюємо розмір для кожного вузла з вказаним ID\n nodes.forEach((node) => {\n if (node.id && nodeIds.includes(node.id)) {\n node.size = size;\n }\n });\n\n // Оновлюємо force collide з новими розмірами вузлів\n if (simulationRef.current) {\n simulationRef.current.force(\n 'collide',\n forceCollide()\n .radius((node: any) => getNodeSize(node))\n .iterations(2)\n .strength(1)\n );\n\n // М'яко перезапускаємо симуляцію для врахування нових розмірів\n simulationRef.current.alpha(0.2).restart();\n }\n\n // Перемалювуємо граф з новими розмірами\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Встановлює колір для вузлів за їх ідентифікаторами\n */\n const setNodeColors = useCallback(\n (nodeIds: (string | number)[], color: string) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n // Встановлюємо колір для кожного вузла з вказаним ID\n nodes.forEach((node) => {\n if (node.id && nodeIds.includes(node.id)) {\n node.color = color;\n }\n });\n\n // Перемалювуємо граф з новими кольорами\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Встановлює ширину для зв'язків за їх ідентифікаторами\n */\n const setLinkWidths = useCallback(\n (linkIds: (string | number)[], width: number) => {\n const links = getLinks();\n if (!links || links.length === 0) return;\n\n // Встановлюємо ширину для кожного зв'язку з вказаним ID\n links.forEach((link) => {\n if (link.id && linkIds.includes(link.id)) {\n link.width = width;\n }\n });\n\n // Перемалювуємо граф з новими ширинами\n renderCanvas2D();\n },\n [getLinks, renderCanvas2D]\n );\n\n /**\n * Встановлює колір для зв'язків за їх ідентифікаторами\n */\n const setLinkColors = useCallback(\n (linkIds: (string | number)[], color: string) => {\n const links = getLinks();\n if (!links || links.length === 0) return;\n\n // Встановлюємо колір для кожного зв'язку з вказаним ID\n links.forEach((link) => {\n if (link.id && linkIds.includes(link.id)) {\n link.color = color;\n }\n });\n\n // Перемалювуємо граф з новими кольорами\n renderCanvas2D();\n },\n [getLinks, renderCanvas2D]\n );\n\n /**\n * Пошук найкоротшого шляху між двома нодами за допомогою BFS (Breadth-First Search).\n *\n * Цей метод:\n * 1. Знаходить найкоротший шлях між вказаними нодами\n * 2. Виділяє всі ноди в цьому шляху (додає їх до selectedNodeIds)\n * 3. Підсвічує всі зв'язки в шляху (використовує highlightLinks)\n *\n * @example\n * ```tsx\n * const graphRef = useRef<Graph2DRef>(null);\n *\n * // Знайти шлях між нодами\n * const handleFindPath = () => {\n * const pathLength = graphRef.current?.findShortestPath('node1', 'node5');\n * if (pathLength > 0) {\n * console.log(`Шлях знайдено! Кількість нод: ${pathLength}`);\n * } else {\n * console.log('Шлях не існує');\n * }\n * };\n * ```\n *\n * @param sourceId - ID початкової ноди\n * @param targetId - ID кінцевої ноди\n * @returns Кількість нод в знайденому шляху, або 0 якщо шлях не існує\n */\n const findShortestPath = useCallback(\n (sourceId: string | number, targetId: string | number): number => {\n const nodes = getNodes();\n const links = getLinks();\n\n if (!nodes || !links || nodes.length === 0 || links.length === 0) {\n return 0;\n }\n\n // Перевіряємо чи існують обидві ноди\n const sourceNode = nodes.find((n) => n.id === sourceId);\n const targetNode = nodes.find((n) => n.id === targetId);\n\n if (!sourceNode || !targetNode) {\n console.warn('Source or target node not found');\n return 0;\n }\n\n // Якщо це та сама нода\n if (sourceId === targetId) {\n setSelectedNodes([sourceId]);\n return 1;\n }\n\n // Будуємо граф суміжності для BFS\n const adjacencyMap = new Map<string | number, Array<{ nodeId: string | number; link: LinkObject }>>();\n\n links.forEach((link) => {\n const sourceNodeId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetNodeId = typeof link.target === 'object' ? link.target.id : link.target;\n\n if (sourceNodeId === undefined || targetNodeId === undefined) return;\n\n // Додаємо зв'язки в обидва напрямки (неорієнтований граф)\n if (!adjacencyMap.has(sourceNodeId)) {\n adjacencyMap.set(sourceNodeId, []);\n }\n if (!adjacencyMap.has(targetNodeId)) {\n adjacencyMap.set(targetNodeId, []);\n }\n\n adjacencyMap.get(sourceNodeId)!.push({ nodeId: targetNodeId, link });\n adjacencyMap.get(targetNodeId)!.push({ nodeId: sourceNodeId, link });\n });\n\n // BFS для пошуку найкоротшого шляху\n const queue: Array<{ nodeId: string | number; path: Array<string | number>; links: LinkObject[] }> = [\n { nodeId: sourceId, path: [sourceId], links: [] },\n ];\n const visited = new Set<string | number>([sourceId]);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n // Якщо знайшли цільову ноду\n if (current.nodeId === targetId) {\n // Виділяємо всі ноди в шляху\n setSelectedNodes(current.path);\n\n // Підсвічуємо всі зв'язки в шляху\n stateRef.current.highlightLinks.clear();\n current.links.forEach((link) => {\n stateRef.current.highlightLinks.add(link);\n });\n\n // Перемальовуємо канвас\n renderCanvas2D();\n return current.path.length;\n }\n\n // Перебираємо всі сусідні ноди\n const neighbors = adjacencyMap.get(current.nodeId) || [];\n neighbors.forEach(({ nodeId, link }) => {\n if (!visited.has(nodeId)) {\n visited.add(nodeId);\n queue.push({\n nodeId,\n path: [...current.path, nodeId],\n links: [...current.links, link],\n });\n }\n });\n }\n\n // Шлях не знайдено\n console.warn('No path found between nodes');\n return 0;\n },\n [getNodes, getLinks, setSelectedNodes, renderCanvas2D]\n );\n\n /**\n * Впорядковує вибрані вузли в сітці\n * @param nodeIds - Набір ідентифікаторів вузлів для впорядкування\n * @param options - Опції для налаштування розміщення в сітці\n */\n const arrangeSelectedInGrid = useCallback(\n (\n nodeIds: Set<string | number>,\n options?: {\n spacing?: number;\n columns?: number;\n }\n ) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0 || nodeIds.size === 0) {\n return;\n }\n\n const spacing = options?.spacing ?? 100;\n const nodesToArrange = nodes.filter((node) => node.id !== undefined && nodeIds.has(node.id));\n\n if (nodesToArrange.length === 0) {\n console.warn('No nodes found with provided IDs');\n return;\n }\n\n // Розраховуємо кількість колонок (квадратний корінь для квадратної сітки, якщо не вказано)\n const columns = options?.columns ?? Math.ceil(Math.sqrt(nodesToArrange.length));\n\n // Знаходимо центр вибраних вузлів для центрування сітки\n const centerX = nodesToArrange.reduce((sum, node) => sum + (node.x ?? 0), 0) / nodesToArrange.length;\n const centerY = nodesToArrange.reduce((sum, node) => sum + (node.y ?? 0), 0) / nodesToArrange.length;\n\n // Розраховуємо розміри сітки\n const rows = Math.ceil(nodesToArrange.length / columns);\n const gridWidth = (columns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n // Початкова позиція сітки (зміщуємо, щоб центр сітки був у центрі вибраних вузлів)\n const startX = centerX - gridWidth / 2;\n const startY = centerY - gridHeight / 2;\n\n // Розміщуємо вузли в сітці\n nodesToArrange.forEach((node, index) => {\n const col = index % columns;\n const row = Math.floor(index / columns);\n\n const newX = startX + col * spacing;\n const newY = startY + row * spacing;\n\n // Встановлюємо фіксовані координати вузла\n node.x = newX;\n node.y = newY;\n node.fx = newX;\n node.fy = newY;\n });\n\n // Перезапускаємо симуляцію для оновлення позицій\n if (simulationRef.current) {\n simulationRef.current.alpha(0.3).restart();\n }\n\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Впорядковує всі вузли в окремі сітки згруповані за значенням ключа\n * Якщо значення ключа - масив, бере перший елемент\n * Кожна група вузлів розміщується в окремій сітці, а самі групи теж розташовані у вигляді сітки\n * @param typeKey - Назва ключа для групування (наприклад, 'labels', 'type')\n * @param options - Опції для налаштування розміщення в сітці\n */\n const arrangeNodesByTypeInGrid = useCallback(\n (\n typeKey: string,\n options?: {\n spacing?: number;\n columns?: number;\n groupSpacing?: number;\n }\n ) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) {\n return;\n }\n\n const spacing = options?.spacing ?? 100;\n const groupSpacing = options?.groupSpacing ?? 200;\n const columns = options?.columns;\n\n // Групуємо вузли за значенням ключа\n const groups = new Map<string, NodeObject[]>();\n\n nodes.forEach((node) => {\n const value = node[typeKey as keyof typeof node];\n let groupKey: string;\n\n if (Array.isArray(value)) {\n // Якщо значення - масив, беремо перший елемент\n groupKey = value.length > 0 ? String(value[0]) : 'undefined';\n } else if (typeof value === 'string') {\n // Якщо значення - рядок\n groupKey = value;\n } else {\n // Інші типи або undefined\n groupKey = 'undefined';\n }\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(node);\n });\n\n // Розраховуємо кількість колонок для розміщення груп (сітка груп)\n const groupCount = groups.size;\n const groupGridColumns = Math.ceil(Math.sqrt(groupCount));\n\n // Знаходимо загальний центр всіх вузлів\n const totalCenterX = nodes.reduce((sum, node) => sum + (node.x ?? 0), 0) / nodes.length;\n const totalCenterY = nodes.reduce((sum, node) => sum + (node.y ?? 0), 0) / nodes.length;\n\n // Розміщуємо кожну групу в окремій сітці\n let groupIndex = 0;\n const groupDimensions: Array<{ width: number; height: number }> = [];\n\n // Спочатку розраховуємо розміри кожної групи\n groups.forEach((groupNodes) => {\n const groupColumns = columns ?? Math.ceil(Math.sqrt(groupNodes.length));\n const rows = Math.ceil(groupNodes.length / groupColumns);\n const gridWidth = (groupColumns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n groupDimensions.push({ width: gridWidth, height: gridHeight });\n });\n\n // Знаходимо максимальні розміри для уніфікації\n const maxGroupWidth = Math.max(...groupDimensions.map((d) => d.width), 0);\n const maxGroupHeight = Math.max(...groupDimensions.map((d) => d.height), 0);\n\n // Розраховуємо загальні розміри сітки груп\n const groupGridRows = Math.ceil(groupCount / groupGridColumns);\n const totalGridWidth = (groupGridColumns - 1) * (maxGroupWidth + groupSpacing);\n const totalGridHeight = (groupGridRows - 1) * (maxGroupHeight + groupSpacing);\n\n // Початкова позиція для сітки груп (центруємо навколо загального центру)\n const groupGridStartX = totalCenterX - totalGridWidth / 2;\n const groupGridStartY = totalCenterY - totalGridHeight / 2;\n\n // Розміщуємо групи\n groups.forEach((groupNodes, groupKey) => {\n if (groupNodes.length === 0) {\n groupIndex++;\n return;\n }\n\n // Розраховуємо позицію групи в сітці груп\n const groupCol = groupIndex % groupGridColumns;\n const groupRow = Math.floor(groupIndex / groupGridColumns);\n\n const groupCenterX = groupGridStartX + groupCol * (maxGroupWidth + groupSpacing);\n const groupCenterY = groupGridStartY + groupRow * (maxGroupHeight + groupSpacing);\n\n // Розраховуємо кількість колонок для групи\n const groupColumns = columns ?? Math.ceil(Math.sqrt(groupNodes.length));\n const rows = Math.ceil(groupNodes.length / groupColumns);\n const gridWidth = (groupColumns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n // Початкова позиція сітки групи\n const startX = groupCenterX - gridWidth / 2;\n const startY = groupCenterY - gridHeight / 2;\n\n // Розміщуємо вузли групи в сітці\n groupNodes.forEach((node, index) => {\n const col = index % groupColumns;\n const row = Math.floor(index / groupColumns);\n\n const newX = startX + col * spacing;\n const newY = startY + row * spacing;\n\n // Встановлюємо фіксовані координати вузла\n node.x = newX;\n node.y = newY;\n node.fx = newX;\n node.fy = newY;\n });\n\n groupIndex++;\n });\n\n // Перезапускаємо симуляцію для оновлення позицій\n if (simulationRef.current) {\n simulationRef.current.alpha(0.3).restart();\n }\n\n renderCanvas2D();\n\n // Масштабуємо, щоб всі вузли були видимі\n zoomToFit(300, 50);\n },\n [getNodes, renderCanvas2D, zoomToFit]\n );\n\n // Знаходимо вузол за вказаними координатами\n const getNodeAtPosition = useCallback((x: number, y: number): NodeObject | null => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return null;\n\n // Масштабуємо координати на основі коефіцієнту щільності пікселів пристрою та застосовуємо зворотну трансформацію\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n // Застосовуємо зворотну трансформацію, щоб отримати координати в системі координат графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n return (\n nodes.find((node) => {\n // Знаходимо будь-який вузол у межах радіусу від вказівника (з урахуванням розміру вузла)\n const nodeRadius = getNodeSize(node) / 2;\n const dx = (node.x || 0) - scaledX;\n const dy = (node.y || 0) - scaledY;\n return Math.sqrt(dx * dx + dy * dy) <= nodeRadius;\n }) || null\n );\n }, []);\n\n // Знаходимо лінк за вказаними координатами\n const getLinkAtPosition = useCallback((x: number, y: number): LinkObject | null => {\n const links = getLinks();\n const nodes = getNodes();\n if (!links || links.length === 0 || !nodes || nodes.length === 0) return null;\n\n // Масштабуємо координати на основі коефіцієнту щільності пікселів пристрою та застосовуємо зворотну трансформацію\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n // Застосовуємо зворотну трансформацію, щоб отримати координати в системі координат графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Пороговая відстань для визначення кліку по лінку\n const threshold = 5;\n\n return (\n links.find((link) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (!source || !target) return false;\n\n const sourceX = source.x || 0;\n const sourceY = source.y || 0;\n const targetX = target.x || 0;\n const targetY = target.y || 0;\n\n // Обчислюємо відстань від точки до лінії\n const A = scaledX - sourceX;\n const B = scaledY - sourceY;\n const C = targetX - sourceX;\n const D = targetY - sourceY;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n\n if (lenSq === 0) return false; // Лінія нульової довжини\n\n let param = dot / lenSq;\n param = Math.max(0, Math.min(1, param)); // Обмежуємо параметр відрізком [0, 1]\n\n const xx = sourceX + param * C;\n const yy = sourceY + param * D;\n\n const dx = scaledX - xx;\n const dy = scaledY - yy;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n return distance <= threshold;\n }) || null\n );\n }, []);\n\n // Допоміжна функція для перевірки, чи знаходиться точка всередині сектора кнопки\n const isPointInButtonSector = useCallback(\n (\n mouseX: number,\n mouseY: number,\n nodeX: number,\n nodeY: number,\n radius: number,\n startAngle: number,\n endAngle: number\n ): boolean => {\n // Розраховуємо відстань від центру вузла до точки миші\n const dx = mouseX - nodeX;\n const dy = mouseY - nodeY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n // Розраховуємо кут між точкою та горизонтальною віссю\n let angle = Math.atan2(dy, dx);\n if (angle < 0) angle += 2 * Math.PI; // Конвертуємо в діапазон [0, 2π]\n\n // Розширюємо діапазон радіусу для зручнішої взаємодії з кнопками\n const minRadiusRatio = 0.5;\n const maxRadiusRatio = 1;\n const isInRadius = distance >= radius * minRadiusRatio && distance <= radius * maxRadiusRatio;\n\n // Перевіряємо, чи кут знаходиться в межах сектора\n let isInAngle = false;\n\n // Верхнє півколо: від Math.PI до Math.PI * 2\n if (startAngle === Math.PI && endAngle === Math.PI * 2) {\n isInAngle = angle >= Math.PI && angle <= Math.PI * 2;\n }\n // Нижнє півколо: від 0 до Math.PI\n else if (startAngle === 0 && endAngle === Math.PI) {\n isInAngle = angle >= 0 && angle <= Math.PI;\n }\n // Загальний випадок для довільних секторів\n else {\n isInAngle =\n (startAngle <= endAngle && angle >= startAngle && angle <= endAngle) ||\n (startAngle > endAngle && (angle >= startAngle || angle <= endAngle));\n }\n\n return isInRadius && isInAngle;\n },\n []\n );\n\n // Обробка наведення на вузол (подібно до Graph2D handleNodeHover)\n const handleNodeHover = useCallback(\n (node: NodeObject | null) => {\n // Перевіряємо, чи вузол той самий, що і останній вузол, на який наводили\n if (node === stateRef.current.hoveredNode) {\n return; // Пропускаємо обробку, якщо це той самий вузол\n }\n\n stateRef.current.hoveredNode = node;\n if (onNodeHover) onNodeHover(node);\n },\n [onNodeHover]\n );\n\n // Обробка наведення на лінк\n const handleLinkHover = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>, link: LinkObject | null) => {\n // Перевіряємо, чи лінк той самий, що і останній лінк, на який наводили\n if (link === stateRef.current.hoveredLink) {\n return; // Пропускаємо обробку, якщо це той самий лінк\n }\n\n const newHighlightNodes = new Set<NodeObject>();\n const newHighlightLinks = new Set<any>();\n\n if (link) {\n // Підсвічуємо сам лінк\n newHighlightLinks.add(link);\n\n // Підсвічуємо пов'язані вузли\n const nodes = getNodes();\n if (nodes) {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (source) newHighlightNodes.add(source);\n if (target) newHighlightNodes.add(target);\n }\n }\n\n stateRef.current.hoveredLink = link;\n if (onLinkHover) onLinkHover(link, event);\n },\n [onLinkHover, getNodes]\n );\n\n // Обробка кліку на лінк\n const handleLinkClick = useCallback(\n (link: LinkObject) => {\n if (onLinkClick) onLinkClick(link);\n },\n [onLinkClick]\n );\n\n // Обробка кліку на вузол\n const handleNodeClick = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>, node: NodeObject) => {\n if (node.id) {\n if (event.ctrlKey || event.metaKey) {\n // Якщо натиснуто Ctrl (або Cmd на Mac), додаємо/видаляємо вузол з виділення\n if (stateRef.current.selectedNodeIds.has(node.id)) {\n stateRef.current.selectedNodeIds.delete(node.id);\n } else {\n stateRef.current.selectedNodeIds.add(node.id);\n }\n // При Ctrl-кліку очищаємо підсвічування зв'язків\n stateRef.current.highlightLinks.clear();\n } else {\n // Інакше встановлюємо виділення лише на цей вузол\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n stateRef.current.selectedNodeIds.add(node.id);\n }\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n }\n if (onNodeClick) onNodeClick(node);\n },\n [onNodeClick, onChangeSelectedNodeIds, renderCanvas2D]\n );\n\n // Обробка кліку на фон\n const handleBackgroundClick = useCallback(() => {\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n if (onBackgroundClick) onBackgroundClick();\n }, [onBackgroundClick, onChangeSelectedNodeIds, renderCanvas2D]); // Перетягування тепер обробляється через stateRef для покращення продуктивності\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n if (!canvasRef.current || !simulationRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Зберігаємо початкові координати для подальшого відстеження перетягування\n stateRef.current.mouseStartPos = { x, y };\n stateRef.current.isDragging = false;\n\n // Намагаємося знайти вузол у позиції курсора - обробимо клік при mouseUp, якщо не відбувається перетягування\n const node = getNodeAtPosition(x, y);\n if (node) {\n // Встановлюємо як потенційно перетягуваний, але не активуємо симуляцію поки що\n stateRef.current.draggedNode = node;\n\n // Тимчасово фіксуємо позицію вузла\n node.fx = node.x;\n node.fy = node.y;\n } else {\n // Якщо не клікнули на вузол, починаємо панорамування\n stateRef.current.isPanning = true;\n stateRef.current.lastMousePos = { x, y };\n }\n },\n [getNodeAtPosition]\n );\n\n const getHoveredIndex = useCallback(\n (x: number, y: number) => {\n let hoveredIndex = null;\n if (canvasRef.current && stateRef.current && buttonImages.length > 0 && stateRef.current.hoveredNode) {\n const nodeSize = getNodeSize(stateRef.current.hoveredNode);\n const buttonRadius = (nodeSize * config.nodeAreaFactor) / 2;\n const rect = canvasRef.current.getBoundingClientRect();\n\n // Масштабуємо координати відносно розміру відображення полотна\n const canvasScaleX = canvasRef.current.width / rect.width;\n const canvasScaleY = canvasRef.current.height / rect.height;\n\n // Масштабовані координати миші в системі координат полотна\n const scaledMouseX = x * canvasScaleX;\n const scaledMouseY = y * canvasScaleY;\n\n // Застосовуємо поточну трансформацію для отримання світових координат\n const worldX = (scaledMouseX - stateRef.current.transform.x) / stateRef.current.transform.k;\n const worldY = (scaledMouseY - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Позиція ноди\n const nodeX = stateRef.current.hoveredNode?.x || 0;\n const nodeY = stateRef.current.hoveredNode?.y || 0;\n\n // Обчислюємо кількість кнопок та їхні сектори\n const buttonCount = Math.min(buttonImages.length, 8);\n const sectorAngle = Math.min((Math.PI * 2) / buttonCount, Math.PI);\n\n // Перевіряємо, чи вказівник миші знаходиться над будь-яким сектором кнопок\n for (let i = 0; i < buttonCount; i++) {\n const startAngle = i * sectorAngle;\n const endAngle = (i + 1) * sectorAngle;\n\n if (isPointInButtonSector(worldX, worldY, nodeX, nodeY, buttonRadius, startAngle, endAngle)) {\n hoveredIndex = i;\n break;\n }\n }\n }\n return hoveredIndex;\n },\n [buttonImages]\n );\n\n // Обробка руху миші для перетягування та наведення\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n if (!canvasRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Перевіряємо чи почалось перетягування\n if (stateRef.current.draggedNode && stateRef.current.mouseStartPos && simulationRef.current) {\n const startX = stateRef.current.mouseStartPos.x;\n const startY = stateRef.current.mouseStartPos.y;\n\n // Визначаємо відстань переміщення для виявлення факту перетягування\n const dx = x - startX;\n const dy = y - startY;\n const dragDistance = Math.sqrt(dx * dx + dy * dy);\n\n // Якщо відстань досить велика - це перетягування, а не просто клік\n const dragThreshold = 3; // поріг у пікселях\n\n if (dragDistance > dragThreshold) {\n // Це точно операція перетягування, а не просто клік\n stateRef.current.isDragging = true;\n\n // Якщо це перше виявлення перетягування, налаштовуємо симуляцію\n if (simulationRef.current.alphaTarget() === 0) {\n // Встановлюємо alphaTarget на значення, що базується на розмірі вузла для відповідної інтенсивності руху\n const alphaValue = 0;\n simulationRef.current.alphaTarget(alphaValue).restart();\n\n // // Регулюємо швидкість загасання для кращої стабільності під час перетягування\n // const decayValue = 0.2;\n // simulationRef.current.velocityDecay(decayValue);\n }\n }\n\n // Масштабуємо координати на основі співвідношення пікселів пристрою та поточної трансформації\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n\n // Застосовуємо зворотну трансформацію, щоб отримати координати у просторі графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Оновлюємо фіксовані позиції перетягуваного вузла з плавністю\n stateRef.current.draggedNode.fx = scaledX;\n stateRef.current.draggedNode.fy = scaledY;\n\n // if (stateRef.current.isDragging) {\n // // Зменшуємо енергію симуляції під час перетягування для стабільності\n // simulationRef.current.alpha(0); // Зменшуємо енергію системи\n // }\n\n // Немає потреби перевіряти наведення під час перетягування\n return;\n }\n\n // Обробка панорамування\n if (stateRef.current.isPanning && stateRef.current.mouseStartPos) {\n const dx = x - stateRef.current.lastMousePos.x;\n const dy = y - stateRef.current.lastMousePos.y;\n\n // Обчислюємо загальну відстань, пройдену під час панорамування\n const startX = stateRef.current.mouseStartPos.x;\n const startY = stateRef.current.mouseStartPos.y;\n const panDistance = Math.sqrt(Math.pow(x - startX, 2) + Math.pow(y - startY, 2));\n\n // Використовуємо ту ж саму логіку і поріг відстані як і для перетягування вузла\n const panThreshold = 3; // Той самий поріг як і для перетягування вузла\n if (panDistance > panThreshold) {\n // Це точно панорамування, а не просто клік\n stateRef.current.isDragging = true;\n }\n\n // Оновлюємо трансформацію безпосередньо у stateRef\n stateRef.current.transform = {\n ...stateRef.current.transform,\n x: stateRef.current.transform.x + dx,\n y: stateRef.current.transform.y + dy,\n };\n\n stateRef.current.lastMousePos = { x, y };\n renderCanvas2D(); // Перемальовуємо полотно після панорамування\n return;\n }\n\n let shouldRender;\n let hoveredNode;\n\n // Логіка виявлення наведення на кнопки\n if (stateRef.current.hoveredNode && canvasRef.current && buttonImages.length > 0) {\n const hoveredIndex = getHoveredIndex(x, y);\n\n if (hoveredIndex !== null) hoveredNode = stateRef.current.hoveredNode; // Встановлюємо hoveredNode для подальшої обробки\n\n // Оновлюємо позицію тултипу при русі миші, навіть якщо hoveredIndex не змінився\n if (hoveredIndex !== null && stateRef.current.hoveredButtonIndex === hoveredIndex) {\n // Оновлюємо позицію для існуючого тултипу\n setTooltipPosition({ x: x, y: y });\n }\n\n if (hoveredIndex !== stateRef.current.hoveredButtonIndex) {\n shouldRender = true; // Рендеримо тільки якщо індекс наведеної кнопки змінився\n // Оновлюємо тултіп\n\n if (hoveredIndex !== null) {\n const button = buttonImages[hoveredIndex];\n if (button?.tooltip) {\n const tooltipContent =\n typeof button.tooltip === 'function' ? button.tooltip(stateRef.current.hoveredNode) : button.tooltip;\n setTooltipContent(tooltipContent);\n setTooltipPosition({ x: x, y: y });\n } else {\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n } else {\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n stateRef.current.hoveredButtonIndex = hoveredIndex;\n }\n } else {\n if (stateRef.current.hoveredButtonIndex !== null) {\n stateRef.current.hoveredButtonIndex = null;\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n }\n\n if (!hoveredNode) {\n // Якщо не наведено на ноду, перевіряємо наведення на зв'язок\n hoveredNode = getNodeAtPosition(x, y);\n\n // Якщо не наведено на ноду, перевіряємо наведення на зв'язок\n if (!hoveredNode) {\n const hoveredLink = getLinkAtPosition(x, y);\n const shouldRenderLink = hoveredLink !== stateRef.current.hoveredLink;\n\n // Очищаємо стан наведення на ноду при наведенні на зв'язок\n if (hoveredLink && stateRef.current.hoveredNode) {\n handleNodeHover(null);\n }\n\n handleLinkHover(event, hoveredLink);\n\n // Оновлюємо стиль курсора для зв'язків\n if (canvasRef.current) {\n canvasRef.current.style.cursor = hoveredLink ? 'pointer' : 'default';\n }\n\n if (shouldRenderLink) {\n renderCanvas2D();\n return;\n }\n }\n }\n\n // Очищаємо стан наведення на зв'язок при наведенні на ноду\n if (hoveredNode && stateRef.current.hoveredLink) {\n handleLinkHover(event, null);\n }\n\n if (hoveredNode !== stateRef.current.hoveredNode) shouldRender = true;\n\n handleNodeHover(hoveredNode);\n // Перевіряємо наведення та оновлюємо підсвічування\n\n // Змінюємо стиль курсору залежно від наведення\n if (canvasRef.current) {\n canvasRef.current.style.cursor = hoveredNode ? 'pointer' : 'default';\n }\n if (shouldRender) {\n renderCanvas2D(); // Перемальовуємо полотно після зміни наведення\n }\n },\n [\n buttonImages,\n getNodeAtPosition,\n getLinkAtPosition,\n handleNodeHover,\n handleLinkHover,\n renderCanvas2D,\n isPointInButtonSector,\n getHoveredIndex,\n ]\n );\n\n const handleClick = useCallback((event: React.MouseEvent<HTMLCanvasElement>) => {\n if (stateRef.current.mustBeStoppedPropagation) {\n event.stopPropagation();\n event.preventDefault();\n }\n stateRef.current.mustBeStoppedPropagation = false;\n }, []);\n\n // Обробляємо відпускання кнопки миші для завершення перетягування\n const handleMouseUp = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n const wasDragging = stateRef.current.isDragging;\n\n if (wasDragging) {\n stateRef.current.mustBeStoppedPropagation = true;\n }\n // Обробляємо кліки на вузли або кнопки тільки якщо ми не перетягували\n if (!wasDragging && stateRef.current.mouseStartPos) {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n if (buttonImages.length > 0 && stateRef.current.hoveredButtonIndex === null) {\n const index = getHoveredIndex(x, y);\n stateRef.current.hoveredButtonIndex = index;\n }\n // Спочатку перевіряємо, чи ми клікаємо на кнопку обраного вузла\n let isButtonClick = false;\n if (\n stateRef.current.hoveredNode &&\n stateRef.current.hoveredButtonIndex !== null &&\n buttons[stateRef.current.hoveredButtonIndex]\n ) {\n // Це клік на кнопку, викликаємо обробник onClick кнопки\n const button = buttons[stateRef.current.hoveredButtonIndex];\n if (button && button.onClick) {\n button.onClick(stateRef.current.hoveredNode);\n isButtonClick = true;\n stateRef.current.hoveredButtonIndex = null;\n }\n }\n\n // Якщо це не клік на кнопку і у нас є draggedNode (миша була натиснута на ноді), викликаємо клік на ноду\n if (!isButtonClick && stateRef.current.draggedNode) {\n handleNodeClick(event, stateRef.current.draggedNode);\n } else if (!isButtonClick && !stateRef.current.draggedNode) {\n // Перевіряємо чи клікнули на зв'язок\n const clickedLink = getLinkAtPosition(x, y);\n if (clickedLink) {\n handleLinkClick(clickedLink);\n } else {\n // Якщо не клікнули на ноду, кнопку або зв'язок, це клік на фон\n // Викликаємо клік на фон тільки якщо не було перетягування\n handleBackgroundClick();\n }\n }\n }\n }\n\n if (stateRef.current.draggedNode && simulationRef.current) {\n // Якщо відбулось реальне перетягування, оптимізуємо параметри симуляції\n if (wasDragging) {\n // Поступово зменшуємо енергію симуляції\n simulationRef.current.alphaTarget(0);\n\n // Оптимізуємо параметри симуляції для кращої стабілізації\n const alphaValue = 0.05; // Низька альфа для плавного затухання\n const alphaDecayValue = 0.04; // Помірний коефіцієнт затухання для швидшої зупинки\n const velocityDecayValue = 0.6; // Стандартний коефіцієнт загасання швидкості після перетягування\n\n simulationRef.current.alpha(alphaValue).alphaDecay(alphaDecayValue);\n simulationRef.current.velocityDecay(velocityDecayValue);\n } else {\n // Якщо це був просто клік, а не перетягування, негайно зупиняємо симуляцію\n simulationRef.current.alphaTarget(0);\n }\n\n // Звільняємо позицію вузла незалежно від того, чи його перетягували або клікали\n stateRef.current.draggedNode.fx = undefined;\n stateRef.current.draggedNode.fy = undefined;\n\n stateRef.current.draggedNode = null;\n }\n\n // Скидаємо всі стани перетягування\n stateRef.current.isDragging = false;\n stateRef.current.mouseStartPos = null;\n\n // Завершуємо панорамування, якщо воно активне\n if (stateRef.current.isPanning) {\n stateRef.current.isPanning = false;\n }\n\n // НЕ очищаємо тултіп при mouseleave, бо TooltipWrapper має pointer-events: none\n // і миша проходить \"крізь\" нього. Логіка в handleMouseMove вже правильно\n // очищає tooltip коли миша виходить з області кнопок.\n\n renderCanvas2D();\n },\n [\n buttons,\n renderCanvas2D,\n handleNodeClick,\n handleBackgroundClick,\n getLinkAtPosition,\n handleLinkClick,\n getHoveredIndex,\n buttonImages,\n ]\n );\n\n // Обробляємо подію колеса миші для масштабування\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (!canvasRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Обчислюємо коефіцієнт масштабування\n const delta = -event.deltaY;\n const scaleFactor = delta > 0 ? 1.1 : 1 / 1.1;\n\n // Обчислюємо нову трансформацію з масштабуванням навколо позиції миші\n const currentTransform = stateRef.current.transform;\n\n // Обмежуємо рівень масштабування (опціонально)\n const newScale = currentTransform.k * scaleFactor;\n\n if (newScale < 0.01 || newScale > 10) return;\n const newK = currentTransform.k * scaleFactor;\n\n // Обчислюємо нове переміщення для центрування масштабування на позиції миші\n const newX = x - (x - currentTransform.x) * scaleFactor;\n const newY = y - (y - currentTransform.y) * scaleFactor;\n\n // Оновлюємо трансформацію в stateRef\n stateRef.current.transform = {\n k: newK,\n x: newX,\n y: newY,\n };\n renderCanvas2D();\n },\n [renderCanvas2D]\n );\n\n //Обробка подій на тачскрін девайсах\n const convertTouchToMouseEvent = (\n e: TouchEvent | React.TouchEvent<HTMLCanvasElement>,\n callback: (event: React.MouseEvent<HTMLCanvasElement>) => void\n ) => {\n const touch = e.touches[0];\n if (touch) {\n // Створюємо синтетичну подію схожу на React.MouseEvent\n const syntheticEvent = {\n clientX: touch.clientX,\n clientY: touch.clientY,\n } as React.MouseEvent<HTMLCanvasElement>;\n callback(syntheticEvent);\n }\n };\n const handleTouchStart = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n convertTouchToMouseEvent(e, handleMouseDown);\n },\n [handleMouseDown]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (stateRef.current.mustBeStoppedPropagation) {\n e.preventDefault();\n e.stopPropagation();\n }\n stateRef.current.mustBeStoppedPropagation = false;\n convertTouchToMouseEvent(e, handleMouseUp);\n },\n [handleMouseUp]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n convertTouchToMouseEvent(e, handleMouseMove);\n },\n [handleMouseMove]\n );\n\n useImperativeHandle(\n ref,\n () => ({\n zoomToFit,\n zoomToSelected,\n zoomToNodes,\n addNodes,\n removeNodes,\n setSelectedNodes,\n setNodeSizes,\n setNodeColors,\n setLinkWidths,\n setLinkColors,\n findShortestPath,\n arrangeSelectedInGrid,\n arrangeNodesByTypeInGrid,\n }),\n [\n zoomToFit,\n zoomToSelected,\n zoomToNodes,\n addNodes,\n removeNodes,\n setSelectedNodes,\n setNodeSizes,\n setNodeColors,\n setLinkWidths,\n setLinkColors,\n findShortestPath,\n arrangeSelectedInGrid,\n arrangeNodesByTypeInGrid,\n ]\n );\n\n useEffect(() => {\n // Ініціалізуємо контекст canvas\n const canvasElement = canvasRef.current;\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n if (!canvasElement) return;\n\n // Ініціалізуємо Canvas 2D контекст\n init2DCanvas();\n setIsRendering(true);\n\n // Розрахунок центральної позиції з урахуванням розміру полотна\n const centerX = canvasWidth / 2;\n const centerY = canvasHeight / 2;\n\n // Ініціалізація силової симуляції D3\n const nodeSize = config.nodeSizeBase;\n const nodeRadius = nodeSize / 2;\n const linkDistance = nodeSize * 2.5; // Розрахунок відстані між зв'язками на основі розміру вузла\n\n if (simulationRef.current) simulationRef.current.stop();\n const simulation = (simulationRef.current = forceSimulation(nodes)\n .force(\n 'link',\n forceLink(links)\n .id((d: any) => d.id)\n .distance(linkDistance) // Адаптивна відстань між вузлами на основі розміру\n .strength(0.9) // Зменшуємо силу зв'язків (значення від 0 до 1)\n )\n .force(\n 'charge',\n forceManyBody()\n .strength((-nodeSize / 10) * 200) // Силу відштовхування на основі розміру вузла\n .theta(0.5) // Оптимізація для стабільності (0.5-1.0)\n .distanceMin(nodeSize * 2)\n )\n .force('x', forceX().strength(0.03)) // Слабка сила для стабілізації по осі X\n .force('y', forceY().strength(0.03)) // Слабка сила для стабілізації по осі Y\n .force('center', forceCenter(centerX, centerY).strength(0.05)) // Слабка сила центрування\n .force(\n 'collide',\n forceCollide()\n .radius((node: any) => getNodeSize(node)) // Радіус колізії залежно від розміру кожного вузла\n .iterations(2) // Більше ітерацій для кращого запобігання перекриття\n .strength(1) // Збільшуємо силу запобігання колізіям\n )\n .velocityDecay(0.6)); // Коефіцієнт затухання швидкості для зменшення \"тряски\"\n\n return () => {\n // Очищення\n simulation.stop();\n };\n }, [nodes, links]);\n\n useLayoutEffect(() => {\n const canvasElement = canvasRef.current;\n if (!canvasElement) return;\n stateRef.current.width = width * RATIO;\n stateRef.current.height = height * RATIO;\n canvasElement.width = stateRef.current.width;\n canvasElement.height = stateRef.current.height;\n }, [width, height]);\n\n useEffect(() => {\n if (simulationRef.current) {\n const simulation = simulationRef.current;\n\n // Оновлюємо позиції нод на кожному кроці\n\n simulation.on('tick', () => {\n renderCanvas2D();\n });\n\n // Коли симуляція завершується, зупиняємо індикатор рендерингу\n simulation.on('end', () => {\n // Рендеримо останній раз\n\n if (isRendering) {\n zoomToFit(0, 20); // Масштабуємо для вміщення після рендерингу\n setTimeout(() => {\n setIsRendering(false);\n }, 200);\n }\n });\n }\n\n if (!isRendering) {\n renderCanvas2D();\n }\n }, [nodes, links, isRendering, renderCanvas2D, zoomToFit]);\n\n // Встановлюємо зв'язки між нодами (сусіди та лінки)\n useEffect(() => {\n if (!nodes || !links) return;\n\n // Зв'язуємо ноди з їх сусідами та лінками\n links.forEach((link: any) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n: any) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Ініціалізуємо масиви якщо їх ще немає\n !source.neighbors && (source.neighbors = []);\n !target.neighbors && (target.neighbors = []);\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n !source.links && (source.links = []);\n !target.links && (target.links = []);\n source.links.push(link);\n target.links.push(link);\n });\n }, [nodes, links]);\n\n // Ініціалізуємо зображення кнопок\n useEffect(() => {\n if (buttons && buttons.length > 0) {\n setButtonImages(prepareButtonImages(buttons));\n }\n }, [buttons]);\n\n // Додаємо обробник події коліщатка миші з passive: false\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof window === 'undefined') return;\n\n // Додаємо обробник події з passive: false щоб дозволити preventDefault\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n canvas.addEventListener('touchend', handleTouchEnd, { passive: false });\n\n // Очищуємо при демонтуванні компонента\n return () => {\n canvas.removeEventListener('wheel', handleWheel);\n canvas.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleWheel, handleTouchEnd]);\n\n return (\n <Container>\n <Wrapper>\n {(loading || isRendering) && <GraphLoader width={width} height={height} />}\n <Canvas\n ref={canvasRef}\n style={{ width, height, display: loading || isRendering ? 'none' : 'block' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onClick={handleClick}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n />\n </Wrapper>\n </Container>\n );\n }\n);\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n`;\n\nconst Wrapper = styled.div`\n position: relative;\n`;\n\nconst Canvas = styled.canvas``;\n\n// Додаємо відображуване ім'я для кращого налагодження\nGraph2D.displayName = 'Graph2D';\n","import styled from 'styled-components';\nimport { createComponent, pxToRem } from '../Theme';\n\ninterface FullscreenCardProps {\n children: any;\n className?: string;\n position: 'absolute' | 'fixed';\n isActive: boolean;\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n offset?: {\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n };\n}\n\nexport const FullscreenCard = createComponent<FullscreenCardProps>(\n ({ isActive, position, top = 0, left = 0, right, bottom, offset, ...props }) => {\n return (\n <>\n {isActive && offset && (\n <StyledBackdrop\n $position={position}\n $top={top}\n $left={left}\n $right={right}\n $bottom={bottom}\n $offset={offset}\n />\n )}\n <StyledContainer\n $isActive={isActive}\n $position={position}\n $top={top}\n $left={left}\n $right={right}\n $bottom={bottom}\n {...props}\n />\n </>\n );\n }\n);\n\nconst StyledBackdrop = styled.div<{\n $top?: number;\n $left?: number;\n $right?: number;\n $bottom?: number;\n $position: 'absolute' | 'fixed';\n $offset: {\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n };\n}>(({ $top, $left, $right, $bottom, $position, $offset, theme }) => {\n const offsetTop = $offset.top ?? 0;\n const offsetLeft = $offset.left ?? 0;\n const offsetRight = $offset.right ?? 0;\n const offsetBottom = $offset.bottom ?? 0;\n\n return `\n position: ${$position};\n z-index: 999;\n background-color: ${theme.colors.backgroundBase};\n ${typeof $top === 'number' ? `top: ${pxToRem($top - offsetTop, theme.baseSize)};` : ''}\n ${typeof $left === 'number' ? `left: ${pxToRem($left - offsetLeft, theme.baseSize)};` : ''}\n ${typeof $right === 'number' ? `right: ${pxToRem($right - offsetRight, theme.baseSize)};` : ''}\n ${typeof $bottom === 'number' ? `bottom: ${pxToRem($bottom - offsetBottom, theme.baseSize)};` : ''}\n `;\n});\n\nconst StyledContainer = styled.div<{\n $isActive: boolean;\n $top?: number;\n $left?: number;\n $right?: number;\n $bottom?: number;\n $position: 'absolute' | 'fixed';\n}>(\n ({ $isActive, $top, $left, $right, $bottom, $position, theme }) => `\n${\n $isActive\n ? `\n position: ${$position};\n z-index: 1000;\n ${typeof $top === 'number' ? `top: ${pxToRem($top, theme.baseSize)};` : ''}\n ${typeof $left === 'number' ? `left: ${pxToRem($left, theme.baseSize)};` : ''}\n ${typeof $right === 'number' ? `right: ${pxToRem($right, theme.baseSize)};` : ''}\n ${typeof $bottom === 'number' ? `bottom: ${pxToRem($bottom, theme.baseSize)};` : ''}\n `\n : ''\n}\n\n min-width: 0;\n `\n);\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Box, Button } from '../../Core';\nimport { MinusIcon, PlusIcon } from '../../Core/IconComponents';\n\nexport const ImageDriver = ({ url }: { url: string }) => {\n const [scale, setScale] = useState(1);\n const [scaleBy, setScaleBy] = useState<'width' | 'height'>();\n const imgRef = React.useRef<HTMLImageElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n return (\n <Wrapper ref={containerRef}>\n <Controls>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={5}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </Controls>\n <ScrollArea>\n <img\n src={url}\n ref={imgRef}\n alt=\"image\"\n style={{\n display: 'block',\n width: 'auto',\n maxWidth: 'none',\n objectFit: 'contain',\n transition: 'all 0.2s ease-in-out',\n marginInline: 'auto',\n marginBlock: 10,\n flexShrink: 0,\n ...(scaleBy === 'width' && { width: `calc(${scale * 100}% - 20px)` }),\n ...(scaleBy === 'height' && { height: `calc(${scale * 100}% - 20px)` }),\n }}\n onLoad={() => {\n if (imgRef.current && containerRef.current) {\n const { width, height } = imgRef.current;\n setScaleBy(width < height ? 'height' : 'width');\n }\n }}\n />\n </ScrollArea>\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Controls = styled.div(\n ({ theme }) => `\n display: flex;\n justify-content: center;\n align-items: stretch;\n padding: 22px;\n gap: 4px;\n border-bottom: 1px solid ${theme.colors.stroke.light};\n position: relative;\n`\n);\n\nconst ScrollArea = styled.div`\n height: 100%;\n width: 100%;\n overflow: auto;\n`;\n","import styled from 'styled-components';\n\nexport const AudioDriver = ({ url }: { url: string }) => (\n <Wrapper>\n <audio controls src={url} style={{ width: '100%' }} />\n </Wrapper>\n);\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n padding: 22px;\n`;\n","import React, { useState, useEffect } from 'react';\n\ninterface PdfDriverProps {\n url: string;\n}\n\nexport const PdfDriverWrapper: React.FC<PdfDriverProps> = ({ url }) => {\n const [PdfDriverComponent, setPdfDriverComponent] = useState<React.ComponentType<PdfDriverProps> | null>(null);\n const [isClient, setIsClient] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n useEffect(() => {\n if (!isClient) return;\n const load = async () => {\n try {\n const module = await import('./PdfDriver');\n setPdfDriverComponent(() => module.PdfDriver);\n setLoading(false);\n } catch (err) {\n console.error('Failed to load PDF driver:', err);\n setError('Failed to load PDF viewer');\n setLoading(false);\n }\n };\n load();\n }, [isClient]);\n\n const placeholder = (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }}>\n <span style={{ color: '#6b7280' }}>Loading PDF viewer...</span>\n </div>\n );\n\n if (!isClient || loading) return placeholder;\n if (error || !PdfDriverComponent) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }}>\n <span style={{ color: '#ef4444' }}>{error || 'PDF viewer unavailable'}</span>\n </div>\n );\n }\n\n return <PdfDriverComponent url={url} />;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { renderAsync } from 'docx-preview';\nimport throttle from 'lodash.throttle';\nimport { Box, Button } from '../../Core';\nimport { MinusIcon, PlusIcon } from '../../Core/IconComponents';\n\ninterface DocxDriverProps {\n url?: string;\n blob?: Blob;\n}\n\nconst MAX_SIZE_MB = 50;\nconst TIMEOUT_MS = 10000;\n\nexport const DocxDriver: React.FC<DocxDriverProps> = ({ url, blob }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [scale, setScale] = useState(1);\n const userHasZoomedRef = useRef(false);\n const [naturalSize, setNaturalSize] = useState({ width: 0, height: 0 });\n const naturalWidthRef = useRef(0);\n\n const handleZoomIn = () => {\n userHasZoomedRef.current = true;\n setScale((prev) => Math.min(prev + 0.25, 4));\n };\n\n const handleZoomOut = () => {\n userHasZoomedRef.current = true;\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n };\n\n useEffect(() => {\n const renderDocument = async () => {\n if (!containerRef.current) return;\n try {\n setLoading(true);\n setError(null);\n\n let docBlob = blob;\n if (!docBlob && url) {\n const response = await fetch(url);\n docBlob = await response.blob();\n }\n if (!docBlob) {\n setError('No DOCX file provided');\n return;\n }\n\n const sizeMB = docBlob.size / (1024 * 1024);\n if (sizeMB > MAX_SIZE_MB) {\n setError(`File too large (> ${MAX_SIZE_MB} MB)`);\n return;\n }\n\n containerRef.current.innerHTML = '';\n\n const renderPromise = renderAsync(docBlob, containerRef.current, undefined, {\n debug: true,\n experimental: true,\n hideWrapperOnPrint: true,\n });\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('DOCX render timed out')), TIMEOUT_MS)\n );\n\n await Promise.race([renderPromise, timeoutPromise]);\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n const docxWrapper = containerRef.current.querySelector('.docx-wrapper') as HTMLElement;\n if (docxWrapper) {\n naturalWidthRef.current = docxWrapper.offsetWidth;\n setNaturalSize({ width: docxWrapper.offsetWidth, height: docxWrapper.offsetHeight });\n }\n\n if (wrapperRef.current && naturalWidthRef.current > 0) {\n const autoScale = Math.min(wrapperRef.current.clientWidth / naturalWidthRef.current, 1);\n setScale(autoScale);\n }\n\n setLoading(false);\n } catch (err: any) {\n setError(err?.message || 'Failed to open DOCX file');\n setLoading(false);\n }\n };\n renderDocument();\n }, [url, blob]);\n\n useEffect(() => {\n if (!wrapperRef.current) return;\n\n const handleResize = throttle((entries: ResizeObserverEntry[]) => {\n if (userHasZoomedRef.current || naturalWidthRef.current === 0) return;\n for (const entry of entries) {\n const autoScale = Math.min(entry.contentRect.width / naturalWidthRef.current, 1);\n setScale(autoScale);\n }\n }, 150);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapperRef.current);\n return () => {\n observer.disconnect();\n handleResize.cancel();\n };\n }, []);\n\n return (\n <Wrapper>\n <Controls>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={5}\n />\n <Box py={5} px={8}>\n {Math.round(scale * 100)}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </Controls>\n {!!error && !loading && <ErrorMsg>{error}</ErrorMsg>}\n {loading && <LoadingMsg>Loading...</LoadingMsg>}\n <ScrollArea ref={wrapperRef}>\n <ScaleContainer\n style={{\n width: naturalSize.width > 0 ? naturalSize.width * scale : undefined,\n height: naturalSize.height > 0 ? naturalSize.height * scale : undefined,\n }}\n >\n <DocxContent\n ref={containerRef}\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'top left',\n }}\n />\n </ScaleContainer>\n </ScrollArea>\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Controls = styled.div(\n ({ theme }) => `\n display: flex;\n justify-content: center;\n align-items: stretch;\n padding: 22px;\n gap: 4px;\n border-bottom: 1px solid ${theme.colors.stroke.light};\n`\n);\n\nconst ErrorMsg = styled.div(\n ({ theme }) => `\n color: ${theme.colors.error};\n padding: 20px;\n`\n);\n\nconst LoadingMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n color: ${theme.colors.text.light};\n`\n);\n\nconst ScrollArea = styled.div(\n ({ theme }) => `\n width: 100%;\n height: 100%;\n overflow: auto;\n background-color: ${theme.colors.stroke.main};\n`\n);\n\nconst ScaleContainer = styled.div`\n overflow: hidden;\n margin: 0 auto;\n`;\n\nconst DocxContent = styled.div`\n box-sizing: border-box;\n word-break: break-word;\n overflow-wrap: break-word;\n\n & > div.docx-wrapper {\n box-sizing: border-box;\n min-width: fit-content;\n min-height: 100%;\n }\n\n & > div.docx-wrapper > section {\n min-width: fit-content;\n }\n\n & > div.docx-wrapper table * {\n word-break: break-word !important;\n }\n\n & > div.docx-wrapper table {\n table-layout: fixed !important;\n max-width: 100% !important;\n width: 100% !important;\n border-collapse: collapse !important;\n }\n\n & > div.docx-wrapper img {\n max-width: 100% !important;\n height: auto !important;\n }\n`;\n\nconst _spinKeyframe = keyframes`from { transform: rotate(0deg); } to { transform: rotate(360deg); }`;\n","import { useState, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport CodeMirror from '@uiw/react-codemirror';\nimport { vscodeDark } from '@uiw/codemirror-theme-vscode';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { json } from '@codemirror/lang-json';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { python } from '@codemirror/lang-python';\nimport { java } from '@codemirror/lang-java';\nimport { cpp } from '@codemirror/lang-cpp';\nimport { php } from '@codemirror/lang-php';\nimport { rust } from '@codemirror/lang-rust';\nimport { xml } from '@codemirror/lang-xml';\nimport { yaml } from '@codemirror/lang-yaml';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { sql } from '@codemirror/lang-sql';\nimport { SupportedFileExtension } from '../types';\nimport type { Extension } from '@codemirror/state';\n\ntype TextDriverProps = {\n url: string;\n extension: SupportedFileExtension;\n};\n\nconst getLanguageExtension = (extension: string): Extension[] => {\n const extensionMap: Record<string, Extension[]> = {\n js: [javascript({ jsx: false })],\n jsx: [javascript({ jsx: true })],\n ts: [javascript({ typescript: true, jsx: false })],\n tsx: [javascript({ typescript: true, jsx: true })],\n json: [json()],\n html: [html()],\n css: [css()],\n scss: [css()],\n py: [python()],\n java: [java()],\n cpp: [cpp()],\n c: [cpp()],\n php: [php()],\n rs: [rust()],\n xml: [xml()],\n yaml: [yaml()],\n yml: [yaml()],\n md: [markdown()],\n sql: [sql()],\n sh: [markdown()],\n bash: [markdown()],\n };\n return extensionMap[extension] || [];\n};\n\nexport const TextDriver = ({ url, extension }: TextDriverProps) => {\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [containerHeight, setContainerHeight] = useState<number>(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to load file: ${response.statusText}`);\n setContent(await response.text());\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load text content');\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n useEffect(() => {\n const update = () => {\n if (containerRef.current) setContainerHeight(containerRef.current.clientHeight);\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [loading]);\n\n if (loading) return <StatusMsg>Loading text content...</StatusMsg>;\n if (error) return <ErrorMsg>Error: {error}</ErrorMsg>;\n\n return (\n <Wrapper ref={containerRef}>\n {containerHeight > 0 && (\n <CodeMirror\n value={content}\n theme={vscodeDark}\n extensions={getLanguageExtension(extension)}\n editable={false}\n height={`${containerHeight}px`}\n basicSetup={{\n lineNumbers: true,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n foldGutter: true,\n dropCursor: false,\n indentOnInput: false,\n syntaxHighlighting: true,\n bracketMatching: true,\n closeBrackets: false,\n autocompletion: false,\n rectangularSelection: false,\n crosshairCursor: false,\n highlightSelectionMatches: false,\n closeBracketsKeymap: false,\n searchKeymap: false,\n foldKeymap: true,\n completionKeymap: false,\n lintKeymap: false,\n }}\n />\n )}\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n`;\n\nconst StatusMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: ${theme.colors.text.light};\n`\n);\n\nconst ErrorMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: ${theme.colors.error};\n`\n);\n","import styled from 'styled-components';\n\nexport const VideoDriver = ({ url }: { url: string }) => (\n <Wrapper>\n <video controls src={url} style={{ width: '100%', maxHeight: '100%' }} />\n </Wrapper>\n);\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n`;\n","import { memo } from 'react';\nimport styled from 'styled-components';\nimport { SupportedFileExtension } from './types';\nimport { ImageDriver } from './drivers/ImageDriver';\nimport { AudioDriver } from './drivers/AudioDriver';\nimport { PdfDriver } from './drivers/PdfDriver';\nimport { DocxDriver } from './drivers/DocxDriver';\nimport { TextDriver } from './drivers/TextDriver';\nimport { VideoDriver } from './drivers/VideoDriver';\nimport { Typography } from '../Core';\n\ntype DriverProps = {\n path?: string;\n blob?: Blob;\n buffer?: ArrayBuffer;\n extension: SupportedFileExtension;\n not_supported_message?: string;\n};\n\nexport const Driver = memo(function Driver({\n extension,\n blob,\n path,\n buffer,\n not_supported_message = \"Sorry, this file type isn't supported yet.\",\n}: DriverProps) {\n const normalizedExtension = extension.toLocaleLowerCase().trim() as SupportedFileExtension;\n\n let url: string | undefined;\n if (path) {\n url = path;\n } else if (blob) {\n url = URL.createObjectURL(blob);\n }\n\n if (url) {\n if (['jpeg', 'jpg', 'png', 'gif', 'bmp', 'webp'].includes(normalizedExtension)) {\n return <ImageDriver url={url} />;\n }\n if (['mp3', 'wav', 'ogg', 'flac'].includes(normalizedExtension)) {\n return <AudioDriver url={url} />;\n }\n if (['mp4', 'webm'].includes(normalizedExtension)) {\n return <VideoDriver url={url} />;\n }\n if (extension === 'pdf') {\n return <PdfDriver url={url} />;\n }\n if (\n ['txt', 'js', 'jsx', 'ts', 'tsx', 'json', 'html', 'css', 'scss', 'py', 'java', 'cpp', 'c', 'cs', 'php', 'rb', 'go', 'rs', 'swift', 'kt', 'xml', 'yaml', 'yml', 'md', 'sql', 'sh', 'bash'].includes(normalizedExtension)\n ) {\n return <TextDriver url={url} extension={normalizedExtension} />;\n }\n }\n\n if (normalizedExtension === 'docx') {\n return <DocxDriver url={url} blob={blob} />;\n }\n\n return (\n <NotSupported>\n <Typography variant=\"h2\" color=\"text.light\" weight={500} style={{ textAlign: 'center' }}>\n {not_supported_message}\n </Typography>\n </NotSupported>\n );\n});\n\nconst NotSupported = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 20px;\n`;\n","import styled from 'styled-components';\nimport { Driver } from './Driver';\nimport { SupportedFileExtension } from './types';\n\ntype FileViewerProps = {\n path?: string;\n blob?: Blob;\n buffer?: ArrayBuffer;\n extension: SupportedFileExtension;\n not_supported_message?: string;\n};\n\nexport const FileViewer = (props: FileViewerProps) => {\n return (\n <Wrapper>\n <Driver {...props} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n`;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Layouts/PageLayout/PageLayout.tsx","../src/Layouts/PageLayout/PageContent.tsx","../src/Layouts/PageLayout/SubNav.tsx","../src/Layouts/Container/Container.tsx","../src/Layouts/SplitterLayout/SplitterLayout.tsx","../src/Graph2D/GraphLoader.tsx","../src/Graph2D/wrapText.ts","../src/Graph2D/Graph2D.tsx","../src/FullscreenCard/FullscreenCard.tsx","../src/FileViewer/drivers/ImageDriver.tsx","../src/FileViewer/drivers/AudioDriver.tsx","../src/FileViewer/drivers/PdfDriver/PdfDriverWrapper.tsx","../src/FileViewer/drivers/DocxDriver.tsx","../src/FileViewer/drivers/TextDriver.tsx","../src/FileViewer/drivers/VideoDriver.tsx","../src/FileViewer/Driver.tsx","../src/FileViewer/FileViewer.tsx"],"names":["PageLayout","__name","children","className","jsx","StyledContainer","styled","PageContent","StyledMain","theme","SubNav","top","Styled","e","$top","Container","createComponent","maxWidth","props","createStyledComponent","$maxWidth","px","generatePropertySpaceStyle","pxToRem","MIN_WIDTH","STORAGE_KEY","getSavedWidths","key","length","initialWidths","saved","parsed","SplitterLayout","columns","style","splitterClassName","minWidth","storageKey","widths","setWidths","useState","containerRef","useRef","activeIndex","minWidthRef","widthsRef","handleMove","useCallback","clientX","container","totalWidth","x","newWidths","left","right","prevWidthsSum","a","b","leftWidth","rightWidth","handleMouseMove","handleTouchMove","stopResizing","startResizing","index","handleTouchStart","useEffect","content","colClassName","colStyle","i","jsxs","Fragment","Column","Splitter","SplitterHandle","LoaderWrapper","GraphLoader","width","height","useTheme","ContentLoader","GraphLoader_default","wrapText","ctx","text","paragraphs","lines","paragraph","words","line","n","testLine","RATIO","prepareButtonImages","buttons","button","config","getNodeSize","node","getLinkWidth","link","isHighlighted","Graph2D","forwardRef","loading","graphData","enableGrid","onNodeClick","onBackgroundClick","onNodeHover","onLinkHover","onLinkClick","onChangeSelectedNodeIds","ref","isRendering","setIsRendering","tooltipPosition","setTooltipPosition","tooltipContent","setTooltipContent","stateRef","nodes","links","useMemo","cloneDeep","buttonImages","setButtonImages","canvasRef","simulationRef","ctx2dRef","color","scaleOrdinal","schemeCategory10","init2DCanvas","getNodes","getLinks","linkForce","renderGrid","canvasWidth","canvasHeight","gridSpacing","dotSize","y","truncateText","ellipsis","ellipsisWidth","lo","hi","mid","calculateFontSize","scale","fontSizeRatio","renderLinks","source","target","start","end","dx","dy","distance","unitDx","unitDy","sourceRadius","targetRadius","arrowHeadLength","adjustedStart","adjustedEnd","adjusteArrowdEnd","lineColor","lineWidth","middleX","middleY","angle","globalScale","scaledFontSize","textWidth","padding","beforeTextDistance","pointBeforeText","afterTextDistance","pointAfterText","arrowHeadWidth","arrowHeadLengthScaled","drawIconWithOptionalCounter","icon","iconX","iconY","iconSize","counter","textColor","fontSize","counterText","spacing","offsetX","error","renderNodeButtons","nodeSize","buttonRadius","buttonCount","sectorAngle","startAngle","endAngle","isHovered","midAngle","iconDistance","buttonImage","getImageUrl","imgValue","normalImgUrl","hoverImgUrl","getOrCreateImage","url","img","normalImg","hoverImg","spinnerRadius","dotRadius","j","alpha","dotX","dotY","hexToRgba","renderCanvas2D","renderTooltip","borderRadius","lineHeight","offsetY","textHeight","tooltipWidth","tooltipHeight","tooltipX","tooltipY","rect","shadowMatch","renderNodes","nodeColor","fontColor","label","isSelected","size","radius","ringRadius","truncatedLabel","addNodes","newNodes","newLinks","options","callback","smoothAppearance","transitionDuration","existingNodeIds","filteredNewNodes","existingLinkIds","filteredNewLinks","linkId","updatedNodes","updatedLinks","connectedLinks","sourceId","targetId","someLink","connectedNodeId","connectedNode","randomOffset","randomAngle","centerX","centerY","removeNodes","nodeIds","nodeIdsToRemove","id","remainingNodes","remainingLinks","highlightLinksToRemove","zoomToFit","duration","minX","minY","maxX","maxY","contentWidth","contentHeight","scaleX","scaleY","newTransform","startTransform","startTime","animateZoom","t","easedT","interpolatedTransform","zoomToSelected","selectedIds","selectedNodes","zoomToNodes","nodeIdsSet","targetNodes","setSelectedNodes","setNodeSizes","forceCollide","setNodeColors","setLinkWidths","linkIds","setLinkColors","findShortestPath","sourceNode","targetNode","adjacencyMap","sourceNodeId","targetNodeId","queue","visited","current","nodeId","arrangeSelectedInGrid","nodesToArrange","sum","rows","gridWidth","gridHeight","startX","startY","col","row","newX","newY","arrangeNodesByTypeInGrid","typeKey","groupSpacing","groups","value","groupKey","groupCount","groupGridColumns","totalCenterX","totalCenterY","groupIndex","groupDimensions","groupNodes","groupColumns","maxGroupWidth","d","maxGroupHeight","groupGridRows","totalGridWidth","totalGridHeight","groupGridStartX","groupGridStartY","groupCol","groupRow","groupCenterX","groupCenterY","getNodeAtPosition","pixelRatio","scaledX","scaledY","nodeRadius","getLinkAtPosition","threshold","sourceX","sourceY","targetX","targetY","A","B","C","D","dot","lenSq","param","xx","yy","isPointInButtonSector","mouseX","mouseY","nodeX","nodeY","isInRadius","isInAngle","handleNodeHover","handleLinkHover","event","newHighlightNodes","newHighlightLinks","handleLinkClick","handleNodeClick","handleBackgroundClick","handleMouseDown","getHoveredIndex","hoveredIndex","canvasScaleX","canvasScaleY","scaledMouseX","scaledMouseY","worldX","worldY","shouldRender","hoveredNode","hoveredLink","shouldRenderLink","handleClick","handleMouseUp","wasDragging","isButtonClick","clickedLink","alphaValue","alphaDecayValue","velocityDecayValue","handleWheel","scaleFactor","currentTransform","newScale","newK","convertTouchToMouseEvent","touch","syntheticEvent","handleTouchEnd","useImperativeHandle","canvasElement","linkDistance","simulation","forceSimulation","forceLink","forceManyBody","forceX","forceY","forceCenter","useLayoutEffect","canvas","Wrapper","Canvas","FullscreenCard","isActive","position","bottom","offset","StyledBackdrop","$left","$right","$bottom","$position","$offset","offsetTop","offsetLeft","offsetRight","offsetBottom","$isActive","ImageDriver","setScale","scaleBy","setScaleBy","imgRef","React","Controls","Button","MinusIcon","prev","Box","PlusIcon","ScrollArea","AudioDriver","PdfDriverWrapper","PdfDriverComponent","setPdfDriverComponent","isClient","setIsClient","setLoading","setError","module","err","placeholder","MAX_SIZE_MB","TIMEOUT_MS","DocxDriver","blob","wrapperRef","userHasZoomedRef","naturalSize","setNaturalSize","naturalWidthRef","handleZoomIn","handleZoomOut","docBlob","renderPromise","renderAsync","timeoutPromise","_","reject","resolve","docxWrapper","autoScale","handleResize","throttle","entries","entry","observer","ErrorMsg","LoadingMsg","ScaleContainer","DocxContent","_spinKeyframe","keyframes","getLanguageExtension","extension","javascript","json","html","css","python","java","cpp","php","rust","xml","yaml","markdown","sql","TextDriver","setContent","containerHeight","setContainerHeight","response","update","StatusMsg","CodeMirror","vscodeDark","VideoDriver","Driver","memo","path","buffer","not_supported_message","normalizedExtension","NotSupported","Typography","FileViewer"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ReactElement } from 'react';\nimport { styled } from 'styled-components';\n\ninterface PageLayoutProps {\n children?: any;\n className?: string;\n}\n\nexport const PageLayout = ({ children, className }: PageLayoutProps) => {\n return <StyledContainer className={className}>{children}</StyledContainer>;\n};\n\nexport const StyledContainer = styled.div`\n display: grid;\n min-height: 100dvh;\n position: relative;\n grid-template-columns: auto auto 1fr;\n grid-template-rows: auto 1fr;\n grid-template-areas: 'sidebar header header' 'sidebar sub-nav content';\n\n & > header {\n grid-area: header;\n }\n`;\n","import { styled } from 'styled-components';\n\ninterface ContentProps {\n children: any;\n className?: string;\n}\nexport const PageContent = ({ children, className }: ContentProps) => {\n return <StyledMain className={className}>{children}</StyledMain>;\n};\n\nexport const StyledMain = styled.main`\n grid-area: content;\n min-width: 0;\n background: ${({ theme }) => theme.colors.backgroundBase};\n`;\n","import { styled } from 'styled-components';\n\ninterface SubNavProps {\n children?: any;\n className?: string;\n top?: number;\n}\nexport const SubNav = ({ children, className, top = 0 }: SubNavProps) => {\n return (\n <Styled className={className} $top={top} onClick={(e) => e.stopPropagation()}>\n {children}\n </Styled>\n );\n};\ntype StyledProps = {\n $top: number;\n};\nexport const Styled = styled.div<StyledProps>(\n ({ theme, $top }) => `\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n position: fixed;\n left: 0;\n grid-area: sub-nav;\n min-width: 0;\n background: ${theme.colors.background};\n max-height: calc(100dvh - ${$top}px);\n height: 100%;\n z-index: 1001;\n top: ${$top}px;\n overflow: auto;\n @media (min-width: ${theme.breakpoints.xl}px){\n position: sticky;\n border-right: 1px solid ${theme.colors.stroke.light};\n }\n`\n);\n","import {\n createComponent,\n createStyledComponent,\n FabricComponent,\n generatePropertySpaceStyle,\n pxToRem,\n} from '../../Theme';\nimport { styled } from 'styled-components';\n\ntype ContainerProps = {\n children: any;\n maxWidth?: string | number;\n};\n\ntype StyledContainerProps = {\n $maxWidth?: string | number;\n};\n\nexport const Container = createComponent<ContainerProps>(({ maxWidth, ...props }) => {\n return <StyledContainer {...props} $maxWidth={maxWidth} />;\n});\n\nconst StyledContainer = createStyledComponent<FabricComponent<StyledContainerProps>>(\n styled.div(({ theme, $maxWidth, px = 20 }) => {\n return `\n ${generatePropertySpaceStyle(theme, 'padding-inline', px)}\n width: 100%;\n min-width: 0;\n max-width: ${typeof $maxWidth === 'number' ? pxToRem($maxWidth, theme.baseSize) : $maxWidth || '100%'};\n `;\n }),\n { ignoreStyles: ['padding-inline'] }\n);\n","import { Fragment, useCallback, useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\n\ntype SplitterLayoutProps = {\n columns: { content: React.ReactNode; className?: string; style?: React.CSSProperties }[];\n style?: React.CSSProperties;\n className?: string;\n splitterClassName?: string;\n initialWidths: number[];\n minWidth?: number;\n storageKey?: string;\n};\n\nconst MIN_WIDTH = 20;\nconst STORAGE_KEY = 'splitter_columns_widths';\n\nconst getSavedWidths = (key: string, length: number, initialWidths: number[]): number[] => {\n const saved = localStorage.getItem(key);\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed) && parsed.length === length) return parsed;\n } catch {\n // ignore\n }\n } else if (initialWidths.length === length) {\n return initialWidths;\n }\n return Array(length).fill(100 / length);\n};\n\nexport const SplitterLayout = ({\n columns,\n initialWidths,\n style,\n className,\n splitterClassName,\n minWidth = MIN_WIDTH,\n storageKey = STORAGE_KEY,\n}: SplitterLayoutProps) => {\n const [widths, setWidths] = useState<number[]>(() => getSavedWidths(storageKey, columns.length, initialWidths));\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeIndex = useRef<number | null>(null);\n const minWidthRef = useRef<number>(minWidth);\n const widthsRef = useRef<number[]>(widths);\n\n const handleMove = useCallback((clientX: number) => {\n if (activeIndex.current === null || !containerRef.current) return;\n\n const container = containerRef.current.getBoundingClientRect();\n const totalWidth = container.width;\n const x = clientX - container.left;\n\n const newWidths = [...widthsRef.current];\n const left = activeIndex.current;\n const right = left + 1;\n\n const prevWidthsSum = newWidths.slice(0, left).reduce((a, b) => a + b, 0);\n const leftWidth = (x / totalWidth) * 100 - prevWidthsSum;\n const rightWidth = newWidths[left] + newWidths[right] - leftWidth;\n\n if (leftWidth >= minWidthRef.current && rightWidth >= minWidthRef.current) {\n newWidths[left] = leftWidth;\n newWidths[right] = rightWidth;\n setWidths(newWidths);\n widthsRef.current = newWidths;\n }\n }, []);\n\n const handleMouseMove = useCallback((e: MouseEvent) => handleMove(e.clientX), [handleMove]);\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n e.preventDefault();\n handleMove(e.touches[0].clientX);\n },\n [handleMove]\n );\n\n const stopResizing = useCallback(() => {\n activeIndex.current = null;\n localStorage.setItem(storageKey, JSON.stringify(widthsRef.current));\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', stopResizing);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', stopResizing);\n }, [handleMouseMove, handleTouchMove, storageKey]);\n\n const startResizing = useCallback(\n (index: number) => (e: React.MouseEvent) => {\n e.preventDefault();\n activeIndex.current = index;\n document.addEventListener('mousemove', handleMouseMove, { passive: false });\n document.addEventListener('mouseup', stopResizing);\n },\n [handleMouseMove, stopResizing]\n );\n\n const handleTouchStart = useCallback(\n (index: number) => (e: React.TouchEvent) => {\n e.preventDefault();\n activeIndex.current = index;\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', stopResizing);\n },\n [handleTouchMove, stopResizing]\n );\n\n useEffect(() => {\n const saved = getSavedWidths(storageKey, columns.length, initialWidths);\n widthsRef.current = saved;\n setWidths(saved);\n }, [columns.length, initialWidths, storageKey]);\n\n return (\n <Container ref={containerRef} style={style} className={className}>\n {columns.map(({ content, className: colClassName, style: colStyle }, i) => (\n <Fragment key={i}>\n <Column style={{ flex: `${widths[i]} 1 0%`, ...colStyle }} className={colClassName}>\n {content}\n </Column>\n {i < columns.length - 1 && (\n <Splitter onMouseDown={startResizing(i)} onTouchStart={handleTouchStart(i)} className={splitterClassName}>\n <SplitterHandle>\n <svg\n style={{ width: 14, height: 14, flexShrink: 0 }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </svg>\n </SplitterHandle>\n </Splitter>\n )}\n </Fragment>\n ))}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n user-select: none;\n`;\n\nconst Column = styled.div`\n min-width: 0;\n`;\n\nconst Splitter = styled.div(\n ({ theme }) => `\n position: relative;\n z-index: 100;\n display: none;\n border-left: 1px solid ${theme.colors.stroke.light};\n\n @media (min-width: 1024px) {\n display: flex;\n position: sticky;\n top: 0;\n }\n`\n);\n\nconst SplitterHandle = styled.span(\n ({ theme }) => `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 24px;\n background: ${theme.colors.background};\n border: 1px solid ${theme.colors.stroke.light};\n color: ${theme.colors.text.lighter};\n border-radius: 6px;\n cursor: col-resize;\n\n &:hover {\n background: ${theme.colors.stroke.lighter};\n }\n`\n);\n","import React from 'react';\nimport ContentLoader from 'react-content-loader';\nimport styled, { useTheme } from 'styled-components';\n\nconst LoaderWrapper = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\ninterface GraphLoaderProps {\n width?: number;\n height?: number;\n}\n\nconst GraphLoader: React.FC<GraphLoaderProps> = ({ width = 280, height = 280 }) => {\n // Допоміжна функція для створення rect з координат лінії\n const theme = useTheme();\n\n return (\n <LoaderWrapper>\n <ContentLoader\n foregroundColor={theme.contentLoader.foreground}\n backgroundColor={theme.contentLoader.background}\n width={width}\n height={height}\n viewBox=\"0 0 280 280\"\n >\n <path d=\"m55 38-0.97266 0.22852 7.0801 30.092-18.355-20.979-0.75195 0.6582 19.596 22.395 0.43164 1.834 0.97266-0.22852 0.75195-0.6582-0.37695-0.42969 9.625-27.912-0.94531-0.32617-9.4375 27.371-0.10547-0.12109zm8 34-0.78516 0.61914 0.0957 0.12305-12.311 13.258 0.73242 0.67969 12.205-13.145 14.277 18.084 0.78516-0.61914-14.373-18.207 0.10547-0.11328zm15 19-0.48438 0.875 46.992 25.996 8e-3 4e-3 20.506 11.592-28.182 4.5449 0.15998 0.98819 29.418-4.7441 0.25 0.14062-12.555 24.143 0.88672 0.46094 13-25 15 25 26 30v18l-11 18 0.85352 0.52148 9.8008-16.039-4.6543 33.518 0.99023 0.13867 4.7793-34.408 7.2305 16.27 0.91406-0.40625-7.9141-17.807v-17.104l18 12.316 0.56445-0.82617-18.896-12.928-25.855-29.836-14.633-24.387 0.01562-0.02344h23.805v-1h-23.152l13.848-21.234 55.201-28.791-0.45898-0.88476 0.77734 0.62305 11.402-14.25 16.668-11.842-0.58008-0.81641-16.785 11.928-11.486 14.355-55.434 28.912-14.277 21.893-7.7617-27.166-0.96094 0.27344 7.7227 27.031-1.1191 0.17969-21.604-12.211zm140.43-12.912-6.957-17.338-0.92773 0.37305 6.957 17.338zm-6.957-17.338 0.72266 0.69336 16.232-16.896-0.7207-0.69336zm-3.4766 137.25 5 15 0.94922-0.31641-5-15zm-91-63-0.48047-0.87695-31 17 0.48047 0.87695zm-31 17 5 18 0.96289-0.26758-5-18zm0 0-0.70703-0.70703-12.898 12.898-17.881 9.9336 0.48633 0.875 18-10zm5 18-0.64062-0.76758-18 15 0.64062 0.76758z\" />\n <circle cx=\"229.92\" cy=\"63.7318\" r=\"5\" transform=\"rotate(173.661 229.92 63.7318)\" />\n <circle cx=\"227.711\" cy=\"43.8541\" r=\"5\" transform=\"rotate(173.661 227.711 43.8541)\" />\n <circle cx=\"211.478\" cy=\"60.7499\" r=\"5\" transform=\"rotate(173.661 211.478 60.7499)\" />\n <circle cx=\"218.434\" cy=\"78.0877\" r=\"5\" transform=\"rotate(173.661 218.434 78.0877)\" />\n <circle cx=\"246.705\" cy=\"51.8054\" r=\"5\" transform=\"rotate(173.661 246.705 51.8054)\" />\n <circle cx=\"42\" cy=\"48\" r=\"5\" />\n <circle cx=\"55\" cy=\"38\" r=\"5\" />\n <circle cx=\"73\" cy=\"43\" r=\"5\" />\n <circle cx=\"63\" cy=\"72\" r=\"5\" />\n <circle cx=\"50\" cy=\"86\" r=\"5\" />\n <circle cx=\"78\" cy=\"91\" r=\"5\" />\n <circle cx=\"73\" cy=\"165\" r=\"5\" />\n <circle cx=\"73\" cy=\"185\" r=\"5\" />\n <circle cx=\"91\" cy=\"170\" r=\"5\" />\n <circle cx=\"86\" cy=\"152\" r=\"5\" />\n <circle cx=\"148\" cy=\"130\" r=\"5\" />\n <circle cx=\"189\" cy=\"185\" r=\"5\" />\n <circle cx=\"163\" cy=\"107\" r=\"5\" />\n <circle cx=\"140\" cy=\"102\" r=\"5\" />\n <circle cx=\"117\" cy=\"135\" r=\"5\" />\n <circle cx=\"125\" cy=\"117\" r=\"5\" />\n <circle cx=\"208\" cy=\"198\" r=\"5\" />\n <circle cx=\"189\" cy=\"203\" r=\"5\" />\n <circle cx=\"198\" cy=\"221\" r=\"5\" />\n <circle cx=\"178\" cy=\"221\" r=\"5\" />\n <circle cx=\"184\" cy=\"239\" r=\"5\" />\n <circle cx=\"213\" cy=\"213\" r=\"5\" />\n <circle cx=\"173\" cy=\"130\" r=\"5\" />\n <circle cx=\"163\" cy=\"155\" r=\"5\" />\n <circle cx=\"135\" cy=\"155\" r=\"5\" />\n <circle cx=\"55\" cy=\"175\" r=\"5\" />\n </ContentLoader>\n </LoaderWrapper>\n );\n};\n\nexport default GraphLoader;\n","// Функція для переносу тексту по maxWidth для canvas\nexport function wrapText(ctx: CanvasRenderingContext2D, text: string, maxWidth: number): string[] {\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n paragraphs.forEach((paragraph) => {\n let words = paragraph.split(' ');\n let line = '';\n for (let n = 0; n < words.length; n++) {\n let testLine = line + (line ? ' ' : '') + words[n];\n let metrics = ctx.measureText(testLine);\n let testWidth = metrics.width;\n if (testWidth > maxWidth && line) {\n lines.push(line);\n line = words[n];\n } else {\n line = testLine;\n }\n }\n lines.push(line);\n });\n return lines;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useLayoutEffect,\n} from 'react';\nimport { Graph2DProps, LinkObject, NodeObject, Graph2DRef, GraphState } from './types';\n\nimport cloneDeep from 'lodash.clonedeep';\n\nimport {\n forceCenter,\n forceLink,\n forceManyBody,\n forceSimulation,\n forceCollide,\n forceX,\n forceY,\n Simulation,\n ForceLink,\n scaleOrdinal,\n schemeCategory10,\n} from 'd3';\nimport { styled, useTheme } from 'styled-components';\nimport GraphLoader from './GraphLoader';\nimport { hexToRgba } from '../Theme';\nimport { wrapText } from './wrapText';\n\nconst RATIO = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n// Завантаження та підготовка зображень кнопок\nfunction prepareButtonImages(buttons: Graph2DProps['buttons']) {\n if (!buttons || buttons.length === 0) return [];\n\n return buttons.map((button) => {\n return {\n ...button,\n imageCache: new Map<string, HTMLImageElement>(),\n };\n });\n}\n\n// Конфігурація подібна до Graph2D\nconst config = {\n fontSize: 4,\n nodeSizeBase: 30,\n nodeAreaFactor: 2,\n nodeBorderWidth: 1,\n textPaddingFactor: 0.9,\n gridSpacing: 20,\n dotSize: 1,\n maxZoom: 4,\n};\n\n// Helper функція для отримання розміру ноди\nconst getNodeSize = (node: NodeObject): number => {\n return node.size ?? config.nodeSizeBase;\n};\n\n// Helper функція для отримання ширини лінії\nconst getLinkWidth = (link: LinkObject, isHighlighted: boolean): number => {\n if (link.width !== undefined) {\n return isHighlighted ? link.width * 2 : link.width;\n }\n return isHighlighted ? 1.5 : 0.5;\n};\n\nexport const Graph2D: any = forwardRef<Graph2DRef, Graph2DProps>(\n (\n {\n loading,\n width,\n height,\n graphData,\n buttons = [],\n enableGrid = true,\n onNodeClick,\n onBackgroundClick,\n onNodeHover,\n onLinkHover,\n onLinkClick,\n onChangeSelectedNodeIds,\n },\n ref\n ) => {\n const theme = useTheme();\n const [isRendering, setIsRendering] = useState(true);\n const [tooltipPosition, setTooltipPosition] = useState<{ x: number; y: number } | null>(null);\n const [tooltipContent, setTooltipContent] = useState<any>(null);\n\n const stateRef = useRef<GraphState>({\n transform: { x: 0, y: 0, k: 1 }, // x, y для переміщення, k для масштабу\n isPanning: false,\n hoveredNode: null,\n hoveredLink: null,\n draggedNode: null,\n selectedNodeIds: new Set(),\n hoveredButtonIndex: null,\n highlightNodes: new Set(),\n highlightLinks: new Set(),\n lastMousePos: { x: 0, y: 0 },\n mustBeStoppedPropagation: false,\n mouseStartPos: null,\n isDragging: false,\n width: width * RATIO,\n height: height * RATIO,\n animation: {\n id: null,\n buttonIndex: null,\n },\n spinnerAngle: 0,\n });\n\n const { nodes, links } = useMemo(() => cloneDeep(graphData), [graphData]);\n\n // Стани кнопок\n const [buttonImages, setButtonImages] = useState<any[]>([]);\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const simulationRef = useRef<Simulation<NodeObject, LinkObject> | null>(null);\n\n // Контекст Canvas для 2D рендерингу\n const ctx2dRef = useRef<CanvasRenderingContext2D | null>(null);\n const color = scaleOrdinal(schemeCategory10);\n\n // Ініціалізація контексту Canvas 2D\n const init2DCanvas = useCallback(() => {\n if (!canvasRef.current) return false;\n\n try {\n const ctx = canvasRef.current.getContext('2d');\n if (!ctx) {\n console.error('Failed to get 2D context');\n return false;\n }\n\n ctx2dRef.current = ctx;\n return true;\n } catch (e) {\n console.error('Error initializing Canvas 2D context:', e);\n return false;\n }\n }, []);\n\n const getNodes = useCallback(() => {\n if (!simulationRef.current) return null;\n return simulationRef.current.nodes();\n }, []);\n\n const getLinks = useCallback(() => {\n if (!simulationRef.current) return null;\n\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n const links = linkForce ? linkForce.links() : null;\n return links;\n }, []);\n\n // Рендеринг сітки на полотні\n const renderGrid = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n // Перевіряємо, чи увімкнена сітка\n if (!enableGrid) return;\n\n // Зберігаємо поточний стан контексту\n ctx.save();\n\n // Скидаємо трансформацію для малювання фону в координатах екрану\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n\n // Малюємо фонові крапки\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n const gridSpacing = config.gridSpacing;\n const dotSize = config.dotSize;\n\n ctx.fillStyle = theme.graph2D.grid.dotColor;\n\n for (let x = gridSpacing / 2; x <= canvasWidth; x += gridSpacing) {\n for (let y = gridSpacing / 2; y <= canvasHeight; y += gridSpacing) {\n ctx.beginPath();\n ctx.arc(x, y, dotSize, 0, 2 * Math.PI);\n ctx.fill();\n }\n }\n\n // Відновлюємо оригінальну трансформацію для іншого рендерингу\n ctx.restore();\n },\n [enableGrid, theme.graph2D.grid.dotColor, config.gridSpacing, config.dotSize]\n );\n\n // Функція для обрізання тексту з додаванням трикрапки\n const truncateText = useCallback((text: string, maxWidth: number, ctx: CanvasRenderingContext2D): string => {\n if (!text) return '';\n if (ctx.measureText(text).width <= maxWidth) return text;\n\n const ellipsis = '...';\n const ellipsisWidth = ctx.measureText(ellipsis).width;\n let lo = 0;\n let hi = text.length;\n\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(text.slice(0, mid)).width + ellipsisWidth <= maxWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n\n return lo === 0 ? ellipsis : text.slice(0, lo) + ellipsis;\n }, []);\n\n // Розрахунок розміру шрифту на основі масштабу/зуму\n const calculateFontSize = (scale: number): number => {\n // Обмежуємо масштаб до максимального зуму\n const limitedScale = Math.min(scale, config.maxZoom);\n\n // Масштабуємо розмір шрифту пропорційно\n const fontSizeRatio = limitedScale / config.maxZoom;\n\n return Math.max(config.fontSize * fontSizeRatio, config.fontSize);\n };\n\n // Рендеринг зв'язків на полотні - подібно до реалізації Graph2D\n const renderLinks = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n const links = getLinks();\n const nodes = getNodes();\n if (!links || links.length === 0 || !nodes || nodes.length === 0) return;\n ctx.lineWidth = 0.5;\n ctx.globalAlpha = 1.0;\n\n links.forEach((link) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Координати для початку і кінця\n const start = { x: source.x || 0, y: source.y || 0 };\n const end = { x: target.x || 0, y: target.y || 0 };\n\n // Обчислення відстані і напрямку\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n // Нормалізований вектор напрямку\n const unitDx = dx / distance;\n const unitDy = dy / distance;\n\n // Коригування радіусу вузлів\n const sourceRadius = getNodeSize(source) / 2;\n const targetRadius = getNodeSize(target) / 2;\n const arrowHeadLength = 4;\n\n // Коригуємо початкову і кінцеву позиції, щоб починалися/закінчувалися на краях вузлів\n const adjustedStart = {\n x: start.x + unitDx * sourceRadius,\n y: start.y + unitDy * sourceRadius,\n };\n\n const adjustedEnd = {\n x: end.x - unitDx * (targetRadius + arrowHeadLength),\n y: end.y - unitDy * (targetRadius + arrowHeadLength),\n };\n\n const adjusteArrowdEnd = {\n x: end.x - unitDx * (targetRadius + 1),\n y: end.y - unitDy * (targetRadius + 1),\n };\n\n // Колір лінії залежить від стану виділення\n const isHighlighted = stateRef.current.highlightLinks.has(link);\n const lineColor = isHighlighted ? theme.graph2D.link.highlighted : link.color || theme.graph2D.link.normal;\n const lineWidth = getLinkWidth(link, isHighlighted);\n\n // Обчислення середини лінії для розміщення тексту\n const middleX = start.x + (end.x - start.x) / 2;\n const middleY = start.y + (end.y - start.y) / 2;\n const angle = Math.atan2(dy, dx);\n\n // Малюємо лінію у дві частини, якщо є мітка\n if (link.label) {\n // Обчислюємо ширину тексту для проміжку\n const globalScale = stateRef.current.transform.k;\n const scaledFontSize = calculateFontSize(globalScale);\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n const textWidth = ctx.measureText(link.label).width;\n const padding = 10; // Додатковий простір навколо тексту\n\n // Перша частина лінії\n ctx.beginPath();\n ctx.moveTo(adjustedStart.x, adjustedStart.y);\n\n // Обчислюємо точку перед текстом\n const beforeTextDistance = distance / 2 - (textWidth + padding) / 2;\n const pointBeforeText = {\n x: start.x + unitDx * beforeTextDistance,\n y: start.y + unitDy * beforeTextDistance,\n };\n ctx.lineTo(pointBeforeText.x, pointBeforeText.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n\n // Друга частина лінії\n ctx.beginPath();\n // Обчислюємо точку після тексту\n const afterTextDistance = distance / 2 + (textWidth + padding) / 2;\n const pointAfterText = {\n x: start.x + unitDx * afterTextDistance,\n y: start.y + unitDy * afterTextDistance,\n };\n ctx.moveTo(pointAfterText.x, pointAfterText.y);\n ctx.lineTo(adjustedEnd.x, adjustedEnd.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n } else {\n // Малюємо суцільну лінію якщо немає мітки\n ctx.beginPath();\n ctx.moveTo(adjustedStart.x, adjustedStart.y);\n ctx.lineTo(adjustedEnd.x, adjustedEnd.y);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n ctx.stroke();\n }\n\n // Малюємо стрілку\n const arrowHeadWidth = Math.max(2, lineWidth * 2);\n const arrowHeadLengthScaled = Math.max(4, lineWidth * 4);\n\n ctx.save();\n ctx.translate(adjusteArrowdEnd.x, adjusteArrowdEnd.y);\n ctx.rotate(angle);\n\n // Наконечник стрілки\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(-arrowHeadLengthScaled, arrowHeadWidth);\n ctx.lineTo(-arrowHeadLengthScaled, 0);\n ctx.lineTo(-arrowHeadLengthScaled, -arrowHeadWidth);\n ctx.closePath();\n\n ctx.fillStyle = lineColor;\n ctx.fill();\n ctx.restore();\n\n // Малюємо мітку, якщо вона є\n if (link.label) {\n // Ми вже обчислили ці значення раніше\n // const середнєX = start.x + (end.x - start.x) / 2;\n // const середнєY = start.y + (end.y - start.y) / 2;\n\n const globalScale = stateRef.current.transform.k; // Використовуємо поточний рівень масштабування\n const scaledFontSize = calculateFontSize(globalScale);\n\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n // Повертаємо текст, щоб він співпадав з кутом лінії\n ctx.save();\n ctx.translate(middleX, middleY);\n\n // Коригуємо обертання, якщо текст буде перевернутим\n if (Math.abs(angle) > Math.PI / 2) {\n ctx.rotate(angle + Math.PI);\n } else {\n ctx.rotate(angle);\n }\n\n // Видалено фон для чистішого вигляду\n\n // Малюємо текст\n ctx.fillStyle = isHighlighted ? theme.graph2D.link.highlightedTextColor : theme.graph2D.link.textColor;\n\n ctx.fillText(link.label, 0, 0);\n ctx.restore();\n }\n });\n },\n [config, theme.graph2D.link]\n );\n\n const drawIconWithOptionalCounter = (\n ctx: CanvasRenderingContext2D,\n icon: HTMLImageElement,\n iconX: number,\n iconY: number,\n iconSize: number,\n counter: number | null | undefined,\n textColor?: string\n ) => {\n try {\n if (counter !== null && counter !== undefined) {\n const fontSize = iconSize * 0.8;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'left';\n\n const counterText = new Intl.NumberFormat('en', {\n notation: 'compact',\n maximumFractionDigits: 1,\n minimumFractionDigits: 0,\n compactDisplay: 'short',\n }).format(counter);\n\n const textWidth = ctx.measureText(counterText).width;\n const spacing = iconSize * 0.3;\n const totalWidth = iconSize + spacing + textWidth;\n const offsetX = totalWidth / 2;\n\n ctx.drawImage(icon, iconX - offsetX, iconY - iconSize / 2, iconSize, iconSize);\n ctx.fillStyle = textColor || '#99989C';\n ctx.fillText(counterText, iconX - offsetX + iconSize + spacing, iconY);\n } else {\n ctx.drawImage(icon, iconX - iconSize / 2, iconY - iconSize / 2, iconSize, iconSize);\n }\n } catch (error) {\n console.warn('Error rendering icon:', error);\n }\n };\n // Функція для рендерингу кнопок навколо вузла\n const renderNodeButtons = useCallback(\n (node: NodeObject, ctx: CanvasRenderingContext2D) => {\n if (!buttonImages || buttonImages.length === 0) return;\n if (!node || !node.x || !node.y) return;\n\n const { x, y } = node;\n const nodeSize = getNodeSize(node);\n const buttonRadius = (nodeSize * config.nodeAreaFactor) / 2;\n\n // Зберігаємо стан канвасу\n ctx.save();\n\n // Обчислюємо кількість кнопок і їхніх секторів\n const buttonCount = Math.min(buttonImages.length, 8); // Обмежуємо до максимум 8 кнопок для ясності інтерфейсу\n const sectorAngle = Math.min((Math.PI * 2) / buttonCount, Math.PI); // Максимальний кут сектора - півколо (PI)\n\n // Малюємо кнопки як сектори навколо вузла\n for (let i = 0; i < buttonCount; i++) {\n const startAngle = i * sectorAngle;\n const endAngle = (i + 1) * sectorAngle;\n const isHovered = stateRef.current.hoveredButtonIndex === i;\n\n // Малюємо фон сектора кнопки\n ctx.beginPath();\n ctx.arc(x, y, buttonRadius, startAngle, endAngle, false);\n ctx.lineTo(x, y);\n ctx.closePath();\n ctx.lineWidth = 1;\n ctx.strokeStyle = theme.graph2D?.button?.stroke || '#FFFFFF';\n ctx.stroke();\n ctx.fillStyle = isHovered\n ? theme.graph2D?.button?.hoverFill || 'rgba(255, 255, 255, 0.3)'\n : theme.graph2D?.button?.normalFill || 'rgba(255, 255, 255, 0.1)';\n ctx.fill();\n\n // Обчислюємо позицію для іконки\n // Розташовуємо іконку в середині сектора\n const iconSize = buttonRadius * 0.2;\n const midAngle = (startAngle + endAngle) / 2;\n const iconDistance = buttonRadius - nodeSize / 2 + iconSize; // Коригуємо відстань, щоб уникнути перекриття з вузлом\n const iconX = x + Math.cos(midAngle) * iconDistance;\n const iconY = y + Math.sin(midAngle) * iconDistance;\n\n // Вибираємо відповідну іконку залежно від стану наведення\n const buttonImage = buttonImages[i];\n // Якщо кнопка в лоадінгу — малюємо спінер\n const loading = typeof buttonImage.loading === 'function' ? buttonImage.loading(node) : buttonImage.loading;\n\n // Отримуємо URL зображення (може бути функцією або рядком)\n const getImageUrl = (imgValue: string | ((node: NodeObject) => string)) => {\n return typeof imgValue === 'function' ? imgValue(node) : imgValue;\n };\n\n const normalImgUrl = getImageUrl(buttonImage.img);\n const hoverImgUrl = getImageUrl(buttonImage.hoverImg);\n\n // Отримуємо або створюємо зображення з кешу\n const getOrCreateImage = (url: string) => {\n if (!buttonImage.imageCache.has(url)) {\n const img = new Image();\n img.src = url;\n buttonImage.imageCache.set(url, img);\n }\n return buttonImage.imageCache.get(url)!;\n };\n\n const normalImg = getOrCreateImage(normalImgUrl);\n const hoverImg = getOrCreateImage(hoverImgUrl);\n\n if (loading) {\n const spinnerRadius = iconSize / 2;\n const dotRadius = iconSize / 12;\n\n ctx.save();\n ctx.translate(iconX, iconY);\n ctx.rotate(stateRef.current.spinnerAngle);\n\n // Малюємо кілька променів (ліній) по колу\n for (let j = 0; j < 12; j++) {\n const angle = (Math.PI * 2 * j) / 12;\n const alpha = j / 12;\n\n const dotX = Math.cos(angle) * spinnerRadius;\n const dotY = Math.sin(angle) * spinnerRadius;\n\n ctx.beginPath();\n ctx.fillStyle = hexToRgba(theme.graph2D?.button?.spinnerColor, alpha);\n ctx.arc(dotX, dotY, dotRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n ctx.restore();\n\n stateRef.current.spinnerAngle += 0.1;\n if (stateRef.current.spinnerAngle > Math.PI * 2) {\n stateRef.current.spinnerAngle -= Math.PI * 2;\n }\n if (stateRef.current.animation.id !== null) {\n cancelAnimationFrame(stateRef.current.animation.id);\n stateRef.current.animation.id = null;\n stateRef.current.animation.buttonIndex = null;\n }\n\n stateRef.current.animation.id = requestAnimationFrame(renderCanvas2D);\n stateRef.current.animation.buttonIndex = i;\n } else {\n if (stateRef.current.animation.id && stateRef.current.animation.buttonIndex === i) {\n cancelAnimationFrame(stateRef.current.animation.id);\n stateRef.current.animation.id = null;\n stateRef.current.animation.buttonIndex = null;\n }\n const icon = isHovered ? hoverImg : normalImg;\n //каунтер може не існувати\n const counter = buttonImage.getCount ? buttonImage.getCount(node) : null;\n // Малюємо іконку\n if (icon.complete) {\n drawIconWithOptionalCounter(ctx, icon, iconX, iconY, iconSize, counter, theme.graph2D?.button?.textColor);\n } else {\n // Встановлюємо обробник onload, якщо зображення ще не завантажено\n icon.onload = () => {\n if (ctx2dRef.current) {\n drawIconWithOptionalCounter(\n ctx,\n icon,\n iconX,\n iconY,\n iconSize,\n counter,\n theme.graph2D?.button?.textColor\n );\n }\n };\n }\n }\n }\n\n ctx.restore();\n },\n [buttonImages, theme.graph2D?.button]\n );\n\n // Рендеринг tooltip в canvas\n const renderTooltip = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n if (!tooltipContent || !tooltipPosition) return;\n\n const padding = Number(theme.tooltip.padding) || 10;\n const maxWidth = Number(theme.tooltip.maxWidth) || 200;\n const fontSize = Number(theme.tooltip.fontSize) || 14;\n const borderRadius = Number(theme.tooltip.borderRadius) || 4;\n const lineHeight = 1.4;\n const offsetY = 10; // Зміщення вище курсора\n\n ctx.save();\n\n // Встановлюємо шрифт для вимірювання тексту\n ctx.font = `${fontSize}px Sans-Serif`;\n\n // Вимірюємо текст і обчислюємо розміри tooltip\n const text = typeof tooltipContent === 'string' ? tooltipContent : String(tooltipContent);\n const lines = wrapText(ctx, text, maxWidth);\n const textWidth = Math.min(maxWidth, Math.max(...lines.map((line) => ctx.measureText(line).width)));\n const textHeight = lines.length * fontSize * lineHeight;\n\n const tooltipWidth = textWidth + padding * 2;\n const tooltipHeight = textHeight + padding * 2;\n\n // Позиція tooltip (трішки вище курсора)\n let tooltipX = tooltipPosition.x - tooltipWidth / 2;\n let tooltipY = tooltipPosition.y - tooltipHeight - offsetY;\n\n // Перевіряємо, щоб tooltip не виходив за межі canvas\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n if (tooltipX < 5) tooltipX = 5;\n if (tooltipX + tooltipWidth > rect.width - 5) tooltipX = rect.width - tooltipWidth - 5;\n if (tooltipY < 5) tooltipY = tooltipPosition.y + offsetY; // Показуємо знизу якщо не вміщається зверху\n }\n\n // Малюємо фон tooltip з тінню\n // Парсимо box-shadow з theme (наприклад \"0px 4px 10px 0px rgba(0, 0, 0, 0.15)\")\n // Формат: offsetX offsetY blur [spread] color\n const shadowMatch = theme.tooltip.shadow?.match(\n /(-?\\d+(?:\\.\\d+)?(?:px)?)\\s+(-?\\d+(?:\\.\\d+)?(?:px)?)\\s+(-?\\d+(?:\\.\\d+)?(?:px)?)(?:\\s+(-?\\d+(?:\\.\\d+)?(?:px)?))?\\s+(rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|\\w+)/\n );\n\n if (shadowMatch) {\n ctx.shadowOffsetX = parseFloat(shadowMatch[1]);\n ctx.shadowOffsetY = parseFloat(shadowMatch[2]);\n ctx.shadowBlur = parseFloat(shadowMatch[3]);\n // shadowMatch[4] - це spread (ігноруємо, canvas не підтримує spread)\n ctx.shadowColor = shadowMatch[5]; // колір тепер в 5-й групі\n }\n\n ctx.fillStyle = theme.tooltip.background;\n ctx.beginPath();\n ctx.roundRect(tooltipX, tooltipY, tooltipWidth, tooltipHeight, borderRadius);\n ctx.fill();\n\n // Скидаємо тінь для тексту\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n\n // Малюємо текст\n ctx.fillStyle = theme.tooltip.color;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n\n lines.forEach((line, index) => {\n ctx.fillText(line, tooltipX + padding, tooltipY + fontSize / 4 + padding + index * fontSize * lineHeight);\n });\n\n ctx.restore();\n },\n [tooltipContent, tooltipPosition, theme.tooltip]\n );\n\n const renderNodes = useCallback(\n (ctx: CanvasRenderingContext2D) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n ctx.globalAlpha = 1.0;\n // Малюємо всі вузли\n nodes.forEach((node) => {\n const { x, y, color: nodeColor, fontColor, label } = node;\n const isSelected = node.id && stateRef.current.selectedNodeIds.has(node.id);\n const isHovered = node.id && stateRef.current.hoveredNode?.id === node.id;\n\n // Розмір та позиція вузла\n const size = getNodeSize(node);\n const radius = size / 2;\n\n // Якщо наведено вузол, малюємо кільце вибору та кнопки\n if (isHovered) {\n // Малюємо кнопки навколо обраного вузла, якщо кнопки доступні\n if (buttons && buttons.length > 0) {\n renderNodeButtons(node, ctx);\n }\n }\n\n // Якщо вузол виділено, малюємо кільце підсвічування\n if (isSelected) {\n const ringRadius = size / 2 + config.nodeBorderWidth;\n const borderRadius = size / 2 + config.nodeBorderWidth / 2;\n // Зберігаємо стан контексту для ефекту світіння\n ctx.save();\n\n // Налаштовуємо ефект світіння (glow)\n ctx.shadowBlur = config.nodeBorderWidth * 10;\n ctx.shadowColor = theme.graph2D.ring.selectionFill;\n\n // Малюємо основне кільце вибору з ефектом світіння\n ctx.beginPath();\n ctx.arc(x as number, y as number, ringRadius, 0, 2 * Math.PI, false);\n ctx.fillStyle = theme.graph2D.ring.selectionFill;\n ctx.fill();\n\n // Відновлюємо стан контексту (прибираємо shadow для інших елементів)\n ctx.restore();\n\n // Малюємо основне кільце вибору з ефектом світіння\n ctx.beginPath();\n ctx.arc(x as number, y as number, borderRadius, 0, 2 * Math.PI, false);\n ctx.fillStyle = theme.graph2D.ring.borderFill;\n ctx.fill();\n }\n\n // Малюємо коло вузла\n ctx.beginPath();\n ctx.arc(x as number, y as number, radius, 0, 2 * Math.PI);\n ctx.fillStyle = nodeColor || color(node.group || '0');\n ctx.fill();\n\n // Малюємо мітку, якщо вона доступна\n if (label) {\n ctx.save();\n ctx.translate(x as number, y as number);\n\n const globalScale = stateRef.current.transform.k;\n const scaledFontSize = calculateFontSize(globalScale);\n const maxWidth = size * config.textPaddingFactor;\n\n ctx.font = `${scaledFontSize}px Sans-Serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = fontColor || '#000';\n\n const truncatedLabel = truncateText(label, maxWidth, ctx);\n ctx.fillText(truncatedLabel, 0, 0);\n\n ctx.restore();\n }\n });\n },\n [theme.graph2D.ring, buttons, renderNodeButtons]\n );\n\n // 2D Canvas рендеринг для всього\n const renderCanvas2D = useCallback(() => {\n const ctx = ctx2dRef.current;\n if (!ctx) return;\n\n // Отримуємо відношення пікселів пристрою для коректного рендерингу\n\n // Очищуємо весь канвас перед новим рендерингом.\n ctx.clearRect(0, 0, stateRef.current.width, stateRef.current.height);\n\n // Спочатку відображаємо сітку (фон)\n renderGrid(ctx);\n\n // Застосовуємо трансформацію (масштабування та панорамування) - використовуємо матричну трансформацію для кращої продуктивності\n ctx.save();\n\n // Спочатку переміщуємо до позиції панорамування, потім масштабуємо навколо цієї точки\n ctx.setTransform(\n stateRef.current.transform.k,\n 0,\n 0,\n stateRef.current.transform.k,\n stateRef.current.transform.x,\n stateRef.current.transform.y\n );\n\n // Відображаємо зв'язки та вузли\n renderLinks(ctx);\n renderNodes(ctx);\n\n // Відновлюємо контекст\n ctx.restore();\n\n // Рендеримо tooltip поверх всього (без трансформації)\n renderTooltip(ctx);\n }, [renderLinks, renderNodes, renderGrid, renderTooltip]);\n\n /**\n * Функція для додавання нових вузлів до графа з опціональною плавною анімацією появи\n * @param newNodes Нові вузли для додавання до графа\n * @param newLinks Опціональні нові зв'язки для додавання з вузлами\n * @param options Параметри конфігурації для додавання вузлів\n */\n const addNodes = useCallback(\n (\n newNodes: NodeObject[],\n newLinks: LinkObject[] = [],\n options?: {\n smoothAppearance?: boolean;\n transitionDuration?: number;\n },\n callback?: () => void\n ) => {\n const links = getLinks() || [];\n const nodes = getNodes() || [];\n if (!simulationRef.current || !newNodes.length) return;\n\n const { width: canvasWidth, height: canvasHeight } = stateRef.current; // Опції по умолчанню\n const smoothAppearance = options?.smoothAppearance ?? false;\n const transitionDuration = options?.transitionDuration ?? 1000; // 1 секунда по умолчанню\n\n // Обробляємо нові вузли, щоб уникнути дублікатів\n const existingNodeIds = new Set(nodes.map((node) => node.id));\n const filteredNewNodes = newNodes.filter((node) => !existingNodeIds.has(node.id));\n\n // Обробляємо нові зв'язки, щоб уникнути дублікатів та переконатися, що вони посилаються на дійсні вузли\n const existingLinkIds = new Set(\n links.map(\n (link) =>\n `${typeof link.source === 'object' ? link.source.id : link.source}-${\n typeof link.target === 'object' ? link.target.id : link.target\n }`\n )\n );\n\n const filteredNewLinks = newLinks.filter((link) => {\n const linkId = `${typeof link.source === 'object' ? link.source.id : link.source}-${\n typeof link.target === 'object' ? link.target.id : link.target\n }`;\n return !existingLinkIds.has(linkId);\n });\n\n if (filteredNewNodes.length === 0 && filteredNewLinks.length === 0) return;\n\n const updatedNodes = [...nodes, ...filteredNewNodes];\n const updatedLinks = [...links, ...filteredNewLinks];\n\n // Попереднє позиціонування нових вузлів тільки коли плавна поява увімкнена\n if (smoothAppearance) {\n // Попередньо позиціонуємо нові вузли біля підключених вузлів\n filteredNewNodes.forEach((node) => {\n // Перевіряємо, чи є зв'язки, що поєднують цей вузол з існуючими вузлами\n const connectedLinks = filteredNewLinks.filter((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n return (\n (sourceId === node.id && existingNodeIds.has(targetId)) ||\n (targetId === node.id && existingNodeIds.has(sourceId))\n );\n });\n\n if (connectedLinks.length > 0) {\n // Знаходимо існуючий підключений вузол для розташування поряд\n const someLink = connectedLinks[0];\n const connectedNodeId =\n typeof someLink.source === 'object'\n ? someLink.source.id === node.id\n ? someLink.target\n : someLink.source.id\n : someLink.source === node.id\n ? someLink.target\n : someLink.source;\n\n const connectedNode = updatedNodes.find((n) => n.id === connectedNodeId);\n\n if (connectedNode && connectedNode.x !== undefined && connectedNode.y !== undefined) {\n // Розташовуємо новий вузол біля підключеного вузла з невеликою рандомізацією\n const randomOffset = 30 + Math.random() * 20;\n const randomAngle = Math.random() * Math.PI * 2;\n\n // Встановлюємо початкову позицію\n node.x = connectedNode.x + Math.cos(randomAngle) * randomOffset;\n node.y = connectedNode.y + Math.sin(randomAngle) * randomOffset;\n\n // Встановлюємо початкову швидкість в нуль для плавнішої появи\n node.vx = 0;\n node.vy = 0;\n }\n } else {\n // Для непідключених вузлів розміщуємо їх у полі зору у випадкових позиціях\n const centerX = canvasWidth / 2;\n const centerY = canvasHeight / 2;\n const radius = Math.min(canvasWidth, canvasHeight) / 4;\n const angle = Math.random() * Math.PI * 2;\n\n node.x = centerX + Math.cos(angle) * (radius * Math.random());\n node.y = centerY + Math.sin(angle) * (radius * Math.random());\n node.vx = 0;\n node.vy = 0;\n }\n });\n\n // Фіксуємо позиції існуючих вузлів, щоб запобігти їхньому руху\n nodes.forEach((node) => {\n node.fx = node.x;\n node.fy = node.y;\n });\n }\n\n // Оновлюємо симуляцію з новими вузлами та зв'язками\n simulationRef.current.nodes(updatedNodes);\n\n // Отримуємо силу зв'язків із правильним типом\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n if (linkForce) {\n linkForce.links(updatedLinks);\n }\n\n // Підключаємо нові вузли до їхніх сусідів та зв'язків\n filteredNewLinks.forEach((link: any) => {\n const source =\n typeof link.source === 'object' ? link.source : updatedNodes.find((n: any) => n.id === link.source);\n const target =\n typeof link.target === 'object' ? link.target : updatedNodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Ініціалізуємо масиви, якщо вони не існують\n !source.neighbors && (source.neighbors = []);\n !target.neighbors && (target.neighbors = []);\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n !source.links && (source.links = []);\n !target.links && (target.links = []);\n source.links.push(link);\n target.links.push(link);\n });\n\n if (smoothAppearance) {\n // Налаштовуємо симуляцію для плавної появи нових вузлів\n simulationRef.current.alphaTarget(0.3);\n simulationRef.current.alpha(0.3);\n simulationRef.current.velocityDecay(0.7); // Більше загасання для плавнішого руху\n simulationRef.current.restart();\n\n // Через короткий час відфіксовуємо всі вузли та скидаємо параметри симуляції\n setTimeout(() => {\n // Звільняємо існуючі вузли, щоб дозволити їм природний рух\n nodes.forEach((node) => {\n node.fx = undefined;\n node.fy = undefined;\n });\n\n // Скидаємо симуляцію до нормальних налаштувань\n simulationRef.current?.alphaTarget(0);\n simulationRef.current?.alpha(0.1);\n simulationRef.current?.velocityDecay(0.6); // Скидаємо до значення за замовчуванням\n }, transitionDuration);\n } else {\n // Стандартний перезапуск з низькою енергією для мінімального руху\n simulationRef.current.alpha(0.1).restart();\n }\n\n // Перемальовуємо канвас\n renderCanvas2D();\n callback?.();\n },\n [nodes, renderCanvas2D]\n );\n\n /**\n * Функція для видалення вузлів з графа з опціональною плавною анімацією зникнення\n * @param nodeIds Масив ID вузлів для видалення\n * @param options Параметри конфігурації для видалення вузлів\n */\n const removeNodes = useCallback(\n (nodeIds: (string | number)[]) => {\n const nodes = getNodes();\n const links = getLinks();\n if (!simulationRef.current || !nodeIds.length || !nodes || nodes.length === 0 || !links || links.length === 0)\n return;\n\n // Створюємо набір ID вузлів для швидкого пошуку\n const nodeIdsToRemove = new Set(nodeIds);\n\n // Спочатку перевіряємо, чи видаляємо який-небудь виділений/наведений вузол\n nodeIds.forEach((id) => stateRef.current.selectedNodeIds.delete(id));\n\n if (\n stateRef.current.hoveredNode &&\n stateRef.current.hoveredNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.hoveredNode.id)\n ) {\n stateRef.current.hoveredNode = null;\n // Очищаємо tooltip, якщо він був для видаленого вузла\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n\n // Очищаємо наведений зв'язок, якщо він включає видалені ноди\n if (stateRef.current.hoveredLink) {\n const source =\n typeof stateRef.current.hoveredLink.source === 'object'\n ? stateRef.current.hoveredLink.source.id\n : stateRef.current.hoveredLink.source;\n const target =\n typeof stateRef.current.hoveredLink.target === 'object'\n ? stateRef.current.hoveredLink.target.id\n : stateRef.current.hoveredLink.target;\n\n if (\n (source !== undefined && nodeIdsToRemove.has(source)) ||\n (target !== undefined && nodeIdsToRemove.has(target))\n ) {\n stateRef.current.hoveredLink = null;\n }\n }\n\n if (\n stateRef.current.draggedNode &&\n stateRef.current.draggedNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.draggedNode.id)\n ) {\n stateRef.current.draggedNode = null;\n }\n\n // Отримуємо всі вузли, які залишаться після видалення\n const remainingNodes = nodes.filter((node) => node.id !== undefined && !nodeIdsToRemove.has(node.id));\n\n // Отримуємо всі зв'язки, які не підключаються до видалених вузлів\n const remainingLinks = links.filter((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n\n return (\n sourceId !== undefined &&\n !nodeIdsToRemove.has(sourceId) &&\n targetId !== undefined &&\n !nodeIdsToRemove.has(targetId)\n );\n });\n\n // Очищаємо підсвічені зв'язки, якщо вони включають видалені ноди\n const highlightLinksToRemove: LinkObject[] = [];\n stateRef.current.highlightLinks.forEach((link) => {\n const sourceId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetId = typeof link.target === 'object' ? link.target.id : link.target;\n\n if (\n (sourceId !== undefined && nodeIdsToRemove.has(sourceId)) ||\n (targetId !== undefined && nodeIdsToRemove.has(targetId))\n ) {\n highlightLinksToRemove.push(link);\n }\n });\n highlightLinksToRemove.forEach((link) => stateRef.current.highlightLinks.delete(link));\n\n // Перебудовуємо відносини вузлів (сусіди та зв'язки) для вузлів, що залишилися\n // Спочатку очищаємо існуючі відносини\n remainingNodes.forEach((node) => {\n node.neighbors = [];\n node.links = [];\n });\n\n // Потім перебудовуємо на основі зв'язків, що залишилися\n remainingLinks.forEach((link: any) => {\n const source =\n typeof link.source === 'object' ? link.source : remainingNodes.find((n: any) => n.id === link.source);\n const target =\n typeof link.target === 'object' ? link.target : remainingNodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Додаємо до масивів сусідів\n source.neighbors = source.neighbors || [];\n target.neighbors = target.neighbors || [];\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n // Додаємо до масивів зв'язків\n source.links = source.links || [];\n target.links = target.links || [];\n source.links.push(link);\n target.links.push(link);\n });\n\n // Оновлюємо симуляцію з відфільтрованими вузлами та зв'язками\n // але не змінюємо їхні позиції\n simulationRef.current.nodes(remainingNodes);\n\n // Отримуємо та оновлюємо силу зв'язків\n const linkForce = simulationRef.current.force('link') as ForceLink<NodeObject, LinkObject>;\n if (linkForce) {\n linkForce.links(remainingLinks);\n }\n\n // Сповіщаємо про зміну виділених вузлів\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n\n // Просто перемальовуємо canvas з новими даними\n renderCanvas2D();\n },\n [renderCanvas2D, onChangeSelectedNodeIds]\n );\n // Функція для масштабування, щоб усі вузли помістилися в полі зору з відступами\n const zoomToFit = useCallback((duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n if (!ctx || !canvasRef.current || !nodes || !nodes.length) return;\n\n // Знаходимо межі всіх вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n // Розраховуємо область, що містить усі вузли\n nodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n const x = node.x;\n const y = node.y;\n\n // Оновлюємо мін/макс координати\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n });\n\n // Якщо у нас валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n // Розраховуємо необхідний масштаб, щоб вмістити всі вузли\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи до області\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n // Розраховуємо ширину та висоту вмісту\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Розраховуємо масштаб, необхідний для розміщення вмісту\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, 10); // Обмежуємо масштаб до 10x\n\n // Розраховуємо центр вмісту\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n // Розраховуємо нову трансформацію для правильного центрування та масштабування\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімуємо перехід, якщо вказана тривалість\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n\n // Використовуємо функцію пом'якшення для плавнішого переходу\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3); // Кубічне пом'якшення\n\n // Інтерполюємо між початковою та кінцевою трансформаціями\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Застосовуємо трансформацію негайно, якщо немає тривалості\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n }, []);\n\n /**\n * Функція для масштабування графа так, щоб виділені вузли були видимі\n * @param duration Тривалість анімації масштабування в мілісекундах\n * @param padding Відступ від країв в пікселях\n */\n const zoomToSelected = useCallback(\n (duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n const selectedIds = stateRef.current.selectedNodeIds;\n\n // Перевіряємо, чи є виділені вузли\n if (!ctx || !canvasRef.current || !nodes || !nodes.length || selectedIds.size === 0) {\n return;\n }\n\n // Фільтруємо тільки виділені вузли\n const selectedNodes = nodes.filter((node) => node.id && selectedIds.has(node.id));\n\n if (selectedNodes.length === 0) return;\n\n // Знаходимо межі виділених вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n minX = Math.min(minX, node.x);\n minY = Math.min(minY, node.y);\n maxX = Math.max(maxX, node.x);\n maxY = Math.max(maxY, node.y);\n });\n\n // Якщо є тільки один вузол, додаємо мінімальну область\n if (minX === maxX && minY === maxY) {\n const expandSize = 100; // мінімальна область навколо одного вузла\n minX -= expandSize;\n minY -= expandSize;\n maxX += expandSize;\n maxY += expandSize;\n }\n\n // Якщо валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Обчислюємо масштаб\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, config.maxZoom); // обмежуємо максимальний зум\n\n // Центруємо виділені вузли\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімація\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3);\n\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Без анімації\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Функція для масштабування графа так, щоб певні вузли були видимі\n * @param nodeIds Масив ID вузлів для відображення\n * @param duration Тривалість анімації масштабування в мілісекундах\n * @param padding Відступ від країв в пікселях\n */\n const zoomToNodes = useCallback(\n (nodeIds: (string | number)[], duration: number = 0, padding: number = 20) => {\n const nodes = getNodes();\n const ctx = ctx2dRef.current;\n\n // Перевіряємо, чи є вузли для відображення\n if (!ctx || !canvasRef.current || !nodes || !nodes.length || !nodeIds || nodeIds.length === 0) {\n return;\n }\n\n // Створюємо Set для швидкого пошуку\n const nodeIdsSet = new Set(nodeIds);\n\n // Фільтруємо тільки потрібні вузли\n const targetNodes = nodes.filter((node) => node.id && nodeIdsSet.has(node.id));\n\n if (targetNodes.length === 0) return;\n\n // Знаходимо межі вузлів\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n\n targetNodes.forEach((node) => {\n if (node.x === undefined || node.y === undefined) return;\n\n minX = Math.min(minX, node.x);\n minY = Math.min(minY, node.y);\n maxX = Math.max(maxX, node.x);\n maxY = Math.max(maxY, node.y);\n });\n\n // Якщо є тільки один вузол, додаємо мінімальну область\n if (minX === maxX && minY === maxY) {\n const expandSize = 100; // мінімальна область навколо одного вузла\n minX -= expandSize;\n minY -= expandSize;\n maxX += expandSize;\n maxY += expandSize;\n }\n\n // Якщо валідні межі\n if (isFinite(minX) && isFinite(maxX) && isFinite(minY) && isFinite(maxY)) {\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n\n // Додаємо відступи\n minX -= padding;\n minY -= padding;\n maxX += padding;\n maxY += padding;\n\n const contentWidth = maxX - minX;\n const contentHeight = maxY - minY;\n\n // Обчислюємо масштаб\n const scaleX = contentWidth > 0 ? canvasWidth / contentWidth : 1;\n const scaleY = contentHeight > 0 ? canvasHeight / contentHeight : 1;\n const scale = Math.min(scaleX, scaleY, config.maxZoom); // обмежуємо максимальний зум\n\n // Центруємо вузли\n const centerX = minX + contentWidth / 2;\n const centerY = minY + contentHeight / 2;\n\n const newTransform = {\n k: scale,\n x: canvasWidth / 2 - centerX * scale,\n y: canvasHeight / 2 - centerY * scale,\n };\n\n if (duration > 0) {\n // Анімація\n const startTransform = { ...stateRef.current.transform };\n const startTime = Date.now();\n\n const animateZoom = () => {\n const t = Math.min(1, (Date.now() - startTime) / duration);\n const easedT = t === 1 ? 1 : 1 - Math.pow(1 - t, 3);\n\n const interpolatedTransform = {\n k: startTransform.k + (newTransform.k - startTransform.k) * easedT,\n x: startTransform.x + (newTransform.x - startTransform.x) * easedT,\n y: startTransform.y + (newTransform.y - startTransform.y) * easedT,\n };\n\n stateRef.current.transform = interpolatedTransform;\n renderCanvas2D();\n\n if (t < 1) {\n requestAnimationFrame(animateZoom);\n }\n };\n\n requestAnimationFrame(animateZoom);\n } else {\n // Без анімації\n stateRef.current.transform = newTransform;\n renderCanvas2D();\n }\n }\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Функція для встановлення виділених вузлів за їхніми ID\n * @param nodeIds Масив ID вузлів для виділення\n */\n\n const setSelectedNodes = useCallback(\n (nodeIds: (string | number)[]) => {\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n nodeIds.forEach((id) => stateRef.current.selectedNodeIds.add(id));\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n },\n [renderCanvas2D, onChangeSelectedNodeIds]\n );\n\n /**\n * Встановлює розмір для вузлів за їх ідентифікаторами\n */\n const setNodeSizes = useCallback(\n (nodeIds: (string | number)[], size: number) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n // Встановлюємо розмір для кожного вузла з вказаним ID\n nodes.forEach((node) => {\n if (node.id && nodeIds.includes(node.id)) {\n node.size = size;\n }\n });\n\n // Оновлюємо force collide з новими розмірами вузлів\n if (simulationRef.current) {\n simulationRef.current.force(\n 'collide',\n forceCollide()\n .radius((node: any) => getNodeSize(node))\n .iterations(2)\n .strength(1)\n );\n\n // М'яко перезапускаємо симуляцію для врахування нових розмірів\n simulationRef.current.alpha(0.2).restart();\n }\n\n // Перемалювуємо граф з новими розмірами\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Встановлює колір для вузлів за їх ідентифікаторами\n */\n const setNodeColors = useCallback(\n (nodeIds: (string | number)[], color: string) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return;\n\n // Встановлюємо колір для кожного вузла з вказаним ID\n nodes.forEach((node) => {\n if (node.id && nodeIds.includes(node.id)) {\n node.color = color;\n }\n });\n\n // Перемалювуємо граф з новими кольорами\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Встановлює ширину для зв'язків за їх ідентифікаторами\n */\n const setLinkWidths = useCallback(\n (linkIds: (string | number)[], width: number) => {\n const links = getLinks();\n if (!links || links.length === 0) return;\n\n // Встановлюємо ширину для кожного зв'язку з вказаним ID\n links.forEach((link) => {\n if (link.id && linkIds.includes(link.id)) {\n link.width = width;\n }\n });\n\n // Перемалювуємо граф з новими ширинами\n renderCanvas2D();\n },\n [getLinks, renderCanvas2D]\n );\n\n /**\n * Встановлює колір для зв'язків за їх ідентифікаторами\n */\n const setLinkColors = useCallback(\n (linkIds: (string | number)[], color: string) => {\n const links = getLinks();\n if (!links || links.length === 0) return;\n\n // Встановлюємо колір для кожного зв'язку з вказаним ID\n links.forEach((link) => {\n if (link.id && linkIds.includes(link.id)) {\n link.color = color;\n }\n });\n\n // Перемалювуємо граф з новими кольорами\n renderCanvas2D();\n },\n [getLinks, renderCanvas2D]\n );\n\n /**\n * Пошук найкоротшого шляху між двома нодами за допомогою BFS (Breadth-First Search).\n *\n * Цей метод:\n * 1. Знаходить найкоротший шлях між вказаними нодами\n * 2. Виділяє всі ноди в цьому шляху (додає їх до selectedNodeIds)\n * 3. Підсвічує всі зв'язки в шляху (використовує highlightLinks)\n *\n * @example\n * ```tsx\n * const graphRef = useRef<Graph2DRef>(null);\n *\n * // Знайти шлях між нодами\n * const handleFindPath = () => {\n * const pathLength = graphRef.current?.findShortestPath('node1', 'node5');\n * if (pathLength > 0) {\n * console.log(`Шлях знайдено! Кількість нод: ${pathLength}`);\n * } else {\n * console.log('Шлях не існує');\n * }\n * };\n * ```\n *\n * @param sourceId - ID початкової ноди\n * @param targetId - ID кінцевої ноди\n * @returns Кількість нод в знайденому шляху, або 0 якщо шлях не існує\n */\n const findShortestPath = useCallback(\n (sourceId: string | number, targetId: string | number): number => {\n const nodes = getNodes();\n const links = getLinks();\n\n if (!nodes || !links || nodes.length === 0 || links.length === 0) {\n return 0;\n }\n\n // Перевіряємо чи існують обидві ноди\n const sourceNode = nodes.find((n) => n.id === sourceId);\n const targetNode = nodes.find((n) => n.id === targetId);\n\n if (!sourceNode || !targetNode) {\n console.warn('Source or target node not found');\n return 0;\n }\n\n // Якщо це та сама нода\n if (sourceId === targetId) {\n setSelectedNodes([sourceId]);\n return 1;\n }\n\n // Будуємо граф суміжності для BFS\n const adjacencyMap = new Map<string | number, Array<{ nodeId: string | number; link: LinkObject }>>();\n\n links.forEach((link) => {\n const sourceNodeId = typeof link.source === 'object' ? link.source.id : link.source;\n const targetNodeId = typeof link.target === 'object' ? link.target.id : link.target;\n\n if (sourceNodeId === undefined || targetNodeId === undefined) return;\n\n // Додаємо зв'язки в обидва напрямки (неорієнтований граф)\n if (!adjacencyMap.has(sourceNodeId)) {\n adjacencyMap.set(sourceNodeId, []);\n }\n if (!adjacencyMap.has(targetNodeId)) {\n adjacencyMap.set(targetNodeId, []);\n }\n\n adjacencyMap.get(sourceNodeId)!.push({ nodeId: targetNodeId, link });\n adjacencyMap.get(targetNodeId)!.push({ nodeId: sourceNodeId, link });\n });\n\n // BFS для пошуку найкоротшого шляху\n const queue: Array<{ nodeId: string | number; path: Array<string | number>; links: LinkObject[] }> = [\n { nodeId: sourceId, path: [sourceId], links: [] },\n ];\n const visited = new Set<string | number>([sourceId]);\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n // Якщо знайшли цільову ноду\n if (current.nodeId === targetId) {\n // Виділяємо всі ноди в шляху\n setSelectedNodes(current.path);\n\n // Підсвічуємо всі зв'язки в шляху\n stateRef.current.highlightLinks.clear();\n current.links.forEach((link) => {\n stateRef.current.highlightLinks.add(link);\n });\n\n // Перемальовуємо канвас\n renderCanvas2D();\n return current.path.length;\n }\n\n // Перебираємо всі сусідні ноди\n const neighbors = adjacencyMap.get(current.nodeId) || [];\n neighbors.forEach(({ nodeId, link }) => {\n if (!visited.has(nodeId)) {\n visited.add(nodeId);\n queue.push({\n nodeId,\n path: [...current.path, nodeId],\n links: [...current.links, link],\n });\n }\n });\n }\n\n // Шлях не знайдено\n console.warn('No path found between nodes');\n return 0;\n },\n [getNodes, getLinks, setSelectedNodes, renderCanvas2D]\n );\n\n /**\n * Впорядковує вибрані вузли в сітці\n * @param nodeIds - Набір ідентифікаторів вузлів для впорядкування\n * @param options - Опції для налаштування розміщення в сітці\n */\n const arrangeSelectedInGrid = useCallback(\n (\n nodeIds: Set<string | number>,\n options?: {\n spacing?: number;\n columns?: number;\n }\n ) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0 || nodeIds.size === 0) {\n return;\n }\n\n const spacing = options?.spacing ?? 100;\n const nodesToArrange = nodes.filter((node) => node.id !== undefined && nodeIds.has(node.id));\n\n if (nodesToArrange.length === 0) {\n console.warn('No nodes found with provided IDs');\n return;\n }\n\n // Розраховуємо кількість колонок (квадратний корінь для квадратної сітки, якщо не вказано)\n const columns = options?.columns ?? Math.ceil(Math.sqrt(nodesToArrange.length));\n\n // Знаходимо центр вибраних вузлів для центрування сітки\n const centerX = nodesToArrange.reduce((sum, node) => sum + (node.x ?? 0), 0) / nodesToArrange.length;\n const centerY = nodesToArrange.reduce((sum, node) => sum + (node.y ?? 0), 0) / nodesToArrange.length;\n\n // Розраховуємо розміри сітки\n const rows = Math.ceil(nodesToArrange.length / columns);\n const gridWidth = (columns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n // Початкова позиція сітки (зміщуємо, щоб центр сітки був у центрі вибраних вузлів)\n const startX = centerX - gridWidth / 2;\n const startY = centerY - gridHeight / 2;\n\n // Розміщуємо вузли в сітці\n nodesToArrange.forEach((node, index) => {\n const col = index % columns;\n const row = Math.floor(index / columns);\n\n const newX = startX + col * spacing;\n const newY = startY + row * spacing;\n\n // Встановлюємо фіксовані координати вузла\n node.x = newX;\n node.y = newY;\n node.fx = newX;\n node.fy = newY;\n });\n\n // Перезапускаємо симуляцію для оновлення позицій\n if (simulationRef.current) {\n simulationRef.current.alpha(0.3).restart();\n }\n\n renderCanvas2D();\n },\n [getNodes, renderCanvas2D]\n );\n\n /**\n * Впорядковує всі вузли в окремі сітки згруповані за значенням ключа\n * Якщо значення ключа - масив, бере перший елемент\n * Кожна група вузлів розміщується в окремій сітці, а самі групи теж розташовані у вигляді сітки\n * @param typeKey - Назва ключа для групування (наприклад, 'labels', 'type')\n * @param options - Опції для налаштування розміщення в сітці\n */\n const arrangeNodesByTypeInGrid = useCallback(\n (\n typeKey: string,\n options?: {\n spacing?: number;\n columns?: number;\n groupSpacing?: number;\n }\n ) => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) {\n return;\n }\n\n const spacing = options?.spacing ?? 100;\n const groupSpacing = options?.groupSpacing ?? 200;\n const columns = options?.columns;\n\n // Групуємо вузли за значенням ключа\n const groups = new Map<string, NodeObject[]>();\n\n nodes.forEach((node) => {\n const value = node[typeKey as keyof typeof node];\n let groupKey: string;\n\n if (Array.isArray(value)) {\n // Якщо значення - масив, беремо перший елемент\n groupKey = value.length > 0 ? String(value[0]) : 'undefined';\n } else if (typeof value === 'string') {\n // Якщо значення - рядок\n groupKey = value;\n } else {\n // Інші типи або undefined\n groupKey = 'undefined';\n }\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(node);\n });\n\n // Розраховуємо кількість колонок для розміщення груп (сітка груп)\n const groupCount = groups.size;\n const groupGridColumns = Math.ceil(Math.sqrt(groupCount));\n\n // Знаходимо загальний центр всіх вузлів\n const totalCenterX = nodes.reduce((sum, node) => sum + (node.x ?? 0), 0) / nodes.length;\n const totalCenterY = nodes.reduce((sum, node) => sum + (node.y ?? 0), 0) / nodes.length;\n\n // Розміщуємо кожну групу в окремій сітці\n let groupIndex = 0;\n const groupDimensions: Array<{ width: number; height: number }> = [];\n\n // Спочатку розраховуємо розміри кожної групи\n groups.forEach((groupNodes) => {\n const groupColumns = columns ?? Math.ceil(Math.sqrt(groupNodes.length));\n const rows = Math.ceil(groupNodes.length / groupColumns);\n const gridWidth = (groupColumns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n groupDimensions.push({ width: gridWidth, height: gridHeight });\n });\n\n // Знаходимо максимальні розміри для уніфікації\n const maxGroupWidth = Math.max(...groupDimensions.map((d) => d.width), 0);\n const maxGroupHeight = Math.max(...groupDimensions.map((d) => d.height), 0);\n\n // Розраховуємо загальні розміри сітки груп\n const groupGridRows = Math.ceil(groupCount / groupGridColumns);\n const totalGridWidth = (groupGridColumns - 1) * (maxGroupWidth + groupSpacing);\n const totalGridHeight = (groupGridRows - 1) * (maxGroupHeight + groupSpacing);\n\n // Початкова позиція для сітки груп (центруємо навколо загального центру)\n const groupGridStartX = totalCenterX - totalGridWidth / 2;\n const groupGridStartY = totalCenterY - totalGridHeight / 2;\n\n // Розміщуємо групи\n groups.forEach((groupNodes, groupKey) => {\n if (groupNodes.length === 0) {\n groupIndex++;\n return;\n }\n\n // Розраховуємо позицію групи в сітці груп\n const groupCol = groupIndex % groupGridColumns;\n const groupRow = Math.floor(groupIndex / groupGridColumns);\n\n const groupCenterX = groupGridStartX + groupCol * (maxGroupWidth + groupSpacing);\n const groupCenterY = groupGridStartY + groupRow * (maxGroupHeight + groupSpacing);\n\n // Розраховуємо кількість колонок для групи\n const groupColumns = columns ?? Math.ceil(Math.sqrt(groupNodes.length));\n const rows = Math.ceil(groupNodes.length / groupColumns);\n const gridWidth = (groupColumns - 1) * spacing;\n const gridHeight = (rows - 1) * spacing;\n\n // Початкова позиція сітки групи\n const startX = groupCenterX - gridWidth / 2;\n const startY = groupCenterY - gridHeight / 2;\n\n // Розміщуємо вузли групи в сітці\n groupNodes.forEach((node, index) => {\n const col = index % groupColumns;\n const row = Math.floor(index / groupColumns);\n\n const newX = startX + col * spacing;\n const newY = startY + row * spacing;\n\n // Встановлюємо фіксовані координати вузла\n node.x = newX;\n node.y = newY;\n node.fx = newX;\n node.fy = newY;\n });\n\n groupIndex++;\n });\n\n // Перезапускаємо симуляцію для оновлення позицій\n if (simulationRef.current) {\n simulationRef.current.alpha(0.3).restart();\n }\n\n renderCanvas2D();\n\n // Масштабуємо, щоб всі вузли були видимі\n zoomToFit(300, 50);\n },\n [getNodes, renderCanvas2D, zoomToFit]\n );\n\n // Знаходимо вузол за вказаними координатами\n const getNodeAtPosition = useCallback((x: number, y: number): NodeObject | null => {\n const nodes = getNodes();\n if (!nodes || nodes.length === 0) return null;\n\n // Масштабуємо координати на основі коефіцієнту щільності пікселів пристрою та застосовуємо зворотну трансформацію\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n // Застосовуємо зворотну трансформацію, щоб отримати координати в системі координат графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n return (\n nodes.find((node) => {\n // Знаходимо будь-який вузол у межах радіусу від вказівника (з урахуванням розміру вузла)\n const nodeRadius = getNodeSize(node) / 2;\n const dx = (node.x || 0) - scaledX;\n const dy = (node.y || 0) - scaledY;\n return Math.sqrt(dx * dx + dy * dy) <= nodeRadius;\n }) || null\n );\n }, []);\n\n // Знаходимо лінк за вказаними координатами\n const getLinkAtPosition = useCallback((x: number, y: number): LinkObject | null => {\n const links = getLinks();\n const nodes = getNodes();\n if (!links || links.length === 0 || !nodes || nodes.length === 0) return null;\n\n // Масштабуємо координати на основі коефіцієнту щільності пікселів пристрою та застосовуємо зворотну трансформацію\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n // Застосовуємо зворотну трансформацію, щоб отримати координати в системі координат графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Пороговая відстань для визначення кліку по лінку\n const threshold = 5;\n\n return (\n links.find((link) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (!source || !target) return false;\n\n const sourceX = source.x || 0;\n const sourceY = source.y || 0;\n const targetX = target.x || 0;\n const targetY = target.y || 0;\n\n // Обчислюємо відстань від точки до лінії\n const A = scaledX - sourceX;\n const B = scaledY - sourceY;\n const C = targetX - sourceX;\n const D = targetY - sourceY;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n\n if (lenSq === 0) return false; // Лінія нульової довжини\n\n let param = dot / lenSq;\n param = Math.max(0, Math.min(1, param)); // Обмежуємо параметр відрізком [0, 1]\n\n const xx = sourceX + param * C;\n const yy = sourceY + param * D;\n\n const dx = scaledX - xx;\n const dy = scaledY - yy;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n return distance <= threshold;\n }) || null\n );\n }, []);\n\n // Допоміжна функція для перевірки, чи знаходиться точка всередині сектора кнопки\n const isPointInButtonSector = useCallback(\n (\n mouseX: number,\n mouseY: number,\n nodeX: number,\n nodeY: number,\n radius: number,\n startAngle: number,\n endAngle: number\n ): boolean => {\n // Розраховуємо відстань від центру вузла до точки миші\n const dx = mouseX - nodeX;\n const dy = mouseY - nodeY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n // Розраховуємо кут між точкою та горизонтальною віссю\n let angle = Math.atan2(dy, dx);\n if (angle < 0) angle += 2 * Math.PI; // Конвертуємо в діапазон [0, 2π]\n\n // Розширюємо діапазон радіусу для зручнішої взаємодії з кнопками\n const minRadiusRatio = 0.5;\n const maxRadiusRatio = 1;\n const isInRadius = distance >= radius * minRadiusRatio && distance <= radius * maxRadiusRatio;\n\n // Перевіряємо, чи кут знаходиться в межах сектора\n let isInAngle = false;\n\n // Верхнє півколо: від Math.PI до Math.PI * 2\n if (startAngle === Math.PI && endAngle === Math.PI * 2) {\n isInAngle = angle >= Math.PI && angle <= Math.PI * 2;\n }\n // Нижнє півколо: від 0 до Math.PI\n else if (startAngle === 0 && endAngle === Math.PI) {\n isInAngle = angle >= 0 && angle <= Math.PI;\n }\n // Загальний випадок для довільних секторів\n else {\n isInAngle =\n (startAngle <= endAngle && angle >= startAngle && angle <= endAngle) ||\n (startAngle > endAngle && (angle >= startAngle || angle <= endAngle));\n }\n\n return isInRadius && isInAngle;\n },\n []\n );\n\n // Обробка наведення на вузол (подібно до Graph2D handleNodeHover)\n const handleNodeHover = useCallback(\n (node: NodeObject | null) => {\n // Перевіряємо, чи вузол той самий, що і останній вузол, на який наводили\n if (node === stateRef.current.hoveredNode) {\n return; // Пропускаємо обробку, якщо це той самий вузол\n }\n\n stateRef.current.hoveredNode = node;\n if (onNodeHover) onNodeHover(node);\n },\n [onNodeHover]\n );\n\n // Обробка наведення на лінк\n const handleLinkHover = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>, link: LinkObject | null) => {\n // Перевіряємо, чи лінк той самий, що і останній лінк, на який наводили\n if (link === stateRef.current.hoveredLink) {\n return; // Пропускаємо обробку, якщо це той самий лінк\n }\n\n const newHighlightNodes = new Set<NodeObject>();\n const newHighlightLinks = new Set<any>();\n\n if (link) {\n // Підсвічуємо сам лінк\n newHighlightLinks.add(link);\n\n // Підсвічуємо пов'язані вузли\n const nodes = getNodes();\n if (nodes) {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n) => n.id === link.target);\n\n if (source) newHighlightNodes.add(source);\n if (target) newHighlightNodes.add(target);\n }\n }\n\n stateRef.current.hoveredLink = link;\n if (onLinkHover) onLinkHover(link, event);\n },\n [onLinkHover, getNodes]\n );\n\n // Обробка кліку на лінк\n const handleLinkClick = useCallback(\n (link: LinkObject) => {\n if (onLinkClick) onLinkClick(link);\n },\n [onLinkClick]\n );\n\n // Обробка кліку на вузол\n const handleNodeClick = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>, node: NodeObject) => {\n if (node.id) {\n if (event.ctrlKey || event.metaKey) {\n // Якщо натиснуто Ctrl (або Cmd на Mac), додаємо/видаляємо вузол з виділення\n if (stateRef.current.selectedNodeIds.has(node.id)) {\n stateRef.current.selectedNodeIds.delete(node.id);\n } else {\n stateRef.current.selectedNodeIds.add(node.id);\n }\n // При Ctrl-кліку очищаємо підсвічування зв'язків\n stateRef.current.highlightLinks.clear();\n } else {\n // Інакше встановлюємо виділення лише на цей вузол\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n stateRef.current.selectedNodeIds.add(node.id);\n }\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n }\n if (onNodeClick) onNodeClick(node);\n },\n [onNodeClick, onChangeSelectedNodeIds, renderCanvas2D]\n );\n\n // Обробка кліку на фон\n const handleBackgroundClick = useCallback(() => {\n stateRef.current.selectedNodeIds.clear();\n stateRef.current.highlightLinks.clear();\n onChangeSelectedNodeIds?.(stateRef.current.selectedNodeIds);\n renderCanvas2D();\n if (onBackgroundClick) onBackgroundClick();\n }, [onBackgroundClick, onChangeSelectedNodeIds, renderCanvas2D]); // Перетягування тепер обробляється через stateRef для покращення продуктивності\n\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n if (!canvasRef.current || !simulationRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Зберігаємо початкові координати для подальшого відстеження перетягування\n stateRef.current.mouseStartPos = { x, y };\n stateRef.current.isDragging = false;\n\n // Намагаємося знайти вузол у позиції курсора - обробимо клік при mouseUp, якщо не відбувається перетягування\n const node = getNodeAtPosition(x, y);\n if (node) {\n // Встановлюємо як потенційно перетягуваний, але не активуємо симуляцію поки що\n stateRef.current.draggedNode = node;\n\n // Тимчасово фіксуємо позицію вузла\n node.fx = node.x;\n node.fy = node.y;\n } else {\n // Якщо не клікнули на вузол, починаємо панорамування\n stateRef.current.isPanning = true;\n stateRef.current.lastMousePos = { x, y };\n }\n },\n [getNodeAtPosition]\n );\n\n const getHoveredIndex = useCallback(\n (x: number, y: number) => {\n let hoveredIndex = null;\n if (canvasRef.current && stateRef.current && buttonImages.length > 0 && stateRef.current.hoveredNode) {\n const nodeSize = getNodeSize(stateRef.current.hoveredNode);\n const buttonRadius = (nodeSize * config.nodeAreaFactor) / 2;\n const rect = canvasRef.current.getBoundingClientRect();\n\n // Масштабуємо координати відносно розміру відображення полотна\n const canvasScaleX = canvasRef.current.width / rect.width;\n const canvasScaleY = canvasRef.current.height / rect.height;\n\n // Масштабовані координати миші в системі координат полотна\n const scaledMouseX = x * canvasScaleX;\n const scaledMouseY = y * canvasScaleY;\n\n // Застосовуємо поточну трансформацію для отримання світових координат\n const worldX = (scaledMouseX - stateRef.current.transform.x) / stateRef.current.transform.k;\n const worldY = (scaledMouseY - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Позиція ноди\n const nodeX = stateRef.current.hoveredNode?.x || 0;\n const nodeY = stateRef.current.hoveredNode?.y || 0;\n\n // Обчислюємо кількість кнопок та їхні сектори\n const buttonCount = Math.min(buttonImages.length, 8);\n const sectorAngle = Math.min((Math.PI * 2) / buttonCount, Math.PI);\n\n // Перевіряємо, чи вказівник миші знаходиться над будь-яким сектором кнопок\n for (let i = 0; i < buttonCount; i++) {\n const startAngle = i * sectorAngle;\n const endAngle = (i + 1) * sectorAngle;\n\n if (isPointInButtonSector(worldX, worldY, nodeX, nodeY, buttonRadius, startAngle, endAngle)) {\n hoveredIndex = i;\n break;\n }\n }\n }\n return hoveredIndex;\n },\n [buttonImages]\n );\n\n // Обробка руху миші для перетягування та наведення\n const handleMouseMove = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n if (!canvasRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Перевіряємо чи почалось перетягування\n if (stateRef.current.draggedNode && stateRef.current.mouseStartPos && simulationRef.current) {\n const startX = stateRef.current.mouseStartPos.x;\n const startY = stateRef.current.mouseStartPos.y;\n\n // Визначаємо відстань переміщення для виявлення факту перетягування\n const dx = x - startX;\n const dy = y - startY;\n const dragDistance = Math.sqrt(dx * dx + dy * dy);\n\n // Якщо відстань досить велика - це перетягування, а не просто клік\n const dragThreshold = 3; // поріг у пікселях\n\n if (dragDistance > dragThreshold) {\n // Це точно операція перетягування, а не просто клік\n stateRef.current.isDragging = true;\n\n // Якщо це перше виявлення перетягування, налаштовуємо симуляцію\n if (simulationRef.current.alphaTarget() === 0) {\n // Встановлюємо alphaTarget на значення, що базується на розмірі вузла для відповідної інтенсивності руху\n const alphaValue = 0;\n simulationRef.current.alphaTarget(alphaValue).restart();\n\n // // Регулюємо швидкість загасання для кращої стабільності під час перетягування\n // const decayValue = 0.2;\n // simulationRef.current.velocityDecay(decayValue);\n }\n }\n\n // Масштабуємо координати на основі співвідношення пікселів пристрою та поточної трансформації\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n\n // Застосовуємо зворотну трансформацію, щоб отримати координати у просторі графа\n const scaledX = (x * pixelRatio - stateRef.current.transform.x) / stateRef.current.transform.k;\n const scaledY = (y * pixelRatio - stateRef.current.transform.y) / stateRef.current.transform.k;\n\n // Оновлюємо фіксовані позиції перетягуваного вузла з плавністю\n stateRef.current.draggedNode.fx = scaledX;\n stateRef.current.draggedNode.fy = scaledY;\n\n // if (stateRef.current.isDragging) {\n // // Зменшуємо енергію симуляції під час перетягування для стабільності\n // simulationRef.current.alpha(0); // Зменшуємо енергію системи\n // }\n\n // Немає потреби перевіряти наведення під час перетягування\n return;\n }\n\n // Обробка панорамування\n if (stateRef.current.isPanning && stateRef.current.mouseStartPos) {\n const dx = x - stateRef.current.lastMousePos.x;\n const dy = y - stateRef.current.lastMousePos.y;\n\n // Обчислюємо загальну відстань, пройдену під час панорамування\n const startX = stateRef.current.mouseStartPos.x;\n const startY = stateRef.current.mouseStartPos.y;\n const panDistance = Math.sqrt(Math.pow(x - startX, 2) + Math.pow(y - startY, 2));\n\n // Використовуємо ту ж саму логіку і поріг відстані як і для перетягування вузла\n const panThreshold = 3; // Той самий поріг як і для перетягування вузла\n if (panDistance > panThreshold) {\n // Це точно панорамування, а не просто клік\n stateRef.current.isDragging = true;\n }\n\n // Оновлюємо трансформацію безпосередньо у stateRef\n stateRef.current.transform = {\n ...stateRef.current.transform,\n x: stateRef.current.transform.x + dx,\n y: stateRef.current.transform.y + dy,\n };\n\n stateRef.current.lastMousePos = { x, y };\n renderCanvas2D(); // Перемальовуємо полотно після панорамування\n return;\n }\n\n let shouldRender;\n let hoveredNode;\n\n // Логіка виявлення наведення на кнопки\n if (stateRef.current.hoveredNode && canvasRef.current && buttonImages.length > 0) {\n const hoveredIndex = getHoveredIndex(x, y);\n\n if (hoveredIndex !== null) hoveredNode = stateRef.current.hoveredNode; // Встановлюємо hoveredNode для подальшої обробки\n\n // Оновлюємо позицію тултипу при русі миші, навіть якщо hoveredIndex не змінився\n if (hoveredIndex !== null && stateRef.current.hoveredButtonIndex === hoveredIndex) {\n // Оновлюємо позицію для існуючого тултипу\n setTooltipPosition({ x: x, y: y });\n }\n\n if (hoveredIndex !== stateRef.current.hoveredButtonIndex) {\n shouldRender = true; // Рендеримо тільки якщо індекс наведеної кнопки змінився\n // Оновлюємо тултіп\n\n if (hoveredIndex !== null) {\n const button = buttonImages[hoveredIndex];\n if (button?.tooltip) {\n const tooltipContent =\n typeof button.tooltip === 'function' ? button.tooltip(stateRef.current.hoveredNode) : button.tooltip;\n setTooltipContent(tooltipContent);\n setTooltipPosition({ x: x, y: y });\n } else {\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n } else {\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n stateRef.current.hoveredButtonIndex = hoveredIndex;\n }\n } else {\n if (stateRef.current.hoveredButtonIndex !== null) {\n stateRef.current.hoveredButtonIndex = null;\n setTooltipContent(null);\n setTooltipPosition(null);\n }\n }\n\n if (!hoveredNode) {\n // Якщо не наведено на ноду, перевіряємо наведення на зв'язок\n hoveredNode = getNodeAtPosition(x, y);\n\n // Якщо не наведено на ноду, перевіряємо наведення на зв'язок\n if (!hoveredNode) {\n const hoveredLink = getLinkAtPosition(x, y);\n const shouldRenderLink = hoveredLink !== stateRef.current.hoveredLink;\n\n // Очищаємо стан наведення на ноду при наведенні на зв'язок\n if (hoveredLink && stateRef.current.hoveredNode) {\n handleNodeHover(null);\n }\n\n handleLinkHover(event, hoveredLink);\n\n // Оновлюємо стиль курсора для зв'язків\n if (canvasRef.current) {\n canvasRef.current.style.cursor = hoveredLink ? 'pointer' : 'default';\n }\n\n if (shouldRenderLink) {\n renderCanvas2D();\n return;\n }\n }\n }\n\n // Очищаємо стан наведення на зв'язок при наведенні на ноду\n if (hoveredNode && stateRef.current.hoveredLink) {\n handleLinkHover(event, null);\n }\n\n if (hoveredNode !== stateRef.current.hoveredNode) shouldRender = true;\n\n handleNodeHover(hoveredNode);\n // Перевіряємо наведення та оновлюємо підсвічування\n\n // Змінюємо стиль курсору залежно від наведення\n if (canvasRef.current) {\n canvasRef.current.style.cursor = hoveredNode ? 'pointer' : 'default';\n }\n if (shouldRender) {\n renderCanvas2D(); // Перемальовуємо полотно після зміни наведення\n }\n },\n [\n buttonImages,\n getNodeAtPosition,\n getLinkAtPosition,\n handleNodeHover,\n handleLinkHover,\n renderCanvas2D,\n isPointInButtonSector,\n getHoveredIndex,\n ]\n );\n\n const handleClick = useCallback((event: React.MouseEvent<HTMLCanvasElement>) => {\n if (stateRef.current.mustBeStoppedPropagation) {\n event.stopPropagation();\n event.preventDefault();\n }\n stateRef.current.mustBeStoppedPropagation = false;\n }, []);\n\n // Обробляємо відпускання кнопки миші для завершення перетягування\n const handleMouseUp = useCallback(\n (event: React.MouseEvent<HTMLCanvasElement>) => {\n const wasDragging = stateRef.current.isDragging;\n\n if (wasDragging) {\n stateRef.current.mustBeStoppedPropagation = true;\n }\n // Обробляємо кліки на вузли або кнопки тільки якщо ми не перетягували\n if (!wasDragging && stateRef.current.mouseStartPos) {\n const rect = canvasRef.current?.getBoundingClientRect();\n if (rect) {\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n if (buttonImages.length > 0 && stateRef.current.hoveredButtonIndex === null) {\n const index = getHoveredIndex(x, y);\n stateRef.current.hoveredButtonIndex = index;\n }\n // Спочатку перевіряємо, чи ми клікаємо на кнопку обраного вузла\n let isButtonClick = false;\n if (\n stateRef.current.hoveredNode &&\n stateRef.current.hoveredButtonIndex !== null &&\n buttons[stateRef.current.hoveredButtonIndex]\n ) {\n // Це клік на кнопку, викликаємо обробник onClick кнопки\n const button = buttons[stateRef.current.hoveredButtonIndex];\n if (button && button.onClick) {\n button.onClick(stateRef.current.hoveredNode);\n isButtonClick = true;\n stateRef.current.hoveredButtonIndex = null;\n }\n }\n\n // Якщо це не клік на кнопку і у нас є draggedNode (миша була натиснута на ноді), викликаємо клік на ноду\n if (!isButtonClick && stateRef.current.draggedNode) {\n handleNodeClick(event, stateRef.current.draggedNode);\n } else if (!isButtonClick && !stateRef.current.draggedNode) {\n // Перевіряємо чи клікнули на зв'язок\n const clickedLink = getLinkAtPosition(x, y);\n if (clickedLink) {\n handleLinkClick(clickedLink);\n } else {\n // Якщо не клікнули на ноду, кнопку або зв'язок, це клік на фон\n // Викликаємо клік на фон тільки якщо не було перетягування\n handleBackgroundClick();\n }\n }\n }\n }\n\n if (stateRef.current.draggedNode && simulationRef.current) {\n // Якщо відбулось реальне перетягування, оптимізуємо параметри симуляції\n if (wasDragging) {\n // Поступово зменшуємо енергію симуляції\n simulationRef.current.alphaTarget(0);\n\n // Оптимізуємо параметри симуляції для кращої стабілізації\n const alphaValue = 0.05; // Низька альфа для плавного затухання\n const alphaDecayValue = 0.04; // Помірний коефіцієнт затухання для швидшої зупинки\n const velocityDecayValue = 0.6; // Стандартний коефіцієнт загасання швидкості після перетягування\n\n simulationRef.current.alpha(alphaValue).alphaDecay(alphaDecayValue);\n simulationRef.current.velocityDecay(velocityDecayValue);\n } else {\n // Якщо це був просто клік, а не перетягування, негайно зупиняємо симуляцію\n simulationRef.current.alphaTarget(0);\n }\n\n // Звільняємо позицію вузла незалежно від того, чи його перетягували або клікали\n stateRef.current.draggedNode.fx = undefined;\n stateRef.current.draggedNode.fy = undefined;\n\n stateRef.current.draggedNode = null;\n }\n\n // Скидаємо всі стани перетягування\n stateRef.current.isDragging = false;\n stateRef.current.mouseStartPos = null;\n\n // Завершуємо панорамування, якщо воно активне\n if (stateRef.current.isPanning) {\n stateRef.current.isPanning = false;\n }\n\n // НЕ очищаємо тултіп при mouseleave, бо TooltipWrapper має pointer-events: none\n // і миша проходить \"крізь\" нього. Логіка в handleMouseMove вже правильно\n // очищає tooltip коли миша виходить з області кнопок.\n\n renderCanvas2D();\n },\n [\n buttons,\n renderCanvas2D,\n handleNodeClick,\n handleBackgroundClick,\n getLinkAtPosition,\n handleLinkClick,\n getHoveredIndex,\n buttonImages,\n ]\n );\n\n // Обробляємо подію колеса миші для масштабування\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (!canvasRef.current) return;\n\n // Отримуємо координати відносно полотна\n const rect = canvasRef.current.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n\n // Обчислюємо коефіцієнт масштабування\n const delta = -event.deltaY;\n const scaleFactor = delta > 0 ? 1.1 : 1 / 1.1;\n\n // Обчислюємо нову трансформацію з масштабуванням навколо позиції миші\n const currentTransform = stateRef.current.transform;\n\n // Обмежуємо рівень масштабування (опціонально)\n const newScale = currentTransform.k * scaleFactor;\n\n if (newScale < 0.01 || newScale > 10) return;\n const newK = currentTransform.k * scaleFactor;\n\n // Обчислюємо нове переміщення для центрування масштабування на позиції миші\n const newX = x - (x - currentTransform.x) * scaleFactor;\n const newY = y - (y - currentTransform.y) * scaleFactor;\n\n // Оновлюємо трансформацію в stateRef\n stateRef.current.transform = {\n k: newK,\n x: newX,\n y: newY,\n };\n renderCanvas2D();\n },\n [renderCanvas2D]\n );\n\n //Обробка подій на тачскрін девайсах\n const convertTouchToMouseEvent = (\n e: TouchEvent | React.TouchEvent<HTMLCanvasElement>,\n callback: (event: React.MouseEvent<HTMLCanvasElement>) => void\n ) => {\n const touch = e.touches[0];\n if (touch) {\n // Створюємо синтетичну подію схожу на React.MouseEvent\n const syntheticEvent = {\n clientX: touch.clientX,\n clientY: touch.clientY,\n } as React.MouseEvent<HTMLCanvasElement>;\n callback(syntheticEvent);\n }\n };\n const handleTouchStart = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n convertTouchToMouseEvent(e, handleMouseDown);\n },\n [handleMouseDown]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (stateRef.current.mustBeStoppedPropagation) {\n e.preventDefault();\n e.stopPropagation();\n }\n stateRef.current.mustBeStoppedPropagation = false;\n convertTouchToMouseEvent(e, handleMouseUp);\n },\n [handleMouseUp]\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent<HTMLCanvasElement>) => {\n convertTouchToMouseEvent(e, handleMouseMove);\n },\n [handleMouseMove]\n );\n\n useImperativeHandle(\n ref,\n () => ({\n zoomToFit,\n zoomToSelected,\n zoomToNodes,\n addNodes,\n removeNodes,\n setSelectedNodes,\n setNodeSizes,\n setNodeColors,\n setLinkWidths,\n setLinkColors,\n findShortestPath,\n arrangeSelectedInGrid,\n arrangeNodesByTypeInGrid,\n }),\n [\n zoomToFit,\n zoomToSelected,\n zoomToNodes,\n addNodes,\n removeNodes,\n setSelectedNodes,\n setNodeSizes,\n setNodeColors,\n setLinkWidths,\n setLinkColors,\n findShortestPath,\n arrangeSelectedInGrid,\n arrangeNodesByTypeInGrid,\n ]\n );\n\n useEffect(() => {\n // Ініціалізуємо контекст canvas\n const canvasElement = canvasRef.current;\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n if (!canvasElement) return;\n\n // Ініціалізуємо Canvas 2D контекст\n init2DCanvas();\n setIsRendering(true);\n\n // Розрахунок центральної позиції з урахуванням розміру полотна\n const centerX = canvasWidth / 2;\n const centerY = canvasHeight / 2;\n\n // Ініціалізація силової симуляції D3\n const nodeSize = config.nodeSizeBase;\n const nodeRadius = nodeSize / 2;\n const linkDistance = nodeSize * 2.5; // Розрахунок відстані між зв'язками на основі розміру вузла\n\n if (simulationRef.current) simulationRef.current.stop();\n const simulation = (simulationRef.current = forceSimulation(nodes)\n .force(\n 'link',\n forceLink(links)\n .id((d: any) => d.id)\n .distance(linkDistance) // Адаптивна відстань між вузлами на основі розміру\n .strength(0.9) // Зменшуємо силу зв'язків (значення від 0 до 1)\n )\n .force(\n 'charge',\n forceManyBody()\n .strength((-nodeSize / 10) * 200) // Силу відштовхування на основі розміру вузла\n .theta(0.5) // Оптимізація для стабільності (0.5-1.0)\n .distanceMin(nodeSize * 2)\n )\n .force('x', forceX().strength(0.03)) // Слабка сила для стабілізації по осі X\n .force('y', forceY().strength(0.03)) // Слабка сила для стабілізації по осі Y\n .force('center', forceCenter(centerX, centerY).strength(0.05)) // Слабка сила центрування\n .force(\n 'collide',\n forceCollide()\n .radius((node: any) => getNodeSize(node)) // Радіус колізії залежно від розміру кожного вузла\n .iterations(2) // Більше ітерацій для кращого запобігання перекриття\n .strength(1) // Збільшуємо силу запобігання колізіям\n )\n .velocityDecay(0.6)); // Коефіцієнт затухання швидкості для зменшення \"тряски\"\n\n return () => {\n // Очищення\n simulation.stop();\n };\n }, [nodes, links]);\n\n useLayoutEffect(() => {\n const canvasElement = canvasRef.current;\n if (!canvasElement) return;\n stateRef.current.width = width * RATIO;\n stateRef.current.height = height * RATIO;\n canvasElement.width = stateRef.current.width;\n canvasElement.height = stateRef.current.height;\n }, [width, height]);\n\n useEffect(() => {\n if (simulationRef.current) {\n const simulation = simulationRef.current;\n\n // Оновлюємо позиції нод на кожному кроці\n\n simulation.on('tick', () => {\n renderCanvas2D();\n });\n\n // Коли симуляція завершується, зупиняємо індикатор рендерингу\n simulation.on('end', () => {\n // Рендеримо останній раз\n\n if (isRendering) {\n zoomToFit(0, 20); // Масштабуємо для вміщення після рендерингу\n setTimeout(() => {\n setIsRendering(false);\n }, 200);\n }\n });\n }\n\n if (!isRendering) {\n renderCanvas2D();\n }\n }, [nodes, links, isRendering, renderCanvas2D, zoomToFit]);\n\n // Встановлюємо зв'язки між нодами (сусіди та лінки)\n useEffect(() => {\n if (!nodes || !links) return;\n\n // Зв'язуємо ноди з їх сусідами та лінками\n links.forEach((link: any) => {\n const source = typeof link.source === 'object' ? link.source : nodes.find((n: any) => n.id === link.source);\n const target = typeof link.target === 'object' ? link.target : nodes.find((n: any) => n.id === link.target);\n\n if (!source || !target) return;\n\n // Ініціалізуємо масиви якщо їх ще немає\n !source.neighbors && (source.neighbors = []);\n !target.neighbors && (target.neighbors = []);\n source.neighbors.push(target);\n target.neighbors.push(source);\n\n !source.links && (source.links = []);\n !target.links && (target.links = []);\n source.links.push(link);\n target.links.push(link);\n });\n }, [nodes, links]);\n\n // Ініціалізуємо зображення кнопок\n useEffect(() => {\n if (buttons && buttons.length > 0) {\n setButtonImages(prepareButtonImages(buttons));\n }\n }, [buttons]);\n\n // Додаємо обробник події коліщатка миші з passive: false\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof window === 'undefined') return;\n\n // Додаємо обробник події з passive: false щоб дозволити preventDefault\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n canvas.addEventListener('touchend', handleTouchEnd, { passive: false });\n\n // Очищуємо при демонтуванні компонента\n return () => {\n canvas.removeEventListener('wheel', handleWheel);\n canvas.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleWheel, handleTouchEnd]);\n\n return (\n <Container>\n <Wrapper>\n {(loading || isRendering) && <GraphLoader width={width} height={height} />}\n <Canvas\n ref={canvasRef}\n style={{ width, height, display: loading || isRendering ? 'none' : 'block' }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onClick={handleClick}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n />\n </Wrapper>\n </Container>\n );\n }\n);\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n`;\n\nconst Wrapper = styled.div`\n position: relative;\n`;\n\nconst Canvas = styled.canvas``;\n\n// Додаємо відображуване ім'я для кращого налагодження\nGraph2D.displayName = 'Graph2D';\n","import styled from 'styled-components';\nimport { createComponent, pxToRem } from '../Theme';\n\ninterface FullscreenCardProps {\n children: any;\n className?: string;\n position: 'absolute' | 'fixed';\n isActive: boolean;\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n offset?: {\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n };\n}\n\nexport const FullscreenCard = createComponent<FullscreenCardProps>(\n ({ isActive, position, top = 0, left = 0, right, bottom, offset, ...props }) => {\n return (\n <>\n {isActive && offset && (\n <StyledBackdrop\n $position={position}\n $top={top}\n $left={left}\n $right={right}\n $bottom={bottom}\n $offset={offset}\n />\n )}\n <StyledContainer\n $isActive={isActive}\n $position={position}\n $top={top}\n $left={left}\n $right={right}\n $bottom={bottom}\n {...props}\n />\n </>\n );\n }\n);\n\nconst StyledBackdrop = styled.div<{\n $top?: number;\n $left?: number;\n $right?: number;\n $bottom?: number;\n $position: 'absolute' | 'fixed';\n $offset: {\n top?: number;\n left?: number;\n right?: number;\n bottom?: number;\n };\n}>(({ $top, $left, $right, $bottom, $position, $offset, theme }) => {\n const offsetTop = $offset.top ?? 0;\n const offsetLeft = $offset.left ?? 0;\n const offsetRight = $offset.right ?? 0;\n const offsetBottom = $offset.bottom ?? 0;\n\n return `\n position: ${$position};\n z-index: 999;\n background-color: ${theme.colors.backgroundBase};\n ${typeof $top === 'number' ? `top: ${pxToRem($top - offsetTop, theme.baseSize)};` : ''}\n ${typeof $left === 'number' ? `left: ${pxToRem($left - offsetLeft, theme.baseSize)};` : ''}\n ${typeof $right === 'number' ? `right: ${pxToRem($right - offsetRight, theme.baseSize)};` : ''}\n ${typeof $bottom === 'number' ? `bottom: ${pxToRem($bottom - offsetBottom, theme.baseSize)};` : ''}\n `;\n});\n\nconst StyledContainer = styled.div<{\n $isActive: boolean;\n $top?: number;\n $left?: number;\n $right?: number;\n $bottom?: number;\n $position: 'absolute' | 'fixed';\n}>(\n ({ $isActive, $top, $left, $right, $bottom, $position, theme }) => `\n${\n $isActive\n ? `\n position: ${$position};\n z-index: 1000;\n ${typeof $top === 'number' ? `top: ${pxToRem($top, theme.baseSize)};` : ''}\n ${typeof $left === 'number' ? `left: ${pxToRem($left, theme.baseSize)};` : ''}\n ${typeof $right === 'number' ? `right: ${pxToRem($right, theme.baseSize)};` : ''}\n ${typeof $bottom === 'number' ? `bottom: ${pxToRem($bottom, theme.baseSize)};` : ''}\n `\n : ''\n}\n\n min-width: 0;\n `\n);\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Box, Button } from '../../Core';\nimport { MinusIcon, PlusIcon } from '../../Core/IconComponents';\n\nexport const ImageDriver = ({ url }: { url: string }) => {\n const [scale, setScale] = useState(1);\n const [scaleBy, setScaleBy] = useState<'width' | 'height'>();\n const imgRef = React.useRef<HTMLImageElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n return (\n <Wrapper ref={containerRef}>\n <Controls>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={() => setScale((prev) => Math.max(prev - 0.25, 0.25))}\n disabled={scale <= 0.25}\n p={5}\n />\n <Box py={5} px={8}>\n {scale * 100}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={() => setScale((prev) => Math.min(prev + 0.25, 4))}\n disabled={scale >= 4}\n p={8}\n />\n </Controls>\n <ScrollArea>\n <img\n src={url}\n ref={imgRef}\n alt=\"image\"\n style={{\n display: 'block',\n width: 'auto',\n maxWidth: 'none',\n objectFit: 'contain',\n transition: 'all 0.2s ease-in-out',\n marginInline: 'auto',\n marginBlock: 10,\n flexShrink: 0,\n ...(scaleBy === 'width' && { width: `calc(${scale * 100}% - 20px)` }),\n ...(scaleBy === 'height' && { height: `calc(${scale * 100}% - 20px)` }),\n }}\n onLoad={() => {\n if (imgRef.current && containerRef.current) {\n const { width, height } = imgRef.current;\n setScaleBy(width < height ? 'height' : 'width');\n }\n }}\n />\n </ScrollArea>\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Controls = styled.div(\n ({ theme }) => `\n display: flex;\n justify-content: center;\n align-items: stretch;\n padding: 22px;\n gap: 4px;\n border-bottom: 1px solid ${theme.colors.stroke.light};\n position: relative;\n`\n);\n\nconst ScrollArea = styled.div`\n height: 100%;\n width: 100%;\n overflow: auto;\n`;\n","import styled from 'styled-components';\n\nexport const AudioDriver = ({ url }: { url: string }) => (\n <Wrapper>\n <audio controls src={url} style={{ width: '100%' }} />\n </Wrapper>\n);\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n padding: 22px;\n`;\n","import React, { useState, useEffect } from 'react';\n\ninterface PdfDriverProps {\n url: string;\n}\n\nexport const PdfDriverWrapper: React.FC<PdfDriverProps> = ({ url }) => {\n const [PdfDriverComponent, setPdfDriverComponent] = useState<React.ComponentType<PdfDriverProps> | null>(null);\n const [isClient, setIsClient] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n useEffect(() => {\n if (!isClient) return;\n const load = async () => {\n try {\n const module = await import('./PdfDriver');\n setPdfDriverComponent(() => module.PdfDriver);\n setLoading(false);\n } catch (err) {\n console.error('Failed to load PDF driver:', err);\n setError('Failed to load PDF viewer');\n setLoading(false);\n }\n };\n load();\n }, [isClient]);\n\n const placeholder = (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }}>\n <span style={{ color: '#6b7280' }}>Loading PDF viewer...</span>\n </div>\n );\n\n if (!isClient || loading) return placeholder;\n if (error || !PdfDriverComponent) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%' }}>\n <span style={{ color: '#ef4444' }}>{error || 'PDF viewer unavailable'}</span>\n </div>\n );\n }\n\n return <PdfDriverComponent url={url} />;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { renderAsync } from 'docx-preview';\nimport throttle from 'lodash.throttle';\nimport { Box, Button } from '../../Core';\nimport { MinusIcon, PlusIcon } from '../../Core/IconComponents';\n\ninterface DocxDriverProps {\n url?: string;\n blob?: Blob;\n}\n\nconst MAX_SIZE_MB = 50;\nconst TIMEOUT_MS = 10000;\n\nexport const DocxDriver: React.FC<DocxDriverProps> = ({ url, blob }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [scale, setScale] = useState(1);\n const userHasZoomedRef = useRef(false);\n const [naturalSize, setNaturalSize] = useState({ width: 0, height: 0 });\n const naturalWidthRef = useRef(0);\n\n const handleZoomIn = () => {\n userHasZoomedRef.current = true;\n setScale((prev) => Math.min(prev + 0.25, 4));\n };\n\n const handleZoomOut = () => {\n userHasZoomedRef.current = true;\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n };\n\n useEffect(() => {\n const renderDocument = async () => {\n if (!containerRef.current) return;\n try {\n setLoading(true);\n setError(null);\n\n let docBlob = blob;\n if (!docBlob && url) {\n const response = await fetch(url);\n docBlob = await response.blob();\n }\n if (!docBlob) {\n setError('No DOCX file provided');\n return;\n }\n\n const sizeMB = docBlob.size / (1024 * 1024);\n if (sizeMB > MAX_SIZE_MB) {\n setError(`File too large (> ${MAX_SIZE_MB} MB)`);\n return;\n }\n\n containerRef.current.innerHTML = '';\n\n const renderPromise = renderAsync(docBlob, containerRef.current, undefined, {\n debug: true,\n experimental: true,\n hideWrapperOnPrint: true,\n });\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('DOCX render timed out')), TIMEOUT_MS)\n );\n\n await Promise.race([renderPromise, timeoutPromise]);\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n const docxWrapper = containerRef.current.querySelector('.docx-wrapper') as HTMLElement;\n if (docxWrapper) {\n naturalWidthRef.current = docxWrapper.offsetWidth;\n setNaturalSize({ width: docxWrapper.offsetWidth, height: docxWrapper.offsetHeight });\n }\n\n if (wrapperRef.current && naturalWidthRef.current > 0) {\n const autoScale = Math.min(wrapperRef.current.clientWidth / naturalWidthRef.current, 1);\n setScale(autoScale);\n }\n\n setLoading(false);\n } catch (err: any) {\n setError(err?.message || 'Failed to open DOCX file');\n setLoading(false);\n }\n };\n renderDocument();\n }, [url, blob]);\n\n useEffect(() => {\n if (!wrapperRef.current) return;\n\n const handleResize = throttle((entries: ResizeObserverEntry[]) => {\n if (userHasZoomedRef.current || naturalWidthRef.current === 0) return;\n for (const entry of entries) {\n const autoScale = Math.min(entry.contentRect.width / naturalWidthRef.current, 1);\n setScale(autoScale);\n }\n }, 150);\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(wrapperRef.current);\n return () => {\n observer.disconnect();\n handleResize.cancel();\n };\n }, []);\n\n return (\n <Wrapper>\n <Controls>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-out\"\n color=\"secondary\"\n size=\"small\"\n icon={<MinusIcon style={{ width: 20, height: 20 }} />}\n onClick={handleZoomOut}\n disabled={scale <= 0.25}\n p={5}\n />\n <Box py={5} px={8}>\n {Math.round(scale * 100)}%\n </Box>\n <Button\n variant=\"outlined\"\n aria-label=\"zoom-in\"\n size=\"small\"\n color=\"secondary\"\n icon={<PlusIcon style={{ width: 14, height: 14 }} />}\n onClick={handleZoomIn}\n disabled={scale >= 4}\n p={8}\n />\n </Controls>\n {!!error && !loading && <ErrorMsg>{error}</ErrorMsg>}\n {loading && <LoadingMsg>Loading...</LoadingMsg>}\n <ScrollArea ref={wrapperRef}>\n <ScaleContainer\n style={{\n width: naturalSize.width > 0 ? naturalSize.width * scale : undefined,\n height: naturalSize.height > 0 ? naturalSize.height * scale : undefined,\n }}\n >\n <DocxContent\n ref={containerRef}\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'top left',\n }}\n />\n </ScaleContainer>\n </ScrollArea>\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Controls = styled.div(\n ({ theme }) => `\n display: flex;\n justify-content: center;\n align-items: stretch;\n padding: 22px;\n gap: 4px;\n border-bottom: 1px solid ${theme.colors.stroke.light};\n`\n);\n\nconst ErrorMsg = styled.div(\n ({ theme }) => `\n color: ${theme.colors.error};\n padding: 20px;\n`\n);\n\nconst LoadingMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n color: ${theme.colors.text.light};\n`\n);\n\nconst ScrollArea = styled.div(\n ({ theme }) => `\n width: 100%;\n height: 100%;\n overflow: auto;\n background-color: ${theme.colors.stroke.main};\n`\n);\n\nconst ScaleContainer = styled.div`\n overflow: hidden;\n margin: 0 auto;\n`;\n\nconst DocxContent = styled.div`\n box-sizing: border-box;\n word-break: break-word;\n overflow-wrap: break-word;\n\n & > div.docx-wrapper {\n box-sizing: border-box;\n min-width: fit-content;\n min-height: 100%;\n }\n\n & > div.docx-wrapper > section {\n min-width: fit-content;\n }\n\n & > div.docx-wrapper table * {\n word-break: break-word !important;\n }\n\n & > div.docx-wrapper table {\n table-layout: fixed !important;\n max-width: 100% !important;\n width: 100% !important;\n border-collapse: collapse !important;\n }\n\n & > div.docx-wrapper img {\n max-width: 100% !important;\n height: auto !important;\n }\n`;\n\nconst _spinKeyframe = keyframes`from { transform: rotate(0deg); } to { transform: rotate(360deg); }`;\n","import { useState, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport CodeMirror from '@uiw/react-codemirror';\nimport { vscodeDark } from '@uiw/codemirror-theme-vscode';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { json } from '@codemirror/lang-json';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { python } from '@codemirror/lang-python';\nimport { java } from '@codemirror/lang-java';\nimport { cpp } from '@codemirror/lang-cpp';\nimport { php } from '@codemirror/lang-php';\nimport { rust } from '@codemirror/lang-rust';\nimport { xml } from '@codemirror/lang-xml';\nimport { yaml } from '@codemirror/lang-yaml';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { sql } from '@codemirror/lang-sql';\nimport { SupportedFileExtension } from '../types';\nimport type { Extension } from '@codemirror/state';\n\ntype TextDriverProps = {\n url: string;\n extension: SupportedFileExtension;\n};\n\nconst getLanguageExtension = (extension: string): Extension[] => {\n const extensionMap: Record<string, Extension[]> = {\n js: [javascript({ jsx: false })],\n jsx: [javascript({ jsx: true })],\n ts: [javascript({ typescript: true, jsx: false })],\n tsx: [javascript({ typescript: true, jsx: true })],\n json: [json()],\n html: [html()],\n css: [css()],\n scss: [css()],\n py: [python()],\n java: [java()],\n cpp: [cpp()],\n c: [cpp()],\n php: [php()],\n rs: [rust()],\n xml: [xml()],\n yaml: [yaml()],\n yml: [yaml()],\n md: [markdown()],\n sql: [sql()],\n sh: [markdown()],\n bash: [markdown()],\n };\n return extensionMap[extension] || [];\n};\n\nexport const TextDriver = ({ url, extension }: TextDriverProps) => {\n const [content, setContent] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [containerHeight, setContainerHeight] = useState<number>(0);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const load = async () => {\n try {\n setLoading(true);\n setError(null);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to load file: ${response.statusText}`);\n setContent(await response.text());\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load text content');\n } finally {\n setLoading(false);\n }\n };\n load();\n }, [url]);\n\n useEffect(() => {\n const update = () => {\n if (containerRef.current) setContainerHeight(containerRef.current.clientHeight);\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [loading]);\n\n if (loading) return <StatusMsg>Loading text content...</StatusMsg>;\n if (error) return <ErrorMsg>Error: {error}</ErrorMsg>;\n\n return (\n <Wrapper ref={containerRef}>\n {containerHeight > 0 && (\n <CodeMirror\n value={content}\n theme={vscodeDark}\n extensions={getLanguageExtension(extension)}\n editable={false}\n height={`${containerHeight}px`}\n basicSetup={{\n lineNumbers: true,\n highlightActiveLineGutter: false,\n highlightActiveLine: false,\n foldGutter: true,\n dropCursor: false,\n indentOnInput: false,\n syntaxHighlighting: true,\n bracketMatching: true,\n closeBrackets: false,\n autocompletion: false,\n rectangularSelection: false,\n crosshairCursor: false,\n highlightSelectionMatches: false,\n closeBracketsKeymap: false,\n searchKeymap: false,\n foldKeymap: true,\n completionKeymap: false,\n lintKeymap: false,\n }}\n />\n )}\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n`;\n\nconst StatusMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: ${theme.colors.text.light};\n`\n);\n\nconst ErrorMsg = styled.div(\n ({ theme }) => `\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n color: ${theme.colors.error};\n`\n);\n","import styled from 'styled-components';\n\nexport const VideoDriver = ({ url }: { url: string }) => (\n <Wrapper>\n <video controls src={url} style={{ width: '100%', maxHeight: '100%' }} />\n </Wrapper>\n);\n\nconst Wrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 100%;\n`;\n","import { memo } from 'react';\nimport styled from 'styled-components';\nimport { SupportedFileExtension } from './types';\nimport { ImageDriver } from './drivers/ImageDriver';\nimport { AudioDriver } from './drivers/AudioDriver';\nimport { PdfDriver } from './drivers/PdfDriver';\nimport { DocxDriver } from './drivers/DocxDriver';\nimport { TextDriver } from './drivers/TextDriver';\nimport { VideoDriver } from './drivers/VideoDriver';\nimport { Typography } from '../Core';\n\ntype DriverProps = {\n path?: string;\n blob?: Blob;\n buffer?: ArrayBuffer;\n extension: SupportedFileExtension;\n not_supported_message?: string;\n};\n\nexport const Driver = memo(function Driver({\n extension,\n blob,\n path,\n buffer,\n not_supported_message = \"Sorry, this file type isn't supported yet.\",\n}: DriverProps) {\n const normalizedExtension = extension.toLocaleLowerCase().trim() as SupportedFileExtension;\n\n let url: string | undefined;\n if (path) {\n url = path;\n } else if (blob) {\n url = URL.createObjectURL(blob);\n }\n\n if (url) {\n if (['jpeg', 'jpg', 'png', 'gif', 'bmp', 'webp'].includes(normalizedExtension)) {\n return <ImageDriver url={url} />;\n }\n if (['mp3', 'wav', 'ogg', 'flac'].includes(normalizedExtension)) {\n return <AudioDriver url={url} />;\n }\n if (['mp4', 'webm'].includes(normalizedExtension)) {\n return <VideoDriver url={url} />;\n }\n if (extension === 'pdf') {\n return <PdfDriver url={url} />;\n }\n if (\n ['txt', 'js', 'jsx', 'ts', 'tsx', 'json', 'html', 'css', 'scss', 'py', 'java', 'cpp', 'c', 'cs', 'php', 'rb', 'go', 'rs', 'swift', 'kt', 'xml', 'yaml', 'yml', 'md', 'sql', 'sh', 'bash'].includes(normalizedExtension)\n ) {\n return <TextDriver url={url} extension={normalizedExtension} />;\n }\n }\n\n if (normalizedExtension === 'docx') {\n return <DocxDriver url={url} blob={blob} />;\n }\n\n return (\n <NotSupported>\n <Typography variant=\"h2\" color=\"text.light\" weight={500} style={{ textAlign: 'center' }}>\n {not_supported_message}\n </Typography>\n </NotSupported>\n );\n});\n\nconst NotSupported = styled.div`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n padding: 20px;\n`;\n","import styled from 'styled-components';\nimport { Driver } from './Driver';\nimport { SupportedFileExtension } from './types';\n\ntype FileViewerProps = {\n path?: string;\n blob?: Blob;\n buffer?: ArrayBuffer;\n extension: SupportedFileExtension;\n not_supported_message?: string;\n};\n\nexport const FileViewer = (props: FileViewerProps) => {\n return (\n <Wrapper>\n <Driver {...props} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n height: 100%;\n width: 100%;\n`;\n"]}
|