wuic-framework-lib 1.5.0 → 1.7.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 (26) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-0J1ghIrS.mjs → wuic-framework-lib-chart-list.component-Bl424n7x.mjs} +50 -38
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-C21mvjyr.mjs → wuic-framework-lib-code-editor.component-N6HMl2mf.mjs} +174 -274
  3. package/fesm2022/{wuic-framework-lib-designer.component-x10ZzUEy.mjs → wuic-framework-lib-designer.component-Bd2fwl6H.mjs} +499 -581
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-BuSxs_CM.mjs → wuic-framework-lib-first-run-wizard.component-NN6cWVHL.mjs} +22 -24
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-xTGLbEnp.mjs → wuic-framework-lib-framework-docs.component-B867JAYe.mjs} +2912 -294
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-BkFFjPm4.mjs → wuic-framework-lib-pivot-builder.component-DWukH0L-.mjs} +580 -68
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-Bi-TrJB6.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DWO1Rcgv.mjs} +2 -2
  8. package/fesm2022/wuic-framework-lib-report-designer.component-QcrU81m6.mjs +380 -0
  9. package/fesm2022/wuic-framework-lib-report-scaffold-dialog.component-U-zdOoRV.mjs +431 -0
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-BR-BfI2r.mjs → wuic-framework-lib-report-viewer.component-B4LhA3SL.mjs} +8 -13
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-BQzFxSXP.mjs → wuic-framework-lib-scene3d-designer.component-DjOfzKLo.mjs} +323 -88
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-0LjqhSNn.mjs → wuic-framework-lib-scene3d-light-baker-gpu-C96T9uIW.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-shader-effect-CQLWkuh1.mjs → wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs} +612 -32
  14. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-imoV3HOs.mjs → wuic-framework-lib-scene3d-viewer.component-Dboz1fjl.mjs} +149 -18
  15. package/fesm2022/{wuic-framework-lib-scheduler-list.component-xzlTEkoq.mjs → wuic-framework-lib-scheduler-list.component--wY21R3o.mjs} +169 -53
  16. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-CrS6fOGj.mjs → wuic-framework-lib-spreadsheet-list-sf.component-Ek30J8v-.mjs} +149 -108
  17. package/fesm2022/{wuic-framework-lib-stimulsoft-license.service-BIyxB4pO.mjs → wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs} +3 -3
  18. package/fesm2022/wuic-framework-lib-timeline-list.component-aqCH4P0G.mjs +805 -0
  19. package/fesm2022/{wuic-framework-lib-workflow-designer.component-5xtQ7-6z.mjs → wuic-framework-lib-workflow-designer.component-DMM8BeXm.mjs} +180 -150
  20. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs → wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs} +6761 -2347
  21. package/fesm2022/wuic-framework-lib.mjs +1 -1
  22. package/package.json +4 -2
  23. package/styles/_wuic-tokens.scss +82 -0
  24. package/styles/styles.scss +160 -0
  25. package/types/wuic-framework-lib.d.ts +4264 -2691
  26. package/fesm2022/wuic-framework-lib-report-designer.component-ZvB46-LV.mjs +0 -194
