@processandtools/rp-article-designer 1.0.31 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","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/helpers/GroupWrapper.tsx","../src/contexts/article/ArticleContext.ts","../src/contexts/article/ArticleProvider.tsx","../src/variables/useVariables.ts","../src/contexts/article-related-variables/ArticleRelatedVariableProvider.tsx","../src/hooks/useArticle.ts","../src/components/ui/test/LevaVariableController.tsx","../src/hooks/useData.ts","../src/helpers/angls/UseClieHelper.tsx","../src/helpers/angls/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/cabin/CabinHelper.ts","../src/helpers/angls/UseZoneHelper.tsx","../src/types/cp.types.ts","../src/construction_principle/side_panel/CSideHelper.tsx","../src/helpers/CpDispatcher.ts","../src/helpers/angls/UseElemHelper.tsx","../node_modules/imos-linear-division/dist/index.mjs","../src/helpers/LinDivPatternTransform.ts","../src/helpers/LinDivHelper.tsx","../src/helpers/PositionHelper.tsx","../src/helpers/ZoneCalculations.tsx","../src/helpers/MitreCalc.tsx","../node_modules/tslib/tslib.es6.mjs","../node_modules/react-use/esm/useMountedState.js","../node_modules/react-use/esm/useAsyncFn.js","../node_modules/react-use/esm/useAsync.js","../src/constants/RalColors.ts","../src/helpers/CheckUrlExists.ts","../src/contexts/texture/TextureConfig.tsx","../src/hooks/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/components/article_designer/zoneElems/Front.tsx","../src/components/article_designer/zoneElems/Left.tsx","../src/components/article_designer/zoneElems/Back.tsx","../src/components/article_designer/zoneElems/Right.tsx","../src/components/article_designer/zoneElems/Top.tsx","../src/components/article_designer/zoneElems/Bottom.tsx","../src/hooks/useDescriptorManager.ts","../src/hooks/useDescriptor.ts","../src/types/divider.types.ts","../src/helpers/LindivResolver.ts","../src/hooks/zoneDescriptor.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/helpers/angls/UsePrimHelper.tsx","../src/components/article_designer/Zone.tsx","../src/components/article_designer/Highlighter.tsx","../src/components/article_designer/Designer.tsx","../src/components/article_designer/ArticleDesigner.tsx","../src/components/article_designer/ArticleGroupLayout.tsx","../src/components/article_designer/ArticleGroupDesigner.tsx","../src/components/ui/controls/VarController.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\n// export const BACKEND_BASE_URL = 'http://localhost:3018'\r\nexport 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> {\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 response.json();\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> {\r\n const url = `${this.baseUrl}/${this.endpoint}/bulk`;\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 response.json();\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 {DataProviderProps, AnglPrim, AnglZone, AngleElem, AnglClie, AnglGrtx} 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\";\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 cside: CsideTypes[];\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 // Note: csides and cabins are shared construction principles, not article-specific\n // Return all of them - they'll be referenced by article parts\n csides: editableData.cside || [],\n cabins: editableData.cabin || [],\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} = 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 // 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 csides: editableData.cside || [],\n cabins: editableData.cabin || [],\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 csides: editableData.cside || [],\n kmsList: editableData.kms || [],\n cabins: editableData.cabin || [],\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 // Construction principle data\n csides,\n kmsList,\n cabins,\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\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 let unit: string | undefined;\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.)\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 // 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 if (wasEmpty) setQueueTrigger(prev => prev + 1);\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 if (wasEmpty) setQueueTrigger(prev => prev + 1);\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 * 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 { VIEW } from \"../types/view.types.ts\";\nimport type { FC, ReactNode } from \"react\";\nimport {DIM_NORM} from \"../constants/Constants.tsx\";\n\ninterface GroupWrapperProps {\n view: VIEW;\n position?: [number, number, number];\n rotation?: [number, number, number];\n children?: ReactNode;\n onClick?: () => void;\n}\n\nconst GroupWrapper: FC<GroupWrapperProps> = ({ view=VIEW._3D, position=[0,0,0], rotation=[0,0,0], children, onClick }) => {\n if (view === VIEW._3D) {\n return (\n <group\n position={[position[0], position[1], position[2]]}\n rotation={rotation}\n onClick={onClick}\n onPointerOver={(e) => {\n if (onClick) {\n e.stopPropagation();\n document.body.style.cursor = 'pointer';\n }\n }}\n onPointerOut={() => {\n if (onClick) {\n document.body.style.cursor = 'default';\n }\n }}>\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[2] * (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 { createContext } from 'react';\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\n\nexport interface ArticleContextType {\n articleName: string;\n articleId?: string; // Unique identifier (name + index)\n dimensionOverrides?: Partial<DimensionProps>;\n}\n\nexport const ArticleContext = createContext<ArticleContextType | null>(null);\n","import type { ReactNode } from 'react';\nimport { ArticleContext } from './ArticleContext.ts';\nimport type { ArticleContextType } from './ArticleContext.ts';\n\ninterface ArticleProviderProps extends ArticleContextType {\n children: ReactNode;\n}\n\nexport function ArticleProvider({ children, articleName, articleId, dimensionOverrides }: ArticleProviderProps) {\n const value = {\n articleName,\n articleId,\n dimensionOverrides,\n };\n\n return (\n <ArticleContext.Provider value={value}>\n {children}\n </ArticleContext.Provider>\n );\n}\n","import { useContext, useMemo } from 'react';\nimport { VariableContext } from './VariableContext.tsx';\nimport { getValue, resolveString, hasVariables } 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 resolve = useMemo(() => (str: string) => resolveString(str, tree), [tree]);\n\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 resolveString: resolve, // Resolve string with variables\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}","import { useContext } from 'react';\nimport { ArticleContext } from '../contexts/article/ArticleContext.ts';\n\nexport function useArticle() {\n const context = useContext(ArticleContext);\n\n if (!context) {\n throw new Error('useArticle must be used within an ArticleProvider');\n }\n\n return context;\n}\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 {useArticle} from \"../../../hooks/useArticle.ts\";\r\n\r\nexport function LevaVariableController() {\r\n const {tree, setVarValue, getValue} = useVariables();\r\n const {articleName, articleId} = useArticle();\r\n const updatingFromTreeRef = 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 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 = typeof currentValue === 'number' ? currentValue : Number(currentValue) || 0;\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]);\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 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 // 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]); // Add dependencies\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 '../contexts/article-data/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 \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\n\r\nexport default function useClieHelper(TREEID:string, TAG:string, DATATYPE:number){\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n\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 \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function useGrtxHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {resolveString} = useVariables()\r\n const {articleName} = useArticle();\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}`, resolveString(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}","// Pure helper function - no hooks\r\n// Accepts already-resolved textureId value\r\nexport default function RenderHelper(textureId?: string) {\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 from \"../render/RenderHelper.tsx\";\r\nimport {useMatSurfs} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function MatHelper(materialName:string) {\r\n const {materials, queueMaterialFetch, isFetchingMaterial, hasMaterial, hasFailedMaterial} = useMatSurfs()\r\n const {resolveString} = useVariables()\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 = resolveString(material?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...material, renderInfo}\r\n}","import RenderHelper from \"../render/RenderHelper.tsx\";\r\nimport {useMatSurfs} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function SurfHelper(surfaceName:string) {\r\n const {surfaces, queueSurfaceFetch, isFetchingSurface, hasSurface, hasFailedSurface} = useMatSurfs()\r\n const {resolveString} = useVariables()\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 = resolveString(surface?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...surface,renderInfo}\r\n}\r\n","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {KmsRenderSelector} from \"./KmsRenderSelector.ts\";\r\nimport MatHelper from \"../material/MatHelper.ts\";\r\nimport SurfHelper from \"../surface/SurfHelper.ts\";\r\n\r\n\r\n\r\nexport default function useKmsHelper(NAME: string) {\r\n const {kmsList} = useData()\r\n const {resolveString} = useVariables()\r\n const currentKms = kmsList.find((kms) => kms.NAME === NAME)\r\n if (!currentKms) {\r\n console.warn(`KMS ${NAME} not found`)\r\n return undefined\r\n }\r\n const materialName = resolveString(currentKms?.MATERIAL || '')\r\n const surfaceTopName = resolveString(currentKms?.SURF0 || '')\r\n const surfaceBottomName = resolveString(currentKms?.SURF1 || '')\r\n\r\n const material = MatHelper(materialName)\r\n const surfaceTop = SurfHelper(surfaceTopName)\r\n const surfaceBottom = SurfHelper(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 : currentKms?.NAME,\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 {useData} from \"../../hooks/useData.ts\";\r\nimport KmsHelper from \"../kms/KmsHelper.tsx\";\r\n\r\nexport default function CabinHelper(NAME: string) {\r\n const {cabins} = useData()\r\n const cabin = cabins.find((cside) => cside.NAME === NAME)\r\n if (!cabin) {return undefined}\r\n const kmsName = cabin.KMS\r\n const kms = KmsHelper(kmsName || '')\r\n return {\r\n kms,\r\n }\r\n}","import {CLIE_TYPE_ZONE, clieTags} from \"../../constants/Constants.tsx\";\r\nimport {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport useGrtxHelper from \"./UseGrtxHelper.tsx\";\r\nimport CabinHelper from \"../../construction_principle/cabin/CabinHelper.ts\";\r\n\r\n/**\r\n * ZoneHelper - Provides zone data and thickness calculations\r\n *\r\n * Note: Calculation logic has been moved to ZoneCalculations.tsx\r\n * This helper now focuses on data retrieval and thickness lookups only\r\n */\r\nexport function useZoneHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n\r\n // Get data for this specific article\r\n const {anglZones} = 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\r\n return {\r\n // Zone data\r\n currentZone,\r\n children,\r\n\r\n // Shelf properties\r\n get topShelfCP() {\r\n const res = CabinHelper(currentZone.TOPSHELF)\r\n return res\r\n },\r\n get bottomShelfCP() {\r\n return CabinHelper(currentZone.BOTSHELF);\r\n },\r\n zoneInfo() {\r\n return useGrtxHelper(TREEID)?.zoneInfo;\r\n },\r\n\r\n // Thickness calculations\r\n getThk(TREEID: string, TAGNAME: string, CPNAME: string): number {\r\n return CPNAME === \"\" ? 0 : useClieHelper(TREEID, TAGNAME, CLIE_TYPE_ZONE)?.thickness ?? CabinHelper(CPNAME)?.kms.thk ?? 0;\r\n },\r\n get topShelfThk() {\r\n return this.getThk(TREEID, clieTags.IAC_TOPSHELFTHICKNESS, currentZone.TOPSHELF);\r\n },\r\n get bottomShelfThk() {\r\n return this.getThk(TREEID, clieTags.IAC_BOTTOMSHELFTHICKNESS, currentZone.BOTSHELF);\r\n },\r\n get dividerThk() {\r\n return this.getThk(TREEID, clieTags.IAC_THICKNESS, currentZone.DIVIDER);\r\n }\r\n };\r\n}\r\n","// Construction Principle Type Codes (from PARTTYPE field in AnglElem)\r\nexport enum CPTypeCode {\r\n SidePanel = 'S',\r\n Door = 'D',\r\n Back = 'B',\r\n Shelf = 'H',\r\n}\r\n\r\n// Construction Principle Type Names (human-readable)\r\nexport enum CPTypeName {\r\n SidePanel = 'side_panel',\r\n Door = 'door',\r\n Back = 'back',\r\n Shelf = 'shelf',\r\n}\r\n\r\n// Map from code to name\r\nexport const CP_TYPE_MAP: Record<CPTypeCode, CPTypeName> = {\r\n [CPTypeCode.SidePanel]: CPTypeName.SidePanel,\r\n [CPTypeCode.Door]: CPTypeName.Door,\r\n [CPTypeCode.Back]: CPTypeName.Back,\r\n [CPTypeCode.Shelf]: CPTypeName.Shelf,\r\n};\r\n\r\n","import {useData} from \"../../hooks/useData.ts\";\r\nimport KmsHelper from \"../kms/KmsHelper.tsx\";\r\n\r\nexport default function CSideHelper(NAME:string){\r\n const {csides} = useData()\r\n const sidePanel = csides.find((cside) => cside.NAME === NAME)\r\n if (!sidePanel) {\r\n console.warn(`CSide '${NAME}' not found` )\r\n return undefined\r\n }\r\n const kms = KmsHelper(sidePanel.KMS)\r\n return {\r\n ...sidePanel,\r\n kms,\r\n }\r\n}","import {CPTypeCode} from \"../types/cp.types.ts\";\r\nimport CSideHelper from \"../construction_principle/side_panel/CSideHelper.tsx\";\r\n\r\nexport default function CpDispatcher(CpName:string, PartType:CPTypeCode){\r\n\r\n console.log('cpNAME ==> ',CpName)\r\n if (PartType === CPTypeCode.SidePanel && CpName != '') return CSideHelper(CpName);\r\n}","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.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 CpDispatcher from \"../CpDispatcher.ts\";\r\n\r\nexport function useElemHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n const {resolveString} = useVariables()\r\n const {anglElems} = getArticleData(articleName);\r\n\r\n const currentElem = anglElems.find((item) => item.TREEID === TREEID);\r\n const parentZoneId = parentId(TREEID);\r\n const parentZone = useZoneHelper(parentZoneId);\r\n\r\n const clieThickness = useClieHelper(TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ELEM);\r\n let sidePanel = undefined\r\n if (currentElem && currentElem.CPNAME != '')\r\n sidePanel = CpDispatcher(currentElem.CPNAME,currentElem.PARTTYPE)\r\n\r\n if (!currentElem) return null;\r\n\r\n // Calculate everything ONCE, return as values\r\n const thk = currentElem.CPNAME === '' ? 0 : clieThickness?.thickness ?? sidePanel?.kms?.thk ?? 0;\r\n\r\n const resolvedInset = currentElem.CPNAME === \"\" ? 0 : currentElem.INSETFOR !== \"\" ? resolveValue(resolveString(currentElem.INSETFOR)) : Number(currentElem.INSET);\r\n const inset = (typeof resolvedInset === 'string' ? 0 : resolvedInset) || 0;\r\n\r\n const color = currentElem.MANINFO || \"black\";\r\n const CPNAME = currentElem.CPNAME;\r\n const topThk = parentZone?.topShelfThk || 0;\r\n const bottomThk = parentZone?.bottomShelfThk || 0;\r\n\r\n const oversize = {\r\n start: Number(currentElem.STARTOFFS) || 0,\r\n end: Number(currentElem.ENDOFFS) || 0,\r\n top: Number(currentElem.TOPOFFS) || 0,\r\n bottom: Number(currentElem.BOTOFFS) || 0\r\n };\r\n\r\n const trim = {\r\n start: currentElem.STARTTRIM,\r\n end: currentElem.ENDTRIM,\r\n top: currentElem.TOPTRIM,\r\n bottom: currentElem.BOTTRIM\r\n };\r\n\r\n const elmTrimThk = {\r\n top: trim.top === 'S' ? topThk : 0,\r\n bottom: trim.bottom === 'S' ? bottomThk : 0\r\n };\r\n\r\n // Return all values (no getters)\r\n return {\r\n TREEID,\r\n sidePanel,\r\n thk,\r\n inset,\r\n color,\r\n CPNAME,\r\n topThk,\r\n bottomThk,\r\n oversize,\r\n trim,\r\n elmTrimThk\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 = 0;\n const accumulateMmValues = (node) => {\n if (dividerThickness) {\n if (node.type === \"Section\") {\n accumulatedMmValues += dividerThickness;\n }\n }\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 + dividerThickness;\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}","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\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) // 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 divided_length_list = processLindiv(transformedLindiv, divided_length, dividerThickness)\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' && (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 \"./angls/UseElemHelper.tsx\";\nimport {backTreeId, frontTreeId, leftTreeId, rightTreeId} from \"../constants/Constants.tsx\";\nimport type {ChildrenDimsResult, DimensionProps, PositionHelperResult} from \"../types/zone.types.tsx\";\nimport type {DividerMode} from \"../types/divider.types.ts\";\nimport type {AnglZone} from \"../types/data.types.tsx\";\nimport LinDivHelper from \"./LinDivHelper.tsx\";\nimport PositionHelper from \"./PositionHelper.tsx\";\n\nexport function useZoneElemHelpers(TREEID: string) {\n return {\n front: useElemHelper(frontTreeId(TREEID)),\n left: useElemHelper(leftTreeId(TREEID)),\n right: useElemHelper(rightTreeId(TREEID)),\n back: useElemHelper(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}\n\nexport function getTopTrimThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, bordersThk: ReturnType<typeof getBorderThk>){\n return {\n left: elemHelpers.left?.trim.top !== 'S' ? bordersThk.left : 0,\n right: elemHelpers.right?.trim.top !== 'S' ? bordersThk.right : 0,\n front: elemHelpers.front?.trim.top !== 'S' ? bordersThk.front : 0,\n back: elemHelpers.back?.trim.top !== 'S' ? bordersThk.back : 0\n };\n}\n\nexport function getBottomTrimThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, bordersThk: ReturnType<typeof getBorderThk>){\n return {\n left: elemHelpers.left?.trim.bottom !== 'S' ? bordersThk.left : 0,\n right: elemHelpers.right?.trim.bottom !== 'S' ? bordersThk.right : 0,\n front: elemHelpers.front?.trim.bottom !== 'S' ? bordersThk.front : 0,\n back: elemHelpers.back?.trim.bottom !== 'S' ? bordersThk.back : 0\n };\n}\n\nexport function getZoneBorders(elemHelpers: ReturnType<typeof useZoneElemHelpers>, topShelfThk: number, bottomShelfThk: number) {\n const bordersThk = getBorderThk(elemHelpers, topShelfThk, bottomShelfThk)\n const topTrimThk = getTopTrimThk(elemHelpers, bordersThk)\n const bottomTrimThk = getBottomTrimThk(elemHelpers, bordersThk)\n\n return { bordersThk, topTrimThk, bottomTrimThk };\n}\n\nexport function getBorderInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n front: elemHelpers.front?.inset || 0,\n right: elemHelpers.right?.inset || 0,\n back: elemHelpers.back?.inset || 0,\n left: elemHelpers.left?.inset || 0\n };\n}\n\nexport function calculateZoneGeometry(dimension: DimensionProps, borderInset: ReturnType<typeof getBorderInset>) {\n\n return {\n dimensions: {\n width: dimension.width - borderInset.left - borderInset.right,\n height: dimension.height,\n depth: dimension.depth - borderInset.front - borderInset.back,\n },\n position: {\n x: borderInset.left / 2 - borderInset.right / 2,\n y: borderInset.front / 2 - borderInset.back / 2,\n z: 0\n }\n };\n}\n\nexport function calculateRemainingZoneGeometry(zoneGeometry: ReturnType<typeof calculateZoneGeometry>, bordersThk: ReturnType<typeof getBorderThk>) {\n return {\n dimensions: {\n width: zoneGeometry.dimensions.width - bordersThk.left - bordersThk.right,\n height: zoneGeometry.dimensions.height - bordersThk.top - bordersThk.bottom,\n depth: zoneGeometry.dimensions.depth - bordersThk.front - bordersThk.back\n },\n position: {\n x:bordersThk.left / 2 - bordersThk.right / 2,\n y:bordersThk.front / 2 - bordersThk.back / 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, childrenDims: ChildrenDimsResult, dividerThk: number, childTREEIDs: string[]): PositionHelperResult {\n return childrenDims.divisionType\n ? PositionHelper({\n divisionType: childrenDims.divisionType,\n parentDimensions: remainingDims,\n lengthList: childrenDims.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,\n dividerThk,\n childTREEIDs\n );\n}\n\n// ============================================================================\n// COMPLETE ZONE CALCULATION PIPELINE\n// ============================================================================\n\nexport interface ZoneCalculationParams {\n TREEID: string;\n dimension: DimensionProps;\n topShelfThk: number;\n bottomShelfThk: number;\n dividerThk: number;\n linDiv: string;\n updatedDivider?: DividerMode;\n children: AnglZone[];\n elemHelpers: ReturnType<typeof useZoneElemHelpers>; // Pre-calculated from component\n}\n\nexport interface ZoneCalculationResult {\n elemHelpers: ReturnType<typeof useZoneElemHelpers>;\n bordersThk: ReturnType<typeof getZoneBorders>['bordersThk'];\n topTrimThk: ReturnType<typeof getZoneBorders>['topTrimThk'];\n bottomTrimThk: ReturnType<typeof getZoneBorders>['bottomTrimThk'];\n borderInset: ReturnType<typeof getBorderInset>;\n zoneGeometry: ReturnType<typeof calculateZoneGeometry>;\n remainingZone: ReturnType<typeof calculateRemainingZoneGeometry>;\n childPositions?: PositionHelperResult;\n}\n","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}","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\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","const existenceCache = new Map<string, boolean>();\r\nexport async function CheckUrlExists(url: string): Promise<boolean> {\r\n if (existenceCache.has(url)) {\r\n return existenceCache.get(url)!;\r\n }\r\n\r\n try {\r\n const response = await fetch(url, { method: 'HEAD' });\r\n\r\n if (response.ok) {\r\n existenceCache.set(url, true);\r\n return true;\r\n }\r\n\r\n // Fallback to GET if HEAD not supported\r\n const abortController = new AbortController();\r\n const getResponse = await fetch(url, {\r\n method: 'GET',\r\n signal: abortController.signal\r\n });\r\n abortController.abort();\r\n\r\n const exists = getResponse.ok;\r\n existenceCache.set(url, exists);\r\n return exists;\r\n } catch {\r\n return false; // Don't cache failures\r\n }\r\n}","import { createContext, useContext, 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 { useLoader } from \"@react-three/fiber\";\nimport { TextureLoader, Texture } from \"three\";\nimport { useAsync } from \"react-use\";\nimport { useMemo } from \"react\";\nimport { isRalColor, getRalHexColor } from \"../constants/RalColors\";\nimport { DEFAULT_RENDER_COLOR } from \"../constants/Constants.tsx\";\nimport {CheckUrlExists} from \"../helpers/CheckUrlExists.ts\";\nimport { useTextureConfig, buildTextureUrl } from \"../contexts/texture/TextureConfig.tsx\";\n\nconst PLACEHOLDER_TEXTURE_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\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\n // Check for glass material - handle it early and return directly\n const isGlass = useMemo(() =>\n renderValue?.toLowerCase().includes('glass') ?? false,\n [renderValue]\n );\n\n const ralHex = useMemo(() =>\n renderValue && isRalColor(renderValue) ? getRalHexColor(renderValue) : null,\n [renderValue]\n );\n\n const { value: textureExists, loading: checkingTexture } = useAsync(async () => {\n if (!renderValue || ralHex || isGlass) return false;\n const url = buildTextureUrl(renderValue, textureConfig);\n return await CheckUrlExists(url);\n }, [renderValue, ralHex, isGlass, textureConfig]);\n\n const urlToLoad = useMemo(() => {\n if (ralHex || !renderValue || checkingTexture || !textureExists || isGlass) {\n return PLACEHOLDER_TEXTURE_URL;\n }\n return buildTextureUrl(renderValue, textureConfig);\n }, [ralHex, renderValue, textureExists, checkingTexture, isGlass, textureConfig]);\n\n const texture = useLoader(TextureLoader, 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 // Loading or no value\n if (!renderValue || checkingTexture || textureExists === undefined) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: checkingTexture || textureExists === undefined\n };\n }\n\n // Texture found\n if (textureExists) {\n return { texture, color: null, type: 'texture', isLoading: false };\n }\n\n // Texture not found\n return { texture: null, color: DEFAULT_RENDER_COLOR, type: 'fallback', isLoading: false };\n}","import {memo, 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 \"../../hooks/useMaterialLoader.ts\";\r\nimport {Edges} from \"@react-three/drei\";\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}\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 }: 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\r\n geometry={geometry} onClick={onClick} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\r\n <meshStandardMaterial map={texture} color={effectiveColor} opacity={effectiveOpacity} transparent={effectiveOpacity < 1}/>\r\n <Edges color={isSelected ? '#ff6b00' : isHovered ? '#0066ff' : '#2c2929'} />\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 type {ElemHelperType} from \"../../types/helper.types.ts\";\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 cp?: ElemHelperType\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 cp,\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 = cp?.CPNAME ? getDimensionRules(cp.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 {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Front({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.front;\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!elemHlp || !context ) return\n const render_mat = elemHlp.sidePanel?.kms?.render\n console.log(elemHlp)\n\n const {CPNAME} = elemHlp\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\n const {elmTrimThk} = elemHlp\n const startElemThk = helper.left?.thk\n const endElemThk = helper.right?.thk\n\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\n\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\n const panel_thk = elemHlp.thk\n\n const pos_x = -(elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_z = (elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/2)\n const pos_y = -(dimension.depth / 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={[Math.PI / 2, 0, 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={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cp={helper.front}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\r\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport default function Left({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.left;\r\n const context = useContext(DataContext);\r\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\r\n\r\n if (!elemHlp || !context ) return\r\n const render_mat = elemHlp.sidePanel?.kms?.render\r\n\r\n\r\n const {CPNAME} = elemHlp\r\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\r\n const {elmTrimThk} = elemHlp\r\n const startElemThk = helper.back?.thk\r\n const endElemThk = helper.front?.thk\r\n\r\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\r\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\r\n\r\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\r\n const panel_thk = elemHlp.thk\r\n\r\n const pos_x = -(dimension.width / 2 - panel_thk / 2)\r\n const pos_y = (elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/2\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 <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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onPointerEnter={handleMouseEnter}\r\n // onPointerLeave={handleMouseLeave}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onMouseEnter={handleMouseEnter}\r\n // onMouseLeave={handleMouseLeave}\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 />\r\n </g>\r\n )\r\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Back({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.back;\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!elemHlp || !context ) return\n const render_mat = elemHlp.sidePanel?.kms?.render\n\n\n const {CPNAME} = elemHlp\n if (!CPNAME || CPNAME.includes('EMPTY') ) return null;\n const {elmTrimThk} = elemHlp\n const startElemThk = helper.right?.thk\n const endElemThk = helper.left?.thk\n\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\n\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\n const panel_thk = elemHlp.thk\n\n const pos_x = (elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_y = dimension.depth / 2 - panel_thk / 2\n const pos_z = elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/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 <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\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 treeId={TREEID}\n rotate={180}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cp={helper.back}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\r\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport default function Right({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.right;\r\n const context = useContext(DataContext);\r\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\r\n\r\n if (!elemHlp || !context ) return\r\n const render_mat = elemHlp.sidePanel?.kms?.render\r\n\r\n\r\n const {CPNAME} = elemHlp\r\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\r\n const {elmTrimThk} = elemHlp\r\n const startElemThk = helper.front?.thk\r\n const endElemThk = helper.back?.thk\r\n\r\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\r\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\r\n\r\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\r\n const panel_thk = elemHlp.thk\r\n\r\n const pos_x = (dimension.width / 2 - panel_thk / 2)\r\n const pos_y = -(elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = elemHlp.oversize.bottom / 2 + elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/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 <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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onPointerEnter={handleMouseEnter}\r\n // onPointerLeave={handleMouseLeave}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onMouseEnter={handleMouseEnter}\r\n // onMouseLeave={handleMouseLeave}\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 />\r\n </g>\r\n )\r\n}","import {useContext} from \"react\";\nimport {useZoneHelper} from \"../../../helpers/angls/UseZoneHelper.tsx\";\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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\n// Top edge in front view - uses front element data but positioned at top\nexport default function Top({TREEID, dimension, view, helper}: ElemProps) {\n const zoneHlp = useZoneHelper(TREEID)\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!zoneHlp || !context) return\n const render_mat = zoneHlp.topShelfCP?.kms?.render\n\n const {topShelfCP} = zoneHlp\n if (!topShelfCP || topShelfCP.kms?.name?.includes('EMPTY')) return\n\n const frontTrimThk = (helper.front?.trim.top !== 'S' ? helper.front?.thk : 0) ?? 0\n const backTrimThk = (helper.back?.trim.top !== 'S' ? helper.back?.thk : 0) ?? 0\n const leftTrimThk = (helper.left?.trim.top !== 'S' ? helper.left?.thk : 0) ?? 0\n const rightTrimThk = (helper.right?.trim.top !== 'S' ? helper.right?.thk : 0) ?? 0\n\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = zoneHlp.topShelfThk\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 // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n render_mat={render_mat}\n />\n </g>\n )\n}\n","import {useContext} from \"react\";\nimport {useZoneHelper} from \"../../../helpers/angls/UseZoneHelper.tsx\";\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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Bottom({TREEID, dimension, view, helper}: ElemProps) {\n const zoneHlp = useZoneHelper(TREEID)\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!zoneHlp || !context) return\n const render_mat = zoneHlp.bottomShelfCP?.kms?.render\n\n\n\n const {bottomShelfCP} = zoneHlp\n if (!bottomShelfCP || bottomShelfCP?.kms?.name?.includes('EMPTY')) return\n const frontTrimThk = (helper.front?.trim.bottom !== 'S' ? helper.front?.thk : 0) ?? 0\n const backTrimThk = (helper.back?.trim.bottom !== 'S' ? helper.back?.thk : 0) ?? 0\n const leftTrimThk = (helper.left?.trim.bottom !== 'S' ? helper.left?.thk : 0) ?? 0\n const rightTrimThk = (helper.right?.trim.bottom !== 'S' ? helper.right?.thk : 0) ?? 0\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = zoneHlp.bottomShelfThk\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 // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n render_mat={render_mat}\n />\n </g>\n )\n}","import { useContext } from 'react';\nimport { DescriptorContext } from '../contexts/descriptor/DescriptorContext.ts';\nimport type { DescriptorManager } from '../descriptor/services/DescriptorManager';\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","/*\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';\nimport type {DescriptorEvaluationResult, DescriptorNode,} from '../descriptor/types/descriptor.types';\nimport type { DescriptorTypeValue } from '../descriptor/types/descriptor-data.types';\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,\n inputData: Record<string, unknown>,\n options: UseDescriptorOptions = {},\n variableTree: VariableTree\n): UseDescriptorResult<T> {\n const { throwOnError = false } = options;\n\n if (!manager.hasDescriptor(descriptorName)) {throw new Error(`Descriptor ${descriptorName} not found`)}\n\n return useMemo(() => {\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]);\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 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\nexport type DividerType = 'A' | 'B' | 'C' | 'D' | 'F' | 'P' | 'S' | 'T' | 'V'\ntype DividerProps = Pick<AnglZone, '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 TREEID:string\n DIVDIR: DivisionDirection;\n DIVTYPE: DividerType;\n HORDEFTYPE: HorizontalDefType;\n LINDIV1: string; // Linear division formula\n DIVELEM1: number; // Division element ID\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 DIVIDER: '';\n formula: string; // The LINDIV1 value (e.g., \"1:1:1\")\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 DIVIDER: '';\n descriptorName: string; // Extracted descriptor name (without #)\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 DIVIDER: string;\n articleName: string; // e.g., \"TEST_OAL_ART_SUB_001\"\n}\n\n// Article - Descriptor Reference\nexport interface ArticleDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n DIVIDER: string;\n descriptorName: string; // e.g., \"ARTICLE_SELECTOR\" (without #)\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 TREEID:string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n formula:string,\n thickness: number,\n ): LinearDivisionString {\n return {\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: '',\n formula,\n thickness,\n };\n },\n\n // Create a linear division with descriptor reference\n // Create linear division with descriptor reference\n linearDivisionDescriptor(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n descriptorName: string,\n thickness: number,\n ): LinearDivisionDescriptor {\n return {\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: '',\n descriptorName,\n thickness,\n };\n },\n\n\n // Create an article divider\n // Create article with direct name string\n articleString(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n articleName: string\n ): ArticleString {\n return {\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: articleName,\n articleName,\n };\n },\n\n // Create article with descriptor reference\n articleDescriptor(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n descriptorName: string\n ): ArticleDescriptor {\n return {\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: descriptorName,\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\n // ========== ARTICLE DIVIDER ==========\n if (divProps.DIVDIR === 'A') {\n // Article with descriptor reference\n if (isDescriptor(divProps.DIVIDER)) {\n const descriptorName = divProps.DIVIDER.replace('#', '').trim();\n return createDivider.articleDescriptor(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n descriptorName\n );\n }\n\n // Article with direct name string\n return createDivider.articleString(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER\n );\n }\n\n // ========== LINEAR DIVISION ==========\n // Linear division with descriptor reference\n if (isDescriptor(divProps.LINDIV1)) {\n const descriptorName = divProps.LINDIV1.replace('#', '').trim();\n return createDivider.linearDivisionDescriptor(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n descriptorName,\n thickness\n );\n }\n\n // Linear division with direct formula string\n return createDivider.linearDivisionString(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.LINDIV1,\n thickness\n );\n },\n};\n\n// Get the article name (direct or needs evaluation)\nexport function getArticleName(divider: DividerMode): string | undefined {\n if (isArticle.string(divider)) {\n return divider.articleName;\n }\n return undefined;\n}\n\n// Get the article descriptor name (if it needs evaluation)\nexport function getArticleDescriptorName(divider: DividerMode): string | undefined {\n if (isArticle.descriptor(divider)) {\n return divider.descriptorName;\n }\n return undefined;\n}\n\n// Get the linear division formula (direct or needs evaluation)\nexport function getFormula(divider: DividerMode): string | undefined {\n if (isLinearDivision.string(divider)) {\n return divider.formula;\n }\n return undefined;\n}\n\n// Get the linear division descriptor name (if it needs evaluation)\nexport function getLinearDescriptorName(divider: DividerMode): string | undefined {\n if (isLinearDivision.descriptor(divider)) {\n return divider.descriptorName;\n }\n return undefined;\n}\n\n// Check if divider needs descriptor evaluation\nexport function needsDescriptorEvaluation(divider: DividerMode): boolean {\n return divider.valueSource === ValueSourceConst.DESCRIPTOR;\n}\n\n// Get descriptor name (works for both article and linear division)\nexport function getDescriptorName(divider: DividerMode): string | undefined {\n if (divider.valueSource === ValueSourceConst.DESCRIPTOR) {\n return divider.descriptorName;\n }\n return undefined;\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}","// ============================================================================\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* - handle specially\n if (lindiv.includes('n*')) {\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)?:(\\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 {useDescriptorManager} from './useDescriptorManager';\r\nimport {useDescriptorEvaluation} from './useDescriptor';\r\nimport {type DividerMode, isArticle} from '../types/divider.types';\r\nimport {useVariables} from \"../variables/useVariables.ts\";\r\nimport {resolveLindivValue} from \"../helpers/LindivResolver.ts\";\r\n\r\nexport interface UseZoneDescriptorOptions {\r\n inputData: Record<string, unknown>\r\n divider?: DividerMode\r\n}\r\n\r\nexport function ZoneDescriptor({ divider, inputData }: UseZoneDescriptorOptions) {\r\n const manager = useDescriptorManager();\r\n const {resolveString, tree:variableTree} = useVariables()\r\n\r\n const { result, error } = useDescriptorEvaluation(manager,(divider as any).descriptorName, inputData, { throwOnError: false },variableTree);\r\n\r\n if (error){\r\n console.error('error : from useDescriptorEvaluation',error)\r\n }\r\n\r\n\r\n const articleName = useMemo(() => {\r\n if (!divider) return '';\r\n\r\n if (isArticle.string(divider)) {\r\n return divider.articleName;\r\n }\r\n\r\n if (isArticle.descriptor(divider) && result?.lindiv) {\r\n return result.lindiv;\r\n }\r\n\r\n return '';\r\n }, [divider, result]);\r\n\r\n\r\n\r\n\r\n const updatedDivider = useMemo(() => {\r\n if (!divider) return undefined;\r\n\r\n // If it's a descriptor-based divider and we have a result, update LINDIV1\r\n if (result?.lindiv != undefined) {\r\n\r\n let resolvedVar = resolveString(result.lindiv)\r\n\r\n const xValue = inputData['X']\r\n if (xValue) resolvedVar = resolvedVar.replace(/\\bX\\b/g, String(xValue))\r\n const resolvedValue = resolveLindivValue(resolvedVar)\r\n return {\r\n ...divider,\r\n LINDIV1: resolvedValue, // Replace the descriptor reference with actual formula\r\n articleName: articleName,\r\n };\r\n }\r\n\r\n return {...divider, LINDIV1: resolveString(divider.LINDIV1)};\r\n }, [divider, result, articleName, resolveString]);\r\n\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, useContext} from \"react\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport Zone from \"../../Zone.tsx\";\nimport {DataContext} from \"../../../../contexts/article-data/DataContext.ts\";\nimport {ArticleContext} from \"../../../../contexts/article/ArticleContext.ts\";\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport {type DividerMode} from \"../../../../types/divider.types.ts\";\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\nimport {DIM_NORM} from \"../../../../constants/Constants.tsx\";\n\ntype DividerType = '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: DividerType, 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 childrenPositon: PositionHelperResult\n dividerThk: number\n divider: DividerMode\n view: VIEW,\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\n}\n\nexport function LinearDividerRender({divider, view, childrenPositon, dividerThk}: DividerProps) {\n const context = useContext(DataContext);\n const articleContext = useContext(ArticleContext);\n\n const type = childrenPositon.dividerType;\n const children = childrenPositon.childPositions;\n const cfg = CONFIG[type];\n if (!context) return null\n // const {selectedElem, setSelectedElem, hoveredElem, setHoveredElem} = context;\n const articleName = articleContext?.articleName || 'default';\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 // const isDividerSelected = selectedElem === dividerId;\n // const isDividerHovered = hoveredElem === dividerId;\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 // isSelected={isDividerSelected}\n // isHovered={isDividerHovered}\n // onClick={() => setSelectedElem(isDividerSelected ? null : dividerId)}\n // onPointerEnter={() => setHoveredElem(dividerId)}\n // onPointerLeave={() => setHoveredElem(null)}\n />\n :\n <PD_2D\n {...dims_2d}\n text={dividerId}\n treeId={dividerId}\n // isSelected={isDividerSelected}\n // isHovered={isDividerHovered}\n // onClick={() => setSelectedElem(isDividerSelected ? null : dividerId)}\n // onMouseEnter={() => setHoveredElem(dividerId)}\n // onMouseLeave={() => setHoveredElem(null)}\n />\n }\n </>\n }\n </GroupWrapper>\n <Zone 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 {ArticleProvider} from \"../../../../contexts/article/ArticleProvider.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 <ArticleProvider articleName={articleName} >\r\n <GroupWrapper view={view} position={[remainingZone.position.x, remainingZone.position.y, remainingZone.position.z]}>\r\n <Zone TREEID={'0'} dimension={remainingZone.dimensions} view={view} />\r\n </GroupWrapper>\r\n </ArticleProvider >\r\n )\r\n}","import {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\n\r\ninterface DividerProps {\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({childrenPositon, dividerThk, divider, view, remainingZone}:DividerProps){\r\n if (isDivider.linearDivision(divider)){\r\n if (!childrenPositon) return null;\r\n return <LinearDividerRender view={view} childrenPositon={childrenPositon} dividerThk={dividerThk} divider={divider} remainingZone={remainingZone}/>\r\n }\r\n\r\n if (isDivider.article(divider)){\r\n const articleName = isArticle.string(divider) ? divider.articleName : divider.LINDIV1;\r\n if (!remainingZone || articleName === '') return null;\r\n return <SubArticleRender view={view} articleName={articleName} remainingZone={remainingZone} />\r\n }\r\n\r\n return null;\r\n}","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\n\r\nexport default function usePrimHelper() {\r\n const {getArticleData} = useData();\r\n const {articleName, dimensionOverrides} = useArticle();\r\n const {resolveString} = useVariables()\r\n\r\n // Get data for this specific article\r\n const {anglPrims} = getArticleData(articleName);\r\n if (anglPrims.length === 0) throw new Error(`No prims found for article: ${articleName}`);\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(resolveString(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 current_prim,\r\n prim_dims\r\n }\r\n}","import type {ZoneProps} from \"../../types/zone.types.tsx\";\r\nimport {useZoneHelper} from \"../../helpers/angls/UseZoneHelper.tsx\";\r\nimport {\r\n calculateChildPositionsFromGeometry,\r\n calculateRemainingZoneGeometry,\r\n calculateZoneGeometry,\r\n getBorderInset,\r\n getBorderThk,\r\n useZoneElemHelpers\r\n} from \"../../helpers/ZoneCalculations.tsx\";\r\nimport {backTreeId, DIM_NORM, frontTreeId, leftTreeId, rightTreeId} from \"../../constants/Constants.tsx\";\r\nimport Front from \"./zoneElems/Front.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 Top from \"./zoneElems/Top.tsx\";\r\nimport Bottom from \"./zoneElems/Bottom.tsx\";\r\nimport {ZoneDescriptor} from \"../../hooks/zoneDescriptor.ts\";\r\nimport Divider from \"./zoneElems/Divider.tsx\";\r\nimport {\r\n createDivider,\r\n getDividedAxis,\r\n getDividedLength,\r\n isArticle,\r\n isLinearDivision\r\n} from \"../../types/divider.types.ts\";\r\nimport usePrimHelper from \"../../helpers/angls/UsePrimHelper.tsx\";\r\n\r\nexport default function Zone({TREEID, dimension, view=VIEW._3D}: ZoneProps) {\r\n // console.log(`====== Zone Start ${TREEID} ========`)\r\n\r\n const zoneHelper = useZoneHelper(TREEID);\r\n const zoneInfo = zoneHelper?.zoneInfo()\r\n const dividerThk = zoneHelper?.dividerThk || 0;\r\n const prim = usePrimHelper()\r\n\r\n const elemHelpers = useZoneElemHelpers(TREEID)\r\n const borderThk = getBorderThk(elemHelpers, zoneHelper?.topShelfThk || 0, zoneHelper?.bottomShelfThk || 0)\r\n const borderInset = getBorderInset(elemHelpers)\r\n const zoneGeometry = calculateZoneGeometry(dimension, borderInset)\r\n const remainingZone = calculateRemainingZoneGeometry(zoneGeometry, borderThk)\r\n\r\n if (!zoneHelper) return\r\n const divider = createDivider.fromZoneData(zoneHelper.currentZone,dividerThk);\r\n\r\n const inputData = zoneInfo ? Object.fromEntries(zoneInfo) : {};\r\n const dividerAxis = getDividedAxis(divider)\r\n const dividedLength = getDividedLength(dividerAxis, remainingZone.dimensions)\r\n\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 inputData['X'] = dividedLength.toString();\r\n\r\n // Evaluate descriptor to get linear division formula\r\n const isLinDivDescriptor = divider ? isLinearDivision.descriptor(divider) : false;\r\n const isArticleDescriptor = divider ? isArticle.descriptor(divider) : false;\r\n const isDescriptor = isLinDivDescriptor || isArticleDescriptor;\r\n\r\n const updatedDivider = isDescriptor ? ZoneDescriptor({divider, inputData}).updatedDivider : divider\r\n\r\n const childPositions = calculateChildPositionsFromGeometry(remainingZone, dividerThk, updatedDivider, zoneHelper?.children.map((child) => child.TREEID) || []);\r\n\r\n return (\r\n <>\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?.CPNAME && <Front view={view} TREEID={frontTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/>}\r\n {elemHelpers.left?.CPNAME && <Left view={view} TREEID={leftTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.back?.CPNAME && <Back view={view} TREEID={backTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.right?.CPNAME && <Right view={view} TREEID={rightTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.topShelfCP && <Top view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.bottomShelfCP && <Bottom view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} /> }\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 remainingZone={remainingZone} divider={updatedDivider} view={view} childrenPositon={childPositions} dividerThk={dividerThk} /> }\r\n </GroupWrapper>\r\n </GroupWrapper>\r\n </>\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>\r\n <boxGeometry args={[width + 0.002, depth + 0.002, height + 0.002]}/>\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 {useContext, useMemo} from \"react\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport Zone from \"./Zone.tsx\";\r\nimport usePrimHelper from \"../../helpers/angls/UsePrimHelper.tsx\";\r\nimport {ArticleContext} from \"../../contexts/article/ArticleContext.ts\";\r\nimport Highlighter from \"./Highlighter.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\n\r\nconst SVG_TRANSFORM = \"scale(1,-1)\";\r\n\r\nexport default function Designer({view = VIEW._3D, isSelected, position}: { view: VIEW, isSelected:boolean, position:[number,number,number]}) {\r\n const { prim_dims } = usePrimHelper();\r\n const articleName = useContext(ArticleContext)?.articleName ?? 'default';\r\n\r\n const zone = useMemo(\r\n () => <Zone key={`${articleName}-0`} TREEID=\"0\" view={view} dimension={prim_dims} />,\r\n [articleName, view, prim_dims]\r\n );\r\n\r\n const is3D = view === VIEW._3D;\r\n\r\n return (\r\n <>\r\n <GroupWrapper view={view} position={[position[0], position[1], prim_dims.height/DIM_NORM/2]}>\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\r\n}","// ArticleDesigner.tsx - Single Article Renderer\nimport {memo} from \"react\";\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\nimport {ArticleProvider} from \"../../contexts/article/ArticleProvider.tsx\";\nimport {\n ArticleRelatedVariableProvider\n} from \"../../contexts/article-related-variables/ArticleRelatedVariableProvider.tsx\";\nimport {VIEW} from \"../../types/view.types.ts\";\nimport {LevaVariableController} from \"../ui/test/LevaVariableController.tsx\";\nimport Designer from \"./Designer.tsx\";\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\n\nexport interface ArticleDesignerProps {\n article:ArticleGroupTypes\n articleId:string // Add articleId\n position:[number, number, number]\n isSelected:boolean\n onSelect:()=>void\n view:VIEW\n debugMode:boolean\n}\n\nexport const ArticleDesigner = memo(function ArticleDesigner({article, articleId, position, isSelected, onSelect, view, debugMode}: ArticleDesignerProps) {\n\n return (\n <GroupWrapper view={view} onClick={onSelect}>\n <ArticleProvider articleName={article.name} articleId={articleId} dimensionOverrides={article.dimensions}>\n <ArticleRelatedVariableProvider overrides={article.variables}>\n {debugMode && view === VIEW._3D && isSelected && <LevaVariableController/>}\n <Designer view={view} isSelected={isSelected} position={position} />\n </ArticleRelatedVariableProvider>\n </ArticleProvider>\n </GroupWrapper>\n );\n});","// ArticleGroupLayout.tsx - Multi-Article Positioning & Layout\r\nimport {useMemo, useState} from \"react\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\r\nimport type {VIEW} from \"../../types/view.types.ts\";\r\nimport {ArticleDesigner} from \"./ArticleDesigner.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.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}\r\n\r\nexport function ArticleGroupLayout({articleList, validNames, view, debugMode, isZCentered}: ArticleGroupLayoutProps) {\r\n const [selectedArticleId, setSelectedArticleId] = useState<string | null>();\r\n\r\n // Calculate max height for centering\r\n const maxHeight = useMemo(() => Math.max(...articleList.map(a => a.dimensions.height)), [articleList]);\r\n const totalWidth = useMemo(() => articleList.reduce((acc, article) => acc + article.dimensions.width / DIM_NORM, 0), [articleList]);\r\n const centerZ = isZCentered ? maxHeight / DIM_NORM / 2 : 0;\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 articleList.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 }, [articleList, centerX]);\r\n\r\n return (\r\n articlePositions.map(({articleId, position, article}) => {\r\n if (!validNames?.has(article.name)) return null;\r\n return (\r\n <GroupWrapper key={articleId} view={view} position={[0,0,-centerZ]} >\r\n <ArticleDesigner\r\n key={articleId}\r\n article={article}\r\n articleId={articleId}\r\n position={position}\r\n isSelected={selectedArticleId === articleId}\r\n onSelect={() => setSelectedArticleId(articleId)}\r\n view={view}\r\n debugMode={debugMode}\r\n />\r\n </GroupWrapper>\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\";\n\nexport default function ArticleGroupDesigner({view, data, articleList, debugMode = false, isZCentered = false}: 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(() => api.articleData().fetchBulk(articleNames),\n [articleNamesKey] // Use stable key instead of array\n );\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}/>\n </DescriptorProvider>\n </VariableProvider>\n </MatSurfProvider>\n </DataProvider>\n );\n}","import {VAR_TYPE} from '../../../variables/variable.types';\nimport {useVariables} from \"../../../variables/useVariables.ts\";\nimport './VarController.css';\n\ninterface VariableGroup {\n type: VAR_TYPE;\n label: string;\n variables: Array<{\n name: string;\n value: string | number;\n reference?: string;\n rawType: number;\n }>;\n}\n\nexport default function VarController() {\n const { tree, getValue, setVarValue } = useVariables();\n\n // Handle value change - applies immediately\n const handleValueChange = (varName: string, newValue: string) => {\n const numValue = Number(newValue);\n setVarValue(varName, isNaN(numValue) ? newValue : numValue);\n };\n\n // Group variables by type\n const groupVariables = (): VariableGroup[] => {\n const groups: Record<number, VariableGroup> = {\n [VAR_TYPE.Numeric]: { type: VAR_TYPE.Numeric, label: 'Dimensions (Numeric)', variables: [] },\n [VAR_TYPE.Surface]: { type: VAR_TYPE.Surface, label: 'Surfaces', variables: [] },\n [VAR_TYPE.Material]: { type: VAR_TYPE.Material, label: 'Materials', variables: [] },\n [VAR_TYPE.Text]: { type: VAR_TYPE.Text, label: 'Text', variables: [] },\n [VAR_TYPE.Profile]: { type: VAR_TYPE.Profile, label: 'Profiles', variables: [] },\n [VAR_TYPE.Kms]: { type: VAR_TYPE.Kms, label: 'Part definition', variables: [] },\n [VAR_TYPE.color]: { type: VAR_TYPE.color, label: 'Color principle', variables: [] },\n\n };\n\n Array.from(tree.entries()).forEach(([name, variable]) => {\n const resolvedValue = getValue(name);\n const isReference = variable.WERT.startsWith('$');\n\n groups[variable.TYP]?.variables.push({\n name,\n value: resolvedValue ?? 'undefined',\n reference: isReference ? variable.WERT : undefined,\n rawType: variable.TYP\n });\n });\n\n return Object.values(groups).filter(g => g.variables.length > 0);\n };\n\n const groups = groupVariables();\n groups.sort((a, b) => b.type - a.type);\n\n // Render input based on variable type - always editable\n // Render input based on variable type - always editable\n const renderInput = (variable: VariableGroup['variables'][0]) => {\n const isNumeric = variable.rawType === VAR_TYPE.Numeric;\n const numValue = typeof variable.value === 'number' ? variable.value : Number(variable.value);\n\n if (isNumeric && !isNaN(numValue)) {\n // Slider + number input for numeric types\n return (\n <div className=\"var-controller__slider-container\">\n <input\n type=\"range\"\n min={0}\n max={20000}\n value={numValue}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__slider\"\n />\n <input\n type=\"number\"\n value={numValue}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n onBlur={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__number-input\"\n min={0}\n max={20000}\n />\n </div>\n );\n } else {\n // Text input for other types - updates on blur or Enter\n return (\n <input\n type=\"text\"\n value={variable.value}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n onBlur={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__text-input\"\n />\n );\n }\n };\n\n return (\n <div className=\"var-controller\" style={{maxHeight:'1000px',overflowY:'scroll'}}>\n <h2>Variable Controller</h2>\n <p className=\"var-controller__header\">\n Total variables: {tree.size}\n </p>\n\n {groups.map(group => (\n <section key={group.type} className=\"var-controller__section\">\n <h3 className=\"var-controller__section-title\">\n {group.label} ({group.variables.length})\n </h3>\n\n <table className=\"var-controller__table\">\n <thead>\n <tr>\n <th style={{ width: '25%' }}>Variable Name</th>\n <th style={{ width: '35%' }}>Current Value</th>\n <th style={{ width: '25%' }}>Reference</th>\n <th className=\"center\" style={{ width: '15%' }}>Type</th>\n </tr>\n </thead>\n <tbody>\n {group.variables.map((variable) => (\n <tr key={variable.name}>\n <td className=\"var-controller__var-name\">\n {variable.name}\n </td>\n <td>\n {renderInput(variable)}\n </td>\n <td className=\"var-controller__reference\">\n {variable.reference || '-'}\n </td>\n <td style={{ textAlign: 'center' }}>\n <span className=\"var-controller__type-badge\">\n {group.type}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n ))}\n\n {/* Quick Stats */}\n <section className=\"var-controller__stats\">\n <h4>Quick Stats</h4>\n <ul>\n {groups.map(group => (\n <li key={group.type}>\n {group.label}: {group.variables.length} variables\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\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// ============================================================================\n\nexport { DataProvider } from './contexts/article-data/DataProvider';\nexport { MatSurfProvider } from './contexts/mat-surf/MatSurfProvider';\nexport { ArticleRelatedVariableProvider } from './contexts/article-related-variables/ArticleRelatedVariableProvider.tsx';\nexport { ArticleProvider } from './contexts/article/ArticleProvider';\nexport { VariableProvider } from './variables/VariableProvider';\nexport { DescriptorProvider } from './contexts/descriptor/DescriptorProvider';\nexport { TextureConfigProvider } from './contexts/texture/TextureConfig';\n\n// Contexts for advanced usage\nexport { DataContext } from './contexts/article-data/DataContext';\nexport { ArticleContext } from './contexts/article/ArticleContext';\nexport { VariableContext } from './variables/VariableContext';\nexport { TextureConfigContext } from './contexts/texture/TextureConfig';\nexport { DescriptorContext } from './contexts/descriptor/DescriptorContext';\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport { useVariables } from './variables/useVariables';\nexport { useArticle } from './hooks/useArticle';\nexport { useDescriptorEvaluation, useDescriptorMatches } from './hooks/useDescriptor';\nexport { useData } from './hooks/useData';\nexport { useDescriptorManager } from './hooks/useDescriptorManager';\nexport { ZoneDescriptor } from './hooks/zoneDescriptor';\n\n// ============================================================================\n// UI COMPONENTS (OPTIONAL)\n// ============================================================================\n\nexport { default as VarController } from './components/ui/controls/VarController';\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","APIFactory","api","DataContext","createContext","DataProvider","children","names","staticData","editableData","setEditableData","selectedElem","setSelectedElem","hoveredElem","setHoveredElem","getArticleData","useCallback","articleName","elem","zone","prim","clie","grtx","variable","anglElems","anglZones","anglPrims","anglClies","anglGrtxs","csides","kmsList","cabins","variables","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","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","unit","isIfStatement","evaluateIfStatement","isMathExpression","evaluateExpression","coerceByDataType","resolveValue","expr","content","parts","splitIfParts","conditionStr","trueValueStr","falseValueStr","resultStr","evaluateCondition","current","depth","i","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","queueTrigger","setQueueTrigger","queueMaterialFetch","wasEmpty","queueSurfaceFetch","fetchMaterial","material","next","fetchSurface","surface","toFetch","VIEW","LoadingIndicator","view","loadingContent","jsxs","Html","ErrorDisplay","insideCanvas","errorContent","GroupWrapper","position","rotation","onClick","x","y","angle","ArticleContext","ArticleProvider","articleId","dimensionOverrides","useVariables","get","has","ArticleRelatedVariableProvider","overrides","parentContext","dynamicChanges","setDynamicChanges","newChanges","useArticle","LevaVariableController","updatingFromTreeRef","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","materialName","resolvedRender","renderInfo","SurfHelper","surfaceName","useKmsHelper","NAME","currentKms","kms","surfaceTopName","surfaceBottomName","surfaceTop","surfaceBottom","render","CabinHelper","cabin","cside","kmsName","KmsHelper","useZoneHelper","currentZone","TAGNAME","CPNAME","CPTypeCode","CSideHelper","sidePanel","CpDispatcher","CpName","PartType","useElemHelper","currentElem","parentZoneId","parentZone","clieThickness","thk","resolvedInset","inset","color","topThk","bottomThk","oversize","trim","elmTrimThk","EvaluationErrors","message","Scanner","_Scanner","source","tokens","oldestKey","lexeme","fullVariable","allowedSpecialVariables","identifier","functionType","Parser","ast","nextToken","sections","singleSection","functionName","arg","errorMessage","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","parser","evaluator","processLindiv","evaluationResult","LinDivPatternTransform","exactPattern","count","extractNumberFromIndependentDiv","LinDivHelper","divider","dimensions","divided_length","LINDIV1","DIVDIR","HORDEFTYPE","DIVELEM1","divisionType","isReversed","divided_length_list","transformedLindiv","unrefIndependentDiv","zone_dimensions","length","PositionHelper","parentDimensions","lengthList","childTREEIDs","startX","startY","startZ","acc","index","zone_dims","useZoneElemHelpers","getBorderThk","elemHelpers","topShelfThk","bottomShelfThk","getBorderInset","calculateZoneGeometry","dimension","borderInset","calculateRemainingZoneGeometry","zoneGeometry","bordersThk","calculateChildPositions","remainingDims","childrenDims","calculateChildPositionsFromGeometry","remainingZoneGeometry","calculateMitrePoints","thickness","halfLength","halfThickness","points","Shape","__assign","n","useMountedState","mountedRef","useAsyncFn","initialState","lastCallId","isMounted","_a","state","set","args","_i","callId","prevState","useAsync","ralColorsMap","getRalHexColor","ralCode","isRalColor","existenceCache","CheckUrlExists","abortController","getResponse","exists","defaultConfig","TextureConfigContext","TextureConfigProvider","useTextureConfig","buildTextureUrl","renderMat","textureBaseUrl","textureFolder","textureExtension","textureSuffix","PLACEHOLDER_TEXTURE_URL","useMaterialLoader","renderValue","textureConfig","isGlass","ralHex","textureExists","checkingTexture","urlToLoad","texture","useLoader","TextureLoader","PD_3D","memo","width","opacity","isSelected","isHovered","onPointerEnter","onPointerLeave","render_mat","materialOpacity","effectiveColor","effectiveOpacity","geometry","shape","geo","ExtrudeGeometry","BoxGeometry","Edges","defaultRule","dimensionRules","getDimensionRules","cpName","rule","pattern","matchCPName","regexPattern","DimensionLines","height","rules","offset","lineStyle","strokeWidth","fontSize","arrowSize","positions","pos","idx","label","PD_2D","dim_x","dim_y","text","stroke_width","rotate","onMouseEnter","onMouseLeave","cp","svgPath","strokeColor","effectiveStrokeWidth","fill","Front","helper","elemHlp","startElemThk","endElemThk","startTrimThk","endTrimThk","mitreStartThk","mitreEndThk","panel_length","panel_width","panel_thk","pos_x","pos_z","pos_y","Left","Back","Right","Top","zoneHlp","topShelfCP","frontTrimThk","backTrimThk","leftTrimThk","rightTrimThk","Bottom","bottomShelfCP","useDescriptorManager","useDescriptorEvaluation","throwOnError","useDescriptorMatches","DividerTypeConst","ValueSourceConst","isDivider","isLinearDivision","isArticle","createDivider","DIVTYPE","formula","divProps","isDescriptor","getDividedAxis","PERPENDICULAR_AXIS_MAP","getDividedLength","axis","resolveWithNStar","lindiv","sectionData","hasNStar","cleaned","resolveLindiv","original","isLindivReference","format","suffix","parseLindiv","cleanExpression","finalValue","resolveLindivValue","cleanInput","ratioFirstMatch","ratio","exprRatioMatch","bracesMatch","star","ZoneDescriptor","resolvedVar","xValue","resolvedValue","CONFIG","d","getDividerPos","LinearDividerRender","childrenPositon","articleContext","cfg","showDiv","divPos","dims_3d","dims_2d","dividerId","Fragment","Zone","SubArticleRender","remainingZone","Divider","usePrimHelper","current_prim","DIMCALCF","SIZE","dimOverride","resolved","prim_dims","zoneHelper","borderThk","dividerAxis","dividedLength","isLinDivDescriptor","isArticleDescriptor","updatedDivider","childPositions","Highlighter","SVG_TRANSFORM","Designer","is3D","ArticleDesigner","article","onSelect","debugMode","ArticleGroupLayout","articleList","validNames","isZCentered","selectedArticleId","setSelectedArticleId","maxHeight","totalWidth","centerZ","centerX","positionAcc","ArticleGroupDesigner","articleNames","articleNamesKey","fetchArticleData","shouldFetch","apiData","finalData","validArticleNames","VarController","handleValueChange","groups","isReference","renderInput","isNumeric","group","VERSION"],"mappings":"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","x_google_ignoreList":[43,49,50,51,52]}
|
|
1
|
+
{"version":3,"file":"index.cjs","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/helpers/GroupWrapper.tsx","../src/contexts/article/ArticleContext.ts","../src/contexts/article/ArticleProvider.tsx","../src/variables/useVariables.ts","../src/contexts/article-related-variables/ArticleRelatedVariableProvider.tsx","../src/hooks/useArticle.ts","../src/components/ui/test/LevaVariableController.tsx","../src/hooks/useData.ts","../src/helpers/angls/UseClieHelper.tsx","../src/helpers/angls/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/cabin/CabinHelper.ts","../src/helpers/angls/UseZoneHelper.tsx","../src/types/cp.types.ts","../src/construction_principle/side_panel/CSideHelper.tsx","../src/helpers/CpDispatcher.ts","../src/helpers/angls/UseElemHelper.tsx","../node_modules/imos-linear-division/dist/index.mjs","../src/helpers/LinDivPatternTransform.ts","../src/helpers/LinDivHelper.tsx","../src/helpers/PositionHelper.tsx","../src/helpers/ZoneCalculations.tsx","../src/helpers/MitreCalc.tsx","../node_modules/tslib/tslib.es6.mjs","../node_modules/react-use/esm/useMountedState.js","../node_modules/react-use/esm/useAsyncFn.js","../node_modules/react-use/esm/useAsync.js","../src/constants/RalColors.ts","../src/helpers/CheckUrlExists.ts","../src/contexts/texture/TextureConfig.tsx","../src/hooks/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/components/article_designer/zoneElems/Front.tsx","../src/components/article_designer/zoneElems/Left.tsx","../src/components/article_designer/zoneElems/Back.tsx","../src/components/article_designer/zoneElems/Right.tsx","../src/components/article_designer/zoneElems/Top.tsx","../src/components/article_designer/zoneElems/Bottom.tsx","../src/hooks/useDescriptorManager.ts","../src/hooks/useDescriptor.ts","../src/types/divider.types.ts","../src/helpers/LindivResolver.ts","../src/hooks/zoneDescriptor.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/helpers/angls/UsePrimHelper.tsx","../src/components/article_designer/Zone.tsx","../src/components/article_designer/Highlighter.tsx","../src/components/article_designer/Designer.tsx","../src/components/article_designer/ArticleDesigner.tsx","../src/components/article_designer/ArticleGroupLayout.tsx","../src/components/article_designer/ArticleGroupDesigner.tsx","../src/components/ui/controls/VarController.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\n// export const BACKEND_BASE_URL = 'http://localhost:3018'\r\nexport 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> {\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 response.json();\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> {\r\n const url = `${this.baseUrl}/${this.endpoint}/bulk`;\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 response.json();\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 {DataProviderProps, AnglPrim, AnglZone, AngleElem, AnglClie, AnglGrtx} 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\";\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 cside: CsideTypes[];\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 // Note: csides and cabins are shared construction principles, not article-specific\n // Return all of them - they'll be referenced by article parts\n csides: editableData.cside || [],\n cabins: editableData.cabin || [],\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} = 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 // 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 csides: editableData.cside || [],\n cabins: editableData.cabin || [],\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 csides: editableData.cside || [],\n kmsList: editableData.kms || [],\n cabins: editableData.cabin || [],\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 // Construction principle data\n csides,\n kmsList,\n cabins,\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\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 let unit: string | undefined;\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.)\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 // 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 if (wasEmpty) setQueueTrigger(prev => prev + 1);\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 if (wasEmpty) setQueueTrigger(prev => prev + 1);\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 * 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 { VIEW } from \"../types/view.types.ts\";\nimport type { FC, ReactNode } from \"react\";\nimport {DIM_NORM} from \"../constants/Constants.tsx\";\n\ninterface GroupWrapperProps {\n view: VIEW;\n position?: [number, number, number];\n rotation?: [number, number, number];\n children?: ReactNode;\n onClick?: () => void;\n}\n\nconst GroupWrapper: FC<GroupWrapperProps> = ({ view=VIEW._3D, position=[0,0,0], rotation=[0,0,0], children, onClick }) => {\n if (view === VIEW._3D) {\n return (\n <group\n position={[position[0], position[1], position[2]]}\n rotation={rotation}\n onClick={onClick}\n onPointerOver={(e) => {\n if (onClick) {\n e.stopPropagation();\n document.body.style.cursor = 'pointer';\n }\n }}\n onPointerOut={() => {\n if (onClick) {\n document.body.style.cursor = 'default';\n }\n }}>\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[2] * (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 { createContext } from 'react';\nimport type {DimensionProps} from \"../../types/zone.types.tsx\";\n\nexport interface ArticleContextType {\n articleName: string;\n articleId?: string; // Unique identifier (name + index)\n dimensionOverrides?: Partial<DimensionProps>;\n}\n\nexport const ArticleContext = createContext<ArticleContextType | null>(null);\n","import type { ReactNode } from 'react';\nimport { ArticleContext } from './ArticleContext.ts';\nimport type { ArticleContextType } from './ArticleContext.ts';\n\ninterface ArticleProviderProps extends ArticleContextType {\n children: ReactNode;\n}\n\nexport function ArticleProvider({ children, articleName, articleId, dimensionOverrides }: ArticleProviderProps) {\n const value = {\n articleName,\n articleId,\n dimensionOverrides,\n };\n\n return (\n <ArticleContext.Provider value={value}>\n {children}\n </ArticleContext.Provider>\n );\n}\n","import { useContext, useMemo } from 'react';\nimport { VariableContext } from './VariableContext.tsx';\nimport { getValue, resolveString, hasVariables } 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 resolve = useMemo(() => (str: string) => resolveString(str, tree), [tree]);\n\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 resolveString: resolve, // Resolve string with variables\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}","import { useContext } from 'react';\nimport { ArticleContext } from '../contexts/article/ArticleContext.ts';\n\nexport function useArticle() {\n const context = useContext(ArticleContext);\n\n if (!context) {\n throw new Error('useArticle must be used within an ArticleProvider');\n }\n\n return context;\n}\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 {useArticle} from \"../../../hooks/useArticle.ts\";\r\n\r\nexport function LevaVariableController() {\r\n const {tree, setVarValue, getValue} = useVariables();\r\n const {articleName, articleId} = useArticle();\r\n const updatingFromTreeRef = 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 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 = typeof currentValue === 'number' ? currentValue : Number(currentValue) || 0;\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]);\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 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 // 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]); // Add dependencies\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 '../contexts/article-data/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 \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\n\r\nexport default function useClieHelper(TREEID:string, TAG:string, DATATYPE:number){\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n\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 \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function useGrtxHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {resolveString} = useVariables()\r\n const {articleName} = useArticle();\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}`, resolveString(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}","// Pure helper function - no hooks\r\n// Accepts already-resolved textureId value\r\nexport default function RenderHelper(textureId?: string) {\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 from \"../render/RenderHelper.tsx\";\r\nimport {useMatSurfs} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function MatHelper(materialName:string) {\r\n const {materials, queueMaterialFetch, isFetchingMaterial, hasMaterial, hasFailedMaterial} = useMatSurfs()\r\n const {resolveString} = useVariables()\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 = resolveString(material?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...material, renderInfo}\r\n}","import RenderHelper from \"../render/RenderHelper.tsx\";\r\nimport {useMatSurfs} from \"../../contexts/mat-surf/MatSurfContext.tsx\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\n\r\nexport default function SurfHelper(surfaceName:string) {\r\n const {surfaces, queueSurfaceFetch, isFetchingSurface, hasSurface, hasFailedSurface} = useMatSurfs()\r\n const {resolveString} = useVariables()\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 = resolveString(surface?.RENDER || '')\r\n const renderInfo = RenderHelper(resolvedRender)\r\n\r\n return {...surface,renderInfo}\r\n}\r\n","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {KmsRenderSelector} from \"./KmsRenderSelector.ts\";\r\nimport MatHelper from \"../material/MatHelper.ts\";\r\nimport SurfHelper from \"../surface/SurfHelper.ts\";\r\n\r\n\r\n\r\nexport default function useKmsHelper(NAME: string) {\r\n const {kmsList} = useData()\r\n const {resolveString} = useVariables()\r\n const currentKms = kmsList.find((kms) => kms.NAME === NAME)\r\n if (!currentKms) {\r\n console.warn(`KMS ${NAME} not found`)\r\n return undefined\r\n }\r\n const materialName = resolveString(currentKms?.MATERIAL || '')\r\n const surfaceTopName = resolveString(currentKms?.SURF0 || '')\r\n const surfaceBottomName = resolveString(currentKms?.SURF1 || '')\r\n\r\n const material = MatHelper(materialName)\r\n const surfaceTop = SurfHelper(surfaceTopName)\r\n const surfaceBottom = SurfHelper(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 : currentKms?.NAME,\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 {useData} from \"../../hooks/useData.ts\";\r\nimport KmsHelper from \"../kms/KmsHelper.tsx\";\r\n\r\nexport default function CabinHelper(NAME: string) {\r\n const {cabins} = useData()\r\n const cabin = cabins.find((cside) => cside.NAME === NAME)\r\n if (!cabin) {return undefined}\r\n const kmsName = cabin.KMS\r\n const kms = KmsHelper(kmsName || '')\r\n return {\r\n kms,\r\n }\r\n}","import {CLIE_TYPE_ZONE, clieTags} from \"../../constants/Constants.tsx\";\r\nimport {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport useClieHelper from \"./UseClieHelper.tsx\";\r\nimport useGrtxHelper from \"./UseGrtxHelper.tsx\";\r\nimport CabinHelper from \"../../construction_principle/cabin/CabinHelper.ts\";\r\n\r\n/**\r\n * ZoneHelper - Provides zone data and thickness calculations\r\n *\r\n * Note: Calculation logic has been moved to ZoneCalculations.tsx\r\n * This helper now focuses on data retrieval and thickness lookups only\r\n */\r\nexport function useZoneHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n\r\n // Get data for this specific article\r\n const {anglZones} = 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\r\n return {\r\n // Zone data\r\n currentZone,\r\n children,\r\n\r\n // Shelf properties\r\n get topShelfCP() {\r\n const res = CabinHelper(currentZone.TOPSHELF)\r\n return res\r\n },\r\n get bottomShelfCP() {\r\n return CabinHelper(currentZone.BOTSHELF);\r\n },\r\n zoneInfo() {\r\n return useGrtxHelper(TREEID)?.zoneInfo;\r\n },\r\n\r\n // Thickness calculations\r\n getThk(TREEID: string, TAGNAME: string, CPNAME: string): number {\r\n return CPNAME === \"\" ? 0 : useClieHelper(TREEID, TAGNAME, CLIE_TYPE_ZONE)?.thickness ?? CabinHelper(CPNAME)?.kms.thk ?? 0;\r\n },\r\n get topShelfThk() {\r\n return this.getThk(TREEID, clieTags.IAC_TOPSHELFTHICKNESS, currentZone.TOPSHELF);\r\n },\r\n get bottomShelfThk() {\r\n return this.getThk(TREEID, clieTags.IAC_BOTTOMSHELFTHICKNESS, currentZone.BOTSHELF);\r\n },\r\n get dividerThk() {\r\n return this.getThk(TREEID, clieTags.IAC_THICKNESS, currentZone.DIVIDER);\r\n }\r\n };\r\n}\r\n","// Construction Principle Type Codes (from PARTTYPE field in AnglElem)\r\nexport enum CPTypeCode {\r\n SidePanel = 'S',\r\n Door = 'D',\r\n Back = 'B',\r\n Shelf = 'H',\r\n}\r\n\r\n// Construction Principle Type Names (human-readable)\r\nexport enum CPTypeName {\r\n SidePanel = 'side_panel',\r\n Door = 'door',\r\n Back = 'back',\r\n Shelf = 'shelf',\r\n}\r\n\r\n// Map from code to name\r\nexport const CP_TYPE_MAP: Record<CPTypeCode, CPTypeName> = {\r\n [CPTypeCode.SidePanel]: CPTypeName.SidePanel,\r\n [CPTypeCode.Door]: CPTypeName.Door,\r\n [CPTypeCode.Back]: CPTypeName.Back,\r\n [CPTypeCode.Shelf]: CPTypeName.Shelf,\r\n};\r\n\r\n","import {useData} from \"../../hooks/useData.ts\";\r\nimport KmsHelper from \"../kms/KmsHelper.tsx\";\r\n\r\nexport default function CSideHelper(NAME:string){\r\n const {csides} = useData()\r\n const sidePanel = csides.find((cside) => cside.NAME === NAME)\r\n if (!sidePanel) {\r\n console.warn(`CSide '${NAME}' not found` )\r\n return undefined\r\n }\r\n const kms = KmsHelper(sidePanel.KMS)\r\n return {\r\n ...sidePanel,\r\n kms,\r\n }\r\n}","import {CPTypeCode} from \"../types/cp.types.ts\";\r\nimport CSideHelper from \"../construction_principle/side_panel/CSideHelper.tsx\";\r\n\r\nexport default function CpDispatcher(CpName:string, PartType:CPTypeCode){\r\n\r\n console.log('cpNAME ==> ',CpName)\r\n if (PartType === CPTypeCode.SidePanel && CpName != '') return CSideHelper(CpName);\r\n}","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.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 CpDispatcher from \"../CpDispatcher.ts\";\r\n\r\nexport function useElemHelper(TREEID: string) {\r\n const {getArticleData} = useData();\r\n const {articleName} = useArticle();\r\n const {resolveString} = useVariables()\r\n const {anglElems} = getArticleData(articleName);\r\n\r\n const currentElem = anglElems.find((item) => item.TREEID === TREEID);\r\n const parentZoneId = parentId(TREEID);\r\n const parentZone = useZoneHelper(parentZoneId);\r\n\r\n const clieThickness = useClieHelper(TREEID, clieTags.IAC_THICKNESS, CLIE_TYPE_ELEM);\r\n let sidePanel = undefined\r\n if (currentElem && currentElem.CPNAME != '')\r\n sidePanel = CpDispatcher(currentElem.CPNAME,currentElem.PARTTYPE)\r\n\r\n if (!currentElem) return null;\r\n\r\n // Calculate everything ONCE, return as values\r\n const thk = currentElem.CPNAME === '' ? 0 : clieThickness?.thickness ?? sidePanel?.kms?.thk ?? 0;\r\n\r\n const resolvedInset = currentElem.CPNAME === \"\" ? 0 : currentElem.INSETFOR !== \"\" ? resolveValue(resolveString(currentElem.INSETFOR)) : Number(currentElem.INSET);\r\n const inset = (typeof resolvedInset === 'string' ? 0 : resolvedInset) || 0;\r\n\r\n const color = currentElem.MANINFO || \"black\";\r\n const CPNAME = currentElem.CPNAME;\r\n const topThk = parentZone?.topShelfThk || 0;\r\n const bottomThk = parentZone?.bottomShelfThk || 0;\r\n\r\n const oversize = {\r\n start: Number(currentElem.STARTOFFS) || 0,\r\n end: Number(currentElem.ENDOFFS) || 0,\r\n top: Number(currentElem.TOPOFFS) || 0,\r\n bottom: Number(currentElem.BOTOFFS) || 0\r\n };\r\n\r\n const trim = {\r\n start: currentElem.STARTTRIM,\r\n end: currentElem.ENDTRIM,\r\n top: currentElem.TOPTRIM,\r\n bottom: currentElem.BOTTRIM\r\n };\r\n\r\n const elmTrimThk = {\r\n top: trim.top === 'S' ? topThk : 0,\r\n bottom: trim.bottom === 'S' ? bottomThk : 0\r\n };\r\n\r\n // Return all values (no getters)\r\n return {\r\n TREEID,\r\n sidePanel,\r\n thk,\r\n inset,\r\n color,\r\n CPNAME,\r\n topThk,\r\n bottomThk,\r\n oversize,\r\n trim,\r\n elmTrimThk\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 = 0;\n const accumulateMmValues = (node) => {\n if (dividerThickness) {\n if (node.type === \"Section\") {\n accumulatedMmValues += dividerThickness;\n }\n }\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 + dividerThickness;\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}","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\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) // 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 divided_length_list = processLindiv(transformedLindiv, divided_length, dividerThickness)\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' && (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 \"./angls/UseElemHelper.tsx\";\nimport {backTreeId, frontTreeId, leftTreeId, rightTreeId} from \"../constants/Constants.tsx\";\nimport type {ChildrenDimsResult, DimensionProps, PositionHelperResult} from \"../types/zone.types.tsx\";\nimport type {DividerMode} from \"../types/divider.types.ts\";\nimport type {AnglZone} from \"../types/data.types.tsx\";\nimport LinDivHelper from \"./LinDivHelper.tsx\";\nimport PositionHelper from \"./PositionHelper.tsx\";\n\nexport function useZoneElemHelpers(TREEID: string) {\n return {\n front: useElemHelper(frontTreeId(TREEID)),\n left: useElemHelper(leftTreeId(TREEID)),\n right: useElemHelper(rightTreeId(TREEID)),\n back: useElemHelper(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}\n\nexport function getTopTrimThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, bordersThk: ReturnType<typeof getBorderThk>){\n return {\n left: elemHelpers.left?.trim.top !== 'S' ? bordersThk.left : 0,\n right: elemHelpers.right?.trim.top !== 'S' ? bordersThk.right : 0,\n front: elemHelpers.front?.trim.top !== 'S' ? bordersThk.front : 0,\n back: elemHelpers.back?.trim.top !== 'S' ? bordersThk.back : 0\n };\n}\n\nexport function getBottomTrimThk(elemHelpers: ReturnType<typeof useZoneElemHelpers>, bordersThk: ReturnType<typeof getBorderThk>){\n return {\n left: elemHelpers.left?.trim.bottom !== 'S' ? bordersThk.left : 0,\n right: elemHelpers.right?.trim.bottom !== 'S' ? bordersThk.right : 0,\n front: elemHelpers.front?.trim.bottom !== 'S' ? bordersThk.front : 0,\n back: elemHelpers.back?.trim.bottom !== 'S' ? bordersThk.back : 0\n };\n}\n\nexport function getZoneBorders(elemHelpers: ReturnType<typeof useZoneElemHelpers>, topShelfThk: number, bottomShelfThk: number) {\n const bordersThk = getBorderThk(elemHelpers, topShelfThk, bottomShelfThk)\n const topTrimThk = getTopTrimThk(elemHelpers, bordersThk)\n const bottomTrimThk = getBottomTrimThk(elemHelpers, bordersThk)\n\n return { bordersThk, topTrimThk, bottomTrimThk };\n}\n\nexport function getBorderInset(elemHelpers: ReturnType<typeof useZoneElemHelpers>) {\n return {\n front: elemHelpers.front?.inset || 0,\n right: elemHelpers.right?.inset || 0,\n back: elemHelpers.back?.inset || 0,\n left: elemHelpers.left?.inset || 0\n };\n}\n\nexport function calculateZoneGeometry(dimension: DimensionProps, borderInset: ReturnType<typeof getBorderInset>) {\n\n return {\n dimensions: {\n width: dimension.width - borderInset.left - borderInset.right,\n height: dimension.height,\n depth: dimension.depth - borderInset.front - borderInset.back,\n },\n position: {\n x: borderInset.left / 2 - borderInset.right / 2,\n y: borderInset.front / 2 - borderInset.back / 2,\n z: 0\n }\n };\n}\n\nexport function calculateRemainingZoneGeometry(zoneGeometry: ReturnType<typeof calculateZoneGeometry>, bordersThk: ReturnType<typeof getBorderThk>) {\n return {\n dimensions: {\n width: zoneGeometry.dimensions.width - bordersThk.left - bordersThk.right,\n height: zoneGeometry.dimensions.height - bordersThk.top - bordersThk.bottom,\n depth: zoneGeometry.dimensions.depth - bordersThk.front - bordersThk.back\n },\n position: {\n x:bordersThk.left / 2 - bordersThk.right / 2,\n y:bordersThk.front / 2 - bordersThk.back / 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, childrenDims: ChildrenDimsResult, dividerThk: number, childTREEIDs: string[]): PositionHelperResult {\n return childrenDims.divisionType\n ? PositionHelper({\n divisionType: childrenDims.divisionType,\n parentDimensions: remainingDims,\n lengthList: childrenDims.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,\n dividerThk,\n childTREEIDs\n );\n}\n\n// ============================================================================\n// COMPLETE ZONE CALCULATION PIPELINE\n// ============================================================================\n\nexport interface ZoneCalculationParams {\n TREEID: string;\n dimension: DimensionProps;\n topShelfThk: number;\n bottomShelfThk: number;\n dividerThk: number;\n linDiv: string;\n updatedDivider?: DividerMode;\n children: AnglZone[];\n elemHelpers: ReturnType<typeof useZoneElemHelpers>; // Pre-calculated from component\n}\n\nexport interface ZoneCalculationResult {\n elemHelpers: ReturnType<typeof useZoneElemHelpers>;\n bordersThk: ReturnType<typeof getZoneBorders>['bordersThk'];\n topTrimThk: ReturnType<typeof getZoneBorders>['topTrimThk'];\n bottomTrimThk: ReturnType<typeof getZoneBorders>['bottomTrimThk'];\n borderInset: ReturnType<typeof getBorderInset>;\n zoneGeometry: ReturnType<typeof calculateZoneGeometry>;\n remainingZone: ReturnType<typeof calculateRemainingZoneGeometry>;\n childPositions?: PositionHelperResult;\n}\n","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}","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\n","import { useCallback, useEffect, useRef } from 'react';\nexport default function useMountedState() {\n var mountedRef = useRef(false);\n var get = useCallback(function () { return mountedRef.current; }, []);\n useEffect(function () {\n mountedRef.current = true;\n return function () {\n mountedRef.current = false;\n };\n }, []);\n return get;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\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","const existenceCache = new Map<string, boolean>();\r\nexport async function CheckUrlExists(url: string): Promise<boolean> {\r\n if (existenceCache.has(url)) {\r\n return existenceCache.get(url)!;\r\n }\r\n\r\n try {\r\n const response = await fetch(url, { method: 'HEAD' });\r\n\r\n if (response.ok) {\r\n existenceCache.set(url, true);\r\n return true;\r\n }\r\n\r\n // Fallback to GET if HEAD not supported\r\n const abortController = new AbortController();\r\n const getResponse = await fetch(url, {\r\n method: 'GET',\r\n signal: abortController.signal\r\n });\r\n abortController.abort();\r\n\r\n const exists = getResponse.ok;\r\n existenceCache.set(url, exists);\r\n return exists;\r\n } catch {\r\n return false; // Don't cache failures\r\n }\r\n}","import { createContext, useContext, 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 { useLoader } from \"@react-three/fiber\";\nimport { TextureLoader, Texture } from \"three\";\nimport { useAsync } from \"react-use\";\nimport { useMemo } from \"react\";\nimport { isRalColor, getRalHexColor } from \"../constants/RalColors\";\nimport { DEFAULT_RENDER_COLOR } from \"../constants/Constants.tsx\";\nimport {CheckUrlExists} from \"../helpers/CheckUrlExists.ts\";\nimport { useTextureConfig, buildTextureUrl } from \"../contexts/texture/TextureConfig.tsx\";\n\nconst PLACEHOLDER_TEXTURE_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\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\n // Check for glass material - handle it early and return directly\n const isGlass = useMemo(() =>\n renderValue?.toLowerCase().includes('glass') ?? false,\n [renderValue]\n );\n\n const ralHex = useMemo(() =>\n renderValue && isRalColor(renderValue) ? getRalHexColor(renderValue) : null,\n [renderValue]\n );\n\n const { value: textureExists, loading: checkingTexture } = useAsync(async () => {\n if (!renderValue || ralHex || isGlass) return false;\n const url = buildTextureUrl(renderValue, textureConfig);\n return await CheckUrlExists(url);\n }, [renderValue, ralHex, isGlass, textureConfig]);\n\n const urlToLoad = useMemo(() => {\n if (ralHex || !renderValue || checkingTexture || !textureExists || isGlass) {\n return PLACEHOLDER_TEXTURE_URL;\n }\n return buildTextureUrl(renderValue, textureConfig);\n }, [ralHex, renderValue, textureExists, checkingTexture, isGlass, textureConfig]);\n\n const texture = useLoader(TextureLoader, 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 // Loading or no value\n if (!renderValue || checkingTexture || textureExists === undefined) {\n return {\n texture: null,\n color: DEFAULT_RENDER_COLOR,\n type: 'fallback',\n isLoading: checkingTexture || textureExists === undefined\n };\n }\n\n // Texture found\n if (textureExists) {\n return { texture, color: null, type: 'texture', isLoading: false };\n }\n\n // Texture not found\n return { texture: null, color: DEFAULT_RENDER_COLOR, type: 'fallback', isLoading: false };\n}","import {memo, 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 \"../../hooks/useMaterialLoader.ts\";\r\nimport {Edges} from \"@react-three/drei\";\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}\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 }: 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\r\n geometry={geometry} onClick={onClick} onPointerEnter={onPointerEnter} onPointerLeave={onPointerLeave}>\r\n <meshStandardMaterial map={texture} color={effectiveColor} opacity={effectiveOpacity} transparent={effectiveOpacity < 1}/>\r\n <Edges color={isSelected ? '#ff6b00' : isHovered ? '#0066ff' : '#2c2929'} />\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 type {ElemHelperType} from \"../../types/helper.types.ts\";\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 cp?: ElemHelperType\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 cp,\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 = cp?.CPNAME ? getDimensionRules(cp.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 {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Front({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.front;\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!elemHlp || !context ) return\n const render_mat = elemHlp.sidePanel?.kms?.render\n console.log(elemHlp)\n\n const {CPNAME} = elemHlp\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\n const {elmTrimThk} = elemHlp\n const startElemThk = helper.left?.thk\n const endElemThk = helper.right?.thk\n\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\n\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\n const panel_thk = elemHlp.thk\n\n const pos_x = -(elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_z = (elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/2)\n const pos_y = -(dimension.depth / 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={[Math.PI / 2, 0, 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={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cp={helper.front}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\r\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport default function Left({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.left;\r\n const context = useContext(DataContext);\r\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\r\n\r\n if (!elemHlp || !context ) return\r\n const render_mat = elemHlp.sidePanel?.kms?.render\r\n\r\n\r\n const {CPNAME} = elemHlp\r\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\r\n const {elmTrimThk} = elemHlp\r\n const startElemThk = helper.back?.thk\r\n const endElemThk = helper.front?.thk\r\n\r\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\r\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\r\n\r\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\r\n const panel_thk = elemHlp.thk\r\n\r\n const pos_x = -(dimension.width / 2 - panel_thk / 2)\r\n const pos_y = (elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/2\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 <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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onPointerEnter={handleMouseEnter}\r\n // onPointerLeave={handleMouseLeave}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onMouseEnter={handleMouseEnter}\r\n // onMouseLeave={handleMouseLeave}\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 />\r\n </g>\r\n )\r\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Back({TREEID, dimension, view, helper}: ElemProps) {\n const elemHlp = helper.back;\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!elemHlp || !context ) return\n const render_mat = elemHlp.sidePanel?.kms?.render\n\n\n const {CPNAME} = elemHlp\n if (!CPNAME || CPNAME.includes('EMPTY') ) return null;\n const {elmTrimThk} = elemHlp\n const startElemThk = helper.right?.thk\n const endElemThk = helper.left?.thk\n\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\n\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\n\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\n const panel_width = dimension.width - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\n const panel_thk = elemHlp.thk\n\n const pos_x = (elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\n const pos_y = dimension.depth / 2 - panel_thk / 2\n const pos_z = elemHlp.oversize.bottom / 2 - elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/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 <PD_3D\n length={panel_length / DIM_NORM}\n width={panel_width / DIM_NORM}\n thk={panel_thk / DIM_NORM}\n treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\n startPanelThk={mitreStartThk / DIM_NORM}\n endPanelThk={mitreEndThk / DIM_NORM}\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 treeId={TREEID}\n rotate={180}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n startPanelThk={view === VIEW._2D_TOP ? mitreStartThk : 0}\n endPanelThk={view === VIEW._2D_TOP ? mitreEndThk : 0}\n cp={helper.back}\n render_mat={render_mat}\n />\n </g>\n )\n}","import {useContext} 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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\r\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\r\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\r\n\r\nexport default function Right({TREEID, dimension, view, helper}: ElemProps) {\r\n const elemHlp = helper.right;\r\n const context = useContext(DataContext);\r\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\r\n\r\n if (!elemHlp || !context ) return\r\n const render_mat = elemHlp.sidePanel?.kms?.render\r\n\r\n\r\n const {CPNAME} = elemHlp\r\n if (!CPNAME || CPNAME.includes('EMPTY')) return null;\r\n const {elmTrimThk} = elemHlp\r\n const startElemThk = helper.front?.thk\r\n const endElemThk = helper.back?.thk\r\n\r\n const startTrimThk = (elemHlp.trim.start === 'S' ? startElemThk : 0) ?? 0\r\n const endTrimThk = (elemHlp.trim.end === 'S' ? endElemThk : 0) ?? 0\r\n\r\n const mitreStartThk = (elemHlp.trim.start === 'M' ? startElemThk : 0) ?? 0\r\n const mitreEndThk = (elemHlp.trim.end === 'M' ? endElemThk : 0) ?? 0\r\n\r\n const panel_length = dimension.height - elmTrimThk.top - elmTrimThk.bottom + elemHlp.oversize.top + elemHlp.oversize.bottom\r\n const panel_width = dimension.depth - startTrimThk - endTrimThk + elemHlp.oversize.start + elemHlp.oversize.end\r\n const panel_thk = elemHlp.thk\r\n\r\n const pos_x = (dimension.width / 2 - panel_thk / 2)\r\n const pos_y = -(elemHlp.oversize.start / 2 - elemHlp.oversize.end / 2 - startTrimThk/2 + endTrimThk/2)\r\n const pos_z = elemHlp.oversize.bottom / 2 + elemHlp.oversize.top / 2 + elmTrimThk.bottom/2 - elmTrimThk.top/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 <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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onPointerEnter={handleMouseEnter}\r\n // onPointerLeave={handleMouseLeave}\r\n startPanelThk={mitreStartThk / DIM_NORM}\r\n endPanelThk={mitreEndThk / DIM_NORM}\r\n render_mat={render_mat}\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 // isSelected={isSelected}\r\n // isHovered={isHovered}\r\n // onClick={handleClick}\r\n // onMouseEnter={handleMouseEnter}\r\n // onMouseLeave={handleMouseLeave}\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 />\r\n </g>\r\n )\r\n}","import {useContext} from \"react\";\nimport {useZoneHelper} from \"../../../helpers/angls/UseZoneHelper.tsx\";\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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\n// Top edge in front view - uses front element data but positioned at top\nexport default function Top({TREEID, dimension, view, helper}: ElemProps) {\n const zoneHlp = useZoneHelper(TREEID)\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!zoneHlp || !context) return\n const render_mat = zoneHlp.topShelfCP?.kms?.render\n\n const {topShelfCP} = zoneHlp\n if (!topShelfCP || topShelfCP.kms?.name?.includes('EMPTY')) return\n\n const frontTrimThk = (helper.front?.trim.top !== 'S' ? helper.front?.thk : 0) ?? 0\n const backTrimThk = (helper.back?.trim.top !== 'S' ? helper.back?.thk : 0) ?? 0\n const leftTrimThk = (helper.left?.trim.top !== 'S' ? helper.left?.thk : 0) ?? 0\n const rightTrimThk = (helper.right?.trim.top !== 'S' ? helper.right?.thk : 0) ?? 0\n\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = zoneHlp.topShelfThk\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 // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n render_mat={render_mat}\n />\n </g>\n )\n}\n","import {useContext} from \"react\";\nimport {useZoneHelper} from \"../../../helpers/angls/UseZoneHelper.tsx\";\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 {DataContext} from \"../../../contexts/article-data/DataContext.ts\";\nimport type {ElemProps} from \"../../../types/Elem.types.tsx\";\nimport {DIM_NORM} from \"../../../constants/Constants.tsx\";\n\nexport default function Bottom({TREEID, dimension, view, helper}: ElemProps) {\n const zoneHlp = useZoneHelper(TREEID)\n const context = useContext(DataContext);\n // const {isSelected, isHovered, handleClick, handleMouseEnter, handleMouseLeave} = useZoneSelection(TREEID);\n\n if (!zoneHlp || !context) return\n const render_mat = zoneHlp.bottomShelfCP?.kms?.render\n\n\n\n const {bottomShelfCP} = zoneHlp\n if (!bottomShelfCP || bottomShelfCP?.kms?.name?.includes('EMPTY')) return\n const frontTrimThk = (helper.front?.trim.bottom !== 'S' ? helper.front?.thk : 0) ?? 0\n const backTrimThk = (helper.back?.trim.bottom !== 'S' ? helper.back?.thk : 0) ?? 0\n const leftTrimThk = (helper.left?.trim.bottom !== 'S' ? helper.left?.thk : 0) ?? 0\n const rightTrimThk = (helper.right?.trim.bottom !== 'S' ? helper.right?.thk : 0) ?? 0\n\n const panel_length = dimension.width - leftTrimThk - rightTrimThk\n const panel_width = dimension.depth - backTrimThk - frontTrimThk\n const panel_thk = zoneHlp.bottomShelfThk\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 // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onPointerEnter={handleMouseEnter}\n // onPointerLeave={handleMouseLeave}\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 treeId={TREEID}\n // isSelected={isSelected}\n // isHovered={isHovered}\n // onClick={handleClick}\n // onMouseEnter={handleMouseEnter}\n // onMouseLeave={handleMouseLeave}\n render_mat={render_mat}\n />\n </g>\n )\n}","import { useContext } from 'react';\nimport { DescriptorContext } from '../contexts/descriptor/DescriptorContext.ts';\nimport type { DescriptorManager } from '../descriptor/services/DescriptorManager';\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","/*\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';\nimport type {DescriptorEvaluationResult, DescriptorNode,} from '../descriptor/types/descriptor.types';\nimport type { DescriptorTypeValue } from '../descriptor/types/descriptor-data.types';\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,\n inputData: Record<string, unknown>,\n options: UseDescriptorOptions = {},\n variableTree: VariableTree\n): UseDescriptorResult<T> {\n const { throwOnError = false } = options;\n\n if (!manager.hasDescriptor(descriptorName)) {throw new Error(`Descriptor ${descriptorName} not found`)}\n\n return useMemo(() => {\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]);\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 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\nexport type DividerType = 'A' | 'B' | 'C' | 'D' | 'F' | 'P' | 'S' | 'T' | 'V'\ntype DividerProps = Pick<AnglZone, '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 TREEID:string\n DIVDIR: DivisionDirection;\n DIVTYPE: DividerType;\n HORDEFTYPE: HorizontalDefType;\n LINDIV1: string; // Linear division formula\n DIVELEM1: number; // Division element ID\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 DIVIDER: '';\n formula: string; // The LINDIV1 value (e.g., \"1:1:1\")\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 DIVIDER: '';\n descriptorName: string; // Extracted descriptor name (without #)\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 DIVIDER: string;\n articleName: string; // e.g., \"TEST_OAL_ART_SUB_001\"\n}\n\n// Article - Descriptor Reference\nexport interface ArticleDescriptor extends BaseDivider {\n type: typeof DividerTypeConst.ARTICLE;\n valueSource: typeof ValueSourceConst.DESCRIPTOR;\n DIVIDER: string;\n descriptorName: string; // e.g., \"ARTICLE_SELECTOR\" (without #)\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 TREEID:string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n formula:string,\n thickness: number,\n ): LinearDivisionString {\n return {\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: '',\n formula,\n thickness,\n };\n },\n\n // Create a linear division with descriptor reference\n // Create linear division with descriptor reference\n linearDivisionDescriptor(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n descriptorName: string,\n thickness: number,\n ): LinearDivisionDescriptor {\n return {\n TREEID,\n type: DividerTypeConst.LINEAR_DIVISION,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: '',\n descriptorName,\n thickness,\n };\n },\n\n\n // Create an article divider\n // Create article with direct name string\n articleString(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n articleName: string\n ): ArticleString {\n return {\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.STRING,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: articleName,\n articleName,\n };\n },\n\n // Create article with descriptor reference\n articleDescriptor(\n TREEID: string,\n DIVDIR: DivisionDirection,\n DIVTYPE: DividerType,\n HORDEFTYPE: HorizontalDefType,\n LINDIV1: string,\n DIVELEM1: number,\n descriptorName: string\n ): ArticleDescriptor {\n return {\n TREEID,\n type: DividerTypeConst.ARTICLE,\n valueSource: ValueSourceConst.DESCRIPTOR,\n DIVDIR,\n DIVTYPE,\n HORDEFTYPE,\n LINDIV1,\n DIVELEM1,\n DIVIDER: descriptorName,\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\n // ========== ARTICLE DIVIDER ==========\n if (divProps.DIVDIR === 'A') {\n // Article with descriptor reference\n if (isDescriptor(divProps.DIVIDER)) {\n const descriptorName = divProps.DIVIDER.replace('#', '').trim();\n return createDivider.articleDescriptor(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n descriptorName\n );\n }\n\n // Article with direct name string\n return createDivider.articleString(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.DIVIDER\n );\n }\n\n // ========== LINEAR DIVISION ==========\n // Linear division with descriptor reference\n if (isDescriptor(divProps.LINDIV1)) {\n const descriptorName = divProps.LINDIV1.replace('#', '').trim();\n return createDivider.linearDivisionDescriptor(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n descriptorName,\n thickness\n );\n }\n\n // Linear division with direct formula string\n return createDivider.linearDivisionString(\n divProps.TREEID,\n divProps.DIVDIR,\n divProps.DIVTYPE,\n divProps.HORDEFTYPE,\n divProps.LINDIV1,\n divProps.DIVELEM1,\n divProps.LINDIV1,\n thickness\n );\n },\n};\n\n// Get the article name (direct or needs evaluation)\nexport function getArticleName(divider: DividerMode): string | undefined {\n if (isArticle.string(divider)) {\n return divider.articleName;\n }\n return undefined;\n}\n\n// Get the article descriptor name (if it needs evaluation)\nexport function getArticleDescriptorName(divider: DividerMode): string | undefined {\n if (isArticle.descriptor(divider)) {\n return divider.descriptorName;\n }\n return undefined;\n}\n\n// Get the linear division formula (direct or needs evaluation)\nexport function getFormula(divider: DividerMode): string | undefined {\n if (isLinearDivision.string(divider)) {\n return divider.formula;\n }\n return undefined;\n}\n\n// Get the linear division descriptor name (if it needs evaluation)\nexport function getLinearDescriptorName(divider: DividerMode): string | undefined {\n if (isLinearDivision.descriptor(divider)) {\n return divider.descriptorName;\n }\n return undefined;\n}\n\n// Check if divider needs descriptor evaluation\nexport function needsDescriptorEvaluation(divider: DividerMode): boolean {\n return divider.valueSource === ValueSourceConst.DESCRIPTOR;\n}\n\n// Get descriptor name (works for both article and linear division)\nexport function getDescriptorName(divider: DividerMode): string | undefined {\n if (divider.valueSource === ValueSourceConst.DESCRIPTOR) {\n return divider.descriptorName;\n }\n return undefined;\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}","// ============================================================================\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* - handle specially\n if (lindiv.includes('n*')) {\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)?:(\\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 {useDescriptorManager} from './useDescriptorManager';\r\nimport {useDescriptorEvaluation} from './useDescriptor';\r\nimport {type DividerMode, isArticle} from '../types/divider.types';\r\nimport {useVariables} from \"../variables/useVariables.ts\";\r\nimport {resolveLindivValue} from \"../helpers/LindivResolver.ts\";\r\n\r\nexport interface UseZoneDescriptorOptions {\r\n inputData: Record<string, unknown>\r\n divider?: DividerMode\r\n}\r\n\r\nexport function ZoneDescriptor({ divider, inputData }: UseZoneDescriptorOptions) {\r\n const manager = useDescriptorManager();\r\n const {resolveString, tree:variableTree} = useVariables()\r\n\r\n const { result, error } = useDescriptorEvaluation(manager,(divider as any).descriptorName, inputData, { throwOnError: false },variableTree);\r\n\r\n if (error){\r\n console.error('error : from useDescriptorEvaluation',error)\r\n }\r\n\r\n\r\n const articleName = useMemo(() => {\r\n if (!divider) return '';\r\n\r\n if (isArticle.string(divider)) {\r\n return divider.articleName;\r\n }\r\n\r\n if (isArticle.descriptor(divider) && result?.lindiv) {\r\n return result.lindiv;\r\n }\r\n\r\n return '';\r\n }, [divider, result]);\r\n\r\n\r\n\r\n\r\n const updatedDivider = useMemo(() => {\r\n if (!divider) return undefined;\r\n\r\n // If it's a descriptor-based divider and we have a result, update LINDIV1\r\n if (result?.lindiv != undefined) {\r\n\r\n let resolvedVar = resolveString(result.lindiv)\r\n\r\n const xValue = inputData['X']\r\n if (xValue) resolvedVar = resolvedVar.replace(/\\bX\\b/g, String(xValue))\r\n const resolvedValue = resolveLindivValue(resolvedVar)\r\n return {\r\n ...divider,\r\n LINDIV1: resolvedValue, // Replace the descriptor reference with actual formula\r\n articleName: articleName,\r\n };\r\n }\r\n\r\n return {...divider, LINDIV1: resolveString(divider.LINDIV1)};\r\n }, [divider, result, articleName, resolveString]);\r\n\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, useContext} from \"react\";\nimport PD_3D from \"../../../elements_manager/PD_3D.tsx\";\nimport Zone from \"../../Zone.tsx\";\nimport {DataContext} from \"../../../../contexts/article-data/DataContext.ts\";\nimport {ArticleContext} from \"../../../../contexts/article/ArticleContext.ts\";\nimport GroupWrapper from \"../../../../helpers/GroupWrapper.tsx\";\nimport PD_2D from \"../../../elements_manager/PD_2D.tsx\";\nimport {type DividerMode} from \"../../../../types/divider.types.ts\";\nimport {calculateRemainingZoneGeometry} from \"../../../../helpers/ZoneCalculations.tsx\";\nimport {DIM_NORM} from \"../../../../constants/Constants.tsx\";\n\ntype DividerType = '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: DividerType, 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 childrenPositon: PositionHelperResult\n dividerThk: number\n divider: DividerMode\n view: VIEW,\n remainingZone:ReturnType<typeof calculateRemainingZoneGeometry>\n}\n\nexport function LinearDividerRender({divider, view, childrenPositon, dividerThk}: DividerProps) {\n const context = useContext(DataContext);\n const articleContext = useContext(ArticleContext);\n\n const type = childrenPositon.dividerType;\n const children = childrenPositon.childPositions;\n const cfg = CONFIG[type];\n if (!context) return null\n // const {selectedElem, setSelectedElem, hoveredElem, setHoveredElem} = context;\n const articleName = articleContext?.articleName || 'default';\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 // const isDividerSelected = selectedElem === dividerId;\n // const isDividerHovered = hoveredElem === dividerId;\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 // isSelected={isDividerSelected}\n // isHovered={isDividerHovered}\n // onClick={() => setSelectedElem(isDividerSelected ? null : dividerId)}\n // onPointerEnter={() => setHoveredElem(dividerId)}\n // onPointerLeave={() => setHoveredElem(null)}\n />\n :\n <PD_2D\n {...dims_2d}\n text={dividerId}\n treeId={dividerId}\n // isSelected={isDividerSelected}\n // isHovered={isDividerHovered}\n // onClick={() => setSelectedElem(isDividerSelected ? null : dividerId)}\n // onMouseEnter={() => setHoveredElem(dividerId)}\n // onMouseLeave={() => setHoveredElem(null)}\n />\n }\n </>\n }\n </GroupWrapper>\n <Zone 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 {ArticleProvider} from \"../../../../contexts/article/ArticleProvider.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 <ArticleProvider articleName={articleName} >\r\n <GroupWrapper view={view} position={[remainingZone.position.x, remainingZone.position.y, remainingZone.position.z]}>\r\n <Zone TREEID={'0'} dimension={remainingZone.dimensions} view={view} />\r\n </GroupWrapper>\r\n </ArticleProvider >\r\n )\r\n}","import {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\n\r\ninterface DividerProps {\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({childrenPositon, dividerThk, divider, view, remainingZone}:DividerProps){\r\n if (isDivider.linearDivision(divider)){\r\n if (!childrenPositon) return null;\r\n return <LinearDividerRender view={view} childrenPositon={childrenPositon} dividerThk={dividerThk} divider={divider} remainingZone={remainingZone}/>\r\n }\r\n\r\n if (isDivider.article(divider)){\r\n const articleName = isArticle.string(divider) ? divider.articleName : divider.LINDIV1;\r\n if (!remainingZone || articleName === '') return null;\r\n return <SubArticleRender view={view} articleName={articleName} remainingZone={remainingZone} />\r\n }\r\n\r\n return null;\r\n}","import {useData} from \"../../hooks/useData.ts\";\r\nimport {useArticle} from \"../../hooks/useArticle.ts\";\r\nimport {useVariables} from \"../../variables/useVariables.ts\";\r\nimport {resolveValue} from \"../ExpressionResolver.ts\";\r\n\r\nexport default function usePrimHelper() {\r\n const {getArticleData} = useData();\r\n const {articleName, dimensionOverrides} = useArticle();\r\n const {resolveString} = useVariables()\r\n\r\n // Get data for this specific article\r\n const {anglPrims} = getArticleData(articleName);\r\n if (anglPrims.length === 0) throw new Error(`No prims found for article: ${articleName}`);\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(resolveString(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 current_prim,\r\n prim_dims\r\n }\r\n}","import type {ZoneProps} from \"../../types/zone.types.tsx\";\r\nimport {useZoneHelper} from \"../../helpers/angls/UseZoneHelper.tsx\";\r\nimport {\r\n calculateChildPositionsFromGeometry,\r\n calculateRemainingZoneGeometry,\r\n calculateZoneGeometry,\r\n getBorderInset,\r\n getBorderThk,\r\n useZoneElemHelpers\r\n} from \"../../helpers/ZoneCalculations.tsx\";\r\nimport {backTreeId, DIM_NORM, frontTreeId, leftTreeId, rightTreeId} from \"../../constants/Constants.tsx\";\r\nimport Front from \"./zoneElems/Front.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 Top from \"./zoneElems/Top.tsx\";\r\nimport Bottom from \"./zoneElems/Bottom.tsx\";\r\nimport {ZoneDescriptor} from \"../../hooks/zoneDescriptor.ts\";\r\nimport Divider from \"./zoneElems/Divider.tsx\";\r\nimport {\r\n createDivider,\r\n getDividedAxis,\r\n getDividedLength,\r\n isArticle,\r\n isLinearDivision\r\n} from \"../../types/divider.types.ts\";\r\nimport usePrimHelper from \"../../helpers/angls/UsePrimHelper.tsx\";\r\n\r\nexport default function Zone({TREEID, dimension, view=VIEW._3D}: ZoneProps) {\r\n // console.log(`====== Zone Start ${TREEID} ========`)\r\n\r\n const zoneHelper = useZoneHelper(TREEID);\r\n const zoneInfo = zoneHelper?.zoneInfo()\r\n const dividerThk = zoneHelper?.dividerThk || 0;\r\n const prim = usePrimHelper()\r\n\r\n const elemHelpers = useZoneElemHelpers(TREEID)\r\n const borderThk = getBorderThk(elemHelpers, zoneHelper?.topShelfThk || 0, zoneHelper?.bottomShelfThk || 0)\r\n const borderInset = getBorderInset(elemHelpers)\r\n const zoneGeometry = calculateZoneGeometry(dimension, borderInset)\r\n const remainingZone = calculateRemainingZoneGeometry(zoneGeometry, borderThk)\r\n\r\n if (!zoneHelper) return\r\n const divider = createDivider.fromZoneData(zoneHelper.currentZone,dividerThk);\r\n\r\n const inputData = zoneInfo ? Object.fromEntries(zoneInfo) : {};\r\n const dividerAxis = getDividedAxis(divider)\r\n const dividedLength = getDividedLength(dividerAxis, remainingZone.dimensions)\r\n\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 inputData['X'] = dividedLength.toString();\r\n\r\n // Evaluate descriptor to get linear division formula\r\n const isLinDivDescriptor = divider ? isLinearDivision.descriptor(divider) : false;\r\n const isArticleDescriptor = divider ? isArticle.descriptor(divider) : false;\r\n const isDescriptor = isLinDivDescriptor || isArticleDescriptor;\r\n\r\n const updatedDivider = isDescriptor ? ZoneDescriptor({divider, inputData}).updatedDivider : divider\r\n\r\n const childPositions = calculateChildPositionsFromGeometry(remainingZone, dividerThk, updatedDivider, zoneHelper?.children.map((child) => child.TREEID) || []);\r\n\r\n return (\r\n <>\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?.CPNAME && <Front view={view} TREEID={frontTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/>}\r\n {elemHelpers.left?.CPNAME && <Left view={view} TREEID={leftTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.back?.CPNAME && <Back view={view} TREEID={backTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {elemHelpers.right?.CPNAME && <Right view={view} TREEID={rightTreeId(TREEID)} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.topShelfCP && <Top view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers}/> }\r\n {zoneHelper?.bottomShelfCP && <Bottom view={view} TREEID={TREEID} dimension={zoneGeometry.dimensions} helper={elemHelpers} /> }\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 remainingZone={remainingZone} divider={updatedDivider} view={view} childrenPositon={childPositions} dividerThk={dividerThk} /> }\r\n </GroupWrapper>\r\n </GroupWrapper>\r\n </>\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>\r\n <boxGeometry args={[width + 0.002, depth + 0.002, height + 0.002]}/>\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 {useContext, useMemo} from \"react\";\r\nimport {VIEW} from \"../../types/view.types.ts\";\r\nimport Zone from \"./Zone.tsx\";\r\nimport usePrimHelper from \"../../helpers/angls/UsePrimHelper.tsx\";\r\nimport {ArticleContext} from \"../../contexts/article/ArticleContext.ts\";\r\nimport Highlighter from \"./Highlighter.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\n\r\nconst SVG_TRANSFORM = \"scale(1,-1)\";\r\n\r\nexport default function Designer({view = VIEW._3D, isSelected, position}: { view: VIEW, isSelected:boolean, position:[number,number,number]}) {\r\n const { prim_dims } = usePrimHelper();\r\n const articleName = useContext(ArticleContext)?.articleName ?? 'default';\r\n\r\n const zone = useMemo(\r\n () => <Zone key={`${articleName}-0`} TREEID=\"0\" view={view} dimension={prim_dims} />,\r\n [articleName, view, prim_dims]\r\n );\r\n\r\n const is3D = view === VIEW._3D;\r\n\r\n return (\r\n <>\r\n <GroupWrapper view={view} position={[position[0], position[1], prim_dims.height/DIM_NORM/2]}>\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\r\n}","// ArticleDesigner.tsx - Single Article Renderer\nimport {memo} from \"react\";\nimport GroupWrapper from \"../../helpers/GroupWrapper.tsx\";\nimport {ArticleProvider} from \"../../contexts/article/ArticleProvider.tsx\";\nimport {\n ArticleRelatedVariableProvider\n} from \"../../contexts/article-related-variables/ArticleRelatedVariableProvider.tsx\";\nimport {VIEW} from \"../../types/view.types.ts\";\nimport {LevaVariableController} from \"../ui/test/LevaVariableController.tsx\";\nimport Designer from \"./Designer.tsx\";\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\n\nexport interface ArticleDesignerProps {\n article:ArticleGroupTypes\n articleId:string // Add articleId\n position:[number, number, number]\n isSelected:boolean\n onSelect:()=>void\n view:VIEW\n debugMode:boolean\n}\n\nexport const ArticleDesigner = memo(function ArticleDesigner({article, articleId, position, isSelected, onSelect, view, debugMode}: ArticleDesignerProps) {\n\n return (\n <GroupWrapper view={view} onClick={onSelect}>\n <ArticleProvider articleName={article.name} articleId={articleId} dimensionOverrides={article.dimensions}>\n <ArticleRelatedVariableProvider overrides={article.variables}>\n {debugMode && view === VIEW._3D && isSelected && <LevaVariableController/>}\n <Designer view={view} isSelected={isSelected} position={position} />\n </ArticleRelatedVariableProvider>\n </ArticleProvider>\n </GroupWrapper>\n );\n});","// ArticleGroupLayout.tsx - Multi-Article Positioning & Layout\r\nimport {useMemo, useState} from \"react\";\r\nimport {DIM_NORM} from \"../../constants/Constants.tsx\";\r\nimport type {ArticleGroupTypes} from \"../../types/article-group.types.ts\";\r\nimport type {VIEW} from \"../../types/view.types.ts\";\r\nimport {ArticleDesigner} from \"./ArticleDesigner.tsx\";\r\nimport GroupWrapper from \"../../helpers/GroupWrapper.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}\r\n\r\nexport function ArticleGroupLayout({articleList, validNames, view, debugMode, isZCentered}: ArticleGroupLayoutProps) {\r\n const [selectedArticleId, setSelectedArticleId] = useState<string | null>();\r\n\r\n // Calculate max height for centering\r\n const maxHeight = useMemo(() => Math.max(...articleList.map(a => a.dimensions.height)), [articleList]);\r\n const maxDepth = useMemo(() => Math.max(...articleList.map(a => a.dimensions.depth)), [articleList]);\r\n const totalWidth = useMemo(() => articleList.reduce((acc, article) => acc + article.dimensions.width / DIM_NORM, 0), [articleList]);\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 articleList.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 }, [articleList, centerX]);\r\n\r\n return (\r\n articlePositions.map(({articleId, position, article}) => {\r\n if (!validNames?.has(article.name)) return null;\r\n return (\r\n <GroupWrapper key={articleId} view={view} position={[0,-centerY/DIM_NORM,-centerZ/DIM_NORM]} >\r\n <ArticleDesigner\r\n key={articleId}\r\n article={article}\r\n articleId={articleId}\r\n position={position}\r\n isSelected={selectedArticleId === articleId}\r\n onSelect={() => setSelectedArticleId(articleId)}\r\n view={view}\r\n debugMode={debugMode}\r\n />\r\n </GroupWrapper>\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\";\n\nexport default function ArticleGroupDesigner({view, data, articleList, debugMode = false, isZCentered = false}: 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(() => api.articleData().fetchBulk(articleNames),\n [articleNamesKey] // Use stable key instead of array\n );\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}/>\n </DescriptorProvider>\n </VariableProvider>\n </MatSurfProvider>\n </DataProvider>\n );\n}","import {VAR_TYPE} from '../../../variables/variable.types';\nimport {useVariables} from \"../../../variables/useVariables.ts\";\nimport './VarController.css';\n\ninterface VariableGroup {\n type: VAR_TYPE;\n label: string;\n variables: Array<{\n name: string;\n value: string | number;\n reference?: string;\n rawType: number;\n }>;\n}\n\nexport default function VarController() {\n const { tree, getValue, setVarValue } = useVariables();\n\n // Handle value change - applies immediately\n const handleValueChange = (varName: string, newValue: string) => {\n const numValue = Number(newValue);\n setVarValue(varName, isNaN(numValue) ? newValue : numValue);\n };\n\n // Group variables by type\n const groupVariables = (): VariableGroup[] => {\n const groups: Record<number, VariableGroup> = {\n [VAR_TYPE.Numeric]: { type: VAR_TYPE.Numeric, label: 'Dimensions (Numeric)', variables: [] },\n [VAR_TYPE.Surface]: { type: VAR_TYPE.Surface, label: 'Surfaces', variables: [] },\n [VAR_TYPE.Material]: { type: VAR_TYPE.Material, label: 'Materials', variables: [] },\n [VAR_TYPE.Text]: { type: VAR_TYPE.Text, label: 'Text', variables: [] },\n [VAR_TYPE.Profile]: { type: VAR_TYPE.Profile, label: 'Profiles', variables: [] },\n [VAR_TYPE.Kms]: { type: VAR_TYPE.Kms, label: 'Part definition', variables: [] },\n [VAR_TYPE.color]: { type: VAR_TYPE.color, label: 'Color principle', variables: [] },\n\n };\n\n Array.from(tree.entries()).forEach(([name, variable]) => {\n const resolvedValue = getValue(name);\n const isReference = variable.WERT.startsWith('$');\n\n groups[variable.TYP]?.variables.push({\n name,\n value: resolvedValue ?? 'undefined',\n reference: isReference ? variable.WERT : undefined,\n rawType: variable.TYP\n });\n });\n\n return Object.values(groups).filter(g => g.variables.length > 0);\n };\n\n const groups = groupVariables();\n groups.sort((a, b) => b.type - a.type);\n\n // Render input based on variable type - always editable\n // Render input based on variable type - always editable\n const renderInput = (variable: VariableGroup['variables'][0]) => {\n const isNumeric = variable.rawType === VAR_TYPE.Numeric;\n const numValue = typeof variable.value === 'number' ? variable.value : Number(variable.value);\n\n if (isNumeric && !isNaN(numValue)) {\n // Slider + number input for numeric types\n return (\n <div className=\"var-controller__slider-container\">\n <input\n type=\"range\"\n min={0}\n max={20000}\n value={numValue}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__slider\"\n />\n <input\n type=\"number\"\n value={numValue}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n onBlur={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__number-input\"\n min={0}\n max={20000}\n />\n </div>\n );\n } else {\n // Text input for other types - updates on blur or Enter\n return (\n <input\n type=\"text\"\n value={variable.value}\n onChange={(e) => handleValueChange(variable.name, e.target.value)}\n onBlur={(e) => handleValueChange(variable.name, e.target.value)}\n className=\"var-controller__text-input\"\n />\n );\n }\n };\n\n return (\n <div className=\"var-controller\" style={{maxHeight:'1000px',overflowY:'scroll'}}>\n <h2>Variable Controller</h2>\n <p className=\"var-controller__header\">\n Total variables: {tree.size}\n </p>\n\n {groups.map(group => (\n <section key={group.type} className=\"var-controller__section\">\n <h3 className=\"var-controller__section-title\">\n {group.label} ({group.variables.length})\n </h3>\n\n <table className=\"var-controller__table\">\n <thead>\n <tr>\n <th style={{ width: '25%' }}>Variable Name</th>\n <th style={{ width: '35%' }}>Current Value</th>\n <th style={{ width: '25%' }}>Reference</th>\n <th className=\"center\" style={{ width: '15%' }}>Type</th>\n </tr>\n </thead>\n <tbody>\n {group.variables.map((variable) => (\n <tr key={variable.name}>\n <td className=\"var-controller__var-name\">\n {variable.name}\n </td>\n <td>\n {renderInput(variable)}\n </td>\n <td className=\"var-controller__reference\">\n {variable.reference || '-'}\n </td>\n <td style={{ textAlign: 'center' }}>\n <span className=\"var-controller__type-badge\">\n {group.type}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n ))}\n\n {/* Quick Stats */}\n <section className=\"var-controller__stats\">\n <h4>Quick Stats</h4>\n <ul>\n {groups.map(group => (\n <li key={group.type}>\n {group.label}: {group.variables.length} variables\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\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// ============================================================================\n\nexport { DataProvider } from './contexts/article-data/DataProvider';\nexport { MatSurfProvider } from './contexts/mat-surf/MatSurfProvider';\nexport { ArticleRelatedVariableProvider } from './contexts/article-related-variables/ArticleRelatedVariableProvider.tsx';\nexport { ArticleProvider } from './contexts/article/ArticleProvider';\nexport { VariableProvider } from './variables/VariableProvider';\nexport { DescriptorProvider } from './contexts/descriptor/DescriptorProvider';\nexport { TextureConfigProvider } from './contexts/texture/TextureConfig';\n\n// Contexts for advanced usage\nexport { DataContext } from './contexts/article-data/DataContext';\nexport { ArticleContext } from './contexts/article/ArticleContext';\nexport { VariableContext } from './variables/VariableContext';\nexport { TextureConfigContext } from './contexts/texture/TextureConfig';\nexport { DescriptorContext } from './contexts/descriptor/DescriptorContext';\n\n// ============================================================================\n// HOOKS\n// ============================================================================\n\nexport { useVariables } from './variables/useVariables';\nexport { useArticle } from './hooks/useArticle';\nexport { useDescriptorEvaluation, useDescriptorMatches } from './hooks/useDescriptor';\nexport { useData } from './hooks/useData';\nexport { useDescriptorManager } from './hooks/useDescriptorManager';\nexport { ZoneDescriptor } from './hooks/zoneDescriptor';\n\n// ============================================================================\n// UI COMPONENTS (OPTIONAL)\n// ============================================================================\n\nexport { default as VarController } from './components/ui/controls/VarController';\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","APIFactory","api","DataContext","createContext","DataProvider","children","names","staticData","editableData","setEditableData","selectedElem","setSelectedElem","hoveredElem","setHoveredElem","getArticleData","useCallback","articleName","elem","zone","prim","clie","grtx","variable","anglElems","anglZones","anglPrims","anglClies","anglGrtxs","csides","kmsList","cabins","variables","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","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","unit","isIfStatement","evaluateIfStatement","isMathExpression","evaluateExpression","coerceByDataType","resolveValue","expr","content","parts","splitIfParts","conditionStr","trueValueStr","falseValueStr","resultStr","evaluateCondition","current","depth","i","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","queueTrigger","setQueueTrigger","queueMaterialFetch","wasEmpty","queueSurfaceFetch","fetchMaterial","material","next","fetchSurface","surface","toFetch","VIEW","LoadingIndicator","view","loadingContent","jsxs","Html","ErrorDisplay","insideCanvas","errorContent","GroupWrapper","position","rotation","onClick","x","y","angle","ArticleContext","ArticleProvider","articleId","dimensionOverrides","useVariables","get","has","ArticleRelatedVariableProvider","overrides","parentContext","dynamicChanges","setDynamicChanges","newChanges","useArticle","LevaVariableController","updatingFromTreeRef","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","materialName","resolvedRender","renderInfo","SurfHelper","surfaceName","useKmsHelper","NAME","currentKms","kms","surfaceTopName","surfaceBottomName","surfaceTop","surfaceBottom","render","CabinHelper","cabin","cside","kmsName","KmsHelper","useZoneHelper","currentZone","TAGNAME","CPNAME","CPTypeCode","CSideHelper","sidePanel","CpDispatcher","CpName","PartType","useElemHelper","currentElem","parentZoneId","parentZone","clieThickness","thk","resolvedInset","inset","color","topThk","bottomThk","oversize","trim","elmTrimThk","EvaluationErrors","message","Scanner","_Scanner","source","tokens","oldestKey","lexeme","fullVariable","allowedSpecialVariables","identifier","functionType","Parser","ast","nextToken","sections","singleSection","functionName","arg","errorMessage","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","parser","evaluator","processLindiv","evaluationResult","LinDivPatternTransform","exactPattern","count","extractNumberFromIndependentDiv","LinDivHelper","divider","dimensions","divided_length","LINDIV1","DIVDIR","HORDEFTYPE","DIVELEM1","divisionType","isReversed","divided_length_list","transformedLindiv","unrefIndependentDiv","zone_dimensions","length","PositionHelper","parentDimensions","lengthList","childTREEIDs","startX","startY","startZ","acc","index","zone_dims","useZoneElemHelpers","getBorderThk","elemHelpers","topShelfThk","bottomShelfThk","getBorderInset","calculateZoneGeometry","dimension","borderInset","calculateRemainingZoneGeometry","zoneGeometry","bordersThk","calculateChildPositions","remainingDims","childrenDims","calculateChildPositionsFromGeometry","remainingZoneGeometry","calculateMitrePoints","thickness","halfLength","halfThickness","points","Shape","__assign","n","useMountedState","mountedRef","useAsyncFn","initialState","lastCallId","isMounted","_a","state","set","args","_i","callId","prevState","useAsync","ralColorsMap","getRalHexColor","ralCode","isRalColor","existenceCache","CheckUrlExists","abortController","getResponse","exists","defaultConfig","TextureConfigContext","TextureConfigProvider","useTextureConfig","buildTextureUrl","renderMat","textureBaseUrl","textureFolder","textureExtension","textureSuffix","PLACEHOLDER_TEXTURE_URL","useMaterialLoader","renderValue","textureConfig","isGlass","ralHex","textureExists","checkingTexture","urlToLoad","texture","useLoader","TextureLoader","PD_3D","memo","width","opacity","isSelected","isHovered","onPointerEnter","onPointerLeave","render_mat","materialOpacity","effectiveColor","effectiveOpacity","geometry","shape","geo","ExtrudeGeometry","BoxGeometry","Edges","defaultRule","dimensionRules","getDimensionRules","cpName","rule","pattern","matchCPName","regexPattern","DimensionLines","height","rules","offset","lineStyle","strokeWidth","fontSize","arrowSize","positions","pos","idx","label","PD_2D","dim_x","dim_y","text","stroke_width","rotate","onMouseEnter","onMouseLeave","cp","svgPath","strokeColor","effectiveStrokeWidth","fill","Front","helper","elemHlp","startElemThk","endElemThk","startTrimThk","endTrimThk","mitreStartThk","mitreEndThk","panel_length","panel_width","panel_thk","pos_x","pos_z","pos_y","Left","Back","Right","Top","zoneHlp","topShelfCP","frontTrimThk","backTrimThk","leftTrimThk","rightTrimThk","Bottom","bottomShelfCP","useDescriptorManager","useDescriptorEvaluation","throwOnError","useDescriptorMatches","DividerTypeConst","ValueSourceConst","isDivider","isLinearDivision","isArticle","createDivider","DIVTYPE","formula","divProps","isDescriptor","getDividedAxis","PERPENDICULAR_AXIS_MAP","getDividedLength","axis","resolveWithNStar","lindiv","sectionData","hasNStar","cleaned","resolveLindiv","original","isLindivReference","format","suffix","parseLindiv","cleanExpression","finalValue","resolveLindivValue","cleanInput","ratioFirstMatch","ratio","exprRatioMatch","bracesMatch","star","ZoneDescriptor","resolvedVar","xValue","resolvedValue","CONFIG","d","getDividerPos","LinearDividerRender","childrenPositon","articleContext","cfg","showDiv","divPos","dims_3d","dims_2d","dividerId","Fragment","Zone","SubArticleRender","remainingZone","Divider","usePrimHelper","current_prim","DIMCALCF","SIZE","dimOverride","resolved","prim_dims","zoneHelper","borderThk","dividerAxis","dividedLength","isLinDivDescriptor","isArticleDescriptor","updatedDivider","childPositions","Highlighter","SVG_TRANSFORM","Designer","is3D","ArticleDesigner","article","onSelect","debugMode","ArticleGroupLayout","articleList","validNames","isZCentered","selectedArticleId","setSelectedArticleId","maxHeight","maxDepth","totalWidth","centerZ","centerY","centerX","positionAcc","ArticleGroupDesigner","articleNames","articleNamesKey","fetchArticleData","shouldFetch","apiData","finalData","validArticleNames","VarController","handleValueChange","groups","isReference","renderInput","isNumeric","group","VERSION"],"mappings":"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","x_google_ignoreList":[43,49,50,51,52]}
|