@ifc-lite/viewer 1.29.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.turbo/turbo-build.log +32 -31
  2. package/CHANGELOG.md +58 -0
  3. package/dist/assets/{basketViewActivator-BSRgF1Hw.js → basketViewActivator-BHNb23Vw.js} +6 -6
  4. package/dist/assets/{bcf-3uE1MvcT.js → bcf-C0XZ2DSl.js} +1 -1
  5. package/dist/assets/{deflate-BLlUfw9-.js → deflate-DvvFcUtV.js} +1 -1
  6. package/dist/assets/{exporters-BL6UmxRa.js → exporters-CvORJOLn.js} +1345 -1434
  7. package/dist/assets/geometry.worker-B7X9DQQY.js +1 -0
  8. package/dist/assets/{geotiff-BydcIud8.js → geotiff-fSD_sVw_.js} +10 -10
  9. package/dist/assets/{ids-DFl74rTt.js → ids-BUOe5QQl.js} +951 -713
  10. package/dist/assets/idsValidation.worker-DEodXb0f.js +190468 -0
  11. package/dist/assets/ifc-lite_bg-CmMuB1zf.wasm +0 -0
  12. package/dist/assets/{index-BNTlm2lP.js → index-B6T42T86.js} +35235 -32937
  13. package/dist/assets/index-D0tqJL0X.css +1 -0
  14. package/dist/assets/{index.es-Bk4nLsyS.js → index.es-YGMensDM.js} +7 -7
  15. package/dist/assets/{jpeg-BvMO8-Tc.js → jpeg-0Sla88_N.js} +1 -1
  16. package/dist/assets/{jspdf.es.min-BZ_ed66E.js → jspdf.es.min-mnbLNj-p.js} +4 -4
  17. package/dist/assets/{lerc-CNnDpLpV.js → lerc-C7xUDHpL.js} +1 -1
  18. package/dist/assets/{lzw-DBaPrGGZ.js → lzw-CK480t0_.js} +1 -1
  19. package/dist/assets/{native-bridge-DFOoBvTg.js → native-bridge-sLWRanza.js} +1 -1
  20. package/dist/assets/{packbits-C7uyD2Bi.js → packbits-DcL4imYS.js} +1 -1
  21. package/dist/assets/parser.worker-BsGV6ml7.js +182 -0
  22. package/dist/assets/{pdf-DlqdjX9e.js → pdf-BARGfLmx.js} +8 -8
  23. package/dist/assets/raw-BMWh6mDy.js +1 -0
  24. package/dist/assets/{sandbox-0Z2NzeOJ.js → sandbox-BSiO04m8.js} +2801 -2609
  25. package/dist/assets/server-client-AlpWMVq9.js +741 -0
  26. package/dist/assets/{webimage-zN-oCabb.js → webimage-uy5DjZLk.js} +1 -1
  27. package/dist/assets/{xlsx-N2LbIR1G.js → xlsx-D02ho69_.js} +6 -6
  28. package/dist/assets/{zstd-Jk3QKIeb.js → zstd-DcR1TBwT.js} +1 -1
  29. package/dist/index.html +7 -7
  30. package/package.json +27 -32
  31. package/src/components/viewer/CesiumOverlay.tsx +195 -8
  32. package/src/components/viewer/IDSPanel.tsx +23 -7
  33. package/src/components/viewer/MainToolbar.tsx +31 -0
  34. package/src/components/viewer/SunSkyPanel.tsx +363 -0
  35. package/src/components/viewer/Viewport.tsx +49 -1
  36. package/src/components/viewer/ViewportContainer.tsx +20 -1
  37. package/src/components/viewer/useAnimationLoop.ts +19 -1
  38. package/src/disable-react-dev-perf-track.ts +38 -0
  39. package/src/hooks/has-entity-type.ts +33 -0
  40. package/src/hooks/ids/idsWorkerClient.ts +136 -0
  41. package/src/hooks/ingest/federationAlign.ts +1 -1
  42. package/src/hooks/ingest/pointCloudIngest.ts +22 -98
  43. package/src/hooks/ingest/viewerModelIngest.ts +8 -13
  44. package/src/hooks/useAlignmentLines3D.ts +5 -0
  45. package/src/hooks/useGridLines3D.ts +4 -0
  46. package/src/hooks/useIDS.ts +77 -13
  47. package/src/hooks/useIfcCache.ts +1 -1
  48. package/src/hooks/useIfcFederation.ts +1 -1
  49. package/src/hooks/useIfcServer.ts +1 -1
  50. package/src/hooks/useModelSelection.ts +1 -1
  51. package/src/hooks/useSolarEnvironment.ts +114 -0
  52. package/src/hooks/useSolarSweep.ts +66 -0
  53. package/src/hooks/useSymbolicAnnotations.ts +10 -0
  54. package/src/hooks/useViewerSelectors.ts +1 -1
  55. package/src/lib/geo/cesium-sun.ts +277 -0
  56. package/src/lib/geo/solar-direction.test.ts +70 -0
  57. package/src/lib/geo/solar-direction.ts +94 -0
  58. package/src/lib/lighting-presets.ts +128 -0
  59. package/src/lib/recent-files.ts +4 -24
  60. package/src/lib/solar-time.ts +55 -0
  61. package/src/main.tsx +5 -0
  62. package/src/store/index.ts +8 -0
  63. package/src/store/slices/annotationsSlice.test.ts +0 -16
  64. package/src/store/slices/cesiumSlice.ts +3 -3
  65. package/src/store/slices/dataSlice.test.ts +0 -40
  66. package/src/store/slices/environmentSlice.ts +101 -0
  67. package/src/store/slices/idsSlice.ts +6 -1
  68. package/src/store/slices/selectionSlice.test.ts +0 -43
  69. package/src/store/slices/solarSlice.ts +121 -0
  70. package/src/store/slices/visibilitySlice.test.ts +15 -45
  71. package/src/utils/loadingUtils.ts +1 -1
  72. package/src/workers/idsValidation.worker.ts +98 -0
  73. package/dist/assets/geometry.worker-DVwFYHTq.js +0 -1
  74. package/dist/assets/ifc-lite_bg-FPffpFK_.wasm +0 -0
  75. package/dist/assets/index-DpoJvkdg.css +0 -1
  76. package/dist/assets/parser.worker-U_PVhLNi.js +0 -182
  77. package/dist/assets/raw-p_2cfl6T.js +0 -1
  78. package/dist/assets/server-client-DUMy2mXg.js +0 -719
  79. package/src/components/ui/context-menu.tsx +0 -174
  80. package/src/store.ts +0 -80
@@ -1,5 +1,5 @@
1
1
 
2
- > @ifc-lite/viewer@1.29.0 build /home/runner/work/ifc-lite/ifc-lite/apps/viewer
2
+ > @ifc-lite/viewer@1.30.0 build /home/runner/work/ifc-lite/ifc-lite/apps/viewer
3
3
  > vite build
4
4
 
5
5
  vite v7.3.5 building client environment for production...