@@ -2,8 +2,11 @@ import * as i0 from '@angular/core';
2
2
  import { Input, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as THREE from 'three';
4
4
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
5
- import { W as WtoolboxService, f as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs';
6
- import { L as deserializeScene, i as isWebGpuSupported, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, s as parseShaderEffect, u as buildEffectNodeMaterial, v as buildEffectShaderMaterial, w as getMeshRepeaterConfig, B as regenerateRepeater, x as WUIC_REPEATER_CHILD, C as CarouselController, b as defaultCarouselConfig, y as buildUploadTextureResolver, p as makeTextSpriteMesh, z as applyRepeaterTextureTo, E as createPhysicsWorld, D as getPhysicsDef, I as WUIC_BINDING_KEY, H as carouselArrowDir } from './wuic-framework-lib-scene3d-shader-effect-CQLWkuh1.mjs';
5
+ import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs';
6
+ import { R as deserializeScene, i as isWebGpuSupported, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, t as parseShaderEffect, v as buildEffectNodeMaterial, w as buildEffectShaderMaterial, x as getMeshRepeaterConfig, E as regenerateRepeater, y as WUIC_REPEATER_CHILD, C as CarouselController, b as defaultCarouselConfig, A as buildUploadTextureResolver, p as makeTextSpriteMesh, s as resolveAssetFormat, z as normalizeAssetToUnit, B as applyRepeaterTextureTo, G as createPhysicsWorld, F as getPhysicsDef, O as WUIC_BINDING_KEY, J as carouselArrowDir, K as WUIC_REPEATER_RECORD, M as closeItemPopup, N as showItemPopup, L as runRepeaterCallback } from './wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs';
7
+ import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
8
+ import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
9
+ import { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';
7
10
  import * as i1 from '@angular/router';
8
11
 
9
12
  /**
@@ -78,6 +81,10 @@ class Scene3dViewerComponent {
78
81
  pendingPayload;
79
82
  // --- bound listener (per removeEventListener in ngOnDestroy) ---
80
83
  onCanvasClick = (event) => this.handleClick(event);
84
+ onCanvasDblClick = (event) => this.handleViewerEvent(event, 'dblclick', false);
85
+ onCanvasContextMenu = (event) => this.handleViewerEvent(event, 'rightclick', true);
86
+ /** Hook per-frame del popup item (billboard del pannello 3D verso la camera). */
87
+ popupFrameHook = null;
81
88
  constructor(dataSrv, metaSrv, route, router, cdr, zone) {
82
89
  this.dataSrv = dataSrv;
83
90
  this.metaSrv = metaSrv;
@@ -165,7 +172,8 @@ class Scene3dViewerComponent {
165
172
  this.pendingPayload = parsed;
166
173
  }
167
174
  }
168
- catch (err) {
175
+ catch {
176
+ // Load/parse failure: surfaced to the user via errorMessage, no rethrow needed.
169
177
  this.loading = false;
170
178
  this.errorMessage = 'Errore nel caricamento della scena';
171
179
  this.cdr.markForCheck();
@@ -213,6 +221,8 @@ class Scene3dViewerComponent {
213
221
  // Click -> apri CRUD della rotta bindata (F5 pattern), fuori da Angular.
214
222
  this.zone.runOutsideAngular(() => {
215
223
  renderer.domElement.addEventListener('click', this.onCanvasClick);
224
+ renderer.domElement.addEventListener('dblclick', this.onCanvasDblClick);
225
+ renderer.domElement.addEventListener('contextmenu', this.onCanvasContextMenu);
216
226
  });
217
227
  this.resizeObserver = new ResizeObserver(() => this.handleResize());
218
228
  this.resizeObserver.observe(container);
@@ -243,6 +253,9 @@ class Scene3dViewerComponent {
243
253
  } });
244
254
  }
245
255
  if (this.renderer && this.scene && this.camera) {
256
+ if (this.popupFrameHook) {
257
+ this.popupFrameHook();
258
+ } // billboard pannello popup 3D
246
259
  this.renderer.render(this.scene, this.viewCamera || this.camera);
247
260
  }
248
261
  };
@@ -258,6 +271,8 @@ class Scene3dViewerComponent {
258
271
  const canvas = this.renderer?.domElement;
259
272
  if (canvas) {
260
273
  canvas.removeEventListener('click', this.onCanvasClick);
274
+ canvas.removeEventListener('dblclick', this.onCanvasDblClick);
275
+ canvas.removeEventListener('contextmenu', this.onCanvasContextMenu);
261
276
  }
262
277
  this.orbit?.dispose();
263
278
  this.orbit = undefined;
@@ -270,7 +285,7 @@ class Scene3dViewerComponent {
270
285
  }
271
286
  this.renderer?.dispose();
272
287
  if (canvas?.parentElement) {
273
- canvas.parentElement.removeChild(canvas);
288
+ canvas.remove();
274
289
  }
275
290
  this.renderer = undefined;
276
291
  this.scene = undefined;
@@ -323,7 +338,8 @@ class Scene3dViewerComponent {
323
338
  try {
324
339
  root = deserializeScene(payload);
325
340
  }
326
- catch (err) {
341
+ catch {
342
+ // Malformed payload: surfaced to the user via errorMessage, no rethrow needed.
327
343
  this.loading = false;
328
344
  this.errorMessage = 'Scena non valida';
329
345
  this.cdr.markForCheck();
@@ -404,11 +420,13 @@ class Scene3dViewerComponent {
404
420
  this.replaceCustomShadersWithFallback();
405
421
  const oldCanvas = old.domElement;
406
422
  oldCanvas.removeEventListener('click', this.onCanvasClick);
423
+ oldCanvas.removeEventListener('dblclick', this.onCanvasDblClick);
424
+ oldCanvas.removeEventListener('contextmenu', this.onCanvasContextMenu);
407
425
  this.orbit?.dispose();
408
426
  this.orbit = undefined;
409
427
  const shadowsEnabled = old.shadowMap.enabled;
410
428
  old.dispose();
411
- oldCanvas.parentElement?.removeChild(oldCanvas);
429
+ oldCanvas.remove();
412
430
  this.renderer = undefined;
413
431
  const { renderer } = await createScene3dRenderer('webgpu', {
414
432
  width: container.clientWidth,
@@ -431,6 +449,8 @@ class Scene3dViewerComponent {
431
449
  this.orbit = orbit;
432
450
  this.zone.runOutsideAngular(() => {
433
451
  renderer.domElement.addEventListener('click', this.onCanvasClick);
452
+ renderer.domElement.addEventListener('dblclick', this.onCanvasDblClick);
453
+ renderer.domElement.addEventListener('contextmenu', this.onCanvasContextMenu);
434
454
  });
435
455
  }
436
456
  /** ShaderMaterial GLSL -> materiale standard neutro (WebGPU non li compila). */
@@ -547,11 +567,12 @@ class Scene3dViewerComponent {
547
567
  continue;
548
568
  }
549
569
  try {
550
- const [rows, resolver] = await Promise.all([
570
+ const [rows, resolver, assetResolver] = await Promise.all([
551
571
  this.fetchRouteRows(cfg.route),
552
- this.buildTextureResolver(cfg)
572
+ this.buildTextureResolver(cfg),
573
+ this.buildAssetResolver(cfg)
553
574
  ]);
554
- regenerateRepeater(group, cfg, rows, this.buildRepeaterDeps(resolver));
575
+ await regenerateRepeater(group, cfg, rows, this.buildRepeaterDeps(resolver, assetResolver));
555
576
  // Archetipo carousel: attacca il controller (scroll animato + click frecce).
556
577
  if (cfg.layout?.mode === 'carousel') {
557
578
  const items = group.children.filter((c) => c.name === WUIC_REPEATER_CHILD);
@@ -581,7 +602,7 @@ class Scene3dViewerComponent {
581
602
  }
582
603
  }
583
604
  /** Factory read-only per le mesh figlie del repeater (primitive standard). */
584
- buildRepeaterDeps(resolveTextureSrc) {
605
+ buildRepeaterDeps(resolveTextureSrc, resolveAssetSrc) {
585
606
  const geom = (type) => {
586
607
  switch (type) {
587
608
  case 'sphere': return new THREE.SphereGeometry(0.75, 24, 12);
@@ -600,9 +621,64 @@ class Scene3dViewerComponent {
600
621
  createTextMesh: (text) => makeTextSpriteMesh(text),
601
622
  resolveRecordId: (record) => this.resolveRecordPk(record),
602
623
  unwrap: (v) => this.unwrap(v),
603
- resolveTextureSrc
624
+ resolveTextureSrc,
625
+ resolveAssetSrc,
626
+ loadAsset: (url) => this.loadRepeaterAsset(url)
604
627
  };
605
628
  }
629
+ /** Cache per-URL degli asset del repeater (template clonabili) — read-only viewer. */
630
+ repeaterAssetCache = new Map();
631
+ /** Carica (fetch + parser three, cache per-URL) un asset 3D per il repeater. Null se fallisce. */
632
+ async loadRepeaterAsset(url) {
633
+ if (this.repeaterAssetCache.has(url)) {
634
+ return this.repeaterAssetCache.get(url);
635
+ }
636
+ let obj = null;
637
+ try {
638
+ const format = resolveAssetFormat(url.split('?')[0]);
639
+ const resp = await fetch(url);
640
+ if (!resp.ok) {
641
+ throw new Error('HTTP ' + resp.status);
642
+ }
643
+ if (format === 'glb' || format === 'gltf') {
644
+ const buffer = await resp.arrayBuffer();
645
+ const gltf = await new Promise((res, rej) => new GLTFLoader().parse(buffer, '', res, rej));
646
+ obj = gltf?.scene || gltf?.scenes?.[0] || null;
647
+ }
648
+ else if (format === 'obj') {
649
+ obj = new OBJLoader().parse(await resp.text());
650
+ }
651
+ else if (format === 'stl') {
652
+ const geometry = new STLLoader().parse(await resp.arrayBuffer());
653
+ geometry.computeVertexNormals();
654
+ obj = new THREE.Mesh(geometry, new THREE.MeshStandardMaterial({ color: 0xb8bcc4, metalness: 0.15, roughness: 0.7 }));
655
+ }
656
+ }
657
+ catch (e) {
658
+ console.warn('[Scene3D viewer] repeater asset load fallito', url, e);
659
+ obj = null;
660
+ }
661
+ if (obj) {
662
+ obj = normalizeAssetToUnit(obj);
663
+ }
664
+ this.repeaterAssetCache.set(url, obj);
665
+ return obj;
666
+ }
667
+ /** Resolver dell'asset mesh (meshSource.mode='asset'): upload → URL, altrimenti as-is. */
668
+ async buildAssetResolver(cfg) {
669
+ const col = cfg.meshSource?.mode === 'asset' ? cfg.meshSource.column : '';
670
+ if (!cfg.route || !col) {
671
+ return undefined;
672
+ }
673
+ try {
674
+ const columns = await this.metaSrv.getMetadati(cfg.route);
675
+ const app = { uploadPath: WtoolboxService.appSettings?.upload_path || '', apiUrl: WtoolboxService.appSettings?.api_url || '' };
676
+ return buildUploadTextureResolver(columns || [], cfg.route, col, app, (v) => this.unwrap(v)) || ((_rec, raw) => raw);
677
+ }
678
+ catch {
679
+ return (_rec, raw) => raw;
680
+ }
681
+ }
606
682
  applyRepeaterTexture(obj, value, opts) {
607
683
  applyRepeaterTextureTo(obj, value, opts, this.repeaterTextureCache, (url) => {
608
684
  const t = new THREE.TextureLoader().load(url, () => this.cdr.markForCheck(), undefined, () => { });
@@ -824,7 +900,7 @@ class Scene3dViewerComponent {
824
900
  }
825
901
  try {
826
902
  if (/^0x[0-9a-fA-F]{6}$/.test(str)) {
827
- color.setHex(parseInt(str.slice(2), 16));
903
+ color.setHex(Number.parseInt(str.slice(2), 16));
828
904
  }
829
905
  else if (/^#?[0-9a-fA-F]{6}$/.test(str) || /^#?[0-9a-fA-F]{3}$/.test(str)) {
830
906
  color.set(str.startsWith('#') ? str : `#${str}`);
@@ -881,8 +957,8 @@ class Scene3dViewerComponent {
881
957
  return value;
882
958
  }
883
959
  }
884
- if (value && typeof value === 'object' && 'value' in value && typeof value.subscribe === 'function') {
885
- return value.value;
960
+ if (value && typeof value === 'object' && 'value' in value && typeof (value).subscribe === 'function') {
961
+ return (value).value;
886
962
  }
887
963
  return value;
888
964
  }
@@ -915,6 +991,10 @@ class Scene3dViewerComponent {
915
991
  }
916
992
  return;
917
993
  }
994
+ // Callback "click" di un item del repeater: se presente sovrascrive la CRUD.
995
+ if (this.runViewerItemCallback(hits[0].object, event, 'click')) {
996
+ return;
997
+ }
918
998
  const picked = this.resolveBoundAncestor(hits[0].object);
919
999
  const binding = picked?.userData?.[WUIC_BINDING_KEY];
920
1000
  if (!binding || !String(binding.route || '').trim()) {
@@ -922,6 +1002,57 @@ class Scene3dViewerComponent {
922
1002
  }
923
1003
  this.zone.run(() => this.openRecordForBinding(binding));
924
1004
  }
1005
+ /** Raycast + esecuzione callback per dblclick/rightclick nel viewer. */
1006
+ handleViewerEvent(event, kind, preventDefault) {
1007
+ if (!this.renderer || !this.camera || !this.contentGroup) {
1008
+ return;
1009
+ }
1010
+ const rect = this.renderer.domElement.getBoundingClientRect();
1011
+ this.pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
1012
+ this.pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
1013
+ this.raycaster.setFromCamera(this.pointer, this.viewCamera || this.camera);
1014
+ const hits = this.raycaster.intersectObjects([this.contentGroup], true);
1015
+ if (hits.length > 0 && this.runViewerItemCallback(hits[0].object, event, kind) && preventDefault) {
1016
+ event.preventDefault();
1017
+ }
1018
+ }
1019
+ /** Trova l'item repeater + config e, se c'e' il callback per `kind`, lo esegue. */
1020
+ runViewerItemCallback(hit, event, kind) {
1021
+ let item = hit;
1022
+ while (item && item.name !== WUIC_REPEATER_CHILD) {
1023
+ item = item.parent;
1024
+ }
1025
+ if (!item) {
1026
+ return false;
1027
+ }
1028
+ let grp = item.parent;
1029
+ while (grp && !getMeshRepeaterConfig(grp)) {
1030
+ grp = grp.parent;
1031
+ }
1032
+ const cfg = grp ? getMeshRepeaterConfig(grp) : null;
1033
+ if (!cfg) {
1034
+ return false;
1035
+ }
1036
+ const dblOrRightJs = kind === 'dblclick' ? cfg.onDoubleClickJs : cfg.onRightClickJs;
1037
+ const js = kind === 'click' ? cfg.onClickJs : dblOrRightJs;
1038
+ if (!js || !js.trim()) {
1039
+ return false;
1040
+ }
1041
+ const record = (item.userData?.[WUIC_REPEATER_RECORD]) || {};
1042
+ const cam = this.viewCamera || this.camera;
1043
+ const ctx = {
1044
+ record, event, mesh: item, scene: this.scene, camera: cam, THREE,
1045
+ wuic: {
1046
+ showItemPopup: (opts = {}) => showItemPopup({ record, mesh: item, ...opts }, {
1047
+ scene: this.scene, camera: cam, canvas: this.renderer.domElement,
1048
+ onFrame: (cb) => { this.popupFrameHook = cb; }
1049
+ }),
1050
+ closePopup: () => { this.popupFrameHook = null; closeItemPopup(); }
1051
+ }
1052
+ };
1053
+ this.zone.run(() => runRepeaterCallback(js, ctx));
1054
+ return true;
1055
+ }
925
1056
  /**
926
1057
  * Dal mesh colpito risale al primo antenato (incluso se stesso) che porta un
927
1058
  * binding, così il click su un sub-mesh apre comunque la CRUD dell'oggetto bindato.
@@ -929,7 +1060,7 @@ class Scene3dViewerComponent {
929
1060
  resolveBoundAncestor(object) {
930
1061
  let current = object;
931
1062
  while (current && current !== this.contentGroup) {
932
- if (current.userData && current.userData[WUIC_BINDING_KEY]) {
1063
+ if (current.userData?.[WUIC_BINDING_KEY]) {
933
1064
  return current;
934
1065
  }
935
1066
  current = current.parent;
@@ -981,11 +1112,11 @@ class Scene3dViewerComponent {
981
1112
  return undefined;
982
1113
  }
983
1114
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerComponent, deps: [{ token: DataProviderService }, { token: MetadataProviderService }, { token: i1.ActivatedRoute }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
984
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: Scene3dViewerComponent, isStandalone: true, selector: "wuic-scene3d-viewer", inputs: { sceneKey: "sceneKey", cameraId: "cameraId" }, viewQueries: [{ propertyName: "viewportContainer", first: true, predicate: ["viewportContainer"], descendants: true }], ngImport: i0, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [".scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: Scene3dViewerComponent, isStandalone: true, selector: "wuic-scene3d-viewer", inputs: { sceneKey: "sceneKey", cameraId: "cameraId" }, viewQueries: [{ propertyName: "viewportContainer", first: true, predicate: ["viewportContainer"], descendants: true }], ngImport: i0, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
985
1116
  }
986
1117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerComponent, decorators: [{
987
1118
  type: Component,
988
- args: [{ selector: 'wuic-scene3d-viewer', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [".scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"] }]
1119
+ args: [{ selector: 'wuic-scene3d-viewer', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"] }]
989
1120
  }], ctorParameters: () => [{ type: DataProviderService }, { type: MetadataProviderService }, { type: i1.ActivatedRoute }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], propDecorators: { viewportContainer: [{
990
1121
  type: ViewChild,
991
1122
  args: ['viewportContainer', { static: false }]
@@ -996,4 +1127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
996
1127
  }] } });
997
1128
 
998
1129
  export { Scene3dViewerComponent };
999
- //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-imoV3HOs.mjs.map
1130
+ //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-Dboz1fjl.mjs.map