@processandtools/rp-article-designer 1.0.39 → 1.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/article_designer/VariableBridge.d.ts +4 -0
- package/dist/components/article_designer/Zone.d.ts +2 -1
- package/dist/components/article_designer/zoneElems/Back.d.ts +2 -1
- package/dist/components/article_designer/zoneElems/Bottom.d.ts +3 -2
- package/dist/components/article_designer/zoneElems/Divider.d.ts +2 -2
- package/dist/components/article_designer/zoneElems/Left.d.ts +2 -1
- package/dist/components/article_designer/zoneElems/Right.d.ts +2 -1
- package/dist/components/article_designer/zoneElems/Top.d.ts +3 -2
- package/dist/components/article_designer/zoneElems/{DrawerItem.d.ts → sub_construction/DrawerItem.d.ts} +3 -3
- package/dist/components/article_designer/zoneElems/sub_construction/LinearDividerRender.d.ts +1 -1
- package/dist/components/elements_manager/PD_3D.d.ts +2 -2
- package/dist/components/ui/Canvas3D.d.ts +1 -1
- package/dist/components/ui/CanvasManager.d.ts +1 -1
- package/dist/components/ui/VariablePanel.d.ts +5 -0
- package/dist/components/ui/VisibilityPanel.d.ts +1 -0
- package/dist/components/ui/controls/Configurator.d.ts +7 -0
- package/dist/components/ui/controls/VariablePanel.d.ts +2 -5
- package/dist/components/ui/controls/configurator-components/MCombo.d.ts +7 -0
- package/dist/components/ui/controls/configurator-components/MSlider.d.ts +8 -0
- package/dist/components/ui/controls/configurator-components/MSwitch.d.ts +8 -0
- package/dist/conditions/helpers/ConditionTreeEvaluator.d.ts +2 -3
- package/dist/contexts/article-hover/ArticleHoverContext.d.ts +1 -0
- package/dist/contexts/descriptor/useDescriptor.d.ts +2 -3
- package/dist/data/configurator-data/configuratorFields.d.ts +17 -0
- package/dist/data/configurator-data/options.d.ts +2 -0
- package/dist/debug/PerformanceMonitor.d.ts +77 -0
- package/dist/debug/RerenderTracker.d.ts +85 -0
- package/dist/debug/index.d.ts +9 -0
- package/dist/debug/trackComponent.d.ts +39 -0
- package/dist/descriptor/helper/DescriptorEvaluator.d.ts +2 -3
- package/dist/descriptor/services/DescriptorManager.d.ts +3 -4
- package/dist/helpers/GroupWrapper.d.ts +3 -0
- package/dist/helpers/useCpDispatcher.d.ts +1 -2
- package/dist/hooks/zoneDivider.d.ts +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stores/variableStore.d.ts +30 -0
- package/dist/stores/visibilityStore.d.ts +23 -0
- package/dist/types/canvas.types.d.ts +1 -0
- package/dist/types/configurator.types.d.ts +10 -0
- package/dist/types/divider.types.d.ts +5 -2
- package/dist/variables/VariableProvider.d.ts +1 -1
- package/dist/variables/VariableResolver.d.ts +1 -1
- package/dist/variables/useVariables.d.ts +1 -1
- package/package.json +5 -1
- package/dist/components/ui/PerformanceMonitor.d.ts +0 -1
- package/dist/components/ui/controls/ControlPanel.d.ts +0 -8
- package/dist/components/ui/controls/ControlPanel2D.d.ts +0 -2
- package/dist/components/ui/controls/ControlPanel3D.d.ts +0 -2
- package/dist/components/ui/controls/VariableController.d.ts +0 -7
- package/dist/components/ui/controls/VariableControllerWrapper.d.ts +0 -12
- package/dist/components/ui/controls/VariablePanel2D.d.ts +0 -2
- package/dist/components/ui/controls/VariablePanel3D.d.ts +0 -2
- package/dist/components/ui/controls/ZoomControls.d.ts +0 -8
- package/dist/components/ui/test/LevaVariableController.d.ts +0 -7
- package/dist/components/ui/test/LevaVisibilityController.d.ts +0 -11
- package/dist/rp-article-designer.css +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/hooks/useAPI.ts","../src/constants/Constants.tsx","../src/services/GenericApi.ts","../src/services/ApiFactory.ts","../src/contexts/article-data/DataContext.ts","../src/contexts/article-data/DataProvider.tsx","../src/variables/VariableContext.tsx","../src/variables/variable.types.ts","../src/variables/VariableResolver.ts","../src/variables/VariableProvider.tsx","../src/contexts/descriptor/DescriptorContext.ts","../src/conditions/helpers/ComparisonMap.tsx","../src/conditions/helpers/KeyMap.tsx","../src/helpers/ExpressionResolver.ts","../src/conditions/helpers/ConditionTreeEvaluator.tsx","../src/descriptor/helper/DescriptorEvaluator.ts","../src/descriptor/services/DescriptorManager.ts","../src/contexts/descriptor/DescriptorProvider.tsx","../src/contexts/mat-surf/MatSurfContext.tsx","../src/contexts/mat-surf/MatSurfProvider.tsx","../src/types/view.types.ts","../src/components/ui/LoadingIndicator.tsx","../src/variables/useVariables.ts","../src/contexts/article-related-variables/ArticleRelatedVariableProvider.tsx","../src/contexts/dimension/DimensionContext.ts","../src/contexts/dimension/useDimensions.ts","../src/components/ui/test/LevaVariableController.tsx","../src/contexts/article-data/useData.ts","../src/helpers/row_data/UseClieHelper.tsx","../src/helpers/row_data/UseGrtxHelper.tsx","../src/construction_principle/kms/KmsRenderSelector.ts","../src/construction_principle/render/RenderHelper.tsx","../src/construction_principle/material/MatHelper.ts","../src/construction_principle/surface/SurfHelper.ts","../src/construction_principle/kms/KmsHelper.tsx","../src/construction_principle/side_panel/CSideHelper.tsx","../src/types/divider.types.ts","../src/types/Elem.types.tsx","../src/construction_principle/drawer/dto/drawer.types.ts","../src/construction_principle/dto/angl-type-config.ts","../src/construction_principle/dto/cp-dispatcher.types.ts","../src/contexts/descriptor/useDescriptor.ts","../src/construction_principle/cabBack/CabBackHelper.tsx","../src/construction_principle/door/DoorHelper.ts","../src/construction_principle/cabin/CabinHelper.ts","../src/construction_principle/drawer/DrawerHelper.tsx","../src/helpers/useCpDispatcher.ts","../src/contexts/descriptor/useDescriptorManager.ts","../src/helpers/row_data/UsePrimHelper.tsx","../src/helpers/row_data/UseZoneHelper.tsx","../src/helpers/row_data/UseElemHelper.tsx","../node_modules/imos-linear-division/dist/index.mjs","../src/helpers/LinDivPatternTransform.ts","../src/helpers/LinDivValidation.ts","../src/helpers/LinDivHelper.tsx","../src/helpers/PositionHelper.tsx","../src/helpers/ZoneCalculations.tsx","../src/helpers/GroupWrapper.tsx","../src/helpers/MitreCalc.tsx","../src/constants/RalColors.ts","../src/contexts/texture/TextureConfig.tsx","../src/contexts/mat-surf/useMaterialLoader.ts","../src/components/elements_manager/PD_3D.tsx","../src/config/dimensionConfig.ts","../src/components/dimensions/DimensionLines.tsx","../src/components/elements_manager/PD_2D.tsx","../src/helpers/tools/computeTrimTool.ts","../node_modules/@react-spring/rafz/dist/react-spring_rafz.modern.mjs","../node_modules/@react-spring/shared/dist/react-spring_shared.modern.mjs","../node_modules/@react-spring/animated/dist/react-spring_animated.modern.mjs","../node_modules/@react-spring/core/dist/react-spring_core.modern.mjs","../node_modules/@react-spring/three/dist/react-spring_three.modern.mjs","../src/components/article_designer/helpers/ScanNeighbors.ts","../src/components/article_designer/helpers/calculateHitOversize.ts","../src/components/article_designer/helpers/DoorSensor.tsx","../src/contexts/article-hover/ArticleHoverContext.ts","../src/contexts/article-hover/useArticleHover.ts","../src/components/article_designer/helpers/DoorAnimator.tsx","../src/components/article_designer/zoneElems/Left.tsx","../src/components/article_designer/zoneElems/Back.tsx","../src/components/article_designer/zoneElems/Right.tsx","../src/helpers/LindivResolver.ts","../src/hooks/zoneDivider.ts","../src/components/article_designer/zoneElems/sub_construction/LinearDividerRender.tsx","../src/components/article_designer/zoneElems/sub_construction/SubArticleRender.tsx","../src/components/article_designer/zoneElems/Divider.tsx","../src/components/article_designer/zoneElems/Bottom.tsx","../src/components/article_designer/zoneElems/Top.tsx","../src/helpers/row_data/UseDrawerZoneHelper.ts","../src/components/article_designer/helpers/DrawerSensor.tsx","../src/components/article_designer/zoneElems/drawerElems/DrFront.tsx","../src/components/article_designer/zoneElems/drawerElems/DrRight.tsx","../src/components/article_designer/zoneElems/drawerElems/DrBack.tsx","../src/components/article_designer/zoneElems/drawerElems/DrLeft.tsx","../src/components/article_designer/zoneElems/drawerElems/DrBottom.tsx","../src/components/article_designer/zoneElems/drawerElems/DrZone.tsx","../src/components/article_designer/helpers/DrawerAnimator.tsx","../src/components/article_designer/zoneElems/DrawerItem.tsx","../src/components/article_designer/zoneElems/Drawer.tsx","../src/components/article_designer/zoneElems/Front.tsx","../src/components/article_designer/Zone.tsx","../src/components/article_designer/helpers/Highlighter.tsx","../src/components/article_designer/Designer.tsx","../src/contexts/dimension/DimensionProvider.tsx","../src/contexts/article-hover/ArticleHoverProvider.tsx","../src/components/article_designer/ArticleDesigner.tsx","../src/components/ui/test/LevaVisibilityController.tsx","../src/components/article_designer/ArticleGroupLayout.tsx","../src/components/article_designer/ArticleGroupDesigner.tsx","../src/index.ts"],"sourcesContent":["// hooks/useAPI.ts\r\nimport { useEffect, useState, useRef } from \"react\";\r\n\r\nexport function useAPI<T>(\r\n fetchFn: () => Promise<T>,\r\n deps: React.DependencyList = [],\r\n skip: boolean = false // Add skip flag to prevent fetching\r\n) {\r\n const [data, setData] = useState<T | null>(null);\r\n const [loading, setLoading] = useState(!skip); // Don't start loading if skipped\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // Track if this is the first render\r\n const isFirstRender = useRef(true);\r\n const hasDataRef = useRef(false);\r\n\r\n useEffect(() => {\r\n // Skip fetching if skip flag is true\r\n if (skip) {\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n\r\n async function load() {\r\n try {\r\n // Only set loading to true if it's the first render or we don't have data yet\r\n if (isFirstRender.current || !hasDataRef.current) {\r\n setLoading(true);\r\n }\r\n setError(null);\r\n const result = await fetchFn();\r\n\r\n if (!cancelled) {\r\n setData(result);\r\n hasDataRef.current = true;\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Unknown error');\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n isFirstRender.current = false;\r\n }\r\n }\r\n }\r\n\r\n load();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [...deps, skip]); // Include skip in dependencies\r\n\r\n return { data, loading, error };\r\n}","\r\nexport const strokeWidth = 1\r\nexport const CLIE_TYPE_ELEM = 0\r\nexport const CLIE_TYPE_ZONE = 1\r\nexport const defaultColor = \"black\"\r\nexport const frontTreeId = (zoneID: string): string => zoneID + \".0\";\r\nexport const rightTreeId = (zoneID: string): string => zoneID + \".1\";\r\nexport const backTreeId = (zoneID: string): string => zoneID + \".2\";\r\nexport const leftTreeId = (zoneID: string): string => zoneID + \".3\";\r\nexport const parentId = (zoneID: string): string => zoneID.substring(0, zoneID.lastIndexOf(\".\"));\r\n\r\nexport const previousTREEID = (TREEID: string): string => {\r\n const parent = parentId(TREEID);\r\n const index = getIndex(TREEID);\r\n const prevIndex = (index + 3) % 4;\r\n return `${parent}.${prevIndex}`;\r\n};\r\n\r\nexport const nextTREEID = (TREEID: string): string => {\r\n const parent = parentId(TREEID);\r\n const index = getIndex(TREEID)\r\n const nextIndex = (index + 1) % 4;\r\n return `${parent}.${nextIndex}`;\r\n};\r\n\r\nexport const getIndex = (TREEID: string): number => {\r\n return parseInt(TREEID.substring(TREEID.lastIndexOf('.') + 1));\r\n};\r\n\r\nexport const clieTags = {\r\n IAC_THICKNESS: 'IAC_THICKNESS', // sides and dividers (shelf / partitions)\r\n IAC_BOTTOMSHELFTHICKNESS: 'IAC_BOTTOMSHELFTHICKNESS', // for bottom shelf\r\n IAC_TOPSHELFTHICKNESS: 'IAC_TOPSHELFTHICKNESS' // for top shelf\r\n}\r\n\r\nexport const DIM_NORM = 1000\r\n// Texture loading configuration\r\n\r\nexport const texture_url_builder = (render_mat:string) => '/api/textures/copy_2/'+render_mat+'.jpg'+'/public'\r\nexport const TEXTURE_URL_PREFIX = '/api/textures/copy_2/' // Proxy to CDN (includes copy_2 folder)\r\nexport const TEXTURE_URL_SUFFIX = '/public'\r\nexport const TEXTURE_EXTENSION = '.jpg'\r\nexport const DEFAULT_TEXTURE = '/textures/default.jpg'\r\nexport const DEFAULT_RENDER_COLOR = '#484947';\r\n\r\nexport const BACKEND_BASE_URL = 'https://backend.tecnibo.com/api/rp-engine'\r\n// export const BACKEND_BASE_URL = 'http://192.168.33.164:3018'\r\n","// services/generic-api.ts\r\n\r\nimport {BACKEND_BASE_URL} from \"../constants/Constants.tsx\";\r\n\r\nexport class GenericAPI<T> {\r\n constructor(\r\n private endpoint: string,\r\n private baseUrl: string = BACKEND_BASE_URL\r\n ) {}\r\n\r\n /**\r\n * Fetch by ID (GET)\r\n */\r\n async fetchById(id: string | number): Promise<T | undefined> {\r\n const url = `${this.baseUrl}/${this.endpoint}/${id}`;\r\n\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return await this.parseResponse(response, url)\r\n }\r\n\r\n /**\r\n * Fetch bulk data by values array (POST)\r\n */\r\n async fetchBulk(values: string[]): Promise<T | undefined> {\r\n const forceRefresh = '?forceRefresh=true'\r\n const url = `${this.baseUrl}/${this.endpoint}/bulk${forceRefresh}`;\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ values }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return await this.parseResponse(response, url)\r\n }\r\n\r\n private async parseResponse(response: Response, url: string): Promise<T | undefined> {\r\n const contentType = response.headers.get('content-type');\r\n const contentLength = response.headers.get('content-length');\r\n\r\n // Handle empty responses\r\n if (contentLength === '0' || !contentType?.includes('application/json')) {\r\n console.warn(`[${this.endpoint}] Empty or non-JSON response from ${url}`);\r\n return undefined;\r\n }\r\n\r\n const text = await response.text();\r\n\r\n if (!text?.trim()) {\r\n console.warn(`[${this.endpoint}] Empty response body from ${url}`);\r\n return undefined;\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T;\r\n } catch (error) {\r\n console.error(`[${this.endpoint}] JSON parse error for ${url}:`, error);\r\n console.error(`[${this.endpoint}] Response preview:`, text.substring(0, 200));\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\n","import type {ConditionTreeResponse} from \"../conditions/types/condition.types.ts\";\r\nimport {GenericAPI} from \"./GenericApi.ts\";\r\nimport type {DescriptorResponse} from \"../descriptor/types/descriptor.types.ts\";\r\nimport type {LinDivData, OtherDescriptorData} from \"../descriptor/types/descriptor-data.types.ts\";\r\nimport type {ArticleData} from \"../types/data.types.tsx\";\r\nimport type {MaterialTypes} from \"../construction_principle/material/material.types.ts\";\r\nimport type {SurfaceTypes} from \"../construction_principle/surface/surface.types.ts\";\r\nimport {BACKEND_BASE_URL} from \"../constants/Constants.tsx\";\r\n\r\nclass APIFactory {\r\n private baseUrl: string;\r\n\r\n constructor() {\r\n this.baseUrl = BACKEND_BASE_URL;\r\n }\r\n\r\n conditionTree() {\r\n return new GenericAPI<ConditionTreeResponse>('condition-tree-builder', this.baseUrl);\r\n }\r\n\r\n descriptor() {\r\n return new GenericAPI<DescriptorResponse>('descriptor', this.baseUrl);\r\n }\r\n\r\n materialData(){\r\n return new GenericAPI<MaterialTypes>('material-data',this.baseUrl)\r\n }\r\n\r\n surfaceData(){\r\n return new GenericAPI<SurfaceTypes>('surface-data',this.baseUrl)\r\n }\r\n\r\n articleData() {\r\n return new GenericAPI<ArticleData>('article-data', this.baseUrl);\r\n }\r\n\r\n descriptorData() {\r\n return new GenericAPI<DescriptorResponse>('descriptor-data', this.baseUrl);\r\n }\r\n\r\n linDivData() {\r\n return new GenericAPI<LinDivData>('lindiv', this.baseUrl);\r\n }\r\n\r\n otherData() {\r\n return new GenericAPI<OtherDescriptorData>('other', this.baseUrl);\r\n }\r\n\r\n // Add more APIs as needed\r\n}\r\n\r\n// Export singleton instance\r\nexport const api = new APIFactory();\r\n\r\n// Or export factory for custom base URLs\r\nexport { APIFactory };","import { createContext } from 'react';\nimport type { DataContextType } from \"../../types/data.types.tsx\";\n\nexport const DataContext = createContext<DataContextType | undefined>(undefined);\n","import { useState, useMemo, useCallback } from 'react';\n// import data from '../../data/data.json';\nimport type {\n DataProviderProps,\n AnglPrim,\n AnglZone,\n AngleElem,\n AnglClie,\n AnglGrtx,\n DrawerZoneDataTypes, DrawerDataTypes\n} from \"../../types/data.types.tsx\";\nimport { DataContext } from './DataContext.ts';\nimport type {CsideTypes} from \"../../construction_principle/side_panel/cside.types.ts\";\nimport type {KmsTypes} from \"../../construction_principle/kms/kms.types.ts\";\nimport type {ImosVariable} from \"../../variables/variable.types.ts\";\nimport type {CabinTypes} from \"../../construction_principle/cabin/cabin.types.ts\";\nimport type {DoorTypes} from \"../../construction_principle/door/door.types.ts\";\nimport type {CabbackTypes} from \"../../construction_principle/cabBack/cabback.types.ts\";\n\nexport function DataProvider({data, children, names }: DataProviderProps) {\n const staticData = data as unknown as {\n anglelem: AngleElem[];\n anglzone: AnglZone[];\n anglprim: AnglPrim[];\n anglclie: AnglClie[];\n anglgrtx: AnglGrtx[];\n drawerZone:DrawerZoneDataTypes[];\n cside: CsideTypes[];\n door: DoorTypes[];\n drawers:DrawerDataTypes[];\n cabback: CabbackTypes[];\n kms: KmsTypes[];\n cabin: CabinTypes[];\n variables: ImosVariable[];\n };\n\n // Make data editable with useState\n const [editableData, setEditableData] = useState(staticData);\n\n // Selection state\n const [selectedElem, setSelectedElem] = useState<string | null>(null);\n const [hoveredElem, setHoveredElem] = useState<string | null>(null);\n\n // Filtering utility function - filter data by article name\n const getArticleData = useCallback((articleName: string) => ({\n anglElems: editableData.anglelem.filter((elem) => elem.NAME === articleName),\n anglZones: editableData.anglzone.filter((zone) => zone.NAME === articleName),\n anglPrims: editableData.anglprim.filter((prim) => prim.NAME === articleName),\n anglClies: editableData.anglclie.filter((clie) => clie.NAME === articleName),\n anglGrtxs: editableData.anglgrtx.filter((grtx) => grtx.NAME === articleName),\n drawerZones:editableData.drawerZone.filter((drZone) => drZone.NAME === articleName),\n\n // Note: csides and cabins are shared construction principles, not article-specific\n // Return all of them - they'll be referenced by article parts\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors:editableData.door || [],\n drawers:editableData.drawers || [],\n cabbacks:editableData.cabback || [],\n // Variables can be global or article-specific - filter returns article-specific ones\n variables: editableData.variables?.filter((variable) => variable.NAME === articleName) || []\n }), [editableData]);\n\n // Filter data by names array (memoized for performance)\n const {anglElems, anglZones, anglPrims, anglClies, anglGrtxs, csides, kmsList, cabins, variables, doors, drawers, drawerZones ,cabbacks} = useMemo(() => {\n if (names && names.length > 0) {\n // Filter to specified articles\n return {\n anglElems: editableData.anglelem.filter(e => names.includes(e.NAME)),\n anglZones: editableData.anglzone.filter(z => names.includes(z.NAME)),\n anglPrims: editableData.anglprim.filter(p => names.includes(p.NAME)),\n anglClies: editableData.anglclie.filter(c => names.includes(c.NAME)),\n anglGrtxs: editableData.anglgrtx.filter(g => names.includes(g.NAME)),\n drawerZones: editableData.drawerZone,//.filter(d => names.includes(d.NAME)),\n // Note: cside, cabin, KMS, variables, materials, and surfaces are shared resources\n // They are NOT filtered by article name - they are referenced by construction principles\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors: editableData.door || [],\n drawers: editableData.drawers || [],\n cabbacks: editableData.cabback || [],\n kmsList: editableData.kms || [],\n variables: editableData.variables || [],\n };\n } else {\n // No filtering - return all data\n return {\n anglElems: editableData.anglelem,\n anglZones: editableData.anglzone,\n anglPrims: editableData.anglprim,\n anglClies: editableData.anglclie,\n anglGrtxs: editableData.anglgrtx,\n drawerZones: editableData.drawerZone || [],\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors: editableData.door || [],\n drawers:editableData.drawers || [],\n cabbacks: editableData.cabback || [],\n kmsList: editableData.kms || [],\n variables: editableData.variables || [],\n };\n }\n }, [editableData, names]);\n\n // Update function for AnglPrim (overall dimensions)\n const updateAnglPrim = (articleName: string, property: keyof AnglPrim, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglprim: prev.anglprim.map((prim) =>\n prim.NAME === articleName\n ? { ...prim, [property]: newValue }\n : prim\n )\n }));\n };\n\n // Update function for AngleElem (element properties)\n const updateAnglElem = (articleName: string, treeid: string, property: keyof AngleElem, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglelem: prev.anglelem.map((elem) =>\n elem.TREEID === treeid && elem.NAME === articleName\n ? { ...elem, [property]: newValue }\n : elem\n )\n }));\n };\n\n // Update function for AnglZone (zone properties)\n const updateAnglZone = (articleName: string, treeid: string, property: keyof AnglZone, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglzone: prev.anglzone.map((zone) =>\n zone.TREEID === treeid && zone.NAME === articleName\n ? { ...zone, [property]: newValue }\n : zone\n )\n }));\n };\n\n // Update function for AnglGrtx (custom properties like thickness)\n const updateAnglGrtx = (articleName: string, treeid: string, num: number, newValue: string) => {\n setEditableData(prev => ({\n ...prev,\n anglgrtx: prev.anglgrtx.map((grtx) =>\n grtx.TREEID === treeid &&\n grtx.NUM === num &&\n grtx.NAME === articleName\n ? {\n ...grtx,\n TEXT: newValue,\n DATE_LASTCHANGE: new Date().toISOString()\n }\n : grtx\n )\n }));\n };\n\n // Update function for AnglClie (custom properties like thickness)\n const updateAnglClie = (articleName: string, treeid: string, tagname: string, newValue: string, datatype: number) => {\n setEditableData(prev => ({\n ...prev,\n anglclie: prev.anglclie.map((clie) =>\n clie.TREEID === treeid &&\n clie.TAGNAME === tagname &&\n clie.DATATYPE === datatype &&\n clie.NAME === articleName\n ? {\n ...clie,\n TAGVALUE: newValue,\n DATE_LASTCHANGE: new Date().toISOString()\n }\n : clie\n )\n }));\n };\n\n // Update function for Variables\n const updateVariable = (name: string, newValue: string) => {\n setEditableData(prev => ({\n ...prev,\n variables: prev.variables?.map((variable) =>\n variable.NAME === name\n ? { ...variable, WERT: newValue }\n : variable\n ) || []\n }));\n };\n\n const value = {\n anglElems,\n anglZones,\n anglPrims,\n anglClies,\n anglGrtxs,\n drawerZones,\n\n\n // Construction principle data\n csides,\n kmsList,\n cabins,\n doors,\n drawers,\n cabbacks,\n variables,\n selectedElem,\n setSelectedElem,\n hoveredElem,\n setHoveredElem,\n updateAnglPrim,\n updateAnglElem,\n updateAnglZone,\n updateAnglClie,\n updateAnglGrtx,\n updateVariable,\n // Multi-article support\n getArticleData,\n allData: editableData,\n };\n\n return (\n <DataContext.Provider value={value}>\n {children}\n </DataContext.Provider>\n );\n}\n","import { createContext } from 'react';\r\nimport type { VariableContextValue } from './VariableProvider.tsx';\r\n\r\nexport const VariableContext = createContext<VariableContextValue | undefined>(undefined);\r\n","// ============================= VARIABLE TYPES ===============================================\nexport enum VAR_TYPE {\n None = 0,\n Profile = 2,\n Surface = 3,\n Material = 4,\n Kms = 5,\n Numeric = 100,\n Text = 120,\n color = 29\n}\n\n// ===================== IMOS VARIABLE STRUCTURE (From imos.json) ===============================\nexport interface ImosVariable {\n NAME: string;\n TYP: number;\n WERT: string; // Can be \"300\" or \"$OTHER_VAR\"\n}\n\n// ================================ TYPE GUARDS ============================================\nexport function isVariableReference(value: string): boolean {\n return value.startsWith('$');\n}\n\nexport function extractVariableName(reference: string): string {\n return reference.startsWith('$') ? reference.slice(1) : reference;\n}\n\n// ================================ VARIABLE CONTEXT ============================================\nexport interface VariableContextType {\n // Get a variable's final value (follows $REFERENCE chain)\n getValue: (name: string) => string | number | undefined;\n\n // Set/Update a variable value\n setValue: (name: string, value: string | number) => void;\n\n // Resolve a string containing $VARIABLE references\n resolveString: (str: string) => string;\n\n // Check if a string contains variable references\n hasVariables: (str: string) => boolean;\n\n // Get the raw variable tree (for debugging/inspection)\n getTree: () => Map<string, ImosVariable>;\n}","// ============================================================================\n// ULTRA-SIMPLE VARIABLE RESOLVER\n// Data is already flat with $VAR references in strings\n// ============================================================================\n\nimport {type ImosVariable, VAR_TYPE} from \"./variable.types.ts\";\n\nexport type VariableTree = Map<string, ImosVariable>;\n\n/**\n * Create variable tree - just convert array to Map\n */\nexport function createVariableTree(imosVariables: ImosVariable[]): VariableTree {\n return new Map(imosVariables.map(v => [v.NAME, v]));\n}\n\n/**\n * Get the final value by following $VAR references\n * V1 ($V2) -> V2 ($V3) -> V3 ($V4) -> V4 (400) = 400\n */\nexport function getValue(varName: string, tree: VariableTree, visited = new Set<string>()): string | number | undefined {\n const variable = tree.get(varName);\n if (!variable) return undefined;\n\n // Circular dependency check\n if (visited.has(varName)) {\n console.error(`Circular dependency: ${[...visited, varName].join(' -> ')}`);\n return undefined;\n }\n\n const value = variable.WERT;\n\n // If value starts with $, it's a reference - follow it\n if (value.startsWith('$') && variable.TYP != VAR_TYPE.Text) {\n const refName = value.slice(1); // Remove $\n visited.add(varName);\n return getValue(refName, tree, visited);\n }\n\n // Try to parse as number, otherwise return as string\n const num = Number(value);\n return isNaN(num) ? value : num;\n}\n\n/**\n * Set a variable's value (immutable update)\n */\nexport function setValue(\n varName: string,\n newValue: string | number,\n tree: VariableTree\n): VariableTree {\n const variable = tree.get(varName);\n if (!variable) {\n // console.warn(`Variable ${varName} not found`);\n return tree;\n }\n\n const newTree = new Map(tree);\n newTree.set(varName, { ...variable, WERT: String(newValue) });\n return newTree;\n}\n\n/**\n * Resolve variables in a string (e.g., \"1:$VAR_M1 mm\" → \"1:300 mm\")\n */\nexport function resolveString(str: string, tree: VariableTree): string {\n return str.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, varName) => {\n const value = getValue(varName, tree);\n return value !== undefined ? String(value) : match;\n });\n}\n\nexport function resolveRecursive(str: string, tree: VariableTree, maxDepth = 10): string {\n let result = str;\n let depth = 0;\n\n while (hasVariables(result) && depth < maxDepth) {\n result = result.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, varName) => {\n const value = getValue(varName, tree);\n return value !== undefined ? String(value) : match;\n });\n depth++;\n }\n\n if (depth >= maxDepth) {\n console.warn(`resolveString hit max depth (${maxDepth}), possible circular reference in: ${str}`);\n }\n\n return result;\n}\n\n/**\n * Check if a string contains variable references\n */\nexport function hasVariables(str: string): boolean {\n return /\\$[A-Za-z_][A-Za-z0-9_]*/g.test(str);\n}\n\n/**\n * Extract all variable names from a string\n */\nexport function extractVariableNames(str: string): string[] {\n const matches = str.matchAll(/\\$([A-Za-z_][A-Za-z0-9_]*)/g);\n return Array.from(matches, match => match[1]);\n}","import {type ReactNode, useCallback, useState} from 'react';\r\nimport {VariableContext} from './VariableContext.tsx';\r\nimport {createVariableTree, setValue as setValueInTree, type VariableTree} from './VariableResolver.ts';\r\nimport type {ImosVariable} from \"./variable.types.ts\";\r\n\r\nexport interface VariableProviderProps {\r\n children: ReactNode;\r\n imosVariables: ImosVariable[];\r\n}\r\n\r\nexport interface VariableContextValue {\r\n tree: VariableTree;\r\n setVarValue: (name: string, value: string | number) => void;\r\n}\r\n\r\n/**\r\n * Provides base variable tree from IMOS variable definitions\r\n * Use ArticleRelatedVariableProvider to apply article-specific overrides\r\n */\r\nexport function VariableProvider({ children, imosVariables }: VariableProviderProps) {\r\n // Create base variable tree (no overrides)\r\n const [tree, setTree] = useState<VariableTree>(() => {\r\n return createVariableTree(imosVariables);\r\n });\r\n\r\n // Provide setVarValue that updates the tree state\r\n const setVarValue = useCallback((name: string, value: string | number) => {\r\n setTree(currentTree => setValueInTree(name, value, currentTree));\r\n }, []);\r\n\r\n const contextValue: VariableContextValue = {tree, setVarValue};\r\n\r\n return (\r\n <VariableContext.Provider value={contextValue}>\r\n {children}\r\n </VariableContext.Provider>\r\n );\r\n}","import { createContext } from 'react';\nimport type { DescriptorManager } from '../../descriptor/services/DescriptorManager.ts';\n\nexport const DescriptorContext = createContext<DescriptorManager | null>(null);\n","import type {ComparisonOperator} from \"../types/condition.types.ts\";\r\n\r\n// Helper functions\r\nconst safeNumber = (value: unknown): number | null => {\r\n const num = Number(value);\r\n return isNaN(num) ? null : num;\r\n};\r\n\r\nconst safeString = (value: unknown): string => {\r\n return value == null ? '' : String(value);\r\n};\r\n\r\nconst compareNumbers = (\r\n left: unknown,\r\n right: unknown,\r\n compareFn: (l: number, r: number) => boolean\r\n): boolean => {\r\n const l = safeNumber(left);\r\n const r = safeNumber(right);\r\n if (l === null || r === null) return false;\r\n return compareFn(l, r);\r\n};\r\n\r\nconst compareStrings = (\r\n left: unknown,\r\n right: unknown,\r\n compareFn: (l: string, r: string) => boolean\r\n): boolean => {\r\n if (left == null || right == null) return false;\r\n return compareFn(safeString(left), safeString(right));\r\n};\r\n\r\n// Main comparison map\r\nexport const comparisonMap: Record<ComparisonOperator, (left: unknown, right: unknown) => boolean> = {\r\n // Equality\r\n '=': (left, right) => {\r\n if (left == null || right == null) return left === right;\r\n return safeString(left).trim() === safeString(right).trim();\r\n },\r\n '!=': (left, right) => {\r\n if (left == null || right == null) return left !== right;\r\n return safeString(left).trim() !== safeString(right).trim();\r\n },\r\n\r\n // Numeric comparisons - all use compareNumbers helper\r\n '>': (l, r) => compareNumbers(l, r, (a, b) => a > b),\r\n '<': (l, r) => compareNumbers(l, r, (a, b) => a < b),\r\n '>=': (l, r) => compareNumbers(l, r, (a, b) => a >= b),\r\n '<=': (l, r) => compareNumbers(l, r, (a, b) => a <= b),\r\n\r\n // HTML entity versions - reuse same logic\r\n '>': (l, r) => compareNumbers(l, r, (a, b) => a > b),\r\n '>=': (l, r) => compareNumbers(l, r, (a, b) => a >= b),\r\n '<': (l, r) => compareNumbers(l, r, (a, b) => a < b),\r\n '<=': (l, r) => compareNumbers(l, r, (a, b) => a <= b),\r\n\r\n // String operations - all use compareStrings helper\r\n 'B': (l, r) => compareStrings(l, r, (a, b) => a.startsWith(b)),\r\n '!B': (l, r) => compareStrings(l, r, (a, b) => !a.startsWith(b)),\r\n 'E': (l, r) => compareStrings(l, r, (a, b) => a.endsWith(b)),\r\n '!E': (l, r) => compareStrings(l, r, (a, b) => !a.endsWith(b)),\r\n 'C': (l, r) => compareStrings(l, r, (a, b) => a.includes(b)),\r\n '!C': (l, r) => compareStrings(l, r, (a, b) => !a.includes(b)),\r\n};","export const keyMapping: Record<string, string> = {\r\n 'Zusatzfilter 3': 'filter3',\r\n 'Zusatzfilter 4': 'filter4',\r\n // Add more mappings as needed\r\n};","// ============================================================================\n// EXPRESSION RESOLVER WITH IF() SUPPORT\n// Resolves strings with variables, math expressions, and conditional logic\n// ============================================================================\n\nimport {hasVariables, resolveString, type VariableTree} from \"../variables/VariableResolver\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ResolveOptions {\n variableTree?: VariableTree;\n dataType?: 'FL' | 'IN' | 'CI' | 'CS' | 'DA' | string;\n silent?: boolean;\n allowFunctions?: boolean;\n}\n\nexport interface ResolveResult {\n value: number | string | undefined;\n original: string;\n resolved: string;\n hadVariables: boolean;\n wasEvaluated: boolean;\n unit?: string; // ADD THIS\n error?: string;\n}\n\n// ============================================================================\n// MAIN RESOLVER FUNCTION\n// ============================================================================\n\nexport function resolve(\n input: string,\n options: ResolveOptions = {}\n): ResolveResult {\n const { variableTree, dataType, silent = false, allowFunctions = true } = options;\n const UNIT_PATTERN = /^(.+?)\\s*(mm|cm|m|in|ft|px|pt|%|deg|rad)$/i;\n\n\n\n const result: ResolveResult = {\n value: undefined,\n original: input,\n resolved: input,\n hadVariables: false,\n wasEvaluated: false,\n };\n\n try {\n let str = input.trim();\n\n if (UNIT_PATTERN.test(str)) {\n const match = str.match(UNIT_PATTERN);\n if (match) {\n str = match[1].trim(); // Extract expression without unit\n // unit = match[2]; // Store unit (mm, cm, etc.) - currently unused\n }\n }\n\n // Step 1: Resolve variables\n if (variableTree && hasVariables(str)) {\n result.hadVariables = true;\n str = resolveString(str, variableTree);\n result.resolved = str;\n }\n\n // Step 2: Check for IF() statements\n if (isIfStatement(str)) {\n result.wasEvaluated = true;\n result.value = evaluateIfStatement(str, allowFunctions);\n }\n // Step 3: Check if it's a mathematical expression\n else if (isMathExpression(str)) {\n result.wasEvaluated = true;\n result.value = evaluateExpression(str, allowFunctions);\n }\n // Step 4: Not an expression, return as-is or coerce by type\n else {\n result.value = coerceByDataType(str, dataType);\n }\n\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n\n if (!silent) {\n console.error(`[ExpressionResolver] Failed to resolve: \"${input}\"`, error);\n }\n\n result.value = input;\n }\n\n return result;\n}\n\nexport function resolveValue(\n input: string,\n options: ResolveOptions = {}\n): number | string | undefined {\n return resolve(input, options).value;\n}\n\n// ============================================================================\n// IF STATEMENT DETECTION & PARSING\n// ============================================================================\n\n/**\n * Check if a string is an IF statement\n */\nexport function isIfStatement(str: string): boolean {\n if (!str || typeof str !== 'string') return false;\n return /^\\s*IF\\s*\\(/i.test(str.trim());\n}\n\n/**\n * Parse and evaluate an IF statement\n * Format: IF(condition, trueValue, falseValue)\n *\n * Supports:\n * - Comparisons: =, !=, <, >, <=, >=\n * - Logical: AND, OR, NOT\n * - Nested IF statements\n *\n * @example\n * evaluateIfStatement(\"IF(1 = 1, -150, 150)\") // → -150\n * evaluateIfStatement(\"IF(5 > 3, 100, 200)\") // → 100\n */\nexport function evaluateIfStatement(expr: string, allowFunctions: boolean = true): number | string {\n const trimmed = expr.trim();\n\n // Remove outer IF( ... )\n const match = trimmed.match(/^IF\\s*\\((.*)\\)\\s*$/i);\n if (!match) {\n throw new Error(`Invalid IF statement: ${expr}`);\n }\n\n const content = match[1];\n\n // Split into: condition, trueValue, falseValue\n // This is tricky because we need to handle nested parentheses and commas\n const parts = splitIfParts(content);\n\n if (parts.length !== 3) {\n throw new Error(`IF statement must have exactly 3 parts: IF(condition, trueValue, falseValue). Got: ${parts.length} parts`);\n }\n\n const [conditionStr, trueValueStr, falseValueStr] = parts;\n\n // Evaluate the condition\n const conditionResult = evaluateCondition(conditionStr.trim(), allowFunctions);\n\n // Return the appropriate value\n const resultStr = conditionResult ? trueValueStr.trim() : falseValueStr.trim();\n\n // Recursively resolve the result (it might be another IF or expression)\n if (isIfStatement(resultStr)) {\n return evaluateIfStatement(resultStr, allowFunctions);\n } else if (isMathExpression(resultStr)) {\n return evaluateExpression(resultStr, allowFunctions);\n } else {\n // Try to parse as number, fallback to string\n const num = Number(resultStr);\n return isNaN(num) ? resultStr : num;\n }\n}\n\n/**\n * Split IF statement into [condition, trueValue, falseValue]\n * Handles nested parentheses and commas\n */\nfunction splitIfParts(content: string): string[] {\n const parts: string[] = [];\n let current = '';\n let depth = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (char === '(') {\n depth++;\n current += char;\n } else if (char === ')') {\n depth--;\n current += char;\n } else if (char === ',' && depth === 0) {\n parts.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) {\n parts.push(current);\n }\n\n return parts;\n}\n\n// ============================================================================\n// CONDITION EVALUATION\n// ============================================================================\n\n/**\n * Evaluate a boolean condition\n * Supports: =, !=, <, >, <=, >=, AND, OR, NOT\n */\nfunction evaluateCondition(condition: string, allowFunctions: boolean): boolean {\n // Handle logical operators (AND, OR)\n if (/\\bAND\\b/i.test(condition)) {\n const parts = condition.split(/\\bAND\\b/i);\n return parts.every(part => evaluateCondition(part.trim(), allowFunctions));\n }\n\n if (/\\bOR\\b/i.test(condition)) {\n const parts = condition.split(/\\bOR\\b/i);\n return parts.some(part => evaluateCondition(part.trim(), allowFunctions));\n }\n\n // Handle NOT\n if (/^\\s*NOT\\s+/i.test(condition)) {\n const inner = condition.replace(/^\\s*NOT\\s+/i, '').trim();\n return !evaluateCondition(inner, allowFunctions);\n }\n\n // Handle comparison operators\n const comparisonMatch = condition.match(/(.+?)(<=|>=|!=|<>|=|<|>)(.+)/);\n if (!comparisonMatch) {\n throw new Error(`Invalid condition: ${condition}`);\n }\n\n const [, leftStr, operator, rightStr] = comparisonMatch;\n\n // Evaluate both sides (they might be expressions)\n const left = evaluateSide(leftStr.trim(), allowFunctions);\n const right = evaluateSide(rightStr.trim(), allowFunctions);\n\n // Perform comparison\n switch (operator) {\n case '=':\n return left === right;\n case '!=':\n case '<>':\n return left !== right;\n case '<':\n return left < right;\n case '>':\n return left > right;\n case '<=':\n return left <= right;\n case '>=':\n return left >= right;\n default:\n throw new Error(`Unknown operator: ${operator}`);\n }\n}\n\n/**\n * Evaluate one side of a comparison\n * Could be a number, string, or expression\n */\nfunction evaluateSide(str: string, allowFunctions: boolean): number | string {\n // If it's quoted, return as string\n if ((str.startsWith('\"') && str.endsWith('\"')) ||\n (str.startsWith(\"'\") && str.endsWith(\"'\"))) {\n return str.slice(1, -1);\n }\n\n // Try to evaluate as expression\n if (isMathExpression(str)) {\n return evaluateExpression(str, allowFunctions);\n }\n\n // Try to parse as number\n const num = Number(str);\n if (!isNaN(num)) {\n return num;\n }\n\n // Return as string\n return str;\n}\n\n// ============================================================================\n// EXPRESSION DETECTION\n// ============================================================================\n\nexport function isMathExpression(str: string): boolean {\n if (!str || typeof str !== 'string') return false;\n const trimmed = str.trim();\n if (!/[+\\-*/()]/.test(trimmed)) return false;\n const isNumericExpression = /^[\\d\\s+\\-*/().,a-z]+$/i.test(trimmed);\n return isNumericExpression;\n}\n\n// ============================================================================\n// EXPRESSION EVALUATION\n// ============================================================================\n\nconst expressionCache = new Map<string, number>();\n\nexport function evaluateExpression(expr: string, allowFunctions: boolean = true): number {\n const trimmed = expr.trim();\n const cacheKey = `${trimmed}:${allowFunctions}`;\n\n if (expressionCache.has(cacheKey)) {\n return expressionCache.get(cacheKey)!;\n }\n\n let sanitized = trimmed.replace(/\\s+/g, '');\n\n if (allowFunctions) {\n sanitized = sanitized\n .replace(/round\\(/g, 'Math.round(')\n .replace(/floor\\(/g, 'Math.floor(')\n .replace(/ceil\\(/g, 'Math.ceil(')\n .replace(/abs\\(/g, 'Math.abs(')\n .replace(/min\\(/g, 'Math.min(')\n .replace(/max\\(/g, 'Math.max(')\n .replace(/pow\\(/g, 'Math.pow(')\n .replace(/sqrt\\(/g, 'Math.sqrt(');\n }\n\n const validPattern = allowFunctions\n ? /^[\\d+\\-*/().,a-zA-Z]+$/\n : /^[\\d+\\-*/().]+$/;\n\n if (!validPattern.test(sanitized)) {\n throw new Error(`Expression contains invalid characters: ${expr}`);\n }\n\n if (!sanitized) {\n throw new Error('Empty expression');\n }\n\n try {\n const result = Function(`'use strict'; return (${sanitized})`)() as unknown;\n\n if (typeof result !== 'number' || isNaN(result)) {\n throw new Error(`Expression did not evaluate to a number: ${expr}`);\n }\n\n expressionCache.set(cacheKey, result);\n return result;\n\n } catch (error) {\n throw new Error(`Failed to evaluate expression: ${expr} - ${error}`);\n }\n}\n\nexport function clearCache(): void {\n expressionCache.clear();\n}\n\n// ============================================================================\n// TYPE COERCION\n// ============================================================================\n\nfunction coerceByDataType(value: string, dataType?: string): number | string {\n if (!dataType) {\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n\n switch (dataType.toUpperCase()) {\n case 'FL':\n return parseFloat(value);\n case 'IN':\n return parseInt(value, 10);\n case 'CI':\n case 'CS':\n case 'ST':\n return value;\n case 'DA':\n return new Date(value).toISOString();\n default:\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n}\n\n// ============================================================================\n// BATCH RESOLUTION\n// ============================================================================\n\nexport function resolveMany(\n inputs: string[],\n options: ResolveOptions = {}\n): ResolveResult[] {\n return inputs.map(input => resolve(input, options));\n}\n\nexport function resolveObject<T extends Record<string, unknown>>(\n obj: T,\n options: ResolveOptions = {}\n): T {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n result[key] = resolveValue(value, options);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n\n// ============================================================================\n// DEBUGGING & UTILITIES\n// ============================================================================\n\nexport function inspect(input: string, options: ResolveOptions = {}): ResolveResult {\n return resolve(input, { ...options, silent: true });\n}\n\nexport function canResolve(input: string, options: ResolveOptions = {}): boolean {\n const result = resolve(input, { ...options, silent: true });\n return !result.error && result.value !== undefined;\n}","import type {ConditionTreeResponse, TreeNode} from \"../types/condition.types.ts\";\r\nimport {comparisonMap} from \"./ComparisonMap.tsx\";\r\nimport {keyMapping} from \"./KeyMap.tsx\";\r\nimport type {VariableTree} from \"../../variables/VariableResolver.ts\";\r\nimport {resolveValue} from \"../../helpers/ExpressionResolver.ts\";\r\n\r\nconst normalizeKey = (key:string) => keyMapping[key] || key;\r\n\r\nexport class ConditionTreeEvaluator {\r\n\r\n static evaluateTree = (\r\n tree: ConditionTreeResponse,\r\n data: Record<string, unknown>,\r\n variableTree?: VariableTree\r\n ): boolean => {\r\n if (!tree) return false; // Default behavior when a node is null\r\n return tree.roots.every((node) => this.evaluateNode(node, data, variableTree));\r\n }\r\n\r\n\r\n static evaluateNode = (node: TreeNode, data: Record<string, unknown>, variableTree?: VariableTree): boolean => {\r\n if (!node) return false; // Default behavior when a node is null\r\n\r\n\r\n if (node.kind === \"comparison\") {\r\n // const leftValue = ([normalizeKey(node.data.LEFTVALUE)]);\r\n // const rightValue = node.data.RIGHTVALUE;\r\n\r\n let leftValue: unknown = node.data.LEFTVALUE;\r\n const normalizedKey = normalizeKey(node.data.LEFTVALUE);\r\n\r\n if (data[normalizedKey] !== undefined) {\r\n leftValue = data[normalizedKey];\r\n } else {\r\n // Resolve as expression/variable\r\n leftValue = resolveValue(node.data.LEFTVALUE, {variableTree, dataType: node.data.DATATYPE, silent: true});\r\n }\r\n\r\n const rightValue = resolveValue(node.data.RIGHTVALUE, {variableTree, dataType: node.data.DATATYPE, silent: true});\r\n\r\n return comparisonMap[node.data.COMPARISONTYPE](leftValue, rightValue)\r\n\r\n }\r\n\r\n if (node.kind === \"operation\") {\r\n const childResults = node.children.map(child => this.evaluateNode(child, data, variableTree));\r\n switch (node.data.OPSTRING) {\r\n case \"AND\":return childResults.every(Boolean);\r\n case \"OR\":return childResults.some(Boolean);\r\n case \"NOT\":return !childResults.every(Boolean);\r\n case \"NOT OR\":return !childResults.some(Boolean);\r\n default:return false;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n","import {ConditionTreeEvaluator} from '../../conditions/helpers/ConditionTreeEvaluator';\nimport type {DescriptorEvaluationResult, DescriptorNode, DescriptorResponse} from '../types/descriptor.types';\nimport type {DescriptorTypeValue} from \"../types/descriptor-data.types.ts\";\nimport type {VariableTree} from \"../../variables/VariableResolver.ts\";\n\nexport class DescriptorEvaluator {\n static evaluate<T extends DescriptorTypeValue>(\n descriptor: DescriptorResponse<T>,\n data: Record<string, unknown>,\n variableTree?: VariableTree): DescriptorEvaluationResult<T> {\n\n // Find default node (conditionId = 0 or conditionTree = null)\n const defaultNode = descriptor.nodes.find((node: DescriptorNode) => node.conditionId === 0 || node.conditionTree === null);\n\n // Loop through nodes in order\n for (const node of descriptor.nodes) {\n\n // Skip default node\n if (node.conditionId === 0 || node.conditionTree === null) continue;\n\n // Evaluate the condition tree\n const matches = ConditionTreeEvaluator.evaluateTree(node.conditionTree, data, variableTree);\n\n // If condition matches, return this node's lindiv data\n if (matches) {\n return {\n lindiv: node.lindiv,\n nodeNum: node.nodeNum,\n matched: true,\n isDefault: false,\n descriptorType: descriptor.descriptor.DESC_TYPE,\n };\n }\n }\n\n // No node matched, return default\n if (defaultNode) {\n return {\n lindiv: defaultNode.lindiv,\n nodeNum: defaultNode.nodeNum,\n matched: false,\n isDefault: true,\n descriptorType: descriptor.descriptor.DESC_TYPE,\n };\n }\n\n // Fallback if no default exists - return empty data\n throw new Error('No matching node found and no default node exists');\n }\n\n static findAllNonDefaultMatches(descriptor: DescriptorResponse, data: Record<string, unknown>, variableTree?: VariableTree): DescriptorNode[] {\n const matches: DescriptorNode[] = [];\n\n for (const node of descriptor.nodes) {\n // Skip default node\n if (node.conditionId === 0 || node.conditionTree === null) continue;\n\n const matches_condition = ConditionTreeEvaluator.evaluateTree(node.conditionTree, data, variableTree);\n\n if (matches_condition) matches.push(node);\n }\n return matches;\n }\n}","import { DescriptorEvaluator } from '../helper/DescriptorEvaluator';\nimport type {\n DescriptorResponse,\n DescriptorEvaluationResult,\n} from '../types/descriptor.types';\nimport type { DescriptorTypeValue } from '../types/descriptor-data.types';\nimport type { VariableTree } from '../../variables/VariableResolver';\n// ============================================================================\n// Descriptor Manager Class\n// ============================================================================\n\nexport class DescriptorManager {\n private descriptors: Map<string, DescriptorResponse>;\n // private variableTree?: VariableTree;\n\n constructor(descriptors: DescriptorResponse[]) {\n // Store descriptors in a Map for fast lookup by name\n this.descriptors = new Map(descriptors.map(desc => [desc.descriptor.NAME, desc]));\n }\n evaluate<T extends DescriptorTypeValue = DescriptorTypeValue>(descriptorName: string, inputData: Record<string, unknown>, variableTree: VariableTree): DescriptorEvaluationResult<T> {\n const descriptor = this.getDescriptor(descriptorName);\n\n if (!descriptor) {\n throw new Error(`Descriptor not found: ${descriptorName}`);\n }\n\n return DescriptorEvaluator.evaluate(descriptor as DescriptorResponse<T>, inputData, variableTree);\n }\n\n getDescriptor(descriptorName: string): DescriptorResponse | undefined {\n return this.descriptors.get(descriptorName);}\n hasDescriptor(descriptorName: string): boolean {return this.descriptors.has(descriptorName);}\n getDescriptorNames(): string[] {return Array.from(this.descriptors.keys());}\n\n\n getDescriptorsByType(descriptorType: DescriptorTypeValue): DescriptorResponse[] {\n return Array.from(this.descriptors.values()).filter(\n desc => desc.descriptor.DESC_TYPE === descriptorType\n );\n }\n\n findAllMatches(descriptorName: string, inputData: Record<string, unknown>, variableTree: VariableTree) {\n const descriptor = this.getDescriptor(descriptorName);\n\n if (!descriptor) {\n throw new Error(`Descriptor not found: ${descriptorName}`);\n }\n\n return DescriptorEvaluator.findAllNonDefaultMatches(descriptor, inputData, variableTree);\n }\n\n getStats() {\n const byType: Record<number, number> = {};\n\n for (const descriptor of this.descriptors.values()) {\n const type = descriptor.descriptor.DESC_TYPE;\n byType[type] = (byType[type] || 0) + 1;\n }\n\n return {\n total: this.descriptors.size,\n byType,\n names: this.getDescriptorNames(),\n };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n// Create a DescriptorManager from JSON data\nexport function createDescriptorManager(\n jsonData: DescriptorResponse[] | { descriptors: DescriptorResponse[] },\n): DescriptorManager {\n const descriptors = Array.isArray(jsonData) ? jsonData : jsonData.descriptors;\n return new DescriptorManager(descriptors);\n}\n","import {type ReactNode, useMemo} from 'react';\nimport {DescriptorContext} from './DescriptorContext.ts';\nimport {DescriptorManager} from '../../descriptor/services/DescriptorManager.ts';\nimport type {DescriptorResponse} from '../../descriptor/types/descriptor.types.ts';\n\nexport interface DescriptorProviderProps {\n children: ReactNode;\n descriptorData: DescriptorResponse[] | unknown[]; // Allow any[] for JSON imports\n}\n\nexport function DescriptorProvider({ children, descriptorData }: DescriptorProviderProps) {\n // Get variable tree from context\n // Create manager once and memoize it (recreates when variables change)\n const manager = useMemo(() => {\n return new DescriptorManager(descriptorData as DescriptorResponse[],);\n }, [descriptorData]);\n\n return (\n <DescriptorContext.Provider value={manager}>\n {children}\n </DescriptorContext.Provider>\n );\n}\n","// src/contexts/material/MaterialContext.tsx\r\n\r\nimport { createContext, useContext } from 'react';\r\nimport type { MaterialTypes } from '../../construction_principle/material/material.types';\r\nimport type { SurfaceTypes } from '../../construction_principle/surface/surface.types';\r\n\r\nexport interface MatSurfContextValue {\r\n // Data\r\n materials: MaterialTypes[];\r\n surfaces: SurfaceTypes[];\r\n\r\n // Loading states\r\n loadingMaterials: Set<string>;\r\n loadingSurfaces: Set<string>;\r\n failedMaterials: Set<string>;\r\n failedSurfaces: Set<string>;\r\n\r\n // Fetching functions (async - use only in useEffect or event handlers)\r\n fetchMaterial: (name: string) => Promise<MaterialTypes | undefined>;\r\n fetchSurface: (name: string) => Promise<SurfaceTypes | undefined>;\r\n\r\n // Queue functions (safe to call during render - no setState)\r\n queueMaterialFetch: (name: string) => void;\r\n queueSurfaceFetch: (name: string) => void;\r\n\r\n // Utility functions\r\n isFetchingMaterial: (name: string) => boolean;\r\n isFetchingSurface: (name: string) => boolean;\r\n hasMaterial: (name: string) => boolean;\r\n hasSurface: (name: string) => boolean;\r\n hasFailedMaterial: (name: string) => boolean;\r\n hasFailedSurface: (name: string) => boolean;\r\n}\r\n\r\nexport const MatSurfContext = createContext<MatSurfContextValue | undefined>(undefined);\r\n\r\n/**\r\n * Hook to access material context\r\n */\r\nexport function useMatSurfs() {\r\n const context = useContext(MatSurfContext);\r\n if (!context) {\r\n throw new Error('useMaterials must be used within MaterialProvider');\r\n }\r\n return context;\r\n}","// src/contexts/material/MaterialProvider.tsx\r\n\r\nimport { useState, useCallback, useMemo, useEffect, useRef, type ReactNode } from 'react';\r\nimport { api } from '../../services/ApiFactory';\r\nimport type { MaterialTypes } from '../../construction_principle/material/material.types';\r\nimport type { SurfaceTypes } from '../../construction_principle/surface/surface.types';\r\nimport {MatSurfContext} from \"./MatSurfContext.tsx\";\r\n\r\nexport interface MatSurfProviderProps {\r\n children: ReactNode;\r\n initialMaterials?: MaterialTypes[];\r\n initialSurfaces?: SurfaceTypes[];\r\n}\r\n\r\nexport function MatSurfProvider({\r\n children,\r\n initialMaterials = [],\r\n initialSurfaces = []\r\n }: MatSurfProviderProps) {\r\n\r\n // ========== State Management ==========\r\n\r\n // Material and surface data (initial + fetched)\r\n const [materials, setMaterials] = useState<MaterialTypes[]>(initialMaterials);\r\n const [surfaces, setSurfaces] = useState<SurfaceTypes[]>(initialSurfaces);\r\n\r\n // Track in-flight requests to prevent duplicates\r\n const [loadingMaterials, setLoadingMaterials] = useState<Set<string>>(new Set());\r\n const [loadingSurfaces, setLoadingSurfaces] = useState<Set<string>>(new Set());\r\n\r\n // Track failed fetches to prevent retrying\r\n const [failedMaterials, setFailedMaterials] = useState<Set<string>>(new Set());\r\n const [failedSurfaces, setFailedSurfaces] = useState<Set<string>>(new Set());\r\n\r\n // ========== Utility Functions ==========\r\n\r\n /**\r\n * Check if material exists in loaded data\r\n */\r\n const hasMaterial = useCallback((name: string): boolean => {\r\n return materials.some(m => m.NAME === name);\r\n }, [materials]);\r\n\r\n /**\r\n * Check if surface exists in loaded data\r\n */\r\n const hasSurface = useCallback((name: string): boolean => {\r\n return surfaces.some(s => s.NAME === name);\r\n }, [surfaces]);\r\n\r\n /**\r\n * Check if material is currently being fetched\r\n */\r\n const isFetchingMaterial = useCallback((name: string): boolean => {\r\n return loadingMaterials.has(name);\r\n }, [loadingMaterials]);\r\n\r\n /**\r\n * Check if surface is currently being fetched\r\n */\r\n const isFetchingSurface = useCallback((name: string): boolean => {\r\n return loadingSurfaces.has(name);\r\n }, [loadingSurfaces]);\r\n\r\n /**\r\n * Check if material previously failed to fetch\r\n */\r\n const hasFailedMaterial = useCallback((name: string): boolean => {\r\n return failedMaterials.has(name);\r\n }, [failedMaterials]);\r\n\r\n /**\r\n * Check if surface previously failed to fetch\r\n */\r\n const hasFailedSurface = useCallback((name: string): boolean => {\r\n return failedSurfaces.has(name);\r\n }, [failedSurfaces]);\r\n\r\n // ========== Queue System (Safe for Render) ==========\r\n\r\n // Queues for deferred fetching (refs don't trigger re-renders)\r\n const materialFetchQueue = useRef<Set<string>>(new Set());\r\n const surfaceFetchQueue = useRef<Set<string>>(new Set());\r\n\r\n // Track if component is mounted\r\n const isMounted = useRef(false);\r\n\r\n // State to trigger re-render when items are queued\r\n const [queueTrigger, setQueueTrigger] = useState(0);\r\n\r\n /**\r\n * Queue a material fetch - SAFE to call during render\r\n * Does NOT trigger setState, just adds to queue\r\n */\r\n const queueMaterialFetch = useCallback((name: string) => {\r\n if (!name || name === '') return\r\n if (hasMaterial(name)) return\r\n if (loadingMaterials.has(name)) return\r\n if (failedMaterials.has(name)) return\r\n\r\n const wasEmpty = materialFetchQueue.current.size === 0;\r\n materialFetchQueue.current.add(name);\r\n\r\n // Trigger re-render if this was the first item (to process queue in useEffect)\r\n // Only trigger if component is mounted to avoid React warning\r\n if (wasEmpty) {\r\n queueMicrotask(() => {\r\n if (isMounted.current) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n });\r\n }\r\n\r\n }, [hasMaterial, loadingMaterials, failedMaterials]);\r\n\r\n /**\r\n * Queue a surface fetch - SAFE to call during render\r\n * Does NOT trigger setState, just adds to queue\r\n */\r\n const queueSurfaceFetch = useCallback((name: string) => {\r\n if (!name || name === '' || name === 'NO_SURF') return;\r\n if (hasSurface(name)) return;\r\n if (loadingSurfaces.has(name)) return;\r\n if (failedSurfaces.has(name)) return;\r\n\r\n const wasEmpty = surfaceFetchQueue.current.size === 0;\r\n surfaceFetchQueue.current.add(name);\r\n\r\n // Trigger re-render if this was the first item (to process queue in useEffect)\r\n // Only trigger if component is mounted to avoid React warning\r\n if (wasEmpty) {\r\n queueMicrotask(() => {\r\n if (isMounted.current) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n });\r\n }\r\n\r\n }, [hasSurface, loadingSurfaces, failedSurfaces]);\r\n\r\n // ========== Fetching Functions ==========\r\n\r\n /**\r\n * Fetch a material by name from API\r\n * @param name - Material NAME to fetch\r\n * @returns Promise resolving to Material or undefined\r\n */\r\n const fetchMaterial = useCallback(async (name: string): Promise<MaterialTypes | undefined> => {\r\n // Validation\r\n if (!name || name === '') {\r\n console.warn('fetchMaterial called with empty name');\r\n return undefined;\r\n }\r\n\r\n // Already have it?\r\n if (hasMaterial(name)) {\r\n return materials.find(m => m.NAME === name);\r\n }\r\n\r\n // Already fetching?\r\n if (loadingMaterials.has(name)) {\r\n return undefined;\r\n }\r\n\r\n // Already failed?\r\n if (failedMaterials.has(name)) {\r\n return undefined;\r\n }\r\n // Mark as fetching\r\n setLoadingMaterials(prev => new Set(prev).add(name));\r\n\r\n try {\r\n const material = await api.materialData().fetchById(name);\r\n\r\n if (material) {\r\n\r\n // Add to materials state\r\n setMaterials(prev => {\r\n // Double-check it wasn't added while fetching\r\n if (prev.some(m => m.NAME === name)) {\r\n return prev;\r\n }\r\n return [...prev, material];\r\n });\r\n\r\n return material;\r\n } else {\r\n console.warn(`[MaterialProvider] Material ${name} not found in database`);\r\n setFailedMaterials(prev => new Set(prev).add(name));\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error(`[MaterialProvider] Failed to fetch material ${name}:`, error);\r\n setFailedMaterials(prev => new Set(prev).add(name));\r\n return undefined;\r\n } finally {\r\n // Remove from fetching set\r\n setLoadingMaterials(prev => {\r\n const next = new Set(prev);\r\n next.delete(name);\r\n return next;\r\n });\r\n }\r\n }, [materials, hasMaterial, loadingMaterials, failedMaterials]);\r\n\r\n /**\r\n * Fetch a surface by name from API\r\n * @param name - Surface NAME to fetch\r\n * @returns Promise resolving to Surface or undefined\r\n */\r\n const fetchSurface = useCallback(async (name: string): Promise<SurfaceTypes | undefined> => {\r\n // Validation\r\n if (!name || name === '' || name === 'NO_SURF') {\r\n return undefined;\r\n }\r\n\r\n // Already have it?\r\n if (hasSurface(name)) return surfaces.find(s => s.NAME === name);\r\n\r\n // Already fetching?\r\n if (loadingSurfaces.has(name)) return undefined;\r\n\r\n // Already failed?\r\n if (failedSurfaces.has(name)) return undefined;\r\n\r\n // Mark as fetching\r\n setLoadingSurfaces(prev => new Set(prev).add(name));\r\n\r\n try {\r\n const surface = await api.surfaceData().fetchById(name);\r\n\r\n if (surface) {\r\n // Add to surfaces state\r\n setSurfaces(prev => {\r\n // Double-check it wasn't added while fetching\r\n if (prev.some(s => s.NAME === name)) {\r\n return prev;\r\n }\r\n return [...prev, surface];\r\n });\r\n\r\n return surface;\r\n } else {\r\n console.warn(`[MaterialProvider] Surface ${name} not found in database`);\r\n setFailedSurfaces(prev => new Set(prev).add(name));\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error(`[MaterialProvider] Failed to fetch surface ${name}:`, error);\r\n setFailedSurfaces(prev => new Set(prev).add(name));\r\n return undefined;\r\n } finally {\r\n // Remove from fetching set\r\n setLoadingSurfaces(prev => {\r\n const next = new Set(prev);\r\n next.delete(name);\r\n return next;\r\n });\r\n }\r\n }, [surfaces, hasSurface, loadingSurfaces, failedSurfaces]);\r\n\r\n // ========== Queue Processing (useEffect - Safe for setState) ==========\r\n\r\n /**\r\n * Set mounted flag and process any items queued during initial render\r\n */\r\n useEffect(() => {\r\n isMounted.current = true;\r\n\r\n // Process any items that were queued during initial render\r\n if (materialFetchQueue.current.size > 0 || surfaceFetchQueue.current.size > 0) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n /**\r\n * Process queued material and surface fetches\r\n * Runs when queueTrigger changes (when items are added to queue)\r\n */\r\n useEffect(() => {\r\n // Process material queue\r\n if (materialFetchQueue.current.size > 0) {\r\n const toFetch = Array.from(materialFetchQueue.current);\r\n materialFetchQueue.current.clear();\r\n\r\n toFetch.forEach((name) => {\r\n fetchMaterial(name); // Safe to call setState here\r\n });\r\n }\r\n\r\n // Process surface queue\r\n if (surfaceFetchQueue.current.size > 0) {\r\n const toFetch = Array.from(surfaceFetchQueue.current);\r\n surfaceFetchQueue.current.clear();\r\n\r\n toFetch.forEach((name) => {\r\n fetchSurface(name); // Safe to call setState here\r\n });\r\n }\r\n }, [queueTrigger, fetchMaterial, fetchSurface]); // Only run when queue is updated\r\n\r\n // ========== Context Value ==========\r\n\r\n const contextValue = useMemo(() => ({\r\n materials,\r\n surfaces,\r\n loadingMaterials,\r\n loadingSurfaces,\r\n failedMaterials,\r\n failedSurfaces,\r\n fetchMaterial,\r\n fetchSurface,\r\n queueMaterialFetch,\r\n queueSurfaceFetch,\r\n isFetchingMaterial,\r\n isFetchingSurface,\r\n hasMaterial,\r\n hasSurface,\r\n hasFailedMaterial,\r\n hasFailedSurface\r\n }), [\r\n materials,\r\n surfaces,\r\n loadingMaterials,\r\n loadingSurfaces,\r\n failedMaterials,\r\n failedSurfaces,\r\n fetchMaterial,\r\n fetchSurface,\r\n queueMaterialFetch,\r\n queueSurfaceFetch,\r\n isFetchingMaterial,\r\n isFetchingSurface,\r\n hasMaterial,\r\n hasSurface,\r\n hasFailedMaterial,\r\n hasFailedSurface\r\n ]);\r\n\r\n return (\r\n <MatSurfContext.Provider value={contextValue}>\r\n {children}\r\n </MatSurfContext.Provider>\r\n );\r\n}","export enum VIEW {\r\n _2D_TOP = '2D_TOP',\r\n _2D_FRONT = '2D_FRONT',\r\n _3D = '3D'\r\n}","import {Html} from '@react-three/drei';\nimport {VIEW} from \"../../types/view.types.ts\";\n\ninterface LoadingIndicatorProps {\n message?: string;\n view:VIEW\n insideCanvas?: boolean;\n}\n\n/**\n * Loading indicator that can be used inside or outside Canvas\n */\nexport function LoadingIndicator({view}: LoadingIndicatorProps) {\n const loadingContent = (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '10px',\n background: 'rgba(0, 0, 0, 0.8)',\n borderRadius: '8px',\n opacity:0.5,\n color: 'white',\n fontFamily: 'sans-serif'\n }}>\n <div style={{\n width: '10px',\n height: '10px',\n border: '4px solid rgba(255, 255, 255, 0.3)',\n borderTop: '4px solid white',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }} />\n <style>{`\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n\n // If inside Canvas, use Html component from drei\n if (view === VIEW._3D) {\n return (\n <Html center>\n {loadingContent}\n </Html>\n );\n }\n\n // If outside Canvas, use regular div\n return (\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1000\n }}>\n {loadingContent}\n </div>\n );\n}\n\n/**\n * Error display component\n */\nexport function ErrorDisplay({ error, insideCanvas = false }: { error: string; insideCanvas?: boolean }) {\n const errorContent = (\n <div style={{\n padding: '20px',\n background: 'rgba(255, 0, 0, 0.1)',\n border: '2px solid rgba(255, 0, 0, 0.5)',\n borderRadius: '8px',\n color: 'red',\n fontFamily: 'monospace',\n maxWidth: '500px'\n }}>\n <h3 style={{ margin: '0 0 10px 0', color: 'red' }}>Error</h3>\n <p style={{ margin: 0, fontSize: '14px', wordBreak: 'break-word' }}>{error}</p>\n </div>\n );\n\n if (insideCanvas) {\n return (\n <Html center>\n {errorContent}\n </Html>\n );\n }\n\n return (\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1000\n }}>\n {errorContent}\n </div>\n );\n}\n","import { useContext, useMemo } from 'react';\nimport { VariableContext } from './VariableContext.tsx';\nimport {getValue, resolveString, hasVariables, resolveRecursive} from './VariableResolver.ts';\n\n/**\n * Hook to access variables\n * Provides utilities to work with the variable tree\n */\nexport function useVariables() {\n const context = useContext(VariableContext);\n\n if (!context) {\n throw new Error('useVariables must be used within a VariableProvider');\n }\n\n const { tree, setVarValue } = context;\n\n // Get variable value\n const get = useMemo(() => (name: string) => getValue(name, tree), [tree]);\n\n // Resolve string with variables\n const resolveVar = useMemo(() => (str: string) => resolveString(str, tree), [tree]);\n\n const resolveVarRecursive = useMemo(() => (str : string ) => resolveRecursive(str, tree), [tree]);\n // Check if string has variables\n const has = useMemo(() => (str: string) => hasVariables(str), []);\n\n return {\n tree, // Variable tree\n getValue: get, // Get variable value\n resolveVar,\n resolveVarRecursive,\n hasVariables: has, // Check if string has variables\n setVarValue // Set variable value (updates tree state)\n };\n}","import {type ReactNode, useCallback, useMemo, useState} from 'react';\r\nimport {VariableContext} from '../../variables/VariableContext.tsx';\r\nimport {setValue as setValueInTree} from '../../variables/VariableResolver.ts';\r\nimport {useVariables} from '../../variables/useVariables.ts';\r\nimport type {VariableContextValue} from '../../variables/VariableProvider.tsx';\r\n\r\nexport interface ArticleRelatedVariableProviderProps {\r\n children: ReactNode;\r\n overrides?: Record<string, string | number>;\r\n}\r\n\r\n/**\r\n * Wraps VariableProvider to apply article-specific overrides\r\n * Supports both static overrides (from props) and dynamic changes (from Leva/setVarValue)\r\n *\r\n * Priority: Dynamic Changes > Static Overrides > Parent Tree\r\n */\r\nexport function ArticleRelatedVariableProvider({\r\n children,\r\n overrides\r\n }: ArticleRelatedVariableProviderProps) {\r\n // Get parent variable context (base variables)\r\n const parentContext = useVariables();\r\n\r\n // Track dynamic changes separately from static overrides\r\n const [dynamicChanges, setDynamicChanges] = useState<Map<string, string | number>>(new Map());\r\n\r\n // Merge: parent tree + static overrides + dynamic changes\r\n const tree = useMemo(() => {\r\n // Start with parent tree\r\n let newTree = new Map(parentContext.tree);\r\n\r\n // Apply static overrides from props\r\n if (overrides) {\r\n Object.entries(overrides).forEach(([name, value]) => {\r\n newTree = setValueInTree(name, value, newTree);\r\n });\r\n }\r\n\r\n // Apply dynamic changes (takes priority over everything)\r\n dynamicChanges.forEach((value, name) => {\r\n newTree = setValueInTree(name, value, newTree);\r\n });\r\n\r\n return newTree;\r\n }, [parentContext.tree, overrides, dynamicChanges]);\r\n\r\n // setVarValue updates dynamic changes (not parent tree)\r\n const setVarValue = useCallback((name: string, value: string | number) => {\r\n setDynamicChanges(current => {\r\n const newChanges = new Map(current);\r\n newChanges.set(name, value);\r\n return newChanges;\r\n });\r\n }, []);\r\n\r\n const value: VariableContextValue = {\r\n tree,\r\n setVarValue\r\n };\r\n\r\n return (\r\n <VariableContext.Provider value={value}>\r\n {children}\r\n </VariableContext.Provider>\r\n );\r\n}","// src/contexts/dimension/DimensionContext.ts\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\nimport {createContext} from \"react\";\n\nexport interface DimensionContextValue {\n dimensions: DimensionProps;\n setDimension: (key: keyof DimensionProps, value: number) => void;\n}\n\nexport const DimensionContext = createContext<DimensionContextValue | undefined>(undefined);","// src/contexts/dimension/useDimensions.ts\nimport {useContext} from \"react\";\nimport {DimensionContext} from \"./DimensionContext.ts\";\n\nexport function useDimensions() {\n const context = useContext(DimensionContext);\n if (!context) throw new Error('useDimensions must be used within DimensionProvider');\n return context;\n}","import {useControls, folder} from 'leva';\r\nimport {useEffect, useMemo, useRef} from 'react';\r\nimport {VAR_TYPE} from \"../../../variables/variable.types.ts\";\r\nimport {useVariables} from \"../../../variables/useVariables.ts\";\r\nimport {useDimensions} from \"../../../contexts/dimension/useDimensions.ts\";\r\n\r\ninterface LevaVariableControllerProps {\r\n articleName: string;\r\n articleId: string;\r\n onArticleNameChange?: (name: string) => void;\r\n}\r\n\r\nexport function LevaVariableController({articleName, articleId, onArticleNameChange}: LevaVariableControllerProps) {\r\n const {tree, setVarValue, getValue} = useVariables();\r\n const {dimensions, setDimension} = useDimensions()\r\n const updatingFromTreeRef = useRef(false);\r\n const updatingDimensionsRef = useRef(false);\r\n\r\n // Use articleId for unique panel name (falls back to articleName if articleId not available)\r\n const panelName = articleId || articleName;\r\n\r\n // Build Leva controls dynamically from variable tree\r\n const controlsConfig = useMemo(() => {\r\n const config: Record<string, any> = {};\r\n\r\n // Add article name control at the top level\r\n config['Article Name'] = {value: articleName, label: 'Article Name'};\r\n\r\n\r\n const numericVars: Record<string, any> = {};\r\n const surfaceVars: Record<string, any> = {};\r\n const materialVars: Record<string, any> = {};\r\n const kmsVars: Record<string, any> = {};\r\n const textVars: Record<string, any> = {};\r\n const profileVars: Record<string, any> = {};\r\n const colorsVars: Record<string, any> = {};\r\n\r\n Array.from(tree.entries()).forEach(([name, variable]) => {\r\n const currentValue = getValue(name);\r\n\r\n if (variable.TYP === VAR_TYPE.Numeric) {\r\n const numValue = currentValue;\r\n numericVars[name] = {value: numValue, min: -90, max: 20000, step: 1, label: name};\r\n } else if (variable.TYP === VAR_TYPE.Surface) {\r\n surfaceVars[name] = {value: String(currentValue || ''), label: name};\r\n } else if (variable.TYP === VAR_TYPE.Material) {\r\n materialVars[name] = {value: String(currentValue || ''), label: name};\r\n } else if (variable.TYP === VAR_TYPE.Kms) {\r\n kmsVars[name] = {value: String(currentValue || ''), label: name};\r\n } else if (variable.TYP === VAR_TYPE.Text) {\r\n textVars[name] = {value: String(currentValue || ''), label: name};\r\n } else if (variable.TYP === VAR_TYPE.Profile) {\r\n profileVars[name] = {value: String(currentValue || ''), label: name};\r\n } else if (variable.TYP === VAR_TYPE.color) {\r\n colorsVars[name] = {value: String(currentValue || ''), label: name};\r\n }\r\n });\r\n\r\n // ALWAYS create all folders (even if empty) to keep hook count stable\r\n config['Numeric'] = folder(numericVars, {collapsed: false});\r\n config['Surfaces'] = folder(surfaceVars, {collapsed: true});\r\n config['Materials'] = folder(materialVars, {collapsed: true});\r\n config['Part Definition'] = folder(kmsVars, {collapsed: true});\r\n config['Text'] = folder(textVars, {collapsed: true});\r\n config['Profiles'] = folder(profileVars, {collapsed: true});\r\n config['Colors'] = folder(colorsVars, {collapsed: true});\r\n\r\n return config;\r\n }, [tree, getValue, articleName, dimensions]);\r\n\r\n // Create Leva controls with unique panel name\r\n const controls = useControls(\r\n `Variables - ${panelName}`, controlsConfig)\r\n\r\n // Sync dimension changes from Leva back to context\r\n useEffect(() => {\r\n if (updatingDimensionsRef.current) {\r\n updatingDimensionsRef.current = false;\r\n return;\r\n }\r\n\r\n let hasChanges = false;\r\n\r\n // Handle dimension changes\r\n if (controls.width !== undefined && controls.width !== dimensions.width) {\r\n setDimension('width', controls.width as number);\r\n hasChanges = true;\r\n }\r\n if (controls.height !== undefined && controls.height !== dimensions.height) {\r\n setDimension('height', controls.height as number);\r\n hasChanges = true;\r\n }\r\n if (controls.depth !== undefined && controls.depth !== dimensions.depth) {\r\n setDimension('depth', controls.depth as number);\r\n hasChanges = true;\r\n }\r\n\r\n if (hasChanges) {\r\n updatingDimensionsRef.current = true;\r\n }\r\n }, [controls.width, controls.height, controls.depth, dimensions, setDimension]);\r\n\r\n\r\n // Sync Leva control changes back to variable tree\r\n useEffect(() => {\r\n // Skip if we're updating from tree to avoid loops\r\n if (updatingFromTreeRef.current) {\r\n updatingFromTreeRef.current = false;\r\n return;\r\n }\r\n\r\n let hasChanges = false;\r\n Object.entries(controls).forEach(([varName, value]) => {\r\n // Handle article name separately\r\n if (varName === 'Article Name') {\r\n if (articleName !== value && onArticleNameChange) {\r\n onArticleNameChange(value as string);\r\n hasChanges = true;\r\n }\r\n return;\r\n }\r\n\r\n // Get current value using getValue to properly resolve references\r\n const currentValue = getValue(varName);\r\n\r\n // Only update if value actually changed to avoid loops\r\n // Use loose equality to handle string/number differences\r\n if (currentValue != value) { // Intentional != (not !==)\r\n setVarValue(varName, value);\r\n hasChanges = true;\r\n }\r\n });\r\n\r\n // Set flag if we made any changes to prevent re-triggering\r\n if (hasChanges) {\r\n updatingFromTreeRef.current = true;\r\n }\r\n }, [controls, getValue, setVarValue, articleName, onArticleNameChange]);\r\n\r\n // Component doesn't render anything - Leva panel appears automatically\r\n // To customize width, use CSS or add custom settings to useControls\r\n return null;\r\n\r\n}"," import { useContext } from 'react';\nimport { DataContext } from './DataContext.ts';\n\nexport function useData() {\n const context = useContext(DataContext);\n if (context === undefined) {\n throw new Error('useData must be used within a DataProvider');\n }\n return context;\n}\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\n\r\nexport default function useClieHelper(articleName:string, TREEID:string, TAG:string, DATATYPE:number){\r\n const {getArticleData} = useData();\r\n // Get data for this specific article\r\n const {anglClies} = getArticleData(articleName);\r\n const selected_clie = anglClies.find((item) => item.TREEID === TREEID && item.DATATYPE === DATATYPE && item.TAGNAME === TAG)\r\n if (!selected_clie) return null\r\n\r\n const thickness = Number(selected_clie.TAGVALUE)\r\n\r\n return {\r\n thickness,\r\n }\r\n}","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function useGrtxHelper(articleName:string, TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {resolveVarRecursive} = useVariables()\r\n\r\n const grtxData = getArticleData(articleName).anglGrtxs;\r\n if (!grtxData) return null\r\n const zoneGrtx = grtxData.filter((grtx) => grtx.TREEID === TREEID);\r\n const zoneInfo = new Map<string,string>()\r\n zoneGrtx.map(grtx => zoneInfo.set(`AD zone info0${grtx.NUM + 1}`, resolveVarRecursive(grtx.TEXT)))\r\n\r\n\r\n return {\r\n zoneInfo\r\n }\r\n}\r\n","export function KmsRenderSelector(\r\n materialRender: string | undefined,\r\n surfaceTopRender: string | undefined,\r\n surfaceBottomRender: string | undefined\r\n): string | undefined {\r\n const noTop = !surfaceTopRender || surfaceTopRender === 'NO_RENDER';\r\n const noBottom = !surfaceBottomRender || surfaceBottomRender === 'NO_RENDER';\r\n\r\n // Use material only if both surfaces are NO_SURF/undefined\r\n if (noTop && noBottom) return materialRender;\r\n\r\n // Prefer top surface (exterior/visible)\r\n if (!noTop) return surfaceTopRender;\r\n\r\n // Fall back to bottom surface\r\n if (!noBottom) return surfaceBottomRender;\r\n\r\n // Ultimate fallback\r\n return materialRender;\r\n}","export interface RenderResult {\r\n textureId: string | undefined,\r\n isValid: boolean\r\n}\r\nexport default function RenderHelper(textureId?: string) : RenderResult {\r\n if (!textureId || textureId === '') {\r\n return {\r\n textureId: undefined,\r\n isValid: false\r\n };\r\n }\r\n\r\n return {\r\n textureId: textureId,\r\n isValid: true\r\n };\r\n}","import RenderHelper, {type RenderResult} from \"../render/RenderHelper.tsx\";\r\nimport {type MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport type {MaterialTypes} from \"./material.types.ts\";\r\n\r\nexport interface MatResult extends MaterialTypes{\r\n renderInfo: RenderResult;\r\n}\r\n\r\nexport default function MatHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n materialName:string,\r\n) : MatResult | undefined {\r\n const {materials, queueMaterialFetch, isFetchingMaterial, hasMaterial, hasFailedMaterial} = matSurfContext\r\n\r\n const material = materials.find((material) => material.NAME === materialName)\r\n\r\n // Skip invalid material names (empty, \"0\", etc.)\r\n const isValidMaterialName = materialName && materialName !== '' && materialName !== '0';\r\n\r\n if (!material && isValidMaterialName){\r\n // Only log if we're actually going to queue it (not already loading/failed)\r\n if (!isFetchingMaterial(materialName) && !hasMaterial(materialName) && !hasFailedMaterial(materialName)) {\r\n // console.log(`[MatHelper] Material ${materialName} not found, queuing fetch`);\r\n }\r\n queueMaterialFetch(materialName); // Safe during render - no setState\r\n }\r\n\r\n if (!material) return undefined\r\n\r\n // Resolve RENDER value before passing to RenderHelper\r\n const resolvedRender = resolveVarRecursive(material?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...material, renderInfo}\r\n}","import RenderHelper, {type RenderResult} from \"../render/RenderHelper.tsx\";\r\nimport {type MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport type {SurfaceTypes} from \"./surface.types.ts\";\r\n\r\nexport interface SurfResult extends SurfaceTypes{\r\n renderInfo: RenderResult;\r\n}\r\n\r\nexport default function SurfHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n surfaceName:string\r\n): SurfResult | undefined {\r\n const {surfaces, queueSurfaceFetch, isFetchingSurface, hasSurface, hasFailedSurface} = matSurfContext\r\n\r\n const surface = surfaces.find((surface) => surface.NAME === surfaceName)\r\n\r\n // Skip invalid surface names (empty, \"0\", etc.)\r\n const isValidSurfaceName = surfaceName && surfaceName !== '' && surfaceName !== '0';\r\n\r\n if (!surface && isValidSurfaceName) {\r\n // Only log if we're actually going to queue it (not already loading/failed)\r\n if (!isFetchingSurface(surfaceName) && !hasSurface(surfaceName) && !hasFailedSurface(surfaceName)) {\r\n console.log(`[SurfHelper] Surface ${surfaceName} not found, queuing fetch`);\r\n }\r\n queueSurfaceFetch(surfaceName); // Safe during render - no setState\r\n }\r\n\r\n if (!surface) return undefined\r\n\r\n // Resolve RENDER value before passing to RenderHelper\r\n const resolvedRender = resolveVarRecursive(surface?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...surface,renderInfo}\r\n}\r\n","import {KmsRenderSelector} from \"./KmsRenderSelector.ts\";\r\nimport MatHelper, {type MatResult} from \"../material/MatHelper.ts\";\r\nimport SurfHelper, {type SurfResult} from \"../surface/SurfHelper.ts\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface KmsResult {\r\n name:string;\r\n material:MatResult | undefined;\r\n surfaceTop:SurfResult | undefined;\r\n surfaceBot:SurfResult | undefined;\r\n render:string | undefined\r\n thk:number\r\n}\r\n\r\nexport default function KmsHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,\r\n NAME: string\r\n) : KmsResult | undefined {\r\n const resolvedName = resolveVarRecursive(NAME)\r\n const currentKms = articleData.kmsList.find((kms) => kms.NAME === resolvedName)\r\n if (!currentKms) {\r\n console.warn(`KMS ${resolvedName} not found`)\r\n return undefined\r\n }\r\n const materialName = resolveVarRecursive(currentKms?.MATERIAL || '')\r\n const surfaceTopName = resolveVarRecursive(currentKms?.SURF0 || '')\r\n const surfaceBottomName = resolveVarRecursive(currentKms?.SURF1 || '')\r\n\r\n const material = MatHelper(resolveVarRecursive,matSurfContext,materialName)\r\n const surfaceTop = SurfHelper(resolveVarRecursive,matSurfContext,surfaceTopName)\r\n const surfaceBottom = SurfHelper(resolveVarRecursive,matSurfContext,surfaceBottomName)\r\n\r\n const render = KmsRenderSelector(material?.renderInfo.textureId, surfaceTop?.renderInfo.textureId, surfaceBottom?.renderInfo.textureId)\r\n\r\n return {\r\n name : resolvedName,\r\n material : material,\r\n surfaceTop : surfaceTop,\r\n surfaceBot : surfaceBottom,\r\n render:render,\r\n thk :(material?.THK || 0) + ( surfaceTop?.THK || 0 ) + (surfaceBottom?.THK || 0)\r\n }\r\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface SidePanelResult {\r\n kms: KmsResult | undefined;\r\n}\r\n\r\nexport default function CSideHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,NAME:string) : SidePanelResult | undefined{\r\n const currentCP = articleData.csides.find((cside) => cside.NAME === NAME)\r\n if (!currentCP) {\r\n return undefined\r\n }\r\n const kms = KmsHelper(resolveVarRecursive,matSurfContext, articleData,currentCP.KMS)\r\n return {\r\n kms\r\n }\r\n}","import type {AnglZone} from \"./data.types.tsx\";\nimport type {DimensionProps} from \"./zone.types.tsx\";\n\nexport type DivisionDirection = 'A' | 'D' | 'H' | 'I' | 'V'; // H=Horizontal, V=Vertical\nexport type HorizontalDefType = '2' | 'A' | 'D' | 'P' | 'W'; // W=Width, D=Depth, P=Perpendicular\n// export type DividerType = 'A' | 'B' | 'C' | 'D' | 'F' | 'P' | 'S' | 'T' | 'V'\nexport enum DividerType {\n adjShelf= 'A',\n fixShelf = 'F',\n topShelf = 'T',\n botShelf = 'B',\n virtual = 'V',\n sidePanel = 'S',\n addPanel = 'D',\n partition = 'P',\n backPanel = 'C',\n}\ntype DividerProps = Pick<AnglZone, 'NAME' | 'TREEID' | 'DIVDIR' | 'DIVTYPE' | 'HORDEFTYPE' | 'LINDIV1' | 'DIVELEM1' | 'DIVIDER'>\n\nexport const DividerTypeConst = {\n LINEAR_DIVISION: 'linear-division',\n ARTICLE: 'article',\n} as const;\n\nexport const ValueSourceConst = {\n STRING: 'string', // Direct value\n DESCRIPTOR: 'descriptor', // Value from descriptor evaluation\n} as const;\n\n// Base divider information shared by all types\ninterface BaseDivider {\n NAME: string;\n TREEID: string\n DIVDIR: DivisionDirection;\n DIVTYPE: DividerType;\n HORDEFTYPE: HorizontalDefType;\n LINDIV1: string; // Linear division formula\n DIVELEM1: number; // Division element ID\n DIVIDER: string\n}\n\n// ============================================================================\n// LINEAR DIVISION TYPES (Nested Discrimination)\n// ============================================================================\n\n// Linear Division - String Type (e.g., \"1:1:1\" or \"200mm:1:1\")\nexport interface LinearDivisionString extends BaseDivider {\n type: typeof DividerTypeConst.LINEAR_DIVISION;\n valueSource: typeof ValueSourceConst.STRING;\n thickness: number;\n}\n\n// Linear Division - Descriptor Type (e.g., \"#DESCRIPTOR_NAME\")\nexport interface LinearDivisionDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.LINEAR_DIVISION;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n thickness: number;\n}\n\n// Union of linear division types\nexport type LinearDivisionMode = LinearDivisionString | LinearDivisionDescriptor;\n\n\n// ============================================================================\n// ARTICLE DIVIDER\n// ============================================================================\n\nexport interface ArticleString extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.STRING;\n}\n\n// Article - Descriptor Reference\nexport interface ArticleDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n}\n\nexport type ArticleMode = ArticleString | ArticleDescriptor;\n\n// ============================================================================\n// MAIN UNION TYPE\n// ============================================================================\n\nexport type DividerMode = LinearDivisionMode | ArticleMode;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n\nexport const isDivider = {\n // Check if divider is linear division (any source)\n linearDivision: (divider: DividerMode): divider is LinearDivisionMode => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION;\n },\n\n // Check if divider is article (any source)\n article: (divider: DividerMode): divider is ArticleMode => {\n return divider.type === DividerTypeConst.ARTICLE;\n },\n};\n\nexport const isLinearDivision = {\n // Check if linear division uses direct string formula\n string: (divider: DividerMode): divider is LinearDivisionString => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION &&\n divider.valueSource === ValueSourceConst.STRING;\n },\n\n // Check if linear division uses descriptor\n descriptor: (divider: DividerMode): divider is LinearDivisionDescriptor => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION &&\n divider.valueSource === ValueSourceConst.DESCRIPTOR;\n },\n};\n\nexport const isArticle = {\n // Check if article uses direct string name\n string: (divider: DividerMode): divider is ArticleString => {\n return divider.type === DividerTypeConst.ARTICLE &&\n divider.valueSource === ValueSourceConst.STRING;\n },\n\n // Check if article uses descriptor\n descriptor: (divider: DividerMode): divider is ArticleDescriptor => {\n return divider.type === DividerTypeConst.ARTICLE &&\n divider.valueSource === ValueSourceConst.DESCRIPTOR;\n },\n};\n\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport const createDivider = {\n // Create a linear division with string formula\n linearDivisionString(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n DIVIDER: string,\n thickness: number,\n ): LinearDivisionString {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER,\n thickness,\n };\n },\n\n // Create a linear division with descriptor reference\n // Create linear division with descriptor reference\n linearDivisionDescriptor(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n DIVIDER: string,\n thickness: number,\n ): LinearDivisionDescriptor {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER,\n thickness,\n };\n },\n\n\n // Create an article divider\n // Create article with direct name string\n articleString(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVIDER: string,\n DIVELEM1: number,\n ): ArticleString {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVIDER,\n DIVELEM1,\n };\n },\n\n // Create article with descriptor reference\n articleDescriptor(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVIDER: string,\n DIVELEM1: number,\n ): ArticleDescriptor {\n return {\n NAME,\n TREEID,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVIDER,\n DIVELEM1,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.DESCRIPTOR,\n };\n },\n // Smart factory: Automatically determines type and source\n fromZoneData(divProps: DividerProps, thickness: number): DividerMode {\n const isDescriptor = (value: string) => value.trim().startsWith('#');\n // ========== ARTICLE DIVIDER ==========\n if (divProps.DIVDIR === 'A') {\n // Article with descriptor reference\n if (isDescriptor(divProps.DIVIDER)) {\n return createDivider.articleDescriptor(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVIDER,\n divProps.DIVELEM1,\n );\n }\n\n // Article with direct name string\n return createDivider.articleString(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVIDER,\n divProps.DIVELEM1,\n );\n }\n\n // ========== LINEAR DIVISION ==========\n // Linear division with descriptor reference\n if (isDescriptor(divProps.LINDIV1)) {\n return createDivider.linearDivisionDescriptor(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER,\n thickness\n );\n }\n\n // Linear division with direct formula string\n return createDivider.linearDivisionString(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER,\n thickness\n );\n },\n};\n\n// Get which axis is being divided\nexport function getDividedAxis(divider?: DividerMode): 'width' | 'depth' | 'height' {\n if (!divider) return 'width'\n const PERPENDICULAR_AXIS_MAP: Record<number, 'width' | 'depth'> = {\n 0: 'width',\n 1: 'depth',\n 2: 'width',\n 3: 'depth',\n };\n\n if (divider.DIVDIR === 'V') {\n return 'height';\n }\n\n if (divider.HORDEFTYPE === 'W') {\n return 'width';\n } else if (divider.HORDEFTYPE === 'D') {\n return 'depth';\n } else if (divider.HORDEFTYPE === 'P') {\n return PERPENDICULAR_AXIS_MAP[divider.DIVELEM1] ?? 'width';\n }\n\n return 'width';\n}\n\nexport function getDividedLength(axis: 'width' | 'depth' | 'height', dimensions?: DimensionProps): number {\n if (!dimensions) return 0;\n return dimensions[axis];\n}\n\n// Check if divider divides horizontally\nexport function isHorizontalDivision(divider: DividerMode): boolean {\n return divider.DIVDIR === 'H';\n}\n\n// Check if divider divides vertically\nexport function isVerticalDivision(divider: DividerMode): boolean {\n return divider.DIVDIR === 'V';\n}","import type {ZoneProps} from \"./zone.types.tsx\";\r\nimport type {ElemHelperType} from \"./helper.types.ts\";\r\n\r\nexport enum ElemPartType {\r\n SidePanel = 'S',\r\n Door = 'D',\r\n Back = 'B',\r\n Shelf = 'H',\r\n}\r\n\r\nexport enum ElemTrimType{\r\n short = 'S',\r\n long = 'L',\r\n mitre = 'M',\r\n perpendicular = 'P'\r\n}\r\n\r\nexport interface ElemProps extends ZoneProps {\r\n helper: {\r\n front: ElemHelperType | null;\r\n left: ElemHelperType | null;\r\n right: ElemHelperType | null;\r\n back: ElemHelperType | null;\r\n };\r\n}","export enum DrawerType{\n Drawer = 'Dr'\n}","import {DividerType} from '../../types/divider.types';\nimport {ElemPartType} from \"../../types/Elem.types.tsx\";\nimport {DrawerType} from \"../drawer/dto/drawer.types.ts\";\n\n\nexport type PartTypeSource = 'elem' | 'divider' | 'drawer';\n\n// ============================================================================\n// MAPPING CONFIG\n// ============================================================================\nconst TYPE_TO_HELPER = {\n elem: {\n [ElemPartType.Shelf]: 'Cabin',\n [ElemPartType.SidePanel]: 'Side',\n [ElemPartType.Back]: 'Back',\n [ElemPartType.Door]: 'Door',\n },\n divider: {\n [DividerType.adjShelf]: 'Cabin',\n [DividerType.fixShelf]: 'Cabin',\n [DividerType.topShelf]: 'Cabin',\n [DividerType.botShelf]: 'Cabin',\n [DividerType.addPanel]: 'Cabin',\n [DividerType.partition]: 'Cabin',\n [DividerType.sidePanel]: 'Side',\n [DividerType.backPanel]: 'Back',\n [DividerType.virtual]: null,\n },\n drawer:{\n [DrawerType.Drawer]:'drawer'\n }\n} as const;\n\n// ============================================================================\n// AUTO-GENERATED SETS\n// ============================================================================\nfunction createTypeSets<T extends string>(mapping: Record<string, string | null>, helper: string) {\n return new Set(\n Object.entries(mapping)\n .filter(([_, h]) => h === helper)\n .map(([type]) => type as T)\n );\n}\n\n// Elem Sets\nexport const ElemCabinTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Cabin');\nexport const ElemCSideTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Side');\nexport const ElemCabBackTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Back');\nexport const ElemDoorTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Door');\n\n// Divider Sets\nexport const DividerCabinTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Cabin');\nexport const DividerCSideTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Side');\nexport const DividerCabBackTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Back');\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\nexport const isCabinType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCabinTypes.has(type as ElemPartType)\n : DividerCabinTypes.has(type as DividerType);\n\nexport const isCSideType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCSideTypes.has(type as ElemPartType)\n : DividerCSideTypes.has(type as DividerType);\n\nexport const isCabBackType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCabBackTypes.has(type as ElemPartType)\n : DividerCabBackTypes.has(type as DividerType);\n\nexport const isDoorType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemDoorTypes.has(type as ElemPartType)\n : false\n\nexport const isDrawerType = (source: PartTypeSource): boolean => source === 'drawer';\n\n","import {ElemPartType} from \"../../types/Elem.types.tsx\";\nimport {type SidePanelResult} from \"../side_panel/CSideHelper.tsx\";\nimport type {BackPanelResult} from \"../cabBack/CabBackHelper.tsx\";\nimport type {DoorResult} from \"../door/DoorHelper.ts\";\nimport type {ShelfResult} from \"../cabin/CabinHelper.ts\";\nimport type {DrawerHelperResult} from \"../drawer/DrawerHelper.tsx\";\nimport {DrawerType} from \"../drawer/dto/drawer.types.ts\";\n\nexport type CpDispatcherResult =\n | { name: string; type: ElemPartType.SidePanel; props: SidePanelResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Back; props: BackPanelResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Door; props: DoorResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Shelf; props: ShelfResult | undefined; thk: number }\n | { name: string; type: DrawerType.Drawer; props: DrawerHelperResult | undefined, thk:number }\n\n\n// ============================================================================\n// RESULT TYPE GUARDS (for narrowing CpDispatcherResult)\n// ============================================================================\n\nexport function isCpDescriptor (cpName:string): boolean {\n return cpName.startsWith('#')\n}\n\nexport function isCpVariable(cpName:string) : boolean {\n return cpName.startsWith('$')\n}\n\nexport function isSidePanel(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.SidePanel;\n props: SidePanelResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.SidePanel && cp.props !== undefined;\n}\n\nexport function isBackPanel(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Back;\n props: BackPanelResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Back && cp.props !== undefined;\n}\n\nexport function isDoor(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Door;\n props: DoorResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Door && cp.props !== undefined;\n}\n\nexport function isShelf(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Shelf;\n props: ShelfResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Shelf && cp.props !== undefined;\n}\n\nexport function isDrawer(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: DrawerType.Drawer;\n props: DrawerHelperResult;\n thk:number;\n} {\n return cp !== undefined && cp.type === DrawerType.Drawer && cp.props !== undefined;\n}\n","/*\n * React Hook for Descriptor Evaluation\n *\n * Provides easy descriptor evaluation with automatic re-evaluation\n * when input data changes.\n */\n\nimport { useMemo } from 'react';\nimport type { DescriptorManager } from '../../descriptor/services/DescriptorManager.ts';\nimport type {DescriptorEvaluationResult, DescriptorNode,} from '../../descriptor/types/descriptor.types.ts';\nimport type { DescriptorTypeValue } from '../../descriptor/types/descriptor-data.types.ts';\nimport type {VariableTree} from \"../../variables/VariableResolver.ts\";\n\n// =========================== Hook: useDescriptorEvaluation =================================================\n\nexport interface UseDescriptorOptions {\n /** Throw error if descriptor not found (default: false) */\n throwOnError?: boolean;\n}\n\nexport interface UseDescriptorResult<T extends DescriptorTypeValue> {\n /** Evaluation result (null if error and throwOnError=false) */\n result: DescriptorEvaluationResult<T> | null;\n /** Error message if evaluation failed */\n error: string | null;\n /** Whether evaluation was successful */\n success: boolean;\n}\n\n//Hook to evaluate a descriptor with automatic re-evaluation on input change\nexport function useDescriptorEvaluation<T extends DescriptorTypeValue = DescriptorTypeValue>(\n manager: DescriptorManager,\n descriptorName: string | undefined,\n inputData: Record<string, unknown>,\n options: UseDescriptorOptions = {},\n variableTree: VariableTree\n): UseDescriptorResult<T> {\n const { throwOnError = false } = options;\n\n // Handle undefined or non-existent descriptor gracefully\n descriptorName = descriptorName?.replace('#','')\n const descriptorExists = descriptorName ? manager.hasDescriptor(descriptorName) : false;\n\n return useMemo(() => {\n // Return null result if descriptor doesn't exist\n if (!descriptorExists || !descriptorName) {\n return {\n result: null,\n error: null,\n success: false,\n };\n }\n\n try {\n const result = manager.evaluate<T>(descriptorName, inputData, variableTree);\n\n return {\n result,\n error: null,\n success: true,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n if (throwOnError) {\n throw error;\n }\n\n return {\n result: null,\n error: errorMessage,\n success: false,\n };\n }\n }, [manager, descriptorName, inputData, throwOnError, variableTree, descriptorExists]);\n}\n\n// ============================= Hook: useDescriptorMatches ===============================================\n\nexport interface UseDescriptorMatchesResult {\n /** All matching nodes */\n matches: DescriptorNode[];\n /** Error message if evaluation failed */\n error: string | null;\n /** Number of matches found */\n count: number;\n}\n\n//Hook to find all matching nodes for a descriptor/\nexport function useDescriptorMatches(manager: DescriptorManager, descriptorName: string, inputData: Record<string, unknown>, variableTree: VariableTree ): UseDescriptorMatchesResult {\n return useMemo(() => {\n try {\n const matches = manager.findAllMatches(descriptorName, inputData, variableTree);\n\n return {\n matches,\n error: null,\n count: matches.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n return {\n matches: [],\n error: errorMessage,\n count: 0,\n };\n }\n }, [manager, descriptorName, inputData, variableTree]);\n}\n\n// ================================= Hook: useDescriptorExists ===========================================\n\n//Hook to check if a descriptor exists\nexport function useDescriptorExists(manager: DescriptorManager, descriptorName: string): boolean {\n return useMemo(\n () => manager.hasDescriptor(descriptorName),\n [manager, descriptorName]\n );\n}\n\n// =============================== Hook: useDescriptorList =============================================\n\nexport interface UseDescriptorListOptions {\n /** Filter by descriptor type */\n type?: DescriptorTypeValue;\n}\n\n//Hook to get list of available descriptors\nexport function useDescriptorList(manager: DescriptorManager, options: UseDescriptorListOptions = {}): string[] {\n const { type } = options;\n\n return useMemo(() => {\n if (type !== undefined) {\n const descriptors = manager.getDescriptorsByType(type);\n return descriptors.map(d => d.descriptor.NAME);\n }\n\n return manager.getDescriptorNames();\n }, [manager, type]);\n}\n","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {DataContextType} from \"../../types/data.types.tsx\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\n\nexport interface BackPanelResult {\n kms: KmsResult | undefined;\n inset: string;\n}\nexport function CabBackHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME:string) : BackPanelResult | undefined {\n const currentCP = articleData.cabbacks?.find((value) => value.NAME === NAME)\n if (!currentCP) return undefined\n\n const kmsName = currentCP.KMS\n const kms = KmsHelper(resolveVarRecursive, matSurfContext, articleData,kmsName || '')\n return {\n kms,\n inset : String(currentCP.INSET),\n }\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {DataContextType} from \"../../types/data.types.tsx\";\nimport type {DoorTypes} from \"./door.types.ts\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\n\nexport interface DoorResult extends Omit<DoorTypes, 'kmsLeft' | 'kmsRight'> {\n kmsL: KmsResult | undefined;\n kmsR: KmsResult | undefined;\n}\n\nexport default function DoorHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME: string) : DoorResult | undefined {\n const currentCP = articleData.doors.find((value) => value.name === NAME)\n if (!currentCP) {return undefined}\n\n const kmsLeft = KmsHelper(resolveVarRecursive,matSurfContext,articleData,currentCP.kmsLeft || '')\n const kmsRight = KmsHelper(resolveVarRecursive,matSurfContext, articleData,currentCP.kmsRight || '')\n return {\n ...currentCP,\n kmsL : kmsLeft,\n kmsR : kmsRight,\n }\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface ShelfResult {\r\n kms: KmsResult | undefined;\r\n}\r\n\r\nexport default function CabinHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,\r\n NAME: string\r\n) : ShelfResult | undefined {\r\n const currentCP = articleData.cabins.find((cside) => cside.NAME === NAME)\r\n if (!currentCP) {return undefined}\r\n const kmsName = currentCP.KMS\r\n const kms = KmsHelper(resolveVarRecursive,matSurfContext, articleData,kmsName || '')\r\n return {\r\n kms,\r\n }\r\n}","import type {DataContextType} from \"../../types/data.types.tsx\";\nimport KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\nimport CSideHelper from \"../side_panel/CSideHelper.tsx\";\n\ninterface DrCpResult{\n kms?:KmsResult, inset:number\n}\n\nexport interface DrawerHelperResult {\n bottom:DrCpResult\n front:DrCpResult\n left:DrCpResult\n back:DrCpResult\n right:DrCpResult\n}\n\nexport default function DrawerHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME: string\n) :\n // resolveVarRecursive, matSurfContext, articleData, cpNameResult\n DrawerHelperResult | undefined{\n\n const currentCp = articleData.drawers.find((item) => item.NAME === NAME)\n\n if (!currentCp) return undefined\n // Extract data safely - use empty defaults if currentCp doesn't exist\n const front = currentCp.front\n const BOTSHELF = currentCp.BOTSHELF\n const elems = currentCp.elems || []\n\n const bsPdName = BOTSHELF ? resolveVarRecursive(BOTSHELF) : undefined\n const frPdName = front?.PART_DEF ? resolveVarRecursive(front.PART_DEF) : undefined\n\n // useKmsHelper is not a real hook (no React hooks inside), safe to call conditionally\n const bsKMS = bsPdName ? KmsHelper(resolveVarRecursive, matSurfContext, articleData, bsPdName) : undefined\n const frKMS = frPdName ? KmsHelper(resolveVarRecursive, matSurfContext, articleData, frPdName) : undefined\n\n // UseCpDispatcher IS a real hook - must call unconditionally with same order every render\n const riKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[1]?.CPNAME)?.kms\n const bkKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[2]?.CPNAME)?.kms\n const lsKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[3]?.CPNAME)?.kms\n\n // inset not from DB\n const resultBs = {kms : bsKMS, inset : 12}\n const resultFr = {kms : frKMS, inset : -2.5}\n const resultRi = {kms : riKMS, inset : 12}\n const resultLe = {kms : lsKMS, inset : 12}\n const resultBk = {kms : bkKMS, inset : 12}\n\n return {\n bottom : resultBs,\n front : resultFr,\n right : resultRi,\n back : resultBk,\n left : resultLe\n }\n}","import CSideHelper from \"../construction_principle/side_panel/CSideHelper.tsx\";\r\nimport type {DataContextType} from \"../types/data.types.tsx\";\r\nimport {DividerType} from \"../types/divider.types.ts\";\r\nimport {ElemPartType} from \"../types/Elem.types.tsx\";\r\nimport {\r\n isCabBackType,\r\n isCabinType,\r\n isCSideType,\r\n isDoorType,\r\n isDrawerType,\r\n type PartTypeSource\r\n} from \"../construction_principle/dto/angl-type-config.ts\";\r\nimport {\r\n type CpDispatcherResult,\r\n isCpDescriptor,\r\n isCpVariable\r\n} from \"../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {useDescriptorEvaluation} from \"../contexts/descriptor/useDescriptor.ts\";\r\nimport type {DescriptorManager} from \"../descriptor/services/DescriptorManager.ts\";\r\nimport type {VariableTree} from \"../variables/VariableResolver.ts\";\r\nimport {useMemo} from \"react\";\r\nimport {useVariables} from \"../variables/useVariables.ts\";\r\nimport {useMatSurfs} from \"../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {CabBackHelper} from \"../construction_principle/cabBack/CabBackHelper.tsx\";\r\nimport DoorHelper from \"../construction_principle/door/DoorHelper.ts\";\r\n\r\nimport CabinHelper from \"../construction_principle/cabin/CabinHelper.ts\";\r\nimport DrawerHelper from \"../construction_principle/drawer/DrawerHelper.tsx\";\r\nimport {DrawerType} from \"../construction_principle/drawer/dto/drawer.types.ts\";\r\n\r\nexport default function UseCpDispatcher(\r\n articleData: DataContextType,\r\n cpName: string,\r\n cpType: ElemPartType | DividerType | DrawerType,\r\n source:PartTypeSource,\r\n variableTree: VariableTree,\r\n descriptorManager?:DescriptorManager,\r\n inputData?:Record<string, unknown>,\r\n) : CpDispatcherResult | undefined\r\n{\r\n const {resolveVarRecursive} = useVariables()\r\n const matSurfContext = useMatSurfs()\r\n let cpNameResult = cpName\r\n if (isCpDescriptor(cpName) && descriptorManager){\r\n const {result} = useDescriptorEvaluation(descriptorManager, cpName, inputData || {}, {}, variableTree);\r\n cpNameResult = result ? result?.lindiv : cpName\r\n }else if (isCpVariable(cpName)){\r\n cpNameResult = resolveVarRecursive(cpName);\r\n }\r\n\r\n return useMemo(() => {\r\n if (!cpNameResult || cpNameResult === '') return undefined;\r\n switch (true) {\r\n case isCSideType(cpType, source): {\r\n const cpHelper = CSideHelper(resolveVarRecursive,matSurfContext, articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.SidePanel,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }\r\n case isCabBackType(cpType,source): {\r\n const cpHelper = CabBackHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Back,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }\r\n case isDoorType(cpType,source): {\r\n const cpHelper = DoorHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Door,\r\n props: cpHelper,\r\n thk: cpHelper?.kmsL?.thk || 0\r\n };\r\n }\r\n case isCabinType(cpType, source): {\r\n const cpHelper = CabinHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Shelf,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }case isDrawerType(source): {\r\n const cpHelper = DrawerHelper(resolveVarRecursive, matSurfContext, articleData, cpNameResult)\r\n return {\r\n name: cpNameResult,\r\n type: DrawerType.Drawer,\r\n props: cpHelper,\r\n thk:0\r\n }\r\n }\r\n default:\r\n return undefined;\r\n }\r\n },[articleData, cpNameResult, cpType, source, cpNameResult])\r\n}\r\n","import { useContext } from 'react';\nimport { DescriptorContext } from './DescriptorContext.ts';\nimport type { DescriptorManager } from '../../descriptor/services/DescriptorManager.ts';\n\n//Hook to get the DescriptorManager instance from context\nexport function useDescriptorManager(): DescriptorManager {\n const manager = useContext(DescriptorContext);\n\n if (!manager) {\n throw new Error(\n 'useDescriptorManager must be used within a DescriptorProvider'\n );\n }\n\n return manager;\n}\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\r\n\r\nexport default function usePrimHelper(articleName:string, dimensionOverrides?:DimensionProps) {\r\n const {getArticleData} = useData();\r\n const {resolveVarRecursive} = useVariables()\r\n\r\n // Get data for this specific article\r\n const {anglPrims} = getArticleData(articleName);\r\n if (anglPrims.length === 0) {\r\n console.warn(`No prim found for : ${articleName}`)\r\n return undefined\r\n }\r\n\r\n const current_prim = anglPrims[0];\r\n\r\n function parser(DIMCALCF: string, SIZE: number, dimOverride?: number): number {\r\n if (DIMCALCF === '') return dimOverride ?? SIZE;\r\n\r\n const resolved = resolveValue(resolveVarRecursive(DIMCALCF)!);\r\n if (typeof resolved === 'number') return resolved || 0;\r\n if (typeof resolved === 'string') return parseFloat(resolved) || 0;\r\n\r\n return 0;\r\n }\r\n\r\n const prim_dims = {\r\n width: parser(current_prim.DIMCALCFX, current_prim.SIZEX, dimensionOverrides?.width), // (current_prim.DIMCALCFX !== '' ? resolveValue(resolveString(current_prim.DIMCALCFX)) : dimensionOverrides?.width || current_prim.SIZEX) || 0,\r\n height: parser(current_prim.DIMCALCFZ, current_prim.SIZEZ, dimensionOverrides?.height) ,// (current_prim.DIMCALCFZ !== '' ? resolveValue(resolveString(current_prim.DIMCALCFZ)) : dimensionOverrides?.height || current_prim.SIZEZ) || 0,\r\n depth: parser(current_prim.DIMCALCFY, current_prim.SIZEY, dimensionOverrides?.depth) ,//(current_prim.DIMCALCFY !== '' ? resolveValue(resolveString(current_prim.DIMCALCFY)) : dimensionOverrides?.depth || current_prim.SIZEY) || 0,\r\n };\r\n\r\n\r\n return {\r\n articleName,\r\n current_prim,\r\n prim_dims\r\n }\r\n}","import {CLIE_TYPE_ZONE, clieTags} from \"../../constants/Constants.tsx\";\r\nimport {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport useGrtxHelper from \"./UseGrtxHelper.tsx\";\r\nimport UseCpDispatcher from \"../useCpDispatcher.ts\";\r\nimport {DividerType} from \"../../types/divider.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport usePrimHelper from \"./UsePrimHelper.tsx\";\r\n\r\nexport function useZoneHelper(articleName:string,TREEID: string) {\r\n const articleData = useData();\r\n const prim = usePrimHelper(articleName)\r\n const grtx = useGrtxHelper(articleName, TREEID)\r\n const descriptorManager = useDescriptorManager();\r\n const {tree:variableTree} = useVariables()\r\n const clieTopThk = useClieHelper(articleName, TREEID, clieTags.IAC_TOPSHELFTHICKNESS, CLIE_TYPE_ZONE);\r\n const clieBotThk = useClieHelper(articleName, TREEID, clieTags.IAC_BOTTOMSHELFTHICKNESS, CLIE_TYPE_ZONE);\r\n const clieDivThk = useClieHelper(articleName, TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ZONE);\r\n\r\n // Get data for this specific article\r\n const {anglZones} = articleData.getArticleData(articleName);\r\n const currentZone = anglZones.find((item) => item.TREEID === TREEID);\r\n const children = anglZones.filter((item) => item.TREEID.substring(0, item.TREEID.lastIndexOf('.')) === TREEID);\r\n children.sort((a, b) => a.TREEID.localeCompare(b.TREEID, undefined, { numeric: true }))\r\n\r\n if (!currentZone) return null;\r\n const {TOPSHELF, BOTSHELF, DIVTYPE, DIVIDER} = currentZone\r\n const inputData = grtx?.zoneInfo ? Object.fromEntries(grtx.zoneInfo) : {};\r\n inputData['AD article width'] = prim?.prim_dims.width.toString() ?? '';\r\n inputData['AD article height'] = prim?.prim_dims.height.toString() ?? '';\r\n inputData['AD article depth'] = prim?.prim_dims.depth.toString() ?? '';\r\n inputData['0'] = '0';\r\n\r\n const topShelfResult = UseCpDispatcher(articleData, TOPSHELF, DividerType.topShelf, 'divider',variableTree, descriptorManager, inputData);\r\n const botShelfResult = UseCpDispatcher(articleData, BOTSHELF, DividerType.botShelf, 'divider',variableTree, descriptorManager, inputData);\r\n const dividerResult = UseCpDispatcher(articleData, DIVIDER, DIVTYPE, 'divider',variableTree, descriptorManager, inputData);\r\n\r\n\r\n // Eagerly evaluate CPs with useMemo\r\n const topShelfCP = topShelfResult ? { ...topShelfResult, thk: clieTopThk?.thickness ?? topShelfResult.thk } : undefined\r\n const bottomShelfCP = botShelfResult ? {...botShelfResult, thk: clieBotThk?.thickness ?? botShelfResult.thk } : undefined\r\n const DividerCP = dividerResult ? { ...dividerResult,thk:clieDivThk?.thickness ?? dividerResult.thk } : undefined\r\n\r\n return {\r\n // Zone data\r\n currentZone,\r\n children,\r\n inputData,\r\n topShelfCP,\r\n bottomShelfCP,\r\n DividerCP,\r\n zoneInfo:grtx?.zoneInfo\r\n };\r\n}\r\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport {CLIE_TYPE_ELEM, clieTags, parentId} from \"../../constants/Constants.tsx\";\r\nimport {useZoneHelper} from \"./UseZoneHelper.tsx\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport UseCpDispatcher from \"../useCpDispatcher.ts\";\r\nimport {isBackPanel, isDoor} from \"../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport {useMemo} from \"react\";\r\nimport {ElemPartType} from \"../../types/Elem.types.tsx\";\r\n\r\nexport function useElemHelper(articleName:string,TREEID: string) {\r\n const articleData = useData()\r\n const {resolveVarRecursive, tree:VariableTree} = useVariables()\r\n const descriptorManager = useDescriptorManager();\r\n const {anglElems} = articleData.getArticleData(articleName);\r\n\r\n const currentElem = anglElems.find((item) => item.TREEID === TREEID);\r\n\r\n const parentZoneId = parentId(TREEID);\r\n const parentZone = useZoneHelper(articleName, parentZoneId);\r\n\r\n const clieThickness = useClieHelper(articleName, TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ELEM);\r\n const cp = UseCpDispatcher(articleData, currentElem?.CPNAME ?? '',currentElem?.PARTTYPE ?? ElemPartType.SidePanel, 'elem',VariableTree, descriptorManager, parentZone?.inputData || {})\r\n\r\n if (!currentElem) return null;\r\n const {CPNAME, INSETFOR, INSET, STARTTRIM, BOTOFFS, TOPOFFS, ENDOFFS, STARTOFFS, ENDTRIM, TOPTRIM, BOTTRIM, PARTTYPE} = currentElem\r\n\r\n // Override THK by clie or return the CP Thk\r\n const thk = CPNAME === '' ? 0 : clieThickness?.thickness ?? cp?.thk ?? 0;\r\n\r\n let sourceInset = undefined\r\n if (CPNAME === '') sourceInset = 0\r\n else if (INSETFOR !== \"\" && INSETFOR !== \"0\") {\r\n sourceInset = INSETFOR\r\n }\r\n else if (INSET !== 0) {\r\n sourceInset = INSET\r\n }\r\n else if (cp && isBackPanel(cp)) {\r\n sourceInset = cp.props.inset+''\r\n }else if (cp && isDoor(cp)){\r\n sourceInset = cp.props.inset + ( cp.props.construction === 'onset' ? '-'+thk : '')\r\n }\r\n\r\n const resolvedInset = resolveValue(resolveVarRecursive(String(sourceInset)))\r\n\r\n const inset = (typeof resolvedInset === 'string' ? 0 : resolvedInset) || 0;\r\n\r\n const topThk = parentZone?.topShelfCP?.thk || 0;\r\n const bottomThk = parentZone?.bottomShelfCP?.thk || 0;\r\n\r\n const oversize = {\r\n start: Number(STARTOFFS) || 0,\r\n end: Number(ENDOFFS) || 0,\r\n top: Number(TOPOFFS) || 0,\r\n bottom: Number(BOTOFFS) || 0\r\n };\r\n\r\n const trim = {\r\n start: STARTTRIM,\r\n end: ENDTRIM,\r\n top: TOPTRIM,\r\n bot: BOTTRIM\r\n };\r\n\r\n const elmTrimThk = {\r\n top: trim.top === 'S' ? topThk : 0,\r\n bottom: trim.bot === 'S' ? bottomThk : 0\r\n };\r\n\r\n return useMemo(() => {\r\n if (!currentElem) return null;\r\n return {TREEID, PARTTYPE, cp, thk, topThk, bottomThk, inset, oversize, trim, elmTrimThk,}\r\n },[currentElem, cp, clieThickness, parentZone])\r\n\r\n}","// src/types.ts\nvar EvaluationErrors = class extends Error {\n constructor(message) {\n super(`Evaluation Error: ${message}`);\n this.name = \"EvaluationError\";\n }\n};\nvar TokenType = /* @__PURE__ */ ((TokenType2) => {\n TokenType2[\"NUMBER\"] = \"NUMBER\";\n TokenType2[\"VARIABLE\"] = \"VARIABLE\";\n TokenType2[\"UNIT\"] = \"UNIT\";\n TokenType2[\"OPERATOR\"] = \"OPERATOR\";\n TokenType2[\"COLON\"] = \"COLON\";\n TokenType2[\"BRACKET_OPEN\"] = \"BRACKET_OPEN\";\n TokenType2[\"BRACKET_CLOSE\"] = \"BRACKET_CLOSE\";\n TokenType2[\"BRACE_OPEN\"] = \"BRACE_OPEN\";\n TokenType2[\"BRACE_CLOSE\"] = \"BRACE_CLOSE\";\n TokenType2[\"PAREN_OPEN\"] = \"PAREN_OPEN\";\n TokenType2[\"PAREN_CLOSE\"] = \"PAREN_CLOSE\";\n TokenType2[\"FUNCTION\"] = \"FUNCTION\";\n TokenType2[\"SPECIAL_VARIABLE\"] = \"SPECIAL_VARIABLE\";\n TokenType2[\"RELATIVE_RATIO\"] = \"RELATIVE_RATIO\";\n TokenType2[\"ANGLE_BRACKET_OPEN\"] = \"LEFT_ANGLE_BRACKET\";\n TokenType2[\"ANGLE_BRACKET_CLOSE\"] = \"RIGHT_ANGLE_BRACKET\";\n TokenType2[\"EOF\"] = \"EOF\";\n return TokenType2;\n})(TokenType || {});\n\n// src/Scanner.ts\nvar Scanner = class _Scanner {\n cache = /* @__PURE__ */ new Map();\n source = \"\";\n tokens = [];\n start = 0;\n current = 0;\n errors = [];\n reportError(message) {\n this.errors.push(message);\n }\n static MATHEMATICAL_FUNCTIONS = {\n abs: \"FUNCTION\" /* FUNCTION */,\n acos: \"FUNCTION\" /* FUNCTION */,\n asin: \"FUNCTION\" /* FUNCTION */,\n atan: \"FUNCTION\" /* FUNCTION */,\n bog2deg: \"FUNCTION\" /* FUNCTION */,\n cos: \"FUNCTION\" /* FUNCTION */,\n deg2bog: \"FUNCTION\" /* FUNCTION */,\n in2mm: \"FUNCTION\" /* FUNCTION */,\n ln: \"FUNCTION\" /* FUNCTION */,\n log: \"FUNCTION\" /* FUNCTION */,\n log10: \"FUNCTION\" /* FUNCTION */,\n max: \"FUNCTION\" /* FUNCTION */,\n maxunder: \"FUNCTION\" /* FUNCTION */,\n mm2in: \"FUNCTION\" /* FUNCTION */,\n nextto: \"FUNCTION\" /* FUNCTION */,\n pi: \"FUNCTION\" /* FUNCTION */,\n pow: \"FUNCTION\" /* FUNCTION */,\n round: \"FUNCTION\" /* FUNCTION */,\n sin: \"FUNCTION\" /* FUNCTION */,\n sqr: \"FUNCTION\" /* FUNCTION */,\n tab: \"FUNCTION\" /* FUNCTION */,\n tan: \"FUNCTION\" /* FUNCTION */\n };\n scan(source) {\n if (this.cache.has(source)) {\n const tokens = this.cache.get(source);\n this.cache.delete(source);\n this.cache.set(source, tokens);\n return tokens;\n }\n try {\n this.source = source;\n const tokens = this.preformScan();\n this.cache.set(this.source, tokens);\n if (this.cache.size > 3) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n return tokens;\n } catch (err) {\n console.error(err);\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n preformScan() {\n this.resetState();\n try {\n if (this.source.includes(\"<\") || this.source.includes(\">\")) {\n throw new Error(\"Angle brackets are not allowed in the input string\");\n }\n if (this.source.length === 0) {\n throw new Error(\"Empty input string\");\n }\n this.start = 0;\n this.current = 0;\n this.tokens = [];\n if (this.start === 0) {\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n }\n while (!this.isAtEnd()) {\n this.start = this.current;\n const char = this.peek();\n switch (char) {\n case \":\":\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n this.advance();\n break;\n case \" \":\n case \"\\r\":\n case \"\t\":\n case \"\\n\":\n this.advance();\n break;\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n case \".\":\n this.scanNumber();\n break;\n case \"$\":\n this.scanVariable();\n break;\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n this.addToken(\"OPERATOR\" /* OPERATOR */, char);\n this.advance();\n break;\n case \"(\":\n this.addToken(\"PAREN_OPEN\" /* PAREN_OPEN */, \"(\");\n this.advance();\n break;\n case \")\":\n this.addToken(\"PAREN_CLOSE\" /* PAREN_CLOSE */, \")\");\n this.advance();\n break;\n case \"{\":\n if (this.current != 0 && this.tokens[this.tokens.length - 1].type != \"OPERATOR\" /* OPERATOR */) {\n this.addToken(\"OPERATOR\" /* OPERATOR */, \"*\");\n }\n this.addToken(\"BRACE_OPEN\" /* BRACE_OPEN */, \"{\");\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n this.advance();\n break;\n case \"}\":\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"BRACE_CLOSE\" /* BRACE_CLOSE */, \"}\");\n this.advance();\n break;\n case \"[\":\n this.addToken(\"OPERATOR\" /* OPERATOR */, \"~\");\n this.addToken(\"BRACKET_OPEN\" /* BRACKET_OPEN */, \"[\");\n this.advance();\n break;\n case \"]\":\n this.addToken(\"BRACKET_CLOSE\" /* BRACKET_CLOSE */, \"]\");\n this.advance();\n break;\n case \"m\":\n if (this.peekNext() === \"m\") {\n this.scanMm();\n } else {\n this.scanIdentifierOrFunction();\n }\n break;\n default:\n if (this.isAlpha(char)) {\n this.scanIdentifierOrFunction();\n } else {\n this.reportError(\n `Unexpected character: ${char} at position: ${this.current}`\n );\n }\n }\n }\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"EOF\" /* EOF */, \"\");\n if (this.errors.length > 0) {\n throw new Error(this.errors.join(\",\\n\"));\n }\n return this.tokens;\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n isAtEnd() {\n return this.current >= this.source.length;\n }\n advance() {\n return this.source.charAt(this.current++);\n }\n peek() {\n if (this.isAtEnd()) return \"\\0\";\n return this.source.charAt(this.current);\n }\n peekNext() {\n if (this.current + 1 >= this.source.length) return \"\\0\";\n return this.source.charAt(this.current + 1);\n }\n addToken(type, lexeme) {\n this.tokens.push({\n type,\n lexeme: lexeme || (type ? this.source.substring(this.start, this.current) : \"\"),\n position: this.start\n });\n }\n isDigit(char) {\n return /^[0-9]$/.test(char);\n }\n isAlpha(char) {\n return /^[a-zA-Z]$/.test(char);\n }\n scanNumber() {\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n if (this.peek() === \".\") {\n this.advance();\n if (!this.isDigit(this.peek())) {\n this.reportError(\n \"Expected digit after decimal point at position: \" + this.current\n );\n }\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n this.addToken(\"NUMBER\" /* NUMBER */);\n }\n scanVariable() {\n this.advance();\n while (/[a-zA-Z0-9_]/.test(this.peek())) {\n this.advance();\n }\n const fullVariable = this.source.substring(this.start + 1, this.current);\n if (fullVariable.endsWith(\"mm\")) {\n const variable = fullVariable.substring(0, fullVariable.length - 2);\n if (variable && variable.length > 0) {\n this.addToken(\"VARIABLE\" /* VARIABLE */, variable);\n this.addToken(\"UNIT\" /* UNIT */, \"mm\");\n } else {\n this.reportError(\"Variable name cannot be empty or $mm\");\n }\n } else {\n this.addToken(\"VARIABLE\" /* VARIABLE */, fullVariable);\n }\n }\n scanMm() {\n this.advance();\n this.advance();\n this.addToken(\"UNIT\" /* UNIT */, \"mm\");\n }\n scanIdentifierOrFunction() {\n const allowedSpecialVariables = [\"X\", \"Y\", \"n\"];\n while (this.isAlpha(this.peek())) {\n this.advance();\n }\n const identifier = this.source.substring(this.start, this.current);\n const functionType = _Scanner.MATHEMATICAL_FUNCTIONS[identifier.toLocaleLowerCase()];\n if (functionType != void 0) {\n this.addToken(functionType, identifier);\n } else if (allowedSpecialVariables.includes(identifier)) {\n this.addToken(\"SPECIAL_VARIABLE\" /* SPECIAL_VARIABLE */, identifier);\n } else {\n this.reportError(\n `Unknown identifier: ${identifier} at position: ${this.current}`\n );\n }\n }\n resetState() {\n this.tokens = [];\n this.start = 0;\n this.current = 0;\n this.errors = [];\n }\n};\n\n// src/Parser.ts\nvar Parser = class {\n cache = /* @__PURE__ */ new Map();\n tokens = [];\n current = 0;\n parse(tokens) {\n if (this.cache.has(tokens)) {\n const ast = this.cache.get(tokens);\n this.cache.delete(tokens);\n this.cache.set(tokens, ast);\n return ast;\n }\n try {\n this.tokens = tokens;\n const ast = this.performParse(tokens);\n this.cache.set(tokens, ast);\n if (this.cache.size > 3) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n return ast;\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n performParse(tokens) {\n this.resetCurrent();\n if (this.tokens.length === 0) {\n throw new Error(\"No tokens to parse.\");\n }\n try {\n return this.expression();\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n resetCurrent = () => {\n this.current = 0;\n };\n checkMillimeterSuffix() {\n if (this.isAtEnd()) return false;\n const nextToken = this.peek();\n return nextToken.type === \"UNIT\" /* UNIT */ && nextToken.lexeme === \"mm\";\n }\n consumeMillimeterSuffix() {\n if (this.checkMillimeterSuffix()) {\n this.advance();\n return true;\n }\n return false;\n }\n sections() {\n const sections = [];\n if (!this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n return this.expression();\n }\n while (this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n this.advance();\n let expr = this.expression();\n this.consume(\n \"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */,\n \"Expected '>' after section expression.\"\n );\n sections.push({\n type: \"Section\",\n nodes: expr,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n });\n }\n if (sections.length === 1) {\n const singleSection = sections[0];\n if (singleSection.type === \"Section\" && singleSection.nodes.type === \"Section\") {\n return singleSection.nodes;\n }\n return singleSection;\n }\n return {\n type: \"Sections\",\n sections\n };\n }\n expression() {\n try {\n let expr = this.term();\n while (!this.isAtEnd() && this.check(\"OPERATOR\" /* OPERATOR */) && [\"+\", \"-\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.term();\n expr = {\n type: \"BinaryExpression\",\n left: expr,\n operator,\n right\n };\n }\n return expr;\n } catch (error) {\n throw new Error(\n `Failed to parse expression: ${error.message}`\n );\n }\n }\n term() {\n try {\n let expr = this.factor();\n while (!this.isAtEnd() && this.check(\"OPERATOR\" /* OPERATOR */) && [\"*\", \"/\", \"~\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.factor();\n if (right.type === \"SpecialVariable\" && right.name === \"n\") {\n throw new Error(\n 'Invalid usage: \"n\" cannot appear on the right-hand side of an operator'\n );\n }\n expr = {\n type: \"BinaryExpression\",\n left: expr,\n operator,\n right\n };\n }\n return expr;\n } catch (error) {\n throw new Error(`Failed to parse term: ${error.message}`);\n }\n }\n factor() {\n try {\n if (this.check(\"OPERATOR\" /* OPERATOR */) && [\"-\", \"+\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.factor();\n return {\n type: \"UnaryExpression\",\n operator,\n right\n };\n }\n return this.primary();\n } catch (error) {\n throw new Error(`Failed to parse factor: ${error.message}`);\n }\n }\n primary() {\n try {\n if (this.check(\"NUMBER\" /* NUMBER */)) {\n this.advance();\n return {\n type: \"NumberLiteral\",\n value: parseFloat(this.previous().lexeme),\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"VARIABLE\" /* VARIABLE */)) {\n this.advance();\n return {\n type: \"Variable\",\n name: this.previous().lexeme,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"SPECIAL_VARIABLE\" /* SPECIAL_VARIABLE */)) {\n this.advance();\n return {\n type: \"SpecialVariable\",\n name: this.previous().lexeme,\n hasMillimeterSuffix: this.previous().lexeme === \"n\"\n };\n }\n if (this.check(\"FUNCTION\" /* FUNCTION */)) {\n this.advance();\n const functionName = this.previous().lexeme;\n this.consume(\n \"PAREN_OPEN\" /* PAREN_OPEN */,\n `Expected '(' after function name '${functionName}'.`\n );\n const arg = this.expression();\n this.consume(\n \"PAREN_CLOSE\" /* PAREN_CLOSE */,\n `Expected ')' after function arguments.`\n );\n return {\n type: \"FunctionCall\",\n name: functionName,\n arg,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"PAREN_OPEN\" /* PAREN_OPEN */)) {\n this.advance();\n const expr = this.expression();\n if (!expr) {\n throw new Error(\"Expected expression inside parentheses.\");\n }\n this.consume(\"PAREN_CLOSE\" /* PAREN_CLOSE */, \"Expected ')' after expression.\");\n return {\n type: \"Grouping\",\n expression: expr,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"PAREN_CLOSE\" /* PAREN_CLOSE */)) {\n throw new Error(`Unexpected ')' without a matching '('.`);\n }\n if (this.check(\"BRACE_OPEN\" /* BRACE_OPEN */)) {\n this.advance();\n let content = this.sections();\n this.consume(\"BRACE_CLOSE\" /* BRACE_CLOSE */, \"Expected '}' after expression.\");\n if (content.type === \"Section\" && content.nodes.type === \"Section\") {\n content = content.nodes;\n }\n return {\n type: \"Repeated\",\n toRepeat: content,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n return this.sections();\n }\n throw new Error(`Unexpected token: ${this.peek().lexeme}`);\n } catch (err) {\n throw new Error(`Failed to parse primary: ${err.message}`);\n }\n }\n check(type) {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n advance() {\n if (!this.isAtEnd()) this.current++;\n return this.previous();\n }\n consume(type, errorMessage) {\n if (this.check(type)) return this.advance();\n throw new Error(errorMessage);\n }\n isAtEnd() {\n return this.current >= this.tokens.length;\n }\n peek() {\n return this.tokens[this.current];\n }\n previous() {\n return this.tokens[this.current - 1];\n }\n};\n\n// src/evaluationMethods/evaluateBinaryExpression.ts\nvar isN = (node) => {\n return node.type === \"SpecialVariable\" && node.name === \"n\";\n};\nfunction evaluateBinaryExpression(expression, context) {\n if (expression.right.type === \"SpecialVariable\" && expression.right.name === \"n\") {\n return new EvaluationErrors(\n \"Cannot have n in the right side of an expression\"\n );\n }\n const leftValue = !isN(expression.left) ? this.evaluate(expression.left) : expression.left;\n const rightValue = !isN(expression.right) ? this.evaluate(expression.right) : expression.right;\n if (leftValue instanceof EvaluationErrors) return leftValue;\n if (rightValue instanceof EvaluationErrors) return rightValue;\n const bothAreNumbers = leftValue.type === \"NumberLiteral\" && rightValue.type === \"NumberLiteral\";\n const sameUnit = bothAreNumbers ? leftValue.hasMillimeterSuffix === rightValue.hasMillimeterSuffix : false;\n const hasRepeated = (value) => {\n return value.type === \"Repeated\";\n };\n switch (expression.operator) {\n case \"+\": {\n if (bothAreNumbers && sameUnit && context?.isInsideGroup == false) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value + rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value + rightValue.value,\n spreadMm: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"+\",\n left: leftValue,\n right: rightValue\n };\n }\n }\n case \"*\":\n if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value * rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (hasRepeated(rightValue) && leftValue.type === \"NumberLiteral\") {\n return {\n type: \"Repeated\",\n toRepeat: rightValue.toRepeat,\n times: Math.round(leftValue.value),\n hasMillimeterSuffix: rightValue.type === \"NumberLiteral\" && rightValue.hasMillimeterSuffix || false\n };\n } else if (context?.isInsideGroup == false && leftValue.type !== \"SpecialVariable\" && leftValue.name !== \"n\") {\n return new EvaluationErrors(`cannot have * outside of group`);\n } else if (leftValue.type === \"SpecialVariable\") {\n return {\n type: \"BinaryExpression\",\n operator: \"*\",\n left: leftValue,\n right: {\n type: \"NumberLiteral\",\n value: rightValue.value,\n hasMillimeterSuffix: true\n }\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"*\",\n left: leftValue,\n right: rightValue,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n }\n case \"/\":\n if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value / rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true\n };\n } else if (context?.isInsideGroup == false) {\n return new EvaluationErrors(`cannot have / outside of group`);\n }\n case \"-\": {\n if (bothAreNumbers && sameUnit && context?.isInsideGroup == false) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value - rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value - rightValue.value,\n spreadMm: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"-\",\n left: leftValue,\n right: rightValue\n };\n }\n }\n default:\n throw new EvaluationErrors(\"Invalid Operator\");\n }\n}\n\n// src/evaluationMethods/evaluateFunction.ts\nfunction evaluateFunction(fn, context) {\n const evaluatedArg = this.evaluate(fn.arg);\n if (evaluatedArg instanceof EvaluationErrors) {\n throw new EvaluationErrors(\"Error in function arguments\");\n }\n switch (fn.name.toLowerCase()) {\n case \"abs\":\n return {\n type: \"NumberLiteral\",\n value: Math.abs(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"acos\":\n return {\n type: \"NumberLiteral\",\n value: Math.acos(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"asin\":\n return {\n type: \"NumberLiteral\",\n value: Math.asin(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"atan\":\n return {\n type: \"NumberLiteral\",\n value: Math.atan(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"cos\":\n return {\n type: \"NumberLiteral\",\n value: Math.cos(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"sin\":\n return {\n type: \"NumberLiteral\",\n value: Math.sin(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"tan\":\n return {\n type: \"NumberLiteral\",\n value: Math.tan(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"round\":\n return {\n type: \"NumberLiteral\",\n value: Math.round(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"bog2deg\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * (180 / Math.PI),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"deg2bog\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * (Math.PI / 180),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"in2mm\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * 25.4,\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"mm2in\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value / 25.4,\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"ln\":\n return {\n type: \"NumberLiteral\",\n value: Math.log(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"log10\":\n return {\n type: \"NumberLiteral\",\n value: Math.log10(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n default:\n throw new EvaluationErrors(\"Function not implemented\");\n }\n}\n\n// src/evaluationMethods/evaluateVariable.ts\nfunction evaluateVariable(variable) {\n if (!this.variables || !(variable.name in this.variables)) {\n throw new EvaluationErrors(`Variable ${variable.name} is not defined.`);\n }\n let variableValue = this.variables[variable.name];\n return {\n type: \"NumberLiteral\",\n value: variableValue,\n hasMillimeterSuffix: variable.hasMillimeterSuffix\n };\n}\n\n// src/Evaluator.ts\nvar Evaluator = class {\n nestingLevel = 0;\n variables = {};\n constructor() {\n this.evaluateBinaryExpression = evaluateBinaryExpression.bind(this);\n this.evaluateFunction = evaluateFunction.bind(this);\n this.evaluateVariable = evaluateVariable.bind(this);\n }\n evaluate(node, context = { isInsideGroup: false }, variables) {\n this.nestingLevel++;\n try {\n if (variables) {\n this.variables = variables;\n }\n if (this.isSections(node)) {\n return this.evaluateSections(node, context);\n }\n if (this.isSection(node)) {\n const evaluatedValue = this.evaluate(node.nodes, context);\n if (evaluatedValue instanceof EvaluationErrors) {\n return new EvaluationErrors(\n `Error in section ${JSON.stringify(node)}`\n );\n }\n return { ...node, nodes: evaluatedValue };\n }\n if (this.isNumberLiteral(node)) {\n if (context.isInsideGroup) {\n if (node.hasMillimeterSuffix) {\n return { ...node, spreadMm: true };\n }\n } else {\n return node;\n }\n }\n if (this.isGrouping(node)) {\n context = { ...context, isInsideGroup: true };\n const evaluatedValue = this.evaluate(node.expression, context);\n if (evaluatedValue instanceof EvaluationErrors) {\n return evaluatedValue;\n }\n return {\n ...evaluatedValue,\n hasMillimeterSuffix: node.hasMillimeterSuffix\n };\n }\n if (this.isRepeated(node)) {\n const evaluatedValue = this.evaluate(node.toRepeat);\n if (evaluatedValue instanceof EvaluationErrors) {\n return evaluatedValue;\n }\n return { ...node, toRepeat: evaluatedValue };\n }\n if (this.isBinaryExpression(node)) {\n return this.evaluateBinaryExpression(node, context);\n }\n if (this.isUnaryExpression(node)) {\n return {\n type: \"NumberLiteral\",\n value: node.operator === \"-\" ? -1 * node.right.value : node.right.value,\n hasMillimeterSuffix: node.right.hasMillimeterSuffix\n };\n }\n if (this.isFunctionCall(node)) {\n return this.evaluateFunction(node, context);\n }\n if (this.isVariable(node)) {\n if (!this.variables) {\n throw new EvaluationErrors(\"No variables defined.\");\n } else {\n return this.evaluateVariable(node);\n }\n }\n throw new EvaluationErrors(`unsupported node type: ${node.type}`);\n } catch (err) {\n throw new EvaluationErrors(err.message);\n } finally {\n this.nestingLevel--;\n }\n }\n isUnaryExpression(node) {\n return node.type === \"UnaryExpression\";\n }\n isNumberLiteral(node) {\n return node.type === \"NumberLiteral\";\n }\n isVariable(node) {\n return node.type === \"Variable\" || node.type === \"SpecialVariable\";\n }\n isBinaryExpression(node) {\n return node.type === \"BinaryExpression\";\n }\n isFunctionCall(node) {\n return node.type === \"FunctionCall\";\n }\n isGrouping(node) {\n return node.type === \"Grouping\";\n }\n isRepeated(node) {\n return node.type === \"Repeated\";\n }\n isSections(node) {\n return node.type === \"Sections\";\n }\n isSection(node) {\n return node.type === \"Section\";\n }\n evaluateSections(sections, context = { isInsideGroup: false }) {\n let result = sections.sections.map((section) => {\n const result2 = this.evaluate(section.nodes);\n if (result2 instanceof EvaluationErrors) throw result2;\n return { type: \"Section\", nodes: result2 };\n });\n return { type: \"Sections\", sections: result };\n }\n // evaluate binary expression\n evaluateBinaryExpression;\n evaluateFunction;\n evaluateVariable;\n};\n\n// src/traverseTree.ts\nfunction traverseTree(node, callback) {\n if (!node) {\n throw new EvaluationErrors(\n `unsupported node type to traverse: ${JSON.stringify(node)}`\n );\n }\n callback(node);\n if (node.type === \"Sections\" && Array.isArray(node.sections)) {\n node.sections.forEach((section) => traverseTree(section, callback));\n } else if (node.type === \"Section\" && node.nodes) {\n traverseTree(node.nodes, callback);\n } else if (node.type === \"BinaryExpression\") {\n }\n}\n\n// src/DimensionReference.ts\nvar DimensionReference = class {\n accumulateIncorporatedThicknesses(sections, startPanelThk, endPanelThk, dividerThk, sizerefout1, sizerefedg1, sizerefmid, sizerefedg2, sizerefout2) {\n let accumulatedThicknesses = 0;\n if (sizerefmid === \"M\" /* M */) {\n for (let i = 1; i < sections.sections.length - 1; i++) {\n accumulatedThicknesses += dividerThk;\n }\n }\n if (sizerefmid === \"O\" /* O */) {\n for (let i = 1; i < sections.sections.length - 1; i++) {\n accumulatedThicknesses += dividerThk * 2;\n }\n }\n if (sizerefout1 === \"M\" /* M */) {\n accumulatedThicknesses += startPanelThk / 2;\n }\n if (sizerefout1 === \"O\" /* O */) {\n accumulatedThicknesses += startPanelThk;\n }\n if (sizerefedg1 === \"M\" /* M */) {\n accumulatedThicknesses += startPanelThk / 2;\n }\n if (sizerefedg1 === \"O\" /* O */) {\n accumulatedThicknesses += startPanelThk;\n }\n if (sizerefout2 === \"M\" /* M */) {\n accumulatedThicknesses += endPanelThk / 2;\n }\n if (sizerefout2 === \"O\" /* O */) {\n accumulatedThicknesses += endPanelThk;\n }\n if (sizerefedg2 === \"M\" /* M */) {\n accumulatedThicknesses += endPanelThk / 2;\n }\n if (sizerefedg2 === \"O\" /* O */) {\n accumulatedThicknesses += endPanelThk;\n }\n return accumulatedThicknesses;\n }\n};\n\n// src/Calculator.ts\nvar Calculator = class {\n calculateSections(ast, totalLength = 500, dividerThickness = 0, dimRefProps) {\n try {\n if (ast instanceof EvaluationErrors) {\n throw ast;\n }\n if (ast.type !== \"Sections\" && ast.type !== \"Section\") {\n throw new EvaluationErrors(\n `Expected Sections or Section, got ${JSON.stringify(ast)}`\n );\n }\n let sections = { type: \"Sections\", sections: [] };\n if (ast.type === \"Sections\") {\n for (const section of ast.sections) {\n if (section.nodes.type === \"Repeated\" && section.nodes.times) {\n for (let i = 0; i < (section.nodes?.times ?? 0); i++) {\n if (section.nodes.toRepeat.type === \"Section\") {\n sections.sections.push(\n section.nodes.toRepeat\n );\n } else if (section.nodes.toRepeat.type === \"Sections\") {\n for (const subSection of section.nodes.toRepeat.sections) {\n sections.sections.push(subSection);\n }\n }\n }\n } else {\n sections.sections.push(section);\n }\n }\n } else if (ast.type === \"Section\") {\n sections.sections.push(ast);\n }\n if (dimRefProps) {\n let dimensionReference = new DimensionReference();\n const accumulatedIncThk = dimensionReference.accumulateIncorporatedThicknesses(\n sections,\n dimRefProps.startPanelThk,\n dimRefProps.endPanelThk,\n dividerThickness,\n dimRefProps.sizerefout1,\n dimRefProps.sizerefedg1,\n dimRefProps.sizerefmid,\n dimRefProps.sizerefedg2,\n dimRefProps.sizerefout2\n );\n }\n sections.sections.forEach((node) => {\n let spreadMm = false;\n traverseTree(node, (node2) => {\n if (node2.type === \"NumberLiteral\") {\n if (node2?.spreadMm === true) {\n spreadMm = true;\n }\n } else if (node2.type === \"BinaryExpression\") {\n if (node2.left.type === \"NumberLiteral\") {\n if (node2.left?.spreadMm === true) {\n spreadMm = true;\n }\n if (node2.right?.spreadMm === true) {\n spreadMm = true;\n }\n }\n }\n });\n if (spreadMm) {\n traverseTree(node, (node2) => {\n if (node2.type === \"NumberLiteral\") {\n node2.hasMillimeterSuffix = true;\n } else if (node2.type === \"BinaryExpression\") {\n if (node2.left.type === \"NumberLiteral\") {\n node2.left.hasMillimeterSuffix = true;\n }\n if (node2.right.type === \"NumberLiteral\") {\n node2.right.hasMillimeterSuffix = true;\n }\n }\n });\n }\n });\n let accumulatedMmValues = (sections.sections.length - 1) * dividerThickness;\n const accumulateMmValues = (node) => {\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === true) {\n accumulatedMmValues += node.value;\n }\n } else if (node.type === \"BinaryExpression\") {\n const binaryExpression = node;\n if (binaryExpression.left.type === \"NumberLiteral\" && binaryExpression.right.type === \"NumberLiteral\") {\n if (binaryExpression.left.hasMillimeterSuffix === true) {\n accumulatedMmValues += binaryExpression.left.value;\n }\n if (binaryExpression.right.hasMillimeterSuffix === true) {\n accumulatedMmValues += binaryExpression.right.value;\n }\n }\n }\n };\n sections.sections.forEach(\n (section) => traverseTree(section, accumulateMmValues)\n );\n if (accumulatedMmValues > totalLength) {\n throw new EvaluationErrors(\"Total length exceeded\");\n }\n let restAfterN = totalLength - accumulatedMmValues;\n let nTimes = 0;\n const processNSpecialVariables = (node) => {\n if (node.type === \"BinaryExpression\") {\n const binaryExpression = node;\n if (binaryExpression.right.type === \"NumberLiteral\" && binaryExpression.left.type === \"SpecialVariable\" && binaryExpression.left.name === \"n\" && binaryExpression.operator === \"*\") {\n nTimes = Math.floor(\n restAfterN / (binaryExpression.right.value + dividerThickness)\n );\n const totalNDividersThickness = (nTimes - 1) * dividerThickness;\n const totalNLength = nTimes * binaryExpression.right.value;\n restAfterN += -totalNDividersThickness - totalNLength;\n }\n }\n };\n sections.sections.forEach(\n (section) => traverseTree(section, processNSpecialVariables)\n );\n let totalRatios = 0;\n const accumulateRatioValues = (node) => {\n if (node.type === \"BinaryExpression\") {\n if (node.left.type === \"NumberLiteral\" && node.left.hasMillimeterSuffix === false) {\n totalRatios += node.left.value;\n }\n if (node.right.type === \"NumberLiteral\" && node.right.hasMillimeterSuffix === false) {\n totalRatios += node.right.value;\n }\n }\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === false) {\n totalRatios += node.value;\n }\n }\n };\n sections.sections.forEach((node) => {\n traverseTree(node, accumulateRatioValues);\n });\n const ratioUnitValue = restAfterN / totalRatios;\n const sectionsResult = [];\n const calculateSection = (node) => {\n let ratioValue = 0;\n let mmValue = 0;\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === false) {\n ratioValue += node.value * ratioUnitValue;\n }\n if (node.hasMillimeterSuffix === true) {\n mmValue += node.value;\n }\n sectionsResult.push(Number((ratioValue + mmValue).toFixed(2)));\n } else if (node.type === \"BinaryExpression\") {\n if (node.left.type === \"NumberLiteral\" && node.right.type === \"NumberLiteral\") {\n if (node.left.hasMillimeterSuffix === false) {\n ratioValue += node.left.value * ratioUnitValue;\n }\n if (node.left.hasMillimeterSuffix === true) {\n mmValue += node.left.value;\n }\n if (node.right.hasMillimeterSuffix === false) {\n ratioValue += node.right.value * ratioUnitValue;\n }\n if (node.right.hasMillimeterSuffix === true) {\n mmValue += node.right.value;\n }\n sectionsResult.push(Number((ratioValue + mmValue).toFixed(2)));\n }\n if (node.left.type === \"SpecialVariable\" && node.left.name === \"n\" && node.right.type === \"NumberLiteral\") {\n mmValue += node.right.value;\n for (let i = 0; i < nTimes; i++) {\n if (node.right.hasMillimeterSuffix === true) {\n sectionsResult.push(Number(mmValue.toFixed(2)));\n }\n }\n }\n } else {\n }\n };\n sections.sections.forEach((node) => {\n traverseTree(node, calculateSection);\n });\n return sectionsResult;\n } catch (error) {\n return new EvaluationErrors(\"Error calculating sections\");\n }\n }\n};\n\n// src/processLinDiv.ts\nvar scanner = new Scanner();\nvar parser = new Parser();\nvar evaluator = new Evaluator();\nvar processLindiv = (input, totalLength, dividerThickness, variables) => {\n try {\n const tokens = scanner.scan(input);\n const ast = parser.parse(tokens);\n const evaluationResult = evaluator.evaluate(ast, {}, variables);\n if (evaluationResult && !(evaluationResult instanceof EvaluationErrors)) {\n const calculator = new Calculator();\n const result = calculator.calculateSections(evaluationResult, totalLength, dividerThickness);\n if (result && result instanceof EvaluationErrors) throw new Error(result.message);\n return result;\n }\n return evaluationResult || new EvaluationErrors(\"Unknown error during evaluation.\");\n } catch (err) {\n return new EvaluationErrors(err.message);\n }\n};\nexport {\n Calculator,\n EvaluationErrors,\n Evaluator,\n Parser,\n Scanner,\n TokenType,\n processLindiv\n};\n//! todo:\n","export function LinDivPatternTransform(input: string): string {\r\n // Strict check for exact pattern match\r\n const exactPattern = /^(\\d+)\\*\\{(\\d+)\\}$/;\r\n const match = input.match(exactPattern);\r\n\r\n if (match) {\r\n const count = parseInt(match[1], 10);\r\n const value = match[2];\r\n return count > 0 ? Array(count).fill(value).join(':') : '';\r\n }\r\n\r\n return input;\r\n}\r\n\r\nexport function extractNumberFromIndependentDiv(input: string): number | string {\r\n // Match pattern: NUMBER*{ANYTHING}\r\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*\\*\\s*\\{.+\\}$/);\r\n\r\n if (match) {\r\n return Number(match[1]);\r\n }\r\n\r\n return input;\r\n}","// src/helpers/LinDivValidation.ts\n\n/**\n * Valid units supported by ExpressionResolver\n */\nconst VALID_UNITS = ['mm', 'cm', 'm', 'in', 'ft', 'px', 'pt', '%', 'deg', 'rad'];\n\n/**\n * Supported math functions\n */\nconst VALID_FUNCTIONS = ['round', 'floor', 'ceil', 'abs', 'min', 'max', 'pow', 'sqrt'];\n\n/**\n * Validates a linear division string.\n * Should be called AFTER variables ($var) are resolved.\n *\n * @param lindiv - The linear division string to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidLinearDivision(lindiv: string): boolean {\n const trimmed = lindiv.trim();\n\n // 1. Empty is invalid\n if (trimmed === '') return false;\n\n // 2. Contains unresolved variables ($)\n if (/\\$\\w+/.test(trimmed)) return false;\n\n // 3. Structural colon issues\n if (trimmed.startsWith(':') || trimmed.endsWith(':') || trimmed.includes('::')) {\n return false;\n }\n\n // 4. Check for invalid units (e.g., \"mmm\", \"mmmm\")\n // Valid: 100mm, 50cm | Invalid: 100mmm, 50cmm\n const invalidUnitPattern = /\\d+(?:mm{2,}|cm{2,}|[a-z]{3,}(?![a-z]))/i;\n if (invalidUnitPattern.test(trimmed)) return false;\n\n // 5. Check each section\n const sections = splitSections(trimmed);\n for (const section of sections) {\n if (!isValidSection(section.trim())) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Split by ':' but respect brackets and parentheses\n */\nfunction splitSections(lindiv: string): string[] {\n const sections: string[] = [];\n let current = '';\n let depth = 0;\n\n for (const char of lindiv) {\n if (char === '(' || char === '[' || char === '{') {\n depth++;\n current += char;\n } else if (char === ')' || char === ']' || char === '}') {\n depth--;\n current += char;\n } else if (char === ':' && depth === 0) {\n sections.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) sections.push(current);\n return sections;\n}\n\n/**\n * Validate a single section\n * A valid section MUST be one of:\n * - Number (ratio): 1, 2.5, 0, -200\n * - Number with unit: 100mm, 50.5cm\n * - Expression (has operators/functions): round(X), X-100, (1+2)\n * - Repetition: 3*{...}, n*{...}\n * - Reduction: 1[100mm]\n * - N-fold: n*350mm\n * - Dimension variable: X, Y\n */\nfunction isValidSection(section: string): boolean {\n const s = section.trim();\n\n // Empty section is invalid\n if (s === '') return false;\n\n // Standalone * is invalid\n if (s === '*') return false;\n\n // Check for balanced brackets first\n if (!hasBalancedBrackets(s)) return false;\n\n // Must match at least one valid pattern:\n const hasNumber = /\\d/.test(s); // Contains a digit\n const hasOperator = /[+\\-*/^]/.test(s); // Has math operator\n const hasFunction = /[a-z]+\\s*\\(/i.test(s); // Has function call\n const hasBrackets = /[\\[\\]{}()]/.test(s); // Has brackets\n const isDimensionVar = /^[XY]$/i.test(s); // Just X or Y\n const isNFold = /^n\\s*\\*/i.test(s); // Starts with n*\n\n // If it has none of these, it's likely a reference name (invalid as lindiv)\n if (!hasNumber && !hasOperator && !hasFunction && !hasBrackets && !isDimensionVar && !isNFold) {\n return false;\n }\n\n // Check for unsupported functions\n const funcMatch = s.match(/([a-z_][a-z0-9_]*)\\s*\\(/gi);\n if (funcMatch) {\n for (const match of funcMatch) {\n const funcName = match.replace(/\\s*\\($/, '').toLowerCase();\n if (!VALID_FUNCTIONS.includes(funcName)) {\n return false;\n }\n }\n }\n\n // Check for invalid unit patterns\n // Valid: 100mm, 50cm, 1.5m\n // Invalid: 100mmm, 50abc\n const unitMatch = s.match(/(\\d+\\.?\\d*)\\s*([a-z]+)(?![a-z\\d(])/gi);\n if (unitMatch) {\n for (const match of unitMatch) {\n const unit = match.replace(/[\\d.\\s]+/, '').toLowerCase();\n // Skip if it's a function name (followed by parenthesis in original)\n if (VALID_FUNCTIONS.includes(unit)) continue;\n // Skip X and Y (dimension variables)\n if (unit === 'x' || unit === 'y' || unit === 'n') continue;\n // Check if valid unit\n if (!VALID_UNITS.includes(unit)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Check if brackets are balanced\n */\nfunction hasBalancedBrackets(s: string): boolean {\n const stack: string[] = [];\n const pairs: Record<string, string> = { ')': '(', ']': '[', '}': '{' };\n\n for (const char of s) {\n if (char === '(' || char === '[' || char === '{') {\n stack.push(char);\n } else if (char === ')' || char === ']' || char === '}') {\n if (stack.pop() !== pairs[char]) return false;\n }\n }\n\n return stack.length === 0;\n}","import type {ChildrenDimsResult, DimensionProps} from \"../types/zone.types.tsx\";\r\nimport {EvaluationErrors, processLindiv} from \"imos-linear-division\";\r\nimport type {DividerMode} from \"../types/divider.types.ts\";\r\nimport {extractNumberFromIndependentDiv, LinDivPatternTransform} from \"./LinDivPatternTransform.ts\";\r\nimport {isValidLinearDivision} from \"./LinDivValidation.ts\";\r\n\r\nexport default function LinDivHelper(divider: DividerMode, dimensions:DimensionProps, dividerThickness: number | 0 ):ChildrenDimsResult{\r\n // const currentZone = anglZones.find((item) => item.TREEID === TREEID)\r\n let divided_length : number = 0\r\n const {LINDIV1, DIVDIR, HORDEFTYPE, DIVELEM1} = divider\r\n let divisionType: 'width' | 'depth' | 'height' | 'article' | 'independent' = 'width'\r\n let isReversed = false\r\n\r\n if (LINDIV1 === '') return {divisionType, zone_dimensions: [], divided_length_list: [] }\r\n\r\n if (DIVDIR === 'H') { // horizontal divide\r\n if (HORDEFTYPE === 'W'){ // divide width\r\n divided_length = dimensions.width\r\n divisionType = 'width'\r\n }else if (HORDEFTYPE === 'D'){ // divide depth\r\n divided_length = dimensions.depth\r\n divisionType = 'depth'\r\n }else if (HORDEFTYPE === 'P'){ // divide perpendicular\r\n if (DIVELEM1 === 0 || DIVELEM1 === 2){ // divide width\r\n divided_length = dimensions.width\r\n divisionType = 'width'\r\n }else if (DIVELEM1 === 1 || DIVELEM1 === 3){ // divide depth\r\n divided_length = dimensions.depth\r\n divisionType = 'depth'\r\n }else {\r\n throw new Error('Unhandled case: DIVELEM1 = ' + DIVELEM1)\r\n }\r\n }else {\r\n throw new Error('Unhandled case: HORDEFTYPE = ' + HORDEFTYPE)\r\n }\r\n }else if (DIVDIR === 'V') { // vertical divide\r\n divided_length = dimensions.height\r\n divisionType = 'height'\r\n }else if (DIVDIR === 'A') {\r\n divided_length = dimensions.width\r\n divisionType = 'article'\r\n }else if (DIVDIR === 'I') {\r\n divided_length = dimensions.width\r\n divisionType = 'independent'\r\n }else {\r\n throw new Error('Unhandled case: DIVDIR = ' + DIVDIR)\r\n }\r\n\r\n let divided_length_list : number[] | EvaluationErrors = []\r\n const transformedLinDiv = LinDivPatternTransform(LINDIV1).toLowerCase() // transform lindiv pattern 3*{1} to 1:1:1\r\n\r\n if (divisionType === 'independent') {\r\n const unrefIndependentDiv = extractNumberFromIndependentDiv(LINDIV1)\r\n divided_length_list = Array(unrefIndependentDiv).fill(divided_length) as number[]\r\n }else if (divisionType === 'article'){\r\n divided_length_list = [divided_length]\r\n }else {\r\n if (isValidLinearDivision(transformedLinDiv)){\r\n divided_length_list = processLindiv(transformedLinDiv, divided_length, dividerThickness)\r\n }else {\r\n divided_length_list = []\r\n console.warn('warning the linear division from the divider bellow is not valid ', divider)\r\n }\r\n }\r\n\r\n // Handle evaluation errors\r\n if (!Array.isArray(divided_length_list)) {\r\n return {divisionType, zone_dimensions: [], divided_length_list:[] }\r\n }\r\n\r\n // inverse divided_length_list if divide perpendicular\r\n if (HORDEFTYPE === 'P' && divided_length_list.length > 1 && (DIVELEM1 === 2 || DIVELEM1 === 3) ) {\r\n isReversed = true\r\n divided_length_list = [...divided_length_list].reverse()\r\n }\r\n\r\n // Create dimension objects for each child zone\r\n const zone_dimensions: DimensionProps[] = divided_length_list.map((length: number) => {\r\n if (divisionType === 'width') {\r\n return {\r\n width: length,\r\n height: dimensions.height,\r\n depth: dimensions.depth\r\n }\r\n } else if (divisionType === 'depth') {\r\n return {\r\n width: dimensions.width,\r\n height: dimensions.height,\r\n depth: length\r\n }\r\n } else if (divisionType === 'height') { // height\r\n return {\r\n width: dimensions.width,\r\n height: length,\r\n depth: dimensions.depth\r\n }\r\n }else if (divisionType === 'article' || divisionType === 'independent') {\r\n return {\r\n width: dimensions.width,\r\n height: dimensions.height,\r\n depth: dimensions.depth\r\n }\r\n }\r\n else {\r\n throw new Error('Unhandled case: DIVDIR = ' + DIVDIR)\r\n }\r\n })\r\n\r\n return {\r\n isReversed,\r\n zone_dimensions,\r\n divisionType,\r\n divided_length_list\r\n }\r\n}","import type {DimensionProps, PositionedChild, PositionHelperResult} from \"../types/zone.types.tsx\";\r\n\r\ninterface PositionHelperParams {\r\n divisionType: 'width' | 'depth' | 'height' | 'article' | 'independent';\r\n parentDimensions: DimensionProps;\r\n lengthList: number[];\r\n childTREEIDs: string[];\r\n dividerThk: number,\r\n}\r\n\r\nexport default function PositionHelper({\r\n divisionType,\r\n parentDimensions,\r\n lengthList,\r\n childTREEIDs,\r\n dividerThk\r\n}: PositionHelperParams): PositionHelperResult {\r\n\r\n const startX = -parentDimensions.width / 2\r\n const startY = -parentDimensions.depth / 2\r\n const startZ = -parentDimensions.height / 2\r\n\r\n const childPositions = lengthList.reduce<{\r\n cumulativeX: number;\r\n cumulativeY: number;\r\n cumulativeZ: number;\r\n positions: PositionedChild[];\r\n }>((acc, length, index) => {\r\n let x = 0\r\n let y = 0\r\n let z = 0\r\n let zone_dims: DimensionProps\r\n if (divisionType === 'width') {\r\n // Dividing along width (X-axis)\r\n x = startX + acc.cumulativeX + length / 2\r\n y = 0\r\n z = 0\r\n zone_dims = {\r\n width: length,\r\n height: parentDimensions.height,\r\n depth: parentDimensions.depth\r\n }\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeX += length + dividerThk\r\n\r\n } else if (divisionType === 'depth') {\r\n // Dividing along depth (Y-axis)\r\n x = 0\r\n y = startY + acc.cumulativeY + length / 2\r\n z = 0\r\n zone_dims = {\r\n width: parentDimensions.width,\r\n height: parentDimensions.height,\r\n depth: length\r\n }\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeY += length + dividerThk\r\n\r\n } else if (divisionType === 'independent' || divisionType === 'article'){\r\n x = 0\r\n y = 0\r\n z = 0\r\n zone_dims = {\r\n width: length,\r\n height: parentDimensions.height,\r\n depth: parentDimensions.depth\r\n }\r\n } else { // height\r\n // Vertical division - for now, stack them\r\n x = 0\r\n y = 0\r\n z = startZ + acc.cumulativeZ + length / 2\r\n zone_dims = {\r\n width: parentDimensions.width,\r\n height: length,\r\n depth: parentDimensions.depth\r\n }\r\n\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeZ += length + dividerThk\r\n }\r\n\r\n acc.positions.push({\r\n x,\r\n y,\r\n z,\r\n zone_dims,\r\n TREEID: childTREEIDs[index]\r\n })\r\n\r\n return acc\r\n }, { cumulativeX: 0, cumulativeY: 0, cumulativeZ: 0, positions: []})\r\n\r\n return {\r\n childPositions: childPositions.positions,\r\n dividerType:divisionType,\r\n }\r\n}","import {useElemHelper} from \"./row_data/UseElemHelper.tsx\";\nimport {backTreeId, frontTreeId, leftTreeId, rightTreeId} from \"../constants/Constants.tsx\";\nimport type {DimensionProps, PositionHelperResult} from \"../types/zone.types.tsx\";\nimport {type DividerMode} from \"../types/divider.types.ts\";\nimport LinDivHelper from \"./LinDivHelper.tsx\";\nimport PositionHelper from \"./PositionHelper.tsx\";\nimport {isBackPanel, isSidePanel} from \"../construction_principle/dto/cp-dispatcher.types.ts\";\n\nexport function useZoneElemHelpers(articleName:string,TREEID: string) {\n return {\n front: useElemHelper(articleName,frontTreeId(TREEID)),\n left: useElemHelper(articleName,leftTreeId(TREEID)),\n right: useElemHelper(articleName,rightTreeId(TREEID)),\n back: useElemHelper(articleName,backTreeId(TREEID))\n };\n}\n\nexport function getBorderThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, topShelfThk: number, bottomShelfThk: number){\n return {\n front: elemHelpers.front?.thk || 0,\n right: elemHelpers.right?.thk || 0,\n back: elemHelpers.back?.thk || 0,\n left: elemHelpers.left?.thk || 0,\n top: topShelfThk,\n bottom: bottomShelfThk\n };\n}\nexport function getZoneInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n fr: isSidePanel(elemHelpers.front?.cp) ? (elemHelpers.front?.inset || 0) : 0,\n ri: isSidePanel(elemHelpers.right?.cp) ? (elemHelpers.right?.inset || 0) : 0,\n bk: isSidePanel(elemHelpers.back?.cp) ? (elemHelpers.back?.inset || 0) : 0,\n le: isSidePanel(elemHelpers.left?.cp) ? (elemHelpers.left?.inset || 0) : 0\n };\n}\n\nexport function calculateZoneGeometry(dimension: DimensionProps, borderInset: ReturnType<typeof getZoneInset>) {\n return {\n dimensions: {\n width: dimension.width - borderInset.le - borderInset.ri,\n height: dimension.height,\n depth: dimension.depth - borderInset.fr - borderInset.bk,\n },\n position: {\n x: (borderInset.le) / 2 - (borderInset.ri) / 2,\n y: (borderInset.fr) / 2 - (borderInset.bk) / 2,\n z: 0\n }\n };\n}\n\nexport function getRemainingInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n fr: isBackPanel(elemHelpers.front?.cp) ? (elemHelpers?.front?.inset || 0) : 0,\n ri: isBackPanel(elemHelpers.right?.cp) ? (elemHelpers?.right?.inset || 0) : 0,\n bk: isBackPanel(elemHelpers.back?.cp) ? (elemHelpers?.back?.inset || 0) : 0,\n le: isBackPanel(elemHelpers.left?.cp) ? (elemHelpers?.left?.inset || 0) : 0\n };\n}\n\nexport function calculateRemainingZoneGeometry(zoneGeometry: ReturnType<typeof calculateZoneGeometry>,\n bordersThk: ReturnType<typeof getBorderThk>,\n remainingInset:ReturnType<typeof getRemainingInset>\n ) {\n return {\n dimensions: {\n width: zoneGeometry.dimensions.width - bordersThk.left - bordersThk.right - remainingInset.le - remainingInset.ri,\n height: zoneGeometry.dimensions.height - bordersThk.top - bordersThk.bottom ,\n depth: zoneGeometry.dimensions.depth - bordersThk.front - bordersThk.back -remainingInset.fr - remainingInset.bk\n },\n position: {\n x:bordersThk.left / 2 - bordersThk.right / 2 + (remainingInset.le) / 2 - (remainingInset.ri) / 2,\n y:bordersThk.front / 2 - bordersThk.back / 2 + (remainingInset.fr) / 2 - (remainingInset.bk) / 2,\n z:bordersThk.bottom / 2 - bordersThk.top / 2\n }\n };\n}\n\n// ============================================================================\n// CHILD ZONE CALCULATIONS\n// ============================================================================\n\n/**\n * Calculate child positions from dimension results\n */\nexport function calculateChildPositions(remainingDims: DimensionProps, divided_length_list: number[], divisionType:'width' | 'depth' | 'height' | 'article' | 'independent', dividerThk: number, childTREEIDs: string[]): PositionHelperResult {\n return divided_length_list\n ? PositionHelper({\n divisionType: divisionType,\n parentDimensions: remainingDims,\n lengthList: divided_length_list,\n childTREEIDs: childTREEIDs,\n dividerThk: Number(dividerThk) || 0,\n })\n : { childPositions: [], dividerType: 'height' };\n}\n\n/**\n * Calculate child positions from remaining zone geometry\n * This combines calculateChildDimensions and calculateChildPositions\n */\nexport function calculateChildPositionsFromGeometry(remainingZoneGeometry: { dimensions: DimensionProps }, dividerThk: number, divider: DividerMode | undefined, childTREEIDs: string[]): PositionHelperResult {\n if (!divider) {\n return { childPositions: [], dividerType: 'height' };\n }\n\n const childrenDims = LinDivHelper(divider, remainingZoneGeometry.dimensions, dividerThk);\n const isReversed = childrenDims.isReversed;\n childTREEIDs = isReversed ? childTREEIDs.reverse() : childTREEIDs;\n\n return calculateChildPositions(\n remainingZoneGeometry.dimensions,\n childrenDims.divided_length_list,\n childrenDims.divisionType,\n dividerThk,\n childTREEIDs\n );\n}","import { VIEW } from \"../types/view.types.ts\";\nimport type { FC, ReactNode } from \"react\";\nimport {DIM_NORM} from \"../constants/Constants.tsx\";\nimport type {ThreeEvent} from \"@react-three/fiber\";\n\ninterface GroupWrapperProps {\n view: VIEW;\n position?: [number, number, number];\n rotation?: [number, number, number];\n children?: ReactNode;\n onClick?: () => void;\n onPointerOver?: (e: ThreeEvent<PointerEvent>) => void;\n onPointerLeave?: (e: ThreeEvent<PointerEvent>) => void;\n}\n\nconst GroupWrapper: FC<GroupWrapperProps> = ({ view=VIEW._3D, position=[0,0,0], rotation=[0,0,0], children, onClick, onPointerOver, onPointerLeave }) => {\n if (view === VIEW._3D) {\n return (\n <group\n onPointerOver={onPointerOver}\n onPointerLeave={onPointerLeave}\n position={[position[0], position[1], position[2]]}\n rotation={rotation}\n onClick={onClick}>\n {children}\n </group>\n );\n }\n\n // For 2D, might need to swap Y/Z based on view\n const x = position[0]*DIM_NORM;\n const y = view === VIEW._2D_TOP ? position[1]*DIM_NORM : position[2]*DIM_NORM ; // Adjust based on view\n const angle = rotation[1] * (180 / Math.PI);\n\n return (\n <g\n transform={`translate(${x},${y}) rotate(${angle})`}\n onClick={onClick}\n style={onClick ? { cursor: 'pointer' } : undefined}>\n {children}\n </g>\n );\n};\n\nexport default GroupWrapper;","import { Shape } from 'three';\r\n\r\ninterface Point2D {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport function calculateMitrePoints(\r\n length: number,\r\n thickness: number,\r\n startPanelThk: number = 0,\r\n endPanelThk: number = 0\r\n) {\r\n const halfLength = length / 2;\r\n const halfThickness = thickness / 2;\r\n\r\n const points: Point2D[] = [\r\n { x: halfLength, y: -halfThickness },\r\n { x: -halfLength, y: -halfThickness },\r\n { x: -halfLength + startPanelThk, y: halfThickness },\r\n { x: halfLength - endPanelThk, y: halfThickness }\r\n ];\r\n\r\n return {\r\n points,\r\n get svgPath() {\r\n return `M ${points.map(p => `${p.x},${p.y}`).join(' L ')} Z`;\r\n },\r\n get shape() {\r\n const s = new Shape();\r\n points.forEach((p, i) => i === 0 ? s.moveTo(p.x, p.y) : s.lineTo(p.x, p.y));\r\n return s;\r\n }\r\n };\r\n}","// src/constants/RalColors.ts\r\n\r\nexport interface RalColor {\r\n ral: string;\r\n hex: string;\r\n description: string;\r\n}\r\n\r\n// Type-safe record indexed by RAL code\r\nexport const ralColorsMap: Record<string, RalColor> = {\r\n RAL_1000: { ral: \"RAL_1000\", hex: \"#CDBA88\", description: \"Green beige\" },\r\n RAL_1001: { ral: \"RAL_1001\", hex: \"#D0B084\", description: \"Beige\" },\r\n RAL_1002: { ral: \"RAL_1002\", hex: \"#D2AA6D\", description: \"Sand yellow\" },\r\n RAL_1003: { ral: \"RAL_1003\", hex: \"#F9A900\", description: \"Signal yellow\" },\r\n RAL_1004: { ral: \"RAL_1004\", hex: \"#E49E00\", description: \"Golden yellow\" },\r\n RAL_1005: { ral: \"RAL_1005\", hex: \"#CB8F00\", description: \"Honey yellow\" },\r\n RAL_1006: { ral: \"RAL_1006\", hex: \"#E19000\", description: \"Maize yellow\" },\r\n RAL_1007: { ral: \"RAL_1007\", hex: \"#E88C00\", description: \"Daffodil yellow\" },\r\n RAL_1011: { ral: \"RAL_1011\", hex: \"#AF8050\", description: \"Brown beige\" },\r\n RAL_1012: { ral: \"RAL_1012\", hex: \"#DDAF28\", description: \"Lemon yellow\" },\r\n RAL_1013: { ral: \"RAL_1013\", hex: \"#E3D9C7\", description: \"Oyster white\" },\r\n RAL_1014: { ral: \"RAL_1014\", hex: \"#DDC49B\", description: \"Ivory\" },\r\n RAL_1015: { ral: \"RAL_1015\", hex: \"#E6D2B5\", description: \"Light ivory\" },\r\n RAL_1016: { ral: \"RAL_1016\", hex: \"#F1DD39\", description: \"Sulfur yellow\" },\r\n RAL_1017: { ral: \"RAL_1017\", hex: \"#F6A951\", description: \"Saffron yellow\" },\r\n RAL_1018: { ral: \"RAL_1018\", hex: \"#FACA31\", description: \"Zinc yellow\" },\r\n RAL_1019: { ral: \"RAL_1019\", hex: \"#A48F7A\", description: \"Grey beige\" },\r\n RAL_1020: { ral: \"RAL_1020\", hex: \"#A08F65\", description: \"Olive yellow\" },\r\n RAL_1021: { ral: \"RAL_1021\", hex: \"#F6B600\", description: \"Colza yellow\" },\r\n RAL_1023: { ral: \"RAL_1023\", hex: \"#F7B500\", description: \"Traffic yellow\" },\r\n RAL_1024: { ral: \"RAL_1024\", hex: \"#BA8F4C\", description: \"Ochre yellow\" },\r\n RAL_1026: { ral: \"RAL_1026\", hex: \"#FFFF00\", description: \"Luminous yellow\" },\r\n RAL_1027: { ral: \"RAL_1027\", hex: \"#A77F0F\", description: \"Curry\" },\r\n RAL_1028: { ral: \"RAL_1028\", hex: \"#FF9C00\", description: \"Melon yellow\" },\r\n RAL_1032: { ral: \"RAL_1032\", hex: \"#E2A300\", description: \"Broom yellow\" },\r\n RAL_1033: { ral: \"RAL_1033\", hex: \"#F99A1D\", description: \"Dahlia yellow\" },\r\n RAL_1034: { ral: \"RAL_1034\", hex: \"#EB9C52\", description: \"Pastel yellow\" },\r\n RAL_1035: { ral: \"RAL_1035\", hex: \"#8F8370\", description: \"Pearl beige\" },\r\n RAL_1036: { ral: \"RAL_1036\", hex: \"#806440\", description: \"Pearl gold\" },\r\n RAL_1037: { ral: \"RAL_1037\", hex: \"#F09200\", description: \"Sun yellow\" },\r\n RAL_2000: { ral: \"RAL_2000\", hex: \"#DA6E00\", description: \"Yellow orange\" },\r\n RAL_2001: { ral: \"RAL_2001\", hex: \"#BA481C\", description: \"Red orange\" },\r\n RAL_2002: { ral: \"RAL_2002\", hex: \"#BF3922\", description: \"Vermilion\" },\r\n RAL_2003: { ral: \"RAL_2003\", hex: \"#F67829\", description: \"Pastel orange\" },\r\n RAL_2004: { ral: \"RAL_2004\", hex: \"#E25304\", description: \"Pure orange\" },\r\n RAL_2005: { ral: \"RAL_2005\", hex: \"#FF4D08\", description: \"Luminous orange\" },\r\n RAL_2007: { ral: \"RAL_2007\", hex: \"#FFB200\", description: \"Luminous bright orange\" },\r\n RAL_2008: { ral: \"RAL_2008\", hex: \"#EC6B22\", description: \"Bright red orange\" },\r\n RAL_2009: { ral: \"RAL_2009\", hex: \"#DE5308\", description: \"Traffic orange\" },\r\n RAL_2010: { ral: \"RAL_2010\", hex: \"#D05D29\", description: \"Signal orange\" },\r\n RAL_2011: { ral: \"RAL_2011\", hex: \"#E26E0F\", description: \"Deep orange\" },\r\n RAL_2012: { ral: \"RAL_2012\", hex: \"#D5654E\", description: \"Salmon orange\" },\r\n RAL_2013: { ral: \"RAL_2013\", hex: \"#923E25\", description: \"Pearl orange\" },\r\n RAL_2017: { ral: \"RAL_2017\", hex: \"#FC5500\", description: \"RAL orange\" },\r\n RAL_3000: { ral: \"RAL_3000\", hex: \"#A72920\", description: \"Flame red\" },\r\n RAL_3001: { ral: \"RAL_3001\", hex: \"#9B2423\", description: \"Signal red\" },\r\n RAL_3002: { ral: \"RAL_3002\", hex: \"#9B2321\", description: \"Carmine red\" },\r\n RAL_3003: { ral: \"RAL_3003\", hex: \"#861A22\", description: \"Ruby red\" },\r\n RAL_3004: { ral: \"RAL_3004\", hex: \"#6B1C23\", description: \"Purple red\" },\r\n RAL_3005: { ral: \"RAL_3005\", hex: \"#59191F\", description: \"Wine red\" },\r\n RAL_3007: { ral: \"RAL_3007\", hex: \"#3E2022\", description: \"Black red\" },\r\n RAL_3009: { ral: \"RAL_3009\", hex: \"#6D342D\", description: \"Oxide red\" },\r\n RAL_3011: { ral: \"RAL_3011\", hex: \"#782423\", description: \"Brown red\" },\r\n RAL_3012: { ral: \"RAL_3012\", hex: \"#C5856D\", description: \"Beige red\" },\r\n RAL_3013: { ral: \"RAL_3013\", hex: \"#972E25\", description: \"Tomato red\" },\r\n RAL_3014: { ral: \"RAL_3014\", hex: \"#CB7375\", description: \"Antique pink\" },\r\n RAL_3015: { ral: \"RAL_3015\", hex: \"#D8A0A6\", description: \"Light pink\" },\r\n RAL_3016: { ral: \"RAL_3016\", hex: \"#A63D30\", description: \"Coral red\" },\r\n RAL_3017: { ral: \"RAL_3017\", hex: \"#CA555D\", description: \"Rose\" },\r\n RAL_3018: { ral: \"RAL_3018\", hex: \"#C63F4A\", description: \"Strawberry red\" },\r\n RAL_3020: { ral: \"RAL_3020\", hex: \"#BB1F11\", description: \"Traffic red\" },\r\n RAL_3022: { ral: \"RAL_3022\", hex: \"#CF6955\", description: \"Salmon pink\" },\r\n RAL_3024: { ral: \"RAL_3024\", hex: \"#FF2D21\", description: \"Luminous red\" },\r\n RAL_3026: { ral: \"RAL_3026\", hex: \"#FF2A1C\", description: \"Luminous bright red\" },\r\n RAL_3027: { ral: \"RAL_3027\", hex: \"#AB273C\", description: \"Raspberry red\" },\r\n RAL_3028: { ral: \"RAL_3028\", hex: \"#CC2C24\", description: \"Pure red\" },\r\n RAL_3031: { ral: \"RAL_3031\", hex: \"#A63437\", description: \"Orient red\" },\r\n RAL_3032: { ral: \"RAL_3032\", hex: \"#701D24\", description: \"Pearl ruby red\" },\r\n RAL_3033: { ral: \"RAL_3033\", hex: \"#A53A2E\", description: \"Pearl pink\" },\r\n RAL_4001: { ral: \"RAL_4001\", hex: \"#816183\", description: \"Red lilac\" },\r\n RAL_4002: { ral: \"RAL_4002\", hex: \"#8D3C4B\", description: \"Red violet\" },\r\n RAL_4003: { ral: \"RAL_4003\", hex: \"#C4618C\", description: \"Heather violet\" },\r\n RAL_4004: { ral: \"RAL_4004\", hex: \"#651E38\", description: \"Claret violet\" },\r\n RAL_4005: { ral: \"RAL_4005\", hex: \"#76689A\", description: \"Blue lilac\" },\r\n RAL_4006: { ral: \"RAL_4006\", hex: \"#903373\", description: \"Traffic purple\" },\r\n RAL_4007: { ral: \"RAL_4007\", hex: \"#47243C\", description: \"Purple violet\" },\r\n RAL_4008: { ral: \"RAL_4008\", hex: \"#844C82\", description: \"Signal violet\" },\r\n RAL_4009: { ral: \"RAL_4009\", hex: \"#9D8692\", description: \"Pastel violet\" },\r\n RAL_4010: { ral: \"RAL_4010\", hex: \"#BB4077\", description: \"Telemagenta\" },\r\n RAL_4011: { ral: \"RAL_4011\", hex: \"#6E6387\", description: \"Pearl violet\" },\r\n RAL_4012: { ral: \"RAL_4012\", hex: \"#6A6B7F\", description: \"Pearl blackberry\" },\r\n RAL_5000: { ral: \"RAL_5000\", hex: \"#304F6E\", description: \"Violet blue\" },\r\n RAL_5001: { ral: \"RAL_5001\", hex: \"#0E4C64\", description: \"Green blue\" },\r\n RAL_5002: { ral: \"RAL_5002\", hex: \"#00387A\", description: \"Ultramarine blue\" },\r\n RAL_5003: { ral: \"RAL_5003\", hex: \"#1F3855\", description: \"Sapphire blue\" },\r\n RAL_5004: { ral: \"RAL_5004\", hex: \"#191E28\", description: \"Black blue\" },\r\n RAL_5005: { ral: \"RAL_5005\", hex: \"#005387\", description: \"Signal blue\" },\r\n RAL_5007: { ral: \"RAL_5007\", hex: \"#376B8C\", description: \"Brillant blue\" },\r\n RAL_5008: { ral: \"RAL_5008\", hex: \"#2B3A44\", description: \"Grey blue\" },\r\n RAL_5009: { ral: \"RAL_5009\", hex: \"#215F78\", description: \"Azure blue\" },\r\n RAL_5010: { ral: \"RAL_5010\", hex: \"#004F7C\", description: \"Gentian blue\" },\r\n RAL_5011: { ral: \"RAL_5011\", hex: \"#1A2B3C\", description: \"Steel blue\" },\r\n RAL_5012: { ral: \"RAL_5012\", hex: \"#0089B6\", description: \"Light blue\" },\r\n RAL_5013: { ral: \"RAL_5013\", hex: \"#193153\", description: \"Cobalt blue\" },\r\n RAL_5014: { ral: \"RAL_5014\", hex: \"#637D96\", description: \"Pigeon blue\" },\r\n RAL_5015: { ral: \"RAL_5015\", hex: \"#007CAF\", description: \"Sky blue\" },\r\n RAL_5017: { ral: \"RAL_5017\", hex: \"#005B8C\", description: \"Traffic blue\" },\r\n RAL_5018: { ral: \"RAL_5018\", hex: \"#048B8C\", description: \"Turquoise blue\" },\r\n RAL_5019: { ral: \"RAL_5019\", hex: \"#005E83\", description: \"Capri blue\" },\r\n RAL_5020: { ral: \"RAL_5020\", hex: \"#00414B\", description: \"Ocean blue\" },\r\n RAL_5021: { ral: \"RAL_5021\", hex: \"#007577\", description: \"Water blue\" },\r\n RAL_5022: { ral: \"RAL_5022\", hex: \"#222D5A\", description: \"Night blue\" },\r\n RAL_5023: { ral: \"RAL_5023\", hex: \"#41698C\", description: \"Distant blue\" },\r\n RAL_5024: { ral: \"RAL_5024\", hex: \"#6093AC\", description: \"Pastel blue\" },\r\n RAL_5025: { ral: \"RAL_5025\", hex: \"#20697C\", description: \"Pearl gentian blue\" },\r\n RAL_5026: { ral: \"RAL_5026\", hex: \"#0F3052\", description: \"Pearl night blue\" },\r\n RAL_6000: { ral: \"RAL_6000\", hex: \"#3C7460\", description: \"Patina green\" },\r\n RAL_6001: { ral: \"RAL_6001\", hex: \"#366735\", description: \"Emerald green\" },\r\n RAL_6002: { ral: \"RAL_6002\", hex: \"#325928\", description: \"Leaf green\" },\r\n RAL_6003: { ral: \"RAL_6003\", hex: \"#50533C\", description: \"Olive green\" },\r\n RAL_6004: { ral: \"RAL_6004\", hex: \"#024442\", description: \"Blue green\" },\r\n RAL_6005: { ral: \"RAL_6005\", hex: \"#114232\", description: \"Moss green\" },\r\n RAL_6006: { ral: \"RAL_6006\", hex: \"#3C392E\", description: \"Grey olive\" },\r\n RAL_6007: { ral: \"RAL_6007\", hex: \"#2C3222\", description: \"Bottle green\" },\r\n RAL_6008: { ral: \"RAL_6008\", hex: \"#36342A\", description: \"Brown green\" },\r\n RAL_6009: { ral: \"RAL_6009\", hex: \"#27352A\", description: \"Fir green\" },\r\n RAL_6010: { ral: \"RAL_6010\", hex: \"#4D6F39\", description: \"Grass green\" },\r\n RAL_6011: { ral: \"RAL_6011\", hex: \"#6B7C59\", description: \"Reseda green\" },\r\n RAL_6012: { ral: \"RAL_6012\", hex: \"#2F3D3A\", description: \"Black green\" },\r\n RAL_6013: { ral: \"RAL_6013\", hex: \"#7C765A\", description: \"Reed green\" },\r\n RAL_6014: { ral: \"RAL_6014\", hex: \"#474135\", description: \"Yellow olive\" },\r\n RAL_6015: { ral: \"RAL_6015\", hex: \"#3D3D36\", description: \"Black olive\" },\r\n RAL_6016: { ral: \"RAL_6016\", hex: \"#00694C\", description: \"Turquoise green\" },\r\n RAL_6017: { ral: \"RAL_6017\", hex: \"#587F40\", description: \"May green\" },\r\n RAL_6018: { ral: \"RAL_6018\", hex: \"#60993B\", description: \"Yellow green\" },\r\n RAL_6019: { ral: \"RAL_6019\", hex: \"#B9CEAC\", description: \"Pastel green\" },\r\n RAL_6020: { ral: \"RAL_6020\", hex: \"#37422F\", description: \"Chrome green\" },\r\n RAL_6021: { ral: \"RAL_6021\", hex: \"#8A9977\", description: \"Pale green\" },\r\n RAL_6022: { ral: \"RAL_6022\", hex: \"#3A3327\", description: \"Olive drab\" },\r\n RAL_6024: { ral: \"RAL_6024\", hex: \"#008351\", description: \"Traffic green\" },\r\n RAL_6025: { ral: \"RAL_6025\", hex: \"#5E6E3B\", description: \"Fern green\" },\r\n RAL_6026: { ral: \"RAL_6026\", hex: \"#005F4E\", description: \"Opal green\" },\r\n RAL_6027: { ral: \"RAL_6027\", hex: \"#7EBAB5\", description: \"Light green\" },\r\n RAL_6028: { ral: \"RAL_6028\", hex: \"#315442\", description: \"Pine green\" },\r\n RAL_6029: { ral: \"RAL_6029\", hex: \"#006F3D\", description: \"Mint green\" },\r\n RAL_6032: { ral: \"RAL_6032\", hex: \"#237F52\", description: \"Signal green\" },\r\n RAL_6033: { ral: \"RAL_6033\", hex: \"#45877F\", description: \"Mint turquoise\" },\r\n RAL_6034: { ral: \"RAL_6034\", hex: \"#7AADAC\", description: \"Pastel turquoise\" },\r\n RAL_6035: { ral: \"RAL_6035\", hex: \"#194D25\", description: \"Pearl green\" },\r\n RAL_6036: { ral: \"RAL_6036\", hex: \"#04574B\", description: \"Pearl opal green\" },\r\n RAL_6037: { ral: \"RAL_6037\", hex: \"#008B29\", description: \"Pure green\" },\r\n RAL_6038: { ral: \"RAL_6038\", hex: \"#00B51B\", description: \"Luminous green\" },\r\n RAL_6039: { ral: \"RAL_6039\", hex: \"#B3C43E\", description: \"Fibrous green\" },\r\n RAL_7000: { ral: \"RAL_7000\", hex: \"#7A888E\", description: \"Squirrel grey\" },\r\n RAL_7001: { ral: \"RAL_7001\", hex: \"#8C979C\", description: \"Silver grey\" },\r\n RAL_7002: { ral: \"RAL_7002\", hex: \"#817863\", description: \"Olive grey\" },\r\n RAL_7003: { ral: \"RAL_7003\", hex: \"#797669\", description: \"Moss grey\" },\r\n RAL_7004: { ral: \"RAL_7004\", hex: \"#9A9B9B\", description: \"Signal grey\" },\r\n RAL_7005: { ral: \"RAL_7005\", hex: \"#6B6E6B\", description: \"Mouse grey\" },\r\n RAL_7006: { ral: \"RAL_7006\", hex: \"#766A5E\", description: \"Beige grey\" },\r\n RAL_7008: { ral: \"RAL_7008\", hex: \"#745F3D\", description: \"Khaki grey\" },\r\n RAL_7009: { ral: \"RAL_7009\", hex: \"#5D6058\", description: \"Green grey\" },\r\n RAL_7010: { ral: \"RAL_7010\", hex: \"#585C56\", description: \"Tarpaulin grey\" },\r\n RAL_7011: { ral: \"RAL_7011\", hex: \"#52595D\", description: \"Iron grey\" },\r\n RAL_7012: { ral: \"RAL_7012\", hex: \"#575D5E\", description: \"Basalt grey\" },\r\n RAL_7013: { ral: \"RAL_7013\", hex: \"#575044\", description: \"Brown grey\" },\r\n RAL_7015: { ral: \"RAL_7015\", hex: \"#4F5358\", description: \"Slate grey\" },\r\n RAL_7016: { ral: \"RAL_7016\", hex: \"#383E42\", description: \"Anthracite grey\" },\r\n RAL_7021: { ral: \"RAL_7021\", hex: \"#2F3234\", description: \"Black grey\" },\r\n RAL_7022: { ral: \"RAL_7022\", hex: \"#4C4A44\", description: \"Umbra grey\" },\r\n RAL_7023: { ral: \"RAL_7023\", hex: \"#808076\", description: \"Concrete grey\" },\r\n RAL_7024: { ral: \"RAL_7024\", hex: \"#45494E\", description: \"Graphite grey\" },\r\n RAL_7026: { ral: \"RAL_7026\", hex: \"#374345\", description: \"Granite grey\" },\r\n RAL_7030: { ral: \"RAL_7030\", hex: \"#928E85\", description: \"Stone grey\" },\r\n RAL_7031: { ral: \"RAL_7031\", hex: \"#5B686D\", description: \"Blue grey\" },\r\n RAL_7032: { ral: \"RAL_7032\", hex: \"#B5B0A1\", description: \"Pebble grey\" },\r\n RAL_7033: { ral: \"RAL_7033\", hex: \"#7F8274\", description: \"Cement grey\" },\r\n RAL_7034: { ral: \"RAL_7034\", hex: \"#92886F\", description: \"Yellow grey\" },\r\n RAL_7035: { ral: \"RAL_7035\", hex: \"#C5C7C4\", description: \"Light grey\" },\r\n RAL_7036: { ral: \"RAL_7036\", hex: \"#979392\", description: \"Platinum grey\" },\r\n RAL_7037: { ral: \"RAL_7037\", hex: \"#7A7B7A\", description: \"Dusty grey\" },\r\n RAL_7038: { ral: \"RAL_7038\", hex: \"#B0B0A9\", description: \"Agate grey\" },\r\n RAL_7039: { ral: \"RAL_7039\", hex: \"#6B665E\", description: \"Quartz grey\" },\r\n RAL_7040: { ral: \"RAL_7040\", hex: \"#989EA1\", description: \"Window grey\" },\r\n RAL_7042: { ral: \"RAL_7042\", hex: \"#8E9291\", description: \"Traffic grey A\" },\r\n RAL_7043: { ral: \"RAL_7043\", hex: \"#4F5250\", description: \"Traffic grey B\" },\r\n RAL_7044: { ral: \"RAL_7044\", hex: \"#B7B3A8\", description: \"Silk grey\" },\r\n RAL_7045: { ral: \"RAL_7045\", hex: \"#8D9295\", description: \"Telegrey 1\" },\r\n RAL_7046: { ral: \"RAL_7046\", hex: \"#7E868A\", description: \"Telegrey 2\" },\r\n RAL_7047: { ral: \"RAL_7047\", hex: \"#C8C8C7\", description: \"Telegrey 4\" },\r\n RAL_7048: { ral: \"RAL_7048\", hex: \"#817B73\", description: \"Pearl mouse grey\" },\r\n RAL_8000: { ral: \"RAL_8000\", hex: \"#89693F\", description: \"Green brown\" },\r\n RAL_8001: { ral: \"RAL_8001\", hex: \"#9D622B\", description: \"Ochre brown\" },\r\n RAL_8002: { ral: \"RAL_8002\", hex: \"#794D3E\", description: \"Signal brown\" },\r\n RAL_8003: { ral: \"RAL_8003\", hex: \"#7E4B27\", description: \"Clay brown\" },\r\n RAL_8004: { ral: \"RAL_8004\", hex: \"#8D4931\", description: \"Copper brown\" },\r\n RAL_8007: { ral: \"RAL_8007\", hex: \"#70462B\", description: \"Fawn brown\" },\r\n RAL_8008: { ral: \"RAL_8008\", hex: \"#724A25\", description: \"Olive brown\" },\r\n RAL_8011: { ral: \"RAL_8011\", hex: \"#5A3827\", description: \"Nut brown\" },\r\n RAL_8012: { ral: \"RAL_8012\", hex: \"#66332B\", description: \"Red brown\" },\r\n RAL_8014: { ral: \"RAL_8014\", hex: \"#4A3526\", description: \"Sepia brown\" },\r\n RAL_8015: { ral: \"RAL_8015\", hex: \"#5E2F26\", description: \"Chestnut brown\" },\r\n RAL_8016: { ral: \"RAL_8016\", hex: \"#4C2B20\", description: \"Mahogany brown\" },\r\n RAL_8017: { ral: \"RAL_8017\", hex: \"#442F29\", description: \"Chocolate brown\" },\r\n RAL_8019: { ral: \"RAL_8019\", hex: \"#3D3635\", description: \"Grey brown\" },\r\n RAL_8022: { ral: \"RAL_8022\", hex: \"#1A1719\", description: \"Black brown\" },\r\n RAL_8023: { ral: \"RAL_8023\", hex: \"#A45729\", description: \"Orange brown\" },\r\n RAL_8024: { ral: \"RAL_8024\", hex: \"#795038\", description: \"Beige brown\" },\r\n RAL_8025: { ral: \"RAL_8025\", hex: \"#755847\", description: \"Pale brown\" },\r\n RAL_8028: { ral: \"RAL_8028\", hex: \"#513A2A\", description: \"Terra brown\" },\r\n RAL_8029: { ral: \"RAL_8029\", hex: \"#7F4031\", description: \"Pearl copper\" },\r\n RAL_9001: { ral: \"RAL_9001\", hex: \"#E9E0D2\", description: \"Cream\" },\r\n RAL_9002: { ral: \"RAL_9002\", hex: \"#D6D5CB\", description: \"Grey white\" },\r\n RAL_9003: { ral: \"RAL_9003\", hex: \"#ECECE7\", description: \"Signal white\" },\r\n RAL_9004: { ral: \"RAL_9004\", hex: \"#2B2B2C\", description: \"Signal black\" },\r\n RAL_9005: { ral: \"RAL_9005\", hex: \"#0E0E10\", description: \"Jet black\" },\r\n RAL_9006: { ral: \"RAL_9006\", hex: \"#A1A1A0\", description: \"White aluminium\" },\r\n RAL_9007: { ral: \"RAL_9007\", hex: \"#868581\", description: \"Grey aluminium\" },\r\n RAL_9010: { ral: \"RAL_9010\", hex: \"#F1EDE1\", description: \"Pure white\" },\r\n RAL_9011: { ral: \"RAL_9011\", hex: \"#27292B\", description: \"Graphite black\" },\r\n RAL_9012: { ral: \"RAL_9012\", hex: \"#F8F2E1\", description: \"Cleanroom white\" },\r\n RAL_9016: { ral: \"RAL_9016\", hex: \"#F1F1EA\", description: \"Traffic white\" },\r\n RAL_9017: { ral: \"RAL_9017\", hex: \"#29292A\", description: \"Traffic black\" },\r\n RAL_9018: { ral: \"RAL_9018\", hex: \"#C8CBC4\", description: \"Papyrus white\" },\r\n RAL_9022: { ral: \"RAL_9022\", hex: \"#858583\", description: \"Pearl light grey\" },\r\n RAL_9023: { ral: \"RAL_9023\", hex: \"#787B7A\", description: \"Pearl dark grey\" }\r\n} as const;\r\n\r\n// Helper function: Get hex color from RAL code (O(1) lookup)\r\nexport function getRalHexColor(ralCode: string): string | undefined {\r\n return ralColorsMap[ralCode]?.hex;\r\n}\r\n\r\n// Helper function: Check if string is a RAL color (O(1) lookup)\r\nexport function isRalColor(value?: string): boolean {\r\n if (!value) return false\r\n return value in ralColorsMap;\r\n}\r\n","import { createContext, useContext, type ReactNode } from 'react';\n\nexport interface TextureConfigContextType {\n textureBaseUrl: string;\n textureFolder?: string;\n textureExtension?: string;\n textureSuffix?: string;\n}\n\nconst defaultConfig: TextureConfigContextType = {\n textureBaseUrl: 'https://imagedelivery.net/aYYmWUcv7lRhpLdU4ojPsA',\n textureFolder: 'copy_2',\n textureExtension: '.jpg',\n textureSuffix: '/public'\n};\n\nexport const TextureConfigContext = createContext<TextureConfigContextType>(defaultConfig);\n\nexport interface TextureConfigProviderProps {\n children: ReactNode;\n config?: Partial<TextureConfigContextType>;\n}\n\nexport function TextureConfigProvider({ children, config = {} }: TextureConfigProviderProps) {\n const value = {\n ...defaultConfig,\n ...config\n };\n\n return (\n <TextureConfigContext.Provider value={value}>\n {children}\n </TextureConfigContext.Provider>\n );\n}\n\nexport function useTextureConfig() {\n const context = useContext(TextureConfigContext);\n if (!context) {\n return defaultConfig;\n }\n return context;\n}\n\nexport function buildTextureUrl(renderMat: string, config: TextureConfigContextType): string {\n const { textureBaseUrl, textureFolder, textureExtension, textureSuffix } = config;\n const folder = textureFolder ? `/${textureFolder}` : '';\n const extension = textureExtension || '.jpg';\n const suffix = textureSuffix || '';\n\n return `${textureBaseUrl}${folder}/${renderMat}${extension}${suffix}`;\n}\n","// src/hooks/useMaterialLoader.ts\n\nimport { TextureLoader, Texture } from \"three\";\nimport { useState, useEffect, useMemo, useRef } from \"react\";\nimport { isRalColor, getRalHexColor } from \"../../constants/RalColors.ts\";\nimport { DEFAULT_RENDER_COLOR } from \"../../constants/Constants.tsx\";\nimport { useTextureConfig, buildTextureUrl } from \"../texture/TextureConfig.tsx\";\n\n// Global texture cache to avoid reloading textures\nconst textureCache = new Map<string, Texture>();\nconst failedUrls = new Set<string>();\n\nexport interface MaterialLoaderResult {\n texture: Texture | null;\n color: string | null;\n type: 'ral-color' | 'texture' | 'fallback' | 'glass';\n isLoading: boolean;\n opacity?: number; // For special materials like glass\n}\n\nexport function useMaterialLoader(renderValue?: string): MaterialLoaderResult {\n const textureConfig = useTextureConfig();\n const [loadedTexture, setLoadedTexture] = useState<Texture | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const currentUrlRef = useRef<string | null>(null);\n\n // Check for glass material\n const isGlass = useMemo(() =>\n renderValue?.toLowerCase().includes('glass') ?? false,\n [renderValue]\n );\n\n // Check for RAL color\n const ralHex = useMemo(() =>\n renderValue && isRalColor(renderValue) ? getRalHexColor(renderValue) : null,\n [renderValue]\n );\n\n // Build URL only if we need to load a texture\n const urlToLoad = useMemo(() => {\n if (!renderValue || ralHex || isGlass) return null;\n return buildTextureUrl(renderValue, textureConfig);\n }, [renderValue, ralHex, isGlass, textureConfig]);\n\n // Load texture manually with error handling\n useEffect(() => {\n // Skip if no URL needed\n if (!urlToLoad) {\n setLoadedTexture(null);\n setIsLoading(false);\n return;\n }\n\n // Skip if URL already failed\n if (failedUrls.has(urlToLoad)) {\n setLoadedTexture(null);\n setIsLoading(false);\n return;\n }\n\n // Use cached texture if available\n if (textureCache.has(urlToLoad)) {\n setLoadedTexture(textureCache.get(urlToLoad)!);\n setIsLoading(false);\n return;\n }\n\n // Track current URL to avoid race conditions\n currentUrlRef.current = urlToLoad;\n setIsLoading(true);\n\n const loader = new TextureLoader();\n loader.setCrossOrigin('anonymous');\n\n loader.load(\n urlToLoad,\n // onLoad\n (texture) => {\n if (currentUrlRef.current === urlToLoad) {\n textureCache.set(urlToLoad, texture);\n setLoadedTexture(texture);\n setIsLoading(false);\n }\n },\n // onProgress (unused)\n undefined,\n // onError\n () => {\n if (currentUrlRef.current === urlToLoad) {\n failedUrls.add(urlToLoad);\n setLoadedTexture(null);\n setIsLoading(false);\n }\n }\n );\n\n return () => {\n // Mark as stale if component unmounts or URL changes\n if (currentUrlRef.current === urlToLoad) {\n currentUrlRef.current = null;\n }\n };\n }, [urlToLoad]);\n\n // Glass material path (highest priority)\n if (isGlass) {\n return {\n texture: null,\n color: '#3accc1',\n type: 'glass',\n isLoading: false,\n opacity: 0.1\n };\n }\n\n // RAL color path\n if (ralHex) {\n return { texture: null, color: ralHex, type: 'ral-color', isLoading: false };\n }\n\n // No render value\n if (!renderValue) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: false\n };\n }\n\n // Loading state\n if (isLoading) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: true\n };\n }\n\n // Texture loaded successfully\n if (loadedTexture) {\n return { texture: loadedTexture, color: null, type: 'texture', isLoading: false };\n }\n\n // Texture failed or not found — fallback to color\n return { texture: null, color: DEFAULT_RENDER_COLOR, type: 'fallback', isLoading: false };\n}\n","import {memo, type RefObject, useMemo} from 'react';\r\nimport {BoxGeometry, ExtrudeGeometry} from 'three';\r\nimport {calculateMitrePoints} from \"../../helpers/MitreCalc.tsx\";\r\nimport type {PDProps} from \"../../types/pd.types.tsx\";\r\nimport {useMaterialLoader} from \"../../contexts/mat-surf/useMaterialLoader.ts\";\r\nimport {Edges} from \"@react-three/drei\";\r\nimport type {PartTypeSource} from \"../../construction_principle/dto/angl-type-config.ts\";\r\n\r\ninterface PD3DExtendedProps extends PDProps {\r\n treeId?: string;\r\n isSelected?: boolean;\r\n isHovered?: boolean;\r\n onClick?: () => void;\r\n onPointerEnter?: () => void;\r\n onPointerLeave?: () => void;\r\n startPanelThk?: number; // Add these\r\n endPanelThk?: number; // Add these\r\n render_mat?: string;\r\n meshRef?: RefObject<any>;\r\n elemInfo?: { source: PartTypeSource,[key: string]: unknown };\r\n}\r\n\r\nconst PD_3D = memo(function PD_3D({\r\n length,\r\n width,\r\n thk,\r\n material = 'red',\r\n opacity = 1,\r\n isSelected = false,\r\n isHovered = false,\r\n onClick,\r\n onPointerEnter,\r\n onPointerLeave,\r\n startPanelThk = 0,\r\n endPanelThk = 0,\r\n render_mat,\r\n meshRef,\r\n elemInfo\r\n }: PD3DExtendedProps) {\r\n\r\n const {texture, color, opacity: materialOpacity} = useMaterialLoader(render_mat);\r\n\r\n // Determine effective color based on state and material type\r\n let effectiveColor = useMemo(() => {\r\n if (isSelected) return '#ff6b00';\r\n if (isHovered) return '#0066ff';\r\n\r\n // IMPORTANT: If texture is loaded, use white (so texture shows correctly)\r\n // Three.js multiplies texture by color, so white = no tint\r\n if (texture) return '#ffffff';\r\n\r\n // Otherwise use color from loader (RAL or fallback) or material prop\r\n return color || material;\r\n }, [isSelected, isHovered, texture, color, material]);\r\n\r\n // Use material opacity from hook if available (e.g., for glass), otherwise use prop or state\r\n let effectiveOpacity = isSelected ? 1 : isHovered ? 1 : (materialOpacity ?? opacity);\r\n\r\n // Create extruded geometry from mitre shape\r\n const geometry = useMemo(() => {\r\n if (startPanelThk !== 0 || endPanelThk !== 0) {\r\n const {shape} = calculateMitrePoints(width, thk, startPanelThk, endPanelThk);\r\n const geo = new ExtrudeGeometry(shape, {depth: length, bevelEnabled: false, steps: 1});\r\n // Center the geometry to match boxGeometry behavior\r\n geo.center();\r\n\r\n // Rotate to swap Y and Z axes to match boxGeometry orientation\r\n geo.rotateZ(-Math.PI / 2);\r\n geo.rotateY(Math.PI / 2);\r\n\r\n return geo;\r\n } else {\r\n return new BoxGeometry(length, width, thk);\r\n }\r\n }, [length, width, thk, startPanelThk, endPanelThk]);\r\n\r\n return (\r\n <group rotation={[0, 0, 0]}>\r\n <mesh ref={meshRef} userData={elemInfo} geometry={geometry} onClick={onClick} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\r\n <meshStandardMaterial color={effectiveColor} opacity={effectiveOpacity} transparent={effectiveOpacity < 1}/>\r\n <Edges color={isSelected ? '#ff6b00' : isHovered ? '#0066ff' : '#484947'} opacity={0.1} transparent={true}/>\r\n {/*<Edges color={'#ff6b00'}/>*/}\r\n </mesh>\r\n </group>\r\n );\r\n});\r\n\r\nexport default PD_3D;","export interface DimensionLineStyle {\r\n color?: string;\r\n strokeWidth?: number;\r\n arrowSize?: number;\r\n fontSize?: number;\r\n}\r\n\r\nexport interface DimensionPosition {\r\n horizontal?: 'top' | 'bottom' | 'both' | 'none';\r\n vertical?: 'left' | 'right' | 'both' | 'none';\r\n}\r\n\r\nexport interface DimensionRule {\r\n cpNames: string[]; // Which CPNAMEs to apply to (supports wildcards)\r\n showHorizontal?: boolean; // Show width dimension\r\n showVertical?: boolean; // Show height dimension\r\n position?: DimensionPosition; // Where to place dimension lines\r\n offset?: number; // Distance from panel edge\r\n lineStyle?: DimensionLineStyle;\r\n showLabel?: boolean; // Show dimension value text\r\n labelSuffix?: string; // e.g., \"mm\" or \"\"\r\n}\r\n\r\n// Default dimension rule\r\nconst defaultRule: DimensionRule = {\r\n cpNames: ['*'],\r\n showHorizontal: false,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 100,\r\n lineStyle: {\r\n color: '#333',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 12\r\n },\r\n showLabel: true,\r\n labelSuffix: ''\r\n};\r\n\r\n// Dimension rules configuration\r\nexport const dimensionRules: DimensionRule[] = [\r\n {\r\n cpNames: ['CP_1_RS_*','P_CP_T100_WP*'],\r\n showHorizontal: true,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 0,\r\n lineStyle: {\r\n color: '#b61c73',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 10\r\n },\r\n showLabel: true,\r\n labelSuffix: ''\r\n },\r\n {\r\n cpNames: ['P_CP_*_GL_*'],\r\n showHorizontal: true,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 0,\r\n lineStyle: {\r\n color: '#1b14ee',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 10\r\n }\r\n },\r\n];\r\n\r\n//Get dimension rules for a given CPNAME\r\nexport function getDimensionRules(cpName: string): DimensionRule | null {\r\n if (!cpName) return null;\r\n\r\n // Find first matching rule\r\n for (const rule of dimensionRules) {\r\n for (const pattern of rule.cpNames) {\r\n if (matchCPName(cpName, pattern)) {\r\n // Merge with defaults\r\n return {\r\n ...defaultRule,\r\n ...rule,\r\n position: { ...defaultRule.position, ...rule.position },\r\n lineStyle: { ...defaultRule.lineStyle, ...rule.lineStyle }\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null; // No rule found, don't show dimensions\r\n}\r\n\r\n/**\r\n * Match CPNAME against pattern (supports wildcards)\r\n * @param cpName - The actual CPNAME\r\n * @param pattern - The pattern to match (supports * wildcard)\r\n * @returns true if matches\r\n */\r\nfunction matchCPName(cpName: string, pattern: string): boolean {\r\n if (pattern === '*') return true;\r\n if (pattern === cpName) return true;\r\n\r\n // Convert wildcard pattern to regex\r\n const regexPattern = pattern\r\n .replace(/\\*/g, '.*')\r\n .replace(/\\?/g, '.');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cpName);\r\n}\r\n\r\n/**\r\n * Check if dimensions should be shown for a CPNAME\r\n * @param cpName - The construction principle name\r\n * @returns boolean\r\n */\r\nexport function shouldShowDimensions(cpName: string): boolean {\r\n const rules = getDimensionRules(cpName);\r\n return rules !== null && (!!rules.showHorizontal || !!rules.showVertical);\r\n}","import type { DimensionRule } from '../../config/dimensionConfig';\n\nexport interface DimensionLinesProps {\n width: number;\n height: number;\n rules: DimensionRule;\n}\n\nexport default function DimensionLines({ width, height, rules }: DimensionLinesProps) {\n if (!rules.showHorizontal && !rules.showVertical) return null;\n\n const offset = rules.offset || 30;\n const lineStyle = rules.lineStyle || {};\n const color = lineStyle.color || '#333';\n const strokeWidth = lineStyle.strokeWidth || 1;\n const fontSize = lineStyle.fontSize || 12;\n const arrowSize = lineStyle.arrowSize || 6;\n\n const dimensions: React.ReactElement[] = [];\n\n // Horizontal dimension (width)\n if (rules.showHorizontal) {\n const positions: ('top' | 'bottom')[] = [];\n\n if (rules.position?.horizontal === 'both') {\n positions.push('top', 'bottom');\n } else if (rules.position?.horizontal === 'top') {\n positions.push('top');\n } else if (rules.position?.horizontal === 'bottom') {\n positions.push('bottom');\n }\n\n positions.forEach((pos, idx) => {\n const y = pos === 'bottom' ? -height / 2 - offset : height / 2 + offset;\n const label = rules.showLabel ? `${width.toFixed(0)}${rules.labelSuffix || ''}` : '';\n\n dimensions.push(\n <g key={`h-${pos}-${idx}`}>\n {/* Main dimension line */}\n <line x1={-width / 2} y1={y} x2={width / 2} y2={y} stroke={color} strokeWidth={strokeWidth}/>\n\n {/* Left arrow */}\n <polygon points={`${-width / 2},${y} ${-width / 2 + arrowSize},${y - arrowSize / 2} ${-width / 2 + arrowSize},${y + arrowSize / 2}`} fill={color}/>\n\n {/* Right arrow */}\n <polygon points={`${width / 2},${y} ${width / 2 - arrowSize},${y - arrowSize / 2} ${width / 2 - arrowSize},${y + arrowSize / 2}`} fill={color}/>\n\n {/* Extension lines */}\n <line x1={-width / 2} y1={-height / 2} x2={-width / 2} y2={y} stroke={color} strokeWidth={strokeWidth * 0.5} strokeDasharray=\"2,2\"/>\n <line x1={width / 2} y1={-height / 2} x2={width / 2} y2={y} stroke={color} strokeWidth={strokeWidth * 0.5} strokeDasharray=\"2,2\"/>\n\n {/* Label */}\n {label && (\n <g transform={`translate(${0}, ${y-fontSize})`}>\n <text textAnchor=\"middle\" fontSize={fontSize} fill={color} transform={`scale(1,-1)`}>\n {label}\n </text>\n </g>\n\n )}\n </g>\n );\n });\n }\n\n // Vertical dimension (height)\n if (rules.showVertical) {\n const positions: ('left' | 'right')[] = [];\n\n if (rules.position?.vertical === 'both') {\n positions.push('left', 'right');\n } else if (rules.position?.vertical === 'left') {\n positions.push('left');\n } else if (rules.position?.vertical === 'right') {\n positions.push('right');\n }\n\n positions.forEach((pos, idx) => {\n const x = pos === 'left' ? -width / 2 - offset : width / 2 + offset;\n const label = rules.showLabel ? `${height.toFixed(0)}${rules.labelSuffix || ''}` : '';\n\n dimensions.push(\n <g key={`v-${pos}-${idx}`}>\n {/* Main dimension line */}\n <line\n x1={x}\n y1={-height / 2}\n x2={x}\n y2={height / 2}\n stroke={color}\n strokeWidth={strokeWidth}\n />\n\n {/* Bottom arrow */}\n <polygon\n points={`${x},${-height / 2} ${x - arrowSize / 2},${-height / 2 + arrowSize} ${x + arrowSize / 2},${-height / 2 + arrowSize}`}\n fill={color}\n />\n\n {/* Top arrow */}\n <polygon\n points={`${x},${height / 2} ${x - arrowSize / 2},${height / 2 - arrowSize} ${x + arrowSize / 2},${height / 2 - arrowSize}`}\n fill={color}\n />\n\n {/* Extension lines */}\n <line\n x1={-width / 2}\n y1={-height / 2}\n x2={x}\n y2={-height / 2}\n stroke={color}\n strokeWidth={strokeWidth * 0.5}\n strokeDasharray=\"2,2\"\n />\n <line\n x1={-width / 2}\n y1={height / 2}\n x2={x}\n y2={height / 2}\n stroke={color}\n strokeWidth={strokeWidth * 0.5}\n strokeDasharray=\"2,2\"\n />\n\n {/* Label */}\n {label && (\n <text\n x={x + (pos === 'left' ? -fontSize : fontSize)}\n y={0}\n textAnchor=\"middle\"\n fontSize={fontSize}\n fill={color}\n transform={`scale(1,-1) rotate(90 ${x + (pos === 'left' ? -fontSize : fontSize)} 0)`}\n >\n {label}\n </text>\n )}\n </g>\n );\n });\n }\n\n return <g className=\"dimension-lines\">{dimensions}</g>;\n}\n","import {calculateMitrePoints} from \"../../helpers/MitreCalc.tsx\";\nimport {getDimensionRules} from \"../../config/dimensionConfig\";\nimport DimensionLines from \"../dimensions/DimensionLines\";\n\nexport interface PD2DProps {\n treeId?: string;\n dim_x: number;\n dim_y: number;\n text?: string;\n stroke_width?: number;\n rotate?: number;\n isSelected?: boolean;\n isHovered?: boolean;\n onClick?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n\n // Simple trim properties\n startPanelThk?: number; // Previous panel thickness (default 0)\n endPanelThk?: number; // Next panel thickness (default 0)\n cpName?: string\n render_mat?: string,\n}\n\nexport default function PD_2D({\n dim_x,\n dim_y,\n text = '',\n stroke_width = 2,\n rotate = 0,\n isSelected = false,\n isHovered = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n startPanelThk = 0,\n endPanelThk = 0,\n cpName,\n render_mat,\n }: PD2DProps) {\n // Calculate points with mitre trims\n const {svgPath} = calculateMitrePoints(dim_x, dim_y, startPanelThk, endPanelThk,);\n\n const strokeColor = isSelected ? '#ff6b00' : isHovered ? '#0066ff' : 'black';\n const effectiveStrokeWidth = isSelected ? stroke_width * 2 : isHovered ? stroke_width * 1.5 : stroke_width;\n const opacity = isSelected ? 0.8 : isHovered ? 0.7 : 0.5;\n const fill = render_mat?.toLowerCase().includes('glass') ? '#3accc1' : 'lightgray';\n\n // Get dimension rules for this CPNAME\n const dimensionRules = cpName ? getDimensionRules(cpName) : null;\n\n return (\n <g transform={`rotate(${rotate})`}>\n <path\n d={svgPath}\n stroke={strokeColor}\n strokeWidth={effectiveStrokeWidth}\n fill={fill}\n strokeLinejoin=\"bevel\" // ← FIX: Use bevel instead of miter\n strokeMiterlimit=\"1\" // ← OR: Limit miter to 1x stroke width\n opacity={opacity}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={{cursor: onClick ? 'pointer' : 'default'}}\n />\n <text transform={`scale(1,-1)`} x={0} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fontSize={10}>{text}</text>\n\n {/* Dimension lines based on configuration\n dim_y*1.05 allow the adding an offset to the height of the panel when the view is from the front\n */}\n {dimensionRules && (<DimensionLines width={dim_x} height={dim_y*1.05} rules={dimensionRules}/>)}\n\n </g>\n );\n}","import {ElemPartType, ElemTrimType} from \"../../types/Elem.types.tsx\";\nimport {DividerType} from \"../../types/divider.types.ts\";\nimport {type PartTypeSource} from \"../../construction_principle/dto/angl-type-config.ts\";\nimport type {DrawerType} from \"../../construction_principle/drawer/dto/drawer.types.ts\";\n\nexport function computeTrim(\n currCpSource: PartTypeSource,\n currCpType: ElemPartType | DividerType | DrawerType,\n currentCpTrim?: ElemTrimType,\n joinPartSourceType?: PartTypeSource,\n joinPartType?: ElemPartType | DividerType,\n joinPartThk: number = 0,\n backInset: number = 0, // only back inset\n): number {\n if (!joinPartType || !currentCpTrim) return 0;\n\n // const { thk, PARTTYPE, inset } = joinElem;\n const isShortTrim = currentCpTrim === ElemTrimType.short;\n const isLongTrim = currentCpTrim === ElemTrimType.long;\n\n if (currCpSource === 'elem') {\n if (currCpType === ElemPartType.Door) {\n return joinPartThk\n } else if (currCpType === ElemPartType.SidePanel) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return isShortTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isShortTrim ? joinPartThk + backInset : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.topShelf) return isShortTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.botShelf) return isShortTrim ? joinPartThk : 0;\n } else if (currCpType === ElemPartType.Back) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return !isLongTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isShortTrim ? joinPartThk + backInset : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.topShelf) return !isLongTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.botShelf) return !isLongTrim ? joinPartThk : 0;\n }\n } else if (currCpSource === 'divider') {\n if (currCpType === DividerType.topShelf || currCpType === DividerType.botShelf) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return !isShortTrim ? joinPartThk : 0\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isLongTrim ? joinPartThk + backInset : 0;\n }\n }\n return 0;\n}\n\n\n","// src/index.ts\nvar updateQueue = makeQueue();\nvar raf = (fn) => schedule(fn, updateQueue);\nvar writeQueue = makeQueue();\nraf.write = (fn) => schedule(fn, writeQueue);\nvar onStartQueue = makeQueue();\nraf.onStart = (fn) => schedule(fn, onStartQueue);\nvar onFrameQueue = makeQueue();\nraf.onFrame = (fn) => schedule(fn, onFrameQueue);\nvar onFinishQueue = makeQueue();\nraf.onFinish = (fn) => schedule(fn, onFinishQueue);\nvar timeouts = [];\nraf.setTimeout = (handler, ms) => {\n const time = raf.now() + ms;\n const cancel = () => {\n const i = timeouts.findIndex((t) => t.cancel == cancel);\n if (~i) timeouts.splice(i, 1);\n pendingCount -= ~i ? 1 : 0;\n };\n const timeout = { time, handler, cancel };\n timeouts.splice(findTimeout(time), 0, timeout);\n pendingCount += 1;\n start();\n return timeout;\n};\nvar findTimeout = (time) => ~(~timeouts.findIndex((t) => t.time > time) || ~timeouts.length);\nraf.cancel = (fn) => {\n onStartQueue.delete(fn);\n onFrameQueue.delete(fn);\n onFinishQueue.delete(fn);\n updateQueue.delete(fn);\n writeQueue.delete(fn);\n};\nraf.sync = (fn) => {\n sync = true;\n raf.batchedUpdates(fn);\n sync = false;\n};\nraf.throttle = (fn) => {\n let lastArgs;\n function queuedFn() {\n try {\n fn(...lastArgs);\n } finally {\n lastArgs = null;\n }\n }\n function throttled(...args) {\n lastArgs = args;\n raf.onStart(queuedFn);\n }\n throttled.handler = fn;\n throttled.cancel = () => {\n onStartQueue.delete(queuedFn);\n lastArgs = null;\n };\n return throttled;\n};\nvar nativeRaf = typeof window != \"undefined\" ? window.requestAnimationFrame : (\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {\n }\n);\nraf.use = (impl) => nativeRaf = impl;\nraf.now = typeof performance != \"undefined\" ? () => performance.now() : Date.now;\nraf.batchedUpdates = (fn) => fn();\nraf.catch = console.error;\nraf.frameLoop = \"always\";\nraf.advance = () => {\n if (raf.frameLoop !== \"demand\") {\n console.warn(\n \"Cannot call the manual advancement of rafz whilst frameLoop is not set as demand\"\n );\n } else {\n update();\n }\n};\nvar ts = -1;\nvar pendingCount = 0;\nvar sync = false;\nfunction schedule(fn, queue) {\n if (sync) {\n queue.delete(fn);\n fn(0);\n } else {\n queue.add(fn);\n start();\n }\n}\nfunction start() {\n if (ts < 0) {\n ts = 0;\n if (raf.frameLoop !== \"demand\") {\n nativeRaf(loop);\n }\n }\n}\nfunction stop() {\n ts = -1;\n}\nfunction loop() {\n if (~ts) {\n nativeRaf(loop);\n raf.batchedUpdates(update);\n }\n}\nfunction update() {\n const prevTs = ts;\n ts = raf.now();\n const count = findTimeout(ts);\n if (count) {\n eachSafely(timeouts.splice(0, count), (t) => t.handler());\n pendingCount -= count;\n }\n if (!pendingCount) {\n stop();\n return;\n }\n onStartQueue.flush();\n updateQueue.flush(prevTs ? Math.min(64, ts - prevTs) : 16.667);\n onFrameQueue.flush();\n writeQueue.flush();\n onFinishQueue.flush();\n}\nfunction makeQueue() {\n let next = /* @__PURE__ */ new Set();\n let current = next;\n return {\n add(fn) {\n pendingCount += current == next && !next.has(fn) ? 1 : 0;\n next.add(fn);\n },\n delete(fn) {\n pendingCount -= current == next && next.has(fn) ? 1 : 0;\n return next.delete(fn);\n },\n flush(arg) {\n if (current.size) {\n next = /* @__PURE__ */ new Set();\n pendingCount -= current.size;\n eachSafely(current, (fn) => fn(arg) && next.add(fn));\n pendingCount += next.size;\n current = next;\n }\n }\n };\n}\nfunction eachSafely(values, each) {\n values.forEach((value) => {\n try {\n each(value);\n } catch (e) {\n raf.catch(e);\n }\n });\n}\nvar __raf = {\n /** The number of pending tasks */\n count() {\n return pendingCount;\n },\n /** Whether there's a raf update loop running */\n isRunning() {\n return ts >= 0;\n },\n /** Clear internal state. Never call from update loop! */\n clear() {\n ts = -1;\n timeouts = [];\n onStartQueue = makeQueue();\n updateQueue = makeQueue();\n onFrameQueue = makeQueue();\n writeQueue = makeQueue();\n onFinishQueue = makeQueue();\n pendingCount = 0;\n }\n};\nexport {\n __raf,\n raf\n};\n","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/globals.ts\nvar globals_exports = {};\n__export(globals_exports, {\n assign: () => assign,\n colors: () => colors,\n createStringInterpolator: () => createStringInterpolator,\n skipAnimation: () => skipAnimation,\n to: () => to,\n willAdvance: () => willAdvance\n});\nimport { raf } from \"@react-spring/rafz\";\n\n// src/helpers.ts\nfunction noop() {\n}\nvar defineHidden = (obj, key, value) => Object.defineProperty(obj, key, { value, writable: true, configurable: true });\nvar is = {\n arr: Array.isArray,\n obj: (a) => !!a && a.constructor.name === \"Object\",\n fun: (a) => typeof a === \"function\",\n str: (a) => typeof a === \"string\",\n num: (a) => typeof a === \"number\",\n und: (a) => a === void 0\n};\nfunction isEqual(a, b) {\n if (is.arr(a)) {\n if (!is.arr(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n return a === b;\n}\nvar each = (obj, fn) => obj.forEach(fn);\nfunction eachProp(obj, fn, ctx) {\n if (is.arr(obj)) {\n for (let i = 0; i < obj.length; i++) {\n fn.call(ctx, obj[i], `${i}`);\n }\n return;\n }\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn.call(ctx, obj[key], key);\n }\n }\n}\nvar toArray = (a) => is.und(a) ? [] : is.arr(a) ? a : [a];\nfunction flush(queue, iterator) {\n if (queue.size) {\n const items = Array.from(queue);\n queue.clear();\n each(items, iterator);\n }\n}\nvar flushCalls = (queue, ...args) => flush(queue, (fn) => fn(...args));\nvar isSSR = () => typeof window === \"undefined\" || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\n\n// src/globals.ts\nvar createStringInterpolator;\nvar to;\nvar colors = null;\nvar skipAnimation = false;\nvar willAdvance = noop;\nvar assign = (globals) => {\n if (globals.to) to = globals.to;\n if (globals.now) raf.now = globals.now;\n if (globals.colors !== void 0) colors = globals.colors;\n if (globals.skipAnimation != null) skipAnimation = globals.skipAnimation;\n if (globals.createStringInterpolator)\n createStringInterpolator = globals.createStringInterpolator;\n if (globals.requestAnimationFrame) raf.use(globals.requestAnimationFrame);\n if (globals.batchedUpdates) raf.batchedUpdates = globals.batchedUpdates;\n if (globals.willAdvance) willAdvance = globals.willAdvance;\n if (globals.frameLoop) raf.frameLoop = globals.frameLoop;\n};\n\n// src/FrameLoop.ts\nimport { raf as raf2 } from \"@react-spring/rafz\";\nvar startQueue = /* @__PURE__ */ new Set();\nvar currentFrame = [];\nvar prevFrame = [];\nvar priority = 0;\nvar frameLoop = {\n get idle() {\n return !startQueue.size && !currentFrame.length;\n },\n /** Advance the given animation on every frame until idle. */\n start(animation) {\n if (priority > animation.priority) {\n startQueue.add(animation);\n raf2.onStart(flushStartQueue);\n } else {\n startSafely(animation);\n raf2(advance);\n }\n },\n /** Advance all animations by the given time. */\n advance,\n /** Call this when an animation's priority changes. */\n sort(animation) {\n if (priority) {\n raf2.onFrame(() => frameLoop.sort(animation));\n } else {\n const prevIndex = currentFrame.indexOf(animation);\n if (~prevIndex) {\n currentFrame.splice(prevIndex, 1);\n startUnsafely(animation);\n }\n }\n },\n /**\n * Clear all animations. For testing purposes.\n *\n * ☠️ Never call this from within the frameloop.\n */\n clear() {\n currentFrame = [];\n startQueue.clear();\n }\n};\nfunction flushStartQueue() {\n startQueue.forEach(startSafely);\n startQueue.clear();\n raf2(advance);\n}\nfunction startSafely(animation) {\n if (!currentFrame.includes(animation)) startUnsafely(animation);\n}\nfunction startUnsafely(animation) {\n currentFrame.splice(\n findIndex(currentFrame, (other) => other.priority > animation.priority),\n 0,\n animation\n );\n}\nfunction advance(dt) {\n const nextFrame = prevFrame;\n for (let i = 0; i < currentFrame.length; i++) {\n const animation = currentFrame[i];\n priority = animation.priority;\n if (!animation.idle) {\n willAdvance(animation);\n animation.advance(dt);\n if (!animation.idle) {\n nextFrame.push(animation);\n }\n }\n }\n priority = 0;\n prevFrame = currentFrame;\n prevFrame.length = 0;\n currentFrame = nextFrame;\n return currentFrame.length > 0;\n}\nfunction findIndex(arr, test) {\n const index = arr.findIndex(test);\n return index < 0 ? arr.length : index;\n}\n\n// src/clamp.ts\nvar clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\n// src/colors.ts\nvar colors2 = {\n transparent: 0,\n aliceblue: 4042850303,\n antiquewhite: 4209760255,\n aqua: 16777215,\n aquamarine: 2147472639,\n azure: 4043309055,\n beige: 4126530815,\n bisque: 4293182719,\n black: 255,\n blanchedalmond: 4293643775,\n blue: 65535,\n blueviolet: 2318131967,\n brown: 2771004159,\n burlywood: 3736635391,\n burntsienna: 3934150143,\n cadetblue: 1604231423,\n chartreuse: 2147418367,\n chocolate: 3530104575,\n coral: 4286533887,\n cornflowerblue: 1687547391,\n cornsilk: 4294499583,\n crimson: 3692313855,\n cyan: 16777215,\n darkblue: 35839,\n darkcyan: 9145343,\n darkgoldenrod: 3095792639,\n darkgray: 2846468607,\n darkgreen: 6553855,\n darkgrey: 2846468607,\n darkkhaki: 3182914559,\n darkmagenta: 2332068863,\n darkolivegreen: 1433087999,\n darkorange: 4287365375,\n darkorchid: 2570243327,\n darkred: 2332033279,\n darksalmon: 3918953215,\n darkseagreen: 2411499519,\n darkslateblue: 1211993087,\n darkslategray: 793726975,\n darkslategrey: 793726975,\n darkturquoise: 13554175,\n darkviolet: 2483082239,\n deeppink: 4279538687,\n deepskyblue: 12582911,\n dimgray: 1768516095,\n dimgrey: 1768516095,\n dodgerblue: 512819199,\n firebrick: 2988581631,\n floralwhite: 4294635775,\n forestgreen: 579543807,\n fuchsia: 4278255615,\n gainsboro: 3705462015,\n ghostwhite: 4177068031,\n gold: 4292280575,\n goldenrod: 3668254975,\n gray: 2155905279,\n green: 8388863,\n greenyellow: 2919182335,\n grey: 2155905279,\n honeydew: 4043305215,\n hotpink: 4285117695,\n indianred: 3445382399,\n indigo: 1258324735,\n ivory: 4294963455,\n khaki: 4041641215,\n lavender: 3873897215,\n lavenderblush: 4293981695,\n lawngreen: 2096890111,\n lemonchiffon: 4294626815,\n lightblue: 2916673279,\n lightcoral: 4034953471,\n lightcyan: 3774873599,\n lightgoldenrodyellow: 4210742015,\n lightgray: 3553874943,\n lightgreen: 2431553791,\n lightgrey: 3553874943,\n lightpink: 4290167295,\n lightsalmon: 4288707327,\n lightseagreen: 548580095,\n lightskyblue: 2278488831,\n lightslategray: 2005441023,\n lightslategrey: 2005441023,\n lightsteelblue: 2965692159,\n lightyellow: 4294959359,\n lime: 16711935,\n limegreen: 852308735,\n linen: 4210091775,\n magenta: 4278255615,\n maroon: 2147483903,\n mediumaquamarine: 1724754687,\n mediumblue: 52735,\n mediumorchid: 3126187007,\n mediumpurple: 2473647103,\n mediumseagreen: 1018393087,\n mediumslateblue: 2070474495,\n mediumspringgreen: 16423679,\n mediumturquoise: 1221709055,\n mediumvioletred: 3340076543,\n midnightblue: 421097727,\n mintcream: 4127193855,\n mistyrose: 4293190143,\n moccasin: 4293178879,\n navajowhite: 4292783615,\n navy: 33023,\n oldlace: 4260751103,\n olive: 2155872511,\n olivedrab: 1804477439,\n orange: 4289003775,\n orangered: 4282712319,\n orchid: 3664828159,\n palegoldenrod: 4008225535,\n palegreen: 2566625535,\n paleturquoise: 2951671551,\n palevioletred: 3681588223,\n papayawhip: 4293907967,\n peachpuff: 4292524543,\n peru: 3448061951,\n pink: 4290825215,\n plum: 3718307327,\n powderblue: 2967529215,\n purple: 2147516671,\n rebeccapurple: 1714657791,\n red: 4278190335,\n rosybrown: 3163525119,\n royalblue: 1097458175,\n saddlebrown: 2336560127,\n salmon: 4202722047,\n sandybrown: 4104413439,\n seagreen: 780883967,\n seashell: 4294307583,\n sienna: 2689740287,\n silver: 3233857791,\n skyblue: 2278484991,\n slateblue: 1784335871,\n slategray: 1887473919,\n slategrey: 1887473919,\n snow: 4294638335,\n springgreen: 16744447,\n steelblue: 1182971135,\n tan: 3535047935,\n teal: 8421631,\n thistle: 3636451583,\n tomato: 4284696575,\n turquoise: 1088475391,\n violet: 4001558271,\n wheat: 4125012991,\n white: 4294967295,\n whitesmoke: 4126537215,\n yellow: 4294902015,\n yellowgreen: 2597139199\n};\n\n// src/colorMatchers.ts\nvar NUMBER = \"[-+]?\\\\d*\\\\.?\\\\d+\";\nvar PERCENTAGE = NUMBER + \"%\";\nfunction call(...parts) {\n return \"\\\\(\\\\s*(\" + parts.join(\")\\\\s*,\\\\s*(\") + \")\\\\s*\\\\)\";\n}\nvar rgb = new RegExp(\"rgb\" + call(NUMBER, NUMBER, NUMBER));\nvar rgba = new RegExp(\"rgba\" + call(NUMBER, NUMBER, NUMBER, NUMBER));\nvar hsl = new RegExp(\"hsl\" + call(NUMBER, PERCENTAGE, PERCENTAGE));\nvar hsla = new RegExp(\n \"hsla\" + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER)\n);\nvar hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nvar hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nvar hex6 = /^#([0-9a-fA-F]{6})$/;\nvar hex8 = /^#([0-9a-fA-F]{8})$/;\n\n// src/normalizeColor.ts\nfunction normalizeColor(color) {\n let match;\n if (typeof color === \"number\") {\n return color >>> 0 === color && color >= 0 && color <= 4294967295 ? color : null;\n }\n if (match = hex6.exec(color))\n return parseInt(match[1] + \"ff\", 16) >>> 0;\n if (colors && colors[color] !== void 0) {\n return colors[color];\n }\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n 255) >>> // a\n 0;\n }\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n parse1(match[4])) >>> // a\n 0;\n }\n if (match = hex3.exec(color)) {\n return parseInt(\n match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n \"ff\",\n // a\n 16\n ) >>> 0;\n }\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n if (match = hex4.exec(color)) {\n return parseInt(\n match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n match[4] + match[4],\n // a\n 16\n ) >>> 0;\n }\n if (match = hsl.exec(color)) {\n return (hslToRgb(\n parse360(match[1]),\n // h\n parsePercentage(match[2]),\n // s\n parsePercentage(match[3])\n // l\n ) | 255) >>> // a\n 0;\n }\n if (match = hsla.exec(color)) {\n return (hslToRgb(\n parse360(match[1]),\n // h\n parsePercentage(match[2]),\n // s\n parsePercentage(match[3])\n // l\n ) | parse1(match[4])) >>> // a\n 0;\n }\n return null;\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\nfunction parsePercentage(str) {\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\n// src/colorToRgba.ts\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n const r = (int32Color & 4278190080) >>> 24;\n const g = (int32Color & 16711680) >>> 16;\n const b = (int32Color & 65280) >>> 8;\n const a = (int32Color & 255) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\n// src/createInterpolator.ts\nvar createInterpolator = (range, output, extrapolate) => {\n if (is.fun(range)) {\n return range;\n }\n if (is.arr(range)) {\n return createInterpolator({\n range,\n output,\n extrapolate\n });\n }\n if (is.str(range.output[0])) {\n return createStringInterpolator(range);\n }\n const config = range;\n const outputRange = config.output;\n const inputRange = config.range || [0, 1];\n const extrapolateLeft = config.extrapolateLeft || config.extrapolate || \"extend\";\n const extrapolateRight = config.extrapolateRight || config.extrapolate || \"extend\";\n const easing = config.easing || ((t) => t);\n return (input) => {\n const range2 = findRange(input, inputRange);\n return interpolate(\n input,\n inputRange[range2],\n inputRange[range2 + 1],\n outputRange[range2],\n outputRange[range2 + 1],\n easing,\n extrapolateLeft,\n extrapolateRight,\n config.map\n );\n };\n};\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input;\n if (result < inputMin) {\n if (extrapolateLeft === \"identity\") return result;\n else if (extrapolateLeft === \"clamp\") result = inputMin;\n }\n if (result > inputMax) {\n if (extrapolateRight === \"identity\") return result;\n else if (extrapolateRight === \"clamp\") result = inputMax;\n }\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax;\n if (inputMin === -Infinity) result = -result;\n else if (inputMax === Infinity) result = result - inputMin;\n else result = (result - inputMin) / (inputMax - inputMin);\n result = easing(result);\n if (outputMin === -Infinity) result = -result;\n else if (outputMax === Infinity) result = result + outputMin;\n else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i)\n if (inputRange[i] >= input) break;\n return i - 1;\n}\n\n// src/easings.ts\nvar steps = (steps2, direction = \"end\") => (progress2) => {\n progress2 = direction === \"end\" ? Math.min(progress2, 0.999) : Math.max(progress2, 1e-3);\n const expanded = progress2 * steps2;\n const rounded = direction === \"end\" ? Math.floor(expanded) : Math.ceil(expanded);\n return clamp(0, 1, rounded / steps2);\n};\nvar c1 = 1.70158;\nvar c2 = c1 * 1.525;\nvar c3 = c1 + 1;\nvar c4 = 2 * Math.PI / 3;\nvar c5 = 2 * Math.PI / 4.5;\nvar bounceOut = (x) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n};\nvar easings = {\n linear: (x) => x,\n easeInQuad: (x) => x * x,\n easeOutQuad: (x) => 1 - (1 - x) * (1 - x),\n easeInOutQuad: (x) => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n easeInCubic: (x) => x * x * x,\n easeOutCubic: (x) => 1 - Math.pow(1 - x, 3),\n easeInOutCubic: (x) => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,\n easeInQuart: (x) => x * x * x * x,\n easeOutQuart: (x) => 1 - Math.pow(1 - x, 4),\n easeInOutQuart: (x) => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,\n easeInQuint: (x) => x * x * x * x * x,\n easeOutQuint: (x) => 1 - Math.pow(1 - x, 5),\n easeInOutQuint: (x) => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,\n easeInSine: (x) => 1 - Math.cos(x * Math.PI / 2),\n easeOutSine: (x) => Math.sin(x * Math.PI / 2),\n easeInOutSine: (x) => -(Math.cos(Math.PI * x) - 1) / 2,\n easeInExpo: (x) => x === 0 ? 0 : Math.pow(2, 10 * x - 10),\n easeOutExpo: (x) => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),\n easeInOutExpo: (x) => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2,\n easeInCirc: (x) => 1 - Math.sqrt(1 - Math.pow(x, 2)),\n easeOutCirc: (x) => Math.sqrt(1 - Math.pow(x - 1, 2)),\n easeInOutCirc: (x) => x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2,\n easeInBack: (x) => c3 * x * x * x - c1 * x * x,\n easeOutBack: (x) => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),\n easeInOutBack: (x) => x < 0.5 ? Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,\n easeInElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4),\n easeOutElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1,\n easeInOutElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5) / 2 + 1,\n easeInBounce: (x) => 1 - bounceOut(1 - x),\n easeOutBounce: bounceOut,\n easeInOutBounce: (x) => x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2,\n steps\n};\n\n// src/fluids.ts\nvar $get = Symbol.for(\"FluidValue.get\");\nvar $observers = Symbol.for(\"FluidValue.observers\");\nvar hasFluidValue = (arg) => Boolean(arg && arg[$get]);\nvar getFluidValue = (arg) => arg && arg[$get] ? arg[$get]() : arg;\nvar getFluidObservers = (target) => target[$observers] || null;\nfunction callFluidObserver(observer2, event) {\n if (observer2.eventObserved) {\n observer2.eventObserved(event);\n } else {\n observer2(event);\n }\n}\nfunction callFluidObservers(target, event) {\n const observers = target[$observers];\n if (observers) {\n observers.forEach((observer2) => {\n callFluidObserver(observer2, event);\n });\n }\n}\n$get, $observers;\nvar FluidValue = class {\n constructor(get) {\n if (!get && !(get = this.get)) {\n throw Error(\"Unknown getter\");\n }\n setFluidGetter(this, get);\n }\n};\nvar setFluidGetter = (target, get) => setHidden(target, $get, get);\nfunction addFluidObserver(target, observer2) {\n if (target[$get]) {\n let observers = target[$observers];\n if (!observers) {\n setHidden(target, $observers, observers = /* @__PURE__ */ new Set());\n }\n if (!observers.has(observer2)) {\n observers.add(observer2);\n if (target.observerAdded) {\n target.observerAdded(observers.size, observer2);\n }\n }\n }\n return observer2;\n}\nfunction removeFluidObserver(target, observer2) {\n const observers = target[$observers];\n if (observers && observers.has(observer2)) {\n const count = observers.size - 1;\n if (count) {\n observers.delete(observer2);\n } else {\n target[$observers] = null;\n }\n if (target.observerRemoved) {\n target.observerRemoved(count, observer2);\n }\n }\n}\nvar setHidden = (target, key, value) => Object.defineProperty(target, key, {\n value,\n writable: true,\n configurable: true\n});\n\n// src/regexs.ts\nvar numberRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nvar colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi;\nvar unitRegex = new RegExp(`(${numberRegex.source})(%|[a-z]+)`, \"i\");\nvar rgbaRegex = /rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi;\nvar cssVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\n\n// src/variableToRgba.ts\nvar variableToRgba = (input) => {\n const [token, fallback] = parseCSSVariable(input);\n if (!token || isSSR()) {\n return input;\n }\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(token);\n if (value) {\n return value.trim();\n } else if (fallback && fallback.startsWith(\"--\")) {\n const value2 = window.getComputedStyle(document.documentElement).getPropertyValue(fallback);\n if (value2) {\n return value2;\n } else {\n return input;\n }\n } else if (fallback && cssVariableRegex.test(fallback)) {\n return variableToRgba(fallback);\n } else if (fallback) {\n return fallback;\n }\n return input;\n};\nvar parseCSSVariable = (current) => {\n const match = cssVariableRegex.exec(current);\n if (!match) return [,];\n const [, token, fallback] = match;\n return [token, fallback];\n};\n\n// src/stringInterpolation.ts\nvar namedColorRegex;\nvar rgbaRound = (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`;\nvar createStringInterpolator2 = (config) => {\n if (!namedColorRegex)\n namedColorRegex = colors ? (\n // match color names, ignore partial matches\n new RegExp(`(${Object.keys(colors).join(\"|\")})(?!\\\\w)`, \"g\")\n ) : (\n // never match\n /^\\b$/\n );\n const output = config.output.map((value) => {\n return getFluidValue(value).replace(cssVariableRegex, variableToRgba).replace(colorRegex, colorToRgba).replace(namedColorRegex, colorToRgba);\n });\n const keyframes = output.map((value) => value.match(numberRegex).map(Number));\n const outputRanges = keyframes[0].map(\n (_, i) => keyframes.map((values) => {\n if (!(i in values)) {\n throw Error('The arity of each \"output\" value must be equal');\n }\n return values[i];\n })\n );\n const interpolators = outputRanges.map(\n (output2) => createInterpolator({ ...config, output: output2 })\n );\n return (input) => {\n const missingUnit = !unitRegex.test(output[0]) && output.find((value) => unitRegex.test(value))?.replace(numberRegex, \"\");\n let i = 0;\n return output[0].replace(\n numberRegex,\n () => `${interpolators[i++](input)}${missingUnit || \"\"}`\n ).replace(rgbaRegex, rgbaRound);\n };\n};\n\n// src/deprecations.ts\nvar prefix = \"react-spring: \";\nvar once = (fn) => {\n const func = fn;\n let called = false;\n if (typeof func != \"function\") {\n throw new TypeError(`${prefix}once requires a function parameter`);\n }\n return (...args) => {\n if (!called) {\n func(...args);\n called = true;\n }\n };\n};\nvar warnInterpolate = once(console.warn);\nfunction deprecateInterpolate() {\n warnInterpolate(\n `${prefix}The \"interpolate\" function is deprecated in v9 (use \"to\" instead)`\n );\n}\nvar warnDirectCall = once(console.warn);\nfunction deprecateDirectCall() {\n warnDirectCall(\n `${prefix}Directly calling start instead of using the api object is deprecated in v9 (use \".start\" instead), this will be removed in later 0.X.0 versions`\n );\n}\n\n// src/isAnimatedString.ts\nfunction isAnimatedString(value) {\n return is.str(value) && (value[0] == \"#\" || /\\d/.test(value) || // Do not identify a CSS variable as an AnimatedString if its SSR\n !isSSR() && cssVariableRegex.test(value) || value in (colors || {}));\n}\n\n// src/dom-events/scroll/index.ts\nimport { raf as raf3 } from \"@react-spring/rafz\";\n\n// src/dom-events/resize/resizeElement.ts\nvar observer;\nvar resizeHandlers = /* @__PURE__ */ new WeakMap();\nvar handleObservation = (entries) => entries.forEach(({ target, contentRect }) => {\n return resizeHandlers.get(target)?.forEach((handler) => handler(contentRect));\n});\nfunction resizeElement(handler, target) {\n if (!observer) {\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(handleObservation);\n }\n }\n let elementHandlers = resizeHandlers.get(target);\n if (!elementHandlers) {\n elementHandlers = /* @__PURE__ */ new Set();\n resizeHandlers.set(target, elementHandlers);\n }\n elementHandlers.add(handler);\n if (observer) {\n observer.observe(target);\n }\n return () => {\n const elementHandlers2 = resizeHandlers.get(target);\n if (!elementHandlers2) return;\n elementHandlers2.delete(handler);\n if (!elementHandlers2.size && observer) {\n observer.unobserve(target);\n }\n };\n}\n\n// src/dom-events/resize/resizeWindow.ts\nvar listeners = /* @__PURE__ */ new Set();\nvar cleanupWindowResizeHandler;\nvar createResizeHandler = () => {\n const handleResize = () => {\n listeners.forEach(\n (callback) => callback({\n width: window.innerWidth,\n height: window.innerHeight\n })\n );\n };\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n};\nvar resizeWindow = (callback) => {\n listeners.add(callback);\n if (!cleanupWindowResizeHandler) {\n cleanupWindowResizeHandler = createResizeHandler();\n }\n return () => {\n listeners.delete(callback);\n if (!listeners.size && cleanupWindowResizeHandler) {\n cleanupWindowResizeHandler();\n cleanupWindowResizeHandler = void 0;\n }\n };\n};\n\n// src/dom-events/resize/index.ts\nvar onResize = (callback, { container = document.documentElement } = {}) => {\n if (container === document.documentElement) {\n return resizeWindow(callback);\n } else {\n return resizeElement(callback, container);\n }\n};\n\n// src/progress.ts\nvar progress = (min, max, value) => max - min === 0 ? 1 : (value - min) / (max - min);\n\n// src/dom-events/scroll/ScrollHandler.ts\nvar SCROLL_KEYS = {\n x: {\n length: \"Width\",\n position: \"Left\"\n },\n y: {\n length: \"Height\",\n position: \"Top\"\n }\n};\nvar ScrollHandler = class {\n constructor(callback, container) {\n this.createAxis = () => ({\n current: 0,\n progress: 0,\n scrollLength: 0\n });\n this.updateAxis = (axisName) => {\n const axis = this.info[axisName];\n const { length, position } = SCROLL_KEYS[axisName];\n axis.current = this.container[`scroll${position}`];\n axis.scrollLength = this.container[`scroll${length}`] - this.container[`client${length}`];\n axis.progress = progress(0, axis.scrollLength, axis.current);\n };\n this.update = () => {\n this.updateAxis(\"x\");\n this.updateAxis(\"y\");\n };\n this.sendEvent = () => {\n this.callback(this.info);\n };\n this.advance = () => {\n this.update();\n this.sendEvent();\n };\n this.callback = callback;\n this.container = container;\n this.info = {\n time: 0,\n x: this.createAxis(),\n y: this.createAxis()\n };\n }\n};\n\n// src/dom-events/scroll/index.ts\nvar scrollListeners = /* @__PURE__ */ new WeakMap();\nvar resizeListeners = /* @__PURE__ */ new WeakMap();\nvar onScrollHandlers = /* @__PURE__ */ new WeakMap();\nvar getTarget = (container) => container === document.documentElement ? window : container;\nvar onScroll = (callback, { container = document.documentElement } = {}) => {\n let containerHandlers = onScrollHandlers.get(container);\n if (!containerHandlers) {\n containerHandlers = /* @__PURE__ */ new Set();\n onScrollHandlers.set(container, containerHandlers);\n }\n const containerHandler = new ScrollHandler(callback, container);\n containerHandlers.add(containerHandler);\n if (!scrollListeners.has(container)) {\n const listener = () => {\n containerHandlers?.forEach((handler) => handler.advance());\n return true;\n };\n scrollListeners.set(container, listener);\n const target = getTarget(container);\n window.addEventListener(\"resize\", listener, { passive: true });\n if (container !== document.documentElement) {\n resizeListeners.set(container, onResize(listener, { container }));\n }\n target.addEventListener(\"scroll\", listener, { passive: true });\n }\n const animateScroll = scrollListeners.get(container);\n raf3(animateScroll);\n return () => {\n raf3.cancel(animateScroll);\n const containerHandlers2 = onScrollHandlers.get(container);\n if (!containerHandlers2) return;\n containerHandlers2.delete(containerHandler);\n if (containerHandlers2.size) return;\n const listener = scrollListeners.get(container);\n scrollListeners.delete(container);\n if (listener) {\n getTarget(container).removeEventListener(\"scroll\", listener);\n window.removeEventListener(\"resize\", listener);\n resizeListeners.get(container)?.();\n }\n };\n};\n\n// src/hooks/useConstant.ts\nimport { useRef } from \"react\";\nfunction useConstant(init) {\n const ref = useRef(null);\n if (ref.current === null) {\n ref.current = init();\n }\n return ref.current;\n}\n\n// src/hooks/useForceUpdate.ts\nimport { useState } from \"react\";\n\n// src/hooks/useIsMounted.ts\nimport { useRef as useRef2 } from \"react\";\n\n// src/hooks/useIsomorphicLayoutEffect.ts\nimport { useEffect, useLayoutEffect } from \"react\";\nvar useIsomorphicLayoutEffect = isSSR() ? useEffect : useLayoutEffect;\n\n// src/hooks/useIsMounted.ts\nvar useIsMounted = () => {\n const isMounted = useRef2(false);\n useIsomorphicLayoutEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return isMounted;\n};\n\n// src/hooks/useForceUpdate.ts\nfunction useForceUpdate() {\n const update = useState()[1];\n const isMounted = useIsMounted();\n return () => {\n if (isMounted.current) {\n update(Math.random());\n }\n };\n}\n\n// src/hooks/useMemoOne.ts\nimport { useEffect as useEffect2, useRef as useRef3, useState as useState2 } from \"react\";\nfunction useMemoOne(getResult, inputs) {\n const [initial] = useState2(\n () => ({\n inputs,\n result: getResult()\n })\n );\n const committed = useRef3(void 0);\n const prevCache = committed.current;\n let cache = prevCache;\n if (cache) {\n const useCache = Boolean(\n inputs && cache.inputs && areInputsEqual(inputs, cache.inputs)\n );\n if (!useCache) {\n cache = {\n inputs,\n result: getResult()\n };\n }\n } else {\n cache = initial;\n }\n useEffect2(() => {\n committed.current = cache;\n if (prevCache == initial) {\n initial.inputs = initial.result = void 0;\n }\n }, [cache]);\n return cache.result;\n}\nfunction areInputsEqual(next, prev) {\n if (next.length !== prev.length) {\n return false;\n }\n for (let i = 0; i < next.length; i++) {\n if (next[i] !== prev[i]) {\n return false;\n }\n }\n return true;\n}\n\n// src/hooks/useOnce.ts\nimport { useEffect as useEffect3 } from \"react\";\nvar useOnce = (effect) => useEffect3(effect, emptyDeps);\nvar emptyDeps = [];\n\n// src/hooks/usePrev.ts\nimport { useEffect as useEffect4, useRef as useRef4 } from \"react\";\nfunction usePrev(value) {\n const prevRef = useRef4(void 0);\n useEffect4(() => {\n prevRef.current = value;\n });\n return prevRef.current;\n}\n\n// src/hooks/useReducedMotion.ts\nimport { useState as useState3 } from \"react\";\nvar useReducedMotion = () => {\n const [reducedMotion, setReducedMotion] = useState3(null);\n useIsomorphicLayoutEffect(() => {\n const mql = window.matchMedia(\"(prefers-reduced-motion)\");\n const handleMediaChange = (e) => {\n setReducedMotion(e.matches);\n assign({\n skipAnimation: e.matches\n });\n };\n handleMediaChange(mql);\n if (mql.addEventListener) {\n mql.addEventListener(\"change\", handleMediaChange);\n } else {\n mql.addListener(handleMediaChange);\n }\n return () => {\n if (mql.removeEventListener) {\n mql.removeEventListener(\"change\", handleMediaChange);\n } else {\n mql.removeListener(handleMediaChange);\n }\n };\n }, []);\n return reducedMotion;\n};\n\n// src/index.ts\nimport { raf as raf4 } from \"@react-spring/rafz\";\nexport {\n FluidValue,\n globals_exports as Globals,\n addFluidObserver,\n callFluidObserver,\n callFluidObservers,\n clamp,\n colorToRgba,\n colors2 as colors,\n createInterpolator,\n createStringInterpolator2 as createStringInterpolator,\n defineHidden,\n deprecateDirectCall,\n deprecateInterpolate,\n each,\n eachProp,\n easings,\n flush,\n flushCalls,\n frameLoop,\n getFluidObservers,\n getFluidValue,\n hasFluidValue,\n hex3,\n hex4,\n hex6,\n hex8,\n hsl,\n hsla,\n is,\n isAnimatedString,\n isEqual,\n isSSR,\n noop,\n onResize,\n onScroll,\n once,\n prefix,\n raf4 as raf,\n removeFluidObserver,\n rgb,\n rgba,\n setFluidGetter,\n toArray,\n useConstant,\n useForceUpdate,\n useIsomorphicLayoutEffect,\n useMemoOne,\n useOnce,\n usePrev,\n useReducedMotion\n};\n","// src/Animated.ts\nimport { defineHidden } from \"@react-spring/shared\";\nvar $node = Symbol.for(\"Animated:node\");\nvar isAnimated = (value) => !!value && value[$node] === value;\nvar getAnimated = (owner) => owner && owner[$node];\nvar setAnimated = (owner, node) => defineHidden(owner, $node, node);\nvar getPayload = (owner) => owner && owner[$node] && owner[$node].getPayload();\nvar Animated = class {\n constructor() {\n setAnimated(this, this);\n }\n /** Get every `AnimatedValue` used by this node. */\n getPayload() {\n return this.payload || [];\n }\n};\n\n// src/AnimatedValue.ts\nimport { is } from \"@react-spring/shared\";\nvar AnimatedValue = class _AnimatedValue extends Animated {\n constructor(_value) {\n super();\n this._value = _value;\n this.done = true;\n this.durationProgress = 0;\n if (is.num(this._value)) {\n this.lastPosition = this._value;\n }\n }\n /** @internal */\n static create(value) {\n return new _AnimatedValue(value);\n }\n getPayload() {\n return [this];\n }\n getValue() {\n return this._value;\n }\n setValue(value, step) {\n if (is.num(value)) {\n this.lastPosition = value;\n if (step) {\n value = Math.round(value / step) * step;\n if (this.done) {\n this.lastPosition = value;\n }\n }\n }\n if (this._value === value) {\n return false;\n }\n this._value = value;\n return true;\n }\n reset() {\n const { done } = this;\n this.done = false;\n if (is.num(this._value)) {\n this.elapsedTime = 0;\n this.durationProgress = 0;\n this.lastPosition = this._value;\n if (done) this.lastVelocity = null;\n this.v0 = null;\n }\n }\n};\n\n// src/AnimatedString.ts\nimport { is as is2, createInterpolator } from \"@react-spring/shared\";\nvar AnimatedString = class _AnimatedString extends AnimatedValue {\n constructor(value) {\n super(0);\n this._string = null;\n this._toString = createInterpolator({\n output: [value, value]\n });\n }\n /** @internal */\n static create(value) {\n return new _AnimatedString(value);\n }\n getValue() {\n const value = this._string;\n return value == null ? this._string = this._toString(this._value) : value;\n }\n setValue(value) {\n if (is2.str(value)) {\n if (value == this._string) {\n return false;\n }\n this._string = value;\n this._value = 1;\n } else if (super.setValue(value)) {\n this._string = null;\n } else {\n return false;\n }\n return true;\n }\n reset(goal) {\n if (goal) {\n this._toString = createInterpolator({\n output: [this.getValue(), goal]\n });\n }\n this._value = 0;\n super.reset();\n }\n};\n\n// src/AnimatedArray.ts\nimport { isAnimatedString } from \"@react-spring/shared\";\n\n// src/AnimatedObject.ts\nimport {\n each,\n eachProp,\n getFluidValue,\n hasFluidValue\n} from \"@react-spring/shared\";\n\n// src/context.ts\nvar TreeContext = { dependencies: null };\n\n// src/AnimatedObject.ts\nvar AnimatedObject = class extends Animated {\n constructor(source) {\n super();\n this.source = source;\n this.setValue(source);\n }\n getValue(animated) {\n const values = {};\n eachProp(this.source, (source, key) => {\n if (isAnimated(source)) {\n values[key] = source.getValue(animated);\n } else if (hasFluidValue(source)) {\n values[key] = getFluidValue(source);\n } else if (!animated) {\n values[key] = source;\n }\n });\n return values;\n }\n /** Replace the raw object data */\n setValue(source) {\n this.source = source;\n this.payload = this._makePayload(source);\n }\n reset() {\n if (this.payload) {\n each(this.payload, (node) => node.reset());\n }\n }\n /** Create a payload set. */\n _makePayload(source) {\n if (source) {\n const payload = /* @__PURE__ */ new Set();\n eachProp(source, this._addToPayload, payload);\n return Array.from(payload);\n }\n }\n /** Add to a payload set. */\n _addToPayload(source) {\n if (TreeContext.dependencies && hasFluidValue(source)) {\n TreeContext.dependencies.add(source);\n }\n const payload = getPayload(source);\n if (payload) {\n each(payload, (node) => this.add(node));\n }\n }\n};\n\n// src/AnimatedArray.ts\nvar AnimatedArray = class _AnimatedArray extends AnimatedObject {\n constructor(source) {\n super(source);\n }\n /** @internal */\n static create(source) {\n return new _AnimatedArray(source);\n }\n getValue() {\n return this.source.map((node) => node.getValue());\n }\n setValue(source) {\n const payload = this.getPayload();\n if (source.length == payload.length) {\n return payload.map((node, i) => node.setValue(source[i])).some(Boolean);\n }\n super.setValue(source.map(makeAnimated));\n return true;\n }\n};\nfunction makeAnimated(value) {\n const nodeType = isAnimatedString(value) ? AnimatedString : AnimatedValue;\n return nodeType.create(value);\n}\n\n// src/getAnimatedType.ts\nimport { is as is3, isAnimatedString as isAnimatedString2 } from \"@react-spring/shared\";\nfunction getAnimatedType(value) {\n const parentNode = getAnimated(value);\n return parentNode ? parentNode.constructor : is3.arr(value) ? AnimatedArray : isAnimatedString2(value) ? AnimatedString : AnimatedValue;\n}\n\n// src/createHost.ts\nimport { is as is5, eachProp as eachProp2 } from \"@react-spring/shared\";\n\n// src/withAnimated.tsx\nimport * as React from \"react\";\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport {\n is as is4,\n each as each2,\n raf,\n useForceUpdate,\n useOnce,\n addFluidObserver,\n removeFluidObserver,\n useIsomorphicLayoutEffect\n} from \"@react-spring/shared\";\nvar withAnimated = (Component, host) => {\n const hasInstance = (\n // Function components must use \"forwardRef\" to avoid being\n // re-rendered on every animation frame.\n !is4.fun(Component) || Component.prototype && Component.prototype.isReactComponent\n );\n return forwardRef((givenProps, givenRef) => {\n const instanceRef = useRef(null);\n const ref = hasInstance && // eslint-disable-next-line react-hooks/rules-of-hooks\n useCallback(\n (value) => {\n instanceRef.current = updateRef(givenRef, value);\n },\n [givenRef]\n );\n const [props, deps] = getAnimatedState(givenProps, host);\n const forceUpdate = useForceUpdate();\n const callback = () => {\n const instance = instanceRef.current;\n if (hasInstance && !instance) {\n return;\n }\n const didUpdate = instance ? host.applyAnimatedValues(instance, props.getValue(true)) : false;\n if (didUpdate === false) {\n forceUpdate();\n }\n };\n const observer = new PropsObserver(callback, deps);\n const observerRef = useRef(void 0);\n useIsomorphicLayoutEffect(() => {\n observerRef.current = observer;\n each2(deps, (dep) => addFluidObserver(dep, observer));\n return () => {\n if (observerRef.current) {\n each2(\n observerRef.current.deps,\n (dep) => removeFluidObserver(dep, observerRef.current)\n );\n raf.cancel(observerRef.current.update);\n }\n };\n });\n useEffect(callback, []);\n useOnce(() => () => {\n const observer2 = observerRef.current;\n each2(observer2.deps, (dep) => removeFluidObserver(dep, observer2));\n });\n const usedProps = host.getComponentProps(props.getValue());\n return /* @__PURE__ */ React.createElement(Component, { ...usedProps, ref });\n });\n};\nvar PropsObserver = class {\n constructor(update, deps) {\n this.update = update;\n this.deps = deps;\n }\n eventObserved(event) {\n if (event.type == \"change\") {\n raf.write(this.update);\n }\n }\n};\nfunction getAnimatedState(props, host) {\n const dependencies = /* @__PURE__ */ new Set();\n TreeContext.dependencies = dependencies;\n if (props.style)\n props = {\n ...props,\n style: host.createAnimatedStyle(props.style)\n };\n props = new AnimatedObject(props);\n TreeContext.dependencies = null;\n return [props, dependencies];\n}\nfunction updateRef(ref, value) {\n if (ref) {\n if (is4.fun(ref)) ref(value);\n else ref.current = value;\n }\n return value;\n}\n\n// src/createHost.ts\nvar cacheKey = Symbol.for(\"AnimatedComponent\");\nvar createHost = (components, {\n applyAnimatedValues = () => false,\n createAnimatedStyle = (style) => new AnimatedObject(style),\n getComponentProps = (props) => props\n} = {}) => {\n const hostConfig = {\n applyAnimatedValues,\n createAnimatedStyle,\n getComponentProps\n };\n const animated = (Component) => {\n const displayName = getDisplayName(Component) || \"Anonymous\";\n if (is5.str(Component)) {\n Component = animated[Component] || (animated[Component] = withAnimated(Component, hostConfig));\n } else {\n Component = Component[cacheKey] || (Component[cacheKey] = withAnimated(Component, hostConfig));\n }\n Component.displayName = `Animated(${displayName})`;\n return Component;\n };\n eachProp2(components, (Component, key) => {\n if (is5.arr(components)) {\n key = getDisplayName(Component);\n }\n animated[key] = animated(Component);\n });\n return {\n animated\n };\n};\nvar getDisplayName = (arg) => is5.str(arg) ? arg : arg && is5.str(arg.displayName) ? arg.displayName : is5.fun(arg) && arg.name || null;\nexport {\n Animated,\n AnimatedArray,\n AnimatedObject,\n AnimatedString,\n AnimatedValue,\n createHost,\n getAnimated,\n getAnimatedType,\n getPayload,\n isAnimated,\n setAnimated\n};\n","// src/hooks/useChain.ts\nimport { each, useIsomorphicLayoutEffect } from \"@react-spring/shared\";\n\n// src/helpers.ts\nimport {\n is,\n toArray,\n eachProp,\n getFluidValue,\n isAnimatedString,\n Globals as G\n} from \"@react-spring/shared\";\nfunction callProp(value, ...args) {\n return is.fun(value) ? value(...args) : value;\n}\nvar matchProp = (value, key) => value === true || !!(key && value && (is.fun(value) ? value(key) : toArray(value).includes(key)));\nvar resolveProp = (prop, key) => is.obj(prop) ? key && prop[key] : prop;\nvar getDefaultProp = (props, key) => props.default === true ? props[key] : props.default ? props.default[key] : void 0;\nvar noopTransform = (value) => value;\nvar getDefaultProps = (props, transform = noopTransform) => {\n let keys = DEFAULT_PROPS;\n if (props.default && props.default !== true) {\n props = props.default;\n keys = Object.keys(props);\n }\n const defaults2 = {};\n for (const key of keys) {\n const value = transform(props[key], key);\n if (!is.und(value)) {\n defaults2[key] = value;\n }\n }\n return defaults2;\n};\nvar DEFAULT_PROPS = [\n \"config\",\n \"onProps\",\n \"onStart\",\n \"onChange\",\n \"onPause\",\n \"onResume\",\n \"onRest\"\n];\nvar RESERVED_PROPS = {\n config: 1,\n from: 1,\n to: 1,\n ref: 1,\n loop: 1,\n reset: 1,\n pause: 1,\n cancel: 1,\n reverse: 1,\n immediate: 1,\n default: 1,\n delay: 1,\n onProps: 1,\n onStart: 1,\n onChange: 1,\n onPause: 1,\n onResume: 1,\n onRest: 1,\n onResolve: 1,\n // Transition props\n items: 1,\n trail: 1,\n sort: 1,\n expires: 1,\n initial: 1,\n enter: 1,\n update: 1,\n leave: 1,\n children: 1,\n onDestroyed: 1,\n // Internal props\n keys: 1,\n callId: 1,\n parentId: 1\n};\nfunction getForwardProps(props) {\n const forward = {};\n let count = 0;\n eachProp(props, (value, prop) => {\n if (!RESERVED_PROPS[prop]) {\n forward[prop] = value;\n count++;\n }\n });\n if (count) {\n return forward;\n }\n}\nfunction inferTo(props) {\n const to2 = getForwardProps(props);\n if (to2) {\n const out = { to: to2 };\n eachProp(props, (val, key) => key in to2 || (out[key] = val));\n return out;\n }\n return { ...props };\n}\nfunction computeGoal(value) {\n value = getFluidValue(value);\n return is.arr(value) ? value.map(computeGoal) : isAnimatedString(value) ? G.createStringInterpolator({\n range: [0, 1],\n output: [value, value]\n })(1) : value;\n}\nfunction hasProps(props) {\n for (const _ in props) return true;\n return false;\n}\nfunction isAsyncTo(to2) {\n return is.fun(to2) || is.arr(to2) && is.obj(to2[0]);\n}\nfunction detachRefs(ctrl, ref) {\n ctrl.ref?.delete(ctrl);\n ref?.delete(ctrl);\n}\nfunction replaceRef(ctrl, ref) {\n if (ref && ctrl.ref !== ref) {\n ctrl.ref?.delete(ctrl);\n ref.add(ctrl);\n ctrl.ref = ref;\n }\n}\n\n// src/hooks/useChain.ts\nfunction useChain(refs, timeSteps, timeFrame = 1e3) {\n useIsomorphicLayoutEffect(() => {\n if (timeSteps) {\n let prevDelay = 0;\n each(refs, (ref, i) => {\n const controllers = ref.current;\n if (controllers.length) {\n let delay = timeFrame * timeSteps[i];\n if (isNaN(delay)) delay = prevDelay;\n else prevDelay = delay;\n each(controllers, (ctrl) => {\n each(ctrl.queue, (props) => {\n const memoizedDelayProp = props.delay;\n props.delay = (key) => delay + callProp(memoizedDelayProp || 0, key);\n });\n });\n ref.start();\n }\n });\n } else {\n let p = Promise.resolve();\n each(refs, (ref) => {\n const controllers = ref.current;\n if (controllers.length) {\n const queues = controllers.map((ctrl) => {\n const q = ctrl.queue;\n ctrl.queue = [];\n return q;\n });\n p = p.then(() => {\n each(\n controllers,\n (ctrl, i) => each(queues[i] || [], (update2) => ctrl.queue.push(update2))\n );\n return Promise.all(ref.start());\n });\n }\n });\n }\n });\n}\n\n// src/hooks/useSpring.ts\nimport { is as is9 } from \"@react-spring/shared\";\n\n// src/hooks/useSprings.ts\nimport { useContext as useContext2, useMemo as useMemo2, useRef } from \"react\";\nimport {\n is as is8,\n each as each5,\n usePrev,\n useOnce,\n useForceUpdate,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect2\n} from \"@react-spring/shared\";\n\n// src/SpringValue.ts\nimport {\n is as is5,\n raf as raf3,\n each as each2,\n isEqual,\n toArray as toArray2,\n eachProp as eachProp3,\n frameLoop as frameLoop2,\n flushCalls,\n getFluidValue as getFluidValue2,\n isAnimatedString as isAnimatedString2,\n Globals as G5,\n callFluidObservers as callFluidObservers2,\n hasFluidValue,\n addFluidObserver,\n removeFluidObserver,\n getFluidObservers\n} from \"@react-spring/shared\";\nimport {\n AnimatedValue,\n AnimatedString,\n getPayload,\n getAnimated as getAnimated2,\n setAnimated,\n getAnimatedType\n} from \"@react-spring/animated\";\n\n// src/AnimationConfig.ts\nimport { is as is2, easings } from \"@react-spring/shared\";\n\n// src/constants.ts\nvar config = {\n default: { tension: 170, friction: 26 },\n gentle: { tension: 120, friction: 14 },\n wobbly: { tension: 180, friction: 12 },\n stiff: { tension: 210, friction: 20 },\n slow: { tension: 280, friction: 60 },\n molasses: { tension: 280, friction: 120 }\n};\n\n// src/AnimationConfig.ts\nvar defaults = {\n ...config.default,\n mass: 1,\n damping: 1,\n easing: easings.linear,\n clamp: false\n};\nvar AnimationConfig = class {\n constructor() {\n /**\n * The initial velocity of one or more values.\n *\n * @default 0\n */\n this.velocity = 0;\n Object.assign(this, defaults);\n }\n};\nfunction mergeConfig(config2, newConfig, defaultConfig) {\n if (defaultConfig) {\n defaultConfig = { ...defaultConfig };\n sanitizeConfig(defaultConfig, newConfig);\n newConfig = { ...defaultConfig, ...newConfig };\n }\n sanitizeConfig(config2, newConfig);\n Object.assign(config2, newConfig);\n for (const key in defaults) {\n if (config2[key] == null) {\n config2[key] = defaults[key];\n }\n }\n let { frequency, damping } = config2;\n const { mass } = config2;\n if (!is2.und(frequency)) {\n if (frequency < 0.01) frequency = 0.01;\n if (damping < 0) damping = 0;\n config2.tension = Math.pow(2 * Math.PI / frequency, 2) * mass;\n config2.friction = 4 * Math.PI * damping * mass / frequency;\n }\n return config2;\n}\nfunction sanitizeConfig(config2, props) {\n if (!is2.und(props.decay)) {\n config2.duration = void 0;\n } else {\n const isTensionConfig = !is2.und(props.tension) || !is2.und(props.friction);\n if (isTensionConfig || !is2.und(props.frequency) || !is2.und(props.damping) || !is2.und(props.mass)) {\n config2.duration = void 0;\n config2.decay = void 0;\n }\n if (isTensionConfig) {\n config2.frequency = void 0;\n }\n }\n}\n\n// src/Animation.ts\nvar emptyArray = [];\nvar Animation = class {\n constructor() {\n this.changed = false;\n this.values = emptyArray;\n this.toValues = null;\n this.fromValues = emptyArray;\n this.config = new AnimationConfig();\n this.immediate = false;\n }\n};\n\n// src/scheduleProps.ts\nimport { is as is3, raf, Globals as G2 } from \"@react-spring/shared\";\nfunction scheduleProps(callId, { key, props, defaultProps, state, actions }) {\n return new Promise((resolve, reject) => {\n let delay;\n let timeout;\n let cancel = matchProp(props.cancel ?? defaultProps?.cancel, key);\n if (cancel) {\n onStart();\n } else {\n if (!is3.und(props.pause)) {\n state.paused = matchProp(props.pause, key);\n }\n let pause = defaultProps?.pause;\n if (pause !== true) {\n pause = state.paused || matchProp(pause, key);\n }\n delay = callProp(props.delay || 0, key);\n if (pause) {\n state.resumeQueue.add(onResume);\n actions.pause();\n } else {\n actions.resume();\n onResume();\n }\n }\n function onPause() {\n state.resumeQueue.add(onResume);\n state.timeouts.delete(timeout);\n timeout.cancel();\n delay = timeout.time - raf.now();\n }\n function onResume() {\n if (delay > 0 && !G2.skipAnimation) {\n state.delayed = true;\n timeout = raf.setTimeout(onStart, delay);\n state.pauseQueue.add(onPause);\n state.timeouts.add(timeout);\n } else {\n onStart();\n }\n }\n function onStart() {\n if (state.delayed) {\n state.delayed = false;\n }\n state.pauseQueue.delete(onPause);\n state.timeouts.delete(timeout);\n if (callId <= (state.cancelId || 0)) {\n cancel = true;\n }\n try {\n actions.start({ ...props, callId, cancel }, resolve);\n } catch (err) {\n reject(err);\n }\n }\n });\n}\n\n// src/runAsync.ts\nimport {\n is as is4,\n raf as raf2,\n flush,\n eachProp as eachProp2,\n Globals as G3\n} from \"@react-spring/shared\";\n\n// src/AnimationResult.ts\nvar getCombinedResult = (target, results) => results.length == 1 ? results[0] : results.some((result) => result.cancelled) ? getCancelledResult(target.get()) : results.every((result) => result.noop) ? getNoopResult(target.get()) : getFinishedResult(\n target.get(),\n results.every((result) => result.finished)\n);\nvar getNoopResult = (value) => ({\n value,\n noop: true,\n finished: true,\n cancelled: false\n});\nvar getFinishedResult = (value, finished, cancelled = false) => ({\n value,\n finished,\n cancelled\n});\nvar getCancelledResult = (value) => ({\n value,\n cancelled: true,\n finished: false\n});\n\n// src/runAsync.ts\nfunction runAsync(to2, props, state, target) {\n const { callId, parentId, onRest } = props;\n const { asyncTo: prevTo, promise: prevPromise } = state;\n if (!parentId && to2 === prevTo && !props.reset) {\n return prevPromise;\n }\n return state.promise = (async () => {\n state.asyncId = callId;\n state.asyncTo = to2;\n const defaultProps = getDefaultProps(\n props,\n (value, key) => (\n // The `onRest` prop is only called when the `runAsync` promise is resolved.\n key === \"onRest\" ? void 0 : value\n )\n );\n let preventBail;\n let bail;\n const bailPromise = new Promise(\n (resolve, reject) => (preventBail = resolve, bail = reject)\n );\n const bailIfEnded = (bailSignal) => {\n const bailResult = (\n // The `cancel` prop or `stop` method was used.\n callId <= (state.cancelId || 0) && getCancelledResult(target) || // The async `to` prop was replaced.\n callId !== state.asyncId && getFinishedResult(target, false)\n );\n if (bailResult) {\n bailSignal.result = bailResult;\n bail(bailSignal);\n throw bailSignal;\n }\n };\n const animate = (arg1, arg2) => {\n const bailSignal = new BailSignal();\n const skipAnimationSignal = new SkipAnimationSignal();\n return (async () => {\n if (G3.skipAnimation) {\n stopAsync(state);\n skipAnimationSignal.result = getFinishedResult(target, false);\n bail(skipAnimationSignal);\n throw skipAnimationSignal;\n }\n bailIfEnded(bailSignal);\n const props2 = is4.obj(arg1) ? { ...arg1 } : { ...arg2, to: arg1 };\n props2.parentId = callId;\n eachProp2(defaultProps, (value, key) => {\n if (is4.und(props2[key])) {\n props2[key] = value;\n }\n });\n const result2 = await target.start(props2);\n bailIfEnded(bailSignal);\n if (state.paused) {\n await new Promise((resume) => {\n state.resumeQueue.add(resume);\n });\n }\n return result2;\n })();\n };\n let result;\n if (G3.skipAnimation) {\n stopAsync(state);\n return getFinishedResult(target, false);\n }\n try {\n let animating;\n if (is4.arr(to2)) {\n animating = (async (queue) => {\n for (const props2 of queue) {\n await animate(props2);\n }\n })(to2);\n } else {\n animating = Promise.resolve(to2(animate, target.stop.bind(target)));\n }\n await Promise.all([animating.then(preventBail), bailPromise]);\n result = getFinishedResult(target.get(), true, false);\n } catch (err) {\n if (err instanceof BailSignal) {\n result = err.result;\n } else if (err instanceof SkipAnimationSignal) {\n result = err.result;\n } else {\n throw err;\n }\n } finally {\n if (callId == state.asyncId) {\n state.asyncId = parentId;\n state.asyncTo = parentId ? prevTo : void 0;\n state.promise = parentId ? prevPromise : void 0;\n }\n }\n if (is4.fun(onRest)) {\n raf2.batchedUpdates(() => {\n onRest(result, target, target.item);\n });\n }\n return result;\n })();\n}\nfunction stopAsync(state, cancelId) {\n flush(state.timeouts, (t) => t.cancel());\n state.pauseQueue.clear();\n state.resumeQueue.clear();\n state.asyncId = state.asyncTo = state.promise = void 0;\n if (cancelId) state.cancelId = cancelId;\n}\nvar BailSignal = class extends Error {\n constructor() {\n super(\n \"An async animation has been interrupted. You see this error because you forgot to use `await` or `.catch(...)` on its returned promise.\"\n );\n }\n};\nvar SkipAnimationSignal = class extends Error {\n constructor() {\n super(\"SkipAnimationSignal\");\n }\n};\n\n// src/FrameValue.ts\nimport {\n deprecateInterpolate,\n frameLoop,\n FluidValue as FluidValue2,\n Globals as G4,\n callFluidObservers\n} from \"@react-spring/shared\";\nimport { getAnimated } from \"@react-spring/animated\";\nvar isFrameValue = (value) => value instanceof FrameValue;\nvar nextId = 1;\nvar FrameValue = class extends FluidValue2 {\n constructor() {\n super(...arguments);\n this.id = nextId++;\n this._priority = 0;\n }\n get priority() {\n return this._priority;\n }\n set priority(priority) {\n if (this._priority != priority) {\n this._priority = priority;\n this._onPriorityChange(priority);\n }\n }\n /** Get the current value */\n get() {\n const node = getAnimated(this);\n return node && node.getValue();\n }\n /** Create a spring that maps our value to another value */\n to(...args) {\n return G4.to(this, args);\n }\n /** @deprecated Use the `to` method instead. */\n interpolate(...args) {\n deprecateInterpolate();\n return G4.to(this, args);\n }\n toJSON() {\n return this.get();\n }\n observerAdded(count) {\n if (count == 1) this._attach();\n }\n observerRemoved(count) {\n if (count == 0) this._detach();\n }\n /** Called when the first child is added. */\n _attach() {\n }\n /** Called when the last child is removed. */\n _detach() {\n }\n /** Tell our children about our new value */\n _onChange(value, idle = false) {\n callFluidObservers(this, {\n type: \"change\",\n parent: this,\n value,\n idle\n });\n }\n /** Tell our children about our new priority */\n _onPriorityChange(priority) {\n if (!this.idle) {\n frameLoop.sort(this);\n }\n callFluidObservers(this, {\n type: \"priority\",\n parent: this,\n priority\n });\n }\n};\n\n// src/SpringPhase.ts\nvar $P = Symbol.for(\"SpringPhase\");\nvar HAS_ANIMATED = 1;\nvar IS_ANIMATING = 2;\nvar IS_PAUSED = 4;\nvar hasAnimated = (target) => (target[$P] & HAS_ANIMATED) > 0;\nvar isAnimating = (target) => (target[$P] & IS_ANIMATING) > 0;\nvar isPaused = (target) => (target[$P] & IS_PAUSED) > 0;\nvar setActiveBit = (target, active) => active ? target[$P] |= IS_ANIMATING | HAS_ANIMATED : target[$P] &= ~IS_ANIMATING;\nvar setPausedBit = (target, paused) => paused ? target[$P] |= IS_PAUSED : target[$P] &= ~IS_PAUSED;\n\n// src/SpringValue.ts\nvar SpringValue = class extends FrameValue {\n constructor(arg1, arg2) {\n super();\n /** The animation state */\n this.animation = new Animation();\n /** Some props have customizable default values */\n this.defaultProps = {};\n /** The state for `runAsync` calls */\n this._state = {\n paused: false,\n delayed: false,\n pauseQueue: /* @__PURE__ */ new Set(),\n resumeQueue: /* @__PURE__ */ new Set(),\n timeouts: /* @__PURE__ */ new Set()\n };\n /** The promise resolvers of pending `start` calls */\n this._pendingCalls = /* @__PURE__ */ new Set();\n /** The counter for tracking `scheduleProps` calls */\n this._lastCallId = 0;\n /** The last `scheduleProps` call that changed the `to` prop */\n this._lastToId = 0;\n this._memoizedDuration = 0;\n if (!is5.und(arg1) || !is5.und(arg2)) {\n const props = is5.obj(arg1) ? { ...arg1 } : { ...arg2, from: arg1 };\n if (is5.und(props.default)) {\n props.default = true;\n }\n this.start(props);\n }\n }\n /** Equals true when not advancing on each frame. */\n get idle() {\n return !(isAnimating(this) || this._state.asyncTo) || isPaused(this);\n }\n get goal() {\n return getFluidValue2(this.animation.to);\n }\n get velocity() {\n const node = getAnimated2(this);\n return node instanceof AnimatedValue ? node.lastVelocity || 0 : node.getPayload().map((node2) => node2.lastVelocity || 0);\n }\n /**\n * When true, this value has been animated at least once.\n */\n get hasAnimated() {\n return hasAnimated(this);\n }\n /**\n * When true, this value has an unfinished animation,\n * which is either active or paused.\n */\n get isAnimating() {\n return isAnimating(this);\n }\n /**\n * When true, all current and future animations are paused.\n */\n get isPaused() {\n return isPaused(this);\n }\n /**\n *\n *\n */\n get isDelayed() {\n return this._state.delayed;\n }\n /** Advance the current animation by a number of milliseconds */\n advance(dt) {\n let idle = true;\n let changed = false;\n const anim = this.animation;\n let { toValues } = anim;\n const { config: config2 } = anim;\n const payload = getPayload(anim.to);\n if (!payload && hasFluidValue(anim.to)) {\n toValues = toArray2(getFluidValue2(anim.to));\n }\n anim.values.forEach((node2, i) => {\n if (node2.done) return;\n const to2 = (\n // Animated strings always go from 0 to 1.\n node2.constructor == AnimatedString ? 1 : payload ? payload[i].lastPosition : toValues[i]\n );\n let finished = anim.immediate;\n let position = to2;\n if (!finished) {\n position = node2.lastPosition;\n if (config2.tension <= 0) {\n node2.done = true;\n return;\n }\n let elapsed = node2.elapsedTime += dt;\n const from = anim.fromValues[i];\n const v0 = node2.v0 != null ? node2.v0 : node2.v0 = is5.arr(config2.velocity) ? config2.velocity[i] : config2.velocity;\n let velocity;\n const precision = config2.precision || (from == to2 ? 5e-3 : Math.min(1, Math.abs(to2 - from) * 1e-3));\n if (!is5.und(config2.duration)) {\n let p = 1;\n if (config2.duration > 0) {\n if (this._memoizedDuration !== config2.duration) {\n this._memoizedDuration = config2.duration;\n if (node2.durationProgress > 0) {\n node2.elapsedTime = config2.duration * node2.durationProgress;\n elapsed = node2.elapsedTime += dt;\n }\n }\n p = (config2.progress || 0) + elapsed / this._memoizedDuration;\n p = p > 1 ? 1 : p < 0 ? 0 : p;\n node2.durationProgress = p;\n }\n position = from + config2.easing(p) * (to2 - from);\n velocity = (position - node2.lastPosition) / dt;\n finished = p == 1;\n } else if (config2.decay) {\n const decay = config2.decay === true ? 0.998 : config2.decay;\n const e = Math.exp(-(1 - decay) * elapsed);\n position = from + v0 / (1 - decay) * (1 - e);\n finished = Math.abs(node2.lastPosition - position) <= precision;\n velocity = v0 * e;\n } else {\n velocity = node2.lastVelocity == null ? v0 : node2.lastVelocity;\n const restVelocity = config2.restVelocity || precision / 10;\n const bounceFactor = config2.clamp ? 0 : config2.bounce;\n const canBounce = !is5.und(bounceFactor);\n const isGrowing = from == to2 ? node2.v0 > 0 : from < to2;\n let isMoving;\n let isBouncing = false;\n const step = 1;\n const numSteps = Math.ceil(dt / step);\n for (let n = 0; n < numSteps; ++n) {\n isMoving = Math.abs(velocity) > restVelocity;\n if (!isMoving) {\n finished = Math.abs(to2 - position) <= precision;\n if (finished) {\n break;\n }\n }\n if (canBounce) {\n isBouncing = position == to2 || position > to2 == isGrowing;\n if (isBouncing) {\n velocity = -velocity * bounceFactor;\n position = to2;\n }\n }\n const springForce = -config2.tension * 1e-6 * (position - to2);\n const dampingForce = -config2.friction * 1e-3 * velocity;\n const acceleration = (springForce + dampingForce) / config2.mass;\n velocity = velocity + acceleration * step;\n position = position + velocity * step;\n }\n }\n node2.lastVelocity = velocity;\n if (Number.isNaN(position)) {\n console.warn(`Got NaN while animating:`, this);\n finished = true;\n }\n }\n if (payload && !payload[i].done) {\n finished = false;\n }\n if (finished) {\n node2.done = true;\n } else {\n idle = false;\n }\n if (node2.setValue(position, config2.round)) {\n changed = true;\n }\n });\n const node = getAnimated2(this);\n const currVal = node.getValue();\n if (idle) {\n const finalVal = getFluidValue2(anim.to);\n if ((currVal !== finalVal || changed) && !config2.decay) {\n node.setValue(finalVal);\n this._onChange(finalVal);\n } else if (changed && config2.decay) {\n this._onChange(currVal);\n }\n this._stop();\n } else if (changed) {\n this._onChange(currVal);\n }\n }\n /** Set the current value, while stopping the current animation */\n set(value) {\n raf3.batchedUpdates(() => {\n this._stop();\n this._focus(value);\n this._set(value);\n });\n return this;\n }\n /**\n * Freeze the active animation in time, as well as any updates merged\n * before `resume` is called.\n */\n pause() {\n this._update({ pause: true });\n }\n /** Resume the animation if paused. */\n resume() {\n this._update({ pause: false });\n }\n /** Skip to the end of the current animation. */\n finish() {\n if (isAnimating(this)) {\n const { to: to2, config: config2 } = this.animation;\n raf3.batchedUpdates(() => {\n this._onStart();\n if (!config2.decay) {\n this._set(to2, false);\n }\n this._stop();\n });\n }\n return this;\n }\n /** Push props into the pending queue. */\n update(props) {\n const queue = this.queue || (this.queue = []);\n queue.push(props);\n return this;\n }\n start(to2, arg2) {\n let queue;\n if (!is5.und(to2)) {\n queue = [is5.obj(to2) ? to2 : { ...arg2, to: to2 }];\n } else {\n queue = this.queue || [];\n this.queue = [];\n }\n return Promise.all(\n queue.map((props) => {\n const up = this._update(props);\n return up;\n })\n ).then((results) => getCombinedResult(this, results));\n }\n /**\n * Stop the current animation, and cancel any delayed updates.\n *\n * Pass `true` to call `onRest` with `cancelled: true`.\n */\n stop(cancel) {\n const { to: to2 } = this.animation;\n this._focus(this.get());\n stopAsync(this._state, cancel && this._lastCallId);\n raf3.batchedUpdates(() => this._stop(to2, cancel));\n return this;\n }\n /** Restart the animation. */\n reset() {\n this._update({ reset: true });\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n this._start();\n } else if (event.type == \"priority\") {\n this.priority = event.priority + 1;\n }\n }\n /**\n * Parse the `to` and `from` range from the given `props` object.\n *\n * This also ensures the initial value is available to animated components\n * during the render phase.\n */\n _prepareNode(props) {\n const key = this.key || \"\";\n let { to: to2, from } = props;\n to2 = is5.obj(to2) ? to2[key] : to2;\n if (to2 == null || isAsyncTo(to2)) {\n to2 = void 0;\n }\n from = is5.obj(from) ? from[key] : from;\n if (from == null) {\n from = void 0;\n }\n const range = { to: to2, from };\n if (!hasAnimated(this)) {\n if (props.reverse) [to2, from] = [from, to2];\n from = getFluidValue2(from);\n if (!is5.und(from)) {\n this._set(from);\n } else if (!getAnimated2(this)) {\n this._set(to2);\n }\n }\n return range;\n }\n /** Every update is processed by this method before merging. */\n _update({ ...props }, isLoop) {\n const { key, defaultProps } = this;\n if (props.default)\n Object.assign(\n defaultProps,\n getDefaultProps(\n props,\n (value, prop) => /^on/.test(prop) ? resolveProp(value, key) : value\n )\n );\n mergeActiveFn(this, props, \"onProps\");\n sendEvent(this, \"onProps\", props, this);\n const range = this._prepareNode(props);\n if (Object.isFrozen(this)) {\n throw Error(\n \"Cannot animate a `SpringValue` object that is frozen. Did you forget to pass your component to `animated(...)` before animating its props?\"\n );\n }\n const state = this._state;\n return scheduleProps(++this._lastCallId, {\n key,\n props,\n defaultProps,\n state,\n actions: {\n pause: () => {\n if (!isPaused(this)) {\n setPausedBit(this, true);\n flushCalls(state.pauseQueue);\n sendEvent(\n this,\n \"onPause\",\n getFinishedResult(this, checkFinished(this, this.animation.to)),\n this\n );\n }\n },\n resume: () => {\n if (isPaused(this)) {\n setPausedBit(this, false);\n if (isAnimating(this)) {\n this._resume();\n }\n flushCalls(state.resumeQueue);\n sendEvent(\n this,\n \"onResume\",\n getFinishedResult(this, checkFinished(this, this.animation.to)),\n this\n );\n }\n },\n start: this._merge.bind(this, range)\n }\n }).then((result) => {\n if (props.loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props);\n if (nextProps) {\n return this._update(nextProps, true);\n }\n }\n return result;\n });\n }\n /** Merge props into the current animation */\n _merge(range, props, resolve) {\n if (props.cancel) {\n this.stop(true);\n return resolve(getCancelledResult(this));\n }\n const hasToProp = !is5.und(range.to);\n const hasFromProp = !is5.und(range.from);\n if (hasToProp || hasFromProp) {\n if (props.callId > this._lastToId) {\n this._lastToId = props.callId;\n } else {\n return resolve(getCancelledResult(this));\n }\n }\n const { key, defaultProps, animation: anim } = this;\n const { to: prevTo, from: prevFrom } = anim;\n let { to: to2 = prevTo, from = prevFrom } = range;\n if (hasFromProp && !hasToProp && (!props.default || is5.und(to2))) {\n to2 = from;\n }\n if (props.reverse) [to2, from] = [from, to2];\n const hasFromChanged = !isEqual(from, prevFrom);\n if (hasFromChanged) {\n anim.from = from;\n }\n from = getFluidValue2(from);\n const hasToChanged = !isEqual(to2, prevTo);\n if (hasToChanged) {\n this._focus(to2);\n }\n const hasAsyncTo = isAsyncTo(props.to);\n const { config: config2 } = anim;\n const { decay, velocity } = config2;\n if (hasToProp || hasFromProp) {\n config2.velocity = 0;\n }\n if (props.config && !hasAsyncTo) {\n mergeConfig(\n config2,\n callProp(props.config, key),\n // Avoid calling the same \"config\" prop twice.\n props.config !== defaultProps.config ? callProp(defaultProps.config, key) : void 0\n );\n }\n let node = getAnimated2(this);\n if (!node || is5.und(to2)) {\n return resolve(getFinishedResult(this, true));\n }\n const reset = (\n // When `reset` is undefined, the `from` prop implies `reset: true`,\n // except for declarative updates. When `reset` is defined, there\n // must exist a value to animate from.\n is5.und(props.reset) ? hasFromProp && !props.default : !is5.und(from) && matchProp(props.reset, key)\n );\n const value = reset ? from : this.get();\n const goal = computeGoal(to2);\n const isAnimatable = is5.num(goal) || is5.arr(goal) || isAnimatedString2(goal);\n const immediate = !hasAsyncTo && (!isAnimatable || matchProp(defaultProps.immediate || props.immediate, key));\n if (hasToChanged) {\n const nodeType = getAnimatedType(to2);\n if (nodeType !== node.constructor) {\n if (immediate) {\n node = this._set(goal);\n } else\n throw Error(\n `Cannot animate between ${node.constructor.name} and ${nodeType.name}, as the \"to\" prop suggests`\n );\n }\n }\n const goalType = node.constructor;\n let started = hasFluidValue(to2);\n let finished = false;\n if (!started) {\n const hasValueChanged = reset || !hasAnimated(this) && hasFromChanged;\n if (hasToChanged || hasValueChanged) {\n finished = isEqual(computeGoal(value), goal);\n started = !finished;\n }\n if (!isEqual(anim.immediate, immediate) && !immediate || !isEqual(config2.decay, decay) || !isEqual(config2.velocity, velocity)) {\n started = true;\n }\n }\n if (finished && isAnimating(this)) {\n if (anim.changed && !reset) {\n started = true;\n } else if (!started) {\n this._stop(prevTo);\n }\n }\n if (!hasAsyncTo) {\n if (started || hasFluidValue(prevTo)) {\n anim.values = node.getPayload();\n anim.toValues = hasFluidValue(to2) ? null : goalType == AnimatedString ? [1] : toArray2(goal);\n }\n if (anim.immediate != immediate) {\n anim.immediate = immediate;\n if (!immediate && !reset) {\n this._set(prevTo);\n }\n }\n if (started) {\n const { onRest } = anim;\n each2(ACTIVE_EVENTS, (type) => mergeActiveFn(this, props, type));\n const result = getFinishedResult(this, checkFinished(this, prevTo));\n flushCalls(this._pendingCalls, result);\n this._pendingCalls.add(resolve);\n if (anim.changed)\n raf3.batchedUpdates(() => {\n anim.changed = !reset;\n onRest?.(result, this);\n if (reset) {\n callProp(defaultProps.onRest, result);\n } else {\n anim.onStart?.(result, this);\n }\n });\n }\n }\n if (reset) {\n this._set(value);\n }\n if (hasAsyncTo) {\n resolve(runAsync(props.to, props, this._state, this));\n } else if (started) {\n this._start();\n } else if (isAnimating(this) && !hasToChanged) {\n this._pendingCalls.add(resolve);\n } else {\n resolve(getNoopResult(value));\n }\n }\n /** Update the `animation.to` value, which might be a `FluidValue` */\n _focus(value) {\n const anim = this.animation;\n if (value !== anim.to) {\n if (getFluidObservers(this)) {\n this._detach();\n }\n anim.to = value;\n if (getFluidObservers(this)) {\n this._attach();\n }\n }\n }\n _attach() {\n let priority = 0;\n const { to: to2 } = this.animation;\n if (hasFluidValue(to2)) {\n addFluidObserver(to2, this);\n if (isFrameValue(to2)) {\n priority = to2.priority + 1;\n }\n }\n this.priority = priority;\n }\n _detach() {\n const { to: to2 } = this.animation;\n if (hasFluidValue(to2)) {\n removeFluidObserver(to2, this);\n }\n }\n /**\n * Update the current value from outside the frameloop,\n * and return the `Animated` node.\n */\n _set(arg, idle = true) {\n const value = getFluidValue2(arg);\n if (!is5.und(value)) {\n const oldNode = getAnimated2(this);\n if (!oldNode || !isEqual(value, oldNode.getValue())) {\n const nodeType = getAnimatedType(value);\n if (!oldNode || oldNode.constructor != nodeType) {\n setAnimated(this, nodeType.create(value));\n } else {\n oldNode.setValue(value);\n }\n if (oldNode) {\n raf3.batchedUpdates(() => {\n this._onChange(value, idle);\n });\n }\n }\n }\n return getAnimated2(this);\n }\n _onStart() {\n const anim = this.animation;\n if (!anim.changed) {\n anim.changed = true;\n sendEvent(\n this,\n \"onStart\",\n getFinishedResult(this, checkFinished(this, anim.to)),\n this\n );\n }\n }\n _onChange(value, idle) {\n if (!idle) {\n this._onStart();\n callProp(this.animation.onChange, value, this);\n }\n callProp(this.defaultProps.onChange, value, this);\n super._onChange(value, idle);\n }\n // This method resets the animation state (even if already animating) to\n // ensure the latest from/to range is used, and it also ensures this spring\n // is added to the frameloop.\n _start() {\n const anim = this.animation;\n getAnimated2(this).reset(getFluidValue2(anim.to));\n if (!anim.immediate) {\n anim.fromValues = anim.values.map((node) => node.lastPosition);\n }\n if (!isAnimating(this)) {\n setActiveBit(this, true);\n if (!isPaused(this)) {\n this._resume();\n }\n }\n }\n _resume() {\n if (G5.skipAnimation) {\n this.finish();\n } else {\n frameLoop2.start(this);\n }\n }\n /**\n * Exit the frameloop and notify `onRest` listeners.\n *\n * Always wrap `_stop` calls with `batchedUpdates`.\n */\n _stop(goal, cancel) {\n if (isAnimating(this)) {\n setActiveBit(this, false);\n const anim = this.animation;\n each2(anim.values, (node) => {\n node.done = true;\n });\n if (anim.toValues) {\n anim.onChange = anim.onPause = anim.onResume = void 0;\n }\n callFluidObservers2(this, {\n type: \"idle\",\n parent: this\n });\n const result = cancel ? getCancelledResult(this.get()) : getFinishedResult(this.get(), checkFinished(this, goal ?? anim.to));\n flushCalls(this._pendingCalls, result);\n if (anim.changed) {\n anim.changed = false;\n sendEvent(this, \"onRest\", result, this);\n }\n }\n }\n};\nfunction checkFinished(target, to2) {\n const goal = computeGoal(to2);\n const value = computeGoal(target.get());\n return isEqual(value, goal);\n}\nfunction createLoopUpdate(props, loop = props.loop, to2 = props.to) {\n const loopRet = callProp(loop);\n if (loopRet) {\n const overrides = loopRet !== true && inferTo(loopRet);\n const reverse = (overrides || props).reverse;\n const reset = !overrides || overrides.reset;\n return createUpdate({\n ...props,\n loop,\n // Avoid updating default props when looping.\n default: false,\n // Never loop the `pause` prop.\n pause: void 0,\n // For the \"reverse\" prop to loop as expected, the \"to\" prop\n // must be undefined. The \"reverse\" prop is ignored when the\n // \"to\" prop is an array or function.\n to: !reverse || isAsyncTo(to2) ? to2 : void 0,\n // Ignore the \"from\" prop except on reset.\n from: reset ? props.from : void 0,\n reset,\n // The \"loop\" prop can return a \"useSpring\" props object to\n // override any of the original props.\n ...overrides\n });\n }\n}\nfunction createUpdate(props) {\n const { to: to2, from } = props = inferTo(props);\n const keys = /* @__PURE__ */ new Set();\n if (is5.obj(to2)) findDefined(to2, keys);\n if (is5.obj(from)) findDefined(from, keys);\n props.keys = keys.size ? Array.from(keys) : null;\n return props;\n}\nfunction declareUpdate(props) {\n const update2 = createUpdate(props);\n if (is5.und(update2.default)) {\n update2.default = getDefaultProps(update2);\n }\n return update2;\n}\nfunction findDefined(values, keys) {\n eachProp3(values, (value, key) => value != null && keys.add(key));\n}\nvar ACTIVE_EVENTS = [\n \"onStart\",\n \"onRest\",\n \"onChange\",\n \"onPause\",\n \"onResume\"\n];\nfunction mergeActiveFn(target, props, type) {\n target.animation[type] = props[type] !== getDefaultProp(props, type) ? resolveProp(props[type], target.key) : void 0;\n}\nfunction sendEvent(target, type, ...args) {\n target.animation[type]?.(...args);\n target.defaultProps[type]?.(...args);\n}\n\n// src/Controller.ts\nimport {\n is as is6,\n raf as raf4,\n each as each3,\n noop,\n flush as flush2,\n toArray as toArray3,\n eachProp as eachProp4,\n flushCalls as flushCalls2,\n addFluidObserver as addFluidObserver2\n} from \"@react-spring/shared\";\nvar BATCHED_EVENTS = [\"onStart\", \"onChange\", \"onRest\"];\nvar nextId2 = 1;\nvar Controller = class {\n constructor(props, flush3) {\n this.id = nextId2++;\n /** The animated values */\n this.springs = {};\n /** The queue of props passed to the `update` method. */\n this.queue = [];\n /** The counter for tracking `scheduleProps` calls */\n this._lastAsyncId = 0;\n /** The values currently being animated */\n this._active = /* @__PURE__ */ new Set();\n /** The values that changed recently */\n this._changed = /* @__PURE__ */ new Set();\n /** Equals false when `onStart` listeners can be called */\n this._started = false;\n /** State used by the `runAsync` function */\n this._state = {\n paused: false,\n pauseQueue: /* @__PURE__ */ new Set(),\n resumeQueue: /* @__PURE__ */ new Set(),\n timeouts: /* @__PURE__ */ new Set()\n };\n /** The event queues that are flushed once per frame maximum */\n this._events = {\n onStart: /* @__PURE__ */ new Map(),\n onChange: /* @__PURE__ */ new Map(),\n onRest: /* @__PURE__ */ new Map()\n };\n this._onFrame = this._onFrame.bind(this);\n if (flush3) {\n this._flush = flush3;\n }\n if (props) {\n this.start({ default: true, ...props });\n }\n }\n /**\n * Equals `true` when no spring values are in the frameloop, and\n * no async animation is currently active.\n */\n get idle() {\n return !this._state.asyncTo && Object.values(this.springs).every((spring) => {\n return spring.idle && !spring.isDelayed && !spring.isPaused;\n });\n }\n get item() {\n return this._item;\n }\n set item(item) {\n this._item = item;\n }\n /** Get the current values of our springs */\n get() {\n const values = {};\n this.each((spring, key) => values[key] = spring.get());\n return values;\n }\n /** Set the current values without animating. */\n set(values) {\n for (const key in values) {\n const value = values[key];\n if (!is6.und(value)) {\n this.springs[key].set(value);\n }\n }\n }\n /** Push an update onto the queue of each value. */\n update(props) {\n if (props) {\n this.queue.push(createUpdate(props));\n }\n return this;\n }\n /**\n * Start the queued animations for every spring, and resolve the returned\n * promise once all queued animations have finished or been cancelled.\n *\n * When you pass a queue (instead of nothing), that queue is used instead of\n * the queued animations added with the `update` method, which are left alone.\n */\n start(props) {\n let { queue } = this;\n if (props) {\n queue = toArray3(props).map(createUpdate);\n } else {\n this.queue = [];\n }\n if (this._flush) {\n return this._flush(this, queue);\n }\n prepareKeys(this, queue);\n return flushUpdateQueue(this, queue);\n }\n /** @internal */\n stop(arg, keys) {\n if (arg !== !!arg) {\n keys = arg;\n }\n if (keys) {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].stop(!!arg));\n } else {\n stopAsync(this._state, this._lastAsyncId);\n this.each((spring) => spring.stop(!!arg));\n }\n return this;\n }\n /** Freeze the active animation in time */\n pause(keys) {\n if (is6.und(keys)) {\n this.start({ pause: true });\n } else {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].pause());\n }\n return this;\n }\n /** Resume the animation if paused. */\n resume(keys) {\n if (is6.und(keys)) {\n this.start({ pause: false });\n } else {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].resume());\n }\n return this;\n }\n /** Call a function once per spring value */\n each(iterator) {\n eachProp4(this.springs, iterator);\n }\n /** @internal Called at the end of every animation frame */\n _onFrame() {\n const { onStart, onChange, onRest } = this._events;\n const active = this._active.size > 0;\n const changed = this._changed.size > 0;\n if (active && !this._started || changed && !this._started) {\n this._started = true;\n flush2(onStart, ([onStart2, result]) => {\n result.value = this.get();\n onStart2(result, this, this._item);\n });\n }\n const idle = !active && this._started;\n const values = changed || idle && onRest.size ? this.get() : null;\n if (changed && onChange.size) {\n flush2(onChange, ([onChange2, result]) => {\n result.value = values;\n onChange2(result, this, this._item);\n });\n }\n if (idle) {\n this._started = false;\n flush2(onRest, ([onRest2, result]) => {\n result.value = values;\n onRest2(result, this, this._item);\n });\n }\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n this._changed.add(event.parent);\n if (!event.idle) {\n this._active.add(event.parent);\n }\n } else if (event.type == \"idle\") {\n this._active.delete(event.parent);\n } else return;\n raf4.onFrame(this._onFrame);\n }\n};\nfunction flushUpdateQueue(ctrl, queue) {\n return Promise.all(queue.map((props) => flushUpdate(ctrl, props))).then(\n (results) => getCombinedResult(ctrl, results)\n );\n}\nasync function flushUpdate(ctrl, props, isLoop) {\n const { keys, to: to2, from, loop, onRest, onResolve } = props;\n const defaults2 = is6.obj(props.default) && props.default;\n if (loop) {\n props.loop = false;\n }\n if (to2 === false) props.to = null;\n if (from === false) props.from = null;\n const asyncTo = is6.arr(to2) || is6.fun(to2) ? to2 : void 0;\n if (asyncTo) {\n props.to = void 0;\n props.onRest = void 0;\n if (defaults2) {\n defaults2.onRest = void 0;\n }\n } else {\n each3(BATCHED_EVENTS, (key) => {\n const handler = props[key];\n if (is6.fun(handler)) {\n const queue = ctrl[\"_events\"][key];\n props[key] = ({ finished, cancelled }) => {\n const result2 = queue.get(handler);\n if (result2) {\n if (!finished) result2.finished = false;\n if (cancelled) result2.cancelled = true;\n } else {\n queue.set(handler, {\n value: null,\n finished: finished || false,\n cancelled: cancelled || false\n });\n }\n };\n if (defaults2) {\n defaults2[key] = props[key];\n }\n }\n });\n }\n const state = ctrl[\"_state\"];\n if (props.pause === !state.paused) {\n state.paused = props.pause;\n flushCalls2(props.pause ? state.pauseQueue : state.resumeQueue);\n } else if (state.paused) {\n props.pause = true;\n }\n const promises = (keys || Object.keys(ctrl.springs)).map(\n (key) => ctrl.springs[key].start(props)\n );\n const cancel = props.cancel === true || getDefaultProp(props, \"cancel\") === true;\n if (asyncTo || cancel && state.asyncId) {\n promises.push(\n scheduleProps(++ctrl[\"_lastAsyncId\"], {\n props,\n state,\n actions: {\n pause: noop,\n resume: noop,\n start(props2, resolve) {\n if (cancel) {\n stopAsync(state, ctrl[\"_lastAsyncId\"]);\n resolve(getCancelledResult(ctrl));\n } else {\n props2.onRest = onRest;\n resolve(\n runAsync(\n asyncTo,\n props2,\n state,\n ctrl\n )\n );\n }\n }\n }\n })\n );\n }\n if (state.paused) {\n await new Promise((resume) => {\n state.resumeQueue.add(resume);\n });\n }\n const result = getCombinedResult(ctrl, await Promise.all(promises));\n if (loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props, loop, to2);\n if (nextProps) {\n prepareKeys(ctrl, [nextProps]);\n return flushUpdate(ctrl, nextProps, true);\n }\n }\n if (onResolve) {\n raf4.batchedUpdates(() => onResolve(result, ctrl, ctrl.item));\n }\n return result;\n}\nfunction getSprings(ctrl, props) {\n const springs = { ...ctrl.springs };\n if (props) {\n each3(toArray3(props), (props2) => {\n if (is6.und(props2.keys)) {\n props2 = createUpdate(props2);\n }\n if (!is6.obj(props2.to)) {\n props2 = { ...props2, to: void 0 };\n }\n prepareSprings(springs, props2, (key) => {\n return createSpring(key);\n });\n });\n }\n setSprings(ctrl, springs);\n return springs;\n}\nfunction setSprings(ctrl, springs) {\n eachProp4(springs, (spring, key) => {\n if (!ctrl.springs[key]) {\n ctrl.springs[key] = spring;\n addFluidObserver2(spring, ctrl);\n }\n });\n}\nfunction createSpring(key, observer) {\n const spring = new SpringValue();\n spring.key = key;\n if (observer) {\n addFluidObserver2(spring, observer);\n }\n return spring;\n}\nfunction prepareSprings(springs, props, create) {\n if (props.keys) {\n each3(props.keys, (key) => {\n const spring = springs[key] || (springs[key] = create(key));\n spring[\"_prepareNode\"](props);\n });\n }\n}\nfunction prepareKeys(ctrl, queue) {\n each3(queue, (props) => {\n prepareSprings(ctrl.springs, props, (key) => {\n return createSpring(key, ctrl);\n });\n });\n}\n\n// src/SpringContext.tsx\nimport * as React from \"react\";\nimport { useContext } from \"react\";\nvar SpringContext = React.createContext({\n pause: false,\n immediate: false\n});\n\n// src/SpringRef.ts\nimport { each as each4, is as is7, deprecateDirectCall } from \"@react-spring/shared\";\nvar SpringRef = () => {\n const current = [];\n const SpringRef2 = function(props) {\n deprecateDirectCall();\n const results = [];\n each4(current, (ctrl, i) => {\n if (is7.und(props)) {\n results.push(ctrl.start());\n } else {\n const update2 = _getProps(props, ctrl, i);\n if (update2) {\n results.push(ctrl.start(update2));\n }\n }\n });\n return results;\n };\n SpringRef2.current = current;\n SpringRef2.add = function(ctrl) {\n if (!current.includes(ctrl)) {\n current.push(ctrl);\n }\n };\n SpringRef2.delete = function(ctrl) {\n const i = current.indexOf(ctrl);\n if (~i) current.splice(i, 1);\n };\n SpringRef2.pause = function() {\n each4(current, (ctrl) => ctrl.pause(...arguments));\n return this;\n };\n SpringRef2.resume = function() {\n each4(current, (ctrl) => ctrl.resume(...arguments));\n return this;\n };\n SpringRef2.set = function(values) {\n each4(current, (ctrl, i) => {\n const update2 = is7.fun(values) ? values(i, ctrl) : values;\n if (update2) {\n ctrl.set(update2);\n }\n });\n };\n SpringRef2.start = function(props) {\n const results = [];\n each4(current, (ctrl, i) => {\n if (is7.und(props)) {\n results.push(ctrl.start());\n } else {\n const update2 = this._getProps(props, ctrl, i);\n if (update2) {\n results.push(ctrl.start(update2));\n }\n }\n });\n return results;\n };\n SpringRef2.stop = function() {\n each4(current, (ctrl) => ctrl.stop(...arguments));\n return this;\n };\n SpringRef2.update = function(props) {\n each4(current, (ctrl, i) => ctrl.update(this._getProps(props, ctrl, i)));\n return this;\n };\n const _getProps = function(arg, ctrl, index) {\n return is7.fun(arg) ? arg(index, ctrl) : arg;\n };\n SpringRef2._getProps = _getProps;\n return SpringRef2;\n};\n\n// src/hooks/useSprings.ts\nfunction useSprings(length, props, deps) {\n const propsFn = is8.fun(props) && props;\n if (propsFn && !deps) deps = [];\n const ref = useMemo2(\n () => propsFn || arguments.length == 3 ? SpringRef() : void 0,\n []\n );\n const layoutId = useRef(0);\n const forceUpdate = useForceUpdate();\n const state = useMemo2(\n () => ({\n ctrls: [],\n queue: [],\n flush(ctrl, updates2) {\n const springs2 = getSprings(ctrl, updates2);\n const canFlushSync = layoutId.current > 0 && !state.queue.length && !Object.keys(springs2).some((key) => !ctrl.springs[key]);\n return canFlushSync ? flushUpdateQueue(ctrl, updates2) : new Promise((resolve) => {\n setSprings(ctrl, springs2);\n state.queue.push(() => {\n resolve(flushUpdateQueue(ctrl, updates2));\n });\n forceUpdate();\n });\n }\n }),\n []\n );\n const ctrls = useRef([...state.ctrls]);\n const updates = useRef([]);\n const prevLength = usePrev(length) || 0;\n useMemo2(() => {\n each5(ctrls.current.slice(length, prevLength), (ctrl) => {\n detachRefs(ctrl, ref);\n ctrl.stop(true);\n });\n ctrls.current.length = length;\n declareUpdates(prevLength, length);\n }, [length]);\n useMemo2(() => {\n declareUpdates(0, Math.min(prevLength, length));\n }, deps);\n function declareUpdates(startIndex, endIndex) {\n for (let i = startIndex; i < endIndex; i++) {\n const ctrl = ctrls.current[i] || (ctrls.current[i] = new Controller(null, state.flush));\n const update2 = propsFn ? propsFn(i, ctrl) : props[i];\n if (update2) {\n updates.current[i] = declareUpdate(update2);\n }\n }\n }\n const springs = ctrls.current.map(\n (ctrl, i) => getSprings(ctrl, updates.current[i])\n );\n const context = useContext2(SpringContext);\n const prevContext = usePrev(context);\n const hasContext = context !== prevContext && hasProps(context);\n useIsomorphicLayoutEffect2(() => {\n layoutId.current++;\n state.ctrls = ctrls.current;\n const { queue } = state;\n if (queue.length) {\n state.queue = [];\n each5(queue, (cb) => cb());\n }\n each5(ctrls.current, (ctrl, i) => {\n ref?.add(ctrl);\n if (hasContext) {\n ctrl.start({ default: context });\n }\n const update2 = updates.current[i];\n if (update2) {\n replaceRef(ctrl, update2.ref);\n if (ctrl.ref) {\n ctrl.queue.push(update2);\n } else {\n ctrl.start(update2);\n }\n }\n });\n });\n useOnce(() => () => {\n each5(state.ctrls, (ctrl) => ctrl.stop(true));\n });\n const values = springs.map((x) => ({ ...x }));\n return ref ? [values, ref] : values;\n}\n\n// src/hooks/useSpring.ts\nfunction useSpring(props, deps) {\n const isFn = is9.fun(props);\n const [[values], ref] = useSprings(\n 1,\n isFn ? props : [props],\n isFn ? deps || [] : deps\n );\n return isFn || arguments.length == 2 ? [values, ref] : values;\n}\n\n// src/hooks/useSpringRef.ts\nimport { useState } from \"react\";\nvar initSpringRef = () => SpringRef();\nvar useSpringRef = () => useState(initSpringRef)[0];\n\n// src/hooks/useSpringValue.ts\nimport { useConstant, useOnce as useOnce2 } from \"@react-spring/shared\";\nvar useSpringValue = (initial, props) => {\n const springValue = useConstant(() => new SpringValue(initial, props));\n useOnce2(() => () => {\n springValue.stop();\n });\n return springValue;\n};\n\n// src/hooks/useTrail.ts\nimport { each as each6, is as is10, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect3 } from \"@react-spring/shared\";\nfunction useTrail(length, propsArg, deps) {\n const propsFn = is10.fun(propsArg) && propsArg;\n if (propsFn && !deps) deps = [];\n let reverse = true;\n let passedRef = void 0;\n const result = useSprings(\n length,\n (i, ctrl) => {\n const props = propsFn ? propsFn(i, ctrl) : propsArg;\n passedRef = props.ref;\n reverse = reverse && props.reverse;\n return props;\n },\n // Ensure the props function is called when no deps exist.\n // This works around the 3 argument rule.\n deps || [{}]\n );\n useIsomorphicLayoutEffect3(() => {\n each6(result[1].current, (ctrl, i) => {\n const parent = result[1].current[i + (reverse ? 1 : -1)];\n replaceRef(ctrl, passedRef);\n if (ctrl.ref) {\n if (parent) {\n ctrl.update({ to: parent.springs });\n }\n return;\n }\n if (parent) {\n ctrl.start({ to: parent.springs });\n } else {\n ctrl.start();\n }\n });\n }, deps);\n if (propsFn || arguments.length == 3) {\n const ref = passedRef ?? result[1];\n ref[\"_getProps\"] = (propsArg2, ctrl, i) => {\n const props = is10.fun(propsArg2) ? propsArg2(i, ctrl) : propsArg2;\n if (props) {\n const parent = ref.current[i + (props.reverse ? 1 : -1)];\n if (parent) props.to = parent.springs;\n return props;\n }\n };\n return result;\n }\n return result[0];\n}\n\n// src/hooks/useTransition.tsx\nimport * as React2 from \"react\";\nimport { useContext as useContext3, useRef as useRef2, useMemo as useMemo3 } from \"react\";\nimport {\n is as is11,\n toArray as toArray4,\n useForceUpdate as useForceUpdate2,\n useOnce as useOnce3,\n usePrev as usePrev2,\n each as each7,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect4\n} from \"@react-spring/shared\";\nfunction useTransition(data, props, deps) {\n const propsFn = is11.fun(props) && props;\n const {\n reset,\n sort,\n trail = 0,\n expires = true,\n exitBeforeEnter = false,\n onDestroyed,\n ref: propsRef,\n config: propsConfig\n } = propsFn ? propsFn() : props;\n const ref = useMemo3(\n () => propsFn || arguments.length == 3 ? SpringRef() : void 0,\n []\n );\n const items = toArray4(data);\n const transitions = [];\n const usedTransitions = useRef2(null);\n const prevTransitions = reset ? null : usedTransitions.current;\n useIsomorphicLayoutEffect4(() => {\n usedTransitions.current = transitions;\n });\n useOnce3(() => {\n each7(transitions, (t) => {\n ref?.add(t.ctrl);\n t.ctrl.ref = ref;\n });\n return () => {\n each7(usedTransitions.current, (t) => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n }\n detachRefs(t.ctrl, ref);\n t.ctrl.stop(true);\n });\n };\n });\n const keys = getKeys(items, propsFn ? propsFn() : props, prevTransitions);\n const expired = reset && usedTransitions.current || [];\n useIsomorphicLayoutEffect4(\n () => each7(expired, ({ ctrl, item, key }) => {\n detachRefs(ctrl, ref);\n callProp(onDestroyed, item, key);\n })\n );\n const reused = [];\n if (prevTransitions)\n each7(prevTransitions, (t, i) => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n expired.push(t);\n } else {\n i = reused[i] = keys.indexOf(t.key);\n if (~i) transitions[i] = t;\n }\n });\n each7(items, (item, i) => {\n if (!transitions[i]) {\n transitions[i] = {\n key: keys[i],\n item,\n phase: \"mount\" /* MOUNT */,\n ctrl: new Controller()\n };\n transitions[i].ctrl.item = item;\n }\n });\n if (reused.length) {\n let i = -1;\n const { leave } = propsFn ? propsFn() : props;\n each7(reused, (keyIndex, prevIndex) => {\n const t = prevTransitions[prevIndex];\n if (~keyIndex) {\n i = transitions.indexOf(t);\n transitions[i] = { ...t, item: items[keyIndex] };\n } else if (leave) {\n transitions.splice(++i, 0, t);\n }\n });\n }\n if (is11.fun(sort)) {\n transitions.sort((a, b) => sort(a.item, b.item));\n }\n let delay = -trail;\n const forceUpdate = useForceUpdate2();\n const defaultProps = getDefaultProps(props);\n const changes = /* @__PURE__ */ new Map();\n const exitingTransitions = useRef2(/* @__PURE__ */ new Map());\n const forceChange = useRef2(false);\n each7(transitions, (t, i) => {\n const key = t.key;\n const prevPhase = t.phase;\n const p = propsFn ? propsFn() : props;\n let to2;\n let phase;\n const propsDelay = callProp(p.delay || 0, key);\n if (prevPhase == \"mount\" /* MOUNT */) {\n to2 = p.enter;\n phase = \"enter\" /* ENTER */;\n } else {\n const isLeave = keys.indexOf(key) < 0;\n if (prevPhase != \"leave\" /* LEAVE */) {\n if (isLeave) {\n to2 = p.leave;\n phase = \"leave\" /* LEAVE */;\n } else if (to2 = p.update) {\n phase = \"update\" /* UPDATE */;\n } else return;\n } else if (!isLeave) {\n to2 = p.enter;\n phase = \"enter\" /* ENTER */;\n } else return;\n }\n to2 = callProp(to2, t.item, i);\n to2 = is11.obj(to2) ? inferTo(to2) : { to: to2 };\n if (!to2.config) {\n const config2 = propsConfig || defaultProps.config;\n to2.config = callProp(config2, t.item, i, phase);\n }\n delay += trail;\n const payload = {\n ...defaultProps,\n // we need to add our props.delay value you here.\n delay: propsDelay + delay,\n ref: propsRef,\n immediate: p.immediate,\n // This prevents implied resets.\n reset: false,\n // Merge any phase-specific props.\n ...to2\n };\n if (phase == \"enter\" /* ENTER */ && is11.und(payload.from)) {\n const p2 = propsFn ? propsFn() : props;\n const from = is11.und(p2.initial) || prevTransitions ? p2.from : p2.initial;\n payload.from = callProp(from, t.item, i);\n }\n const { onResolve } = payload;\n payload.onResolve = (result) => {\n callProp(onResolve, result);\n const transitions2 = usedTransitions.current;\n const t2 = transitions2.find((t3) => t3.key === key);\n if (!t2) return;\n if (result.cancelled && t2.phase != \"update\" /* UPDATE */) {\n return;\n }\n if (t2.ctrl.idle) {\n const idle = transitions2.every((t3) => t3.ctrl.idle);\n if (t2.phase == \"leave\" /* LEAVE */) {\n const expiry = callProp(expires, t2.item);\n if (expiry !== false) {\n const expiryMs = expiry === true ? 0 : expiry;\n t2.expired = true;\n if (!idle && expiryMs > 0) {\n if (expiryMs <= 2147483647)\n t2.expirationId = setTimeout(forceUpdate, expiryMs);\n return;\n }\n }\n }\n if (idle && transitions2.some((t3) => t3.expired)) {\n exitingTransitions.current.delete(t2);\n if (exitBeforeEnter) {\n forceChange.current = true;\n }\n forceUpdate();\n }\n }\n };\n const springs = getSprings(t.ctrl, payload);\n if (phase === \"leave\" /* LEAVE */ && exitBeforeEnter) {\n exitingTransitions.current.set(t, { phase, springs, payload });\n } else {\n changes.set(t, { phase, springs, payload });\n }\n });\n const context = useContext3(SpringContext);\n const prevContext = usePrev2(context);\n const hasContext = context !== prevContext && hasProps(context);\n useIsomorphicLayoutEffect4(() => {\n if (hasContext) {\n each7(transitions, (t) => {\n t.ctrl.start({ default: context });\n });\n }\n }, [context]);\n each7(changes, (_, t) => {\n if (exitingTransitions.current.size) {\n const ind = transitions.findIndex((state) => state.key === t.key);\n transitions.splice(ind, 1);\n }\n });\n useIsomorphicLayoutEffect4(\n () => {\n each7(\n exitingTransitions.current.size ? exitingTransitions.current : changes,\n ({ phase, payload }, t) => {\n const { ctrl } = t;\n t.phase = phase;\n ref?.add(ctrl);\n if (hasContext && phase == \"enter\" /* ENTER */) {\n ctrl.start({ default: context });\n }\n if (payload) {\n replaceRef(ctrl, payload.ref);\n if ((ctrl.ref || ref) && !forceChange.current) {\n ctrl.update(payload);\n } else {\n ctrl.start(payload);\n if (forceChange.current) {\n forceChange.current = false;\n }\n }\n }\n }\n );\n },\n reset ? void 0 : deps\n );\n const renderTransitions = (render) => /* @__PURE__ */ React2.createElement(React2.Fragment, null, transitions.map((t, i) => {\n const { springs } = changes.get(t) || t.ctrl;\n const elem = render({ ...springs }, t.item, t, i);\n const key = is11.str(t.key) || is11.num(t.key) ? t.key : t.ctrl.id;\n const isLegacyReact = React2.version < \"19.0.0\";\n const props2 = elem?.props ?? {};\n const elemRef = isLegacyReact ? elem?.ref : props2?.ref;\n return elem && elem.type ? /* @__PURE__ */ React2.createElement(elem.type, { ...props2, key, ref: elemRef }) : elem;\n }));\n return ref ? [renderTransitions, ref] : renderTransitions;\n}\nvar nextKey = 1;\nfunction getKeys(items, { key, keys = key }, prevTransitions) {\n if (keys === null) {\n const reused = /* @__PURE__ */ new Set();\n return items.map((item) => {\n const t = prevTransitions && prevTransitions.find(\n (t2) => t2.item === item && t2.phase !== \"leave\" /* LEAVE */ && !reused.has(t2)\n );\n if (t) {\n reused.add(t);\n return t.key;\n }\n return nextKey++;\n });\n }\n return is11.und(keys) ? items : is11.fun(keys) ? items.map(keys) : toArray4(keys);\n}\n\n// src/hooks/useScroll.ts\nimport { each as each8, onScroll, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect5 } from \"@react-spring/shared\";\nvar useScroll = ({\n container,\n ...springOptions\n} = {}) => {\n const [scrollValues, api] = useSpring(\n () => ({\n scrollX: 0,\n scrollY: 0,\n scrollXProgress: 0,\n scrollYProgress: 0,\n ...springOptions\n }),\n []\n );\n useIsomorphicLayoutEffect5(() => {\n const cleanupScroll = onScroll(\n ({ x, y }) => {\n api.start({\n scrollX: x.current,\n scrollXProgress: x.progress,\n scrollY: y.current,\n scrollYProgress: y.progress\n });\n },\n { container: container?.current || void 0 }\n );\n return () => {\n each8(Object.values(scrollValues), (value) => value.stop());\n cleanupScroll();\n };\n }, []);\n return scrollValues;\n};\n\n// src/hooks/useResize.ts\nimport { onResize, each as each9, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect6 } from \"@react-spring/shared\";\nvar useResize = ({\n container,\n ...springOptions\n}) => {\n const [sizeValues, api] = useSpring(\n () => ({\n width: 0,\n height: 0,\n ...springOptions\n }),\n []\n );\n useIsomorphicLayoutEffect6(() => {\n const cleanupScroll = onResize(\n ({ width, height }) => {\n api.start({\n width,\n height,\n immediate: sizeValues.width.get() === 0 || sizeValues.height.get() === 0 || springOptions.immediate === true\n });\n },\n { container: container?.current || void 0 }\n );\n return () => {\n each9(Object.values(sizeValues), (value) => value.stop());\n cleanupScroll();\n };\n }, []);\n return sizeValues;\n};\n\n// src/hooks/useInView.ts\nimport { useRef as useRef3, useState as useState2 } from \"react\";\nimport { is as is12, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect7 } from \"@react-spring/shared\";\nvar defaultThresholdOptions = {\n any: 0,\n all: 1\n};\nfunction useInView(props, args) {\n const [isInView, setIsInView] = useState2(false);\n const ref = useRef3(void 0);\n const propsFn = is12.fun(props) && props;\n const springsProps = propsFn ? propsFn() : {};\n const { to: to2 = {}, from = {}, ...restSpringProps } = springsProps;\n const intersectionArguments = propsFn ? args : props;\n const [springs, api] = useSpring(() => ({ from, ...restSpringProps }), []);\n useIsomorphicLayoutEffect7(() => {\n const element = ref.current;\n const {\n root,\n once,\n amount = \"any\",\n ...restArgs\n } = intersectionArguments ?? {};\n if (!element || once && isInView || typeof IntersectionObserver === \"undefined\")\n return;\n const activeIntersections = /* @__PURE__ */ new WeakMap();\n const onEnter = () => {\n if (to2) {\n api.start(to2);\n }\n setIsInView(true);\n const cleanup = () => {\n if (from) {\n api.start(from);\n }\n setIsInView(false);\n };\n return once ? void 0 : cleanup;\n };\n const handleIntersection = (entries) => {\n entries.forEach((entry) => {\n const onLeave = activeIntersections.get(entry.target);\n if (entry.isIntersecting === Boolean(onLeave)) {\n return;\n }\n if (entry.isIntersecting) {\n const newOnLeave = onEnter();\n if (is12.fun(newOnLeave)) {\n activeIntersections.set(entry.target, newOnLeave);\n } else {\n observer.unobserve(entry.target);\n }\n } else if (onLeave) {\n onLeave();\n activeIntersections.delete(entry.target);\n }\n });\n };\n const observer = new IntersectionObserver(handleIntersection, {\n root: root && root.current || void 0,\n threshold: typeof amount === \"number\" || Array.isArray(amount) ? amount : defaultThresholdOptions[amount],\n ...restArgs\n });\n observer.observe(element);\n return () => observer.unobserve(element);\n }, [intersectionArguments]);\n if (propsFn) {\n return [ref, springs];\n }\n return [ref, isInView];\n}\n\n// src/components/Spring.tsx\nfunction Spring({ children, ...props }) {\n return children(useSpring(props));\n}\n\n// src/components/Trail.tsx\nimport { is as is13 } from \"@react-spring/shared\";\nfunction Trail({\n items,\n children,\n ...props\n}) {\n const trails = useTrail(items.length, props);\n return items.map((item, index) => {\n const result = children(item, index);\n return is13.fun(result) ? result(trails[index]) : result;\n });\n}\n\n// src/components/Transition.tsx\nfunction Transition({\n items,\n children,\n ...props\n}) {\n return useTransition(items, props)(children);\n}\n\n// src/interpolate.ts\nimport { deprecateInterpolate as deprecateInterpolate2 } from \"@react-spring/shared\";\n\n// src/Interpolation.ts\nimport {\n is as is14,\n raf as raf5,\n each as each10,\n isEqual as isEqual2,\n toArray as toArray5,\n frameLoop as frameLoop3,\n getFluidValue as getFluidValue3,\n createInterpolator,\n Globals as G6,\n callFluidObservers as callFluidObservers3,\n addFluidObserver as addFluidObserver3,\n removeFluidObserver as removeFluidObserver2,\n hasFluidValue as hasFluidValue2\n} from \"@react-spring/shared\";\nimport {\n getAnimated as getAnimated3,\n setAnimated as setAnimated2,\n getAnimatedType as getAnimatedType2,\n getPayload as getPayload2\n} from \"@react-spring/animated\";\nvar Interpolation = class extends FrameValue {\n constructor(source, args) {\n super();\n this.source = source;\n /** Equals false when in the frameloop */\n this.idle = true;\n /** The inputs which are currently animating */\n this._active = /* @__PURE__ */ new Set();\n this.calc = createInterpolator(...args);\n const value = this._get();\n const nodeType = getAnimatedType2(value);\n setAnimated2(this, nodeType.create(value));\n }\n advance(_dt) {\n const value = this._get();\n const oldValue = this.get();\n if (!isEqual2(value, oldValue)) {\n getAnimated3(this).setValue(value);\n this._onChange(value, this.idle);\n }\n if (!this.idle && checkIdle(this._active)) {\n becomeIdle(this);\n }\n }\n _get() {\n const inputs = is14.arr(this.source) ? this.source.map(getFluidValue3) : toArray5(getFluidValue3(this.source));\n return this.calc(...inputs);\n }\n _start() {\n if (this.idle && !checkIdle(this._active)) {\n this.idle = false;\n each10(getPayload2(this), (node) => {\n node.done = false;\n });\n if (G6.skipAnimation) {\n raf5.batchedUpdates(() => this.advance());\n becomeIdle(this);\n } else {\n frameLoop3.start(this);\n }\n }\n }\n // Observe our sources only when we're observed.\n _attach() {\n let priority = 1;\n each10(toArray5(this.source), (source) => {\n if (hasFluidValue2(source)) {\n addFluidObserver3(source, this);\n }\n if (isFrameValue(source)) {\n if (!source.idle) {\n this._active.add(source);\n }\n priority = Math.max(priority, source.priority + 1);\n }\n });\n this.priority = priority;\n this._start();\n }\n // Stop observing our sources once we have no observers.\n _detach() {\n each10(toArray5(this.source), (source) => {\n if (hasFluidValue2(source)) {\n removeFluidObserver2(source, this);\n }\n });\n this._active.clear();\n becomeIdle(this);\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n if (event.idle) {\n this.advance();\n } else {\n this._active.add(event.parent);\n this._start();\n }\n } else if (event.type == \"idle\") {\n this._active.delete(event.parent);\n } else if (event.type == \"priority\") {\n this.priority = toArray5(this.source).reduce(\n (highest, parent) => Math.max(highest, (isFrameValue(parent) ? parent.priority : 0) + 1),\n 0\n );\n }\n }\n};\nfunction isIdle(source) {\n return source.idle !== false;\n}\nfunction checkIdle(active) {\n return !active.size || Array.from(active).every(isIdle);\n}\nfunction becomeIdle(self) {\n if (!self.idle) {\n self.idle = true;\n each10(getPayload2(self), (node) => {\n node.done = true;\n });\n callFluidObservers3(self, {\n type: \"idle\",\n parent: self\n });\n }\n}\n\n// src/interpolate.ts\nvar to = (source, ...args) => new Interpolation(source, args);\nvar interpolate = (source, ...args) => (deprecateInterpolate2(), new Interpolation(source, args));\n\n// src/globals.ts\nimport {\n Globals,\n frameLoop as frameLoop4,\n createStringInterpolator\n} from \"@react-spring/shared\";\nGlobals.assign({\n createStringInterpolator,\n to: (source, args) => new Interpolation(source, args)\n});\nvar update = frameLoop4.advance;\n\n// src/index.ts\nimport {\n createInterpolator as createInterpolator2,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect8,\n useReducedMotion,\n easings as easings2\n} from \"@react-spring/shared\";\nexport * from \"@react-spring/types\";\nexport {\n BailSignal,\n Controller,\n FrameValue,\n Globals,\n Interpolation,\n Spring,\n SpringContext,\n SpringRef,\n SpringValue,\n Trail,\n Transition,\n config,\n createInterpolator2 as createInterpolator,\n easings2 as easings,\n inferTo,\n interpolate,\n to,\n update,\n useChain,\n useInView,\n useIsomorphicLayoutEffect8 as useIsomorphicLayoutEffect,\n useReducedMotion,\n useResize,\n useScroll,\n useSpring,\n useSpringRef,\n useSpringValue,\n useSprings,\n useTrail,\n useTransition\n};\n","// src/index.ts\nimport { applyProps, addEffect } from \"@react-three/fiber\";\nimport { Globals } from \"@react-spring/core\";\nimport { createStringInterpolator, colors, raf } from \"@react-spring/shared\";\nimport { createHost } from \"@react-spring/animated\";\n\n// src/primitives.ts\nimport * as THREE from \"three\";\nimport \"@react-three/fiber\";\nvar primitives = [\"primitive\"].concat(\n Object.keys(THREE).filter((key) => /^[A-Z]/.test(key)).map((key) => key[0].toLowerCase() + key.slice(1))\n);\n\n// src/index.ts\nexport * from \"@react-spring/core\";\nGlobals.assign({\n createStringInterpolator,\n colors,\n frameLoop: \"demand\"\n});\naddEffect(() => {\n raf.advance();\n});\nvar host = createHost(primitives, {\n applyAnimatedValues: applyProps\n});\nvar animated = host.animated;\nexport {\n animated as a,\n animated\n};\n","import {Box3, Box3Helper, Color, Mesh, type Object3D, Quaternion, type Scene, Vector3} from 'three';\nimport type {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport type {DividerType} from \"../../../types/divider.types.ts\";\n\nexport interface NeighborHit {\n source:ElemPartType |DividerType\n elemType: ElemPartType | DividerType;\n thk: number;\n treeId: string;\n}\n\nexport interface ScanResult {\n left: NeighborHit | null;\n right: NeighborHit | null;\n top: NeighborHit | null;\n bottom: NeighborHit | null;\n debugHelpers?: Object3D[];\n}\n\nconst OVERLAP = 0.004; // 40mm in normalized units\nconst DEBUG_ENABLED = false; // Set to false to disable debug visualization\n\n/**\n * Scan for neighbors using Box3 intersection.\n * Works for doors in ANY position (Front, Back, Left, Right).\n * Rotation-agnostic — operates in world space.\n */\nexport function scanNeighbors(panelMesh: Object3D, scene: Scene): ScanResult {\n const result: ScanResult = {left: null, right: null, top: null, bottom: null};\n const debugHelpers: Object3D[] = [];\n\n panelMesh.updateWorldMatrix(true, false);\n\n const panelBox = new Box3().setFromObject(panelMesh);\n const panelCenter = new Vector3();\n panelBox.getCenter(panelCenter);\n\n// Extract rotation from panel's world matrix\n const position = new Vector3();\n const quaternion = new Quaternion();\n const scale = new Vector3();\n panelMesh.matrixWorld.decompose(position, quaternion, scale);\n\n// Create rotation-only matrix and invert it\n panelBox.expandByScalar(OVERLAP);\n\n // Debug: Add helper for the expanded door bounding box (green)\n if (DEBUG_ENABLED) {\n const panelBoxHelper = new Box3Helper(panelBox, new Color(0x00ff00));\n panelBoxHelper.name = 'debug-door-box';\n scene.add(panelBoxHelper);\n debugHelpers.push(panelBoxHelper);\n }\n\n scene.traverse((obj) => {\n if (!(obj instanceof Mesh)) return;\n if (obj === panelMesh) return;\n if (!obj.userData?.elemType) return;\n\n const objBox = new Box3().setFromObject(obj);\n if (!panelBox.intersectsBox(objBox)) return;\n\n const objCenter = new Vector3();\n objBox.getCenter(objCenter);\n\n // World-space difference vector\n const worldDiff = objCenter.clone().sub(panelCenter);\n\n const hit: NeighborHit = {\n source:obj.userData.source,\n elemType: obj.userData.elemType,\n thk: obj.userData.thk || 0,\n treeId: obj.userData.treeId || '',\n };\n\n // Use world-space differences for classification\n // After scene rotation (-Math.PI/2 around X):\n // World X = left/right\n // World Y = top/bottom (negative Y = bottom, positive Y = top)\n // World Z = depth (front/back)\n const absX = Math.abs(worldDiff.x); // left/right\n const absY = Math.abs(worldDiff.y); // top/bottom\n\n // Side panels have significant X offset, shelves have significant Y offset\n if (absX > 0.05) {\n // Horizontal neighbor (left or right) - side panels\n if (worldDiff.x > 0) result.right = hit;\n else result.left = hit;\n } else if (absY > 0.05) {\n // Vertical neighbor (top or bottom) - shelves/dividers\n if (worldDiff.y > 0) result.top = hit;\n else result.bottom = hit;\n }\n });\n\n return result;\n}\n","import type {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\nexport function calculateHitOversize(joinedPartType:ElemPartType | DividerType, thk : number ): number{\n if (joinedPartType === DividerType.sidePanel){\n return thk\n }else if (joinedPartType === DividerType.botShelf || joinedPartType === DividerType.topShelf) return thk\n else if (joinedPartType === DividerType.adjShelf || joinedPartType === DividerType.fixShelf) return thk / 2\n return 0\n}","import {useEffect, useRef, useState} from 'react';\nimport {type Mesh} from 'three';\nimport {useThree} from '@react-three/fiber';\nimport {scanNeighbors, type ScanResult} from './ScanNeighbors';\nimport PD_3D from '../../elements_manager/PD_3D';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DoorResult} from \"../../../construction_principle/door/DoorHelper.ts\";\nimport {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {calculateHitOversize} from \"./calculateHitOversize.ts\";\n\ninterface DoorSensorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n doorCp?:DoorResult\n ddHingePosition?:'left' | 'right'\n}\n\nexport default function DoorSensor({panelWidth, panelHeight, panelThk, renderMat, treeId, doorCp, ddHingePosition}: DoorSensorProps) {\n const meshRef = useRef<Mesh>(null);\n const {scene} = useThree();\n const [oversize, setOversize] = useState({left: 0, right: 0, top: 0, bottom: 0});\n const hasScanned = useRef(false);\n if (!doorCp) return\n\n useEffect(() => {\n if (!meshRef.current || hasScanned.current || doorCp.construction === 'inset') return;\n\n const id = requestAnimationFrame(() => {\n if (!meshRef.current) return;\n\n const result: ScanResult = scanNeighbors(meshRef.current, scene);\n const topOversize = result.top ? calculateHitOversize(result.top?.elemType,result.top?.thk || 0) : 0\n const bottomOversize = result.bottom ? calculateHitOversize(result.bottom?.elemType,result.bottom?.thk || 0) : 0\n\n if (doorCp.doorCount === 'double'){\n if (ddHingePosition === 'left'){\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }else { // right hinges\n setOversize({\n left: 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }\n }else {\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }\n\n hasScanned.current = true;\n });\n\n return () => cancelAnimationFrame(id);\n }, [panelWidth, panelHeight]);\n\n let w = panelWidth + oversize.left + oversize.right;\n let h = panelHeight + oversize.top + oversize.bottom;\n\n // Compute position offset to keep drawer centered in zone\n const offsetX = -(oversize.bottom - oversize.top) / 2; // height axis offset\n const offsetY = (oversize.left - oversize.right) / 2; // width axis offset\n\n return (\n <>\n <group position={[offsetX / DIM_NORM, offsetY / DIM_NORM, 0]}>\n <PD_3D\n meshRef={meshRef}\n length={h / DIM_NORM}\n width={w / DIM_NORM}\n thk={panelThk / DIM_NORM}\n treeId={treeId}\n render_mat={renderMat}\n elemInfo={{source:\"elem\",elemType: ElemPartType.Door, thk: panelThk, treeId}}\n />\n </group>\n\n </>\n\n );\n}\n","import { createContext } from 'react';\n\nexport interface ArticleHoverContextValue {\n isHovered: boolean;\n setIsHovered: (value: boolean) => void;\n}\n\nexport const ArticleHoverContext = createContext<ArticleHoverContextValue | undefined>(undefined);","import { useContext } from 'react';\nimport { ArticleHoverContext, type ArticleHoverContextValue } from './ArticleHoverContext';\n\nexport function useArticleHover(): ArticleHoverContextValue {\n const context = useContext(ArticleHoverContext);\n if (!context) {\n throw new Error('useArticleHover must be used within ArticleHoverProvider');\n }\n return context;\n}","import {animated, useSpring} from '@react-spring/three';\nimport DoorSensor from './DoorSensor';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DoorResult} from '../../../construction_principle/door/DoorHelper';\nimport {useArticleHover} from \"../../../contexts/article-hover/useArticleHover.ts\";\n\ninterface DoorAnimatorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n doorCp: DoorResult;\n}\n\ninterface HingeConfig {\n pivot: [number, number, number];\n offset: [number, number, number];\n axis: 'x' | 'y';\n openAngle: number;\n}\n\n/**\n * PD_3D local space: X = height, Y = width, Z = thk\n * DoorSensor offsets the mesh by [0, -w/2/N, 0] so right edge sits at Y=0\n *\n * left/right hinges → rotate around X (height axis)\n * top/bottom hinges → rotate around Y (width axis)\n */\nfunction getHingeConfig(hingePosition: string, w: number, h: number, thk:number): HingeConfig {\n const N = DIM_NORM;\n const nThk = thk / DIM_NORM; // thk/2 in scene units\n\n switch (hingePosition) {\n case 'right':\n // return {pivot: [0, -w / 2 / N -nThk,0 ], offset: [0, w / N +nThk, 0], axis: 'x', openAngle: Math.PI / 2}; // works for double door right but does not work for single door right\n return {pivot: [0, -w /2 / N - nThk,0 ], offset: [0, w/2 / N +nThk, 0], axis: 'x', openAngle: Math.PI / 2}; // works for single door right but does not for double door right\n case 'top':\n return {pivot: [h / (2 * N), w / 2 / N, 0], offset: [-h / (2 * N), 0, 0], axis: 'y', openAngle: Math.PI / 2};\n case 'bottom':\n return {pivot: [-h / (2 * N), w / 2 / N, 0], offset: [h / (2 * N), 0, 0], axis: 'y', openAngle: -Math.PI / 2};\n case 'left':\n default:\n return {pivot: [0, w / 2 / N + nThk, 0], offset: [0, -w/2 / N -nThk, 0], axis: 'x', openAngle: -Math.PI / 2};// works for single and double door left\n }\n}\n\ninterface DoorPanelProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n config: HingeConfig;\n isHovered: boolean;\n doorCp?:DoorResult\n ddHingePosition?:'left'|'right'\n}\n\nfunction DoorPanel({panelWidth, panelHeight, panelThk, renderMat, treeId, config, isHovered, doorCp,ddHingePosition}: DoorPanelProps) {\n const {angle} = useSpring({\n angle: isHovered ? config.openAngle : 0,\n config: {mass: 1, tension: 120, friction: 20},\n });\n\n const rotX = config.axis === 'x' ? angle : 0;\n const rotY = config.axis === 'y' ? angle : 0;\n\n return (\n <group position={config.pivot}>\n <animated.group rotation-x={rotX} rotation-y={rotY}>\n <group position={config.offset}>\n <DoorSensor panelWidth={panelWidth} panelHeight={panelHeight}\n panelThk={panelThk} renderMat={renderMat} treeId={treeId} doorCp={doorCp} ddHingePosition={ddHingePosition}/>\n </group>\n </animated.group>\n </group>\n );\n}\n\nexport default function DoorAnimator({\n panelWidth,\n panelHeight,\n panelThk,\n renderMat,\n treeId,\n doorCp\n }: DoorAnimatorProps) {\n const {isHovered} = useArticleHover()\n // const [isOpen, setIsOpen] = useState(false);\n\n // Single door (standard or flap): hingePosition decides everything\n const config = getHingeConfig(doorCp.hingePosition, panelWidth, panelHeight, panelThk);\n\n // Double door: two half-width panels, left + right hinges\n if (doorCp.doorCount === 'double') {\n const halfW = panelWidth / 2\n const leftConfig = getHingeConfig('left', halfW, panelHeight, panelThk);\n const rightConfig = getHingeConfig('right', halfW, panelHeight, panelThk);\n\n return (\n <group >\n <group position={[0, halfW / 2 / DIM_NORM + panelThk/2/DIM_NORM, 0]}>\n <DoorPanel panelWidth={halfW} panelHeight={panelHeight} panelThk={panelThk} isHovered={isHovered}\n renderMat={renderMat} treeId={treeId + '_L'} config={leftConfig} doorCp={doorCp} ddHingePosition={'left'}/>\n </group>\n <group position={[0, -halfW/2 / DIM_NORM - panelThk/2/DIM_NORM, 0]}>\n <DoorPanel panelWidth={halfW } panelHeight={panelHeight} panelThk={panelThk} isHovered={isHovered}\n renderMat={renderMat} treeId={treeId + '_R'} config={rightConfig} doorCp={doorCp} ddHingePosition={'right'}/>\n </group>\n </group>\n );\n }\n\n return (\n <group >\n <DoorPanel panelWidth={panelWidth} panelHeight={panelHeight} panelThk={panelThk}\n doorCp={doorCp} renderMat={renderMat} treeId={treeId} config={config} isHovered={isHovered}/>\n </group>\n );\n}\n","import PD_3D from \"../../elements_manager/PD_3D.tsx\";\r\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\r\nimport {VIEW} from \"../../../types/view.types.ts\";\r\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\r\nimport {DividerType} from \"../../../types/divider.types.ts\";\r\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\r\n\r\nexport default function Left({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.left;\r\n const cp = elemHlp?.cp\r\n\r\n let render_mat = undefined\r\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\r\n\r\n const startElem = helper.back\r\n const endElem = helper.front\r\n const {trim, oversize, thk} = elemHlp\r\n\r\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\r\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\r\n\r\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\r\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\r\n\r\n const startElemThk = startElem?.thk || 0\r\n const endElemThk = endElem?.thk || 0\r\n\r\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\r\n const endTrimThk = computeTrim('elem',cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\r\n const topTrimThk = computeTrim('elem',cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\r\n const botTrimThk = computeTrim('elem',cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\r\n\r\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + oversize.start + oversize.end\r\n const panel_thk = thk\r\n\r\n const pos_x = -(dimension.width / 2 - panel_thk / 2 - backInset - doorInset)\r\n const pos_y = (oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\r\n\r\n\r\n return (\r\n view === VIEW._3D ?\r\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, -Math.PI/2, 0]}>\r\n {isDoor(cp)\r\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\r\n : <PD_3D\r\n length={panel_length / DIM_NORM}\r\n width={panel_width / DIM_NORM}\r\n thk={panel_thk / DIM_NORM}\r\n treeId={TREEID}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\r\n elemInfo={{source:'elem',elemType: ElemPartType.SidePanel, thk: panel_thk, treeId : TREEID }}\r\n />\r\n }\r\n </group>\r\n :\r\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\r\n <PD_2D\r\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\r\n dim_y={panel_thk}\r\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\r\n treeId={TREEID}\r\n rotate={180}\r\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\r\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\r\n render_mat={render_mat}\r\n cpName={cp.name}\r\n />\r\n </g>\r\n )\r\n}","import {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\n\nexport default function Back({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.back;\n const cp = elemHlp?.cp\n let render_mat = undefined\n\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\n\n const startElem = helper.right\n const endElem = helper.left\n const {trim, oversize, thk} = elemHlp\n\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\n\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\n\n const startElemThk = startElem?.thk || 0\n const endElemThk = endElem?.thk || 0\n\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\n const endTrimThk = computeTrim('elem',cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\n const topTrimThk = computeTrim('elem',cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\n const botTrimThk = computeTrim('elem',cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\n\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + oversize.start + oversize.end\n const panel_thk = thk\n\n const pos_x = (oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_y = dimension.depth / 2 - panel_thk / 2 - backInset - doorInset\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, Math.PI, Math.PI / 2]}>\n {isDoor(cp) && cp.props.doorType\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\n :\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\n render_mat={render_mat}\n elemInfo={{source:'elem', elemType: ElemPartType.Back, thk: panel_thk}}\n />\n }\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n rotate={180}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cpName={cp.name}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {VIEW} from \"../../../types/view.types.ts\";\r\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\r\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\r\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\r\nimport {DividerType} from \"../../../types/divider.types.ts\";\r\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\r\n\r\nexport default function Right({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.right;\r\n const cp = elemHlp?.cp\r\n let render_mat = undefined\r\n\r\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\r\n\r\n const startElem = helper.front\r\n const endElem = helper.back\r\n const {trim, oversize, thk} = elemHlp\r\n\r\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\r\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\r\n\r\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\r\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\r\n\r\n const startElemThk = startElem?.thk || 0\r\n const endElemThk = endElem?.thk || 0\r\n\r\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\r\n const endTrimThk = computeTrim('elem' ,cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\r\n const topTrimThk = computeTrim('elem' ,cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\r\n const botTrimThk = computeTrim('elem' ,cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\r\n\r\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + oversize.start + oversize.end\r\n const panel_thk = thk\r\n\r\n const pos_x = (dimension.width / 2 - panel_thk / 2 - backInset - doorInset)\r\n const pos_y = -(oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\r\n\r\n\r\n return (\r\n view === VIEW._3D ?\r\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, Math.PI / 2, Math.PI]}>\r\n {isDoor(cp)\r\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\r\n : <PD_3D\r\n length={panel_length / DIM_NORM}\r\n width={panel_width / DIM_NORM}\r\n thk={panel_thk / DIM_NORM}\r\n treeId={TREEID}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\r\n elemInfo={{source:'elem',elemType: ElemPartType.SidePanel, thk: panel_thk, treeId : TREEID }}\r\n />\r\n }\r\n </group>\r\n :\r\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\r\n <PD_2D\r\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\r\n dim_y={panel_thk}\r\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\r\n treeId={TREEID}\r\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\r\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\r\n render_mat={render_mat}\r\n cpName={cp.name}\r\n />\r\n </g>\r\n )\r\n}","// ============================================================================\n// LINDIV RESOLVER\n// Resolves lindiv expressions with units and ratios\n// Example: \"(round($P_WIDTH/1200 -0.5)*1200)mm:1\"\n// ============================================================================\n\nimport { resolve } from './ExpressionResolver';\nimport type { VariableTree } from '../variables/VariableResolver';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface LindivResult {\n /** Resolved lindiv string in original format (e.g., \"3600mm:1\", \"1:1800mm\") */\n value: string;\n\n /** Original input string */\n original: string;\n\n /** Whether this is a reference (starts with # or is article name) */\n isReference: boolean;\n}\n\n// ============================================================================\n// HELPER FOR n* FORMAT\n// ============================================================================\n\n/**\n * Helper to handle lindiv expressions with n* markers\n * Format: \"expr1 mm:n*expr2 mm:n*expr3 mm:1\"\n *\n * Strategy:\n * 1. Split by ':' to get sections\n * 2. Track which sections have 'n*' prefix\n * 3. Remove 'n*' from sections\n * 4. Evaluate each section using ExpressionResolver\n * 5. Reconstruct with 'n*' markers restored\n */\nfunction resolveWithNStar(\n lindiv: string,\n variableTree?: VariableTree\n): string {\n // Split by ':' to get all sections\n const sections = lindiv.split(':');\n\n // Track which sections have n* and remove it\n const sectionData = sections.map(section => {\n const trimmed = section.trim();\n const hasNStar = trimmed.startsWith('n*');\n const cleaned = hasNStar ? trimmed.substring(2).trim() : trimmed;\n return { hasNStar, cleaned };\n });\n\n // Evaluate each section separately\n const evaluatedSections = sectionData.map(({ cleaned }) => {\n // Each section could be:\n // - An expression with units: \"expr mm\" or \"(expr) mm\"\n // - Just a number: \"1\"\n // - A simple expression: \"expr\"\n\n // Use the resolve function from ExpressionResolver to handle expressions with units\n const result = resolve(cleaned, {\n variableTree,\n allowFunctions: true,\n dataType: 'FL',\n silent: true\n });\n\n // If the section had a unit (mm, cm), preserve it in the output\n if (cleaned.includes('mm')) {\n return `${result.value}mm`;\n } else if (cleaned.includes('cm')) {\n return `${result.value}cm`;\n } else {\n return String(result.value);\n }\n });\n\n // Reconstruct with n* markers\n const result = evaluatedSections.map((value, i) => {\n return sectionData[i].hasNStar ? `n*${value}` : value;\n }).join(':');\n\n return result;\n}\n\n// ============================================================================\n// MAIN RESOLVER\n// ============================================================================\n\n/**\n * Resolve lindiv expressions and return in original format\n *\n * Handles:\n * - Simple ratios: \"1:1\", \"2:1\" → \"1:1\"\n * - References: \"#RP_LD_P_T100\" → \"RP_LD_P_T100\"\n * - Expressions: \"(round(4000/1200 -0.5)*1200)mm:1\" → \"3600mm:1\"\n * - Reverse format: \"1:((round(2700/150))*150)mm\" → \"1:1800mm\"\n * - With braces: \"(round(X/150))*{1}\" → \"24*{1}\"\n * - With n* markers: \"expr1 mm:n*expr2 mm:1\" → \"3600mm:n*3598mm:1\"\n * - With variables: Assumes variables are already resolved\n *\n * @example\n * resolveLindiv(\"(round(4000/1200 -0.5)*1200)mm:1\")\n * // → \"3600mm:1\"\n *\n * @example\n * resolveLindiv(\"1:((round(2700/150))*150)mm\")\n * // → \"1:1800mm\"\n *\n * @example\n * resolveLindiv(\"#RP_LD_P_T100\")\n * // → \"RP_LD_P_T100\" (removes #)\n *\n * @example\n * resolveLindiv(\"expr1 mm:n*expr2 mm:1\", variableTree)\n * // → \"3600mm:n*3598mm:1\"\n */\nexport function resolveLindiv(\n lindiv: string,\n variableTree?: VariableTree\n): LindivResult {\n const original = lindiv;\n\n // Check if it's a reference (descriptor or article name)\n if (isLindivReference(lindiv)) {\n const value = lindiv.startsWith('#') ? lindiv.slice(1) : lindiv;\n return {\n value,\n original,\n isReference: true\n };\n }\n\n // Check if it's a simple ratio (e.g., \"1:1\", \"2:1\")\n if (/^\\d+:\\d+$/.test(lindiv)) {\n return {\n value: lindiv,\n original,\n isReference: false\n };\n }\n\n // Check if it contains n* OR is a multi-segment lindiv (more than one :)\n // Examples: \"2 mm:1:($VAR) mm:1:($VAR) mm\" has 4 colons = multi-segment\n const colonCount = (lindiv.match(/:/g) || []).length;\n if (lindiv.includes('n*') || colonCount > 1) {\n const value = resolveWithNStar(lindiv, variableTree);\n return {\n value,\n original,\n isReference: false\n };\n }\n\n // Parse the lindiv expression\n const { format, expression, suffix } = parseLindiv(lindiv);\n\n // Clean expression: remove units that appear inside (like \"12 mm\")\n // Keep them as part of the expression for now (they'll be handled by resolve)\n let cleanExpression = expression;\n\n // Remove outer parentheses if present\n cleanExpression = cleanExpression.replace(/^\\((.+)\\)$/, '$1');\n\n // Resolve the expression\n const result = resolve(cleanExpression, {\n variableTree,\n allowFunctions: true, // Enable round(), floor(), etc.\n dataType: 'FL',\n silent: true\n });\n\n // Get the evaluated value\n const evaluatedValue = result.value ?? expression;\n\n // Reconstruct in original format\n let finalValue: string;\n\n switch (format) {\n case 'expr:ratio':\n // Format: \"expression mm:ratio\" → \"3600mm:1\"\n finalValue = `${evaluatedValue}${suffix}`;\n break;\n\n case 'ratio:expr':\n // Format: \"ratio:expression mm\" → \"1:1800mm\"\n finalValue = `${suffix}${evaluatedValue}`;\n break;\n\n case 'expr*{ratio}':\n // Format: \"expression*{ratio}\" → \"24*{1}\"\n finalValue = `${evaluatedValue}${suffix}`;\n break;\n\n case 'simple':\n // Format: \"expression\" → \"3600\"\n finalValue = String(evaluatedValue);\n break;\n }\n\n return {\n value: finalValue,\n original,\n isReference: false\n };\n}\n\n/**\n * Simpler version that just returns the resolved string value\n *\n * @example\n * resolveLindivValue(\"(round(4000/1200 -0.5)*1200)mm:1\")\n * // → \"3600mm:1\"\n */\nexport function resolveLindivValue(\n lindiv: string,\n variableTree?: VariableTree\n): string {\n return resolveLindiv(lindiv, variableTree).value;\n}\n\n// ============================================================================\n// PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parse lindiv expression into parts\n *\n * Handles multiple formats:\n * - \"expression mm:ratio\" → (round(4000/1200)*1200)mm:1\n * - \"ratio:expression mm\" → 1:((round(2700/150))*150)mm\n * - \"expression*{ratio}\" → (round(X/150))*{1}\n * - \"expression:ratio\" → round(X):1\n *\n * @example\n * parseLindiv(\"(round(4000/1200)*1200)mm:1\")\n * // → { format: 'expr:ratio', expression: 'round(4000/1200)*1200', suffix: 'mm:1' }\n */\nfunction parseLindiv(lindiv: string): {\n format: 'expr:ratio' | 'ratio:expr' | 'expr*{ratio}' | 'simple';\n expression: string;\n suffix: string;\n} {\n const trimmed = lindiv.trim();\n\n // Remove outer parentheses if they wrap the entire expression\n const cleanInput = trimmed.replace(/^\\((.+)\\)$/, '$1');\n\n // Pattern 1: \"1:expression mm\" or \"n:expression mm\" (ratio first)\n // Examples: \"1:((round(2700/150))*150)mm\", \"1:n*((X)/round((X)/150))mm\"\n const ratioFirstMatch = cleanInput.match(/^(\\d+|n):(.+?)(mm|cm)?$/);\n if (ratioFirstMatch) {\n const [, ratio, expr, unit] = ratioFirstMatch;\n return {\n format: 'ratio:expr',\n expression: expr.trim(),\n suffix: unit ? `${ratio}:${unit}` : `${ratio}:`\n };\n }\n\n // Pattern 2: \"expression mm:ratio\" (most common)\n // Examples: \"(round(4000/1200)*1200)mm:1\"\n const exprRatioMatch = cleanInput.match(/^(.+?)(mm|cm)?\\s*:(\\d+)$/);\n if (exprRatioMatch) {\n const [, expr, unit, ratio] = exprRatioMatch;\n return {\n format: 'expr:ratio',\n expression: expr.trim(),\n suffix: unit ? `${unit}:${ratio}` : `:${ratio}`\n };\n }\n\n // Pattern 3: \"expression*{ratio}\" or \"expression{ratio}\"\n // Examples: \"(round(X/150))*{1}\", \"(round(X/150)){1}\"\n const bracesMatch = cleanInput.match(/^(.+?)(\\*)?{(\\d+)}$/);\n if (bracesMatch) {\n const [, expr, star, ratio] = bracesMatch;\n return {\n format: 'expr*{ratio}',\n expression: expr.trim(),\n suffix: star ? `*{${ratio}}` : `{${ratio}}`\n };\n }\n\n // Pattern 4: Simple expression without suffix\n // Examples: \"1200\", \"round(X)\"\n return {\n format: 'simple',\n expression: cleanInput,\n suffix: ''\n };\n}\n\n/**\n * Check if lindiv is a reference (descriptor name or article name)\n */\nexport function isLindivReference(lindiv: string): boolean {\n // Starts with # (descriptor reference)\n if (lindiv.startsWith('#')) return true;\n\n // Contains parentheses (expression)\n if (lindiv.includes('(')) return false;\n\n // Contains operators (expression)\n if (/[+\\-*/]/.test(lindiv)) return false;\n\n // Contains only alphanumeric, underscore, hyphen (likely a name)\n if (/^[A-Za-z0-9_-]+$/.test(lindiv)) return true;\n\n // Simple ratio pattern\n if (/^\\d+:\\d+$/.test(lindiv)) return false;\n\n // Otherwise, treat as reference\n return true;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a lindiv expression contains variables\n */\nexport function lindivHasVariables(lindiv: string): boolean {\n return /\\$[A-Za-z_][A-Za-z0-9_]*/.test(lindiv);\n}\n\n/**\n * Extract variable names from lindiv\n */\nexport function extractLindivVariables(lindiv: string): string[] {\n const matches = lindiv.matchAll(/\\$([A-Za-z_][A-Za-z0-9_]*)/g);\n return Array.from(matches, match => match[1]);\n}\n\n/**\n * Format lindiv result back to string\n * Since value is already formatted, this just adds # for references\n */\nexport function formatLindiv(result: LindivResult): string {\n if (result.isReference) {\n return `#${result.value}`;\n }\n return result.value;\n}\n","import {useMemo} from 'react';\r\nimport {useDescriptorEvaluation} from '../contexts/descriptor/useDescriptor.ts';\r\nimport {type DividerMode, isArticle, isLinearDivision} from '../types/divider.types';\r\nimport {resolveLindivValue} from \"../helpers/LindivResolver.ts\";\r\nimport type {DescriptorManager} from \"../descriptor/services/DescriptorManager.ts\";\r\nimport {type VariableTree} from \"../variables/VariableResolver.ts\";\r\n\r\nexport interface UseZoneDescriptorOptions {\r\n inputData: Record<string, unknown>\r\n divider: DividerMode\r\n descriptorManager: DescriptorManager,\r\n variableTree: VariableTree,\r\n resolveVarRecursive: (str: string) => string,\r\n}\r\n\r\nexport function ZoneDivider({ divider, inputData, descriptorManager, variableTree, resolveVarRecursive }: UseZoneDescriptorOptions) {\r\n\r\n let descriptorName :string | undefined;\r\n if (divider) {\r\n descriptorName = isLinearDivision.descriptor(divider) ? divider.LINDIV1\r\n : isArticle.descriptor(divider) ? divider.DIVIDER\r\n : undefined\r\n }\r\n\r\n\r\n const { result, error } = useDescriptorEvaluation(descriptorManager, descriptorName, inputData, { throwOnError: false }, variableTree);\r\n\r\n if (error) console.error('error : from useDescriptorEvaluation',error)\r\n\r\n function linDivResolver(linDiv:string) : string {\r\n let resolvedVar = resolveVarRecursive(linDiv)\r\n\r\n const xValue = inputData['X']\r\n if (xValue) resolvedVar = resolvedVar.replace(/\\bX\\b/g, String(xValue))\r\n return (resolveLindivValue(resolvedVar))\r\n }\r\n\r\n const updatedDivider: DividerMode = useMemo(() => {\r\n if(isLinearDivision.descriptor(divider)){\r\n return {...divider, LINDIV1: linDivResolver(result?.lindiv || '')}\r\n }else if (isArticle.descriptor(divider)){\r\n return {...divider, DIVIDER:result?.lindiv || ''};\r\n }else {\r\n return {...divider,LINDIV1: linDivResolver(divider.LINDIV1)}\r\n }\r\n },[divider]);\r\n\r\n return {updatedDivider};\r\n}","import type {DimensionProps, PositionHelperResult} from \"../../../../types/zone.types.tsx\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport {Fragment} from \"react\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport Zone from \"../../Zone.tsx\";\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport {type DividerMode, DividerType} from \"../../../../types/divider.types.ts\";\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\nimport {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport {useZoneHelper} from \"../../../../helpers/row_data/UseZoneHelper.tsx\";\nimport {isShelf, isSidePanel} from \"../../../../construction_principle/dto/cp-dispatcher.types.ts\";\n\ntype ImosDividerType = 'width' | 'height' | 'depth' | 'article' | 'independent';\n\nconst CONFIG = {\n width: {\n rotation: [0, Math.PI / 2, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.height, width: d.depth, thk}),\n get2DTop: (d: DimensionProps, thk: number) => ({dim_x: d.depth, dim_y:thk,}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.height, dim_y: thk})\n },\n height: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n },\n depth: {\n rotation: [Math.PI / 2, 0, Math.PI / 2] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.height, width: d.width, thk}),\n get2DTop: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk}),\n get2DFront: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.height})\n },\n article: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n },\n independent: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n }\n};\n\nconst getDividerPos = (type: ImosDividerType, thk: number, d: DimensionProps) => ({\n x: type === 'width' ? d.width / 2 + thk / 2 : 0,\n y: type === 'depth' ? d.depth / 2 + thk / 2 : 0,\n z: type === 'height' ? d.height / 2 + thk / 2 : 0\n});\n\ninterface DividerProps {\n articleName:string\n childrenPositon: PositionHelperResult\n dividerThk: number\n divider: DividerMode\n view: VIEW,\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\n}\n\nexport function LinearDividerRender({articleName, divider, view, childrenPositon, dividerThk}: DividerProps) {\n const zoneHelper = useZoneHelper(divider.NAME,divider.TREEID);\n const cp = zoneHelper?.DividerCP\n\n let render_mat = undefined\n\n if (cp && isShelf(cp)) render_mat = cp.props.kms?.render\n if (cp && isSidePanel(cp)) render_mat = cp.props.kms?.render\n\n const type = childrenPositon.dividerType;\n const children = childrenPositon.childPositions;\n const cfg = CONFIG[type];\n\n return (\n children.map((child, i) => {\n const isLast = i === children.length - 1;\n const showDiv = !isLast && dividerThk !== 0;\n const divPos = getDividerPos(type, dividerThk, child.zone_dims);\n const dims_3d = cfg.get3D(child.zone_dims, dividerThk);\n const dims_2d = view === VIEW._2D_TOP ? cfg.get2DTop(child.zone_dims, dividerThk) : cfg.get2DFront(child.zone_dims, dividerThk);\n const dividerId = `${divider.TREEID} divider`;\n\n return (\n <Fragment key={i}>\n {\n <GroupWrapper view={view as VIEW} position={[child.x / DIM_NORM , child.y / DIM_NORM , child.z / DIM_NORM]} >\n <GroupWrapper view={view as VIEW} position={[divPos.x / DIM_NORM , divPos.y / DIM_NORM , divPos.z / DIM_NORM ]} rotation={cfg.rotation}>\n {showDiv &&\n <>\n {\n view === VIEW._3D ?\n <PD_3D\n length={dims_3d.length / DIM_NORM}\n width={dims_3d.width / DIM_NORM}\n thk={dims_3d.thk / DIM_NORM}\n opacity={1}\n treeId={dividerId}\n render_mat={render_mat}\n elemInfo={{source:\"divider\",elemType:DividerType.fixShelf, thk: dims_3d.thk}}\n />\n :\n <PD_2D\n {...dims_2d}\n text={dividerId}\n treeId={dividerId}\n cpName={cp?.name}\n />\n }\n </>\n }\n </GroupWrapper>\n <Zone articleName={articleName} key={`${articleName}-${child.TREEID}`} TREEID={child.TREEID} dimension={child.zone_dims} view={view}/>\n </GroupWrapper>\n }\n </Fragment>\n );\n })\n );\n}","import type {VIEW} from \"../../../../types/view.types.ts\";\r\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\r\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\r\nimport Zone from \"../../Zone.tsx\";\r\n\r\ninterface SubArticleProps {\r\n articleName: string\r\n view: VIEW,\r\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\r\n}\r\n\r\nexport default function SubArticleRender({view, remainingZone, articleName} : SubArticleProps){\r\n return (\r\n <GroupWrapper view={view} position={[remainingZone.position.x, remainingZone.position.y, remainingZone.position.z]}>\r\n <Zone key={articleName} articleName={articleName} TREEID={'0'} dimension={remainingZone.dimensions} view={view} />\r\n </GroupWrapper>\r\n )\r\n}","import {type DividerMode, isDivider} from \"../../../types/divider.types.ts\";\r\nimport {LinearDividerRender} from \"./sub_construction/LinearDividerRender.tsx\";\r\nimport type {VIEW} from \"../../../types/view.types.ts\";\r\nimport type {PositionHelperResult} from \"../../../types/zone.types.tsx\";\r\nimport {calculateRemainingZoneGeometry} from \"../../../helpers/ZoneCalculations.tsx\";\r\nimport SubArticleRender from \"./sub_construction/SubArticleRender.tsx\";\r\n\r\ninterface DividerProps {\r\n articleName: string;\r\n childrenPositon?: PositionHelperResult\r\n dividerThk: number\r\n divider: DividerMode\r\n view: VIEW,\r\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\r\n}\r\n\r\nexport default function Divider({articleName, childrenPositon, dividerThk, divider, view, remainingZone}:DividerProps){\r\n if (isDivider.linearDivision(divider)){\r\n if (!childrenPositon) return null;\r\n return <LinearDividerRender articleName={articleName} view={view} childrenPositon={childrenPositon} dividerThk={dividerThk} divider={divider} remainingZone={remainingZone}/>\r\n }\r\n\r\n if (isDivider.article(divider)){\r\n if (!remainingZone) return null;\r\n return <SubArticleRender view={view} articleName={divider.DIVIDER} remainingZone={remainingZone} />\r\n }\r\n\r\n return null;\r\n}","import {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {\n type CpDispatcherResult,\n isBackPanel,\n isShelf\n} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\n\nexport default function Bottom({TREEID, dimension, view, helper, bottomShelfCP}: ElemProps & {bottomShelfCP?:CpDispatcherResult}) {\n const cp = bottomShelfCP\n let render_mat = undefined\n\n if (!cp || cp.name.includes('EMPTY')) return\n if (isShelf(cp)) render_mat = cp.props.kms?.render\n\n const frontTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.front?.trim.bot,'elem', helper.front?.PARTTYPE, helper.front?.thk, (isBackPanel(helper.front?.cp) ? helper.front.inset : 0 ))\n const backTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.back?.trim.bot,'elem', helper.back?.PARTTYPE, helper.back?.thk, (isBackPanel(helper.back?.cp) ? helper.back.inset : 0 ))\n const leftTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.left?.trim.bot,'elem', helper.left?.PARTTYPE, helper.left?.thk, (isBackPanel(helper.left?.cp) ? helper.left.inset : 0 ))\n const rightTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.right?.trim.bot,'elem', helper.right?.PARTTYPE, helper.right?.thk, (isBackPanel(helper.right?.cp) ? helper.right.inset : 0 ))\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = cp.thk\n\n const pos_x = leftTrimThk / 2 - rightTrimThk / 2\n const pos_y = -(backTrimThk / 2 - frontTrimThk / 2)\n const pos_z = -(dimension.height / 2 - panel_thk / 2)\n\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n render_mat={render_mat}\n elemInfo={{source:'divider',elemType: DividerType.botShelf, thk: panel_thk, treeId : TREEID }}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n render_mat={render_mat}\n cpName={cp.name}\n />\n </g>\n )\n}","import {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {\n type CpDispatcherResult,\n isBackPanel,\n isShelf\n} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\n// Top edge in front view - uses front element data but positioned at top\nexport default function Top({TREEID, dimension, view, helper, topShelfCP} : ElemProps & {topShelfCP?:CpDispatcherResult}) {\n const cp = topShelfCP\n let render_mat = undefined\n\n if (!cp || cp.name.includes('EMPTY')) return\n if (isShelf(cp)) render_mat = cp.props.kms?.render\n\n const frontTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.front?.trim.top,'elem', helper.front?.PARTTYPE, helper.front?.thk, (isBackPanel(helper.front?.cp) ? helper.front.inset : 0 ))\n const backTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.back?.trim.top,'elem', helper.back?.PARTTYPE, helper.back?.thk, (isBackPanel(helper.back?.cp) ? helper.back.inset : 0 ))\n const leftTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.left?.trim.top,'elem', helper.left?.PARTTYPE, helper.left?.thk, (isBackPanel(helper.left?.cp) ? helper.left.inset : 0 ))\n const rightTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.right?.trim.top,'elem', helper.right?.PARTTYPE, helper.right?.thk, (isBackPanel(helper.right?.cp) ? helper.right.inset : 0 ))\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = cp.thk\n\n const pos_x = (leftTrimThk / 2 - rightTrimThk / 2)\n const pos_y = -(backTrimThk / 2 - frontTrimThk / 2)\n const pos_z = (dimension.height / 2 - panel_thk / 2)\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n render_mat={render_mat}\n elemInfo={{source:'divider',elemType: DividerType.topShelf, thk: panel_thk, treeId : TREEID }}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n render_mat={render_mat}\n cpName={cp.name}\n />\n </g>\n )\n}\n","import {useData} from \"../../contexts/article-data/useData.ts\";\nimport type {DrawerZoneDataTypes} from \"../../types/data.types.tsx\";\n\n\n\nexport default function useDrawerZoneHelper(articleName:string,TREEID:string) : DrawerZoneDataTypes | undefined{\n const {drawerZones} = useData()\n const currentDrZone = drawerZones.find((item) => item.NAME === articleName && item.ZONE_ID === TREEID)\n return currentDrZone\n}","import {useEffect, useRef, useState} from 'react';\nimport {type Mesh} from 'three';\nimport {useThree} from '@react-three/fiber';\nimport {scanNeighbors, type ScanResult} from './ScanNeighbors';\nimport PD_3D from '../../elements_manager/PD_3D';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {calculateHitOversize} from \"./calculateHitOversize.ts\";\n\ninterface DrawerSensorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n onset: boolean;\n}\n\nexport default function DrawerSensor({\n panelWidth,\n panelHeight,\n panelThk,\n renderMat,\n treeId,\n onset,\n }: DrawerSensorProps) {\n const meshRef = useRef<Mesh>(null);\n const {scene} = useThree();\n const [oversize, setOversize] = useState({left: 0, right: 0, top: 0, bottom: 0});\n const hasScanned = useRef(false);\n\n useEffect(() => {\n if (!meshRef.current || hasScanned.current || !onset) return;\n\n const id = requestAnimationFrame(() => {\n if (!meshRef.current) return;\n\n const result: ScanResult = scanNeighbors(meshRef.current, scene);\n\n // Drawers typically overlap side panels and top/bottom shelves\n const topOversize = result.top ? calculateHitOversize(result.top?.elemType, result.top?.thk || 0) : 0\n const bottomOversize = result.bottom ? calculateHitOversize(result.bottom?.elemType, result.bottom?.thk || 0) : 0\n\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: result.top ? topOversize - 2 : 0,\n bottom: result.bottom ? bottomOversize - 2 : 0,\n });\n\n hasScanned.current = true;\n });\n\n return () => cancelAnimationFrame(id);\n }, [panelWidth, panelHeight, scene]);\n\n const w = panelWidth + oversize.left + oversize.right;\n const h = panelHeight + oversize.top + oversize.bottom;\n\n // Compute position offset to keep drawer centered in zone\n const offsetX = -(oversize.bottom - oversize.top) / 2; // height axis offset\n const offsetY = (oversize.left - oversize.right) / 2; // width axis offset\n\n return (\n <group position={[offsetX / DIM_NORM, offsetY / DIM_NORM, 0]}>\n <PD_3D\n meshRef={meshRef}\n length={h / DIM_NORM}\n width={w / DIM_NORM}\n thk={panelThk / DIM_NORM}\n treeId={treeId}\n render_mat={renderMat}\n elemInfo={{source: 'elem', elemType: ElemPartType.Door, thk: panelThk, treeId}}\n />\n </group>\n );\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport DrawerSensor from \"../../helpers/DrawerSensor.tsx\";\n\nexport default function DrFront({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.front\n if (!currentElem) return\n\n const insetCalc = onset ? (currentElem.kms?.thk || 0) - currentElem.inset : 0\n const panel_length = dimension.height\n const panel_width = dimension.width\n const panel_thk = currentElem.kms?.thk || 0\n\n const pos_x = 0\n const pos_y = -(dimension.depth / 2 - panel_thk / 2) - insetCalc\n const pos_z = 0\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, 0, Math.PI / 2]}>\n <DrawerSensor\n panelWidth={panel_width}\n panelHeight={panel_length}\n panelThk={panel_thk}\n treeId={'dr_fr'+treeId}\n onset={onset}\n renderMat={render_mat}\n />\n </group>\n :<g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={'0'}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrRight({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.right\n if (!currentElem) return\n\n const nxtElem= drElems.back\n const frElem = drElems.front\n\n const nxtTrim = nxtElem?.kms ? nxtElem.inset : 0\n const frTrim = onset ? frElem.inset : frElem.kms?.thk || 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.depth - frTrim - nxtTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = (dimension.width / 2 - panel_thk / 2 - currentElem.inset)\n const pos_y = (frTrim / 2 - nxtTrim / 2)\n const pos_z = -drawerHeight / 2\n\n const render_mat = currentElem.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, Math.PI / 2, Math.PI]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'dr_ri'+treeId}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\n <PD_2D\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\n dim_y={panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrBack({dimension, drElems,view}: DrawerElem) {\n const currentElem = drElems.back\n if (!currentElem) return\n\n const prvElem= drElems.right\n const nxtElem= drElems.left\n\n const prvTrim = prvElem?.kms ? prvElem.inset + prvElem?.kms?.thk : 0\n const nxtTrim = nxtElem?.kms ? nxtElem.inset + nxtElem?.kms?.thk : 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.width - prvTrim - nxtTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = prvTrim / 2 - nxtTrim / 2\n const pos_y = (dimension.depth / 2 - panel_thk / 2 - currentElem.inset)\n const pos_z = - drawerHeight / 2\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, Math.PI, Math.PI / 2]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'0'}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n rotate={180}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrLeft({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.left\n if (!currentElem) return\n\n const prvElem= drElems.back\n const frElem = drElems.front\n\n const prvTrim = prvElem?.kms ? prvElem.inset : 0\n const frTrim = onset ? frElem.inset : frElem.kms?.thk || 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.depth - prvTrim - frTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = -(dimension.width / 2 - panel_thk / 2 - currentElem.inset)\n const pos_y = - (prvTrim / 2 - frTrim / 2)\n const pos_z = -drawerHeight / 2\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, -Math.PI/2, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n render_mat={render_mat}\n treeId={'dr_le '+treeId}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\n <PD_2D\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\n dim_y={panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n rotate={180}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrBottom({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.bottom\n if(!currentElem) return\n\n const prvElem = drElems.left\n const nxtElem = drElems.right\n const bkElem = drElems.back\n const frElem = drElems.front\n\n const prvTrim = prvElem?.kms ? prvElem.inset + prvElem.kms.thk : 0\n const nxtTrim = nxtElem?.kms ? nxtElem.inset + nxtElem.kms.thk : 0\n const bkTrim = bkElem?.kms ? bkElem.inset + bkElem.kms.thk : 0\n\n const frTrim = onset ? frElem.inset : (frElem.kms?.thk || 0)\n\n const panel_length = dimension.width - prvTrim - nxtTrim\n const panel_width = dimension.depth - bkTrim - frTrim\n const panel_thk = currentElem.kms?.thk || 0\n\n const pos_x = prvTrim / 2 - nxtTrim / 2\n const pos_y = - bkTrim / 2 + frTrim / 2\n const pos_z = -(dimension.height / 2 - panel_thk / 2 - currentElem.inset)\n\n const render_mat = currentElem.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'dr_bot'+treeId}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n render_mat={render_mat}\n />\n </g>\n )\n}","import DrFront from \"./DrFront.tsx\";\nimport DrRight from \"./DrRight.tsx\";\nimport DrBack from \"./DrBack.tsx\";\nimport DrLeft from \"./DrLeft.tsx\";\nimport DrBottom from \"./DrBottom.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\n\nexport default function DrZone({dimension, drElems, onset, view, treeId} : DrawerElem){\n return (\n <>\n {drElems?.front && <DrFront dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.right && <DrRight dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.back && <DrBack dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.left && <DrLeft dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.bottom && <DrBottom dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n </>\n )\n}","import {animated, useSpring} from '@react-spring/three';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DimensionProps} from '../../../types/zone.types';\nimport type {DrawerHelperResult} from '../../../construction_principle/drawer/DrawerHelper';\nimport type {VIEW} from '../../../types/view.types';\nimport DrZone from '../zoneElems/drawerElems/DrZone';\nimport {useArticleHover} from \"../../../contexts/article-hover/useArticleHover.ts\";\n\ninterface DrawerAnimatorProps {\n dimension: DimensionProps;\n drElems: DrawerHelperResult;\n onset: boolean;\n view: VIEW;\n treeId: string;\n drawerIndex: number\n slideDistance?: number; // How far drawer slides out (in mm)\n}\n\nexport default function DrawerAnimator({\n dimension,\n drElems,\n onset,\n view,\n treeId,\n drawerIndex = 0,\n slideDistance\n }: DrawerAnimatorProps) {\n const {isHovered} = useArticleHover()\n\n const delayMs = drawerIndex * 40;\n\n const depth = dimension.depth || 400; // fallback to 400mm\n const actualSlideDistance = slideDistance ?? depth * 0.7;\n\n // Convert to normalized units (scene units)\n const slideNormalized = actualSlideDistance / DIM_NORM;\n\n const {posZ} = useSpring({\n posZ: isHovered ? -slideNormalized : 0,\n config: {mass: 1, tension: 170, friction: 26}, // Slightly faster than door\n delay:isHovered ? delayMs + (!onset ? 80 : 0): 0\n });\n\n return (\n <animated.group position-y={posZ}>\n <DrZone dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId}/>\n </animated.group>\n );\n}","import type {VIEW} from \"../../../types/view.types.ts\";\nimport type {DataContextType, DrawerZoneDataTypes} from \"../../../types/data.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {useVariables} from \"../../../variables/useVariables.ts\";\nimport GroupWrapper from \"../../../helpers/GroupWrapper.tsx\";\nimport DrawerAnimator from \"../helpers/DrawerAnimator.tsx\";\nimport type {PositionedChild} from \"../../../types/zone.types.tsx\";\nimport UseCpDispatcher from \"../../../helpers/useCpDispatcher.ts\";\nimport {isDrawer} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {DrawerType} from \"../../../construction_principle/drawer/dto/drawer.types.ts\";\n\ninterface DrawerItemProps {\n child: PositionedChild;\n index: number;\n drawerZoneHelper: DrawerZoneDataTypes;\n articleData: DataContextType;\n view: VIEW;\n}\n\n/**\n * Single drawer item component - handles hooks properly per drawer instance\n */\nexport default function DrawerItem({child, index, drawerZoneHelper, articleData, view}: DrawerItemProps) {\n const {tree: variableTree} = useVariables();\n const drawerName = drawerZoneHelper.sings[index % 2]?.DRAWER || '';\n\n const drawerHelper = UseCpDispatcher(articleData, drawerName, DrawerType.Drawer, 'drawer', variableTree) //DrawerHelper(resolveVarRecursive, variableTree, matSurfContextValue, articleData, drawerName);\n if (!isDrawer(drawerHelper)) return\n\n if (index % 2 === 0 || !drawerName || !drawerHelper) return null;\n return (\n <GroupWrapper\n view={view}\n position={[child.x / DIM_NORM, child.y / DIM_NORM, child.z / DIM_NORM]}\n >\n <DrawerAnimator\n dimension={child.zone_dims}\n drElems={drawerHelper.props}\n onset={drawerZoneHelper.ONSET}\n view={view}\n treeId={child.TREEID + '_' + index}\n drawerIndex={index}\n />\n </GroupWrapper>\n );\n}\n","import type {DimensionProps} from \"../../../types/zone.types.tsx\";\nimport type {VIEW} from \"../../../types/view.types.ts\";\nimport type {DrawerZoneDataTypes} from \"../../../types/data.types.tsx\";\nimport {EvaluationErrors, processLindiv} from \"imos-linear-division\";\nimport {calculateChildPositions} from \"../../../helpers/ZoneCalculations.tsx\";\nimport {useData} from \"../../../contexts/article-data/useData.ts\";\nimport {useVariables} from \"../../../variables/useVariables.ts\";\nimport {resolveLindivValue} from \"../../../helpers/LindivResolver.ts\";\nimport DrawerItem from \"./DrawerItem.tsx\";\n\ninterface DrawerProps {\n drawerZoneHelper: DrawerZoneDataTypes\n dimension: DimensionProps,\n view: VIEW,\n}\n\nexport default function Drawer({drawerZoneHelper, dimension, view}: DrawerProps) {\n const articleData = useData()\n const {tree: variableTree} = useVariables()\n const {height} = dimension\n\n if (!drawerZoneHelper) return null\n const linDivResolved = resolveLindivValue(drawerZoneHelper.DIVISION, variableTree)\n const children = processLindiv(linDivResolved, height)\n if (children instanceof EvaluationErrors) return null;\n const childrenPosition = calculateChildPositions(dimension, children, 'height', 0, [])\n\n return childrenPosition.childPositions.map((child, index) => (\n <DrawerItem\n key={child.TREEID + '' + index}\n child={child}\n index={index}\n drawerZoneHelper={drawerZoneHelper}\n articleData={articleData}\n view={view}\n />\n ))\n}","import {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\n\nexport default function Front({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.front;\n const cp = elemHlp?.cp\n let render_mat = undefined\n\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\n\n const startElem = helper.left\n const endElem = helper.right\n const {trim, oversize, thk} = elemHlp\n\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\n\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\n\n const startElemThk = startElem?.thk || 0\n const endElemThk = endElem?.thk || 0\n\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\n const endTrimThk = computeTrim('elem',cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\n const topTrimThk = computeTrim('elem',cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\n const botTrimThk = computeTrim('elem',cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\n\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + oversize.start + oversize.end\n const panel_thk = thk\n\n const pos_x = -(oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_y = -(dimension.depth / 2 - panel_thk / 2 - backInset - doorInset)\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, 0, Math.PI / 2]}>\n {isDoor(cp)\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\n : <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\n render_mat={render_mat}\n elemInfo={{source:'elem',elemType: ElemPartType.Door, thk: panel_thk, treeId : TREEID }}\n />\n }\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cpName={cp.name}\n render_mat={render_mat}\n />\n </g>\n )\n}","import type {ZoneProps} from \"../../types/zone.types.tsx\";\r\nimport {useZoneHelper} from \"../../helpers/row_data/UseZoneHelper.tsx\";\r\nimport {\r\n calculateChildPositionsFromGeometry,\r\n calculateRemainingZoneGeometry,\r\n calculateZoneGeometry,\r\n getBorderThk,\r\n getRemainingInset,\r\n getZoneInset,\r\n useZoneElemHelpers\r\n} from \"../../helpers/ZoneCalculations.tsx\";\r\nimport {backTreeId, DIM_NORM, frontTreeId, leftTreeId, rightTreeId} from \"../../constants/Constants.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport Left from \"./zoneElems/Left.tsx\";\r\nimport Back from \"./zoneElems/Back.tsx\";\r\nimport Right from \"./zoneElems/Right.tsx\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport {ZoneDivider} from \"../../hooks/zoneDivider.ts\";\r\nimport Divider from \"./zoneElems/Divider.tsx\";\r\nimport {createDivider, getDividedAxis, getDividedLength} from \"../../types/divider.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport Bottom from \"./zoneElems/Bottom.tsx\";\r\nimport Top from \"./zoneElems/Top.tsx\";\r\nimport useDrawerZoneHelper from \"../../helpers/row_data/UseDrawerZoneHelper.ts\";\r\nimport Drawer from \"./zoneElems/Drawer.tsx\";\r\nimport Front from \"./zoneElems/Front.tsx\";\r\n\r\nexport default function Zone({articleName,TREEID, dimension, view=VIEW._3D}: ZoneProps) {\r\n const descriptorManager = useDescriptorManager();\r\n const {resolveVarRecursive, tree:variableTree} = useVariables();\r\n const zoneHelper = useZoneHelper(articleName,TREEID);\r\n const drawerZoneHelper = useDrawerZoneHelper(articleName, TREEID);\r\n const dividerThk = zoneHelper?.DividerCP?.thk || 0;\r\n\r\n const elemHelpers = useZoneElemHelpers(articleName,TREEID)\r\n const borderThk = getBorderThk(elemHelpers, zoneHelper?.topShelfCP?.thk || 0, zoneHelper?.bottomShelfCP?.thk || 0)\r\n const zoneInset = getZoneInset(elemHelpers)\r\n const zoneGeometry = calculateZoneGeometry(dimension, zoneInset)\r\n const remainingInset = getRemainingInset(elemHelpers)\r\n const remainingZone = calculateRemainingZoneGeometry(zoneGeometry, borderThk, remainingInset)\r\n\r\n if (!zoneHelper) return\r\n const resolvedZone = {...zoneHelper.currentZone, LINDIV1: resolveVarRecursive(zoneHelper.currentZone.LINDIV1)}\r\n const divider = createDivider.fromZoneData(resolvedZone, dividerThk);\r\n\r\n const dividerAxis = getDividedAxis(divider)\r\n const dividedLength = getDividedLength(dividerAxis, remainingZone.dimensions)\r\n\r\n const inputData = zoneHelper.inputData\r\n zoneHelper.inputData['X'] = dividedLength.toString();\r\n\r\n const {updatedDivider} = ZoneDivider({divider, inputData, descriptorManager, resolveVarRecursive, variableTree});\r\n\r\n const childPositions = calculateChildPositionsFromGeometry(remainingZone, dividerThk, updatedDivider, zoneHelper?.children.map((child) => child.TREEID) || []);\r\n\r\n return (\r\n <GroupWrapper view={view} position={[zoneGeometry.position.x / DIM_NORM , zoneGeometry.position.y / DIM_NORM , zoneGeometry.position.z / DIM_NORM ]} >\r\n {elemHelpers.front?.cp?.name != undefined && <Front articleName={articleName} view={view} TREEID={frontTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/>}\r\n {elemHelpers.left?.cp?.name != undefined && <Left articleName={articleName} view={view} TREEID={leftTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.back?.cp?.name != undefined && <Back articleName={articleName} view={view} TREEID={backTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.right?.cp?.name != undefined && <Right articleName={articleName} view={view} TREEID={rightTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.topShelfCP?.name != undefined && <Top articleName={articleName} view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} topShelfCP={zoneHelper?.topShelfCP}/> }\r\n {zoneHelper?.bottomShelfCP?.name != undefined && <Bottom articleName={articleName} view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} bottomShelfCP={zoneHelper.bottomShelfCP} /> }\r\n {drawerZoneHelper && <Drawer drawerZoneHelper={drawerZoneHelper} dimension={remainingZone.dimensions} view={view}/>}\r\n <GroupWrapper view={view} position={[remainingZone.position.x / DIM_NORM, remainingZone.position.y / DIM_NORM, remainingZone.position.z / DIM_NORM]}>\r\n {updatedDivider && <Divider articleName={articleName} remainingZone={remainingZone} divider={updatedDivider} view={view} childrenPositon={childPositions} dividerThk={dividerThk} /> }\r\n </GroupWrapper>\r\n </GroupWrapper>\r\n\r\n )\r\n}","import {VIEW} from \"../../../types/view.types.ts\";\r\nimport type {DimensionProps} from \"../../../types/zone.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport interface HighlighterProps {\r\n view: VIEW,\r\n isSelected: boolean,\r\n dimensions: DimensionProps\r\n}\r\n\r\nexport default function Highlighter({view, isSelected, dimensions}: HighlighterProps) {\r\n // Normalize dimensions for Three.js\r\n const width = dimensions.width / DIM_NORM;\r\n const depth = dimensions.depth / DIM_NORM;\r\n const height = dimensions.height / DIM_NORM;\r\n\r\n return (\r\n <>\r\n {view === VIEW._3D && isSelected && (\r\n <mesh position={[0,0,height/2 + 0.1]}>\r\n <boxGeometry args={[width, depth, 50/DIM_NORM]}/>\r\n <meshBasicMaterial color=\"red\" transparent={true} opacity={0.3}/>\r\n </mesh>\r\n )}\r\n {view === VIEW._2D_TOP && isSelected && (\r\n <g transform={`translate(${-dimensions.width/2}, ${-dimensions.depth/2})`}>\r\n <rect width={dimensions.width} height={dimensions.depth} fill=\"blue\" stroke=\"black\" strokeWidth=\"2\" opacity={0.2}/>\r\n </g>\r\n )}\r\n </>\r\n )\r\n\r\n}","import {useMemo} from \"react\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport Zone from \"./Zone.tsx\";\r\nimport usePrimHelper from \"../../helpers/row_data/UsePrimHelper.tsx\";\r\nimport Highlighter from \"./helpers/Highlighter.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {useDimensions} from \"../../contexts/dimension/useDimensions.ts\";\r\nimport {useArticleHover} from \"../../contexts/article-hover/useArticleHover.ts\";\r\nimport type {ThreeEvent} from \"@react-three/fiber\";\r\n// Removed: useDimensions - DimensionControl updates anglPrim directly via DataContext\r\n\r\nconst SVG_TRANSFORM = \"scale(1,-1)\";\r\n\r\nexport interface DesignerProps {\r\n articleName: string,\r\n view: VIEW,\r\n isSelected: boolean,\r\n position: [number, number, number]\r\n}\r\n\r\nexport default function Designer({articleName, view = VIEW._3D, isSelected, position}: DesignerProps) {\r\n const { setIsHovered } = useArticleHover();\r\n\r\n const handlePointerOver = (e: ThreeEvent<PointerEvent>) => {\r\n e.stopPropagation();\r\n setIsHovered(true);\r\n };\r\n\r\n const handlePointerLeave = (e: ThreeEvent<PointerEvent>) => {\r\n e.stopPropagation();\r\n setIsHovered(false);\r\n };\r\n const dimensionOverrides = useDimensions().dimensions\r\n const currentPrim = usePrimHelper(articleName, dimensionOverrides);\r\n\r\n const prim_dims = currentPrim?.prim_dims\r\n const {tree} = useVariables(); // Get variable tree to trigger re-renders when variables change\r\n\r\n const zone = useMemo(() => {\r\n return prim_dims\r\n ? (<Zone articleName={articleName} key={`${articleName}-0`} TREEID=\"0\" view={view} dimension={prim_dims}/>)\r\n : null;\r\n }, [articleName, view, prim_dims, tree]);\r\n\r\n if (!zone || !prim_dims) return undefined\r\n\r\n\r\n const is3D = view === VIEW._3D;\r\n return (\r\n <GroupWrapper view={view} position={[position[0], position[1], prim_dims.height / DIM_NORM / 2]} onPointerLeave={handlePointerLeave} onPointerOver={handlePointerOver}>\r\n {is3D ? zone : <g transform={SVG_TRANSFORM}>{zone}</g>}\r\n <Highlighter view={view} isSelected={isSelected} dimensions={prim_dims}/>\r\n </GroupWrapper>\r\n );\r\n\r\n}","import {type ReactNode, useCallback, useMemo} from \"react\";\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\nimport {DimensionContext} from \"./DimensionContext.ts\";\n\nexport function DimensionProvider({children, initialDimensions, onDimensionChange}: {\n children: ReactNode;\n initialDimensions?: DimensionProps;\n onDimensionChange?: (key: keyof DimensionProps, value: number) => void;\n}) {\n const dimensions = initialDimensions ?? {width: 0, height: 0, depth: 0};\n\n const setDimension = useCallback((key: keyof DimensionProps, value: number) => {\n onDimensionChange?.(key, value);\n }, [onDimensionChange]);\n\n const contextValue = useMemo(() => ({dimensions, setDimension}), [dimensions, setDimension]);\n\n return (\n <DimensionContext.Provider value={contextValue}>\n {children}\n </DimensionContext.Provider>\n );\n}\n","import { useState, useMemo, type ReactNode } from 'react';\nimport { ArticleHoverContext, type ArticleHoverContextValue } from './ArticleHoverContext';\n\ninterface ArticleHoverProviderProps {\n children: ReactNode;\n}\n\nexport function ArticleHoverProvider({ children }: ArticleHoverProviderProps) {\n const [isHovered, setIsHovered] = useState(false);\n\n const value = useMemo<ArticleHoverContextValue>(() => ({\n isHovered,\n setIsHovered,\n }), [isHovered]);\n\n return (\n <ArticleHoverContext.Provider value={value}>\n {children}\n </ArticleHoverContext.Provider>\n );\n}","import {memo} from \"react\";\nimport {ArticleRelatedVariableProvider} from \"../../contexts/article-related-variables/ArticleRelatedVariableProvider\";\nimport {LevaVariableController} from \"../ui/test/LevaVariableController\";\nimport Designer from \"./Designer\";\nimport GroupWrapper from \"../../helpers/GroupWrapper\";\nimport {VIEW} from \"../../types/view.types\";\nimport type {ArticleGroupTypes} from \"../../types/article-group.types\";\nimport {DimensionProvider} from \"../../contexts/dimension/DimensionProvider.tsx\";\nimport {ArticleHoverProvider} from \"../../contexts/article-hover/ArticleHoverProvider.tsx\";\n\nexport interface ArticleWithControllerProps {\n article: ArticleGroupTypes;\n articleId: string;\n position: [number, number, number];\n isSelected: boolean;\n onSelect: () => void;\n view: VIEW;\n debugMode: boolean;\n}\n\nexport const ArticleDesigner = memo(function ArticleWithController({article, articleId, position, isSelected, onSelect, view, debugMode}: ArticleWithControllerProps) {\n return (\n <ArticleRelatedVariableProvider overrides={article.variables}>\n <DimensionProvider initialDimensions={article.dimensions}>\n {debugMode && isSelected && <LevaVariableController articleName={article.name} articleId={articleId} />}\n <GroupWrapper view={view} onClick={onSelect}>\n <ArticleHoverProvider>\n <Designer articleName={article.name} view={view} isSelected={isSelected} position={position} />\n </ArticleHoverProvider>\n </GroupWrapper>\n </DimensionProvider>\n </ArticleRelatedVariableProvider>\n );\n});\n","import { useControls, folder } from 'leva';\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { ArticleGroupTypes } from '../../../types/article-group.types';\n\ninterface LevaVisibilityControllerProps {\n articleList: ArticleGroupTypes[];\n onVisibilityChange: (articleName: string, visible: boolean) => void;\n}\n\n/**\n * Leva-based visibility controller for articles\n * Renders outside SVG, works in both 3D and 2D views\n */\nexport function LevaVisibilityController({\n articleList,\n onVisibilityChange\n}: LevaVisibilityControllerProps) {\n const updatingFromPropsRef = useRef(false);\n\n // Build Leva controls for article visibility\n const controlsConfig = useMemo(() => {\n const config: Record<string, any> = {};\n const visibilityControls: Record<string, any> = {};\n\n articleList.forEach((article) => {\n // Default to true if visibility is not set\n const isVisible = article.visibility !== false;\n visibilityControls[article.name] = {\n value: isVisible,\n label: article.name,\n };\n });\n\n config['Article Visibility'] = folder(visibilityControls, { collapsed: false });\n\n return config;\n }, [articleList]);\n\n // Create Leva controls\n const controls = useControls('Visibility Controls', controlsConfig);\n\n // Sync Leva control changes to parent\n useEffect(() => {\n // Skip if we're updating from props to avoid loops\n if (updatingFromPropsRef.current) {\n updatingFromPropsRef.current = false;\n return;\n }\n\n let hasChanges = false;\n Object.entries(controls).forEach(([articleName, isVisible]) => {\n const article = articleList.find(a => a.name === articleName);\n if (!article) return;\n\n const currentVisibility = article.visibility !== false;\n\n // Only update if value actually changed\n if (currentVisibility !== isVisible) {\n onVisibilityChange(articleName, isVisible as boolean);\n hasChanges = true;\n }\n });\n\n // Set flag if we made any changes to prevent re-triggering\n if (hasChanges) {\n updatingFromPropsRef.current = true;\n }\n }, [controls, articleList, onVisibilityChange]);\n\n // Component doesn't render anything - Leva panel appears automatically\n return null;\n}\n","// ArticleGroupLayout.tsx - Multi-Article Positioning & Layout\r\nimport {useMemo, useState, useCallback} from \"react\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport {ArticleDesigner} from \"./ArticleDesigner.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {LevaVisibilityController} from \"../ui/test/LevaVisibilityController.tsx\";\r\n\r\nexport interface ArticleGroupLayoutProps {\r\n articleList: ArticleGroupTypes[];\r\n validNames: Set<string>;\r\n view: VIEW;\r\n debugMode: boolean;\r\n isZCentered: boolean;\r\n selectedIndex?: number | null;\r\n onArticleSelect?: (index: number) => void;\r\n}\r\n\r\nexport function ArticleGroupLayout({articleList, validNames, view, debugMode, isZCentered, selectedIndex, onArticleSelect}: ArticleGroupLayoutProps) {\r\n // Track visibility separately - this doesn't need to reset when dimensions change\r\n const [visibilityMap, setVisibilityMap] = useState<Record<string, boolean>>({});\r\n\r\n // Merge visibility state with articleList from props\r\n const articlesWithVisibility = useMemo(() =>\r\n articleList.map(article => ({\r\n ...article,\r\n visibility: visibilityMap[article.name] ?? article.visibility\r\n })),\r\n [articleList, visibilityMap]\r\n );\r\n\r\n // Handler for visibility changes from the controller\r\n const handleVisibilityChange = useCallback((articleName: string, visible: boolean) => {\r\n setVisibilityMap(prev => ({...prev, [articleName]: visible}));\r\n }, []);\r\n\r\n // Calculate max height for centering\r\n const maxHeight = useMemo(() => Math.max(...articlesWithVisibility.map(a => a.dimensions.height)), [articlesWithVisibility]);\r\n const maxDepth = useMemo(() => Math.max(...articlesWithVisibility.map(a => a.dimensions.depth)), [articlesWithVisibility]);\r\n const totalWidth = useMemo(() => articlesWithVisibility.reduce((acc, article) => acc + article.dimensions.width / DIM_NORM, 0), [articlesWithVisibility]);\r\n const centerZ = isZCentered ? maxHeight / 2 : 0;\r\n const centerY = maxDepth / 2\r\n const centerX = totalWidth / 2;\r\n\r\n // Calculate positions for all articles\r\n const articlePositions = useMemo(() => {\r\n let positionAcc = 0;\r\n return articlesWithVisibility.map((article, index) => {\r\n const width = article.dimensions.width / DIM_NORM;\r\n const height = article.dimensions.height / DIM_NORM;\r\n const depth = article.dimensions.depth / DIM_NORM;\r\n\r\n const x = positionAcc + width / 2 - centerX;\r\n positionAcc += width;\r\n\r\n return {\r\n articleId: `${article.name}-${index}`,\r\n position: [x, depth / 2, height / 2] as [number, number, number],\r\n article,\r\n index\r\n };\r\n });\r\n }, [articlesWithVisibility, centerX]);\r\n\r\n return (\r\n <>\r\n {/* Visibility Controller - Leva-based, works in both 3D and 2D */}\r\n {debugMode && (\r\n <LevaVisibilityController\r\n articleList={articlesWithVisibility}\r\n onVisibilityChange={handleVisibilityChange}\r\n />\r\n )}\r\n\r\n {/* Render articles - Variable controller shares context with selected article */}\r\n {articlePositions.map(({articleId, position, article, index}) => {\r\n if (!validNames?.has(article.name) || article.visibility === false) return null;\r\n\r\n const isSelected = selectedIndex === index;\r\n\r\n return (\r\n <GroupWrapper key={articleId} view={view} position={[0,-centerY/DIM_NORM,-centerZ/DIM_NORM]} >\r\n <ArticleDesigner\r\n article={article}\r\n articleId={articleId}\r\n position={position}\r\n isSelected={isSelected}\r\n onSelect={() => onArticleSelect?.(index)}\r\n view={view}\r\n debugMode={debugMode}\r\n />\r\n </GroupWrapper>\r\n );\r\n })}\r\n </>\r\n );\r\n}","import type {ArticleData} from \"../../types/data.types.tsx\";\nimport {useAPI} from \"../../hooks/useAPI.ts\";\nimport {api} from \"../../services/ApiFactory.ts\";\nimport {DataProvider} from \"../../contexts/article-data/DataProvider.tsx\";\nimport {VariableProvider} from \"../../variables/VariableProvider.tsx\";\nimport {DescriptorProvider} from \"../../contexts/descriptor/DescriptorProvider.tsx\";\nimport {MatSurfProvider} from \"../../contexts/mat-surf/MatSurfProvider.tsx\";\nimport {ErrorDisplay, LoadingIndicator} from \"../ui/LoadingIndicator.tsx\";\nimport type {CanvasProps} from \"../../types/canvas.types.tsx\";\nimport '../../styles/leva-custom.css'\nimport {useMemo, useCallback} from \"react\";\nimport {ArticleGroupLayout} from \"./ArticleGroupLayout.tsx\";\nimport {VIEW} from \"../../types/view.types.ts\";\n\nexport default function ArticleGroupDesigner({view = VIEW._3D, data, articleList, debugMode = false, isZCentered = false, selectedIndex, onArticleSelect}: CanvasProps) {\n // Memoize article names and stable key FIRST (before any conditional returns)\n const articleNames = useMemo(() => articleList?.map(article => article.name) ?? [],\n [articleList]\n );\n\n const articleNamesKey = useMemo(() => articleNames.join(','),\n [articleNames]\n );\n\n // Memoize fetch function\n const fetchArticleData = useCallback(async () => {\n const result = await api.articleData().fetchBulk(articleNames);\n if (!result) throw new Error('Failed to fetch article data');\n return result;\n }, [articleNamesKey]); // Use stable key instead of array\n\n // Fetch data only if not provided and we have articles\n const shouldFetch = !data && articleNames.length > 0;\n const {data: apiData, loading, error} =useAPI<ArticleData>(fetchArticleData, [articleNamesKey], !shouldFetch);\n\n const finalData = data ?? apiData;\n\n // Memoize derived data\n const validArticleNames = useMemo(\n () => finalData ? new Set(finalData.anglprim.map(v => v.NAME)) : new Set<string>(),\n [finalData]\n );\n\n const materials = useMemo(() => finalData?.materials ?? [],\n [finalData]\n );\n\n const surfaces = useMemo(() => finalData?.surfaces ?? [],\n [finalData]\n );\n\n // Early returns for error states\n if (!articleList?.length) return <ErrorDisplay error=\"No articles provided\" insideCanvas={true}/>;\n if (!data && loading) return <LoadingIndicator message=\"Loading article data...\" view={view}/>\n if (!data && error) return <ErrorDisplay error={error.toString()} insideCanvas={true}/>;\n if (!finalData) return <ErrorDisplay error=\"No article data available\" insideCanvas={true}/>;\n\n\n return (\n <DataProvider names={articleNames} data={finalData}>\n <MatSurfProvider initialMaterials={materials} initialSurfaces={surfaces}>\n <VariableProvider imosVariables={finalData.variables}>\n <DescriptorProvider descriptorData={finalData.descriptors}>\n <ArticleGroupLayout articleList={articleList} validNames={validArticleNames} view={view} debugMode={debugMode} isZCentered={isZCentered} selectedIndex={selectedIndex} onArticleSelect={onArticleSelect}/>\n </DescriptorProvider>\n </VariableProvider>\n </MatSurfProvider>\n </DataProvider>\n );\n}","/**\n * @package @your-org/article-designer\n * Main entry point for the Article Designer package\n *\n * 3D Article Designer for furniture visualization using React Three Fiber\n */\n\n// ============================================================================\n// MAIN COMPONENTS\n// ============================================================================\n/**\n * ArticleGroupDesigner - Main component with all providers included\n * This is the recommended entry point\n */\nexport { default as ArticleGroupDesigner } from './components/article_designer/ArticleGroupDesigner.tsx';\n\n/**\n * ArticleDesigner - Single article renderer (new architecture)\n */\nexport { ArticleDesigner } from './components/article_designer/ArticleDesigner.tsx';\n\n/**\n * ArticleGroupLayout - Multi-article layout manager\n */\nexport { ArticleGroupLayout } from './components/article_designer/ArticleGroupLayout.tsx';\n\n/**\n * Designer - Core designer component without providers\n */\nexport { default as Designer } from './components/article_designer/Designer';\n\n/**\n * Zone component\n */\nexport { default as Zone } from './components/article_designer/Zone';\n\n// ============================================================================\n// CONTEXT PROVIDERS\n// ============================================================================\nexport { DimensionProvider } from './contexts/dimension/DimensionProvider.tsx'\nexport { DataProvider } from './contexts/article-data/DataProvider';\nexport { MatSurfProvider } from './contexts/mat-surf/MatSurfProvider';\nexport { ArticleRelatedVariableProvider } from './contexts/article-related-variables/ArticleRelatedVariableProvider.tsx';\nexport { VariableProvider } from './variables/VariableProvider';\nexport { DescriptorProvider } from './contexts/descriptor/DescriptorProvider';\nexport { TextureConfigProvider } from './contexts/texture/TextureConfig';\nexport { DimensionContext, type DimensionContextValue } from './contexts/dimension/DimensionContext.ts';\nexport { ArticleHoverProvider } from './contexts/article-hover/ArticleHoverProvider';\n\n// Contexts for advanced usage\nexport { DataContext } from './contexts/article-data/DataContext';\nexport { VariableContext } from './variables/VariableContext';\nexport { TextureConfigContext } from './contexts/texture/TextureConfig';\nexport { DescriptorContext } from './contexts/descriptor/DescriptorContext';\nexport { ArticleHoverContext, type ArticleHoverContextValue } from './contexts/article-hover/ArticleHoverContext';\n\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport { useVariables } from './variables/useVariables';\nexport { useDescriptorEvaluation, useDescriptorMatches } from './contexts/descriptor/useDescriptor.ts';\nexport { useData } from './contexts/article-data/useData.ts';\nexport { useDescriptorManager } from './contexts/descriptor/useDescriptorManager.ts';\nexport { ZoneDivider } from './hooks/zoneDivider.ts';\nexport { useDimensions } from './contexts/dimension/useDimensions.ts';\nexport { useArticleHover } from './contexts/article-hover/useArticleHover';\n\n\n// ============================================================================\n// UI COMPONENTS (OPTIONAL)\n// ============================================================================\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Main data types\nexport type { ArticleData } from './types/data.types';\nexport { VIEW } from './types/view.types';\nexport type { TextureConfigContextType } from './contexts/texture/TextureConfig';\n\n// Variable types\nexport type { ImosVariable, VAR_TYPE } from './variables/variable.types';\n\n// Export helper utilities as namespace\nexport * as VariableResolver from './variables/VariableResolver';\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '1.0.0';\n"],"names":["useAPI","fetchFn","deps","skip","data","setData","useState","loading","setLoading","error","setError","isFirstRender","useRef","hasDataRef","useEffect","cancelled","load","result","err","CLIE_TYPE_ELEM","CLIE_TYPE_ZONE","frontTreeId","zoneID","rightTreeId","backTreeId","leftTreeId","parentId","clieTags","DIM_NORM","DEFAULT_RENDER_COLOR","BACKEND_BASE_URL","GenericAPI","endpoint","baseUrl","id","url","response","values","contentType","text","APIFactory","api","DataContext","createContext","DataProvider","children","names","staticData","editableData","setEditableData","selectedElem","setSelectedElem","hoveredElem","setHoveredElem","getArticleData","useCallback","articleName","elem","zone","prim","clie","grtx","drZone","variable","anglElems","anglZones","anglPrims","anglClies","anglGrtxs","csides","kmsList","cabins","variables","doors","drawers","drawerZones","cabbacks","useMemo","e","z","p","c","g","value","property","newValue","prev","treeid","tagname","datatype","num","name","jsx","VariableContext","VAR_TYPE","createVariableTree","imosVariables","v","getValue","varName","tree","visited","refName","setValue","newTree","resolveString","str","match","resolveRecursive","maxDepth","depth","hasVariables","extractVariableNames","matches","VariableProvider","setTree","setVarValue","currentTree","setValueInTree","contextValue","DescriptorContext","safeNumber","safeString","compareNumbers","left","right","compareFn","l","r","compareStrings","comparisonMap","a","b","keyMapping","resolve","input","options","variableTree","dataType","silent","allowFunctions","UNIT_PATTERN","isIfStatement","evaluateIfStatement","isMathExpression","evaluateExpression","coerceByDataType","resolveValue","expr","content","parts","splitIfParts","conditionStr","trueValueStr","falseValueStr","resultStr","evaluateCondition","current","char","condition","part","inner","comparisonMatch","leftStr","operator","rightStr","evaluateSide","trimmed","expressionCache","cacheKey","sanitized","normalizeKey","key","ConditionTreeEvaluator","node","leftValue","normalizedKey","rightValue","childResults","child","DescriptorEvaluator","descriptor","defaultNode","DescriptorManager","descriptors","desc","descriptorName","inputData","descriptorType","byType","type","DescriptorProvider","descriptorData","manager","MatSurfContext","useMatSurfs","context","useContext","MatSurfProvider","initialMaterials","initialSurfaces","materials","setMaterials","surfaces","setSurfaces","loadingMaterials","setLoadingMaterials","loadingSurfaces","setLoadingSurfaces","failedMaterials","setFailedMaterials","failedSurfaces","setFailedSurfaces","hasMaterial","m","hasSurface","s","isFetchingMaterial","isFetchingSurface","hasFailedMaterial","hasFailedSurface","materialFetchQueue","surfaceFetchQueue","isMounted","queueTrigger","setQueueTrigger","queueMaterialFetch","wasEmpty","queueSurfaceFetch","fetchMaterial","material","next","fetchSurface","surface","toFetch","VIEW","LoadingIndicator","view","loadingContent","jsxs","Html","ErrorDisplay","insideCanvas","errorContent","useVariables","get","resolveVar","resolveVarRecursive","has","ArticleRelatedVariableProvider","overrides","parentContext","dynamicChanges","setDynamicChanges","newChanges","DimensionContext","useDimensions","LevaVariableController","articleId","onArticleNameChange","dimensions","setDimension","updatingFromTreeRef","updatingDimensionsRef","panelName","controlsConfig","config","numericVars","surfaceVars","materialVars","kmsVars","textVars","profileVars","colorsVars","currentValue","numValue","folder","controls","useControls","hasChanges","useData","useClieHelper","TREEID","TAG","DATATYPE","selected_clie","item","useGrtxHelper","grtxData","zoneGrtx","zoneInfo","KmsRenderSelector","materialRender","surfaceTopRender","surfaceBottomRender","noTop","noBottom","RenderHelper","textureId","MatHelper","matSurfContext","materialName","resolvedRender","renderInfo","SurfHelper","surfaceName","KmsHelper","articleData","NAME","resolvedName","currentKms","kms","surfaceTopName","surfaceBottomName","surfaceTop","surfaceBottom","render","CSideHelper","currentCP","cside","DividerType","DividerTypeConst","ValueSourceConst","isDivider","divider","isLinearDivision","isArticle","createDivider","DIVDIR","DIVTYPE","HORDEFTYPE","LINDIV1","DIVELEM1","DIVIDER","thickness","divProps","isDescriptor","getDividedAxis","PERPENDICULAR_AXIS_MAP","getDividedLength","axis","ElemPartType","ElemTrimType","DrawerType","TYPE_TO_HELPER","createTypeSets","mapping","helper","_","h","ElemCabinTypes","ElemCSideTypes","ElemCabBackTypes","ElemDoorTypes","DividerCabinTypes","DividerCSideTypes","DividerCabBackTypes","isCabinType","source","isCSideType","isCabBackType","isDoorType","isDrawerType","isCpDescriptor","cpName","isCpVariable","isSidePanel","cp","isBackPanel","isDoor","isShelf","isDrawer","useDescriptorEvaluation","throwOnError","descriptorExists","errorMessage","useDescriptorMatches","CabBackHelper","kmsName","DoorHelper","kmsLeft","kmsRight","CabinHelper","DrawerHelper","currentCp","front","BOTSHELF","elems","bsPdName","frPdName","bsKMS","frKMS","riKMS","bkKMS","lsKMS","UseCpDispatcher","cpType","descriptorManager","cpNameResult","cpHelper","useDescriptorManager","usePrimHelper","dimensionOverrides","current_prim","parser","DIMCALCF","SIZE","dimOverride","resolved","prim_dims","useZoneHelper","clieTopThk","clieBotThk","clieDivThk","currentZone","TOPSHELF","topShelfResult","botShelfResult","dividerResult","topShelfCP","bottomShelfCP","DividerCP","useElemHelper","VariableTree","currentElem","parentZoneId","parentZone","clieThickness","CPNAME","INSETFOR","INSET","STARTTRIM","BOTOFFS","TOPOFFS","ENDOFFS","STARTOFFS","ENDTRIM","TOPTRIM","BOTTRIM","PARTTYPE","thk","sourceInset","resolvedInset","inset","topThk","bottomThk","oversize","trim","elmTrimThk","EvaluationErrors","message","Scanner","_Scanner","tokens","oldestKey","lexeme","fullVariable","allowedSpecialVariables","identifier","functionType","Parser","ast","nextToken","sections","singleSection","functionName","arg","isN","evaluateBinaryExpression","expression","bothAreNumbers","sameUnit","hasRepeated","evaluateFunction","fn","evaluatedArg","evaluateVariable","Evaluator","evaluatedValue","section","result2","traverseTree","callback","DimensionReference","startPanelThk","endPanelThk","dividerThk","sizerefout1","sizerefedg1","sizerefmid","sizerefedg2","sizerefout2","accumulatedThicknesses","i","Calculator","totalLength","dividerThickness","dimRefProps","subSection","accumulatedIncThk","spreadMm","node2","accumulatedMmValues","accumulateMmValues","binaryExpression","restAfterN","nTimes","processNSpecialVariables","totalNDividersThickness","totalNLength","totalRatios","accumulateRatioValues","ratioUnitValue","sectionsResult","calculateSection","ratioValue","mmValue","scanner","evaluator","processLindiv","evaluationResult","LinDivPatternTransform","exactPattern","count","extractNumberFromIndependentDiv","VALID_UNITS","VALID_FUNCTIONS","isValidLinearDivision","lindiv","splitSections","isValidSection","hasBalancedBrackets","hasNumber","hasOperator","hasFunction","hasBrackets","isDimensionVar","isNFold","funcMatch","funcName","unitMatch","unit","stack","pairs","LinDivHelper","divided_length","divisionType","isReversed","divided_length_list","transformedLinDiv","unrefIndependentDiv","zone_dimensions","length","PositionHelper","parentDimensions","lengthList","childTREEIDs","startX","startY","startZ","acc","index","x","y","zone_dims","useZoneElemHelpers","getBorderThk","elemHelpers","topShelfThk","bottomShelfThk","getZoneInset","calculateZoneGeometry","dimension","borderInset","getRemainingInset","calculateRemainingZoneGeometry","zoneGeometry","bordersThk","remainingInset","calculateChildPositions","remainingDims","calculateChildPositionsFromGeometry","remainingZoneGeometry","childrenDims","GroupWrapper","position","rotation","onClick","onPointerOver","onPointerLeave","angle","calculateMitrePoints","halfLength","halfThickness","points","Shape","ralColorsMap","getRalHexColor","ralCode","isRalColor","defaultConfig","TextureConfigContext","TextureConfigProvider","useTextureConfig","buildTextureUrl","renderMat","textureBaseUrl","textureFolder","textureExtension","textureSuffix","textureCache","failedUrls","useMaterialLoader","renderValue","textureConfig","loadedTexture","setLoadedTexture","isLoading","setIsLoading","currentUrlRef","isGlass","ralHex","urlToLoad","loader","TextureLoader","texture","PD_3D","memo","width","opacity","isSelected","isHovered","onPointerEnter","render_mat","meshRef","elemInfo","color","materialOpacity","effectiveColor","effectiveOpacity","geometry","shape","geo","ExtrudeGeometry","BoxGeometry","Edges","defaultRule","dimensionRules","getDimensionRules","rule","pattern","matchCPName","regexPattern","DimensionLines","height","rules","offset","lineStyle","strokeWidth","fontSize","arrowSize","positions","pos","idx","label","PD_2D","dim_x","dim_y","stroke_width","rotate","onMouseEnter","onMouseLeave","svgPath","strokeColor","effectiveStrokeWidth","fill","computeTrim","currCpSource","currCpType","currentCpTrim","joinPartSourceType","joinPartType","joinPartThk","backInset","isShortTrim","isLongTrim","updateQueue","makeQueue","raf","schedule","writeQueue","onStartQueue","onFrameQueue","onFinishQueue","timeouts","handler","ms","time","cancel","t","pendingCount","timeout","findTimeout","start","sync","lastArgs","queuedFn","throttled","args","nativeRaf","impl","update","ts","queue","loop","stop","prevTs","eachSafely","each","__defProp","__export","target","all","globals_exports","assign","colors","createStringInterpolator","skipAnimation","to","willAdvance","noop","defineHidden","obj","is","isEqual","eachProp","ctx","toArray","flush","iterator","items","flushCalls","isSSR","globals","startQueue","currentFrame","prevFrame","priority","frameLoop","animation","raf2","flushStartQueue","startSafely","advance","prevIndex","startUnsafely","findIndex","other","dt","nextFrame","arr","test","colors2","NUMBER","PERCENTAGE","call","rgb","rgba","hsl","hsla","hex3","hex4","hex6","hex8","normalizeColor","parse255","parse1","hslToRgb","parse360","parsePercentage","hue2rgb","q","int","colorToRgba","int32Color","createInterpolator","range","output","extrapolate","outputRange","inputRange","extrapolateLeft","extrapolateRight","easing","range2","findRange","interpolate","inputMin","inputMax","outputMin","outputMax","map","easings","$get","$observers","hasFluidValue","getFluidValue","getFluidObservers","callFluidObserver","observer2","event","callFluidObservers","observers","FluidValue","setFluidGetter","setHidden","addFluidObserver","removeFluidObserver","numberRegex","colorRegex","unitRegex","rgbaRegex","cssVariableRegex","variableToRgba","token","fallback","parseCSSVariable","value2","namedColorRegex","rgbaRound","p1","p2","p3","p4","createStringInterpolator2","keyframes","interpolators","output2","missingUnit","prefix","once","func","called","warnInterpolate","deprecateInterpolate","warnDirectCall","deprecateDirectCall","isAnimatedString","useIsomorphicLayoutEffect","useLayoutEffect","useIsMounted","useRef2","useForceUpdate","useOnce","effect","useEffect3","emptyDeps","usePrev","prevRef","useRef4","useEffect4","$node","isAnimated","getAnimated","owner","setAnimated","getPayload","Animated","AnimatedValue","_AnimatedValue","_value","step","done","AnimatedString","_AnimatedString","is2","goal","TreeContext","AnimatedObject","animated","payload","AnimatedArray","_AnimatedArray","makeAnimated","getAnimatedType","parentNode","is3","isAnimatedString2","withAnimated","Component","host","hasInstance","is4","forwardRef","givenProps","givenRef","instanceRef","ref","updateRef","props","getAnimatedState","forceUpdate","instance","observer","PropsObserver","observerRef","each2","dep","usedProps","React","dependencies","createHost","components","applyAnimatedValues","createAnimatedStyle","style","getComponentProps","hostConfig","displayName","getDisplayName","is5","eachProp2","callProp","matchProp","resolveProp","prop","getDefaultProp","noopTransform","getDefaultProps","transform","keys","DEFAULT_PROPS","defaults2","RESERVED_PROPS","getForwardProps","forward","inferTo","to2","out","val","computeGoal","G","hasProps","isAsyncTo","detachRefs","ctrl","replaceRef","defaults","AnimationConfig","mergeConfig","config2","newConfig","sanitizeConfig","frequency","damping","mass","isTensionConfig","emptyArray","Animation","scheduleProps","callId","defaultProps","state","actions","reject","delay","onStart","pause","onResume","onPause","G2","getCombinedResult","results","getCancelledResult","getNoopResult","getFinishedResult","finished","runAsync","onRest","prevTo","prevPromise","preventBail","bail","bailPromise","bailIfEnded","bailSignal","bailResult","animate","arg1","arg2","BailSignal","skipAnimationSignal","SkipAnimationSignal","G3","stopAsync","props2","resume","animating","cancelId","isFrameValue","FrameValue","nextId","FluidValue2","G4","idle","$P","HAS_ANIMATED","IS_ANIMATING","IS_PAUSED","hasAnimated","isAnimating","isPaused","setActiveBit","active","setPausedBit","paused","SpringValue","getFluidValue2","getAnimated2","changed","anim","toValues","toArray2","elapsed","from","v0","velocity","precision","decay","restVelocity","bounceFactor","canBounce","isGrowing","isMoving","isBouncing","numSteps","n","springForce","dampingForce","acceleration","currVal","finalVal","raf3","isLoop","mergeActiveFn","sendEvent","checkFinished","nextProps","createLoopUpdate","hasToProp","hasFromProp","prevFrom","hasFromChanged","hasToChanged","hasAsyncTo","reset","isAnimatable","immediate","nodeType","goalType","started","hasValueChanged","ACTIVE_EVENTS","oldNode","G5","frameLoop2","callFluidObservers2","loopRet","reverse","createUpdate","findDefined","declareUpdate","update2","eachProp3","BATCHED_EVENTS","nextId2","Controller","flush3","spring","is6","toArray3","prepareKeys","flushUpdateQueue","springs","each3","eachProp4","onChange","flush2","onStart2","onChange2","onRest2","raf4","flushUpdate","onResolve","asyncTo","flushCalls2","promises","getSprings","prepareSprings","createSpring","setSprings","addFluidObserver2","create","SpringContext","SpringRef","SpringRef2","each4","is7","_getProps","useSprings","propsFn","is8","useMemo2","layoutId","updates2","springs2","ctrls","updates","prevLength","each5","declareUpdates","startIndex","endIndex","useContext2","prevContext","hasContext","useIsomorphicLayoutEffect2","cb","useSpring","isFn","is9","Interpolation","getAnimatedType2","setAnimated2","_dt","oldValue","isEqual2","getAnimated3","checkIdle","becomeIdle","inputs","is14","getFluidValue3","toArray5","each10","getPayload2","G6","raf5","frameLoop3","hasFluidValue2","addFluidObserver3","removeFluidObserver2","highest","parent","isIdle","self","callFluidObservers3","Globals","primitives","THREE","addEffect","applyProps","OVERLAP","scanNeighbors","panelMesh","scene","panelBox","Box3","panelCenter","Vector3","quaternion","Quaternion","scale","Mesh","objBox","objCenter","worldDiff","hit","absX","absY","calculateHitOversize","joinedPartType","DoorSensor","panelWidth","panelHeight","panelThk","treeId","doorCp","ddHingePosition","useThree","setOversize","hasScanned","topOversize","bottomOversize","w","offsetX","offsetY","Fragment","ArticleHoverContext","useArticleHover","getHingeConfig","hingePosition","N","nThk","DoorPanel","rotX","rotY","DoorAnimator","halfW","leftConfig","rightConfig","Left","elemHlp","startElem","endElem","doorInset","startElemThk","endElemThk","startTrimThk","endTrimThk","topTrimThk","botTrimThk","mitreStartThk","mitreEndThk","panel_length","panel_width","panel_thk","pos_x","pos_y","pos_z","Back","Right","resolveWithNStar","sectionData","hasNStar","cleaned","resolveLindiv","original","isLindivReference","colonCount","format","suffix","parseLindiv","cleanExpression","finalValue","resolveLindivValue","cleanInput","ratioFirstMatch","ratio","exprRatioMatch","bracesMatch","star","ZoneDivider","linDivResolver","linDiv","resolvedVar","xValue","CONFIG","d","getDividerPos","LinearDividerRender","childrenPositon","cfg","showDiv","divPos","dims_3d","dims_2d","dividerId","Zone","SubArticleRender","remainingZone","Divider","Bottom","frontTrimThk","backTrimThk","leftTrimThk","rightTrimThk","Top","useDrawerZoneHelper","DrawerSensor","onset","DrFront","drElems","insetCalc","DrRight","nxtElem","frElem","nxtTrim","frTrim","drawerHeight","DrBack","prvElem","prvTrim","DrLeft","DrBottom","bkElem","bkTrim","DrZone","DrawerAnimator","drawerIndex","slideDistance","delayMs","slideNormalized","posZ","DrawerItem","drawerZoneHelper","drawerName","drawerHelper","Drawer","linDivResolved","Front","zoneHelper","borderThk","zoneInset","resolvedZone","dividerAxis","dividedLength","updatedDivider","childPositions","Highlighter","SVG_TRANSFORM","Designer","setIsHovered","handlePointerOver","handlePointerLeave","is3D","DimensionProvider","initialDimensions","onDimensionChange","ArticleHoverProvider","ArticleDesigner","article","onSelect","debugMode","LevaVisibilityController","articleList","onVisibilityChange","updatingFromPropsRef","visibilityControls","isVisible","ArticleGroupLayout","validNames","isZCentered","selectedIndex","onArticleSelect","visibilityMap","setVisibilityMap","articlesWithVisibility","handleVisibilityChange","visible","maxHeight","totalWidth","centerZ","centerY","centerX","articlePositions","positionAcc","ArticleGroupDesigner","articleNames","articleNamesKey","fetchArticleData","shouldFetch","apiData","finalData","validArticleNames","VERSION"],"mappings":"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","x_google_ignoreList":[51,67,68,69,70,71]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useAPI.ts","../src/constants/Constants.tsx","../src/services/GenericApi.ts","../src/services/ApiFactory.ts","../src/contexts/article-data/DataContext.ts","../src/contexts/article-data/DataProvider.tsx","../src/variables/VariableContext.tsx","../src/variables/variable.types.ts","../src/variables/VariableResolver.ts","../src/variables/VariableProvider.tsx","../src/contexts/descriptor/DescriptorContext.ts","../src/conditions/helpers/ComparisonMap.tsx","../src/conditions/helpers/KeyMap.tsx","../src/helpers/ExpressionResolver.ts","../src/conditions/helpers/ConditionTreeEvaluator.tsx","../src/descriptor/helper/DescriptorEvaluator.ts","../src/descriptor/services/DescriptorManager.ts","../src/contexts/descriptor/DescriptorProvider.tsx","../src/contexts/mat-surf/MatSurfContext.tsx","../src/contexts/mat-surf/MatSurfProvider.tsx","../src/types/view.types.ts","../src/components/ui/LoadingIndicator.tsx","../src/variables/useVariables.ts","../src/contexts/article-related-variables/ArticleRelatedVariableProvider.tsx","../src/contexts/article-data/useData.ts","../src/helpers/row_data/UseClieHelper.tsx","../src/helpers/row_data/UseGrtxHelper.tsx","../src/construction_principle/kms/KmsRenderSelector.ts","../src/construction_principle/render/RenderHelper.tsx","../src/construction_principle/material/MatHelper.ts","../src/construction_principle/surface/SurfHelper.ts","../src/construction_principle/kms/KmsHelper.tsx","../src/construction_principle/side_panel/CSideHelper.tsx","../src/types/divider.types.ts","../src/types/Elem.types.tsx","../src/construction_principle/drawer/dto/drawer.types.ts","../src/construction_principle/dto/angl-type-config.ts","../src/construction_principle/dto/cp-dispatcher.types.ts","../src/contexts/descriptor/useDescriptor.ts","../src/construction_principle/cabBack/CabBackHelper.tsx","../src/construction_principle/door/DoorHelper.ts","../src/construction_principle/cabin/CabinHelper.ts","../src/construction_principle/drawer/DrawerHelper.tsx","../src/helpers/useCpDispatcher.ts","../src/contexts/descriptor/useDescriptorManager.ts","../src/helpers/row_data/UsePrimHelper.tsx","../src/helpers/row_data/UseZoneHelper.tsx","../src/helpers/row_data/UseElemHelper.tsx","../node_modules/imos-linear-division/dist/index.mjs","../src/helpers/LinDivPatternTransform.ts","../src/helpers/LinDivValidation.ts","../src/helpers/LinDivHelper.tsx","../src/helpers/PositionHelper.tsx","../src/helpers/ZoneCalculations.tsx","../src/helpers/GroupWrapper.tsx","../src/helpers/MitreCalc.tsx","../src/constants/RalColors.ts","../src/contexts/texture/TextureConfig.tsx","../src/contexts/mat-surf/useMaterialLoader.ts","../src/components/elements_manager/PD_3D.tsx","../src/config/dimensionConfig.ts","../src/components/dimensions/DimensionLines.tsx","../src/components/elements_manager/PD_2D.tsx","../src/helpers/tools/computeTrimTool.ts","../node_modules/@react-spring/rafz/dist/react-spring_rafz.modern.mjs","../node_modules/@react-spring/shared/dist/react-spring_shared.modern.mjs","../node_modules/@react-spring/animated/dist/react-spring_animated.modern.mjs","../node_modules/@react-spring/core/dist/react-spring_core.modern.mjs","../node_modules/@react-spring/three/dist/react-spring_three.modern.mjs","../src/components/article_designer/helpers/ScanNeighbors.ts","../src/components/article_designer/helpers/calculateHitOversize.ts","../src/components/article_designer/helpers/DoorSensor.tsx","../src/contexts/article-hover/ArticleHoverContext.ts","../src/contexts/article-hover/useArticleHover.ts","../src/components/article_designer/helpers/DoorAnimator.tsx","../src/components/article_designer/zoneElems/Left.tsx","../src/components/article_designer/zoneElems/Back.tsx","../src/components/article_designer/zoneElems/Right.tsx","../src/helpers/LindivResolver.ts","../src/hooks/zoneDivider.ts","../src/components/article_designer/zoneElems/sub_construction/LinearDividerRender.tsx","../src/components/article_designer/zoneElems/sub_construction/SubArticleRender.tsx","../src/stores/variableStore.ts","../src/components/article_designer/zoneElems/Divider.tsx","../src/components/article_designer/zoneElems/Bottom.tsx","../src/components/article_designer/zoneElems/Top.tsx","../src/helpers/row_data/UseDrawerZoneHelper.ts","../src/components/article_designer/helpers/DrawerSensor.tsx","../src/components/article_designer/zoneElems/drawerElems/DrFront.tsx","../src/components/article_designer/zoneElems/drawerElems/DrRight.tsx","../src/components/article_designer/zoneElems/drawerElems/DrBack.tsx","../src/components/article_designer/zoneElems/drawerElems/DrLeft.tsx","../src/components/article_designer/zoneElems/drawerElems/DrBottom.tsx","../src/components/article_designer/zoneElems/drawerElems/DrZone.tsx","../src/components/article_designer/helpers/DrawerAnimator.tsx","../src/components/article_designer/zoneElems/sub_construction/DrawerItem.tsx","../src/components/article_designer/zoneElems/Drawer.tsx","../src/components/article_designer/zoneElems/Front.tsx","../src/components/article_designer/Zone.tsx","../src/components/article_designer/helpers/Highlighter.tsx","../src/contexts/dimension/DimensionContext.ts","../src/contexts/dimension/useDimensions.ts","../src/components/article_designer/Designer.tsx","../src/contexts/dimension/DimensionProvider.tsx","../src/contexts/article-hover/ArticleHoverProvider.tsx","../src/components/article_designer/VariableBridge.tsx","../src/components/article_designer/ArticleDesigner.tsx","../src/stores/visibilityStore.ts","../src/components/article_designer/ArticleGroupLayout.tsx","../src/components/article_designer/ArticleGroupDesigner.tsx","../src/index.ts"],"sourcesContent":["// hooks/useAPI.ts\r\nimport { useEffect, useState, useRef } from \"react\";\r\n\r\nexport function useAPI<T>(\r\n fetchFn: () => Promise<T>,\r\n deps: React.DependencyList = [],\r\n skip: boolean = false // Add skip flag to prevent fetching\r\n) {\r\n const [data, setData] = useState<T | null>(null);\r\n const [loading, setLoading] = useState(!skip); // Don't start loading if skipped\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n // Track if this is the first render\r\n const isFirstRender = useRef(true);\r\n const hasDataRef = useRef(false);\r\n\r\n useEffect(() => {\r\n // Skip fetching if skip flag is true\r\n if (skip) {\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n let cancelled = false;\r\n\r\n async function load() {\r\n try {\r\n // Only set loading to true if it's the first render or we don't have data yet\r\n if (isFirstRender.current || !hasDataRef.current) {\r\n setLoading(true);\r\n }\r\n setError(null);\r\n const result = await fetchFn();\r\n\r\n if (!cancelled) {\r\n setData(result);\r\n hasDataRef.current = true;\r\n }\r\n } catch (err) {\r\n if (!cancelled) {\r\n setError(err instanceof Error ? err.message : 'Unknown error');\r\n }\r\n } finally {\r\n if (!cancelled) {\r\n setLoading(false);\r\n isFirstRender.current = false;\r\n }\r\n }\r\n }\r\n\r\n load();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [...deps, skip]); // Include skip in dependencies\r\n\r\n return { data, loading, error };\r\n}","\r\nexport const strokeWidth = 1\r\nexport const CLIE_TYPE_ELEM = 0\r\nexport const CLIE_TYPE_ZONE = 1\r\nexport const defaultColor = \"black\"\r\nexport const frontTreeId = (zoneID: string): string => zoneID + \".0\";\r\nexport const rightTreeId = (zoneID: string): string => zoneID + \".1\";\r\nexport const backTreeId = (zoneID: string): string => zoneID + \".2\";\r\nexport const leftTreeId = (zoneID: string): string => zoneID + \".3\";\r\nexport const parentId = (zoneID: string): string => zoneID.substring(0, zoneID.lastIndexOf(\".\"));\r\n\r\nexport const previousTREEID = (TREEID: string): string => {\r\n const parent = parentId(TREEID);\r\n const index = getIndex(TREEID);\r\n const prevIndex = (index + 3) % 4;\r\n return `${parent}.${prevIndex}`;\r\n};\r\n\r\nexport const nextTREEID = (TREEID: string): string => {\r\n const parent = parentId(TREEID);\r\n const index = getIndex(TREEID)\r\n const nextIndex = (index + 1) % 4;\r\n return `${parent}.${nextIndex}`;\r\n};\r\n\r\nexport const getIndex = (TREEID: string): number => {\r\n return parseInt(TREEID.substring(TREEID.lastIndexOf('.') + 1));\r\n};\r\n\r\nexport const clieTags = {\r\n IAC_THICKNESS: 'IAC_THICKNESS', // sides and dividers (shelf / partitions)\r\n IAC_BOTTOMSHELFTHICKNESS: 'IAC_BOTTOMSHELFTHICKNESS', // for bottom shelf\r\n IAC_TOPSHELFTHICKNESS: 'IAC_TOPSHELFTHICKNESS' // for top shelf\r\n}\r\n\r\nexport const DIM_NORM = 1000\r\n// Texture loading configuration\r\n\r\nexport const texture_url_builder = (render_mat:string) => '/api/textures/copy_2/'+render_mat+'.jpg'+'/public'\r\nexport const TEXTURE_URL_PREFIX = '/api/textures/copy_2/' // Proxy to CDN (includes copy_2 folder)\r\nexport const TEXTURE_URL_SUFFIX = '/public'\r\nexport const TEXTURE_EXTENSION = '.jpg'\r\nexport const DEFAULT_TEXTURE = '/textures/default.jpg'\r\nexport const DEFAULT_RENDER_COLOR = '#484947';\r\n\r\nexport const BACKEND_BASE_URL = 'https://backend.tecnibo.com/api/rp-engine'\r\n// export const BACKEND_BASE_URL = 'http://192.168.33.164:3018'\r\n","// services/generic-api.ts\r\n\r\nimport {BACKEND_BASE_URL} from \"../constants/Constants.tsx\";\r\n\r\nexport class GenericAPI<T> {\r\n constructor(\r\n private endpoint: string,\r\n private baseUrl: string = BACKEND_BASE_URL\r\n ) {}\r\n\r\n /**\r\n * Fetch by ID (GET)\r\n */\r\n async fetchById(id: string | number): Promise<T | undefined> {\r\n const url = `${this.baseUrl}/${this.endpoint}/${id}`;\r\n\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return await this.parseResponse(response, url)\r\n }\r\n\r\n /**\r\n * Fetch bulk data by values array (POST)\r\n */\r\n async fetchBulk(values: string[]): Promise<T | undefined> {\r\n const forceRefresh = '?forceRefresh=true'\r\n const url = `${this.baseUrl}/${this.endpoint}/bulk${forceRefresh}`;\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ values }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n return await this.parseResponse(response, url)\r\n }\r\n\r\n private async parseResponse(response: Response, url: string): Promise<T | undefined> {\r\n const contentType = response.headers.get('content-type');\r\n const contentLength = response.headers.get('content-length');\r\n\r\n // Handle empty responses\r\n if (contentLength === '0' || !contentType?.includes('application/json')) {\r\n console.warn(`[${this.endpoint}] Empty or non-JSON response from ${url}`);\r\n return undefined;\r\n }\r\n\r\n const text = await response.text();\r\n\r\n if (!text?.trim()) {\r\n console.warn(`[${this.endpoint}] Empty response body from ${url}`);\r\n return undefined;\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as T;\r\n } catch (error) {\r\n console.error(`[${this.endpoint}] JSON parse error for ${url}:`, error);\r\n console.error(`[${this.endpoint}] Response preview:`, text.substring(0, 200));\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\n","import type {ConditionTreeResponse} from \"../conditions/types/condition.types.ts\";\r\nimport {GenericAPI} from \"./GenericApi.ts\";\r\nimport type {DescriptorResponse} from \"../descriptor/types/descriptor.types.ts\";\r\nimport type {LinDivData, OtherDescriptorData} from \"../descriptor/types/descriptor-data.types.ts\";\r\nimport type {ArticleData} from \"../types/data.types.tsx\";\r\nimport type {MaterialTypes} from \"../construction_principle/material/material.types.ts\";\r\nimport type {SurfaceTypes} from \"../construction_principle/surface/surface.types.ts\";\r\nimport {BACKEND_BASE_URL} from \"../constants/Constants.tsx\";\r\n\r\nclass APIFactory {\r\n private baseUrl: string;\r\n\r\n constructor() {\r\n this.baseUrl = BACKEND_BASE_URL;\r\n }\r\n\r\n conditionTree() {\r\n return new GenericAPI<ConditionTreeResponse>('condition-tree-builder', this.baseUrl);\r\n }\r\n\r\n descriptor() {\r\n return new GenericAPI<DescriptorResponse>('descriptor', this.baseUrl);\r\n }\r\n\r\n materialData(){\r\n return new GenericAPI<MaterialTypes>('material-data',this.baseUrl)\r\n }\r\n\r\n surfaceData(){\r\n return new GenericAPI<SurfaceTypes>('surface-data',this.baseUrl)\r\n }\r\n\r\n articleData() {\r\n return new GenericAPI<ArticleData>('article-data', this.baseUrl);\r\n }\r\n\r\n descriptorData() {\r\n return new GenericAPI<DescriptorResponse>('descriptor-data', this.baseUrl);\r\n }\r\n\r\n linDivData() {\r\n return new GenericAPI<LinDivData>('lindiv', this.baseUrl);\r\n }\r\n\r\n otherData() {\r\n return new GenericAPI<OtherDescriptorData>('other', this.baseUrl);\r\n }\r\n\r\n // Add more APIs as needed\r\n}\r\n\r\n// Export singleton instance\r\nexport const api = new APIFactory();\r\n\r\n// Or export factory for custom base URLs\r\nexport { APIFactory };","import { createContext } from 'react';\nimport type { DataContextType } from \"../../types/data.types.tsx\";\n\nexport const DataContext = createContext<DataContextType | undefined>(undefined);\n","import { useState, useMemo, useCallback } from 'react';\n// import data from '../../data/data.json';\nimport type {\n DataProviderProps,\n AnglPrim,\n AnglZone,\n AngleElem,\n AnglClie,\n AnglGrtx,\n DrawerZoneDataTypes, DrawerDataTypes\n} from \"../../types/data.types.tsx\";\nimport { DataContext } from './DataContext.ts';\nimport type {CsideTypes} from \"../../construction_principle/side_panel/cside.types.ts\";\nimport type {KmsTypes} from \"../../construction_principle/kms/kms.types.ts\";\nimport type {ImosVariable} from \"../../variables/variable.types.ts\";\nimport type {CabinTypes} from \"../../construction_principle/cabin/cabin.types.ts\";\nimport type {DoorTypes} from \"../../construction_principle/door/door.types.ts\";\nimport type {CabbackTypes} from \"../../construction_principle/cabBack/cabback.types.ts\";\n\nexport function DataProvider({data, children, names }: DataProviderProps) {\n const staticData = data as unknown as {\n anglelem: AngleElem[];\n anglzone: AnglZone[];\n anglprim: AnglPrim[];\n anglclie: AnglClie[];\n anglgrtx: AnglGrtx[];\n drawerZone:DrawerZoneDataTypes[];\n cside: CsideTypes[];\n door: DoorTypes[];\n drawers:DrawerDataTypes[];\n cabback: CabbackTypes[];\n kms: KmsTypes[];\n cabin: CabinTypes[];\n variables: ImosVariable[];\n };\n\n // Make data editable with useState\n const [editableData, setEditableData] = useState(staticData);\n\n // Selection state\n const [selectedElem, setSelectedElem] = useState<string | null>(null);\n const [hoveredElem, setHoveredElem] = useState<string | null>(null);\n\n // Filtering utility function - filter data by article name\n const getArticleData = useCallback((articleName: string) => ({\n anglElems: editableData.anglelem.filter((elem) => elem.NAME === articleName),\n anglZones: editableData.anglzone.filter((zone) => zone.NAME === articleName),\n anglPrims: editableData.anglprim.filter((prim) => prim.NAME === articleName),\n anglClies: editableData.anglclie.filter((clie) => clie.NAME === articleName),\n anglGrtxs: editableData.anglgrtx.filter((grtx) => grtx.NAME === articleName),\n drawerZones:editableData.drawerZone.filter((drZone) => drZone.NAME === articleName),\n\n // Note: csides and cabins are shared construction principles, not article-specific\n // Return all of them - they'll be referenced by article parts\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors:editableData.door || [],\n drawers:editableData.drawers || [],\n cabbacks:editableData.cabback || [],\n // Variables can be global or article-specific - filter returns article-specific ones\n variables: editableData.variables?.filter((variable) => variable.NAME === articleName) || []\n }), [editableData]);\n\n // Filter data by names array (memoized for performance)\n const {anglElems, anglZones, anglPrims, anglClies, anglGrtxs, csides, kmsList, cabins, variables, doors, drawers, drawerZones ,cabbacks} = useMemo(() => {\n if (names && names.length > 0) {\n // Filter to specified articles\n return {\n anglElems: editableData.anglelem.filter(e => names.includes(e.NAME)),\n anglZones: editableData.anglzone.filter(z => names.includes(z.NAME)),\n anglPrims: editableData.anglprim.filter(p => names.includes(p.NAME)),\n anglClies: editableData.anglclie.filter(c => names.includes(c.NAME)),\n anglGrtxs: editableData.anglgrtx.filter(g => names.includes(g.NAME)),\n drawerZones: editableData.drawerZone,//.filter(d => names.includes(d.NAME)),\n // Note: cside, cabin, KMS, variables, materials, and surfaces are shared resources\n // They are NOT filtered by article name - they are referenced by construction principles\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors: editableData.door || [],\n drawers: editableData.drawers || [],\n cabbacks: editableData.cabback || [],\n kmsList: editableData.kms || [],\n variables: editableData.variables || [],\n };\n } else {\n // No filtering - return all data\n return {\n anglElems: editableData.anglelem,\n anglZones: editableData.anglzone,\n anglPrims: editableData.anglprim,\n anglClies: editableData.anglclie,\n anglGrtxs: editableData.anglgrtx,\n drawerZones: editableData.drawerZone || [],\n cabins: editableData.cabin || [],\n csides: editableData.cside || [],\n doors: editableData.door || [],\n drawers:editableData.drawers || [],\n cabbacks: editableData.cabback || [],\n kmsList: editableData.kms || [],\n variables: editableData.variables || [],\n };\n }\n }, [editableData, names]);\n\n // Update function for AnglPrim (overall dimensions)\n const updateAnglPrim = (articleName: string, property: keyof AnglPrim, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglprim: prev.anglprim.map((prim) =>\n prim.NAME === articleName\n ? { ...prim, [property]: newValue }\n : prim\n )\n }));\n };\n\n // Update function for AngleElem (element properties)\n const updateAnglElem = (articleName: string, treeid: string, property: keyof AngleElem, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglelem: prev.anglelem.map((elem) =>\n elem.TREEID === treeid && elem.NAME === articleName\n ? { ...elem, [property]: newValue }\n : elem\n )\n }));\n };\n\n // Update function for AnglZone (zone properties)\n const updateAnglZone = (articleName: string, treeid: string, property: keyof AnglZone, newValue: unknown) => {\n setEditableData(prev => ({\n ...prev,\n anglzone: prev.anglzone.map((zone) =>\n zone.TREEID === treeid && zone.NAME === articleName\n ? { ...zone, [property]: newValue }\n : zone\n )\n }));\n };\n\n // Update function for AnglGrtx (custom properties like thickness)\n const updateAnglGrtx = (articleName: string, treeid: string, num: number, newValue: string) => {\n setEditableData(prev => ({\n ...prev,\n anglgrtx: prev.anglgrtx.map((grtx) =>\n grtx.TREEID === treeid &&\n grtx.NUM === num &&\n grtx.NAME === articleName\n ? {\n ...grtx,\n TEXT: newValue,\n DATE_LASTCHANGE: new Date().toISOString()\n }\n : grtx\n )\n }));\n };\n\n // Update function for AnglClie (custom properties like thickness)\n const updateAnglClie = (articleName: string, treeid: string, tagname: string, newValue: string, datatype: number) => {\n setEditableData(prev => ({\n ...prev,\n anglclie: prev.anglclie.map((clie) =>\n clie.TREEID === treeid &&\n clie.TAGNAME === tagname &&\n clie.DATATYPE === datatype &&\n clie.NAME === articleName\n ? {\n ...clie,\n TAGVALUE: newValue,\n DATE_LASTCHANGE: new Date().toISOString()\n }\n : clie\n )\n }));\n };\n\n // Update function for Variables\n const updateVariable = (name: string, newValue: string) => {\n setEditableData(prev => ({\n ...prev,\n variables: prev.variables?.map((variable) =>\n variable.NAME === name\n ? { ...variable, WERT: newValue }\n : variable\n ) || []\n }));\n };\n\n const value = {\n anglElems,\n anglZones,\n anglPrims,\n anglClies,\n anglGrtxs,\n drawerZones,\n\n\n // Construction principle data\n csides,\n kmsList,\n cabins,\n doors,\n drawers,\n cabbacks,\n variables,\n selectedElem,\n setSelectedElem,\n hoveredElem,\n setHoveredElem,\n updateAnglPrim,\n updateAnglElem,\n updateAnglZone,\n updateAnglClie,\n updateAnglGrtx,\n updateVariable,\n // Multi-article support\n getArticleData,\n allData: editableData,\n };\n\n return (\n <DataContext.Provider value={value}>\n {children}\n </DataContext.Provider>\n );\n}\n","import { createContext } from 'react';\r\nimport type { VariableContextValue } from './VariableProvider.tsx';\r\n\r\nexport const VariableContext = createContext<VariableContextValue | undefined>(undefined);\r\n","// ============================= VARIABLE TYPES ===============================================\nexport enum VAR_TYPE {\n None = 0,\n Profile = 2,\n Surface = 3,\n Material = 4,\n Kms = 5,\n Numeric = 100,\n Text = 120,\n color = 29\n}\n\n// ===================== IMOS VARIABLE STRUCTURE (From imos.json) ===============================\nexport interface ImosVariable {\n NAME: string;\n TYP: number;\n WERT: string; // Can be \"300\" or \"$OTHER_VAR\"\n}\n\n// ================================ TYPE GUARDS ============================================\nexport function isVariableReference(value: string): boolean {\n return value.startsWith('$');\n}\n\nexport function extractVariableName(reference: string): string {\n return reference.startsWith('$') ? reference.slice(1) : reference;\n}\n\n// ================================ VARIABLE CONTEXT ============================================\nexport interface VariableContextType {\n // Get a variable's final value (follows $REFERENCE chain)\n getValue: (name: string) => string | number | undefined;\n\n // Set/Update a variable value\n setValue: (name: string, value: string | number) => void;\n\n // Resolve a string containing $VARIABLE references\n resolveString: (str: string) => string;\n\n // Check if a string contains variable references\n hasVariables: (str: string) => boolean;\n\n // Get the raw variable tree (for debugging/inspection)\n getTree: () => Map<string, ImosVariable>;\n}","// ============================================================================\n// ULTRA-SIMPLE VARIABLE RESOLVER\n// Data is already flat with $VAR references in strings\n// ============================================================================\n\nimport {type ImosVariable, VAR_TYPE} from \"./variable.types.ts\";\n\nexport type VariableTree = Map<string, ImosVariable>;\n\n/**\n * Create variable tree - just convert array to Map\n */\nexport function createVariableTree(imosVariables: ImosVariable[]): VariableTree {\n return new Map(imosVariables.map(v => [v.NAME, v]));\n}\n\n/**\n * Get the final value by following $VAR references\n * V1 ($V2) -> V2 ($V3) -> V3 ($V4) -> V4 (400) = 400\n */\nexport function getValue(varName: string, tree: VariableTree, visited = new Set<string>()): string | number | undefined {\n const variable = tree.get(varName);\n if (!variable) return undefined;\n\n // Circular dependency check\n if (visited.has(varName)) {\n console.error(`Circular dependency: ${[...visited, varName].join(' -> ')}`);\n return undefined;\n }\n\n const value = variable.WERT;\n\n // If value starts with $, it's a reference - follow it\n if (value.startsWith('$') && variable.TYP != VAR_TYPE.Text) {\n const refName = value.slice(1); // Remove $\n visited.add(varName);\n return getValue(refName, tree, visited);\n }\n\n // Try to parse as number, otherwise return as string\n const num = Number(value);\n return isNaN(num) ? value : num;\n}\n\n/**\n * Set a variable's value (immutable update)\n */\nexport function setValue(\n varName: string,\n newValue: string | number | boolean,\n tree: VariableTree\n): VariableTree {\n const variable = tree.get(varName);\n if (!variable) {\n // console.warn(`Variable ${varName} not found`);\n return tree;\n }\n\n const newTree = new Map(tree);\n newTree.set(varName, { ...variable, WERT: String(newValue) });\n return newTree;\n}\n\n/**\n * Resolve variables in a string (e.g., \"1:$VAR_M1 mm\" → \"1:300 mm\")\n */\nexport function resolveString(str: string, tree: VariableTree): string {\n return str.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, varName) => {\n const value = getValue(varName, tree);\n return value !== undefined ? String(value) : match;\n });\n}\n\nexport function resolveRecursive(str: string, tree: VariableTree, maxDepth = 10): string {\n let result = str;\n let depth = 0;\n\n while (hasVariables(result) && depth < maxDepth) {\n result = result.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/g, (match, varName) => {\n const value = getValue(varName, tree);\n return value !== undefined ? String(value) : match;\n });\n depth++;\n }\n\n if (depth >= maxDepth) {\n const unresolved = (result.match(/\\$([A-Za-z_][A-Za-z0-9_]*)/g) || []);\n const missing = unresolved.filter(ref => !tree.has(ref.slice(1)));\n if (missing.length > 0) {\n console.warn(`resolveString: undefined variable(s) ${missing.join(', ')} in: ${str}`);\n } else {\n console.warn(`resolveString hit max depth (${maxDepth}), possible circular reference in: ${str}`);\n }\n }\n\n return result;\n}\n\n/**\n * Check if a string contains variable references\n */\nexport function hasVariables(str: string): boolean {\n return /\\$[A-Za-z_][A-Za-z0-9_]*/g.test(str);\n}\n\n/**\n * Extract all variable names from a string\n */\nexport function extractVariableNames(str: string): string[] {\n const matches = str.matchAll(/\\$([A-Za-z_][A-Za-z0-9_]*)/g);\n return Array.from(matches, match => match[1]);\n}","import {type ReactNode, useCallback, useMemo, useState} from 'react';\r\nimport {VariableContext} from './VariableContext.tsx';\r\nimport {createVariableTree, setValue as setValueInTree, type VariableTree} from './VariableResolver.ts';\r\nimport type {ImosVariable} from \"./variable.types.ts\";\r\n\r\nexport interface VariableProviderProps {\r\n children: ReactNode;\r\n imosVariables: ImosVariable[];\r\n}\r\n\r\nexport interface VariableContextValue {\r\n tree: VariableTree;\r\n setVarValue: (name: string, value: string | number | boolean) => void;\r\n}\r\n\r\n/**\r\n * Provides base variable tree from IMOS variable definitions\r\n * Use ArticleRelatedVariableProvider to apply article-specific overrides\r\n */\r\nexport function VariableProvider({ children, imosVariables }: VariableProviderProps) {\r\n // Create base variable tree (no overrides)\r\n const [tree, setTree] = useState<VariableTree>(() => {\r\n return createVariableTree(imosVariables);\r\n });\r\n\r\n // Provide setVarValue that updates the tree state\r\n const setVarValue = useCallback((name: string, value: string | number | boolean) => {\r\n setTree(currentTree => setValueInTree(name, value, currentTree));\r\n }, []);\r\n\r\n // Memoize context value to prevent unnecessary re-renders of consumers\r\n const contextValue = useMemo<VariableContextValue>(() => ({\r\n tree,\r\n setVarValue\r\n }), [tree, setVarValue]);\r\n\r\n return (\r\n <VariableContext.Provider value={contextValue}>\r\n {children}\r\n </VariableContext.Provider>\r\n );\r\n}","import { createContext } from 'react';\nimport type { DescriptorManager } from '../../descriptor/services/DescriptorManager.ts';\n\nexport const DescriptorContext = createContext<DescriptorManager | null>(null);\n","import type {ComparisonOperator} from \"../types/condition.types.ts\";\r\n\r\n// Helper functions\r\nconst safeNumber = (value: unknown): number | null => {\r\n const num = Number(value);\r\n return isNaN(num) ? null : num;\r\n};\r\n\r\nconst safeString = (value: unknown): string => {\r\n return value == null ? '' : String(value);\r\n};\r\n\r\nconst compareNumbers = (\r\n left: unknown,\r\n right: unknown,\r\n compareFn: (l: number, r: number) => boolean\r\n): boolean => {\r\n const l = safeNumber(left);\r\n const r = safeNumber(right);\r\n if (l === null || r === null) return false;\r\n return compareFn(l, r);\r\n};\r\n\r\nconst compareStrings = (\r\n left: unknown,\r\n right: unknown,\r\n compareFn: (l: string, r: string) => boolean\r\n): boolean => {\r\n if (left == null || right == null) return false;\r\n return compareFn(safeString(left), safeString(right));\r\n};\r\n\r\n// Main comparison map\r\nexport const comparisonMap: Record<ComparisonOperator, (left: unknown, right: unknown) => boolean> = {\r\n // Equality\r\n '=': (left, right) => {\r\n if (left == null || right == null) return left === right;\r\n return safeString(left).trim() === safeString(right).trim();\r\n },\r\n '!=': (left, right) => {\r\n if (left == null || right == null) return left !== right;\r\n return safeString(left).trim() !== safeString(right).trim();\r\n },\r\n\r\n // Numeric comparisons - all use compareNumbers helper\r\n '>': (l, r) => compareNumbers(l, r, (a, b) => a > b),\r\n '<': (l, r) => compareNumbers(l, r, (a, b) => a < b),\r\n '>=': (l, r) => compareNumbers(l, r, (a, b) => a >= b),\r\n '<=': (l, r) => compareNumbers(l, r, (a, b) => a <= b),\r\n\r\n // HTML entity versions - reuse same logic\r\n '>': (l, r) => compareNumbers(l, r, (a, b) => a > b),\r\n '>=': (l, r) => compareNumbers(l, r, (a, b) => a >= b),\r\n '<': (l, r) => compareNumbers(l, r, (a, b) => a < b),\r\n '<=': (l, r) => compareNumbers(l, r, (a, b) => a <= b),\r\n\r\n // String operations - all use compareStrings helper\r\n 'B': (l, r) => compareStrings(l, r, (a, b) => a.startsWith(b)),\r\n '!B': (l, r) => compareStrings(l, r, (a, b) => !a.startsWith(b)),\r\n 'E': (l, r) => compareStrings(l, r, (a, b) => a.endsWith(b)),\r\n '!E': (l, r) => compareStrings(l, r, (a, b) => !a.endsWith(b)),\r\n 'C': (l, r) => compareStrings(l, r, (a, b) => a.includes(b)),\r\n '!C': (l, r) => compareStrings(l, r, (a, b) => !a.includes(b)),\r\n};","export const keyMapping: Record<string, string> = {\r\n 'Zusatzfilter 3': 'filter3',\r\n 'Zusatzfilter 4': 'filter4',\r\n // Add more mappings as needed\r\n};","// ============================================================================\n// EXPRESSION RESOLVER WITH IF() SUPPORT\n// Resolves strings with variables, math expressions, and conditional logic\n// ============================================================================\n\nimport {hasVariables, resolveString, type VariableTree} from \"../variables/VariableResolver\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ResolveOptions {\n variableTree?: VariableTree;\n dataType?: 'FL' | 'IN' | 'CI' | 'CS' | 'DA' | string;\n silent?: boolean;\n allowFunctions?: boolean;\n}\n\nexport interface ResolveResult {\n value: number | string | undefined;\n original: string;\n resolved: string;\n hadVariables: boolean;\n wasEvaluated: boolean;\n unit?: string; // ADD THIS\n error?: string;\n}\n\n// ============================================================================\n// MAIN RESOLVER FUNCTION\n// ============================================================================\n\nexport function resolve(\n input: string,\n options: ResolveOptions = {}\n): ResolveResult {\n const { variableTree, dataType, silent = false, allowFunctions = true } = options;\n const UNIT_PATTERN = /^(.+?)\\s*(mm|cm|m|in|ft|px|pt|%|deg|rad)$/i;\n\n\n\n const result: ResolveResult = {\n value: undefined,\n original: input,\n resolved: input,\n hadVariables: false,\n wasEvaluated: false,\n };\n\n try {\n let str = input.trim();\n\n if (UNIT_PATTERN.test(str)) {\n const match = str.match(UNIT_PATTERN);\n if (match) {\n str = match[1].trim(); // Extract expression without unit\n // unit = match[2]; // Store unit (mm, cm, etc.) - currently unused\n }\n }\n\n // Step 1: Resolve variables\n if (variableTree && hasVariables(str)) {\n result.hadVariables = true;\n str = resolveString(str, variableTree);\n result.resolved = str;\n }\n\n // Step 2: Check for IF() statements\n if (isIfStatement(str)) {\n result.wasEvaluated = true;\n result.value = evaluateIfStatement(str, allowFunctions);\n }\n // Step 3: Check if it's a mathematical expression\n else if (isMathExpression(str)) {\n result.wasEvaluated = true;\n result.value = evaluateExpression(str, allowFunctions);\n }\n // Step 4: Not an expression, return as-is or coerce by type\n else {\n result.value = coerceByDataType(str, dataType);\n }\n\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n\n if (!silent) {\n console.error(`[ExpressionResolver] Failed to resolve: \"${input}\"`, error);\n }\n\n result.value = input;\n }\n\n return result;\n}\n\nexport function resolveValue(\n input: string,\n options: ResolveOptions = {}\n): number | string | undefined {\n return resolve(input, options).value;\n}\n\n// ============================================================================\n// IF STATEMENT DETECTION & PARSING\n// ============================================================================\n\n/**\n * Check if a string is an IF statement\n */\nexport function isIfStatement(str: string): boolean {\n if (!str || typeof str !== 'string') return false;\n return /^\\s*IF\\s*\\(/i.test(str.trim());\n}\n\n/**\n * Parse and evaluate an IF statement\n * Format: IF(condition, trueValue, falseValue)\n *\n * Supports:\n * - Comparisons: =, !=, <, >, <=, >=\n * - Logical: AND, OR, NOT\n * - Nested IF statements\n *\n * @example\n * evaluateIfStatement(\"IF(1 = 1, -150, 150)\") // → -150\n * evaluateIfStatement(\"IF(5 > 3, 100, 200)\") // → 100\n */\nexport function evaluateIfStatement(expr: string, allowFunctions: boolean = true): number | string {\n const trimmed = expr.trim();\n\n // Remove outer IF( ... )\n const match = trimmed.match(/^IF\\s*\\((.*)\\)\\s*$/i);\n if (!match) {\n throw new Error(`Invalid IF statement: ${expr}`);\n }\n\n const content = match[1];\n\n // Split into: condition, trueValue, falseValue\n // This is tricky because we need to handle nested parentheses and commas\n const parts = splitIfParts(content);\n\n if (parts.length !== 3) {\n throw new Error(`IF statement must have exactly 3 parts: IF(condition, trueValue, falseValue). Got: ${parts.length} parts`);\n }\n\n const [conditionStr, trueValueStr, falseValueStr] = parts;\n\n // Evaluate the condition\n const conditionResult = evaluateCondition(conditionStr.trim(), allowFunctions);\n\n // Return the appropriate value\n const resultStr = conditionResult ? trueValueStr.trim() : falseValueStr.trim();\n\n // Recursively resolve the result (it might be another IF or expression)\n if (isIfStatement(resultStr)) {\n return evaluateIfStatement(resultStr, allowFunctions);\n } else if (isMathExpression(resultStr)) {\n return evaluateExpression(resultStr, allowFunctions);\n } else {\n // Try to parse as number, fallback to string\n const num = Number(resultStr);\n return isNaN(num) ? resultStr : num;\n }\n}\n\n/**\n * Split IF statement into [condition, trueValue, falseValue]\n * Handles nested parentheses and commas\n */\nfunction splitIfParts(content: string): string[] {\n const parts: string[] = [];\n let current = '';\n let depth = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (char === '(') {\n depth++;\n current += char;\n } else if (char === ')') {\n depth--;\n current += char;\n } else if (char === ',' && depth === 0) {\n parts.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) {\n parts.push(current);\n }\n\n return parts;\n}\n\n// ============================================================================\n// CONDITION EVALUATION\n// ============================================================================\n\n/**\n * Evaluate a boolean condition\n * Supports: =, !=, <, >, <=, >=, AND, OR, NOT\n */\nfunction evaluateCondition(condition: string, allowFunctions: boolean): boolean {\n // Handle logical operators (AND, OR)\n if (/\\bAND\\b/i.test(condition)) {\n const parts = condition.split(/\\bAND\\b/i);\n return parts.every(part => evaluateCondition(part.trim(), allowFunctions));\n }\n\n if (/\\bOR\\b/i.test(condition)) {\n const parts = condition.split(/\\bOR\\b/i);\n return parts.some(part => evaluateCondition(part.trim(), allowFunctions));\n }\n\n // Handle NOT\n if (/^\\s*NOT\\s+/i.test(condition)) {\n const inner = condition.replace(/^\\s*NOT\\s+/i, '').trim();\n return !evaluateCondition(inner, allowFunctions);\n }\n\n // Handle comparison operators\n const comparisonMatch = condition.match(/(.+?)(<=|>=|!=|<>|=|<|>)(.+)/);\n if (!comparisonMatch) {\n throw new Error(`Invalid condition: ${condition}`);\n }\n\n const [, leftStr, operator, rightStr] = comparisonMatch;\n\n // Evaluate both sides (they might be expressions)\n const left = evaluateSide(leftStr.trim(), allowFunctions);\n const right = evaluateSide(rightStr.trim(), allowFunctions);\n\n // Perform comparison\n switch (operator) {\n case '=':\n return left === right;\n case '!=':\n case '<>':\n return left !== right;\n case '<':\n return left < right;\n case '>':\n return left > right;\n case '<=':\n return left <= right;\n case '>=':\n return left >= right;\n default:\n throw new Error(`Unknown operator: ${operator}`);\n }\n}\n\n/**\n * Evaluate one side of a comparison\n * Could be a number, string, or expression\n */\nfunction evaluateSide(str: string, allowFunctions: boolean): number | string {\n // If it's quoted, return as string\n if ((str.startsWith('\"') && str.endsWith('\"')) ||\n (str.startsWith(\"'\") && str.endsWith(\"'\"))) {\n return str.slice(1, -1);\n }\n\n // Try to evaluate as expression\n if (isMathExpression(str)) {\n return evaluateExpression(str, allowFunctions);\n }\n\n // Try to parse as number\n const num = Number(str);\n if (!isNaN(num)) {\n return num;\n }\n\n // Return as string\n return str;\n}\n\n// ============================================================================\n// EXPRESSION DETECTION\n// ============================================================================\n\nexport function isMathExpression(str: string): boolean {\n if (!str || typeof str !== 'string') return false;\n const trimmed = str.trim();\n if (!/[+\\-*/()]/.test(trimmed)) return false;\n const isNumericExpression = /^[\\d\\s+\\-*/().,a-z]+$/i.test(trimmed);\n return isNumericExpression;\n}\n\n// ============================================================================\n// EXPRESSION EVALUATION\n// ============================================================================\n\nconst expressionCache = new Map<string, number>();\n\nexport function evaluateExpression(expr: string, allowFunctions: boolean = true): number {\n const trimmed = expr.trim();\n const cacheKey = `${trimmed}:${allowFunctions}`;\n\n if (expressionCache.has(cacheKey)) {\n return expressionCache.get(cacheKey)!;\n }\n\n let sanitized = trimmed.replace(/\\s+/g, '');\n\n if (allowFunctions) {\n sanitized = sanitized\n .replace(/round\\(/g, 'Math.round(')\n .replace(/floor\\(/g, 'Math.floor(')\n .replace(/ceil\\(/g, 'Math.ceil(')\n .replace(/abs\\(/g, 'Math.abs(')\n .replace(/min\\(/g, 'Math.min(')\n .replace(/max\\(/g, 'Math.max(')\n .replace(/pow\\(/g, 'Math.pow(')\n .replace(/sqrt\\(/g, 'Math.sqrt(');\n }\n\n const validPattern = allowFunctions\n ? /^[\\d+\\-*/().,a-zA-Z]+$/\n : /^[\\d+\\-*/().]+$/;\n\n if (!validPattern.test(sanitized)) {\n throw new Error(`Expression contains invalid characters: ${expr}`);\n }\n\n if (!sanitized) {\n throw new Error('Empty expression');\n }\n\n try {\n const result = Function(`'use strict'; return (${sanitized})`)() as unknown;\n\n if (typeof result !== 'number' || isNaN(result)) {\n throw new Error(`Expression did not evaluate to a number: ${expr}`);\n }\n\n expressionCache.set(cacheKey, result);\n return result;\n\n } catch (error) {\n throw new Error(`Failed to evaluate expression: ${expr} - ${error}`);\n }\n}\n\nexport function clearCache(): void {\n expressionCache.clear();\n}\n\n// ============================================================================\n// TYPE COERCION\n// ============================================================================\n\nfunction coerceByDataType(value: string, dataType?: string): number | string {\n if (!dataType) {\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n\n switch (dataType.toUpperCase()) {\n case 'FL':\n return parseFloat(value);\n case 'IN':\n return parseInt(value, 10);\n case 'CI':\n case 'CS':\n case 'ST':\n return value;\n case 'DA':\n return new Date(value).toISOString();\n default:\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n}\n\n// ============================================================================\n// BATCH RESOLUTION\n// ============================================================================\n\nexport function resolveMany(\n inputs: string[],\n options: ResolveOptions = {}\n): ResolveResult[] {\n return inputs.map(input => resolve(input, options));\n}\n\nexport function resolveObject<T extends Record<string, unknown>>(\n obj: T,\n options: ResolveOptions = {}\n): T {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (typeof value === 'string') {\n result[key] = resolveValue(value, options);\n } else {\n result[key] = value;\n }\n }\n\n return result as T;\n}\n\n// ============================================================================\n// DEBUGGING & UTILITIES\n// ============================================================================\n\nexport function inspect(input: string, options: ResolveOptions = {}): ResolveResult {\n return resolve(input, { ...options, silent: true });\n}\n\nexport function canResolve(input: string, options: ResolveOptions = {}): boolean {\n const result = resolve(input, { ...options, silent: true });\n return !result.error && result.value !== undefined;\n}","import type {ConditionTreeResponse, TreeNode} from \"../types/condition.types.ts\";\r\nimport {comparisonMap} from \"./ComparisonMap.tsx\";\r\nimport {keyMapping} from \"./KeyMap.tsx\";\r\nimport {resolveValue} from \"../../helpers/ExpressionResolver.ts\";\r\n\r\nconst normalizeKey = (key:string) => keyMapping[key] || key;\r\n\r\nexport class ConditionTreeEvaluator {\r\n\r\n static evaluateTree = (\r\n tree: ConditionTreeResponse,\r\n data: Record<string, unknown>,\r\n resolveVarRecursive: (str: string) => string,\r\n ): boolean => {\r\n if (!tree) return false; // Default behavior when a node is null\r\n return tree.roots.every((node) => this.evaluateNode(node, data, resolveVarRecursive));\r\n }\r\n\r\n\r\n static evaluateNode = (\r\n node: TreeNode,\r\n data: Record<string, unknown>,\r\n resolveVarRecursive: (str: string) => string,\r\n ): boolean => {\r\n if (!node) return false; // Default behavior when a node is null\r\n\r\n\r\n if (node.kind === \"comparison\") {\r\n // const leftValue = ([normalizeKey(node.data.LEFTVALUE)]);\r\n // const rightValue = node.data.RIGHTVALUE;\r\n\r\n let leftValue: unknown = node.data.LEFTVALUE;\r\n const normalizedKey = normalizeKey(node.data.LEFTVALUE);\r\n\r\n if (data[normalizedKey] !== undefined) {\r\n leftValue = data[normalizedKey];\r\n } else {\r\n // Resolve as expression/variable\r\n leftValue = resolveValue(resolveVarRecursive(node.data.LEFTVALUE));\r\n }\r\n const rightValue = resolveValue(resolveVarRecursive(node.data.RIGHTVALUE));\r\n\r\n return comparisonMap[node.data.COMPARISONTYPE](leftValue, rightValue)\r\n\r\n }\r\n\r\n if (node.kind === \"operation\") {\r\n const childResults = node.children.map(child => this.evaluateNode(child, data, resolveVarRecursive));\r\n switch (node.data.OPSTRING) {\r\n case \"AND\":return childResults.every(Boolean);\r\n case \"OR\":return childResults.some(Boolean);\r\n case \"NOT\":return !childResults.every(Boolean);\r\n case \"NOT OR\":return !childResults.some(Boolean);\r\n default:return false;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n","import {ConditionTreeEvaluator} from '../../conditions/helpers/ConditionTreeEvaluator';\nimport type {DescriptorEvaluationResult, DescriptorNode, DescriptorResponse} from '../types/descriptor.types';\nimport type {DescriptorTypeValue} from \"../types/descriptor-data.types.ts\";\n\nexport class DescriptorEvaluator {\n static evaluate<T extends DescriptorTypeValue>(\n descriptor: DescriptorResponse<T>,\n data: Record<string, unknown>,\n resolveVarRecursive: (str: string) => string,\n ): DescriptorEvaluationResult<T> {\n\n // Find default node (conditionId = 0 or conditionTree = null)\n const defaultNode = descriptor.nodes.find((node: DescriptorNode) => node.conditionId === 0 || node.conditionTree === null);\n\n // Loop through nodes in order\n for (const node of descriptor.nodes) {\n\n // Skip default node\n if (node.conditionId === 0 || node.conditionTree === null) continue;\n\n // Evaluate the condition tree\n const matches = ConditionTreeEvaluator.evaluateTree(node.conditionTree, data, resolveVarRecursive);\n\n // If condition matches, return this node's lindiv data\n if (matches) {\n return {\n lindiv: node.lindiv,\n nodeNum: node.nodeNum,\n matched: true,\n isDefault: false,\n descriptorType: descriptor.descriptor.DESC_TYPE,\n };\n }\n }\n\n // No node matched, return default\n if (defaultNode) {\n return {\n lindiv: defaultNode.lindiv,\n nodeNum: defaultNode.nodeNum,\n matched: false,\n isDefault: true,\n descriptorType: descriptor.descriptor.DESC_TYPE,\n };\n }\n\n // Fallback if no default exists - return empty data\n throw new Error('No matching node found and no default node exists');\n }\n\n static findAllNonDefaultMatches(\n descriptor: DescriptorResponse,\n data: Record<string, unknown>,\n resolveVarRecursive: (str: string) => string,\n\n ): DescriptorNode[] {\n const matches: DescriptorNode[] = [];\n\n for (const node of descriptor.nodes) {\n // Skip default node\n if (node.conditionId === 0 && node.comment === 'DEFAULT') continue;\n if (node.conditionTree === null) {\n matches.push(node);\n continue;\n }\n\n const matches_condition = ConditionTreeEvaluator.evaluateTree(node.conditionTree, data, resolveVarRecursive);\n\n if (matches_condition) matches.push(node);\n }\n\n return matches;\n }\n}","import {DescriptorEvaluator} from '../helper/DescriptorEvaluator';\nimport type {DescriptorEvaluationResult, DescriptorResponse,} from '../types/descriptor.types';\nimport type {DescriptorTypeValue} from '../types/descriptor-data.types';\n// ============================================================================\n// Descriptor Manager Class\n// ============================================================================\n\nexport class DescriptorManager {\n private descriptors: Map<string, DescriptorResponse>;\n // private variableTree?: VariableTree;\n\n constructor(descriptors: DescriptorResponse[]) {\n // Store descriptors in a Map for fast lookup by name\n this.descriptors = new Map(descriptors.map(desc => [desc.descriptor.NAME, desc]));\n }\n evaluate<T extends DescriptorTypeValue = DescriptorTypeValue>(\n descriptorName: string,\n inputData: Record<string, unknown>,\n resolveVarRecursive: (str: string) => string,\n ): DescriptorEvaluationResult<T> {\n const descriptor = this.getDescriptor(descriptorName);\n\n if (!descriptor) {\n throw new Error(`Descriptor not found: ${descriptorName}`);\n }\n\n return DescriptorEvaluator.evaluate(descriptor as DescriptorResponse<T>, inputData, resolveVarRecursive);\n }\n\n getDescriptor(descriptorName: string): DescriptorResponse | undefined {\n return this.descriptors.get(descriptorName);}\n hasDescriptor(descriptorName: string): boolean {return this.descriptors.has(descriptorName);}\n getDescriptorNames(): string[] {return Array.from(this.descriptors.keys());}\n\n\n getDescriptorsByType(descriptorType: DescriptorTypeValue): DescriptorResponse[] {\n return Array.from(this.descriptors.values()).filter(\n desc => desc.descriptor.DESC_TYPE === descriptorType\n );\n }\n\n findAllMatches(\n descriptorName: string,\n inputData: Record<string, unknown>,\n resolveVarRecursive: (str: string) => string,\n ) {\n const descriptor = this.getDescriptor(descriptorName);\n\n if (!descriptor) {\n throw new Error(`Descriptor not found: ${descriptorName}`);\n }\n\n return DescriptorEvaluator.findAllNonDefaultMatches(descriptor, inputData, resolveVarRecursive);\n }\n\n getStats() {\n const byType: Record<number, number> = {};\n\n for (const descriptor of this.descriptors.values()) {\n const type = descriptor.descriptor.DESC_TYPE;\n byType[type] = (byType[type] || 0) + 1;\n }\n\n return {\n total: this.descriptors.size,\n byType,\n names: this.getDescriptorNames(),\n };\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n// Create a DescriptorManager from JSON data\nexport function createDescriptorManager(\n jsonData: DescriptorResponse[] | { descriptors: DescriptorResponse[] },\n): DescriptorManager {\n const descriptors = Array.isArray(jsonData) ? jsonData : jsonData.descriptors;\n return new DescriptorManager(descriptors);\n}\n","import {type ReactNode, useMemo} from 'react';\nimport {DescriptorContext} from './DescriptorContext.ts';\nimport {DescriptorManager} from '../../descriptor/services/DescriptorManager.ts';\nimport type {DescriptorResponse} from '../../descriptor/types/descriptor.types.ts';\n\nexport interface DescriptorProviderProps {\n children: ReactNode;\n descriptorData: DescriptorResponse[] | unknown[]; // Allow any[] for JSON imports\n}\n\nexport function DescriptorProvider({ children, descriptorData }: DescriptorProviderProps) {\n // Get variable tree from context\n // Create manager once and memoize it (recreates when variables change)\n const manager = useMemo(() => {\n return new DescriptorManager(descriptorData as DescriptorResponse[],);\n }, [descriptorData]);\n\n return (\n <DescriptorContext.Provider value={manager}>\n {children}\n </DescriptorContext.Provider>\n );\n}\n","// src/contexts/material/MaterialContext.tsx\r\n\r\nimport { createContext, useContext } from 'react';\r\nimport type { MaterialTypes } from '../../construction_principle/material/material.types';\r\nimport type { SurfaceTypes } from '../../construction_principle/surface/surface.types';\r\n\r\nexport interface MatSurfContextValue {\r\n // Data\r\n materials: MaterialTypes[];\r\n surfaces: SurfaceTypes[];\r\n\r\n // Loading states\r\n loadingMaterials: Set<string>;\r\n loadingSurfaces: Set<string>;\r\n failedMaterials: Set<string>;\r\n failedSurfaces: Set<string>;\r\n\r\n // Fetching functions (async - use only in useEffect or event handlers)\r\n fetchMaterial: (name: string) => Promise<MaterialTypes | undefined>;\r\n fetchSurface: (name: string) => Promise<SurfaceTypes | undefined>;\r\n\r\n // Queue functions (safe to call during render - no setState)\r\n queueMaterialFetch: (name: string) => void;\r\n queueSurfaceFetch: (name: string) => void;\r\n\r\n // Utility functions\r\n isFetchingMaterial: (name: string) => boolean;\r\n isFetchingSurface: (name: string) => boolean;\r\n hasMaterial: (name: string) => boolean;\r\n hasSurface: (name: string) => boolean;\r\n hasFailedMaterial: (name: string) => boolean;\r\n hasFailedSurface: (name: string) => boolean;\r\n}\r\n\r\nexport const MatSurfContext = createContext<MatSurfContextValue | undefined>(undefined);\r\n\r\n/**\r\n * Hook to access material context\r\n */\r\nexport function useMatSurfs() {\r\n const context = useContext(MatSurfContext);\r\n if (!context) {\r\n throw new Error('useMaterials must be used within MaterialProvider');\r\n }\r\n return context;\r\n}","// src/contexts/material/MaterialProvider.tsx\r\n\r\nimport { useState, useCallback, useMemo, useEffect, useRef, type ReactNode } from 'react';\r\nimport { api } from '../../services/ApiFactory';\r\nimport type { MaterialTypes } from '../../construction_principle/material/material.types';\r\nimport type { SurfaceTypes } from '../../construction_principle/surface/surface.types';\r\nimport {MatSurfContext} from \"./MatSurfContext.tsx\";\r\n\r\nexport interface MatSurfProviderProps {\r\n children: ReactNode;\r\n initialMaterials?: MaterialTypes[];\r\n initialSurfaces?: SurfaceTypes[];\r\n}\r\n\r\nexport function MatSurfProvider({\r\n children,\r\n initialMaterials = [],\r\n initialSurfaces = []\r\n }: MatSurfProviderProps) {\r\n\r\n // ========== State Management ==========\r\n\r\n // Material and surface data (initial + fetched)\r\n const [materials, setMaterials] = useState<MaterialTypes[]>(initialMaterials);\r\n const [surfaces, setSurfaces] = useState<SurfaceTypes[]>(initialSurfaces);\r\n\r\n // Track in-flight requests to prevent duplicates\r\n const [loadingMaterials, setLoadingMaterials] = useState<Set<string>>(new Set());\r\n const [loadingSurfaces, setLoadingSurfaces] = useState<Set<string>>(new Set());\r\n\r\n // Track failed fetches to prevent retrying\r\n const [failedMaterials, setFailedMaterials] = useState<Set<string>>(new Set());\r\n const [failedSurfaces, setFailedSurfaces] = useState<Set<string>>(new Set());\r\n\r\n // ========== Utility Functions ==========\r\n\r\n /**\r\n * Check if material exists in loaded data\r\n */\r\n const hasMaterial = useCallback((name: string): boolean => {\r\n return materials.some(m => m.NAME === name);\r\n }, [materials]);\r\n\r\n /**\r\n * Check if surface exists in loaded data\r\n */\r\n const hasSurface = useCallback((name: string): boolean => {\r\n return surfaces.some(s => s.NAME === name);\r\n }, [surfaces]);\r\n\r\n /**\r\n * Check if material is currently being fetched\r\n */\r\n const isFetchingMaterial = useCallback((name: string): boolean => {\r\n return loadingMaterials.has(name);\r\n }, [loadingMaterials]);\r\n\r\n /**\r\n * Check if surface is currently being fetched\r\n */\r\n const isFetchingSurface = useCallback((name: string): boolean => {\r\n return loadingSurfaces.has(name);\r\n }, [loadingSurfaces]);\r\n\r\n /**\r\n * Check if material previously failed to fetch\r\n */\r\n const hasFailedMaterial = useCallback((name: string): boolean => {\r\n return failedMaterials.has(name);\r\n }, [failedMaterials]);\r\n\r\n /**\r\n * Check if surface previously failed to fetch\r\n */\r\n const hasFailedSurface = useCallback((name: string): boolean => {\r\n return failedSurfaces.has(name);\r\n }, [failedSurfaces]);\r\n\r\n // ========== Queue System (Safe for Render) ==========\r\n\r\n // Queues for deferred fetching (refs don't trigger re-renders)\r\n const materialFetchQueue = useRef<Set<string>>(new Set());\r\n const surfaceFetchQueue = useRef<Set<string>>(new Set());\r\n\r\n // Track if component is mounted\r\n const isMounted = useRef(false);\r\n\r\n // State to trigger re-render when items are queued\r\n const [queueTrigger, setQueueTrigger] = useState(0);\r\n\r\n /**\r\n * Queue a material fetch - SAFE to call during render\r\n * Does NOT trigger setState, just adds to queue\r\n */\r\n const queueMaterialFetch = useCallback((name: string) => {\r\n if (!name || name === '') return\r\n if (hasMaterial(name)) return\r\n if (loadingMaterials.has(name)) return\r\n if (failedMaterials.has(name)) return\r\n\r\n const wasEmpty = materialFetchQueue.current.size === 0;\r\n materialFetchQueue.current.add(name);\r\n\r\n // Trigger re-render if this was the first item (to process queue in useEffect)\r\n // Only trigger if component is mounted to avoid React warning\r\n if (wasEmpty) {\r\n queueMicrotask(() => {\r\n if (isMounted.current) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n });\r\n }\r\n\r\n }, [hasMaterial, loadingMaterials, failedMaterials]);\r\n\r\n /**\r\n * Queue a surface fetch - SAFE to call during render\r\n * Does NOT trigger setState, just adds to queue\r\n */\r\n const queueSurfaceFetch = useCallback((name: string) => {\r\n if (!name || name === '' || name === 'NO_SURF') return;\r\n if (hasSurface(name)) return;\r\n if (loadingSurfaces.has(name)) return;\r\n if (failedSurfaces.has(name)) return;\r\n\r\n const wasEmpty = surfaceFetchQueue.current.size === 0;\r\n surfaceFetchQueue.current.add(name);\r\n\r\n // Trigger re-render if this was the first item (to process queue in useEffect)\r\n // Only trigger if component is mounted to avoid React warning\r\n if (wasEmpty) {\r\n queueMicrotask(() => {\r\n if (isMounted.current) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n });\r\n }\r\n\r\n }, [hasSurface, loadingSurfaces, failedSurfaces]);\r\n\r\n // ========== Fetching Functions ==========\r\n\r\n /**\r\n * Fetch a material by name from API\r\n * @param name - Material NAME to fetch\r\n * @returns Promise resolving to Material or undefined\r\n */\r\n const fetchMaterial = useCallback(async (name: string): Promise<MaterialTypes | undefined> => {\r\n // Validation\r\n if (!name || name === '') {\r\n console.warn('fetchMaterial called with empty name');\r\n return undefined;\r\n }\r\n\r\n // Already have it?\r\n if (hasMaterial(name)) {\r\n return materials.find(m => m.NAME === name);\r\n }\r\n\r\n // Already fetching?\r\n if (loadingMaterials.has(name)) {\r\n return undefined;\r\n }\r\n\r\n // Already failed?\r\n if (failedMaterials.has(name)) {\r\n return undefined;\r\n }\r\n // Mark as fetching\r\n setLoadingMaterials(prev => new Set(prev).add(name));\r\n\r\n try {\r\n const material = await api.materialData().fetchById(name);\r\n\r\n if (material) {\r\n console.log(`[MatSurfProvider] Material \"${name}\" fetched successfully, RENDER=\"${material.RENDER}\"`);\r\n\r\n // Add to materials state\r\n setMaterials(prev => {\r\n // Double-check it wasn't added while fetching\r\n if (prev.some(m => m.NAME === name)) {\r\n console.log(`[MatSurfProvider] Material \"${name}\" already in state, skipping`);\r\n return prev;\r\n }\r\n console.log(`[MatSurfProvider] Adding \"${name}\" to materials (total: ${prev.length + 1})`);\r\n return [...prev, material];\r\n });\r\n\r\n return material;\r\n } else {\r\n console.warn(`[MaterialProvider] Material ${name} not found in database`);\r\n setFailedMaterials(prev => new Set(prev).add(name));\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error(`[MaterialProvider] Failed to fetch material ${name}:`, error);\r\n setFailedMaterials(prev => new Set(prev).add(name));\r\n return undefined;\r\n } finally {\r\n // Remove from fetching set\r\n setLoadingMaterials(prev => {\r\n const next = new Set(prev);\r\n next.delete(name);\r\n return next;\r\n });\r\n }\r\n }, [materials, hasMaterial, loadingMaterials, failedMaterials]);\r\n\r\n /**\r\n * Fetch a surface by name from API\r\n * @param name - Surface NAME to fetch\r\n * @returns Promise resolving to Surface or undefined\r\n */\r\n const fetchSurface = useCallback(async (name: string): Promise<SurfaceTypes | undefined> => {\r\n // Validation\r\n if (!name || name === '' || name === 'NO_SURF') {\r\n return undefined;\r\n }\r\n\r\n // Already have it?\r\n if (hasSurface(name)) return surfaces.find(s => s.NAME === name);\r\n\r\n // Already fetching?\r\n if (loadingSurfaces.has(name)) return undefined;\r\n\r\n // Already failed?\r\n if (failedSurfaces.has(name)) return undefined;\r\n\r\n // Mark as fetching\r\n setLoadingSurfaces(prev => new Set(prev).add(name));\r\n\r\n try {\r\n const surface = await api.surfaceData().fetchById(name);\r\n\r\n if (surface) {\r\n // Add to surfaces state\r\n setSurfaces(prev => {\r\n // Double-check it wasn't added while fetching\r\n if (prev.some(s => s.NAME === name)) {\r\n return prev;\r\n }\r\n return [...prev, surface];\r\n });\r\n\r\n return surface;\r\n } else {\r\n console.warn(`[MaterialProvider] Surface ${name} not found in database`);\r\n setFailedSurfaces(prev => new Set(prev).add(name));\r\n return undefined;\r\n }\r\n } catch (error) {\r\n console.error(`[MaterialProvider] Failed to fetch surface ${name}:`, error);\r\n setFailedSurfaces(prev => new Set(prev).add(name));\r\n return undefined;\r\n } finally {\r\n // Remove from fetching set\r\n setLoadingSurfaces(prev => {\r\n const next = new Set(prev);\r\n next.delete(name);\r\n return next;\r\n });\r\n }\r\n }, [surfaces, hasSurface, loadingSurfaces, failedSurfaces]);\r\n\r\n // ========== Queue Processing (useEffect - Safe for setState) ==========\r\n\r\n /**\r\n * Set mounted flag and process any items queued during initial render\r\n */\r\n useEffect(() => {\r\n isMounted.current = true;\r\n\r\n // Process any items that were queued during initial render\r\n if (materialFetchQueue.current.size > 0 || surfaceFetchQueue.current.size > 0) {\r\n setQueueTrigger(prev => prev + 1);\r\n }\r\n\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n /**\r\n * Process queued material and surface fetches\r\n * Runs when queueTrigger changes (when items are added to queue)\r\n */\r\n useEffect(() => {\r\n // Process material queue\r\n if (materialFetchQueue.current.size > 0) {\r\n const toFetch = Array.from(materialFetchQueue.current);\r\n materialFetchQueue.current.clear();\r\n\r\n toFetch.forEach((name) => {\r\n fetchMaterial(name); // Safe to call setState here\r\n });\r\n }\r\n\r\n // Process surface queue\r\n if (surfaceFetchQueue.current.size > 0) {\r\n const toFetch = Array.from(surfaceFetchQueue.current);\r\n surfaceFetchQueue.current.clear();\r\n\r\n toFetch.forEach((name) => {\r\n fetchSurface(name); // Safe to call setState here\r\n });\r\n }\r\n }, [queueTrigger, fetchMaterial, fetchSurface]); // Only run when queue is updated\r\n\r\n // ========== Context Value ==========\r\n\r\n const contextValue = useMemo(() => ({\r\n materials,\r\n surfaces,\r\n loadingMaterials,\r\n loadingSurfaces,\r\n failedMaterials,\r\n failedSurfaces,\r\n fetchMaterial,\r\n fetchSurface,\r\n queueMaterialFetch,\r\n queueSurfaceFetch,\r\n isFetchingMaterial,\r\n isFetchingSurface,\r\n hasMaterial,\r\n hasSurface,\r\n hasFailedMaterial,\r\n hasFailedSurface\r\n }), [\r\n materials,\r\n surfaces,\r\n loadingMaterials,\r\n loadingSurfaces,\r\n failedMaterials,\r\n failedSurfaces,\r\n fetchMaterial,\r\n fetchSurface,\r\n queueMaterialFetch,\r\n queueSurfaceFetch,\r\n isFetchingMaterial,\r\n isFetchingSurface,\r\n hasMaterial,\r\n hasSurface,\r\n hasFailedMaterial,\r\n hasFailedSurface\r\n ]);\r\n\r\n return (\r\n <MatSurfContext.Provider value={contextValue}>\r\n {children}\r\n </MatSurfContext.Provider>\r\n );\r\n}","export enum VIEW {\r\n _2D_TOP = '2D_TOP',\r\n _2D_FRONT = '2D_FRONT',\r\n _3D = '3D'\r\n}","import {Html} from '@react-three/drei';\nimport {VIEW} from \"../../types/view.types.ts\";\n\ninterface LoadingIndicatorProps {\n message?: string;\n view:VIEW\n insideCanvas?: boolean;\n}\n\n/**\n * Loading indicator that can be used inside or outside Canvas\n */\nexport function LoadingIndicator({view}: LoadingIndicatorProps) {\n const loadingContent = (\n <div style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '10px',\n background: 'rgba(0, 0, 0, 0.8)',\n borderRadius: '8px',\n opacity:0.5,\n color: 'white',\n fontFamily: 'sans-serif'\n }}>\n <div style={{\n width: '10px',\n height: '10px',\n border: '4px solid rgba(255, 255, 255, 0.3)',\n borderTop: '4px solid white',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }} />\n <style>{`\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n\n // If inside Canvas, use Html component from drei\n if (view === VIEW._3D) {\n return (\n <Html center>\n {loadingContent}\n </Html>\n );\n }\n\n // If outside Canvas, use regular div\n return (\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1000\n }}>\n {loadingContent}\n </div>\n );\n}\n\n/**\n * Error display component\n */\nexport function ErrorDisplay({ error, insideCanvas = false }: { error: string; insideCanvas?: boolean }) {\n const errorContent = (\n <div style={{\n padding: '20px',\n background: 'rgba(255, 0, 0, 0.1)',\n border: '2px solid rgba(255, 0, 0, 0.5)',\n borderRadius: '8px',\n color: 'red',\n fontFamily: 'monospace',\n maxWidth: '500px'\n }}>\n <h3 style={{ margin: '0 0 10px 0', color: 'red' }}>Error</h3>\n <p style={{ margin: 0, fontSize: '14px', wordBreak: 'break-word' }}>{error}</p>\n </div>\n );\n\n if (insideCanvas) {\n return (\n <Html center>\n {errorContent}\n </Html>\n );\n }\n\n return (\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 1000\n }}>\n {errorContent}\n </div>\n );\n}\n","import { useContext, useMemo } from 'react';\nimport { VariableContext } from './VariableContext.tsx';\nimport {getValue, resolveString, hasVariables, resolveRecursive} from './VariableResolver.ts';\n\n/**\n * Hook to access variables\n * Provides utilities to work with the variable tree\n */\nexport function useVariables() {\n const context = useContext(VariableContext);\n\n if (!context) {\n throw new Error('useVariables must be used within a VariableProvider');\n }\n\n const { tree, setVarValue } = context;\n\n // Get variable value\n const get = useMemo(() => (name: string) => getValue(name, tree), [tree]);\n\n // Resolve string with variables\n const resolveVar = useMemo(() => (str: string) => resolveString(str, tree), [tree]);\n\n const resolveVarRecursive = useMemo(() => (str : string ) => resolveRecursive(str, tree), [tree]);\n // Check if string has variables\n const has = useMemo(() => (str: string) => hasVariables(str), []);\n\n return {\n tree, // Variable tree\n getValue: get, // Get variable value\n resolveVar,\n resolveVarRecursive,\n hasVariables: has, // Check if string has variables\n setVarValue // Set variable value (updates tree state)\n };\n}","import {type ReactNode, useCallback, useMemo, useState} from 'react';\r\nimport {VariableContext} from '../../variables/VariableContext.tsx';\r\nimport {setValue as setValueInTree} from '../../variables/VariableResolver.ts';\r\nimport {useVariables} from '../../variables/useVariables.ts';\r\nimport type {VariableContextValue} from '../../variables/VariableProvider.tsx';\r\n\r\nexport interface ArticleRelatedVariableProviderProps {\r\n children: ReactNode;\r\n overrides?: Record<string, string | number>;\r\n}\r\n\r\n/**\r\n * Wraps VariableProvider to apply article-specific overrides\r\n * Supports both static overrides (from props) and dynamic changes (from Leva/setVarValue)\r\n *\r\n * Priority: Dynamic Changes > Static Overrides > Parent Tree\r\n */\r\nexport function ArticleRelatedVariableProvider({\r\n children,\r\n overrides\r\n }: ArticleRelatedVariableProviderProps) {\r\n // Get parent variable context (base variables)\r\n const parentContext = useVariables();\r\n\r\n // Track dynamic changes separately from static overrides\r\n const [dynamicChanges, setDynamicChanges] = useState<Map<string, string | number | boolean>>(new Map());\r\n\r\n // Merge: parent tree + static overrides + dynamic changes\r\n const tree = useMemo(() => {\r\n // Start with parent tree\r\n let newTree = new Map(parentContext.tree);\r\n\r\n // Apply static overrides from props\r\n if (overrides) {\r\n Object.entries(overrides).forEach(([name, value]) => {\r\n newTree = setValueInTree(name, value, newTree);\r\n });\r\n }\r\n\r\n // Apply dynamic changes (takes priority over everything)\r\n dynamicChanges.forEach((value, name) => {\r\n newTree = setValueInTree(name, value, newTree);\r\n });\r\n\r\n return newTree;\r\n }, [parentContext.tree, overrides, dynamicChanges]);\r\n\r\n // setVarValue updates dynamic changes (not parent tree)\r\n const setVarValue = useCallback((name: string, value: string | number | boolean) => {\r\n setDynamicChanges(current => {\r\n const newChanges = new Map(current);\r\n newChanges.set(name, value);\r\n return newChanges;\r\n });\r\n }, []);\r\n\r\n // Memoize context value to prevent unnecessary re-renders of consumers\r\n const value = useMemo<VariableContextValue>(() => ({\r\n tree,\r\n setVarValue\r\n }), [tree, setVarValue]);\r\n\r\n return (\r\n <VariableContext.Provider value={value}>\r\n {children}\r\n </VariableContext.Provider>\r\n );\r\n}"," import { useContext } from 'react';\nimport { DataContext } from './DataContext.ts';\n\nexport function useData() {\n const context = useContext(DataContext);\n if (context === undefined) {\n throw new Error('useData must be used within a DataProvider');\n }\n return context;\n}\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\n\r\nexport default function useClieHelper(articleName:string, TREEID:string, TAG:string, DATATYPE:number){\r\n const {getArticleData} = useData();\r\n // Get data for this specific article\r\n const {anglClies} = getArticleData(articleName);\r\n const selected_clie = anglClies.find((item) => item.TREEID === TREEID && item.DATATYPE === DATATYPE && item.TAGNAME === TAG)\r\n if (!selected_clie) return null\r\n\r\n const thickness = Number(selected_clie.TAGVALUE)\r\n\r\n return {\r\n thickness,\r\n }\r\n}","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function useGrtxHelper(articleName:string, TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {resolveVarRecursive} = useVariables()\r\n\r\n const grtxData = getArticleData(articleName).anglGrtxs;\r\n if (!grtxData) return null\r\n const zoneGrtx = grtxData.filter((grtx) => grtx.TREEID === TREEID);\r\n const zoneInfo = new Map<string,string>()\r\n zoneGrtx.map(grtx => zoneInfo.set(`AD zone info0${grtx.NUM + 1}`, resolveVarRecursive(grtx.TEXT)))\r\n\r\n\r\n return {\r\n zoneInfo\r\n }\r\n}\r\n","export function KmsRenderSelector(\r\n materialRender: string | undefined,\r\n surfaceTopRender: string | undefined,\r\n surfaceBottomRender: string | undefined\r\n): string | undefined {\r\n const noTop = !surfaceTopRender || surfaceTopRender === 'NO_RENDER';\r\n const noBottom = !surfaceBottomRender || surfaceBottomRender === 'NO_RENDER';\r\n\r\n // Use material only if both surfaces are NO_SURF/undefined\r\n if (noTop && noBottom) return materialRender;\r\n\r\n // Prefer top surface (exterior/visible)\r\n if (!noTop) return surfaceTopRender;\r\n\r\n // Fall back to bottom surface\r\n if (!noBottom) return surfaceBottomRender;\r\n\r\n // Ultimate fallback\r\n return materialRender;\r\n}","export interface RenderResult {\r\n textureId: string | undefined,\r\n isValid: boolean\r\n}\r\nexport default function RenderHelper(textureId?: string) : RenderResult {\r\n if (!textureId || textureId === '') {\r\n return {\r\n textureId: undefined,\r\n isValid: false\r\n };\r\n }\r\n\r\n return {\r\n textureId: textureId,\r\n isValid: true\r\n };\r\n}","import RenderHelper, {type RenderResult} from \"../render/RenderHelper.tsx\";\r\nimport {type MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport type {MaterialTypes} from \"./material.types.ts\";\r\n\r\nexport interface MatResult extends MaterialTypes{\r\n renderInfo: RenderResult;\r\n}\r\n\r\nexport default function MatHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n materialName:string,\r\n) : MatResult | undefined {\r\n const {materials, queueMaterialFetch, isFetchingMaterial, hasMaterial, hasFailedMaterial} = matSurfContext\r\n\r\n const material = materials.find((material) => material.NAME === materialName)\r\n\r\n // Skip invalid material names (empty, \"0\", etc.)\r\n const isValidMaterialName = materialName && materialName !== '' && materialName !== '0';\r\n\r\n if (!material && isValidMaterialName){\r\n if (!isFetchingMaterial(materialName) && !hasMaterial(materialName) && !hasFailedMaterial(materialName)) {\r\n console.log(`[MatHelper] Queuing fetch for \"${materialName}\"`);\r\n }\r\n queueMaterialFetch(materialName); // Safe during render - no setState\r\n }\r\n\r\n if (!material) return undefined\r\n\r\n // Resolve RENDER value before passing to RenderHelper\r\n const resolvedRender = resolveVarRecursive(material?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...material, renderInfo}\r\n}","import RenderHelper, {type RenderResult} from \"../render/RenderHelper.tsx\";\r\nimport {type MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport type {SurfaceTypes} from \"./surface.types.ts\";\r\n\r\nexport interface SurfResult extends SurfaceTypes{\r\n renderInfo: RenderResult;\r\n}\r\n\r\nexport default function SurfHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n surfaceName:string\r\n): SurfResult | undefined {\r\n const {surfaces, queueSurfaceFetch, isFetchingSurface, hasSurface, hasFailedSurface} = matSurfContext\r\n\r\n const surface = surfaces.find((surface) => surface.NAME === surfaceName)\r\n\r\n // Skip invalid surface names (empty, \"0\", etc.)\r\n const isValidSurfaceName = surfaceName && surfaceName !== '' && surfaceName !== '0';\r\n\r\n if (!surface && isValidSurfaceName) {\r\n // Only log if we're actually going to queue it (not already loading/failed)\r\n if (!isFetchingSurface(surfaceName) && !hasSurface(surfaceName) && !hasFailedSurface(surfaceName)) {\r\n console.log(`[SurfHelper] Surface ${surfaceName} not found, queuing fetch`);\r\n }\r\n queueSurfaceFetch(surfaceName); // Safe during render - no setState\r\n }\r\n\r\n if (!surface) return undefined\r\n\r\n // Resolve RENDER value before passing to RenderHelper\r\n const resolvedRender = resolveVarRecursive(surface?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...surface,renderInfo}\r\n}\r\n","import {KmsRenderSelector} from \"./KmsRenderSelector.ts\";\r\nimport MatHelper, {type MatResult} from \"../material/MatHelper.ts\";\r\nimport SurfHelper, {type SurfResult} from \"../surface/SurfHelper.ts\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface KmsResult {\r\n name:string;\r\n material:MatResult | undefined;\r\n surfaceTop:SurfResult | undefined;\r\n surfaceBot:SurfResult | undefined;\r\n render:string | undefined\r\n thk:number\r\n}\r\n\r\nexport default function KmsHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,\r\n NAME: string\r\n) : KmsResult | undefined {\r\n const resolvedName = resolveVarRecursive(NAME)\r\n const currentKms = articleData.kmsList.find((kms) => kms.NAME === resolvedName)\r\n if (!currentKms) {\r\n console.log(`KMS ${resolvedName} not found`)\r\n return undefined\r\n }\r\n const materialName = resolveVarRecursive(currentKms?.MATERIAL || '')\r\n const surfaceTopName = resolveVarRecursive(currentKms?.SURF0 || '')\r\n const surfaceBottomName = resolveVarRecursive(currentKms?.SURF1 || '')\r\n\r\n const material = MatHelper(resolveVarRecursive,matSurfContext,materialName)\r\n const surfaceTop = SurfHelper(resolveVarRecursive,matSurfContext,surfaceTopName)\r\n const surfaceBottom = SurfHelper(resolveVarRecursive,matSurfContext,surfaceBottomName)\r\n\r\n const render = KmsRenderSelector(material?.renderInfo.textureId, surfaceTop?.renderInfo.textureId, surfaceBottom?.renderInfo.textureId)\r\n\r\n return {\r\n name : resolvedName,\r\n material : material,\r\n surfaceTop : surfaceTop,\r\n surfaceBot : surfaceBottom,\r\n render:render,\r\n thk :(material?.THK || 0) + ( surfaceTop?.THK || 0 ) + (surfaceBottom?.THK || 0)\r\n }\r\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface SidePanelResult {\r\n kms: KmsResult | undefined;\r\n}\r\n\r\nexport default function CSideHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,NAME:string) : SidePanelResult | undefined{\r\n const currentCP = articleData.csides.find((cside) => cside.NAME === NAME)\r\n if (!currentCP) {\r\n return undefined\r\n }\r\n const kms = KmsHelper(resolveVarRecursive,matSurfContext, articleData,currentCP.KMS)\r\n return {\r\n kms\r\n }\r\n}","import type {AnglZone} from \"./data.types.tsx\";\nimport type {DimensionProps} from \"./zone.types.tsx\";\n\nexport type DivisionDirection = 'A' | 'D' | 'H' | 'I' | 'V'; // H=Horizontal, V=Vertical\nexport type HorizontalDefType = '2' | 'A' | 'D' | 'P' | 'W'; // W=Width, D=Depth, P=Perpendicular\n// export type DividerType = 'A' | 'B' | 'C' | 'D' | 'F' | 'P' | 'S' | 'T' | 'V'\nexport enum DividerType {\n adjShelf= 'A',\n fixShelf = 'F',\n topShelf = 'T',\n botShelf = 'B',\n virtual = 'V',\n sidePanel = 'S',\n addPanel = 'D',\n partition = 'P',\n backPanel = 'C',\n}\ntype DividerProps = Pick<AnglZone, 'NAME' | 'TREEID' | 'DIVDIR' | 'DIVTYPE' | 'HORDEFTYPE' | 'LINDIV1' | 'DIVELEM1' | 'DIVIDER'>\n\nexport const DividerTypeConst = {\n LINEAR_DIVISION: 'linear-division',\n ARTICLE: 'article',\n} as const;\n\nexport const ValueSourceConst = {\n STRING: 'string', // Direct value\n DESCRIPTOR: 'descriptor', // Value from descriptor evaluation\n} as const;\n\n// Base divider information shared by all types\ninterface BaseDivider {\n NAME: string;\n TREEID: string\n DIVDIR: DivisionDirection;\n DIVTYPE: DividerType;\n HORDEFTYPE: HorizontalDefType;\n LINDIV1: string; // Linear division formula\n DIVELEM1: number; // Division element ID\n DIVIDER: string\n}\n\n// ============================================================================\n// LINEAR DIVISION TYPES (Nested Discrimination)\n// ============================================================================\n\n// Linear Division - String Type (e.g., \"1:1:1\" or \"200mm:1:1\")\nexport interface LinearDivisionString extends BaseDivider {\n type: typeof DividerTypeConst.LINEAR_DIVISION;\n valueSource: typeof ValueSourceConst.STRING;\n thickness: number;\n}\n\n// Linear Division - Descriptor Type (e.g., \"#DESCRIPTOR_NAME\")\nexport interface LinearDivisionDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.LINEAR_DIVISION;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n thickness: number;\n descriptorName:string\n}\n\n// Union of linear division types\nexport type LinearDivisionMode = LinearDivisionString | LinearDivisionDescriptor;\n\n\n// ============================================================================\n// ARTICLE DIVIDER\n// ============================================================================\n\nexport interface ArticleString extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.STRING;\n}\n\n// Article - Descriptor Reference\nexport interface ArticleDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n matchesArticles?: string[];\n descriptorName:string\n}\n\nexport type ArticleMode = ArticleString | ArticleDescriptor;\n\n// ============================================================================\n// MAIN UNION TYPE\n// ============================================================================\n\nexport type DividerMode = LinearDivisionMode | ArticleMode;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n\nexport const isDivider = {\n // Check if divider is linear division (any source)\n linearDivision: (divider: DividerMode): divider is LinearDivisionMode => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION;\n },\n\n // Check if divider is article (any source)\n article: (divider: DividerMode): divider is ArticleMode => {\n return divider.type === DividerTypeConst.ARTICLE;\n },\n};\n\nexport const isLinearDivision = {\n // Check if linear division uses direct string formula\n string: (divider: DividerMode): divider is LinearDivisionString => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION &&\n divider.valueSource === ValueSourceConst.STRING;\n },\n\n // Check if linear division uses descriptor\n descriptor: (divider: DividerMode): divider is LinearDivisionDescriptor => {\n return divider.type === DividerTypeConst.LINEAR_DIVISION &&\n divider.valueSource === ValueSourceConst.DESCRIPTOR;\n },\n};\n\nexport const isArticle = {\n // Check if article uses direct string name\n string: (divider: DividerMode): divider is ArticleString => {\n return divider.type === DividerTypeConst.ARTICLE &&\n divider.valueSource === ValueSourceConst.STRING;\n },\n\n // Check if article uses descriptor\n descriptor: (divider: DividerMode): divider is ArticleDescriptor => {\n return divider.type === DividerTypeConst.ARTICLE &&\n divider.valueSource === ValueSourceConst.DESCRIPTOR;\n },\n};\n\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport const createDivider = {\n // Create a linear division with string formula\n linearDivisionString(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n DIVIDER: string,\n thickness: number,\n ): LinearDivisionString {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER,\n thickness,\n };\n },\n\n // Create a linear division with descriptor reference\n // Create linear division with descriptor reference\n linearDivisionDescriptor(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n DIVIDER: string,\n thickness: number,\n descriptorName:string\n ): LinearDivisionDescriptor {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER,\n thickness,\n descriptorName\n };\n },\n\n\n // Create an article divider\n // Create article with direct name string\n articleString(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVIDER: string,\n DIVELEM1: number,\n ): ArticleString {\n return {\n NAME,\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVIDER,\n DIVELEM1,\n };\n },\n\n // Create article with descriptor reference\n articleDescriptor(\n NAME: string,\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVIDER: string,\n DIVELEM1: number,\n descriptorName:string\n ): ArticleDescriptor {\n return {\n NAME,\n TREEID,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVIDER,\n DIVELEM1,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.DESCRIPTOR,\n matchesArticles: [],\n descriptorName\n };\n },\n // Smart factory: Automatically determines type and source\n fromZoneData(divProps: DividerProps, thickness: number): DividerMode {\n const isDescriptor = (value: string) => value.trim().startsWith('#');\n const descriptorName = divProps.DIVIDER.substring(1)\n // ========== ARTICLE DIVIDER ==========\n if (divProps.DIVDIR === 'A') {\n // Article with descriptor reference\n if (isDescriptor(divProps.DIVIDER)) {\n return createDivider.articleDescriptor(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVIDER,\n divProps.DIVELEM1,\n descriptorName\n );\n }\n\n // Article with direct name string\n return createDivider.articleString(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVIDER,\n divProps.DIVELEM1,\n );\n }\n\n // ========== LINEAR DIVISION ==========\n // Linear division with descriptor reference\n if (isDescriptor(divProps.LINDIV1)) {\n return createDivider.linearDivisionDescriptor(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER,\n thickness,\n descriptorName\n );\n }\n\n // Linear division with direct formula string\n return createDivider.linearDivisionString(\n divProps.NAME,\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER,\n thickness\n );\n },\n};\n\n// Get which axis is being divided\nexport function getDividedAxis(divider?: DividerMode): 'width' | 'depth' | 'height' {\n if (!divider) return 'width'\n const PERPENDICULAR_AXIS_MAP: Record<number, 'width' | 'depth'> = {\n 0: 'width',\n 1: 'depth',\n 2: 'width',\n 3: 'depth',\n };\n\n if (divider.DIVDIR === 'V') {\n return 'height';\n }\n\n if (divider.HORDEFTYPE === 'W') {\n return 'width';\n } else if (divider.HORDEFTYPE === 'D') {\n return 'depth';\n } else if (divider.HORDEFTYPE === 'P') {\n return PERPENDICULAR_AXIS_MAP[divider.DIVELEM1] ?? 'width';\n }\n\n return 'width';\n}\n\nexport function getDividedLength(axis: 'width' | 'depth' | 'height', dimensions?: DimensionProps): number {\n if (!dimensions) return 0;\n return dimensions[axis];\n}\n\n// Check if divider divides horizontally\nexport function isHorizontalDivision(divider: DividerMode): boolean {\n return divider.DIVDIR === 'H';\n}\n\n// Check if divider divides vertically\nexport function isVerticalDivision(divider: DividerMode): boolean {\n return divider.DIVDIR === 'V';\n}","import type {ZoneProps} from \"./zone.types.tsx\";\r\nimport type {ElemHelperType} from \"./helper.types.ts\";\r\n\r\nexport enum ElemPartType {\r\n SidePanel = 'S',\r\n Door = 'D',\r\n Back = 'B',\r\n Shelf = 'H',\r\n}\r\n\r\nexport enum ElemTrimType{\r\n short = 'S',\r\n long = 'L',\r\n mitre = 'M',\r\n perpendicular = 'P'\r\n}\r\n\r\nexport interface ElemProps extends ZoneProps {\r\n helper: {\r\n front: ElemHelperType | null;\r\n left: ElemHelperType | null;\r\n right: ElemHelperType | null;\r\n back: ElemHelperType | null;\r\n };\r\n}","export enum DrawerType{\n Drawer = 'Dr'\n}","import {DividerType} from '../../types/divider.types';\nimport {ElemPartType} from \"../../types/Elem.types.tsx\";\nimport {DrawerType} from \"../drawer/dto/drawer.types.ts\";\n\n\nexport type PartTypeSource = 'elem' | 'divider' | 'drawer';\n\n// ============================================================================\n// MAPPING CONFIG\n// ============================================================================\nconst TYPE_TO_HELPER = {\n elem: {\n [ElemPartType.Shelf]: 'Cabin',\n [ElemPartType.SidePanel]: 'Side',\n [ElemPartType.Back]: 'Back',\n [ElemPartType.Door]: 'Door',\n },\n divider: {\n [DividerType.adjShelf]: 'Cabin',\n [DividerType.fixShelf]: 'Cabin',\n [DividerType.topShelf]: 'Cabin',\n [DividerType.botShelf]: 'Cabin',\n [DividerType.addPanel]: 'Cabin',\n [DividerType.partition]: 'Cabin',\n [DividerType.sidePanel]: 'Side',\n [DividerType.backPanel]: 'Back',\n [DividerType.virtual]: null,\n },\n drawer:{\n [DrawerType.Drawer]:'drawer'\n }\n} as const;\n\n// ============================================================================\n// AUTO-GENERATED SETS\n// ============================================================================\nfunction createTypeSets<T extends string>(mapping: Record<string, string | null>, helper: string) {\n return new Set(\n Object.entries(mapping)\n .filter(([_, h]) => h === helper)\n .map(([type]) => type as T)\n );\n}\n\n// Elem Sets\nexport const ElemCabinTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Cabin');\nexport const ElemCSideTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Side');\nexport const ElemCabBackTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Back');\nexport const ElemDoorTypes = createTypeSets<ElemPartType>(TYPE_TO_HELPER.elem, 'Door');\n\n// Divider Sets\nexport const DividerCabinTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Cabin');\nexport const DividerCSideTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Side');\nexport const DividerCabBackTypes = createTypeSets<DividerType>(TYPE_TO_HELPER.divider, 'Back');\n\n// ============================================================================\n// TYPE GUARDS\n// ============================================================================\nexport const isCabinType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCabinTypes.has(type as ElemPartType)\n : DividerCabinTypes.has(type as DividerType);\n\nexport const isCSideType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCSideTypes.has(type as ElemPartType)\n : DividerCSideTypes.has(type as DividerType);\n\nexport const isCabBackType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemCabBackTypes.has(type as ElemPartType)\n : DividerCabBackTypes.has(type as DividerType);\n\nexport const isDoorType = (type: ElemPartType | DividerType | DrawerType, source: PartTypeSource): boolean =>\n source === 'elem'\n ? ElemDoorTypes.has(type as ElemPartType)\n : false\n\nexport const isDrawerType = (source: PartTypeSource): boolean => source === 'drawer';\n\n","import {ElemPartType} from \"../../types/Elem.types.tsx\";\nimport {type SidePanelResult} from \"../side_panel/CSideHelper.tsx\";\nimport type {BackPanelResult} from \"../cabBack/CabBackHelper.tsx\";\nimport type {DoorResult} from \"../door/DoorHelper.ts\";\nimport type {ShelfResult} from \"../cabin/CabinHelper.ts\";\nimport type {DrawerHelperResult} from \"../drawer/DrawerHelper.tsx\";\nimport {DrawerType} from \"../drawer/dto/drawer.types.ts\";\n\nexport type CpDispatcherResult =\n | { name: string; type: ElemPartType.SidePanel; props: SidePanelResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Back; props: BackPanelResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Door; props: DoorResult | undefined; thk: number }\n | { name: string; type: ElemPartType.Shelf; props: ShelfResult | undefined; thk: number }\n | { name: string; type: DrawerType.Drawer; props: DrawerHelperResult | undefined, thk:number }\n\n\n// ============================================================================\n// RESULT TYPE GUARDS (for narrowing CpDispatcherResult)\n// ============================================================================\n\nexport function isCpDescriptor (cpName:string): boolean {\n return cpName.startsWith('#')\n}\n\nexport function isCpVariable(cpName:string) : boolean {\n return cpName.startsWith('$')\n}\n\nexport function isSidePanel(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.SidePanel;\n props: SidePanelResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.SidePanel && cp.props !== undefined;\n}\n\nexport function isBackPanel(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Back;\n props: BackPanelResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Back && cp.props !== undefined;\n}\n\nexport function isDoor(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Door;\n props: DoorResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Door && cp.props !== undefined;\n}\n\nexport function isShelf(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: ElemPartType.Shelf;\n props: ShelfResult;\n thk: number;\n} {\n return cp !== undefined && cp.type === ElemPartType.Shelf && cp.props !== undefined;\n}\n\nexport function isDrawer(cp: CpDispatcherResult | undefined): cp is {\n name: string;\n type: DrawerType.Drawer;\n props: DrawerHelperResult;\n thk:number;\n} {\n return cp !== undefined && cp.type === DrawerType.Drawer && cp.props !== undefined;\n}\n","/*\n * React Hook for Descriptor Evaluation\n *\n * Provides easy descriptor evaluation with automatic re-evaluation\n * when input data changes.\n */\n\nimport {useMemo} from 'react';\nimport type {DescriptorManager} from '../../descriptor/services/DescriptorManager.ts';\nimport type {DescriptorEvaluationResult, DescriptorNode,} from '../../descriptor/types/descriptor.types.ts';\nimport type {DescriptorTypeValue} from '../../descriptor/types/descriptor-data.types.ts';\n\n// =========================== Hook: useDescriptorEvaluation =================================================\n\nexport interface UseDescriptorOptions {\n /** Throw error if descriptor not found (default: false) */\n throwOnError?: boolean;\n}\n\nexport interface UseDescriptorResult<T extends DescriptorTypeValue> {\n /** Evaluation result (null if error and throwOnError=false) */\n result: DescriptorEvaluationResult<T> | null;\n /** Error message if evaluation failed */\n error: string | null;\n /** Whether evaluation was successful */\n success: boolean;\n}\n\n//Hook to evaluate a descriptor with automatic re-evaluation on input change\nexport function useDescriptorEvaluation<T extends DescriptorTypeValue = DescriptorTypeValue>(\n manager: DescriptorManager,\n descriptorName: string | undefined,\n inputData: Record<string, unknown>,\n options: UseDescriptorOptions = {},\n resolveVarRecursive: (str: string) => string,\n): UseDescriptorResult<T> {\n const { throwOnError = false } = options;\n\n // Handle undefined or non-existent descriptor gracefully\n descriptorName = descriptorName?.replace('#','')\n const descriptorExists = descriptorName ? manager.hasDescriptor(descriptorName) : false;\n\n return useMemo(() => {\n // Return null result if descriptor doesn't exist\n if (!descriptorExists || !descriptorName) {\n return {\n result: null,\n error: null,\n success: false,\n };\n }\n\n try {\n const result = manager.evaluate<T>(descriptorName, inputData, resolveVarRecursive);\n\n return {\n result,\n error: null,\n success: true,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n if (throwOnError) {\n throw error;\n }\n\n return {\n result: null,\n error: errorMessage,\n success: false,\n };\n }\n }, [manager, descriptorName, inputData, throwOnError, descriptorExists]);\n}\n\n// ============================= Hook: useDescriptorMatches ===============================================\n\nexport interface UseDescriptorMatchesResult {\n /** All matching nodes */\n matches: DescriptorNode[];\n /** Error message if evaluation failed */\n error: string | null;\n /** Number of matches found */\n count: number;\n}\n\n//Hook to find all matching nodes for a descriptor/\nexport function useDescriptorMatches(\n manager: DescriptorManager,\n descriptorName: string | undefined,\n inputData: Record<string, unknown>,\n resolveVarRecursive: (str: string) => string,\n): UseDescriptorMatchesResult {\n return useMemo(() => {\n descriptorName = descriptorName?.replace('#','')\n const descriptorExists = descriptorName ? manager.hasDescriptor(descriptorName) : false;\n\n if (!descriptorExists || !descriptorName) {\n return {\n matches: [],\n error: null,\n count: 0,\n };\n }\n\n try {\n const matches = manager.findAllMatches(descriptorName, inputData, resolveVarRecursive);\n\n return {\n matches,\n error: null,\n count: matches.length,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n return {\n matches: [],\n error: errorMessage,\n count: 0,\n };\n }\n }, [manager, descriptorName, inputData, resolveVarRecursive]);\n}\n\n// ================================= Hook: useDescriptorExists ===========================================\n\n//Hook to check if a descriptor exists\nexport function useDescriptorExists(manager: DescriptorManager, descriptorName: string): boolean {\n return useMemo(\n () => manager.hasDescriptor(descriptorName),\n [manager, descriptorName]\n );\n}\n\n// =============================== Hook: useDescriptorList =============================================\n\nexport interface UseDescriptorListOptions {\n /** Filter by descriptor type */\n type?: DescriptorTypeValue;\n}\n\n//Hook to get list of available descriptors\nexport function useDescriptorList(manager: DescriptorManager, options: UseDescriptorListOptions = {}): string[] {\n const { type } = options;\n\n return useMemo(() => {\n if (type !== undefined) {\n const descriptors = manager.getDescriptorsByType(type);\n return descriptors.map(d => d.descriptor.NAME);\n }\n\n return manager.getDescriptorNames();\n }, [manager, type]);\n}\n","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {DataContextType} from \"../../types/data.types.tsx\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\n\nexport interface BackPanelResult {\n kms: KmsResult | undefined;\n inset: string;\n}\nexport function CabBackHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME:string) : BackPanelResult | undefined {\n const currentCP = articleData.cabbacks?.find((value) => value.NAME === NAME)\n if (!currentCP) return undefined\n\n const kmsName = currentCP.KMS\n const kms = KmsHelper(resolveVarRecursive, matSurfContext, articleData,kmsName || '')\n return {\n kms,\n inset : String(currentCP.INSET),\n }\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {DataContextType} from \"../../types/data.types.tsx\";\nimport type {DoorTypes} from \"./door.types.ts\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\n\nexport interface DoorResult extends Omit<DoorTypes, 'kmsLeft' | 'kmsRight'> {\n kmsL: KmsResult | undefined;\n kmsR: KmsResult | undefined;\n}\n\nexport default function DoorHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME: string) : DoorResult | undefined {\n const currentCP = articleData.doors.find((value) => value.name === NAME)\n if (!currentCP) {return undefined}\n\n const kmsLeft = KmsHelper(resolveVarRecursive,matSurfContext,articleData,currentCP.kmsLeft || '')\n const kmsRight = KmsHelper(resolveVarRecursive,matSurfContext, articleData,currentCP.kmsRight || '')\n return {\n ...currentCP,\n kmsL : kmsLeft,\n kmsR : kmsRight,\n }\n}","import KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\r\nimport type {DataContextType} from \"../../types/data.types.tsx\";\r\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\n\r\nexport interface ShelfResult {\r\n kms: KmsResult | undefined;\r\n}\r\n\r\nexport default function CabinHelper(\r\n resolveVarRecursive: (str: string) => string,\r\n matSurfContext: MatSurfContextValue,\r\n articleData:DataContextType,\r\n NAME: string\r\n) : ShelfResult | undefined {\r\n const currentCP = articleData.cabins.find((cside) => cside.NAME === NAME)\r\n if (!currentCP) {return undefined}\r\n const kmsName = currentCP.KMS\r\n const kms = KmsHelper(resolveVarRecursive,matSurfContext, articleData,kmsName || '')\r\n return {\r\n kms,\r\n }\r\n}","import type {DataContextType} from \"../../types/data.types.tsx\";\nimport KmsHelper, {type KmsResult} from \"../kms/KmsHelper.tsx\";\nimport type {MatSurfContextValue} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\nimport CSideHelper from \"../side_panel/CSideHelper.tsx\";\n\ninterface DrCpResult{\n kms?:KmsResult, inset:number\n}\n\nexport interface DrawerHelperResult {\n bottom:DrCpResult\n front:DrCpResult\n left:DrCpResult\n back:DrCpResult\n right:DrCpResult\n}\n\nexport default function DrawerHelper(\n resolveVarRecursive: (str: string) => string,\n matSurfContext: MatSurfContextValue,\n articleData:DataContextType,\n NAME: string\n) :\n // resolveVarRecursive, matSurfContext, articleData, cpNameResult\n DrawerHelperResult | undefined{\n\n const currentCp = articleData.drawers.find((item) => item.NAME === NAME)\n\n if (!currentCp) return undefined\n // Extract data safely - use empty defaults if currentCp doesn't exist\n const front = currentCp.front\n const BOTSHELF = currentCp.BOTSHELF\n const elems = currentCp.elems || []\n\n const bsPdName = BOTSHELF ? resolveVarRecursive(BOTSHELF) : undefined\n const frPdName = front?.PART_DEF ? resolveVarRecursive(front.PART_DEF) : undefined\n\n // useKmsHelper is not a real hook (no React hooks inside), safe to call conditionally\n const bsKMS = bsPdName ? KmsHelper(resolveVarRecursive, matSurfContext, articleData, bsPdName) : undefined\n const frKMS = frPdName ? KmsHelper(resolveVarRecursive, matSurfContext, articleData, frPdName) : undefined\n\n // UseCpDispatcher IS a real hook - must call unconditionally with same order every render\n const riKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[1]?.CPNAME)?.kms\n const bkKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[2]?.CPNAME)?.kms\n const lsKMS = CSideHelper(resolveVarRecursive, matSurfContext,articleData, elems[3]?.CPNAME)?.kms\n\n // inset not from DB\n const resultBs = {kms : bsKMS, inset : 12}\n const resultFr = {kms : frKMS, inset : -2.5}\n const resultRi = {kms : riKMS, inset : 12}\n const resultLe = {kms : lsKMS, inset : 12}\n const resultBk = {kms : bkKMS, inset : 12}\n\n return {\n bottom : resultBs,\n front : resultFr,\n right : resultRi,\n back : resultBk,\n left : resultLe\n }\n}","import CSideHelper from \"../construction_principle/side_panel/CSideHelper.tsx\";\r\nimport type {DataContextType} from \"../types/data.types.tsx\";\r\nimport {DividerType} from \"../types/divider.types.ts\";\r\nimport {ElemPartType} from \"../types/Elem.types.tsx\";\r\nimport {\r\n isCabBackType,\r\n isCabinType,\r\n isCSideType,\r\n isDoorType,\r\n isDrawerType,\r\n type PartTypeSource\r\n} from \"../construction_principle/dto/angl-type-config.ts\";\r\nimport {\r\n type CpDispatcherResult,\r\n isCpDescriptor,\r\n isCpVariable\r\n} from \"../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {useDescriptorEvaluation} from \"../contexts/descriptor/useDescriptor.ts\";\r\nimport type {DescriptorManager} from \"../descriptor/services/DescriptorManager.ts\";\r\nimport {useMemo} from \"react\";\r\nimport {useVariables} from \"../variables/useVariables.ts\";\r\nimport {useMatSurfs} from \"../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {CabBackHelper} from \"../construction_principle/cabBack/CabBackHelper.tsx\";\r\nimport DoorHelper from \"../construction_principle/door/DoorHelper.ts\";\r\n\r\nimport CabinHelper from \"../construction_principle/cabin/CabinHelper.ts\";\r\nimport DrawerHelper from \"../construction_principle/drawer/DrawerHelper.tsx\";\r\nimport {DrawerType} from \"../construction_principle/drawer/dto/drawer.types.ts\";\r\n\r\nexport default function UseCpDispatcher(\r\n articleData: DataContextType,\r\n cpName: string,\r\n cpType: ElemPartType | DividerType | DrawerType,\r\n source:PartTypeSource,\r\n descriptorManager?:DescriptorManager,\r\n inputData?:Record<string, unknown>,\r\n) : CpDispatcherResult | undefined\r\n{\r\n const {resolveVarRecursive} = useVariables()\r\n const matSurfContext = useMatSurfs()\r\n let cpNameResult = cpName\r\n if (isCpDescriptor(cpName) && descriptorManager){\r\n const {result} = useDescriptorEvaluation(descriptorManager, cpName, inputData || {}, {}, resolveVarRecursive);\r\n cpNameResult = result ? result?.lindiv : cpName\r\n }else if (isCpVariable(cpName)){\r\n cpNameResult = resolveVarRecursive(cpName);\r\n }\r\n\r\n\r\n return useMemo(() => {\r\n if (!cpNameResult || cpNameResult === '') return undefined;\r\n switch (true) {\r\n case isCSideType(cpType, source): {\r\n const cpHelper = CSideHelper(resolveVarRecursive,matSurfContext, articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.SidePanel,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }\r\n case isCabBackType(cpType,source): {\r\n const cpHelper = CabBackHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Back,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }\r\n case isDoorType(cpType,source): {\r\n const cpHelper = DoorHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Door,\r\n props: cpHelper,\r\n thk: cpHelper?.kmsL?.thk || 0\r\n };\r\n }\r\n case isCabinType(cpType, source): {\r\n const cpHelper = CabinHelper(resolveVarRecursive,matSurfContext,articleData, cpNameResult)\r\n return {\r\n name:cpNameResult,\r\n type: ElemPartType.Shelf,\r\n props: cpHelper,\r\n thk: cpHelper?.kms?.thk || 0\r\n };\r\n }case isDrawerType(source): {\r\n const cpHelper = DrawerHelper(resolveVarRecursive, matSurfContext, articleData, cpNameResult)\r\n return {\r\n name: cpNameResult,\r\n type: DrawerType.Drawer,\r\n props: cpHelper,\r\n thk:0\r\n }\r\n }\r\n default:\r\n return undefined;\r\n }\r\n },[articleData, cpNameResult, cpType, source, cpNameResult, resolveVarRecursive, matSurfContext])\r\n}\r\n","import { useContext } from 'react';\nimport { DescriptorContext } from './DescriptorContext.ts';\nimport type { DescriptorManager } from '../../descriptor/services/DescriptorManager.ts';\n\n//Hook to get the DescriptorManager instance from context\nexport function useDescriptorManager(): DescriptorManager {\n const manager = useContext(DescriptorContext);\n\n if (!manager) {\n throw new Error(\n 'useDescriptorManager must be used within a DescriptorProvider'\n );\n }\n\n return manager;\n}\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\r\n\r\nexport default function usePrimHelper(articleName:string, dimensionOverrides?:DimensionProps) {\r\n const {getArticleData} = useData();\r\n const {resolveVarRecursive} = useVariables()\r\n\r\n // Get data for this specific article\r\n const {anglPrims} = getArticleData(articleName);\r\n\r\n if (anglPrims.length === 0) {\r\n console.warn(`No prim found for : ${articleName}`)\r\n return undefined\r\n }\r\n\r\n const current_prim = anglPrims[0];\r\n\r\n function parser(DIMCALCF: string, SIZE: number, dimOverride?: number): number {\r\n if (DIMCALCF === '') return dimOverride ?? SIZE;\r\n\r\n const resolved = resolveValue(resolveVarRecursive(DIMCALCF)!);\r\n if (typeof resolved === 'number') return resolved || 0;\r\n if (typeof resolved === 'string') return parseFloat(resolved) || 0;\r\n\r\n return 0;\r\n }\r\n\r\n const prim_dims = {\r\n width: parser(current_prim.DIMCALCFX, current_prim.SIZEX, dimensionOverrides?.width), // (current_prim.DIMCALCFX !== '' ? resolveValue(resolveString(current_prim.DIMCALCFX)) : dimensionOverrides?.width || current_prim.SIZEX) || 0,\r\n height: parser(current_prim.DIMCALCFZ, current_prim.SIZEZ, dimensionOverrides?.height) ,// (current_prim.DIMCALCFZ !== '' ? resolveValue(resolveString(current_prim.DIMCALCFZ)) : dimensionOverrides?.height || current_prim.SIZEZ) || 0,\r\n depth: parser(current_prim.DIMCALCFY, current_prim.SIZEY, dimensionOverrides?.depth) ,//(current_prim.DIMCALCFY !== '' ? resolveValue(resolveString(current_prim.DIMCALCFY)) : dimensionOverrides?.depth || current_prim.SIZEY) || 0,\r\n };\r\n\r\n\r\n return {\r\n articleName,\r\n current_prim,\r\n prim_dims\r\n }\r\n}","import {CLIE_TYPE_ZONE, clieTags} from \"../../constants/Constants.tsx\";\r\nimport {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport useGrtxHelper from \"./UseGrtxHelper.tsx\";\r\nimport UseCpDispatcher from \"../useCpDispatcher.ts\";\r\nimport {DividerType} from \"../../types/divider.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport usePrimHelper from \"./UsePrimHelper.tsx\";\r\n\r\nexport function useZoneHelper(articleName:string,TREEID: string) {\r\n const articleData = useData();\r\n const prim = usePrimHelper(articleName)\r\n const grtx = useGrtxHelper(articleName, TREEID)\r\n const descriptorManager = useDescriptorManager();\r\n const clieTopThk = useClieHelper(articleName, TREEID, clieTags.IAC_TOPSHELFTHICKNESS, CLIE_TYPE_ZONE);\r\n const clieBotThk = useClieHelper(articleName, TREEID, clieTags.IAC_BOTTOMSHELFTHICKNESS, CLIE_TYPE_ZONE);\r\n const clieDivThk = useClieHelper(articleName, TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ZONE);\r\n\r\n // Get data for this specific article\r\n const {anglZones} = articleData.getArticleData(articleName);\r\n const currentZone = anglZones.find((item) => item.TREEID === TREEID);\r\n const children = anglZones.filter((item) => item.TREEID.substring(0, item.TREEID.lastIndexOf('.')) === TREEID);\r\n children.sort((a, b) => a.TREEID.localeCompare(b.TREEID, undefined, { numeric: true }))\r\n\r\n if (!currentZone) return null;\r\n const {TOPSHELF, BOTSHELF, DIVTYPE, DIVIDER} = currentZone\r\n const inputData = grtx?.zoneInfo ? Object.fromEntries(grtx.zoneInfo) : {};\r\n inputData['AD article width'] = prim?.prim_dims.width.toString() ?? '';\r\n inputData['AD article height'] = prim?.prim_dims.height.toString() ?? '';\r\n inputData['AD article depth'] = prim?.prim_dims.depth.toString() ?? '';\r\n inputData['0'] = '0';\r\n\r\n const topShelfResult = UseCpDispatcher(articleData, TOPSHELF, DividerType.topShelf, 'divider', descriptorManager, inputData);\r\n const botShelfResult = UseCpDispatcher(articleData, BOTSHELF, DividerType.botShelf, 'divider', descriptorManager, inputData);\r\n const dividerResult = UseCpDispatcher(articleData, DIVIDER, DIVTYPE, 'divider', descriptorManager, inputData);\r\n\r\n\r\n // Eagerly evaluate CPs with useMemo\r\n const topShelfCP = topShelfResult ? { ...topShelfResult, thk: clieTopThk?.thickness ?? topShelfResult.thk } : undefined\r\n const bottomShelfCP = botShelfResult ? {...botShelfResult, thk: clieBotThk?.thickness ?? botShelfResult.thk } : undefined\r\n const DividerCP = dividerResult ? { ...dividerResult,thk:clieDivThk?.thickness ?? dividerResult.thk } : undefined\r\n\r\n return {\r\n // Zone data\r\n currentZone,\r\n children,\r\n inputData,\r\n topShelfCP,\r\n bottomShelfCP,\r\n DividerCP,\r\n zoneInfo:grtx?.zoneInfo\r\n };\r\n}\r\n","import {useData} from \"../../contexts/article-data/useData.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport {CLIE_TYPE_ELEM, clieTags, parentId} from \"../../constants/Constants.tsx\";\r\nimport {useZoneHelper} from \"./UseZoneHelper.tsx\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport UseCpDispatcher from \"../useCpDispatcher.ts\";\r\nimport {isBackPanel, isDoor} from \"../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport {useMemo} from \"react\";\r\nimport {ElemPartType} from \"../../types/Elem.types.tsx\";\r\n\r\nexport function useElemHelper(articleName:string,TREEID: string) {\r\n const articleData = useData()\r\n const {resolveVarRecursive} = useVariables()\r\n const descriptorManager = useDescriptorManager();\r\n const {anglElems} = articleData.getArticleData(articleName);\r\n\r\n const currentElem = anglElems.find((item) => item.TREEID === TREEID);\r\n\r\n const parentZoneId = parentId(TREEID);\r\n const parentZone = useZoneHelper(articleName, parentZoneId);\r\n\r\n const clieThickness = useClieHelper(articleName, TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ELEM);\r\n const cp = UseCpDispatcher(articleData, currentElem?.CPNAME ?? '',currentElem?.PARTTYPE ?? ElemPartType.SidePanel, 'elem', descriptorManager, parentZone?.inputData || {})\r\n\r\n if (!currentElem) return null;\r\n const {CPNAME, INSETFOR, INSET, STARTTRIM, BOTOFFS, TOPOFFS, ENDOFFS, STARTOFFS, ENDTRIM, TOPTRIM, BOTTRIM, PARTTYPE} = currentElem\r\n\r\n // Override THK by clie or return the CP Thk\r\n const thk = CPNAME === '' ? 0 : clieThickness?.thickness ?? cp?.thk ?? 0;\r\n\r\n let sourceInset = undefined\r\n if (CPNAME === '') sourceInset = 0\r\n else if (INSETFOR !== \"\" && INSETFOR !== \"0\") {\r\n sourceInset = INSETFOR\r\n }\r\n else if (INSET !== 0) {\r\n sourceInset = INSET\r\n }\r\n else if (cp && isBackPanel(cp)) {\r\n sourceInset = cp.props.inset+''\r\n }else if (cp && isDoor(cp)){\r\n sourceInset = cp.props.inset + ( cp.props.construction === 'onset' ? '-'+thk : '')\r\n }\r\n\r\n const resolvedInset = resolveValue(resolveVarRecursive(String(sourceInset)))\r\n\r\n const inset = (typeof resolvedInset === 'string' ? 0 : resolvedInset) || 0;\r\n\r\n const topThk = parentZone?.topShelfCP?.thk || 0;\r\n const bottomThk = parentZone?.bottomShelfCP?.thk || 0;\r\n\r\n const oversize = {\r\n start: Number(STARTOFFS) || 0,\r\n end: Number(ENDOFFS) || 0,\r\n top: Number(TOPOFFS) || 0,\r\n bottom: Number(BOTOFFS) || 0\r\n };\r\n\r\n const trim = {\r\n start: STARTTRIM,\r\n end: ENDTRIM,\r\n top: TOPTRIM,\r\n bot: BOTTRIM\r\n };\r\n\r\n const elmTrimThk = {\r\n top: trim.top === 'S' ? topThk : 0,\r\n bottom: trim.bot === 'S' ? bottomThk : 0\r\n };\r\n\r\n return useMemo(() => {\r\n if (!currentElem) return null;\r\n return {TREEID, PARTTYPE, cp, thk, topThk, bottomThk, inset, oversize, trim, elmTrimThk,}\r\n },[currentElem, cp, clieThickness, parentZone])\r\n\r\n}","// src/types.ts\nvar EvaluationErrors = class extends Error {\n constructor(message) {\n super(`Evaluation Error: ${message}`);\n this.name = \"EvaluationError\";\n }\n};\nvar TokenType = /* @__PURE__ */ ((TokenType2) => {\n TokenType2[\"NUMBER\"] = \"NUMBER\";\n TokenType2[\"VARIABLE\"] = \"VARIABLE\";\n TokenType2[\"UNIT\"] = \"UNIT\";\n TokenType2[\"OPERATOR\"] = \"OPERATOR\";\n TokenType2[\"COLON\"] = \"COLON\";\n TokenType2[\"BRACKET_OPEN\"] = \"BRACKET_OPEN\";\n TokenType2[\"BRACKET_CLOSE\"] = \"BRACKET_CLOSE\";\n TokenType2[\"BRACE_OPEN\"] = \"BRACE_OPEN\";\n TokenType2[\"BRACE_CLOSE\"] = \"BRACE_CLOSE\";\n TokenType2[\"PAREN_OPEN\"] = \"PAREN_OPEN\";\n TokenType2[\"PAREN_CLOSE\"] = \"PAREN_CLOSE\";\n TokenType2[\"FUNCTION\"] = \"FUNCTION\";\n TokenType2[\"SPECIAL_VARIABLE\"] = \"SPECIAL_VARIABLE\";\n TokenType2[\"RELATIVE_RATIO\"] = \"RELATIVE_RATIO\";\n TokenType2[\"ANGLE_BRACKET_OPEN\"] = \"LEFT_ANGLE_BRACKET\";\n TokenType2[\"ANGLE_BRACKET_CLOSE\"] = \"RIGHT_ANGLE_BRACKET\";\n TokenType2[\"EOF\"] = \"EOF\";\n return TokenType2;\n})(TokenType || {});\n\n// src/Scanner.ts\nvar Scanner = class _Scanner {\n cache = /* @__PURE__ */ new Map();\n source = \"\";\n tokens = [];\n start = 0;\n current = 0;\n errors = [];\n reportError(message) {\n this.errors.push(message);\n }\n static MATHEMATICAL_FUNCTIONS = {\n abs: \"FUNCTION\" /* FUNCTION */,\n acos: \"FUNCTION\" /* FUNCTION */,\n asin: \"FUNCTION\" /* FUNCTION */,\n atan: \"FUNCTION\" /* FUNCTION */,\n bog2deg: \"FUNCTION\" /* FUNCTION */,\n cos: \"FUNCTION\" /* FUNCTION */,\n deg2bog: \"FUNCTION\" /* FUNCTION */,\n in2mm: \"FUNCTION\" /* FUNCTION */,\n ln: \"FUNCTION\" /* FUNCTION */,\n log: \"FUNCTION\" /* FUNCTION */,\n log10: \"FUNCTION\" /* FUNCTION */,\n max: \"FUNCTION\" /* FUNCTION */,\n maxunder: \"FUNCTION\" /* FUNCTION */,\n mm2in: \"FUNCTION\" /* FUNCTION */,\n nextto: \"FUNCTION\" /* FUNCTION */,\n pi: \"FUNCTION\" /* FUNCTION */,\n pow: \"FUNCTION\" /* FUNCTION */,\n round: \"FUNCTION\" /* FUNCTION */,\n sin: \"FUNCTION\" /* FUNCTION */,\n sqr: \"FUNCTION\" /* FUNCTION */,\n tab: \"FUNCTION\" /* FUNCTION */,\n tan: \"FUNCTION\" /* FUNCTION */\n };\n scan(source) {\n if (this.cache.has(source)) {\n const tokens = this.cache.get(source);\n this.cache.delete(source);\n this.cache.set(source, tokens);\n return tokens;\n }\n try {\n this.source = source;\n const tokens = this.preformScan();\n this.cache.set(this.source, tokens);\n if (this.cache.size > 3) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n return tokens;\n } catch (err) {\n console.error(err);\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n preformScan() {\n this.resetState();\n try {\n if (this.source.includes(\"<\") || this.source.includes(\">\")) {\n throw new Error(\"Angle brackets are not allowed in the input string\");\n }\n if (this.source.length === 0) {\n throw new Error(\"Empty input string\");\n }\n this.start = 0;\n this.current = 0;\n this.tokens = [];\n if (this.start === 0) {\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n }\n while (!this.isAtEnd()) {\n this.start = this.current;\n const char = this.peek();\n switch (char) {\n case \":\":\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n this.advance();\n break;\n case \" \":\n case \"\\r\":\n case \"\t\":\n case \"\\n\":\n this.advance();\n break;\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n case \".\":\n this.scanNumber();\n break;\n case \"$\":\n this.scanVariable();\n break;\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n this.addToken(\"OPERATOR\" /* OPERATOR */, char);\n this.advance();\n break;\n case \"(\":\n this.addToken(\"PAREN_OPEN\" /* PAREN_OPEN */, \"(\");\n this.advance();\n break;\n case \")\":\n this.addToken(\"PAREN_CLOSE\" /* PAREN_CLOSE */, \")\");\n this.advance();\n break;\n case \"{\":\n if (this.current != 0 && this.tokens[this.tokens.length - 1].type != \"OPERATOR\" /* OPERATOR */) {\n this.addToken(\"OPERATOR\" /* OPERATOR */, \"*\");\n }\n this.addToken(\"BRACE_OPEN\" /* BRACE_OPEN */, \"{\");\n this.addToken(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */, \"<\");\n this.advance();\n break;\n case \"}\":\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"BRACE_CLOSE\" /* BRACE_CLOSE */, \"}\");\n this.advance();\n break;\n case \"[\":\n this.addToken(\"OPERATOR\" /* OPERATOR */, \"~\");\n this.addToken(\"BRACKET_OPEN\" /* BRACKET_OPEN */, \"[\");\n this.advance();\n break;\n case \"]\":\n this.addToken(\"BRACKET_CLOSE\" /* BRACKET_CLOSE */, \"]\");\n this.advance();\n break;\n case \"m\":\n if (this.peekNext() === \"m\") {\n this.scanMm();\n } else {\n this.scanIdentifierOrFunction();\n }\n break;\n default:\n if (this.isAlpha(char)) {\n this.scanIdentifierOrFunction();\n } else {\n this.reportError(\n `Unexpected character: ${char} at position: ${this.current}`\n );\n }\n }\n }\n this.addToken(\"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */, \">\");\n this.addToken(\"EOF\" /* EOF */, \"\");\n if (this.errors.length > 0) {\n throw new Error(this.errors.join(\",\\n\"));\n }\n return this.tokens;\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n isAtEnd() {\n return this.current >= this.source.length;\n }\n advance() {\n return this.source.charAt(this.current++);\n }\n peek() {\n if (this.isAtEnd()) return \"\\0\";\n return this.source.charAt(this.current);\n }\n peekNext() {\n if (this.current + 1 >= this.source.length) return \"\\0\";\n return this.source.charAt(this.current + 1);\n }\n addToken(type, lexeme) {\n this.tokens.push({\n type,\n lexeme: lexeme || (type ? this.source.substring(this.start, this.current) : \"\"),\n position: this.start\n });\n }\n isDigit(char) {\n return /^[0-9]$/.test(char);\n }\n isAlpha(char) {\n return /^[a-zA-Z]$/.test(char);\n }\n scanNumber() {\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n if (this.peek() === \".\") {\n this.advance();\n if (!this.isDigit(this.peek())) {\n this.reportError(\n \"Expected digit after decimal point at position: \" + this.current\n );\n }\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n this.addToken(\"NUMBER\" /* NUMBER */);\n }\n scanVariable() {\n this.advance();\n while (/[a-zA-Z0-9_]/.test(this.peek())) {\n this.advance();\n }\n const fullVariable = this.source.substring(this.start + 1, this.current);\n if (fullVariable.endsWith(\"mm\")) {\n const variable = fullVariable.substring(0, fullVariable.length - 2);\n if (variable && variable.length > 0) {\n this.addToken(\"VARIABLE\" /* VARIABLE */, variable);\n this.addToken(\"UNIT\" /* UNIT */, \"mm\");\n } else {\n this.reportError(\"Variable name cannot be empty or $mm\");\n }\n } else {\n this.addToken(\"VARIABLE\" /* VARIABLE */, fullVariable);\n }\n }\n scanMm() {\n this.advance();\n this.advance();\n this.addToken(\"UNIT\" /* UNIT */, \"mm\");\n }\n scanIdentifierOrFunction() {\n const allowedSpecialVariables = [\"X\", \"Y\", \"n\"];\n while (this.isAlpha(this.peek())) {\n this.advance();\n }\n const identifier = this.source.substring(this.start, this.current);\n const functionType = _Scanner.MATHEMATICAL_FUNCTIONS[identifier.toLocaleLowerCase()];\n if (functionType != void 0) {\n this.addToken(functionType, identifier);\n } else if (allowedSpecialVariables.includes(identifier)) {\n this.addToken(\"SPECIAL_VARIABLE\" /* SPECIAL_VARIABLE */, identifier);\n } else {\n this.reportError(\n `Unknown identifier: ${identifier} at position: ${this.current}`\n );\n }\n }\n resetState() {\n this.tokens = [];\n this.start = 0;\n this.current = 0;\n this.errors = [];\n }\n};\n\n// src/Parser.ts\nvar Parser = class {\n cache = /* @__PURE__ */ new Map();\n tokens = [];\n current = 0;\n parse(tokens) {\n if (this.cache.has(tokens)) {\n const ast = this.cache.get(tokens);\n this.cache.delete(tokens);\n this.cache.set(tokens, ast);\n return ast;\n }\n try {\n this.tokens = tokens;\n const ast = this.performParse(tokens);\n this.cache.set(tokens, ast);\n if (this.cache.size > 3) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n return ast;\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n performParse(tokens) {\n this.resetCurrent();\n if (this.tokens.length === 0) {\n throw new Error(\"No tokens to parse.\");\n }\n try {\n return this.expression();\n } catch (err) {\n throw new Error(err instanceof Error ? err.message : String(err));\n }\n }\n resetCurrent = () => {\n this.current = 0;\n };\n checkMillimeterSuffix() {\n if (this.isAtEnd()) return false;\n const nextToken = this.peek();\n return nextToken.type === \"UNIT\" /* UNIT */ && nextToken.lexeme === \"mm\";\n }\n consumeMillimeterSuffix() {\n if (this.checkMillimeterSuffix()) {\n this.advance();\n return true;\n }\n return false;\n }\n sections() {\n const sections = [];\n if (!this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n return this.expression();\n }\n while (this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n this.advance();\n let expr = this.expression();\n this.consume(\n \"RIGHT_ANGLE_BRACKET\" /* ANGLE_BRACKET_CLOSE */,\n \"Expected '>' after section expression.\"\n );\n sections.push({\n type: \"Section\",\n nodes: expr,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n });\n }\n if (sections.length === 1) {\n const singleSection = sections[0];\n if (singleSection.type === \"Section\" && singleSection.nodes.type === \"Section\") {\n return singleSection.nodes;\n }\n return singleSection;\n }\n return {\n type: \"Sections\",\n sections\n };\n }\n expression() {\n try {\n let expr = this.term();\n while (!this.isAtEnd() && this.check(\"OPERATOR\" /* OPERATOR */) && [\"+\", \"-\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.term();\n expr = {\n type: \"BinaryExpression\",\n left: expr,\n operator,\n right\n };\n }\n return expr;\n } catch (error) {\n throw new Error(\n `Failed to parse expression: ${error.message}`\n );\n }\n }\n term() {\n try {\n let expr = this.factor();\n while (!this.isAtEnd() && this.check(\"OPERATOR\" /* OPERATOR */) && [\"*\", \"/\", \"~\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.factor();\n if (right.type === \"SpecialVariable\" && right.name === \"n\") {\n throw new Error(\n 'Invalid usage: \"n\" cannot appear on the right-hand side of an operator'\n );\n }\n expr = {\n type: \"BinaryExpression\",\n left: expr,\n operator,\n right\n };\n }\n return expr;\n } catch (error) {\n throw new Error(`Failed to parse term: ${error.message}`);\n }\n }\n factor() {\n try {\n if (this.check(\"OPERATOR\" /* OPERATOR */) && [\"-\", \"+\"].includes(this.peek().lexeme)) {\n this.advance();\n const operator = this.previous().lexeme;\n const right = this.factor();\n return {\n type: \"UnaryExpression\",\n operator,\n right\n };\n }\n return this.primary();\n } catch (error) {\n throw new Error(`Failed to parse factor: ${error.message}`);\n }\n }\n primary() {\n try {\n if (this.check(\"NUMBER\" /* NUMBER */)) {\n this.advance();\n return {\n type: \"NumberLiteral\",\n value: parseFloat(this.previous().lexeme),\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"VARIABLE\" /* VARIABLE */)) {\n this.advance();\n return {\n type: \"Variable\",\n name: this.previous().lexeme,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"SPECIAL_VARIABLE\" /* SPECIAL_VARIABLE */)) {\n this.advance();\n return {\n type: \"SpecialVariable\",\n name: this.previous().lexeme,\n hasMillimeterSuffix: this.previous().lexeme === \"n\"\n };\n }\n if (this.check(\"FUNCTION\" /* FUNCTION */)) {\n this.advance();\n const functionName = this.previous().lexeme;\n this.consume(\n \"PAREN_OPEN\" /* PAREN_OPEN */,\n `Expected '(' after function name '${functionName}'.`\n );\n const arg = this.expression();\n this.consume(\n \"PAREN_CLOSE\" /* PAREN_CLOSE */,\n `Expected ')' after function arguments.`\n );\n return {\n type: \"FunctionCall\",\n name: functionName,\n arg,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"PAREN_OPEN\" /* PAREN_OPEN */)) {\n this.advance();\n const expr = this.expression();\n if (!expr) {\n throw new Error(\"Expected expression inside parentheses.\");\n }\n this.consume(\"PAREN_CLOSE\" /* PAREN_CLOSE */, \"Expected ')' after expression.\");\n return {\n type: \"Grouping\",\n expression: expr,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"PAREN_CLOSE\" /* PAREN_CLOSE */)) {\n throw new Error(`Unexpected ')' without a matching '('.`);\n }\n if (this.check(\"BRACE_OPEN\" /* BRACE_OPEN */)) {\n this.advance();\n let content = this.sections();\n this.consume(\"BRACE_CLOSE\" /* BRACE_CLOSE */, \"Expected '}' after expression.\");\n if (content.type === \"Section\" && content.nodes.type === \"Section\") {\n content = content.nodes;\n }\n return {\n type: \"Repeated\",\n toRepeat: content,\n hasMillimeterSuffix: this.consumeMillimeterSuffix()\n };\n }\n if (this.check(\"LEFT_ANGLE_BRACKET\" /* ANGLE_BRACKET_OPEN */)) {\n return this.sections();\n }\n throw new Error(`Unexpected token: ${this.peek().lexeme}`);\n } catch (err) {\n throw new Error(`Failed to parse primary: ${err.message}`);\n }\n }\n check(type) {\n if (this.isAtEnd()) return false;\n return this.peek().type === type;\n }\n advance() {\n if (!this.isAtEnd()) this.current++;\n return this.previous();\n }\n consume(type, errorMessage) {\n if (this.check(type)) return this.advance();\n throw new Error(errorMessage);\n }\n isAtEnd() {\n return this.current >= this.tokens.length;\n }\n peek() {\n return this.tokens[this.current];\n }\n previous() {\n return this.tokens[this.current - 1];\n }\n};\n\n// src/evaluationMethods/evaluateBinaryExpression.ts\nvar isN = (node) => {\n return node.type === \"SpecialVariable\" && node.name === \"n\";\n};\nfunction evaluateBinaryExpression(expression, context) {\n if (expression.right.type === \"SpecialVariable\" && expression.right.name === \"n\") {\n return new EvaluationErrors(\n \"Cannot have n in the right side of an expression\"\n );\n }\n const leftValue = !isN(expression.left) ? this.evaluate(expression.left) : expression.left;\n const rightValue = !isN(expression.right) ? this.evaluate(expression.right) : expression.right;\n if (leftValue instanceof EvaluationErrors) return leftValue;\n if (rightValue instanceof EvaluationErrors) return rightValue;\n const bothAreNumbers = leftValue.type === \"NumberLiteral\" && rightValue.type === \"NumberLiteral\";\n const sameUnit = bothAreNumbers ? leftValue.hasMillimeterSuffix === rightValue.hasMillimeterSuffix : false;\n const hasRepeated = (value) => {\n return value.type === \"Repeated\";\n };\n switch (expression.operator) {\n case \"+\": {\n if (bothAreNumbers && sameUnit && context?.isInsideGroup == false) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value + rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value + rightValue.value,\n spreadMm: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"+\",\n left: leftValue,\n right: rightValue\n };\n }\n }\n case \"*\":\n if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value * rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (hasRepeated(rightValue) && leftValue.type === \"NumberLiteral\") {\n return {\n type: \"Repeated\",\n toRepeat: rightValue.toRepeat,\n times: Math.round(leftValue.value),\n hasMillimeterSuffix: rightValue.type === \"NumberLiteral\" && rightValue.hasMillimeterSuffix || false\n };\n } else if (context?.isInsideGroup == false && leftValue.type !== \"SpecialVariable\" && leftValue.name !== \"n\") {\n return new EvaluationErrors(`cannot have * outside of group`);\n } else if (leftValue.type === \"SpecialVariable\") {\n return {\n type: \"BinaryExpression\",\n operator: \"*\",\n left: leftValue,\n right: {\n type: \"NumberLiteral\",\n value: rightValue.value,\n hasMillimeterSuffix: true\n }\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"*\",\n left: leftValue,\n right: rightValue,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n }\n case \"/\":\n if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value / rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true\n };\n } else if (context?.isInsideGroup == false) {\n return new EvaluationErrors(`cannot have / outside of group`);\n }\n case \"-\": {\n if (bothAreNumbers && sameUnit && context?.isInsideGroup == false) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value - rightValue.value,\n hasMillimeterSuffix: leftValue.hasMillimeterSuffix === true || rightValue.hasMillimeterSuffix === true,\n spreadMm: leftValue.spreadMm || rightValue.spreadMm\n };\n } else if (bothAreNumbers && context?.isInsideGroup == true) {\n return {\n type: \"NumberLiteral\",\n value: leftValue.value - rightValue.value,\n spreadMm: leftValue.hasMillimeterSuffix || rightValue.hasMillimeterSuffix\n };\n } else {\n return {\n type: \"BinaryExpression\",\n operator: \"-\",\n left: leftValue,\n right: rightValue\n };\n }\n }\n default:\n throw new EvaluationErrors(\"Invalid Operator\");\n }\n}\n\n// src/evaluationMethods/evaluateFunction.ts\nfunction evaluateFunction(fn, context) {\n const evaluatedArg = this.evaluate(fn.arg);\n if (evaluatedArg instanceof EvaluationErrors) {\n throw new EvaluationErrors(\"Error in function arguments\");\n }\n switch (fn.name.toLowerCase()) {\n case \"abs\":\n return {\n type: \"NumberLiteral\",\n value: Math.abs(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"acos\":\n return {\n type: \"NumberLiteral\",\n value: Math.acos(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"asin\":\n return {\n type: \"NumberLiteral\",\n value: Math.asin(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"atan\":\n return {\n type: \"NumberLiteral\",\n value: Math.atan(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"cos\":\n return {\n type: \"NumberLiteral\",\n value: Math.cos(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"sin\":\n return {\n type: \"NumberLiteral\",\n value: Math.sin(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"tan\":\n return {\n type: \"NumberLiteral\",\n value: Math.tan(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"round\":\n return {\n type: \"NumberLiteral\",\n value: Math.round(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"bog2deg\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * (180 / Math.PI),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"deg2bog\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * (Math.PI / 180),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"in2mm\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value * 25.4,\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"mm2in\":\n return {\n type: \"NumberLiteral\",\n value: evaluatedArg.value / 25.4,\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"ln\":\n return {\n type: \"NumberLiteral\",\n value: Math.log(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n case \"log10\":\n return {\n type: \"NumberLiteral\",\n value: Math.log10(evaluatedArg.value),\n hasMillimeterSuffix: evaluatedArg.hasMillimeterSuffix,\n spreadMm: context?.isInsideGroup === false\n };\n default:\n throw new EvaluationErrors(\"Function not implemented\");\n }\n}\n\n// src/evaluationMethods/evaluateVariable.ts\nfunction evaluateVariable(variable) {\n if (!this.variables || !(variable.name in this.variables)) {\n throw new EvaluationErrors(`Variable ${variable.name} is not defined.`);\n }\n let variableValue = this.variables[variable.name];\n return {\n type: \"NumberLiteral\",\n value: variableValue,\n hasMillimeterSuffix: variable.hasMillimeterSuffix\n };\n}\n\n// src/Evaluator.ts\nvar Evaluator = class {\n nestingLevel = 0;\n variables = {};\n constructor() {\n this.evaluateBinaryExpression = evaluateBinaryExpression.bind(this);\n this.evaluateFunction = evaluateFunction.bind(this);\n this.evaluateVariable = evaluateVariable.bind(this);\n }\n evaluate(node, context = { isInsideGroup: false }, variables) {\n this.nestingLevel++;\n try {\n if (variables) {\n this.variables = variables;\n }\n if (this.isSections(node)) {\n return this.evaluateSections(node, context);\n }\n if (this.isSection(node)) {\n const evaluatedValue = this.evaluate(node.nodes, context);\n if (evaluatedValue instanceof EvaluationErrors) {\n return new EvaluationErrors(\n `Error in section ${JSON.stringify(node)}`\n );\n }\n return { ...node, nodes: evaluatedValue };\n }\n if (this.isNumberLiteral(node)) {\n if (context.isInsideGroup) {\n if (node.hasMillimeterSuffix) {\n return { ...node, spreadMm: true };\n }\n } else {\n return node;\n }\n }\n if (this.isGrouping(node)) {\n context = { ...context, isInsideGroup: true };\n const evaluatedValue = this.evaluate(node.expression, context);\n if (evaluatedValue instanceof EvaluationErrors) {\n return evaluatedValue;\n }\n return {\n ...evaluatedValue,\n hasMillimeterSuffix: node.hasMillimeterSuffix\n };\n }\n if (this.isRepeated(node)) {\n const evaluatedValue = this.evaluate(node.toRepeat);\n if (evaluatedValue instanceof EvaluationErrors) {\n return evaluatedValue;\n }\n return { ...node, toRepeat: evaluatedValue };\n }\n if (this.isBinaryExpression(node)) {\n return this.evaluateBinaryExpression(node, context);\n }\n if (this.isUnaryExpression(node)) {\n return {\n type: \"NumberLiteral\",\n value: node.operator === \"-\" ? -1 * node.right.value : node.right.value,\n hasMillimeterSuffix: node.right.hasMillimeterSuffix\n };\n }\n if (this.isFunctionCall(node)) {\n return this.evaluateFunction(node, context);\n }\n if (this.isVariable(node)) {\n if (!this.variables) {\n throw new EvaluationErrors(\"No variables defined.\");\n } else {\n return this.evaluateVariable(node);\n }\n }\n throw new EvaluationErrors(`unsupported node type: ${node.type}`);\n } catch (err) {\n throw new EvaluationErrors(err.message);\n } finally {\n this.nestingLevel--;\n }\n }\n isUnaryExpression(node) {\n return node.type === \"UnaryExpression\";\n }\n isNumberLiteral(node) {\n return node.type === \"NumberLiteral\";\n }\n isVariable(node) {\n return node.type === \"Variable\" || node.type === \"SpecialVariable\";\n }\n isBinaryExpression(node) {\n return node.type === \"BinaryExpression\";\n }\n isFunctionCall(node) {\n return node.type === \"FunctionCall\";\n }\n isGrouping(node) {\n return node.type === \"Grouping\";\n }\n isRepeated(node) {\n return node.type === \"Repeated\";\n }\n isSections(node) {\n return node.type === \"Sections\";\n }\n isSection(node) {\n return node.type === \"Section\";\n }\n evaluateSections(sections, context = { isInsideGroup: false }) {\n let result = sections.sections.map((section) => {\n const result2 = this.evaluate(section.nodes);\n if (result2 instanceof EvaluationErrors) throw result2;\n return { type: \"Section\", nodes: result2 };\n });\n return { type: \"Sections\", sections: result };\n }\n // evaluate binary expression\n evaluateBinaryExpression;\n evaluateFunction;\n evaluateVariable;\n};\n\n// src/traverseTree.ts\nfunction traverseTree(node, callback) {\n if (!node) {\n throw new EvaluationErrors(\n `unsupported node type to traverse: ${JSON.stringify(node)}`\n );\n }\n callback(node);\n if (node.type === \"Sections\" && Array.isArray(node.sections)) {\n node.sections.forEach((section) => traverseTree(section, callback));\n } else if (node.type === \"Section\" && node.nodes) {\n traverseTree(node.nodes, callback);\n } else if (node.type === \"BinaryExpression\") {\n }\n}\n\n// src/DimensionReference.ts\nvar DimensionReference = class {\n accumulateIncorporatedThicknesses(sections, startPanelThk, endPanelThk, dividerThk, sizerefout1, sizerefedg1, sizerefmid, sizerefedg2, sizerefout2) {\n let accumulatedThicknesses = 0;\n if (sizerefmid === \"M\" /* M */) {\n for (let i = 1; i < sections.sections.length - 1; i++) {\n accumulatedThicknesses += dividerThk;\n }\n }\n if (sizerefmid === \"O\" /* O */) {\n for (let i = 1; i < sections.sections.length - 1; i++) {\n accumulatedThicknesses += dividerThk * 2;\n }\n }\n if (sizerefout1 === \"M\" /* M */) {\n accumulatedThicknesses += startPanelThk / 2;\n }\n if (sizerefout1 === \"O\" /* O */) {\n accumulatedThicknesses += startPanelThk;\n }\n if (sizerefedg1 === \"M\" /* M */) {\n accumulatedThicknesses += startPanelThk / 2;\n }\n if (sizerefedg1 === \"O\" /* O */) {\n accumulatedThicknesses += startPanelThk;\n }\n if (sizerefout2 === \"M\" /* M */) {\n accumulatedThicknesses += endPanelThk / 2;\n }\n if (sizerefout2 === \"O\" /* O */) {\n accumulatedThicknesses += endPanelThk;\n }\n if (sizerefedg2 === \"M\" /* M */) {\n accumulatedThicknesses += endPanelThk / 2;\n }\n if (sizerefedg2 === \"O\" /* O */) {\n accumulatedThicknesses += endPanelThk;\n }\n return accumulatedThicknesses;\n }\n};\n\n// src/Calculator.ts\nvar Calculator = class {\n calculateSections(ast, totalLength = 500, dividerThickness = 0, dimRefProps) {\n try {\n if (ast instanceof EvaluationErrors) {\n throw ast;\n }\n if (ast.type !== \"Sections\" && ast.type !== \"Section\") {\n throw new EvaluationErrors(\n `Expected Sections or Section, got ${JSON.stringify(ast)}`\n );\n }\n let sections = { type: \"Sections\", sections: [] };\n if (ast.type === \"Sections\") {\n for (const section of ast.sections) {\n if (section.nodes.type === \"Repeated\" && section.nodes.times) {\n for (let i = 0; i < (section.nodes?.times ?? 0); i++) {\n if (section.nodes.toRepeat.type === \"Section\") {\n sections.sections.push(\n section.nodes.toRepeat\n );\n } else if (section.nodes.toRepeat.type === \"Sections\") {\n for (const subSection of section.nodes.toRepeat.sections) {\n sections.sections.push(subSection);\n }\n }\n }\n } else {\n sections.sections.push(section);\n }\n }\n } else if (ast.type === \"Section\") {\n sections.sections.push(ast);\n }\n if (dimRefProps) {\n let dimensionReference = new DimensionReference();\n const accumulatedIncThk = dimensionReference.accumulateIncorporatedThicknesses(\n sections,\n dimRefProps.startPanelThk,\n dimRefProps.endPanelThk,\n dividerThickness,\n dimRefProps.sizerefout1,\n dimRefProps.sizerefedg1,\n dimRefProps.sizerefmid,\n dimRefProps.sizerefedg2,\n dimRefProps.sizerefout2\n );\n }\n sections.sections.forEach((node) => {\n let spreadMm = false;\n traverseTree(node, (node2) => {\n if (node2.type === \"NumberLiteral\") {\n if (node2?.spreadMm === true) {\n spreadMm = true;\n }\n } else if (node2.type === \"BinaryExpression\") {\n if (node2.left.type === \"NumberLiteral\") {\n if (node2.left?.spreadMm === true) {\n spreadMm = true;\n }\n if (node2.right?.spreadMm === true) {\n spreadMm = true;\n }\n }\n }\n });\n if (spreadMm) {\n traverseTree(node, (node2) => {\n if (node2.type === \"NumberLiteral\") {\n node2.hasMillimeterSuffix = true;\n } else if (node2.type === \"BinaryExpression\") {\n if (node2.left.type === \"NumberLiteral\") {\n node2.left.hasMillimeterSuffix = true;\n }\n if (node2.right.type === \"NumberLiteral\") {\n node2.right.hasMillimeterSuffix = true;\n }\n }\n });\n }\n });\n let accumulatedMmValues = (sections.sections.length - 1) * dividerThickness;\n const accumulateMmValues = (node) => {\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === true) {\n accumulatedMmValues += node.value;\n }\n } else if (node.type === \"BinaryExpression\") {\n const binaryExpression = node;\n if (binaryExpression.left.type === \"NumberLiteral\" && binaryExpression.right.type === \"NumberLiteral\") {\n if (binaryExpression.left.hasMillimeterSuffix === true) {\n accumulatedMmValues += binaryExpression.left.value;\n }\n if (binaryExpression.right.hasMillimeterSuffix === true) {\n accumulatedMmValues += binaryExpression.right.value;\n }\n }\n }\n };\n sections.sections.forEach(\n (section) => traverseTree(section, accumulateMmValues)\n );\n if (accumulatedMmValues > totalLength) {\n throw new EvaluationErrors(\"Total length exceeded\");\n }\n let restAfterN = totalLength - accumulatedMmValues;\n let nTimes = 0;\n const processNSpecialVariables = (node) => {\n if (node.type === \"BinaryExpression\") {\n const binaryExpression = node;\n if (binaryExpression.right.type === \"NumberLiteral\" && binaryExpression.left.type === \"SpecialVariable\" && binaryExpression.left.name === \"n\" && binaryExpression.operator === \"*\") {\n nTimes = Math.floor(\n restAfterN / (binaryExpression.right.value + dividerThickness)\n );\n const totalNDividersThickness = (nTimes - 1) * dividerThickness;\n const totalNLength = nTimes * binaryExpression.right.value;\n restAfterN += -totalNDividersThickness - totalNLength;\n }\n }\n };\n sections.sections.forEach(\n (section) => traverseTree(section, processNSpecialVariables)\n );\n let totalRatios = 0;\n const accumulateRatioValues = (node) => {\n if (node.type === \"BinaryExpression\") {\n if (node.left.type === \"NumberLiteral\" && node.left.hasMillimeterSuffix === false) {\n totalRatios += node.left.value;\n }\n if (node.right.type === \"NumberLiteral\" && node.right.hasMillimeterSuffix === false) {\n totalRatios += node.right.value;\n }\n }\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === false) {\n totalRatios += node.value;\n }\n }\n };\n sections.sections.forEach((node) => {\n traverseTree(node, accumulateRatioValues);\n });\n const ratioUnitValue = restAfterN / totalRatios;\n const sectionsResult = [];\n const calculateSection = (node) => {\n let ratioValue = 0;\n let mmValue = 0;\n if (node.type === \"NumberLiteral\") {\n if (node.hasMillimeterSuffix === false) {\n ratioValue += node.value * ratioUnitValue;\n }\n if (node.hasMillimeterSuffix === true) {\n mmValue += node.value;\n }\n sectionsResult.push(Number((ratioValue + mmValue).toFixed(2)));\n } else if (node.type === \"BinaryExpression\") {\n if (node.left.type === \"NumberLiteral\" && node.right.type === \"NumberLiteral\") {\n if (node.left.hasMillimeterSuffix === false) {\n ratioValue += node.left.value * ratioUnitValue;\n }\n if (node.left.hasMillimeterSuffix === true) {\n mmValue += node.left.value;\n }\n if (node.right.hasMillimeterSuffix === false) {\n ratioValue += node.right.value * ratioUnitValue;\n }\n if (node.right.hasMillimeterSuffix === true) {\n mmValue += node.right.value;\n }\n sectionsResult.push(Number((ratioValue + mmValue).toFixed(2)));\n }\n if (node.left.type === \"SpecialVariable\" && node.left.name === \"n\" && node.right.type === \"NumberLiteral\") {\n mmValue += node.right.value;\n for (let i = 0; i < nTimes; i++) {\n if (node.right.hasMillimeterSuffix === true) {\n sectionsResult.push(Number(mmValue.toFixed(2)));\n }\n }\n }\n } else {\n }\n };\n sections.sections.forEach((node) => {\n traverseTree(node, calculateSection);\n });\n return sectionsResult;\n } catch (error) {\n return new EvaluationErrors(\"Error calculating sections\");\n }\n }\n};\n\n// src/processLinDiv.ts\nvar scanner = new Scanner();\nvar parser = new Parser();\nvar evaluator = new Evaluator();\nvar processLindiv = (input, totalLength, dividerThickness, variables) => {\n try {\n const tokens = scanner.scan(input);\n const ast = parser.parse(tokens);\n const evaluationResult = evaluator.evaluate(ast, {}, variables);\n if (evaluationResult && !(evaluationResult instanceof EvaluationErrors)) {\n const calculator = new Calculator();\n const result = calculator.calculateSections(evaluationResult, totalLength, dividerThickness);\n if (result && result instanceof EvaluationErrors) throw new Error(result.message);\n return result;\n }\n return evaluationResult || new EvaluationErrors(\"Unknown error during evaluation.\");\n } catch (err) {\n return new EvaluationErrors(err.message);\n }\n};\nexport {\n Calculator,\n EvaluationErrors,\n Evaluator,\n Parser,\n Scanner,\n TokenType,\n processLindiv\n};\n//! todo:\n","export function LinDivPatternTransform(input: string): string {\r\n // Strict check for exact pattern match\r\n const exactPattern = /^(\\d+)\\*\\{(\\d+)\\}$/;\r\n const match = input.match(exactPattern);\r\n\r\n if (match) {\r\n const count = parseInt(match[1], 10);\r\n const value = match[2];\r\n return count > 0 ? Array(count).fill(value).join(':') : '';\r\n }\r\n\r\n return input;\r\n}\r\n\r\nexport function extractNumberFromIndependentDiv(input: string): number | string {\r\n // Match pattern: NUMBER*{ANYTHING}\r\n const match = input.trim().match(/^(\\d+(?:\\.\\d+)?)\\s*\\*\\s*\\{.+\\}$/);\r\n\r\n if (match) {\r\n return Number(match[1]);\r\n }\r\n\r\n return input;\r\n}","// src/helpers/LinDivValidation.ts\n\n/**\n * Valid units supported by ExpressionResolver\n */\nconst VALID_UNITS = ['mm', 'cm', 'm', 'in', 'ft', 'px', 'pt', '%', 'deg', 'rad'];\n\n/**\n * Supported math functions\n */\nconst VALID_FUNCTIONS = ['round', 'floor', 'ceil', 'abs', 'min', 'max', 'pow', 'sqrt'];\n\n/**\n * Validates a linear division string.\n * Should be called AFTER variables ($var) are resolved.\n *\n * @param lindiv - The linear division string to validate\n * @returns true if valid, false otherwise\n */\nexport function isValidLinearDivision(lindiv: string): boolean {\n const trimmed = lindiv.trim();\n\n // 1. Empty is invalid\n if (trimmed === '') return false;\n\n // 2. Contains unresolved variables ($)\n if (/\\$\\w+/.test(trimmed)) return false;\n\n // 3. Structural colon issues\n if (trimmed.startsWith(':') || trimmed.endsWith(':') || trimmed.includes('::')) {\n return false;\n }\n\n // 4. Check for invalid units (e.g., \"mmm\", \"mmmm\")\n // Valid: 100mm, 50cm | Invalid: 100mmm, 50cmm\n const invalidUnitPattern = /\\d+(?:mm{2,}|cm{2,}|[a-z]{3,}(?![a-z]))/i;\n if (invalidUnitPattern.test(trimmed)) return false;\n\n // 5. Check each section\n const sections = splitSections(trimmed);\n for (const section of sections) {\n if (!isValidSection(section.trim())) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Split by ':' but respect brackets and parentheses\n */\nfunction splitSections(lindiv: string): string[] {\n const sections: string[] = [];\n let current = '';\n let depth = 0;\n\n for (const char of lindiv) {\n if (char === '(' || char === '[' || char === '{') {\n depth++;\n current += char;\n } else if (char === ')' || char === ']' || char === '}') {\n depth--;\n current += char;\n } else if (char === ':' && depth === 0) {\n sections.push(current);\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) sections.push(current);\n return sections;\n}\n\n/**\n * Validate a single section\n * A valid section MUST be one of:\n * - Number (ratio): 1, 2.5, 0, -200\n * - Number with unit: 100mm, 50.5cm\n * - Expression (has operators/functions): round(X), X-100, (1+2)\n * - Repetition: 3*{...}, n*{...}\n * - Reduction: 1[100mm]\n * - N-fold: n*350mm\n * - Dimension variable: X, Y\n */\nfunction isValidSection(section: string): boolean {\n const s = section.trim();\n\n // Empty section is invalid\n if (s === '') return false;\n\n // Standalone * is invalid\n if (s === '*') return false;\n\n // Check for balanced brackets first\n if (!hasBalancedBrackets(s)) return false;\n\n // Must match at least one valid pattern:\n const hasNumber = /\\d/.test(s); // Contains a digit\n const hasOperator = /[+\\-*/^]/.test(s); // Has math operator\n const hasFunction = /[a-z]+\\s*\\(/i.test(s); // Has function call\n const hasBrackets = /[\\[\\]{}()]/.test(s); // Has brackets\n const isDimensionVar = /^[XY]$/i.test(s); // Just X or Y\n const isNFold = /^n\\s*\\*/i.test(s); // Starts with n*\n\n // If it has none of these, it's likely a reference name (invalid as lindiv)\n if (!hasNumber && !hasOperator && !hasFunction && !hasBrackets && !isDimensionVar && !isNFold) {\n return false;\n }\n\n // Check for unsupported functions\n const funcMatch = s.match(/([a-z_][a-z0-9_]*)\\s*\\(/gi);\n if (funcMatch) {\n for (const match of funcMatch) {\n const funcName = match.replace(/\\s*\\($/, '').toLowerCase();\n if (!VALID_FUNCTIONS.includes(funcName)) {\n return false;\n }\n }\n }\n\n // Check for invalid unit patterns\n // Valid: 100mm, 50cm, 1.5m\n // Invalid: 100mmm, 50abc\n const unitMatch = s.match(/(\\d+\\.?\\d*)\\s*([a-z]+)(?![a-z\\d(])/gi);\n if (unitMatch) {\n for (const match of unitMatch) {\n const unit = match.replace(/[\\d.\\s]+/, '').toLowerCase();\n // Skip if it's a function name (followed by parenthesis in original)\n if (VALID_FUNCTIONS.includes(unit)) continue;\n // Skip X and Y (dimension variables)\n if (unit === 'x' || unit === 'y' || unit === 'n') continue;\n // Check if valid unit\n if (!VALID_UNITS.includes(unit)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Check if brackets are balanced\n */\nfunction hasBalancedBrackets(s: string): boolean {\n const stack: string[] = [];\n const pairs: Record<string, string> = { ')': '(', ']': '[', '}': '{' };\n\n for (const char of s) {\n if (char === '(' || char === '[' || char === '{') {\n stack.push(char);\n } else if (char === ')' || char === ']' || char === '}') {\n if (stack.pop() !== pairs[char]) return false;\n }\n }\n\n return stack.length === 0;\n}","import type {ChildrenDimsResult, DimensionProps} from \"../types/zone.types.tsx\";\r\nimport {EvaluationErrors, processLindiv} from \"imos-linear-division\";\r\nimport type {DividerMode} from \"../types/divider.types.ts\";\r\nimport {extractNumberFromIndependentDiv, LinDivPatternTransform} from \"./LinDivPatternTransform.ts\";\r\nimport {isValidLinearDivision} from \"./LinDivValidation.ts\";\r\n\r\nexport default function LinDivHelper(divider: DividerMode, dimensions:DimensionProps, dividerThickness: number | 0 ):ChildrenDimsResult{\r\n // const currentZone = anglZones.find((item) => item.TREEID === TREEID)\r\n let divided_length : number = 0\r\n const {LINDIV1, DIVDIR, HORDEFTYPE, DIVELEM1} = divider\r\n let divisionType: 'width' | 'depth' | 'height' | 'article' | 'independent' = 'width'\r\n let isReversed = false\r\n\r\n if (LINDIV1 === '') return {divisionType, zone_dimensions: [], divided_length_list: [] }\r\n\r\n if (DIVDIR === 'H') { // horizontal divide\r\n if (HORDEFTYPE === 'W'){ // divide width\r\n divided_length = dimensions.width\r\n divisionType = 'width'\r\n }else if (HORDEFTYPE === 'D'){ // divide depth\r\n divided_length = dimensions.depth\r\n divisionType = 'depth'\r\n }else if (HORDEFTYPE === 'P'){ // divide perpendicular\r\n if (DIVELEM1 === 0 || DIVELEM1 === 2){ // divide width\r\n divided_length = dimensions.width\r\n divisionType = 'width'\r\n }else if (DIVELEM1 === 1 || DIVELEM1 === 3){ // divide depth\r\n divided_length = dimensions.depth\r\n divisionType = 'depth'\r\n }else {\r\n throw new Error('Unhandled case: DIVELEM1 = ' + DIVELEM1)\r\n }\r\n }else {\r\n throw new Error('Unhandled case: HORDEFTYPE = ' + HORDEFTYPE)\r\n }\r\n }else if (DIVDIR === 'V') { // vertical divide\r\n divided_length = dimensions.height\r\n divisionType = 'height'\r\n }else if (DIVDIR === 'A') {\r\n divided_length = dimensions.width\r\n divisionType = 'article'\r\n }else if (DIVDIR === 'I') {\r\n divided_length = dimensions.width\r\n divisionType = 'independent'\r\n }else {\r\n throw new Error('Unhandled case: DIVDIR = ' + DIVDIR)\r\n }\r\n\r\n let divided_length_list : number[] | EvaluationErrors = []\r\n const transformedLinDiv = LinDivPatternTransform(LINDIV1).toLowerCase() // transform lindiv pattern 3*{1} to 1:1:1\r\n\r\n if (divisionType === 'independent') {\r\n const unrefIndependentDiv = extractNumberFromIndependentDiv(LINDIV1)\r\n divided_length_list = Array(unrefIndependentDiv).fill(divided_length) as number[]\r\n }else if (divisionType === 'article'){\r\n divided_length_list = [divided_length]\r\n }else {\r\n if (isValidLinearDivision(transformedLinDiv)){\r\n divided_length_list = processLindiv(transformedLinDiv, divided_length, dividerThickness)\r\n }else {\r\n divided_length_list = []\r\n console.warn('warning the linear division from the divider bellow is not valid ', divider)\r\n }\r\n }\r\n\r\n // Handle evaluation errors\r\n if (!Array.isArray(divided_length_list)) {\r\n return {divisionType, zone_dimensions: [], divided_length_list:[] }\r\n }\r\n\r\n // inverse divided_length_list if divide perpendicular\r\n if (HORDEFTYPE === 'P' && divided_length_list.length > 1 && (DIVELEM1 === 2 || DIVELEM1 === 3) ) {\r\n isReversed = true\r\n divided_length_list = [...divided_length_list].reverse()\r\n }\r\n\r\n // Create dimension objects for each child zone\r\n const zone_dimensions: DimensionProps[] = divided_length_list.map((length: number) => {\r\n if (divisionType === 'width') {\r\n return {\r\n width: length,\r\n height: dimensions.height,\r\n depth: dimensions.depth\r\n }\r\n } else if (divisionType === 'depth') {\r\n return {\r\n width: dimensions.width,\r\n height: dimensions.height,\r\n depth: length\r\n }\r\n } else if (divisionType === 'height') { // height\r\n return {\r\n width: dimensions.width,\r\n height: length,\r\n depth: dimensions.depth\r\n }\r\n }else if (divisionType === 'article' || divisionType === 'independent') {\r\n return {\r\n width: dimensions.width,\r\n height: dimensions.height,\r\n depth: dimensions.depth\r\n }\r\n }\r\n else {\r\n throw new Error('Unhandled case: DIVDIR = ' + DIVDIR)\r\n }\r\n })\r\n\r\n return {\r\n isReversed,\r\n zone_dimensions,\r\n divisionType,\r\n divided_length_list\r\n }\r\n}","import type {DimensionProps, PositionedChild, PositionHelperResult} from \"../types/zone.types.tsx\";\r\n\r\ninterface PositionHelperParams {\r\n divisionType: 'width' | 'depth' | 'height' | 'article' | 'independent';\r\n parentDimensions: DimensionProps;\r\n lengthList: number[];\r\n childTREEIDs: string[];\r\n dividerThk: number,\r\n}\r\n\r\nexport default function PositionHelper({\r\n divisionType,\r\n parentDimensions,\r\n lengthList,\r\n childTREEIDs,\r\n dividerThk\r\n}: PositionHelperParams): PositionHelperResult {\r\n\r\n const startX = -parentDimensions.width / 2\r\n const startY = -parentDimensions.depth / 2\r\n const startZ = -parentDimensions.height / 2\r\n\r\n const childPositions = lengthList.reduce<{\r\n cumulativeX: number;\r\n cumulativeY: number;\r\n cumulativeZ: number;\r\n positions: PositionedChild[];\r\n }>((acc, length, index) => {\r\n let x = 0\r\n let y = 0\r\n let z = 0\r\n let zone_dims: DimensionProps\r\n if (divisionType === 'width') {\r\n // Dividing along width (X-axis)\r\n x = startX + acc.cumulativeX + length / 2\r\n y = 0\r\n z = 0\r\n zone_dims = {\r\n width: length,\r\n height: parentDimensions.height,\r\n depth: parentDimensions.depth\r\n }\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeX += length + dividerThk\r\n\r\n } else if (divisionType === 'depth') {\r\n // Dividing along depth (Y-axis)\r\n x = 0\r\n y = startY + acc.cumulativeY + length / 2\r\n z = 0\r\n zone_dims = {\r\n width: parentDimensions.width,\r\n height: parentDimensions.height,\r\n depth: length\r\n }\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeY += length + dividerThk\r\n\r\n } else if (divisionType === 'independent' || divisionType === 'article'){\r\n x = 0\r\n y = 0\r\n z = 0\r\n zone_dims = {\r\n width: length,\r\n height: parentDimensions.height,\r\n depth: parentDimensions.depth\r\n }\r\n } else { // height\r\n // Vertical division - for now, stack them\r\n x = 0\r\n y = 0\r\n z = startZ + acc.cumulativeZ + length / 2\r\n zone_dims = {\r\n width: parentDimensions.width,\r\n height: length,\r\n depth: parentDimensions.depth\r\n }\r\n\r\n\r\n // Add zone length and divider thickness for spacing to next zone\r\n acc.cumulativeZ += length + dividerThk\r\n }\r\n\r\n acc.positions.push({\r\n x,\r\n y,\r\n z,\r\n zone_dims,\r\n TREEID: childTREEIDs[index]\r\n })\r\n\r\n return acc\r\n }, { cumulativeX: 0, cumulativeY: 0, cumulativeZ: 0, positions: []})\r\n\r\n return {\r\n childPositions: childPositions.positions,\r\n dividerType:divisionType,\r\n }\r\n}","import {useElemHelper} from \"./row_data/UseElemHelper.tsx\";\nimport {backTreeId, frontTreeId, leftTreeId, rightTreeId} from \"../constants/Constants.tsx\";\nimport type {DimensionProps, PositionHelperResult} from \"../types/zone.types.tsx\";\nimport {type DividerMode} from \"../types/divider.types.ts\";\nimport LinDivHelper from \"./LinDivHelper.tsx\";\nimport PositionHelper from \"./PositionHelper.tsx\";\nimport {isBackPanel, isSidePanel} from \"../construction_principle/dto/cp-dispatcher.types.ts\";\n\nexport function useZoneElemHelpers(articleName:string,TREEID: string) {\n return {\n front: useElemHelper(articleName,frontTreeId(TREEID)),\n left: useElemHelper(articleName,leftTreeId(TREEID)),\n right: useElemHelper(articleName,rightTreeId(TREEID)),\n back: useElemHelper(articleName,backTreeId(TREEID))\n };\n}\n\nexport function getBorderThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, topShelfThk: number, bottomShelfThk: number){\n return {\n front: elemHelpers.front?.thk || 0,\n right: elemHelpers.right?.thk || 0,\n back: elemHelpers.back?.thk || 0,\n left: elemHelpers.left?.thk || 0,\n top: topShelfThk,\n bottom: bottomShelfThk\n };\n}\nexport function getZoneInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n fr: isSidePanel(elemHelpers.front?.cp) ? (elemHelpers.front?.inset || 0) : 0,\n ri: isSidePanel(elemHelpers.right?.cp) ? (elemHelpers.right?.inset || 0) : 0,\n bk: isSidePanel(elemHelpers.back?.cp) ? (elemHelpers.back?.inset || 0) : 0,\n le: isSidePanel(elemHelpers.left?.cp) ? (elemHelpers.left?.inset || 0) : 0\n };\n}\n\nexport function calculateZoneGeometry(dimension: DimensionProps, borderInset: ReturnType<typeof getZoneInset>) {\n return {\n dimensions: {\n width: dimension.width - borderInset.le - borderInset.ri,\n height: dimension.height,\n depth: dimension.depth - borderInset.fr - borderInset.bk,\n },\n position: {\n x: (borderInset.le) / 2 - (borderInset.ri) / 2,\n y: (borderInset.fr) / 2 - (borderInset.bk) / 2,\n z: 0\n }\n };\n}\n\nexport function getRemainingInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n fr: isBackPanel(elemHelpers.front?.cp) ? (elemHelpers?.front?.inset || 0) : 0,\n ri: isBackPanel(elemHelpers.right?.cp) ? (elemHelpers?.right?.inset || 0) : 0,\n bk: isBackPanel(elemHelpers.back?.cp) ? (elemHelpers?.back?.inset || 0) : 0,\n le: isBackPanel(elemHelpers.left?.cp) ? (elemHelpers?.left?.inset || 0) : 0\n };\n}\n\nexport function calculateRemainingZoneGeometry(zoneGeometry: ReturnType<typeof calculateZoneGeometry>,\n bordersThk: ReturnType<typeof getBorderThk>,\n remainingInset:ReturnType<typeof getRemainingInset>\n ) {\n return {\n dimensions: {\n width: zoneGeometry.dimensions.width - bordersThk.left - bordersThk.right - remainingInset.le - remainingInset.ri,\n height: zoneGeometry.dimensions.height - bordersThk.top - bordersThk.bottom ,\n depth: zoneGeometry.dimensions.depth - bordersThk.front - bordersThk.back -remainingInset.fr - remainingInset.bk\n },\n position: {\n x:bordersThk.left / 2 - bordersThk.right / 2 + (remainingInset.le) / 2 - (remainingInset.ri) / 2,\n y:bordersThk.front / 2 - bordersThk.back / 2 + (remainingInset.fr) / 2 - (remainingInset.bk) / 2,\n z:bordersThk.bottom / 2 - bordersThk.top / 2\n }\n };\n}\n\n// ============================================================================\n// CHILD ZONE CALCULATIONS\n// ============================================================================\n\n/**\n * Calculate child positions from dimension results\n */\nexport function calculateChildPositions(remainingDims: DimensionProps, divided_length_list: number[], divisionType:'width' | 'depth' | 'height' | 'article' | 'independent', dividerThk: number, childTREEIDs: string[]): PositionHelperResult {\n return divided_length_list\n ? PositionHelper({\n divisionType: divisionType,\n parentDimensions: remainingDims,\n lengthList: divided_length_list,\n childTREEIDs: childTREEIDs,\n dividerThk: Number(dividerThk) || 0,\n })\n : { childPositions: [], dividerType: 'height' };\n}\n\n/**\n * Calculate child positions from remaining zone geometry\n * This combines calculateChildDimensions and calculateChildPositions\n */\nexport function calculateChildPositionsFromGeometry(remainingZoneGeometry: { dimensions: DimensionProps }, dividerThk: number, divider: DividerMode | undefined, childTREEIDs: string[]): PositionHelperResult {\n if (!divider) {\n return { childPositions: [], dividerType: 'height' };\n }\n\n const childrenDims = LinDivHelper(divider, remainingZoneGeometry.dimensions, dividerThk);\n const isReversed = childrenDims.isReversed;\n childTREEIDs = isReversed ? childTREEIDs.reverse() : childTREEIDs;\n\n return calculateChildPositions(\n remainingZoneGeometry.dimensions,\n childrenDims.divided_length_list,\n childrenDims.divisionType,\n dividerThk,\n childTREEIDs\n );\n}","import { VIEW } from \"../types/view.types.ts\";\nimport type { FC, ReactNode } from \"react\";\nimport {DIM_NORM} from \"../constants/Constants.tsx\";\nimport type {ThreeEvent} from \"@react-three/fiber\";\n\ninterface GroupWrapperProps {\n view: VIEW;\n position?: [number, number, number];\n rotation?: [number, number, number];\n children?: ReactNode;\n onClick?: () => void;\n onPointerOver?: (e: ThreeEvent<PointerEvent>) => void;\n onPointerLeave?: (e: ThreeEvent<PointerEvent>) => void;\n onPointerDown?: (e: ThreeEvent<PointerEvent>) => void;\n onPointerMove?: (e: ThreeEvent<PointerEvent>) => void;\n onPointerUp?: (e: ThreeEvent<PointerEvent>) => void;\n}\n\nconst GroupWrapper: FC<GroupWrapperProps> = ({\n view=VIEW._3D,\n position=[0,0,0],\n rotation=[0,0,0],\n children,\n onClick,\n onPointerOver,\n onPointerLeave,\n onPointerDown,\n onPointerMove,\n onPointerUp\n}) => {\n if (view === VIEW._3D) {\n return (\n <group\n onPointerOver={onPointerOver}\n onPointerLeave={onPointerLeave}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n position={[position[0], position[1], position[2]]}\n rotation={rotation}\n onClick={onClick}>\n {children}\n </group>\n );\n }\n\n // For 2D, might need to swap Y/Z based on view\n const x = position[0]*DIM_NORM;\n const y = view === VIEW._2D_TOP ? position[1]*DIM_NORM : position[2]*DIM_NORM ; // Adjust based on view\n const angle = rotation[1] * (180 / Math.PI);\n\n return (\n <g\n transform={`translate(${x},${y}) rotate(${angle})`}\n onClick={onClick}\n style={onClick ? { cursor: 'pointer' } : undefined}>\n {children}\n </g>\n );\n};\n\nexport default GroupWrapper;","import { Shape } from 'three';\r\n\r\ninterface Point2D {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport function calculateMitrePoints(\r\n length: number,\r\n thickness: number,\r\n startPanelThk: number = 0,\r\n endPanelThk: number = 0\r\n) {\r\n const halfLength = length / 2;\r\n const halfThickness = thickness / 2;\r\n\r\n const points: Point2D[] = [\r\n { x: halfLength, y: -halfThickness },\r\n { x: -halfLength, y: -halfThickness },\r\n { x: -halfLength + startPanelThk, y: halfThickness },\r\n { x: halfLength - endPanelThk, y: halfThickness }\r\n ];\r\n\r\n return {\r\n points,\r\n get svgPath() {\r\n return `M ${points.map(p => `${p.x},${p.y}`).join(' L ')} Z`;\r\n },\r\n get shape() {\r\n const s = new Shape();\r\n points.forEach((p, i) => i === 0 ? s.moveTo(p.x, p.y) : s.lineTo(p.x, p.y));\r\n return s;\r\n }\r\n };\r\n}","// src/constants/RalColors.ts\r\n\r\nexport interface RalColor {\r\n ral: string;\r\n hex: string;\r\n description: string;\r\n}\r\n\r\n// Type-safe record indexed by RAL code\r\nexport const ralColorsMap: Record<string, RalColor> = {\r\n RAL_1000: { ral: \"RAL_1000\", hex: \"#CDBA88\", description: \"Green beige\" },\r\n RAL_1001: { ral: \"RAL_1001\", hex: \"#D0B084\", description: \"Beige\" },\r\n RAL_1002: { ral: \"RAL_1002\", hex: \"#D2AA6D\", description: \"Sand yellow\" },\r\n RAL_1003: { ral: \"RAL_1003\", hex: \"#F9A900\", description: \"Signal yellow\" },\r\n RAL_1004: { ral: \"RAL_1004\", hex: \"#E49E00\", description: \"Golden yellow\" },\r\n RAL_1005: { ral: \"RAL_1005\", hex: \"#CB8F00\", description: \"Honey yellow\" },\r\n RAL_1006: { ral: \"RAL_1006\", hex: \"#E19000\", description: \"Maize yellow\" },\r\n RAL_1007: { ral: \"RAL_1007\", hex: \"#E88C00\", description: \"Daffodil yellow\" },\r\n RAL_1011: { ral: \"RAL_1011\", hex: \"#AF8050\", description: \"Brown beige\" },\r\n RAL_1012: { ral: \"RAL_1012\", hex: \"#DDAF28\", description: \"Lemon yellow\" },\r\n RAL_1013: { ral: \"RAL_1013\", hex: \"#E3D9C7\", description: \"Oyster white\" },\r\n RAL_1014: { ral: \"RAL_1014\", hex: \"#DDC49B\", description: \"Ivory\" },\r\n RAL_1015: { ral: \"RAL_1015\", hex: \"#E6D2B5\", description: \"Light ivory\" },\r\n RAL_1016: { ral: \"RAL_1016\", hex: \"#F1DD39\", description: \"Sulfur yellow\" },\r\n RAL_1017: { ral: \"RAL_1017\", hex: \"#F6A951\", description: \"Saffron yellow\" },\r\n RAL_1018: { ral: \"RAL_1018\", hex: \"#FACA31\", description: \"Zinc yellow\" },\r\n RAL_1019: { ral: \"RAL_1019\", hex: \"#A48F7A\", description: \"Grey beige\" },\r\n RAL_1020: { ral: \"RAL_1020\", hex: \"#A08F65\", description: \"Olive yellow\" },\r\n RAL_1021: { ral: \"RAL_1021\", hex: \"#F6B600\", description: \"Colza yellow\" },\r\n RAL_1023: { ral: \"RAL_1023\", hex: \"#F7B500\", description: \"Traffic yellow\" },\r\n RAL_1024: { ral: \"RAL_1024\", hex: \"#BA8F4C\", description: \"Ochre yellow\" },\r\n RAL_1026: { ral: \"RAL_1026\", hex: \"#FFFF00\", description: \"Luminous yellow\" },\r\n RAL_1027: { ral: \"RAL_1027\", hex: \"#A77F0F\", description: \"Curry\" },\r\n RAL_1028: { ral: \"RAL_1028\", hex: \"#FF9C00\", description: \"Melon yellow\" },\r\n RAL_1032: { ral: \"RAL_1032\", hex: \"#E2A300\", description: \"Broom yellow\" },\r\n RAL_1033: { ral: \"RAL_1033\", hex: \"#F99A1D\", description: \"Dahlia yellow\" },\r\n RAL_1034: { ral: \"RAL_1034\", hex: \"#EB9C52\", description: \"Pastel yellow\" },\r\n RAL_1035: { ral: \"RAL_1035\", hex: \"#8F8370\", description: \"Pearl beige\" },\r\n RAL_1036: { ral: \"RAL_1036\", hex: \"#806440\", description: \"Pearl gold\" },\r\n RAL_1037: { ral: \"RAL_1037\", hex: \"#F09200\", description: \"Sun yellow\" },\r\n RAL_2000: { ral: \"RAL_2000\", hex: \"#DA6E00\", description: \"Yellow orange\" },\r\n RAL_2001: { ral: \"RAL_2001\", hex: \"#BA481C\", description: \"Red orange\" },\r\n RAL_2002: { ral: \"RAL_2002\", hex: \"#BF3922\", description: \"Vermilion\" },\r\n RAL_2003: { ral: \"RAL_2003\", hex: \"#F67829\", description: \"Pastel orange\" },\r\n RAL_2004: { ral: \"RAL_2004\", hex: \"#E25304\", description: \"Pure orange\" },\r\n RAL_2005: { ral: \"RAL_2005\", hex: \"#FF4D08\", description: \"Luminous orange\" },\r\n RAL_2007: { ral: \"RAL_2007\", hex: \"#FFB200\", description: \"Luminous bright orange\" },\r\n RAL_2008: { ral: \"RAL_2008\", hex: \"#EC6B22\", description: \"Bright red orange\" },\r\n RAL_2009: { ral: \"RAL_2009\", hex: \"#DE5308\", description: \"Traffic orange\" },\r\n RAL_2010: { ral: \"RAL_2010\", hex: \"#D05D29\", description: \"Signal orange\" },\r\n RAL_2011: { ral: \"RAL_2011\", hex: \"#E26E0F\", description: \"Deep orange\" },\r\n RAL_2012: { ral: \"RAL_2012\", hex: \"#D5654E\", description: \"Salmon orange\" },\r\n RAL_2013: { ral: \"RAL_2013\", hex: \"#923E25\", description: \"Pearl orange\" },\r\n RAL_2017: { ral: \"RAL_2017\", hex: \"#FC5500\", description: \"RAL orange\" },\r\n RAL_3000: { ral: \"RAL_3000\", hex: \"#A72920\", description: \"Flame red\" },\r\n RAL_3001: { ral: \"RAL_3001\", hex: \"#9B2423\", description: \"Signal red\" },\r\n RAL_3002: { ral: \"RAL_3002\", hex: \"#9B2321\", description: \"Carmine red\" },\r\n RAL_3003: { ral: \"RAL_3003\", hex: \"#861A22\", description: \"Ruby red\" },\r\n RAL_3004: { ral: \"RAL_3004\", hex: \"#6B1C23\", description: \"Purple red\" },\r\n RAL_3005: { ral: \"RAL_3005\", hex: \"#59191F\", description: \"Wine red\" },\r\n RAL_3007: { ral: \"RAL_3007\", hex: \"#3E2022\", description: \"Black red\" },\r\n RAL_3009: { ral: \"RAL_3009\", hex: \"#6D342D\", description: \"Oxide red\" },\r\n RAL_3011: { ral: \"RAL_3011\", hex: \"#782423\", description: \"Brown red\" },\r\n RAL_3012: { ral: \"RAL_3012\", hex: \"#C5856D\", description: \"Beige red\" },\r\n RAL_3013: { ral: \"RAL_3013\", hex: \"#972E25\", description: \"Tomato red\" },\r\n RAL_3014: { ral: \"RAL_3014\", hex: \"#CB7375\", description: \"Antique pink\" },\r\n RAL_3015: { ral: \"RAL_3015\", hex: \"#D8A0A6\", description: \"Light pink\" },\r\n RAL_3016: { ral: \"RAL_3016\", hex: \"#A63D30\", description: \"Coral red\" },\r\n RAL_3017: { ral: \"RAL_3017\", hex: \"#CA555D\", description: \"Rose\" },\r\n RAL_3018: { ral: \"RAL_3018\", hex: \"#C63F4A\", description: \"Strawberry red\" },\r\n RAL_3020: { ral: \"RAL_3020\", hex: \"#BB1F11\", description: \"Traffic red\" },\r\n RAL_3022: { ral: \"RAL_3022\", hex: \"#CF6955\", description: \"Salmon pink\" },\r\n RAL_3024: { ral: \"RAL_3024\", hex: \"#FF2D21\", description: \"Luminous red\" },\r\n RAL_3026: { ral: \"RAL_3026\", hex: \"#FF2A1C\", description: \"Luminous bright red\" },\r\n RAL_3027: { ral: \"RAL_3027\", hex: \"#AB273C\", description: \"Raspberry red\" },\r\n RAL_3028: { ral: \"RAL_3028\", hex: \"#CC2C24\", description: \"Pure red\" },\r\n RAL_3031: { ral: \"RAL_3031\", hex: \"#A63437\", description: \"Orient red\" },\r\n RAL_3032: { ral: \"RAL_3032\", hex: \"#701D24\", description: \"Pearl ruby red\" },\r\n RAL_3033: { ral: \"RAL_3033\", hex: \"#A53A2E\", description: \"Pearl pink\" },\r\n RAL_4001: { ral: \"RAL_4001\", hex: \"#816183\", description: \"Red lilac\" },\r\n RAL_4002: { ral: \"RAL_4002\", hex: \"#8D3C4B\", description: \"Red violet\" },\r\n RAL_4003: { ral: \"RAL_4003\", hex: \"#C4618C\", description: \"Heather violet\" },\r\n RAL_4004: { ral: \"RAL_4004\", hex: \"#651E38\", description: \"Claret violet\" },\r\n RAL_4005: { ral: \"RAL_4005\", hex: \"#76689A\", description: \"Blue lilac\" },\r\n RAL_4006: { ral: \"RAL_4006\", hex: \"#903373\", description: \"Traffic purple\" },\r\n RAL_4007: { ral: \"RAL_4007\", hex: \"#47243C\", description: \"Purple violet\" },\r\n RAL_4008: { ral: \"RAL_4008\", hex: \"#844C82\", description: \"Signal violet\" },\r\n RAL_4009: { ral: \"RAL_4009\", hex: \"#9D8692\", description: \"Pastel violet\" },\r\n RAL_4010: { ral: \"RAL_4010\", hex: \"#BB4077\", description: \"Telemagenta\" },\r\n RAL_4011: { ral: \"RAL_4011\", hex: \"#6E6387\", description: \"Pearl violet\" },\r\n RAL_4012: { ral: \"RAL_4012\", hex: \"#6A6B7F\", description: \"Pearl blackberry\" },\r\n RAL_5000: { ral: \"RAL_5000\", hex: \"#304F6E\", description: \"Violet blue\" },\r\n RAL_5001: { ral: \"RAL_5001\", hex: \"#0E4C64\", description: \"Green blue\" },\r\n RAL_5002: { ral: \"RAL_5002\", hex: \"#00387A\", description: \"Ultramarine blue\" },\r\n RAL_5003: { ral: \"RAL_5003\", hex: \"#1F3855\", description: \"Sapphire blue\" },\r\n RAL_5004: { ral: \"RAL_5004\", hex: \"#191E28\", description: \"Black blue\" },\r\n RAL_5005: { ral: \"RAL_5005\", hex: \"#005387\", description: \"Signal blue\" },\r\n RAL_5007: { ral: \"RAL_5007\", hex: \"#376B8C\", description: \"Brillant blue\" },\r\n RAL_5008: { ral: \"RAL_5008\", hex: \"#2B3A44\", description: \"Grey blue\" },\r\n RAL_5009: { ral: \"RAL_5009\", hex: \"#215F78\", description: \"Azure blue\" },\r\n RAL_5010: { ral: \"RAL_5010\", hex: \"#004F7C\", description: \"Gentian blue\" },\r\n RAL_5011: { ral: \"RAL_5011\", hex: \"#1A2B3C\", description: \"Steel blue\" },\r\n RAL_5012: { ral: \"RAL_5012\", hex: \"#0089B6\", description: \"Light blue\" },\r\n RAL_5013: { ral: \"RAL_5013\", hex: \"#193153\", description: \"Cobalt blue\" },\r\n RAL_5014: { ral: \"RAL_5014\", hex: \"#637D96\", description: \"Pigeon blue\" },\r\n RAL_5015: { ral: \"RAL_5015\", hex: \"#007CAF\", description: \"Sky blue\" },\r\n RAL_5017: { ral: \"RAL_5017\", hex: \"#005B8C\", description: \"Traffic blue\" },\r\n RAL_5018: { ral: \"RAL_5018\", hex: \"#048B8C\", description: \"Turquoise blue\" },\r\n RAL_5019: { ral: \"RAL_5019\", hex: \"#005E83\", description: \"Capri blue\" },\r\n RAL_5020: { ral: \"RAL_5020\", hex: \"#00414B\", description: \"Ocean blue\" },\r\n RAL_5021: { ral: \"RAL_5021\", hex: \"#007577\", description: \"Water blue\" },\r\n RAL_5022: { ral: \"RAL_5022\", hex: \"#222D5A\", description: \"Night blue\" },\r\n RAL_5023: { ral: \"RAL_5023\", hex: \"#41698C\", description: \"Distant blue\" },\r\n RAL_5024: { ral: \"RAL_5024\", hex: \"#6093AC\", description: \"Pastel blue\" },\r\n RAL_5025: { ral: \"RAL_5025\", hex: \"#20697C\", description: \"Pearl gentian blue\" },\r\n RAL_5026: { ral: \"RAL_5026\", hex: \"#0F3052\", description: \"Pearl night blue\" },\r\n RAL_6000: { ral: \"RAL_6000\", hex: \"#3C7460\", description: \"Patina green\" },\r\n RAL_6001: { ral: \"RAL_6001\", hex: \"#366735\", description: \"Emerald green\" },\r\n RAL_6002: { ral: \"RAL_6002\", hex: \"#325928\", description: \"Leaf green\" },\r\n RAL_6003: { ral: \"RAL_6003\", hex: \"#50533C\", description: \"Olive green\" },\r\n RAL_6004: { ral: \"RAL_6004\", hex: \"#024442\", description: \"Blue green\" },\r\n RAL_6005: { ral: \"RAL_6005\", hex: \"#114232\", description: \"Moss green\" },\r\n RAL_6006: { ral: \"RAL_6006\", hex: \"#3C392E\", description: \"Grey olive\" },\r\n RAL_6007: { ral: \"RAL_6007\", hex: \"#2C3222\", description: \"Bottle green\" },\r\n RAL_6008: { ral: \"RAL_6008\", hex: \"#36342A\", description: \"Brown green\" },\r\n RAL_6009: { ral: \"RAL_6009\", hex: \"#27352A\", description: \"Fir green\" },\r\n RAL_6010: { ral: \"RAL_6010\", hex: \"#4D6F39\", description: \"Grass green\" },\r\n RAL_6011: { ral: \"RAL_6011\", hex: \"#6B7C59\", description: \"Reseda green\" },\r\n RAL_6012: { ral: \"RAL_6012\", hex: \"#2F3D3A\", description: \"Black green\" },\r\n RAL_6013: { ral: \"RAL_6013\", hex: \"#7C765A\", description: \"Reed green\" },\r\n RAL_6014: { ral: \"RAL_6014\", hex: \"#474135\", description: \"Yellow olive\" },\r\n RAL_6015: { ral: \"RAL_6015\", hex: \"#3D3D36\", description: \"Black olive\" },\r\n RAL_6016: { ral: \"RAL_6016\", hex: \"#00694C\", description: \"Turquoise green\" },\r\n RAL_6017: { ral: \"RAL_6017\", hex: \"#587F40\", description: \"May green\" },\r\n RAL_6018: { ral: \"RAL_6018\", hex: \"#60993B\", description: \"Yellow green\" },\r\n RAL_6019: { ral: \"RAL_6019\", hex: \"#B9CEAC\", description: \"Pastel green\" },\r\n RAL_6020: { ral: \"RAL_6020\", hex: \"#37422F\", description: \"Chrome green\" },\r\n RAL_6021: { ral: \"RAL_6021\", hex: \"#8A9977\", description: \"Pale green\" },\r\n RAL_6022: { ral: \"RAL_6022\", hex: \"#3A3327\", description: \"Olive drab\" },\r\n RAL_6024: { ral: \"RAL_6024\", hex: \"#008351\", description: \"Traffic green\" },\r\n RAL_6025: { ral: \"RAL_6025\", hex: \"#5E6E3B\", description: \"Fern green\" },\r\n RAL_6026: { ral: \"RAL_6026\", hex: \"#005F4E\", description: \"Opal green\" },\r\n RAL_6027: { ral: \"RAL_6027\", hex: \"#7EBAB5\", description: \"Light green\" },\r\n RAL_6028: { ral: \"RAL_6028\", hex: \"#315442\", description: \"Pine green\" },\r\n RAL_6029: { ral: \"RAL_6029\", hex: \"#006F3D\", description: \"Mint green\" },\r\n RAL_6032: { ral: \"RAL_6032\", hex: \"#237F52\", description: \"Signal green\" },\r\n RAL_6033: { ral: \"RAL_6033\", hex: \"#45877F\", description: \"Mint turquoise\" },\r\n RAL_6034: { ral: \"RAL_6034\", hex: \"#7AADAC\", description: \"Pastel turquoise\" },\r\n RAL_6035: { ral: \"RAL_6035\", hex: \"#194D25\", description: \"Pearl green\" },\r\n RAL_6036: { ral: \"RAL_6036\", hex: \"#04574B\", description: \"Pearl opal green\" },\r\n RAL_6037: { ral: \"RAL_6037\", hex: \"#008B29\", description: \"Pure green\" },\r\n RAL_6038: { ral: \"RAL_6038\", hex: \"#00B51B\", description: \"Luminous green\" },\r\n RAL_6039: { ral: \"RAL_6039\", hex: \"#B3C43E\", description: \"Fibrous green\" },\r\n RAL_7000: { ral: \"RAL_7000\", hex: \"#7A888E\", description: \"Squirrel grey\" },\r\n RAL_7001: { ral: \"RAL_7001\", hex: \"#8C979C\", description: \"Silver grey\" },\r\n RAL_7002: { ral: \"RAL_7002\", hex: \"#817863\", description: \"Olive grey\" },\r\n RAL_7003: { ral: \"RAL_7003\", hex: \"#797669\", description: \"Moss grey\" },\r\n RAL_7004: { ral: \"RAL_7004\", hex: \"#9A9B9B\", description: \"Signal grey\" },\r\n RAL_7005: { ral: \"RAL_7005\", hex: \"#6B6E6B\", description: \"Mouse grey\" },\r\n RAL_7006: { ral: \"RAL_7006\", hex: \"#766A5E\", description: \"Beige grey\" },\r\n RAL_7008: { ral: \"RAL_7008\", hex: \"#745F3D\", description: \"Khaki grey\" },\r\n RAL_7009: { ral: \"RAL_7009\", hex: \"#5D6058\", description: \"Green grey\" },\r\n RAL_7010: { ral: \"RAL_7010\", hex: \"#585C56\", description: \"Tarpaulin grey\" },\r\n RAL_7011: { ral: \"RAL_7011\", hex: \"#52595D\", description: \"Iron grey\" },\r\n RAL_7012: { ral: \"RAL_7012\", hex: \"#575D5E\", description: \"Basalt grey\" },\r\n RAL_7013: { ral: \"RAL_7013\", hex: \"#575044\", description: \"Brown grey\" },\r\n RAL_7015: { ral: \"RAL_7015\", hex: \"#4F5358\", description: \"Slate grey\" },\r\n RAL_7016: { ral: \"RAL_7016\", hex: \"#383E42\", description: \"Anthracite grey\" },\r\n RAL_7021: { ral: \"RAL_7021\", hex: \"#2F3234\", description: \"Black grey\" },\r\n RAL_7022: { ral: \"RAL_7022\", hex: \"#4C4A44\", description: \"Umbra grey\" },\r\n RAL_7023: { ral: \"RAL_7023\", hex: \"#808076\", description: \"Concrete grey\" },\r\n RAL_7024: { ral: \"RAL_7024\", hex: \"#45494E\", description: \"Graphite grey\" },\r\n RAL_7026: { ral: \"RAL_7026\", hex: \"#374345\", description: \"Granite grey\" },\r\n RAL_7030: { ral: \"RAL_7030\", hex: \"#928E85\", description: \"Stone grey\" },\r\n RAL_7031: { ral: \"RAL_7031\", hex: \"#5B686D\", description: \"Blue grey\" },\r\n RAL_7032: { ral: \"RAL_7032\", hex: \"#B5B0A1\", description: \"Pebble grey\" },\r\n RAL_7033: { ral: \"RAL_7033\", hex: \"#7F8274\", description: \"Cement grey\" },\r\n RAL_7034: { ral: \"RAL_7034\", hex: \"#92886F\", description: \"Yellow grey\" },\r\n RAL_7035: { ral: \"RAL_7035\", hex: \"#C5C7C4\", description: \"Light grey\" },\r\n RAL_7036: { ral: \"RAL_7036\", hex: \"#979392\", description: \"Platinum grey\" },\r\n RAL_7037: { ral: \"RAL_7037\", hex: \"#7A7B7A\", description: \"Dusty grey\" },\r\n RAL_7038: { ral: \"RAL_7038\", hex: \"#B0B0A9\", description: \"Agate grey\" },\r\n RAL_7039: { ral: \"RAL_7039\", hex: \"#6B665E\", description: \"Quartz grey\" },\r\n RAL_7040: { ral: \"RAL_7040\", hex: \"#989EA1\", description: \"Window grey\" },\r\n RAL_7042: { ral: \"RAL_7042\", hex: \"#8E9291\", description: \"Traffic grey A\" },\r\n RAL_7043: { ral: \"RAL_7043\", hex: \"#4F5250\", description: \"Traffic grey B\" },\r\n RAL_7044: { ral: \"RAL_7044\", hex: \"#B7B3A8\", description: \"Silk grey\" },\r\n RAL_7045: { ral: \"RAL_7045\", hex: \"#8D9295\", description: \"Telegrey 1\" },\r\n RAL_7046: { ral: \"RAL_7046\", hex: \"#7E868A\", description: \"Telegrey 2\" },\r\n RAL_7047: { ral: \"RAL_7047\", hex: \"#C8C8C7\", description: \"Telegrey 4\" },\r\n RAL_7048: { ral: \"RAL_7048\", hex: \"#817B73\", description: \"Pearl mouse grey\" },\r\n RAL_8000: { ral: \"RAL_8000\", hex: \"#89693F\", description: \"Green brown\" },\r\n RAL_8001: { ral: \"RAL_8001\", hex: \"#9D622B\", description: \"Ochre brown\" },\r\n RAL_8002: { ral: \"RAL_8002\", hex: \"#794D3E\", description: \"Signal brown\" },\r\n RAL_8003: { ral: \"RAL_8003\", hex: \"#7E4B27\", description: \"Clay brown\" },\r\n RAL_8004: { ral: \"RAL_8004\", hex: \"#8D4931\", description: \"Copper brown\" },\r\n RAL_8007: { ral: \"RAL_8007\", hex: \"#70462B\", description: \"Fawn brown\" },\r\n RAL_8008: { ral: \"RAL_8008\", hex: \"#724A25\", description: \"Olive brown\" },\r\n RAL_8011: { ral: \"RAL_8011\", hex: \"#5A3827\", description: \"Nut brown\" },\r\n RAL_8012: { ral: \"RAL_8012\", hex: \"#66332B\", description: \"Red brown\" },\r\n RAL_8014: { ral: \"RAL_8014\", hex: \"#4A3526\", description: \"Sepia brown\" },\r\n RAL_8015: { ral: \"RAL_8015\", hex: \"#5E2F26\", description: \"Chestnut brown\" },\r\n RAL_8016: { ral: \"RAL_8016\", hex: \"#4C2B20\", description: \"Mahogany brown\" },\r\n RAL_8017: { ral: \"RAL_8017\", hex: \"#442F29\", description: \"Chocolate brown\" },\r\n RAL_8019: { ral: \"RAL_8019\", hex: \"#3D3635\", description: \"Grey brown\" },\r\n RAL_8022: { ral: \"RAL_8022\", hex: \"#1A1719\", description: \"Black brown\" },\r\n RAL_8023: { ral: \"RAL_8023\", hex: \"#A45729\", description: \"Orange brown\" },\r\n RAL_8024: { ral: \"RAL_8024\", hex: \"#795038\", description: \"Beige brown\" },\r\n RAL_8025: { ral: \"RAL_8025\", hex: \"#755847\", description: \"Pale brown\" },\r\n RAL_8028: { ral: \"RAL_8028\", hex: \"#513A2A\", description: \"Terra brown\" },\r\n RAL_8029: { ral: \"RAL_8029\", hex: \"#7F4031\", description: \"Pearl copper\" },\r\n RAL_9001: { ral: \"RAL_9001\", hex: \"#E9E0D2\", description: \"Cream\" },\r\n RAL_9002: { ral: \"RAL_9002\", hex: \"#D6D5CB\", description: \"Grey white\" },\r\n RAL_9003: { ral: \"RAL_9003\", hex: \"#ECECE7\", description: \"Signal white\" },\r\n RAL_9004: { ral: \"RAL_9004\", hex: \"#2B2B2C\", description: \"Signal black\" },\r\n RAL_9005: { ral: \"RAL_9005\", hex: \"#0E0E10\", description: \"Jet black\" },\r\n RAL_9006: { ral: \"RAL_9006\", hex: \"#A1A1A0\", description: \"White aluminium\" },\r\n RAL_9007: { ral: \"RAL_9007\", hex: \"#868581\", description: \"Grey aluminium\" },\r\n RAL_9010: { ral: \"RAL_9010\", hex: \"#F1EDE1\", description: \"Pure white\" },\r\n RAL_9011: { ral: \"RAL_9011\", hex: \"#27292B\", description: \"Graphite black\" },\r\n RAL_9012: { ral: \"RAL_9012\", hex: \"#F8F2E1\", description: \"Cleanroom white\" },\r\n RAL_9016: { ral: \"RAL_9016\", hex: \"#F1F1EA\", description: \"Traffic white\" },\r\n RAL_9017: { ral: \"RAL_9017\", hex: \"#29292A\", description: \"Traffic black\" },\r\n RAL_9018: { ral: \"RAL_9018\", hex: \"#C8CBC4\", description: \"Papyrus white\" },\r\n RAL_9022: { ral: \"RAL_9022\", hex: \"#858583\", description: \"Pearl light grey\" },\r\n RAL_9023: { ral: \"RAL_9023\", hex: \"#787B7A\", description: \"Pearl dark grey\" }\r\n} as const;\r\n\r\n// Helper function: Get hex color from RAL code (O(1) lookup)\r\nexport function getRalHexColor(ralCode: string): string | undefined {\r\n return ralColorsMap[ralCode]?.hex;\r\n}\r\n\r\n// Helper function: Check if string is a RAL color (O(1) lookup)\r\nexport function isRalColor(value?: string): boolean {\r\n if (!value) return false\r\n return value in ralColorsMap;\r\n}\r\n","import { createContext, useContext, type ReactNode } from 'react';\n\nexport interface TextureConfigContextType {\n textureBaseUrl: string;\n textureFolder?: string;\n textureExtension?: string;\n textureSuffix?: string;\n}\n\nconst defaultConfig: TextureConfigContextType = {\n textureBaseUrl: 'https://imagedelivery.net/aYYmWUcv7lRhpLdU4ojPsA',\n textureFolder: 'copy_2',\n textureExtension: '.jpg',\n textureSuffix: '/public'\n};\n\nexport const TextureConfigContext = createContext<TextureConfigContextType>(defaultConfig);\n\nexport interface TextureConfigProviderProps {\n children: ReactNode;\n config?: Partial<TextureConfigContextType>;\n}\n\nexport function TextureConfigProvider({ children, config = {} }: TextureConfigProviderProps) {\n const value = {\n ...defaultConfig,\n ...config\n };\n\n return (\n <TextureConfigContext.Provider value={value}>\n {children}\n </TextureConfigContext.Provider>\n );\n}\n\nexport function useTextureConfig() {\n const context = useContext(TextureConfigContext);\n if (!context) {\n return defaultConfig;\n }\n return context;\n}\n\nexport function buildTextureUrl(renderMat: string, config: TextureConfigContextType): string {\n const { textureBaseUrl, textureFolder, textureExtension, textureSuffix } = config;\n const folder = textureFolder ? `/${textureFolder}` : '';\n const extension = textureExtension || '.jpg';\n const suffix = textureSuffix || '';\n\n return `${textureBaseUrl}${folder}/${renderMat}${extension}${suffix}`;\n}\n","// src/hooks/useMaterialLoader.ts\n\nimport { TextureLoader, Texture } from \"three\";\nimport { useState, useEffect, useMemo, useRef } from \"react\";\nimport { isRalColor, getRalHexColor } from \"../../constants/RalColors.ts\";\nimport { DEFAULT_RENDER_COLOR } from \"../../constants/Constants.tsx\";\nimport { useTextureConfig, buildTextureUrl } from \"../texture/TextureConfig.tsx\";\n\n// Global texture cache to avoid reloading textures\nconst textureCache = new Map<string, Texture>();\nconst failedUrls = new Set<string>();\n\nexport interface MaterialLoaderResult {\n texture: Texture | null;\n color: string | null;\n type: 'ral-color' | 'texture' | 'fallback' | 'glass';\n isLoading: boolean;\n opacity?: number; // For special materials like glass\n}\n\nexport function useMaterialLoader(renderValue?: string): MaterialLoaderResult {\n const textureConfig = useTextureConfig();\n const [loadedTexture, setLoadedTexture] = useState<Texture | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const currentUrlRef = useRef<string | null>(null);\n\n // Check for glass material\n const isGlass = useMemo(() =>\n renderValue?.toLowerCase().includes('glass') ?? false,\n [renderValue]\n );\n\n // Check for RAL color\n const ralHex = useMemo(() =>\n renderValue && isRalColor(renderValue) ? getRalHexColor(renderValue) : null,\n [renderValue]\n );\n\n // Build URL only if we need to load a texture\n const urlToLoad = useMemo(() => {\n if (!renderValue || ralHex || isGlass) return null;\n return buildTextureUrl(renderValue, textureConfig);\n }, [renderValue, ralHex, isGlass, textureConfig]);\n\n // Load texture manually with error handling\n useEffect(() => {\n // Skip if no URL needed\n if (!urlToLoad) {\n setLoadedTexture(null);\n setIsLoading(false);\n return;\n }\n\n // Skip if URL already failed\n if (failedUrls.has(urlToLoad)) {\n console.log('FAIL')\n setLoadedTexture(null);\n setIsLoading(false);\n return;\n }\n\n // Use cached texture if available\n if (textureCache.has(urlToLoad)) {\n setLoadedTexture(textureCache.get(urlToLoad)!);\n setIsLoading(false);\n return;\n }\n\n // Clear old texture before loading new one\n setLoadedTexture(null);\n\n // Track current URL to avoid race conditions\n currentUrlRef.current = urlToLoad;\n setIsLoading(true);\n\n const loader = new TextureLoader();\n loader.setCrossOrigin('anonymous');\n\n loader.load(\n urlToLoad,\n // onLoad\n (texture) => {\n if (currentUrlRef.current === urlToLoad) {\n textureCache.set(urlToLoad, texture);\n setLoadedTexture(texture);\n setIsLoading(false);\n }\n },\n // onProgress (unused)\n undefined,\n // onError\n () => {\n if (currentUrlRef.current === urlToLoad) {\n failedUrls.add(urlToLoad);\n setLoadedTexture(null);\n setIsLoading(false);\n }\n }\n );\n\n return () => {\n // Mark as stale if component unmounts or URL changes\n if (currentUrlRef.current === urlToLoad) {\n currentUrlRef.current = null;\n }\n };\n }, [urlToLoad]);\n\n // Glass material path (highest priority)\n if (isGlass) {\n return {\n texture: null,\n color: '#3accc1',\n type: 'glass',\n isLoading: false,\n opacity: 0.1\n };\n }\n\n // RAL color path\n if (ralHex) {\n return { texture: null, color: ralHex, type: 'ral-color', isLoading: false };\n }\n\n // No render value\n if (!renderValue) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: false\n };\n }\n\n // Loading state\n if (isLoading) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: true\n };\n }\n\n // Texture loaded successfully\n if (loadedTexture) {\n return { texture: loadedTexture, color: null, type: 'texture', isLoading: false };\n }\n\n // Texture failed or not found — fallback to color\n return { texture: null, color: DEFAULT_RENDER_COLOR, type: 'fallback', isLoading: false };\n}\n","import {type RefObject, useMemo} from 'react';\r\nimport {BoxGeometry, ExtrudeGeometry} from 'three';\r\nimport {calculateMitrePoints} from \"../../helpers/MitreCalc.tsx\";\r\nimport type {PDProps} from \"../../types/pd.types.tsx\";\r\nimport {useMaterialLoader} from \"../../contexts/mat-surf/useMaterialLoader.ts\";\r\nimport {Edges} from \"@react-three/drei\";\r\nimport type {PartTypeSource} from \"../../construction_principle/dto/angl-type-config.ts\";\r\n\r\ninterface PD3DExtendedProps extends PDProps {\r\n treeId?: string;\r\n isSelected?: boolean;\r\n isHovered?: boolean;\r\n onClick?: () => void;\r\n onPointerEnter?: () => void;\r\n onPointerLeave?: () => void;\r\n startPanelThk?: number; // Add these\r\n endPanelThk?: number; // Add these\r\n render_mat?: string;\r\n meshRef?: RefObject<any>;\r\n elemInfo?: { source: PartTypeSource, [key: string]: unknown };\r\n}\r\n\r\nexport default function PD_3D({\r\n length,\r\n width,\r\n thk,\r\n material = 'red',\r\n opacity = 1,\r\n isSelected = false,\r\n isHovered = false,\r\n onClick,\r\n onPointerEnter,\r\n onPointerLeave,\r\n startPanelThk = 0,\r\n endPanelThk = 0,\r\n render_mat,\r\n meshRef,\r\n elemInfo\r\n }: PD3DExtendedProps) {\r\n\r\n const {texture, color, opacity: materialOpacity} = useMaterialLoader(render_mat);\r\n\r\n // Determine effective color based on state and material type\r\n let effectiveColor = useMemo(() => {\r\n if (isSelected) return '#ff6b00';\r\n if (isHovered) return '#0066ff';\r\n\r\n // IMPORTANT: If texture is loaded, use white (so texture shows correctly)\r\n // Three.js multiplies texture by color, so white = no tint\r\n if (texture) return '#ffffff';\r\n\r\n // Otherwise use color from loader (RAL or fallback) or material prop\r\n return color || material;\r\n }, [isSelected, isHovered, texture, color, material]);\r\n\r\n // Use material opacity from hook if available (e.g., for glass), otherwise use prop or state\r\n let effectiveOpacity = isSelected ? 1 : isHovered ? 1 : (materialOpacity ?? opacity);\r\n\r\n // Create extruded geometry from mitre shape\r\n const geometry = useMemo(() => {\r\n if (startPanelThk !== 0 || endPanelThk !== 0) {\r\n const {shape} = calculateMitrePoints(width, thk, startPanelThk, endPanelThk);\r\n const geo = new ExtrudeGeometry(shape, {depth: length, bevelEnabled: false, steps: 1});\r\n // Center the geometry to match boxGeometry behavior\r\n geo.center();\r\n\r\n // Rotate to swap Y and Z axes to match boxGeometry orientation\r\n geo.rotateZ(-Math.PI / 2);\r\n geo.rotateY(Math.PI / 2);\r\n\r\n return geo;\r\n } else {\r\n return new BoxGeometry(length, width, thk);\r\n }\r\n }, [length, width, thk, startPanelThk, endPanelThk]);\r\n\r\n return (\r\n <group rotation={[0, 0, 0]}>\r\n <mesh ref={meshRef} userData={elemInfo} geometry={geometry} onClick={onClick}\r\n onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\r\n <meshStandardMaterial key={`${render_mat || 'default'}-${texture ? 'loaded' : 'pending'}`} map={texture} color={effectiveColor} opacity={effectiveOpacity}\r\n transparent={effectiveOpacity < 1}/>\r\n <Edges color={isSelected ? '#ff6b00' : isHovered ? '#0066ff' : '#484947'} opacity={0.1}\r\n transparent={true}/>\r\n </mesh>\r\n </group>\r\n );\r\n};\r\n\r\n// export default PD_3D;","export interface DimensionLineStyle {\r\n color?: string;\r\n strokeWidth?: number;\r\n arrowSize?: number;\r\n fontSize?: number;\r\n}\r\n\r\nexport interface DimensionPosition {\r\n horizontal?: 'top' | 'bottom' | 'both' | 'none';\r\n vertical?: 'left' | 'right' | 'both' | 'none';\r\n}\r\n\r\nexport interface DimensionRule {\r\n cpNames: string[]; // Which CPNAMEs to apply to (supports wildcards)\r\n showHorizontal?: boolean; // Show width dimension\r\n showVertical?: boolean; // Show height dimension\r\n position?: DimensionPosition; // Where to place dimension lines\r\n offset?: number; // Distance from panel edge\r\n lineStyle?: DimensionLineStyle;\r\n showLabel?: boolean; // Show dimension value text\r\n labelSuffix?: string; // e.g., \"mm\" or \"\"\r\n}\r\n\r\n// Default dimension rule\r\nconst defaultRule: DimensionRule = {\r\n cpNames: ['*'],\r\n showHorizontal: false,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 100,\r\n lineStyle: {\r\n color: '#333',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 12\r\n },\r\n showLabel: true,\r\n labelSuffix: ''\r\n};\r\n\r\n// Dimension rules configuration\r\nexport const dimensionRules: DimensionRule[] = [\r\n {\r\n cpNames: ['CP_1_RS_*','P_CP_T100_WP*'],\r\n showHorizontal: true,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 0,\r\n lineStyle: {\r\n color: '#b61c73',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 10\r\n },\r\n showLabel: true,\r\n labelSuffix: ''\r\n },\r\n {\r\n cpNames: ['P_CP_*_GL_*'],\r\n showHorizontal: true,\r\n showVertical: false,\r\n position: {\r\n horizontal: 'bottom',\r\n vertical: 'left'\r\n },\r\n offset: 0,\r\n lineStyle: {\r\n color: '#1b14ee',\r\n strokeWidth: 1,\r\n arrowSize: 6,\r\n fontSize: 10\r\n }\r\n },\r\n];\r\n\r\n//Get dimension rules for a given CPNAME\r\nexport function getDimensionRules(cpName: string): DimensionRule | null {\r\n if (!cpName) return null;\r\n\r\n // Find first matching rule\r\n for (const rule of dimensionRules) {\r\n for (const pattern of rule.cpNames) {\r\n if (matchCPName(cpName, pattern)) {\r\n // Merge with defaults\r\n return {\r\n ...defaultRule,\r\n ...rule,\r\n position: { ...defaultRule.position, ...rule.position },\r\n lineStyle: { ...defaultRule.lineStyle, ...rule.lineStyle }\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null; // No rule found, don't show dimensions\r\n}\r\n\r\n/**\r\n * Match CPNAME against pattern (supports wildcards)\r\n * @param cpName - The actual CPNAME\r\n * @param pattern - The pattern to match (supports * wildcard)\r\n * @returns true if matches\r\n */\r\nfunction matchCPName(cpName: string, pattern: string): boolean {\r\n if (pattern === '*') return true;\r\n if (pattern === cpName) return true;\r\n\r\n // Convert wildcard pattern to regex\r\n const regexPattern = pattern\r\n .replace(/\\*/g, '.*')\r\n .replace(/\\?/g, '.');\r\n\r\n const regex = new RegExp(`^${regexPattern}$`);\r\n return regex.test(cpName);\r\n}\r\n\r\n/**\r\n * Check if dimensions should be shown for a CPNAME\r\n * @param cpName - The construction principle name\r\n * @returns boolean\r\n */\r\nexport function shouldShowDimensions(cpName: string): boolean {\r\n const rules = getDimensionRules(cpName);\r\n return rules !== null && (!!rules.showHorizontal || !!rules.showVertical);\r\n}","import type { DimensionRule } from '../../config/dimensionConfig';\n\nexport interface DimensionLinesProps {\n width: number;\n height: number;\n rules: DimensionRule;\n}\n\nexport default function DimensionLines({ width, height, rules }: DimensionLinesProps) {\n if (!rules.showHorizontal && !rules.showVertical) return null;\n\n const offset = rules.offset || 30;\n const lineStyle = rules.lineStyle || {};\n const color = lineStyle.color || '#333';\n const strokeWidth = lineStyle.strokeWidth || 1;\n const fontSize = lineStyle.fontSize || 12;\n const arrowSize = lineStyle.arrowSize || 6;\n\n const dimensions: React.ReactElement[] = [];\n\n // Horizontal dimension (width)\n if (rules.showHorizontal) {\n const positions: ('top' | 'bottom')[] = [];\n\n if (rules.position?.horizontal === 'both') {\n positions.push('top', 'bottom');\n } else if (rules.position?.horizontal === 'top') {\n positions.push('top');\n } else if (rules.position?.horizontal === 'bottom') {\n positions.push('bottom');\n }\n\n positions.forEach((pos, idx) => {\n const y = pos === 'bottom' ? -height / 2 - offset : height / 2 + offset;\n const label = rules.showLabel ? `${width.toFixed(0)}${rules.labelSuffix || ''}` : '';\n\n dimensions.push(\n <g key={`h-${pos}-${idx}`}>\n {/* Main dimension line */}\n <line x1={-width / 2} y1={y} x2={width / 2} y2={y} stroke={color} strokeWidth={strokeWidth}/>\n\n {/* Left arrow */}\n <polygon points={`${-width / 2},${y} ${-width / 2 + arrowSize},${y - arrowSize / 2} ${-width / 2 + arrowSize},${y + arrowSize / 2}`} fill={color}/>\n\n {/* Right arrow */}\n <polygon points={`${width / 2},${y} ${width / 2 - arrowSize},${y - arrowSize / 2} ${width / 2 - arrowSize},${y + arrowSize / 2}`} fill={color}/>\n\n {/* Extension lines */}\n <line x1={-width / 2} y1={-height / 2} x2={-width / 2} y2={y} stroke={color} strokeWidth={strokeWidth * 0.5} strokeDasharray=\"2,2\"/>\n <line x1={width / 2} y1={-height / 2} x2={width / 2} y2={y} stroke={color} strokeWidth={strokeWidth * 0.5} strokeDasharray=\"2,2\"/>\n\n {/* Label */}\n {label && (\n <g transform={`translate(${0}, ${y-fontSize})`}>\n <text textAnchor=\"middle\" fontSize={fontSize} fill={color} transform={`scale(1,-1)`}>\n {label}\n </text>\n </g>\n\n )}\n </g>\n );\n });\n }\n\n // Vertical dimension (height)\n if (rules.showVertical) {\n const positions: ('left' | 'right')[] = [];\n\n if (rules.position?.vertical === 'both') {\n positions.push('left', 'right');\n } else if (rules.position?.vertical === 'left') {\n positions.push('left');\n } else if (rules.position?.vertical === 'right') {\n positions.push('right');\n }\n\n positions.forEach((pos, idx) => {\n const x = pos === 'left' ? -width / 2 - offset : width / 2 + offset;\n const label = rules.showLabel ? `${height.toFixed(0)}${rules.labelSuffix || ''}` : '';\n\n dimensions.push(\n <g key={`v-${pos}-${idx}`}>\n {/* Main dimension line */}\n <line\n x1={x}\n y1={-height / 2}\n x2={x}\n y2={height / 2}\n stroke={color}\n strokeWidth={strokeWidth}\n />\n\n {/* Bottom arrow */}\n <polygon\n points={`${x},${-height / 2} ${x - arrowSize / 2},${-height / 2 + arrowSize} ${x + arrowSize / 2},${-height / 2 + arrowSize}`}\n fill={color}\n />\n\n {/* Top arrow */}\n <polygon\n points={`${x},${height / 2} ${x - arrowSize / 2},${height / 2 - arrowSize} ${x + arrowSize / 2},${height / 2 - arrowSize}`}\n fill={color}\n />\n\n {/* Extension lines */}\n <line\n x1={-width / 2}\n y1={-height / 2}\n x2={x}\n y2={-height / 2}\n stroke={color}\n strokeWidth={strokeWidth * 0.5}\n strokeDasharray=\"2,2\"\n />\n <line\n x1={-width / 2}\n y1={height / 2}\n x2={x}\n y2={height / 2}\n stroke={color}\n strokeWidth={strokeWidth * 0.5}\n strokeDasharray=\"2,2\"\n />\n\n {/* Label */}\n {label && (\n <text\n x={x + (pos === 'left' ? -fontSize : fontSize)}\n y={0}\n textAnchor=\"middle\"\n fontSize={fontSize}\n fill={color}\n transform={`scale(1,-1) rotate(90 ${x + (pos === 'left' ? -fontSize : fontSize)} 0)`}\n >\n {label}\n </text>\n )}\n </g>\n );\n });\n }\n\n return <g className=\"dimension-lines\">{dimensions}</g>;\n}\n","import {calculateMitrePoints} from \"../../helpers/MitreCalc.tsx\";\nimport {getDimensionRules} from \"../../config/dimensionConfig\";\nimport DimensionLines from \"../dimensions/DimensionLines\";\n\nexport interface PD2DProps {\n treeId?: string;\n dim_x: number;\n dim_y: number;\n text?: string;\n stroke_width?: number;\n rotate?: number;\n isSelected?: boolean;\n isHovered?: boolean;\n onClick?: () => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n\n // Simple trim properties\n startPanelThk?: number; // Previous panel thickness (default 0)\n endPanelThk?: number; // Next panel thickness (default 0)\n cpName?: string\n render_mat?: string,\n}\n\nexport default function PD_2D({\n dim_x,\n dim_y,\n text = '',\n stroke_width = 2,\n rotate = 0,\n isSelected = false,\n isHovered = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n startPanelThk = 0,\n endPanelThk = 0,\n cpName,\n render_mat,\n }: PD2DProps) {\n // Calculate points with mitre trims\n const {svgPath} = calculateMitrePoints(dim_x, dim_y, startPanelThk, endPanelThk,);\n\n const strokeColor = isSelected ? '#ff6b00' : isHovered ? '#0066ff' : 'black';\n const effectiveStrokeWidth = isSelected ? stroke_width * 2 : isHovered ? stroke_width * 1.5 : stroke_width;\n const opacity = isSelected ? 0.8 : isHovered ? 0.7 : 0.5;\n const fill = render_mat?.toLowerCase().includes('glass') ? '#3accc1' : 'lightgray';\n\n // Get dimension rules for this CPNAME\n const dimensionRules = cpName ? getDimensionRules(cpName) : null;\n\n return (\n <g transform={`rotate(${rotate})`}>\n <path\n d={svgPath}\n stroke={strokeColor}\n strokeWidth={effectiveStrokeWidth}\n fill={fill}\n strokeLinejoin=\"bevel\" // ← FIX: Use bevel instead of miter\n strokeMiterlimit=\"1\" // ← OR: Limit miter to 1x stroke width\n opacity={opacity}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={{cursor: onClick ? 'pointer' : 'default'}}\n />\n <text transform={`scale(1,-1)`} x={0} y={0} textAnchor=\"middle\" dominantBaseline=\"central\" fontSize={10}>{text}</text>\n\n {/* Dimension lines based on configuration\n dim_y*1.05 allow the adding an offset to the height of the panel when the view is from the front\n */}\n {dimensionRules && (<DimensionLines width={dim_x} height={dim_y*1.05} rules={dimensionRules}/>)}\n\n </g>\n );\n}","import {ElemPartType, ElemTrimType} from \"../../types/Elem.types.tsx\";\nimport {DividerType} from \"../../types/divider.types.ts\";\nimport {type PartTypeSource} from \"../../construction_principle/dto/angl-type-config.ts\";\nimport type {DrawerType} from \"../../construction_principle/drawer/dto/drawer.types.ts\";\n\nexport function computeTrim(\n currCpSource: PartTypeSource,\n currCpType: ElemPartType | DividerType | DrawerType,\n currentCpTrim?: ElemTrimType,\n joinPartSourceType?: PartTypeSource,\n joinPartType?: ElemPartType | DividerType,\n joinPartThk: number = 0,\n backInset: number = 0, // only back inset\n): number {\n if (!joinPartType || !currentCpTrim) return 0;\n\n // const { thk, PARTTYPE, inset } = joinElem;\n const isShortTrim = currentCpTrim === ElemTrimType.short;\n const isLongTrim = currentCpTrim === ElemTrimType.long;\n\n if (currCpSource === 'elem') {\n if (currCpType === ElemPartType.Door) {\n return joinPartThk\n } else if (currCpType === ElemPartType.SidePanel) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return isShortTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isShortTrim ? joinPartThk + backInset : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.topShelf) return isShortTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.botShelf) return isShortTrim ? joinPartThk : 0;\n } else if (currCpType === ElemPartType.Back) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return !isLongTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isShortTrim ? joinPartThk + backInset : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.topShelf) return !isLongTrim ? joinPartThk : 0;\n else if (joinPartSourceType === 'divider' && joinPartType === DividerType.botShelf) return !isLongTrim ? joinPartThk : 0;\n }\n } else if (currCpSource === 'divider') {\n if (currCpType === DividerType.topShelf || currCpType === DividerType.botShelf) {\n if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.SidePanel) return !isShortTrim ? joinPartThk : 0\n else if (joinPartSourceType === 'elem' && joinPartType === ElemPartType.Back) return isLongTrim ? joinPartThk + backInset : 0;\n }\n }\n return 0;\n}\n\n\n","// src/index.ts\nvar updateQueue = makeQueue();\nvar raf = (fn) => schedule(fn, updateQueue);\nvar writeQueue = makeQueue();\nraf.write = (fn) => schedule(fn, writeQueue);\nvar onStartQueue = makeQueue();\nraf.onStart = (fn) => schedule(fn, onStartQueue);\nvar onFrameQueue = makeQueue();\nraf.onFrame = (fn) => schedule(fn, onFrameQueue);\nvar onFinishQueue = makeQueue();\nraf.onFinish = (fn) => schedule(fn, onFinishQueue);\nvar timeouts = [];\nraf.setTimeout = (handler, ms) => {\n const time = raf.now() + ms;\n const cancel = () => {\n const i = timeouts.findIndex((t) => t.cancel == cancel);\n if (~i) timeouts.splice(i, 1);\n pendingCount -= ~i ? 1 : 0;\n };\n const timeout = { time, handler, cancel };\n timeouts.splice(findTimeout(time), 0, timeout);\n pendingCount += 1;\n start();\n return timeout;\n};\nvar findTimeout = (time) => ~(~timeouts.findIndex((t) => t.time > time) || ~timeouts.length);\nraf.cancel = (fn) => {\n onStartQueue.delete(fn);\n onFrameQueue.delete(fn);\n onFinishQueue.delete(fn);\n updateQueue.delete(fn);\n writeQueue.delete(fn);\n};\nraf.sync = (fn) => {\n sync = true;\n raf.batchedUpdates(fn);\n sync = false;\n};\nraf.throttle = (fn) => {\n let lastArgs;\n function queuedFn() {\n try {\n fn(...lastArgs);\n } finally {\n lastArgs = null;\n }\n }\n function throttled(...args) {\n lastArgs = args;\n raf.onStart(queuedFn);\n }\n throttled.handler = fn;\n throttled.cancel = () => {\n onStartQueue.delete(queuedFn);\n lastArgs = null;\n };\n return throttled;\n};\nvar nativeRaf = typeof window != \"undefined\" ? window.requestAnimationFrame : (\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n () => {\n }\n);\nraf.use = (impl) => nativeRaf = impl;\nraf.now = typeof performance != \"undefined\" ? () => performance.now() : Date.now;\nraf.batchedUpdates = (fn) => fn();\nraf.catch = console.error;\nraf.frameLoop = \"always\";\nraf.advance = () => {\n if (raf.frameLoop !== \"demand\") {\n console.warn(\n \"Cannot call the manual advancement of rafz whilst frameLoop is not set as demand\"\n );\n } else {\n update();\n }\n};\nvar ts = -1;\nvar pendingCount = 0;\nvar sync = false;\nfunction schedule(fn, queue) {\n if (sync) {\n queue.delete(fn);\n fn(0);\n } else {\n queue.add(fn);\n start();\n }\n}\nfunction start() {\n if (ts < 0) {\n ts = 0;\n if (raf.frameLoop !== \"demand\") {\n nativeRaf(loop);\n }\n }\n}\nfunction stop() {\n ts = -1;\n}\nfunction loop() {\n if (~ts) {\n nativeRaf(loop);\n raf.batchedUpdates(update);\n }\n}\nfunction update() {\n const prevTs = ts;\n ts = raf.now();\n const count = findTimeout(ts);\n if (count) {\n eachSafely(timeouts.splice(0, count), (t) => t.handler());\n pendingCount -= count;\n }\n if (!pendingCount) {\n stop();\n return;\n }\n onStartQueue.flush();\n updateQueue.flush(prevTs ? Math.min(64, ts - prevTs) : 16.667);\n onFrameQueue.flush();\n writeQueue.flush();\n onFinishQueue.flush();\n}\nfunction makeQueue() {\n let next = /* @__PURE__ */ new Set();\n let current = next;\n return {\n add(fn) {\n pendingCount += current == next && !next.has(fn) ? 1 : 0;\n next.add(fn);\n },\n delete(fn) {\n pendingCount -= current == next && next.has(fn) ? 1 : 0;\n return next.delete(fn);\n },\n flush(arg) {\n if (current.size) {\n next = /* @__PURE__ */ new Set();\n pendingCount -= current.size;\n eachSafely(current, (fn) => fn(arg) && next.add(fn));\n pendingCount += next.size;\n current = next;\n }\n }\n };\n}\nfunction eachSafely(values, each) {\n values.forEach((value) => {\n try {\n each(value);\n } catch (e) {\n raf.catch(e);\n }\n });\n}\nvar __raf = {\n /** The number of pending tasks */\n count() {\n return pendingCount;\n },\n /** Whether there's a raf update loop running */\n isRunning() {\n return ts >= 0;\n },\n /** Clear internal state. Never call from update loop! */\n clear() {\n ts = -1;\n timeouts = [];\n onStartQueue = makeQueue();\n updateQueue = makeQueue();\n onFrameQueue = makeQueue();\n writeQueue = makeQueue();\n onFinishQueue = makeQueue();\n pendingCount = 0;\n }\n};\nexport {\n __raf,\n raf\n};\n","var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\n// src/globals.ts\nvar globals_exports = {};\n__export(globals_exports, {\n assign: () => assign,\n colors: () => colors,\n createStringInterpolator: () => createStringInterpolator,\n skipAnimation: () => skipAnimation,\n to: () => to,\n willAdvance: () => willAdvance\n});\nimport { raf } from \"@react-spring/rafz\";\n\n// src/helpers.ts\nfunction noop() {\n}\nvar defineHidden = (obj, key, value) => Object.defineProperty(obj, key, { value, writable: true, configurable: true });\nvar is = {\n arr: Array.isArray,\n obj: (a) => !!a && a.constructor.name === \"Object\",\n fun: (a) => typeof a === \"function\",\n str: (a) => typeof a === \"string\",\n num: (a) => typeof a === \"number\",\n und: (a) => a === void 0\n};\nfunction isEqual(a, b) {\n if (is.arr(a)) {\n if (!is.arr(b) || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n return a === b;\n}\nvar each = (obj, fn) => obj.forEach(fn);\nfunction eachProp(obj, fn, ctx) {\n if (is.arr(obj)) {\n for (let i = 0; i < obj.length; i++) {\n fn.call(ctx, obj[i], `${i}`);\n }\n return;\n }\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn.call(ctx, obj[key], key);\n }\n }\n}\nvar toArray = (a) => is.und(a) ? [] : is.arr(a) ? a : [a];\nfunction flush(queue, iterator) {\n if (queue.size) {\n const items = Array.from(queue);\n queue.clear();\n each(items, iterator);\n }\n}\nvar flushCalls = (queue, ...args) => flush(queue, (fn) => fn(...args));\nvar isSSR = () => typeof window === \"undefined\" || !window.navigator || /ServerSideRendering|^Deno\\//.test(window.navigator.userAgent);\n\n// src/globals.ts\nvar createStringInterpolator;\nvar to;\nvar colors = null;\nvar skipAnimation = false;\nvar willAdvance = noop;\nvar assign = (globals) => {\n if (globals.to) to = globals.to;\n if (globals.now) raf.now = globals.now;\n if (globals.colors !== void 0) colors = globals.colors;\n if (globals.skipAnimation != null) skipAnimation = globals.skipAnimation;\n if (globals.createStringInterpolator)\n createStringInterpolator = globals.createStringInterpolator;\n if (globals.requestAnimationFrame) raf.use(globals.requestAnimationFrame);\n if (globals.batchedUpdates) raf.batchedUpdates = globals.batchedUpdates;\n if (globals.willAdvance) willAdvance = globals.willAdvance;\n if (globals.frameLoop) raf.frameLoop = globals.frameLoop;\n};\n\n// src/FrameLoop.ts\nimport { raf as raf2 } from \"@react-spring/rafz\";\nvar startQueue = /* @__PURE__ */ new Set();\nvar currentFrame = [];\nvar prevFrame = [];\nvar priority = 0;\nvar frameLoop = {\n get idle() {\n return !startQueue.size && !currentFrame.length;\n },\n /** Advance the given animation on every frame until idle. */\n start(animation) {\n if (priority > animation.priority) {\n startQueue.add(animation);\n raf2.onStart(flushStartQueue);\n } else {\n startSafely(animation);\n raf2(advance);\n }\n },\n /** Advance all animations by the given time. */\n advance,\n /** Call this when an animation's priority changes. */\n sort(animation) {\n if (priority) {\n raf2.onFrame(() => frameLoop.sort(animation));\n } else {\n const prevIndex = currentFrame.indexOf(animation);\n if (~prevIndex) {\n currentFrame.splice(prevIndex, 1);\n startUnsafely(animation);\n }\n }\n },\n /**\n * Clear all animations. For testing purposes.\n *\n * ☠️ Never call this from within the frameloop.\n */\n clear() {\n currentFrame = [];\n startQueue.clear();\n }\n};\nfunction flushStartQueue() {\n startQueue.forEach(startSafely);\n startQueue.clear();\n raf2(advance);\n}\nfunction startSafely(animation) {\n if (!currentFrame.includes(animation)) startUnsafely(animation);\n}\nfunction startUnsafely(animation) {\n currentFrame.splice(\n findIndex(currentFrame, (other) => other.priority > animation.priority),\n 0,\n animation\n );\n}\nfunction advance(dt) {\n const nextFrame = prevFrame;\n for (let i = 0; i < currentFrame.length; i++) {\n const animation = currentFrame[i];\n priority = animation.priority;\n if (!animation.idle) {\n willAdvance(animation);\n animation.advance(dt);\n if (!animation.idle) {\n nextFrame.push(animation);\n }\n }\n }\n priority = 0;\n prevFrame = currentFrame;\n prevFrame.length = 0;\n currentFrame = nextFrame;\n return currentFrame.length > 0;\n}\nfunction findIndex(arr, test) {\n const index = arr.findIndex(test);\n return index < 0 ? arr.length : index;\n}\n\n// src/clamp.ts\nvar clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\n// src/colors.ts\nvar colors2 = {\n transparent: 0,\n aliceblue: 4042850303,\n antiquewhite: 4209760255,\n aqua: 16777215,\n aquamarine: 2147472639,\n azure: 4043309055,\n beige: 4126530815,\n bisque: 4293182719,\n black: 255,\n blanchedalmond: 4293643775,\n blue: 65535,\n blueviolet: 2318131967,\n brown: 2771004159,\n burlywood: 3736635391,\n burntsienna: 3934150143,\n cadetblue: 1604231423,\n chartreuse: 2147418367,\n chocolate: 3530104575,\n coral: 4286533887,\n cornflowerblue: 1687547391,\n cornsilk: 4294499583,\n crimson: 3692313855,\n cyan: 16777215,\n darkblue: 35839,\n darkcyan: 9145343,\n darkgoldenrod: 3095792639,\n darkgray: 2846468607,\n darkgreen: 6553855,\n darkgrey: 2846468607,\n darkkhaki: 3182914559,\n darkmagenta: 2332068863,\n darkolivegreen: 1433087999,\n darkorange: 4287365375,\n darkorchid: 2570243327,\n darkred: 2332033279,\n darksalmon: 3918953215,\n darkseagreen: 2411499519,\n darkslateblue: 1211993087,\n darkslategray: 793726975,\n darkslategrey: 793726975,\n darkturquoise: 13554175,\n darkviolet: 2483082239,\n deeppink: 4279538687,\n deepskyblue: 12582911,\n dimgray: 1768516095,\n dimgrey: 1768516095,\n dodgerblue: 512819199,\n firebrick: 2988581631,\n floralwhite: 4294635775,\n forestgreen: 579543807,\n fuchsia: 4278255615,\n gainsboro: 3705462015,\n ghostwhite: 4177068031,\n gold: 4292280575,\n goldenrod: 3668254975,\n gray: 2155905279,\n green: 8388863,\n greenyellow: 2919182335,\n grey: 2155905279,\n honeydew: 4043305215,\n hotpink: 4285117695,\n indianred: 3445382399,\n indigo: 1258324735,\n ivory: 4294963455,\n khaki: 4041641215,\n lavender: 3873897215,\n lavenderblush: 4293981695,\n lawngreen: 2096890111,\n lemonchiffon: 4294626815,\n lightblue: 2916673279,\n lightcoral: 4034953471,\n lightcyan: 3774873599,\n lightgoldenrodyellow: 4210742015,\n lightgray: 3553874943,\n lightgreen: 2431553791,\n lightgrey: 3553874943,\n lightpink: 4290167295,\n lightsalmon: 4288707327,\n lightseagreen: 548580095,\n lightskyblue: 2278488831,\n lightslategray: 2005441023,\n lightslategrey: 2005441023,\n lightsteelblue: 2965692159,\n lightyellow: 4294959359,\n lime: 16711935,\n limegreen: 852308735,\n linen: 4210091775,\n magenta: 4278255615,\n maroon: 2147483903,\n mediumaquamarine: 1724754687,\n mediumblue: 52735,\n mediumorchid: 3126187007,\n mediumpurple: 2473647103,\n mediumseagreen: 1018393087,\n mediumslateblue: 2070474495,\n mediumspringgreen: 16423679,\n mediumturquoise: 1221709055,\n mediumvioletred: 3340076543,\n midnightblue: 421097727,\n mintcream: 4127193855,\n mistyrose: 4293190143,\n moccasin: 4293178879,\n navajowhite: 4292783615,\n navy: 33023,\n oldlace: 4260751103,\n olive: 2155872511,\n olivedrab: 1804477439,\n orange: 4289003775,\n orangered: 4282712319,\n orchid: 3664828159,\n palegoldenrod: 4008225535,\n palegreen: 2566625535,\n paleturquoise: 2951671551,\n palevioletred: 3681588223,\n papayawhip: 4293907967,\n peachpuff: 4292524543,\n peru: 3448061951,\n pink: 4290825215,\n plum: 3718307327,\n powderblue: 2967529215,\n purple: 2147516671,\n rebeccapurple: 1714657791,\n red: 4278190335,\n rosybrown: 3163525119,\n royalblue: 1097458175,\n saddlebrown: 2336560127,\n salmon: 4202722047,\n sandybrown: 4104413439,\n seagreen: 780883967,\n seashell: 4294307583,\n sienna: 2689740287,\n silver: 3233857791,\n skyblue: 2278484991,\n slateblue: 1784335871,\n slategray: 1887473919,\n slategrey: 1887473919,\n snow: 4294638335,\n springgreen: 16744447,\n steelblue: 1182971135,\n tan: 3535047935,\n teal: 8421631,\n thistle: 3636451583,\n tomato: 4284696575,\n turquoise: 1088475391,\n violet: 4001558271,\n wheat: 4125012991,\n white: 4294967295,\n whitesmoke: 4126537215,\n yellow: 4294902015,\n yellowgreen: 2597139199\n};\n\n// src/colorMatchers.ts\nvar NUMBER = \"[-+]?\\\\d*\\\\.?\\\\d+\";\nvar PERCENTAGE = NUMBER + \"%\";\nfunction call(...parts) {\n return \"\\\\(\\\\s*(\" + parts.join(\")\\\\s*,\\\\s*(\") + \")\\\\s*\\\\)\";\n}\nvar rgb = new RegExp(\"rgb\" + call(NUMBER, NUMBER, NUMBER));\nvar rgba = new RegExp(\"rgba\" + call(NUMBER, NUMBER, NUMBER, NUMBER));\nvar hsl = new RegExp(\"hsl\" + call(NUMBER, PERCENTAGE, PERCENTAGE));\nvar hsla = new RegExp(\n \"hsla\" + call(NUMBER, PERCENTAGE, PERCENTAGE, NUMBER)\n);\nvar hex3 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nvar hex4 = /^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/;\nvar hex6 = /^#([0-9a-fA-F]{6})$/;\nvar hex8 = /^#([0-9a-fA-F]{8})$/;\n\n// src/normalizeColor.ts\nfunction normalizeColor(color) {\n let match;\n if (typeof color === \"number\") {\n return color >>> 0 === color && color >= 0 && color <= 4294967295 ? color : null;\n }\n if (match = hex6.exec(color))\n return parseInt(match[1] + \"ff\", 16) >>> 0;\n if (colors && colors[color] !== void 0) {\n return colors[color];\n }\n if (match = rgb.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n 255) >>> // a\n 0;\n }\n if (match = rgba.exec(color)) {\n return (parse255(match[1]) << 24 | // r\n parse255(match[2]) << 16 | // g\n parse255(match[3]) << 8 | // b\n parse1(match[4])) >>> // a\n 0;\n }\n if (match = hex3.exec(color)) {\n return parseInt(\n match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n \"ff\",\n // a\n 16\n ) >>> 0;\n }\n if (match = hex8.exec(color)) return parseInt(match[1], 16) >>> 0;\n if (match = hex4.exec(color)) {\n return parseInt(\n match[1] + match[1] + // r\n match[2] + match[2] + // g\n match[3] + match[3] + // b\n match[4] + match[4],\n // a\n 16\n ) >>> 0;\n }\n if (match = hsl.exec(color)) {\n return (hslToRgb(\n parse360(match[1]),\n // h\n parsePercentage(match[2]),\n // s\n parsePercentage(match[3])\n // l\n ) | 255) >>> // a\n 0;\n }\n if (match = hsla.exec(color)) {\n return (hslToRgb(\n parse360(match[1]),\n // h\n parsePercentage(match[2]),\n // s\n parsePercentage(match[3])\n // l\n ) | parse1(match[4])) >>> // a\n 0;\n }\n return null;\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nfunction hslToRgb(h, s, l) {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const r = hue2rgb(p, q, h + 1 / 3);\n const g = hue2rgb(p, q, h);\n const b = hue2rgb(p, q, h - 1 / 3);\n return Math.round(r * 255) << 24 | Math.round(g * 255) << 16 | Math.round(b * 255) << 8;\n}\nfunction parse255(str) {\n const int = parseInt(str, 10);\n if (int < 0) return 0;\n if (int > 255) return 255;\n return int;\n}\nfunction parse360(str) {\n const int = parseFloat(str);\n return (int % 360 + 360) % 360 / 360;\n}\nfunction parse1(str) {\n const num = parseFloat(str);\n if (num < 0) return 0;\n if (num > 1) return 255;\n return Math.round(num * 255);\n}\nfunction parsePercentage(str) {\n const int = parseFloat(str);\n if (int < 0) return 0;\n if (int > 100) return 1;\n return int / 100;\n}\n\n// src/colorToRgba.ts\nfunction colorToRgba(input) {\n let int32Color = normalizeColor(input);\n if (int32Color === null) return input;\n int32Color = int32Color || 0;\n const r = (int32Color & 4278190080) >>> 24;\n const g = (int32Color & 16711680) >>> 16;\n const b = (int32Color & 65280) >>> 8;\n const a = (int32Color & 255) / 255;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n}\n\n// src/createInterpolator.ts\nvar createInterpolator = (range, output, extrapolate) => {\n if (is.fun(range)) {\n return range;\n }\n if (is.arr(range)) {\n return createInterpolator({\n range,\n output,\n extrapolate\n });\n }\n if (is.str(range.output[0])) {\n return createStringInterpolator(range);\n }\n const config = range;\n const outputRange = config.output;\n const inputRange = config.range || [0, 1];\n const extrapolateLeft = config.extrapolateLeft || config.extrapolate || \"extend\";\n const extrapolateRight = config.extrapolateRight || config.extrapolate || \"extend\";\n const easing = config.easing || ((t) => t);\n return (input) => {\n const range2 = findRange(input, inputRange);\n return interpolate(\n input,\n inputRange[range2],\n inputRange[range2 + 1],\n outputRange[range2],\n outputRange[range2 + 1],\n easing,\n extrapolateLeft,\n extrapolateRight,\n config.map\n );\n };\n};\nfunction interpolate(input, inputMin, inputMax, outputMin, outputMax, easing, extrapolateLeft, extrapolateRight, map) {\n let result = map ? map(input) : input;\n if (result < inputMin) {\n if (extrapolateLeft === \"identity\") return result;\n else if (extrapolateLeft === \"clamp\") result = inputMin;\n }\n if (result > inputMax) {\n if (extrapolateRight === \"identity\") return result;\n else if (extrapolateRight === \"clamp\") result = inputMax;\n }\n if (outputMin === outputMax) return outputMin;\n if (inputMin === inputMax) return input <= inputMin ? outputMin : outputMax;\n if (inputMin === -Infinity) result = -result;\n else if (inputMax === Infinity) result = result - inputMin;\n else result = (result - inputMin) / (inputMax - inputMin);\n result = easing(result);\n if (outputMin === -Infinity) result = -result;\n else if (outputMax === Infinity) result = result + outputMin;\n else result = result * (outputMax - outputMin) + outputMin;\n return result;\n}\nfunction findRange(input, inputRange) {\n for (var i = 1; i < inputRange.length - 1; ++i)\n if (inputRange[i] >= input) break;\n return i - 1;\n}\n\n// src/easings.ts\nvar steps = (steps2, direction = \"end\") => (progress2) => {\n progress2 = direction === \"end\" ? Math.min(progress2, 0.999) : Math.max(progress2, 1e-3);\n const expanded = progress2 * steps2;\n const rounded = direction === \"end\" ? Math.floor(expanded) : Math.ceil(expanded);\n return clamp(0, 1, rounded / steps2);\n};\nvar c1 = 1.70158;\nvar c2 = c1 * 1.525;\nvar c3 = c1 + 1;\nvar c4 = 2 * Math.PI / 3;\nvar c5 = 2 * Math.PI / 4.5;\nvar bounceOut = (x) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n};\nvar easings = {\n linear: (x) => x,\n easeInQuad: (x) => x * x,\n easeOutQuad: (x) => 1 - (1 - x) * (1 - x),\n easeInOutQuad: (x) => x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2,\n easeInCubic: (x) => x * x * x,\n easeOutCubic: (x) => 1 - Math.pow(1 - x, 3),\n easeInOutCubic: (x) => x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2,\n easeInQuart: (x) => x * x * x * x,\n easeOutQuart: (x) => 1 - Math.pow(1 - x, 4),\n easeInOutQuart: (x) => x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2,\n easeInQuint: (x) => x * x * x * x * x,\n easeOutQuint: (x) => 1 - Math.pow(1 - x, 5),\n easeInOutQuint: (x) => x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2,\n easeInSine: (x) => 1 - Math.cos(x * Math.PI / 2),\n easeOutSine: (x) => Math.sin(x * Math.PI / 2),\n easeInOutSine: (x) => -(Math.cos(Math.PI * x) - 1) / 2,\n easeInExpo: (x) => x === 0 ? 0 : Math.pow(2, 10 * x - 10),\n easeOutExpo: (x) => x === 1 ? 1 : 1 - Math.pow(2, -10 * x),\n easeInOutExpo: (x) => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? Math.pow(2, 20 * x - 10) / 2 : (2 - Math.pow(2, -20 * x + 10)) / 2,\n easeInCirc: (x) => 1 - Math.sqrt(1 - Math.pow(x, 2)),\n easeOutCirc: (x) => Math.sqrt(1 - Math.pow(x - 1, 2)),\n easeInOutCirc: (x) => x < 0.5 ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2 : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2,\n easeInBack: (x) => c3 * x * x * x - c1 * x * x,\n easeOutBack: (x) => 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2),\n easeInOutBack: (x) => x < 0.5 ? Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2) / 2 : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,\n easeInElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4),\n easeOutElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1,\n easeInOutElastic: (x) => x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2 : Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5) / 2 + 1,\n easeInBounce: (x) => 1 - bounceOut(1 - x),\n easeOutBounce: bounceOut,\n easeInOutBounce: (x) => x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2,\n steps\n};\n\n// src/fluids.ts\nvar $get = Symbol.for(\"FluidValue.get\");\nvar $observers = Symbol.for(\"FluidValue.observers\");\nvar hasFluidValue = (arg) => Boolean(arg && arg[$get]);\nvar getFluidValue = (arg) => arg && arg[$get] ? arg[$get]() : arg;\nvar getFluidObservers = (target) => target[$observers] || null;\nfunction callFluidObserver(observer2, event) {\n if (observer2.eventObserved) {\n observer2.eventObserved(event);\n } else {\n observer2(event);\n }\n}\nfunction callFluidObservers(target, event) {\n const observers = target[$observers];\n if (observers) {\n observers.forEach((observer2) => {\n callFluidObserver(observer2, event);\n });\n }\n}\n$get, $observers;\nvar FluidValue = class {\n constructor(get) {\n if (!get && !(get = this.get)) {\n throw Error(\"Unknown getter\");\n }\n setFluidGetter(this, get);\n }\n};\nvar setFluidGetter = (target, get) => setHidden(target, $get, get);\nfunction addFluidObserver(target, observer2) {\n if (target[$get]) {\n let observers = target[$observers];\n if (!observers) {\n setHidden(target, $observers, observers = /* @__PURE__ */ new Set());\n }\n if (!observers.has(observer2)) {\n observers.add(observer2);\n if (target.observerAdded) {\n target.observerAdded(observers.size, observer2);\n }\n }\n }\n return observer2;\n}\nfunction removeFluidObserver(target, observer2) {\n const observers = target[$observers];\n if (observers && observers.has(observer2)) {\n const count = observers.size - 1;\n if (count) {\n observers.delete(observer2);\n } else {\n target[$observers] = null;\n }\n if (target.observerRemoved) {\n target.observerRemoved(count, observer2);\n }\n }\n}\nvar setHidden = (target, key, value) => Object.defineProperty(target, key, {\n value,\n writable: true,\n configurable: true\n});\n\n// src/regexs.ts\nvar numberRegex = /[+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\nvar colorRegex = /(#(?:[0-9a-f]{2}){2,4}|(#[0-9a-f]{3})|(rgb|hsl)a?\\((-?\\d+%?[,\\s]+){2,3}\\s*[\\d\\.]+%?\\))/gi;\nvar unitRegex = new RegExp(`(${numberRegex.source})(%|[a-z]+)`, \"i\");\nvar rgbaRegex = /rgba\\(([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+), ([0-9\\.-]+)\\)/gi;\nvar cssVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\n\n// src/variableToRgba.ts\nvar variableToRgba = (input) => {\n const [token, fallback] = parseCSSVariable(input);\n if (!token || isSSR()) {\n return input;\n }\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(token);\n if (value) {\n return value.trim();\n } else if (fallback && fallback.startsWith(\"--\")) {\n const value2 = window.getComputedStyle(document.documentElement).getPropertyValue(fallback);\n if (value2) {\n return value2;\n } else {\n return input;\n }\n } else if (fallback && cssVariableRegex.test(fallback)) {\n return variableToRgba(fallback);\n } else if (fallback) {\n return fallback;\n }\n return input;\n};\nvar parseCSSVariable = (current) => {\n const match = cssVariableRegex.exec(current);\n if (!match) return [,];\n const [, token, fallback] = match;\n return [token, fallback];\n};\n\n// src/stringInterpolation.ts\nvar namedColorRegex;\nvar rgbaRound = (_, p1, p2, p3, p4) => `rgba(${Math.round(p1)}, ${Math.round(p2)}, ${Math.round(p3)}, ${p4})`;\nvar createStringInterpolator2 = (config) => {\n if (!namedColorRegex)\n namedColorRegex = colors ? (\n // match color names, ignore partial matches\n new RegExp(`(${Object.keys(colors).join(\"|\")})(?!\\\\w)`, \"g\")\n ) : (\n // never match\n /^\\b$/\n );\n const output = config.output.map((value) => {\n return getFluidValue(value).replace(cssVariableRegex, variableToRgba).replace(colorRegex, colorToRgba).replace(namedColorRegex, colorToRgba);\n });\n const keyframes = output.map((value) => value.match(numberRegex).map(Number));\n const outputRanges = keyframes[0].map(\n (_, i) => keyframes.map((values) => {\n if (!(i in values)) {\n throw Error('The arity of each \"output\" value must be equal');\n }\n return values[i];\n })\n );\n const interpolators = outputRanges.map(\n (output2) => createInterpolator({ ...config, output: output2 })\n );\n return (input) => {\n const missingUnit = !unitRegex.test(output[0]) && output.find((value) => unitRegex.test(value))?.replace(numberRegex, \"\");\n let i = 0;\n return output[0].replace(\n numberRegex,\n () => `${interpolators[i++](input)}${missingUnit || \"\"}`\n ).replace(rgbaRegex, rgbaRound);\n };\n};\n\n// src/deprecations.ts\nvar prefix = \"react-spring: \";\nvar once = (fn) => {\n const func = fn;\n let called = false;\n if (typeof func != \"function\") {\n throw new TypeError(`${prefix}once requires a function parameter`);\n }\n return (...args) => {\n if (!called) {\n func(...args);\n called = true;\n }\n };\n};\nvar warnInterpolate = once(console.warn);\nfunction deprecateInterpolate() {\n warnInterpolate(\n `${prefix}The \"interpolate\" function is deprecated in v9 (use \"to\" instead)`\n );\n}\nvar warnDirectCall = once(console.warn);\nfunction deprecateDirectCall() {\n warnDirectCall(\n `${prefix}Directly calling start instead of using the api object is deprecated in v9 (use \".start\" instead), this will be removed in later 0.X.0 versions`\n );\n}\n\n// src/isAnimatedString.ts\nfunction isAnimatedString(value) {\n return is.str(value) && (value[0] == \"#\" || /\\d/.test(value) || // Do not identify a CSS variable as an AnimatedString if its SSR\n !isSSR() && cssVariableRegex.test(value) || value in (colors || {}));\n}\n\n// src/dom-events/scroll/index.ts\nimport { raf as raf3 } from \"@react-spring/rafz\";\n\n// src/dom-events/resize/resizeElement.ts\nvar observer;\nvar resizeHandlers = /* @__PURE__ */ new WeakMap();\nvar handleObservation = (entries) => entries.forEach(({ target, contentRect }) => {\n return resizeHandlers.get(target)?.forEach((handler) => handler(contentRect));\n});\nfunction resizeElement(handler, target) {\n if (!observer) {\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(handleObservation);\n }\n }\n let elementHandlers = resizeHandlers.get(target);\n if (!elementHandlers) {\n elementHandlers = /* @__PURE__ */ new Set();\n resizeHandlers.set(target, elementHandlers);\n }\n elementHandlers.add(handler);\n if (observer) {\n observer.observe(target);\n }\n return () => {\n const elementHandlers2 = resizeHandlers.get(target);\n if (!elementHandlers2) return;\n elementHandlers2.delete(handler);\n if (!elementHandlers2.size && observer) {\n observer.unobserve(target);\n }\n };\n}\n\n// src/dom-events/resize/resizeWindow.ts\nvar listeners = /* @__PURE__ */ new Set();\nvar cleanupWindowResizeHandler;\nvar createResizeHandler = () => {\n const handleResize = () => {\n listeners.forEach(\n (callback) => callback({\n width: window.innerWidth,\n height: window.innerHeight\n })\n );\n };\n window.addEventListener(\"resize\", handleResize);\n return () => {\n window.removeEventListener(\"resize\", handleResize);\n };\n};\nvar resizeWindow = (callback) => {\n listeners.add(callback);\n if (!cleanupWindowResizeHandler) {\n cleanupWindowResizeHandler = createResizeHandler();\n }\n return () => {\n listeners.delete(callback);\n if (!listeners.size && cleanupWindowResizeHandler) {\n cleanupWindowResizeHandler();\n cleanupWindowResizeHandler = void 0;\n }\n };\n};\n\n// src/dom-events/resize/index.ts\nvar onResize = (callback, { container = document.documentElement } = {}) => {\n if (container === document.documentElement) {\n return resizeWindow(callback);\n } else {\n return resizeElement(callback, container);\n }\n};\n\n// src/progress.ts\nvar progress = (min, max, value) => max - min === 0 ? 1 : (value - min) / (max - min);\n\n// src/dom-events/scroll/ScrollHandler.ts\nvar SCROLL_KEYS = {\n x: {\n length: \"Width\",\n position: \"Left\"\n },\n y: {\n length: \"Height\",\n position: \"Top\"\n }\n};\nvar ScrollHandler = class {\n constructor(callback, container) {\n this.createAxis = () => ({\n current: 0,\n progress: 0,\n scrollLength: 0\n });\n this.updateAxis = (axisName) => {\n const axis = this.info[axisName];\n const { length, position } = SCROLL_KEYS[axisName];\n axis.current = this.container[`scroll${position}`];\n axis.scrollLength = this.container[`scroll${length}`] - this.container[`client${length}`];\n axis.progress = progress(0, axis.scrollLength, axis.current);\n };\n this.update = () => {\n this.updateAxis(\"x\");\n this.updateAxis(\"y\");\n };\n this.sendEvent = () => {\n this.callback(this.info);\n };\n this.advance = () => {\n this.update();\n this.sendEvent();\n };\n this.callback = callback;\n this.container = container;\n this.info = {\n time: 0,\n x: this.createAxis(),\n y: this.createAxis()\n };\n }\n};\n\n// src/dom-events/scroll/index.ts\nvar scrollListeners = /* @__PURE__ */ new WeakMap();\nvar resizeListeners = /* @__PURE__ */ new WeakMap();\nvar onScrollHandlers = /* @__PURE__ */ new WeakMap();\nvar getTarget = (container) => container === document.documentElement ? window : container;\nvar onScroll = (callback, { container = document.documentElement } = {}) => {\n let containerHandlers = onScrollHandlers.get(container);\n if (!containerHandlers) {\n containerHandlers = /* @__PURE__ */ new Set();\n onScrollHandlers.set(container, containerHandlers);\n }\n const containerHandler = new ScrollHandler(callback, container);\n containerHandlers.add(containerHandler);\n if (!scrollListeners.has(container)) {\n const listener = () => {\n containerHandlers?.forEach((handler) => handler.advance());\n return true;\n };\n scrollListeners.set(container, listener);\n const target = getTarget(container);\n window.addEventListener(\"resize\", listener, { passive: true });\n if (container !== document.documentElement) {\n resizeListeners.set(container, onResize(listener, { container }));\n }\n target.addEventListener(\"scroll\", listener, { passive: true });\n }\n const animateScroll = scrollListeners.get(container);\n raf3(animateScroll);\n return () => {\n raf3.cancel(animateScroll);\n const containerHandlers2 = onScrollHandlers.get(container);\n if (!containerHandlers2) return;\n containerHandlers2.delete(containerHandler);\n if (containerHandlers2.size) return;\n const listener = scrollListeners.get(container);\n scrollListeners.delete(container);\n if (listener) {\n getTarget(container).removeEventListener(\"scroll\", listener);\n window.removeEventListener(\"resize\", listener);\n resizeListeners.get(container)?.();\n }\n };\n};\n\n// src/hooks/useConstant.ts\nimport { useRef } from \"react\";\nfunction useConstant(init) {\n const ref = useRef(null);\n if (ref.current === null) {\n ref.current = init();\n }\n return ref.current;\n}\n\n// src/hooks/useForceUpdate.ts\nimport { useState } from \"react\";\n\n// src/hooks/useIsMounted.ts\nimport { useRef as useRef2 } from \"react\";\n\n// src/hooks/useIsomorphicLayoutEffect.ts\nimport { useEffect, useLayoutEffect } from \"react\";\nvar useIsomorphicLayoutEffect = isSSR() ? useEffect : useLayoutEffect;\n\n// src/hooks/useIsMounted.ts\nvar useIsMounted = () => {\n const isMounted = useRef2(false);\n useIsomorphicLayoutEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return isMounted;\n};\n\n// src/hooks/useForceUpdate.ts\nfunction useForceUpdate() {\n const update = useState()[1];\n const isMounted = useIsMounted();\n return () => {\n if (isMounted.current) {\n update(Math.random());\n }\n };\n}\n\n// src/hooks/useMemoOne.ts\nimport { useEffect as useEffect2, useRef as useRef3, useState as useState2 } from \"react\";\nfunction useMemoOne(getResult, inputs) {\n const [initial] = useState2(\n () => ({\n inputs,\n result: getResult()\n })\n );\n const committed = useRef3(void 0);\n const prevCache = committed.current;\n let cache = prevCache;\n if (cache) {\n const useCache = Boolean(\n inputs && cache.inputs && areInputsEqual(inputs, cache.inputs)\n );\n if (!useCache) {\n cache = {\n inputs,\n result: getResult()\n };\n }\n } else {\n cache = initial;\n }\n useEffect2(() => {\n committed.current = cache;\n if (prevCache == initial) {\n initial.inputs = initial.result = void 0;\n }\n }, [cache]);\n return cache.result;\n}\nfunction areInputsEqual(next, prev) {\n if (next.length !== prev.length) {\n return false;\n }\n for (let i = 0; i < next.length; i++) {\n if (next[i] !== prev[i]) {\n return false;\n }\n }\n return true;\n}\n\n// src/hooks/useOnce.ts\nimport { useEffect as useEffect3 } from \"react\";\nvar useOnce = (effect) => useEffect3(effect, emptyDeps);\nvar emptyDeps = [];\n\n// src/hooks/usePrev.ts\nimport { useEffect as useEffect4, useRef as useRef4 } from \"react\";\nfunction usePrev(value) {\n const prevRef = useRef4(void 0);\n useEffect4(() => {\n prevRef.current = value;\n });\n return prevRef.current;\n}\n\n// src/hooks/useReducedMotion.ts\nimport { useState as useState3 } from \"react\";\nvar useReducedMotion = () => {\n const [reducedMotion, setReducedMotion] = useState3(null);\n useIsomorphicLayoutEffect(() => {\n const mql = window.matchMedia(\"(prefers-reduced-motion)\");\n const handleMediaChange = (e) => {\n setReducedMotion(e.matches);\n assign({\n skipAnimation: e.matches\n });\n };\n handleMediaChange(mql);\n if (mql.addEventListener) {\n mql.addEventListener(\"change\", handleMediaChange);\n } else {\n mql.addListener(handleMediaChange);\n }\n return () => {\n if (mql.removeEventListener) {\n mql.removeEventListener(\"change\", handleMediaChange);\n } else {\n mql.removeListener(handleMediaChange);\n }\n };\n }, []);\n return reducedMotion;\n};\n\n// src/index.ts\nimport { raf as raf4 } from \"@react-spring/rafz\";\nexport {\n FluidValue,\n globals_exports as Globals,\n addFluidObserver,\n callFluidObserver,\n callFluidObservers,\n clamp,\n colorToRgba,\n colors2 as colors,\n createInterpolator,\n createStringInterpolator2 as createStringInterpolator,\n defineHidden,\n deprecateDirectCall,\n deprecateInterpolate,\n each,\n eachProp,\n easings,\n flush,\n flushCalls,\n frameLoop,\n getFluidObservers,\n getFluidValue,\n hasFluidValue,\n hex3,\n hex4,\n hex6,\n hex8,\n hsl,\n hsla,\n is,\n isAnimatedString,\n isEqual,\n isSSR,\n noop,\n onResize,\n onScroll,\n once,\n prefix,\n raf4 as raf,\n removeFluidObserver,\n rgb,\n rgba,\n setFluidGetter,\n toArray,\n useConstant,\n useForceUpdate,\n useIsomorphicLayoutEffect,\n useMemoOne,\n useOnce,\n usePrev,\n useReducedMotion\n};\n","// src/Animated.ts\nimport { defineHidden } from \"@react-spring/shared\";\nvar $node = Symbol.for(\"Animated:node\");\nvar isAnimated = (value) => !!value && value[$node] === value;\nvar getAnimated = (owner) => owner && owner[$node];\nvar setAnimated = (owner, node) => defineHidden(owner, $node, node);\nvar getPayload = (owner) => owner && owner[$node] && owner[$node].getPayload();\nvar Animated = class {\n constructor() {\n setAnimated(this, this);\n }\n /** Get every `AnimatedValue` used by this node. */\n getPayload() {\n return this.payload || [];\n }\n};\n\n// src/AnimatedValue.ts\nimport { is } from \"@react-spring/shared\";\nvar AnimatedValue = class _AnimatedValue extends Animated {\n constructor(_value) {\n super();\n this._value = _value;\n this.done = true;\n this.durationProgress = 0;\n if (is.num(this._value)) {\n this.lastPosition = this._value;\n }\n }\n /** @internal */\n static create(value) {\n return new _AnimatedValue(value);\n }\n getPayload() {\n return [this];\n }\n getValue() {\n return this._value;\n }\n setValue(value, step) {\n if (is.num(value)) {\n this.lastPosition = value;\n if (step) {\n value = Math.round(value / step) * step;\n if (this.done) {\n this.lastPosition = value;\n }\n }\n }\n if (this._value === value) {\n return false;\n }\n this._value = value;\n return true;\n }\n reset() {\n const { done } = this;\n this.done = false;\n if (is.num(this._value)) {\n this.elapsedTime = 0;\n this.durationProgress = 0;\n this.lastPosition = this._value;\n if (done) this.lastVelocity = null;\n this.v0 = null;\n }\n }\n};\n\n// src/AnimatedString.ts\nimport { is as is2, createInterpolator } from \"@react-spring/shared\";\nvar AnimatedString = class _AnimatedString extends AnimatedValue {\n constructor(value) {\n super(0);\n this._string = null;\n this._toString = createInterpolator({\n output: [value, value]\n });\n }\n /** @internal */\n static create(value) {\n return new _AnimatedString(value);\n }\n getValue() {\n const value = this._string;\n return value == null ? this._string = this._toString(this._value) : value;\n }\n setValue(value) {\n if (is2.str(value)) {\n if (value == this._string) {\n return false;\n }\n this._string = value;\n this._value = 1;\n } else if (super.setValue(value)) {\n this._string = null;\n } else {\n return false;\n }\n return true;\n }\n reset(goal) {\n if (goal) {\n this._toString = createInterpolator({\n output: [this.getValue(), goal]\n });\n }\n this._value = 0;\n super.reset();\n }\n};\n\n// src/AnimatedArray.ts\nimport { isAnimatedString } from \"@react-spring/shared\";\n\n// src/AnimatedObject.ts\nimport {\n each,\n eachProp,\n getFluidValue,\n hasFluidValue\n} from \"@react-spring/shared\";\n\n// src/context.ts\nvar TreeContext = { dependencies: null };\n\n// src/AnimatedObject.ts\nvar AnimatedObject = class extends Animated {\n constructor(source) {\n super();\n this.source = source;\n this.setValue(source);\n }\n getValue(animated) {\n const values = {};\n eachProp(this.source, (source, key) => {\n if (isAnimated(source)) {\n values[key] = source.getValue(animated);\n } else if (hasFluidValue(source)) {\n values[key] = getFluidValue(source);\n } else if (!animated) {\n values[key] = source;\n }\n });\n return values;\n }\n /** Replace the raw object data */\n setValue(source) {\n this.source = source;\n this.payload = this._makePayload(source);\n }\n reset() {\n if (this.payload) {\n each(this.payload, (node) => node.reset());\n }\n }\n /** Create a payload set. */\n _makePayload(source) {\n if (source) {\n const payload = /* @__PURE__ */ new Set();\n eachProp(source, this._addToPayload, payload);\n return Array.from(payload);\n }\n }\n /** Add to a payload set. */\n _addToPayload(source) {\n if (TreeContext.dependencies && hasFluidValue(source)) {\n TreeContext.dependencies.add(source);\n }\n const payload = getPayload(source);\n if (payload) {\n each(payload, (node) => this.add(node));\n }\n }\n};\n\n// src/AnimatedArray.ts\nvar AnimatedArray = class _AnimatedArray extends AnimatedObject {\n constructor(source) {\n super(source);\n }\n /** @internal */\n static create(source) {\n return new _AnimatedArray(source);\n }\n getValue() {\n return this.source.map((node) => node.getValue());\n }\n setValue(source) {\n const payload = this.getPayload();\n if (source.length == payload.length) {\n return payload.map((node, i) => node.setValue(source[i])).some(Boolean);\n }\n super.setValue(source.map(makeAnimated));\n return true;\n }\n};\nfunction makeAnimated(value) {\n const nodeType = isAnimatedString(value) ? AnimatedString : AnimatedValue;\n return nodeType.create(value);\n}\n\n// src/getAnimatedType.ts\nimport { is as is3, isAnimatedString as isAnimatedString2 } from \"@react-spring/shared\";\nfunction getAnimatedType(value) {\n const parentNode = getAnimated(value);\n return parentNode ? parentNode.constructor : is3.arr(value) ? AnimatedArray : isAnimatedString2(value) ? AnimatedString : AnimatedValue;\n}\n\n// src/createHost.ts\nimport { is as is5, eachProp as eachProp2 } from \"@react-spring/shared\";\n\n// src/withAnimated.tsx\nimport * as React from \"react\";\nimport { forwardRef, useRef, useCallback, useEffect } from \"react\";\nimport {\n is as is4,\n each as each2,\n raf,\n useForceUpdate,\n useOnce,\n addFluidObserver,\n removeFluidObserver,\n useIsomorphicLayoutEffect\n} from \"@react-spring/shared\";\nvar withAnimated = (Component, host) => {\n const hasInstance = (\n // Function components must use \"forwardRef\" to avoid being\n // re-rendered on every animation frame.\n !is4.fun(Component) || Component.prototype && Component.prototype.isReactComponent\n );\n return forwardRef((givenProps, givenRef) => {\n const instanceRef = useRef(null);\n const ref = hasInstance && // eslint-disable-next-line react-hooks/rules-of-hooks\n useCallback(\n (value) => {\n instanceRef.current = updateRef(givenRef, value);\n },\n [givenRef]\n );\n const [props, deps] = getAnimatedState(givenProps, host);\n const forceUpdate = useForceUpdate();\n const callback = () => {\n const instance = instanceRef.current;\n if (hasInstance && !instance) {\n return;\n }\n const didUpdate = instance ? host.applyAnimatedValues(instance, props.getValue(true)) : false;\n if (didUpdate === false) {\n forceUpdate();\n }\n };\n const observer = new PropsObserver(callback, deps);\n const observerRef = useRef(void 0);\n useIsomorphicLayoutEffect(() => {\n observerRef.current = observer;\n each2(deps, (dep) => addFluidObserver(dep, observer));\n return () => {\n if (observerRef.current) {\n each2(\n observerRef.current.deps,\n (dep) => removeFluidObserver(dep, observerRef.current)\n );\n raf.cancel(observerRef.current.update);\n }\n };\n });\n useEffect(callback, []);\n useOnce(() => () => {\n const observer2 = observerRef.current;\n each2(observer2.deps, (dep) => removeFluidObserver(dep, observer2));\n });\n const usedProps = host.getComponentProps(props.getValue());\n return /* @__PURE__ */ React.createElement(Component, { ...usedProps, ref });\n });\n};\nvar PropsObserver = class {\n constructor(update, deps) {\n this.update = update;\n this.deps = deps;\n }\n eventObserved(event) {\n if (event.type == \"change\") {\n raf.write(this.update);\n }\n }\n};\nfunction getAnimatedState(props, host) {\n const dependencies = /* @__PURE__ */ new Set();\n TreeContext.dependencies = dependencies;\n if (props.style)\n props = {\n ...props,\n style: host.createAnimatedStyle(props.style)\n };\n props = new AnimatedObject(props);\n TreeContext.dependencies = null;\n return [props, dependencies];\n}\nfunction updateRef(ref, value) {\n if (ref) {\n if (is4.fun(ref)) ref(value);\n else ref.current = value;\n }\n return value;\n}\n\n// src/createHost.ts\nvar cacheKey = Symbol.for(\"AnimatedComponent\");\nvar createHost = (components, {\n applyAnimatedValues = () => false,\n createAnimatedStyle = (style) => new AnimatedObject(style),\n getComponentProps = (props) => props\n} = {}) => {\n const hostConfig = {\n applyAnimatedValues,\n createAnimatedStyle,\n getComponentProps\n };\n const animated = (Component) => {\n const displayName = getDisplayName(Component) || \"Anonymous\";\n if (is5.str(Component)) {\n Component = animated[Component] || (animated[Component] = withAnimated(Component, hostConfig));\n } else {\n Component = Component[cacheKey] || (Component[cacheKey] = withAnimated(Component, hostConfig));\n }\n Component.displayName = `Animated(${displayName})`;\n return Component;\n };\n eachProp2(components, (Component, key) => {\n if (is5.arr(components)) {\n key = getDisplayName(Component);\n }\n animated[key] = animated(Component);\n });\n return {\n animated\n };\n};\nvar getDisplayName = (arg) => is5.str(arg) ? arg : arg && is5.str(arg.displayName) ? arg.displayName : is5.fun(arg) && arg.name || null;\nexport {\n Animated,\n AnimatedArray,\n AnimatedObject,\n AnimatedString,\n AnimatedValue,\n createHost,\n getAnimated,\n getAnimatedType,\n getPayload,\n isAnimated,\n setAnimated\n};\n","// src/hooks/useChain.ts\nimport { each, useIsomorphicLayoutEffect } from \"@react-spring/shared\";\n\n// src/helpers.ts\nimport {\n is,\n toArray,\n eachProp,\n getFluidValue,\n isAnimatedString,\n Globals as G\n} from \"@react-spring/shared\";\nfunction callProp(value, ...args) {\n return is.fun(value) ? value(...args) : value;\n}\nvar matchProp = (value, key) => value === true || !!(key && value && (is.fun(value) ? value(key) : toArray(value).includes(key)));\nvar resolveProp = (prop, key) => is.obj(prop) ? key && prop[key] : prop;\nvar getDefaultProp = (props, key) => props.default === true ? props[key] : props.default ? props.default[key] : void 0;\nvar noopTransform = (value) => value;\nvar getDefaultProps = (props, transform = noopTransform) => {\n let keys = DEFAULT_PROPS;\n if (props.default && props.default !== true) {\n props = props.default;\n keys = Object.keys(props);\n }\n const defaults2 = {};\n for (const key of keys) {\n const value = transform(props[key], key);\n if (!is.und(value)) {\n defaults2[key] = value;\n }\n }\n return defaults2;\n};\nvar DEFAULT_PROPS = [\n \"config\",\n \"onProps\",\n \"onStart\",\n \"onChange\",\n \"onPause\",\n \"onResume\",\n \"onRest\"\n];\nvar RESERVED_PROPS = {\n config: 1,\n from: 1,\n to: 1,\n ref: 1,\n loop: 1,\n reset: 1,\n pause: 1,\n cancel: 1,\n reverse: 1,\n immediate: 1,\n default: 1,\n delay: 1,\n onProps: 1,\n onStart: 1,\n onChange: 1,\n onPause: 1,\n onResume: 1,\n onRest: 1,\n onResolve: 1,\n // Transition props\n items: 1,\n trail: 1,\n sort: 1,\n expires: 1,\n initial: 1,\n enter: 1,\n update: 1,\n leave: 1,\n children: 1,\n onDestroyed: 1,\n // Internal props\n keys: 1,\n callId: 1,\n parentId: 1\n};\nfunction getForwardProps(props) {\n const forward = {};\n let count = 0;\n eachProp(props, (value, prop) => {\n if (!RESERVED_PROPS[prop]) {\n forward[prop] = value;\n count++;\n }\n });\n if (count) {\n return forward;\n }\n}\nfunction inferTo(props) {\n const to2 = getForwardProps(props);\n if (to2) {\n const out = { to: to2 };\n eachProp(props, (val, key) => key in to2 || (out[key] = val));\n return out;\n }\n return { ...props };\n}\nfunction computeGoal(value) {\n value = getFluidValue(value);\n return is.arr(value) ? value.map(computeGoal) : isAnimatedString(value) ? G.createStringInterpolator({\n range: [0, 1],\n output: [value, value]\n })(1) : value;\n}\nfunction hasProps(props) {\n for (const _ in props) return true;\n return false;\n}\nfunction isAsyncTo(to2) {\n return is.fun(to2) || is.arr(to2) && is.obj(to2[0]);\n}\nfunction detachRefs(ctrl, ref) {\n ctrl.ref?.delete(ctrl);\n ref?.delete(ctrl);\n}\nfunction replaceRef(ctrl, ref) {\n if (ref && ctrl.ref !== ref) {\n ctrl.ref?.delete(ctrl);\n ref.add(ctrl);\n ctrl.ref = ref;\n }\n}\n\n// src/hooks/useChain.ts\nfunction useChain(refs, timeSteps, timeFrame = 1e3) {\n useIsomorphicLayoutEffect(() => {\n if (timeSteps) {\n let prevDelay = 0;\n each(refs, (ref, i) => {\n const controllers = ref.current;\n if (controllers.length) {\n let delay = timeFrame * timeSteps[i];\n if (isNaN(delay)) delay = prevDelay;\n else prevDelay = delay;\n each(controllers, (ctrl) => {\n each(ctrl.queue, (props) => {\n const memoizedDelayProp = props.delay;\n props.delay = (key) => delay + callProp(memoizedDelayProp || 0, key);\n });\n });\n ref.start();\n }\n });\n } else {\n let p = Promise.resolve();\n each(refs, (ref) => {\n const controllers = ref.current;\n if (controllers.length) {\n const queues = controllers.map((ctrl) => {\n const q = ctrl.queue;\n ctrl.queue = [];\n return q;\n });\n p = p.then(() => {\n each(\n controllers,\n (ctrl, i) => each(queues[i] || [], (update2) => ctrl.queue.push(update2))\n );\n return Promise.all(ref.start());\n });\n }\n });\n }\n });\n}\n\n// src/hooks/useSpring.ts\nimport { is as is9 } from \"@react-spring/shared\";\n\n// src/hooks/useSprings.ts\nimport { useContext as useContext2, useMemo as useMemo2, useRef } from \"react\";\nimport {\n is as is8,\n each as each5,\n usePrev,\n useOnce,\n useForceUpdate,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect2\n} from \"@react-spring/shared\";\n\n// src/SpringValue.ts\nimport {\n is as is5,\n raf as raf3,\n each as each2,\n isEqual,\n toArray as toArray2,\n eachProp as eachProp3,\n frameLoop as frameLoop2,\n flushCalls,\n getFluidValue as getFluidValue2,\n isAnimatedString as isAnimatedString2,\n Globals as G5,\n callFluidObservers as callFluidObservers2,\n hasFluidValue,\n addFluidObserver,\n removeFluidObserver,\n getFluidObservers\n} from \"@react-spring/shared\";\nimport {\n AnimatedValue,\n AnimatedString,\n getPayload,\n getAnimated as getAnimated2,\n setAnimated,\n getAnimatedType\n} from \"@react-spring/animated\";\n\n// src/AnimationConfig.ts\nimport { is as is2, easings } from \"@react-spring/shared\";\n\n// src/constants.ts\nvar config = {\n default: { tension: 170, friction: 26 },\n gentle: { tension: 120, friction: 14 },\n wobbly: { tension: 180, friction: 12 },\n stiff: { tension: 210, friction: 20 },\n slow: { tension: 280, friction: 60 },\n molasses: { tension: 280, friction: 120 }\n};\n\n// src/AnimationConfig.ts\nvar defaults = {\n ...config.default,\n mass: 1,\n damping: 1,\n easing: easings.linear,\n clamp: false\n};\nvar AnimationConfig = class {\n constructor() {\n /**\n * The initial velocity of one or more values.\n *\n * @default 0\n */\n this.velocity = 0;\n Object.assign(this, defaults);\n }\n};\nfunction mergeConfig(config2, newConfig, defaultConfig) {\n if (defaultConfig) {\n defaultConfig = { ...defaultConfig };\n sanitizeConfig(defaultConfig, newConfig);\n newConfig = { ...defaultConfig, ...newConfig };\n }\n sanitizeConfig(config2, newConfig);\n Object.assign(config2, newConfig);\n for (const key in defaults) {\n if (config2[key] == null) {\n config2[key] = defaults[key];\n }\n }\n let { frequency, damping } = config2;\n const { mass } = config2;\n if (!is2.und(frequency)) {\n if (frequency < 0.01) frequency = 0.01;\n if (damping < 0) damping = 0;\n config2.tension = Math.pow(2 * Math.PI / frequency, 2) * mass;\n config2.friction = 4 * Math.PI * damping * mass / frequency;\n }\n return config2;\n}\nfunction sanitizeConfig(config2, props) {\n if (!is2.und(props.decay)) {\n config2.duration = void 0;\n } else {\n const isTensionConfig = !is2.und(props.tension) || !is2.und(props.friction);\n if (isTensionConfig || !is2.und(props.frequency) || !is2.und(props.damping) || !is2.und(props.mass)) {\n config2.duration = void 0;\n config2.decay = void 0;\n }\n if (isTensionConfig) {\n config2.frequency = void 0;\n }\n }\n}\n\n// src/Animation.ts\nvar emptyArray = [];\nvar Animation = class {\n constructor() {\n this.changed = false;\n this.values = emptyArray;\n this.toValues = null;\n this.fromValues = emptyArray;\n this.config = new AnimationConfig();\n this.immediate = false;\n }\n};\n\n// src/scheduleProps.ts\nimport { is as is3, raf, Globals as G2 } from \"@react-spring/shared\";\nfunction scheduleProps(callId, { key, props, defaultProps, state, actions }) {\n return new Promise((resolve, reject) => {\n let delay;\n let timeout;\n let cancel = matchProp(props.cancel ?? defaultProps?.cancel, key);\n if (cancel) {\n onStart();\n } else {\n if (!is3.und(props.pause)) {\n state.paused = matchProp(props.pause, key);\n }\n let pause = defaultProps?.pause;\n if (pause !== true) {\n pause = state.paused || matchProp(pause, key);\n }\n delay = callProp(props.delay || 0, key);\n if (pause) {\n state.resumeQueue.add(onResume);\n actions.pause();\n } else {\n actions.resume();\n onResume();\n }\n }\n function onPause() {\n state.resumeQueue.add(onResume);\n state.timeouts.delete(timeout);\n timeout.cancel();\n delay = timeout.time - raf.now();\n }\n function onResume() {\n if (delay > 0 && !G2.skipAnimation) {\n state.delayed = true;\n timeout = raf.setTimeout(onStart, delay);\n state.pauseQueue.add(onPause);\n state.timeouts.add(timeout);\n } else {\n onStart();\n }\n }\n function onStart() {\n if (state.delayed) {\n state.delayed = false;\n }\n state.pauseQueue.delete(onPause);\n state.timeouts.delete(timeout);\n if (callId <= (state.cancelId || 0)) {\n cancel = true;\n }\n try {\n actions.start({ ...props, callId, cancel }, resolve);\n } catch (err) {\n reject(err);\n }\n }\n });\n}\n\n// src/runAsync.ts\nimport {\n is as is4,\n raf as raf2,\n flush,\n eachProp as eachProp2,\n Globals as G3\n} from \"@react-spring/shared\";\n\n// src/AnimationResult.ts\nvar getCombinedResult = (target, results) => results.length == 1 ? results[0] : results.some((result) => result.cancelled) ? getCancelledResult(target.get()) : results.every((result) => result.noop) ? getNoopResult(target.get()) : getFinishedResult(\n target.get(),\n results.every((result) => result.finished)\n);\nvar getNoopResult = (value) => ({\n value,\n noop: true,\n finished: true,\n cancelled: false\n});\nvar getFinishedResult = (value, finished, cancelled = false) => ({\n value,\n finished,\n cancelled\n});\nvar getCancelledResult = (value) => ({\n value,\n cancelled: true,\n finished: false\n});\n\n// src/runAsync.ts\nfunction runAsync(to2, props, state, target) {\n const { callId, parentId, onRest } = props;\n const { asyncTo: prevTo, promise: prevPromise } = state;\n if (!parentId && to2 === prevTo && !props.reset) {\n return prevPromise;\n }\n return state.promise = (async () => {\n state.asyncId = callId;\n state.asyncTo = to2;\n const defaultProps = getDefaultProps(\n props,\n (value, key) => (\n // The `onRest` prop is only called when the `runAsync` promise is resolved.\n key === \"onRest\" ? void 0 : value\n )\n );\n let preventBail;\n let bail;\n const bailPromise = new Promise(\n (resolve, reject) => (preventBail = resolve, bail = reject)\n );\n const bailIfEnded = (bailSignal) => {\n const bailResult = (\n // The `cancel` prop or `stop` method was used.\n callId <= (state.cancelId || 0) && getCancelledResult(target) || // The async `to` prop was replaced.\n callId !== state.asyncId && getFinishedResult(target, false)\n );\n if (bailResult) {\n bailSignal.result = bailResult;\n bail(bailSignal);\n throw bailSignal;\n }\n };\n const animate = (arg1, arg2) => {\n const bailSignal = new BailSignal();\n const skipAnimationSignal = new SkipAnimationSignal();\n return (async () => {\n if (G3.skipAnimation) {\n stopAsync(state);\n skipAnimationSignal.result = getFinishedResult(target, false);\n bail(skipAnimationSignal);\n throw skipAnimationSignal;\n }\n bailIfEnded(bailSignal);\n const props2 = is4.obj(arg1) ? { ...arg1 } : { ...arg2, to: arg1 };\n props2.parentId = callId;\n eachProp2(defaultProps, (value, key) => {\n if (is4.und(props2[key])) {\n props2[key] = value;\n }\n });\n const result2 = await target.start(props2);\n bailIfEnded(bailSignal);\n if (state.paused) {\n await new Promise((resume) => {\n state.resumeQueue.add(resume);\n });\n }\n return result2;\n })();\n };\n let result;\n if (G3.skipAnimation) {\n stopAsync(state);\n return getFinishedResult(target, false);\n }\n try {\n let animating;\n if (is4.arr(to2)) {\n animating = (async (queue) => {\n for (const props2 of queue) {\n await animate(props2);\n }\n })(to2);\n } else {\n animating = Promise.resolve(to2(animate, target.stop.bind(target)));\n }\n await Promise.all([animating.then(preventBail), bailPromise]);\n result = getFinishedResult(target.get(), true, false);\n } catch (err) {\n if (err instanceof BailSignal) {\n result = err.result;\n } else if (err instanceof SkipAnimationSignal) {\n result = err.result;\n } else {\n throw err;\n }\n } finally {\n if (callId == state.asyncId) {\n state.asyncId = parentId;\n state.asyncTo = parentId ? prevTo : void 0;\n state.promise = parentId ? prevPromise : void 0;\n }\n }\n if (is4.fun(onRest)) {\n raf2.batchedUpdates(() => {\n onRest(result, target, target.item);\n });\n }\n return result;\n })();\n}\nfunction stopAsync(state, cancelId) {\n flush(state.timeouts, (t) => t.cancel());\n state.pauseQueue.clear();\n state.resumeQueue.clear();\n state.asyncId = state.asyncTo = state.promise = void 0;\n if (cancelId) state.cancelId = cancelId;\n}\nvar BailSignal = class extends Error {\n constructor() {\n super(\n \"An async animation has been interrupted. You see this error because you forgot to use `await` or `.catch(...)` on its returned promise.\"\n );\n }\n};\nvar SkipAnimationSignal = class extends Error {\n constructor() {\n super(\"SkipAnimationSignal\");\n }\n};\n\n// src/FrameValue.ts\nimport {\n deprecateInterpolate,\n frameLoop,\n FluidValue as FluidValue2,\n Globals as G4,\n callFluidObservers\n} from \"@react-spring/shared\";\nimport { getAnimated } from \"@react-spring/animated\";\nvar isFrameValue = (value) => value instanceof FrameValue;\nvar nextId = 1;\nvar FrameValue = class extends FluidValue2 {\n constructor() {\n super(...arguments);\n this.id = nextId++;\n this._priority = 0;\n }\n get priority() {\n return this._priority;\n }\n set priority(priority) {\n if (this._priority != priority) {\n this._priority = priority;\n this._onPriorityChange(priority);\n }\n }\n /** Get the current value */\n get() {\n const node = getAnimated(this);\n return node && node.getValue();\n }\n /** Create a spring that maps our value to another value */\n to(...args) {\n return G4.to(this, args);\n }\n /** @deprecated Use the `to` method instead. */\n interpolate(...args) {\n deprecateInterpolate();\n return G4.to(this, args);\n }\n toJSON() {\n return this.get();\n }\n observerAdded(count) {\n if (count == 1) this._attach();\n }\n observerRemoved(count) {\n if (count == 0) this._detach();\n }\n /** Called when the first child is added. */\n _attach() {\n }\n /** Called when the last child is removed. */\n _detach() {\n }\n /** Tell our children about our new value */\n _onChange(value, idle = false) {\n callFluidObservers(this, {\n type: \"change\",\n parent: this,\n value,\n idle\n });\n }\n /** Tell our children about our new priority */\n _onPriorityChange(priority) {\n if (!this.idle) {\n frameLoop.sort(this);\n }\n callFluidObservers(this, {\n type: \"priority\",\n parent: this,\n priority\n });\n }\n};\n\n// src/SpringPhase.ts\nvar $P = Symbol.for(\"SpringPhase\");\nvar HAS_ANIMATED = 1;\nvar IS_ANIMATING = 2;\nvar IS_PAUSED = 4;\nvar hasAnimated = (target) => (target[$P] & HAS_ANIMATED) > 0;\nvar isAnimating = (target) => (target[$P] & IS_ANIMATING) > 0;\nvar isPaused = (target) => (target[$P] & IS_PAUSED) > 0;\nvar setActiveBit = (target, active) => active ? target[$P] |= IS_ANIMATING | HAS_ANIMATED : target[$P] &= ~IS_ANIMATING;\nvar setPausedBit = (target, paused) => paused ? target[$P] |= IS_PAUSED : target[$P] &= ~IS_PAUSED;\n\n// src/SpringValue.ts\nvar SpringValue = class extends FrameValue {\n constructor(arg1, arg2) {\n super();\n /** The animation state */\n this.animation = new Animation();\n /** Some props have customizable default values */\n this.defaultProps = {};\n /** The state for `runAsync` calls */\n this._state = {\n paused: false,\n delayed: false,\n pauseQueue: /* @__PURE__ */ new Set(),\n resumeQueue: /* @__PURE__ */ new Set(),\n timeouts: /* @__PURE__ */ new Set()\n };\n /** The promise resolvers of pending `start` calls */\n this._pendingCalls = /* @__PURE__ */ new Set();\n /** The counter for tracking `scheduleProps` calls */\n this._lastCallId = 0;\n /** The last `scheduleProps` call that changed the `to` prop */\n this._lastToId = 0;\n this._memoizedDuration = 0;\n if (!is5.und(arg1) || !is5.und(arg2)) {\n const props = is5.obj(arg1) ? { ...arg1 } : { ...arg2, from: arg1 };\n if (is5.und(props.default)) {\n props.default = true;\n }\n this.start(props);\n }\n }\n /** Equals true when not advancing on each frame. */\n get idle() {\n return !(isAnimating(this) || this._state.asyncTo) || isPaused(this);\n }\n get goal() {\n return getFluidValue2(this.animation.to);\n }\n get velocity() {\n const node = getAnimated2(this);\n return node instanceof AnimatedValue ? node.lastVelocity || 0 : node.getPayload().map((node2) => node2.lastVelocity || 0);\n }\n /**\n * When true, this value has been animated at least once.\n */\n get hasAnimated() {\n return hasAnimated(this);\n }\n /**\n * When true, this value has an unfinished animation,\n * which is either active or paused.\n */\n get isAnimating() {\n return isAnimating(this);\n }\n /**\n * When true, all current and future animations are paused.\n */\n get isPaused() {\n return isPaused(this);\n }\n /**\n *\n *\n */\n get isDelayed() {\n return this._state.delayed;\n }\n /** Advance the current animation by a number of milliseconds */\n advance(dt) {\n let idle = true;\n let changed = false;\n const anim = this.animation;\n let { toValues } = anim;\n const { config: config2 } = anim;\n const payload = getPayload(anim.to);\n if (!payload && hasFluidValue(anim.to)) {\n toValues = toArray2(getFluidValue2(anim.to));\n }\n anim.values.forEach((node2, i) => {\n if (node2.done) return;\n const to2 = (\n // Animated strings always go from 0 to 1.\n node2.constructor == AnimatedString ? 1 : payload ? payload[i].lastPosition : toValues[i]\n );\n let finished = anim.immediate;\n let position = to2;\n if (!finished) {\n position = node2.lastPosition;\n if (config2.tension <= 0) {\n node2.done = true;\n return;\n }\n let elapsed = node2.elapsedTime += dt;\n const from = anim.fromValues[i];\n const v0 = node2.v0 != null ? node2.v0 : node2.v0 = is5.arr(config2.velocity) ? config2.velocity[i] : config2.velocity;\n let velocity;\n const precision = config2.precision || (from == to2 ? 5e-3 : Math.min(1, Math.abs(to2 - from) * 1e-3));\n if (!is5.und(config2.duration)) {\n let p = 1;\n if (config2.duration > 0) {\n if (this._memoizedDuration !== config2.duration) {\n this._memoizedDuration = config2.duration;\n if (node2.durationProgress > 0) {\n node2.elapsedTime = config2.duration * node2.durationProgress;\n elapsed = node2.elapsedTime += dt;\n }\n }\n p = (config2.progress || 0) + elapsed / this._memoizedDuration;\n p = p > 1 ? 1 : p < 0 ? 0 : p;\n node2.durationProgress = p;\n }\n position = from + config2.easing(p) * (to2 - from);\n velocity = (position - node2.lastPosition) / dt;\n finished = p == 1;\n } else if (config2.decay) {\n const decay = config2.decay === true ? 0.998 : config2.decay;\n const e = Math.exp(-(1 - decay) * elapsed);\n position = from + v0 / (1 - decay) * (1 - e);\n finished = Math.abs(node2.lastPosition - position) <= precision;\n velocity = v0 * e;\n } else {\n velocity = node2.lastVelocity == null ? v0 : node2.lastVelocity;\n const restVelocity = config2.restVelocity || precision / 10;\n const bounceFactor = config2.clamp ? 0 : config2.bounce;\n const canBounce = !is5.und(bounceFactor);\n const isGrowing = from == to2 ? node2.v0 > 0 : from < to2;\n let isMoving;\n let isBouncing = false;\n const step = 1;\n const numSteps = Math.ceil(dt / step);\n for (let n = 0; n < numSteps; ++n) {\n isMoving = Math.abs(velocity) > restVelocity;\n if (!isMoving) {\n finished = Math.abs(to2 - position) <= precision;\n if (finished) {\n break;\n }\n }\n if (canBounce) {\n isBouncing = position == to2 || position > to2 == isGrowing;\n if (isBouncing) {\n velocity = -velocity * bounceFactor;\n position = to2;\n }\n }\n const springForce = -config2.tension * 1e-6 * (position - to2);\n const dampingForce = -config2.friction * 1e-3 * velocity;\n const acceleration = (springForce + dampingForce) / config2.mass;\n velocity = velocity + acceleration * step;\n position = position + velocity * step;\n }\n }\n node2.lastVelocity = velocity;\n if (Number.isNaN(position)) {\n console.warn(`Got NaN while animating:`, this);\n finished = true;\n }\n }\n if (payload && !payload[i].done) {\n finished = false;\n }\n if (finished) {\n node2.done = true;\n } else {\n idle = false;\n }\n if (node2.setValue(position, config2.round)) {\n changed = true;\n }\n });\n const node = getAnimated2(this);\n const currVal = node.getValue();\n if (idle) {\n const finalVal = getFluidValue2(anim.to);\n if ((currVal !== finalVal || changed) && !config2.decay) {\n node.setValue(finalVal);\n this._onChange(finalVal);\n } else if (changed && config2.decay) {\n this._onChange(currVal);\n }\n this._stop();\n } else if (changed) {\n this._onChange(currVal);\n }\n }\n /** Set the current value, while stopping the current animation */\n set(value) {\n raf3.batchedUpdates(() => {\n this._stop();\n this._focus(value);\n this._set(value);\n });\n return this;\n }\n /**\n * Freeze the active animation in time, as well as any updates merged\n * before `resume` is called.\n */\n pause() {\n this._update({ pause: true });\n }\n /** Resume the animation if paused. */\n resume() {\n this._update({ pause: false });\n }\n /** Skip to the end of the current animation. */\n finish() {\n if (isAnimating(this)) {\n const { to: to2, config: config2 } = this.animation;\n raf3.batchedUpdates(() => {\n this._onStart();\n if (!config2.decay) {\n this._set(to2, false);\n }\n this._stop();\n });\n }\n return this;\n }\n /** Push props into the pending queue. */\n update(props) {\n const queue = this.queue || (this.queue = []);\n queue.push(props);\n return this;\n }\n start(to2, arg2) {\n let queue;\n if (!is5.und(to2)) {\n queue = [is5.obj(to2) ? to2 : { ...arg2, to: to2 }];\n } else {\n queue = this.queue || [];\n this.queue = [];\n }\n return Promise.all(\n queue.map((props) => {\n const up = this._update(props);\n return up;\n })\n ).then((results) => getCombinedResult(this, results));\n }\n /**\n * Stop the current animation, and cancel any delayed updates.\n *\n * Pass `true` to call `onRest` with `cancelled: true`.\n */\n stop(cancel) {\n const { to: to2 } = this.animation;\n this._focus(this.get());\n stopAsync(this._state, cancel && this._lastCallId);\n raf3.batchedUpdates(() => this._stop(to2, cancel));\n return this;\n }\n /** Restart the animation. */\n reset() {\n this._update({ reset: true });\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n this._start();\n } else if (event.type == \"priority\") {\n this.priority = event.priority + 1;\n }\n }\n /**\n * Parse the `to` and `from` range from the given `props` object.\n *\n * This also ensures the initial value is available to animated components\n * during the render phase.\n */\n _prepareNode(props) {\n const key = this.key || \"\";\n let { to: to2, from } = props;\n to2 = is5.obj(to2) ? to2[key] : to2;\n if (to2 == null || isAsyncTo(to2)) {\n to2 = void 0;\n }\n from = is5.obj(from) ? from[key] : from;\n if (from == null) {\n from = void 0;\n }\n const range = { to: to2, from };\n if (!hasAnimated(this)) {\n if (props.reverse) [to2, from] = [from, to2];\n from = getFluidValue2(from);\n if (!is5.und(from)) {\n this._set(from);\n } else if (!getAnimated2(this)) {\n this._set(to2);\n }\n }\n return range;\n }\n /** Every update is processed by this method before merging. */\n _update({ ...props }, isLoop) {\n const { key, defaultProps } = this;\n if (props.default)\n Object.assign(\n defaultProps,\n getDefaultProps(\n props,\n (value, prop) => /^on/.test(prop) ? resolveProp(value, key) : value\n )\n );\n mergeActiveFn(this, props, \"onProps\");\n sendEvent(this, \"onProps\", props, this);\n const range = this._prepareNode(props);\n if (Object.isFrozen(this)) {\n throw Error(\n \"Cannot animate a `SpringValue` object that is frozen. Did you forget to pass your component to `animated(...)` before animating its props?\"\n );\n }\n const state = this._state;\n return scheduleProps(++this._lastCallId, {\n key,\n props,\n defaultProps,\n state,\n actions: {\n pause: () => {\n if (!isPaused(this)) {\n setPausedBit(this, true);\n flushCalls(state.pauseQueue);\n sendEvent(\n this,\n \"onPause\",\n getFinishedResult(this, checkFinished(this, this.animation.to)),\n this\n );\n }\n },\n resume: () => {\n if (isPaused(this)) {\n setPausedBit(this, false);\n if (isAnimating(this)) {\n this._resume();\n }\n flushCalls(state.resumeQueue);\n sendEvent(\n this,\n \"onResume\",\n getFinishedResult(this, checkFinished(this, this.animation.to)),\n this\n );\n }\n },\n start: this._merge.bind(this, range)\n }\n }).then((result) => {\n if (props.loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props);\n if (nextProps) {\n return this._update(nextProps, true);\n }\n }\n return result;\n });\n }\n /** Merge props into the current animation */\n _merge(range, props, resolve) {\n if (props.cancel) {\n this.stop(true);\n return resolve(getCancelledResult(this));\n }\n const hasToProp = !is5.und(range.to);\n const hasFromProp = !is5.und(range.from);\n if (hasToProp || hasFromProp) {\n if (props.callId > this._lastToId) {\n this._lastToId = props.callId;\n } else {\n return resolve(getCancelledResult(this));\n }\n }\n const { key, defaultProps, animation: anim } = this;\n const { to: prevTo, from: prevFrom } = anim;\n let { to: to2 = prevTo, from = prevFrom } = range;\n if (hasFromProp && !hasToProp && (!props.default || is5.und(to2))) {\n to2 = from;\n }\n if (props.reverse) [to2, from] = [from, to2];\n const hasFromChanged = !isEqual(from, prevFrom);\n if (hasFromChanged) {\n anim.from = from;\n }\n from = getFluidValue2(from);\n const hasToChanged = !isEqual(to2, prevTo);\n if (hasToChanged) {\n this._focus(to2);\n }\n const hasAsyncTo = isAsyncTo(props.to);\n const { config: config2 } = anim;\n const { decay, velocity } = config2;\n if (hasToProp || hasFromProp) {\n config2.velocity = 0;\n }\n if (props.config && !hasAsyncTo) {\n mergeConfig(\n config2,\n callProp(props.config, key),\n // Avoid calling the same \"config\" prop twice.\n props.config !== defaultProps.config ? callProp(defaultProps.config, key) : void 0\n );\n }\n let node = getAnimated2(this);\n if (!node || is5.und(to2)) {\n return resolve(getFinishedResult(this, true));\n }\n const reset = (\n // When `reset` is undefined, the `from` prop implies `reset: true`,\n // except for declarative updates. When `reset` is defined, there\n // must exist a value to animate from.\n is5.und(props.reset) ? hasFromProp && !props.default : !is5.und(from) && matchProp(props.reset, key)\n );\n const value = reset ? from : this.get();\n const goal = computeGoal(to2);\n const isAnimatable = is5.num(goal) || is5.arr(goal) || isAnimatedString2(goal);\n const immediate = !hasAsyncTo && (!isAnimatable || matchProp(defaultProps.immediate || props.immediate, key));\n if (hasToChanged) {\n const nodeType = getAnimatedType(to2);\n if (nodeType !== node.constructor) {\n if (immediate) {\n node = this._set(goal);\n } else\n throw Error(\n `Cannot animate between ${node.constructor.name} and ${nodeType.name}, as the \"to\" prop suggests`\n );\n }\n }\n const goalType = node.constructor;\n let started = hasFluidValue(to2);\n let finished = false;\n if (!started) {\n const hasValueChanged = reset || !hasAnimated(this) && hasFromChanged;\n if (hasToChanged || hasValueChanged) {\n finished = isEqual(computeGoal(value), goal);\n started = !finished;\n }\n if (!isEqual(anim.immediate, immediate) && !immediate || !isEqual(config2.decay, decay) || !isEqual(config2.velocity, velocity)) {\n started = true;\n }\n }\n if (finished && isAnimating(this)) {\n if (anim.changed && !reset) {\n started = true;\n } else if (!started) {\n this._stop(prevTo);\n }\n }\n if (!hasAsyncTo) {\n if (started || hasFluidValue(prevTo)) {\n anim.values = node.getPayload();\n anim.toValues = hasFluidValue(to2) ? null : goalType == AnimatedString ? [1] : toArray2(goal);\n }\n if (anim.immediate != immediate) {\n anim.immediate = immediate;\n if (!immediate && !reset) {\n this._set(prevTo);\n }\n }\n if (started) {\n const { onRest } = anim;\n each2(ACTIVE_EVENTS, (type) => mergeActiveFn(this, props, type));\n const result = getFinishedResult(this, checkFinished(this, prevTo));\n flushCalls(this._pendingCalls, result);\n this._pendingCalls.add(resolve);\n if (anim.changed)\n raf3.batchedUpdates(() => {\n anim.changed = !reset;\n onRest?.(result, this);\n if (reset) {\n callProp(defaultProps.onRest, result);\n } else {\n anim.onStart?.(result, this);\n }\n });\n }\n }\n if (reset) {\n this._set(value);\n }\n if (hasAsyncTo) {\n resolve(runAsync(props.to, props, this._state, this));\n } else if (started) {\n this._start();\n } else if (isAnimating(this) && !hasToChanged) {\n this._pendingCalls.add(resolve);\n } else {\n resolve(getNoopResult(value));\n }\n }\n /** Update the `animation.to` value, which might be a `FluidValue` */\n _focus(value) {\n const anim = this.animation;\n if (value !== anim.to) {\n if (getFluidObservers(this)) {\n this._detach();\n }\n anim.to = value;\n if (getFluidObservers(this)) {\n this._attach();\n }\n }\n }\n _attach() {\n let priority = 0;\n const { to: to2 } = this.animation;\n if (hasFluidValue(to2)) {\n addFluidObserver(to2, this);\n if (isFrameValue(to2)) {\n priority = to2.priority + 1;\n }\n }\n this.priority = priority;\n }\n _detach() {\n const { to: to2 } = this.animation;\n if (hasFluidValue(to2)) {\n removeFluidObserver(to2, this);\n }\n }\n /**\n * Update the current value from outside the frameloop,\n * and return the `Animated` node.\n */\n _set(arg, idle = true) {\n const value = getFluidValue2(arg);\n if (!is5.und(value)) {\n const oldNode = getAnimated2(this);\n if (!oldNode || !isEqual(value, oldNode.getValue())) {\n const nodeType = getAnimatedType(value);\n if (!oldNode || oldNode.constructor != nodeType) {\n setAnimated(this, nodeType.create(value));\n } else {\n oldNode.setValue(value);\n }\n if (oldNode) {\n raf3.batchedUpdates(() => {\n this._onChange(value, idle);\n });\n }\n }\n }\n return getAnimated2(this);\n }\n _onStart() {\n const anim = this.animation;\n if (!anim.changed) {\n anim.changed = true;\n sendEvent(\n this,\n \"onStart\",\n getFinishedResult(this, checkFinished(this, anim.to)),\n this\n );\n }\n }\n _onChange(value, idle) {\n if (!idle) {\n this._onStart();\n callProp(this.animation.onChange, value, this);\n }\n callProp(this.defaultProps.onChange, value, this);\n super._onChange(value, idle);\n }\n // This method resets the animation state (even if already animating) to\n // ensure the latest from/to range is used, and it also ensures this spring\n // is added to the frameloop.\n _start() {\n const anim = this.animation;\n getAnimated2(this).reset(getFluidValue2(anim.to));\n if (!anim.immediate) {\n anim.fromValues = anim.values.map((node) => node.lastPosition);\n }\n if (!isAnimating(this)) {\n setActiveBit(this, true);\n if (!isPaused(this)) {\n this._resume();\n }\n }\n }\n _resume() {\n if (G5.skipAnimation) {\n this.finish();\n } else {\n frameLoop2.start(this);\n }\n }\n /**\n * Exit the frameloop and notify `onRest` listeners.\n *\n * Always wrap `_stop` calls with `batchedUpdates`.\n */\n _stop(goal, cancel) {\n if (isAnimating(this)) {\n setActiveBit(this, false);\n const anim = this.animation;\n each2(anim.values, (node) => {\n node.done = true;\n });\n if (anim.toValues) {\n anim.onChange = anim.onPause = anim.onResume = void 0;\n }\n callFluidObservers2(this, {\n type: \"idle\",\n parent: this\n });\n const result = cancel ? getCancelledResult(this.get()) : getFinishedResult(this.get(), checkFinished(this, goal ?? anim.to));\n flushCalls(this._pendingCalls, result);\n if (anim.changed) {\n anim.changed = false;\n sendEvent(this, \"onRest\", result, this);\n }\n }\n }\n};\nfunction checkFinished(target, to2) {\n const goal = computeGoal(to2);\n const value = computeGoal(target.get());\n return isEqual(value, goal);\n}\nfunction createLoopUpdate(props, loop = props.loop, to2 = props.to) {\n const loopRet = callProp(loop);\n if (loopRet) {\n const overrides = loopRet !== true && inferTo(loopRet);\n const reverse = (overrides || props).reverse;\n const reset = !overrides || overrides.reset;\n return createUpdate({\n ...props,\n loop,\n // Avoid updating default props when looping.\n default: false,\n // Never loop the `pause` prop.\n pause: void 0,\n // For the \"reverse\" prop to loop as expected, the \"to\" prop\n // must be undefined. The \"reverse\" prop is ignored when the\n // \"to\" prop is an array or function.\n to: !reverse || isAsyncTo(to2) ? to2 : void 0,\n // Ignore the \"from\" prop except on reset.\n from: reset ? props.from : void 0,\n reset,\n // The \"loop\" prop can return a \"useSpring\" props object to\n // override any of the original props.\n ...overrides\n });\n }\n}\nfunction createUpdate(props) {\n const { to: to2, from } = props = inferTo(props);\n const keys = /* @__PURE__ */ new Set();\n if (is5.obj(to2)) findDefined(to2, keys);\n if (is5.obj(from)) findDefined(from, keys);\n props.keys = keys.size ? Array.from(keys) : null;\n return props;\n}\nfunction declareUpdate(props) {\n const update2 = createUpdate(props);\n if (is5.und(update2.default)) {\n update2.default = getDefaultProps(update2);\n }\n return update2;\n}\nfunction findDefined(values, keys) {\n eachProp3(values, (value, key) => value != null && keys.add(key));\n}\nvar ACTIVE_EVENTS = [\n \"onStart\",\n \"onRest\",\n \"onChange\",\n \"onPause\",\n \"onResume\"\n];\nfunction mergeActiveFn(target, props, type) {\n target.animation[type] = props[type] !== getDefaultProp(props, type) ? resolveProp(props[type], target.key) : void 0;\n}\nfunction sendEvent(target, type, ...args) {\n target.animation[type]?.(...args);\n target.defaultProps[type]?.(...args);\n}\n\n// src/Controller.ts\nimport {\n is as is6,\n raf as raf4,\n each as each3,\n noop,\n flush as flush2,\n toArray as toArray3,\n eachProp as eachProp4,\n flushCalls as flushCalls2,\n addFluidObserver as addFluidObserver2\n} from \"@react-spring/shared\";\nvar BATCHED_EVENTS = [\"onStart\", \"onChange\", \"onRest\"];\nvar nextId2 = 1;\nvar Controller = class {\n constructor(props, flush3) {\n this.id = nextId2++;\n /** The animated values */\n this.springs = {};\n /** The queue of props passed to the `update` method. */\n this.queue = [];\n /** The counter for tracking `scheduleProps` calls */\n this._lastAsyncId = 0;\n /** The values currently being animated */\n this._active = /* @__PURE__ */ new Set();\n /** The values that changed recently */\n this._changed = /* @__PURE__ */ new Set();\n /** Equals false when `onStart` listeners can be called */\n this._started = false;\n /** State used by the `runAsync` function */\n this._state = {\n paused: false,\n pauseQueue: /* @__PURE__ */ new Set(),\n resumeQueue: /* @__PURE__ */ new Set(),\n timeouts: /* @__PURE__ */ new Set()\n };\n /** The event queues that are flushed once per frame maximum */\n this._events = {\n onStart: /* @__PURE__ */ new Map(),\n onChange: /* @__PURE__ */ new Map(),\n onRest: /* @__PURE__ */ new Map()\n };\n this._onFrame = this._onFrame.bind(this);\n if (flush3) {\n this._flush = flush3;\n }\n if (props) {\n this.start({ default: true, ...props });\n }\n }\n /**\n * Equals `true` when no spring values are in the frameloop, and\n * no async animation is currently active.\n */\n get idle() {\n return !this._state.asyncTo && Object.values(this.springs).every((spring) => {\n return spring.idle && !spring.isDelayed && !spring.isPaused;\n });\n }\n get item() {\n return this._item;\n }\n set item(item) {\n this._item = item;\n }\n /** Get the current values of our springs */\n get() {\n const values = {};\n this.each((spring, key) => values[key] = spring.get());\n return values;\n }\n /** Set the current values without animating. */\n set(values) {\n for (const key in values) {\n const value = values[key];\n if (!is6.und(value)) {\n this.springs[key].set(value);\n }\n }\n }\n /** Push an update onto the queue of each value. */\n update(props) {\n if (props) {\n this.queue.push(createUpdate(props));\n }\n return this;\n }\n /**\n * Start the queued animations for every spring, and resolve the returned\n * promise once all queued animations have finished or been cancelled.\n *\n * When you pass a queue (instead of nothing), that queue is used instead of\n * the queued animations added with the `update` method, which are left alone.\n */\n start(props) {\n let { queue } = this;\n if (props) {\n queue = toArray3(props).map(createUpdate);\n } else {\n this.queue = [];\n }\n if (this._flush) {\n return this._flush(this, queue);\n }\n prepareKeys(this, queue);\n return flushUpdateQueue(this, queue);\n }\n /** @internal */\n stop(arg, keys) {\n if (arg !== !!arg) {\n keys = arg;\n }\n if (keys) {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].stop(!!arg));\n } else {\n stopAsync(this._state, this._lastAsyncId);\n this.each((spring) => spring.stop(!!arg));\n }\n return this;\n }\n /** Freeze the active animation in time */\n pause(keys) {\n if (is6.und(keys)) {\n this.start({ pause: true });\n } else {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].pause());\n }\n return this;\n }\n /** Resume the animation if paused. */\n resume(keys) {\n if (is6.und(keys)) {\n this.start({ pause: false });\n } else {\n const springs = this.springs;\n each3(toArray3(keys), (key) => springs[key].resume());\n }\n return this;\n }\n /** Call a function once per spring value */\n each(iterator) {\n eachProp4(this.springs, iterator);\n }\n /** @internal Called at the end of every animation frame */\n _onFrame() {\n const { onStart, onChange, onRest } = this._events;\n const active = this._active.size > 0;\n const changed = this._changed.size > 0;\n if (active && !this._started || changed && !this._started) {\n this._started = true;\n flush2(onStart, ([onStart2, result]) => {\n result.value = this.get();\n onStart2(result, this, this._item);\n });\n }\n const idle = !active && this._started;\n const values = changed || idle && onRest.size ? this.get() : null;\n if (changed && onChange.size) {\n flush2(onChange, ([onChange2, result]) => {\n result.value = values;\n onChange2(result, this, this._item);\n });\n }\n if (idle) {\n this._started = false;\n flush2(onRest, ([onRest2, result]) => {\n result.value = values;\n onRest2(result, this, this._item);\n });\n }\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n this._changed.add(event.parent);\n if (!event.idle) {\n this._active.add(event.parent);\n }\n } else if (event.type == \"idle\") {\n this._active.delete(event.parent);\n } else return;\n raf4.onFrame(this._onFrame);\n }\n};\nfunction flushUpdateQueue(ctrl, queue) {\n return Promise.all(queue.map((props) => flushUpdate(ctrl, props))).then(\n (results) => getCombinedResult(ctrl, results)\n );\n}\nasync function flushUpdate(ctrl, props, isLoop) {\n const { keys, to: to2, from, loop, onRest, onResolve } = props;\n const defaults2 = is6.obj(props.default) && props.default;\n if (loop) {\n props.loop = false;\n }\n if (to2 === false) props.to = null;\n if (from === false) props.from = null;\n const asyncTo = is6.arr(to2) || is6.fun(to2) ? to2 : void 0;\n if (asyncTo) {\n props.to = void 0;\n props.onRest = void 0;\n if (defaults2) {\n defaults2.onRest = void 0;\n }\n } else {\n each3(BATCHED_EVENTS, (key) => {\n const handler = props[key];\n if (is6.fun(handler)) {\n const queue = ctrl[\"_events\"][key];\n props[key] = ({ finished, cancelled }) => {\n const result2 = queue.get(handler);\n if (result2) {\n if (!finished) result2.finished = false;\n if (cancelled) result2.cancelled = true;\n } else {\n queue.set(handler, {\n value: null,\n finished: finished || false,\n cancelled: cancelled || false\n });\n }\n };\n if (defaults2) {\n defaults2[key] = props[key];\n }\n }\n });\n }\n const state = ctrl[\"_state\"];\n if (props.pause === !state.paused) {\n state.paused = props.pause;\n flushCalls2(props.pause ? state.pauseQueue : state.resumeQueue);\n } else if (state.paused) {\n props.pause = true;\n }\n const promises = (keys || Object.keys(ctrl.springs)).map(\n (key) => ctrl.springs[key].start(props)\n );\n const cancel = props.cancel === true || getDefaultProp(props, \"cancel\") === true;\n if (asyncTo || cancel && state.asyncId) {\n promises.push(\n scheduleProps(++ctrl[\"_lastAsyncId\"], {\n props,\n state,\n actions: {\n pause: noop,\n resume: noop,\n start(props2, resolve) {\n if (cancel) {\n stopAsync(state, ctrl[\"_lastAsyncId\"]);\n resolve(getCancelledResult(ctrl));\n } else {\n props2.onRest = onRest;\n resolve(\n runAsync(\n asyncTo,\n props2,\n state,\n ctrl\n )\n );\n }\n }\n }\n })\n );\n }\n if (state.paused) {\n await new Promise((resume) => {\n state.resumeQueue.add(resume);\n });\n }\n const result = getCombinedResult(ctrl, await Promise.all(promises));\n if (loop && result.finished && !(isLoop && result.noop)) {\n const nextProps = createLoopUpdate(props, loop, to2);\n if (nextProps) {\n prepareKeys(ctrl, [nextProps]);\n return flushUpdate(ctrl, nextProps, true);\n }\n }\n if (onResolve) {\n raf4.batchedUpdates(() => onResolve(result, ctrl, ctrl.item));\n }\n return result;\n}\nfunction getSprings(ctrl, props) {\n const springs = { ...ctrl.springs };\n if (props) {\n each3(toArray3(props), (props2) => {\n if (is6.und(props2.keys)) {\n props2 = createUpdate(props2);\n }\n if (!is6.obj(props2.to)) {\n props2 = { ...props2, to: void 0 };\n }\n prepareSprings(springs, props2, (key) => {\n return createSpring(key);\n });\n });\n }\n setSprings(ctrl, springs);\n return springs;\n}\nfunction setSprings(ctrl, springs) {\n eachProp4(springs, (spring, key) => {\n if (!ctrl.springs[key]) {\n ctrl.springs[key] = spring;\n addFluidObserver2(spring, ctrl);\n }\n });\n}\nfunction createSpring(key, observer) {\n const spring = new SpringValue();\n spring.key = key;\n if (observer) {\n addFluidObserver2(spring, observer);\n }\n return spring;\n}\nfunction prepareSprings(springs, props, create) {\n if (props.keys) {\n each3(props.keys, (key) => {\n const spring = springs[key] || (springs[key] = create(key));\n spring[\"_prepareNode\"](props);\n });\n }\n}\nfunction prepareKeys(ctrl, queue) {\n each3(queue, (props) => {\n prepareSprings(ctrl.springs, props, (key) => {\n return createSpring(key, ctrl);\n });\n });\n}\n\n// src/SpringContext.tsx\nimport * as React from \"react\";\nimport { useContext } from \"react\";\nvar SpringContext = React.createContext({\n pause: false,\n immediate: false\n});\n\n// src/SpringRef.ts\nimport { each as each4, is as is7, deprecateDirectCall } from \"@react-spring/shared\";\nvar SpringRef = () => {\n const current = [];\n const SpringRef2 = function(props) {\n deprecateDirectCall();\n const results = [];\n each4(current, (ctrl, i) => {\n if (is7.und(props)) {\n results.push(ctrl.start());\n } else {\n const update2 = _getProps(props, ctrl, i);\n if (update2) {\n results.push(ctrl.start(update2));\n }\n }\n });\n return results;\n };\n SpringRef2.current = current;\n SpringRef2.add = function(ctrl) {\n if (!current.includes(ctrl)) {\n current.push(ctrl);\n }\n };\n SpringRef2.delete = function(ctrl) {\n const i = current.indexOf(ctrl);\n if (~i) current.splice(i, 1);\n };\n SpringRef2.pause = function() {\n each4(current, (ctrl) => ctrl.pause(...arguments));\n return this;\n };\n SpringRef2.resume = function() {\n each4(current, (ctrl) => ctrl.resume(...arguments));\n return this;\n };\n SpringRef2.set = function(values) {\n each4(current, (ctrl, i) => {\n const update2 = is7.fun(values) ? values(i, ctrl) : values;\n if (update2) {\n ctrl.set(update2);\n }\n });\n };\n SpringRef2.start = function(props) {\n const results = [];\n each4(current, (ctrl, i) => {\n if (is7.und(props)) {\n results.push(ctrl.start());\n } else {\n const update2 = this._getProps(props, ctrl, i);\n if (update2) {\n results.push(ctrl.start(update2));\n }\n }\n });\n return results;\n };\n SpringRef2.stop = function() {\n each4(current, (ctrl) => ctrl.stop(...arguments));\n return this;\n };\n SpringRef2.update = function(props) {\n each4(current, (ctrl, i) => ctrl.update(this._getProps(props, ctrl, i)));\n return this;\n };\n const _getProps = function(arg, ctrl, index) {\n return is7.fun(arg) ? arg(index, ctrl) : arg;\n };\n SpringRef2._getProps = _getProps;\n return SpringRef2;\n};\n\n// src/hooks/useSprings.ts\nfunction useSprings(length, props, deps) {\n const propsFn = is8.fun(props) && props;\n if (propsFn && !deps) deps = [];\n const ref = useMemo2(\n () => propsFn || arguments.length == 3 ? SpringRef() : void 0,\n []\n );\n const layoutId = useRef(0);\n const forceUpdate = useForceUpdate();\n const state = useMemo2(\n () => ({\n ctrls: [],\n queue: [],\n flush(ctrl, updates2) {\n const springs2 = getSprings(ctrl, updates2);\n const canFlushSync = layoutId.current > 0 && !state.queue.length && !Object.keys(springs2).some((key) => !ctrl.springs[key]);\n return canFlushSync ? flushUpdateQueue(ctrl, updates2) : new Promise((resolve) => {\n setSprings(ctrl, springs2);\n state.queue.push(() => {\n resolve(flushUpdateQueue(ctrl, updates2));\n });\n forceUpdate();\n });\n }\n }),\n []\n );\n const ctrls = useRef([...state.ctrls]);\n const updates = useRef([]);\n const prevLength = usePrev(length) || 0;\n useMemo2(() => {\n each5(ctrls.current.slice(length, prevLength), (ctrl) => {\n detachRefs(ctrl, ref);\n ctrl.stop(true);\n });\n ctrls.current.length = length;\n declareUpdates(prevLength, length);\n }, [length]);\n useMemo2(() => {\n declareUpdates(0, Math.min(prevLength, length));\n }, deps);\n function declareUpdates(startIndex, endIndex) {\n for (let i = startIndex; i < endIndex; i++) {\n const ctrl = ctrls.current[i] || (ctrls.current[i] = new Controller(null, state.flush));\n const update2 = propsFn ? propsFn(i, ctrl) : props[i];\n if (update2) {\n updates.current[i] = declareUpdate(update2);\n }\n }\n }\n const springs = ctrls.current.map(\n (ctrl, i) => getSprings(ctrl, updates.current[i])\n );\n const context = useContext2(SpringContext);\n const prevContext = usePrev(context);\n const hasContext = context !== prevContext && hasProps(context);\n useIsomorphicLayoutEffect2(() => {\n layoutId.current++;\n state.ctrls = ctrls.current;\n const { queue } = state;\n if (queue.length) {\n state.queue = [];\n each5(queue, (cb) => cb());\n }\n each5(ctrls.current, (ctrl, i) => {\n ref?.add(ctrl);\n if (hasContext) {\n ctrl.start({ default: context });\n }\n const update2 = updates.current[i];\n if (update2) {\n replaceRef(ctrl, update2.ref);\n if (ctrl.ref) {\n ctrl.queue.push(update2);\n } else {\n ctrl.start(update2);\n }\n }\n });\n });\n useOnce(() => () => {\n each5(state.ctrls, (ctrl) => ctrl.stop(true));\n });\n const values = springs.map((x) => ({ ...x }));\n return ref ? [values, ref] : values;\n}\n\n// src/hooks/useSpring.ts\nfunction useSpring(props, deps) {\n const isFn = is9.fun(props);\n const [[values], ref] = useSprings(\n 1,\n isFn ? props : [props],\n isFn ? deps || [] : deps\n );\n return isFn || arguments.length == 2 ? [values, ref] : values;\n}\n\n// src/hooks/useSpringRef.ts\nimport { useState } from \"react\";\nvar initSpringRef = () => SpringRef();\nvar useSpringRef = () => useState(initSpringRef)[0];\n\n// src/hooks/useSpringValue.ts\nimport { useConstant, useOnce as useOnce2 } from \"@react-spring/shared\";\nvar useSpringValue = (initial, props) => {\n const springValue = useConstant(() => new SpringValue(initial, props));\n useOnce2(() => () => {\n springValue.stop();\n });\n return springValue;\n};\n\n// src/hooks/useTrail.ts\nimport { each as each6, is as is10, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect3 } from \"@react-spring/shared\";\nfunction useTrail(length, propsArg, deps) {\n const propsFn = is10.fun(propsArg) && propsArg;\n if (propsFn && !deps) deps = [];\n let reverse = true;\n let passedRef = void 0;\n const result = useSprings(\n length,\n (i, ctrl) => {\n const props = propsFn ? propsFn(i, ctrl) : propsArg;\n passedRef = props.ref;\n reverse = reverse && props.reverse;\n return props;\n },\n // Ensure the props function is called when no deps exist.\n // This works around the 3 argument rule.\n deps || [{}]\n );\n useIsomorphicLayoutEffect3(() => {\n each6(result[1].current, (ctrl, i) => {\n const parent = result[1].current[i + (reverse ? 1 : -1)];\n replaceRef(ctrl, passedRef);\n if (ctrl.ref) {\n if (parent) {\n ctrl.update({ to: parent.springs });\n }\n return;\n }\n if (parent) {\n ctrl.start({ to: parent.springs });\n } else {\n ctrl.start();\n }\n });\n }, deps);\n if (propsFn || arguments.length == 3) {\n const ref = passedRef ?? result[1];\n ref[\"_getProps\"] = (propsArg2, ctrl, i) => {\n const props = is10.fun(propsArg2) ? propsArg2(i, ctrl) : propsArg2;\n if (props) {\n const parent = ref.current[i + (props.reverse ? 1 : -1)];\n if (parent) props.to = parent.springs;\n return props;\n }\n };\n return result;\n }\n return result[0];\n}\n\n// src/hooks/useTransition.tsx\nimport * as React2 from \"react\";\nimport { useContext as useContext3, useRef as useRef2, useMemo as useMemo3 } from \"react\";\nimport {\n is as is11,\n toArray as toArray4,\n useForceUpdate as useForceUpdate2,\n useOnce as useOnce3,\n usePrev as usePrev2,\n each as each7,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect4\n} from \"@react-spring/shared\";\nfunction useTransition(data, props, deps) {\n const propsFn = is11.fun(props) && props;\n const {\n reset,\n sort,\n trail = 0,\n expires = true,\n exitBeforeEnter = false,\n onDestroyed,\n ref: propsRef,\n config: propsConfig\n } = propsFn ? propsFn() : props;\n const ref = useMemo3(\n () => propsFn || arguments.length == 3 ? SpringRef() : void 0,\n []\n );\n const items = toArray4(data);\n const transitions = [];\n const usedTransitions = useRef2(null);\n const prevTransitions = reset ? null : usedTransitions.current;\n useIsomorphicLayoutEffect4(() => {\n usedTransitions.current = transitions;\n });\n useOnce3(() => {\n each7(transitions, (t) => {\n ref?.add(t.ctrl);\n t.ctrl.ref = ref;\n });\n return () => {\n each7(usedTransitions.current, (t) => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n }\n detachRefs(t.ctrl, ref);\n t.ctrl.stop(true);\n });\n };\n });\n const keys = getKeys(items, propsFn ? propsFn() : props, prevTransitions);\n const expired = reset && usedTransitions.current || [];\n useIsomorphicLayoutEffect4(\n () => each7(expired, ({ ctrl, item, key }) => {\n detachRefs(ctrl, ref);\n callProp(onDestroyed, item, key);\n })\n );\n const reused = [];\n if (prevTransitions)\n each7(prevTransitions, (t, i) => {\n if (t.expired) {\n clearTimeout(t.expirationId);\n expired.push(t);\n } else {\n i = reused[i] = keys.indexOf(t.key);\n if (~i) transitions[i] = t;\n }\n });\n each7(items, (item, i) => {\n if (!transitions[i]) {\n transitions[i] = {\n key: keys[i],\n item,\n phase: \"mount\" /* MOUNT */,\n ctrl: new Controller()\n };\n transitions[i].ctrl.item = item;\n }\n });\n if (reused.length) {\n let i = -1;\n const { leave } = propsFn ? propsFn() : props;\n each7(reused, (keyIndex, prevIndex) => {\n const t = prevTransitions[prevIndex];\n if (~keyIndex) {\n i = transitions.indexOf(t);\n transitions[i] = { ...t, item: items[keyIndex] };\n } else if (leave) {\n transitions.splice(++i, 0, t);\n }\n });\n }\n if (is11.fun(sort)) {\n transitions.sort((a, b) => sort(a.item, b.item));\n }\n let delay = -trail;\n const forceUpdate = useForceUpdate2();\n const defaultProps = getDefaultProps(props);\n const changes = /* @__PURE__ */ new Map();\n const exitingTransitions = useRef2(/* @__PURE__ */ new Map());\n const forceChange = useRef2(false);\n each7(transitions, (t, i) => {\n const key = t.key;\n const prevPhase = t.phase;\n const p = propsFn ? propsFn() : props;\n let to2;\n let phase;\n const propsDelay = callProp(p.delay || 0, key);\n if (prevPhase == \"mount\" /* MOUNT */) {\n to2 = p.enter;\n phase = \"enter\" /* ENTER */;\n } else {\n const isLeave = keys.indexOf(key) < 0;\n if (prevPhase != \"leave\" /* LEAVE */) {\n if (isLeave) {\n to2 = p.leave;\n phase = \"leave\" /* LEAVE */;\n } else if (to2 = p.update) {\n phase = \"update\" /* UPDATE */;\n } else return;\n } else if (!isLeave) {\n to2 = p.enter;\n phase = \"enter\" /* ENTER */;\n } else return;\n }\n to2 = callProp(to2, t.item, i);\n to2 = is11.obj(to2) ? inferTo(to2) : { to: to2 };\n if (!to2.config) {\n const config2 = propsConfig || defaultProps.config;\n to2.config = callProp(config2, t.item, i, phase);\n }\n delay += trail;\n const payload = {\n ...defaultProps,\n // we need to add our props.delay value you here.\n delay: propsDelay + delay,\n ref: propsRef,\n immediate: p.immediate,\n // This prevents implied resets.\n reset: false,\n // Merge any phase-specific props.\n ...to2\n };\n if (phase == \"enter\" /* ENTER */ && is11.und(payload.from)) {\n const p2 = propsFn ? propsFn() : props;\n const from = is11.und(p2.initial) || prevTransitions ? p2.from : p2.initial;\n payload.from = callProp(from, t.item, i);\n }\n const { onResolve } = payload;\n payload.onResolve = (result) => {\n callProp(onResolve, result);\n const transitions2 = usedTransitions.current;\n const t2 = transitions2.find((t3) => t3.key === key);\n if (!t2) return;\n if (result.cancelled && t2.phase != \"update\" /* UPDATE */) {\n return;\n }\n if (t2.ctrl.idle) {\n const idle = transitions2.every((t3) => t3.ctrl.idle);\n if (t2.phase == \"leave\" /* LEAVE */) {\n const expiry = callProp(expires, t2.item);\n if (expiry !== false) {\n const expiryMs = expiry === true ? 0 : expiry;\n t2.expired = true;\n if (!idle && expiryMs > 0) {\n if (expiryMs <= 2147483647)\n t2.expirationId = setTimeout(forceUpdate, expiryMs);\n return;\n }\n }\n }\n if (idle && transitions2.some((t3) => t3.expired)) {\n exitingTransitions.current.delete(t2);\n if (exitBeforeEnter) {\n forceChange.current = true;\n }\n forceUpdate();\n }\n }\n };\n const springs = getSprings(t.ctrl, payload);\n if (phase === \"leave\" /* LEAVE */ && exitBeforeEnter) {\n exitingTransitions.current.set(t, { phase, springs, payload });\n } else {\n changes.set(t, { phase, springs, payload });\n }\n });\n const context = useContext3(SpringContext);\n const prevContext = usePrev2(context);\n const hasContext = context !== prevContext && hasProps(context);\n useIsomorphicLayoutEffect4(() => {\n if (hasContext) {\n each7(transitions, (t) => {\n t.ctrl.start({ default: context });\n });\n }\n }, [context]);\n each7(changes, (_, t) => {\n if (exitingTransitions.current.size) {\n const ind = transitions.findIndex((state) => state.key === t.key);\n transitions.splice(ind, 1);\n }\n });\n useIsomorphicLayoutEffect4(\n () => {\n each7(\n exitingTransitions.current.size ? exitingTransitions.current : changes,\n ({ phase, payload }, t) => {\n const { ctrl } = t;\n t.phase = phase;\n ref?.add(ctrl);\n if (hasContext && phase == \"enter\" /* ENTER */) {\n ctrl.start({ default: context });\n }\n if (payload) {\n replaceRef(ctrl, payload.ref);\n if ((ctrl.ref || ref) && !forceChange.current) {\n ctrl.update(payload);\n } else {\n ctrl.start(payload);\n if (forceChange.current) {\n forceChange.current = false;\n }\n }\n }\n }\n );\n },\n reset ? void 0 : deps\n );\n const renderTransitions = (render) => /* @__PURE__ */ React2.createElement(React2.Fragment, null, transitions.map((t, i) => {\n const { springs } = changes.get(t) || t.ctrl;\n const elem = render({ ...springs }, t.item, t, i);\n const key = is11.str(t.key) || is11.num(t.key) ? t.key : t.ctrl.id;\n const isLegacyReact = React2.version < \"19.0.0\";\n const props2 = elem?.props ?? {};\n const elemRef = isLegacyReact ? elem?.ref : props2?.ref;\n return elem && elem.type ? /* @__PURE__ */ React2.createElement(elem.type, { ...props2, key, ref: elemRef }) : elem;\n }));\n return ref ? [renderTransitions, ref] : renderTransitions;\n}\nvar nextKey = 1;\nfunction getKeys(items, { key, keys = key }, prevTransitions) {\n if (keys === null) {\n const reused = /* @__PURE__ */ new Set();\n return items.map((item) => {\n const t = prevTransitions && prevTransitions.find(\n (t2) => t2.item === item && t2.phase !== \"leave\" /* LEAVE */ && !reused.has(t2)\n );\n if (t) {\n reused.add(t);\n return t.key;\n }\n return nextKey++;\n });\n }\n return is11.und(keys) ? items : is11.fun(keys) ? items.map(keys) : toArray4(keys);\n}\n\n// src/hooks/useScroll.ts\nimport { each as each8, onScroll, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect5 } from \"@react-spring/shared\";\nvar useScroll = ({\n container,\n ...springOptions\n} = {}) => {\n const [scrollValues, api] = useSpring(\n () => ({\n scrollX: 0,\n scrollY: 0,\n scrollXProgress: 0,\n scrollYProgress: 0,\n ...springOptions\n }),\n []\n );\n useIsomorphicLayoutEffect5(() => {\n const cleanupScroll = onScroll(\n ({ x, y }) => {\n api.start({\n scrollX: x.current,\n scrollXProgress: x.progress,\n scrollY: y.current,\n scrollYProgress: y.progress\n });\n },\n { container: container?.current || void 0 }\n );\n return () => {\n each8(Object.values(scrollValues), (value) => value.stop());\n cleanupScroll();\n };\n }, []);\n return scrollValues;\n};\n\n// src/hooks/useResize.ts\nimport { onResize, each as each9, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect6 } from \"@react-spring/shared\";\nvar useResize = ({\n container,\n ...springOptions\n}) => {\n const [sizeValues, api] = useSpring(\n () => ({\n width: 0,\n height: 0,\n ...springOptions\n }),\n []\n );\n useIsomorphicLayoutEffect6(() => {\n const cleanupScroll = onResize(\n ({ width, height }) => {\n api.start({\n width,\n height,\n immediate: sizeValues.width.get() === 0 || sizeValues.height.get() === 0 || springOptions.immediate === true\n });\n },\n { container: container?.current || void 0 }\n );\n return () => {\n each9(Object.values(sizeValues), (value) => value.stop());\n cleanupScroll();\n };\n }, []);\n return sizeValues;\n};\n\n// src/hooks/useInView.ts\nimport { useRef as useRef3, useState as useState2 } from \"react\";\nimport { is as is12, useIsomorphicLayoutEffect as useIsomorphicLayoutEffect7 } from \"@react-spring/shared\";\nvar defaultThresholdOptions = {\n any: 0,\n all: 1\n};\nfunction useInView(props, args) {\n const [isInView, setIsInView] = useState2(false);\n const ref = useRef3(void 0);\n const propsFn = is12.fun(props) && props;\n const springsProps = propsFn ? propsFn() : {};\n const { to: to2 = {}, from = {}, ...restSpringProps } = springsProps;\n const intersectionArguments = propsFn ? args : props;\n const [springs, api] = useSpring(() => ({ from, ...restSpringProps }), []);\n useIsomorphicLayoutEffect7(() => {\n const element = ref.current;\n const {\n root,\n once,\n amount = \"any\",\n ...restArgs\n } = intersectionArguments ?? {};\n if (!element || once && isInView || typeof IntersectionObserver === \"undefined\")\n return;\n const activeIntersections = /* @__PURE__ */ new WeakMap();\n const onEnter = () => {\n if (to2) {\n api.start(to2);\n }\n setIsInView(true);\n const cleanup = () => {\n if (from) {\n api.start(from);\n }\n setIsInView(false);\n };\n return once ? void 0 : cleanup;\n };\n const handleIntersection = (entries) => {\n entries.forEach((entry) => {\n const onLeave = activeIntersections.get(entry.target);\n if (entry.isIntersecting === Boolean(onLeave)) {\n return;\n }\n if (entry.isIntersecting) {\n const newOnLeave = onEnter();\n if (is12.fun(newOnLeave)) {\n activeIntersections.set(entry.target, newOnLeave);\n } else {\n observer.unobserve(entry.target);\n }\n } else if (onLeave) {\n onLeave();\n activeIntersections.delete(entry.target);\n }\n });\n };\n const observer = new IntersectionObserver(handleIntersection, {\n root: root && root.current || void 0,\n threshold: typeof amount === \"number\" || Array.isArray(amount) ? amount : defaultThresholdOptions[amount],\n ...restArgs\n });\n observer.observe(element);\n return () => observer.unobserve(element);\n }, [intersectionArguments]);\n if (propsFn) {\n return [ref, springs];\n }\n return [ref, isInView];\n}\n\n// src/components/Spring.tsx\nfunction Spring({ children, ...props }) {\n return children(useSpring(props));\n}\n\n// src/components/Trail.tsx\nimport { is as is13 } from \"@react-spring/shared\";\nfunction Trail({\n items,\n children,\n ...props\n}) {\n const trails = useTrail(items.length, props);\n return items.map((item, index) => {\n const result = children(item, index);\n return is13.fun(result) ? result(trails[index]) : result;\n });\n}\n\n// src/components/Transition.tsx\nfunction Transition({\n items,\n children,\n ...props\n}) {\n return useTransition(items, props)(children);\n}\n\n// src/interpolate.ts\nimport { deprecateInterpolate as deprecateInterpolate2 } from \"@react-spring/shared\";\n\n// src/Interpolation.ts\nimport {\n is as is14,\n raf as raf5,\n each as each10,\n isEqual as isEqual2,\n toArray as toArray5,\n frameLoop as frameLoop3,\n getFluidValue as getFluidValue3,\n createInterpolator,\n Globals as G6,\n callFluidObservers as callFluidObservers3,\n addFluidObserver as addFluidObserver3,\n removeFluidObserver as removeFluidObserver2,\n hasFluidValue as hasFluidValue2\n} from \"@react-spring/shared\";\nimport {\n getAnimated as getAnimated3,\n setAnimated as setAnimated2,\n getAnimatedType as getAnimatedType2,\n getPayload as getPayload2\n} from \"@react-spring/animated\";\nvar Interpolation = class extends FrameValue {\n constructor(source, args) {\n super();\n this.source = source;\n /** Equals false when in the frameloop */\n this.idle = true;\n /** The inputs which are currently animating */\n this._active = /* @__PURE__ */ new Set();\n this.calc = createInterpolator(...args);\n const value = this._get();\n const nodeType = getAnimatedType2(value);\n setAnimated2(this, nodeType.create(value));\n }\n advance(_dt) {\n const value = this._get();\n const oldValue = this.get();\n if (!isEqual2(value, oldValue)) {\n getAnimated3(this).setValue(value);\n this._onChange(value, this.idle);\n }\n if (!this.idle && checkIdle(this._active)) {\n becomeIdle(this);\n }\n }\n _get() {\n const inputs = is14.arr(this.source) ? this.source.map(getFluidValue3) : toArray5(getFluidValue3(this.source));\n return this.calc(...inputs);\n }\n _start() {\n if (this.idle && !checkIdle(this._active)) {\n this.idle = false;\n each10(getPayload2(this), (node) => {\n node.done = false;\n });\n if (G6.skipAnimation) {\n raf5.batchedUpdates(() => this.advance());\n becomeIdle(this);\n } else {\n frameLoop3.start(this);\n }\n }\n }\n // Observe our sources only when we're observed.\n _attach() {\n let priority = 1;\n each10(toArray5(this.source), (source) => {\n if (hasFluidValue2(source)) {\n addFluidObserver3(source, this);\n }\n if (isFrameValue(source)) {\n if (!source.idle) {\n this._active.add(source);\n }\n priority = Math.max(priority, source.priority + 1);\n }\n });\n this.priority = priority;\n this._start();\n }\n // Stop observing our sources once we have no observers.\n _detach() {\n each10(toArray5(this.source), (source) => {\n if (hasFluidValue2(source)) {\n removeFluidObserver2(source, this);\n }\n });\n this._active.clear();\n becomeIdle(this);\n }\n /** @internal */\n eventObserved(event) {\n if (event.type == \"change\") {\n if (event.idle) {\n this.advance();\n } else {\n this._active.add(event.parent);\n this._start();\n }\n } else if (event.type == \"idle\") {\n this._active.delete(event.parent);\n } else if (event.type == \"priority\") {\n this.priority = toArray5(this.source).reduce(\n (highest, parent) => Math.max(highest, (isFrameValue(parent) ? parent.priority : 0) + 1),\n 0\n );\n }\n }\n};\nfunction isIdle(source) {\n return source.idle !== false;\n}\nfunction checkIdle(active) {\n return !active.size || Array.from(active).every(isIdle);\n}\nfunction becomeIdle(self) {\n if (!self.idle) {\n self.idle = true;\n each10(getPayload2(self), (node) => {\n node.done = true;\n });\n callFluidObservers3(self, {\n type: \"idle\",\n parent: self\n });\n }\n}\n\n// src/interpolate.ts\nvar to = (source, ...args) => new Interpolation(source, args);\nvar interpolate = (source, ...args) => (deprecateInterpolate2(), new Interpolation(source, args));\n\n// src/globals.ts\nimport {\n Globals,\n frameLoop as frameLoop4,\n createStringInterpolator\n} from \"@react-spring/shared\";\nGlobals.assign({\n createStringInterpolator,\n to: (source, args) => new Interpolation(source, args)\n});\nvar update = frameLoop4.advance;\n\n// src/index.ts\nimport {\n createInterpolator as createInterpolator2,\n useIsomorphicLayoutEffect as useIsomorphicLayoutEffect8,\n useReducedMotion,\n easings as easings2\n} from \"@react-spring/shared\";\nexport * from \"@react-spring/types\";\nexport {\n BailSignal,\n Controller,\n FrameValue,\n Globals,\n Interpolation,\n Spring,\n SpringContext,\n SpringRef,\n SpringValue,\n Trail,\n Transition,\n config,\n createInterpolator2 as createInterpolator,\n easings2 as easings,\n inferTo,\n interpolate,\n to,\n update,\n useChain,\n useInView,\n useIsomorphicLayoutEffect8 as useIsomorphicLayoutEffect,\n useReducedMotion,\n useResize,\n useScroll,\n useSpring,\n useSpringRef,\n useSpringValue,\n useSprings,\n useTrail,\n useTransition\n};\n","// src/index.ts\nimport { applyProps, addEffect } from \"@react-three/fiber\";\nimport { Globals } from \"@react-spring/core\";\nimport { createStringInterpolator, colors, raf } from \"@react-spring/shared\";\nimport { createHost } from \"@react-spring/animated\";\n\n// src/primitives.ts\nimport * as THREE from \"three\";\nimport \"@react-three/fiber\";\nvar primitives = [\"primitive\"].concat(\n Object.keys(THREE).filter((key) => /^[A-Z]/.test(key)).map((key) => key[0].toLowerCase() + key.slice(1))\n);\n\n// src/index.ts\nexport * from \"@react-spring/core\";\nGlobals.assign({\n createStringInterpolator,\n colors,\n frameLoop: \"demand\"\n});\naddEffect(() => {\n raf.advance();\n});\nvar host = createHost(primitives, {\n applyAnimatedValues: applyProps\n});\nvar animated = host.animated;\nexport {\n animated as a,\n animated\n};\n","import {Box3, Box3Helper, Color, Mesh, type Object3D, Quaternion, type Scene, Vector3} from 'three';\nimport type {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport type {DividerType} from \"../../../types/divider.types.ts\";\n\nexport interface NeighborHit {\n source:ElemPartType |DividerType\n elemType: ElemPartType | DividerType;\n thk: number;\n treeId: string;\n}\n\nexport interface ScanResult {\n left: NeighborHit | null;\n right: NeighborHit | null;\n top: NeighborHit | null;\n bottom: NeighborHit | null;\n debugHelpers?: Object3D[];\n}\n\nconst OVERLAP = 0.004; // 40mm in normalized units\nconst DEBUG_ENABLED = false; // Set to false to disable debug visualization\n\n/**\n * Scan for neighbors using Box3 intersection.\n * Works for doors in ANY position (Front, Back, Left, Right).\n * Rotation-agnostic — operates in world space.\n */\nexport function scanNeighbors(panelMesh: Object3D, scene: Scene): ScanResult {\n const result: ScanResult = {left: null, right: null, top: null, bottom: null};\n const debugHelpers: Object3D[] = [];\n\n panelMesh.updateWorldMatrix(true, false);\n\n const panelBox = new Box3().setFromObject(panelMesh);\n const panelCenter = new Vector3();\n panelBox.getCenter(panelCenter);\n\n// Extract rotation from panel's world matrix\n const position = new Vector3();\n const quaternion = new Quaternion();\n const scale = new Vector3();\n panelMesh.matrixWorld.decompose(position, quaternion, scale);\n\n// Create rotation-only matrix and invert it\n panelBox.expandByScalar(OVERLAP);\n\n // Debug: Add helper for the expanded door bounding box (green)\n if (DEBUG_ENABLED) {\n const panelBoxHelper = new Box3Helper(panelBox, new Color(0x00ff00));\n panelBoxHelper.name = 'debug-door-box';\n scene.add(panelBoxHelper);\n debugHelpers.push(panelBoxHelper);\n }\n\n scene.traverse((obj) => {\n if (!(obj instanceof Mesh)) return;\n if (obj === panelMesh) return;\n if (!obj.userData?.elemType) return;\n\n const objBox = new Box3().setFromObject(obj);\n if (!panelBox.intersectsBox(objBox)) return;\n\n const objCenter = new Vector3();\n objBox.getCenter(objCenter);\n\n // World-space difference vector\n const worldDiff = objCenter.clone().sub(panelCenter);\n\n const hit: NeighborHit = {\n source:obj.userData.source,\n elemType: obj.userData.elemType,\n thk: obj.userData.thk || 0,\n treeId: obj.userData.treeId || '',\n };\n\n // Use world-space differences for classification\n // After scene rotation (-Math.PI/2 around X):\n // World X = left/right\n // World Y = top/bottom (negative Y = bottom, positive Y = top)\n // World Z = depth (front/back)\n const absX = Math.abs(worldDiff.x); // left/right\n const absY = Math.abs(worldDiff.y); // top/bottom\n\n // Side panels have significant X offset, shelves have significant Y offset\n if (absX > 0.05) {\n // Horizontal neighbor (left or right) - side panels\n if (worldDiff.x > 0) result.right = hit;\n else result.left = hit;\n } else if (absY > 0.05) {\n // Vertical neighbor (top or bottom) - shelves/dividers\n if (worldDiff.y > 0) result.top = hit;\n else result.bottom = hit;\n }\n });\n\n return result;\n}\n","import type {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\nexport function calculateHitOversize(joinedPartType:ElemPartType | DividerType, thk : number ): number{\n if (joinedPartType === DividerType.sidePanel){\n return thk\n }else if (joinedPartType === DividerType.botShelf || joinedPartType === DividerType.topShelf) return thk\n else if (joinedPartType === DividerType.adjShelf || joinedPartType === DividerType.fixShelf) return thk / 2\n return 0\n}","import {useEffect, useRef, useState} from 'react';\nimport {type Mesh} from 'three';\nimport {useThree} from '@react-three/fiber';\nimport {scanNeighbors, type ScanResult} from './ScanNeighbors';\nimport PD_3D from '../../elements_manager/PD_3D';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DoorResult} from \"../../../construction_principle/door/DoorHelper.ts\";\nimport {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {calculateHitOversize} from \"./calculateHitOversize.ts\";\n\ninterface DoorSensorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n doorCp?:DoorResult\n ddHingePosition?:'left' | 'right'\n}\n\nexport default function DoorSensor({panelWidth, panelHeight, panelThk, renderMat, treeId, doorCp, ddHingePosition}: DoorSensorProps) {\n const meshRef = useRef<Mesh>(null);\n const {scene} = useThree();\n const [oversize, setOversize] = useState({left: 0, right: 0, top: 0, bottom: 0});\n const hasScanned = useRef(false);\n if (!doorCp) return\n\n useEffect(() => {\n if (!meshRef.current || hasScanned.current || doorCp.construction === 'inset') return;\n\n const id = requestAnimationFrame(() => {\n if (!meshRef.current) return;\n\n const result: ScanResult = scanNeighbors(meshRef.current, scene);\n const topOversize = result.top ? calculateHitOversize(result.top?.elemType,result.top?.thk || 0) : 0\n const bottomOversize = result.bottom ? calculateHitOversize(result.bottom?.elemType,result.bottom?.thk || 0) : 0\n\n if (doorCp.doorCount === 'double'){\n if (ddHingePosition === 'left'){\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }else { // right hinges\n setOversize({\n left: 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }\n }else {\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: topOversize - 2,\n bottom: bottomOversize - 2,\n });\n }\n\n hasScanned.current = true;\n });\n\n return () => cancelAnimationFrame(id);\n }, [panelWidth, panelHeight]);\n\n let w = panelWidth + oversize.left + oversize.right;\n let h = panelHeight + oversize.top + oversize.bottom;\n\n // Compute position offset to keep drawer centered in zone\n const offsetX = -(oversize.bottom - oversize.top) / 2; // height axis offset\n const offsetY = (oversize.left - oversize.right) / 2; // width axis offset\n\n return (\n <>\n <group position={[offsetX / DIM_NORM, offsetY / DIM_NORM, 0]}>\n <PD_3D\n meshRef={meshRef}\n length={h / DIM_NORM}\n width={w / DIM_NORM}\n thk={panelThk / DIM_NORM}\n treeId={treeId}\n render_mat={renderMat}\n elemInfo={{source:\"elem\",elemType: ElemPartType.Door, thk: panelThk, treeId}}\n />\n </group>\n\n </>\n\n );\n}\n","import { createContext } from 'react';\n\nexport interface ArticleHoverContextValue {\n isHovered: boolean;\n setIsHovered: (value: boolean) => void;\n isOrbiting: boolean;\n}\n\nexport const ArticleHoverContext = createContext<ArticleHoverContextValue | undefined>(undefined);","import { useContext } from 'react';\nimport { ArticleHoverContext, type ArticleHoverContextValue } from './ArticleHoverContext';\n\nexport function useArticleHover(): ArticleHoverContextValue {\n const context = useContext(ArticleHoverContext);\n if (!context) {\n throw new Error('useArticleHover must be used within ArticleHoverProvider');\n }\n return context;\n}","import {animated, useSpring} from '@react-spring/three';\nimport DoorSensor from './DoorSensor';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DoorResult} from '../../../construction_principle/door/DoorHelper';\nimport {useArticleHover} from \"../../../contexts/article-hover/useArticleHover.ts\";\n\ninterface DoorAnimatorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n doorCp: DoorResult;\n}\n\ninterface HingeConfig {\n pivot: [number, number, number];\n offset: [number, number, number];\n axis: 'x' | 'y';\n openAngle: number;\n}\n\n/**\n * PD_3D local space: X = height, Y = width, Z = thk\n * DoorSensor offsets the mesh by [0, -w/2/N, 0] so right edge sits at Y=0\n *\n * left/right hinges → rotate around X (height axis)\n * top/bottom hinges → rotate around Y (width axis)\n */\nfunction getHingeConfig(hingePosition: string, w: number, h: number, thk:number): HingeConfig {\n const N = DIM_NORM;\n const nThk = thk / DIM_NORM; // thk/2 in scene units\n\n switch (hingePosition) {\n case 'right':\n // return {pivot: [0, -w / 2 / N -nThk,0 ], offset: [0, w / N +nThk, 0], axis: 'x', openAngle: Math.PI / 2}; // works for double door right but does not work for single door right\n return {pivot: [0, -w /2 / N - nThk,0 ], offset: [0, w/2 / N +nThk, 0], axis: 'x', openAngle: Math.PI / 2}; // works for single door right but does not for double door right\n case 'top':\n return {pivot: [h / (2 * N), w / 2 / N, 0], offset: [-h / (2 * N), 0, 0], axis: 'y', openAngle: Math.PI / 2};\n case 'bottom':\n return {pivot: [-h / (2 * N), w / 2 / N, 0], offset: [h / (2 * N), 0, 0], axis: 'y', openAngle: -Math.PI / 2};\n case 'left':\n default:\n return {pivot: [0, w / 2 / N + nThk, 0], offset: [0, -w/2 / N -nThk, 0], axis: 'x', openAngle: -Math.PI / 2};// works for single and double door left\n }\n}\n\ninterface DoorPanelProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n config: HingeConfig;\n isHovered: boolean;\n doorCp?:DoorResult\n ddHingePosition?:'left'|'right'\n}\n\nfunction DoorPanel({panelWidth, panelHeight, panelThk, renderMat, treeId, config, isHovered, doorCp,ddHingePosition}: DoorPanelProps) {\n const {angle} = useSpring({\n angle: isHovered ? config.openAngle : 0,\n config: {mass: 1, tension: 120, friction: 20},\n });\n\n const rotX = config.axis === 'x' ? angle : 0;\n const rotY = config.axis === 'y' ? angle : 0;\n\n return (\n <group position={config.pivot}>\n <animated.group rotation-x={rotX} rotation-y={rotY}>\n <group position={config.offset}>\n <DoorSensor panelWidth={panelWidth} panelHeight={panelHeight}\n panelThk={panelThk} renderMat={renderMat} treeId={treeId} doorCp={doorCp} ddHingePosition={ddHingePosition}/>\n </group>\n </animated.group>\n </group>\n );\n}\n\nexport default function DoorAnimator({\n panelWidth,\n panelHeight,\n panelThk,\n renderMat,\n treeId,\n doorCp\n }: DoorAnimatorProps) {\n const {isHovered} = useArticleHover()\n // const [isOpen, setIsOpen] = useState(false);\n\n // Single door (standard or flap): hingePosition decides everything\n const config = getHingeConfig(doorCp.hingePosition, panelWidth, panelHeight, panelThk);\n\n // Double door: two half-width panels, left + right hinges\n if (doorCp.doorCount === 'double') {\n const halfW = panelWidth / 2\n const leftConfig = getHingeConfig('left', halfW, panelHeight, panelThk);\n const rightConfig = getHingeConfig('right', halfW, panelHeight, panelThk);\n\n return (\n <group >\n <group position={[0, halfW / 2 / DIM_NORM + panelThk/2/DIM_NORM, 0]}>\n <DoorPanel panelWidth={halfW} panelHeight={panelHeight} panelThk={panelThk} isHovered={isHovered}\n renderMat={renderMat} treeId={treeId + '_L'} config={leftConfig} doorCp={doorCp} ddHingePosition={'left'}/>\n </group>\n <group position={[0, -halfW/2 / DIM_NORM - panelThk/2/DIM_NORM, 0]}>\n <DoorPanel panelWidth={halfW } panelHeight={panelHeight} panelThk={panelThk} isHovered={isHovered}\n renderMat={renderMat} treeId={treeId + '_R'} config={rightConfig} doorCp={doorCp} ddHingePosition={'right'}/>\n </group>\n </group>\n );\n }\n\n return (\n <group >\n <DoorPanel panelWidth={panelWidth} panelHeight={panelHeight} panelThk={panelThk}\n doorCp={doorCp} renderMat={renderMat} treeId={treeId} config={config} isHovered={isHovered}/>\n </group>\n );\n}\n","import {memo} from \"react\";\r\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\r\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\r\nimport {VIEW} from \"../../../types/view.types.ts\";\r\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\r\nimport {DividerType} from \"../../../types/divider.types.ts\";\r\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\r\n\r\nconst Left = memo(function Left({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.left;\r\n const cp = elemHlp?.cp\r\n\r\n let render_mat = undefined\r\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\r\n\r\n const startElem = helper.back\r\n const endElem = helper.front\r\n const {trim, oversize, thk} = elemHlp\r\n\r\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\r\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\r\n\r\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\r\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\r\n\r\n const startElemThk = startElem?.thk || 0\r\n const endElemThk = endElem?.thk || 0\r\n\r\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\r\n const endTrimThk = computeTrim('elem',cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\r\n const topTrimThk = computeTrim('elem',cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\r\n const botTrimThk = computeTrim('elem',cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\r\n\r\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + oversize.start + oversize.end\r\n const panel_thk = thk\r\n\r\n const pos_x = -(dimension.width / 2 - panel_thk / 2 - backInset - doorInset)\r\n const pos_y = (oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\r\n\r\n\r\n return (\r\n view === VIEW._3D ?\r\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, -Math.PI/2, 0]}>\r\n {isDoor(cp)\r\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\r\n : <PD_3D\r\n length={panel_length / DIM_NORM}\r\n width={panel_width / DIM_NORM}\r\n thk={panel_thk / DIM_NORM}\r\n treeId={TREEID}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\r\n elemInfo={{source:'elem',elemType: ElemPartType.SidePanel, thk: panel_thk, treeId : TREEID }}\r\n />\r\n }\r\n </group>\r\n :\r\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\r\n <PD_2D\r\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\r\n dim_y={panel_thk}\r\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\r\n treeId={TREEID}\r\n rotate={180}\r\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\r\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\r\n render_mat={render_mat}\r\n cpName={cp.name}\r\n />\r\n </g>\r\n )\r\n});\r\n\r\nexport default Left;","import {memo} from \"react\";\nimport {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\n\nconst Back = memo(function Back({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.back;\n const cp = elemHlp?.cp\n let render_mat = undefined\n\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\n\n const startElem = helper.right\n const endElem = helper.left\n const {trim, oversize, thk} = elemHlp\n\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\n\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\n\n const startElemThk = startElem?.thk || 0\n const endElemThk = endElem?.thk || 0\n\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\n const endTrimThk = computeTrim('elem',cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\n const topTrimThk = computeTrim('elem',cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\n const botTrimThk = computeTrim('elem',cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\n\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + oversize.start + oversize.end\n const panel_thk = thk\n\n const pos_x = (oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_y = dimension.depth / 2 - panel_thk / 2 - backInset - doorInset\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, Math.PI, Math.PI / 2]}>\n {isDoor(cp) && cp.props.doorType\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\n :\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\n render_mat={render_mat}\n elemInfo={{source:'elem', elemType: ElemPartType.Back, thk: panel_thk}}\n />\n }\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n rotate={180}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cpName={cp.name}\n render_mat={render_mat}\n />\n </g>\n )\n});\n\nexport default Back;","import {memo} from \"react\";\r\nimport {VIEW} from \"../../../types/view.types.ts\";\r\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\r\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\r\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\r\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\r\nimport {DividerType} from \"../../../types/divider.types.ts\";\r\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\r\n\r\nconst Right = memo(function Right({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.right;\r\n const cp = elemHlp?.cp\r\n let render_mat = undefined\r\n\r\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\r\n\r\n const startElem = helper.front\r\n const endElem = helper.back\r\n const {trim, oversize, thk} = elemHlp\r\n\r\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\r\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\r\n\r\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\r\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\r\n\r\n const startElemThk = startElem?.thk || 0\r\n const endElemThk = endElem?.thk || 0\r\n\r\n const startTrimThk= computeTrim('elem',cp.type, trim.start,'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\r\n const endTrimThk = computeTrim('elem' ,cp.type, trim.end,'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\r\n const topTrimThk = computeTrim('elem' ,cp.type, trim.top,'divider', DividerType.topShelf, elemHlp.topThk, backInset)\r\n const botTrimThk = computeTrim('elem' ,cp.type, trim.bot,'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\r\n\r\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + oversize.start + oversize.end\r\n const panel_thk = thk\r\n\r\n const pos_x = (dimension.width / 2 - panel_thk / 2 - backInset - doorInset)\r\n const pos_y = -(oversize.start / 2 - oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk/2 - topTrimThk/2\r\n\r\n\r\n return (\r\n view === VIEW._3D ?\r\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, Math.PI / 2, Math.PI]}>\r\n {isDoor(cp)\r\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk} renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\r\n : <PD_3D\r\n length={panel_length / DIM_NORM}\r\n width={panel_width / DIM_NORM}\r\n thk={panel_thk / DIM_NORM}\r\n treeId={TREEID}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\r\n elemInfo={{source:'elem',elemType: ElemPartType.SidePanel, thk: panel_thk, treeId : TREEID }}\r\n />\r\n }\r\n </group>\r\n :\r\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\r\n <PD_2D\r\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\r\n dim_y={panel_thk}\r\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\r\n treeId={TREEID}\r\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\r\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\r\n render_mat={render_mat}\r\n cpName={cp.name}\r\n />\r\n </g>\r\n )\r\n});\r\n\r\nexport default Right;","// ============================================================================\n// LINDIV RESOLVER\n// Resolves lindiv expressions with units and ratios\n// Example: \"(round($P_WIDTH/1200 -0.5)*1200)mm:1\"\n// ============================================================================\n\nimport { resolve } from './ExpressionResolver';\nimport type { VariableTree } from '../variables/VariableResolver';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface LindivResult {\n /** Resolved lindiv string in original format (e.g., \"3600mm:1\", \"1:1800mm\") */\n value: string;\n\n /** Original input string */\n original: string;\n\n /** Whether this is a reference (starts with # or is article name) */\n isReference: boolean;\n}\n\n// ============================================================================\n// HELPER FOR n* FORMAT\n// ============================================================================\n\n/**\n * Helper to handle lindiv expressions with n* markers\n * Format: \"expr1 mm:n*expr2 mm:n*expr3 mm:1\"\n *\n * Strategy:\n * 1. Split by ':' to get sections\n * 2. Track which sections have 'n*' prefix\n * 3. Remove 'n*' from sections\n * 4. Evaluate each section using ExpressionResolver\n * 5. Reconstruct with 'n*' markers restored\n */\nfunction resolveWithNStar(\n lindiv: string,\n variableTree?: VariableTree\n): string {\n // Split by ':' to get all sections\n const sections = lindiv.split(':');\n\n // Track which sections have n* and remove it\n const sectionData = sections.map(section => {\n const trimmed = section.trim();\n const hasNStar = trimmed.startsWith('n*');\n const cleaned = hasNStar ? trimmed.substring(2).trim() : trimmed;\n return { hasNStar, cleaned };\n });\n\n // Evaluate each section separately\n const evaluatedSections = sectionData.map(({ cleaned }) => {\n // Each section could be:\n // - An expression with units: \"expr mm\" or \"(expr) mm\"\n // - Just a number: \"1\"\n // - A simple expression: \"expr\"\n\n // Only evaluate sections that contain an actual expression to resolve:\n // a function call / parenthesised sub-expression, or an un-substituted variable.\n // Literal segments like \"4.00mm\", \"2+4mm\", or \"1\" are returned as-is.\n // This prevents bare arithmetic (e.g. \"2+4mm\") from being incorrectly collapsed\n // and preserves the original number formatting (e.g. \"0.00mm\" stays \"0.00mm\").\n if (!cleaned.includes('(') && !cleaned.includes('$')) {\n return cleaned;\n }\n\n // Use the resolve function from ExpressionResolver to handle expressions with units\n const result = resolve(cleaned, {\n variableTree,\n allowFunctions: true,\n dataType: 'FL',\n silent: true\n });\n\n const resultStr = String(result.value);\n\n // If the section had a unit (mm, cm), preserve it in the output\n // But only append if the result doesn't already end with the unit\n if (cleaned.includes('mm')) {\n return resultStr.endsWith('mm') ? resultStr : `${resultStr}mm`;\n } else if (cleaned.includes('cm')) {\n return resultStr.endsWith('cm') ? resultStr : `${resultStr}cm`;\n } else {\n return resultStr;\n }\n });\n\n // Reconstruct with n* markers\n const result = evaluatedSections.map((value, i) => {\n return sectionData[i].hasNStar ? `n*${value}` : value;\n }).join(':');\n\n return result;\n}\n\n// ============================================================================\n// MAIN RESOLVER\n// ============================================================================\n\n/**\n * Resolve lindiv expressions and return in original format\n *\n * Handles:\n * - Simple ratios: \"1:1\", \"2:1\" → \"1:1\"\n * - References: \"#RP_LD_P_T100\" → \"RP_LD_P_T100\"\n * - Expressions: \"(round(4000/1200 -0.5)*1200)mm:1\" → \"3600mm:1\"\n * - Reverse format: \"1:((round(2700/150))*150)mm\" → \"1:1800mm\"\n * - With braces: \"(round(X/150))*{1}\" → \"24*{1}\"\n * - With n* markers: \"expr1 mm:n*expr2 mm:1\" → \"3600mm:n*3598mm:1\"\n * - With variables: Assumes variables are already resolved\n *\n * @example\n * resolveLindiv(\"(round(4000/1200 -0.5)*1200)mm:1\")\n * // → \"3600mm:1\"\n *\n * @example\n * resolveLindiv(\"1:((round(2700/150))*150)mm\")\n * // → \"1:1800mm\"\n *\n * @example\n * resolveLindiv(\"#RP_LD_P_T100\")\n * // → \"RP_LD_P_T100\" (removes #)\n *\n * @example\n * resolveLindiv(\"expr1 mm:n*expr2 mm:1\", variableTree)\n * // → \"3600mm:n*3598mm:1\"\n */\nexport function resolveLindiv(\n lindiv: string,\n variableTree?: VariableTree\n): LindivResult {\n const original = lindiv;\n\n // Check if it's a reference (descriptor or article name)\n if (isLindivReference(lindiv)) {\n const value = lindiv.startsWith('#') ? lindiv.slice(1) : lindiv;\n return {\n value,\n original,\n isReference: true\n };\n }\n\n // Check if it's a simple ratio (e.g., \"1:1\", \"2:1\")\n if (/^\\d+:\\d+$/.test(lindiv)) {\n return {\n value: lindiv,\n original,\n isReference: false\n };\n }\n\n // Check if it contains n* OR is a multi-segment lindiv (more than one :)\n // Examples: \"2 mm:1:($VAR) mm:1:($VAR) mm\" has 4 colons = multi-segment\n const colonCount = (lindiv.match(/:/g) || []).length;\n if (lindiv.includes('n*') || colonCount > 1) {\n const value = resolveWithNStar(lindiv, variableTree);\n return {\n value,\n original,\n isReference: false\n };\n }\n\n // Parse the lindiv expression\n const { format, expression, suffix, unit } = parseLindiv(lindiv);\n\n // Clean expression: remove units that appear inside (like \"12 mm\")\n // Keep them as part of the expression for now (they'll be handled by resolve)\n let cleanExpression = expression;\n\n // Remove outer parentheses if present\n cleanExpression = cleanExpression.replace(/^\\((.+)\\)$/, '$1');\n\n // Resolve the expression\n const result = resolve(cleanExpression, {\n variableTree,\n allowFunctions: true, // Enable round(), floor(), etc.\n dataType: 'FL',\n silent: true\n });\n\n // Get the evaluated value\n const evaluatedValue = result.value ?? expression;\n\n // Reconstruct in original format\n let finalValue: string;\n\n switch (format) {\n case 'expr:ratio':\n // Format: \"expression mm:ratio\" → \"3600mm:1\"\n finalValue = `${evaluatedValue}${unit || ''}${suffix}`;\n break;\n\n case 'ratio:expr':\n // Format: \"ratio:expression mm\" → \"1:1800mm\"\n finalValue = `${suffix}${evaluatedValue}${unit || ''}`;\n break;\n\n case 'expr*{ratio}':\n // Format: \"expression*{ratio}\" → \"24*{1}\"\n finalValue = `${evaluatedValue}${suffix}`;\n break;\n\n case 'simple':\n // Format: \"expression\" → \"3600\"\n finalValue = String(evaluatedValue);\n break;\n }\n\n return {\n value: finalValue,\n original,\n isReference: false\n };\n}\n\n/**\n * Simpler version that just returns the resolved string value\n *\n * @example\n * resolveLindivValue(\"(round(4000/1200 -0.5)*1200)mm:1\")\n * // → \"3600mm:1\"\n */\nexport function resolveLindivValue(\n lindiv: string,\n variableTree?: VariableTree\n): string {\n return resolveLindiv(lindiv, variableTree).value;\n}\n\n// ============================================================================\n// PARSING UTILITIES\n// ============================================================================\n\n/**\n * Parse lindiv expression into parts\n *\n * Handles multiple formats:\n * - \"expression mm:ratio\" → (round(4000/1200)*1200)mm:1\n * - \"ratio:expression mm\" → 1:((round(2700/150))*150)mm\n * - \"expression*{ratio}\" → (round(X/150))*{1}\n * - \"expression:ratio\" → round(X):1\n *\n * @example\n * parseLindiv(\"(round(4000/1200)*1200)mm:1\")\n * // → { format: 'expr:ratio', expression: 'round(4000/1200)*1200', suffix: 'mm:1' }\n */\nfunction parseLindiv(lindiv: string): {\n format: 'expr:ratio' | 'ratio:expr' | 'expr*{ratio}' | 'simple';\n expression: string;\n suffix: string;\n unit?: string;\n} {\n const trimmed = lindiv.trim();\n\n // Remove outer parentheses if they wrap the entire expression\n const cleanInput = trimmed.replace(/^\\((.+)\\)$/, '$1');\n\n // Pattern 1: \"1:expression mm\" or \"n:expression mm\" (ratio first)\n // Examples: \"1:((round(2700/150))*150)mm\", \"1:n*((X)/round((X)/150))mm\"\n const ratioFirstMatch = cleanInput.match(/^(\\d+|n):(.+?)(mm|cm)?$/);\n if (ratioFirstMatch) {\n const [, ratio, expr, unit] = ratioFirstMatch;\n return {\n format: 'ratio:expr',\n expression: expr.trim(),\n suffix: `${ratio}:`,\n unit: unit || undefined\n };\n }\n\n // Pattern 2: \"expression mm:ratio\" (most common)\n // Examples: \"(round(4000/1200)*1200)mm:1\"\n const exprRatioMatch = cleanInput.match(/^(.+?)(mm|cm)?\\s*:(\\d+)$/);\n if (exprRatioMatch) {\n const [, expr, unit, ratio] = exprRatioMatch;\n return {\n format: 'expr:ratio',\n expression: expr.trim(),\n suffix: `:${ratio}`,\n unit: unit || undefined\n };\n }\n\n // Pattern 3: \"expression*{ratio}\" or \"expression{ratio}\"\n // Examples: \"(round(X/150))*{1}\", \"(round(X/150)){1}\"\n const bracesMatch = cleanInput.match(/^(.+?)(\\*)?{(\\d+)}$/);\n if (bracesMatch) {\n const [, expr, star, ratio] = bracesMatch;\n return {\n format: 'expr*{ratio}',\n expression: expr.trim(),\n suffix: star ? `*{${ratio}}` : `{${ratio}}`\n };\n }\n\n // Pattern 4: Simple expression without suffix\n // Examples: \"1200\", \"round(X)\"\n return {\n format: 'simple',\n expression: cleanInput,\n suffix: ''\n };\n}\n\n/**\n * Check if lindiv is a reference (descriptor name or article name)\n */\nexport function isLindivReference(lindiv: string): boolean {\n // Starts with # (descriptor reference)\n if (lindiv.startsWith('#')) return true;\n\n // Contains parentheses (expression)\n if (lindiv.includes('(')) return false;\n\n // Contains operators (expression)\n if (/[+\\-*/]/.test(lindiv)) return false;\n\n // Contains only alphanumeric, underscore, hyphen (likely a name)\n if (/^[A-Za-z0-9_-]+$/.test(lindiv)) return true;\n\n // Simple ratio pattern\n if (/^\\d+:\\d+$/.test(lindiv)) return false;\n\n // Otherwise, treat as reference\n return true;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Check if a lindiv expression contains variables\n */\nexport function lindivHasVariables(lindiv: string): boolean {\n return /\\$[A-Za-z_][A-Za-z0-9_]*/.test(lindiv);\n}\n\n/**\n * Extract variable names from lindiv\n */\nexport function extractLindivVariables(lindiv: string): string[] {\n const matches = lindiv.matchAll(/\\$([A-Za-z_][A-Za-z0-9_]*)/g);\n return Array.from(matches, match => match[1]);\n}\n\n/**\n * Format lindiv result back to string\n * Since value is already formatted, this just adds # for references\n */\nexport function formatLindiv(result: LindivResult): string {\n if (result.isReference) {\n return `#${result.value}`;\n }\n return result.value;\n}\n","import {useMemo} from 'react';\r\nimport {useDescriptorEvaluation, useDescriptorMatches} from '../contexts/descriptor/useDescriptor.ts';\r\nimport {type DividerMode, isArticle, isLinearDivision, ValueSourceConst} from '../types/divider.types';\r\nimport {resolveLindivValue} from \"../helpers/LindivResolver.ts\";\r\nimport type {DescriptorManager} from \"../descriptor/services/DescriptorManager.ts\";\r\nimport {type VariableTree} from \"../variables/VariableResolver.ts\";\r\nimport {isCpDescriptor} from \"../construction_principle/dto/cp-dispatcher.types.ts\";\r\n\r\nexport interface UseZoneDescriptorOptions {\r\n inputData: Record<string, unknown>\r\n divider: DividerMode\r\n descriptorManager: DescriptorManager,\r\n variableTree: VariableTree,\r\n resolveVarRecursive: (str: string) => string,\r\n}\r\n\r\nexport function ZoneDivider({ divider, inputData, descriptorManager, resolveVarRecursive }: UseZoneDescriptorOptions) {\r\n\r\n let descriptorName :string | undefined;\r\n divider = {...divider, DIVIDER: resolveVarRecursive(divider.DIVIDER)}\r\n if (isCpDescriptor(divider.DIVIDER))\r\n divider = {...divider, valueSource:ValueSourceConst.DESCRIPTOR, descriptorName:descriptorName || ''}\r\n if (divider) {\r\n descriptorName = isLinearDivision.descriptor(divider) ? divider.LINDIV1\r\n : isArticle.descriptor(divider) ? resolveVarRecursive(divider.DIVIDER)\r\n : undefined\r\n }\r\n\r\n\r\n // console.log('descriptor Name ', descriptorName)\r\n const { result, error } = useDescriptorEvaluation(descriptorManager, descriptorName, inputData, { throwOnError: false }, resolveVarRecursive);\r\n\r\n\r\n const {matches, error:matchesErrors, count} = useDescriptorMatches(descriptorManager, descriptorName, inputData, resolveVarRecursive)\r\n let matchesArticles : string[]\r\n if (matches && !matchesErrors && count > 0){\r\n matchesArticles = matches.map(match => match.lindiv)\r\n }\r\n\r\n\r\n if (error) console.error('Error : from useDescriptorEvaluation',error)\r\n\r\n function linDivResolver(linDiv:string) : string {\r\n let resolvedVar = resolveVarRecursive(linDiv)\r\n\r\n const xValue = inputData['X']\r\n if (xValue) resolvedVar = resolvedVar.replace(/\\bX\\b/g, String(xValue))\r\n return (resolveLindivValue(resolvedVar))\r\n }\r\n\r\n const updatedDivider: DividerMode = useMemo(() => {\r\n if(isLinearDivision.descriptor(divider)){\r\n return {...divider, LINDIV1: linDivResolver(result?.lindiv || ''), descriptorName: descriptorName || ''}\r\n }else if (isArticle.descriptor(divider)){\r\n return {...divider, DIVIDER:result?.lindiv || '', matchesArticles:matchesArticles, descriptorName:descriptorName || ''};\r\n }else {\r\n return {...divider,LINDIV1: linDivResolver(divider.LINDIV1)}\r\n }\r\n },[divider]);\r\n\r\n return {\r\n updatedDivider\r\n };\r\n}","import type {DimensionProps, PositionHelperResult} from \"../../../../types/zone.types.tsx\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport {Fragment, memo} from \"react\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport Zone from \"../../Zone.tsx\";\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport {type DividerMode, DividerType} from \"../../../../types/divider.types.ts\";\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\nimport {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport {useZoneHelper} from \"../../../../helpers/row_data/UseZoneHelper.tsx\";\nimport {isShelf, isSidePanel} from \"../../../../construction_principle/dto/cp-dispatcher.types.ts\";\n\ntype ImosDividerType = 'width' | 'height' | 'depth' | 'article' | 'independent';\n\nconst CONFIG = {\n width: {\n rotation: [0, Math.PI / 2, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.height, width: d.depth, thk}),\n get2DTop: (d: DimensionProps, thk: number) => ({dim_x: d.depth, dim_y:thk,}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.height, dim_y: thk})\n },\n height: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n },\n depth: {\n rotation: [Math.PI / 2, 0, Math.PI / 2] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.height, width: d.width, thk}),\n get2DTop: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk}),\n get2DFront: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.height})\n },\n article: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n },\n independent: {\n rotation: [0, 0, 0] as [number, number, number],\n get3D: (d: DimensionProps, thk: number) => ({length: d.width, width: d.depth, thk}),\n get2DTop: (d: DimensionProps) => ({dim_x: d.width, dim_y: d.depth}),\n get2DFront: (d: DimensionProps, thk: number) => ({dim_x: d.width, dim_y: thk})\n }\n};\n\nconst getDividerPos = (type: ImosDividerType, thk: number, d: DimensionProps) => ({\n x: type === 'width' ? d.width / 2 + thk / 2 : 0,\n y: type === 'depth' ? d.depth / 2 + thk / 2 : 0,\n z: type === 'height' ? d.height / 2 + thk / 2 : 0\n});\n\ninterface DividerProps {\n articleName:string\n childrenPositon: PositionHelperResult\n dividerThk: number\n divider: DividerMode\n view: VIEW,\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\n}\n\nexport const LinearDividerRender = memo(function LinearDividerRender({articleName, divider, view, childrenPositon, dividerThk}: DividerProps) {\n const zoneHelper = useZoneHelper(divider.NAME,divider.TREEID);\n const cp = zoneHelper?.DividerCP\n\n let render_mat = undefined\n\n if (cp && isShelf(cp)) render_mat = cp.props.kms?.render\n if (cp && isSidePanel(cp)) render_mat = cp.props.kms?.render\n\n const type = childrenPositon.dividerType;\n const children = childrenPositon.childPositions;\n const cfg = CONFIG[type];\n\n return (\n children.map((child, i) => {\n const isLast = i === children.length - 1;\n const showDiv = !isLast && dividerThk !== 0;\n const divPos = getDividerPos(type, dividerThk, child.zone_dims);\n const dims_3d = cfg.get3D(child.zone_dims, dividerThk);\n const dims_2d = view === VIEW._2D_TOP ? cfg.get2DTop(child.zone_dims, dividerThk) : cfg.get2DFront(child.zone_dims, dividerThk);\n const dividerId = `${divider.TREEID} divider`;\n\n return (\n <Fragment key={i}>\n {\n <GroupWrapper view={view as VIEW} position={[child.x / DIM_NORM , child.y / DIM_NORM , child.z / DIM_NORM]} >\n <GroupWrapper view={view as VIEW} position={[divPos.x / DIM_NORM , divPos.y / DIM_NORM , divPos.z / DIM_NORM ]} rotation={cfg.rotation}>\n {showDiv &&\n <>\n {\n view === VIEW._3D ?\n <PD_3D\n length={dims_3d.length / DIM_NORM}\n width={dims_3d.width / DIM_NORM}\n thk={dims_3d.thk / DIM_NORM}\n opacity={1}\n treeId={dividerId}\n render_mat={render_mat}\n elemInfo={{source:\"divider\",elemType:DividerType.fixShelf, thk: dims_3d.thk}}\n />\n :\n <PD_2D\n {...dims_2d}\n text={dividerId}\n treeId={dividerId}\n cpName={cp?.name}\n />\n }\n </>\n }\n </GroupWrapper>\n <Zone articleName={articleName} key={`${articleName}-${child.TREEID}`} TREEID={child.TREEID} dimension={child.zone_dims} view={view}/>\n </GroupWrapper>\n }\n </Fragment>\n );\n })\n );\n});","import type {VIEW} from \"../../../../types/view.types.ts\";\r\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\r\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\r\nimport Zone from \"../../Zone.tsx\";\r\n\r\ninterface SubArticleProps {\r\n articleName: string\r\n view: VIEW,\r\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\r\n}\r\n\r\nexport default function SubArticleRender({view, remainingZone, articleName} : SubArticleProps){\r\n\r\n return (\r\n <GroupWrapper view={view} position={[remainingZone.position.x, remainingZone.position.y, remainingZone.position.z]}>\r\n <Zone key={articleName} articleName={articleName} TREEID={'0'} dimension={remainingZone.dimensions} view={view} />\r\n </GroupWrapper>\r\n )\r\n}","// src/stores/variableStore.ts\nimport type {VAR_TYPE} from \"../variables/variable.types.ts\";\n\nexport interface ArticleVariableEntry {\n articleName: string;\n articleId: string;\n variables: Map<string, { value: string | number | boolean; type: VAR_TYPE }>; // type is now VAR_TYPE enum\n descriptorOptions?: Map<string, {articles:string[]; selected?:string}>; // descriptorName → matched article names\n}\n\ntype Listener = () => void;\n\nclass VariableStore {\n private articles = new Map<string, ArticleVariableEntry>();\n private listeners = new Set<Listener>();\n private setters = new Map<string, (name: string, value: string | number | boolean) => void>();\n\n // Called from inside Canvas by each ArticleDesigner\n register(articleId: string, entry: ArticleVariableEntry, setter: (name: string, value: string | number | boolean) => void) {\n // CHANGED: preserve descriptorOptions if VariableBridge re-registers without them\n const existing = this.articles.get(articleId);\n if (existing?.descriptorOptions && !entry.descriptorOptions) {\n entry.descriptorOptions = existing.descriptorOptions;\n }\n this.articles.set(articleId, entry);\n this.setters.set(articleId, setter);\n this.notify();\n }\n\n unregister(articleId: string) {\n this.articles.delete(articleId);\n this.setters.delete(articleId);\n this.notify();\n }\n\n // NEW: Called from Zone.tsx to push matchesArticles into the store\n setDescriptorOptions(articleName: string, descriptorName: string, articles: string[]) {\n let changed = false;\n for (const [, entry] of this.articles) {\n if (entry.articleName === articleName) {\n if (!entry.descriptorOptions) entry.descriptorOptions = new Map();\n const existing = entry.descriptorOptions.get(descriptorName);\n const sameList = existing\n && existing.articles.length === articles.length\n && existing.articles.every((a, i) => a === articles[i]);\n if (!sameList) {\n // Preserve user's selection if it is still valid in the new list\n const selected = existing?.selected && articles.includes(existing.selected)\n ? existing.selected\n : undefined;\n entry.descriptorOptions.set(descriptorName, { articles, selected });\n changed = true;\n }\n }\n }\n if (changed) this.notify();\n }\n\n // called by MCombo on user selection\n setDescriptorSelection(articleId: string, descriptorName: string, selected: string) {\n const entry = this.articles.get(articleId);\n if (!entry) return;\n const existing = entry.descriptorOptions?.get(descriptorName);\n if (existing && existing.articles.includes(selected)) {\n existing.selected = selected;\n this.notify();\n }\n }\n\n // Called from outside Canvas by the DOM UI\n private snapshot: ArticleVariableEntry[] = [];\n\n getArticles(): ArticleVariableEntry[] {\n return this.snapshot; // stable reference until next notify()\n }\n\n setValue(articleId: string, varName: string, value: string | number | boolean) {\n this.setters.get(articleId)?.(varName, value);\n }\n\n subscribe(listener: Listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n this.snapshot = Array.from(this.articles.values());\n this.listeners.forEach(fn => fn());\n }\n}\n\nexport const variableStore = new VariableStore();","import {memo, useSyncExternalStore} from \"react\";\r\nimport {type DividerMode, isArticle, isDivider} from \"../../../types/divider.types.ts\";\r\nimport {LinearDividerRender} from \"./sub_construction/LinearDividerRender.tsx\";\r\nimport type {VIEW} from \"../../../types/view.types.ts\";\r\nimport type {PositionHelperResult} from \"../../../types/zone.types.tsx\";\r\nimport {calculateRemainingZoneGeometry} from \"../../../helpers/ZoneCalculations.tsx\";\r\nimport SubArticleRender from \"./sub_construction/SubArticleRender.tsx\";\r\nimport {variableStore} from \"../../../stores/variableStore.ts\";\r\n\r\ninterface DividerProps {\r\n articleName: string;\r\n childrenPositon?: PositionHelperResult\r\n dividerThk: number\r\n divider: DividerMode\r\n view: VIEW,\r\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\r\n}\r\n\r\nconst Divider = memo(function Divider({articleName, childrenPositon, dividerThk, divider, view, remainingZone}:DividerProps){\r\n const snapshot = useSyncExternalStore(\r\n (cb) => variableStore.subscribe(cb),\r\n () => variableStore.getArticles()\r\n )\r\n if (isDivider.linearDivision(divider)){\r\n if (!childrenPositon) return null;\r\n return <LinearDividerRender articleName={articleName} view={view} childrenPositon={childrenPositon} dividerThk={dividerThk} divider={divider} remainingZone={remainingZone}/>\r\n }\r\n\r\n\r\n if (isDivider.article(divider)){\r\n if (!remainingZone) return null;\r\n let subArticleName = divider.DIVIDER;\r\n if (isArticle.descriptor(divider)){\r\n const entry = snapshot.find(a => a.articleName === articleName)\r\n const descOpts = entry?.descriptorOptions?.get(divider.descriptorName);\r\n const userSelected = descOpts?.selected\r\n\r\n if (userSelected && descOpts!.articles.includes(userSelected)){\r\n subArticleName = userSelected\r\n }else {\r\n subArticleName = descOpts?.articles[0] ?? divider.DIVIDER\r\n }\r\n }\r\n\r\n return subArticleName && <SubArticleRender view={view} articleName={subArticleName} remainingZone={remainingZone} />\r\n }\r\n\r\n return null;\r\n});\r\n\r\nexport default Divider;","import {memo} from \"react\";\nimport {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {\n type CpDispatcherResult,\n isBackPanel,\n isShelf\n} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\n\nconst Bottom = memo(function Bottom({TREEID, dimension, view, helper, bottomShelfCP}: ElemProps & {bottomShelfCP?:CpDispatcherResult}) {\n const cp = bottomShelfCP\n let render_mat = undefined\n\n if (!cp || cp.name.includes('EMPTY')) return\n if (isShelf(cp)) render_mat = cp.props.kms?.render\n\n const frontTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.front?.trim.bot,'elem', helper.front?.PARTTYPE, helper.front?.thk, (isBackPanel(helper.front?.cp) ? helper.front.inset : 0 ))\n const backTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.back?.trim.bot,'elem', helper.back?.PARTTYPE, helper.back?.thk, (isBackPanel(helper.back?.cp) ? helper.back.inset : 0 ))\n const leftTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.left?.trim.bot,'elem', helper.left?.PARTTYPE, helper.left?.thk, (isBackPanel(helper.left?.cp) ? helper.left.inset : 0 ))\n const rightTrimThk = computeTrim('divider' ,DividerType.botShelf, helper.right?.trim.bot,'elem', helper.right?.PARTTYPE, helper.right?.thk, (isBackPanel(helper.right?.cp) ? helper.right.inset : 0 ))\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = cp.thk\n\n const pos_x = leftTrimThk / 2 - rightTrimThk / 2\n const pos_y = -(backTrimThk / 2 - frontTrimThk / 2)\n const pos_z = -(dimension.height / 2 - panel_thk / 2)\n\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n render_mat={render_mat}\n elemInfo={{source:'divider',elemType: DividerType.botShelf, thk: panel_thk, treeId : TREEID }}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n render_mat={render_mat}\n cpName={cp.name}\n />\n </g>\n )\n});\n\nexport default Bottom;","import {memo} from \"react\";\nimport {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {\n type CpDispatcherResult,\n isBackPanel,\n isShelf\n} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\n\n// Top edge in front view - uses front element data but positioned at top\nconst Top = memo(function Top({TREEID, dimension, view, helper, topShelfCP} : ElemProps & {topShelfCP?:CpDispatcherResult}) {\n const cp = topShelfCP\n let render_mat = undefined\n\n if (!cp || cp.name.includes('EMPTY')) return\n if (isShelf(cp)) render_mat = cp.props.kms?.render\n\n const frontTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.front?.trim.top,'elem', helper.front?.PARTTYPE, helper.front?.thk, (isBackPanel(helper.front?.cp) ? helper.front.inset : 0 ))\n const backTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.back?.trim.top,'elem', helper.back?.PARTTYPE, helper.back?.thk, (isBackPanel(helper.back?.cp) ? helper.back.inset : 0 ))\n const leftTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.left?.trim.top,'elem', helper.left?.PARTTYPE, helper.left?.thk, (isBackPanel(helper.left?.cp) ? helper.left.inset : 0 ))\n const rightTrimThk = computeTrim('divider' ,DividerType.topShelf, helper.right?.trim.top,'elem', helper.right?.PARTTYPE, helper.right?.thk, (isBackPanel(helper.right?.cp) ? helper.right.inset : 0 ))\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = cp.thk\n\n const pos_x = (leftTrimThk / 2 - rightTrimThk / 2)\n const pos_y = -(backTrimThk / 2 - frontTrimThk / 2)\n const pos_z = (dimension.height / 2 - panel_thk / 2)\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n render_mat={render_mat}\n elemInfo={{source:'divider',elemType: DividerType.topShelf, thk: panel_thk, treeId : TREEID }}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n render_mat={render_mat}\n cpName={cp.name}\n />\n </g>\n )\n});\n\nexport default Top;\n","import {useData} from \"../../contexts/article-data/useData.ts\";\nimport type {DrawerZoneDataTypes} from \"../../types/data.types.tsx\";\n\n\n\nexport default function useDrawerZoneHelper(articleName:string,TREEID:string) : DrawerZoneDataTypes | undefined{\n const {drawerZones} = useData()\n const currentDrZone = drawerZones.find((item) => item.NAME === articleName && item.ZONE_ID === TREEID)\n return currentDrZone\n}","import {useEffect, useRef, useState} from 'react';\nimport {type Mesh} from 'three';\nimport {useThree} from '@react-three/fiber';\nimport {scanNeighbors, type ScanResult} from './ScanNeighbors';\nimport PD_3D from '../../elements_manager/PD_3D';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport {ElemPartType} from \"../../../types/Elem.types.tsx\";\nimport {calculateHitOversize} from \"./calculateHitOversize.ts\";\n\ninterface DrawerSensorProps {\n panelWidth: number;\n panelHeight: number;\n panelThk: number;\n renderMat?: string;\n treeId: string;\n onset: boolean;\n}\n\nexport default function DrawerSensor({\n panelWidth,\n panelHeight,\n panelThk,\n renderMat,\n treeId,\n onset,\n }: DrawerSensorProps) {\n const meshRef = useRef<Mesh>(null);\n const {scene} = useThree();\n const [oversize, setOversize] = useState({left: 0, right: 0, top: 0, bottom: 0});\n const hasScanned = useRef(false);\n\n useEffect(() => {\n if (!meshRef.current || hasScanned.current || !onset) return;\n\n const id = requestAnimationFrame(() => {\n if (!meshRef.current) return;\n\n const result: ScanResult = scanNeighbors(meshRef.current, scene);\n\n // Drawers typically overlap side panels and top/bottom shelves\n const topOversize = result.top ? calculateHitOversize(result.top?.elemType, result.top?.thk || 0) : 0\n const bottomOversize = result.bottom ? calculateHitOversize(result.bottom?.elemType, result.bottom?.thk || 0) : 0\n\n setOversize({\n left: result.left ? result.left.thk - 2 : 0,\n right: result.right ? result.right.thk - 2 : 0,\n top: result.top ? topOversize - 2 : 0,\n bottom: result.bottom ? bottomOversize - 2 : 0,\n });\n\n hasScanned.current = true;\n });\n\n return () => cancelAnimationFrame(id);\n }, [panelWidth, panelHeight, scene]);\n\n const w = panelWidth + oversize.left + oversize.right;\n const h = panelHeight + oversize.top + oversize.bottom;\n\n // Compute position offset to keep drawer centered in zone\n const offsetX = -(oversize.bottom - oversize.top) / 2; // height axis offset\n const offsetY = (oversize.left - oversize.right) / 2; // width axis offset\n\n return (\n <group position={[offsetX / DIM_NORM, offsetY / DIM_NORM, 0]}>\n <PD_3D\n meshRef={meshRef}\n length={h / DIM_NORM}\n width={w / DIM_NORM}\n thk={panelThk / DIM_NORM}\n treeId={treeId}\n render_mat={renderMat}\n elemInfo={{source: 'elem', elemType: ElemPartType.Door, thk: panelThk, treeId}}\n />\n </group>\n );\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport DrawerSensor from \"../../helpers/DrawerSensor.tsx\";\n\nexport default function DrFront({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.front\n if (!currentElem) return\n\n const insetCalc = onset ? (currentElem.kms?.thk || 0) - currentElem.inset : 0\n const panel_length = dimension.height\n const panel_width = dimension.width\n const panel_thk = currentElem.kms?.thk || 0\n\n const pos_x = 0\n const pos_y = -(dimension.depth / 2 - panel_thk / 2) - insetCalc\n const pos_z = 0\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, 0, Math.PI / 2]}>\n <DrawerSensor\n panelWidth={panel_width}\n panelHeight={panel_length}\n panelThk={panel_thk}\n treeId={'dr_fr'+treeId}\n onset={onset}\n renderMat={render_mat}\n />\n </group>\n :<g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={'0'}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrRight({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.right\n if (!currentElem) return\n\n const nxtElem= drElems.back\n const frElem = drElems.front\n\n const nxtTrim = nxtElem?.kms ? nxtElem.inset : 0\n const frTrim = onset ? frElem.inset : frElem.kms?.thk || 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.depth - frTrim - nxtTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = (dimension.width / 2 - panel_thk / 2 - currentElem.inset)\n const pos_y = (frTrim / 2 - nxtTrim / 2)\n const pos_z = -drawerHeight / 2\n\n const render_mat = currentElem.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, Math.PI / 2, Math.PI]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'dr_ri'+treeId}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\n <PD_2D\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\n dim_y={panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrBack({dimension, drElems,view}: DrawerElem) {\n const currentElem = drElems.back\n if (!currentElem) return\n\n const prvElem= drElems.right\n const nxtElem= drElems.left\n\n const prvTrim = prvElem?.kms ? prvElem.inset + prvElem?.kms?.thk : 0\n const nxtTrim = nxtElem?.kms ? nxtElem.inset + nxtElem?.kms?.thk : 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.width - prvTrim - nxtTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = prvTrim / 2 - nxtTrim / 2\n const pos_y = (dimension.depth / 2 - panel_thk / 2 - currentElem.inset)\n const pos_z = - drawerHeight / 2\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[Math.PI / 2, Math.PI, Math.PI / 2]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'0'}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n rotate={180}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrLeft({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.left\n if (!currentElem) return\n\n const prvElem= drElems.back\n const frElem = drElems.front\n\n const prvTrim = prvElem?.kms ? prvElem.inset : 0\n const frTrim = onset ? frElem.inset : frElem.kms?.thk || 0\n\n const drawerHeight = dimension.height / 2 // not from db\n const panel_length = drawerHeight\n const panel_width = dimension.depth - prvTrim - frTrim\n const panel_thk = currentElem?.kms?.thk || 0\n\n const pos_x = -(dimension.width / 2 - panel_thk / 2 - currentElem.inset)\n const pos_y = - (prvTrim / 2 - frTrim / 2)\n const pos_z = -drawerHeight / 2\n\n const render_mat = currentElem?.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, -Math.PI/2, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n render_mat={render_mat}\n treeId={'dr_le '+treeId}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${90})`}>\n <PD_2D\n dim_x={view === VIEW._2D_TOP ? panel_width : panel_length}\n dim_y={panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n rotate={180}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\nimport {VIEW} from \"../../../../types/view.types.ts\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\n\nexport default function DrBottom({dimension, drElems, onset, view, treeId}: DrawerElem) {\n const currentElem = drElems.bottom\n if(!currentElem) return\n\n const prvElem = drElems.left\n const nxtElem = drElems.right\n const bkElem = drElems.back\n const frElem = drElems.front\n\n const prvTrim = prvElem?.kms ? prvElem.inset + prvElem.kms.thk : 0\n const nxtTrim = nxtElem?.kms ? nxtElem.inset + nxtElem.kms.thk : 0\n const bkTrim = bkElem?.kms ? bkElem.inset + bkElem.kms.thk : 0\n\n const frTrim = onset ? frElem.inset : (frElem.kms?.thk || 0)\n\n const panel_length = dimension.width - prvTrim - nxtTrim\n const panel_width = dimension.depth - bkTrim - frTrim\n const panel_thk = currentElem.kms?.thk || 0\n\n const pos_x = prvTrim / 2 - nxtTrim / 2\n const pos_y = - bkTrim / 2 + frTrim / 2\n const pos_z = -(dimension.height / 2 - panel_thk / 2 - currentElem.inset)\n\n const render_mat = currentElem.kms?.render\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]} rotation={[0, 0, 0]}>\n <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={'dr_bot'+treeId}\n render_mat={render_mat}\n />\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z})`}>\n <PD_2D\n dim_x={panel_length}\n dim_y={view === VIEW._2D_TOP ? panel_width : panel_thk}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n render_mat={render_mat}\n />\n </g>\n )\n}","import DrFront from \"./DrFront.tsx\";\nimport DrRight from \"./DrRight.tsx\";\nimport DrBack from \"./DrBack.tsx\";\nimport DrLeft from \"./DrLeft.tsx\";\nimport DrBottom from \"./DrBottom.tsx\";\nimport type {DrawerElem} from \"./types/drawer-elem.types.ts\";\n\nexport default function DrZone({dimension, drElems, onset, view, treeId} : DrawerElem){\n return (\n <>\n {drElems?.front && <DrFront dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.right && <DrRight dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.back && <DrBack dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.left && <DrLeft dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n {drElems?.bottom && <DrBottom dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId} />}\n </>\n )\n}","import {animated, useSpring} from '@react-spring/three';\nimport {DIM_NORM} from '../../../constants/Constants';\nimport type {DimensionProps} from '../../../types/zone.types';\nimport type {DrawerHelperResult} from '../../../construction_principle/drawer/DrawerHelper';\nimport type {VIEW} from '../../../types/view.types';\nimport DrZone from '../zoneElems/drawerElems/DrZone';\nimport {useArticleHover} from \"../../../contexts/article-hover/useArticleHover.ts\";\n\ninterface DrawerAnimatorProps {\n dimension: DimensionProps;\n drElems: DrawerHelperResult;\n onset: boolean;\n view: VIEW;\n treeId: string;\n drawerIndex: number\n slideDistance?: number; // How far drawer slides out (in mm)\n}\n\nexport default function DrawerAnimator({\n dimension,\n drElems,\n onset,\n view,\n treeId,\n drawerIndex = 0,\n slideDistance\n }: DrawerAnimatorProps) {\n const {isHovered} = useArticleHover()\n\n const delayMs = drawerIndex * 40;\n\n const depth = dimension.depth || 400; // fallback to 400mm\n const actualSlideDistance = slideDistance ?? depth * 0.7;\n\n // Convert to normalized units (scene units)\n const slideNormalized = actualSlideDistance / DIM_NORM;\n\n const {posZ} = useSpring({\n posZ: isHovered ? -slideNormalized : 0,\n config: {mass: 1, tension: 170, friction: 26}, // Slightly faster than door\n delay:isHovered ? delayMs + (!onset ? 80 : 0): 0\n });\n\n return (\n <animated.group position-y={posZ}>\n <DrZone dimension={dimension} drElems={drElems} onset={onset} view={view} treeId={treeId}/>\n </animated.group>\n );\n}","import type {VIEW} from \"../../../../types/view.types.ts\";\nimport type {DataContextType, DrawerZoneDataTypes} from \"../../../../types/data.types.tsx\";\nimport {DIM_NORM} from \"../../../../constants/Constants.tsx\";\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\nimport DrawerAnimator from \"../../helpers/DrawerAnimator.tsx\";\nimport type {PositionedChild} from \"../../../../types/zone.types.tsx\";\nimport UseCpDispatcher from \"../../../../helpers/useCpDispatcher.ts\";\nimport {isDrawer} from \"../../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {DrawerType} from \"../../../../construction_principle/drawer/dto/drawer.types.ts\";\n\ninterface DrawerItemProps {\n child: PositionedChild;\n index: number;\n drawerZoneHelper: DrawerZoneDataTypes;\n articleData: DataContextType;\n view: VIEW;\n}\n\n/**\n * Single drawer item component - handles hooks properly per drawer instance\n */\nexport default function DrawerItem({child, index, drawerZoneHelper, articleData, view}: DrawerItemProps) {\n const drawerName = drawerZoneHelper.sings[index % 2]?.DRAWER || '';\n\n const drawerHelper = UseCpDispatcher(articleData, drawerName, DrawerType.Drawer, 'drawer') //DrawerHelper(resolveVarRecursive, variableTree, matSurfContextValue, articleData, drawerName);\n if (!isDrawer(drawerHelper)) return\n\n if (index % 2 === 0 || !drawerName || !drawerHelper) return null;\n return (\n <GroupWrapper\n view={view}\n position={[child.x / DIM_NORM, child.y / DIM_NORM, child.z / DIM_NORM]}\n >\n <DrawerAnimator\n dimension={child.zone_dims}\n drElems={drawerHelper.props}\n onset={drawerZoneHelper.ONSET}\n view={view}\n treeId={child.TREEID + '_' + index}\n drawerIndex={index}\n />\n </GroupWrapper>\n );\n}\n","import type {DimensionProps} from \"../../../types/zone.types.tsx\";\nimport type {VIEW} from \"../../../types/view.types.ts\";\nimport type {DrawerZoneDataTypes} from \"../../../types/data.types.tsx\";\nimport {EvaluationErrors, processLindiv} from \"imos-linear-division\";\nimport {calculateChildPositions} from \"../../../helpers/ZoneCalculations.tsx\";\nimport {useData} from \"../../../contexts/article-data/useData.ts\";\nimport {useVariables} from \"../../../variables/useVariables.ts\";\nimport {resolveLindivValue} from \"../../../helpers/LindivResolver.ts\";\nimport DrawerItem from \"./sub_construction/DrawerItem.tsx\";\n\ninterface DrawerProps {\n drawerZoneHelper: DrawerZoneDataTypes\n dimension: DimensionProps,\n view: VIEW,\n}\n\nexport default function Drawer({drawerZoneHelper, dimension, view}: DrawerProps) {\n const articleData = useData()\n const {tree: variableTree} = useVariables()\n const {height} = dimension\n\n if (!drawerZoneHelper) return null\n const linDivResolved = resolveLindivValue(drawerZoneHelper.DIVISION, variableTree)\n console.log('lin div resolver drawer => ', linDivResolved)\n const children = processLindiv(linDivResolved, height)\n console.log(children)\n if (children instanceof EvaluationErrors) return null;\n const childrenPosition = calculateChildPositions(dimension, children, 'height', 0, [])\n\n return childrenPosition.childPositions.map((child, index) => (\n <DrawerItem\n key={child.TREEID + '' + index}\n child={child}\n index={index}\n drawerZoneHelper={drawerZoneHelper}\n articleData={articleData}\n view={view}\n />\n ))\n}","import {VIEW} from \"../../../types/view.types.ts\";\nimport PD_3D from \"../../elements_manager/PD_3D.tsx\";\nimport PD_2D from \"../../elements_manager/PD_2D.tsx\";\nimport {ElemPartType, type ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\nimport {isBackPanel, isDoor, isShelf, isSidePanel} from \"../../../construction_principle/dto/cp-dispatcher.types.ts\";\nimport {computeTrim} from \"../../../helpers/tools/computeTrimTool.ts\";\nimport {DividerType} from \"../../../types/divider.types.ts\";\nimport DoorAnimator from \"../helpers/DoorAnimator.tsx\";\n\nexport default function Front({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.front;\n const cp = elemHlp?.cp\n let render_mat = undefined\n\n if (!elemHlp || !cp || cp.name.includes('EMPTY')) return\n\n const startElem = helper.left\n const endElem = helper.right\n const {trim, oversize, thk} = elemHlp\n\n if (isSidePanel(cp) || isBackPanel(cp) || isShelf(cp)) render_mat = cp.props.kms?.render\n if (isDoor(cp)) render_mat = cp.props.kmsL?.render\n\n const backInset = isBackPanel(cp) ? elemHlp.inset : 0\n const doorInset = isDoor(cp) ? elemHlp.inset : 0\n\n const startElemThk = startElem?.thk || 0\n const endElemThk = endElem?.thk || 0\n\n const startTrimThk = computeTrim('elem', cp.type, trim.start, 'elem', startElem?.PARTTYPE, startElem?.thk, backInset)\n const endTrimThk = computeTrim('elem', cp.type, trim.end, 'elem', endElem?.PARTTYPE, endElem?.thk, backInset)\n const topTrimThk = computeTrim('elem', cp.type, trim.top, 'divider', DividerType.topShelf, elemHlp.topThk, backInset)\n const botTrimThk = computeTrim('elem', cp.type, trim.bot, 'divider', DividerType.botShelf, elemHlp.bottomThk, backInset)\n\n const mitreStartThk = (trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - topTrimThk - botTrimThk + oversize.top + oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + oversize.start + oversize.end\n const panel_thk = thk\n\n const pos_x = -(oversize.start / 2 - oversize.end / 2 - startTrimThk / 2 + endTrimThk / 2)\n const pos_y = -(dimension.depth / 2 - panel_thk / 2 - backInset - doorInset)\n const pos_z = -oversize.bottom / 2 + oversize.top / 2 + botTrimThk / 2 - topTrimThk / 2\n\n return (\n view === VIEW._3D ?\n <group position={[pos_x / DIM_NORM, pos_y / DIM_NORM, pos_z / DIM_NORM]}\n rotation={[Math.PI / 2, 0, Math.PI / 2]}>\n {isDoor(cp)\n ? <DoorAnimator panelWidth={panel_width} panelHeight={panel_length} panelThk={panel_thk}\n renderMat={render_mat} treeId={TREEID} doorCp={cp.props}/>\n : <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\n render_mat={render_mat}\n elemInfo={{source: 'elem', elemType: ElemPartType.Door, thk: panel_thk, treeId: TREEID}}\n />\n }\n </group>\n :\n <g transform={`translate(${pos_x},${view === VIEW._2D_TOP ? pos_y : pos_z}) rotate(${0})`}>\n <PD_2D\n dim_x={panel_width}\n dim_y={view === VIEW._2D_TOP ? panel_thk : panel_length}\n text={panel_length + ' x ' + panel_width + ' x ' + panel_thk}\n treeId={TREEID}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cpName={cp.name}\n render_mat={render_mat}\n />\n </g>\n )\n }","import {memo, useEffect} from \"react\";\r\nimport type {ZoneProps} from \"../../types/zone.types.tsx\";\r\nimport {useZoneHelper} from \"../../helpers/row_data/UseZoneHelper.tsx\";\r\nimport {\r\n calculateChildPositionsFromGeometry,\r\n calculateRemainingZoneGeometry,\r\n calculateZoneGeometry,\r\n getBorderThk,\r\n getRemainingInset,\r\n getZoneInset,\r\n useZoneElemHelpers\r\n} from \"../../helpers/ZoneCalculations.tsx\";\r\nimport {backTreeId, DIM_NORM, frontTreeId, leftTreeId, rightTreeId} from \"../../constants/Constants.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport Left from \"./zoneElems/Left.tsx\";\r\nimport Back from \"./zoneElems/Back.tsx\";\r\nimport Right from \"./zoneElems/Right.tsx\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport {ZoneDivider} from \"../../hooks/zoneDivider.ts\";\r\nimport Divider from \"./zoneElems/Divider.tsx\";\r\nimport {createDivider, getDividedAxis, getDividedLength, isArticle} from \"../../types/divider.types.ts\";\r\nimport {useDescriptorManager} from \"../../contexts/descriptor/useDescriptorManager.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport Bottom from \"./zoneElems/Bottom.tsx\";\r\nimport Top from \"./zoneElems/Top.tsx\";\r\nimport useDrawerZoneHelper from \"../../helpers/row_data/UseDrawerZoneHelper.ts\";\r\nimport Drawer from \"./zoneElems/Drawer.tsx\";\r\nimport {variableStore} from \"../../stores/variableStore.ts\";\r\nimport Front from \"./zoneElems/Front.tsx\";\r\n\r\nconst Zone = memo(function Zone({articleName,TREEID, dimension, view=VIEW._3D}: ZoneProps) {\r\n // useTrackRenders('zone, ',{TREEID} )\r\n // console.log('TREE ID ',TREEID)\r\n const descriptorManager = useDescriptorManager();\r\n const {resolveVarRecursive, tree:variableTree} = useVariables();\r\n const zoneHelper = useZoneHelper(articleName,TREEID);\r\n const drawerZoneHelper = useDrawerZoneHelper(articleName, TREEID);\r\n const dividerThk = zoneHelper?.DividerCP?.thk || 0;\r\n\r\n const elemHelpers = useZoneElemHelpers(articleName,TREEID)\r\n const borderThk = getBorderThk(elemHelpers, zoneHelper?.topShelfCP?.thk || 0, zoneHelper?.bottomShelfCP?.thk || 0)\r\n const zoneInset = getZoneInset(elemHelpers)\r\n const zoneGeometry = calculateZoneGeometry(dimension, zoneInset)\r\n const remainingInset = getRemainingInset(elemHelpers)\r\n const remainingZone = calculateRemainingZoneGeometry(zoneGeometry, borderThk, remainingInset)\r\n\r\n if (!zoneHelper) return\r\n const resolvedZone = {...zoneHelper.currentZone, LINDIV1: resolveVarRecursive(zoneHelper.currentZone.LINDIV1)}\r\n const divider = createDivider.fromZoneData(resolvedZone, dividerThk);\r\n\r\n const dividerAxis = getDividedAxis(divider)\r\n const dividedLength = getDividedLength(dividerAxis, remainingZone.dimensions)\r\n\r\n const inputData = zoneHelper.inputData\r\n zoneHelper.inputData['X'] = dividedLength.toString();\r\n\r\n const {updatedDivider} = ZoneDivider({divider, inputData, descriptorManager, resolveVarRecursive, variableTree});\r\n\r\n const childPositions = calculateChildPositionsFromGeometry(remainingZone, dividerThk, updatedDivider, zoneHelper?.children.map((child) => child.TREEID) || []);\r\n\r\n //Push matchesArticles to variableStore for Configurator/MCombo to read\r\n useEffect(() => {\r\n if (updatedDivider && isArticle.descriptor(updatedDivider) && updatedDivider.matchesArticles && updatedDivider.matchesArticles.length > 0) {\r\n variableStore.setDescriptorOptions(articleName, updatedDivider.descriptorName, updatedDivider.matchesArticles);\r\n }\r\n }, [updatedDivider, articleName, divider.DIVIDER]);\r\n return (\r\n <GroupWrapper view={view} position={[zoneGeometry.position.x / DIM_NORM , zoneGeometry.position.y / DIM_NORM , zoneGeometry.position.z / DIM_NORM ]} >\r\n {elemHelpers.front?.cp?.name != undefined && <Front articleName={articleName} view={view} TREEID={frontTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/>}\r\n {elemHelpers.left?.cp?.name != undefined && <Left articleName={articleName} view={view} TREEID={leftTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.back?.cp?.name != undefined && <Back articleName={articleName} view={view} TREEID={backTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.right?.cp?.name != undefined && <Right articleName={articleName} view={view} TREEID={rightTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.topShelfCP?.name != undefined && <Top articleName={articleName} view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} topShelfCP={zoneHelper?.topShelfCP}/> }\r\n {zoneHelper?.bottomShelfCP?.name != undefined && <Bottom articleName={articleName} view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} bottomShelfCP={zoneHelper.bottomShelfCP} /> }\r\n {drawerZoneHelper && <Drawer drawerZoneHelper={drawerZoneHelper} dimension={remainingZone.dimensions} view={view}/>}\r\n <GroupWrapper view={view} position={[remainingZone.position.x / DIM_NORM, remainingZone.position.y / DIM_NORM, remainingZone.position.z / DIM_NORM]}>\r\n {updatedDivider && <Divider articleName={articleName} remainingZone={remainingZone} divider={updatedDivider} view={view} childrenPositon={childPositions} dividerThk={dividerThk} /> }\r\n </GroupWrapper>\r\n </GroupWrapper>\r\n\r\n )\r\n});\r\n\r\nexport default Zone;","import {VIEW} from \"../../../types/view.types.ts\";\r\nimport type {DimensionProps} from \"../../../types/zone.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport interface HighlighterProps {\r\n view: VIEW,\r\n isSelected: boolean,\r\n dimensions: DimensionProps\r\n}\r\n\r\nexport default function Highlighter({view, isSelected, dimensions}: HighlighterProps) {\r\n // Normalize dimensions for Three.js\r\n const width = dimensions.width / DIM_NORM;\r\n const depth = dimensions.depth / DIM_NORM;\r\n const height = dimensions.height / DIM_NORM;\r\n\r\n return (\r\n <>\r\n {view === VIEW._3D && isSelected && (\r\n <mesh position={[0,0,height/2 + 0.1]}>\r\n <boxGeometry args={[width, depth, 50/DIM_NORM]}/>\r\n <meshBasicMaterial color=\"red\" transparent={true} opacity={0.3}/>\r\n </mesh>\r\n )}\r\n {view === VIEW._2D_TOP && isSelected && (\r\n <g transform={`translate(${-dimensions.width/2}, ${-dimensions.depth/2})`}>\r\n <rect width={dimensions.width} height={dimensions.depth} fill=\"blue\" stroke=\"black\" strokeWidth=\"2\" opacity={0.2}/>\r\n </g>\r\n )}\r\n </>\r\n )\r\n\r\n}","// src/contexts/dimension/DimensionContext.ts\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\nimport {createContext} from \"react\";\n\nexport interface DimensionContextValue {\n dimensions: DimensionProps;\n setDimension: (key: keyof DimensionProps, value: number) => void;\n}\n\nexport const DimensionContext = createContext<DimensionContextValue | undefined>(undefined);","// src/contexts/dimension/useDimensions.ts\nimport {useContext} from \"react\";\nimport {DimensionContext} from \"./DimensionContext.ts\";\n\nexport function useDimensions() {\n const context = useContext(DimensionContext);\n if (!context) throw new Error('useDimensions must be used within DimensionProvider');\n return context;\n}","import {useMemo, useCallback} from \"react\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport Zone from \"./Zone.tsx\";\r\nimport usePrimHelper from \"../../helpers/row_data/UsePrimHelper.tsx\";\r\nimport Highlighter from \"./helpers/Highlighter.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport {useDimensions} from \"../../contexts/dimension/useDimensions.ts\";\r\nimport {useArticleHover} from \"../../contexts/article-hover/useArticleHover.ts\";\r\nimport type {ThreeEvent} from \"@react-three/fiber\";\r\n\r\nconst SVG_TRANSFORM = \"scale(1,-1)\";\r\n\r\nexport interface DesignerProps {\r\n articleName: string,\r\n view: VIEW,\r\n isSelected: boolean,\r\n position: [number, number, number]\r\n}\r\n\r\nexport default function Designer({articleName, view = VIEW._3D, isSelected, position}: DesignerProps) {\r\n // Orbit detection is now handled at provider level - setIsHovered ignores calls during orbit\r\n const { setIsHovered } = useArticleHover();\r\n\r\n const handlePointerOver = useCallback((e: ThreeEvent<PointerEvent>) => {\r\n e.stopPropagation();\r\n if (!articleName.includes('SHAPE'))\r\n setIsHovered(true);\r\n }, [setIsHovered]);\r\n\r\n const handlePointerLeave = useCallback((e: ThreeEvent<PointerEvent>) => {\r\n e.stopPropagation();\r\n setIsHovered(false);\r\n }, [setIsHovered]);\r\n\r\n const dimensionOverrides = useDimensions().dimensions\r\n const currentPrim = usePrimHelper(articleName, dimensionOverrides);\r\n\r\n const prim_dims = currentPrim?.prim_dims\r\n\r\n // REMOVED: tree from dependencies - it was causing re-renders on ANY variable change\r\n // Variable changes are handled by individual components that need them\r\n const zone = useMemo(() => {\r\n return prim_dims\r\n ? (<Zone articleName={articleName} key={`${articleName}-0`} TREEID=\"0\" view={view} dimension={prim_dims}/>)\r\n : null;\r\n }, [articleName, view, prim_dims]);\r\n\r\n if (!zone || !prim_dims) return undefined\r\n\r\n\r\n const is3D = view === VIEW._3D;\r\n return (\r\n <GroupWrapper\r\n view={view}\r\n position={[position[0], position[1], prim_dims.height / DIM_NORM / 2]}\r\n onPointerOver={handlePointerOver}\r\n onPointerLeave={handlePointerLeave}\r\n >\r\n {is3D ? zone : <g transform={SVG_TRANSFORM}>{zone}</g>}\r\n <Highlighter view={view} isSelected={isSelected} dimensions={prim_dims}/>\r\n </GroupWrapper>\r\n );\r\n\r\n}","import {type ReactNode, useCallback, useMemo} from \"react\";\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\nimport {DimensionContext} from \"./DimensionContext.ts\";\n\nexport function DimensionProvider({children, initialDimensions, onDimensionChange}: {\n children: ReactNode;\n initialDimensions?: DimensionProps;\n onDimensionChange?: (key: keyof DimensionProps, value: number) => void;\n}) {\n const dimensions = initialDimensions ?? {width: 0, height: 0, depth: 0};\n\n const setDimension = useCallback((key: keyof DimensionProps, value: number) => {\n onDimensionChange?.(key, value);\n }, [onDimensionChange]);\n\n const contextValue = useMemo(() => ({dimensions, setDimension}), [dimensions, setDimension]);\n\n return (\n <DimensionContext.Provider value={contextValue}>\n {children}\n </DimensionContext.Provider>\n );\n}\n","import { useState, useMemo, useEffect, useCallback, useRef, type ReactNode } from 'react';\nimport { ArticleHoverContext, type ArticleHoverContextValue } from './ArticleHoverContext';\n\ninterface ArticleHoverProviderProps {\n children: ReactNode;\n}\n\nexport function ArticleHoverProvider({ children }: ArticleHoverProviderProps) {\n const [isHovered, setIsHoveredState] = useState(false);\n\n // Use refs to track orbit state WITHOUT causing re-renders\n const pointerIsDown = useRef(false);\n const orbitingRef = useRef(false);\n\n // Track pointer down/up at window level to detect orbiting\n useEffect(() => {\n const handlePointerDown = () => {\n pointerIsDown.current = true;\n };\n\n const handlePointerMove = () => {\n // Once pointer moves while down, consider it orbiting\n if (pointerIsDown.current && !orbitingRef.current) {\n orbitingRef.current = true;\n // Clear hover state when orbiting starts (only state change needed)\n setIsHoveredState(false);\n }\n };\n\n const handlePointerUp = () => {\n pointerIsDown.current = false;\n if (orbitingRef.current) {\n // Delay resetting orbit ref to prevent immediate hover triggers\n setTimeout(() => {\n orbitingRef.current = false;\n }, 150);\n }\n };\n\n window.addEventListener('pointerdown', handlePointerDown);\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n window.removeEventListener('pointerdown', handlePointerDown);\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n };\n }, []);\n\n // Wrapper that ignores hover changes when pointer is down or orbiting\n const setIsHovered = useCallback((value: boolean) => {\n // Ignore hover events when pointer is down (potential orbit) or already orbiting\n if (pointerIsDown.current || orbitingRef.current) return;\n setIsHoveredState(value);\n }, []);\n\n // isOrbiting exposed as getter from ref (no state = no re-renders)\n // const getIsOrbiting = useCallback(() => orbitingRef.current, []);\n\n const value = useMemo<ArticleHoverContextValue>(() => ({\n isHovered,\n setIsHovered,\n isOrbiting: false, // Static value - use getIsOrbiting() if needed dynamically\n }), [isHovered, setIsHovered]);\n\n return (\n <ArticleHoverContext.Provider value={value}>\n {children}\n </ArticleHoverContext.Provider>\n );\n}","// src/components/article_designer/VariableBridge.tsx\nimport {useEffect} from 'react';\nimport {useVariables} from '../../variables/useVariables';\nimport {variableStore} from '../../stores/variableStore';\nimport type {VAR_TYPE} from \"../../variables/variable.types.ts\";\n\nexport function VariableBridge({ articleName, articleId }: { articleName: string; articleId: string }) {\n const { tree, getValue, setVarValue } = useVariables();\n\n useEffect(() => {\n const variables = new Map<string, { value: string | number; type: VAR_TYPE }>();\n tree.forEach((variable, name) => {\n variables.set(name, { value: getValue(name) ?? '', type: variable.TYP as VAR_TYPE });\n });\n\n variableStore.register(articleId, { articleName, articleId, variables }, setVarValue);\n return () => variableStore.unregister(articleId);\n }, [tree, getValue, setVarValue, articleName, articleId]);\n\n return null;\n}","import {memo} from \"react\";\nimport {ArticleRelatedVariableProvider} from \"../../contexts/article-related-variables/ArticleRelatedVariableProvider\";\nimport Designer from \"./Designer\";\nimport GroupWrapper from \"../../helpers/GroupWrapper\";\nimport {VIEW} from \"../../types/view.types\";\nimport type {ArticleGroupTypes} from \"../../types/article-group.types\";\nimport {DimensionProvider} from \"../../contexts/dimension/DimensionProvider.tsx\";\nimport {ArticleHoverProvider} from \"../../contexts/article-hover/ArticleHoverProvider.tsx\";\nimport {VariableBridge} from \"./VariableBridge.tsx\";\n\nexport interface ArticleWithControllerProps {\n article: ArticleGroupTypes;\n articleId: string;\n position: [number, number, number];\n isSelected: boolean;\n onSelect: () => void;\n view: VIEW;\n debugMode: boolean;\n}\n\nexport const ArticleDesigner = memo(function ArticleWithController({article, articleId, position, isSelected, onSelect, view, debugMode}: ArticleWithControllerProps) {\n return (\n <ArticleRelatedVariableProvider overrides={article.variables}>\n <DimensionProvider initialDimensions={article.dimensions}>\n {debugMode && <VariableBridge articleName={article.name} articleId={articleId}/>}\n <GroupWrapper view={view} onClick={onSelect}>\n <ArticleHoverProvider>\n <Designer articleName={article.name} view={view} isSelected={isSelected} position={position} />\n </ArticleHoverProvider>\n </GroupWrapper>\n </DimensionProvider>\n </ArticleRelatedVariableProvider>\n );\n});\n","type Listener = () => void;\n\nexport interface VisibilityEntry { label: string; visible: boolean }\n\nclass VisibilityStore {\n private visibility = new Map<string, VisibilityEntry>();\n private listeners = new Set<Listener>();\n private snapshot = new Map<string, VisibilityEntry>();\n\n /** Called once when the article list is known. Only adds new articles, does not reset existing visibility. */\n registerAll(articles: { articleId: string; name: string; visible: boolean }[]) {\n let changed = false;\n for (const a of articles) {\n if (!this.visibility.has(a.articleId)) {\n this.visibility.set(a.articleId, { label: a.name, visible: a.visible });\n changed = true;\n }\n }\n // Remove articles no longer in the list\n for (const key of this.visibility.keys()) {\n if (!articles.some(a => a.articleId === key)) {\n this.visibility.delete(key);\n changed = true;\n }\n }\n if (changed) this.notify();\n }\n\n toggle(articleId: string, visible: boolean) {\n const entry = this.visibility.get(articleId);\n if (entry && entry.visible !== visible) {\n this.visibility.set(articleId, { ...entry, visible });\n this.notify();\n }\n }\n\n isVisible(articleId: string): boolean {\n return this.visibility.get(articleId)?.visible !== false;\n }\n\n getAll() {\n return this.snapshot;\n }\n\n subscribe(listener: Listener) {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify() {\n this.snapshot = new Map(this.visibility);\n this.listeners.forEach(fn => fn());\n }\n}\n\nexport const visibilityStore = new VisibilityStore();\n","// ArticleGroupLayout.tsx - Multi-Article Positioning & Layout\r\nimport {useEffect, useMemo, useSyncExternalStore} from \"react\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport {ArticleDesigner} from \"./ArticleDesigner.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {visibilityStore} from \"../../stores/visibilityStore.ts\";\r\n\r\nexport interface ArticleGroupLayoutProps {\r\n articleList: ArticleGroupTypes[];\r\n validNames: Set<string>;\r\n view: VIEW;\r\n debugMode: boolean;\r\n isZCentered: boolean;\r\n selectedIndex?: number | null;\r\n onArticleSelect?: (index: number) => void;\r\n}\r\n\r\nexport function ArticleGroupLayout({\r\n articleList,\r\n validNames,\r\n view,\r\n debugMode,\r\n isZCentered,\r\n selectedIndex,\r\n onArticleSelect\r\n }: ArticleGroupLayoutProps) {\r\n\r\n // Generate unique articleIds\r\n const articlesWithIds = useMemo(() =>\r\n articleList.map((article, index) => ({\r\n article,\r\n articleId: `${article.name}-${index}`,\r\n index,\r\n })),\r\n [articleList]\r\n );\r\n\r\n // Register articles into the visibility store (only when article list changes)\r\n useEffect(() => {\r\n visibilityStore.registerAll(\r\n articlesWithIds.map(({article, articleId}) => ({\r\n articleId,\r\n name: article.name,\r\n visible: article.visibility !== false,\r\n }))\r\n );\r\n }, [articlesWithIds]);\r\n\r\n // Read visibility from the store — re-renders when any visibility toggles\r\n const visibilitySnapshot = useSyncExternalStore(\r\n (cb) => visibilityStore.subscribe(cb),\r\n () => visibilityStore.getAll()\r\n );\r\n\r\n // Merge article data with store visibility\r\n const articlesWithVisibility = useMemo(() =>\r\n articlesWithIds.map(({article, articleId, index}) => ({\r\n ...article,\r\n articleId,\r\n index,\r\n visibility: visibilitySnapshot.get(articleId)?.visible ?? article.visibility ?? true,\r\n })),\r\n [articlesWithIds, visibilitySnapshot]\r\n );\r\n\r\n // Calculate max height for centering\r\n const maxHeight = useMemo(() => Math.max(...articlesWithVisibility.map(a => a.dimensions.height)), [articlesWithVisibility]);\r\n const maxDepth = useMemo(() => Math.max(...articlesWithVisibility.map(a => a.dimensions.depth)), [articlesWithVisibility]);\r\n const totalWidth = useMemo(() => articlesWithVisibility.reduce((acc, article) => acc + article.dimensions.width / DIM_NORM, 0), [articlesWithVisibility]);\r\n const centerZ = isZCentered ? maxHeight / 2 : 0;\r\n const centerY = maxDepth / 2\r\n const centerX = totalWidth / 2;\r\n // Calculate positions for all articles\r\n const articlePositions = useMemo(() => {\r\n let positionAcc = 0;\r\n return articlesWithVisibility.map((article) => {\r\n const width = article.dimensions.width / DIM_NORM;\r\n const height = article.dimensions.height / DIM_NORM;\r\n const depth = article.dimensions.depth / DIM_NORM;\r\n const x = positionAcc + width / 2 - centerX;\r\n positionAcc += width;\r\n return {\r\n articleId: article.articleId,\r\n position: [x, depth / 2, height / 2] as [number, number, number],\r\n article,\r\n index: article.index\r\n };\r\n });\r\n }, [articlesWithVisibility, centerX]);\r\n return (\r\n <>\r\n {articlePositions.map(({articleId, position, article, index}) => {\r\n if (!validNames?.has(article.name) || article.visibility === false) return null;\r\n const isSelected = selectedIndex === index;\r\n return (\r\n <GroupWrapper key={articleId} view={view} position={[0, -centerY / DIM_NORM, -centerZ / DIM_NORM]}>\r\n <ArticleDesigner\r\n article={article}\r\n articleId={articleId}\r\n position={position}\r\n isSelected={isSelected}\r\n onSelect={() => onArticleSelect?.(index)}\r\n view={view}\r\n debugMode={debugMode}\r\n />\r\n </GroupWrapper>\r\n );\r\n })}\r\n </>\r\n );\r\n}","import type {ArticleData} from \"../../types/data.types.tsx\";\nimport {useAPI} from \"../../hooks/useAPI.ts\";\nimport {api} from \"../../services/ApiFactory.ts\";\nimport {DataProvider} from \"../../contexts/article-data/DataProvider.tsx\";\nimport {VariableProvider} from \"../../variables/VariableProvider.tsx\";\nimport {DescriptorProvider} from \"../../contexts/descriptor/DescriptorProvider.tsx\";\nimport {MatSurfProvider} from \"../../contexts/mat-surf/MatSurfProvider.tsx\";\nimport {ErrorDisplay, LoadingIndicator} from \"../ui/LoadingIndicator.tsx\";\nimport type {CanvasProps} from \"../../types/canvas.types.tsx\";\nimport {useCallback, useMemo} from \"react\";\nimport {ArticleGroupLayout} from \"./ArticleGroupLayout.tsx\";\nimport {VIEW} from \"../../types/view.types.ts\";\n\nexport default function ArticleGroupDesigner({view = VIEW._3D, data, articleList, debugMode = false, isZCentered = false, selectedIndex, onArticleSelect}: CanvasProps) {\n // Memoize article names and stable key FIRST (before any conditional returns)\n console.log(articleList)\n const articleNames = useMemo(() => articleList?.map(article => article.name) ?? [],\n [articleList]\n );\n\n const articleNamesKey = useMemo(() => articleNames.join(','),\n [articleNames]\n );\n\n // Memoize fetch function\n const fetchArticleData = useCallback(async () => {\n const result = await api.articleData().fetchBulk(articleNames);\n if (!result) throw new Error('Failed to fetch article data');\n return result;\n }, [articleNamesKey]); // Use stable key instead of array\n\n // Fetch data only if not provided and we have articles\n const shouldFetch = !data && articleNames.length > 0;\n const {data: apiData, loading, error} =useAPI<ArticleData>(fetchArticleData, [articleNamesKey], !shouldFetch);\n\n const finalData = data ?? apiData;\n\n // console.log('final data => ',finalData)\n // Memoize derived data\n const validArticleNames = useMemo(\n () => finalData ? new Set(finalData.anglprim.map(v => v.NAME)) : new Set<string>(),\n [finalData]\n );\n\n const materials = useMemo(() => finalData?.materials ?? [],\n [finalData]\n );\n\n const surfaces = useMemo(() => finalData?.surfaces ?? [],\n [finalData]\n );\n\n // Early returns for error states\n if (!articleList?.length) return <ErrorDisplay error=\"No articles provided\" insideCanvas={true}/>;\n if (!data && loading) return <LoadingIndicator message=\"Loading article data...\" view={view}/>\n if (!data && error) return <ErrorDisplay error={error.toString()} insideCanvas={true}/>;\n if (!finalData) return <ErrorDisplay error=\"No article data available\" insideCanvas={true}/>;\n\n\n return (\n <DataProvider names={articleNames} data={finalData}>\n <MatSurfProvider initialMaterials={materials} initialSurfaces={surfaces}>\n <VariableProvider imosVariables={finalData.variables}>\n <DescriptorProvider descriptorData={finalData.descriptors}>\n <ArticleGroupLayout articleList={articleList} validNames={validArticleNames} view={view} debugMode={debugMode} isZCentered={isZCentered} selectedIndex={selectedIndex} onArticleSelect={onArticleSelect}/>\n </DescriptorProvider>\n </VariableProvider>\n </MatSurfProvider>\n </DataProvider>\n );\n}","/**\n * @package @your-org/article-designer\n * Main entry point for the Article Designer package\n *\n * 3D Article Designer for furniture visualization using React Three Fiber\n */\n\n// ============================================================================\n// MAIN COMPONENTS\n// ============================================================================\n/**\n * ArticleGroupDesigner - Main component with all providers included\n * This is the recommended entry point\n */\nexport { default as ArticleGroupDesigner } from './components/article_designer/ArticleGroupDesigner.tsx';\n\n/**\n * ArticleDesigner - Single article renderer (new architecture)\n */\nexport { ArticleDesigner } from './components/article_designer/ArticleDesigner.tsx';\n\n/**\n * ArticleGroupLayout - Multi-article layout manager\n */\nexport { ArticleGroupLayout } from './components/article_designer/ArticleGroupLayout.tsx';\n\n/**\n * Designer - Core designer component without providers\n */\nexport { default as Designer } from './components/article_designer/Designer';\n\n/**\n * Zone component\n */\nexport { default as Zone } from './components/article_designer/Zone';\n\n// ============================================================================\n// CONTEXT PROVIDERS\n// ============================================================================\nexport { DimensionProvider } from './contexts/dimension/DimensionProvider.tsx'\nexport { DataProvider } from './contexts/article-data/DataProvider';\nexport { MatSurfProvider } from './contexts/mat-surf/MatSurfProvider';\nexport { ArticleRelatedVariableProvider } from './contexts/article-related-variables/ArticleRelatedVariableProvider.tsx';\nexport { VariableProvider } from './variables/VariableProvider';\nexport { DescriptorProvider } from './contexts/descriptor/DescriptorProvider';\nexport { TextureConfigProvider } from './contexts/texture/TextureConfig';\nexport { DimensionContext, type DimensionContextValue } from './contexts/dimension/DimensionContext.ts';\nexport { ArticleHoverProvider } from './contexts/article-hover/ArticleHoverProvider';\n\n// Contexts for advanced usage\nexport { DataContext } from './contexts/article-data/DataContext';\nexport { VariableContext } from './variables/VariableContext';\nexport { TextureConfigContext } from './contexts/texture/TextureConfig';\nexport { DescriptorContext } from './contexts/descriptor/DescriptorContext';\nexport { ArticleHoverContext, type ArticleHoverContextValue } from './contexts/article-hover/ArticleHoverContext';\n\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport { useVariables } from './variables/useVariables';\nexport { useDescriptorEvaluation, useDescriptorMatches } from './contexts/descriptor/useDescriptor.ts';\nexport { useData } from './contexts/article-data/useData.ts';\nexport { useDescriptorManager } from './contexts/descriptor/useDescriptorManager.ts';\nexport { ZoneDivider } from './hooks/zoneDivider.ts';\nexport { useDimensions } from './contexts/dimension/useDimensions.ts';\nexport { useArticleHover } from './contexts/article-hover/useArticleHover';\n\n\n// ============================================================================\n// UI COMPONENTS (OPTIONAL)\n// ============================================================================\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n// Main data types\nexport type { ArticleData } from './types/data.types';\nexport { VIEW } from './types/view.types';\nexport type { TextureConfigContextType } from './contexts/texture/TextureConfig';\n\n// Variable types\nexport type { ImosVariable, VAR_TYPE } from './variables/variable.types';\n\n// Export helper utilities as namespace\nexport * as VariableResolver from './variables/VariableResolver';\n\n// ============================================================================\n// VERSION\n// ============================================================================\n\nexport const VERSION = '1.0.0';\n"],"names":["useAPI","fetchFn","deps","skip","data","setData","useState","loading","setLoading","error","setError","isFirstRender","useRef","hasDataRef","useEffect","cancelled","load","result","err","CLIE_TYPE_ELEM","CLIE_TYPE_ZONE","frontTreeId","zoneID","rightTreeId","backTreeId","leftTreeId","parentId","clieTags","DIM_NORM","DEFAULT_RENDER_COLOR","BACKEND_BASE_URL","GenericAPI","endpoint","baseUrl","id","url","response","values","contentType","text","APIFactory","api","DataContext","createContext","DataProvider","children","names","staticData","editableData","setEditableData","selectedElem","setSelectedElem","hoveredElem","setHoveredElem","getArticleData","useCallback","articleName","elem","zone","prim","clie","grtx","drZone","variable","anglElems","anglZones","anglPrims","anglClies","anglGrtxs","csides","kmsList","cabins","variables","doors","drawers","drawerZones","cabbacks","useMemo","e","z","p","c","g","value","property","newValue","prev","treeid","tagname","datatype","num","name","jsx","VariableContext","VAR_TYPE","createVariableTree","imosVariables","v","getValue","varName","tree","visited","refName","setValue","newTree","resolveString","str","match","resolveRecursive","maxDepth","depth","hasVariables","missing","ref","extractVariableNames","matches","VariableProvider","setTree","setVarValue","currentTree","setValueInTree","contextValue","DescriptorContext","safeNumber","safeString","compareNumbers","left","right","compareFn","l","r","compareStrings","comparisonMap","a","b","keyMapping","resolve","input","options","variableTree","dataType","silent","allowFunctions","UNIT_PATTERN","isIfStatement","evaluateIfStatement","isMathExpression","evaluateExpression","coerceByDataType","resolveValue","expr","content","parts","splitIfParts","conditionStr","trueValueStr","falseValueStr","resultStr","evaluateCondition","current","i","char","condition","part","inner","comparisonMatch","leftStr","operator","rightStr","evaluateSide","trimmed","expressionCache","cacheKey","sanitized","normalizeKey","key","ConditionTreeEvaluator","resolveVarRecursive","node","leftValue","normalizedKey","rightValue","childResults","child","DescriptorEvaluator","descriptor","defaultNode","DescriptorManager","descriptors","desc","descriptorName","inputData","descriptorType","byType","type","DescriptorProvider","descriptorData","manager","MatSurfContext","useMatSurfs","context","useContext","MatSurfProvider","initialMaterials","initialSurfaces","materials","setMaterials","surfaces","setSurfaces","loadingMaterials","setLoadingMaterials","loadingSurfaces","setLoadingSurfaces","failedMaterials","setFailedMaterials","failedSurfaces","setFailedSurfaces","hasMaterial","m","hasSurface","s","isFetchingMaterial","isFetchingSurface","hasFailedMaterial","hasFailedSurface","materialFetchQueue","surfaceFetchQueue","isMounted","queueTrigger","setQueueTrigger","queueMaterialFetch","wasEmpty","queueSurfaceFetch","fetchMaterial","material","next","fetchSurface","surface","toFetch","VIEW","LoadingIndicator","view","loadingContent","jsxs","Html","ErrorDisplay","insideCanvas","errorContent","useVariables","get","resolveVar","has","ArticleRelatedVariableProvider","overrides","parentContext","dynamicChanges","setDynamicChanges","newChanges","useData","useClieHelper","TREEID","TAG","DATATYPE","selected_clie","item","useGrtxHelper","grtxData","zoneGrtx","zoneInfo","KmsRenderSelector","materialRender","surfaceTopRender","surfaceBottomRender","noTop","noBottom","RenderHelper","textureId","MatHelper","matSurfContext","materialName","resolvedRender","renderInfo","SurfHelper","surfaceName","KmsHelper","articleData","NAME","resolvedName","currentKms","kms","surfaceTopName","surfaceBottomName","surfaceTop","surfaceBottom","render","CSideHelper","currentCP","cside","DividerType","DividerTypeConst","ValueSourceConst","isDivider","divider","isLinearDivision","isArticle","createDivider","DIVDIR","DIVTYPE","HORDEFTYPE","LINDIV1","DIVELEM1","DIVIDER","thickness","divProps","isDescriptor","getDividedAxis","PERPENDICULAR_AXIS_MAP","getDividedLength","axis","dimensions","ElemPartType","ElemTrimType","DrawerType","TYPE_TO_HELPER","createTypeSets","mapping","helper","_","h","ElemCabinTypes","ElemCSideTypes","ElemCabBackTypes","ElemDoorTypes","DividerCabinTypes","DividerCSideTypes","DividerCabBackTypes","isCabinType","source","isCSideType","isCabBackType","isDoorType","isDrawerType","isCpDescriptor","cpName","isCpVariable","isSidePanel","cp","isBackPanel","isDoor","isShelf","isDrawer","useDescriptorEvaluation","throwOnError","descriptorExists","errorMessage","useDescriptorMatches","CabBackHelper","kmsName","DoorHelper","kmsLeft","kmsRight","CabinHelper","DrawerHelper","currentCp","front","BOTSHELF","elems","bsPdName","frPdName","bsKMS","frKMS","riKMS","bkKMS","lsKMS","UseCpDispatcher","cpType","descriptorManager","cpNameResult","cpHelper","useDescriptorManager","usePrimHelper","dimensionOverrides","current_prim","parser","DIMCALCF","SIZE","dimOverride","resolved","prim_dims","useZoneHelper","clieTopThk","clieBotThk","clieDivThk","currentZone","TOPSHELF","topShelfResult","botShelfResult","dividerResult","topShelfCP","bottomShelfCP","DividerCP","useElemHelper","currentElem","parentZoneId","parentZone","clieThickness","CPNAME","INSETFOR","INSET","STARTTRIM","BOTOFFS","TOPOFFS","ENDOFFS","STARTOFFS","ENDTRIM","TOPTRIM","BOTTRIM","PARTTYPE","thk","sourceInset","resolvedInset","inset","topThk","bottomThk","oversize","trim","elmTrimThk","EvaluationErrors","message","Scanner","_Scanner","tokens","oldestKey","lexeme","fullVariable","allowedSpecialVariables","identifier","functionType","Parser","ast","nextToken","sections","singleSection","functionName","arg","isN","evaluateBinaryExpression","expression","bothAreNumbers","sameUnit","hasRepeated","evaluateFunction","fn","evaluatedArg","evaluateVariable","Evaluator","evaluatedValue","section","result2","traverseTree","callback","DimensionReference","startPanelThk","endPanelThk","dividerThk","sizerefout1","sizerefedg1","sizerefmid","sizerefedg2","sizerefout2","accumulatedThicknesses","Calculator","totalLength","dividerThickness","dimRefProps","subSection","accumulatedIncThk","spreadMm","node2","accumulatedMmValues","accumulateMmValues","binaryExpression","restAfterN","nTimes","processNSpecialVariables","totalNDividersThickness","totalNLength","totalRatios","accumulateRatioValues","ratioUnitValue","sectionsResult","calculateSection","ratioValue","mmValue","scanner","evaluator","processLindiv","evaluationResult","LinDivPatternTransform","exactPattern","count","extractNumberFromIndependentDiv","VALID_UNITS","VALID_FUNCTIONS","isValidLinearDivision","lindiv","splitSections","isValidSection","hasBalancedBrackets","hasNumber","hasOperator","hasFunction","hasBrackets","isDimensionVar","isNFold","funcMatch","funcName","unitMatch","unit","stack","pairs","LinDivHelper","divided_length","divisionType","isReversed","divided_length_list","transformedLinDiv","unrefIndependentDiv","zone_dimensions","length","PositionHelper","parentDimensions","lengthList","childTREEIDs","startX","startY","startZ","acc","index","x","y","zone_dims","useZoneElemHelpers","getBorderThk","elemHelpers","topShelfThk","bottomShelfThk","getZoneInset","calculateZoneGeometry","dimension","borderInset","getRemainingInset","calculateRemainingZoneGeometry","zoneGeometry","bordersThk","remainingInset","calculateChildPositions","remainingDims","calculateChildPositionsFromGeometry","remainingZoneGeometry","childrenDims","GroupWrapper","position","rotation","onClick","onPointerOver","onPointerLeave","onPointerDown","onPointerMove","onPointerUp","angle","calculateMitrePoints","halfLength","halfThickness","points","Shape","ralColorsMap","getRalHexColor","ralCode","isRalColor","defaultConfig","TextureConfigContext","TextureConfigProvider","config","useTextureConfig","buildTextureUrl","renderMat","textureBaseUrl","textureFolder","textureExtension","textureSuffix","folder","textureCache","failedUrls","useMaterialLoader","renderValue","textureConfig","loadedTexture","setLoadedTexture","isLoading","setIsLoading","currentUrlRef","isGlass","ralHex","urlToLoad","loader","TextureLoader","texture","PD_3D","width","opacity","isSelected","isHovered","onPointerEnter","render_mat","meshRef","elemInfo","color","materialOpacity","effectiveColor","effectiveOpacity","geometry","shape","geo","ExtrudeGeometry","BoxGeometry","Edges","defaultRule","dimensionRules","getDimensionRules","rule","pattern","matchCPName","regexPattern","DimensionLines","height","rules","offset","lineStyle","strokeWidth","fontSize","arrowSize","positions","pos","idx","label","PD_2D","dim_x","dim_y","stroke_width","rotate","onMouseEnter","onMouseLeave","svgPath","strokeColor","effectiveStrokeWidth","fill","computeTrim","currCpSource","currCpType","currentCpTrim","joinPartSourceType","joinPartType","joinPartThk","backInset","isShortTrim","isLongTrim","updateQueue","makeQueue","raf","schedule","writeQueue","onStartQueue","onFrameQueue","onFinishQueue","timeouts","handler","ms","time","cancel","t","pendingCount","timeout","findTimeout","start","sync","lastArgs","queuedFn","throttled","args","nativeRaf","impl","update","ts","queue","loop","stop","prevTs","eachSafely","each","__defProp","__export","target","all","globals_exports","assign","colors","createStringInterpolator","skipAnimation","to","willAdvance","noop","defineHidden","obj","is","isEqual","eachProp","ctx","toArray","flush","iterator","items","flushCalls","isSSR","globals","startQueue","currentFrame","prevFrame","priority","frameLoop","animation","raf2","flushStartQueue","startSafely","advance","prevIndex","startUnsafely","findIndex","other","dt","nextFrame","arr","test","colors2","NUMBER","PERCENTAGE","call","rgb","rgba","hsl","hsla","hex3","hex4","hex6","hex8","normalizeColor","parse255","parse1","hslToRgb","parse360","parsePercentage","hue2rgb","q","int","colorToRgba","int32Color","createInterpolator","range","output","extrapolate","outputRange","inputRange","extrapolateLeft","extrapolateRight","easing","range2","findRange","interpolate","inputMin","inputMax","outputMin","outputMax","map","easings","$get","$observers","hasFluidValue","getFluidValue","getFluidObservers","callFluidObserver","observer2","event","callFluidObservers","observers","FluidValue","setFluidGetter","setHidden","addFluidObserver","removeFluidObserver","numberRegex","colorRegex","unitRegex","rgbaRegex","cssVariableRegex","variableToRgba","token","fallback","parseCSSVariable","value2","namedColorRegex","rgbaRound","p1","p2","p3","p4","createStringInterpolator2","keyframes","interpolators","output2","missingUnit","prefix","once","func","called","warnInterpolate","deprecateInterpolate","warnDirectCall","deprecateDirectCall","isAnimatedString","useIsomorphicLayoutEffect","useLayoutEffect","useIsMounted","useRef2","useForceUpdate","useOnce","effect","useEffect3","emptyDeps","usePrev","prevRef","useRef4","useEffect4","$node","isAnimated","getAnimated","owner","setAnimated","getPayload","Animated","AnimatedValue","_AnimatedValue","_value","step","done","AnimatedString","_AnimatedString","is2","goal","TreeContext","AnimatedObject","animated","payload","AnimatedArray","_AnimatedArray","makeAnimated","getAnimatedType","parentNode","is3","isAnimatedString2","withAnimated","Component","host","hasInstance","is4","forwardRef","givenProps","givenRef","instanceRef","updateRef","props","getAnimatedState","forceUpdate","instance","observer","PropsObserver","observerRef","each2","dep","usedProps","React","dependencies","createHost","components","applyAnimatedValues","createAnimatedStyle","style","getComponentProps","hostConfig","displayName","getDisplayName","is5","eachProp2","callProp","matchProp","resolveProp","prop","getDefaultProp","noopTransform","getDefaultProps","transform","keys","DEFAULT_PROPS","defaults2","RESERVED_PROPS","getForwardProps","forward","inferTo","to2","out","val","computeGoal","G","hasProps","isAsyncTo","detachRefs","ctrl","replaceRef","defaults","AnimationConfig","mergeConfig","config2","newConfig","sanitizeConfig","frequency","damping","mass","isTensionConfig","emptyArray","Animation","scheduleProps","callId","defaultProps","state","actions","reject","delay","onStart","pause","onResume","onPause","G2","getCombinedResult","results","getCancelledResult","getNoopResult","getFinishedResult","finished","runAsync","onRest","prevTo","prevPromise","preventBail","bail","bailPromise","bailIfEnded","bailSignal","bailResult","animate","arg1","arg2","BailSignal","skipAnimationSignal","SkipAnimationSignal","G3","stopAsync","props2","resume","animating","cancelId","isFrameValue","FrameValue","nextId","FluidValue2","G4","idle","$P","HAS_ANIMATED","IS_ANIMATING","IS_PAUSED","hasAnimated","isAnimating","isPaused","setActiveBit","active","setPausedBit","paused","SpringValue","getFluidValue2","getAnimated2","changed","anim","toValues","toArray2","elapsed","from","v0","velocity","precision","decay","restVelocity","bounceFactor","canBounce","isGrowing","isMoving","isBouncing","numSteps","n","springForce","dampingForce","acceleration","currVal","finalVal","raf3","isLoop","mergeActiveFn","sendEvent","checkFinished","nextProps","createLoopUpdate","hasToProp","hasFromProp","prevFrom","hasFromChanged","hasToChanged","hasAsyncTo","reset","isAnimatable","immediate","nodeType","goalType","started","hasValueChanged","ACTIVE_EVENTS","oldNode","G5","frameLoop2","callFluidObservers2","loopRet","reverse","createUpdate","findDefined","declareUpdate","update2","eachProp3","BATCHED_EVENTS","nextId2","Controller","flush3","spring","is6","toArray3","prepareKeys","flushUpdateQueue","springs","each3","eachProp4","onChange","flush2","onStart2","onChange2","onRest2","raf4","flushUpdate","onResolve","asyncTo","flushCalls2","promises","getSprings","prepareSprings","createSpring","setSprings","addFluidObserver2","create","SpringContext","SpringRef","SpringRef2","each4","is7","_getProps","useSprings","propsFn","is8","useMemo2","layoutId","updates2","springs2","ctrls","updates","prevLength","each5","declareUpdates","startIndex","endIndex","useContext2","prevContext","hasContext","useIsomorphicLayoutEffect2","cb","useSpring","isFn","is9","Interpolation","getAnimatedType2","setAnimated2","_dt","oldValue","isEqual2","getAnimated3","checkIdle","becomeIdle","inputs","is14","getFluidValue3","toArray5","each10","getPayload2","G6","raf5","frameLoop3","hasFluidValue2","addFluidObserver3","removeFluidObserver2","highest","parent","isIdle","self","callFluidObservers3","Globals","primitives","THREE","addEffect","applyProps","OVERLAP","scanNeighbors","panelMesh","scene","panelBox","Box3","panelCenter","Vector3","quaternion","Quaternion","scale","Mesh","objBox","objCenter","worldDiff","hit","absX","absY","calculateHitOversize","joinedPartType","DoorSensor","panelWidth","panelHeight","panelThk","treeId","doorCp","ddHingePosition","useThree","setOversize","hasScanned","topOversize","bottomOversize","w","offsetX","offsetY","Fragment","ArticleHoverContext","useArticleHover","getHingeConfig","hingePosition","N","nThk","DoorPanel","rotX","rotY","DoorAnimator","halfW","leftConfig","rightConfig","Left","memo","elemHlp","startElem","endElem","doorInset","startElemThk","endElemThk","startTrimThk","endTrimThk","topTrimThk","botTrimThk","mitreStartThk","mitreEndThk","panel_length","panel_width","panel_thk","pos_x","pos_y","pos_z","Back","Right","resolveWithNStar","sectionData","hasNStar","cleaned","resolveLindiv","original","isLindivReference","colonCount","format","suffix","parseLindiv","cleanExpression","finalValue","resolveLindivValue","cleanInput","ratioFirstMatch","ratio","exprRatioMatch","bracesMatch","star","ZoneDivider","matchesErrors","matchesArticles","linDivResolver","linDiv","resolvedVar","xValue","CONFIG","d","getDividerPos","LinearDividerRender","childrenPositon","cfg","showDiv","divPos","dims_3d","dims_2d","dividerId","Zone","SubArticleRender","remainingZone","VariableStore","articleId","entry","setter","existing","articles","selected","listener","variableStore","Divider","snapshot","useSyncExternalStore","subArticleName","descOpts","userSelected","Bottom","frontTrimThk","backTrimThk","leftTrimThk","rightTrimThk","Top","useDrawerZoneHelper","DrawerSensor","onset","DrFront","drElems","insetCalc","DrRight","nxtElem","frElem","nxtTrim","frTrim","drawerHeight","DrBack","prvElem","prvTrim","DrLeft","DrBottom","bkElem","bkTrim","DrZone","DrawerAnimator","drawerIndex","slideDistance","delayMs","slideNormalized","posZ","DrawerItem","drawerZoneHelper","drawerName","drawerHelper","Drawer","linDivResolved","Front","zoneHelper","borderThk","zoneInset","resolvedZone","dividerAxis","dividedLength","updatedDivider","childPositions","Highlighter","DimensionContext","useDimensions","SVG_TRANSFORM","Designer","setIsHovered","handlePointerOver","handlePointerLeave","is3D","DimensionProvider","initialDimensions","onDimensionChange","setDimension","ArticleHoverProvider","setIsHoveredState","pointerIsDown","orbitingRef","handlePointerDown","handlePointerMove","handlePointerUp","VariableBridge","ArticleDesigner","article","onSelect","debugMode","VisibilityStore","visible","visibilityStore","ArticleGroupLayout","articleList","validNames","isZCentered","selectedIndex","onArticleSelect","articlesWithIds","visibilitySnapshot","articlesWithVisibility","maxHeight","totalWidth","centerZ","centerY","centerX","articlePositions","positionAcc","ArticleGroupDesigner","articleNames","articleNamesKey","fetchArticleData","shouldFetch","apiData","finalData","validArticleNames","VERSION"],"mappings":"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","x_google_ignoreList":[48,64,65,66,67,68]}
|