@twinfinity/printing 6.0.1-ci.28952-beta → 6.0.2-beta
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/README.md +3 -3
- package/dist/BuildInfo.js +3 -3
- package/dist/BuildInfo.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/analyzeTemplate.js.map +1 -1
- package/dist/layout/clipUtils.js.map +1 -1
- package/dist/layout/colorConstants.js.map +1 -1
- package/dist/layout/elementKinds.js.map +1 -1
- package/dist/layout/exportDrawing.js.map +1 -1
- package/dist/layout/filters.js.map +1 -1
- package/dist/layout/geometryConstants.js.map +1 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/itemBuilders.js.map +1 -1
- package/dist/layout/labelsRender.js.map +1 -1
- package/dist/layout/legendConstants.js.map +1 -1
- package/dist/layout/legendRender.js.map +1 -1
- package/dist/layout/legendRows.js.map +1 -1
- package/dist/layout/legendUtils.js.map +1 -1
- package/dist/layout/metadata.js.map +1 -1
- package/dist/layout/model.js.map +1 -1
- package/dist/layout/options.js.map +1 -1
- package/dist/layout/presets.js.map +1 -1
- package/dist/layout/qrRender.js.map +1 -1
- package/dist/layout/renderDrawing.js.map +1 -1
- package/dist/layout/renderUtils.js.map +1 -1
- package/dist/layout/sectionValidation.js.map +1 -1
- package/dist/layout/templateVariables.js.map +1 -1
- package/dist/layout/typeGuards.js.map +1 -1
- package/dist/layout/types.js.map +1 -1
- package/dist/layout/utils.js.map +1 -1
- package/dist/layout/validation.js.map +1 -1
- package/dist/layout/validationHelpers.js.map +1 -1
- package/dist/layout/validationUtils.js.map +1 -1
- package/dist/layout/viewportPrep.js.map +1 -1
- package/dist/layout/viewportRender.js.map +1 -1
- package/dist/layout/viewportUtils.js.map +1 -1
- package/dist/layout/warnings.js.map +1 -1
- package/dist/printToPdf.js.map +1 -1
- package/dist/printToSvg.js.map +1 -1
- package/dist/sections.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/BuildInfo.ts +41 -41
- package/src/index.ts +10 -10
- package/src/layout/analyzeTemplate.ts +218 -218
- package/src/layout/clipUtils.ts +193 -193
- package/src/layout/colorConstants.ts +16 -16
- package/src/layout/elementKinds.ts +35 -35
- package/src/layout/exportDrawing.ts +206 -206
- package/src/layout/filters.ts +80 -80
- package/src/layout/geometryConstants.ts +11 -11
- package/src/layout/index.ts +671 -671
- package/src/layout/itemBuilders.ts +159 -159
- package/src/layout/labelsRender.ts +170 -170
- package/src/layout/legendConstants.ts +11 -11
- package/src/layout/legendRender.ts +543 -543
- package/src/layout/legendRows.ts +62 -62
- package/src/layout/legendUtils.ts +144 -144
- package/src/layout/metadata.ts +210 -210
- package/src/layout/model.ts +372 -372
- package/src/layout/options.ts +17 -17
- package/src/layout/presets.ts +51 -51
- package/src/layout/qrRender.ts +126 -126
- package/src/layout/qrcode.d.ts +2 -2
- package/src/layout/renderDrawing.ts +710 -710
- package/src/layout/renderUtils.ts +138 -138
- package/src/layout/sectionValidation.ts +2 -2
- package/src/layout/templateVariables.ts +317 -317
- package/src/layout/typeGuards.ts +9 -9
- package/src/layout/types.ts +835 -835
- package/src/layout/utils.ts +85 -85
- package/src/layout/validation.ts +392 -392
- package/src/layout/validationHelpers.ts +59 -59
- package/src/layout/validationUtils.ts +6 -6
- package/src/layout/viewportPrep.ts +351 -351
- package/src/layout/viewportRender.ts +442 -442
- package/src/layout/viewportUtils.ts +50 -50
- package/src/layout/warnings.ts +3 -3
- package/src/printToPdf.ts +108 -108
- package/src/printToSvg.ts +188 -188
- package/src/sections.ts +1019 -1019
- package/src/types.ts +49 -49
package/README.md
CHANGED
|
@@ -203,6 +203,6 @@ Default templates (A0-A4, landscape/portrait) and a JSON schema for IDE validati
|
|
|
203
203
|
|
|
204
204
|
## Documentation
|
|
205
205
|
|
|
206
|
-
- [Template reference (field-by-field)](../../docs/
|
|
207
|
-
- [Template guide (practical examples)](../../docs/
|
|
208
|
-
- [Architecture overview](../../docs/specs/printing-architecture.md)
|
|
206
|
+
- [Template reference (field-by-field)](../../docs/reference/printing-template-reference.md)
|
|
207
|
+
- [Template guide (practical examples)](../../docs/runbooks/printing-template-guide.md)
|
|
208
|
+
- [Architecture overview](../../docs/specs/packages/printing/printing-architecture.md)
|
package/dist/BuildInfo.js
CHANGED
package/dist/BuildInfo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildInfo.js","sourceRoot":"/","sources":["BuildInfo.ts"],"names":[],"mappings":"AAyBA,MAAM,GAAG,GAAc;IACnB,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,EAAE,EAAE,MAAM;IACV,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,MAAM;CACpB,CAAC;AAED,GAAG,CAAC,OAAkB,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;AAC7F,IAAI,GAAG,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;IAChC,GAAG,CAAC,SAAuB,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"BuildInfo.js","sourceRoot":"/","sources":["BuildInfo.ts"],"names":[],"mappings":"AAyBA,MAAM,GAAG,GAAc;IACnB,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,MAAM;IACb,EAAE,EAAE,MAAM;IACV,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,MAAM;CACpB,CAAC;AAED,GAAG,CAAC,OAAkB,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;AAC7F,IAAI,GAAG,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;IAChC,GAAG,CAAC,SAAuB,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC","sourcesContent":["/**\n * Represents either production or development build type\n */\nexport type BuildType = 'Dev' | 'Prod';\n\n/**\n * Contains property metadata for the Twinfinity build\n */\nexport interface BuildInfo {\n /** Major version number */\n readonly major: number;\n /** Minor version number */\n readonly minor: number;\n /** Patch version number */\n readonly patch: number;\n /** Unique build id */\n readonly id: number;\n /** The commit checksum */\n readonly commit: string;\n /** String that uniquely identifies the current version */\n readonly version: string;\n /** The build type */\n readonly buildType: BuildType;\n}\n\nconst gBi: BuildInfo = {\n major: 111111,\n minor: 222222,\n patch: 333333,\n id: 444444,\n commit: 'unknownCommit',\n version: '',\n buildType: 'Prod'\n};\n\n(gBi.version as string) = `${gBi.major}.${gBi.minor}.${gBi.patch}.${gBi.id}-[${gBi.commit}]`;\nif (gBi.commit === 'unknownCommit') {\n (gBi.buildType as BuildType) = 'Dev';\n}\n\nexport const BUILD_INFO = Object.freeze(gBi);\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0B,MAAM,cAAc,CAAC;AAElF,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAE/B,+BAA+B;AAC/B,cAAc,YAAY,CAAC","sourcesContent":["export * from './BuildInfo';\
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0B,MAAM,cAAc,CAAC;AAElF,yDAAyD;AACzD,cAAc,gBAAgB,CAAC;AAE/B,+BAA+B;AAC/B,cAAc,YAAY,CAAC","sourcesContent":["export * from './BuildInfo';\nexport * from './types';\nexport { printToSvg } from './printToSvg';\nexport { printToPdf, printToSvgFile, type PrintToPdfOptions } from './printToPdf';\n\n// Print-layout module (template-driven page composition)\nexport * from './layout/index';\n\n// Sections SVG viewport module\nexport * from './sections';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeTemplate.js","sourceRoot":"/","sources":["layout/analyzeTemplate.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeClass } from './filters';\r\nimport type {\r\n LayoutTemplate,\r\n LayoutElement,\r\n ViewportElement,\r\n TextElement,\r\n ImageElement,\r\n QrElement,\r\n LabelsElement,\r\n LegendElement,\r\n GroupElement,\r\n ScaleBarElement,\r\n WhereCondition\r\n} from './types';\r\n\r\n/**\r\n * Describes the input requirements inferred from a layout template.\r\n * Use `analyzeTemplate()` to scan a template and discover what data it needs.\r\n */\r\nexport interface TemplateRequirements {\r\n /** Viewport IDs the template declares. */\r\n viewportIds: string[];\r\n\r\n /** Property paths referenced by legends, where-filters, and labels.\r\n * Short-path format: \"SetName.propName\" (e.g. \"BIP.spacename\"). */\r\n propertyPaths: string[];\r\n\r\n /** Class filters referenced (e.g. \"space\", \"walls\"). Already lowercase. */\r\n classFilters: string[];\r\n\r\n /** Asset IDs referenced by image/northArrow elements. */\r\n assetIds: string[];\r\n\r\n /** Text interpolation variables (e.g. \"viewport.main.scaleText\"). */\r\n interpolationVars: string[];\r\n\r\n /** Whether the template references remote (http/https) asset URLs. */\r\n usesRemoteAssets: boolean;\r\n}\r\n\r\nconst INTERPOLATION_RE = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\r\n\r\n/** Extract `{{path}}` tokens from a template string. */\r\nfunction extractInterpolationVars(text: string): string[] {\r\n const vars: string[] = [];\r\n let m: RegExpExecArray | null;\r\n INTERPOLATION_RE.lastIndex = 0;\r\n while ((m = INTERPOLATION_RE.exec(text)) !== null) {\r\n vars.push(m[1]);\r\n }\r\n return vars;\r\n}\r\n\r\n/** Collect keys from a WhereCondition (each key is a property short-path). */\r\nfunction collectWherePaths(where: WhereCondition | undefined, out: Set<string>): void {\r\n if (!where || typeof where !== 'object') return;\r\n for (const key of Object.keys(where)) {\r\n out.add(key);\r\n }\r\n}\r\n\r\n/** Collect class filter values, normalizing to lowercase. */\r\nfunction collectClassFilter(classFilter: string | string[] | undefined, out: Set<string>): void {\r\n if (!classFilter) return;\r\n const classes = Array.isArray(classFilter) ? classFilter : [classFilter];\r\n for (const c of classes) {\r\n const normalized = normalizeClass(c);\r\n if (normalized) out.add(normalized);\r\n }\r\n}\r\n\r\n/**\r\n * Scan a layout template and return its input requirements.\r\n *\r\n * This is a pure, read-only analysis — it does not modify the template or\r\n * perform any rendering. Use the result to validate inputs before calling\r\n * `renderDrawing()` or `renderLayout()`.\r\n */\r\nexport function analyzeTemplate(template: LayoutTemplate): TemplateRequirements {\r\n const viewportIds = new Set<string>();\r\n const propertyPaths = new Set<string>();\r\n const classFilters = new Set<string>();\r\n const assetIds = new Set<string>();\r\n const interpolationVars = new Set<string>();\r\n let usesRemoteAssets = false;\r\n\r\n // Check assets for remote URLs\r\n if (template.assets) {\r\n for (const asset of template.assets) {\r\n if (asset.src && /^https?:\\/\\//i.test(asset.src)) {\r\n usesRemoteAssets = true;\r\n }\r\n }\r\n }\r\n\r\n // Walk all elements (recursing into groups)\r\n const walk = (elements: LayoutElement[]): void => {\r\n for (const el of elements) {\r\n switch (el.kind) {\r\n case 'viewport': {\r\n const vp = el as ViewportElement;\r\n viewportIds.add(vp.id);\r\n\r\n // Clip filter\r\n if (vp.clip) {\r\n collectClassFilter(vp.clip.class, classFilters);\r\n collectWherePaths(vp.clip.where, propertyPaths);\r\n }\r\n\r\n // Highlight filter\r\n if (vp.highlight) {\r\n collectClassFilter(vp.highlight.class, classFilters);\r\n collectWherePaths(vp.highlight.where, propertyPaths);\r\n }\r\n\r\n // includeClasses\r\n if (vp.includeClasses) {\r\n if (Array.isArray(vp.includeClasses)) {\r\n for (const c of vp.includeClasses) {\r\n const normalized = normalizeClass(c);\r\n if (normalized) classFilters.add(normalized);\r\n }\r\n }\r\n // Preset references are resolved at render time, nothing to collect\r\n }\r\n\r\n // North arrow asset\r\n if (vp.northArrow?.assetId) {\r\n assetIds.add(vp.northArrow.assetId);\r\n }\r\n break;\r\n }\r\n\r\n case 'text': {\r\n const txt = el as TextElement;\r\n if (txt.text) {\r\n for (const v of extractInterpolationVars(txt.text)) {\r\n interpolationVars.add(v);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'image': {\r\n const img = el as ImageElement;\r\n if (img.assetId) assetIds.add(img.assetId);\r\n break;\r\n }\r\n\r\n case 'qr': {\r\n const qr = el as QrElement;\r\n if (qr.dataTemplate) {\r\n for (const v of extractInterpolationVars(qr.dataTemplate)) {\r\n interpolationVars.add(v);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'labels': {\r\n const sl = el as LabelsElement;\r\n collectClassFilter(sl.class, classFilters);\r\n collectWherePaths(sl.where, propertyPaths);\r\n\r\n // Extract property paths from text interpolation (skip viewport.* which are computed)\r\n if (sl.text) {\r\n for (const v of extractInterpolationVars(sl.text)) {\r\n if (!v.startsWith('viewport.')) {\r\n propertyPaths.add(v);\r\n } else {\r\n interpolationVars.add(v);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'legend': {\r\n const leg = el as LegendElement;\r\n collectClassFilter(leg.class, classFilters);\r\n collectWherePaths(leg.where, propertyPaths);\r\n\r\n // Column property paths\r\n if (leg.columns) {\r\n for (const col of leg.columns) {\r\n if (col.property) propertyPaths.add(col.property);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case 'scaleBar': {\r\n // scaleBar references a viewport by ID (informational)\r\n const sb = el as ScaleBarElement;\r\n if (sb.viewport) viewportIds.add(sb.viewport);\r\n break;\r\n }\r\n\r\n case 'group': {\r\n const grp = el as GroupElement;\r\n if (grp.children) walk(grp.children);\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n walk(template.elements);\r\n\r\n return {\r\n viewportIds: [...viewportIds],\r\n propertyPaths: [...propertyPaths],\r\n classFilters: [...classFilters],\r\n assetIds: [...assetIds],\r\n interpolationVars: [...interpolationVars],\r\n usesRemoteAssets\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"analyzeTemplate.js","sourceRoot":"/","sources":["layout/analyzeTemplate.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeClass } from './filters';\nimport type {\n LayoutTemplate,\n LayoutElement,\n ViewportElement,\n TextElement,\n ImageElement,\n QrElement,\n LabelsElement,\n LegendElement,\n GroupElement,\n ScaleBarElement,\n WhereCondition\n} from './types';\n\n/**\n * Describes the input requirements inferred from a layout template.\n * Use `analyzeTemplate()` to scan a template and discover what data it needs.\n */\nexport interface TemplateRequirements {\n /** Viewport IDs the template declares. */\n viewportIds: string[];\n\n /** Property paths referenced by legends, where-filters, and labels.\n * Short-path format: \"SetName.propName\" (e.g. \"BIP.spacename\"). */\n propertyPaths: string[];\n\n /** Class filters referenced (e.g. \"space\", \"walls\"). Already lowercase. */\n classFilters: string[];\n\n /** Asset IDs referenced by image/northArrow elements. */\n assetIds: string[];\n\n /** Text interpolation variables (e.g. \"viewport.main.scaleText\"). */\n interpolationVars: string[];\n\n /** Whether the template references remote (http/https) asset URLs. */\n usesRemoteAssets: boolean;\n}\n\nconst INTERPOLATION_RE = /\\{\\{\\s*([^}]+?)\\s*\\}\\}/g;\n\n/** Extract `{{path}}` tokens from a template string. */\nfunction extractInterpolationVars(text: string): string[] {\n const vars: string[] = [];\n let m: RegExpExecArray | null;\n INTERPOLATION_RE.lastIndex = 0;\n while ((m = INTERPOLATION_RE.exec(text)) !== null) {\n vars.push(m[1]);\n }\n return vars;\n}\n\n/** Collect keys from a WhereCondition (each key is a property short-path). */\nfunction collectWherePaths(where: WhereCondition | undefined, out: Set<string>): void {\n if (!where || typeof where !== 'object') return;\n for (const key of Object.keys(where)) {\n out.add(key);\n }\n}\n\n/** Collect class filter values, normalizing to lowercase. */\nfunction collectClassFilter(classFilter: string | string[] | undefined, out: Set<string>): void {\n if (!classFilter) return;\n const classes = Array.isArray(classFilter) ? classFilter : [classFilter];\n for (const c of classes) {\n const normalized = normalizeClass(c);\n if (normalized) out.add(normalized);\n }\n}\n\n/**\n * Scan a layout template and return its input requirements.\n *\n * This is a pure, read-only analysis — it does not modify the template or\n * perform any rendering. Use the result to validate inputs before calling\n * `renderDrawing()` or `renderLayout()`.\n */\nexport function analyzeTemplate(template: LayoutTemplate): TemplateRequirements {\n const viewportIds = new Set<string>();\n const propertyPaths = new Set<string>();\n const classFilters = new Set<string>();\n const assetIds = new Set<string>();\n const interpolationVars = new Set<string>();\n let usesRemoteAssets = false;\n\n // Check assets for remote URLs\n if (template.assets) {\n for (const asset of template.assets) {\n if (asset.src && /^https?:\\/\\//i.test(asset.src)) {\n usesRemoteAssets = true;\n }\n }\n }\n\n // Walk all elements (recursing into groups)\n const walk = (elements: LayoutElement[]): void => {\n for (const el of elements) {\n switch (el.kind) {\n case 'viewport': {\n const vp = el as ViewportElement;\n viewportIds.add(vp.id);\n\n // Clip filter\n if (vp.clip) {\n collectClassFilter(vp.clip.class, classFilters);\n collectWherePaths(vp.clip.where, propertyPaths);\n }\n\n // Highlight filter\n if (vp.highlight) {\n collectClassFilter(vp.highlight.class, classFilters);\n collectWherePaths(vp.highlight.where, propertyPaths);\n }\n\n // includeClasses\n if (vp.includeClasses) {\n if (Array.isArray(vp.includeClasses)) {\n for (const c of vp.includeClasses) {\n const normalized = normalizeClass(c);\n if (normalized) classFilters.add(normalized);\n }\n }\n // Preset references are resolved at render time, nothing to collect\n }\n\n // North arrow asset\n if (vp.northArrow?.assetId) {\n assetIds.add(vp.northArrow.assetId);\n }\n break;\n }\n\n case 'text': {\n const txt = el as TextElement;\n if (txt.text) {\n for (const v of extractInterpolationVars(txt.text)) {\n interpolationVars.add(v);\n }\n }\n break;\n }\n\n case 'image': {\n const img = el as ImageElement;\n if (img.assetId) assetIds.add(img.assetId);\n break;\n }\n\n case 'qr': {\n const qr = el as QrElement;\n if (qr.dataTemplate) {\n for (const v of extractInterpolationVars(qr.dataTemplate)) {\n interpolationVars.add(v);\n }\n }\n break;\n }\n\n case 'labels': {\n const sl = el as LabelsElement;\n collectClassFilter(sl.class, classFilters);\n collectWherePaths(sl.where, propertyPaths);\n\n // Extract property paths from text interpolation (skip viewport.* which are computed)\n if (sl.text) {\n for (const v of extractInterpolationVars(sl.text)) {\n if (!v.startsWith('viewport.')) {\n propertyPaths.add(v);\n } else {\n interpolationVars.add(v);\n }\n }\n }\n break;\n }\n\n case 'legend': {\n const leg = el as LegendElement;\n collectClassFilter(leg.class, classFilters);\n collectWherePaths(leg.where, propertyPaths);\n\n // Column property paths\n if (leg.columns) {\n for (const col of leg.columns) {\n if (col.property) propertyPaths.add(col.property);\n }\n }\n break;\n }\n\n case 'scaleBar': {\n // scaleBar references a viewport by ID (informational)\n const sb = el as ScaleBarElement;\n if (sb.viewport) viewportIds.add(sb.viewport);\n break;\n }\n\n case 'group': {\n const grp = el as GroupElement;\n if (grp.children) walk(grp.children);\n break;\n }\n }\n }\n };\n\n walk(template.elements);\n\n return {\n viewportIds: [...viewportIds],\n propertyPaths: [...propertyPaths],\n classFilters: [...classFilters],\n assetIds: [...assetIds],\n interpolationVars: [...interpolationVars],\n usesRemoteAssets\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipUtils.js","sourceRoot":"/","sources":["layout/clipUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAK/E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,CAAS,EAAE,CAAS,EAAW,EAAE;IAC9E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QAClE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EACnB,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EACnB,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QACnF,IAAI,SAAS;YAAE,MAAM,GAAG,CAAC,MAAM,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACjC,KAAgB,EAChB,QAAmB,EACnB,MAAM,GAAG,GAAG,EACZ,MAAM,GAAG,GAAG,EACZ,YAAqD,EAC5C,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACnG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACnE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAC/B,OAAkB,EAClB,QAAgD,EACvC,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,IAAI,EAAE,CAAC;IAEvG,MAAM,SAAS,GAAG,CAAC,KAAc,EAA0C,EAAE;QACzE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC;QACnD,IAAI,CAAC;YACD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;YACxD,MAAM,YAAY,GAAG,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClF,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChG,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnG,OAAO;oBACH,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe;oBAClD,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,eAAe;iBACrD,CAAC;YACN,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,iGAAiG;YACjG,0EAA0E;QAC9E,CAAC;QACD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1B,cAAc,CACV,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACrC,CAAC,EACD,CAAC,CACJ,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAgB,EAAE,KAAa,EAAa,EAAE;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,IAAI,EAAE,CAAC;IACzG,MAAM,cAAc,GAAG,CAAC,CAAQ,EAAE,CAAQ,EAAE,CAAQ,EAAE,CAAQ,EAAgB,EAAE;QAC5E,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,uBAAuB;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACxD,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,IAAa,EAAW,EAAE;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC,EAAE,CAAC,CAAC,CAAC;QACN,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;QACpE,MAAM,GAAG,GAAY,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,uBAAuB,CAAC;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,uBAAuB,CAAC;YAC7D,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAClC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACnC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAClC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACnC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;YACpE,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAClC,cAAuB,EACvB,MAAc,EACd,MAAc,EACd,KAAmB,EACnB,WAAmB,EACnB,cAAsB,EACtB,cAAsB,EACtB,UAAkB,EACmB,EAAE;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAU,EAAS,EAAE;QAC9C,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,SAAU,CAAC,QAAQ,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,SAAU,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IAC5B,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAU,EAAS,EAAE;QAC7C,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,SAAU,CAAC,QAAQ,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,SAAU,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,OAAO,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IACxF,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,IAAe,EAAW,EAAE,CAClD,IAAI;SACC,GAAG,CAAC,CAAC,EAAW,EAAE,EAAE;QACjB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAY,CAAC;IACpC,MAAM,WAAW,GAAG,CAAC,IAAe,EAAW,EAAE,CAC7C,IAAI;SACC,GAAG,CAAC,CAAC,EAAW,EAAE,EAAE;QACjB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9D,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAY,CAAC;IAEpC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAa,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9E,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YACjC,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import type { SvgModelView } from './types';\r\nimport { EPSILON_DIVISION_SAFETY, CENTER_FRACTION } from './geometryConstants';\r\n\r\nexport type Point = { x: number; y: number };\r\nexport type Polygon = Point[];\r\n\r\nimport { isRecord, getProp } from './typeGuards';\r\n\r\nexport const pointInPolygon = (polygon: Polygon, x: number, y: number): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n const xi = polygon[i].x,\r\n yi = polygon[i].y;\r\n const xj = polygon[j].x,\r\n yj = polygon[j].y;\r\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n};\r\n\r\nexport const filterItemsInPolygons = (\r\n items: unknown[],\r\n polygons: Polygon[],\r\n xField = 'x',\r\n yField = 'z',\r\n getPathValue: (obj: unknown, path: string) => unknown\r\n): unknown[] => {\r\n if (!Array.isArray(items) || !Array.isArray(polygons) || polygons.length === 0) return items ?? [];\r\n return items.filter((item) => {\r\n const xVal = getPathValue(item, xField);\r\n const yVal = getPathValue(item, yField);\r\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) return false;\r\n const x = Number(xVal);\r\n const y = Number(yVal);\r\n return polygons.some((poly) => pointInPolygon(poly, x, y));\r\n });\r\n};\r\n\r\nexport const filterEntriesByClip = (\r\n entries: unknown[],\r\n polygons: Array<Array<{ x: number; z: number }>>\r\n): unknown[] => {\r\n if (!Array.isArray(entries) || !Array.isArray(polygons) || polygons.length === 0) return entries ?? [];\r\n\r\n const getCenter = (entry: unknown): { x: number | null; z: number | null } => {\r\n const product = getProp(entry, 'product') ?? entry;\r\n try {\r\n const boundingInfoFn = getProp(product, 'boundingInfo');\r\n const boundingInfo = typeof boundingInfoFn === 'function' ? boundingInfoFn() : null;\r\n const bbox = isRecord(boundingInfo) ? getProp(boundingInfo, 'boundingBox') : null;\r\n const min = isRecord(bbox) ? (getProp(bbox, 'minimumWorld') ?? getProp(bbox, 'minimum')) : null;\r\n const max = isRecord(bbox) ? (getProp(bbox, 'maximumWorld') ?? getProp(bbox, 'maximum')) : null;\r\n const minX = isRecord(min) ? getProp(min, 'x') : null;\r\n const maxX = isRecord(max) ? getProp(max, 'x') : null;\r\n const minZ = isRecord(min) ? getProp(min, 'z') : null;\r\n const maxZ = isRecord(max) ? getProp(max, 'z') : null;\r\n if (Number.isFinite(minX) && Number.isFinite(maxX) && Number.isFinite(minZ) && Number.isFinite(maxZ)) {\r\n return {\r\n x: (Number(minX) + Number(maxX)) * CENTER_FRACTION,\r\n z: (Number(minZ) + Number(maxZ)) * CENTER_FRACTION\r\n };\r\n }\r\n } catch {\r\n // Bounding info access may fail for products without geometry or with malformed data structures.\r\n // This is expected behavior - we fall back to entry.x/z properties below.\r\n }\r\n const x = getProp(entry, 'x');\r\n const z = getProp(entry, 'z');\r\n return { x: typeof x === 'number' ? x : null, z: typeof z === 'number' ? z : null };\r\n };\r\n\r\n return entries.filter((entry) => {\r\n const center = getCenter(entry);\r\n if (!Number.isFinite(center.x) || !Number.isFinite(center.z)) return false;\r\n const x = Number(center.x);\r\n const z = Number(center.z);\r\n return polygons.some((poly) =>\r\n pointInPolygon(\r\n poly.map((p) => ({ x: p.x, y: p.z })),\r\n x,\r\n z\r\n )\r\n );\r\n });\r\n};\r\n\r\nexport const offsetPolygons = (polys: Polygon[], delta: number): Polygon[] => {\r\n if (!Array.isArray(polys) || !polys.length || !Number.isFinite(delta) || delta === 0) return polys ?? [];\r\n const intersectLines = (p: Point, r: Point, q: Point, s: Point): Point | null => {\r\n const rxs = r.x * s.y - r.y * s.x;\r\n if (Math.abs(rxs) < EPSILON_DIVISION_SAFETY) return null; // parallel\r\n const t = ((q.x - p.x) * s.y - (q.y - p.y) * s.x) / rxs;\r\n return { x: p.x + t * r.x, y: p.y + t * r.y };\r\n };\r\n const offsetPoly = (poly: Polygon): Polygon => {\r\n const n = poly.length;\r\n if (n < 3) return poly;\r\n const area = poly.reduce((sum, p, i) => {\r\n const q = poly[(i + 1) % n];\r\n return sum + p.x * q.y - q.x * p.y;\r\n }, 0);\r\n const orient = area >= 0 ? 1 : -1; // ccw => outward is right normal\r\n const out: Polygon = [];\r\n for (let i = 0; i < n; i++) {\r\n const p0 = poly[(i + n - 1) % n];\r\n const p1 = poly[i];\r\n const p2 = poly[(i + 1) % n];\r\n const e1x = p1.x - p0.x;\r\n const e1y = p1.y - p0.y;\r\n const e2x = p2.x - p1.x;\r\n const e2y = p2.y - p1.y;\r\n const len1 = Math.hypot(e1x, e1y) || EPSILON_DIVISION_SAFETY;\r\n const len2 = Math.hypot(e2x, e2y) || EPSILON_DIVISION_SAFETY;\r\n const n1x = (orient * e1y) / len1;\r\n const n1y = (orient * -e1x) / len1;\r\n const n2x = (orient * e2y) / len2;\r\n const n2y = (orient * -e2x) / len2;\r\n const line1Point = { x: p1.x + n1x * delta, y: p1.y + n1y * delta };\r\n const line2Point = { x: p1.x + n2x * delta, y: p1.y + n2y * delta };\r\n const inter = intersectLines(line1Point, { x: e1x, y: e1y }, line2Point, { x: e2x, y: e2y });\r\n out.push(inter ?? line2Point);\r\n }\r\n return out;\r\n };\r\n return polys.map(offsetPoly);\r\n};\r\n\r\nexport const projectPolygonsToLocal = (\r\n polygonsSource: unknown,\r\n xField: string,\r\n yField: string,\r\n model: SvgModelView,\r\n rotationDeg: number,\r\n contentOffsetX: number,\r\n contentOffsetY: number,\r\n mmPerModel: number\r\n): { local: Polygon[]; page: Polygon[] } => {\r\n const cosA = Math.cos((rotationDeg * Math.PI) / 180);\r\n const sinA = Math.sin((rotationDeg * Math.PI) / 180);\r\n const toLocal = (px: number, py: number): Point => {\r\n const viewX = px - model.transform!.viewMinX;\r\n const viewY = model.transform!.viewMaxZ - py;\r\n const x0 = viewX - model.widthModel / 2;\r\n const y0 = viewY - model.heightModel / 2;\r\n const x1 = x0 * cosA - y0 * sinA;\r\n const y1 = x0 * sinA + y0 * cosA;\r\n return { x: x1, y: y1 };\r\n };\r\n const toPage = (px: number, py: number): Point => {\r\n const viewX = px - model.transform!.viewMinX;\r\n const viewY = model.transform!.viewMaxZ - py;\r\n const x0 = viewX - model.widthModel / 2;\r\n const y0 = viewY - model.heightModel / 2;\r\n const x1 = x0 * cosA - y0 * sinA;\r\n const y1 = x0 * sinA + y0 * cosA;\r\n return { x: contentOffsetX + x1 * mmPerModel, y: contentOffsetY + y1 * mmPerModel };\r\n };\r\n const projectPolyLocal = (poly: unknown[]): Polygon =>\r\n poly\r\n .map((pt: unknown) => {\r\n const px = Number(getProp(pt, xField));\r\n const py = Number(getProp(pt, yField));\r\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\r\n return toLocal(px, py);\r\n })\r\n .filter(Boolean) as Polygon;\r\n const projectPoly = (poly: unknown[]): Polygon =>\r\n poly\r\n .map((pt: unknown) => {\r\n const px = Number(getProp(pt, xField));\r\n const py = Number(getProp(pt, yField));\r\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\r\n return toPage(px, py);\r\n })\r\n .filter(Boolean) as Polygon;\r\n\r\n const local: Polygon[] = [];\r\n const page: Polygon[] = [];\r\n if (Array.isArray(polygonsSource)) {\r\n polygonsSource.forEach((poly: unknown) => {\r\n const points = getProp(poly, 'points');\r\n const pl = Array.isArray(points) ? points : Array.isArray(poly) ? poly : null;\r\n if (!pl || pl.length < 3) return;\r\n const projectedLocal = projectPolyLocal(pl);\r\n if (projectedLocal.length >= 3) {\r\n local.push(projectedLocal);\r\n page.push(projectPoly(pl));\r\n }\r\n });\r\n }\r\n return { local, page };\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"clipUtils.js","sourceRoot":"/","sources":["layout/clipUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SvgModelView } from './types';\nimport { EPSILON_DIVISION_SAFETY, CENTER_FRACTION } from './geometryConstants';\n\nexport type Point = { x: number; y: number };\nexport type Polygon = Point[];\n\nimport { isRecord, getProp } from './typeGuards';\n\nexport const pointInPolygon = (polygon: Polygon, x: number, y: number): boolean => {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x,\n yi = polygon[i].y;\n const xj = polygon[j].x,\n yj = polygon[j].y;\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n};\n\nexport const filterItemsInPolygons = (\n items: unknown[],\n polygons: Polygon[],\n xField = 'x',\n yField = 'z',\n getPathValue: (obj: unknown, path: string) => unknown\n): unknown[] => {\n if (!Array.isArray(items) || !Array.isArray(polygons) || polygons.length === 0) return items ?? [];\n return items.filter((item) => {\n const xVal = getPathValue(item, xField);\n const yVal = getPathValue(item, yField);\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) return false;\n const x = Number(xVal);\n const y = Number(yVal);\n return polygons.some((poly) => pointInPolygon(poly, x, y));\n });\n};\n\nexport const filterEntriesByClip = (\n entries: unknown[],\n polygons: Array<Array<{ x: number; z: number }>>\n): unknown[] => {\n if (!Array.isArray(entries) || !Array.isArray(polygons) || polygons.length === 0) return entries ?? [];\n\n const getCenter = (entry: unknown): { x: number | null; z: number | null } => {\n const product = getProp(entry, 'product') ?? entry;\n try {\n const boundingInfoFn = getProp(product, 'boundingInfo');\n const boundingInfo = typeof boundingInfoFn === 'function' ? boundingInfoFn() : null;\n const bbox = isRecord(boundingInfo) ? getProp(boundingInfo, 'boundingBox') : null;\n const min = isRecord(bbox) ? (getProp(bbox, 'minimumWorld') ?? getProp(bbox, 'minimum')) : null;\n const max = isRecord(bbox) ? (getProp(bbox, 'maximumWorld') ?? getProp(bbox, 'maximum')) : null;\n const minX = isRecord(min) ? getProp(min, 'x') : null;\n const maxX = isRecord(max) ? getProp(max, 'x') : null;\n const minZ = isRecord(min) ? getProp(min, 'z') : null;\n const maxZ = isRecord(max) ? getProp(max, 'z') : null;\n if (Number.isFinite(minX) && Number.isFinite(maxX) && Number.isFinite(minZ) && Number.isFinite(maxZ)) {\n return {\n x: (Number(minX) + Number(maxX)) * CENTER_FRACTION,\n z: (Number(minZ) + Number(maxZ)) * CENTER_FRACTION\n };\n }\n } catch {\n // Bounding info access may fail for products without geometry or with malformed data structures.\n // This is expected behavior - we fall back to entry.x/z properties below.\n }\n const x = getProp(entry, 'x');\n const z = getProp(entry, 'z');\n return { x: typeof x === 'number' ? x : null, z: typeof z === 'number' ? z : null };\n };\n\n return entries.filter((entry) => {\n const center = getCenter(entry);\n if (!Number.isFinite(center.x) || !Number.isFinite(center.z)) return false;\n const x = Number(center.x);\n const z = Number(center.z);\n return polygons.some((poly) =>\n pointInPolygon(\n poly.map((p) => ({ x: p.x, y: p.z })),\n x,\n z\n )\n );\n });\n};\n\nexport const offsetPolygons = (polys: Polygon[], delta: number): Polygon[] => {\n if (!Array.isArray(polys) || !polys.length || !Number.isFinite(delta) || delta === 0) return polys ?? [];\n const intersectLines = (p: Point, r: Point, q: Point, s: Point): Point | null => {\n const rxs = r.x * s.y - r.y * s.x;\n if (Math.abs(rxs) < EPSILON_DIVISION_SAFETY) return null; // parallel\n const t = ((q.x - p.x) * s.y - (q.y - p.y) * s.x) / rxs;\n return { x: p.x + t * r.x, y: p.y + t * r.y };\n };\n const offsetPoly = (poly: Polygon): Polygon => {\n const n = poly.length;\n if (n < 3) return poly;\n const area = poly.reduce((sum, p, i) => {\n const q = poly[(i + 1) % n];\n return sum + p.x * q.y - q.x * p.y;\n }, 0);\n const orient = area >= 0 ? 1 : -1; // ccw => outward is right normal\n const out: Polygon = [];\n for (let i = 0; i < n; i++) {\n const p0 = poly[(i + n - 1) % n];\n const p1 = poly[i];\n const p2 = poly[(i + 1) % n];\n const e1x = p1.x - p0.x;\n const e1y = p1.y - p0.y;\n const e2x = p2.x - p1.x;\n const e2y = p2.y - p1.y;\n const len1 = Math.hypot(e1x, e1y) || EPSILON_DIVISION_SAFETY;\n const len2 = Math.hypot(e2x, e2y) || EPSILON_DIVISION_SAFETY;\n const n1x = (orient * e1y) / len1;\n const n1y = (orient * -e1x) / len1;\n const n2x = (orient * e2y) / len2;\n const n2y = (orient * -e2x) / len2;\n const line1Point = { x: p1.x + n1x * delta, y: p1.y + n1y * delta };\n const line2Point = { x: p1.x + n2x * delta, y: p1.y + n2y * delta };\n const inter = intersectLines(line1Point, { x: e1x, y: e1y }, line2Point, { x: e2x, y: e2y });\n out.push(inter ?? line2Point);\n }\n return out;\n };\n return polys.map(offsetPoly);\n};\n\nexport const projectPolygonsToLocal = (\n polygonsSource: unknown,\n xField: string,\n yField: string,\n model: SvgModelView,\n rotationDeg: number,\n contentOffsetX: number,\n contentOffsetY: number,\n mmPerModel: number\n): { local: Polygon[]; page: Polygon[] } => {\n const cosA = Math.cos((rotationDeg * Math.PI) / 180);\n const sinA = Math.sin((rotationDeg * Math.PI) / 180);\n const toLocal = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: x1, y: y1 };\n };\n const toPage = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: contentOffsetX + x1 * mmPerModel, y: contentOffsetY + y1 * mmPerModel };\n };\n const projectPolyLocal = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toLocal(px, py);\n })\n .filter(Boolean) as Polygon;\n const projectPoly = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toPage(px, py);\n })\n .filter(Boolean) as Polygon;\n\n const local: Polygon[] = [];\n const page: Polygon[] = [];\n if (Array.isArray(polygonsSource)) {\n polygonsSource.forEach((poly: unknown) => {\n const points = getProp(poly, 'points');\n const pl = Array.isArray(points) ? points : Array.isArray(poly) ? poly : null;\n if (!pl || pl.length < 3) return;\n const projectedLocal = projectPolyLocal(pl);\n if (projectedLocal.length >= 3) {\n local.push(projectedLocal);\n page.push(projectPoly(pl));\n }\n });\n }\n return { local, page };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colorConstants.js","sourceRoot":"/","sources":["layout/colorConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,iDAAiD;AAC7E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,yCAAyC;AAEnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,0CAA0C;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,4CAA4C;AAE1E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,gDAAgD;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,CAAC,2CAA2C;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,CAAC,0CAA0C","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"colorConstants.js","sourceRoot":"/","sources":["layout/colorConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yBAAyB;AACzB,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,iDAAiD;AAC7E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,yCAAyC;AAEnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,0CAA0C;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,4CAA4C;AAE1E,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,gDAAgD;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,CAAC,2CAA2C;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,CAAC,0CAA0C","sourcesContent":["/**\n * Color computation constants\n */\n\n// RGB color value limits\nexport const RGB_MAX = 255; // Maximum value for RGB color components (0-255)\nexport const RGB_MIN = 0; // Minimum value for RGB color components\n\n// Bit shift offsets for color packing/unpacking\nexport const RED_SHIFT = 16; // Shift for red component in 24-bit color\nexport const GREEN_SHIFT = 8; // Shift for green component in 24-bit color\n\n// Color modulo for hash-based color generation\nexport const HASH_COLOR_MODULO = 255; // Modulo for generating colors from hash values\nexport const HASH_GREEN_SHIFT = 4; // Bit shift for green in hash-based colors\nexport const HASH_BLUE_SHIFT = 8; // Bit shift for blue in hash-based colors\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elementKinds.js","sourceRoot":"/","sources":["layout/elementKinds.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"elementKinds.js","sourceRoot":"/","sources":["layout/elementKinds.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC","sourcesContent":["/**\n * Constants for layout element kinds\n */\n\nexport const ELEMENT_KIND_VIEWPORT = 'viewport';\nexport const ELEMENT_KIND_TEXT = 'text';\nexport const ELEMENT_KIND_IMAGE = 'image';\nexport const ELEMENT_KIND_LINE = 'line';\nexport const ELEMENT_KIND_RECT = 'rect';\nexport const ELEMENT_KIND_CIRCLE = 'circle';\nexport const ELEMENT_KIND_POLYLINE = 'polyline';\nexport const ELEMENT_KIND_POLYGON = 'polygon';\nexport const ELEMENT_KIND_SCALE_BAR = 'scaleBar';\nexport const ELEMENT_KIND_QR = 'qr';\nexport const ELEMENT_KIND_LABELS = 'labels';\nexport const ELEMENT_KIND_LEGEND = 'legend';\nexport const ELEMENT_KIND_GROUP = 'group';\n\n/**\n * Union type of all valid element kinds\n */\nexport type ElementKind =\n | typeof ELEMENT_KIND_VIEWPORT\n | typeof ELEMENT_KIND_TEXT\n | typeof ELEMENT_KIND_IMAGE\n | typeof ELEMENT_KIND_LINE\n | typeof ELEMENT_KIND_RECT\n | typeof ELEMENT_KIND_CIRCLE\n | typeof ELEMENT_KIND_POLYLINE\n | typeof ELEMENT_KIND_POLYGON\n | typeof ELEMENT_KIND_SCALE_BAR\n | typeof ELEMENT_KIND_QR\n | typeof ELEMENT_KIND_LABELS\n | typeof ELEMENT_KIND_LEGEND\n | typeof ELEMENT_KIND_GROUP;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportDrawing.js","sourceRoot":"/","sources":["layout/exportDrawing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEvE;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,GAAW;IACvC,8EAA8E;IAC9E,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE3D,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACX,gFAAgF;YAC5E,oFAAoF,CAC3F,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CACX,+CAA+C,OAAO,QAAQ,QAAQ,MAAM;YACxE,qCAAqC,CAC5C,CAAC;IACN,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAgDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,UAA4B,EAAE;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAEjF,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAEjE,MAAM,kBAAkB,CAAC;QACrB,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,QAAe;QAC3B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;KAC9C,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,UAA4B,EAAE;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAEjF,kBAAkB,CAAC;QACf,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,eAAe;QACzB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;KAC9C,CAAC,CAAC;AACP,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"exportDrawing.js","sourceRoot":"/","sources":["layout/exportDrawing.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEvE;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,GAAW;IACvC,8EAA8E;IAC9E,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE3D,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACX,gFAAgF;YAC5E,oFAAoF,CAC3F,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CACX,+CAA+C,OAAO,QAAQ,QAAQ,MAAM;YACxE,qCAAqC,CAC5C,CAAC;IACN,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAgDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,UAA4B,EAAE;IACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAEjF,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAEjE,MAAM,kBAAkB,CAAC;QACrB,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,QAAe;QAC3B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;KAC9C,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,UAA4B,EAAE;IACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAEjF,kBAAkB,CAAC;QACf,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,eAAe;QACzB,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;KAC9C,CAAC,CAAC;AACP,CAAC","sourcesContent":["/**\n * Drawing export utilities for converting SVG markup to various formats.\n *\n * This module provides functions for exporting drawings to PDF and SVG files.\n * These are pure functions that take SVG markup and export options, with no\n * dependencies on BIM viewer APIs or application state.\n *\n * @module exportDrawing\n */\n\nimport { exportSectionToPdf, exportSectionToSvg } from '../printToPdf';\n\n/**\n * Extracts page dimensions from SVG markup.\n * Parses the width/height attributes from the root <svg> element.\n *\n * @param svg - SVG markup string\n * @returns Page dimensions in millimeters\n * @throws {Error} If SVG dimensions cannot be parsed\n */\nfunction extractPageSizeFromSvg(svg: string): { widthMm: number; heightMm: number } {\n // Match width and height attributes (supports both \"420mm\" and \"420\" formats)\n const widthMatch = svg.match(/width=\"([0-9.]+)(?:mm)?\"/);\n const heightMatch = svg.match(/height=\"([0-9.]+)(?:mm)?\"/);\n\n if (!widthMatch || !heightMatch) {\n throw new Error(\n 'Cannot extract page size from SVG. SVG must have width and height attributes. ' +\n 'Provide pageSize option explicitly or ensure SVG contains width/height attributes.'\n );\n }\n\n const widthMm = parseFloat(widthMatch[1]);\n const heightMm = parseFloat(heightMatch[1]);\n\n if (!Number.isFinite(widthMm) || !Number.isFinite(heightMm) || widthMm <= 0 || heightMm <= 0) {\n throw new Error(\n `Invalid page dimensions extracted from SVG: ${widthMm}mm × ${heightMm}mm. ` +\n 'Provide pageSize option explicitly.'\n );\n }\n\n return { widthMm, heightMm };\n}\n\n/**\n * Options for exporting a drawing to PDF format.\n */\nexport interface ExportPdfOptions {\n /**\n * Output filename (with or without .pdf extension).\n * Default: \"drawing.pdf\"\n */\n filename?: string;\n\n /**\n * Optional page dimensions in millimeters.\n * If not provided, automatically extracted from SVG width/height attributes.\n * Only needed if you want to override the SVG's embedded page size.\n */\n pageSize?: {\n widthMm: number;\n heightMm: number;\n };\n\n /**\n * If true, opens PDF in a new browser tab.\n * If false, downloads the PDF file.\n * Default: false (download)\n */\n openInNewTab?: boolean;\n}\n\n/**\n * Options for exporting a drawing to SVG format.\n */\nexport interface ExportSvgOptions {\n /**\n * Output filename (with or without .svg extension).\n * Default: \"drawing.svg\"\n */\n filename?: string;\n\n /**\n * If true, opens SVG in a new browser tab.\n * If false, downloads the SVG file.\n * Default: false (download)\n */\n openInNewTab?: boolean;\n}\n\n/**\n * Exports an SVG drawing to PDF format.\n *\n * Converts the SVG markup to a vector PDF using jsPDF and svg2pdf.js.\n * The PDF maintains full vector quality with no rasterization.\n *\n * **Page size is automatically extracted from the SVG** (width/height attributes),\n * so you don't need to specify it manually. The template's page dimensions are\n * embedded in the SVG markup by renderDrawing() or renderLayout().\n *\n * **Features:**\n * - ✅ Vector PDF output (scalable, searchable text)\n * - ✅ Preserves colors, strokes, fills, fonts\n * - ✅ No quality loss (unlike raster export)\n * - ✅ Small file size (vector graphics)\n * - ✅ Automatic page size detection from SVG\n *\n * **Use cases:**\n * - Print-ready construction documents\n * - Archival drawings\n * - Sharing with clients/contractors\n * - CAD import (vector format)\n *\n * @param svg - SVG markup string (from renderDrawing() or renderLayout())\n * @param options - Export options (filename, optional page size override, open vs download)\n * @returns Promise that resolves when export completes\n *\n * @example\n * ```typescript\n * // Basic usage - page size is automatically extracted from SVG\n * const { svg } = await renderDrawing({ template, models });\n * await exportToPdf(svg, {\n * filename: \"floor-plan.pdf\",\n * openInNewTab: true\n * });\n *\n * // With custom filename\n * await exportToPdf(svg, {\n * filename: `${template.id}-${new Date().toISOString().slice(0,10)}.pdf`\n * });\n *\n * // Override page size if needed (rare)\n * await exportToPdf(svg, {\n * filename: \"custom.pdf\",\n * pageSize: { widthMm: 420, heightMm: 297 }, // A3 landscape override\n * openInNewTab: false\n * });\n * ```\n *\n * @throws {Error} If PDF generation fails or SVG page size cannot be extracted\n */\nexport async function exportToPdf(svg: string, options: ExportPdfOptions = {}): Promise<void> {\n const filename = options.filename ?? 'drawing.pdf';\n const filenameWithExt = filename.endsWith('.pdf') ? filename : `${filename}.pdf`;\n\n // Extract page size from SVG if not provided\n const pageSize = options.pageSize ?? extractPageSizeFromSvg(svg);\n\n await exportSectionToPdf({\n svgMarkup: svg,\n fileName: filenameWithExt,\n pageSizeMm: pageSize as any,\n openInNewTab: options.openInNewTab ?? false\n });\n}\n\n/**\n * Exports an SVG drawing to SVG file format.\n *\n * Saves or displays the SVG markup as a standalone .svg file.\n * The SVG can be opened in browsers, vector editors (Inkscape, Illustrator),\n * or imported into CAD software.\n *\n * **Features:**\n * - ✅ Native vector format (editable in SVG editors)\n * - ✅ Smallest file size (XML text)\n * - ✅ Web-friendly (can embed in HTML)\n * - ✅ Full styling preserved\n *\n * **Use cases:**\n * - Web display (embed in HTML)\n * - Vector editing (Inkscape, Illustrator)\n * - Further processing (scripting, automation)\n * - Archival (open standard format)\n *\n * @param svg - SVG markup string (from renderDrawing())\n * @param options - Export options (filename, open vs download)\n * @returns Promise that resolves when export completes\n *\n * @example\n * ```typescript\n * // Basic usage\n * const { svg } = await renderDrawing({ template, models });\n * await exportToSvg(svg, {\n * filename: \"floor-plan.svg\",\n * openInNewTab: true\n * });\n *\n * // Download with custom name\n * await exportToSvg(svg, {\n * filename: `${template.id}-${Date.now()}.svg`,\n * openInNewTab: false\n * });\n * ```\n */\nexport function exportToSvg(svg: string, options: ExportSvgOptions = {}): void {\n const filename = options.filename ?? 'drawing.svg';\n const filenameWithExt = filename.endsWith('.svg') ? filename : `${filename}.svg`;\n\n exportSectionToSvg({\n svgMarkup: svg,\n fileName: filenameWithExt,\n openInNewTab: options.openInNewTab ?? false\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.js","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveProperty } from './renderUtils';\
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveProperty } from './renderUtils';\n\nimport { isRecord, getProp } from './typeGuards';\n\nimport type { WhereCondition } from './types';\n\nconst normalizeClass = (cls: unknown): string | null => (typeof cls === 'string' ? cls.trim().toLowerCase() : null);\n\n/** Compare two class strings, treating the 'Ifc' prefix as optional.\n * e.g. \"IfcSpace\" matches \"Space\", \"space\", and \"IfcSpace\". */\nconst classEquals = (a: string | null, b: string | null): boolean => {\n if (a === null || b === null) return false;\n if (a === b) return true;\n // Try with/without Ifc prefix in both directions\n const stripIfc = (s: string): string => (s.startsWith('ifc') ? s.slice(3) : s);\n return stripIfc(a) === stripIfc(b);\n};\nconst normalizeValue = (v: unknown): unknown => (typeof v === 'string' ? v.toLowerCase().trim() : v);\n\n/**\n * Check whether an item's ifcClass matches the given class filter.\n *\n * Uses normalizeClass() for string comparison — works for extracted items\n * where we have a normalized ifcClass string (not a live product).\n *\n * For live products, the caller should use product.class.is() directly.\n */\nconst matchesClass = (itemClass: unknown, classFilter: string | string[] | undefined): boolean => {\n if (classFilter === undefined) return true;\n const classes = Array.isArray(classFilter) ? classFilter : [classFilter];\n const normalized = normalizeClass(itemClass);\n if (normalized === null) return false;\n return classes.some((c) => classEquals(normalizeClass(c), normalized));\n};\n\n/**\n * Check whether an item matches a `where` condition.\n *\n * Each key in `where` is a short property path (e.g. \"BIP.spacetype\").\n * Each value is either a scalar (equality check) or an array (any-of check).\n * Multiple keys = AND. String comparison is case-insensitive.\n */\nconst matchesWhere = (item: unknown, where: WhereCondition | undefined): boolean => {\n if (!where) return true;\n for (const [path, expected] of Object.entries(where)) {\n const value = resolveProperty(item, path);\n if (Array.isArray(expected)) {\n const target = normalizeValue(value);\n if (!expected.some((v) => normalizeValue(v) === target)) return false;\n } else {\n if (normalizeValue(value) !== normalizeValue(expected)) return false;\n }\n }\n return true;\n};\n\n/**\n * V2 filter: match items by class + where conditions.\n *\n * @param item - An object with ifcClass and propertySets\n * @param classFilter - IFC class name(s) to match, or undefined for any\n * @param where - Property conditions (short paths), or undefined for no conditions\n */\nexport const matchesV2Filter = (\n item: unknown,\n classFilter: string | string[] | undefined,\n where: WhereCondition | undefined\n): boolean => {\n if (classFilter !== undefined && isRecord(item)) {\n const itemClass = getProp(item, 'ifcClass');\n const itemClassId = getProp(item, 'ifcClassId');\n if (!matchesClass(itemClass, classFilter) && !matchesClass(itemClassId, classFilter)) {\n return false;\n }\n }\n if (!matchesWhere(item, where)) return false;\n return true;\n};\n\nexport { normalizeClass, classEquals, normalizeValue, matchesClass, matchesWhere };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometryConstants.js","sourceRoot":"/","sources":["layout/geometryConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,oCAAoC;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,CAAC,mCAAmC;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,CAAC,2CAA2C;AAEtF,wBAAwB;AACxB,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,4CAA4C","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"geometryConstants.js","sourceRoot":"/","sources":["layout/geometryConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,oCAAoC;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,CAAC,mCAAmC;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,CAAC,2CAA2C;AAEtF,wBAAwB;AACxB,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC,CAAC,4CAA4C","sourcesContent":["/**\n * Geometric computation constants\n */\n\n// Epsilon values for floating-point comparisons\nexport const EPSILON_INTERSECTION = 1e-9; // Used for detecting parallel lines\nexport const EPSILON_DIVISION_SAFETY = 1e-9; // Used to prevent division by zero\nexport const EPSILON_MIN_DIMENSION = 1e-6; // Minimum valid dimension for model bounds\n\n// Geometric multipliers\nexport const CENTER_FRACTION = 0.5; // For calculating center/midpoint (x * 0.5)\n"]}
|
package/dist/layout/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["layout/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SectionRenderState } from '@twinfinity/geometry';\r\nimport defaultTemplateJson from '../templates/default-template.json';\r\nimport {\r\n pointInPolygon,\r\n filterItemsInPolygons,\r\n filterEntriesByClip,\r\n offsetPolygons,\r\n projectPolygonsToLocal\r\n} from './clipUtils';\r\nimport { uniquePositiveDenoms } from './utils';\r\nimport { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';\r\nimport { renderViewportElement } from './viewportRender';\r\nimport { prepareViewports } from './viewportPrep';\r\nimport { renderLabels, ViewportRenderInfo } from './labelsRender';\r\nimport { renderQrElements } from './qrRender';\r\nimport { applyLegendFilter, buildLegendGroup } from './legendRender';\r\nimport { RenderLayoutOptions } from './options';\r\nimport { resolvePresets } from './presets';\r\nimport { pushWarning } from './warnings';\r\nimport { escapeAttr, escapeText, interpolate, getPathValue } from './renderUtils';\r\nimport { validateSectionState } from './sectionValidation';\r\nimport {\r\n ELEMENT_KIND_VIEWPORT,\r\n ELEMENT_KIND_TEXT,\r\n ELEMENT_KIND_IMAGE,\r\n ELEMENT_KIND_LINE,\r\n ELEMENT_KIND_RECT,\r\n ELEMENT_KIND_CIRCLE,\r\n ELEMENT_KIND_POLYLINE,\r\n ELEMENT_KIND_POLYGON,\r\n ELEMENT_KIND_SCALE_BAR,\r\n ELEMENT_KIND_QR,\r\n ELEMENT_KIND_LABELS,\r\n ELEMENT_KIND_LEGEND,\r\n ELEMENT_KIND_GROUP\r\n} from './elementKinds';\r\nimport {\r\n AssetSpec,\r\n LayoutElement,\r\n ViewportElement,\r\n TextElement,\r\n ImageElement,\r\n LineElement,\r\n RectElement,\r\n CircleElement,\r\n PolylineElement,\r\n PolygonElement,\r\n ScaleBarElement,\r\n QrElement,\r\n LabelsElement,\r\n LegendElement,\r\n GroupElement,\r\n LayoutTemplate,\r\n ModelContext,\r\n LayoutData,\r\n ValidationIssue,\r\n ComputedViewportScale\r\n} from './types';\r\n\r\nexport type LayoutDataValidationResult =\r\n | { ok: true }\r\n | {\r\n ok: false;\r\n errors: string[];\r\n };\r\n\r\nexport type PreflightResult =\r\n | { ok: true }\r\n | {\r\n ok: false;\r\n templateErrors?: ValidationIssue[];\r\n dataErrors?: string[];\r\n sectionErrors?: string[];\r\n };\r\n\r\nimport { isRecord, getProp } from './typeGuards';\r\n\r\n/**\r\n * Validate template, layout data, and section state in a single call.\r\n * Combines `validateLayoutTemplate`, `validateLayoutData`, and `validateSectionState`.\r\n */\r\nexport const preflight = (\r\n template: LayoutTemplate,\r\n data: unknown,\r\n expectedViewportIds: string[],\r\n sectionState?: SectionRenderState\r\n): PreflightResult => {\r\n const templateValidation = validateLayoutTemplate(template);\r\n const dataValidation = validateLayoutData(data, expectedViewportIds);\r\n const sectionValidation = sectionState ? validateSectionState(sectionState) : { ok: true as const };\r\n\r\n const ok = templateValidation.ok && dataValidation.ok && sectionValidation.ok;\r\n if (ok) return { ok: true };\r\n\r\n return {\r\n ok: false,\r\n templateErrors: templateValidation.ok ? undefined : templateValidation.errors,\r\n dataErrors: dataValidation.ok ? undefined : dataValidation.errors,\r\n sectionErrors: sectionValidation.ok ? undefined : sectionValidation.errors\r\n };\r\n};\r\n\r\n/**\r\n * Validate layout data before rendering to catch missing propertySets or items arrays.\r\n */\r\nexport const validateLayoutData = (data: unknown, expectedViewportIds: string[]): LayoutDataValidationResult => {\r\n const errors: string[] = [];\r\n if (!isRecord(data)) {\r\n return { ok: false, errors: ['layout data must be an object'] };\r\n }\r\n expectedViewportIds.forEach((vpId) => {\r\n const viewports = getProp(data, 'viewports');\r\n const viewport = isRecord(viewports) ? getProp(viewports, vpId) : undefined;\r\n const items = getProp(viewport, 'items');\r\n if (!Array.isArray(items)) {\r\n errors.push(`viewports.${vpId}.items is required and must be an array.`);\r\n return;\r\n }\r\n items.forEach((it: unknown, idx: number) => {\r\n if (!isRecord(it)) {\r\n errors.push(`viewports.${vpId}.items[${idx}] must be an object.`);\r\n return;\r\n }\r\n const sets = getProp(it, 'propertySets');\r\n if (!isRecord(sets)) {\r\n errors.push(`viewports.${vpId}.items[${idx}] is missing propertySets.<Set>.<Prop>.value.`);\r\n return;\r\n }\r\n Object.entries(sets).forEach(([setName, props]) => {\r\n if (!isRecord(props)) {\r\n errors.push(`viewports.${vpId}.items[${idx}].propertySets.${setName} must be an object.`);\r\n return;\r\n }\r\n Object.entries(props).forEach(([propName, payload]) => {\r\n if (!isRecord(payload) || !('value' in payload)) {\r\n errors.push(\r\n `viewports.${vpId}.items[${idx}].propertySets.${setName}.${propName} must include a value (propertySets.<Set>.<Prop>.value).`\r\n );\r\n }\r\n });\r\n });\r\n });\r\n });\r\n return errors.length ? { ok: false, errors } : { ok: true };\r\n};\r\n\r\nexport type {\r\n PageSpec,\r\n TextStyle,\r\n StyleMap,\r\n AssetSpec,\r\n LayoutElement,\r\n BaseElement,\r\n ViewportElement,\r\n TextElement,\r\n ImageElement,\r\n LineElement,\r\n RectElement,\r\n CircleElement,\r\n PolylineElement,\r\n PolygonElement,\r\n PointMm,\r\n ScaleBarElement,\r\n QrElement,\r\n LabelsElement,\r\n LegendElement,\r\n GroupElement,\r\n LayoutTemplate,\r\n LegendAnchor,\r\n LegendColumn,\r\n SvgModelView,\r\n ModelContext,\r\n LayoutData,\r\n LayoutDataViewports,\r\n ViewportItemsMap,\r\n PagePresetKey,\r\n PageOrientation,\r\n ValidationOptions,\r\n ValidationIssue,\r\n ValidationResult,\r\n ComputedViewportScale,\r\n NormalizedProductItem,\r\n SectionStateValidationResult,\r\n LabelStyle,\r\n WhereCondition,\r\n ClipConfig,\r\n HighlightConfig,\r\n ViewportLineStyle,\r\n ViewportLineStyles,\r\n SectionResult,\r\n FillRule,\r\n RenderDrawingInput,\r\n RenderDrawingResult,\r\n IncludeClassesFilter,\r\n ResolvedIncludeFilter,\r\n TemplateVariableDef,\r\n TemplateVariableInfo\r\n} from './types';\r\n\r\nexport type { RenderLayoutOptions } from './options';\r\n\r\nconst validateLayoutTemplate = validateLayoutTemplateExternal;\r\n\r\nexport { pointInPolygon, filterItemsInPolygons, filterEntriesByClip, offsetPolygons, projectPolygonsToLocal };\r\n/** Normalize IFC class names to lowercase for consistent matching. */\r\nexport { normalizeClass } from './filters';\r\n/** Test whether an item matches a class + where filter (used by clip, highlight, labels, legend). */\r\nexport { matchesV2Filter } from './filters';\r\n/** Metadata utilities: build lookup maps, resolve IFC class includes, and merge metadata sources. */\r\nexport {\r\n buildMetadataMap,\r\n normalizePropertySets,\r\n resolveIfcClassName,\r\n resolveIfcClassId,\r\n resolveIncludeClasses,\r\n resolveAllowedClasses,\r\n resolveMeta\r\n} from './metadata';\r\n/** Validate a layout template JSON structure. Returns `{ ok, errors }` or `{ ok, template }`. */\r\nexport { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';\r\n/** Layout utility functions: scale denominators, label sizing, color parsing, and line style application. */\r\nexport { uniquePositiveDenoms, computeLabelFontSize, colorFromString, applyLineStyleToPaths } from './utils';\r\n/** Property resolution: traverse nested objects with dot-path strings like `\"BIP.spacename\"`. */\r\nexport { getPathValue, resolveProperty, resolvePath, matchesPropertyFilter } from './renderUtils';\r\n\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\n/** Build legend table rows from product items with property formatting. */\r\nexport { buildLegendRows, type LegendRow, type LegendRowOptions } from './legendRows';\r\n/** Product normalization, viewport item builders, and section-state-to-SVG-model conversion. */\r\nexport type { ProductLike, BuildViewportItemsOptions } from './itemBuilders';\r\nexport { normalizeProductEntry, buildViewportItems, sectionStateToModelView } from './itemBuilders';\r\n/**\r\n * High-level facade: renders a complete drawing from a template + section geometry.\r\n * Internalizes all data wiring (items, colors, labels, metadata) that `renderLayout` requires manually.\r\n */\r\nexport {\r\n renderDrawing,\r\n resolveFillColor,\r\n BUILTIN_LINE_DEFAULTS,\r\n BUILTIN_HIDDEN_DEFAULTS,\r\n BUILTIN_LABEL_DEFAULTS,\r\n CATEGORY_BUILTIN_OVERRIDES,\r\n setRenderLayoutBinding\r\n} from './renderDrawing';\r\nexport type { ResolvedLineStyles } from './renderDrawing';\r\n\r\nexport { EXAMPLE_BUILDING_CLASSES } from './presets';\r\n\r\nexport { analyzeTemplate } from './analyzeTemplate';\r\nexport type { TemplateRequirements } from './analyzeTemplate';\r\n\r\n/** Drawing export utilities: convert SVG markup to PDF or SVG files. */\r\nexport { exportToPdf, exportToSvg } from './exportDrawing';\r\nexport type { ExportPdfOptions, ExportSvgOptions } from './exportDrawing';\r\n\r\n/** Template variable utilities: extract, validate, and resolve template parameters. */\r\nexport {\r\n getTemplateVariables,\r\n getTemplateDefaults,\r\n resolveTemplateValues,\r\n applyTemplateVariables\r\n} from './templateVariables';\r\n\r\n/** Result of {@link renderLayout}: the final SVG markup, per-viewport scale info, and any warnings. */\r\nexport interface RenderLayoutResult {\r\n /** Complete SVG markup string ready for embedding or PDF conversion. */\r\n svg: string;\r\n /** Per-viewport computed scale information (denominator, mm-per-model-unit, fit status). */\r\n viewportScales: Record<string, ComputedViewportScale>;\r\n /** Non-fatal issues encountered during rendering (missing assets, unresolved styles, etc.). */\r\n warnings: string[];\r\n}\r\n\r\n/** Built-in default layout template (A3 landscape with a single viewport). */\r\nexport const DEFAULT_LAYOUT_TEMPLATE = defaultTemplateJson as LayoutTemplate;\r\n\r\nconst dashArray = (dashed?: boolean): string => (dashed ? ' stroke-dasharray=\"4 2\"' : '');\r\n\r\nconst formatNumber = (value: number): number => {\r\n if (!Number.isFinite(value)) return 0;\r\n return Number.parseFloat(value.toFixed(3));\r\n};\r\n\r\n/**\r\n * Render a layout template to SVG.\r\n *\r\n * This is the low-level rendering function. For most use cases, prefer {@link renderDrawing}\r\n * which handles all data wiring automatically.\r\n *\r\n * @param template - Validated layout template (page, elements, styles, presets).\r\n * @param data - Layout data with viewport items, template variables, and legend rows.\r\n * @param models - Per-viewport SVG model views (geometry + transforms).\r\n * @param options - Optional rendering settings (remote assets, scale overrides, metadata).\r\n * @returns SVG markup string, computed viewport scales, and any warnings.\r\n */\r\nexport async function renderLayout(\r\n template: LayoutTemplate,\r\n data: LayoutData,\r\n models: ModelContext,\r\n options?: RenderLayoutOptions\r\n): Promise<RenderLayoutResult> {\r\n const presets = resolvePresets(template?.presets);\r\n\r\n const validation = validateLayoutTemplate(template, {\r\n allowRemoteAssets: options?.allowRemoteAssets,\r\n allowDataUrls: options?.allowDataUrls,\r\n maxViewports: options?.maxViewports\r\n });\r\n if (!validation.ok) {\r\n throw new Error(\r\n `Template validation failed: ${validation.errors.map((e: ValidationIssue) => `${e.path}: ${e.message}`).join('; ')}`\r\n );\r\n }\r\n\r\n const preferredScales = uniquePositiveDenoms(options?.scaleDenominators);\r\n const page = template.page;\r\n const warnings: string[] = [];\r\n\r\n // Flatten all elements to collect viewports, qrs, labels, legends regardless of grouping\r\n const allElements: LayoutElement[] = [];\r\n const collectElements = (elements: LayoutElement[]): void => {\r\n elements.forEach((el) => {\r\n allElements.push(el);\r\n if (el.kind === ELEMENT_KIND_GROUP) {\r\n collectElements((el as GroupElement).children);\r\n }\r\n });\r\n };\r\n collectElements(template.elements);\r\n\r\n const viewports = allElements.filter((el) => el.kind === ELEMENT_KIND_VIEWPORT) as ViewportElement[];\r\n\r\n const dataValidation = validateLayoutData(\r\n data,\r\n viewports.map((v) => v.id)\r\n );\r\n if (!dataValidation.ok) {\r\n throw new Error(`Layout data validation failed: ${dataValidation.errors.join('; ')}`);\r\n }\r\n\r\n const {\r\n viewportScales,\r\n viewportClipPolygonsLocal,\r\n viewportClipPolygonsWorld,\r\n viewportClipBounds,\r\n viewportClipLabels,\r\n viewportClipStyles,\r\n // viewportClipWhere intentionally omitted — not needed for rendering\r\n viewportHighlight,\r\n filteredModelsByViewport\r\n } = prepareViewports(viewports, models, data, preferredScales, presets, {\r\n metadataById: options?.metadataById,\r\n warnings\r\n });\r\n\r\n const viewportData: Record<\r\n string,\r\n {\r\n scaleDenom: number;\r\n scaleText: string;\r\n mmPerModelUnit: number;\r\n fits: boolean;\r\n }\r\n > = {};\r\n\r\n Object.entries(viewportScales).forEach(([id, scale]) => {\r\n viewportData[id] = {\r\n scaleDenom: scale.denom,\r\n scaleText: `1:${scale.denom}`,\r\n mmPerModelUnit: scale.mmPerModelUnit,\r\n fits: scale.fits\r\n };\r\n });\r\n\r\n const dataWithViewport = { ...data, viewport: viewportData };\r\n\r\n const sorted = [...template.elements].sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\r\n\r\n const parts: string[] = [];\r\n parts.push(\r\n `<svg xmlns=\"${SVG_NS}\" width=\"${page.widthMm}mm\" height=\"${page.heightMm}mm\" viewBox=\"0 0 ${page.widthMm} ${page.heightMm}\">`\r\n );\r\n\r\n if (page.backgroundColor) {\r\n parts.push(\r\n `<rect x=\"0\" y=\"0\" width=\"${page.widthMm}\" height=\"${page.heightMm}\" fill=\"${escapeAttr(page.backgroundColor)}\"/>`\r\n );\r\n }\r\n\r\n const assetMap = new Map<string, AssetSpec>();\r\n (template.assets ?? []).forEach((asset) => assetMap.set(asset.id, asset));\r\n\r\n const qrElements = allElements.filter((el) => el.kind === ELEMENT_KIND_QR) as QrElement[];\r\n const labelElements = allElements.filter((el) => el.kind === ELEMENT_KIND_LABELS) as LabelsElement[];\r\n const viewportRenderInfo: Record<string, ViewportRenderInfo> = {};\r\n\r\n // Pre-process legends to collect color maps (needed before viewport rendering)\r\n const legendColorMaps = new Map<string, Map<string, string>>(); // viewport ID -> color map\r\n const legendElements = allElements.filter((el) => el.kind === ELEMENT_KIND_LEGEND) as LegendElement[];\r\n legendElements.forEach((legend) => {\r\n if (legend.assignColors?.enabled && legend.groupBy) {\r\n const legendItems = getPathValue(data, `viewports.${legend.viewport}.items`);\r\n const rawLegendItems = Array.isArray(legendItems) ? legendItems : [];\r\n const legendDataFiltered = applyLegendFilter(\r\n rawLegendItems,\r\n legend,\r\n viewports,\r\n viewportClipPolygonsLocal,\r\n viewportRenderInfo\r\n );\r\n if (legendDataFiltered && legendDataFiltered.length) {\r\n const vpEl = viewports.find((v) => v.id === legend.viewport);\r\n const fillOpacity = vpEl?.fills?.length ? (vpEl.fills[0].fillOpacity ?? 0.35) : undefined;\r\n const result = buildLegendGroup(\r\n legend,\r\n template.styles,\r\n page,\r\n page.marginMm,\r\n legendDataFiltered,\r\n fillOpacity\r\n );\r\n if (result?.colorMap) {\r\n legendColorMaps.set(legend.viewport, result.colorMap);\r\n console.log(\r\n `[LEGEND PRE-PROCESS] Stored color map for viewport \"${legend.viewport}\": ${result.colorMap.size} colors`\r\n );\r\n }\r\n }\r\n }\r\n });\r\n\r\n sorted.forEach((el) => {\r\n if (el.kind === ELEMENT_KIND_RECT) {\r\n const r = el as RectElement;\r\n parts.push(\r\n `<rect x=\"${r.xMm}\" y=\"${r.yMm}\" width=\"${r.widthMm}\" height=\"${r.heightMm}\"` +\r\n (r.stroke ? ` stroke=\"${escapeAttr(r.stroke)}\"` : '') +\r\n (r.strokeWidthMm ? ` stroke-width=\"${r.strokeWidthMm}\"` : '') +\r\n (r.fill ? ` fill=\"${escapeAttr(r.fill)}\"` : ' fill=\"none\"') +\r\n dashArray(r.dashed) +\r\n ` />`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_LINE) {\r\n const l = el as LineElement;\r\n parts.push(\r\n `<line x1=\"${l.x1Mm}\" y1=\"${l.y1Mm}\" x2=\"${l.x2Mm}\" y2=\"${l.y2Mm}\"` +\r\n (l.stroke ? ` stroke=\"${escapeAttr(l.stroke)}\"` : '') +\r\n (l.strokeWidthMm ? ` stroke-width=\"${l.strokeWidthMm}\"` : '') +\r\n dashArray(l.dashed) +\r\n ` />`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_CIRCLE) {\r\n const c = el as CircleElement;\r\n parts.push(\r\n `<circle cx=\"${c.cxMm}\" cy=\"${c.cyMm}\" r=\"${c.rMm}\"` +\r\n (c.stroke ? ` stroke=\"${escapeAttr(c.stroke)}\"` : '') +\r\n (c.strokeWidthMm ? ` stroke-width=\"${c.strokeWidthMm}\"` : '') +\r\n (c.fill ? ` fill=\"${escapeAttr(c.fill)}\"` : ' fill=\"none\"') +\r\n dashArray(c.dashed) +\r\n ` />`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_POLYLINE) {\r\n const pl = el as PolylineElement;\r\n const pointsStr = pl.points.map((p) => `${formatNumber(p.xMm)},${formatNumber(p.yMm)}`).join(' ');\r\n parts.push(\r\n `<polyline points=\"${pointsStr}\" stroke=\"${escapeAttr(pl.stroke)}\" stroke-width=\"${pl.strokeWidthMm}\" fill=\"none\"${dashArray(pl.dashed)} />`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_POLYGON) {\r\n const pg = el as PolygonElement;\r\n const pointsStr = pg.points.map((p) => `${formatNumber(p.xMm)},${formatNumber(p.yMm)}`).join(' ');\r\n parts.push(\r\n `<polygon points=\"${pointsStr}\"` +\r\n (pg.stroke ? ` stroke=\"${escapeAttr(pg.stroke)}\"` : '') +\r\n (pg.strokeWidthMm ? ` stroke-width=\"${pg.strokeWidthMm}\"` : '') +\r\n (pg.fill ? ` fill=\"${escapeAttr(pg.fill)}\"` : ' fill=\"none\"') +\r\n dashArray(pg.dashed) +\r\n ` />`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_TEXT) {\r\n const tEl = el as TextElement;\r\n const styleName = tEl.textStyle;\r\n const style = styleName ? template.styles?.[styleName] : undefined;\r\n if (!style) {\r\n pushWarning(warnings, `Missing text style '${styleName ?? '(none)'}' for element '${tEl.id}'.`);\r\n return;\r\n }\r\n const text = interpolate(tEl.text, dataWithViewport, warnings);\r\n const anchor = tEl.align === 'center' ? 'middle' : tEl.align === 'right' ? 'end' : 'start';\r\n parts.push(\r\n `<text x=\"${tEl.xMm}\" y=\"${tEl.yMm}\" font-family=\"${escapeAttr(style.fontFamily)}\" font-size=\"${style.fontSizeMm}\"` +\r\n (style.fontWeight ? ` font-weight=\"${escapeAttr(style.fontWeight)}\"` : '') +\r\n (style.color ? ` fill=\"${escapeAttr(style.color)}\"` : '') +\r\n (style.letterSpacingMm !== undefined ? ` letter-spacing=\"${style.letterSpacingMm}\"` : '') +\r\n (style.lineHeightMm !== undefined ? ` line-height=\"${style.lineHeightMm}\"` : '') +\r\n ` text-anchor=\"${anchor}\">${escapeText(text)}</text>`\r\n );\r\n } else if (el.kind === ELEMENT_KIND_IMAGE) {\r\n const img = el as ImageElement;\r\n const asset = assetMap.get(img.assetId);\r\n if (!asset) {\r\n pushWarning(warnings, `Missing asset '${img.assetId}' for image '${img.id}'.`);\r\n return;\r\n }\r\n if (asset.src) {\r\n parts.push(\r\n `<image href=\"${escapeAttr(asset.src)}\" x=\"${img.xMm}\" y=\"${img.yMm}\" width=\"${img.widthMm}\" height=\"${img.heightMm}\"` +\r\n (img.fit === 'cover'\r\n ? ' preserveAspectRatio=\"xMidYMid slice\"'\r\n : img.fit === 'stretch'\r\n ? ' preserveAspectRatio=\"none\"'\r\n : ' preserveAspectRatio=\"xMidYMid meet\"') +\r\n ` />`\r\n );\r\n } else if (asset.content) {\r\n parts.push(\r\n `<g transform=\"translate(${img.xMm} ${img.yMm}) scale(${img.widthMm} ${img.heightMm})\">${asset.content}</g>`\r\n );\r\n }\r\n } else if (el.kind === ELEMENT_KIND_SCALE_BAR) {\r\n const sb = el as ScaleBarElement;\r\n // Scale bar declares which viewport it binds to via `viewport`\r\n const boundViewport = sb.viewport ?? viewports[0]?.id ?? null;\r\n if (!boundViewport) {\r\n pushWarning(warnings, `Scale bar '${sb.id}' is not bound to a viewport.`);\r\n return;\r\n }\r\n const scaleInfo = viewportScales[boundViewport];\r\n if (!scaleInfo) {\r\n pushWarning(warnings, `Viewport '${boundViewport}' missing scale info for scale bar '${sb.id}'.`);\r\n return;\r\n }\r\n const lengthMm = sb.maxLengthMm;\r\n const segments = sb.segments ?? 10;\r\n const segmentMm = lengthMm / segments;\r\n const metersPerMm = 1 / scaleInfo.mmPerModelUnit;\r\n const segmentMeters = segmentMm * metersPerMm;\r\n const labelsEvery = Math.max(1, sb.labelEvery ?? 1);\r\n const unitSuffix = sb.unit ? ` ${sb.unit}` : ' m';\r\n const barParts: string[] = [];\r\n const sbStroke = sb.stroke ?? '#000';\r\n const sbStrokeWidth = sb.strokeWidthMm ?? 0.5;\r\n\r\n for (let i = 0; i <= segments; i++) {\r\n const x = sb.xMm + segmentMm * i;\r\n const isLabel = i % labelsEvery === 0;\r\n const height = isLabel ? 4 : 3;\r\n barParts.push(\r\n `<line x1=\"${x}\" y1=\"${sb.yMm}\" x2=\"${x}\" y2=\"${sb.yMm - height}\" stroke=\"${escapeAttr(\r\n sbStroke\r\n )}\" stroke-width=\"${sbStrokeWidth}\" />`\r\n );\r\n if (isLabel && sb.textStyle) {\r\n const style = template.styles?.[sb.textStyle];\r\n if (style) {\r\n const labelValue = (segmentMeters * i).toFixed(2).replace(/\\.?0+$/, '');\r\n barParts.push(\r\n `<text x=\"${x}\" y=\"${sb.yMm + style.fontSizeMm + 1}\" font-family=\"${escapeAttr(\r\n style.fontFamily\r\n )}\" font-size=\"${style.fontSizeMm}\" text-anchor=\"middle\">${escapeText(labelValue + unitSuffix)}</text>`\r\n );\r\n }\r\n }\r\n }\r\n\r\n barParts.push(\r\n `<line x1=\"${sb.xMm}\" y1=\"${sb.yMm}\" x2=\"${sb.xMm + lengthMm}\" y2=\"${sb.yMm}\" stroke=\"${escapeAttr(\r\n sbStroke\r\n )}\" stroke-width=\"${sbStrokeWidth}\" />`\r\n );\r\n\r\n parts.push(barParts.join(''));\r\n } else if (el.kind === ELEMENT_KIND_VIEWPORT) {\r\n const vp = el as ViewportElement;\r\n const model = filteredModelsByViewport[vp.id] ?? models[vp.id] ?? null;\r\n if (!model) {\r\n pushWarning(warnings, `Viewport '${vp.id}' missing model.`);\r\n }\r\n const vpParts = renderViewportElement(\r\n vp,\r\n model,\r\n dataWithViewport,\r\n preferredScales,\r\n presets.scales,\r\n assetMap,\r\n viewportScales,\r\n viewportClipPolygonsLocal,\r\n viewportClipBounds,\r\n viewportClipLabels,\r\n viewportClipStyles,\r\n viewportHighlight,\r\n viewportRenderInfo,\r\n warnings,\r\n legendColorMaps\r\n );\r\n parts.push(...vpParts);\r\n } else if (el.kind === ELEMENT_KIND_LEGEND) {\r\n const legend = el as LegendElement;\r\n const legendItems = getPathValue(data, `viewports.${legend.viewport}.items`);\r\n const rawLegendItems = Array.isArray(legendItems) ? legendItems : [];\r\n const legendDataFiltered = applyLegendFilter(\r\n rawLegendItems,\r\n legend,\r\n viewports,\r\n viewportClipPolygonsLocal,\r\n viewportRenderInfo\r\n );\r\n if (!legendDataFiltered || !legendDataFiltered.length) {\r\n if (!rawLegendItems.length) {\r\n pushWarning(warnings, `Legend '${legend.id}' has no items from viewport '${legend.viewport}'.`);\r\n } else {\r\n pushWarning(\r\n warnings,\r\n `Legend '${legend.id}' filter matched 0 of ${rawLegendItems.length} items (class=${JSON.stringify(legend.class)}, where=${JSON.stringify(legend.where)}).`\r\n );\r\n }\r\n }\r\n const vpEl = viewports.find((v) => v.id === legend.viewport);\r\n // Derive swatch opacity from viewport fill rules (first matching rule's opacity)\r\n const fillOpacity = vpEl?.fills?.length ? (vpEl.fills[0].fillOpacity ?? 0.35) : undefined;\r\n const legendResult = buildLegendGroup(\r\n legend,\r\n template.styles,\r\n page,\r\n page.marginMm,\r\n legendDataFiltered || [],\r\n fillOpacity\r\n );\r\n if (legendResult) {\r\n parts.push(legendResult.svg);\r\n }\r\n }\r\n });\r\n\r\n if (labelElements.length) {\r\n const labelParts = renderLabels(\r\n labelElements,\r\n data,\r\n viewportRenderInfo,\r\n viewportClipLabels,\r\n viewportClipPolygonsLocal,\r\n viewportClipPolygonsWorld,\r\n template.styles ?? {},\r\n dataWithViewport,\r\n warnings\r\n );\r\n parts.push(...labelParts);\r\n }\r\n\r\n if (qrElements.length) {\r\n const qrParts = await renderQrElements(\r\n qrElements,\r\n viewports,\r\n viewportScales,\r\n models,\r\n { qrContext: options?.qrContext },\r\n dataWithViewport,\r\n warnings\r\n );\r\n parts.push(...qrParts);\r\n }\r\n\r\n parts.push('</svg>');\r\n\r\n return { svg: parts.join(''), viewportScales, warnings };\r\n}\r\n\r\n// Register renderLayout with renderDrawing to break the circular dependency.\r\n// This runs at module evaluation time — safe because renderLayout is defined above.\r\nimport { setRenderLayoutBinding as _setBinding } from './renderDrawing';\r\n_setBinding(renderLayout as any);\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["layout/index.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,MAAM,oCAAoC,CAAC;AACrE,OAAO,EACH,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACH,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,gBAAgB,CAAC;AAwCxB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACrB,QAAwB,EACxB,IAAa,EACb,mBAA6B,EAC7B,YAAiC,EAClB,EAAE;IACjB,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE,CAAC;IAEpG,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE,IAAI,iBAAiB,CAAC,EAAE,CAAC;IAC9E,IAAI,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAE5B,OAAO;QACH,EAAE,EAAE,KAAK;QACT,cAAc,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM;QAC7E,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM;QACjE,aAAa,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM;KAC7E,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAE,mBAA6B,EAA8B,EAAE;IAC3G,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,+BAA+B,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,0CAA0C,CAAC,CAAC;YACzE,OAAO;QACX,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAW,EAAE,GAAW,EAAE,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,GAAG,sBAAsB,CAAC,CAAC;gBAClE,OAAO;YACX,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,GAAG,+CAA+C,CAAC,CAAC;gBAC3F,OAAO;YACX,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC9C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU,GAAG,kBAAkB,OAAO,qBAAqB,CAAC,CAAC;oBAC1F,OAAO;gBACX,CAAC;gBACD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE;oBAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;wBAC9C,MAAM,CAAC,IAAI,CACP,aAAa,IAAI,UAAU,GAAG,kBAAkB,OAAO,IAAI,QAAQ,0DAA0D,CAChI,CAAC;oBACN,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC,CAAC;AAyDF,MAAM,sBAAsB,GAAG,8BAA8B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAC;AAC9G,sEAAsE;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,qGAAqG;AACrG,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,qGAAqG;AACrG,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACd,MAAM,YAAY,CAAC;AACpB,iGAAiG;AACjG,OAAO,EAAE,sBAAsB,IAAI,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACxF,6GAA6G;AAC7G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC7G,iGAAiG;AACjG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAElG,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAE5C,2EAA2E;AAC3E,OAAO,EAAE,eAAe,EAAyC,MAAM,cAAc,CAAC;AAGtF,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpG;;;GAGG;AACH,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACzB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wEAAwE;AACxE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG3D,uFAAuF;AACvF,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACzB,MAAM,qBAAqB,CAAC;AAY7B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,mBAAqC,CAAC;AAE7E,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1F,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,QAAwB,EACxB,IAAgB,EAChB,MAAoB,EACpB,OAA6B;IAE7B,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,EAAE;QAChD,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;QAC7C,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,YAAY,EAAE,OAAO,EAAE,YAAY;KACtC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACX,+BAA+B,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvH,CAAC;IACN,CAAC;IAED,MAAM,eAAe,GAAG,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,yFAAyF;IACzF,MAAM,WAAW,GAAoB,EAAE,CAAC;IACxC,MAAM,eAAe,GAAG,CAAC,QAAyB,EAAQ,EAAE;QACxD,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACpB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACjC,eAAe,CAAE,EAAmB,CAAC,QAAQ,CAAC,CAAC;YACnD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,qBAAqB,CAAsB,CAAC;IAErG,MAAM,cAAc,GAAG,kBAAkB,CACrC,IAAI,EACJ,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAC;IACF,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,EACF,cAAc,EACd,yBAAyB,EACzB,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB;IAClB,qEAAqE;IACrE,iBAAiB,EACjB,wBAAwB,EAC3B,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE;QACpE,YAAY,EAAE,OAAO,EAAE,YAAY;QACnC,QAAQ;KACX,CAAC,CAAC;IAEH,MAAM,YAAY,GAQd,EAAE,CAAC;IAEP,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;QACnD,YAAY,CAAC,EAAE,CAAC,GAAG;YACf,UAAU,EAAE,KAAK,CAAC,KAAK;YACvB,SAAS,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE;YAC7B,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI;SACnB,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAE7D,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAExF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CACN,eAAe,MAAM,YAAY,IAAI,CAAC,OAAO,eAAe,IAAI,CAAC,QAAQ,oBAAoB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,CACjI,CAAC;IAEF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CACN,4BAA4B,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,QAAQ,WAAW,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CACrH,CAAC;IACN,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1E,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAgB,CAAC;IAC1F,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,mBAAmB,CAAoB,CAAC;IACrG,MAAM,kBAAkB,GAAuC,EAAE,CAAC;IAElE,+EAA+E;IAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC,CAAC,2BAA2B;IAC3F,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,mBAAmB,CAAoB,CAAC;IACtG,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9B,IAAI,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC;YAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,kBAAkB,GAAG,iBAAiB,CACxC,cAAc,EACd,MAAM,EACN,SAAS,EACT,yBAAyB,EACzB,kBAAkB,CACrB,CAAC;YACF,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC7D,MAAM,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1F,MAAM,MAAM,GAAG,gBAAgB,CAC3B,MAAM,EACN,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,IAAI,CAAC,QAAQ,EACb,kBAAkB,EAClB,WAAW,CACd,CAAC;gBACF,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;oBACnB,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CACP,uDAAuD,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAC5G,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QAClB,IAAI,EAAE,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,EAAiB,CAAC;YAC5B,KAAK,CAAC,IAAI,CACN,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,QAAQ,GAAG;gBACzE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC3D,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnB,KAAK,CACZ,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,EAAiB,CAAC;YAC5B,KAAK,CAAC,IAAI,CACN,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,GAAG;gBAC/D,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnB,KAAK,CACZ,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,EAAmB,CAAC;YAC9B,KAAK,CAAC,IAAI,CACN,eAAe,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,GAAG;gBAChD,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC3D,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnB,KAAK,CACZ,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAqB,CAAC;YACjC,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClG,KAAK,CAAC,IAAI,CACN,qBAAqB,SAAS,aAAa,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,aAAa,gBAAgB,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAC/I,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,EAAoB,CAAC;YAChC,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClG,KAAK,CAAC,IAAI,CACN,oBAAoB,SAAS,GAAG;gBAC5B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC;gBAC7D,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC;gBACpB,KAAK,CACZ,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,EAAiB,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,WAAW,CAAC,QAAQ,EAAE,uBAAuB,SAAS,IAAI,QAAQ,kBAAkB,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChG,OAAO;YACX,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3F,KAAK,CAAC,IAAI,CACN,YAAY,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,kBAAkB,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,KAAK,CAAC,UAAU,GAAG;gBAC/G,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzF,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChF,iBAAiB,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,SAAS,CAC5D,CAAC;QACN,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,EAAkB,CAAC;YAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,CAAC,OAAO,gBAAgB,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC/E,OAAO;YACX,CAAC;YACD,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CACN,gBAAgB,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,OAAO,aAAa,GAAG,CAAC,QAAQ,GAAG;oBAClH,CAAC,GAAG,CAAC,GAAG,KAAK,OAAO;wBAChB,CAAC,CAAC,uCAAuC;wBACzC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS;4BACrB,CAAC,CAAC,6BAA6B;4BAC/B,CAAC,CAAC,sCAAsC,CAAC;oBAC/C,KAAK,CACZ,CAAC;YACN,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CACN,2BAA2B,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,MAAM,KAAK,CAAC,OAAO,MAAM,CAC/G,CAAC;YACN,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,EAAqB,CAAC;YACjC,+DAA+D;YAC/D,MAAM,aAAa,GAAG,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;YAC9D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;gBAC1E,OAAO;YACX,CAAC;YACD,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,WAAW,CAAC,QAAQ,EAAE,aAAa,aAAa,uCAAuC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAClG,OAAO;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC;YAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;YACtC,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC;YACjD,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAClD,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC;YACrC,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,IAAI,GAAG,CAAC;YAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,KAAK,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,QAAQ,CAAC,IAAI,CACT,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,GAAG,MAAM,aAAa,UAAU,CAClF,QAAQ,CACX,mBAAmB,aAAa,MAAM,CAC1C,CAAC;gBACF,IAAI,OAAO,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;oBAC9C,IAAI,KAAK,EAAE,CAAC;wBACR,MAAM,UAAU,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;wBACxE,QAAQ,CAAC,IAAI,CACT,YAAY,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,kBAAkB,UAAU,CAC1E,KAAK,CAAC,UAAU,CACnB,gBAAgB,KAAK,CAAC,UAAU,0BAA0B,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,SAAS,CAC1G,CAAC;oBACN,CAAC;gBACL,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,IAAI,CACT,aAAa,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG,QAAQ,SAAS,EAAE,CAAC,GAAG,aAAa,UAAU,CAC9F,QAAQ,CACX,mBAAmB,aAAa,MAAM,CAC1C,CAAC;YAEF,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,EAAqB,CAAC;YACjC,MAAM,KAAK,GAAG,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;YACvE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,OAAO,GAAG,qBAAqB,CACjC,EAAE,EACF,KAAK,EACL,gBAAgB,EAChB,eAAe,EACf,OAAO,CAAC,MAAM,EACd,QAAQ,EACR,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,CAClB,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,EAAE,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,EAAmB,CAAC;YACnC,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,MAAM,CAAC,QAAQ,QAAQ,CAAC,CAAC;YAC7E,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,kBAAkB,GAAG,iBAAiB,CACxC,cAAc,EACd,MAAM,EACN,SAAS,EACT,yBAAyB,EACzB,kBAAkB,CACrB,CAAC;YACF,IAAI,CAAC,kBAAkB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;gBACpD,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;oBACzB,WAAW,CAAC,QAAQ,EAAE,WAAW,MAAM,CAAC,EAAE,iCAAiC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;gBACpG,CAAC;qBAAM,CAAC;oBACJ,WAAW,CACP,QAAQ,EACR,WAAW,MAAM,CAAC,EAAE,yBAAyB,cAAc,CAAC,MAAM,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAC7J,CAAC;gBACN,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7D,iFAAiF;YACjF,MAAM,WAAW,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1F,MAAM,YAAY,GAAG,gBAAgB,CACjC,MAAM,EACN,QAAQ,CAAC,MAAM,EACf,IAAI,EACJ,IAAI,CAAC,QAAQ,EACb,kBAAkB,IAAI,EAAE,EACxB,WAAW,CACd,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,YAAY,CAC3B,aAAa,EACb,IAAI,EACJ,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,gBAAgB,EAChB,QAAQ,CACX,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAClC,UAAU,EACV,SAAS,EACT,cAAc,EACd,MAAM,EACN,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EACjC,gBAAgB,EAChB,QAAQ,CACX,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,6EAA6E;AAC7E,oFAAoF;AACpF,OAAO,EAAE,sBAAsB,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,WAAW,CAAC,YAAmB,CAAC,CAAC","sourcesContent":["import type { SectionRenderState } from '@twinfinity/geometry';\nimport defaultTemplateJson from '../templates/default-template.json';\nimport {\n pointInPolygon,\n filterItemsInPolygons,\n filterEntriesByClip,\n offsetPolygons,\n projectPolygonsToLocal\n} from './clipUtils';\nimport { uniquePositiveDenoms } from './utils';\nimport { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';\nimport { renderViewportElement } from './viewportRender';\nimport { prepareViewports } from './viewportPrep';\nimport { renderLabels, ViewportRenderInfo } from './labelsRender';\nimport { renderQrElements } from './qrRender';\nimport { applyLegendFilter, buildLegendGroup } from './legendRender';\nimport { RenderLayoutOptions } from './options';\nimport { resolvePresets } from './presets';\nimport { pushWarning } from './warnings';\nimport { escapeAttr, escapeText, interpolate, getPathValue } from './renderUtils';\nimport { validateSectionState } from './sectionValidation';\nimport {\n ELEMENT_KIND_VIEWPORT,\n ELEMENT_KIND_TEXT,\n ELEMENT_KIND_IMAGE,\n ELEMENT_KIND_LINE,\n ELEMENT_KIND_RECT,\n ELEMENT_KIND_CIRCLE,\n ELEMENT_KIND_POLYLINE,\n ELEMENT_KIND_POLYGON,\n ELEMENT_KIND_SCALE_BAR,\n ELEMENT_KIND_QR,\n ELEMENT_KIND_LABELS,\n ELEMENT_KIND_LEGEND,\n ELEMENT_KIND_GROUP\n} from './elementKinds';\nimport {\n AssetSpec,\n LayoutElement,\n ViewportElement,\n TextElement,\n ImageElement,\n LineElement,\n RectElement,\n CircleElement,\n PolylineElement,\n PolygonElement,\n ScaleBarElement,\n QrElement,\n LabelsElement,\n LegendElement,\n GroupElement,\n LayoutTemplate,\n ModelContext,\n LayoutData,\n ValidationIssue,\n ComputedViewportScale\n} from './types';\n\nexport type LayoutDataValidationResult =\n | { ok: true }\n | {\n ok: false;\n errors: string[];\n };\n\nexport type PreflightResult =\n | { ok: true }\n | {\n ok: false;\n templateErrors?: ValidationIssue[];\n dataErrors?: string[];\n sectionErrors?: string[];\n };\n\nimport { isRecord, getProp } from './typeGuards';\n\n/**\n * Validate template, layout data, and section state in a single call.\n * Combines `validateLayoutTemplate`, `validateLayoutData`, and `validateSectionState`.\n */\nexport const preflight = (\n template: LayoutTemplate,\n data: unknown,\n expectedViewportIds: string[],\n sectionState?: SectionRenderState\n): PreflightResult => {\n const templateValidation = validateLayoutTemplate(template);\n const dataValidation = validateLayoutData(data, expectedViewportIds);\n const sectionValidation = sectionState ? validateSectionState(sectionState) : { ok: true as const };\n\n const ok = templateValidation.ok && dataValidation.ok && sectionValidation.ok;\n if (ok) return { ok: true };\n\n return {\n ok: false,\n templateErrors: templateValidation.ok ? undefined : templateValidation.errors,\n dataErrors: dataValidation.ok ? undefined : dataValidation.errors,\n sectionErrors: sectionValidation.ok ? undefined : sectionValidation.errors\n };\n};\n\n/**\n * Validate layout data before rendering to catch missing propertySets or items arrays.\n */\nexport const validateLayoutData = (data: unknown, expectedViewportIds: string[]): LayoutDataValidationResult => {\n const errors: string[] = [];\n if (!isRecord(data)) {\n return { ok: false, errors: ['layout data must be an object'] };\n }\n expectedViewportIds.forEach((vpId) => {\n const viewports = getProp(data, 'viewports');\n const viewport = isRecord(viewports) ? getProp(viewports, vpId) : undefined;\n const items = getProp(viewport, 'items');\n if (!Array.isArray(items)) {\n errors.push(`viewports.${vpId}.items is required and must be an array.`);\n return;\n }\n items.forEach((it: unknown, idx: number) => {\n if (!isRecord(it)) {\n errors.push(`viewports.${vpId}.items[${idx}] must be an object.`);\n return;\n }\n const sets = getProp(it, 'propertySets');\n if (!isRecord(sets)) {\n errors.push(`viewports.${vpId}.items[${idx}] is missing propertySets.<Set>.<Prop>.value.`);\n return;\n }\n Object.entries(sets).forEach(([setName, props]) => {\n if (!isRecord(props)) {\n errors.push(`viewports.${vpId}.items[${idx}].propertySets.${setName} must be an object.`);\n return;\n }\n Object.entries(props).forEach(([propName, payload]) => {\n if (!isRecord(payload) || !('value' in payload)) {\n errors.push(\n `viewports.${vpId}.items[${idx}].propertySets.${setName}.${propName} must include a value (propertySets.<Set>.<Prop>.value).`\n );\n }\n });\n });\n });\n });\n return errors.length ? { ok: false, errors } : { ok: true };\n};\n\nexport type {\n PageSpec,\n TextStyle,\n StyleMap,\n AssetSpec,\n LayoutElement,\n BaseElement,\n ViewportElement,\n TextElement,\n ImageElement,\n LineElement,\n RectElement,\n CircleElement,\n PolylineElement,\n PolygonElement,\n PointMm,\n ScaleBarElement,\n QrElement,\n LabelsElement,\n LegendElement,\n GroupElement,\n LayoutTemplate,\n LegendAnchor,\n LegendColumn,\n SvgModelView,\n ModelContext,\n LayoutData,\n LayoutDataViewports,\n ViewportItemsMap,\n PagePresetKey,\n PageOrientation,\n ValidationOptions,\n ValidationIssue,\n ValidationResult,\n ComputedViewportScale,\n NormalizedProductItem,\n SectionStateValidationResult,\n LabelStyle,\n WhereCondition,\n ClipConfig,\n HighlightConfig,\n ViewportLineStyle,\n ViewportLineStyles,\n SectionResult,\n FillRule,\n RenderDrawingInput,\n RenderDrawingResult,\n IncludeClassesFilter,\n ResolvedIncludeFilter,\n TemplateVariableDef,\n TemplateVariableInfo\n} from './types';\n\nexport type { RenderLayoutOptions } from './options';\n\nconst validateLayoutTemplate = validateLayoutTemplateExternal;\n\nexport { pointInPolygon, filterItemsInPolygons, filterEntriesByClip, offsetPolygons, projectPolygonsToLocal };\n/** Normalize IFC class names to lowercase for consistent matching. */\nexport { normalizeClass } from './filters';\n/** Test whether an item matches a class + where filter (used by clip, highlight, labels, legend). */\nexport { matchesV2Filter } from './filters';\n/** Metadata utilities: build lookup maps, resolve IFC class includes, and merge metadata sources. */\nexport {\n buildMetadataMap,\n normalizePropertySets,\n resolveIfcClassName,\n resolveIfcClassId,\n resolveIncludeClasses,\n resolveAllowedClasses,\n resolveMeta\n} from './metadata';\n/** Validate a layout template JSON structure. Returns `{ ok, errors }` or `{ ok, template }`. */\nexport { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';\n/** Layout utility functions: scale denominators, label sizing, color parsing, and line style application. */\nexport { uniquePositiveDenoms, computeLabelFontSize, colorFromString, applyLineStyleToPaths } from './utils';\n/** Property resolution: traverse nested objects with dot-path strings like `\"BIP.spacename\"`. */\nexport { getPathValue, resolveProperty, resolvePath, matchesPropertyFilter } from './renderUtils';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Build legend table rows from product items with property formatting. */\nexport { buildLegendRows, type LegendRow, type LegendRowOptions } from './legendRows';\n/** Product normalization, viewport item builders, and section-state-to-SVG-model conversion. */\nexport type { ProductLike, BuildViewportItemsOptions } from './itemBuilders';\nexport { normalizeProductEntry, buildViewportItems, sectionStateToModelView } from './itemBuilders';\n/**\n * High-level facade: renders a complete drawing from a template + section geometry.\n * Internalizes all data wiring (items, colors, labels, metadata) that `renderLayout` requires manually.\n */\nexport {\n renderDrawing,\n resolveFillColor,\n BUILTIN_LINE_DEFAULTS,\n BUILTIN_HIDDEN_DEFAULTS,\n BUILTIN_LABEL_DEFAULTS,\n CATEGORY_BUILTIN_OVERRIDES,\n setRenderLayoutBinding\n} from './renderDrawing';\nexport type { ResolvedLineStyles } from './renderDrawing';\n\nexport { EXAMPLE_BUILDING_CLASSES } from './presets';\n\nexport { analyzeTemplate } from './analyzeTemplate';\nexport type { TemplateRequirements } from './analyzeTemplate';\n\n/** Drawing export utilities: convert SVG markup to PDF or SVG files. */\nexport { exportToPdf, exportToSvg } from './exportDrawing';\nexport type { ExportPdfOptions, ExportSvgOptions } from './exportDrawing';\n\n/** Template variable utilities: extract, validate, and resolve template parameters. */\nexport {\n getTemplateVariables,\n getTemplateDefaults,\n resolveTemplateValues,\n applyTemplateVariables\n} from './templateVariables';\n\n/** Result of {@link renderLayout}: the final SVG markup, per-viewport scale info, and any warnings. */\nexport interface RenderLayoutResult {\n /** Complete SVG markup string ready for embedding or PDF conversion. */\n svg: string;\n /** Per-viewport computed scale information (denominator, mm-per-model-unit, fit status). */\n viewportScales: Record<string, ComputedViewportScale>;\n /** Non-fatal issues encountered during rendering (missing assets, unresolved styles, etc.). */\n warnings: string[];\n}\n\n/** Built-in default layout template (A3 landscape with a single viewport). */\nexport const DEFAULT_LAYOUT_TEMPLATE = defaultTemplateJson as LayoutTemplate;\n\nconst dashArray = (dashed?: boolean): string => (dashed ? ' stroke-dasharray=\"4 2\"' : '');\n\nconst formatNumber = (value: number): number => {\n if (!Number.isFinite(value)) return 0;\n return Number.parseFloat(value.toFixed(3));\n};\n\n/**\n * Render a layout template to SVG.\n *\n * This is the low-level rendering function. For most use cases, prefer {@link renderDrawing}\n * which handles all data wiring automatically.\n *\n * @param template - Validated layout template (page, elements, styles, presets).\n * @param data - Layout data with viewport items, template variables, and legend rows.\n * @param models - Per-viewport SVG model views (geometry + transforms).\n * @param options - Optional rendering settings (remote assets, scale overrides, metadata).\n * @returns SVG markup string, computed viewport scales, and any warnings.\n */\nexport async function renderLayout(\n template: LayoutTemplate,\n data: LayoutData,\n models: ModelContext,\n options?: RenderLayoutOptions\n): Promise<RenderLayoutResult> {\n const presets = resolvePresets(template?.presets);\n\n const validation = validateLayoutTemplate(template, {\n allowRemoteAssets: options?.allowRemoteAssets,\n allowDataUrls: options?.allowDataUrls,\n maxViewports: options?.maxViewports\n });\n if (!validation.ok) {\n throw new Error(\n `Template validation failed: ${validation.errors.map((e: ValidationIssue) => `${e.path}: ${e.message}`).join('; ')}`\n );\n }\n\n const preferredScales = uniquePositiveDenoms(options?.scaleDenominators);\n const page = template.page;\n const warnings: string[] = [];\n\n // Flatten all elements to collect viewports, qrs, labels, legends regardless of grouping\n const allElements: LayoutElement[] = [];\n const collectElements = (elements: LayoutElement[]): void => {\n elements.forEach((el) => {\n allElements.push(el);\n if (el.kind === ELEMENT_KIND_GROUP) {\n collectElements((el as GroupElement).children);\n }\n });\n };\n collectElements(template.elements);\n\n const viewports = allElements.filter((el) => el.kind === ELEMENT_KIND_VIEWPORT) as ViewportElement[];\n\n const dataValidation = validateLayoutData(\n data,\n viewports.map((v) => v.id)\n );\n if (!dataValidation.ok) {\n throw new Error(`Layout data validation failed: ${dataValidation.errors.join('; ')}`);\n }\n\n const {\n viewportScales,\n viewportClipPolygonsLocal,\n viewportClipPolygonsWorld,\n viewportClipBounds,\n viewportClipLabels,\n viewportClipStyles,\n // viewportClipWhere intentionally omitted — not needed for rendering\n viewportHighlight,\n filteredModelsByViewport\n } = prepareViewports(viewports, models, data, preferredScales, presets, {\n metadataById: options?.metadataById,\n warnings\n });\n\n const viewportData: Record<\n string,\n {\n scaleDenom: number;\n scaleText: string;\n mmPerModelUnit: number;\n fits: boolean;\n }\n > = {};\n\n Object.entries(viewportScales).forEach(([id, scale]) => {\n viewportData[id] = {\n scaleDenom: scale.denom,\n scaleText: `1:${scale.denom}`,\n mmPerModelUnit: scale.mmPerModelUnit,\n fits: scale.fits\n };\n });\n\n const dataWithViewport = { ...data, viewport: viewportData };\n\n const sorted = [...template.elements].sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n\n const parts: string[] = [];\n parts.push(\n `<svg xmlns=\"${SVG_NS}\" width=\"${page.widthMm}mm\" height=\"${page.heightMm}mm\" viewBox=\"0 0 ${page.widthMm} ${page.heightMm}\">`\n );\n\n if (page.backgroundColor) {\n parts.push(\n `<rect x=\"0\" y=\"0\" width=\"${page.widthMm}\" height=\"${page.heightMm}\" fill=\"${escapeAttr(page.backgroundColor)}\"/>`\n );\n }\n\n const assetMap = new Map<string, AssetSpec>();\n (template.assets ?? []).forEach((asset) => assetMap.set(asset.id, asset));\n\n const qrElements = allElements.filter((el) => el.kind === ELEMENT_KIND_QR) as QrElement[];\n const labelElements = allElements.filter((el) => el.kind === ELEMENT_KIND_LABELS) as LabelsElement[];\n const viewportRenderInfo: Record<string, ViewportRenderInfo> = {};\n\n // Pre-process legends to collect color maps (needed before viewport rendering)\n const legendColorMaps = new Map<string, Map<string, string>>(); // viewport ID -> color map\n const legendElements = allElements.filter((el) => el.kind === ELEMENT_KIND_LEGEND) as LegendElement[];\n legendElements.forEach((legend) => {\n if (legend.assignColors?.enabled && legend.groupBy) {\n const legendItems = getPathValue(data, `viewports.${legend.viewport}.items`);\n const rawLegendItems = Array.isArray(legendItems) ? legendItems : [];\n const legendDataFiltered = applyLegendFilter(\n rawLegendItems,\n legend,\n viewports,\n viewportClipPolygonsLocal,\n viewportRenderInfo\n );\n if (legendDataFiltered && legendDataFiltered.length) {\n const vpEl = viewports.find((v) => v.id === legend.viewport);\n const fillOpacity = vpEl?.fills?.length ? (vpEl.fills[0].fillOpacity ?? 0.35) : undefined;\n const result = buildLegendGroup(\n legend,\n template.styles,\n page,\n page.marginMm,\n legendDataFiltered,\n fillOpacity\n );\n if (result?.colorMap) {\n legendColorMaps.set(legend.viewport, result.colorMap);\n console.log(\n `[LEGEND PRE-PROCESS] Stored color map for viewport \"${legend.viewport}\": ${result.colorMap.size} colors`\n );\n }\n }\n }\n });\n\n sorted.forEach((el) => {\n if (el.kind === ELEMENT_KIND_RECT) {\n const r = el as RectElement;\n parts.push(\n `<rect x=\"${r.xMm}\" y=\"${r.yMm}\" width=\"${r.widthMm}\" height=\"${r.heightMm}\"` +\n (r.stroke ? ` stroke=\"${escapeAttr(r.stroke)}\"` : '') +\n (r.strokeWidthMm ? ` stroke-width=\"${r.strokeWidthMm}\"` : '') +\n (r.fill ? ` fill=\"${escapeAttr(r.fill)}\"` : ' fill=\"none\"') +\n dashArray(r.dashed) +\n ` />`\n );\n } else if (el.kind === ELEMENT_KIND_LINE) {\n const l = el as LineElement;\n parts.push(\n `<line x1=\"${l.x1Mm}\" y1=\"${l.y1Mm}\" x2=\"${l.x2Mm}\" y2=\"${l.y2Mm}\"` +\n (l.stroke ? ` stroke=\"${escapeAttr(l.stroke)}\"` : '') +\n (l.strokeWidthMm ? ` stroke-width=\"${l.strokeWidthMm}\"` : '') +\n dashArray(l.dashed) +\n ` />`\n );\n } else if (el.kind === ELEMENT_KIND_CIRCLE) {\n const c = el as CircleElement;\n parts.push(\n `<circle cx=\"${c.cxMm}\" cy=\"${c.cyMm}\" r=\"${c.rMm}\"` +\n (c.stroke ? ` stroke=\"${escapeAttr(c.stroke)}\"` : '') +\n (c.strokeWidthMm ? ` stroke-width=\"${c.strokeWidthMm}\"` : '') +\n (c.fill ? ` fill=\"${escapeAttr(c.fill)}\"` : ' fill=\"none\"') +\n dashArray(c.dashed) +\n ` />`\n );\n } else if (el.kind === ELEMENT_KIND_POLYLINE) {\n const pl = el as PolylineElement;\n const pointsStr = pl.points.map((p) => `${formatNumber(p.xMm)},${formatNumber(p.yMm)}`).join(' ');\n parts.push(\n `<polyline points=\"${pointsStr}\" stroke=\"${escapeAttr(pl.stroke)}\" stroke-width=\"${pl.strokeWidthMm}\" fill=\"none\"${dashArray(pl.dashed)} />`\n );\n } else if (el.kind === ELEMENT_KIND_POLYGON) {\n const pg = el as PolygonElement;\n const pointsStr = pg.points.map((p) => `${formatNumber(p.xMm)},${formatNumber(p.yMm)}`).join(' ');\n parts.push(\n `<polygon points=\"${pointsStr}\"` +\n (pg.stroke ? ` stroke=\"${escapeAttr(pg.stroke)}\"` : '') +\n (pg.strokeWidthMm ? ` stroke-width=\"${pg.strokeWidthMm}\"` : '') +\n (pg.fill ? ` fill=\"${escapeAttr(pg.fill)}\"` : ' fill=\"none\"') +\n dashArray(pg.dashed) +\n ` />`\n );\n } else if (el.kind === ELEMENT_KIND_TEXT) {\n const tEl = el as TextElement;\n const styleName = tEl.textStyle;\n const style = styleName ? template.styles?.[styleName] : undefined;\n if (!style) {\n pushWarning(warnings, `Missing text style '${styleName ?? '(none)'}' for element '${tEl.id}'.`);\n return;\n }\n const text = interpolate(tEl.text, dataWithViewport, warnings);\n const anchor = tEl.align === 'center' ? 'middle' : tEl.align === 'right' ? 'end' : 'start';\n parts.push(\n `<text x=\"${tEl.xMm}\" y=\"${tEl.yMm}\" font-family=\"${escapeAttr(style.fontFamily)}\" font-size=\"${style.fontSizeMm}\"` +\n (style.fontWeight ? ` font-weight=\"${escapeAttr(style.fontWeight)}\"` : '') +\n (style.color ? ` fill=\"${escapeAttr(style.color)}\"` : '') +\n (style.letterSpacingMm !== undefined ? ` letter-spacing=\"${style.letterSpacingMm}\"` : '') +\n (style.lineHeightMm !== undefined ? ` line-height=\"${style.lineHeightMm}\"` : '') +\n ` text-anchor=\"${anchor}\">${escapeText(text)}</text>`\n );\n } else if (el.kind === ELEMENT_KIND_IMAGE) {\n const img = el as ImageElement;\n const asset = assetMap.get(img.assetId);\n if (!asset) {\n pushWarning(warnings, `Missing asset '${img.assetId}' for image '${img.id}'.`);\n return;\n }\n if (asset.src) {\n parts.push(\n `<image href=\"${escapeAttr(asset.src)}\" x=\"${img.xMm}\" y=\"${img.yMm}\" width=\"${img.widthMm}\" height=\"${img.heightMm}\"` +\n (img.fit === 'cover'\n ? ' preserveAspectRatio=\"xMidYMid slice\"'\n : img.fit === 'stretch'\n ? ' preserveAspectRatio=\"none\"'\n : ' preserveAspectRatio=\"xMidYMid meet\"') +\n ` />`\n );\n } else if (asset.content) {\n parts.push(\n `<g transform=\"translate(${img.xMm} ${img.yMm}) scale(${img.widthMm} ${img.heightMm})\">${asset.content}</g>`\n );\n }\n } else if (el.kind === ELEMENT_KIND_SCALE_BAR) {\n const sb = el as ScaleBarElement;\n // Scale bar declares which viewport it binds to via `viewport`\n const boundViewport = sb.viewport ?? viewports[0]?.id ?? null;\n if (!boundViewport) {\n pushWarning(warnings, `Scale bar '${sb.id}' is not bound to a viewport.`);\n return;\n }\n const scaleInfo = viewportScales[boundViewport];\n if (!scaleInfo) {\n pushWarning(warnings, `Viewport '${boundViewport}' missing scale info for scale bar '${sb.id}'.`);\n return;\n }\n const lengthMm = sb.maxLengthMm;\n const segments = sb.segments ?? 10;\n const segmentMm = lengthMm / segments;\n const metersPerMm = 1 / scaleInfo.mmPerModelUnit;\n const segmentMeters = segmentMm * metersPerMm;\n const labelsEvery = Math.max(1, sb.labelEvery ?? 1);\n const unitSuffix = sb.unit ? ` ${sb.unit}` : ' m';\n const barParts: string[] = [];\n const sbStroke = sb.stroke ?? '#000';\n const sbStrokeWidth = sb.strokeWidthMm ?? 0.5;\n\n for (let i = 0; i <= segments; i++) {\n const x = sb.xMm + segmentMm * i;\n const isLabel = i % labelsEvery === 0;\n const height = isLabel ? 4 : 3;\n barParts.push(\n `<line x1=\"${x}\" y1=\"${sb.yMm}\" x2=\"${x}\" y2=\"${sb.yMm - height}\" stroke=\"${escapeAttr(\n sbStroke\n )}\" stroke-width=\"${sbStrokeWidth}\" />`\n );\n if (isLabel && sb.textStyle) {\n const style = template.styles?.[sb.textStyle];\n if (style) {\n const labelValue = (segmentMeters * i).toFixed(2).replace(/\\.?0+$/, '');\n barParts.push(\n `<text x=\"${x}\" y=\"${sb.yMm + style.fontSizeMm + 1}\" font-family=\"${escapeAttr(\n style.fontFamily\n )}\" font-size=\"${style.fontSizeMm}\" text-anchor=\"middle\">${escapeText(labelValue + unitSuffix)}</text>`\n );\n }\n }\n }\n\n barParts.push(\n `<line x1=\"${sb.xMm}\" y1=\"${sb.yMm}\" x2=\"${sb.xMm + lengthMm}\" y2=\"${sb.yMm}\" stroke=\"${escapeAttr(\n sbStroke\n )}\" stroke-width=\"${sbStrokeWidth}\" />`\n );\n\n parts.push(barParts.join(''));\n } else if (el.kind === ELEMENT_KIND_VIEWPORT) {\n const vp = el as ViewportElement;\n const model = filteredModelsByViewport[vp.id] ?? models[vp.id] ?? null;\n if (!model) {\n pushWarning(warnings, `Viewport '${vp.id}' missing model.`);\n }\n const vpParts = renderViewportElement(\n vp,\n model,\n dataWithViewport,\n preferredScales,\n presets.scales,\n assetMap,\n viewportScales,\n viewportClipPolygonsLocal,\n viewportClipBounds,\n viewportClipLabels,\n viewportClipStyles,\n viewportHighlight,\n viewportRenderInfo,\n warnings,\n legendColorMaps\n );\n parts.push(...vpParts);\n } else if (el.kind === ELEMENT_KIND_LEGEND) {\n const legend = el as LegendElement;\n const legendItems = getPathValue(data, `viewports.${legend.viewport}.items`);\n const rawLegendItems = Array.isArray(legendItems) ? legendItems : [];\n const legendDataFiltered = applyLegendFilter(\n rawLegendItems,\n legend,\n viewports,\n viewportClipPolygonsLocal,\n viewportRenderInfo\n );\n if (!legendDataFiltered || !legendDataFiltered.length) {\n if (!rawLegendItems.length) {\n pushWarning(warnings, `Legend '${legend.id}' has no items from viewport '${legend.viewport}'.`);\n } else {\n pushWarning(\n warnings,\n `Legend '${legend.id}' filter matched 0 of ${rawLegendItems.length} items (class=${JSON.stringify(legend.class)}, where=${JSON.stringify(legend.where)}).`\n );\n }\n }\n const vpEl = viewports.find((v) => v.id === legend.viewport);\n // Derive swatch opacity from viewport fill rules (first matching rule's opacity)\n const fillOpacity = vpEl?.fills?.length ? (vpEl.fills[0].fillOpacity ?? 0.35) : undefined;\n const legendResult = buildLegendGroup(\n legend,\n template.styles,\n page,\n page.marginMm,\n legendDataFiltered || [],\n fillOpacity\n );\n if (legendResult) {\n parts.push(legendResult.svg);\n }\n }\n });\n\n if (labelElements.length) {\n const labelParts = renderLabels(\n labelElements,\n data,\n viewportRenderInfo,\n viewportClipLabels,\n viewportClipPolygonsLocal,\n viewportClipPolygonsWorld,\n template.styles ?? {},\n dataWithViewport,\n warnings\n );\n parts.push(...labelParts);\n }\n\n if (qrElements.length) {\n const qrParts = await renderQrElements(\n qrElements,\n viewports,\n viewportScales,\n models,\n { qrContext: options?.qrContext },\n dataWithViewport,\n warnings\n );\n parts.push(...qrParts);\n }\n\n parts.push('</svg>');\n\n return { svg: parts.join(''), viewportScales, warnings };\n}\n\n// Register renderLayout with renderDrawing to break the circular dependency.\n// This runs at module evaluation time — safe because renderLayout is defined above.\nimport { setRenderLayoutBinding as _setBinding } from './renderDrawing';\n_setBinding(renderLayout as any);\n"]}
|