@@ -8,6 +8,7 @@ transforming...
8
8
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/types.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
9
9
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/types.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
10
10
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/credential-chain.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
11
+ [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/identity-token.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
11
12
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
12
13
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
13
14
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
@@ -16,14 +17,13 @@ transforming...
16
17
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
17
18
  [plugin vite:resolve] Module "node:path" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/core/credentials.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
18
19
  [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/user-oauth.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
19
- [plugin vite:resolve] Module "node:fs" has been externalized for browser compatibility, imported by "/home/runner/work/ifc-lite/ifc-lite/node_modules/.pnpm/@anthropic-ai+sdk@0.96.0_zod@4.4.3/node_modules/@anthropic-ai/sdk/lib/credentials/identity-token.mjs". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
20
- ✓ 5300 modules transformed.
20
+ ✓ 5322 modules transformed.
21
21
  rendering chunks...
22
22
  [plugin vite:reporter]
23
23
  (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/lib/clash/persistence.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/extensions/host.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/FlavorDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ClashSettingsDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/slices/clashSlice.ts, dynamic import will not move module into another chunk.
24
24
  
25
25
  [plugin vite:reporter]
26
- (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/extensions/host.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/extensions/host.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionDockHost.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionToolbarSlot.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionsPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/FlavorDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/IdeasPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/PrivacyPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/RepairQueuePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/AddElementPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BCFPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BasepointOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BasketPresentationDock.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BulkPropertyEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumPlacementEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ChatPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ClashSettingsDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CommandPalette.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ComparePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DataConnector.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DeviationPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DrawingSettingsPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/EntityContextMenu.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportChangesButton.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GLBExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GeometryEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/HierarchyPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/HoverTooltip.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/LensPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MainToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MergeLayersBanner.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MobileToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PointCloudClasses.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PointCloudPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PropertiesPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PropertyEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ScriptPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchInline.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.filter.builder.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.filter.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.text.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/Section2DPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SheetSetupPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/StatusBar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ThemeSwitch.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/TitleBlockEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ToolOverlays.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewerLayout.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/Viewport.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportContainer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportOverlays.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/annotations/AnnotationLayer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/bcf/BCFOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ExecutableCodeBlock.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ModelSelector.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/hierarchy/treeDataBuilder.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/hierarchy/useHierarchyTree.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/lists/ListPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/lists/ListResultsTable.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/BsddCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/FederationAlignmentControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/GeoreferencingPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/RawStepCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/RawStepRow.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/TaskEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/AnimationSettingsPopover.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttTimeline.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GenerateScheduleDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/schedule-utils.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useConstructionSequence.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useGanttBarDrag.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useGanttSelection3DHighlight.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useOverlayCompositor.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/selectionHandlers.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/AddElementOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/GizmoOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/MeasurePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionCapControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionVisualization.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SpaceSketchOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitNumericInput.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/WallEndpointOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useDuplicateShortcut.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useMouseControls.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/usePointCloudLifecycle.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/usePointCloudSync.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useRenderUpdates.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/ingest/federationAlign.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useActionLogger.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useAlignmentLines3D.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useBCF.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useClash.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useCompare.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useCompareOverlay.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useConstructionUnderlay.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useDrawingGeneration.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useFloorplanView.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useForkExtension.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useGridLines3D.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIDS.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfc.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcCache.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcFederation.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcServer.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useKeyboardShortcuts.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLens.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLensDiscovery.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLevelDisplayEffect.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useModelSelection.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSearchIndex.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSymbolicAnnotations.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useViewerSelectors.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/lib/llm/context-builder.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-export.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/loadingUtils.ts, dynamic import will not move module into another chunk.
26
+ (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/index.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/extensions/host.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/extensions/host.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionDockHost.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionToolbarSlot.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/ExtensionsPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/FlavorDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/IdeasPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/PrivacyPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/extensions/RepairQueuePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/AddElementPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BCFPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BasepointOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BasketPresentationDock.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/BulkPropertyEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CesiumPlacementEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ChatPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ClashSettingsDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/CommandPalette.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ComparePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DataConnector.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DeviationPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/DrawingSettingsPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/EntityContextMenu.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportChangesButton.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GLBExportDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/GeometryEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/HierarchyPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/HoverTooltip.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/LensPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MainToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MergeLayersBanner.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/MobileToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PointCloudClasses.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PointCloudPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PropertiesPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/PropertyEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ScriptPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchInline.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.filter.builder.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.filter.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.text.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SearchModal.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/Section2DPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SheetSetupPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/StatusBar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/SunSkyPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ThemeSwitch.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/TitleBlockEditor.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ToolOverlays.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewerLayout.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/Viewport.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportContainer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/ViewportOverlays.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/annotations/AnnotationLayer.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/bcf/BCFOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ExecutableCodeBlock.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/chat/ModelSelector.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/hierarchy/treeDataBuilder.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/hierarchy/useHierarchyTree.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/lists/ListPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/lists/ListResultsTable.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/BsddCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/FederationAlignmentControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/GeoreferencingPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/RawStepCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/RawStepRow.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/properties/TaskEditCard.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/AnimationSettingsPopover.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttTimeline.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GanttToolbar.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/GenerateScheduleDialog.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/schedule-utils.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useConstructionSequence.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useGanttBarDrag.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useGanttSelection3DHighlight.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/schedule/useOverlayCompositor.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/selectionHandlers.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/AddElementOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/GizmoOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/MeasurePanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionCapControls.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionPanel.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SectionVisualization.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SpaceSketchOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitNumericInput.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/SplitOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/tools/WallEndpointOverlay.tsx, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useDuplicateShortcut.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useMouseControls.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/usePointCloudLifecycle.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/usePointCloudSync.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/components/viewer/useRenderUpdates.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/ingest/federationAlign.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useActionLogger.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useAlignmentLines3D.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useBCF.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useClash.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useCompare.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useCompareOverlay.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useConstructionUnderlay.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useDrawingGeneration.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useFloorplanView.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useForkExtension.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useGridLines3D.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIDS.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfc.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcCache.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcFederation.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcServer.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useKeyboardShortcuts.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLens.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLensDiscovery.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useLevelDisplayEffect.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useModelSelection.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSandbox.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSearchIndex.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSolarEnvironment.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSolarSweep.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useSymbolicAnnotations.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useViewerSelectors.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/lib/llm/context-builder.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/sdk/useBimHost.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/services/desktop-export.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/basket/basketCommands.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/basket/basketViewActivator.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/basketSave.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/basketVisibleSet.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/homeView.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/store/resolveEntityRef.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/loadingUtils.ts, dynamic import will not move module into another chunk.
27
27
  
28
28
  [plugin vite:reporter]
29
29
  (!) /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/ifcConfig.ts is dynamically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/utils/acquireFileBuffer.ts but also statically imported by /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcLoader.ts, /home/runner/work/ifc-lite/ifc-lite/apps/viewer/src/hooks/useIfcServer.ts, dynamic import will not move module into another chunk.
@@ -39,71 +39,72 @@ computing gzip size...
39
39
  dist/assets/laz-perf-DgUOSLeU.js  0.06 kB
40
40
  dist/assets/las-source-C_IGrgRq.js  2.40 kB
41
41
  dist/assets/las-BW6LIc_j.js  3.08 kB
42
- dist/index.html  3.65 kB │ gzip: 1.23 kB
42
+ dist/index.html  3.65 kB │ gzip: 1.24 kB
43
43
  dist/assets/ascii-points-source-bTjLVmUX.js  3.98 kB
44
44
  dist/assets/decode-worker-Cjign7Zh.js  5.03 kB
45
45
  dist/assets/laz-source-BWjza0Iw.js  5.35 kB
46
46
  dist/assets/ply-source-C8jjyzxE.js  6.77 kB
47
47
  dist/assets/pcd-source-Ck0UnVDn.js  7.31 kB
48
48
  dist/assets/e57-source-2wI9jkCA.js  13.59 kB
49
- dist/assets/geometry.worker-DVwFYHTq.js  36.42 kB
49
+ dist/assets/geometry.worker-B7X9DQQY.js  33.09 kB
50
50
  dist/assets/index-DMho-JA0.js  53.15 kB
51
51
  dist/assets/laz-perf-CFJp03W6.wasm  214.35 kB │ gzip: 73.76 kB
52
52
  dist/assets/emscripten-module-uFzwHH0Y.wasm  503.13 kB │ gzip: 234.04 kB
53
53
  dist/assets/emscripten-module-B1g2L2eS.wasm  1,027.52 kB │ gzip: 364.87 kB
54
54
  dist/assets/emscripten-module-ZrHFMo7O.wasm  1,218.63 kB │ gzip: 456.85 kB
55
55
  dist/assets/emscripten-module-DHbYPfAp.wasm  1,510.75 kB │ gzip: 497.65 kB
56
- dist/assets/parser.worker-U_PVhLNi.js  1,599.65 kB
57
- dist/assets/ifc-lite_bg-FPffpFK_.wasm  2,069.66 kB │ gzip: 764.52 kB
56
+ dist/assets/parser.worker-BsGV6ml7.js  1,596.62 kB
57
+ dist/assets/ifc-lite_bg-CmMuB1zf.wasm  2,395.16 kB │ gzip: 840.56 kB
58
58
  dist/assets/arrow2_bg-4Y7xYo54.wasm  5,000.39 kB │ gzip: 1,544.22 kB
59
+ dist/assets/idsValidation.worker-DEodXb0f.js  6,121.41 kB
59
60
  dist/assets/parquet_wasm_bg-DcKVfvto.wasm  6,626.29 kB │ gzip: 1,944.12 kB
60
61
  dist/assets/esbuild-CzsZLPr0.wasm 13,918.74 kB │ gzip: 3,765.48 kB
61
62
  dist/assets/cesium-ADbP7waU.css  24.30 kB │ gzip: 5.49 kB
62
- dist/assets/index-DpoJvkdg.css  260.52 kB │ gzip: 37.68 kB
63
+ dist/assets/index-D0tqJL0X.css  260.79 kB │ gzip: 37.71 kB
63
64
  dist/assets/__vite-browser-external-B1O5LaIO.js  0.03 kB │ gzip: 0.05 kB
64
65
  dist/assets/inline-worker-BpBzlmd6.js  0.05 kB │ gzip: 0.07 kB
65
66
  dist/assets/esbuild-FgU11_Eg.js  0.06 kB │ gzip: 0.08 kB
66
- dist/assets/raw-p_2cfl6T.js  0.21 kB │ gzip: 0.18 kB
67
- dist/assets/deflate-BLlUfw9-.js  0.28 kB │ gzip: 0.22 kB
68
- dist/assets/packbits-C7uyD2Bi.js  0.45 kB │ gzip: 0.32 kB
69
- dist/assets/webimage-zN-oCabb.js  1.06 kB │ gzip: 0.60 kB
70
- dist/assets/lzw-DBaPrGGZ.js  1.60 kB │ gzip: 0.91 kB
71
- dist/assets/basketViewActivator-BSRgF1Hw.js  2.28 kB │ gzip: 0.79 kB
67
+ dist/assets/raw-BMWh6mDy.js  0.21 kB │ gzip: 0.18 kB
68
+ dist/assets/deflate-DvvFcUtV.js  0.28 kB │ gzip: 0.22 kB
69
+ dist/assets/packbits-DcL4imYS.js  0.45 kB │ gzip: 0.32 kB
70
+ dist/assets/webimage-uy5DjZLk.js  1.06 kB │ gzip: 0.60 kB
71
+ dist/assets/lzw-CK480t0_.js  1.60 kB │ gzip: 0.91 kB
72
+ dist/assets/basketViewActivator-BHNb23Vw.js  2.28 kB │ gzip: 0.79 kB
72
73
  dist/assets/ifc-cache-BAN4vcd4.js  2.77 kB │ gzip: 0.94 kB
73
- dist/assets/xlsx-N2LbIR1G.js  4.58 kB │ gzip: 1.57 kB
74
- dist/assets/pdf-DlqdjX9e.js  4.87 kB │ gzip: 1.56 kB
74
+ dist/assets/xlsx-D02ho69_.js  4.58 kB │ gzip: 1.57 kB
75
+ dist/assets/pdf-BARGfLmx.js  4.87 kB │ gzip: 1.57 kB
75
76
  dist/assets/ffi-Boa1QuFa.js  6.32 kB │ gzip: 1.00 kB
76
77
  dist/assets/emscripten-module.browser-BLJD5hhE.js  9.16 kB │ gzip: 4.19 kB
77
78
  dist/assets/lens-DMnqMXpz.js  9.47 kB │ gzip: 2.93 kB
78
- dist/assets/jpeg-BvMO8-Tc.js  11.28 kB │ gzip: 4.27 kB
79
- dist/assets/native-bridge-DFOoBvTg.js  18.73 kB │ gzip: 3.78 kB
79
+ dist/assets/jpeg-0Sla88_N.js  11.28 kB │ gzip: 4.27 kB
80
+ dist/assets/native-bridge-sLWRanza.js  18.73 kB │ gzip: 3.78 kB
80
81
  dist/assets/pako.esm-n3Pgozwg.js  21.62 kB │ gzip: 7.66 kB
81
82
  dist/assets/parquet-CEXmQNRO.js  29.67 kB │ gzip: 6.89 kB
82
83
  dist/assets/jspdf.plugin.autotable-BBLUVd7n.js  30.93 kB │ gzip: 9.87 kB
83
- dist/assets/server-client-DUMy2mXg.js  37.45 kB │ gzip: 8.22 kB
84
- dist/assets/bcf-3uE1MvcT.js  38.32 kB │ gzip: 11.57 kB
84
+ dist/assets/bcf-C0XZ2DSl.js  38.32 kB │ gzip: 11.57 kB
85
+ dist/assets/server-client-AlpWMVq9.js  38.42 kB │ gzip: 8.45 kB
85
86
  dist/assets/browser-BIoDDfBW.js  70.26 kB │ gzip: 19.95 kB
86
87
  dist/assets/drawing-2d-CLn7Mtj8.js  74.37 kB │ gzip: 21.87 kB
87
- dist/assets/zstd-Jk3QKIeb.js  81.19 kB │ gzip: 32.35 kB
88
+ dist/assets/zstd-DcR1TBwT.js  81.19 kB │ gzip: 32.35 kB
88
89
  dist/assets/zip-DFgP-l20.js  96.96 kB │ gzip: 29.94 kB
89
- dist/assets/lerc-CNnDpLpV.js  97.20 kB │ gzip: 37.62 kB
90
- dist/assets/ids-DFl74rTt.js  164.30 kB │ gzip: 29.27 kB
90
+ dist/assets/lerc-C7xUDHpL.js  97.20 kB │ gzip: 37.62 kB
91
+ dist/assets/ids-BUOe5QQl.js  173.69 kB │ gzip: 31.42 kB
91
92
  dist/assets/html2canvas.esm-Ge7aVWlp.js  201.40 kB │ gzip: 47.48 kB
93
+ dist/assets/exporters-CvORJOLn.js  207.73 kB │ gzip: 37.73 kB
92
94
  dist/assets/arrow-fie-E7fe.js  208.86 kB │ gzip: 50.09 kB
93
- dist/assets/exporters-BL6UmxRa.js  211.01 kB │ gzip: 38.57 kB
94
- dist/assets/index.es-Bk4nLsyS.js  274.42 kB │ gzip: 62.78 kB
95
- dist/assets/geotiff-BydcIud8.js  366.67 kB │ gzip: 118.40 kB
95
+ dist/assets/index.es-YGMensDM.js  274.42 kB │ gzip: 62.78 kB
96
+ dist/assets/geotiff-fSD_sVw_.js  366.67 kB │ gzip: 118.41 kB
96
97
  dist/assets/three-SQm7uqwa.js  534.00 kB │ gzip: 133.77 kB
97
- dist/assets/jspdf.es.min-BZ_ed66E.js  772.04 kB │ gzip: 137.94 kB
98
+ dist/assets/jspdf.es.min-mnbLNj-p.js  772.04 kB │ gzip: 137.94 kB
98
99
  dist/assets/exceljs.min-DsuzKYnj.js  938.77 kB │ gzip: 270.63 kB
99
100
  dist/assets/maplibre-gl-BF3Z0idw.js  1,053.34 kB │ gzip: 284.73 kB
100
101
  dist/assets/epsg-index.generated-BjJrt_0S.js  4,295.95 kB │ gzip: 440.44 kB
101
102
  dist/assets/cesium-DezSO2mp.js  4,810.95 kB │ gzip: 1,331.27 kB
102
- dist/assets/index-BNTlm2lP.js  7,786.04 kB │ gzip: 1,410.78 kB
103
- dist/assets/sandbox-0Z2NzeOJ.js  8,576.03 kB │ gzip: 532.33 kB
103
+ dist/assets/index-B6T42T86.js  7,888.12 kB │ gzip: 1,429.98 kB
104
+ dist/assets/sandbox-BSiO04m8.js  8,582.28 kB │ gzip: 533.19 kB
104
105
  
105
106
  (!) Some chunks are larger than 6000 kB after minification. Consider:
106
107
  - Using dynamic import() to code-split the application
107
108
  - Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
108
109
  - Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
109
- ✓ built in 1m 20s
110
+ ✓ built in 1m 26s
package/CHANGELOG.md CHANGED
@@ -1,5 +1,63 @@
1
1
  # @ifc-lite/viewer
2
2
 
3
+ ## 1.30.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1069](https://github.com/LTplus-AG/ifc-lite/pull/1069) [`49d146a`](https://github.com/LTplus-AG/ifc-lite/commit/49d146a653f65eb5e265347ed6a9e9e7a21589a4) Thanks [@louistrue](https://github.com/louistrue)! - Sky and lighting options for both rendering paths.
8
+
9
+ Renderer: the hardcoded shader lights move into a global lighting-environment
10
+ uniform (group(1)) — sun direction/colour/intensity, hemisphere ambient,
11
+ exposure — with defaults that render pixel-identical to the previous look,
12
+ plus a procedural sky pass (analytic gradient + sun disc, drawn at the
13
+ reverse-Z far plane, tonemapped with the same ACES curve as geometry).
14
+
15
+ Viewer: one collapsible, mode-aware Sun & Sky panel. Standalone it offers
16
+ lighting presets (Default, Day, Overcast, Evening, Night), a Sky toggle and
17
+ an exposure trim; in the Cesium world context the model is lit by the sun
18
+ and atmosphere, so the panel swaps presets for the Sky/atmosphere toggle and
19
+ the sun-path study. The study now also lights the model directly: the NOAA
20
+ sun position at the site is mapped into viewer space (inverse of the Cesium
21
+ bridge's ENU frame) with golden-hour/twilight/night photometric fades, so
22
+ daylight studies read identically with and without the 3D world context.
23
+
24
+ Cesium: OSM Buildings mode keeps the globe with the satellite base map —
25
+ buildings sit on top of the imagery instead of replacing it, and the globe
26
+ receives the buildings' and model's cast shadows during a sun study.
27
+
28
+ ### Patch Changes
29
+
30
+ - [#1076](https://github.com/LTplus-AG/ifc-lite/pull/1076) [`da1999f`](https://github.com/LTplus-AG/ifc-lite/commit/da1999fc6e482fa3d668b9aa98a840d2bb838112) Thanks [@louistrue](https://github.com/louistrue)! - Add `createSyntheticDataStore()` — a typed factory for building a fully-typed
31
+ `IfcDataStore` for synthetic / non-STEP models (GLB meshes, point-cloud scans).
32
+ It assembles real `@ifc-lite/data` tables (empty, or a single synthetic entity
33
+ row) and wires the lazy `getEntity` / `getEntitiesByType` / `getProperties` /
34
+ `getQuantities` accessors through `attachDataStoreAccessors`, the same single
35
+ source of truth the columnar parse / worker transport / cache restore use.
36
+
37
+ The viewer's GLB (`createMinimalGlbDataStore`) and LAS/LAZ point-cloud
38
+ (`emptyDataStore`) ingest paths now build their synthetic stores through this
39
+ factory instead of whole-object `as unknown as IfcDataStore` casts. Those casts
40
+ silently dropped the `IfcStoreBase` accessors, so a future required
41
+ `IfcDataStore` member stayed green at the cast site and threw
42
+ `TypeError: store.getProperties is not a function` at runtime on the
43
+ GLB / point-cloud ingest flow (same crash class as [#950](https://github.com/LTplus-AG/ifc-lite/issues/950)). The contract is now
44
+ compiler-enforced for these synthetic stores.
45
+
46
+ - Updated dependencies [[`891efef`](https://github.com/LTplus-AG/ifc-lite/commit/891efef5fa9fca04bf2e01be9a1de04bbb84aafe), [`891efef`](https://github.com/LTplus-AG/ifc-lite/commit/891efef5fa9fca04bf2e01be9a1de04bbb84aafe), [`891efef`](https://github.com/LTplus-AG/ifc-lite/commit/891efef5fa9fca04bf2e01be9a1de04bbb84aafe), [`891efef`](https://github.com/LTplus-AG/ifc-lite/commit/891efef5fa9fca04bf2e01be9a1de04bbb84aafe), [`891efef`](https://github.com/LTplus-AG/ifc-lite/commit/891efef5fa9fca04bf2e01be9a1de04bbb84aafe), [`49d146a`](https://github.com/LTplus-AG/ifc-lite/commit/49d146a653f65eb5e265347ed6a9e9e7a21589a4), [`49d146a`](https://github.com/LTplus-AG/ifc-lite/commit/49d146a653f65eb5e265347ed6a9e9e7a21589a4), [`da1999f`](https://github.com/LTplus-AG/ifc-lite/commit/da1999fc6e482fa3d668b9aa98a840d2bb838112)]:
47
+ - @ifc-lite/create@1.16.2
48
+ - @ifc-lite/export@1.19.6
49
+ - @ifc-lite/parser@3.2.0
50
+ - @ifc-lite/geometry@2.6.1
51
+ - @ifc-lite/server-client@1.17.0
52
+ - @ifc-lite/clash@1.1.3
53
+ - @ifc-lite/sdk@1.18.3
54
+ - @ifc-lite/renderer@1.27.0
55
+ - @ifc-lite/mcp@0.3.3
56
+ - @ifc-lite/data@2.0.3
57
+ - @ifc-lite/solar@1.15.0
58
+ - @ifc-lite/ids@1.15.10
59
+ - @ifc-lite/lists@1.15.3
60
+
3
61
  ## 1.29.0
4
62
 
5
63
  ### Minor Changes
@@ -1,13 +1,13 @@
1
- import { u as o, __tla as __tla_0 } from "./index-BNTlm2lP.js";
1
+ import { u as o, __tla as __tla_0 } from "./index-B6T42T86.js";
2
2
  import "./zip-DFgP-l20.js";
3
3
  import "./arrow-fie-E7fe.js";
4
- import { __tla as __tla_1 } from "./sandbox-0Z2NzeOJ.js";
4
+ import { __tla as __tla_1 } from "./sandbox-BSiO04m8.js";
5
5
  import "./lens-DMnqMXpz.js";
6
6
  import "./drawing-2d-CLn7Mtj8.js";
7
- import "./bcf-3uE1MvcT.js";
8
- import { __tla as __tla_2 } from "./exporters-BL6UmxRa.js";
9
- import { __tla as __tla_3 } from "./server-client-DUMy2mXg.js";
10
- import { __tla as __tla_4 } from "./ids-DFl74rTt.js";
7
+ import "./bcf-C0XZ2DSl.js";
8
+ import { __tla as __tla_2 } from "./exporters-CvORJOLn.js";
9
+ import { __tla as __tla_3 } from "./server-client-AlpWMVq9.js";
10
+ import { __tla as __tla_4 } from "./ids-BUOe5QQl.js";
11
11
  import "./three-SQm7uqwa.js";
12
12
  let v;
13
13
  let __tla = Promise.all([
@@ -1,4 +1,4 @@
1
- import{J as X}from"./zip-DFgP-l20.js";import{g as C}from"./sandbox-0Z2NzeOJ.js";async function ee(t){const e=await X.loadAsync(t),i=await tt(e),{projectId:o,name:n,extensions:s}=await et(e),a=await it(e);return{version:i.versionId,projectId:o,name:n,topics:a,extensions:s}}async function tt(t){const e=t.file("bcf.version");if(!e)throw new Error("Invalid BCF file: missing bcf.version");const o=(await e.async("string")).match(/VersionId="([^"]+)"/);if(!o)throw new Error("Invalid BCF version file: could not parse VersionId");const n=o[1];return n!=="2.1"&&n!=="3.0"&&console.warn(`Unsupported BCF version: ${n}, treating as 2.1`),{versionId:n==="3.0"?"3.0":"2.1",detailedVersion:o[1]}}async function et(t){const e=t.file("project.bcfp");if(!e)return{};const i=await e.async("string"),o=i.match(/ProjectId="([^"]+)"/),n=i.match(/<Name>([^<]+)<\/Name>/);return{projectId:o?.[1],name:n?.[1]}}async function it(t){const e=new Map,i=new Set;t.forEach(o=>{const n=o.match(/^([^/]+)\/markup\.bcf$/i);n&&i.add(n[1])});for(const o of i)try{const n=await ot(t,o);n&&e.set(n.guid,n)}catch(n){console.warn(`Failed to parse topic ${o}:`,n)}return e}async function ot(t,e){const i=t.file(`${e}/markup.bcf`);if(!i)return null;const o=await i.async("string"),n=o.match(/<Topic\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Topic>/);if(!n)return console.warn(`Invalid markup.bcf in ${e}: missing Topic element`),null;const s=n[1],a=n[2],r=o.match(/<Topic[^>]*TopicType="([^"]+)"/),c=o.match(/<Topic[^>]*TopicStatus="([^"]+)"/),l=g(a,"Title")||"Untitled",p=g(a,"Description"),f=g(a,"Priority"),m=g(a,"Index"),u=g(a,"CreationDate")||new Date().toISOString(),y=g(a,"CreationAuthor")||"Unknown",d=g(a,"ModifiedDate"),x=g(a,"ModifiedAuthor"),w=g(a,"DueDate"),b=g(a,"AssignedTo"),v=g(a,"Stage"),T=[],H=a.matchAll(/<Labels>([^<]+)<\/Labels>/g);for(const A of H)T.push(A[1]);const W=nt(a),O=st(a),I=[],J=a.matchAll(/<RelatedTopic\s+Guid="([^"]+)"/g);for(const A of J)I.push(A[1]);const K=at(o),Q=await ct(t,e,o);return{guid:s,title:l,description:p,topicType:r?.[1],topicStatus:c?.[1],priority:f,index:m?parseInt(m,10):void 0,creationDate:u,creationAuthor:y,modifiedDate:d,modifiedAuthor:x,dueDate:w,assignedTo:b,stage:v,labels:T.length>0?T:void 0,bimSnippet:W,documentReferences:O.length>0?O:void 0,relatedTopics:I.length>0?I:void 0,comments:K,viewpoints:Q}}function g(t,e){return t.match(new RegExp(`<${e}>([^<]*)<\\/${e}>`))?.[1]}function nt(t){const e=t.match(/<BimSnippet\s+SnippetType="([^"]+)"[^>]*>([\s\S]*?)<\/BimSnippet>/);if(!e)return;const i=e[0].match(/isExternal="([^"]+)"/),o=g(e[2],"Reference"),n=g(e[2],"ReferenceSchema");return{snippetType:e[1],isExternal:i?.[1]==="true",reference:o||"",referenceSchema:n}}function st(t){const e=[],i=t.matchAll(/<DocumentReference[^>]*>([\s\S]*?)<\/DocumentReference>/g);for(const o of i){const n=o[0].match(/Guid="([^"]+)"/),s=o[0].match(/isExternal="([^"]+)"/),a=g(o[1],"ReferencedDocument"),r=g(o[1],"Description");a&&e.push({guid:n?.[1],isExternal:s?.[1]==="true",referencedDocument:a,description:r})}return e}function at(t){const e=[],i=t.matchAll(/<Comment\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Comment>/g);for(const o of i){const n=o[1],s=o[2],a=g(s,"Date")||new Date().toISOString(),r=g(s,"Author")||"Unknown",c=g(s,"Comment")||"",l=g(s,"ModifiedDate"),p=g(s,"ModifiedAuthor"),f=s.match(/<Viewpoint\s+Guid="([^"]+)"/);e.push({guid:n,date:a,author:r,comment:c,viewpointGuid:f?.[1],modifiedDate:l,modifiedAuthor:p})}return e}async function ct(t,e,i){const o=[],n=new Map,s=/<Viewpoint\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Viewpoint>/g;for(const c of i.matchAll(s)){const l=c[1],p=c[2],f=p.match(/<Viewpoint>([^<]+)<\/Viewpoint>/),m=p.match(/<Snapshot>([^<]+)<\/Snapshot>/);n.set(l,{viewpointFile:f?.[1],snapshotFile:m?.[1]})}const a=i.matchAll(/<Viewpoint\s+Guid="([^"]+)"[^>]*\/>/g);for(const c of a)n.has(c[1])||n.set(c[1],{});const r=[];t.forEach(c=>{c.startsWith(`${e}/`)&&c.endsWith(".bcfv")&&r.push(c)});for(const c of r)try{const l=t.file(c);if(!l)continue;const p=await l.async("string"),f=rt(p);if(f){const m=n.get(f.guid);let u=null,y="png";if(m?.snapshotFile){const d=`${e}/${m.snapshotFile}`;u=t.file(d),(m.snapshotFile.toLowerCase().endsWith(".jpg")||m.snapshotFile.toLowerCase().endsWith(".jpeg"))&&(y="jpeg")}if(!u){const d=c.replace(".bcfv",""),x=d.replace(/Viewpoint_/i,"Snapshot_"),w=d.replace(/_viewpoint$/i,"_snapshot"),b=[`${x}.png`,`${w}.png`,`${d}.png`,`${e}/snapshot.png`,`${x}.jpg`,`${w}.jpg`,`${d}.jpg`,`${e}/snapshot.jpg`];for(const v of b)if(u=t.file(v),u){(v.toLowerCase().endsWith(".jpg")||v.toLowerCase().endsWith(".jpeg"))&&(y="jpeg");break}}if(u){const d=await u.async("uint8array");f.snapshotData=d,f.snapshot=`data:image/${y};base64,${j(d)}`}o.push(f)}}catch(l){console.warn(`Failed to parse viewpoint ${c}:`,l)}if(o.length===0){const c=t.file(`${e}/snapshot.png`)||t.file(`${e}/snapshot.jpg`);if(c){const l=c.name.toLowerCase().endsWith(".jpg"),p=await c.async("uint8array");o.push({guid:e,snapshot:`data:image/${l?"jpeg":"png"};base64,${j(p)}`,snapshotData:p})}}return o}function rt(t){const i=t.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/)?.[1]||crypto.randomUUID?.()||`vp-${Date.now()}`,o=lt(t),n=pt(t),s=ft(t),a=dt(t),r=ht(t),c=gt(t);return{guid:i,perspectiveCamera:o,orthogonalCamera:n,components:s,lines:a.length>0?a:void 0,clippingPlanes:r.length>0?r:void 0,bitmaps:c.length>0?c:void 0}}function lt(t){const e=t.match(/<PerspectiveCamera>([\s\S]*?)<\/PerspectiveCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=M(i,"CameraDirection"),s=M(i,"CameraUpVector"),a=g(i,"FieldOfView");if(!(!o||!n||!s||!a))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,fieldOfView:parseFloat(a)}}function pt(t){const e=t.match(/<OrthogonalCamera>([\s\S]*?)<\/OrthogonalCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=M(i,"CameraDirection"),s=M(i,"CameraUpVector"),a=g(i,"ViewToWorldScale");if(!(!o||!n||!s||!a))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,viewToWorldScale:parseFloat(a)}}function V(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=g(i[1],"X"),n=g(i[1],"Y"),s=g(i[1],"Z");if(!(o===void 0||n===void 0||s===void 0))return{x:parseFloat(o),y:parseFloat(n),z:parseFloat(s)}}function M(t,e){return V(t,e)}function ft(t){const e=t.match(/<Components>([\s\S]*?)<\/Components>/);if(!e)return;const i=e[1],o=B(i,"Selection"),n=ut(i),s=mt(i);if(!(!o&&!n&&!s))return{selection:o?.length?o:void 0,visibility:n,coloring:s?.length?s:void 0}}function B(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=[],n=i[1].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const s of n){const a=_(s[0]);a&&o.push(a)}return o.length>0?o:void 0}function _(t){const e=t.match(/IfcGuid="([^"]+)"/),i=t.match(/AuthoringToolId="([^"]+)"/),o=t.match(/OriginatingSystem="([^"]+)"/);if(!(!e&&!i))return{ifcGuid:e?.[1],authoringToolId:i?.[1],originatingSystem:o?.[1]}}function ut(t){const e=t.match(/<Visibility[^>]*>([\s\S]*?)<\/Visibility>/);if(!e)return;const o=t.match(/DefaultVisibility="([^"]+)"/)?.[1]!=="false",n=B(e[1],"Exceptions");return{defaultVisibility:o,exceptions:n}}function mt(t){const e=t.match(/<Coloring>([\s\S]*?)<\/Coloring>/);if(!e)return;const i=[],o=e[1].matchAll(/<Color\s+Color="([^"]+)"[^>]*>([\s\S]*?)<\/Color>/g);for(const n of o){const s=n[1],a=[],r=n[2].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const c of r){const l=_(c[0]);l&&a.push(l)}a.length>0&&i.push({color:s,components:a})}return i.length>0?i:void 0}function dt(t){const e=[],i=t.match(/<Lines>([\s\S]*?)<\/Lines>/);if(!i)return e;const o=i[1].matchAll(/<Line>([\s\S]*?)<\/Line>/g);for(const n of o){const s=V(n[1],"StartPoint"),a=V(n[1],"EndPoint");s&&a&&e.push({startPoint:s,endPoint:a})}return e}function ht(t){const e=[],i=t.match(/<ClippingPlanes>([\s\S]*?)<\/ClippingPlanes>/);if(!i)return e;const o=i[1].matchAll(/<ClippingPlane>([\s\S]*?)<\/ClippingPlane>/g);for(const n of o){const s=V(n[1],"Location"),a=M(n[1],"Direction");s&&a&&e.push({location:s,direction:a})}return e}function gt(t){const e=[],i=t.match(/<Bitmaps>([\s\S]*?)<\/Bitmaps>/);if(!i)return e;const o=i[1].matchAll(/<Bitmap>([\s\S]*?)<\/Bitmap>/g);for(const n of o){const s=g(n[1],"Format")||g(n[1],"Bitmap"),a=g(n[1],"Reference"),r=V(n[1],"Location"),c=M(n[1],"Normal"),l=M(n[1],"Up"),p=g(n[1],"Height");s&&a&&r&&c&&l&&p&&e.push({format:s.toUpperCase()==="JPG"?"JPG":"PNG",reference:a,location:r,normal:c,up:l,height:parseFloat(p)})}return e}function j(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return btoa(e)}async function ie(t){const e=new X;yt(e,t.version),(t.projectId||t.name)&&xt(e,t);for(const[i,o]of t.topics)await wt(e,o);return e.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}})}function yt(t,e){const i=`<?xml version="1.0" encoding="UTF-8"?>
1
+ import{J as X}from"./zip-DFgP-l20.js";import{g as C}from"./sandbox-BSiO04m8.js";async function ee(t){const e=await X.loadAsync(t),i=await tt(e),{projectId:o,name:n,extensions:s}=await et(e),a=await it(e);return{version:i.versionId,projectId:o,name:n,topics:a,extensions:s}}async function tt(t){const e=t.file("bcf.version");if(!e)throw new Error("Invalid BCF file: missing bcf.version");const o=(await e.async("string")).match(/VersionId="([^"]+)"/);if(!o)throw new Error("Invalid BCF version file: could not parse VersionId");const n=o[1];return n!=="2.1"&&n!=="3.0"&&console.warn(`Unsupported BCF version: ${n}, treating as 2.1`),{versionId:n==="3.0"?"3.0":"2.1",detailedVersion:o[1]}}async function et(t){const e=t.file("project.bcfp");if(!e)return{};const i=await e.async("string"),o=i.match(/ProjectId="([^"]+)"/),n=i.match(/<Name>([^<]+)<\/Name>/);return{projectId:o?.[1],name:n?.[1]}}async function it(t){const e=new Map,i=new Set;t.forEach(o=>{const n=o.match(/^([^/]+)\/markup\.bcf$/i);n&&i.add(n[1])});for(const o of i)try{const n=await ot(t,o);n&&e.set(n.guid,n)}catch(n){console.warn(`Failed to parse topic ${o}:`,n)}return e}async function ot(t,e){const i=t.file(`${e}/markup.bcf`);if(!i)return null;const o=await i.async("string"),n=o.match(/<Topic\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Topic>/);if(!n)return console.warn(`Invalid markup.bcf in ${e}: missing Topic element`),null;const s=n[1],a=n[2],r=o.match(/<Topic[^>]*TopicType="([^"]+)"/),c=o.match(/<Topic[^>]*TopicStatus="([^"]+)"/),l=g(a,"Title")||"Untitled",p=g(a,"Description"),f=g(a,"Priority"),m=g(a,"Index"),u=g(a,"CreationDate")||new Date().toISOString(),y=g(a,"CreationAuthor")||"Unknown",d=g(a,"ModifiedDate"),x=g(a,"ModifiedAuthor"),w=g(a,"DueDate"),b=g(a,"AssignedTo"),v=g(a,"Stage"),T=[],H=a.matchAll(/<Labels>([^<]+)<\/Labels>/g);for(const A of H)T.push(A[1]);const W=nt(a),O=st(a),I=[],J=a.matchAll(/<RelatedTopic\s+Guid="([^"]+)"/g);for(const A of J)I.push(A[1]);const K=at(o),Q=await ct(t,e,o);return{guid:s,title:l,description:p,topicType:r?.[1],topicStatus:c?.[1],priority:f,index:m?parseInt(m,10):void 0,creationDate:u,creationAuthor:y,modifiedDate:d,modifiedAuthor:x,dueDate:w,assignedTo:b,stage:v,labels:T.length>0?T:void 0,bimSnippet:W,documentReferences:O.length>0?O:void 0,relatedTopics:I.length>0?I:void 0,comments:K,viewpoints:Q}}function g(t,e){return t.match(new RegExp(`<${e}>([^<]*)<\\/${e}>`))?.[1]}function nt(t){const e=t.match(/<BimSnippet\s+SnippetType="([^"]+)"[^>]*>([\s\S]*?)<\/BimSnippet>/);if(!e)return;const i=e[0].match(/isExternal="([^"]+)"/),o=g(e[2],"Reference"),n=g(e[2],"ReferenceSchema");return{snippetType:e[1],isExternal:i?.[1]==="true",reference:o||"",referenceSchema:n}}function st(t){const e=[],i=t.matchAll(/<DocumentReference[^>]*>([\s\S]*?)<\/DocumentReference>/g);for(const o of i){const n=o[0].match(/Guid="([^"]+)"/),s=o[0].match(/isExternal="([^"]+)"/),a=g(o[1],"ReferencedDocument"),r=g(o[1],"Description");a&&e.push({guid:n?.[1],isExternal:s?.[1]==="true",referencedDocument:a,description:r})}return e}function at(t){const e=[],i=t.matchAll(/<Comment\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Comment>/g);for(const o of i){const n=o[1],s=o[2],a=g(s,"Date")||new Date().toISOString(),r=g(s,"Author")||"Unknown",c=g(s,"Comment")||"",l=g(s,"ModifiedDate"),p=g(s,"ModifiedAuthor"),f=s.match(/<Viewpoint\s+Guid="([^"]+)"/);e.push({guid:n,date:a,author:r,comment:c,viewpointGuid:f?.[1],modifiedDate:l,modifiedAuthor:p})}return e}async function ct(t,e,i){const o=[],n=new Map,s=/<Viewpoint\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Viewpoint>/g;for(const c of i.matchAll(s)){const l=c[1],p=c[2],f=p.match(/<Viewpoint>([^<]+)<\/Viewpoint>/),m=p.match(/<Snapshot>([^<]+)<\/Snapshot>/);n.set(l,{viewpointFile:f?.[1],snapshotFile:m?.[1]})}const a=i.matchAll(/<Viewpoint\s+Guid="([^"]+)"[^>]*\/>/g);for(const c of a)n.has(c[1])||n.set(c[1],{});const r=[];t.forEach(c=>{c.startsWith(`${e}/`)&&c.endsWith(".bcfv")&&r.push(c)});for(const c of r)try{const l=t.file(c);if(!l)continue;const p=await l.async("string"),f=rt(p);if(f){const m=n.get(f.guid);let u=null,y="png";if(m?.snapshotFile){const d=`${e}/${m.snapshotFile}`;u=t.file(d),(m.snapshotFile.toLowerCase().endsWith(".jpg")||m.snapshotFile.toLowerCase().endsWith(".jpeg"))&&(y="jpeg")}if(!u){const d=c.replace(".bcfv",""),x=d.replace(/Viewpoint_/i,"Snapshot_"),w=d.replace(/_viewpoint$/i,"_snapshot"),b=[`${x}.png`,`${w}.png`,`${d}.png`,`${e}/snapshot.png`,`${x}.jpg`,`${w}.jpg`,`${d}.jpg`,`${e}/snapshot.jpg`];for(const v of b)if(u=t.file(v),u){(v.toLowerCase().endsWith(".jpg")||v.toLowerCase().endsWith(".jpeg"))&&(y="jpeg");break}}if(u){const d=await u.async("uint8array");f.snapshotData=d,f.snapshot=`data:image/${y};base64,${j(d)}`}o.push(f)}}catch(l){console.warn(`Failed to parse viewpoint ${c}:`,l)}if(o.length===0){const c=t.file(`${e}/snapshot.png`)||t.file(`${e}/snapshot.jpg`);if(c){const l=c.name.toLowerCase().endsWith(".jpg"),p=await c.async("uint8array");o.push({guid:e,snapshot:`data:image/${l?"jpeg":"png"};base64,${j(p)}`,snapshotData:p})}}return o}function rt(t){const i=t.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/)?.[1]||crypto.randomUUID?.()||`vp-${Date.now()}`,o=lt(t),n=pt(t),s=ft(t),a=dt(t),r=ht(t),c=gt(t);return{guid:i,perspectiveCamera:o,orthogonalCamera:n,components:s,lines:a.length>0?a:void 0,clippingPlanes:r.length>0?r:void 0,bitmaps:c.length>0?c:void 0}}function lt(t){const e=t.match(/<PerspectiveCamera>([\s\S]*?)<\/PerspectiveCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=M(i,"CameraDirection"),s=M(i,"CameraUpVector"),a=g(i,"FieldOfView");if(!(!o||!n||!s||!a))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,fieldOfView:parseFloat(a)}}function pt(t){const e=t.match(/<OrthogonalCamera>([\s\S]*?)<\/OrthogonalCamera>/);if(!e)return;const i=e[1],o=V(i,"CameraViewPoint"),n=M(i,"CameraDirection"),s=M(i,"CameraUpVector"),a=g(i,"ViewToWorldScale");if(!(!o||!n||!s||!a))return{cameraViewPoint:o,cameraDirection:n,cameraUpVector:s,viewToWorldScale:parseFloat(a)}}function V(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=g(i[1],"X"),n=g(i[1],"Y"),s=g(i[1],"Z");if(!(o===void 0||n===void 0||s===void 0))return{x:parseFloat(o),y:parseFloat(n),z:parseFloat(s)}}function M(t,e){return V(t,e)}function ft(t){const e=t.match(/<Components>([\s\S]*?)<\/Components>/);if(!e)return;const i=e[1],o=B(i,"Selection"),n=ut(i),s=mt(i);if(!(!o&&!n&&!s))return{selection:o?.length?o:void 0,visibility:n,coloring:s?.length?s:void 0}}function B(t,e){const i=t.match(new RegExp(`<${e}>([\\s\\S]*?)<\\/${e}>`));if(!i)return;const o=[],n=i[1].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const s of n){const a=_(s[0]);a&&o.push(a)}return o.length>0?o:void 0}function _(t){const e=t.match(/IfcGuid="([^"]+)"/),i=t.match(/AuthoringToolId="([^"]+)"/),o=t.match(/OriginatingSystem="([^"]+)"/);if(!(!e&&!i))return{ifcGuid:e?.[1],authoringToolId:i?.[1],originatingSystem:o?.[1]}}function ut(t){const e=t.match(/<Visibility[^>]*>([\s\S]*?)<\/Visibility>/);if(!e)return;const o=t.match(/DefaultVisibility="([^"]+)"/)?.[1]!=="false",n=B(e[1],"Exceptions");return{defaultVisibility:o,exceptions:n}}function mt(t){const e=t.match(/<Coloring>([\s\S]*?)<\/Coloring>/);if(!e)return;const i=[],o=e[1].matchAll(/<Color\s+Color="([^"]+)"[^>]*>([\s\S]*?)<\/Color>/g);for(const n of o){const s=n[1],a=[],r=n[2].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);for(const c of r){const l=_(c[0]);l&&a.push(l)}a.length>0&&i.push({color:s,components:a})}return i.length>0?i:void 0}function dt(t){const e=[],i=t.match(/<Lines>([\s\S]*?)<\/Lines>/);if(!i)return e;const o=i[1].matchAll(/<Line>([\s\S]*?)<\/Line>/g);for(const n of o){const s=V(n[1],"StartPoint"),a=V(n[1],"EndPoint");s&&a&&e.push({startPoint:s,endPoint:a})}return e}function ht(t){const e=[],i=t.match(/<ClippingPlanes>([\s\S]*?)<\/ClippingPlanes>/);if(!i)return e;const o=i[1].matchAll(/<ClippingPlane>([\s\S]*?)<\/ClippingPlane>/g);for(const n of o){const s=V(n[1],"Location"),a=M(n[1],"Direction");s&&a&&e.push({location:s,direction:a})}return e}function gt(t){const e=[],i=t.match(/<Bitmaps>([\s\S]*?)<\/Bitmaps>/);if(!i)return e;const o=i[1].matchAll(/<Bitmap>([\s\S]*?)<\/Bitmap>/g);for(const n of o){const s=g(n[1],"Format")||g(n[1],"Bitmap"),a=g(n[1],"Reference"),r=V(n[1],"Location"),c=M(n[1],"Normal"),l=M(n[1],"Up"),p=g(n[1],"Height");s&&a&&r&&c&&l&&p&&e.push({format:s.toUpperCase()==="JPG"?"JPG":"PNG",reference:a,location:r,normal:c,up:l,height:parseFloat(p)})}return e}function j(t){let e="";for(let i=0;i<t.length;i++)e+=String.fromCharCode(t[i]);return btoa(e)}async function ie(t){const e=new X;yt(e,t.version),(t.projectId||t.name)&&xt(e,t);for(const[i,o]of t.topics)await wt(e,o);return e.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}})}function yt(t,e){const i=`<?xml version="1.0" encoding="UTF-8"?>
2
2
  <Version xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" VersionId="${e}">
3
3
  <DetailedVersion>${e}</DetailedVersion>
4
4
  </Version>`;t.file("bcf.version",i)}function xt(t,e){const i=e.projectId||C(),o=e.name?`
@@ -1 +1 @@
1
- import{i as r}from"./pako.esm-n3Pgozwg.js";import{B as o}from"./geotiff-BydcIud8.js";import"./sandbox-0Z2NzeOJ.js";import"./lens-DMnqMXpz.js";import"./__vite-browser-external-B1O5LaIO.js";class d extends o{decodeBlock(e){return r(new Uint8Array(e)).buffer}}export{d as default};
1
+ import{i as r}from"./pako.esm-n3Pgozwg.js";import{B as o}from"./geotiff-fSD_sVw_.js";import"./sandbox-BSiO04m8.js";import"./lens-DMnqMXpz.js";import"./__vite-browser-external-B1O5LaIO.js";class d extends o{decodeBlock(e){return r(new Uint8Array(e)).buffer}}export{d as default};