@cyber-harbour/ui 2.0.47 → 2.0.48
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.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -16
- package/dist/index.mjs.map +1 -1
- package/dist/styles/tailwind.css +1 -1
- package/dist/styles/tailwind.css.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/Graph2D/GraphLoader.tsx","../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/DownloadDriver.tsx","../src/FileViewer/drivers/DocxDriver.tsx","../src/FileViewer/drivers/TextDriver.tsx","../src/FileViewer/drivers/VideoDriver.tsx","../src/FileViewer/Driver.tsx","../src/FileViewer/FileViewer.tsx","../src/Typewriter/Typewriter.tsx","../src/CopyToClipboard/CopyToClipboard.tsx","../src/DatePicker/DatePicker.tsx","../src/Toasts/Toast.tsx","../src/Toasts/ToastsList.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","LoaderWrapper","GraphLoader","width","height","useTheme","jsxs","ContentLoader","GraphLoader_default","RATIO","prepareButtonImages","buttons","button","normalImg","hoverImg","config","Graph2D","forwardRef","loading","graphData","onNodeClick","onBackgroundClick","onNodeHover","onLinkHover","onLinkClick","ref","isRendering","setIsRendering","useState","stateRef","useRef","nodes","links","useMemo","cloneDeep","buttonImages","setButtonImages","canvasRef","simulationRef","ctx2dRef","color","scaleOrdinal","schemeCategory10","init2DCanvas","useCallback","ctx","getNodes","getLinks","linkForce","renderGrid","canvasWidth","canvasHeight","gridSpacing","dotSize","x","y","truncateText","text","truncated","ellipsis","calculateFontSize","scale","fontSizeRatio","renderLinks","link","source","n","target","start","end","dx","dy","distance","unitDx","unitDy","sourceRadius","targetRadius","arrowHeadLength","adjustedStart","adjustedEnd","adjusteArrowdEnd","isHighlighted","lineColor","lineWidth","middleX","middleY","angle","globalScale","scaledFontSize","textWidth","padding","beforeTextDistance","pointBeforeText","afterTextDistance","pointAfterText","arrowHeadWidth","drawIconWithOptionalCounter","icon","iconX","iconY","iconSize","counter","textColor","fontSize","counterText","spacing","offsetX","error","renderNodeButtons","node","buttonRadius","buttonCount","sectorAngle","i","startAngle","endAngle","isHovered","midAngle","iconDistance","buttonImage","spinnerRadius","dotRadius","j","alpha","dotX","dotY","hexToRgba","renderCanvas2D","renderNodes","nodeColor","fontColor","label","isSelected","size","radius","ringRadius","truncatedLabel","addNodes","newNodes","newLinks","options","smoothAppearance","transitionDuration","existingNodeIds","filteredNewNodes","existingLinkIds","filteredNewLinks","linkId","updatedNodes","updatedLinks","connectedLinks","sourceId","targetId","someLink","connectedNodeId","connectedNode","randomOffset","randomAngle","centerX","centerY","removeNodes","nodeIds","nodeIdsToRemove","remainingNodes","remainingLinks","zoomToFit","duration","minX","minY","maxX","maxY","contentWidth","contentHeight","scaleX","scaleY","newTransform","startTransform","startTime","animateZoom","t","easedT","interpolatedTransform","getNodeAtPosition","nodeRadius","pixelRatio","scaledX","scaledY","getLinkAtPosition","threshold","sourceX","sourceY","targetX","targetY","A","B","C","D","dot","lenSq","param","xx","yy","isPointInButtonSector","mouseX","mouseY","nodeX","nodeY","isInRadius","isInAngle","handleNodeHover","newHighlightNodes","newHighlightLinks","neighbor","handleLinkHover","handleLinkClick","handleNodeClick","handleBackgroundClick","handleMouseDown","event","rect","getHoveredIndex","hoveredIndex","canvasScaleX","canvasScaleY","scaledMouseX","scaledMouseY","worldX","worldY","handleMouseMove","startX","startY","shouldRender","hoveredNode","hoveredLink","shouldRenderLink","handleClick","handleMouseUp","wasDragging","isButtonClick","clickedLink","alphaValue","alphaDecayValue","velocityDecayValue","handleWheel","scaleFactor","currentTransform","newScale","newK","newX","newY","convertTouchToMouseEvent","callback","touch","syntheticEvent","handleTouchStart","handleTouchEnd","handleTouchMove","useImperativeHandle","useEffect","canvasElement","nodeSize","linkDistance","simulation","forceSimulation","forceLink","d","forceManyBody","forceX","forceY","forceCenter","forceCollide","useLayoutEffect","canvas","Wrapper","Canvas","FullscreenCard","isActive","position","left","right","bottom","$isActive","$left","$right","$bottom","$position","ImageDriver","url","setScale","scaleBy","setScaleBy","imgRef","React","containerRef","handleZoomIn","prev","Button","MinusIcon","Box","PlusIcon","AudioDriver","PdfDriverWrapper","PdfDriverComponent","setPdfDriverComponent","isClient","setIsClient","setLoading","setError","module","err","DownloadDriver","extension","MAX_SIZE_MB","TIMEOUT_MS","DocxDriver","blob","renderPromise","renderAsync","timeoutPromise","_","reject","Fragment","getLanguageFromExtension","TextDriver","content","setContent","response","language","SyntaxHighlighter","darcula","VideoDriver","Driver","memo","path","buffer","not_supported_message","normalizedExtension","Typography","FileViewer","MAX_TEXT_LENGTH_WITH_SLOW_SPEED","Typewriter","speed","onDone","markdown","markdownComponents","displayed","setDisplayed","rafId","done","tick","now","elapsed","currentSpeed","chartsMultiply","charsToShow","ReactMarkdown","remarkGfm","DEFAULT_TOOLTIP_OPTIONS","CopyToClipboard","format","tooltip","copied","setCopied","timeoutId","tooltipOptions","handleCopy","copy","Tooltip","getInitValue","value","parseDate","formatStr","parsedDate","parse","isValid","getYear","date","renderDate","DatePicker","range","inline","minDate","maxDate","onChange","month","setMonth","getMonth","year","setYear","selectedDate","startDate","endDate","handleSelectDate","hasStart","hasEnd","DatePickerCalendar","DatePickerGroupInput","DatePickerInput","placeholder","inputProps","isOpen","setIsOpen","Popover","Input","onSelectDate","onChangeMonth","onChangeYear","monthOptions","yearOptions","minYear","yearsCount","daysInWeek","day","startOfWeek","days","weekInMonth","getWeeksInMonth","firstDayOfMonth","startOfMonth","firstMonday","previousMonday","diffInDays","differenceInDays","handlePrevMonth","handleNextMonth","hasPrevMonth","hasNextMonth","handleCLick","ChevronLeftIcon","Select","ChevronRightIcon","isCurrentMonth","isCurrentDay","isInRange","isDisabled","CalendarDay","getColorStyle","getTextColor","getTransitionStarting","direction","Toast","id","message","transitionDirection","cancelable","onClose","isClosing","setIsClosing","isVisible","setIsVisible","timeoutClosingRef","handleClose","timer","getPosition","offset","ToastsList","items","toast"],"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 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 // Helper function to create a rect from line coordinates\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","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';\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 const normalImg = new Image();\n normalImg.src = button.img;\n\n const hoverImg = new Image();\n hoverImg.src = button.hoverImg;\n\n return {\n ...button,\n normalImg,\n hoverImg,\n };\n });\n}\n\n// Конфігурація подібна до Graph2D\nconst config = {\n fontSize: 3,\n nodeSizeBase: 30,\n nodeAreaFactor: 2,\n textPaddingFactor: 0.9,\n gridSpacing: 20,\n dotSize: 1,\n maxZoom: 4,\n};\n\nexport const Graph2D: any = forwardRef<Graph2DRef, Graph2DProps>(\n (\n {\n loading,\n width,\n height,\n graphData,\n buttons = [],\n onNodeClick,\n onBackgroundClick,\n onNodeHover,\n onLinkHover,\n onLinkClick,\n },\n ref\n ) => {\n const theme = useTheme();\n const [isRendering, setIsRendering] = useState(true);\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 selectedNode: null,\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 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 [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 = config.nodeSizeBase / 2;\n const targetRadius = config.nodeSizeBase / 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 : theme.graph2D.link.normal;\n const lineWidth = isHighlighted ? 1.5 : 0.5;\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 = 2;\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(-arrowHeadLength, arrowHeadWidth);\n ctx.lineTo(-arrowHeadLength, 0);\n ctx.lineTo(-arrowHeadLength, -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 buttonRadius = (config.nodeSizeBase * 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 - config.nodeSizeBase / 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 if (buttonImage.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 ? buttonImage.hoverImg : buttonImage.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 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 isHighlighted =\n stateRef.current.highlightNodes.has(node) ||\n node === stateRef.current.hoveredNode ||\n node === stateRef.current.draggedNode;\n const isSelected = node === stateRef.current.selectedNode;\n\n // Розмір та позиція вузла\n const size = config.nodeSizeBase;\n const radius = isSelected ? config.nodeSizeBase / 2 : config.nodeSizeBase / 2;\n\n // Якщо вузол виділено, малюємо кільце підсвічування\n if (isHighlighted && !isSelected) {\n const ringRadius = (config.nodeSizeBase * config.nodeAreaFactor * 0.75) / 2;\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.highlightFill;\n ctx.fill();\n }\n\n // Якщо вузол обрано, малюємо кільце вибору та кнопки\n if (isSelected) {\n // Малюємо кнопки навколо обраного вузла, якщо кнопки доступні\n if (buttons && buttons.length > 0) {\n renderNodeButtons(node, ctx);\n } else {\n const ringRadius = (config.nodeSizeBase * config.nodeAreaFactor) / 2;\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 || theme.graph2D.ring.highlightFill;\n ctx.fill();\n }\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 rendering for everything\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 }, [renderLinks, renderNodes, renderGrid]);\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 ) => {\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 },\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 if (\n stateRef.current.selectedNode &&\n stateRef.current.selectedNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.selectedNode.id)\n ) {\n stateRef.current.selectedNode = null;\n }\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 stateRef.current.highlightNodes = new Set<NodeObject>();\n stateRef.current.highlightLinks = new Set<any>();\n }\n\n // Clear hoveredLink if it involves removed nodes\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 stateRef.current.highlightNodes = new Set<NodeObject>();\n stateRef.current.highlightLinks = new Set<any>();\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 // Спочатку очищаємо існуючі відносини\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 // Просто перемальовуємо canvas з новими даними\n renderCanvas2D();\n },\n [renderCanvas2D]\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 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 nodeRadius = config.nodeSizeBase / 2;\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 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 const newHighlightNodes = new Set<NodeObject>();\n const newHighlightLinks = new Set<any>();\n\n if (node) {\n newHighlightNodes.add(node);\n\n // Додаємо сусідні вузли та зв'язки до підсвічування\n if (node.neighbors) {\n node.neighbors.forEach((neighbor: any) => newHighlightNodes.add(neighbor));\n }\n\n if (node.links) {\n node.links.forEach((link: any) => newHighlightLinks.add(link));\n }\n }\n\n stateRef.current.hoveredNode = node;\n if (onNodeHover) onNodeHover(node);\n stateRef.current.highlightNodes = newHighlightNodes;\n stateRef.current.highlightLinks = newHighlightLinks;\n },\n [onNodeHover]\n );\n\n // Обробка наведення на лінк\n const handleLinkHover = useCallback(\n (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);\n stateRef.current.highlightNodes = newHighlightNodes;\n stateRef.current.highlightLinks = newHighlightLinks;\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 (node: NodeObject) => {\n stateRef.current.selectedNode = node;\n if (onNodeClick) onNodeClick(node);\n },\n [onNodeClick]\n );\n\n // Обробка кліку на фон\n const handleBackgroundClick = useCallback(() => {\n stateRef.current.selectedNode = null;\n if (onBackgroundClick) onBackgroundClick();\n }, [onBackgroundClick]); // Перетягування тепер обробляється через 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) {\n const buttonRadius = (config.nodeSizeBase * 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 // Node position\n const nodeX = stateRef.current.selectedNode?.x || 0;\n const nodeY = stateRef.current.selectedNode?.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.selectedNode && canvasRef.current && buttonImages.length > 0) {\n const hoveredIndex = getHoveredIndex(x, y);\n if (hoveredIndex !== null) hoveredNode = stateRef.current.selectedNode; // Set hoveredNode to selectedNode for further processing\n if (hoveredIndex !== stateRef.current.hoveredButtonIndex) {\n shouldRender = true; // Only render if hovered button index has changed\n }\n stateRef.current.hoveredButtonIndex = hoveredIndex;\n } else {\n if (stateRef.current.hoveredButtonIndex !== null) stateRef.current.hoveredButtonIndex = null;\n }\n\n if (!hoveredNode) {\n // If no node is hovered, check for link hover\n hoveredNode = getNodeAtPosition(x, y);\n\n // If no node is hovered, check for link hover\n if (!hoveredNode) {\n const hoveredLink = getLinkAtPosition(x, y);\n const shouldRenderLink = hoveredLink !== stateRef.current.hoveredLink;\n\n // Clear node hover state when hovering over a link\n if (hoveredLink && stateRef.current.hoveredNode) {\n handleNodeHover(null);\n }\n\n handleLinkHover(hoveredLink);\n\n // Update cursor style for links\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 // Clear link hover state when hovering over a node\n if (hoveredNode && stateRef.current.hoveredLink) {\n handleLinkHover(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 stateRef.current.hoveredButtonIndex = getHoveredIndex(x, y);\n }\n // Спочатку перевіряємо, чи ми клікаємо на кнопку обраного вузла\n let isButtonClick = false;\n if (\n stateRef.current.selectedNode &&\n stateRef.current.hoveredButtonIndex !== null &&\n buttons[stateRef.current.hoveredButtonIndex]\n ) {\n // This is a button click, trigger the button's onClick handler\n const button = buttons[stateRef.current.hoveredButtonIndex];\n if (button && button.onClick) {\n button.onClick(stateRef.current.selectedNode);\n isButtonClick = true;\n stateRef.current.hoveredButtonIndex = null;\n }\n }\n\n // If not a button click and we have a draggedNode (mouse was pressed on a node), trigger node click\n if (!isButtonClick && stateRef.current.draggedNode) {\n handleNodeClick(stateRef.current.draggedNode);\n } else if (!isButtonClick && !stateRef.current.draggedNode) {\n // Check if we clicked on a link\n const clickedLink = getLinkAtPosition(x, y);\n if (clickedLink) {\n handleLinkClick(clickedLink);\n } else {\n // If we didn't click on a node, button, or link, it's a background click\n // Only trigger background click if there was no dragging\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 // End panning if active\n if (stateRef.current.isPanning) {\n stateRef.current.isPanning = false;\n }\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 // Update transform in 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 // Create a synthetic React.MouseEvent-like object\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 addNodes,\n removeNodes,\n }),\n [zoomToFit, addNodes, removeNodes]\n );\n\n useEffect(() => {\n // Initialize canvas context\n const canvasElement = canvasRef.current;\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n if (!canvasElement) return;\n\n // Initialize Canvas 2D context\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(nodeRadius * 2) // Радіус колізії залежно від розміру вузла\n .iterations(2) // Більше ітерацій для кращого запобігання перекриття\n .strength(1) // Збільшуємо силу запобігання колізіям\n )\n .velocityDecay(0.6)); // Коефіцієнт затухання швидкості для зменшення \"тряски\"\n\n return () => {\n // Cleanup\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 // Update node positions on each tick\n\n simulation.on('tick', () => {\n renderCanvas2D();\n });\n\n // When simulation ends, stop rendering indicator\n simulation.on('end', () => {\n // Render one last time\n\n if (isRendering) {\n zoomToFit(0, 20); // Zoom to fit after rendering\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 // Set up node relationships (neighbors and links)\n useEffect(() => {\n if (!nodes || !links) return;\n\n // Connect nodes to their neighbors and links\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 // Initialize arrays if they don't exist\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 // Initialize button images\n useEffect(() => {\n if (buttons && buttons.length > 0) {\n setButtonImages(prepareButtonImages(buttons));\n }\n }, [buttons]);\n\n // Add wheel event listener with passive: false\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof window === 'undefined') return;\n\n // Add event listener with passive: false to allow preventDefault\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n canvas.addEventListener('touchend', handleTouchEnd, { passive: false });\n\n // Clean up when component unmounts\n return () => {\n canvas.removeEventListener('wheel', handleWheel);\n canvas.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleWheel, handleTouchEnd]);\n\n return (\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 );\n }\n);\n\nconst Wrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n position: relative;\n`;\n\nconst Canvas = styled.canvas``;\n\n// Add display name for better debugging\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}\n\nexport const FullscreenCard = createComponent<FullscreenCardProps>(\n ({ isActive, position, top = 0, left = 0, right, bottom, ...props }) => {\n return (\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\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\n min-width: 0;\n `\n);\n","import React, { useState } from 'react';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../Core';\n\nexport const ImageDriver = ({ url }: { url: string }) => {\n const [scale, setScale] = useState(1);\n\n const [scaleBy, setScaleBy] = useState<'width' | 'height'>();\n const imgRef = React.useRef<HTMLImageElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const handleZoomIn = () => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n };\n\n const handleZoomOut = () => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n };\n\n return (\n <div ref={containerRef} className=\"h-full w-full flex flex-col\">\n <div className=\"flex justify-center items-stretch p-5.5 gap-1 border-b border-gray-200 relative \">\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 {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 </div>\n <div className=\"h-full w-full overflow-auto flex items-center justify-center\">\n <img\n src={url}\n ref={imgRef}\n alt=\"image\"\n className=\"block w-auto max-w-none object-contain\"\n style={{\n transition: 'height 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' && {\n height: `calc(${scale * 100}% - 20px)`,\n }),\n }}\n onLoad={() => {\n if (imgRef.current && containerRef.current) {\n const width = imgRef.current.width;\n const height = imgRef.current.height;\n\n const scaleBy = width < height ? 'height' : 'width';\n\n setScaleBy(scaleBy);\n }\n }}\n />\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nexport const AudioDriver = ({ url }: { url: string }) => (\n <div className=\"flex flex-col justify-center items-center w-full h-full p-5.5\">\n <audio controls src={url} className=\"w-full\" />\n </div>\n);\n","import React, { useState, useEffect } from 'react';\n\ninterface PdfDriverProps {\n url: string;\n}\n\n// Client-only PDF driver that only loads on the client side\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\n const loadPdfDriver = 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\n loadPdfDriver();\n }, [isClient]);\n\n // Server-side rendering fallback\n if (!isClient) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-gray-500\">Loading PDF viewer...</div>\n </div>\n );\n }\n\n // Loading state\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-gray-500\">Loading PDF viewer...</div>\n </div>\n );\n }\n\n // Error state\n if (error || !PdfDriverComponent) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error || 'PDF viewer unavailable'}</p>\n </div>\n </div>\n );\n }\n\n // Render the actual PDF driver\n return <PdfDriverComponent url={url} />;\n};\n","import React from 'react';\n\nexport const DownloadDriver = ({ url, extension }: { url: string; extension: string }) => (\n <a href={url} download={`file.${extension}`} className=\"text-blue-500 underline\">\n Download {extension.toUpperCase()} file\n </a>\n);\n","import React, { useEffect, useState, useRef } from 'react';\nimport { renderAsync } from 'docx-preview';\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 containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const renderDocument = async () => {\n if (!containerRef.current) return;\n\n try {\n setLoading(true);\n setError(null);\n\n if (!blob && url) {\n const response = await fetch(url);\n blob = await response.blob();\n }\n if (!blob) {\n setError('Не надано для DOCX файлу');\n return;\n }\n\n // Перевірка розміру\n const sizeMB = blob.size / (1024 * 1024);\n if (sizeMB > MAX_SIZE_MB) {\n setError(`Файл занадто великий (> ${MAX_SIZE_MB} МБ)`);\n return;\n }\n\n // Очищуємо контейнер перед рендерингом\n containerRef.current.innerHTML = '';\n\n // Таймаут для рендерингу\n const renderPromise = renderAsync(blob, containerRef.current, undefined, {\n debug: true,\n experimental: true,\n hideWrapperOnPrint: true,\n });\n\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Рендеринг DOCX зайняв надто багато часу')), TIMEOUT_MS)\n );\n\n await Promise.race([renderPromise, timeoutPromise]);\n setLoading(false);\n } catch (err: any) {\n setError(err?.message || 'Не вдалося відкрити DOCX файл');\n setLoading(false);\n }\n };\n\n renderDocument();\n }, [url, blob]);\n\n return (\n <>\n {!!error && !loading && <div className=\"text-red-500 p-5\">{error}</div>}\n {loading && <div className=\"flex items-center justify-center p-5\">Завантаження...</div>}\n <div ref={containerRef} className=\"w-full h-full overflow-auto\"></div>\n </>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { darcula } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport { SupportedFileExtension } from '../types';\n\ntype TextDriverProps = {\n url: string;\n extension: SupportedFileExtension;\n};\n\n// Функція для визначення мови підсвічування синтаксису за розширенням файлу\nconst getLanguageFromExtension = (extension: string): string => {\n const languageMap: Record<string, string> = {\n js: 'javascript',\n jsx: 'jsx',\n ts: 'typescript',\n tsx: 'tsx',\n json: 'json',\n html: 'html',\n css: 'css',\n scss: 'scss',\n py: 'python',\n java: 'java',\n cpp: 'cpp',\n c: 'c',\n cs: 'csharp',\n php: 'php',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n swift: 'swift',\n kt: 'kotlin',\n xml: 'xml',\n yaml: 'yaml',\n yml: 'yaml',\n md: 'markdown',\n sql: 'sql',\n sh: 'bash',\n bash: 'bash',\n txt: 'text',\n };\n\n return languageMap[extension] || 'text';\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\n useEffect(() => {\n const loadTextContent = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load file: ${response.statusText}`);\n }\n\n const text = await response.text();\n setContent(text);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load text content');\n } finally {\n setLoading(false);\n }\n };\n\n loadTextContent();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-gray-500\">Loading text content...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-red-500\">Error: {error}</div>\n </div>\n );\n }\n\n const language = getLanguageFromExtension(extension);\n const shouldHighlight = language !== 'text';\n\n return (\n <div className=\"h-full w-full overflow-auto\">\n {shouldHighlight ? (\n <SyntaxHighlighter\n className=\"min-h-full! m-0! py-0!\"\n language={language}\n style={darcula}\n showLineNumbers\n wrapLines\n >\n {content}\n </SyntaxHighlighter>\n ) : (\n <pre className=\"whitespace-pre-wrap p-4 text-sm font-mono bg-gray-50 min-h-full\">{content}</pre>\n )}\n </div>\n );\n};\n","export const VideoDriver = ({ url }: { url: string }) => {\n return (\n <div className=\"flex flex-col justify-center items-center w-full h-full\">\n <video controls src={url} className=\"w-full max-h-full\" />\n </div>\n );\n};\n","import { memo } from 'react';\n\nimport { SupportedFileExtension } from './types';\nimport { ImageDriver } from './drivers/ImageDriver';\nimport { AudioDriver } from './drivers/AudioDriver';\nimport { PdfDriver } from './drivers/PdfDriver';\nimport { DownloadDriver } from './drivers/DownloadDriver';\nimport { DocxDriver } from './drivers/DocxDriver';\nimport { TextDriver } from './drivers/TextDriver';\nimport { VideoDriver } from './drivers/VideoDriver';\nimport { Box, 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 console.log('Driver props:', { extension, blob, path, buffer });\n const normalizedExtension = extension.toLocaleLowerCase().trim() as SupportedFileExtension;\n\n let url;\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\n if (['mp3', 'wav', 'ogg', 'flac'].includes(normalizedExtension)) {\n return <AudioDriver url={url} />;\n }\n\n if (['mp4', 'webm'].includes(normalizedExtension)) {\n return <VideoDriver url={url} />;\n }\n\n if (extension === 'pdf') {\n return <PdfDriver url={url} />;\n }\n if (['xlsx', 'pptx'].includes(normalizedExtension)) {\n return <DownloadDriver url={url} extension={normalizedExtension} />;\n }\n // Текстові файли та файли з кодом\n if (\n [\n 'txt',\n 'js',\n 'jsx',\n 'ts',\n 'tsx',\n 'json',\n 'html',\n 'css',\n 'scss',\n 'py',\n 'java',\n 'cpp',\n 'c',\n 'cs',\n 'php',\n 'rb',\n 'go',\n 'rs',\n 'swift',\n 'kt',\n 'xml',\n 'yaml',\n 'yml',\n 'md',\n 'sql',\n 'sh',\n 'bash',\n ].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 <div className=\"h-full flex flex-col justify-center items-center\">\n <Box className=\"mx-5\">\n <Typography variant=\"h2\" color=\"text.light\" weight={500} className=\"text-center\">\n {not_supported_message}\n </Typography>\n </Box>\n </div>\n );\n});\n","import { 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 <div className=\"h-full w-full\">\n <Driver {...props} />\n </div>\n );\n};\n","import { useState, useEffect, ReactNode, useRef } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport { Typography, TypographyProps } from '../Core/Typography';\nimport remarkGfm from 'remark-gfm';\n\ntype TypewriterProps = {\n text: string;\n speed?: number;\n onDone?: () => void;\n className?: string;\n markdown?: boolean;\n markdownComponents?: Record<string, React.ComponentType<any>>;\n} & Omit<TypographyProps, 'children'>;\n\ninterface MarkdownComponentProps {\n children?: ReactNode;\n [key: string]: any;\n}\n\nconst MAX_TEXT_LENGTH_WITH_SLOW_SPEED = 250;\n\nexport const Typewriter = ({\n text,\n speed = 50,\n onDone,\n markdown = false,\n markdownComponents = {},\n className,\n ...props\n}: TypewriterProps) => {\n const [displayed, setDisplayed] = useState('');\n const startTime = useRef<number | null>(null);\n const rafId = useRef<number | null>(null);\n\n useEffect(() => {\n let done = false;\n if (speed > 0) {\n setDisplayed(''); // Reset displayed text when text changes\n startTime.current = performance.now();\n const tick = (now: number) => {\n if (done || !startTime.current) return;\n\n const elapsed = now - startTime.current;\n const currentSpeed = elapsed / speed > MAX_TEXT_LENGTH_WITH_SLOW_SPEED ? speed / 2 : speed;\n const chartsMultiply = elapsed / speed > MAX_TEXT_LENGTH_WITH_SLOW_SPEED ? 1.5 : 1;\n const charsToShow = Math.floor((elapsed / currentSpeed) * chartsMultiply);\n\n if (charsToShow >= text.length) {\n setDisplayed(text);\n done = true;\n onDone?.();\n return;\n }\n\n setDisplayed(text.slice(0, charsToShow));\n rafId.current = requestAnimationFrame(tick);\n };\n rafId.current = requestAnimationFrame(tick);\n } else {\n setDisplayed(text);\n onDone?.();\n }\n\n return () => {\n if (rafId.current) cancelAnimationFrame(rafId.current);\n };\n }, [text, speed, onDone]);\n\n if (markdown) {\n return (\n <div className={className}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={markdownComponents} {...props}>\n {displayed}\n </ReactMarkdown>\n </div>\n );\n }\n\n return (\n <Typography className={className} {...props}>\n {displayed}\n </Typography>\n );\n};\n","import copy from 'copy-to-clipboard';\nimport { ReactNode, useEffect, useRef, useState } from 'react';\nimport { Tooltip } from '../Core';\n\ntype CopyToClipboardProps = {\n text: string;\n children: (params: CopyToClipboardParams) => ReactNode;\n format?: 'text/html' | 'text/plain';\n tooltip?: {\n timeout?: number;\n message?: ReactNode;\n };\n};\n\ntype CopyToClipboardParams = {\n copy: () => Promise<void>;\n};\n\nconst DEFAULT_TOOLTIP_OPTIONS = {\n timeout: 2000,\n message: 'Copied!',\n};\n\nexport const CopyToClipboard = ({ text, children, format = 'text/plain', tooltip }: CopyToClipboardProps) => {\n const [copied, setCopied] = useState(false);\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n const tooltipOptions = { ...DEFAULT_TOOLTIP_OPTIONS, ...tooltip };\n\n const handleCopy = async () => {\n if ('clipboard' in navigator) {\n await navigator.clipboard.writeText(text);\n } else {\n copy(text, { format });\n }\n setCopied(true);\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => setCopied(false), tooltipOptions.timeout);\n };\n\n useEffect(() => {\n return () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n };\n }, []);\n\n return (\n <Tooltip\n onMouseLeave={() => setCopied(false)}\n className={copied ? 'visible' : 'hidden'}\n content={tooltipOptions.message}\n >\n {children({ copy: handleCopy })}\n </Tooltip>\n );\n};\n","import {\n differenceInDays,\n format,\n getMonth,\n getWeeksInMonth,\n getYear,\n isValid,\n parse,\n previousMonday,\n startOfMonth,\n startOfWeek,\n} from 'date-fns';\nimport { MouseEventHandler, useCallback, useMemo, useState } from 'react';\nimport { BaseInputProps, Box, Button, ChevronLeftIcon, ChevronRightIcon, Input, Select } from '../Core';\nimport { Popover } from 'react-tiny-popover';\nimport { useTheme } from '../Theme';\n\ninterface DatePickerBaseProps {\n minDate?: Date;\n maxDate?: Date;\n format?: string;\n inline?: boolean;\n disabled?: boolean;\n placeholder?: string;\n inputProps?: BaseInputProps;\n}\n\ninterface DatePickerRangeProps {\n range: true;\n value?: [string, string];\n onChange?: (date: [string, string]) => void;\n}\n\ninterface DatePickerSingleProps {\n range?: false;\n value?: string;\n onChange?: (date: string) => void;\n}\n\ntype DatePickerProps = DatePickerBaseProps & (DatePickerRangeProps | DatePickerSingleProps);\n\nconst getInitValue = (value?: string | [string | undefined, string | undefined]) => {\n return new Date(value ? (Array.isArray(value) ? value[1] || value[0] || new Date() : value) : new Date());\n};\n\nconst parseDate = (value: string | undefined, formatStr: string) => {\n let parsedDate: Date | undefined;\n\n if (formatStr) {\n const d = parse(value || '', formatStr, new Date());\n if (isValid(d) && getYear(d) >= 1970) return d;\n }\n const date = new Date(value || '');\n if (!isNaN(date.getTime())) {\n return date;\n }\n\n return parsedDate;\n};\n\nconst renderDate = (value: string | undefined, formatStr: string) => {\n const date = value ? parseDate(value, formatStr) : undefined;\n\n return date && formatStr ? format(date, formatStr) : value;\n};\n\nexport const DatePicker = ({\n value,\n range,\n inline = false,\n minDate = new Date(getYear(new Date()) - 5, 0, 1),\n maxDate = new Date(getYear(new Date()) + 5, 11, 31),\n format: formatStr = 'dd.MM.yyyy',\n onChange,\n ...props\n}: DatePickerProps) => {\n const [month, setMonth] = useState(getMonth(getInitValue(value)));\n const [year, setYear] = useState(getYear(getInitValue(value)));\n\n const selectedDate = useMemo<Date | [Date | undefined, Date | undefined] | undefined>(() => {\n if (!value) return undefined;\n if (Array.isArray(value)) {\n const startDate = parseDate(value[0], formatStr);\n const endDate = parseDate(value[1], formatStr);\n\n return [startDate, endDate];\n }\n\n return parseDate(value, formatStr);\n }, [value]);\n\n const handleSelectDate = useCallback(\n (date: Date) => {\n if (range) {\n const hasStart = Boolean(selectedDate && Array.isArray(selectedDate) && !!selectedDate[0]);\n const hasEnd = Boolean(selectedDate && Array.isArray(selectedDate) && !!selectedDate[1]);\n\n if (!hasStart || (hasStart && hasEnd)) {\n onChange?.([date.toString(), '']);\n } else if (hasStart && !hasEnd) {\n if (date < (selectedDate as [Date, Date])[0]) {\n onChange?.([date.toString(), (selectedDate as [Date, Date])[0].toString()]);\n } else {\n onChange?.([(selectedDate as [Date, Date])[0].toString(), date.toString()]);\n }\n }\n } else {\n onChange?.(date.toString());\n }\n },\n [range, selectedDate, onChange]\n );\n\n if (!inline) {\n if (range) {\n return <DatePickerGroupInput range={true} value={value} onChange={onChange} {...props} />;\n } else {\n return (\n <DatePickerInput\n value={value}\n onChange={onChange}\n minDate={minDate}\n maxDate={maxDate}\n month={month}\n year={year}\n selectedDate={selectedDate}\n onChangeMonth={setMonth}\n onChangeYear={setYear}\n onSelectDate={handleSelectDate}\n formatStr={formatStr}\n {...props}\n />\n );\n }\n }\n\n return (\n <DatePickerCalendar\n month={month}\n year={year}\n minDate={minDate}\n maxDate={maxDate}\n selectedDate={selectedDate}\n onSelectDate={handleSelectDate}\n onChangeMonth={setMonth}\n onChangeYear={setYear}\n />\n );\n};\n\nconst DatePickerGroupInput = ({\n minDate,\n maxDate,\n value,\n onChange,\n}: DatePickerRangeProps & Omit<DatePickerBaseProps, 'inline'>) => {\n //TODO input range\n return null;\n};\n\ntype DatePickerInputProps = {\n month: number;\n year: number;\n selectedDate: Date | [Date | undefined, Date | undefined] | undefined;\n minDate: Date;\n maxDate: Date;\n formatStr: string;\n onChangeMonth: (month: number) => void;\n onChangeYear: (year: number) => void;\n onSelectDate: (date: Date) => void;\n};\n\nconst DatePickerInput = ({\n placeholder,\n value,\n onChange,\n inputProps,\n ...props\n}: DatePickerInputProps &\n DatePickerSingleProps &\n Omit<DatePickerBaseProps, 'inline' | 'minDate' | 'maxDate' | 'format'>) => {\n const [isOpen, setIsOpen] = useState(false);\n const theme = useTheme();\n return (\n <Popover\n positions={['bottom', 'top', 'right', 'left']}\n align=\"start\"\n isOpen={isOpen}\n onClickOutside={() => setIsOpen(false)}\n content={\n <Box>\n <DatePickerCalendar {...props} />\n </Box>\n }\n containerStyle={{\n zIndex: `${theme.zIndex.popover}`,\n }}\n >\n <div onClick={() => setIsOpen(true)}>\n <Input\n {...inputProps}\n placeholder={placeholder}\n value={renderDate(value, props.formatStr)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value)}\n />\n </div>\n </Popover>\n );\n};\n\ninterface DatePickerCalendarProps {\n month: number;\n year: number;\n selectedDate?: Date | [Date | undefined, Date | undefined];\n minDate: Date;\n maxDate: Date;\n onSelectDate: (date: Date) => void;\n onChangeMonth: (month: number) => void;\n onChangeYear: (year: number) => void;\n}\n\nexport const DatePickerCalendar = ({\n month,\n year,\n selectedDate,\n minDate,\n maxDate,\n onSelectDate,\n onChangeMonth,\n onChangeYear,\n}: DatePickerCalendarProps) => {\n const monthOptions = useMemo(() => {\n return new Array(12).fill(null).map((_, i) => {\n const month = new Date(0, i);\n return { value: i + 1, inputDisplay: format(month, 'MMMM') };\n });\n }, []);\n\n const yearOptions = useMemo(() => {\n const minYear = getYear(minDate);\n const maxYear = getYear(maxDate);\n\n const yearsCount = maxYear - minYear + 1;\n return new Array(yearsCount).fill(null).map((_, i) => {\n const year = minYear + i;\n return { value: year, inputDisplay: year.toString() };\n });\n }, [minDate, maxDate]);\n\n const daysInWeek = useMemo(\n () =>\n new Array(7).fill(null).map((_, i) => {\n const day = startOfWeek(new Date(), {\n weekStartsOn: i as 0 | 1 | 2 | 3 | 4 | 5 | 6,\n });\n return format(day, 'EEE');\n }),\n []\n );\n\n const days = useMemo<Array<Date>>(() => {\n const weekInMonth = getWeeksInMonth(new Date(year, month));\n const firstDayOfMonth = startOfMonth(new Date(year, month));\n const firstMonday = previousMonday(firstDayOfMonth);\n const diffInDays = differenceInDays(firstDayOfMonth, firstMonday);\n return new Array(weekInMonth * 7).fill(null).map((_, i) => {\n return new Date(year, month, i - diffInDays + 1);\n });\n }, [month, year]);\n\n const handlePrevMonth = useCallback(() => {\n if (month === 0) {\n onChangeYear(year - 1);\n onChangeMonth(11);\n } else {\n onChangeMonth(month - 1);\n }\n }, [month, year]);\n\n const handleNextMonth = useCallback(() => {\n if (month === 11) {\n onChangeYear(year + 1);\n onChangeMonth(0);\n } else {\n onChangeMonth(month + 1);\n }\n }, [month, year]);\n\n const hasPrevMonth = useMemo(() => {\n if (!minDate) return true;\n if (year < getYear(minDate)) return false;\n if (year === getYear(minDate) && month <= getMonth(minDate)) return false;\n return true;\n }, [month, year, minDate]);\n\n const hasNextMonth = useMemo(() => {\n if (!maxDate) return true;\n if (year > getYear(maxDate)) return false;\n if (year === getYear(maxDate) && month >= getMonth(maxDate)) return false;\n return true;\n }, [month, year, maxDate]);\n\n const handleCLick: MouseEventHandler<HTMLDivElement> = useCallback((e) => {\n e.stopPropagation();\n }, []);\n\n return (\n <div className=\"flex flex-col date-picker-calendar\" onClick={handleCLick}>\n <div className=\"flex justify-center items-center gap-2 pb-3\">\n {hasPrevMonth && <Button size=\"small\" variant=\"empty\" icon={<ChevronLeftIcon />} onClick={handlePrevMonth} />}\n <div className=\"flex-1 flex justify-center gap-1\">\n <Select\n placeholder=\"\"\n hasBorder={false}\n selected={month + 1}\n options={monthOptions}\n onSelect={(value) => onChangeMonth(value - 1)}\n maxWidth={150}\n maxHeight={300}\n />\n <Select\n placeholder=\"\"\n hasBorder={false}\n selected={year}\n options={yearOptions}\n onSelect={(value) => onChangeYear(value)}\n maxWidth={100}\n maxHeight={300}\n />\n </div>\n {hasNextMonth && <Button size=\"small\" variant=\"empty\" icon={<ChevronRightIcon />} onClick={handleNextMonth} />}\n </div>\n <div className=\"grid grid-cols-7 gap-2\">\n {daysInWeek.map((day) => (\n <div key={day} className=\"text-center\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-2 mt-2\">\n {days.map((date) => {\n const isCurrentMonth = getMonth(date) === month;\n const isCurrentDay = format(date, 'yyyy-MM-dd') === format(new Date(), 'yyyy-MM-dd');\n const isSelected =\n selectedDate &&\n ((Array.isArray(selectedDate) &&\n ((selectedDate[0] && format(date, 'yyyy-MM-dd') === format(selectedDate[0], 'yyyy-MM-dd')) ||\n (selectedDate[1] && format(date, 'yyyy-MM-dd') === format(selectedDate[1], 'yyyy-MM-dd')))) ||\n (!Array.isArray(selectedDate) && format(date, 'yyyy-MM-dd') === format(selectedDate, 'yyyy-MM-dd')));\n const isInRange =\n selectedDate &&\n Array.isArray(selectedDate) &&\n selectedDate[0] &&\n selectedDate[1] &&\n date > selectedDate[0] &&\n date < selectedDate[1];\n const isDisabled =\n (minDate && differenceInDays(date, minDate) < 0) ||\n (maxDate && differenceInDays(date, maxDate) > 0) ||\n !isCurrentMonth;\n\n return (\n <CalendarDay\n key={date.toISOString()}\n date={date}\n isCurrentMonth={isCurrentMonth}\n isCurrentDay={isCurrentDay}\n isSelected={!!isSelected}\n isInRange={!!isInRange}\n isDisabled={!!isDisabled}\n onSelectDate={onSelectDate}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\ninterface CalendarDayProps {\n date: Date;\n isCurrentMonth: boolean;\n isCurrentDay: boolean;\n isSelected: boolean;\n isInRange: boolean;\n isDisabled: boolean;\n onSelectDate: (date: Date) => void;\n}\n\nconst CalendarDay = ({\n date,\n isCurrentMonth,\n isCurrentDay,\n isSelected,\n isInRange,\n isDisabled,\n onSelectDate,\n}: CalendarDayProps) => {\n const handleClick: MouseEventHandler<HTMLDivElement> = (e) => {\n if (!isDisabled) {\n onSelectDate(date);\n }\n };\n\n return (\n <div\n className={`text-center p-2 cursor-pointer rounded ${\n isDisabled\n ? 'text-gray-400 cursor-not-allowed'\n : isSelected\n ? 'bg-blue-500 text-white'\n : isInRange\n ? 'bg-blue-100'\n : isCurrentDay\n ? 'text-blue-500'\n : isCurrentMonth\n ? 'text-black'\n : 'text-gray-400'\n } ${isDisabled ? '' : isSelected ? 'hover:bg-blue-600' : 'hover:bg-gray-100'}`}\n onClick={handleClick}\n >\n {format(date, 'd')}\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { ColorToastVariant, Toast as ToastT } from './types';\nimport { set } from 'date-fns';\n\ninterface ToastProps extends ToastT {\n transitionDirection: 'top' | 'bottom';\n onClose: (id: string) => void;\n}\n\nconst getColorStyle = (color: ColorToastVariant) => {\n switch (color) {\n case 'primary':\n return 'bg-blue-100 border-blue-200 dark:bg-blue-800/10 dark:border-blue-900';\n case 'error':\n return 'bg-red-100 border-red-200 dark:bg-red-800/10 dark:border-red-900';\n case 'warning':\n return 'bg-yellow-100 border-yellow-200 dark:bg-yellow-800/10 dark:border-yellow-900';\n case 'success':\n return 'bg-teal-100 border-teal-200 dark:bg-teal-800/10 dark:border-teal-900';\n case 'default':\n default:\n return 'bg-white border border-gray-200 dark:bg-neutral-800 dark:border-neutral-700';\n }\n};\n\nconst getTextColor = (color: ColorToastVariant) => {\n switch (color) {\n case 'primary':\n return 'text-blue-800 dark:text-blue-500';\n case 'error':\n return 'text-red-800 dark:text-red-500';\n case 'warning':\n return 'text-yellow-800 dark:text-yellow-500';\n case 'success':\n return 'text-teal-800 dark:text-teal-500';\n case 'default':\n default:\n return 'text-gray-800 dark:text-white';\n }\n};\n\nconst getTransitionStarting = (direction: 'top' | 'bottom') => {\n switch (direction) {\n case 'bottom':\n return 'translate-y-4';\n case 'top':\n default:\n return '-translate-y-4';\n }\n};\n\nexport const Toast = ({\n id,\n color = 'default',\n message,\n duration,\n transitionDirection,\n cancelable = true,\n onClose,\n}: ToastProps) => {\n const [isClosing, setIsClosing] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const timeoutClosingRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n timeoutClosingRef.current = setTimeout(() => {\n onClose(id);\n }, 300);\n }, [id, onClose]);\n\n useEffect(() => {\n setIsVisible(true);\n if (duration && duration < Infinity) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, handleClose]);\n\n useEffect(() => {\n return () => {\n if (timeoutClosingRef.current) {\n clearTimeout(timeoutClosingRef.current);\n }\n };\n }, []);\n\n return (\n <div\n className={`max-w-xs\n border\n w-full\n text-sm\n rounded-lg\n transition-all\n ease-in-out\n duration-300\n ${isClosing || !isVisible ? 'opacity-0' : 'opacity-100'}\n ${isVisible ? 'translate-y-0' : getTransitionStarting(transitionDirection)}\n ${getColorStyle(color)} ${getTextColor(color)}`}\n >\n <div className=\"flex p-4 \">\n {message}\n {cancelable && (\n <div className=\"ms-auto\">\n <button\n type=\"button\"\n className=\"inline-flex shrink-0 justify-center items-center size-5 rounded-lg opacity-50 hover:opacity-100 focus:outline-hidden focus:opacity-100 cursor-pointer\"\n aria-label=\"Close\"\n onClick={handleClose}\n >\n <svg\n className=\"shrink-0 size-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </button>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useMemo, useRef } from 'react';\nimport { Toast as ToastT } from './types';\nimport { Toast } from './Toast';\n\ntype Position = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\n\ninterface ToastsListProps {\n position?: Position;\n offset?: number;\n items: ToastT[];\n onClose: (id: string) => void;\n}\n\nconst getPosition = (position: Position, offset: number) => {\n switch (position) {\n case 'top-right':\n return `top-${offset} right-${offset}`;\n case 'top-left':\n return `top-${offset} left-${offset}`;\n case 'bottom-right':\n return `bottom-${offset} right-${offset}`;\n case 'bottom-left':\n return `bottom-${offset} left-${offset}`;\n default:\n return `top-${offset} right-${offset}`;\n }\n};\n\nexport const ToastsList = ({ items, onClose, position = 'top-right', offset = 4 }: ToastsListProps) => {\n const transitionDirection = useMemo(() => {\n return position.startsWith('top') ? 'top' : 'bottom';\n }, [position]);\n\n return (\n <div className={`fixed flex min-w-0 max-w-xs w-full flex-col z-50 gap-2 ${getPosition(position, offset)}`}>\n {items.map((toast) => (\n <Toast transitionDirection={transitionDirection} key={toast.id} {...toast} onClose={onClose} />\n ))}\n </div>\n );\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/Graph2D/GraphLoader.tsx","../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","../src/Typewriter/Typewriter.tsx","../src/CopyToClipboard/CopyToClipboard.tsx","../src/DatePicker/DatePicker.tsx","../src/Toasts/Toast.tsx","../src/Toasts/ToastsList.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","LoaderWrapper","GraphLoader","width","height","useTheme","jsxs","ContentLoader","GraphLoader_default","RATIO","prepareButtonImages","buttons","button","normalImg","hoverImg","config","Graph2D","forwardRef","loading","graphData","onNodeClick","onBackgroundClick","onNodeHover","onLinkHover","onLinkClick","ref","isRendering","setIsRendering","useState","stateRef","useRef","nodes","links","useMemo","cloneDeep","buttonImages","setButtonImages","canvasRef","simulationRef","ctx2dRef","color","scaleOrdinal","schemeCategory10","init2DCanvas","useCallback","ctx","getNodes","getLinks","linkForce","renderGrid","canvasWidth","canvasHeight","gridSpacing","dotSize","x","y","truncateText","text","truncated","ellipsis","calculateFontSize","scale","fontSizeRatio","renderLinks","link","source","n","target","start","end","dx","dy","distance","unitDx","unitDy","sourceRadius","targetRadius","arrowHeadLength","adjustedStart","adjustedEnd","adjusteArrowdEnd","isHighlighted","lineColor","lineWidth","middleX","middleY","angle","globalScale","scaledFontSize","textWidth","padding","beforeTextDistance","pointBeforeText","afterTextDistance","pointAfterText","arrowHeadWidth","drawIconWithOptionalCounter","icon","iconX","iconY","iconSize","counter","textColor","fontSize","counterText","spacing","offsetX","error","renderNodeButtons","node","buttonRadius","buttonCount","sectorAngle","i","startAngle","endAngle","isHovered","midAngle","iconDistance","buttonImage","spinnerRadius","dotRadius","j","alpha","dotX","dotY","hexToRgba","renderCanvas2D","renderNodes","nodeColor","fontColor","label","isSelected","size","radius","ringRadius","truncatedLabel","addNodes","newNodes","newLinks","options","smoothAppearance","transitionDuration","existingNodeIds","filteredNewNodes","existingLinkIds","filteredNewLinks","linkId","updatedNodes","updatedLinks","connectedLinks","sourceId","targetId","someLink","connectedNodeId","connectedNode","randomOffset","randomAngle","centerX","centerY","removeNodes","nodeIds","nodeIdsToRemove","remainingNodes","remainingLinks","zoomToFit","duration","minX","minY","maxX","maxY","contentWidth","contentHeight","scaleX","scaleY","newTransform","startTransform","startTime","animateZoom","t","easedT","interpolatedTransform","getNodeAtPosition","nodeRadius","pixelRatio","scaledX","scaledY","getLinkAtPosition","threshold","sourceX","sourceY","targetX","targetY","A","B","C","D","dot","lenSq","param","xx","yy","isPointInButtonSector","mouseX","mouseY","nodeX","nodeY","isInRadius","isInAngle","handleNodeHover","newHighlightNodes","newHighlightLinks","neighbor","handleLinkHover","handleLinkClick","handleNodeClick","handleBackgroundClick","handleMouseDown","event","rect","getHoveredIndex","hoveredIndex","canvasScaleX","canvasScaleY","scaledMouseX","scaledMouseY","worldX","worldY","handleMouseMove","startX","startY","shouldRender","hoveredNode","hoveredLink","shouldRenderLink","handleClick","handleMouseUp","wasDragging","isButtonClick","clickedLink","alphaValue","alphaDecayValue","velocityDecayValue","handleWheel","scaleFactor","currentTransform","newScale","newK","newX","newY","convertTouchToMouseEvent","callback","touch","syntheticEvent","handleTouchStart","handleTouchEnd","handleTouchMove","useImperativeHandle","useEffect","canvasElement","nodeSize","linkDistance","simulation","forceSimulation","forceLink","d","forceManyBody","forceX","forceY","forceCenter","forceCollide","useLayoutEffect","canvas","Wrapper","Canvas","FullscreenCard","isActive","position","left","right","bottom","$isActive","$left","$right","$bottom","$position","ImageDriver","url","setScale","scaleBy","setScaleBy","imgRef","React","containerRef","handleZoomIn","prev","Button","MinusIcon","Box","PlusIcon","AudioDriver","PdfDriverWrapper","PdfDriverComponent","setPdfDriverComponent","isClient","setIsClient","setLoading","setError","module","err","MAX_SIZE_MB","TIMEOUT_MS","DocxDriver","blob","renderPromise","renderAsync","timeoutPromise","_","reject","Fragment","getLanguageFromExtension","extension","TextDriver","content","setContent","response","language","SyntaxHighlighter","darcula","VideoDriver","Driver","memo","path","buffer","not_supported_message","normalizedExtension","Typography","FileViewer","MAX_TEXT_LENGTH_WITH_SLOW_SPEED","Typewriter","speed","onDone","markdown","markdownComponents","displayed","setDisplayed","rafId","done","tick","now","elapsed","currentSpeed","chartsMultiply","charsToShow","ReactMarkdown","remarkGfm","DEFAULT_TOOLTIP_OPTIONS","CopyToClipboard","format","tooltip","copied","setCopied","timeoutId","tooltipOptions","handleCopy","copy","Tooltip","getInitValue","value","parseDate","formatStr","parsedDate","parse","isValid","getYear","date","renderDate","DatePicker","range","inline","minDate","maxDate","onChange","month","setMonth","getMonth","year","setYear","selectedDate","startDate","endDate","handleSelectDate","hasStart","hasEnd","DatePickerCalendar","DatePickerGroupInput","DatePickerInput","placeholder","inputProps","isOpen","setIsOpen","Popover","Input","onSelectDate","onChangeMonth","onChangeYear","monthOptions","yearOptions","minYear","yearsCount","daysInWeek","day","startOfWeek","days","weekInMonth","getWeeksInMonth","firstDayOfMonth","startOfMonth","firstMonday","previousMonday","diffInDays","differenceInDays","handlePrevMonth","handleNextMonth","hasPrevMonth","hasNextMonth","handleCLick","ChevronLeftIcon","Select","ChevronRightIcon","isCurrentMonth","isCurrentDay","isInRange","isDisabled","CalendarDay","getColorStyle","getTextColor","getTransitionStarting","direction","Toast","id","message","transitionDirection","cancelable","onClose","isClosing","setIsClosing","isVisible","setIsVisible","timeoutClosingRef","handleClose","timer","getPosition","offset","ToastsList","items","toast"],"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 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 // Helper function to create a rect from line coordinates\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","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';\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 const normalImg = new Image();\n normalImg.src = button.img;\n\n const hoverImg = new Image();\n hoverImg.src = button.hoverImg;\n\n return {\n ...button,\n normalImg,\n hoverImg,\n };\n });\n}\n\n// Конфігурація подібна до Graph2D\nconst config = {\n fontSize: 3,\n nodeSizeBase: 30,\n nodeAreaFactor: 2,\n textPaddingFactor: 0.9,\n gridSpacing: 20,\n dotSize: 1,\n maxZoom: 4,\n};\n\nexport const Graph2D: any = forwardRef<Graph2DRef, Graph2DProps>(\n (\n {\n loading,\n width,\n height,\n graphData,\n buttons = [],\n onNodeClick,\n onBackgroundClick,\n onNodeHover,\n onLinkHover,\n onLinkClick,\n },\n ref\n ) => {\n const theme = useTheme();\n const [isRendering, setIsRendering] = useState(true);\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 selectedNode: null,\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 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 [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 = config.nodeSizeBase / 2;\n const targetRadius = config.nodeSizeBase / 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 : theme.graph2D.link.normal;\n const lineWidth = isHighlighted ? 1.5 : 0.5;\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 = 2;\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(-arrowHeadLength, arrowHeadWidth);\n ctx.lineTo(-arrowHeadLength, 0);\n ctx.lineTo(-arrowHeadLength, -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 buttonRadius = (config.nodeSizeBase * 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 - config.nodeSizeBase / 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 if (buttonImage.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 ? buttonImage.hoverImg : buttonImage.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 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 isHighlighted =\n stateRef.current.highlightNodes.has(node) ||\n node === stateRef.current.hoveredNode ||\n node === stateRef.current.draggedNode;\n const isSelected = node === stateRef.current.selectedNode;\n\n // Розмір та позиція вузла\n const size = config.nodeSizeBase;\n const radius = isSelected ? config.nodeSizeBase / 2 : config.nodeSizeBase / 2;\n\n // Якщо вузол виділено, малюємо кільце підсвічування\n if (isHighlighted && !isSelected) {\n const ringRadius = (config.nodeSizeBase * config.nodeAreaFactor * 0.75) / 2;\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.highlightFill;\n ctx.fill();\n }\n\n // Якщо вузол обрано, малюємо кільце вибору та кнопки\n if (isSelected) {\n // Малюємо кнопки навколо обраного вузла, якщо кнопки доступні\n if (buttons && buttons.length > 0) {\n renderNodeButtons(node, ctx);\n } else {\n const ringRadius = (config.nodeSizeBase * config.nodeAreaFactor) / 2;\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 || theme.graph2D.ring.highlightFill;\n ctx.fill();\n }\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 rendering for everything\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 }, [renderLinks, renderNodes, renderGrid]);\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 ) => {\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 },\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 if (\n stateRef.current.selectedNode &&\n stateRef.current.selectedNode.id !== undefined &&\n nodeIdsToRemove.has(stateRef.current.selectedNode.id)\n ) {\n stateRef.current.selectedNode = null;\n }\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 stateRef.current.highlightNodes = new Set<NodeObject>();\n stateRef.current.highlightLinks = new Set<any>();\n }\n\n // Clear hoveredLink if it involves removed nodes\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 stateRef.current.highlightNodes = new Set<NodeObject>();\n stateRef.current.highlightLinks = new Set<any>();\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 // Спочатку очищаємо існуючі відносини\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 // Просто перемальовуємо canvas з новими даними\n renderCanvas2D();\n },\n [renderCanvas2D]\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 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 nodeRadius = config.nodeSizeBase / 2;\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 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 const newHighlightNodes = new Set<NodeObject>();\n const newHighlightLinks = new Set<any>();\n\n if (node) {\n newHighlightNodes.add(node);\n\n // Додаємо сусідні вузли та зв'язки до підсвічування\n if (node.neighbors) {\n node.neighbors.forEach((neighbor: any) => newHighlightNodes.add(neighbor));\n }\n\n if (node.links) {\n node.links.forEach((link: any) => newHighlightLinks.add(link));\n }\n }\n\n stateRef.current.hoveredNode = node;\n if (onNodeHover) onNodeHover(node);\n stateRef.current.highlightNodes = newHighlightNodes;\n stateRef.current.highlightLinks = newHighlightLinks;\n },\n [onNodeHover]\n );\n\n // Обробка наведення на лінк\n const handleLinkHover = useCallback(\n (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);\n stateRef.current.highlightNodes = newHighlightNodes;\n stateRef.current.highlightLinks = newHighlightLinks;\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 (node: NodeObject) => {\n stateRef.current.selectedNode = node;\n if (onNodeClick) onNodeClick(node);\n },\n [onNodeClick]\n );\n\n // Обробка кліку на фон\n const handleBackgroundClick = useCallback(() => {\n stateRef.current.selectedNode = null;\n if (onBackgroundClick) onBackgroundClick();\n }, [onBackgroundClick]); // Перетягування тепер обробляється через 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) {\n const buttonRadius = (config.nodeSizeBase * 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 // Node position\n const nodeX = stateRef.current.selectedNode?.x || 0;\n const nodeY = stateRef.current.selectedNode?.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.selectedNode && canvasRef.current && buttonImages.length > 0) {\n const hoveredIndex = getHoveredIndex(x, y);\n if (hoveredIndex !== null) hoveredNode = stateRef.current.selectedNode; // Set hoveredNode to selectedNode for further processing\n if (hoveredIndex !== stateRef.current.hoveredButtonIndex) {\n shouldRender = true; // Only render if hovered button index has changed\n }\n stateRef.current.hoveredButtonIndex = hoveredIndex;\n } else {\n if (stateRef.current.hoveredButtonIndex !== null) stateRef.current.hoveredButtonIndex = null;\n }\n\n if (!hoveredNode) {\n // If no node is hovered, check for link hover\n hoveredNode = getNodeAtPosition(x, y);\n\n // If no node is hovered, check for link hover\n if (!hoveredNode) {\n const hoveredLink = getLinkAtPosition(x, y);\n const shouldRenderLink = hoveredLink !== stateRef.current.hoveredLink;\n\n // Clear node hover state when hovering over a link\n if (hoveredLink && stateRef.current.hoveredNode) {\n handleNodeHover(null);\n }\n\n handleLinkHover(hoveredLink);\n\n // Update cursor style for links\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 // Clear link hover state when hovering over a node\n if (hoveredNode && stateRef.current.hoveredLink) {\n handleLinkHover(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 stateRef.current.hoveredButtonIndex = getHoveredIndex(x, y);\n }\n // Спочатку перевіряємо, чи ми клікаємо на кнопку обраного вузла\n let isButtonClick = false;\n if (\n stateRef.current.selectedNode &&\n stateRef.current.hoveredButtonIndex !== null &&\n buttons[stateRef.current.hoveredButtonIndex]\n ) {\n // This is a button click, trigger the button's onClick handler\n const button = buttons[stateRef.current.hoveredButtonIndex];\n if (button && button.onClick) {\n button.onClick(stateRef.current.selectedNode);\n isButtonClick = true;\n stateRef.current.hoveredButtonIndex = null;\n }\n }\n\n // If not a button click and we have a draggedNode (mouse was pressed on a node), trigger node click\n if (!isButtonClick && stateRef.current.draggedNode) {\n handleNodeClick(stateRef.current.draggedNode);\n } else if (!isButtonClick && !stateRef.current.draggedNode) {\n // Check if we clicked on a link\n const clickedLink = getLinkAtPosition(x, y);\n if (clickedLink) {\n handleLinkClick(clickedLink);\n } else {\n // If we didn't click on a node, button, or link, it's a background click\n // Only trigger background click if there was no dragging\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 // End panning if active\n if (stateRef.current.isPanning) {\n stateRef.current.isPanning = false;\n }\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 // Update transform in 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 // Create a synthetic React.MouseEvent-like object\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 addNodes,\n removeNodes,\n }),\n [zoomToFit, addNodes, removeNodes]\n );\n\n useEffect(() => {\n // Initialize canvas context\n const canvasElement = canvasRef.current;\n const { width: canvasWidth, height: canvasHeight } = stateRef.current;\n if (!canvasElement) return;\n\n // Initialize Canvas 2D context\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(nodeRadius * 2) // Радіус колізії залежно від розміру вузла\n .iterations(2) // Більше ітерацій для кращого запобігання перекриття\n .strength(1) // Збільшуємо силу запобігання колізіям\n )\n .velocityDecay(0.6)); // Коефіцієнт затухання швидкості для зменшення \"тряски\"\n\n return () => {\n // Cleanup\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 // Update node positions on each tick\n\n simulation.on('tick', () => {\n renderCanvas2D();\n });\n\n // When simulation ends, stop rendering indicator\n simulation.on('end', () => {\n // Render one last time\n\n if (isRendering) {\n zoomToFit(0, 20); // Zoom to fit after rendering\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 // Set up node relationships (neighbors and links)\n useEffect(() => {\n if (!nodes || !links) return;\n\n // Connect nodes to their neighbors and links\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 // Initialize arrays if they don't exist\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 // Initialize button images\n useEffect(() => {\n if (buttons && buttons.length > 0) {\n setButtonImages(prepareButtonImages(buttons));\n }\n }, [buttons]);\n\n // Add wheel event listener with passive: false\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof window === 'undefined') return;\n\n // Add event listener with passive: false to allow preventDefault\n canvas.addEventListener('wheel', handleWheel, { passive: false });\n canvas.addEventListener('touchend', handleTouchEnd, { passive: false });\n\n // Clean up when component unmounts\n return () => {\n canvas.removeEventListener('wheel', handleWheel);\n canvas.removeEventListener('touchend', handleTouchEnd);\n };\n }, [handleWheel, handleTouchEnd]);\n\n return (\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 );\n }\n);\n\nconst Wrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n min-width: 0;\n position: relative;\n`;\n\nconst Canvas = styled.canvas``;\n\n// Add display name for better debugging\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}\n\nexport const FullscreenCard = createComponent<FullscreenCardProps>(\n ({ isActive, position, top = 0, left = 0, right, bottom, ...props }) => {\n return (\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\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\n min-width: 0;\n `\n);\n","import React, { useState } from 'react';\nimport { Box, Button, MinusIcon, PlusIcon } from '../../Core';\n\nexport const ImageDriver = ({ url }: { url: string }) => {\n const [scale, setScale] = useState(1);\n\n const [scaleBy, setScaleBy] = useState<'width' | 'height'>();\n const imgRef = React.useRef<HTMLImageElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const handleZoomIn = () => {\n setScale((prev) => Math.min(prev + 0.25, 4));\n };\n\n const handleZoomOut = () => {\n setScale((prev) => Math.max(prev - 0.25, 0.25));\n };\n\n return (\n <div ref={containerRef} className=\"h-full w-full flex flex-col\">\n <div className=\"flex justify-center items-stretch p-5.5 gap-1 border-b border-gray-200 relative \">\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 {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 </div>\n <div className=\"h-full w-full overflow-auto flex items-center justify-center\">\n <img\n src={url}\n ref={imgRef}\n alt=\"image\"\n className=\"block w-auto max-w-none object-contain\"\n style={{\n transition: 'height 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' && {\n height: `calc(${scale * 100}% - 20px)`,\n }),\n }}\n onLoad={() => {\n if (imgRef.current && containerRef.current) {\n const width = imgRef.current.width;\n const height = imgRef.current.height;\n\n const scaleBy = width < height ? 'height' : 'width';\n\n setScaleBy(scaleBy);\n }\n }}\n />\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nexport const AudioDriver = ({ url }: { url: string }) => (\n <div className=\"flex flex-col justify-center items-center w-full h-full p-5.5\">\n <audio controls src={url} className=\"w-full\" />\n </div>\n);\n","import React, { useState, useEffect } from 'react';\n\ninterface PdfDriverProps {\n url: string;\n}\n\n// Client-only PDF driver that only loads on the client side\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\n const loadPdfDriver = 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\n loadPdfDriver();\n }, [isClient]);\n\n // Server-side rendering fallback\n if (!isClient) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-gray-500\">Loading PDF viewer...</div>\n </div>\n );\n }\n\n // Loading state\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-gray-500\">Loading PDF viewer...</div>\n </div>\n );\n }\n\n // Error state\n if (error || !PdfDriverComponent) {\n return (\n <div className=\"flex items-center justify-center h-full w-full\">\n <div className=\"text-red-500 text-center\">\n <p>{error || 'PDF viewer unavailable'}</p>\n </div>\n </div>\n );\n }\n\n // Render the actual PDF driver\n return <PdfDriverComponent url={url} />;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { renderAsync } from 'docx-preview';\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 containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const renderDocument = async () => {\n if (!containerRef.current) return;\n\n try {\n setLoading(true);\n setError(null);\n\n if (!blob && url) {\n const response = await fetch(url);\n blob = await response.blob();\n }\n if (!blob) {\n setError('Не надано для DOCX файлу');\n return;\n }\n\n // Перевірка розміру\n const sizeMB = blob.size / (1024 * 1024);\n if (sizeMB > MAX_SIZE_MB) {\n setError(`Файл занадто великий (> ${MAX_SIZE_MB} МБ)`);\n return;\n }\n\n // Очищуємо контейнер перед рендерингом\n containerRef.current.innerHTML = '';\n\n // Таймаут для рендерингу\n const renderPromise = renderAsync(blob, containerRef.current, undefined, {\n debug: true,\n experimental: true,\n hideWrapperOnPrint: true,\n });\n\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Рендеринг DOCX зайняв надто багато часу')), TIMEOUT_MS)\n );\n\n await Promise.race([renderPromise, timeoutPromise]);\n setLoading(false);\n } catch (err: any) {\n setError(err?.message || 'Не вдалося відкрити DOCX файл');\n setLoading(false);\n }\n };\n\n renderDocument();\n }, [url, blob]);\n\n return (\n <>\n {!!error && !loading && <div className=\"text-red-500 p-5\">{error}</div>}\n {loading && <div className=\"flex items-center justify-center p-5\">Завантаження...</div>}\n <div\n ref={containerRef}\n className=\"w-full h-full overflow-auto [&_table]:max-w-full! [&>div.docx-wrapper]:w-fit\"\n style={{ boxSizing: 'border-box' }}\n ></div>\n </>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { darcula } from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport { SupportedFileExtension } from '../types';\n\ntype TextDriverProps = {\n url: string;\n extension: SupportedFileExtension;\n};\n\n// Функція для визначення мови підсвічування синтаксису за розширенням файлу\nconst getLanguageFromExtension = (extension: string): string => {\n const languageMap: Record<string, string> = {\n js: 'javascript',\n jsx: 'jsx',\n ts: 'typescript',\n tsx: 'tsx',\n json: 'json',\n html: 'html',\n css: 'css',\n scss: 'scss',\n py: 'python',\n java: 'java',\n cpp: 'cpp',\n c: 'c',\n cs: 'csharp',\n php: 'php',\n rb: 'ruby',\n go: 'go',\n rs: 'rust',\n swift: 'swift',\n kt: 'kotlin',\n xml: 'xml',\n yaml: 'yaml',\n yml: 'yaml',\n md: 'markdown',\n sql: 'sql',\n sh: 'bash',\n bash: 'bash',\n txt: 'text',\n };\n\n return languageMap[extension] || 'text';\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\n useEffect(() => {\n const loadTextContent = async () => {\n try {\n setLoading(true);\n setError(null);\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load file: ${response.statusText}`);\n }\n\n const text = await response.text();\n setContent(text);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load text content');\n } finally {\n setLoading(false);\n }\n };\n\n loadTextContent();\n }, [url]);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-gray-500\">Loading text content...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex items-center justify-center p-8\">\n <div className=\"text-red-500\">Error: {error}</div>\n </div>\n );\n }\n\n const language = getLanguageFromExtension(extension);\n const shouldHighlight = language !== 'text';\n\n return (\n <div className=\"h-full w-full overflow-auto\">\n {shouldHighlight ? (\n <SyntaxHighlighter\n className=\"min-h-full! m-0! py-0!\"\n language={language}\n style={darcula}\n showLineNumbers\n wrapLines\n >\n {content}\n </SyntaxHighlighter>\n ) : (\n <pre className=\"whitespace-pre-wrap p-4 text-sm font-mono bg-gray-50 min-h-full\">{content}</pre>\n )}\n </div>\n );\n};\n","export const VideoDriver = ({ url }: { url: string }) => {\n return (\n <div className=\"flex flex-col justify-center items-center w-full h-full\">\n <video controls src={url} className=\"w-full max-h-full\" />\n </div>\n );\n};\n","import { memo } from 'react';\n\nimport { SupportedFileExtension } from './types';\nimport { ImageDriver } from './drivers/ImageDriver';\nimport { AudioDriver } from './drivers/AudioDriver';\nimport { PdfDriver } from './drivers/PdfDriver';\n// import { DownloadDriver } from './drivers/DownloadDriver';\nimport { DocxDriver } from './drivers/DocxDriver';\nimport { TextDriver } from './drivers/TextDriver';\nimport { VideoDriver } from './drivers/VideoDriver';\nimport { Box, 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 console.log('Driver props:', { extension, blob, path, buffer });\n const normalizedExtension = extension.toLocaleLowerCase().trim() as SupportedFileExtension;\n\n let url;\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\n if (['mp3', 'wav', 'ogg', 'flac'].includes(normalizedExtension)) {\n return <AudioDriver url={url} />;\n }\n\n if (['mp4', 'webm'].includes(normalizedExtension)) {\n return <VideoDriver url={url} />;\n }\n\n if (extension === 'pdf') {\n return <PdfDriver url={url} />;\n }\n // if (['xlsx', 'pptx'].includes(normalizedExtension)) {\n // return <DownloadDriver url={url} extension={normalizedExtension} />;\n // }\n // Текстові файли та файли з кодом\n if (\n [\n 'txt',\n 'js',\n 'jsx',\n 'ts',\n 'tsx',\n 'json',\n 'html',\n 'css',\n 'scss',\n 'py',\n 'java',\n 'cpp',\n 'c',\n 'cs',\n 'php',\n 'rb',\n 'go',\n 'rs',\n 'swift',\n 'kt',\n 'xml',\n 'yaml',\n 'yml',\n 'md',\n 'sql',\n 'sh',\n 'bash',\n ].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 <div className=\"h-full flex flex-col justify-center items-center\">\n <Box className=\"mx-5\">\n <Typography variant=\"h2\" color=\"text.light\" weight={500} className=\"text-center\">\n {not_supported_message}\n </Typography>\n </Box>\n </div>\n );\n});\n","import { 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 <div className=\"h-full w-full\">\n <Driver {...props} />\n </div>\n );\n};\n","import { useState, useEffect, ReactNode, useRef } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport { Typography, TypographyProps } from '../Core/Typography';\nimport remarkGfm from 'remark-gfm';\n\ntype TypewriterProps = {\n text: string;\n speed?: number;\n onDone?: () => void;\n className?: string;\n markdown?: boolean;\n markdownComponents?: Record<string, React.ComponentType<any>>;\n} & Omit<TypographyProps, 'children'>;\n\ninterface MarkdownComponentProps {\n children?: ReactNode;\n [key: string]: any;\n}\n\nconst MAX_TEXT_LENGTH_WITH_SLOW_SPEED = 250;\n\nexport const Typewriter = ({\n text,\n speed = 50,\n onDone,\n markdown = false,\n markdownComponents = {},\n className,\n ...props\n}: TypewriterProps) => {\n const [displayed, setDisplayed] = useState('');\n const startTime = useRef<number | null>(null);\n const rafId = useRef<number | null>(null);\n\n useEffect(() => {\n let done = false;\n if (speed > 0) {\n setDisplayed(''); // Reset displayed text when text changes\n startTime.current = performance.now();\n const tick = (now: number) => {\n if (done || !startTime.current) return;\n\n const elapsed = now - startTime.current;\n const currentSpeed = elapsed / speed > MAX_TEXT_LENGTH_WITH_SLOW_SPEED ? speed / 2 : speed;\n const chartsMultiply = elapsed / speed > MAX_TEXT_LENGTH_WITH_SLOW_SPEED ? 1.5 : 1;\n const charsToShow = Math.floor((elapsed / currentSpeed) * chartsMultiply);\n\n if (charsToShow >= text.length) {\n setDisplayed(text);\n done = true;\n onDone?.();\n return;\n }\n\n setDisplayed(text.slice(0, charsToShow));\n rafId.current = requestAnimationFrame(tick);\n };\n rafId.current = requestAnimationFrame(tick);\n } else {\n setDisplayed(text);\n onDone?.();\n }\n\n return () => {\n if (rafId.current) cancelAnimationFrame(rafId.current);\n };\n }, [text, speed, onDone]);\n\n if (markdown) {\n return (\n <div className={className}>\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={markdownComponents} {...props}>\n {displayed}\n </ReactMarkdown>\n </div>\n );\n }\n\n return (\n <Typography className={className} {...props}>\n {displayed}\n </Typography>\n );\n};\n","import copy from 'copy-to-clipboard';\nimport { ReactNode, useEffect, useRef, useState } from 'react';\nimport { Tooltip } from '../Core';\n\ntype CopyToClipboardProps = {\n text: string;\n children: (params: CopyToClipboardParams) => ReactNode;\n format?: 'text/html' | 'text/plain';\n tooltip?: {\n timeout?: number;\n message?: ReactNode;\n };\n};\n\ntype CopyToClipboardParams = {\n copy: () => Promise<void>;\n};\n\nconst DEFAULT_TOOLTIP_OPTIONS = {\n timeout: 2000,\n message: 'Copied!',\n};\n\nexport const CopyToClipboard = ({ text, children, format = 'text/plain', tooltip }: CopyToClipboardProps) => {\n const [copied, setCopied] = useState(false);\n const timeoutId = useRef<NodeJS.Timeout | null>(null);\n\n const tooltipOptions = { ...DEFAULT_TOOLTIP_OPTIONS, ...tooltip };\n\n const handleCopy = async () => {\n if ('clipboard' in navigator) {\n await navigator.clipboard.writeText(text);\n } else {\n copy(text, { format });\n }\n setCopied(true);\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n timeoutId.current = setTimeout(() => setCopied(false), tooltipOptions.timeout);\n };\n\n useEffect(() => {\n return () => {\n if (timeoutId.current) {\n clearTimeout(timeoutId.current);\n }\n };\n }, []);\n\n return (\n <Tooltip\n onMouseLeave={() => setCopied(false)}\n className={copied ? 'visible' : 'hidden'}\n content={tooltipOptions.message}\n >\n {children({ copy: handleCopy })}\n </Tooltip>\n );\n};\n","import {\n differenceInDays,\n format,\n getMonth,\n getWeeksInMonth,\n getYear,\n isValid,\n parse,\n previousMonday,\n startOfMonth,\n startOfWeek,\n} from 'date-fns';\nimport { MouseEventHandler, useCallback, useMemo, useState } from 'react';\nimport { BaseInputProps, Box, Button, ChevronLeftIcon, ChevronRightIcon, Input, Select } from '../Core';\nimport { Popover } from 'react-tiny-popover';\nimport { useTheme } from '../Theme';\n\ninterface DatePickerBaseProps {\n minDate?: Date;\n maxDate?: Date;\n format?: string;\n inline?: boolean;\n disabled?: boolean;\n placeholder?: string;\n inputProps?: BaseInputProps;\n}\n\ninterface DatePickerRangeProps {\n range: true;\n value?: [string, string];\n onChange?: (date: [string, string]) => void;\n}\n\ninterface DatePickerSingleProps {\n range?: false;\n value?: string;\n onChange?: (date: string) => void;\n}\n\ntype DatePickerProps = DatePickerBaseProps & (DatePickerRangeProps | DatePickerSingleProps);\n\nconst getInitValue = (value?: string | [string | undefined, string | undefined]) => {\n return new Date(value ? (Array.isArray(value) ? value[1] || value[0] || new Date() : value) : new Date());\n};\n\nconst parseDate = (value: string | undefined, formatStr: string) => {\n let parsedDate: Date | undefined;\n\n if (formatStr) {\n const d = parse(value || '', formatStr, new Date());\n if (isValid(d) && getYear(d) >= 1970) return d;\n }\n const date = new Date(value || '');\n if (!isNaN(date.getTime())) {\n return date;\n }\n\n return parsedDate;\n};\n\nconst renderDate = (value: string | undefined, formatStr: string) => {\n const date = value ? parseDate(value, formatStr) : undefined;\n\n return date && formatStr ? format(date, formatStr) : value;\n};\n\nexport const DatePicker = ({\n value,\n range,\n inline = false,\n minDate = new Date(getYear(new Date()) - 5, 0, 1),\n maxDate = new Date(getYear(new Date()) + 5, 11, 31),\n format: formatStr = 'dd.MM.yyyy',\n onChange,\n ...props\n}: DatePickerProps) => {\n const [month, setMonth] = useState(getMonth(getInitValue(value)));\n const [year, setYear] = useState(getYear(getInitValue(value)));\n\n const selectedDate = useMemo<Date | [Date | undefined, Date | undefined] | undefined>(() => {\n if (!value) return undefined;\n if (Array.isArray(value)) {\n const startDate = parseDate(value[0], formatStr);\n const endDate = parseDate(value[1], formatStr);\n\n return [startDate, endDate];\n }\n\n return parseDate(value, formatStr);\n }, [value]);\n\n const handleSelectDate = useCallback(\n (date: Date) => {\n if (range) {\n const hasStart = Boolean(selectedDate && Array.isArray(selectedDate) && !!selectedDate[0]);\n const hasEnd = Boolean(selectedDate && Array.isArray(selectedDate) && !!selectedDate[1]);\n\n if (!hasStart || (hasStart && hasEnd)) {\n onChange?.([date.toString(), '']);\n } else if (hasStart && !hasEnd) {\n if (date < (selectedDate as [Date, Date])[0]) {\n onChange?.([date.toString(), (selectedDate as [Date, Date])[0].toString()]);\n } else {\n onChange?.([(selectedDate as [Date, Date])[0].toString(), date.toString()]);\n }\n }\n } else {\n onChange?.(date.toString());\n }\n },\n [range, selectedDate, onChange]\n );\n\n if (!inline) {\n if (range) {\n return <DatePickerGroupInput range={true} value={value} onChange={onChange} {...props} />;\n } else {\n return (\n <DatePickerInput\n value={value}\n onChange={onChange}\n minDate={minDate}\n maxDate={maxDate}\n month={month}\n year={year}\n selectedDate={selectedDate}\n onChangeMonth={setMonth}\n onChangeYear={setYear}\n onSelectDate={handleSelectDate}\n formatStr={formatStr}\n {...props}\n />\n );\n }\n }\n\n return (\n <DatePickerCalendar\n month={month}\n year={year}\n minDate={minDate}\n maxDate={maxDate}\n selectedDate={selectedDate}\n onSelectDate={handleSelectDate}\n onChangeMonth={setMonth}\n onChangeYear={setYear}\n />\n );\n};\n\nconst DatePickerGroupInput = ({\n minDate,\n maxDate,\n value,\n onChange,\n}: DatePickerRangeProps & Omit<DatePickerBaseProps, 'inline'>) => {\n //TODO input range\n return null;\n};\n\ntype DatePickerInputProps = {\n month: number;\n year: number;\n selectedDate: Date | [Date | undefined, Date | undefined] | undefined;\n minDate: Date;\n maxDate: Date;\n formatStr: string;\n onChangeMonth: (month: number) => void;\n onChangeYear: (year: number) => void;\n onSelectDate: (date: Date) => void;\n};\n\nconst DatePickerInput = ({\n placeholder,\n value,\n onChange,\n inputProps,\n ...props\n}: DatePickerInputProps &\n DatePickerSingleProps &\n Omit<DatePickerBaseProps, 'inline' | 'minDate' | 'maxDate' | 'format'>) => {\n const [isOpen, setIsOpen] = useState(false);\n const theme = useTheme();\n return (\n <Popover\n positions={['bottom', 'top', 'right', 'left']}\n align=\"start\"\n isOpen={isOpen}\n onClickOutside={() => setIsOpen(false)}\n content={\n <Box>\n <DatePickerCalendar {...props} />\n </Box>\n }\n containerStyle={{\n zIndex: `${theme.zIndex.popover}`,\n }}\n >\n <div onClick={() => setIsOpen(true)}>\n <Input\n {...inputProps}\n placeholder={placeholder}\n value={renderDate(value, props.formatStr)}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => onChange?.(e.target.value)}\n />\n </div>\n </Popover>\n );\n};\n\ninterface DatePickerCalendarProps {\n month: number;\n year: number;\n selectedDate?: Date | [Date | undefined, Date | undefined];\n minDate: Date;\n maxDate: Date;\n onSelectDate: (date: Date) => void;\n onChangeMonth: (month: number) => void;\n onChangeYear: (year: number) => void;\n}\n\nexport const DatePickerCalendar = ({\n month,\n year,\n selectedDate,\n minDate,\n maxDate,\n onSelectDate,\n onChangeMonth,\n onChangeYear,\n}: DatePickerCalendarProps) => {\n const monthOptions = useMemo(() => {\n return new Array(12).fill(null).map((_, i) => {\n const month = new Date(0, i);\n return { value: i + 1, inputDisplay: format(month, 'MMMM') };\n });\n }, []);\n\n const yearOptions = useMemo(() => {\n const minYear = getYear(minDate);\n const maxYear = getYear(maxDate);\n\n const yearsCount = maxYear - minYear + 1;\n return new Array(yearsCount).fill(null).map((_, i) => {\n const year = minYear + i;\n return { value: year, inputDisplay: year.toString() };\n });\n }, [minDate, maxDate]);\n\n const daysInWeek = useMemo(\n () =>\n new Array(7).fill(null).map((_, i) => {\n const day = startOfWeek(new Date(), {\n weekStartsOn: i as 0 | 1 | 2 | 3 | 4 | 5 | 6,\n });\n return format(day, 'EEE');\n }),\n []\n );\n\n const days = useMemo<Array<Date>>(() => {\n const weekInMonth = getWeeksInMonth(new Date(year, month));\n const firstDayOfMonth = startOfMonth(new Date(year, month));\n const firstMonday = previousMonday(firstDayOfMonth);\n const diffInDays = differenceInDays(firstDayOfMonth, firstMonday);\n return new Array(weekInMonth * 7).fill(null).map((_, i) => {\n return new Date(year, month, i - diffInDays + 1);\n });\n }, [month, year]);\n\n const handlePrevMonth = useCallback(() => {\n if (month === 0) {\n onChangeYear(year - 1);\n onChangeMonth(11);\n } else {\n onChangeMonth(month - 1);\n }\n }, [month, year]);\n\n const handleNextMonth = useCallback(() => {\n if (month === 11) {\n onChangeYear(year + 1);\n onChangeMonth(0);\n } else {\n onChangeMonth(month + 1);\n }\n }, [month, year]);\n\n const hasPrevMonth = useMemo(() => {\n if (!minDate) return true;\n if (year < getYear(minDate)) return false;\n if (year === getYear(minDate) && month <= getMonth(minDate)) return false;\n return true;\n }, [month, year, minDate]);\n\n const hasNextMonth = useMemo(() => {\n if (!maxDate) return true;\n if (year > getYear(maxDate)) return false;\n if (year === getYear(maxDate) && month >= getMonth(maxDate)) return false;\n return true;\n }, [month, year, maxDate]);\n\n const handleCLick: MouseEventHandler<HTMLDivElement> = useCallback((e) => {\n e.stopPropagation();\n }, []);\n\n return (\n <div className=\"flex flex-col date-picker-calendar\" onClick={handleCLick}>\n <div className=\"flex justify-center items-center gap-2 pb-3\">\n {hasPrevMonth && <Button size=\"small\" variant=\"empty\" icon={<ChevronLeftIcon />} onClick={handlePrevMonth} />}\n <div className=\"flex-1 flex justify-center gap-1\">\n <Select\n placeholder=\"\"\n hasBorder={false}\n selected={month + 1}\n options={monthOptions}\n onSelect={(value) => onChangeMonth(value - 1)}\n maxWidth={150}\n maxHeight={300}\n />\n <Select\n placeholder=\"\"\n hasBorder={false}\n selected={year}\n options={yearOptions}\n onSelect={(value) => onChangeYear(value)}\n maxWidth={100}\n maxHeight={300}\n />\n </div>\n {hasNextMonth && <Button size=\"small\" variant=\"empty\" icon={<ChevronRightIcon />} onClick={handleNextMonth} />}\n </div>\n <div className=\"grid grid-cols-7 gap-2\">\n {daysInWeek.map((day) => (\n <div key={day} className=\"text-center\">\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-2 mt-2\">\n {days.map((date) => {\n const isCurrentMonth = getMonth(date) === month;\n const isCurrentDay = format(date, 'yyyy-MM-dd') === format(new Date(), 'yyyy-MM-dd');\n const isSelected =\n selectedDate &&\n ((Array.isArray(selectedDate) &&\n ((selectedDate[0] && format(date, 'yyyy-MM-dd') === format(selectedDate[0], 'yyyy-MM-dd')) ||\n (selectedDate[1] && format(date, 'yyyy-MM-dd') === format(selectedDate[1], 'yyyy-MM-dd')))) ||\n (!Array.isArray(selectedDate) && format(date, 'yyyy-MM-dd') === format(selectedDate, 'yyyy-MM-dd')));\n const isInRange =\n selectedDate &&\n Array.isArray(selectedDate) &&\n selectedDate[0] &&\n selectedDate[1] &&\n date > selectedDate[0] &&\n date < selectedDate[1];\n const isDisabled =\n (minDate && differenceInDays(date, minDate) < 0) ||\n (maxDate && differenceInDays(date, maxDate) > 0) ||\n !isCurrentMonth;\n\n return (\n <CalendarDay\n key={date.toISOString()}\n date={date}\n isCurrentMonth={isCurrentMonth}\n isCurrentDay={isCurrentDay}\n isSelected={!!isSelected}\n isInRange={!!isInRange}\n isDisabled={!!isDisabled}\n onSelectDate={onSelectDate}\n />\n );\n })}\n </div>\n </div>\n );\n};\n\ninterface CalendarDayProps {\n date: Date;\n isCurrentMonth: boolean;\n isCurrentDay: boolean;\n isSelected: boolean;\n isInRange: boolean;\n isDisabled: boolean;\n onSelectDate: (date: Date) => void;\n}\n\nconst CalendarDay = ({\n date,\n isCurrentMonth,\n isCurrentDay,\n isSelected,\n isInRange,\n isDisabled,\n onSelectDate,\n}: CalendarDayProps) => {\n const handleClick: MouseEventHandler<HTMLDivElement> = (e) => {\n if (!isDisabled) {\n onSelectDate(date);\n }\n };\n\n return (\n <div\n className={`text-center p-2 cursor-pointer rounded ${\n isDisabled\n ? 'text-gray-400 cursor-not-allowed'\n : isSelected\n ? 'bg-blue-500 text-white'\n : isInRange\n ? 'bg-blue-100'\n : isCurrentDay\n ? 'text-blue-500'\n : isCurrentMonth\n ? 'text-black'\n : 'text-gray-400'\n } ${isDisabled ? '' : isSelected ? 'hover:bg-blue-600' : 'hover:bg-gray-100'}`}\n onClick={handleClick}\n >\n {format(date, 'd')}\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { ColorToastVariant, Toast as ToastT } from './types';\nimport { set } from 'date-fns';\n\ninterface ToastProps extends ToastT {\n transitionDirection: 'top' | 'bottom';\n onClose: (id: string) => void;\n}\n\nconst getColorStyle = (color: ColorToastVariant) => {\n switch (color) {\n case 'primary':\n return 'bg-blue-100 border-blue-200 dark:bg-blue-800/10 dark:border-blue-900';\n case 'error':\n return 'bg-red-100 border-red-200 dark:bg-red-800/10 dark:border-red-900';\n case 'warning':\n return 'bg-yellow-100 border-yellow-200 dark:bg-yellow-800/10 dark:border-yellow-900';\n case 'success':\n return 'bg-teal-100 border-teal-200 dark:bg-teal-800/10 dark:border-teal-900';\n case 'default':\n default:\n return 'bg-white border border-gray-200 dark:bg-neutral-800 dark:border-neutral-700';\n }\n};\n\nconst getTextColor = (color: ColorToastVariant) => {\n switch (color) {\n case 'primary':\n return 'text-blue-800 dark:text-blue-500';\n case 'error':\n return 'text-red-800 dark:text-red-500';\n case 'warning':\n return 'text-yellow-800 dark:text-yellow-500';\n case 'success':\n return 'text-teal-800 dark:text-teal-500';\n case 'default':\n default:\n return 'text-gray-800 dark:text-white';\n }\n};\n\nconst getTransitionStarting = (direction: 'top' | 'bottom') => {\n switch (direction) {\n case 'bottom':\n return 'translate-y-4';\n case 'top':\n default:\n return '-translate-y-4';\n }\n};\n\nexport const Toast = ({\n id,\n color = 'default',\n message,\n duration,\n transitionDirection,\n cancelable = true,\n onClose,\n}: ToastProps) => {\n const [isClosing, setIsClosing] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const timeoutClosingRef = useRef<NodeJS.Timeout | null>(null);\n\n const handleClose = useCallback(() => {\n setIsClosing(true);\n timeoutClosingRef.current = setTimeout(() => {\n onClose(id);\n }, 300);\n }, [id, onClose]);\n\n useEffect(() => {\n setIsVisible(true);\n if (duration && duration < Infinity) {\n const timer = setTimeout(() => {\n handleClose();\n }, duration);\n return () => clearTimeout(timer);\n }\n }, [duration, handleClose]);\n\n useEffect(() => {\n return () => {\n if (timeoutClosingRef.current) {\n clearTimeout(timeoutClosingRef.current);\n }\n };\n }, []);\n\n return (\n <div\n className={`max-w-xs\n border\n w-full\n text-sm\n rounded-lg\n transition-all\n ease-in-out\n duration-300\n ${isClosing || !isVisible ? 'opacity-0' : 'opacity-100'}\n ${isVisible ? 'translate-y-0' : getTransitionStarting(transitionDirection)}\n ${getColorStyle(color)} ${getTextColor(color)}`}\n >\n <div className=\"flex p-4 \">\n {message}\n {cancelable && (\n <div className=\"ms-auto\">\n <button\n type=\"button\"\n className=\"inline-flex shrink-0 justify-center items-center size-5 rounded-lg opacity-50 hover:opacity-100 focus:outline-hidden focus:opacity-100 cursor-pointer\"\n aria-label=\"Close\"\n onClick={handleClose}\n >\n <svg\n className=\"shrink-0 size-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </button>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useMemo, useRef } from 'react';\nimport { Toast as ToastT } from './types';\nimport { Toast } from './Toast';\n\ntype Position = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';\n\ninterface ToastsListProps {\n position?: Position;\n offset?: number;\n items: ToastT[];\n onClose: (id: string) => void;\n}\n\nconst getPosition = (position: Position, offset: number) => {\n switch (position) {\n case 'top-right':\n return `top-${offset} right-${offset}`;\n case 'top-left':\n return `top-${offset} left-${offset}`;\n case 'bottom-right':\n return `bottom-${offset} right-${offset}`;\n case 'bottom-left':\n return `bottom-${offset} left-${offset}`;\n default:\n return `top-${offset} right-${offset}`;\n }\n};\n\nexport const ToastsList = ({ items, onClose, position = 'top-right', offset = 4 }: ToastsListProps) => {\n const transitionDirection = useMemo(() => {\n return position.startsWith('top') ? 'top' : 'bottom';\n }, [position]);\n\n return (\n <div className={`fixed flex min-w-0 max-w-xs w-full flex-col z-50 gap-2 ${getPosition(position, offset)}`}>\n {items.map((toast) => (\n <Toast transitionDirection={transitionDirection} key={toast.id} {...toast} onClose={onClose} />\n ))}\n </div>\n );\n};\n"]}
|