@realsee/dnalogel 4.0.0-webgpu.3 → 4.0.0-webgpu.4

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 (147) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/floorplan.js +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +270 -35
  5. package/dist/index.js.map +1 -0
  6. package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
  7. package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
  8. package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
  9. package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
  10. package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
  11. package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
  12. package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
  13. package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
  14. package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
  15. package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
  16. package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
  17. package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
  18. package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
  19. package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
  20. package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
  21. package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
  22. package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
  23. package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
  24. package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
  25. package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
  26. package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
  27. package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
  28. package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
  29. package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
  30. package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
  31. package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
  32. package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
  33. package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
  34. package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
  35. package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
  36. package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
  37. package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
  38. package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
  39. package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
  40. package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
  41. package/dist/internal/controller-DIDtFrBE.js.map +1 -0
  42. package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
  43. package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
  44. package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
  45. package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
  46. package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
  47. package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
  48. package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
  49. package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
  50. package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
  51. package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
  52. package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
  53. package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
  54. package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
  55. package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
  56. package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
  57. package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
  58. package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
  59. package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
  60. package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
  61. package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
  62. package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
  63. package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
  64. package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
  65. package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
  66. package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
  67. package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
  68. package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
  69. package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
  70. package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
  71. package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
  72. package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
  73. package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
  74. package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
  75. package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
  76. package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
  77. package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
  78. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
  79. package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
  80. package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
  81. package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
  82. package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
  83. package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
  84. package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
  85. package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
  86. package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
  87. package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
  88. package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
  89. package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
  90. package/dist/internal/tagPosition-DA9YguT8.js +176 -0
  91. package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
  92. package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
  93. package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
  94. package/dist/plugins/area-maker.js +1 -1
  95. package/dist/plugins/camera-movement.js +1 -1
  96. package/dist/plugins/cruise.js +2 -2
  97. package/dist/plugins/css3d-render.js +1 -1
  98. package/dist/plugins/current-pano-image.js +1 -1
  99. package/dist/plugins/digital-performance.d.ts +1 -1
  100. package/dist/plugins/digital-performance.js +1 -1
  101. package/dist/plugins/fire-scene.d.ts +1 -1
  102. package/dist/plugins/fire-scene.js +1 -1
  103. package/dist/plugins/guide-line.js +1 -1
  104. package/dist/plugins/measure.js +1 -1
  105. package/dist/plugins/model-chassis-compass.js +1 -1
  106. package/dist/plugins/model-entry-door-guide.js +1 -1
  107. package/dist/plugins/model-maker.d.ts +1 -1
  108. package/dist/plugins/model-maker.js +1 -1
  109. package/dist/plugins/model-tv-video.js +1 -1
  110. package/dist/plugins/model-view.js +1 -1
  111. package/dist/plugins/object3d-helper.d.ts +1 -1
  112. package/dist/plugins/object3d-helper.js +3 -1
  113. package/dist/plugins/pano-compass.js +1 -1
  114. package/dist/plugins/pano-door-label.js +1 -1
  115. package/dist/plugins/pano-measure.js +1 -1
  116. package/dist/plugins/pano-ruler-pro.js +1 -1
  117. package/dist/plugins/pano-spatial-tag.js +1 -1
  118. package/dist/plugins/pano-tag.d.ts +1 -1
  119. package/dist/plugins/pano-tag.js +4 -1
  120. package/dist/plugins/pano-video.js +1 -1
  121. package/dist/plugins/pipeline.js +1 -1
  122. package/dist/plugins/sculpt.d.ts +1 -1
  123. package/dist/plugins/sculpt.js +7 -1
  124. package/dist/types/public/index.d.ts +2 -0
  125. package/dist/types/public/plugins/digital-performance.d.ts +1 -0
  126. package/dist/types/public/plugins/fire-scene.d.ts +1 -0
  127. package/dist/types/public/plugins/model-maker.d.ts +1 -0
  128. package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
  129. package/dist/types/public/plugins/pano-tag.d.ts +2 -0
  130. package/dist/types/public/plugins/sculpt.d.ts +8 -0
  131. package/dist/types/public/utils.d.ts +5 -0
  132. package/dist/utils.d.ts +1 -1
  133. package/dist/utils.js +16 -50
  134. package/package.json +1 -1
  135. package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
  136. package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
  137. package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
  138. package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
  139. package/dist/internal/blink-DD_0mH-m.js +0 -113
  140. package/dist/internal/blink-DD_0mH-m.js.map +0 -1
  141. package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
  142. package/dist/internal/controller-BWkZT0l1.js.map +0 -1
  143. package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
  144. package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
  145. package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
  146. package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
  147. package/dist/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"controller-BWkZT0l1.js","names":["isNil","random","random","ThreeVector3","objectAssignDeep","newHeight","newWidth","MediaPlane","BasePlugin.Controller","objectAssignDeep","Subscribe","Line","OpacityMesh","root","$.from_svg","root_1","$.from_html","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.child","$.sibling","$.get","$.set_class","$.set_style","root","$.from_html","$.prop","$.comment","$.first_child","$.set_style","$.deep_read_state","$.untrack","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.deep_read_state","$.get","$.comment","$.first_child","$.mutate","$.only_child","$.set_text","root","$.from_html","$.prop","$.comment","$.first_child","$.child","$.sibling","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.get","$.deep_read_state","$.first_child","$.child","$.set","$.set_style","$.sibling","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.derived_safe_equal","$.sibling","$.untrack","$.child","$.event","root","$.from_html","root_1","root_2","root_3","$.mutable_source","$.prop","text","$.deep_read_state","$.child","$.text","$.set_text","$.first_child","$.untrack","$.sibling","$.only_child","$.comment","$.get","$.set_style","root","$.from_html","root_1","$.mutable_source","$.prop","$.deep_read_state","$.get","$.comment","$.first_child","$.sibling","$.child","$.derived_safe_equal","$.untrack","$.set_class","$.set_style","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.get","root","$.from_svg","root_1","$.prop","$.child","$.only_child","$.sibling","$.set_attribute","root","$.from_html","$.child","$.pop","root","$.from_html","root_1","root_2","root_3","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.untrack","$.set_style","$.set_class","$.sibling","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.index","$.spread_props","$.set","$.untrack","$.set_class","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.deep_read_state","$.get","$.comment","$.first_child","$.sibling","$.child","$.untrack","root","$.from_html","root_1","root_2","root_3","root_4","root_5","root_6","root_7","root_8","root_9","root_10","root_11","root_12","$.mutable_source","$.prop","$.get","$.deep_read_state","$.child","$.sibling","$.set_attribute","$.untrack","$.only_child","$.index","$.set_text","$.event","$.set_class","$.set_style","$.set","root","$.from_html","Audio","$.prop","$.mutable_source","$.get","$.deep_read_state","$.child","$.set_style","$.stopPropagation","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.child","$.sibling","$.set","$.set_style","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.derived_safe_equal","$.sibling","$.untrack","$.event","$.set_class","root","$.from_html","root_1","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.child","$.derived_safe_equal","$.untrack","$.get","$.sibling","text","$.text","$.set_text","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.get","root","$.from_html","$.mutable_source","$.prop","$.deep_read_state","$.get","$.comment","$.first_child","$.child","$.derived_safe_equal","$.untrack","root","$.from_html","root_1","root_2","root_3","root_4","root_5","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.sibling","$.untrack","$.derived_safe_equal","$.set_style","$.derived","$.set_attribute","$.set","root","$.from_html","root_1","$.mutable_source","$.prop","$.deep_read_state","$.get","$.child","$.sibling","$.only_child","$.set_style","root","$.from_html","root_1","PanoramaIcon","$.mutable_source","$.prop","$.deep_read_state","$.get","$.child","$.sibling","$.set_style","root","$.from_html","$.mutable_source","$.prop","$.deep_read_state","$.child","$.get","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.child","$.comment","$.first_child","$.set","$.set_class","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.derived_safe_equal","$.untrack","$.set_class","$.clsx","classNames","$.derived","$.set_style","$.set_attribute","TagContentSvelte","TagContentSvelte","root","$.from_html","$.prop","$.derived_safe_equal","$.deep_read_state","$.untrack","$.get","$.child","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.deep_read_state","$.get","$.child","$.sibling","$.derived_safe_equal","$.untrack","$.set_class","$.set_style","$.pop","root","$.from_html","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.get","root","$.from_html","$.prop","$.child","$.sibling","root","$.from_html","$.prop","$.only_child","root","$.from_html","$.prop","$.child","$.sibling","$.only_child","$.stopPropagation","root","$.from_html","root_1","root_2","root_3","$.mutable_source","$.prop","$.get","$.deep_read_state","$.child","$.only_child","$.set_text","$.sibling","$.index","$.untrack","$.set_attribute","root","$.from_svg","$.prop","$.child","$.sibling","root","$.from_svg","$.prop","$.child","$.sibling","root","$.from_html","root_1","root_2","$.mutable_source","$.prop","$.deep_read_state","$.comment","$.first_child","$.child","$.sibling","$.derived_safe_equal","$.get","$.set_text","$.untrack","$.set_class","root","$.from_html","$.prop","$.first_child","$.sibling","$.derived_safe_equal","$.deep_read_state","$.untrack","$.get","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.comment","$.first_child","$.child","$.set","$.untrack","$.set_class","root","$.from_html","$.mutable_source","$.prop","$.get","$.deep_read_state","$.first_child","$.child","$.derived_safe_equal","$.untrack","$.set","$.sibling","$.set_class","$.set_style","$.derived","$.from_html","$.prop","$.mutable_source","$.get","$.deep_read_state","$.comment","$.first_child","$.set","$.set_class","$.untrack","$.set_style","objectAssignDeep","type","TagContainerSvelte","__toESM","loadGLTF","transformPosition","Subscribe$1","removeBehindScene","removeFrontScene","addFrontScene","initialCSS3DRender","fiveEveryReadyListener","even","OpecityMesh","CSS3DObject","waitFiveModelLoaded","arrayPositionToVector3","anyPositionToVector3","centerPoint","vector3Position","toArray","getNormal","_raycaster","resizeObserver","isPanoramaLike","isModelLike","reblink","lookPoint","blink","vectorToCoordinates","notNil","isNil","FiveDomEvents","uuid","PANO_TAG_DEFAULT_LINK_ICON","tweenProgress","nextFrame","stringStartsWith","getRelativeValue","unitsExecRgx","isArr","isNum","isStr","sqrt","round","getOriginalAnimatableValue","isFnc","parseNumber","parseEase","abs","isUnd","registerTargets","floor","animate","isNil$1","relativeValuesExecRgx","Controller","flushSync","snippet","tick","if_block","createEventDispatcher","from_svg","template_effect","effect","text","only_child","child","event","append","comment","onDestroy","from_html","set","deep_read_state","afterUpdate","legacy_pre_effect","untrack","legacy_pre_effect_reset","mutable_source","sibling","mutate","transition","bubble_event","setContext","each","bind_window_size","derived_safe_equal","set_attribute","action","clsx","writable","push","set_text","onMount","bind_this","set_class","prop","getContext","init","next","set_style","first_child","spread_props","pop","stopPropagation","reset","mountComponent","slot","await_block","index","html","get","withResolvers","Box","SculptModules","Polygon","Rectangle","require_objectAssignDeep","safeObj","getVideoTexture","isIOSWX","Image_Play_Icon_With_Text","Image_Default_Point","Image_Play_Icon","CONST","FiveLine","cubicOut","linear","cubicInOut","fade","fly","draw","svelteResizeObserver","require_classnames","THREE","getPrevChildOffset","timePosition","goToPrevAnimationOffset","prevAnimation","timeline","prevOffset","parseTimelinePosition","tlDuration","timePosStr","tlLabels","hasLabels","hasSibling","matchedRelativeOperator","fullOperator","split","labelOffset","parsedOffset","parsedNumericalOffset","random$1","m","decimalLength","max","min","_seed","createSeededRandom","t","seed","seededMin","seededMax","seededDecimalLength","shuffle","items","rnd","stagger","values","maxValue","cachedOffset","jitterSamples","from","params","reversed","ease","hasEasing","staggerEase","grid","autoGrid","axis","customTotal","fromFirst","fromCenter","fromLast","fromRandom","fromArr","isRange","val","useProp","val1","val2","unitMatch","start","rng","jitter","hasJitter","jitterIsArr","jitterStart","jitterEnd","fromIndex","registeredTarget","target","total","customIndex","i","customIdx","staggerIndex","hasPositions","has3D","minPosX","minPosY","minPosZ","maxPosX","maxPosY","maxPosZ","pxArr","pyArr","pzArr","el","px","py","pz","found","rect","obj","fX","fY","fZ","distanceX","distanceY","distanceZ","value","minDist","absVal","dims","wh","fromX","fromY","fromZ","toX","toY","toZ","k","v","spacing","tl","output","progress","mag","import_objectAssignDeep","addDebugPoints","geometry","spheres","materials","tag","boxPosition","startSphere","endSphere","polygonPosition","material","sphere","p","five","noTypecheck","x","planeNormal","points","vector3Points","vector01","vector12","isPlaneTag","isPoint3DTag","isMediaModelTag","isModelTag","isVirtualObjectTag","isAutoLookAtModelTag","isMediaPlaneTag","isPolygonTag","is3DBoxTag","isMaskTag","getBoxCorners","end","rotation","Euler","center","Vector3","transform","halfSize","rotationMatrix","Matrix4","unitCorners","size","corner","applyMatrixToPoints","matrix","matrix4","point","getTagPosition","position","getTagCenterPosition","tagPosition","checkRange","range","normalPositionToPositions","squareHalfSize","plane","normal","right","cameraPosition","top","debounce","timer","savedFunc","callback","args","waitFor","throttle","last","func","wait","searchFirstValueSmallThanLastValue","indexRange","cache","getValue","key","getValueByIndex","getYouTubeId","url","urlObj","vParam","match","getVimeoId","pathParts","potentialId","isYouTube","isVimeo","formatVideo","videoId","embedUrl","config","getTagStickType","formatTag","linkTag","BlankAudioSrc","audioCache","AudioNamespace","\"Default\"","\"GetAudioDuration\"","\"PlayAudio\"","getAudio","namespace","audioList","audio","IAudio","src","generateBlankAudio","generateLength","length","paramsSrc","muted","generation","initAudio","entries","adaptConfig","initialState","defaultGlobalConfig","normalizedConfigs","calculateTagConfig","useCache","baseConfig","objWithoutMode","objWithModeLike","objWithMode","_key","keys","configIsWithMode","fiveModeInConfig","keysWithOutFiveMode","contentType","stickType","appearance","audioTag","configInTag","sharedConfig","configWithoutFiveMode","configWithFiveMode","fiveModeList","Five","modeLike","mode","temp","DefaultConfig","pointsIsRectangle","p1","p2","p3","p4","p1p2","p2p3","p3p4","p4p1","p1p3","p2p4","QuadrangleMesh","p0","QuadrangleGeometry","segments","parent","paramsSegments","uv0","uv1","uv2","uv3","verticesArray","uvArray","indicesArray","getPositionsByObjectFit","objectFit","originPositions","bottomWidth","topWidth","leftHeight","rightHeight","wrapperWidth","wrapperHeight","wrapperRatio","originRatio","newWidth","bottomDiff","topDiff","newHeight","leftDiff","rightDiff","FragmentTransparencyMaterial","texture","TagMediaTextureCache","videos","scope","owners","owner","loaded","pending","currentOwners","promise","loadPicture","result","error","MediaPlane$1","mesh","ImagePlane","imageSrc","resolveZFighting","opacity","newCornerPoints","cornerPoints","transparent","newPoints","pendingChange","props","VideoPlane","videoSrc","playButton","videoCoverSrc","cacheScope","domEvents","initialGeneration","paused","d","dispose","detached","manager","userAction","session","current","video","operations","onError","clearError","fromStart","playing","coverMesh","videoMesh","videoInstance","buttonMesh","videoMeshHeight","coverMeshHeight","scale","settled","finish","cancel","reject","resolve","newGeometry","Cache","state","fiveState","accurate","visible","TagUtil","container","renderType","currentMediaElement","type","tags","id","tagId","fiveMode","object","getTagVisible","\"loading\"","_handler","sortedTags","a","b","isUpdateing","tooLarge","delay","sizeEveryTimeout","j","timeoutId","TagRender","Group","builtInRenderer","disposer","DebugUtil","plugin","stack","functionName","property","argumentsList","thisArg","getUrlExt","ext","getFloorIndex","work","observer","floorY","floorIndex","o","floorAverageY","y","getRaycasterStartPosition","observerPosition","checkPoint","BaseTag","host","bind","tagData","freezeTagData","initialConfig","computedConfig","currentConfig","initialUnfolded","finalPosition","normalVector","modelMatrix","tagFiveState","targetMode","targetPanoIndex","vector","enabled","tagVisible","tagDom","list","additionalTargets","targets","blinkFunc","animeConfig","deepMerge","data","distance","panoIndex","media","_fiveState","checkedList","info","skipWhenSamePano","intersectRes","getVisibleByFiveMode","visibleFiveMode","visibleByFiveMode","intersectRaycasterConfig","overrideConfig","fivePanoIndex","startPosition","checkPoints","configCheckPoints","passedCount","unPassedCount","rayStart","direction","intersectionDistance","intersection","customModelIntersection","models","customModelIntersections","distanceError","needPassed","currentFiveFloorIndex","project","z","tagConfig","distanceRange","pointTag","projScreenMatrix","frustum","cameraDirection","unfoldedConfig","aPoint","bPoint","centerPosition","notify","_vector2","PointTag","pixelRatio","originPosition","canFold","canUnfold","unfolded","force","positionChanged","screenChanged","rendererSize","screenDistancePixel","scaledIconPixelGap","ray","c","e","denom","t_ray","lineLength","ratio","__Object__","screenProject","sseDenominator","VERSION","NAME","MinRatio","CSS3DObjectPlus","halfWidth","dpr","pointerEvents","realRatio","planeWidth","planeHeight","domWidthPx","domHeightPx","css3DObjectElement","element","targetVector01","targetVector03","targetNormal","up","targetUp","rotateAxis","addBehindScene","root$38","root_1$18","Straight","$$props","isVertical","width","height","path","inDelay","outDelay","duration","useLinearColor","color","defsID","fragment","node","consequent_1","div","classes","styles","svg","defs","linearGradient","stop","stop_1","node_1","consequent","path_1","$$anchor","$$render","root$37","Shadow","left","bottom","horizontalCenter","verticalCenter","blurRadius","spreadRadius","zIndex","px2rem","$0","$1","$2","random","RANDON_STRING","root$36","root_1$17","root_2$12","FlyText","contentList","content","isFistUnfoldedUpdate","__EmojiSplitFlag__","__EmojiFlag__","__SpaceFlag__","__NewLineFlag__","timeoutID","openAnimeIns","spanEleList","getContentList","emojiRegExp","emoji","item","doAnimation","shouldAnimeReversed","onUnfoldedUpdate","initAnimation","firstLineLastIndex","resultIndex","ele","$$item","fragment_1","span","$$value","br","alternate","span_1","text_1","root$35","Arrow","div_1","$$arg","doUtil","count","util","times","root$34","root_1$16","root_2$11","FlyMText","arrowDirection","foldTextDelay","textUnfolded","textElement","translateY","lineHeight","textHeight","lineHeightString","node_2","root$33","TextTag","title","description","contentWidth","textItems","toggleTextUnfolded","$$node","root$32","root_1$15","root_2$10","root_3$5","MText","isEditing","maxLine","maxWidth","text$2","edit","consequent_3","consequent_2","text_2","fragment_2","node_3","root$31","root_1$14","TextPlaneTag","folded","descriptionMaxRows","titleMaxRows","div_2","div_3","div_4","node_4","TextTag_1","root$30","root_1$13","Polyline","root$29","Carousel","currentIndex","updateIndex","nextIndex","goToNext","$$exports","root$28","root_1$12","root_2$9","root_3$4","MediaItem","mediaUrl","mediaInstance","playButtonIfNeed","playButtonSizeIfNeed","canPlay","autoplayVideo","disableVideoIfHavePoster","showPlayButton","playbackGeneration","playbackController","stopOutput","setMediaManager","unbindMediaManager","play","hooks","loadPoster","videoPosterLoaded","resetVideoPosterLoaded","mediaStore","isWX","img","img_1","styles_1","video_1","styles_2","classes_1","classes_2","classes_3","root$27","Media","carouselEnabled","mediaDataList","autoplay","mediaData","animation","mediaItemConfig","enableCarousel","mediaInstanceList","carousel","intervalId","clickMedia","onTagClick","autoplayCarousel","root$26","root_1$11","root_2$8","ImageTextTag","node_5","MARKETING_MORE_ICON","MARKETING_LIGHT_MORE_ICON","root$25","root_1$10","root_2$7","root_3$3","root_4$2","root_5$2","root_6$1","root_7$1","root_8$1","root_9$1","root_10$1","root_11$1","root_12$1","MarketingTag","havePrice","theme","isLight","showMedia","isSmallScreen","primaryTags","secondaryTagsLimit","secondaryTags","lineDelayUnfolded","lineDelayFolded","contentDelayUnfolded","hasTags","hasFooter","hasMore","viewMoreText","windowWidth","tagsOffsetHeight","maxTagsLength","tagsCalculated","handleHeightChange","limitWidth","calculatedWidth","div_5","div_6","div_7","div_8","div_9","div_10","text_3","div_11","node_7","div_12","text_4","node_8","consequent_7","div_13","node_9","consequent_5","div_14","text_5","node_10","consequent_4","text_6","div_15","node_11","consequent_6","span_2","text_7","node_12","consequent_9","div_16","div_17","text_8","node_13","consequent_8","img_2","AudioDiagnostics","userAgent","browser","version","formats","supportedFormats","warnings","format","response","resolved","cleanup","onSuccess","onCanPlay","browserSupport","extension","urlTest","audioTest","AudioElement","SharedAudio","mediaManager","poolGeneration","currentTime","restoreTimeAfterPlay","audioSrc","mimeType","\"mp3\"","\"ogg\"","\"wav\"","\"m4a\"","\"aac\"","\"webm\"","ontimeupdate","onplay","ownsAudio","onpause","onended","onerror","oncanplay","oncanplaythrough","onloadeddata","onloadedmetadata","root$24","Audio$1","enable","style","hooksInfo","dispatch","audioRefTimeout","audioUrl","audioPaused","addAudioEventListener","eventInfo","ownerTag","instance","unsubscribeMedia","releaseAudio","syncAudio","source","onClick","root$23","AudioIcon","styleWidth","shadow","animated","icon","animationStep","SimpleAnimationSteps","root$22","root_1$9","root_2$6","AudioTag","clickContent","root$21","root_1$8","AudioPlaneTag","text$1","AudioTag_1","audioRef","root$20","MediaPlane","playIcon","autoplayConfig","getImageSize","getImageInfo","realWidth","realHeight","getKeyframeInfo","steps","keyframesRealWidth","keyframesRealHeight","keyframesWidth","keyframesHeight","perWidth","perHeight","fps","AnimationStyleManager","elementIndex","timing","loop","loopInterval","properties","seg","segProgress","segIndex","localProgress","transforms","styleKey","ref","keyframeName","propArrays","arr","totalDuration","activePercent","keyframeContent","percent","opacityStr","finalTransform","finalOpacityStr","hasScale","styleElement","applySvgAnimation","svgElement","styleManager","elementConfig","selector","htmlElement","clearSvgAnimation","nodeList","root$19","root_1$7","root_2$5","root_3$2","root_4$1","root_5$1","Icon","iconUrl","bgcolor","bgopacity","iconSteps","iconFps","iconRatio","iconScale","iconWidth","iconAnimation","hasIcon","isKeyframe","paramsWidth","getKeyframe","getImage","finalSize","wantedWidth","originWidth","originHeight","emitIconLoaded","svgContainer","svgHtml","currentSvgEl","svgMarkupCache","prevAnimationKey","isSvgUrl","loadSvgMarkup","cached","res","err","mountSvgAnimation","nextKey","$$source","fragment_3","fragment_4","styles_3","node_6","fragment_5","user_derived","alternate_1","fragment_6","fragment_7","styles_4","styles_5","root$18","root_1$6","LinkTag","iconLoaded","textTop","root$17","root_1$5","PanoramaIcon$1","finalWidth","root$16","PanoramaTag","root$15","CustomTag","rendererMap","renderer","destroyTemplate","import_classnames","root$14","root_1$4","root_2$4","Tag","isVisible","isHide","haveContent","contentTypeMap","temporaryState","lastVisibleState","lastUnfoldedState","exposureEmit","ModelTag","d_1","d_2","d_3","d_4","d_5","d_6","d_7","positions","loadPromise","model","gltf","prevObject","bgColor","cssMesh","clickEventDispose","svelte","getFloorMesh","box","autoPlayIntersectConfig","canAutoPlayByOcclusion","PlaneTag","floorBoxMap","containingFloors","allFloors","minDistance","nearestFloor","boxCenter","uniqueId","rectangle","rectangleMesh","helper","editorEnabled","needRemove","needCreate","needRefresh","updateObjectFit","canAutoPlay","videoPlane","onContentAdded","onPlay","onPause","videoElement","render","sculptDataToBoxPosition","heightVector","heightPoint","bottomPoints","topPoints","allPoints","xAxis","yAxis","zAxis","quaternion","euler","invertedQuaternion","boxLocalPoints","xs","ys","zs","BoxTag","userStyle","point1","point2","upVector","sculptData","handler","newPosition","unitBottomCorners","unitTopCorner","rawHeightPoint","vertices","rightmostVertex","projected","PolygonTag","v1","v2","polygon","vertex","pos","MAX_MASK_STYLES","STRICT_COLOR_MATCH","MaskNodeMaterial","uv","quarterTexel","samples","selectedStyle","bestScore","bestCoverage","bestOpacity","bestHighlight","exactMatch","sample","coverage","score","image","parseColor","hex","r","g","MaskTag","maskSource","meshKey","entry","colorKey","idx","s","tol","tolerance255","maskTexture","styleIndex","newStyle","cachedImageData","cachedTexture","getImageData","tex","canvas","ctx","originalRaycast","raycaster","imageData","pixel","intersects","blinkTarget","newMask","translation","highlightColor","oldKey","styleList","symbol","cacheKey","loadStartTime","abortController","textureLoader","loadTime","sourceDesc","memoryMB","totalRefCount","estimatedMemoryMB","cacheEntries","sizeMB","root$13","AudioPoint","handlePointClick","handleMouseEnter","handleMouseLeave","audioEventHandlers","$$args","root$12","root_1$3","root_2$3","TagPoint","isAudioTag","timeout","animating","setAnimating","foldDelay","tagPointClickHelper","handleTagPointClick","beforeHover","onHoverEnd","audioInstance","pointWidth","tagPopoverArrowDarkBottom","tagPopoverArrowDarkTop","tagPopoverArrowDarkLeft","tagPopoverArrowDarkRight","tagPopoverArrowLightBottom","tagPopoverArrowLightTop","tagPopoverArrowLightLeft","tagPopoverArrowLightRight","root$11","TagPopoverArrow","arrowImage","show","root$10","VideoIcon","linearGradient_1","stop_2","stop_3","root$9","PanoramaIcon","root$8","AudioPlayer","elapsedTime","root$7","root_1$2","root_2$2","root_3$1","root_4","root_5","root_6","root_7","root_8","root_9","root_10","root_11","root_12","root_13","TagPopup","isMarketingTag","defaultTheme","effectiveTheme","finalTitle","finalDescription","mediaRawUrl","isVideoMedia","isPanoramaMedia","isYouTubeVideo","isVimeoVideo","isExternalVideo","formattedVideoUrl","videoPlayerTitle","mediaCount","currentMediaIndex","marketingBrandTags","marketingTags","remainingCount","marketingPrice","marketingPriceUnit","placement","audioPlaying","audioCurrentTime","audioDuration","audioProgress","audioElapsedTime","smoothUpdateFrame","lastUpdateTime","smoothProgress","formatTime","mins","seconds","secs","getTargetProgress","smoothUpdate","timeSinceLastUpdate","estimatedCurrentTime","progressDiff","updateDisplayState","targetProgress","manageSmoothUpdate","handleAudioPlayerClick","mediaItem","videoUrl","vimeoId","h3","iframe","consequent_10","consequent_11","node_15","consequent_13","node_16","consequent_12","node_17","node_18","root$6","ArrowRightIcon","root$5","ShareIcon","root$4","root_1$1","root_2$1","TagPopoverToolBar","toolbar","closePopover","handleViewMore","handleShare","root$3","PopoverContent","showArrow","adjustedPlacement","root$2","TagPopover","arrow","transitionDuration","triggerElement","wrapperElement","popoverContainer","popoverContentElement","popoverContentElementRect","anchorPosition","fadeAndFly","u","calculateOptimalPlacement","baseSpace","viewportWidth","viewportHeight","topBoundary","bottomBoundary","rightBoundary","popoverWidth","popoverHeight","calculateAnchorPositionGlobal","triggerRect","closePopoverInternal","handleContentResize","handleClick","popoverEl","mounted","mountToContainer","root$1","root_1","root_2","root_3","TagItem","havePoint","hasPopoverContent","screenPosition","disable","hide","isHovering","hoverTimeout","hideTimeout","debounceTimeout","isMouseOverPopover","isMouseOverTagPoint","tagPointComponent","hoverState","setHoverStateDebounced","newState","handlePopoverMouseEnter","handlePopoverMouseLeave","trigger","getOrCreatePopoverContainer","root","TagContainer","popoverContainerEl","popoverZIndex","PLUGIN_NAME","PanoTagPluginController","\"__PANOTAGPLUGIN_DEBUG_LIST__\"","\"__PANOTAGPLUGIN_DEBUG__\"","wrapper","validTags","options","maskUrl","_tags","merge","globalConfig","contentTypeConfig","prevState","plugins","currentTag","oldTagData","maskUpdates","mask","maskTagsAtIndex","resizeObserverDisposer","observerELement","hideObserve","hideUnobserve","showObserve","showUnobserve","tempObject","startQuaternion","endQuaternion","anime","hasTagUnfolded","fiveEveryReadyListenerDisposer","partialProps","currentPanoIndex","tagPanoIndex","cacheStats"],"sources":["../../../node_modules/animejs/dist/modules/timeline/position.js","../../../node_modules/animejs/dist/modules/utils/random.js","../../../node_modules/animejs/dist/modules/utils/stagger.js","../../src/PanoTagPlugin/utils/addDebugPoints.ts","../../src/PanoTagPlugin/utils/noTypecheck.ts","../../src/PanoTagPlugin/utils/planeNormal.ts","../../src/PanoTagPlugin/utils/tag/tagCheck.ts","../../src/PanoTagPlugin/utils/tagPosition.ts","../../src/PanoTagPlugin/utils/checkRange.ts","../../src/PanoTagPlugin/utils/normalPositionToPositions.ts","../../src/PanoTagPlugin/utils/debounce.ts","../../src/PanoTagPlugin/utils/throttle.ts","../../src/PanoTagPlugin/utils/search.ts","../../src/PanoTagPlugin/utils/videoHelper.ts","../../src/PanoTagPlugin/utils/tag/format.ts","../../src/shared-utils/audio.ts","../../src/shared-utils/typescript/entries.ts","../../src/PanoTagPlugin/utils/tag/adaptConfig.ts","../../src/PanoTagPlugin/typings/tag/TagConfig.ts","../../src/PanoTagPlugin/utils/tag/calculateTagConfig.ts","../../src/PanoTagPlugin/tag.config.ts","../../src/shared-utils/math/pointsIsRectangle.ts","../../src/shared-utils/three/Quadrangle.ts","../../src/shared-utils/three/getPositionsByObjectFit.ts","../../src/shared-utils/three/FragmentTransparencyMaterial.ts","../../src/PanoTagPlugin/utils/model/TagMediaTextureCache.ts","../../src/PanoTagPlugin/utils/model/mediaPlane.ts","../../src/PanoTagPlugin/utils/Cache.ts","../../src/PanoTagPlugin/controller/TagUtil.ts","../../src/PanoTagPlugin/controller/TagRender.ts","../../src/PanoTagPlugin/utils/DebugUtil.ts","../../src/shared-utils/url/getUrl.ts","../../src/shared-utils/five/getFloorIndex.ts","../../src/PanoTagPlugin/utils/tag/getRaycasterStartPosition.ts","../../src/PanoTagPlugin/controller/Tag/BaseTag.ts","../../src/PanoTagPlugin/controller/Tag/PointTag.ts","../../src/shared-utils/CSS3DRender/CSS3DObject.ts","../../src/PanoTagPlugin/Components/Common/Line/Straight.svelte","../../src/PanoTagPlugin/Components/Common/Shadow.svelte","../../src/PanoTagPlugin/utils/constants.ts","../../src/PanoTagPlugin/Components/Common/Text/FlyText.svelte","../../src/PanoTagPlugin/Components/Common/Arrow.svelte","../../src/PanoTagPlugin/utils/doUtil.ts","../../src/PanoTagPlugin/Components/Common/Text/FlyMText.svelte","../../src/PanoTagPlugin/Components/Tag/TextTag/TextTag.svelte","../../src/PanoTagPlugin/utils/px2rem.ts","../../src/PanoTagPlugin/Components/Common/Text/MText.svelte","../../src/PanoTagPlugin/Components/Tag/TextTag/TextPlaneTag.svelte","../../src/PanoTagPlugin/Components/Tag/TextTag/index.svelte","../../src/PanoTagPlugin/Components/Common/Line/Polyline.svelte","../../src/PanoTagPlugin/Components/Common/Carousel.svelte","../../src/PanoTagPlugin/Components/Common/MediaItem.svelte","../../src/PanoTagPlugin/Components/Common/Media.svelte","../../src/PanoTagPlugin/Components/Tag/ImageTextTag.svelte","../../src/PanoTagPlugin/Components/Tag/Assets/marketingIcon.ts","../../src/PanoTagPlugin/Components/Tag/MarketingTag.svelte","../../src/PanoTagPlugin/utils/audio/AudioDiagnostics.ts","../../src/PanoTagPlugin/utils/audio/SharedAudio.ts","../../src/PanoTagPlugin/Components/Common/Audio.svelte","../../src/PanoTagPlugin/Components/Common/Icon/audioIcon.svelte","../../src/PanoTagPlugin/Components/Tag/AudioTag/AudioTag.svelte","../../src/PanoTagPlugin/Components/Tag/AudioTag/AudioPlaneTag.svelte","../../src/PanoTagPlugin/Components/Tag/AudioTag/index.svelte","../../src/PanoTagPlugin/Components/Tag/MediaPlane.svelte","../../src/PanoTagPlugin/utils/getImageInfo.ts","../../src/PanoTagPlugin/Components/Common/Icon/animationUtils.ts","../../src/PanoTagPlugin/Components/Common/Icon/Icon.svelte","../../src/PanoTagPlugin/Components/Tag/LinkTag.svelte","../../src/PanoTagPlugin/Components/Common/Icon/PanoramaIcon.svelte","../../src/PanoTagPlugin/Components/Tag/PanoramaTag.svelte","../../src/PanoTagPlugin/Components/Tag/CustomTag.svelte","../../src/PanoTagPlugin/Components/Tag/index.svelte","../../src/PanoTagPlugin/Components/Tag/index.svelte","../../src/PanoTagPlugin/controller/Tag/ModelTag.ts","../../src/shared-utils/five/getFloorMesh.ts","../../src/PanoTagPlugin/utils/tag/canAutoPlayByOcclusion.ts","../../src/PanoTagPlugin/controller/Tag/PlaneTag.ts","../../src/PanoTagPlugin/utils/sculptDataToBoxPosition.ts","../../src/PanoTagPlugin/controller/Tag/BoxTag.ts","../../src/PanoTagPlugin/controller/Tag/PolygonTag.ts","../../src/PanoTagPlugin/utils/model/MaskNodeMaterial.ts","../../src/PanoTagPlugin/controller/Tag/MaskTag.ts","../../src/PanoTagPlugin/Components/Tag/AudioTag/AudioPoint.svelte","../../src/PanoTagPlugin/Components/Common/TagPoint.svelte","../../src/PanoTagPlugin/Components/Common/Icon/tag-popover-arrow-base64.ts","../../src/PanoTagPlugin/Components/Common/TagPopover/TagPopoverArrow.svelte","../../src/PanoTagPlugin/Components/Common/VideoIcon.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/PanoramaIcon.svelte","../../src/PanoTagPlugin/Components/Common/AudioPlayer.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/TagPopup.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/ArrowRightIcon.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/ShareIcon.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/TagPopoverToolBar.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/PopoverContent.svelte","../../src/PanoTagPlugin/Components/Common/TagPopover/index.svelte","../../src/PanoTagPlugin/Components/TagItem.svelte","../../src/PanoTagPlugin/utils/popoverContainer.ts","../../src/PanoTagPlugin/Components/TagContainer.svelte","../../src/PanoTagPlugin/controller/index.ts"],"sourcesContent":["/**\n * Anime.js - timeline - ESM\n * @version v4.5.0\n * @license MIT\n * @copyright 2026 - Julian Garnier\n */\n\nimport { relativeValuesExecRgx, minValue } from '../core/consts.js';\nimport { isUnd, isNum, stringStartsWith, isNil } from '../core/helpers.js';\nimport { getRelativeValue } from '../core/values.js';\n\n/**\n * @import {\n * Tickable,\n * TimelinePosition,\n * } from '../types/index.js'\n*/\n\n/**\n * @import {\n * Timeline,\n * } from './timeline.js'\n*/\n\n/**\n * Timeline's children offsets positions parser\n * @param {Timeline} timeline\n * @param {String} timePosition\n * @return {Number}\n */\nconst getPrevChildOffset = (timeline, timePosition) => {\n if (stringStartsWith(timePosition, '<')) {\n const goToPrevAnimationOffset = timePosition[1] === '<';\n const prevAnimation = /** @type {Tickable} */(timeline._tail);\n const prevOffset = prevAnimation ? prevAnimation._offset + prevAnimation._delay : 0;\n return goToPrevAnimationOffset ? prevOffset : prevOffset + prevAnimation.duration;\n }\n};\n\n/**\n * @param {Timeline} timeline\n * @param {TimelinePosition} [timePosition]\n * @return {Number}\n */\nconst parseTimelinePosition = (timeline, timePosition) => {\n let tlDuration = timeline.iterationDuration;\n if (tlDuration === minValue) tlDuration = 0;\n if (isUnd(timePosition)) return tlDuration;\n if (isNum(+timePosition)) return +timePosition;\n const timePosStr = /** @type {String} */(timePosition);\n const tlLabels = timeline ? timeline.labels : null;\n const hasLabels = !isNil(tlLabels);\n const prevOffset = getPrevChildOffset(timeline, timePosStr);\n const hasSibling = !isUnd(prevOffset);\n const matchedRelativeOperator = relativeValuesExecRgx.exec(timePosStr);\n if (matchedRelativeOperator) {\n const fullOperator = matchedRelativeOperator[0];\n const split = timePosStr.split(fullOperator);\n const labelOffset = hasLabels && split[0] ? tlLabels[split[0]] : tlDuration;\n const parsedOffset = hasSibling ? prevOffset : hasLabels ? labelOffset : tlDuration;\n const parsedNumericalOffset = +split[1];\n return getRelativeValue(parsedOffset, parsedNumericalOffset, fullOperator[0]);\n } else {\n return hasSibling ? prevOffset :\n hasLabels ? !isUnd(tlLabels[timePosStr]) ? tlLabels[timePosStr] :\n tlDuration : tlDuration;\n }\n};\n\nexport { parseTimelinePosition };\n","/**\n * Anime.js - utils - ESM\n * @version v4.5.0\n * @license MIT\n * @copyright 2026 - Julian Garnier\n */\n\n/**\n * Generate a random number between optional min and max (inclusive) and decimal precision\n *\n * @callback RandomNumberGenerator\n * @param {Number} [min=0] - The minimum value (inclusive)\n * @param {Number} [max=1] - The maximum value (inclusive)\n * @param {Number} [decimalLength=0] - Number of decimal places to round to\n * @return {Number} A random number between min and max\n */\n\n/**\n * Generates a random number between min and max (inclusive) with optional decimal precision\n *\n * @type {RandomNumberGenerator}\n */\nconst random = (min = 0, max = 1, decimalLength = 0) => {\n const m = 10 ** decimalLength;\n return Math.floor((Math.random() * (max - min + (1 / m)) + min) * m) / m;\n};\n\nlet _seed = 0;\n\n/**\n * Creates a seeded pseudorandom number generator function\n *\n * @param {Number} [seed] - The seed value for the random number generator\n * @param {Number} [seededMin=0] - The minimum default value (inclusive) of the returned function\n * @param {Number} [seededMax=1] - The maximum default value (inclusive) of the returned function\n * @param {Number} [seededDecimalLength=0] - Default number of decimal places to round to of the returned function\n * @return {RandomNumberGenerator} A function to generate a random number between optional min and max (inclusive) and decimal precision\n */\nconst createSeededRandom = (seed, seededMin = 0, seededMax = 1, seededDecimalLength = 0) => {\n let t = seed === undefined ? _seed++ : seed;\n return (min = seededMin, max = seededMax, decimalLength = seededDecimalLength) => {\n t += 0x6D2B79F5;\n t = Math.imul(t ^ t >>> 15, t | 1);\n t ^= t + Math.imul(t ^ t >>> 7, t | 61);\n const m = 10 ** decimalLength;\n return Math.floor(((((t ^ t >>> 14) >>> 0) / 4294967296) * (max - min + (1 / m)) + min) * m) / m;\n }\n};\n\n/**\n * Picks a random element from an array or a string\n *\n * @template T\n * @param {String|Array<T>} items - The array or string to pick from\n * @return {String|T} A random element from the array or character from the string\n */\nconst randomPick = items => items[random(0, items.length - 1)];\n\n/**\n * Shuffles an array in-place using the Fisher-Yates algorithm\n * Adapted from https://bost.ocks.org/mike/shuffle/\n *\n * @param {Array} items - The array to shuffle (will be modified in-place)\n * @param {RandomNumberGenerator} [rnd] - Optional RNG matching the random() signature (defaults to random)\n * @return {Array} The same array reference, now shuffled\n */\nconst shuffle = (items, rnd = random) => {\n let m = items.length, t, i;\n while (m) { i = rnd(0, --m); t = items[m]; items[m] = items[i]; items[i] = t; }\n return items;\n};\n\nexport { createSeededRandom, random, randomPick, shuffle };\n","/**\n * Anime.js - utils - ESM\n * @version v4.5.0\n * @license MIT\n * @copyright 2026 - Julian Garnier\n */\n\nimport { unitsExecRgx, emptyString } from '../core/consts.js';\nimport { isUnd, parseNumber, isFnc, isNum, sqrt, abs, floor, round, isArr, isStr } from '../core/helpers.js';\nimport { parseEase } from '../easings/eases/parser.js';\nimport { parseTimelinePosition } from '../timeline/position.js';\nimport { getOriginalAnimatableValue } from '../core/values.js';\nimport { registerTargets } from '../core/targets.js';\nimport { createSeededRandom, random, shuffle } from './random.js';\n\n/**\n * @import {\n * StaggerParams,\n * StaggerFunction,\n * JSTarget,\n * } from '../types/index.js'\n*/\n\n/**\n * @import {\n * Spring,\n * } from '../easings/spring/index.js'\n*/\n\n/**\n * @overload\n * @param {Number} val\n * @param {StaggerParams} [params]\n * @return {StaggerFunction<Number>}\n */\n\n/**\n * @overload\n * @param {String} val\n * @param {StaggerParams} [params]\n * @return {StaggerFunction<String>}\n */\n\n/**\n * @overload\n * @param {[Number, Number]} val\n * @param {StaggerParams} [params]\n * @return {StaggerFunction<Number>}\n */\n\n/**\n * @overload\n * @param {[String, String]} val\n * @param {StaggerParams} [params]\n * @return {StaggerFunction<String>}\n */\n\n/**\n * @param {Number|String|[Number, Number]|[String, String]} val The staggered value or range\n * @param {StaggerParams} [params] The stagger parameters\n * @return {StaggerFunction<Number|String>}\n */\nconst stagger = (val, params = {}) => {\n let values = [];\n let maxValue = 0;\n let cachedOffset;\n let jitterSamples = null;\n const from = params.from;\n const reversed = params.reversed;\n const ease = params.ease;\n const hasEasing = !isUnd(ease);\n const hasSpring = hasEasing && !isUnd(/** @type {Spring} */(ease).ease);\n const staggerEase = hasSpring ? /** @type {Spring} */(ease).ease : hasEasing ? parseEase(ease) : null;\n const grid = params.grid;\n const autoGrid = grid === true;\n const axis = params.axis;\n const customTotal = params.total;\n const fromFirst = isUnd(from) || from === 0 || from === 'first';\n const fromCenter = from === 'center';\n const fromLast = from === 'last';\n const fromRandom = from === 'random';\n const fromArr = isArr(from);\n const isRange = isArr(val);\n const useProp = params.use;\n const val1 = isRange ? parseNumber(val[0]) : parseNumber(val);\n const val2 = isRange ? parseNumber(val[1]) : 0;\n const unitMatch = unitsExecRgx.exec((isRange ? val[1] : val) + emptyString);\n const start = params.start || 0 + (isRange ? val1 : 0);\n const seed = params.seed;\n const hasSeed = !isUnd(seed) && seed !== false;\n const rng = hasSeed ? createSeededRandom(seed === true ? 0 : /** @type {Number} */(seed)) : random;\n const jitter = params.jitter;\n const hasJitter = !isUnd(jitter);\n const jitterIsArr = isArr(jitter);\n const jitterStart = jitterIsArr ? /** @type {[Number,Number]} */(jitter)[0] : /** @type {Number} */(jitter) || 0;\n const jitterEnd = jitterIsArr ? /** @type {[Number,Number]} */(jitter)[1] : /** @type {Number} */(jitter) || 0;\n let fromIndex = fromFirst ? 0 : isNum(from) ? from : 0;\n return (target, i, t, _, tl) => {\n const [ registeredTarget ] = registerTargets(target);\n const total = isUnd(customTotal) ? t.length : customTotal;\n const customIndex = !isUnd(useProp) ? isFnc(useProp) ? useProp(registeredTarget, i, total) : getOriginalAnimatableValue(registeredTarget, useProp) : false;\n const customIdx = isNum(customIndex) || isStr(customIndex) && isNum(+customIndex) ? +customIndex : i;\n // Fall back to the natural index when the resolved value lands outside [0, total) so values[staggerIndex] never reads undefined.\n const staggerIndex = customIdx >= 0 && customIdx < total ? customIdx : i;\n if (fromCenter) fromIndex = (total - 1) / 2;\n if (fromLast) fromIndex = total - 1;\n if (!values.length) {\n if (autoGrid) {\n let hasPositions = true;\n let has3D = false;\n let minPosX = Infinity;\n let minPosY = Infinity;\n let minPosZ = Infinity;\n let maxPosX = -Infinity;\n let maxPosY = -Infinity;\n let maxPosZ = -Infinity;\n const pxArr = [];\n const pyArr = [];\n const pzArr = [];\n for (let index = 0; index < total; index++) {\n const el = t[index];\n let px = 0;\n let py = 0;\n let pz = 0;\n let found = false;\n if (el && isFnc(el.getBoundingClientRect)) {\n const rect = el.getBoundingClientRect();\n px = rect.left + rect.width / 2;\n py = rect.top + rect.height / 2;\n found = true;\n } else {\n const obj = /** @type {JSTarget} */(el);\n if (obj && isNum(obj.x) && isNum(obj.y)) {\n px = obj.x;\n py = obj.y;\n if (isNum(obj.z)) {\n pz = obj.z;\n has3D = true;\n }\n found = true;\n }\n }\n if (!found) {\n hasPositions = false;\n break;\n }\n pxArr.push(px);\n pyArr.push(py);\n pzArr.push(pz);\n if (px < minPosX) minPosX = px;\n if (py < minPosY) minPosY = py;\n if (pz < minPosZ) minPosZ = pz;\n if (px > maxPosX) maxPosX = px;\n if (py > maxPosY) maxPosY = py;\n if (pz > maxPosZ) maxPosZ = pz;\n }\n if (hasPositions) {\n let fX = pxArr[0];\n let fY = pyArr[0];\n let fZ = pzArr[0];\n if (fromArr) {\n fX = minPosX + from[0] * (maxPosX - minPosX);\n fY = minPosY + from[1] * (maxPosY - minPosY);\n fZ = has3D ? minPosZ + (from.length >= 3 ? from[2] : 0.5) * (maxPosZ - minPosZ) : 0;\n } else if (fromCenter) {\n fX = (minPosX + maxPosX) / 2;\n fY = (minPosY + maxPosY) / 2;\n fZ = (minPosZ + maxPosZ) / 2;\n } else if (fromLast) {\n fX = pxArr[total - 1];\n fY = pyArr[total - 1];\n fZ = pzArr[total - 1];\n } else if (isNum(from)) {\n fX = pxArr[from];\n fY = pyArr[from];\n fZ = pzArr[from];\n }\n for (let index = 0; index < total; index++) {\n const distanceX = fX - pxArr[index];\n const distanceY = fY - pyArr[index];\n const distanceZ = fZ - pzArr[index];\n let value = sqrt(distanceX * distanceX + distanceY * distanceY + (has3D ? distanceZ * distanceZ : 0));\n if (axis === 'x') value = -distanceX;\n if (axis === 'y') value = -distanceY;\n if (axis === 'z') value = -distanceZ;\n values.push(value);\n }\n let minDist = Infinity;\n for (let index = 0; index < total; index++) {\n const absVal = abs(values[index]);\n if (absVal > 0 && absVal < minDist) minDist = absVal;\n }\n if (minDist > 0 && minDist < Infinity) {\n for (let index = 0; index < total; index++) {\n values[index] = values[index] / minDist;\n }\n }\n } else {\n for (let index = 0; index < total; index++) {\n values.push(abs(fromIndex - index));\n }\n }\n } else {\n for (let index = 0; index < total; index++) {\n if (!grid) {\n values.push(abs(fromIndex - index));\n } else {\n const dims = grid.length;\n const wh = grid[0] * grid[1];\n let fromX, fromY, fromZ;\n if (fromArr) {\n fromX = from[0] * (grid[0] - 1);\n fromY = from[1] * (grid[1] - 1);\n fromZ = dims === 3 ? (from.length >= 3 ? from[2] : 0.5) * (grid[2] - 1) : 0;\n } else if (fromCenter) {\n fromX = (grid[0] - 1) / 2;\n fromY = (grid[1] - 1) / 2;\n fromZ = dims === 3 ? (grid[2] - 1) / 2 : 0;\n } else {\n fromX = fromIndex % grid[0];\n fromY = floor(fromIndex / grid[0]) % grid[1];\n fromZ = dims === 3 ? floor(fromIndex / wh) : 0;\n }\n const toX = index % grid[0];\n const toY = floor(index / grid[0]) % grid[1];\n const toZ = dims === 3 ? floor(index / wh) : 0;\n const distanceX = fromX - toX;\n const distanceY = fromY - toY;\n const distanceZ = fromZ - toZ;\n let value = sqrt(distanceX * distanceX + distanceY * distanceY + (dims === 3 ? distanceZ * distanceZ : 0));\n if (axis === 'x') value = -distanceX;\n if (axis === 'y') value = -distanceY;\n if (axis === 'z') value = -distanceZ;\n values.push(value);\n }\n }\n }\n maxValue = values[0];\n for (let k = 1; k < total; k++) if (values[k] > maxValue) maxValue = values[k];\n if (staggerEase || reversed) {\n for (let k = 0; k < total; k++) {\n let v = values[k];\n if (staggerEase) v = staggerEase(v / maxValue) * maxValue;\n if (reversed) v = axis ? -v : abs(maxValue - v);\n values[k] = v;\n }\n }\n if (hasJitter) {\n jitterSamples = new Array(total);\n for (let k = 0; k < total; k++) jitterSamples[k] = rng(-1, 1, 4);\n }\n if (fromRandom) values = shuffle(values, rng);\n }\n const spacing = isRange ? (val2 - val1) / maxValue : val1;\n if (isUnd(cachedOffset)) {\n cachedOffset = tl ? parseTimelinePosition(tl, isUnd(params.start) ? tl.iterationDuration : start) : /** @type {Number} */(start);\n }\n /** @type {String|Number} */\n let output = cachedOffset + ((spacing * round(values[staggerIndex], 2)) || 0);\n if (hasJitter) {\n const progress = maxValue ? values[staggerIndex] / maxValue : 0;\n const mag = jitterStart + (jitterEnd - jitterStart) * progress;\n output = /** @type {Number} */(output) + jitterSamples[staggerIndex] * mag;\n }\n if (params.modifier) output = params.modifier(/** @type {Number} */(output));\n if (unitMatch) output = `${output}${unitMatch[2]}`;\n return output;\n }\n};\n\nexport { stagger };\n","import type { Five } from '@realsee/five-webgpu'\nimport * as THREE from 'three/webgpu'\nimport type { Tag, BoxPosition } from '../typings'\nimport { arrayPositionToVector3 } from '../../shared-utils/positionToVector3'\n\nexport function addDebugPoints(five: Five, tags: Tag[]) {\n tags.forEach((tag) => {\n const geometry = new THREE.SphereGeometry(0.02, 16, 16)\n const spheres = []\n const materials = [\n new THREE.MeshBasicMaterial({ color: 0xffff00 }), // 黄\n new THREE.MeshBasicMaterial({ color: 0xff00ff }), // 粉\n new THREE.MeshBasicMaterial({ color: 0xff0000 }), // 红\n new THREE.MeshBasicMaterial({ color: 0x00ffff }), // 蓝\n ]\n\n // 处理 3DBox 类型\n if (tag.stickType === '3DBox') {\n const boxPosition = tag.position as unknown as BoxPosition\n if (boxPosition?.start && boxPosition?.end) {\n // 显示 start 点(黄色)和 end 点(粉色)\n const startSphere = new THREE.Mesh(geometry, materials[0]!)\n startSphere.position.copy(arrayPositionToVector3(boxPosition.start as any))\n spheres.push(startSphere)\n\n const endSphere = new THREE.Mesh(geometry, materials[1]!)\n endSphere.position.copy(arrayPositionToVector3(boxPosition.end as any))\n spheres.push(endSphere)\n }\n } else if (tag.stickType === 'Polygon') {\n // 处理 Polygon 类型 - 显示所有顶点\n const polygonPosition = tag.position as any[]\n if (Array.isArray(polygonPosition) && polygonPosition.length > 0) {\n polygonPosition.forEach((p, index) => {\n const material = materials[index % materials.length]!\n const sphere = new THREE.Mesh(geometry, material)\n sphere.position.copy(arrayPositionToVector3(p))\n spheres.push(sphere)\n })\n }\n } else if (Array.isArray(tag.position) && tag.position.length === 4) {\n tag.position.forEach((p, index) => {\n const material = materials[index]!\n const sphere = new THREE.Mesh(geometry, material)\n sphere.position.copy(arrayPositionToVector3(p))\n spheres.push(sphere)\n })\n } else if (Array.isArray(tag.position)) {\n const material = materials[0]!\n const sphere = new THREE.Mesh(geometry, material)\n sphere.position.copy(arrayPositionToVector3(tag.position as any))\n spheres.push(sphere)\n }\n\n spheres.forEach((sphere) => {\n sphere.material.depthTest = false\n five.scene.add(sphere)\n })\n })\n}\n","export const noTypecheck = <T = any>(x: T) => x as any\n","import type { Vector3 } from 'three/webgpu'\nimport { anyPositionToVector3, type AnyPosition } from '../../shared-utils/positionToVector3'\n\nexport function planeNormal(points: [AnyPosition, AnyPosition, AnyPosition] | [AnyPosition, AnyPosition, AnyPosition, AnyPosition]): Vector3\nexport function planeNormal(points: AnyPosition[]): Vector3 | void\nexport function planeNormal(points: AnyPosition[]) {\n if (!points) return\n if (points.length < 3) return\n const vector3Points = points.map(anyPositionToVector3) as [Vector3, Vector3, Vector3]\n const vector01 = vector3Points[1].clone().sub(vector3Points[0]) // 点0 -> 点1 的向量\n const vector12 = vector3Points[2].clone().sub(vector3Points[1]) // 点1 -> 点2 的向量\n return vector01.cross(vector12)\n}\n","import type { TagContentType, TagInstance } from '../../typings'\nimport type { ModelTagInterface } from '../../controller/Tag/ModelTag'\nimport type { PlaneTagInterface } from '../../controller/Tag/PlaneTag'\nimport type { PolygonTagInterface } from '../../controller/Tag/PolygonTag'\nimport type { BoxTagInterface } from '../../controller/Tag/BoxTag'\nimport type { MaskTagInterface } from '../../controller/Tag/MaskTag'\n\nexport function isPlaneTag<T extends TagContentType>(tag: TagInstance<T>): tag is PlaneTagInterface<T> {\n return tag.stickType === 'Plane'\n}\n\nexport function isPoint3DTag<T extends TagContentType>(tag: TagInstance<T>): tag is TagInstance<T, '3DPoint'> {\n return tag.stickType === '3DPoint'\n}\n\nexport function is3DTag<T extends TagContentType>(tag: TagInstance): tag is TagInstance<T, '3DPoint'> | TagInstance<T, 'Plane'> {\n return tag.stickType === '3DPoint' || tag.stickType === 'Plane'\n}\n\nexport function isMediaModelTag(tag: TagInstance): tag is ModelTagInterface<'MediaModel'> {\n return tag.stickType === 'Model' && tag.contentType === 'MediaModel'\n}\n\nexport function isModelTag(tag: TagInstance): tag is ModelTagInterface<'Model'> {\n return tag.stickType === 'Model' && tag.contentType === 'Model'\n}\n\n/** 虚拟模型标签(空间三维对象,渲染同纯模型) */\nexport function isVirtualObjectTag(tag: TagInstance): tag is ModelTagInterface<'VirtualObject'> {\n return tag.stickType === 'Model' && tag.contentType === 'VirtualObject'\n}\n\n/** 可自动转向用户的模型标签:纯模型(Model) 或 虚拟模型(VirtualObject) */\nexport function isAutoLookAtModelTag(tag: TagInstance): tag is ModelTagInterface<'Model'> | ModelTagInterface<'VirtualObject'> {\n return isModelTag(tag) || isVirtualObjectTag(tag)\n}\n\nexport function isMediaPlaneTag(tag: TagInstance): tag is PlaneTagInterface<'MediaModel'> {\n return tag.stickType === 'Plane' && tag.contentType === 'MediaPlane'\n}\nexport function isPolygonTag(tag: TagInstance): tag is PolygonTagInterface {\n return tag.stickType === 'Polygon'\n}\nexport function is3DBoxTag(tag: TagInstance): tag is BoxTagInterface {\n return tag.stickType === '3DBox'\n}\nexport function isMaskTag(tag: TagInstance): tag is MaskTagInterface {\n return tag.stickType === 'Mask'\n}\n","import type { Vector3 } from 'three/webgpu'\nimport { Matrix4, Vector3 as ThreeVector3, Euler } from 'three/webgpu'\nimport { centerPoint } from '../../shared-utils/three/centerPoint'\nimport { is3DBoxTag, isMediaModelTag, isPolygonTag, isMaskTag } from './tag/tagCheck'\nimport { anyPositionToVector3, vector3Position } from '../../shared-utils/positionToVector3'\nimport type { TagInstance, BoxPosition } from '../typings'\nimport { transformPosition } from '../../shared-utils/five/transformPosition'\n\n/**\n * 计算 BoxPosition 的8个角点\n */\nexport function getBoxCorners(boxPosition: BoxPosition, transform: Matrix4): Vector3[] {\n const start = anyPositionToVector3(boxPosition.start)\n const end = anyPositionToVector3(boxPosition.end)\n const rotation = new Euler().fromArray(boxPosition.rotation as [number, number, number])\n\n const center = transformPosition(new ThreeVector3((start.x + end.x) / 2, (start.y + end.y) / 2, (start.z + end.z) / 2), transform)\n const halfSize = new ThreeVector3(Math.abs(end.x - start.x) / 2, Math.abs(end.y - start.y) / 2, Math.abs(end.z - start.z) / 2)\n\n // 构建旋转矩阵\n const rotationMatrix = new Matrix4().makeRotationFromEuler(rotation)\n\n // 单位立方体的8个角点(未缩放、未旋转、未平移)\n const unitCorners = [\n // 底面4个点 (y = -0.5)\n new ThreeVector3(-0.5, -0.5, -0.5),\n new ThreeVector3(0.5, -0.5, -0.5),\n new ThreeVector3(0.5, -0.5, 0.5),\n new ThreeVector3(-0.5, -0.5, 0.5),\n // 顶面4个点 (y = 0.5)\n new ThreeVector3(-0.5, 0.5, -0.5),\n new ThreeVector3(0.5, 0.5, -0.5),\n new ThreeVector3(0.5, 0.5, 0.5),\n new ThreeVector3(-0.5, 0.5, 0.5),\n ]\n\n // 缩放并应用旋转和平移\n const size = halfSize.clone().multiplyScalar(2)\n const corners = unitCorners.map((corner) => {\n return corner.clone().multiply(size).applyMatrix4(rotationMatrix).add(center)\n })\n\n return corners\n}\n\n/**\n * 应用 matrix 变换到点数组\n */\nexport function applyMatrixToPoints(points: Vector3[], matrix?: number[]): Vector3[] {\n if (!matrix) return points\n\n const matrix4 = new Matrix4().fromArray(matrix)\n return points.map((point) => point.clone().applyMatrix4(matrix4))\n}\n\nexport function getTagPosition(tag: TagInstance): Vector3 | [Vector3, Vector3, Vector3, Vector3] | Vector3[] {\n const position = (() => {\n // 3DBox: 返回8个角点\n if (is3DBoxTag(tag) && tag.position) {\n const corners = getBoxCorners(tag.position as BoxPosition, tag.plugin?.workUtil?.transform)\n return applyMatrixToPoints(corners, tag.matrix)\n }\n\n // Polygon: 返回所有顶点\n if (isPolygonTag(tag) && tag.position) {\n const points = tag.position.map((p) => anyPositionToVector3(p))\n return applyMatrixToPoints(points, tag.matrix)\n }\n\n // MediaModel: 使用 mediaPosition\n if (isMediaModelTag(tag) && tag.matrix) {\n const points = tag.data.mediaPosition.map((p) => anyPositionToVector3(p))\n return applyMatrixToPoints(points, tag.matrix)\n }\n\n // Mask: 直接使用 position 字段(创建标签时已提供)\n if (isMaskTag(tag)) {\n if (tag.position && Array.isArray(tag.position)) {\n return anyPositionToVector3(tag.position)\n }\n // 如果没有 position,返回原点(这种情况不应该发生)\n console.warn('[getTagPosition] Mask tag without position, tag id:', tag.id)\n return new ThreeVector3(0, 0, 0)\n }\n\n // 其他类型: 直接返回 position\n return tag.position as Exclude<TagInstance['position'], BoxPosition>\n })()\n\n return vector3Position(position) as Vector3 | [Vector3, Vector3, Vector3, Vector3]\n}\n\nexport function getTagCenterPosition(tag: TagInstance) {\n const tagPosition = getTagPosition(tag)\n return centerPoint(...(Array.isArray(tagPosition) ? tagPosition : [tagPosition]))\n}\n","export function checkRange(value?: number, range?: { min?: number; max?: number }) {\n if (value === undefined) return\n const { min, max } = range ?? {}\n if (min === undefined && max === undefined) return\n if (typeof max === 'number' && max < value) return false\n if (typeof min === 'number' && min > value) return false\n return true\n}\n","import type { Vector3 } from 'three/webgpu'\nimport * as THREE from 'three/webgpu'\n\nexport function normalPositionToPositions(cameraPosition: Vector3, position: Vector3, normal: Vector3) {\n const squareHalfSize = 0.01\n const plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, position)\n const right = position.clone().sub(cameraPosition).cross(new THREE.Vector3(0, 1, 0)).setLength(squareHalfSize)\n const top = new THREE.Vector3(0, squareHalfSize, 0)\n const positions = [\n position.clone().sub(right).sub(top), // 左下\n position.clone().add(right).sub(top), // 右下\n position.clone().add(right).add(top), // 右上\n position.clone().sub(right).add(top), // 左上\n ].map((v) => plane.projectPoint(v, new THREE.Vector3())) as [Vector3, Vector3, Vector3, Vector3]\n\n return positions\n}\n","/**\n * 函数防抖:指触发事件后,在 `n` 秒内函数只能执行一次,如果触发事件后在 `n` 秒内又触发了事件,则会重新计算函数延执行时间。\n * @param callback 回调函数\n * @param waitFor 等待时间\n * @returns\n */\nexport const debounce = <F extends (...args: any) => any>(\n callback: F,\n waitFor = 1000 / 60,\n): ((...args: Parameters<F>) => ReturnType<F>) => {\n let timer: number | NodeJS.Timeout | null = null\n const savedFunc = callback\n\n const fn = (...args: any) => {\n if (timer) clearTimeout(timer)\n timer = setTimeout(() => {\n savedFunc?.(...args)\n if (timer) clearTimeout(timer)\n timer = null\n }, waitFor)\n }\n return fn as (...args: Parameters<F>) => ReturnType<F>\n}\n\nconst debounceMap = new Map<string, { debounceFn: Function; originalCallback: Function }>()\n\nexport const debounceByKey = <F extends (...args: any) => any>(\n key: string,\n callback: F,\n waitFor = 1000 / 60,\n): ((...args: Parameters<F>) => ReturnType<F>) => {\n if (debounceMap.has(key) && debounceMap.get(key).originalCallback === callback) {\n return debounceMap.get(key).debounceFn as (...args: Parameters<F>) => ReturnType<F>\n }\n const fn = debounce(callback, waitFor)\n debounceMap.set(key, {\n debounceFn: fn,\n originalCallback: callback,\n })\n return fn\n}\n","/**\n * 创建一个防抖动函数,该函数在高频调用时会每隔 wait 毫秒后调用 func 方法\n * `throttle` 会在第一次调用时立刻调用一次\n * @param func - 要防抖动的函数\n * @param wait - 需要延迟的毫秒数\n */\nexport function throttle<T>(func: (...args: T[]) => void, wait = 200) {\n let last: NodeJS.Timeout | null\n return function (this: any, ...args: T[]) {\n if (last) return\n func.apply(this, args)\n last = setTimeout(function () {\n last = null\n }, wait)\n }\n}\n","/**\n * 二分查找,查找第一个大于等于给定值的元素\n * 数组必须有序,存在重复\n * @param {array} arr 待排序数组\n * @param {number} target 目标数据\n */\nexport function binarySearchFirstBig(getValueByIndex: (index: number) => number, indexRange: [number, number], target: number) {\n const [min, max] = indexRange\n if (min >= max) return -1\n if (max <= 1) return -1\n // 低位下标\n let lowIndex = min\n // 高位下标\n let highIndex = max\n\n const cache: Record<number, number> = {}\n\n const getValue = (key: number) => {\n if (!cache[key]) cache[key] = getValueByIndex(key)\n return cache[key]!\n }\n\n while (lowIndex <= highIndex) {\n // 中间下标\n const midIndex = Math.floor((lowIndex + highIndex) / 2)\n if (getValue(midIndex) > target) {\n // 如果 midIndex 为0或者前一个数小于 target 那么找到第一个大于等于给定值的元素,直接返回\n if (midIndex === min || getValue(midIndex - 1)! <= target) return midIndex\n // 否则高位下标为中位下标减1\n highIndex = midIndex - 1\n } else {\n // 低位下标为中位下标加1\n lowIndex = midIndex + 1\n }\n }\n return -1\n}\n\n/**\n * @description 查找第一个小于前一个数字的值\n */\nexport function searchFirstValueSmallThanLastValue(getValueByIndex: (index: number) => number, indexRange: [number, number]) {\n const [min, max] = indexRange\n if (min >= max) return -1\n if (max <= 1) return -1\n if (min <= 1) return -1\n const cache: Record<number, number> = {}\n\n const getValue = (key: number) => {\n if (!cache[key]) cache[key] = getValueByIndex(key)\n return cache[key]!\n }\n\n for (let index = min; index < max; index++) {\n const value = getValue(index)\n const lastValue = getValue(index - 1)\n if (value < lastValue) {\n return index\n }\n }\n return -1\n}\n","/**\n * 视频URL处理辅助函数\n * 用于处理YouTube和Vimeo视频URL的解析和格式化\n */\n\n/**\n * 从YouTube URL中提取视频ID\n * @param url YouTube视频URL\n * @returns 视频ID或null(如果不是有效的YouTube URL)\n */\nexport function getYouTubeId(url: string) {\n // 如果URL为空,直接返回null\n if (!url) return null;\n \n // 尝试使用URL对象解析(现代浏览器支持的方式)\n try {\n // 1. 处理youtu.be短链接\n if (url.includes('youtu.be')) {\n const urlObj = new URL(url);\n // 提取路径中的ID,去掉开头的斜杠\n return urlObj.pathname.substring(1);\n }\n \n // 2. 处理youtube.com标准链接\n if (url.includes('youtube.com')) {\n const urlObj = new URL(url);\n \n // 2.1 常规watch链接,使用v参数\n const urlParams = new URLSearchParams(urlObj.search);\n const vParam = urlParams.get('v');\n if (vParam) return vParam;\n \n // 2.2 处理embed链接\n if (urlObj.pathname.includes('/embed/')) {\n return urlObj.pathname.split('/embed/')[1];\n }\n \n // 2.3 处理shorts链接\n if (urlObj.pathname.includes('/shorts/')) {\n return urlObj.pathname.split('/shorts/')[1];\n }\n \n // 2.4 处理直播链接\n if (urlObj.pathname.includes('/live/')) {\n return urlObj.pathname.split('/live/')[1];\n }\n }\n } catch (e) {\n // URL解析失败,使用后备方案\n }\n \n // 后备方案:使用正则表达式(兼容旧版浏览器和各种URL格式)\n // 这个正则表达式涵盖了几乎所有YouTube URL格式:标准、嵌入、短链接、shorts、直播等\n const regex = /^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|live\\/)|(?:(?:watch)?\\?v(?:i)?=|\\&v(?:i)?=))([^#\\&\\?]*).*/;\n const match = url.match(regex);\n return match && match[1] ? match[1] : null;\n}\n\n/**\n * 从Vimeo URL中提取视频ID\n * @param url Vimeo视频URL\n * @returns 视频ID或null(如果不是有效的Vimeo URL)\n */\nexport function getVimeoId(url: string) {\n if (!url) return null;\n \n // 尝试使用URL对象解析\n try {\n if (url.includes('vimeo.com')) {\n const urlObj = new URL(url);\n // Vimeo ID在路径名中,通常是数字\n const pathParts = urlObj.pathname.split('/').filter(Boolean);\n if (pathParts.length > 0) {\n const potentialId = pathParts[0];\n // Vimeo ID都是数字,且通常至少5位\n if (/^\\d+$/.test(potentialId) && potentialId.length >= 5) {\n return potentialId;\n }\n }\n }\n } catch (e) {\n // URL解析失败,使用后备方案\n }\n \n // 后备方案:使用正则表达式\n const regExp = /^.*vimeo\\.com\\/[A-Za-z\\/]*(\\d+)/;\n const match = url.match(regExp);\n return match && match[1] && match[1].length >= 5 ? match[1] : null;\n}\n\n/**\n * 判断URL是否为YouTube视频链接\n * @param url 要检查的URL\n * @returns 是否为YouTube链接\n */\nexport function isYouTube(url: string) {\n if (!url) return false;\n const pattern = /^(http(s)?:\\/\\/)?((w){3}.)?youtu(be|.be)?(\\.com)?\\/.+/;\n return pattern.test(url);\n}\n\n/**\n * 判断URL是否为Vimeo视频链接\n * @param url 要检查的URL\n * @returns 是否为Vimeo链接\n */\nexport function isVimeo(url: string) {\n if (!url) return false;\n const pattern = /^(http(s)?:\\/\\/)?((w){3}.)?vimeo\\.com\\/(.+)/;\n return pattern.test(url);\n}\n\n/**\n * 格式化视频URL为嵌入格式\n * @param url 原始视频URL\n * @param config 配置选项,如自动播放、开始时间等\n * @returns 格式化后的嵌入URL\n */\nexport function formatVideo(url: string, config?: { start?: number; autoplay?: 0 | 1 }) {\n if (isYouTube(url)) {\n const videoId = getYouTubeId(url);\n if (!videoId) return '';\n const embedUrl = new URL(`https://www.youtube.com/embed/${videoId}`);\n if (config?.start !== undefined) embedUrl.searchParams.set('start', config.start.toString());\n if (config?.autoplay !== undefined) embedUrl.searchParams.set('autoplay', config.autoplay.toString());\n return embedUrl.toString();\n }\n \n if (isVimeo(url)) {\n const videoId = getVimeoId(url);\n if (!videoId) return '';\n const embedUrl = new URL(`https://player.vimeo.com/video/${videoId}`);\n if (config?.autoplay !== undefined) embedUrl.searchParams.set('autoplay', config.autoplay.toString());\n return embedUrl.toString();\n }\n \n return url;\n}\n\n/**\n * 获取视频缩略图URL\n * @param url 视频URL\n * @param type 视频类型 ('youtube' | 'vimeo')\n * @returns 缩略图URL或null\n */\nexport function getVideoThumbnail(url: string, type?: 'youtube' | 'vimeo') {\n // 自动检测类型(如果未提供)\n if (!type) {\n if (isYouTube(url)) type = 'youtube';\n else if (isVimeo(url)) type = 'vimeo';\n else return null;\n }\n \n if (type === 'youtube') {\n const videoId = getYouTubeId(url);\n if (!videoId) return null;\n return `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`;\n }\n \n if (type === 'vimeo') {\n const videoId = getVimeoId(url);\n if (!videoId) return null;\n return `https://vumbnail.com/${videoId}.jpg`;\n }\n \n return null;\n} ","import type { StickType, Tag } from '../../typings'\nimport { PANO_TAG_DEFAULT_LINK_ICON } from '../../../shared-utils'\n\nexport function getTagStickType(tag: Tag): StickType {\n if (tag.stickType) return tag.stickType\n return '2DPoint'\n}\n\nexport default function formatTag<T extends Tag>(tag: T): tag is T & { stickType: StickType } {\n if (!tag.stickType) {\n tag.stickType = getTagStickType(tag)\n }\n if (tag.contentType === 'VRLink' || tag.contentType === 'PanoLink' || tag.contentType === 'Link') {\n const linkTag = tag as Tag<'Link'>\n if (!linkTag.data?.icon?.url && !linkTag.style?.point?.url) {\n linkTag.data.icon = {\n url: PANO_TAG_DEFAULT_LINK_ICON,\n }\n }\n }\n\n return tag as any\n}\n","const BlankAudioSrc =\n 'data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAADAAAGhgBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr///////////////////////////////////////////8AAAA5TEFNRTMuOThyAc0AAAAAAAAAABSAJAiqQgAAgAAABobxtI73AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//uQxAACFEII9ACZ/sJZwWEoEb8w/////N//////JcxjHjf+7/v/H2PzCCFAiDtGeyBCIx7bJJ1mmEEMy6g8mm2c8nrGABB4h2Mkmn//4z/73u773R5qHHu/j/w7Kxkzh5lWRWdsifCkNAnY9Zc1HvDAhjhSHdFkHFzLmabt/AQxSg2wwzLhHIJOBnAWwVY4zrhIYhhc2kvhYDfQ4hDi2Gmh5KyFn8EcGIrHAngNgIwVIEMf5bzbAiTRoAD///8z/KVhkkWEle6IX+d/z4fvH3BShK1e5kmjkCMoxVmXhd4ROlTKo3iipasvTilY21q19ta30/v/0/idPX1v8PNxJL6ramnOVsdvMv2akO0iSYIzdJFirtzWXCZicS9vHqvSKyqm5XJBdqBwPxyfJdykhWTZ0G0ZyTZGpLKxsNwwoRhsx3tZfhwmeOBVISm3impAC/IT/8hP/EKEM1KMdVdVKM2rHV4x7HVXZvbVVKN/qq8CiV9VL9jjH/6l6qf7MBCjZmOqsAibjcP+qqqv0oxqpa/NVW286hPo1nz2L/h8+jXt//uSxCmDU2IK/ECN98KKtE5IYzNoCfbw+u9i5r8PoadUMFPKqWL4LK3T/LCraMSHGkW4bpLXR/E6LlHOVQxmslKVJ8IULktMN06N0FKCpHCoYsjC4F+Z0NVqdNFoGSTjSiyjzLdnZ2fNqTi2eHKONONKLMPMKLONKLMPQRJGlFxZRoKcJFAYEeIFiRQkUWUeYfef//Ko04soswso40UJAgMw8wosososy0EalnZyjQUGBRQGIFggOWUacWUeYmuadrZziQKKEgQsQLAhQkUJAgMQDghltLO1onp0cpkNInSFMqlYeSEJ5AHsqFdOwy1DA2sRmRJKxdKRfLhfLw5BzUxBTUUzLjk4LjJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk4LjJVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7ksRRA8AAAaQAAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU='\n\nexport const audioCache: Record<string, IAudio[]> = {}\n\nexport enum AudioNamespace {\n Default = 'default',\n GetAudioDuration = 'getAudioDuration',\n PlayAudio = 'playAudio',\n}\n\nexport function getAudio(src?: string, params?: { namespace?: string }) {\n const namespace = params?.namespace || AudioNamespace.Default\n const audioList = audioCache[namespace] || (audioCache[namespace] = [])\n let audio = audioList.find((audio) => {\n return !audio.realSrc || audio.realSrc === BlankAudioSrc\n })\n if (!audio) {\n console.warn('未找到缓存音频,已新建', audioCache)\n audio = new IAudio(BlankAudioSrc)\n audioList.push(audio)\n }\n if (src) {\n audio.src = src\n }\n return audio\n}\n\nexport async function getAudioDuration(audio?: string | IAudio): Promise<number> {\n const audioInstance = (() => {\n if (audio instanceof IAudio) return audio\n else return getAudio(audio, { namespace: AudioNamespace.GetAudioDuration })\n })()\n const duration = await new Promise<number>((resolve) => {\n if (audioInstance.duration) {\n if (audioInstance.isBlankAudio) resolve(0)\n else resolve(audioInstance.duration)\n } else {\n audioInstance.addEventListener('loadedmetadata', () => {\n if (audioInstance.isBlankAudio) resolve(0)\n else resolve(audioInstance.duration)\n })\n audioInstance.addEventListener('canplaythrough', () => {\n if (audioInstance.isBlankAudio) resolve(0)\n else resolve(audioInstance.duration)\n })\n }\n })\n\n if (typeof audio === 'string') audioInstance.clear()\n return duration\n}\n\nexport async function waitForBlankAudioGenerated(checkInterval = 100, timeout = 2000, params?: { namespace?: string }) {\n const namespace = params?.namespace || AudioNamespace.Default\n const audioList = audioCache[namespace] || (audioCache[namespace] = [])\n // while any audioList not ended\n const startTime = Date.now()\n let isTimedOut = false\n while (audioList.some((audio) => !audio.ended && audio.src === BlankAudioSrc) && !isTimedOut) {\n if (Date.now() - startTime > timeout) {\n isTimedOut = true\n return Promise.resolve()\n }\n await new Promise((resolve) => {\n setTimeout(resolve, checkInterval)\n })\n }\n}\n\n/**\n * @description: 生成空音频\n */\nexport function generateBlankAudio(length: number, params?: { namespace?: string }) {\n const namespace = params?.namespace || 'default'\n const audioList = audioCache[namespace] || (audioCache[namespace] = [])\n // 判断一下已经生成几个了,防止重复生成\n const generateLength = length - audioList.length\n if (generateLength <= 0) return\n for (let i = 0; i < generateLength; i++) {\n audioList.push(new IAudio(BlankAudioSrc))\n }\n}\n\nexport class IAudio extends (() => {\n // SSR\n if (typeof Audio === 'undefined') {\n return class {} as new (src?: string) => HTMLAudioElement\n } else {\n return Audio\n }\n})() {\n public preload = 'auto' as const\n public crossOrigin = 'anonymous' as const\n\n public get isBlankAudio() {\n return this.realSrc === BlankAudioSrc || !this.realSrc\n }\n\n public get src() {\n return super.src\n }\n\n public set src(paramsSrc: string) {\n super.muted = true\n this.generation++\n super.src = paramsSrc\n this.realSrc = paramsSrc\n this.removeDocumentEventListener()\n }\n\n public get muted() {\n return super.muted\n }\n\n public set muted(muted: boolean) {\n super.muted = muted\n }\n\n public generation = 0\n\n public realSrc = ''\n\n public inited = false\n\n public removeDocumentEventListener: () => void\n\n public constructor(src?: string) {\n super(src)\n this.realSrc = src ?? ''\n this.muted = true\n super.autoplay = true\n\n super.addEventListener('ended', () => {\n if (this.isBlankAudio || !this.ended) return\n const generation = this.generation\n // Let current ended consumers finish before releasing the pool element.\n // A new source or owner makes this completion obsolete.\n setTimeout(() => {\n if (this.generation === generation && this.ended && !this.isBlankAudio) this.clear()\n }, 0)\n })\n\n const init = () => initAudio(this)\n\n document.addEventListener('click', init)\n document.addEventListener('touchend', init)\n this.removeDocumentEventListener = () => {\n document.removeEventListener('click', init)\n document.removeEventListener('touchend', init)\n }\n }\n\n public clear(): void {\n this.muted = true\n this.pause()\n this.currentTime = 0\n this.src = BlankAudioSrc\n }\n}\n\nfunction initAudio(audio: IAudio) {\n if (!audio) return\n if (audio.inited) return\n if (audio.src) {\n audio.inited = true\n audio.removeDocumentEventListener()\n }\n if (audio.src === BlankAudioSrc) {\n audio.play()\n }\n}\n","import type { Entries } from 'type-fest'\n\nexport default function entries<T>(obj: T) {\n return Object.entries(obj) as Entries<T>\n}\n","import type { TagConfig } from '../..'\n\nexport default function adaptConfig(config: TagConfig) {\n if (typeof config.visibleConfig === 'object') {\n if (config.visibleConfig.keep) {\n if (config.visibleConfig.keep === 'visible') {\n config.visibleConfig = { keep: config.visibleConfig.keep, visibleFiveMode: config.visibleConfig?.visibleFiveMode }\n } else if (config.visibleConfig.keep === 'hidden') {\n config.visibleConfig = { keep: config.visibleConfig.keep }\n }\n }\n }\n\n // 兼容\n if (typeof config.unfoldedConfig === 'object') {\n if (config.unfoldedConfig.keep) config.unfoldedConfig = { keep: config.unfoldedConfig.keep }\n }\n\n const initialState = config.initialState ?? {}\n if (typeof config.unfoldedConfig === 'object') {\n if (config.unfoldedConfig.keep === 'unfolded') {\n initialState.unfolded = true\n } else if (config.unfoldedConfig.keep === 'folded') {\n initialState.unfolded = false\n }\n }\n if (typeof config.visibleConfig === 'object') {\n if (config.visibleConfig.keep === 'visible') {\n initialState.visible = true\n } else if (config.visibleConfig.keep === 'hidden') {\n initialState.visible = false\n }\n }\n\n config.initialState = initialState\n\n return config\n}\n","import type { Create3DDomContainerParamsType } from '../../../CSS3DRenderPlugin/Controller'\nimport type { Five, Mode } from '@realsee/five-webgpu'\nimport type { ContentTypeMap, TagContentType } from './TagData'\nimport type { MinMax } from './Utils'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { Vector3 } from 'three/webgpu'\nimport type { TagInstance } from '../..'\n\ntype TagVisibleMode = Mode | Mode[] | 'PanoramaLike' | 'ModelLike' | 'all'\n\n/**\n * @description 标签悬停时popover的位置\n * @default 'auto'\n * top 是标签上方,bottom 是标签下方,left 是标签左侧,right 是标签右侧\n * top-left 是标签上方,Popover的左边界与标签的左边界对齐\n * top-right 是标签上方,Popover的右边界与标签的右边界对齐\n * bottom-left 是标签下方,Popover的左边界与标签的左边界对齐\n * bottom-right 是标签下方,Popover的右边界与标签的右边界对齐\n * left-top 是标签左侧,Popover的上边界与标签的上边界对齐\n * left-bottom 是标签左侧,Popover的下边界与标签的下边界对齐\n * right-top 是标签右侧,Popover的上边界与标签的上边界对齐\n * right-bottom 是标签右侧,Popover的下边界与标签的下边界对齐\n * auto 是根据标签位置自动计算\n */\nexport type TagPlacement =\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n | 'left-top'\n | 'left-bottom'\n | 'right-top'\n | 'right-bottom'\n | 'auto'\n\nexport interface TagConfig<C extends TagContentType = TagContentType> {\n /**\n * @description 显示/隐藏相关配置\n */\n visibleConfig?:\n | {\n /**\n * @description 在 `visibleFiveMode` 指定的 `mode` 中,保持可见/不可见。设置后 `visibleConfig` 中除了 `visibleFiveMode` 外的所有其他配置都不生效\n * @default null\n * @example\n * ```typescript\n * // 在 Panorama 和 Floorplan 模式下永远保持可见\n * const config = {\n * keep: 'visible',\n * visibleFiveMode: ['Panorama', 'Floorplan'],\n * }\n * // 在 tag.fiveState.mode 中时,永远保持可见\n * const config = {\n * keep: 'visible',\n * }\n * ```\n */\n keep?: 'visible' | 'hidden' | null\n /**\n * @description 在哪些 `five mode` 下可见\n * @tips 默认值的设定是在 config 合并后,而不是合并前\n * @default\n * ```\n * 普通全景模式:['Panorama']\n * ```\n * @example\n * ```typescript\n * const tag = {\n * ...\n * fiveState: {\n * mode: 'Floorplan',\n * }\n * ...\n * config: {},\n * }\n * // 相当于\n * const tag = {\n * ...\n * fiveState: {\n * mode: 'Floorplan',\n * }\n * ...\n * config: {\n * visibleFiveMode: 'Floorplan',\n * },\n * }\n * ```\n */\n visibleFiveMode?: TagVisibleMode | ((tag: TagInstance) => TagVisibleMode)\n /**\n * @description 全景标签在模型中可见,点击后进入全景看向标签\n * @default false\n */\n entryFromModel?: boolean\n /**\n * @description 当 visibleFiveMode 包含 'Floorplan' 或者 'MapView' 时,是否仅在当前楼层模型下可见\n * @default false\n */\n followModelVisibility?: boolean\n /** @deprecated 所有标签走点时都不统一隐藏;保留旧配置兼容,仍按可见性规则计算。 */\n alwaysShowWhenMovePano?: boolean\n /**\n * @description 配置可见距离\n * @fivemode 只在全景模式下生效\n * @default 'unLimited'\n */\n visibleDistance?: MinMax | 'unLimited'\n /**\n * @description 配置标签可见点位\n * @fivemode 只在全景模式下生效\n * @param all 不限制\n * @param current 仅当前点位可见\n * @param number[] 仅指定点位可见\n * @default 'all'\n */\n visiblePanoIndex?: 'all' | 'current' | number[]\n /**\n * @description 碰撞检测配置\n * @default true\n */\n intersectRaycaster?:\n | boolean\n | {\n /**\n * @description 是否开启碰撞检测\n * @default true\n */\n enabled?: boolean\n /**\n * @description 碰撞检测的允许误差\n * @default 0.01\n */\n distanceAccuracy?: number\n /**\n * @description 碰撞检测的点\n * @default 'center'\n */\n checkPoints?: 'center' | 'corner' | Vector3[]\n /**\n * @description 碰撞检测策略,多少点通过检测则认为碰撞通过\n * @default 1\n */\n needPassed?: number\n /**\n * @description 模型加载(loaded)完成前,射线打空时是否判为不可见。\n * 开启后可避免「模型未加载好时射线打空被误判为未遮挡 → 标签先全部显示,加载后再逐渐消失」的闪烁。\n * @default false\n */\n hideWhenModelNotLoaded?: boolean\n /**\n * @description 碰撞检测射线的起点策略\n * @param observer 全景态取观察点位置、模型态取相机位置(含眼高,射线是斜的)\n * @param horizontal 与检测点保持水平:y 取检测点高度,x/z 取观察点(或相机)的值。\n * 用于「虚拟屏幕与当前点位的水平连线是否被模型挡住」这类判定,\n * 斜射线可能从矮柜/栏杆上方越过,水平射线才会撞上。\n * 开启 `horizontal` 时,即使当前点位与标签绑定点位相同也会执行碰撞检测(不走跳过分支)。\n * @default 'observer'\n */\n startPointMode?: 'observer' | 'horizontal'\n }\n /**\n * @description 3D标签中 「标签所在平面或垂直于标签法线的平面」 与 「摄像机到标签点或中心点的向量」 的夹角,范围内自动展开,范围外自动收起\n * @fivemode 只在全景模式下生效\n * @default undefined\n */\n angleRange?: MinMax\n }\n | ConfigFunction\n /**\n * @description 展开/收起相关配置\n * @warning 与 popoverConfig 同时使用时,popoverConfig 优先级更高\n */\n unfoldedConfig?:\n | {\n /**\n * @description 保持展开/收起,设置后unfoldedConfig下所有其他配置都不生效\n * @default null\n */\n keep?: 'unfolded' | 'folded' | null\n /**\n * @description 划动到不可见状态时,自动收起,disableFold: true 的标签不受此参数影响\n * @note 部分标签是无法收起的\n * @default true\n */\n autoFoldWhenHide?: false\n /** min-max米内自动展开,否则收起 */\n unfoldDistance?: MinMax\n /**\n * @description 自动展开策略\n *\n * @strategy 'ScreenPostion':根据屏幕位置展开\n * @strategy 'MinimumDistance':最近标签自动展开\n * @strategy 'FoldWhenMove':移动屏幕自动收起\n */\n autoUnfold?:\n | false\n | {\n enable?: boolean\n /** 自动展开 策略 */\n strategy?: 'ScreenPostion'\n /** 自动展开策略,{min,max}为project(camera)后的x值 */\n autoUnfoldProjectX?: MinMax\n }\n | {\n enable?: boolean\n /** 自动展开:最近标签自动展开 */\n strategy?: 'MinimumDistance'\n /**\n * @description 展开的最大数量\n * @default 1\n */\n maxNumber?: number\n /**\n * @description 展开的最大距离\n * @default 无限制\n */\n distance?: MinMax\n }\n | {\n enable?: boolean\n /** 移动屏幕自动收起 */\n strategy?: 'FoldWhenMove'\n }\n | {\n enable?: boolean\n /** 屏幕中心自动展开 */\n strategy?: 'ScreenCenter'\n /** 展开的最大距离 */\n distance?: MinMax\n /** 展开的最大数量 */\n maxNumber?: number\n }\n }\n | ConfigFunction\n /** 初始状态 */\n initialState?: {\n /**\n * @description 展示状态\n */\n visible?: boolean\n /**\n * @description 展开状态\n */\n unfolded?: boolean\n }\n /**\n * @description 标签的默认数据,会将 tag.data 深度合并进来\n * @code `tag.data = ObjectAssignDeep(initialData, tag.data)`\n */\n initialData?: PartialObjectDeep<ContentTypeMap[C]> & {\n /**\n * @description 类似 css 的 !important,会覆盖掉 tag.data 中对应的数据\n * @code\n * ```typescript\n * if (initialData.important) {\n * tag.data = ObjectAssignDeep(tag.data, initialData)\n * } else {\n * tag.data = ObjectAssignDeep(initialData, tag.data)\n * }\n * ```\n */\n important?: boolean\n }\n /**\n * @description 内部使用 css3DRenderer 渲染的标签可以使用此配置来设置 css3DRenderer 相关参数\n */\n tag3DConfig?: Create3DDomContainerParamsType['config']\n modelConfig?: { autoLookAtEnabled?: boolean }\n /**\n * @description 当图片为一张时可以选择通过Mesh渲染\n * @default 'Dom'\n */\n renderType?: 'Mesh' | 'Dom'\n /**\n * @description 是否模拟近大远小的效果\n * @default false\n */\n simulate3D?: boolean\n /**\n * @description 是否可以点击\n * @default true\n */\n clickable?: boolean\n /**\n * @description 标签浮窗相关配置\n * @warning 开启之后 unfoldedConfig 无效\n */\n popoverConfig?: {\n /**\n * @description 是否启用 TagPopover\n * @warning 开启之后 unfoldedConfig 无效\n * @default false\n */\n enabled?: boolean\n\n /**\n * @description 浮层容器的 zIndex,默认 2000000\n */\n zIndex?: number\n\n /**\n * @description 是否开启调试模式,调试模式popover常驻\n * @default false\n */\n debug?: boolean\n\n /**\n * @description 触发方式\n * @description hover - 鼠标悬停触发,移出后面板消失\n * @description click - 点击触发(fold/unfold模式),再次点击隐藏\n * @default 'hover'\n */\n trigger?: 'hover' | 'click'\n\n /**\n * @description 触发延迟时间(仅在 trigger 为 hover 时生效), 单位为毫秒\n * @default 300\n */\n triggerDelay?: number\n\n /**\n * @description popover的位置, 默认根据标签位置自动计算\n * @description top 是标签上方,bottom 是标签下方,left 是标签左侧,right 是标签右侧\n * @description top-left 是标签上方,Popover的左边界与标签的左边界对齐\n * @description top-right 是标签上方,Popover的右边界与标签的右边界对齐\n * @description bottom-left 是标签下方,Popover的左边界与标签的左边界对齐\n * @description bottom-right 是标签下方,Popover的右边界与标签的右边界对齐\n * @description left-top 是标签左侧,Popover的上边界与标签的上边界对齐\n * @description left-bottom 是标签左侧,Popover的下边界与标签的下边界对齐\n * @description right-top 是标签右侧,Popover的上边界与标签的上边界对齐\n * @description right-bottom 是标签右侧,Popover的下边界与标签的下边界对齐\n * @description auto 是根据标签位置自动计算\n * @default 'auto'\n */\n placement?: TagPlacement\n\n /**\n * @description 自动计算位置时,所参考的wrapperElement的区域分割\n * @default {\n * top: 0.2,\n * bottom: 0.2,\n * right: 0.15,\n * }\n */\n autoPlacementBaseSpace?: {\n top?: number\n bottom?: number\n right?: number\n }\n\n /**\n * @description 过渡动画的持续时间, 单位为毫秒\n * @default 100\n */\n transitionDuration?: number\n\n /**\n * @description 主题,可选值为 'dark' | 'light'\n * @default 'dark'\n */\n theme?: 'dark' | 'light'\n\n /**\n * @description 工具栏配置\n */\n toolbar?: {\n showMore?: boolean\n showShare?: boolean\n }\n\n /**\n * @description 图片URL转换函数\n */\n imageURLTransform?: (url: string, options: { width: number; height: number }) => string\n\n /**\n * @description 查看更多按钮的文本\n * @default '查看更多'\n */\n viewMoreText?: string\n\n /**\n * @description 营销标签展开卡片中是否展示媒体区域(需同时提供 data.mediaData,与 popoverConfig.enabled 无关)\n * @default false\n */\n showMedia?: boolean\n\n /**\n * @description 鼠标悬停前的拦截函数,返回 true 允许 hover,false 阻止 hover\n */\n beforeOpen?: (tag?: TagInstance) => boolean | undefined\n\n /**\n * @description 鼠标离开标签区域后的回调(在 hover 结束时触发,无论 beforeOpen 是否拦截过本次 hover)\n * @param tag 当前标签实例\n * @param event 原生 PointerEvent,可通过 event.pointerType 区分 'mouse' / 'touch' / 'pen'\n */\n onHoverEnd?: (tag?: TagInstance, event?: PointerEvent) => void\n }\n /**\n * @description 标签法线相关配置\n */\n tagNormalLineConfig?: {\n /**\n * @description 是否启用标签法线\n * @default true\n */\n enabled?: boolean\n /**\n * @description 标签法线宽度\n * @default 1.2\n */\n lineWidth?: number\n }\n /**\n * @description Polygon mesh 渲染相关配置\n * @experimental 此配置为实验性 API,后续可能调整\n */\n __experimental_PolygonMeshConfig?: {\n /**\n * @description 是否启用默认的 Polygon mesh 渲染。设为 false 可禁用插件内置的多边形面渲染,\n * 适用于业务侧自定义 Polygon mesh 渲染的场景。\n * @default true\n */\n enabled?: boolean\n }\n}\n\nexport const defaultGlobalConfig: TagConfig = {\n visibleConfig: {\n intersectRaycaster: {\n enabled: true,\n distanceAccuracy: 0.04,\n checkPoints: 'corner',\n needPassed: 1,\n },\n },\n clickable: true,\n simulate3D: false,\n renderType: 'Dom',\n}\n\ntype ConfigFunction = (\n five: Five,\n tagState: {\n tag: TagInstance\n /** 标签点或中心点的到摄像机的距离 */\n distance: number\n /** 3D标签中 「标签所在平面或垂直于标签法线的平面」 与 「摄像机到标签点或中心点的向量」 的夹角 */\n angleRange?: number\n },\n) => boolean\n","import objectAssignDeep from 'object-assign-deep'\nimport entries from '../../../shared-utils/typescript/entries'\nimport adaptConfig from './adaptConfig'\nimport {\n type Tag,\n type Tags,\n type TagInstance,\n type TagConfig,\n defaultGlobalConfig,\n type ContentTypeConfigKey,\n type ContentTypeConfigKeySplit,\n} from '../../typings'\nimport { Five, type Mode } from '@realsee/five-webgpu'\nimport { isModelLike, isPanoramaLike } from '../../../shared-utils'\n\nconst normalizedConfigs = new WeakSet<object>()\n\n/**\n * @description 获取merge后的配置\n */\nexport function calculateTagConfig(\n tag: Tag,\n baseConfig: Pick<Tags, 'globalConfig' | 'contentTypeConfig'>,\n params?: { useCache?: boolean },\n): TagInstance['computedConfig'] {\n const useCache = params?.useCache ?? true\n\n if (!tag) return baseConfig.globalConfig ?? {}\n\n // 走缓存的情况\n if (useCache) {\n if ((tag as any)?.computedConfig && normalizedConfigs.has((tag as any).computedConfig)) return (tag as any).computedConfig as any\n if (tag?.config && normalizedConfigs.has(tag.config)) return tag.config\n }\n\n // 没缓存的情况\n const objWithoutMode: Tags['contentTypeConfig'] = {}\n const objWithModeLike: {\n [key in 'PanoramaLike' | 'ModelLike']?: Tags['contentTypeConfig']\n } = {}\n const objWithMode: {\n [key in Mode]?: Tags['contentTypeConfig']\n } = {}\n\n if (baseConfig.contentTypeConfig) {\n\n Object.entries(baseConfig.contentTypeConfig).forEach(([_key, config]) => {\n const key = _key as ContentTypeConfigKey\n const keys = key.split('-')\n\n const configIsWithMode = _key.startsWith('[')\n const fiveModeInConfig = configIsWithMode ? keys[0].slice(1, -1) : undefined\n const keysWithOutFiveMode = (configIsWithMode ? keys.slice(1) : keys) as ContentTypeConfigKeySplit\n\n const obj = fiveModeInConfig\n ? ['PanoramaLike', 'ModelLike'].includes(fiveModeInConfig)\n ? objWithModeLike[fiveModeInConfig] ?? (objWithModeLike[fiveModeInConfig] = {})\n : objWithMode[fiveModeInConfig] ?? (objWithMode[fiveModeInConfig] = {})\n : objWithoutMode\n\n if (obj[key]) return\n\n if (keysWithOutFiveMode.length === 0) {\n obj[key] = config\n }\n\n // 匹配一个长度的\n if (keysWithOutFiveMode.length === 1) {\n const [contentType] = keysWithOutFiveMode\n if (tag.contentType === contentType || contentType === 'Any') {\n obj[key] = config as any\n }\n }\n\n // 匹配两个长度的\n if (keysWithOutFiveMode.length === 2) {\n const [stickType = 'Any', contentType = 'Any'] = keysWithOutFiveMode as any\n if (\n (tag.stickType === stickType || stickType === 'Any') &&\n (tag.contentType === contentType || contentType === 'Any')\n ) {\n obj[key] = config as any\n }\n }\n\n // 匹配三个长度的\n if (keysWithOutFiveMode.length === 3) {\n const [stickType = 'Any', contentType, appearance] = keysWithOutFiveMode\n if (contentType === 'Audio' && tag.contentType === 'Audio') {\n const audioTag = tag as Tag<'Audio'>\n if ((audioTag.stickType === stickType || stickType === 'Any') && audioTag.data.appearance === appearance) {\n obj[key] = config as any\n }\n }\n }\n })\n }\n\n // 写在tag内的config,优先级最高\n const configInTag = 'initialConfig' in tag ? (tag as TagInstance).initialConfig : tag.config ?? {}\n\n //\n const sharedConfig: TagConfig = objectAssignDeep({}, defaultGlobalConfig, baseConfig.globalConfig, ...Object.values(objWithoutMode))\n\n // 普通 config\n const configWithoutFiveMode = objectAssignDeep({}, sharedConfig, configInTag)\n\n // Five Mode config\n const configWithFiveMode: {\n [key in Mode]?: TagConfig\n } = {}\n\n const fiveModeList = Object.values(Five.Mode)\n\n entries(objWithModeLike).forEach(([modeLike, config]) => {\n fiveModeList.forEach((mode) => {\n if ((modeLike === 'PanoramaLike' && isPanoramaLike(mode)) || (modeLike === 'ModelLike' && isModelLike(mode))) {\n configWithFiveMode[mode] = objectAssignDeep({}, sharedConfig, ...Object.values(config), configInTag)\n }\n })\n })\n\n entries(objWithMode).forEach(([mode, config]) => {\n const temp = configWithFiveMode[mode]\n configWithFiveMode[mode] = objectAssignDeep({}, sharedConfig, temp, ...Object.values(config), configInTag)\n })\n\n // 最终结果\n const config = { ...configWithoutFiveMode, configWithFiveMode }\n\n // 兼容\n adaptConfig(config)\n Object.values(configWithFiveMode).forEach((config) => adaptConfig(config))\n\n normalizedConfigs.add(config)\n Object.values(configWithFiveMode).forEach((config) => normalizedConfigs.add(config))\n\n return config\n}\n","import type { Tags } from './typings'\n\nconst DefaultConfig: {\n globalConfig?: Tags['globalConfig']\n contentTypeConfig?: Tags['contentTypeConfig']\n} = {\n globalConfig: {\n visibleConfig: {\n followModelVisibility: true,\n },\n unfoldedConfig: {\n autoUnfold: {\n enable: true,\n strategy: 'MinimumDistance',\n distance: { max: 5 },\n },\n },\n tag3DConfig: {\n ratio: 0.0035,\n },\n popoverConfig: {\n enabled: false,\n // debug: true,\n trigger: 'hover',\n triggerDelay: 500,\n placement: 'auto',\n autoPlacementBaseSpace: {\n top: 0.2,\n right: 0.15,\n bottom: 0.2,\n },\n transitionDuration: 100,\n // theme: 'light',\n toolbar: {\n showMore: true,\n showShare: true,\n },\n viewMoreText: '查看更多',\n showMedia: false,\n },\n tagNormalLineConfig: {\n enabled: true,\n lineWidth: 1.2\n }\n },\n contentTypeConfig: {\n '[Mapview]': {\n unfoldedConfig: {\n autoUnfold: {\n enable: false,\n distance: { max: 9999 },\n },\n },\n },\n '[Floorplan]': {\n unfoldedConfig: {\n autoUnfold: {\n enable: false,\n distance: { max: 9999 },\n },\n },\n },\n 'Any-Audio-plane': {\n unfoldedConfig: {\n keep: 'unfolded',\n },\n },\n Link: {\n unfoldedConfig: {\n // VR 跳转标签没有收起状态\n keep: 'unfolded',\n },\n },\n Panorama: {\n unfoldedConfig: {\n // VR 跳转标签没有收起状态\n keep: 'unfolded',\n },\n },\n VRLink: {\n unfoldedConfig: {\n // VR 跳转标签没有收起状态\n keep: 'unfolded',\n },\n },\n PanoLink: {\n unfoldedConfig: {\n // VR 跳转标签没有收起状态\n keep: 'unfolded',\n },\n },\n MediaPlane: {\n unfoldedConfig: {\n keep: 'unfolded',\n },\n initialData: {\n autoplayConfig: {\n autoplayCarousel: true,\n autoplayVideo: false,\n autoplayVideoInCarousel: false,\n },\n },\n },\n 'Model-Any': {\n unfoldedConfig: {\n keep: 'unfolded',\n },\n visibleConfig: {\n visibleFiveMode: 'all',\n },\n },\n Marketing: {\n popoverConfig: {\n enabled: false,\n },\n },\n Audio: {\n popoverConfig: {\n toolbar: {\n showMore: false,\n }\n },\n },\n },\n}\n\nexport { DefaultConfig }\nexport default DefaultConfig\n","import type * as THREE from 'three/webgpu'\n\nexport function pointsIsRectangle(points: THREE.Vector3[]): boolean {\n if (points.length !== 4) return false\n const [p1, p2, p3, p4] = points\n const p1p2 = p1.distanceTo(p2)\n const p2p3 = p2.distanceTo(p3)\n const p3p4 = p3.distanceTo(p4)\n const p4p1 = p4.distanceTo(p1)\n const p1p3 = p1.distanceTo(p3)\n const p2p4 = p2.distanceTo(p4)\n return p1p2 === p3p4 && p2p3 === p4p1 && p1p3 === p2p4\n}\n","import * as THREE from 'three/webgpu'\nimport { pointsIsRectangle } from '../math/pointsIsRectangle'\nimport { centerPoint } from './centerPoint'\n\nclass QuadrangleMesh extends THREE.Mesh<QuadrangleGeometry, THREE.Material> {\n public name = 'QuadrangleMesh'\n /**\n * @description 生成一个四边形的Mesh\n * @param {Vector3Position[]} points: 四个顶点的坐标, [左下,右下,右上,左上]\n */\n public constructor(points: THREE.Vector3[], material?: THREE.Material, segments?: number) {\n if (points.length !== 4) throw new Error(\"QuadrangleMesh: Invalid number of points, it's not a quadrangle\")\n const [p0, p1, p2, p3] = points\n\n const center = centerPoint(...points)\n\n const geometryPositions = [p0.clone().sub(center), p1.clone().sub(center), p2.clone().sub(center), p3.clone().sub(center)]\n\n const geometry = new QuadrangleGeometry(geometryPositions, segments)\n super(geometry, material)\n\n this.position.copy(center)\n }\n\n public removeFromParent() {\n const parent = this.parent\n\n if (parent !== null) {\n parent.remove(this)\n }\n\n return this\n }\n}\n\nclass QuadrangleGeometry extends THREE.BufferGeometry {\n public name = 'QuadrangleGeometry'\n public points: THREE.Vector3[]\n /**\n * @description 生成一个四边形的BufferGeometry,原点取 points[0],即左下角\n * @param {Vector3Position[]} points: 四个顶点的坐标, [左下,右下,右上,左上]\n */\n public constructor(points: THREE.Vector3[], paramsSegments?: number) {\n super()\n\n this.points = points\n const segments = paramsSegments ?? (pointsIsRectangle(points) ? 64 : 1)\n\n if (points.length !== 4) {\n console.error(\"Invalid number of points, it's not a quadrangle\")\n return\n }\n\n const [p0, p1, p2, p3] = points\n const [uv0, uv1, uv2, uv3] = [new THREE.Vector2(0, 0), new THREE.Vector2(1, 0), new THREE.Vector2(1, 1), new THREE.Vector2(0, 1)]\n\n const verticesArray = []\n const uvArray = []\n\n // 左下角\n verticesArray.push(...p0.toArray())\n uvArray.push(...uv0.toArray())\n // 左下角到右下角\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n p0.x + ((p1.x - p0.x) * i) / segments,\n p0.y + ((p1.y - p0.y) * i) / segments,\n p0.z + ((p1.z - p0.z) * i) / segments,\n )\n uvArray.push(uv0.x + ((uv1.x - uv0.x) * i) / segments, uv0.y + ((uv1.y - uv0.y) * i) / segments)\n }\n // 右下角\n verticesArray.push(...p1.toArray())\n uvArray.push(...uv1.toArray())\n // 右上角\n verticesArray.push(...p2.toArray())\n uvArray.push(...uv2.toArray())\n // 右上角到左上角\n for (let i = 1; i < segments; i++) {\n verticesArray.push(\n p2.x + ((p3.x - p2.x) * i) / segments,\n p2.y + ((p3.y - p2.y) * i) / segments,\n p2.z + ((p3.z - p2.z) * i) / segments,\n )\n uvArray.push(uv2.x + ((uv3.x - uv2.x) * i) / segments, uv2.y + ((uv3.y - uv2.y) * i) / segments)\n }\n // 左上角\n verticesArray.push(...p3.toArray())\n uvArray.push(...uv3.toArray())\n\n const indicesArray = []\n for (let i = 0; i < segments; i++) {\n indicesArray.push(i, i + 1, segments * 2 - i, i, segments * 2 - i, segments * 2 + 1 - i)\n }\n\n this.setAttribute('position', new THREE.BufferAttribute(new Float32Array(verticesArray), 3))\n this.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvArray), 2))\n this.setIndex(new THREE.BufferAttribute(new Uint32Array(indicesArray), 1))\n }\n}\n\nexport { QuadrangleMesh, QuadrangleGeometry }\n","import * as THREE from 'three/webgpu'\nimport type { ObjectFit } from '../../PanoTagPlugin'\n\nexport default function getPositionsByObjectFit(objectFit: ObjectFit, originPositions: THREE.Vector3[], originRatio: number) {\n if (objectFit === 'fill') return originPositions\n else if (objectFit === 'contain') {\n const [p0, p1, p2, p3] = originPositions\n const bottomWidth = p0.distanceTo(p1)\n const topWidth = p2.distanceTo(p3)\n const leftHeight = p0.distanceTo(p3)\n const rightHeight = p1.distanceTo(p2)\n\n const wrapperWidth = bottomWidth\n const wrapperHeight = leftHeight\n const wrapperRatio = wrapperWidth / wrapperHeight\n if (wrapperRatio > originRatio) {\n const newHeight = wrapperHeight\n const newWidth = newHeight * originRatio\n const bottomDiff = new THREE.Vector3().subVectors(p1, p0).multiplyScalar((bottomWidth - newWidth) / 2 / bottomWidth)\n const topDiff = new THREE.Vector3().subVectors(p2, p3).multiplyScalar((topWidth - newWidth) / 2 / topWidth)\n\n return [p0.clone().add(bottomDiff), p1.clone().sub(bottomDiff), p2.clone().sub(topDiff), p3.clone().add(topDiff)]\n } else if (wrapperRatio < originRatio) {\n const newWidth = wrapperWidth\n const newHeight = newWidth / originRatio\n const leftDiff = new THREE.Vector3().subVectors(p3, p0).multiplyScalar((leftHeight - newHeight) / 2 / leftHeight)\n const rightDiff = new THREE.Vector3().subVectors(p2, p1).multiplyScalar((rightHeight - newHeight) / 2 / rightHeight)\n\n return [p0.clone().add(leftDiff), p1.clone().add(rightDiff), p2.clone().sub(rightDiff), p3.clone().sub(leftDiff)]\n } else {\n return originPositions\n }\n } else {\n console.warn(`objectFit: ${objectFit} is not supported yet`)\n return originPositions\n }\n}\n","import * as THREE from 'three/webgpu'\n\nexport class FragmentTransparencyMaterial extends THREE.MeshBasicNodeMaterial {\n public constructor(texture: THREE.Texture) {\n super({\n map: texture,\n transparent: true,\n depthWrite: false,\n blending: THREE.CustomBlending,\n blendSrc: THREE.SrcAlphaFactor,\n blendDst: THREE.OneMinusSrcAlphaFactor,\n blendSrcAlpha: THREE.OneFactor,\n blendDstAlpha: THREE.OneMinusSrcAlphaFactor,\n })\n }\n}\n","import { getVideoTexture, type ReadyVideoTexture } from '../../../shared-utils/three/loadVideoTexture'\nimport { loadPicture } from '../../../shared-utils/three/loadTexture'\n\ntype Picture = Awaited<ReturnType<typeof loadPicture>>\n\n/** Tags retain cache leases across temporary hiding; their controller owns the cache. */\nexport class TagMediaTextureCache {\n public readonly videoTextures: Map<string, ReadyVideoTexture>\n public readonly imageTextures = new Map<string, Picture>()\n private videoOwners = new Map<string, Set<object>>()\n private imageOwners = new Map<string, Set<object>>()\n private pendingImages = new Map<string, Promise<Picture>>()\n\n public constructor(videos = new Map<string, ReadyVideoTexture>()) {\n this.videoTextures = videos\n }\n\n public getVideo(owner: object, src: string, scope?: string) {\n const key = scope ? `${scope}::${src}` : src\n let owners = this.videoOwners.get(key)\n if (!owners) this.videoOwners.set(key, owners = new Set())\n owners.add(owner)\n let texture = this.videoTextures.get(key)\n if (!texture) {\n texture = getVideoTexture(src)\n this.videoTextures.set(key, texture)\n }\n return texture\n }\n\n public getImage(owner: object, src: string): Promise<Picture> {\n let owners = this.imageOwners.get(src)\n if (!owners) this.imageOwners.set(src, owners = new Set())\n owners.add(owner)\n const loaded = this.imageTextures.get(src)\n if (loaded) return Promise.resolve(loaded)\n const pending = this.pendingImages.get(src)\n if (pending) return pending\n const currentOwners = owners\n const promise = loadPicture(src).then(result => {\n if (this.imageOwners.get(src) === currentOwners && currentOwners.size > 0) {\n this.imageTextures.set(src, result)\n } else {\n result.texture.dispose()\n }\n if (this.pendingImages.get(src) === promise) this.pendingImages.delete(src)\n return result\n }, error => {\n if (this.pendingImages.get(src) === promise) this.pendingImages.delete(src)\n throw error\n })\n this.pendingImages.set(src, promise)\n return promise\n }\n\n public release(owner: object) {\n for (const [key, owners] of this.videoOwners) {\n if (!owners.delete(owner) || owners.size > 0) continue\n this.videoOwners.delete(key)\n const texture = this.videoTextures.get(key)\n if (texture) {\n texture.image.muted = true\n texture.image.pause()\n texture.image.onloadedmetadata = null\n texture.image.removeAttribute('src')\n texture.image.load()\n texture.dispose()\n this.videoTextures.delete(key)\n }\n }\n for (const [src, owners] of this.imageOwners) {\n if (!owners.delete(owner) || owners.size > 0) continue\n this.imageOwners.delete(src)\n this.imageTextures.get(src)?.texture.dispose()\n this.imageTextures.delete(src)\n this.pendingImages.delete(src)\n }\n }\n\n public clear() {\n const owners = new Set([...this.videoOwners.values(), ...this.imageOwners.values()].flatMap(set => [...set]))\n owners.forEach(owner => this.release(owner))\n }\n}\n","import type { PlaybackManager, PlaybackController, PlaybackSession, MediaOperations } from '../../../shared-utils/playback'\nimport * as THREE from 'three/webgpu'\nimport { Vector3 } from 'three/webgpu'\nimport { centerPoint } from '../../../shared-utils/three/centerPoint'\nimport { loadPicture } from '../../../shared-utils/three/loadTexture'\nimport { QuadrangleGeometry, QuadrangleMesh } from '../../../shared-utils/three/Quadrangle'\nimport { type ReadyVideoTexture } from '../../../shared-utils/three/loadVideoTexture'\nimport { Image_Play_Icon_With_Text } from '../../Assets/Icon'\nimport { Image_Play_Icon } from '../../Assets/Icon'\nimport getPositionsByObjectFit from '../../../shared-utils/three/getPositionsByObjectFit'\nimport type { FiveDomEvents } from '../../../shared-utils/five/FiveDomEvents'\nimport type { ObjectFit } from '../../typings'\nimport { FragmentTransparencyMaterial } from '../../../shared-utils/three/FragmentTransparencyMaterial'\nimport getNormal from '../../../shared-utils/three/getNormal'\nimport { CONST } from '../../../shared-utils/constants'\nimport { TagMediaTextureCache } from './TagMediaTextureCache'\n\ntype VideoTexture = ReadyVideoTexture\n\nabstract class MediaPlane extends THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial> {\n public name = 'MediaPlane'\n public src?: string\n public objectFit: ObjectFit\n\n protected constructor() {\n super()\n // The empty root is a container until an image replaces its geometry/material.\n // Video surfaces live in child meshes; their materials remain drawable.\n this.material.visible = false\n }\n\n /** 获取透明度 */\n public get opacity(): number {\n return this.material?.opacity ?? 1\n }\n\n /** 设置透明度 (0-1) */\n public set opacity(value: number) {\n if (this.material) {\n this.material.opacity = value\n this.material.transparent = value < 1\n this.material.needsUpdate = true\n }\n // 同时更新子 mesh 的透明度\n this.traverse((obj) => {\n if ((obj as any).isMesh && obj !== this) {\n const mesh = obj as THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>\n if (mesh.material) {\n mesh.material.opacity = value\n mesh.material.transparent = value < 1\n mesh.material.needsUpdate = true\n }\n }\n })\n }\n\n public removeFromParent() {\n const parent = this.parent\n if (parent !== null) {\n parent.remove(this)\n }\n return this\n }\n\n public dispose() {\n this.traverse((obj) => {\n if ((obj as any).isMesh) {\n const mesh = obj as THREE.Mesh\n mesh.geometry.dispose()\n const materiales = mesh.material instanceof Array ? mesh.material : [mesh.material]\n materiales.forEach((material) => {\n material.dispose()\n })\n }\n })\n }\n}\n\ntype ImagePlaneUpdate = { cornerPoints: Vector3[]; params?: { objectFit?: ObjectFit; resolveZFighting?: boolean } }\n\nclass ImagePlane extends MediaPlane {\n public name = 'PanoTagPluginImagePlane'\n private disposed = false\n private pendingChange?: ImagePlaneUpdate\n\n public originRatio?: number\n public constructor(imageSrc: string, cornerPoints: Vector3[], params?: { objectFit?: ObjectFit; resolveZFighting?: boolean; opacity?: number }) {\n super()\n this.src = imageSrc\n this.objectFit = params?.objectFit ?? 'contain'\n const resolveZFighting = params?.resolveZFighting ?? true\n const opacity = params?.opacity ?? 1\n // 解决 z-fighting\n let newCornerPoints = cornerPoints\n if (resolveZFighting) {\n // 往法向量方向位移一点点\n const normal = getNormal(cornerPoints).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n newCornerPoints = cornerPoints.map((p) => p.clone().add(normal))\n }\n // 加载texture\n loadPicture(imageSrc)\n .then(({ texture, transparent }) => {\n if (this.disposed) {\n texture.dispose()\n return\n }\n const material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: transparent || opacity < 1,\n opacity,\n side: THREE.DoubleSide\n })\n this.originRatio = texture.image.width / texture.image.height\n const newPoints = getPositionsByObjectFit(this.objectFit, newCornerPoints, texture.image.width / texture.image.height)\n const center = centerPoint(...newPoints)\n const geometryPositions = newPoints.map((p) => p.clone().sub(center))\n const geometry = new QuadrangleGeometry(geometryPositions)\n\n this.position.copy(center)\n\n this.geometry.dispose()\n this.material.dispose()\n this.geometry = geometry\n this.material = material\n const pendingChange = this.pendingChange\n this.pendingChange = undefined\n if (pendingChange) this.changePointsOrParams(pendingChange)\n })\n .catch((e: Error) => {\n console.error(`Imageplane error: ${e?.message}`)\n })\n }\n\n public changePointsOrParams(props: ImagePlaneUpdate) {\n if (this.disposed) return\n const { cornerPoints, params = {} } = props\n\n const { objectFit = this.objectFit } = params\n // 解决 z-fighting\n let newCornerPoints = cornerPoints\n const { resolveZFighting } = params ?? {}\n if (this.originRatio === undefined) {\n this.pendingChange = {\n cornerPoints: cornerPoints.map((point) => point.clone()),\n params: { objectFit: objectFit ?? 'contain', resolveZFighting },\n }\n }\n if (resolveZFighting) {\n // 往法向量方向位移一点点\n const normal = getNormal(cornerPoints).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n newCornerPoints = cornerPoints.map((p) => p.clone().add(normal))\n }\n\n const newPoints = getPositionsByObjectFit(objectFit ?? 'contain', newCornerPoints, this.originRatio)\n const center = centerPoint(...newPoints)\n const geometryPositions = newPoints.map((p) => p.clone().sub(center))\n const geometry = new QuadrangleGeometry(geometryPositions)\n\n this.objectFit = objectFit ?? 'contain'\n this.position.copy(center)\n this.geometry.dispose()\n this.geometry = geometry\n }\n\n public dispose() {\n if (this.disposed) return\n this.disposed = true\n this.pendingChange = undefined\n this.material.map?.dispose()\n super.dispose()\n }\n}\n\nclass VideoPlane extends MediaPlane {\n public readonly isVideoPlane = true\n public name = 'PanoTagPluginImagePlane'\n public videoInstance?: HTMLVideoElement\n public onVideoReady?: (videoInstance?: HTMLVideoElement) => void\n private buttonSrc: string\n private videoCoverSrc?: string\n private domEvents?: FiveDomEvents\n private disposers: (() => void)[] = []\n private cornerPoints: Vector3[]\n private videoMesh?: THREE.Mesh<QuadrangleGeometry, THREE.Material> & { needsRender?: boolean }\n private coverMesh?: THREE.Mesh<QuadrangleGeometry, THREE.Material> & { needsRender?: boolean }\n private buttonMesh?: THREE.Mesh<QuadrangleGeometry, THREE.Material> & { needsRender?: boolean }\n private mediaTextures: TagMediaTextureCache\n private textureOwner: object\n private ownsTextureLease: boolean\n private initialOpacity: number\n private playbackController?: PlaybackController\n private session?: PlaybackSession\n private nativeErrorDisposer?: () => void\n private cancelMetadataWait?: () => void\n private loadGeneration = 0\n private playbackDisposed = false\n private resourcesDisposed = false\n private cacheScope?: string\n\n\n public constructor(\n videoSrc: string,\n cornerPoints: Vector3[],\n params?: {\n mediaManager?: PlaybackManager\n paused?: boolean\n playButton?: 'withText' | 'withoutText' | string\n videoCoverSrc?: string\n objectFit?: ObjectFit\n mediaTextures?: TagMediaTextureCache\n textureOwner?: object\n domEvents?: FiveDomEvents\n opacity?: number\n /** video 元素的归属标识(一般是标签 id)。传入后同 src 的多个屏幕不再共享 video 元素 */\n cacheScope?: string\n },\n ) {\n const {\n videoCoverSrc,\n objectFit = 'contain',\n playButton = 'withText',\n paused = true,\n domEvents,\n opacity = 1,\n cacheScope,\n } = params ?? {}\n super()\n this.playbackController = params?.mediaManager?.createController({ label: 'tag-video-plane', onCancel: () => this.stopOutput() })\n this.cornerPoints = cornerPoints\n this.src = videoSrc\n this.initialOpacity = opacity\n this.buttonSrc = (() => {\n if (playButton === 'withText') return Image_Play_Icon_With_Text\n else if (playButton === 'withoutText') return Image_Play_Icon\n else if (typeof playButton === 'string') return playButton\n else return Image_Play_Icon\n })()\n this.videoCoverSrc = videoCoverSrc\n this.objectFit = objectFit\n this.cacheScope = cacheScope\n this.mediaTextures = params?.mediaTextures ?? new TagMediaTextureCache()\n this.textureOwner = params?.textureOwner ?? this\n this.ownsTextureLease = params?.textureOwner === undefined\n this.domEvents = domEvents\n\n this.position.copy(centerPoint(...cornerPoints))\n\n const initialGeneration = this.loadGeneration\n if (this.videoCoverSrc && paused) {\n this.addCoverMesh().then(() => this.addButtonMesh())\n } else {\n this.addVideoMesh().then(() => {\n if (initialGeneration !== this.loadGeneration || this.playbackDisposed) return\n if (paused) this.addButtonMesh()\n else {\n void this.play(true).catch(error => console.error('Video play failed', error))\n }\n }).catch((error: Error) => {\n if (initialGeneration !== this.loadGeneration || this.playbackDisposed) return\n this.pause()\n console.error('Video metadata load failed', error)\n })\n }\n\n this.addEventListener('removed', () => {\n this.pause()\n // Keep owned child resources reachable until dispose() traverses them.\n })\n\n this.addEventListener('dispose', () => {\n this.playbackDisposed = true; this.playbackController?.dispose(); this.stopOutput()\n this.disposers?.forEach((d) => d?.())\n })\n }\n\n public dispose() {\n if (this.resourcesDisposed) return\n this.resourcesDisposed = true\n this.playbackDisposed = true; this.playbackController?.dispose(); this.stopOutput()\n this.disposers.forEach((dispose) => dispose())\n this.disposers = []\n // Playing detaches the button; hidden UI still belongs to this plane.\n const detached = [this.videoMesh, this.coverMesh, this.buttonMesh].filter(mesh => mesh && mesh.parent !== this)\n super.dispose()\n detached.forEach(mesh => { mesh.geometry.dispose(); mesh.material.dispose() })\n if (this.ownsTextureLease) this.mediaTextures.release(this.textureOwner)\n }\n\n public setMediaManager(manager?: PlaybackManager) {\n this.playbackController?.dispose()\n this.stopOutput()\n this.playbackController = manager?.createController({ label: 'tag-video-plane', onCancel: () => this.stopOutput() })\n }\n\n /**\n * @returns 播放结果。`'no-session'` 表示没拿到音频焦点(并非异常),\n * 调用方可据此降级为静音播放;`'disposed'`/`'stale'` 表示这次调用已失效。\n */\n public play(muted = false, userAction = false) {\n return this.startPlayback(muted, userAction, false)\n }\n\n private async startPlayback(muted: boolean, userAction: boolean, fromStart: boolean): Promise<'played' | 'no-session' | 'disposed' | 'stale'> {\n if (this.playbackDisposed) return 'disposed'\n const session = this.playbackController?.begin({ userAction, audible: !muted })\n if (this.playbackController && !session) return 'no-session'\n this.session = session\n const generation = ++this.loadGeneration\n const current = () => generation === this.loadGeneration && !session?.signal.aborted\n try {\n if (!this.videoMesh) await this.addVideoMesh()\n if (!current()) return 'stale'\n const video = this.videoInstance\n const operations = session?.bind(video) ?? video\n this.nativeErrorDisposer?.()\n const onError = () => {\n if (!video.error || !current() || this.session !== session || this.videoInstance !== video) return\n this.pause()\n }\n const clearError = () => {\n video.removeEventListener('error', onError)\n session?.signal.removeEventListener('abort', clearError)\n if (this.nativeErrorDisposer === clearError) this.nativeErrorDisposer = undefined\n }\n this.nativeErrorDisposer = clearError\n video.addEventListener('error', onError)\n session?.signal.addEventListener('abort', clearError, { once: true })\n if (fromStart) this.resetProgress(operations)\n operations.muted = muted\n try {\n await operations.play()\n } catch (error) {\n if (!fromStart || (error as Error).name !== 'NotAllowedError' || !current()) throw error\n // 浏览器拒绝有声自动播放时,沿用本次任务降级静音,不重新申请。\n operations.muted = true\n await operations.play()\n }\n if (!current()) return 'stale'\n this.showPlayUI()\n this.render()\n return 'played'\n } catch (error) {\n if (!current()) return 'stale'\n if ((error as Error).name === 'AbortError') { this.pause(); return 'stale' }\n this.pause()\n throw error\n }\n }\n\n /**\n * @description 从头播放。用于「离开可见范围后走回来」的场景:\n * 先重置进度,再尝试有声播放;有声不可用时回退静音,避免出现「既没声音也不播放」。\n * @param userAction 是否按用户操作申请音频焦点(true 会抢占当前音源)\n */\n public async replayFromStart(userAction = true): Promise<'audible' | 'muted' | 'failed'> {\n const playing = this.startPlayback(false, userAction, true)\n const generation = this.loadGeneration\n try {\n const result = await playing\n if (generation !== this.loadGeneration) return 'failed'\n if (result === 'played') return this.videoInstance.muted ? 'muted' : 'audible'\n if (result !== 'no-session') return 'failed'\n const muted = await this.startPlayback(true, false, true)\n return muted === 'played' ? 'muted' : 'failed'\n } catch (error) {\n console.error('Video replay failed', error)\n return 'failed'\n }\n }\n\n /** 复用的 video 元素不会自动回到起点,需显式重置 */\n private resetProgress(media: MediaOperations) {\n try {\n media.currentTime = 0\n } catch {\n // 少数浏览器在 metadata 未就绪时 seek 会抛错,忽略即可,播放本身不受影响\n }\n }\n\n public pause() { this.playbackController?.cancel(); this.stopOutput() }\n\n private stopOutput() {\n this.nativeErrorDisposer?.()\n this.loadGeneration++\n this.session = undefined\n this.cancelMetadataWait?.()\n if (!this.videoInstance) return\n // The manager has already stopped this session's bindings. A cached texture may\n // now belong to another screen, so only standalone planes stop the raw element.\n if (!this.playbackController) {\n this.videoInstance.muted = true\n this.videoInstance.pause()\n }\n this.showPauseUI().then(() => this.render())\n }\n\n public onDispose(dispose: () => void) { this.disposers.push(dispose) }\n\n public initialRenderHooks(func: (render: () => void) => () => void) {\n const render = () => {\n if (this.videoMesh && this.videoInstance?.paused === false) this.videoMesh.needsRender = true\n }\n const dispose = func(render)\n this.disposers.push(dispose)\n }\n\n private showPlayUI() {\n if (this.coverMesh) this.coverMesh.visible = false\n this.remove(this.buttonMesh)\n this.videoMesh.visible = true\n }\n\n private async showPauseUI() {\n if (this.playbackDisposed) return\n const generation = this.loadGeneration\n if (this.coverMesh) {\n this.coverMesh.visible = true\n if (this.videoMesh) this.videoMesh.visible = false\n } else {\n await this.addCoverMesh()\n if (generation !== this.loadGeneration || this.playbackDisposed) return\n if (this.coverMesh) this.videoMesh.visible = false\n }\n this.addButtonMesh().then(() => this.render())\n }\n\n private render() {\n if (this.videoMesh) this.videoMesh.needsRender = true\n if (this.coverMesh) this.coverMesh.needsRender = true\n if (this.buttonMesh) this.buttonMesh.needsRender = true\n if (this.videoMesh && this.videoInstance?.paused === false) this.videoMesh.needsRender = true\n }\n\n private async addCoverMesh() {\n if (this.playbackDisposed) return\n const generation = this.loadGeneration\n if (this.children.includes(this.coverMesh)) return\n const coverMesh = await (async () => {\n if (this.coverMesh) return this.coverMesh\n if (!this.videoCoverSrc) return\n // material\n const { texture, transparent } = await this.getImageTexture(this.videoCoverSrc)\n const material = new THREE.MeshBasicMaterial({\n transparent: transparent || this.initialOpacity < 1,\n opacity: this.initialOpacity,\n map: texture,\n side: THREE.DoubleSide\n })\n const points = getPositionsByObjectFit(this.objectFit, this.cornerPoints, texture.image.width / texture.image.height)\n const mesh = new QuadrangleMesh(points, material)\n mesh.position.copy(new Vector3(0, 0, 0))\n mesh.name = 'videoCoverMesh'\n\n // 往前拉一点,避免 z-fighting\n const normal = getNormal(points).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n mesh.position.add(normal)\n return mesh\n })()\n if (generation !== this.loadGeneration || this.playbackDisposed) {\n if (coverMesh && coverMesh !== this.coverMesh) {\n coverMesh.geometry.dispose()\n coverMesh.material.dispose()\n }\n return\n }\n if (coverMesh) {\n if (!this.children.includes(this.coverMesh)) {\n this.add(coverMesh)\n this.coverMesh = coverMesh\n }\n }\n return coverMesh\n }\n\n private async addVideoMesh() {\n const generation = this.loadGeneration\n if (this.playbackDisposed) return\n if (this.children.includes(this.videoMesh)) return\n\n const videoMesh = await (async () => {\n if (this.videoMesh) return this.videoMesh\n if (!this.src) return\n // material\n const texture = this.getVideoTexture(this.src)\n const material = new THREE.MeshBasicMaterial({\n transparent: this.initialOpacity < 1,\n opacity: this.initialOpacity,\n map: texture,\n side: THREE.DoubleSide\n })\n try {\n await this.waitForVideoMetadata(texture)\n } catch (error) {\n material.dispose()\n throw error\n }\n const points = getPositionsByObjectFit(this.objectFit, this.cornerPoints, texture.image.videoWidth / texture.image.videoHeight)\n const mesh = new QuadrangleMesh(points, material)\n mesh.name = 'videoMesh'\n mesh.position.copy(new Vector3(0, 0, 0))\n\n // 往前拉一点,避免 z-fighting\n const normal = getNormal(points).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n mesh.position.add(normal)\n\n return mesh\n })()\n\n if (generation !== this.loadGeneration || this.playbackDisposed) {\n if (videoMesh && videoMesh !== this.videoMesh) {\n videoMesh.geometry.dispose()\n videoMesh.material.dispose()\n }\n return\n }\n if (!videoMesh) return\n\n // 添加点击监听\n this.domEvents.addAutoBindEventListener(\n videoMesh,\n 'click',\n () => {\n if (!this.videoInstance.paused && this.videoInstance?.muted) {\n void this.play(false, true).catch(error => console.error('Video play failed', error))\n } else {\n this.pause()\n }\n },\n { noEmitWhenHide: true },\n )\n\n const videoInstance = ((videoMesh.material as THREE.MeshBasicMaterial).map as VideoTexture).image\n this.onVideoReady?.(videoInstance)\n videoInstance.addEventListener('playing', () => {\n if (this.playbackController && (!this.session || this.session.signal.aborted)) return\n // 被动的开始播放时:\n // 没有封面图能看到视频在播,所以需要去掉播放按钮\n // 有封面图的因为看不到视频在播,所以就不用管\n if (!this.coverMesh) this.remove(this.buttonMesh)\n this.render()\n })\n\n videoInstance.addEventListener('pause', () => {\n if (!this.videoInstance.paused) return // 部分版本的微信中,会莫名其妙在第一次播放前触发一次 'pause' 事件,实际上并没有暂停\n this.showPauseUI()\n this.render()\n })\n\n if (!this.children.includes(this.videoMesh)) {\n this.add(videoMesh)\n this.videoMesh = videoMesh\n this.videoInstance = videoInstance\n }\n return videoMesh\n }\n\n private async addButtonMesh() {\n if (this.playbackDisposed) return\n const generation = this.loadGeneration\n if (this.children.includes(this.buttonMesh)) return\n const buttonMesh = await (async () => {\n if (this.buttonMesh) return this.buttonMesh\n\n // const videoMeshWidth = this.videoMesh?.geometry.points[0].distanceTo(this.videoMesh.geometry.points[1]) ?? Infinity\n const videoMeshHeight = this.videoMesh?.geometry.points[0].distanceTo(this.videoMesh.geometry.points[3]) ?? Infinity\n // const coverMeshWidth = this.coverMesh?.geometry.points[0].distanceTo(this.coverMesh.geometry.points[1]) ?? Infinity\n const coverMeshHeight = this.coverMesh?.geometry.points[0].distanceTo(this.coverMesh.geometry.points[3]) ?? Infinity\n // const wrapperWidth = this.cornerPoints[0].distanceTo(this.cornerPoints[1])\n const wrapperHeight = this.cornerPoints[0].distanceTo(this.cornerPoints[3])\n\n // const minContentWidth = Math.min(videoMeshWidth, coverMeshWidth, wrapperWidth)\n const minContentHeight = Math.min(videoMeshHeight, coverMeshHeight, wrapperHeight)\n const scale = (minContentHeight / wrapperHeight) * 0.3\n\n // material\n const { texture, transparent } = await this.getImageTexture(this.buttonSrc)\n // geometry\n const point = getPositionsByObjectFit('contain', this.cornerPoints, texture.image.width / texture.image.height)\n const mesh = new QuadrangleMesh(point, new FragmentTransparencyMaterial(texture))\n mesh.position.copy(new Vector3(0, 0, 0))\n mesh.name = 'buttonMesh'\n mesh.scale.set(scale, scale, scale)\n mesh.material.side = THREE.DoubleSide\n\n // 往前拉一点,确保在 videoMesh 前面(videoMesh 也有 Z_FIGHTING_OFFSET)\n const normal = getNormal(point).multiplyScalar(CONST.Z_FIGHTING_OFFSET * 2)\n mesh.position.add(normal)\n\n return mesh\n })()\n\n if (generation !== this.loadGeneration || this.playbackDisposed) {\n if (buttonMesh !== this.buttonMesh) {\n buttonMesh.geometry.dispose()\n buttonMesh.material.dispose()\n }\n return\n }\n if (buttonMesh !== this.buttonMesh) {\n this.domEvents.addAutoBindEventListener(\n buttonMesh,\n 'click',\n () => {\n void this.play(false, true).catch(error => console.error('Video play failed', error))\n },\n { noEmitWhenHide: true },\n )\n }\n if (!this.children.includes(this.buttonMesh)) {\n this.add(buttonMesh)\n this.buttonMesh = buttonMesh\n }\n return buttonMesh\n }\n\n private async getImageTexture(src: string) {\n return this.mediaTextures.getImage(this.textureOwner, src)\n }\n\n private getVideoTexture(src: string) {\n // 缓存 key 带上归属标签:多块屏幕用同一个视频地址时各自持有 video 元素,\n // 否则重置进度、暂停等操作会互相干扰。未指定归属时沿用按 src 共享的旧行为。\n return this.mediaTextures.getVideo(this.textureOwner, src, this.cacheScope)\n }\n\n private waitForVideoMetadata(texture: VideoTexture): Promise<void> {\n this.cancelMetadataWait?.()\n if (texture.metadataLoaded) return Promise.resolve()\n const video = texture.image\n return new Promise<void>((resolve, reject) => {\n let settled = false\n const finish = (error?: Error) => {\n if (settled) return\n settled = true\n video.removeEventListener('error', onError)\n if (this.cancelMetadataWait === cancel) this.cancelMetadataWait = undefined\n if (error) reject(error)\n else resolve()\n }\n const onError = () => {\n if (!video.error) return\n const error = new Error(`Video metadata failed (code ${video.error.code})`)\n error.name = 'MediaError'\n finish(error)\n }\n const cancel = () => finish(new DOMException('Video metadata wait canceled', 'AbortError'))\n this.cancelMetadataWait = cancel\n video.addEventListener('error', onError)\n // Keep the loader's readiness semantics, including its WeChat poster step.\n texture.metadataReady.then(() => finish(), finish)\n onError()\n })\n }\n\n public async changePointsOrParams(props: { cornerPoints: Vector3[]; params?: { objectFit?: ObjectFit } }) {\n const { cornerPoints, params } = props\n\n // 更新 cornerPoints\n if (cornerPoints) {\n this.cornerPoints = cornerPoints\n this.position.copy(centerPoint(...cornerPoints))\n }\n\n // 更新 objectFit\n if (params?.objectFit) {\n this.objectFit = params.objectFit\n }\n\n // 重新计算并更新所有 mesh 的位置\n await this.updateAllMeshes()\n }\n\n private async updateAllMeshes() {\n // 更新 videoMesh\n if (this.videoMesh) {\n await this.updateVideoMesh()\n }\n\n // 更新 coverMesh\n if (this.coverMesh) {\n await this.updateCoverMesh()\n }\n\n // 更新 buttonMesh\n if (this.buttonMesh) {\n await this.updateButtonMesh()\n }\n\n this.render()\n }\n\n private async updateVideoMesh() {\n if (!this.videoMesh || !this.src) return\n\n const texture = this.getVideoTexture(this.src)\n await texture.metadataReady\n const points = getPositionsByObjectFit(this.objectFit, this.cornerPoints, texture.image.videoWidth / texture.image.videoHeight)\n\n const center = centerPoint(...points)\n const geometryPositions = points.map((p) => p.clone().sub(center))\n const newGeometry = new QuadrangleGeometry(geometryPositions)\n\n this.videoMesh.geometry.dispose()\n this.videoMesh.geometry = newGeometry\n this.videoMesh.position.copy(new Vector3(0, 0, 0))\n\n // 往前拉一点,避免 z-fighting\n const normal = getNormal(points).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n this.videoMesh.position.add(normal)\n }\n\n private async updateCoverMesh() {\n if (!this.coverMesh || !this.videoCoverSrc) return\n\n const { texture } = await this.getImageTexture(this.videoCoverSrc)\n const points = getPositionsByObjectFit(this.objectFit, this.cornerPoints, texture.image.width / texture.image.height)\n const center = centerPoint(...points)\n const geometryPositions = points.map((p) => p.clone().sub(center))\n const newGeometry = new QuadrangleGeometry(geometryPositions)\n\n this.coverMesh.geometry.dispose()\n this.coverMesh.geometry = newGeometry\n this.coverMesh.position.copy(new Vector3(0, 0, 0))\n }\n\n private async updateButtonMesh() {\n if (!this.buttonMesh) return\n\n const { texture } = await this.getImageTexture(this.buttonSrc)\n const points = getPositionsByObjectFit('contain', this.cornerPoints, texture.image.width / texture.image.height)\n const center = centerPoint(...points)\n const geometryPositions = points.map((p) => p.clone().sub(center))\n const newGeometry = new QuadrangleGeometry(geometryPositions)\n\n // 重新计算缩放比例\n const videoMeshHeight = this.videoMesh?.geometry.points[0].distanceTo(this.videoMesh.geometry.points[3]) ?? Infinity\n const coverMeshHeight = this.coverMesh?.geometry.points[0].distanceTo(this.coverMesh.geometry.points[3]) ?? Infinity\n const wrapperHeight = this.cornerPoints[0].distanceTo(this.cornerPoints[3])\n const minContentHeight = Math.min(videoMeshHeight, coverMeshHeight, wrapperHeight)\n const scale = (minContentHeight / wrapperHeight) * 0.3\n\n this.buttonMesh.geometry.dispose()\n this.buttonMesh.geometry = newGeometry\n this.buttonMesh.position.copy(new Vector3(0, 0, 0))\n this.buttonMesh.scale.set(scale, scale, scale)\n\n // 重新计算 z-fighting 偏移,确保在 videoMesh 前面(videoMesh 也有 Z_FIGHTING_OFFSET)\n const normal = getNormal(points).multiplyScalar(CONST.Z_FIGHTING_OFFSET * 2)\n this.buttonMesh.position.add(normal)\n }\n}\n\nexport { ImagePlane, VideoPlane }\n","import type { State as FiveState } from '@realsee/five-webgpu'\nimport type { TagInstance } from '../typings'\n\ntype Distance = number\n\nexport class Cache {\n /**\n * @description 射线碰撞检测的距离缓存\n */\n public cache_raycasterDistance = new Map<string, Distance>()\n /**\n * @description 标签是否可见缓存\n */\n public cache_visible = new Map<string, boolean>()\n\n public constructor() {}\n\n public clear() {\n this.cache_visible.clear()\n this.cache_raycasterDistance.clear()\n }\n\n public static generateCameraTagKey(fiveState: Partial<FiveState>, tag: TagInstance, accurate = 3) {\n const state = { ...tag.five.getCurrentState(), ...fiveState }\n\n const cameraPosition = state.mode === 'Panorama' ? tag.workUtil.getObserverPosition(state.panoIndex) : tag.five.camera.position\n\n if (!cameraPosition) return\n\n const key = [\n //\n cameraPosition.x.toFixed(accurate),\n cameraPosition.y.toFixed(accurate),\n cameraPosition.z.toFixed(accurate),\n tag.id,\n ].join(',')\n\n return key\n }\n\n public getVisible(tag: TagInstance, fiveState: Partial<FiveState>, accurate = 1) {\n const key = Cache.generateCameraTagKey(fiveState, tag, accurate)\n if (key) {\n return this.cache_visible.get(key)\n }\n }\n\n public setVisible(tag: TagInstance, fiveState: Partial<FiveState>, visible: boolean, accurate = 1) {\n const key = Cache.generateCameraTagKey(fiveState, tag, accurate)\n if (key) {\n this.cache_visible.set(key, visible)\n }\n }\n}\n","import { calculateTagConfig } from '../utils/tag/calculateTagConfig'\nimport type * as THREE from 'three/webgpu'\nimport {\n type TagContentType,\n type StickType,\n type TagId,\n type MediaStore,\n type State,\n type PluginEventMap,\n type TagInstance,\n type Tag,\n type ContentTypeConfigKey,\n type ContentTypeConfigKeySplit,\n type TagConfig,\n defaultGlobalConfig,\n} from '../typings'\nimport { DefaultConfig } from '../tag.config'\nimport type { Tags } from '../typings'\nimport { normalPositionToPositions } from '../utils'\nimport { writable } from 'svelte/store'\nimport { isIOSWX } from '../../shared-utils/device'\nimport type { Five} from '@realsee/five-webgpu';\nimport { type Mode } from '@realsee/five-webgpu'\nimport { isMediaModelTag, isPlaneTag, isPoint3DTag } from '../utils/tag/tagCheck'\nimport { VideoPlane } from '../utils/model/mediaPlane'\nimport { TagMediaTextureCache } from '../utils/model/TagMediaTextureCache'\nimport { FiveDomEvents } from '../../shared-utils'\nimport { anyPositionToVector3 } from '../../shared-utils/positionToVector3'\nimport type { BaseTag } from './Tag/BaseTag'\nimport { Cache } from '../utils/Cache'\n\nimport * as BasePlugin from '../../base/BasePlugin'\nimport type { PointTag } from './Tag/PointTag'\nimport objectAssignDeep from 'object-assign-deep'\nimport entries from '../../shared-utils/typescript/entries'\nimport { isModelLike, isPanoramaLike } from '../../shared-utils'\nimport adaptConfig from '../utils/tag/adaptConfig'\n\ntype RenderQueueType = 'TagContainerSvelte'\n\nexport abstract class TagUtil extends BasePlugin.Controller<State, PluginEventMap> {\n public readonly mediaTextures = new TagMediaTextureCache()\n public tags: (BaseTag & { [key: string]: any })[] = []\n\n public cache = new Cache()\n\n public get container() {\n return this._container || this.five.getElement()?.parentElement\n }\n\n public set container(container: Element) {\n this._container = container\n }\n\n public config: Pick<Tags, 'globalConfig' | 'contentTypeConfig'> = DefaultConfig\n\n public renderQueue: Map<string, { keys: string[]; tags: BaseTag[] }> = new Map()\n\n\n public set tagsLengthWillUpdate(value: boolean) {\n if (value) {\n // 更新缓存:包含 2DPoint, 3DPoint, 3DBox, Polygon 和 Mask\n this._cache_pointTag = this.tags\n .filter(\n (tag) =>\n tag.stickType === '2DPoint' ||\n tag.stickType === '3DPoint' ||\n tag.stickType === '3DBox' ||\n tag.stickType === 'Polygon' ||\n tag.stickType === 'Mask',\n )\n .filter((tag) => tag.position) as any\n\n this._cache_2DPointTag = this.tags.filter((tag) => tag.stickType === '2DPoint').filter((tag) => tag.position) as any\n\n this._cache_css3DTag = this.tags\n .filter(\n (tag) =>\n tag.stickType === '3DPoint' || tag.stickType === 'Plane' || (tag.stickType === 'Model' && tag.contentType === 'MediaModel'),\n )\n .filter((tag) => {\n const renderType = tag.computeRenderType()\n return renderType === 'BehindDom' || renderType === 'Dom'\n }) as any\n }\n }\n\n /** 插件参数 */\n protected params: {\n config: Pick<Tags, 'contentTypeConfig' | 'globalConfig'>\n debug: boolean\n containerZIndex?: number\n }\n\n\n public mediaStore: MediaStore = writable({\n currentMediaElement: null,\n })\n\n protected store: {\n /** 清理函数数组 */\n disposers: (() => void)[]\n css3DRenderDisposer: Map<TagId, (() => void)[]>\n eventListenerDisposer?: () => void\n resizeObserverDisposer?: () => void\n resizeObserverDisposerAdding: boolean\n disposed: boolean\n } = {\n disposers: [],\n disposed: false,\n resizeObserverDisposerAdding: false,\n css3DRenderDisposer: new Map<TagId, (() => void)[]>(),\n }\n\n\n public domEvents = new FiveDomEvents(this.five)\n\n private _cache_pointTag?: PointTag[]\n private _cache_2DPointTag?: PointTag[]\n private _cache_css3DTag?: (BaseTag<TagContentType, 'Plane'> | BaseTag<TagContentType, 'Model'> | BaseTag<TagContentType, '3DPoint'>)[]\n\n public get filterPointTag() {\n return this._cache_pointTag ?? []\n }\n\n public get filter2DPointTag() {\n return this._cache_2DPointTag ?? []\n }\n\n public get filterCSS3DTag() {\n return this._cache_css3DTag ?? []\n }\n\n private _container: Element | null = null\n\n private timeoutIds: any[] = []\n\n protected constructor(five: Five) {\n super(five)\n this.mediaStore.subscribe(({ currentMediaElement }) => {\n this.tags.forEach((tag) => {\n if (tag.mediaPlane instanceof VideoPlane && currentMediaElement !== tag.mediaPlane.videoInstance) {\n if (!tag.mediaPlane.videoInstance?.src) return\n if (currentMediaElement === tag.mediaPlane.videoInstance) return\n tag.mediaPlane.pause()\n }\n })\n })\n }\n\n public updateFive(five: Five) {\n super.updateFive(five)\n this.domEvents.dispose()\n this.domEvents = new FiveDomEvents(five)\n }\n\n public addRenderQueue(params: { type: RenderQueueType; keys?: string[]; tags?: BaseTag[] }) {\n const { type, keys = [], tags = [] } = params\n if (!this.renderQueue.has(type)) {\n this.renderQueue.set(type, { keys, tags })\n } else {\n this.renderQueue.set(type, {\n keys: Array.from(new Set([...(this.renderQueue.get(type)!.keys ?? []), ...keys])),\n tags: Array.from(new Set([...(this.renderQueue.get(type)!.tags ?? []), ...tags])),\n })\n }\n }\n\n public getTagById<C extends TagContentType = TagContentType, S extends StickType = StickType>(id: TagId): BaseTag<C, S> | undefined {\n const tag = this.tags.find((tag) => {\n return tag.id === id\n })\n\n if (!tag) {\n console.warn(`getTagById Error: can't find tag id: ${id}`)\n return\n }\n return tag as BaseTag<C, S>\n }\n\n public whyHide = (tagId: TagId) => {\n const tag = this.getTagById(tagId)\n if (!tag) {\n return { reason: `tag ${tagId} not found` }\n }\n return tag.whyHide()\n }\n\n /** 暂停当前标签内进行的所有多媒体 */\n public pauseCurrentMedia() {\n this.mediaStore.set({ currentMediaElement: null })\n }\n\n /**\n * @description 获取标签配置\n */\n public getTagConfig(tag: Tag, params?: { useCache?: boolean; fiveMode?: Mode }) {\n const config = this.calculateTagConfig(tag, { useCache: params?.useCache })\n const fiveMode = params?.fiveMode ?? this.five.getCurrentState().mode\n const fiveModeConfig = config.configWithFiveMode?.[fiveMode]\n return fiveModeConfig ?? config ?? {}\n }\n\n protected loadVideoFirstFrame = () => {\n if (isIOSWX) this.hooks.emit('loadVideoFirstFrame')\n }\n\n protected getPositions(tag: BaseTag) {\n if (isPlaneTag(tag)) return tag.position\n if (isMediaModelTag(tag)) return tag.data.mediaPosition\n if (isPoint3DTag(tag))\n return normalPositionToPositions(this.five.camera.position, anyPositionToVector3(tag.position), anyPositionToVector3(tag.normal))\n }\n\n protected addObjectClickHandler(tag: BaseTag, object: THREE.Object3D | undefined, handler: (event: Event) => any) {\n if (!object || !this.domEvents) return () => {}\n\n const getTagVisible = () => {\n if (!tag.currentVisible) return false\n if (tag['loading']) return false\n return true\n }\n\n const _handler = (event: any) => {\n if (!getTagVisible()) return false\n handler(event.origDomEvent)\n }\n\n this.domEvents.addEventListener(object, 'click', _handler)\n\n return () => {\n this.domEvents?.removeEventListener(object, 'click', _handler)\n }\n }\n\n protected tagsDo = (tags: TagInstance[], func: (tag: TagInstance) => any, isUpdateing = true) => {\n // 排序,1000 个标签排序约 1ms\n let sortedTags = [...(tags ?? this.tags)].sort((a, b) => a.getSquaredDistance() - b.getSquaredDistance())\n\n this.timeoutIds.forEach((id) => clearTimeout(id))\n this.timeoutIds.length = 0\n\n // 先执行20个\n for (let i = 0; i < 20; i++) {\n const tag = sortedTags[i]\n if (tag) {\n func(tag)\n if (isUpdateing) tag._updating = false\n }\n }\n\n // 慢点执行剩下的\n sortedTags = sortedTags.slice(20)\n\n const tooLarge = sortedTags.length > 1000\n\n const delay = tooLarge ? 30 : 17 // ms\n\n const sizeEveryTimeout = tooLarge ? 1 : 3\n\n for (let i = 0; i < sortedTags.length; i += sizeEveryTimeout) {\n const tags: TagInstance[] = []\n\n for (let j = 0; j < sizeEveryTimeout; j++) {\n if (sortedTags[i + j]) tags.push(sortedTags[i + j])\n }\n\n tags.forEach((tag) => {\n if (isUpdateing) tag._updating = true\n })\n\n const timeoutId = setTimeout(() => {\n tags.forEach((t) => {\n func(t)\n if (isUpdateing) t._updating = false\n })\n }, i * delay)\n\n this.timeoutIds.push(timeoutId)\n }\n }\n\n /**\n * @description 检查是否已经销毁\n * @returns isDisposed; 已经销毁返回 true,否则返回 false\n */\n protected checkDisposed() {\n if (this.store.disposed) {\n console.error('PanoTagPluginController has been disposed')\n return true\n }\n return false\n }\n\n /**\n * @description 获取merge后的配置\n */\n protected calculateTagConfig(tag: Tag | TagInstance, params?: { useCache?: boolean }): TagInstance['computedConfig'] {\n return calculateTagConfig(tag, this.config, params)\n }\n}\n","import type {\n TagObjectGroup,\n TagGLTFObjectGroup,\n ImagePlaneGroup,\n TagContentType,\n ElementRenderer,\n TagRendererMap,\n TagContentTypeMapping,\n} from '../typings'\nimport type { TemporaryState } from '../typings'\nimport { Group } from 'three/webgpu'\nimport type { MountedComponent } from '../../shared-utils/svelte/component.svelte'\nimport type { Five } from '@realsee/five-webgpu'\nimport { TagUtil } from './TagUtil'\n\nexport abstract class TagRender extends TagUtil {\n public rendererMap: TagRendererMap = new Map()\n public contentTypeMap: TagContentTypeMapping = new Map()\n public group = new Group() as TagObjectGroup\n public imagePlaneGroup = new Group() as ImagePlaneGroup\n public gltfObjectGroup = new Group() as TagGLTFObjectGroup\n\n /** 维护一个可用模型表,用于快速删除不应该在场景中的模型 */\n protected enabledModelTagSet = new Set<string | number>()\n\n /** 临时状态 */\n public temporaryState: TemporaryState = { visible: true }\n\n /** 点标签 */\n public TagContainerSvelte?: MountedComponent<any>\n\n public constructor(five: Five) {\n super(five)\n // init group\n this.group.name = 'PanoTagPluginModelGroup'\n this.gltfObjectGroup.name = 'PanoTagPluginGLTFObjectGroup'\n this.imagePlaneGroup.name = 'ImagePlaneGroup'\n this.group.add(this.gltfObjectGroup)\n this.group.add(this.imagePlaneGroup)\n }\n\n /**\n * @description 设置 contentType 的渲染器\n * @param {string} contentType\n * 如果是 `TagContentType` 中的类型,将会覆盖掉插件内部默认的渲染器,\n * 如果是其他任意 string 如:'Foo',则可以将类似 `{id: 1, contentType: 'Foo', position: [0,0,0]}` 的 tag 交给插件渲染\n * @param config.usePoint 是否需要标签点, 默认为 false\n * @note 优先级低于 tag.element\n */\n public registerRenderer(contentType: string, renderer: ElementRenderer, config?: { usePoint?: boolean }) {\n this.rendererMap.set(contentType, { renderer, usePoint: config?.usePoint ?? false })\n }\n\n public bindRenderer(contentType: string, builtInRenderer: TagContentType) {\n this.contentTypeMap.set(contentType, builtInRenderer)\n }\n\n protected disposeAllCSS3DContainer() {\n for (const [, disposer] of this.store.css3DRenderDisposer) disposer?.forEach((d) => d?.())\n this.store.css3DRenderDisposer = new Map()\n }\n\n /**\n * @description 检查并销毁不用的3D贴片\n */\n protected clearUnusedPanelTag() {\n // 3D 转 2D 的时候要销毁 3D container\n this.filter2DPointTag.forEach((tag) => {\n tag.tag3DContentSvelte?.dispose()\n tag.tag3DContentSvelte = undefined\n })\n\n for (const [id, disposer] of this.store.css3DRenderDisposer) {\n const tag = this.getTagById(id)\n if (!tag || tag.stickType === '2DPoint') {\n disposer?.forEach((d) => d?.())\n this.store.css3DRenderDisposer.delete(id)\n }\n }\n }\n}\n","import safeObj from '../../shared-utils/safeObj'\nimport type PanoTagPluginController from '../controller'\nimport { addDebugPoints } from './addDebugPoints'\n\nexport class DebugUtil {\n public plugin: PanoTagPluginController\n\n public get debug() {\n return (this.plugin as any).debug as boolean\n }\n\n private logBound = false\n\n public constructor(plugin: PanoTagPluginController) {\n this.plugin = plugin\n }\n\n public addDebugPoints() {\n try {\n addDebugPoints(this.plugin.five, this.plugin.tags)\n } catch (error) {\n console.error(error)\n }\n }\n\n public bindLog() {\n if (this.logBound) return\n this.logBound = true\n\n this.bindLogByObject(this.plugin)\n this.bindLogByObject(this.plugin.constructor.prototype)\n }\n\n private log(functionName: string, ...args: any[]) {\n let stack = new Error().stack\n console.debug(\n `%cPanoTagPlugin%c${functionName}`,\n 'background-color: #35e0ed; color: black; padding:0 6px; border-radius: 3px',\n 'padding: 0 3px; color: #f3f47c',\n ...args,\n { stack },\n )\n }\n\n private bindLogByObject = (obj: any) => {\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') {\n obj[property] = new Proxy(obj[property], {\n apply: (target, thisArg, argumentsList) => {\n if (!['render'].includes(property)) {\n this.log(property, { obj }, ...argumentsList)\n }\n return target.apply(thisArg, argumentsList)\n },\n })\n }\n } catch (error) {}\n })\n }\n\n private closeIntersectRaycaster() {\n this.plugin.tags.forEach((tag) => {\n if (safeObj(tag?.initialConfig?.visibleConfig).intersectRaycaster) {\n ;(tag.initialConfig.visibleConfig as any).intersectRaycaster.enabled = false\n }\n })\n this.plugin.changeGlobalConfig({\n visibleConfig: {\n intersectRaycaster: {\n enabled: false,\n },\n },\n })\n }\n}\n","/**\n * @description 获取文件路径后缀\n */\nexport function getUrlExt(url: string) {\n const ext = url.split('?')[0].split('.').pop()\n return ext ? ext.toLowerCase() : ''\n}\n","import type { Work } from '@realsee/five-webgpu'\nimport { transformPosition } from './transformPosition'\n\nexport default function getFloorIndex(work: Work, point: { y: number }) {\n if (!work) return 0\n const observer = work.observers\n if (!point || !observer) {\n console.error('getFloorIndex: invalid arguments: ', { point, observer })\n return 0\n }\n const floorY: number[][] = []\n observer.forEach((o) => {\n const floorIndex = o.floorIndex ?? (o as any).floor_index ?? 0\n if (!floorY[floorIndex]) floorY[floorIndex] = []\n floorY[floorIndex].push(transformPosition(o.position, work.options?.transform).y)\n })\n const floorAverageY = floorY.map((y) => y.reduce((a, b) => a + b, 0) / y.length)\n\n for (let i = floorAverageY.length - 1; i > 0; i--) {\n if (point.y >= floorAverageY[i]) return i\n }\n return 0\n}\n","import * as THREE from 'three/webgpu'\n\nexport type RaycasterStartPointMode = 'observer' | 'horizontal'\n\n/**\n * @description 计算碰撞检测射线的起点\n * @param observerPosition 观察点位置(全景态)或相机位置(模型态),含真实高度\n * @param checkPoint 检测点(标签中心点或角点)\n * @param mode\n * - `observer`:直接使用观察点位置,射线是斜的,可能从矮柜/栏杆上方越过\n * - `horizontal`:与检测点保持水平,y 取检测点高度、x/z 取观察点的值,\n * 用于判定「当前点位与检测点的水平连线是否被模型挡住」\n */\nexport function getRaycasterStartPosition(\n observerPosition: THREE.Vector3,\n checkPoint: THREE.Vector3,\n mode: RaycasterStartPointMode = 'observer',\n): THREE.Vector3 {\n if (mode !== 'horizontal') return observerPosition\n return new THREE.Vector3(observerPosition.x, checkPoint.y, observerPosition.z)\n}\n","import type { PlaybackManager } from '../../../shared-utils/playback'\nimport type { MountedComponent } from '../../../shared-utils/svelte/component.svelte'\nimport type { Mode, State as FiveState } from '@realsee/five-webgpu'\nimport type PanoTagPluginController from '..'\nimport type {\n ArrayPosition,\n BoxPosition,\n PolygonPosition,\n Position,\n StickType,\n Tag,\n TagClickParams,\n TagConfig,\n TagContentType,\n Tag as TagData,\n TagEvents,\n TagGLTFObject,\n TagId,\n} from '../..'\nimport { Subscribe } from '../../../shared-utils/Subscribe'\nimport { calculateTagConfig } from '../../utils/tag/calculateTagConfig'\nimport { getTagStickType } from '../../utils/tag/format'\nimport { isModelLike, isNil, isPanoramaLike, notNil, reblink, blink, uuid, lookPoint } from '../../../shared-utils'\nimport objectAssignDeep from 'object-assign-deep'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { transformPosition } from '../../../shared-utils/five/transformPosition'\nimport * as THREE from 'three/webgpu'\nimport { checkRange, getTagCenterPosition, getTagPosition } from '../../utils'\nimport { centerPoint } from '../../../shared-utils/three/centerPoint'\nimport { isMediaModelTag, isMediaPlaneTag } from '../../utils/tag/tagCheck'\nimport { getUrlExt } from '../../../shared-utils/url/getUrl'\nimport getFloorIndex from '../../../shared-utils/five/getFloorIndex'\nimport type { ImagePlane, VideoPlane } from '../../utils/model/mediaPlane'\nimport safeObj from '../../../shared-utils/safeObj'\nimport { toArray } from '../../../shared-utils/util'\nimport { Cache } from '../../utils/Cache'\nimport type { BlinkOptions } from '../../../shared-utils/three/blink'\nimport type { Create3DDomContainerReturnType } from '../../../CSS3DRenderPlugin'\nimport type TagContentSvelte from '../../Components/Tag/index.svelte'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { LiteralUnion } from 'type-fest'\nimport { vectorToCoordinates } from '../../../shared-utils/vectorToCoordinate'\nimport { _raycaster } from '../../../shared-utils/three/temp'\nimport { getRaycasterStartPosition } from '../../utils/tag/getRaycasterStartPosition'\nimport { withResolvers } from '../../../shared-utils/promise/withResolvers'\nimport type { CSS3DObjectPlus } from '../../../shared-utils/CSS3DRender/CSS3DObject'\nimport type { Rectangle } from '../../../Sculpt/Objects/Rectangle'\nimport type { FiveLine as Line } from '../../../shared-utils/five/FiveLine'\nimport type { Box } from '../../../Sculpt/Objects/Box'\nimport type { Polygon } from '../../../Sculpt/typings'\n\n/**\n * @description 标签实例\n * @property `id` 标签id\n * @property `contentType` 标签内容类型\n * @property `stickType` 标签附着点类型\n * @property `state` 标签状态\n * @property `centerPosition` 标签位置\n * @property `currentConfig` 当前配置\n * @property `hooks` 事件钩子\n * @property `plugin` 标签所属插件的实例\n * @function `enable()` 启用\n * @function `disable()` 禁用\n * @function `blink()` 闪烁\n * @function `unfold()` 展开\n * @function `fold()` 收起\n * @function `setData()` 修改标签数据\n * @function `setPosition()` 修改标签位置\n * @function `find()` 找到标签\n */\nexport abstract class BaseTag<C extends TagContentType = TagContentType, S extends StickType = StickType> implements Tag {\n public plugin: PanoTagPluginController\n\n public id: TagId\n\n public contentType: LiteralUnion<C, string>\n\n public stickType: S\n\n public enabled: boolean\n\n public config: TagConfig\n\n public data: Tag<C, S>['data']\n\n public get visible() {\n return this.temporaryState?.visible !== false && this.state.visible !== false && this.enabled !== false\n }\n\n public state: { visible: boolean; unfolded: boolean }\n\n public temporaryState: { visible: boolean } = { visible: true }\n\n public originPosition: Tag<C, S>['position']\n\n public position: Tag<C, S>['position']\n\n public fiveState?: Partial<FiveState>\n\n public model?: {\n promise: Promise<TagGLTFObject>\n object?: TagGLTFObject\n }\n\n public matrix?: number[]\n\n public screenPosition: { leftPx: number; topPx: number; scale: number } | null\n\n public normal?: Position\n\n public mediaPlane?: ImagePlane | VideoPlane\n\n public tagNormalLine: Line\n\n public hooks: Subscribe<TagEvents<C>>\n\n public zIndex?: number\n\n public manuallyOperated = false\n\n public normalLineLength?: number\n\n private mediaManagerOverride?: PlaybackManager\n private mediaManagerBindings = new Set<(host?: PlaybackManager) => void>()\n public get mediaManager(): PlaybackManager | undefined { return this.mediaManagerOverride ?? this.plugin.mediaManager }\n /** Bind this tag to a parent media task; undefined restores the plugin host. */\n public setMediaManager(host?: PlaybackManager) {\n if (host === this.mediaManagerOverride) return\n this.mediaManagerOverride = host\n this.mediaManagerBindings.forEach((bind) => bind(this.mediaManager))\n }\n public bindMediaManager(bind: (host?: PlaybackManager) => void): () => void {\n this.mediaManagerBindings.add(bind)\n return () => this.mediaManagerBindings.delete(bind)\n }\n public play?: (userAction?: boolean) => void\n public pause?: () => void\n\n public get five() {\n return this.plugin.five\n }\n\n public get fiveUtil() {\n return this.plugin.fiveUtil\n }\n\n public get workUtil() {\n return this.plugin.workUtil\n }\n\n public get centerPosition() {\n const tagPosition = getTagPosition(this)\n return centerPoint(...(Array.isArray(tagPosition) ? tagPosition : [tagPosition]))\n }\n\n public get currentConfig() {\n const config = calculateTagConfig(this, this.plugin.config, { useCache: true })\n const fiveMode = this.five.getCurrentState().mode\n const fiveModeConfig = config.configWithFiveMode?.[fiveMode]\n return fiveModeConfig ?? config ?? {}\n }\n\n public get currentVisible() {\n if (!this.plugin.state.enabled) return false\n if (!this.plugin.state.visible) return false\n\n if (!this.enabled) return false\n if (!this.state.visible) return false\n\n return true\n }\n\n public tag3DContentSvelte?: {\n svelteApp: MountedComponent<any>\n css3DInstance: CSS3DObjectPlus\n initialNormal: THREE.Vector3\n currentNormal: THREE.Vector3\n dispose: () => void\n }\n public rectanglePlane?: Rectangle\n public boxShape?: Box\n public polygonShape?: Polygon\n\n public dom?: HTMLDivElement\n public contentDom?: HTMLDivElement\n\n public initialConfig: TagData['config']\n private computedConfig: TagData['config'] & {\n configWithFiveMode?: Partial<Record<Mode, TagData['config']>>\n }\n\n /**\n * 存储当前的闪烁动画实例\n * @private\n */\n private _currentBlinkInstance?: any\n\n public cache: Cache\n\n public entryFromModel?: boolean\n\n public get sharedCache() {\n return this.plugin.cache\n }\n\n public _updating = false\n\n /**\n * 是否启用 hover 行为,默认 为config.popoverConfig.enabled\n */\n public hoverEnabled: boolean\n\n constructor(plugin: PanoTagPluginController, tagData: TagData) {\n this.plugin = plugin\n\n const stickType = getTagStickType(tagData)\n tagData.stickType = stickType\n\n // TODO: 这种方式有bug(initialData中设置的函数会不生效),不过目前不影响,后续得自己做一个 setObjectDefaultDeep 的方法,将initialData深度初始化到data中\n const freezeTagData = JSON.parse(JSON.stringify(tagData.data))\n const initialConfig = objectAssignDeep({}, tagData.config ?? {})\n const computedConfig = calculateTagConfig(tagData, plugin.config)\n const currentConfig = this.getConfig(tagData)\n\n tagData.config = currentConfig\n\n this.id = tagData.id ?? uuid()\n this.enabled = tagData.enabled ?? true\n\n this.contentType = tagData.contentType as any\n\n this.hoverEnabled = currentConfig.popoverConfig?.enabled ?? true\n\n this.data = currentConfig.initialData?.important\n ? objectAssignDeep(tagData.data, freezeTagData, currentConfig.initialData)\n : objectAssignDeep(tagData.data, currentConfig.initialData, freezeTagData)\n\n // 初始化 unfolded 状态,考虑 unfoldedConfig.keep 设置\n let initialUnfolded: boolean\n\n if (typeof currentConfig.unfoldedConfig === 'object') {\n if (currentConfig.unfoldedConfig.keep === 'unfolded') {\n initialUnfolded = true\n } else if (currentConfig.unfoldedConfig.keep === 'folded') {\n initialUnfolded = false\n } else {\n initialUnfolded = !this.can('fold') // 没有 keep 设置,根据能否折叠决定初始状态\n }\n } else {\n initialUnfolded = !this.can('fold') // 没有 unfoldedConfig 对象,根据能否折叠决定初始状态\n }\n\n this.state = {\n visible: undefined,\n unfolded: initialUnfolded,\n ...currentConfig.initialState,\n } as any\n\n // 若启用了 popoverConfig,则无论 unfoldedConfig.keep 如何设置,都强制 unfolded 为 false\n if (this.isPopoverConfigEnabled()) {\n this.state.unfolded = false\n }\n\n this.normalLineLength = tagData.style?.point?.normalLen\n this.originPosition = tagData.position as any\n\n this.position = (() => {\n const position = this.originPosition\n const matrix4 = plugin.workUtil.transform\n\n // 3DBox 类型特殊处理\n if (tagData.stickType === '3DBox') {\n // 如果没有 position,提供默认值兜底\n if (!position) {\n return {\n start: [0, 0, 0],\n end: [0, 0, 0],\n rotation: [0, 0, 0],\n } as any\n }\n const { start, end, rotation } = position as BoxPosition\n return {\n start: anyPositionToVector3(start.map((p: any) => Number(p))).toArray(),\n end: anyPositionToVector3(end.map((p: any) => Number(p))).toArray(),\n rotation: anyPositionToVector3(rotation.map((p: any) => Number(p))).toArray(),\n } as any\n }\n\n // Polygon 类型特殊处理\n if (tagData.stickType === 'Polygon') {\n // 如果没有 position,提供默认值兜底\n if (!position) {\n return [] as any\n }\n // 直接使用原始坐标,不进行转换\n return (position as PolygonPosition).map(anyPositionToVector3).map((p) => transformPosition(p, matrix4).toArray()) as any\n }\n\n if (!position) return\n\n let finalPosition = position\n if (Array.isArray(position) && position.length === 4) {\n finalPosition = position.map(anyPositionToVector3).map((p) => transformPosition(p, matrix4).toArray()) as any\n } else {\n finalPosition = transformPosition(anyPositionToVector3(position as Position), matrix4).toArray() as any\n }\n if (\n (tagData.stickType === '2DPoint' || tagData.stickType === '3DPoint') &&\n currentConfig?.tagNormalLineConfig?.enabled &&\n tagData.normal &&\n this.normalLineLength\n ) {\n const normalVector = new THREE.Vector3().fromArray(tagData.normal)\n finalPosition = new THREE.Vector3()\n .fromArray(finalPosition as Position)\n .clone()\n .add(normalVector.clone().setLength(this.normalLineLength))\n .toArray() as any\n }\n return finalPosition\n })()\n\n const modelMatrix = tagData.stickType === 'Model' ? (tagData as Tag<TagContentType, 'Model'>).matrix : undefined\n this.matrix = modelMatrix ? new THREE.Matrix4().fromArray(modelMatrix).premultiply(plugin.workUtil.transform).toArray() : undefined\n\n this.initialConfig = initialConfig\n this.computedConfig = computedConfig\n this.stickType = stickType as any\n this.config = tagData.config\n this.fiveState = tagData.fiveState\n this.normal = tagData.normal\n this.cache = new Cache()\n this.hooks = new Subscribe()\n\n Object.keys(tagData).forEach((key) => {\n if (this[key] === undefined && tagData[key] !== undefined) this[key] = tagData[key]\n })\n }\n\n /**\n * @description 使 state.visible 生效,但是只是加入渲染队列。等下次渲染时再真正生效\n */\n public applyVisible() {\n throw new Error('Method not implemented.')\n }\n\n /**\n * @description 找到标签\n */\n public async find(params?: { targetMode?: 'Panorama' | 'Mapview'; pointConfig?: Parameters<typeof lookPoint>[2] }) {\n const tagFiveState = this.fiveState\n if (!this.fiveState) return this\n\n const targetMode = params?.targetMode ?? this.five.state.mode\n\n if (targetMode === 'Panorama') {\n const targetPanoIndex = tagFiveState?.panoIndex\n if (isNil(targetPanoIndex)) return this\n\n const observerPosition = this.workUtil.getObserverPosition(targetPanoIndex)\n const vector = this.centerPosition.clone().sub(observerPosition).normalize()\n\n this.five.setState({\n mode: 'Panorama',\n workCode: this.workUtil.workCode,\n panoIndex: targetPanoIndex,\n ...vectorToCoordinates(vector),\n })\n await this.five.ready()\n } else if (targetMode === 'Mapview') {\n await lookPoint(this.five, this.centerPosition, params?.pointConfig)\n }\n\n return this\n }\n\n /**\n * @description 获取额外的闪烁目标(子类可以重写此方法添加额外的闪烁目标,如法线等)\n * @returns 额外的闪烁目标或目标数组,返回 null/undefined 表示没有额外目标\n */\n protected getAdditionalBlinkTargets(): any | any[] | null {\n return null\n }\n\n /**\n * @description 闪烁\n */\n public async blink(animeConfig?: BlinkOptions) {\n await this.ready()\n\n // 如果当前正在进行 blink 动画,先中断它\n if (this._currentBlinkInstance && !this._currentBlinkInstance.completed) {\n this._currentBlinkInstance.finish?.()\n this._currentBlinkInstance = undefined\n }\n\n const enabled = this.enabled ?? true\n const visible = this.state?.visible\n\n const tagVisible = enabled && visible\n\n // 看不到的标签要强行看到然后闪一下\n if (tagVisible === false) {\n this.state.visible = true\n this.enabled = true\n this.applyVisible()\n this.plugin.render()\n\n if (this.computeRenderType() !== 'Mesh') {\n // 等待dom更新\n await new Promise<void>((resolve) => {\n if (this.dom || this.contentDom) {\n resolve()\n return\n }\n const id = setInterval(() => {\n if (this.dom || this.contentDom) {\n resolve()\n clearInterval(id)\n }\n }, 16.7)\n })\n } else {\n // 等待mesh更新\n if (this.stickType === 'Model' && !this.model?.object) {\n await this.model?.promise\n } else if (this.stickType === 'Plane') {\n await new Promise<void>((resolve) => {\n if (this.mediaPlane) {\n resolve()\n return\n }\n const id = setInterval(() => {\n if (this.mediaPlane) {\n resolve()\n clearInterval(id)\n }\n }, 16.7)\n })\n }\n }\n if (this.dom) this.dom.style.visibility = 'hidden'\n if (this.contentDom) this.contentDom.style.visibility = 'hidden'\n }\n\n const tagDom: any[] = (() => {\n const list = []\n\n // 2d point\n list.push(this.dom)\n // 3d content\n list.push(this.tag3DContentSvelte?.css3DInstance?.container)\n\n list.push(this.model?.object)\n list.push(this.mediaPlane)\n list.push(this.boxShape)\n list.push(this.polygonShape)\n\n // 添加子类可以扩展的额外闪烁目标(如法线等)\n const additionalTargets = this.getAdditionalBlinkTargets()\n if (additionalTargets) {\n // 统一转换为数组后展开,避免嵌套数组\n const targets = Array.isArray(additionalTargets) ? additionalTargets : [additionalTargets]\n list.push(...targets)\n }\n\n return list.filter(Boolean)\n })()\n\n if (!tagDom.length) {\n console.warn('tagDom is empty')\n return\n }\n\n const blinkFunc = tagVisible ? blink : reblink\n\n // 存储当前动画实例\n this._currentBlinkInstance = blinkFunc(tagDom, {\n onStart: () => {\n if (tagVisible === false) {\n if (this.dom) this.dom.style.visibility = ''\n if (this.contentDom) this.contentDom.style.visibility = ''\n }\n },\n updateRender: () => {\n this.five.needsRender = true\n },\n ...animeConfig,\n })\n\n try {\n await this._currentBlinkInstance.finished\n } catch (error) {\n // 动画被中断时可能会抛出错误,这里捕获并忽略\n console.debug('Blink animation interrupted:', error)\n } finally {\n // 清理动画实例引用\n this._currentBlinkInstance = undefined\n }\n\n if (enabled === false) {\n this.enabled = false\n this.updateVisible()\n }\n if (visible === false) {\n this.updateVisible()\n }\n\n if (tagVisible === false) {\n if (this.dom) this.dom.style.visibility = ''\n if (this.contentDom) this.contentDom.style.visibility = ''\n }\n }\n\n /**\n * @description 展开\n */\n public unfold() {}\n\n /**\n * @description 展开自己,收起其他标签\n */\n public unfoldAndFoldOthers() {}\n\n /**\n * @description 收起\n */\n public fold() {}\n\n /**\n * @description 启用\n */\n public enable() {\n this.enabled = true\n this.hooks.emit('enable')\n this.five.needsRender = true\n this.applyVisible()\n }\n\n /**\n * @description 禁用\n */\n public disable() {\n this.enabled = false\n this.hooks.emit('disable')\n this.rectanglePlane?.delete()\n this.boxShape?.delete()\n this.polygonShape?.delete()\n this.five.needsRender = true\n this.applyVisible()\n }\n\n /**\n * @description 修改标签数据\n * @param deepMerge 是否深度合并 data,默认为 true\n */\n public setData(data: PartialObjectDeep<Tag<C>['data']>, deepMerge = true) {\n if (deepMerge) {\n this.data = objectAssignDeep(this.data, data)\n } else {\n this.data = { ...this.data, ...data }\n }\n this.hooks.emit('dataChanged', this.data)\n }\n\n /**\n * @description 修改标签位置\n */\n public setPosition(position: Tag<C>['position']) {\n throw new Error('Method not implemented.')\n }\n\n /**\n * @description 设置标签实例的属性\n * @param deepMerge 是否深度合并 data,默认为 true\n */\n public set(tag: PartialObjectDeep<Tag<C>>, deepMerge = true) {\n this.plugin.tagsLengthWillUpdate = true\n\n if (deepMerge) {\n objectAssignDeep(this, tag)\n } else {\n Object.assign(this, tag)\n }\n\n this.cache.clear()\n }\n\n public updateConfig() {\n const computedConfig = this.getConfig(undefined, { useCache: false })\n this.computedConfig = computedConfig\n\n const config = this.getConfig()\n this.config = config\n\n if (this.config.initialData) {\n const freezeTagData = JSON.parse(JSON.stringify(this.data))\n this.data = config.initialData?.important\n ? objectAssignDeep(this.data, freezeTagData, config.initialData)\n : objectAssignDeep(this.data, config.initialData, freezeTagData)\n }\n\n this.cache.clear()\n }\n\n public updateVisible() {\n if (!this.enabled) {\n this.applyVisible()\n } else {\n this.state.visible = this.getVisible()\n this.applyVisible()\n }\n this.five.needsRender = true\n this._updating = false\n }\n\n public updateZIndex() {\n const distance = this.getSquaredDistance()\n this.zIndex = Math.round((10000 - (distance ?? 0)) * 100)\n }\n\n public getConfig(tagData?: TagData, params?: { useCache?: boolean; fiveMode?: Mode }): TagConfig {\n const config = calculateTagConfig(tagData ?? this, this.plugin.config, { useCache: params?.useCache })\n const fiveMode = params?.fiveMode ?? this.five.getCurrentState().mode\n const fiveModeConfig = config.configWithFiveMode?.[fiveMode]\n return fiveModeConfig ?? config ?? {}\n }\n\n public getDistance(fiveState?: Partial<FiveState>, accurate = 3) {\n const state = { ...this.five.getCurrentState(), ...fiveState }\n const { panoIndex, mode } = state\n\n const cameraPosition = mode === 'Panorama' ? this.workUtil.getObserverPosition(panoIndex) : this.five.camera.position\n const tagPosition = this.centerPosition\n\n if (!cameraPosition || !tagPosition) return -1\n\n const distance = cameraPosition.distanceTo(tagPosition)\n\n return distance\n }\n\n /**\n * @description 用于排序的距离,性能更好\n */\n public getSquaredDistance() {\n const cameraPosition = this.five.camera.position\n\n // 处理 3DBox 类型\n if (this.stickType === '3DBox') {\n const boxPosition = this.position as any\n if (!boxPosition || !boxPosition.start) return Infinity\n // 使用 Box 的 start 点作为参考点\n const p = boxPosition.start\n return (p[0] - cameraPosition.x) ** 2 + (p[1] - cameraPosition.y) ** 2 + (p[2] - cameraPosition.z) ** 2\n }\n\n // 处理 Polygon 类型\n if (this.stickType === 'Polygon') {\n const polygonPosition = this.position as any[]\n if (!polygonPosition || polygonPosition.length === 0) return Infinity\n // 使用第一个点作为参考点\n const p = polygonPosition[0]\n return (p[0] - cameraPosition.x) ** 2 + (p[1] - cameraPosition.y) ** 2 + (p[2] - cameraPosition.z) ** 2\n }\n\n let p: ArrayPosition\n if (!this.position) {\n console.log(this, 'no position')\n }\n if (Array.isArray(this.position[0])) p = this.position[0] as ArrayPosition\n else p = this.position as ArrayPosition\n\n return (p[0] - cameraPosition.x) ** 2 + (p[1] - cameraPosition.y) ** 2 + (p[2] - cameraPosition.z) ** 2\n }\n\n public getVisible(fiveState?: Partial<FiveState>) {\n if (!this.enabled) return false\n if (!this.plugin.state.enabled) return false\n if (!this.fiveUtil.model) return false\n const state = { ...this.five.getCurrentState(), ...fiveState }\n let visible = this.cache.getVisible(this, state)\n if (isNil(visible)) {\n visible = this.computeVisible(state).value\n this.cache.setVisible(this, state, visible)\n }\n return visible\n }\n\n public getUnfoldedByPanoIndex(panoIndex?: number) {\n const visible = this.currentVisible\n if (!visible) return\n\n const unfolded = this.computeUnfoldedByPanoIndex(panoIndex)\n\n if (unfolded) {\n const unfoldedByCamera = this.getUnfoldedByCamera()\n return unfoldedByCamera\n }\n\n return unfolded\n }\n\n public getUnfoldedByCamera() {\n const visible = this.currentVisible\n if (!visible) return\n const unfolded = this.computeUnfoldedByCamera()\n return unfolded\n }\n\n public can(action: 'show' | 'hide' | 'fold' | 'unfold'): boolean {\n // popoverConfig.enabled 开启后,unfoldedConfig 失效\n if ((action === 'fold' || action === 'unfold') && this.currentConfig?.popoverConfig?.enabled === true) {\n return false\n }\n const config = this.currentConfig\n if (!config || typeof config !== 'object') return true\n if (action === 'show' || action === 'hide') {\n if (!config.visibleConfig || typeof config.visibleConfig !== 'object') return true\n if (action === 'show') {\n if (config.visibleConfig.keep === 'hidden') return false\n }\n if (action === 'hide') {\n if (config.visibleConfig.keep === 'visible') return false\n }\n }\n\n if (action === 'fold' || action === 'unfold') {\n if (!config.unfoldedConfig || typeof config.unfoldedConfig !== 'object') return true\n if (action === 'fold') {\n if (config.unfoldedConfig.keep === 'unfolded') return false\n }\n if (action === 'unfold') {\n if (config.unfoldedConfig.keep === 'folded') return false\n }\n }\n\n return true\n }\n\n public onClick(params: Pick<TagClickParams, 'target'>) {}\n\n public abstract computeNormal(): THREE.Vector3 | undefined\n\n public computeRenderType() {\n const renderType = (() => {\n if (this.stickType === '3DPoint') return 'Dom'\n\n const config = this.getConfig()\n if (!config || typeof config !== 'object' || !config.renderType) return\n // 如果是营销贴片,直接返回配置的renderType\n const media = this.data.mediaData\n if (!media || media.length === 0) {\n if (isMediaPlaneTag(this)) return config.renderType\n }\n\n if (config.renderType === 'Mesh') {\n if (isMediaPlaneTag(this)) {\n // 仅单张的营销贴片才能渲染成mesh\n if (media.length === 1) {\n if (media[0].type === 'Video') {\n // 啥比火狐\n const isMobileFirefox =\n navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && navigator.userAgent.toLowerCase().indexOf('mobile') > -1\n if (isMobileFirefox) return 'Dom'\n return 'Mesh'\n }\n if (media[0].type === 'Image') {\n if (getUrlExt(media[0].url) === 'gif') return 'Dom'\n else return 'Mesh'\n }\n }\n } else if (isMediaModelTag(this)) {\n if (media.length === 1 && media[0].type === 'Image') {\n if (getUrlExt(media[0].url) === 'gif') return 'Dom'\n else return 'Mesh'\n } else {\n return 'BehindDom'\n }\n }\n }\n })()\n // 兜底值 'Dom', 防止返回 undefined\n return renderType ?? 'Dom'\n }\n\n protected computeVisible(_fiveState?: Partial<FiveState>) {\n const state = { ...this.five.getCurrentState(), ..._fiveState }\n const { panoIndex, mode } = state\n const checkedList: string[] = []\n\n const visible: { value: boolean; reason?: any } = (() => {\n const allConfig = this.getConfig()\n const config = allConfig.visibleConfig ?? {}\n if (typeof config === 'function') {\n return {\n value: config(this.five, { tag: this, distance: this.getDistance(state, undefined) }),\n checkedList,\n reason: 'config function result',\n }\n } else {\n if (config.keep === 'hidden') return { value: false, checkedList, reason: 'config.keep is hidden' }\n if (config.keep === 'visible') return { value: true, checkedList, reason: 'config.keep is visible' }\n\n // 可见 mode 检测\n const visible = this.computeVisibleByFiveMode(config, mode)\n if (visible?.value === false) return visible\n\n // 楼层检测\n if (\n config.followModelVisibility === true &&\n ['poincare', 'aerophoto', 'sand'].includes(this.workUtil.fromType) &&\n (mode === 'Floorplan' || mode === 'Mapview')\n ) {\n const { value: visible, ...info } = this.computeVisibleByFloorIndex()\n if (visible === false) return { value: false, checkedList, reason: 'followModelVisibility check failed', ...info }\n }\n\n // 点位检测\n if (isPanoramaLike(mode) && config.visiblePanoIndex !== undefined && config.visiblePanoIndex !== 'all') {\n if (panoIndex !== undefined) {\n checkedList.push('visiblePanoIndex')\n if (Array.isArray(config.visiblePanoIndex)) {\n if (!config.visiblePanoIndex.includes(panoIndex))\n return {\n value: false,\n checkedList,\n reason: `current panoIndex is not included in visiblePano. currentPanoIndex: ${panoIndex}, visiblePanoIndex: ${config.visiblePanoIndex}`,\n }\n }\n if (config.visiblePanoIndex === 'current') {\n if (panoIndex !== this.fiveState?.panoIndex)\n return {\n value: false,\n checkedList,\n reason: `current panoIndex is not equal to tag.panoIndex. currentPanoIndex: ${panoIndex}, tag.panoIndex: ${this.fiveState?.panoIndex}`,\n }\n }\n }\n }\n\n // 距离检测\n if (config.visibleDistance !== undefined) {\n checkedList.push('visibleDistance')\n if (config.visibleDistance !== 'unLimited') {\n const distance = this.getDistance(state, 1)\n const visible = checkRange(distance, config.visibleDistance)\n if (visible === false)\n return {\n value: false,\n checkedList,\n panoIndex,\n visibleDistance: config.visibleDistance,\n reason: `distance is not in visibleDistance. distance: ${distance}, visibleDistance: ${config.visibleDistance.min} - ${config.visibleDistance.max}`,\n }\n }\n }\n\n // // 角度检测\n // if (isPanoramaLike(mode) && config.angleRange && is3DTag(tag)) {\n // checkedList.push('angleRange')\n // const angle = this.getAngle(tag, panoIndex)\n // const visible = checkRange(angle, config.angleRange)\n // if (visible === false)\n // return { value: false, checkedList, reason: `angle is not in angleRange. angle: ${angle}, angleRange: ${config.angleRange}` }\n // }\n\n // 碰撞检测\n if (\n config.intersectRaycaster !== false &&\n (typeof config.intersectRaycaster !== 'object' || config.intersectRaycaster.enabled !== false)\n ) {\n checkedList.push('intersectRaycaster')\n if (panoIndex === undefined)\n return {\n value: false,\n checkedList,\n reason: `intersectRaycaster check failed: panoIndex is ${panoIndex}`,\n }\n\n // 水平射线模式下,站在标签自身绑定点位也可能被矮柜/隔断挡住,因此不跳过检测\n const skipWhenSamePano =\n typeof config.intersectRaycaster !== 'object' || config.intersectRaycaster.startPointMode !== 'horizontal'\n\n if (panoIndex === this.fiveState?.panoIndex && skipWhenSamePano) {\n checkedList.push('intersectCheckSkiped')\n } else {\n const intersectRes = this.computeVisibleByIntersect(panoIndex)\n if (intersectRes.value === false) return Object.assign(intersectRes, { checkedList })\n }\n }\n\n // 结束\n return {\n value: true,\n checkedList,\n reason: 'all check passed',\n }\n }\n })()\n\n return visible\n }\n\n /**\n * @description 计算标签可见性\n */\n protected computeVisibleByFiveMode(config: Exclude<Extract<TagConfig['visibleConfig'], Record<any, any>>, Function>, mode: Mode) {\n // 可见 mode 检测\n const getVisibleByFiveMode = () => {\n let visibleFiveMode = typeof config.visibleFiveMode === 'function' ? config.visibleFiveMode(this) : config.visibleFiveMode\n if (!visibleFiveMode) {\n visibleFiveMode = this.fiveState?.mode ?? (this.workUtil.observers.length ? 'Panorama' : 'ModelLike')\n }\n\n if (Array.isArray(visibleFiveMode)) {\n return visibleFiveMode.includes(mode)\n } else if (visibleFiveMode === 'ModelLike') {\n return isModelLike(mode)\n } else if (visibleFiveMode === 'PanoramaLike') {\n return !isPanoramaLike(mode)\n } else if (visibleFiveMode === 'all') {\n return true\n } else if (typeof visibleFiveMode === 'string' /** Match FiveMode */) {\n return visibleFiveMode === mode\n }\n }\n const visible = (() => {\n const visibleByFiveMode = getVisibleByFiveMode()\n\n if (notNil(this.fiveState?.panoIndex) && config.entryFromModel) {\n if (isModelLike(mode) && visibleByFiveMode) {\n // 模型态本来就能看到的标签,自有交互优先级是最高的,所以模型入口的交互不能开\n this.entryFromModel = false\n } else {\n this.entryFromModel = true\n }\n\n if (isModelLike(mode)) {\n return true\n }\n } else {\n this.entryFromModel = false\n }\n\n return visibleByFiveMode\n })()\n\n if (visible === false) {\n return {\n value: false,\n reason: 'current mode is not included in visibleFiveMode',\n visibleFiveMode: config.visibleFiveMode,\n mode,\n }\n }\n }\n\n /** 通过射线检测标签可用性 */\n protected computeVisibleByIntersect(\n panoIndex?: number,\n overrideConfig?: {\n checkPoints?: 'center' | 'corner' | THREE.Vector3[]\n needPassed?: number\n hideWhenModelNotLoaded?: boolean\n startPointMode?: 'observer' | 'horizontal'\n },\n ) {\n const intersectRaycasterConfig = {\n ...safeObj(safeObj(this.getConfig().visibleConfig ?? {}).intersectRaycaster),\n ...overrideConfig,\n }\n\n const fivePanoIndex = panoIndex ?? this.five.getCurrentState().panoIndex\n\n const startPosition = isPanoramaLike(this.five.getCurrentState().mode)\n ? this.workUtil.getObserverPosition(fivePanoIndex)\n : this.five.camera.position\n if (startPosition === undefined) return { value: false, reason: { type: 'startPosition is undefined', fivePanoIndex } }\n\n // 开关开启后:模型loaded 完成前标签直接判为不可见,等模型加载完成重算时再得出真实遮挡结果。\n if (intersectRaycasterConfig.hideWhenModelNotLoaded && this.fiveUtil.model?.loaded === false) {\n return { value: false, reason: { type: 'model not loaded', fivePanoIndex } }\n }\n\n // 获取检测点数组\n const checkPoints: THREE.Vector3[] = toArray(\n (() => {\n const configCheckPoints = intersectRaycasterConfig.checkPoints ?? 'center'\n if (configCheckPoints === 'center') return getTagCenterPosition(this)\n if (configCheckPoints === 'corner') return getTagPosition(this)\n if (Array.isArray(configCheckPoints)) return configCheckPoints\n else return []\n })(),\n )\n\n let passedCount = 0\n let unPassedCount = 0\n\n // 碰撞检测\n for (const checkPoint of checkPoints) {\n // horizontal 模式下射线与检测点保持水平,避免斜射线从矮柜/栏杆上方越过\n const rayStart = getRaycasterStartPosition(startPosition, checkPoint, intersectRaycasterConfig.startPointMode)\n const direction = new THREE.Vector3().subVectors(checkPoint, rayStart).normalize() // 向量相减得到相机到模型的射线\n\n let intersectionDistance: number | undefined\n _raycaster.set(rayStart, direction)\n const [intersection] = this.fiveUtil.model.intersectRaycaster(_raycaster)\n intersectionDistance = intersection?.distance\n\n const customModelIntersection = (() => {\n // TODO\n if (!isMediaModelTag(this)) return undefined\n // 如果是多媒体模型标签,需要检测自定义模型的模型碰撞\n const models = this.plugin.tags\n .filter(isMediaModelTag)\n .map((tag) => tag.model?.object)\n .filter(notNil)\n const [customModelIntersections] = _raycaster.intersectObjects(models, true)\n return customModelIntersections\n })()\n\n // 必须用与射线同源的起点,否则 horizontal 模式下命中距离与目标距离不同源,判定会错\n const distance = rayStart.distanceTo(checkPoint)\n\n // 距离误差值\n const distanceError = intersectRaycasterConfig.distanceAccuracy ?? 0.01\n intersectionDistance = Math.min(intersectionDistance ?? Infinity, customModelIntersection?.distance ?? Infinity)\n\n // 当前点检测是否通过\n const passed = intersectionDistance + distanceError >= distance\n if (passed) passedCount++\n else unPassedCount++\n\n // 是否可以结束碰撞检测\n const needPassed = intersectRaycasterConfig.needPassed ?? 1\n if (passedCount >= needPassed) return { value: true }\n }\n\n if (unPassedCount === 0) return { value: true }\n\n return {\n value: false,\n reason: {\n type: 'intersectRaycaster check failed',\n passedCount,\n needPassed: intersectRaycasterConfig.needPassed,\n model: this.fiveUtil.model.name,\n },\n }\n }\n\n protected computeVisibleByFloorIndex() {\n let floorIndex = 0\n const panoIndex = this.fiveState?.panoIndex\n if (panoIndex !== undefined) {\n floorIndex = this.workUtil.getObserver(panoIndex)?.floorIndex\n } else {\n floorIndex = getFloorIndex(\n this.workUtil.work,\n this.model?.object?.position ?? this.mediaPlane?.position ?? getTagCenterPosition(this),\n )\n }\n const currentFiveFloorIndex = this.fiveUtil.model.shownFloor\n return {\n value: currentFiveFloorIndex === null || currentFiveFloorIndex === floorIndex,\n currentFiveFloorIndex,\n tagFloorIndex: floorIndex,\n }\n }\n\n /**\n * @description 获取是否展开\n */\n protected computeUnfoldedByPanoIndex(panoIndex?: number) {\n const config = this.getConfig().unfoldedConfig\n if (!config) return\n if (typeof config === 'function') {\n return config(this.five, { tag: this, distance: this.getDistance({ panoIndex }) })\n } else {\n if (config.keep === 'folded') return false\n if (config.keep === 'unfolded') return true\n // 距离检测\n if (config.unfoldDistance) {\n const unfolded = checkRange(this.getDistance({ panoIndex }), config.unfoldDistance)\n if (unfolded === false) return false\n }\n }\n }\n\n // 该方法有很大优化空间,这个检测显示方法不应该挂在tagBase下,做了多次不必要计算(MinimumDistance,ScreenCenter)。\n protected computeUnfoldedByCamera() {\n // 模型态入口的标签不能展开\n if (this.entryFromModel && isModelLike(this.five.state.mode)) return false\n const config = this.getConfig().unfoldedConfig\n if (!config) return\n if (typeof config === 'function') {\n return config(this.five, { tag: this, distance: this.getDistance() })\n } else {\n if (config.keep === 'folded') return false\n if (config.keep === 'unfolded') return true\n if (typeof config !== 'object') return\n if (config.autoUnfold === undefined) return\n if (config.autoUnfold === false) return\n if (config.autoUnfold.enable === false) return\n if (!config.autoUnfold.strategy) return\n // 屏幕位置检测\n if (config.autoUnfold.strategy === 'ScreenPostion') {\n const project = this.computeTagProject()\n if (project) {\n const unfolded = checkRange(project.x, config.autoUnfold.autoUnfoldProjectX)\n if (unfolded === false) return false\n }\n }\n // 最近距离检测\n if (config.autoUnfold.strategy === 'MinimumDistance') {\n const pointTag = this.plugin.filterPointTag\n const sameStrategyTags = pointTag\n .filter((t) => t.currentVisible) // 筛选可见标签\n .filter((t) => {\n const project = this.computeTagProject()\n if (!project) return false\n const { x, y, z } = project\n return !(Math.abs(z) > 1 || Math.abs(x) > 1 || Math.abs(y) > 1)\n })\n .map((tag) => ({ tag, id: tag.id, tagConfig: tag.getConfig().unfoldedConfig }))\n .filter(({ tagConfig }) => {\n if (typeof tagConfig === 'function') return false\n // 不受一些固定unfold标签的影响\n if (tagConfig.keep) return false\n if (tagConfig.autoUnfold === false) return false\n if (tagConfig.autoUnfold?.enable === false) return false\n if (tagConfig.autoUnfold?.strategy !== 'MinimumDistance') return false\n return true\n }) // 筛选 MinimumDistance 标签\n .map((data) => ({ ...data, distance: data.tag.getDistance() })) // map\n .filter(({ distance, tagConfig }) => {\n const distanceRange = (tagConfig as any).autoUnfold.distance\n if (distanceRange) {\n const unfolded = checkRange(distance, distanceRange)\n if (unfolded === false) return false\n }\n return true\n }) // 过滤出要求距离的标签\n .sort((a, b) => a.distance - b.distance) // 距离排序\n const index = sameStrategyTags.findIndex((t) => t.id === this.id)\n if (index === -1) return false\n const unfolded = index <= (config.autoUnfold.maxNumber ?? 1) - 1\n if (unfolded === false) return false\n }\n if (config.autoUnfold.strategy === 'FoldWhenMove') {\n return false\n }\n // 屏幕中心检测\n if (config.autoUnfold.strategy === 'ScreenCenter') {\n const pointTag = this.plugin.filterPointTag\n const projScreenMatrix = new THREE.Matrix4()\n projScreenMatrix.multiplyMatrices(this.five.camera.projectionMatrix, this.five.camera.matrixWorldInverse)\n const frustum = new THREE.Frustum()\n frustum.setFromProjectionMatrix(projScreenMatrix, this.five.camera.coordinateSystem)\n const cameraDirection = this.five.camera.getWorldDirection(new THREE.Vector3())\n\n const sameStrategyTags = pointTag\n .filter((t) => {\n if (!t.currentVisible) return false\n const unfoldedConfig = t.getConfig().unfoldedConfig\n if (t.manuallyOperated) return false\n\n // 筛选 ScreenCenter 标签\n if (\n typeof unfoldedConfig !== 'object' ||\n unfoldedConfig?.autoUnfold === false ||\n unfoldedConfig?.autoUnfold?.strategy !== 'ScreenCenter'\n )\n return false\n if (unfoldedConfig.keep) return false\n if (unfoldedConfig.autoUnfold?.enable === false) return false\n\n // 标签是否在屏幕中\n const isInView = frustum.containsPoint(new THREE.Vector3().fromArray(t.position))\n if (!isInView) return false\n\n // 标签距离检测\n const distanceRange = unfoldedConfig.autoUnfold.distance\n\n if (distanceRange) {\n const distance = t.getDistance()\n const unfolded = checkRange(distance, distanceRange)\n if (unfolded === false) return false\n }\n\n return true\n })\n .sort((a, b) => {\n // 距离屏幕中心更近排序\n const aPoint = new THREE.Vector3().fromArray(a.position)\n const bPoint = new THREE.Vector3().fromArray(b.position)\n\n return (\n cameraDirection.angleTo(aPoint.sub(this.five.camera.position)) -\n cameraDirection.angleTo(bPoint.sub(this.five.camera.position))\n )\n })\n // 是否应该显示当前tag\n const index = sameStrategyTags.findIndex((t) => t.id === this.id)\n if (index === -1) return false\n const unfolded = index <= (config.autoUnfold.maxNumber ?? 1) - 1\n if (unfolded === false) return false\n }\n return true\n }\n }\n\n protected computeTagProject() {\n const centerPosition = this.centerPosition\n if (!centerPosition) return\n const { x, y, z } = centerPosition.project(this.five.camera)\n if (z > 1) return\n return { x, y, z }\n }\n\n protected addObjectClickHandler(tag: BaseTag, object: THREE.Object3D | undefined, handler: (event: Event) => any) {\n if (!object || !this.plugin.domEvents) return () => {}\n\n const getTagVisible = () => {\n if (!tag.currentVisible) return false\n if (tag['loading']) return false\n return true\n }\n\n const _handler = (event: any) => {\n if (!getTagVisible()) return false\n handler(event.origDomEvent)\n }\n\n this.plugin.domEvents.addEventListener(object, 'click', _handler)\n\n return () => {\n this.plugin.domEvents?.removeEventListener(object, 'click', _handler)\n }\n }\n\n public whyHide(this: BaseTag) {\n if (!this.plugin.state.enabled) {\n return { reason: `plugin.state.enabled is ${this.plugin.state.enabled}` }\n }\n\n if (!this.plugin.state.visible) {\n return { reason: `plugin.state.visible is ${this.plugin.state.visible}` }\n }\n\n if (!this.enabled) {\n return { reason: `tag ${this.id} enabled is: ${this.enabled}` }\n }\n\n const info = {\n ...this.computeVisible(),\n tagInstance: this,\n }\n\n if (info.value !== this.state.visible) {\n return { reason: '插件故障,请联系维护人员, err: 0', info }\n }\n\n if (!this.state.visible) {\n if (info.value === true) {\n return { reason: '插件故障,请联系维护人员, err: 1', info }\n } else {\n return { reason: info.reason.type ?? info.reason, info }\n }\n } else {\n return { reason: '应该是能看见才对', info }\n }\n }\n\n private ready = () => {\n const { promise, resolve } = withResolvers<void>()\n if (!this._updating) resolve()\n else {\n const id = setInterval(() => {\n if (!this._updating) {\n clearInterval(id)\n resolve()\n }\n }, 17)\n\n // 超时\n setTimeout(() => {\n clearInterval(id)\n resolve()\n }, 300)\n }\n\n return promise\n }\n\n /**\n * @description 销毁并移除\n */\n public destroy(notify = true) {\n const index = this.plugin.tags.findIndex((tag) => tag.id === this.id)\n if (index === -1) {\n console.warn(`Destroy failed: tag ${this.id} not found`)\n return\n }\n\n // 清理正在进行的闪烁动画\n if (this._currentBlinkInstance && !this._currentBlinkInstance.completed) {\n this._currentBlinkInstance.finish?.()\n this._currentBlinkInstance = undefined\n }\n\n this.disable()\n this.tag3DContentSvelte?.dispose?.()\n this.hooks.off()\n this.cache.clear()\n\n this.plugin.tags.splice(index, 1)\n\n if (notify) {\n this.plugin.tagsLengthWillUpdate = true\n this.plugin.hooks.emit('tagsLengthChange')\n }\n }\n\n /**\n * @description 判断 popover 是否在配置上启用(永久配置)\n */\n public isPopoverConfigEnabled(): boolean {\n return this.currentConfig?.popoverConfig?.enabled === true\n }\n\n /**\n * @description 判断当前标签是否允许临时 hover 弹出 popover(临时控制)\n */\n public isHoverEnabled(): boolean {\n if (this.plugin?.globalHoverEnabled === false) return false\n if (this.hoverEnabled === false) return false\n return true\n }\n}\n","import objectAssignDeep from 'object-assign-deep'\nimport type PanoTagPluginController from '..'\nimport type { ArrayPosition, Position, Tag, TagClickParams, TagContentType, Tag as TagData, TagInstance } from '../..'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport { BaseTag } from './BaseTag'\nimport * as THREE from 'three/webgpu'\nimport { FiveLine as Line } from '../../../shared-utils/five/FiveLine'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { transformPosition } from '../../../shared-utils/five/transformPosition'\n\nexport type PointTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, '2DPoint' | '3DPoint'>\nconst _vector2 = new THREE.Vector2()\n\nexport class PointTag<C extends TagContentType = TagContentType> extends BaseTag<C, '2DPoint' | '3DPoint'> {\n private __Object__: any\n private requestIdleCallbackId?: number | undefined\n // icon 与线条端点的固定像素间距\n private iconPixelGap = 10\n\n // 优化:重用临时对象,避免频繁创建\n private _temp = {\n lineStart: new THREE.Vector3(), // 线条起点(project后会变成NDC)\n iconPos: new THREE.Vector3(), // icon位置(project后会变成NDC)\n screenDirPixel: new THREE.Vector2(), // 屏幕方向(normalize后会变成单位向量)\n targetNDC: new THREE.Vector2(), // 目标NDC坐标\n lineDir: new THREE.Vector3(), // 线条方向(计算w0时重用)\n lineEnd: new THREE.Vector3(), // 线条终点\n raycaster: new THREE.Raycaster(), // 射线投射器\n }\n // 用于变化检测的缓存值\n private _lastUpdateCache = {\n position: [0, 0, 0] as number[],\n screenLeft: 0,\n screenTop: 0,\n scale: 1,\n visible: false,\n }\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n if (tagData.style?.point?.width) {\n const scale = tagData.style?.point?.scale ?? 1\n this.iconPixelGap = (tagData.style.point.width * scale * 1.4) / 2 + 2\n }\n if (tagData.contentType === 'Audio') {\n this.iconPixelGap = 34 / 2 + 2\n }\n this.initialTagLine()\n }\n\n public initialTagLine() {\n const config = this.config\n if (!this.five.renderer) return\n if (!config?.tagNormalLineConfig?.enabled || !this.normalLineLength) return\n const size = this.five.renderer.getSize(_vector2)\n const pixelRatio = this.five.renderer.getPixelRatio()\n const originPosition = transformPosition(anyPositionToVector3(this.originPosition as Position), this.plugin.workUtil.transform) as any\n this.tagNormalLine = new Line(new THREE.Vector3().fromArray(this.position), originPosition)\n this.tagNormalLine.points.visible = false\n this.tagNormalLine.setMaterial({\n color: new THREE.Color(1, 1, 1),\n linewidth: config?.tagNormalLineConfig?.lineWidth ?? 1.2,\n dashed: false,\n })\n // 设置材质属性以优化渲染\n this.tagNormalLine.line.material.transparent = true\n this.tagNormalLine.line.material.depthWrite = false\n this.tagNormalLine.line.material.depthTest = true // 启用深度测试,使线条在被模型遮挡时不显示\n this.tagNormalLine.line.material.dashed = false // 确保虚线关闭\n this.tagNormalLine.line.renderOrder = 2\n this.tagNormalLine.setResolution(size.width * pixelRatio, size.height * pixelRatio)\n this.tagNormalLine.visible = false\n this.tagNormalLine.name = `tagNormalLine-${this.id}`\n this.plugin.group.add(this.tagNormalLine)\n }\n /**\n * @description 展开自己,收起其他标签\n */\n public unfoldAndFoldOthers() {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n // 先检查一下能不能打开/关闭\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n // 展开/收起 点击的标签\n this.state.unfolded = !this.state.unfolded\n this.manuallyOperated = true\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n\n // 点开的话,收起其他标签\n if (this.state.unfolded) {\n this.plugin.tags.forEach((tag) => {\n if (tag.id === this.id) return\n tag.fold()\n })\n }\n }\n }\n\n public onClick(params: Pick<TagClickParams, 'target'>) {\n if (params.target !== 'TagPoint') return\n this.unfoldAndFoldOthers()\n }\n\n public applyVisible() {\n if (this.currentVisible) this.updateScreenPosition()\n if (this.tag3DContentSvelte?.css3DInstance) this.tag3DContentSvelte.css3DInstance.visible = this.visible\n this.tag3DContentSvelte?.svelteApp.update({\n state: this.plugin.state,\n temporaryState: this.temporaryState,\n })\n if (!this.tagNormalLine && this.normalLineLength) {\n this.initialTagLine()\n }\n if (this.tagNormalLine) {\n this.tagNormalLine.visible = this.visible\n }\n\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n public unfold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(true)\n }\n\n public fold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(false)\n }\n\n /**\n * @description 展开/收起指定id的标签\n * @param {boolean} unfolded\n */\n public setUnfold(unfolded: boolean) {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n this.state.unfolded = unfolded\n this.hooks.emit(unfolded ? 'unfolded' : 'folded')\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n } else {\n // console.warn(`tag ${this.id} cannot be ${unfolded ? 'unfolded' : 'folded'}`)\n }\n }\n\n public setPosition(position: ArrayPosition) {\n this.originPosition = position\n this.position = (() => {\n // const matrix4 = this.plugin.workUtil.transform\n let finalPosition = anyPositionToVector3(position as Position).toArray()\n // let finalPosition = transformPosition(anyPositionToVector3(position as Position), matrix4).toArray() as any\n if (this.normal && this.normalLineLength) {\n const normalVector = this.computeNormal()\n finalPosition = new THREE.Vector3()\n .fromArray(finalPosition)\n .clone()\n .add(normalVector.clone().setLength(this.normalLineLength))\n .toArray() as any\n }\n return finalPosition\n })()\n\n this.cache.clear()\n // 位置变化时重置缓存,强制下次更新法线\n this._lastUpdateCache.position = [0, 0, 0]\n\n this.updateVisible()\n\n this.updateScreenPosition()\n this.updateZIndex()\n\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n /**\n * 更新标签连线的位置,使其端点与icon保持固定像素距离\n * 使用屏幕空间反投影方法,确保任意视角下都保持固定像素距离\n */\n private updateTagNormalLinePosition(params?: { force?: boolean }) {\n if (!this.screenPosition || !this.tagNormalLine) return\n const { force = false } = params ?? {}\n const visible = force ? this.state.visible : this.currentVisible\n\n // 标签不可见时跳过计算\n if (!visible) {\n this.tagNormalLine.visible = false\n return\n }\n // 变化检测:检查标签自身相关的值\n const cache = this._lastUpdateCache\n const visibleChanged = this.visible !== cache.visible\n\n if (!visibleChanged) {\n // 检查position\n const positionChanged =\n Math.abs(this.position[0] - cache.position[0]) > 0.001 ||\n Math.abs(this.position[1] - cache.position[1]) > 0.001 ||\n Math.abs(this.position[2] - cache.position[2]) > 0.001\n const screenChanged =\n Math.abs((this.screenPosition.leftPx ?? 0) - cache.screenLeft) > 0.5 ||\n Math.abs((this.screenPosition.topPx ?? 0) - cache.screenTop) > 0.5 ||\n Math.abs((this.screenPosition.scale ?? 1) - cache.scale) > 0.002\n // 如果都没有变化,跳过计算\n if (!positionChanged && !screenChanged) {\n return\n }\n }\n // 更新缓存\n cache.position = new THREE.Vector3().fromArray(this.position).toArray()\n cache.screenLeft = this.screenPosition.leftPx ?? 0\n cache.screenTop = this.screenPosition.topPx ?? 0\n cache.scale = this.screenPosition.scale ?? 1\n cache.visible = this.visible\n\n if (!this.five.renderer) return\n const rendererSize = this.five.renderer.getSize(_vector2)\n const originPosition = transformPosition(\n anyPositionToVector3(this.originPosition as Position),\n this.plugin.workUtil.transform,\n ).toArray() as any\n\n // 步骤1: 设置3D坐标\n this._temp.lineStart.fromArray(originPosition)\n this._temp.iconPos.fromArray(this.position)\n\n // 步骤2: 转换为NDC坐标(project会修改原对象,lineStart和iconPos现在存储的是NDC值)\n this._temp.lineStart.project(this.five.camera)\n this._temp.iconPos.project(this.five.camera)\n\n // 步骤3: 使用NDC坐标计算屏幕空间距离和方向\n this._temp.screenDirPixel.set(\n ((this._temp.iconPos.x - this._temp.lineStart.x) * rendererSize.x) / 2,\n ((this._temp.iconPos.y - this._temp.lineStart.y) * rendererSize.y) / 2,\n )\n const screenDistancePixel = this._temp.screenDirPixel.length()\n this._temp.screenDirPixel.normalize() // 修改原对象,变成单位向量\n\n // 步骤4: 计算目标NDC坐标(使用NDC坐标)\n // 当 simulate3D 为 true 时,标签会缩放,所以间距也需要同步缩放\n const scaledIconPixelGap = this.iconPixelGap * (this.screenPosition.scale ?? 1)\n this._temp.targetNDC.set(\n ((this._temp.iconPos.x * rendererSize.x) / 2 - this._temp.screenDirPixel.x * scaledIconPixelGap) / (rendererSize.x / 2),\n ((this._temp.iconPos.y * rendererSize.y) / 2 - this._temp.screenDirPixel.y * scaledIconPixelGap) / (rendererSize.y / 2),\n )\n\n // 步骤5: 构建射线\n this._temp.raycaster.setFromCamera(this._temp.targetNDC, this.five.camera)\n const ray = this._temp.raycaster.ray\n\n // 步骤6: 恢复3D坐标(因为后续计算需要原始的3D坐标,而project已经将lineStart和iconPos改成了NDC)\n\n this._temp.lineStart.fromArray(originPosition)\n this._temp.iconPos.fromArray(this.position)\n\n // 计算线条方向\n this._temp.lineDir.copy(this._temp.iconPos).sub(this._temp.lineStart).normalize()\n\n // 计算射线到线段的最近点(重用lineEnd存储w0,因为lineEnd此时还未使用)\n this._temp.lineEnd.copy(ray.origin).sub(this._temp.lineStart) // 重用lineEnd存储w0\n\n const a = ray.direction.dot(ray.direction) // 总是 1(归一化)\n const b = ray.direction.dot(this._temp.lineDir)\n const c = this._temp.lineDir.dot(this._temp.lineDir) // 总是 1(归一化)\n const d = ray.direction.dot(this._temp.lineEnd) // w0\n const e = this._temp.lineDir.dot(this._temp.lineEnd) // w0\n\n const denom = a * c - b * b\n let t_ray = 0\n if (Math.abs(denom) > 0.0001) {\n t_ray = (b * e - c * d) / denom\n }\n\n // 计算射线上的点\n this._temp.lineEnd.copy(ray.origin).add(ray.direction.multiplyScalar(Math.max(0, t_ray)))\n\n // 确保 lineEnd 在 lineStart 和 iconPos 之间\n const lineLength = this._temp.lineStart.distanceTo(this._temp.iconPos)\n const endDistance = this._temp.lineStart.distanceTo(this._temp.lineEnd)\n if (endDistance > lineLength) {\n // 如果超出范围,使用简单的比例缩放(使用缩放后的间距)\n const ratio = Math.max(0, 1 - scaledIconPixelGap / screenDistancePixel)\n this._temp.lineEnd.copy(this._temp.lineStart).lerp(this._temp.iconPos, ratio)\n }\n\n // 更新线条的端点\n this.tagNormalLine.setPoints(this._temp.lineStart, this._temp.lineEnd)\n this.tagNormalLine.visible = true\n }\n\n public updateScreenPosition(params?: { force?: boolean }) {\n if (this.stickType !== '2DPoint' && this.stickType !== '3DPoint') return\n\n const { force = false } = params ?? {}\n\n const visible = force ? this.state.visible : this.currentVisible\n\n // 下面这一坨东西是为了在带动画hide期间(1000ms),依然能够更新标签位置\n const __Object__ = this.__Object__ ?? {\n timeoutId: undefined,\n inAnimation: false,\n }\n this.__Object__ = __Object__\n if (!visible && this.screenPosition) {\n __Object__.inAnimation = true\n __Object__.timeoutId = setTimeout(() => {\n requestAnimationFrame(() => {\n const visible = this.currentVisible\n if (!visible) {\n __Object__.inAnimation = false\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n })\n }, 1000)\n } else {\n if (__Object__.timeoutId) {\n clearTimeout(__Object__.timeoutId)\n __Object__.inAnimation = false\n __Object__.timeoutId = undefined\n }\n }\n\n if (!visible && !__Object__.inAnimation) return\n\n const screenProject = this.computeTagProject()\n if (screenProject && this.five.renderer) {\n const scale = (() => {\n if (!this.currentConfig.simulate3D) return 1\n const distance = this.getDistance(undefined, 1)\n const sseDenominator = 2.0 * Math.tan(((0.5 * this.five.camera.fov) / 180) * Math.PI)\n return Math.max(Math.min(1 - (sseDenominator * distance) / 40, 1), 0.7)\n })()\n const rendererSize = this.five.renderer.getSize(_vector2)\n this.screenPosition = {\n leftPx: ((screenProject.x + 1) / 2) * rendererSize.x,\n topPx: ((-screenProject.y + 1) / 2) * rendererSize.y,\n scale,\n }\n // 更新法线位置\n this.updateTagNormalLinePosition({ force: params?.force })\n } else {\n this.screenPosition = null\n }\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n public set(tag: PartialObjectDeep<Tag<C, '2DPoint' | '3DPoint'>>, deepMerge = true) {\n super.set(tag, deepMerge)\n\n this.normalLineLength = tag.style?.point?.normalLen ?? 0\n // 重置缓存,强制下次更新线条\n this._lastUpdateCache.position = [0, 0, 0]\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n if (tag.position) this.setPosition(this.position)\n }\n\n public setData(...data: Parameters<InstanceType<typeof BaseTag<C, '2DPoint' | '3DPoint'>>['setData']>) {\n super.setData(...data)\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n public updateUnfoldedByPanoIndex() {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n const unfolded = this.getUnfoldedByPanoIndex()\n if (!this.state) return\n if (unfolded !== undefined) {\n this.state.unfolded = unfolded\n }\n\n // 如果标签展开但不可见,就要判断 autoFoldWhenHide\n if (unfolded && !this.state.visible) {\n const config = this.getConfig()\n if (typeof config.unfoldedConfig === 'object' && config.unfoldedConfig.autoFoldWhenHide !== false) {\n this.state.unfolded = false\n }\n }\n }\n\n public computeNormal() {\n return new THREE.Vector3().fromArray(this.normal)\n }\n\n public removeTagNormalLine() {\n if (this.tagNormalLine) {\n this.plugin.group.remove(this.tagNormalLine)\n this.tagNormalLine.line.geometry.dispose()\n this.tagNormalLine.line.material.dispose()\n this.tagNormalLine.points.geometry.dispose()\n const pointMaterials = Array.isArray(this.tagNormalLine.points.material)\n ? this.tagNormalLine.points.material\n : [this.tagNormalLine.points.material]\n pointMaterials.forEach(material => material.dispose())\n this.tagNormalLine = null\n }\n }\n\n public override destroy(notify = true) {\n super.destroy(notify)\n this.removeTagNormalLine()\n }\n\n /**\n * @description 获取额外的闪烁目标,包括法线(如果有)\n */\n protected getAdditionalBlinkTargets(): any | any[] | null {\n // 如果有法线,将其添加到闪烁目标中(使用 line 对象,因为材质在 line.material 上)\n if (this.tagNormalLine?.line) {\n return this.tagNormalLine.line\n }\n return null\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type { Matrix4, Quaternion } from 'three/webgpu'\nimport { Vector3 } from 'three/webgpu'\nimport { even } from '../even'\nimport OpacityMesh from './OpacityMesh'\nimport { centerPoint } from '../three/centerPoint'\nimport { isNil } from '..'\nimport { CSS3DObject } from '../three/CSS3DRenderer'\nimport { addBehindScene, addFrontScene, removeBehindScene, removeFrontScene } from '.'\n\n/**\n * @changelog\n * - 1: Fix rotate\n * - 0: Add `applyScaleMatrix4` method, Rewrite `applyQuaternion` and `applyMatrix4` method\n */\nconst VERSION = 1\n\nconst NAME = `CSS3DObject@${VERSION}`\n\nexport const MinRatio = 0.00216\n\nexport const DefaultRatio = 0.003\n\nexport type Mode = 'front' | 'behind'\n\nexport class CSS3DObjectPlus<T extends HTMLElement = HTMLElement> extends CSS3DObject {\n public version = VERSION\n public readonly isCSS3DObject: true = true\n public name: string = NAME\n\n /**\n * @description object dom\n */\n public container: T\n public width: number\n public height: number\n public domWidthPx: number\n public domHeightPx: number\n public cornerPoints: Vector3[]\n public centerPosition: Vector3\n public ratio: number\n public get mode() {\n return this._mode\n }\n public set mode(mode: 'front' | 'behind') {\n this._mode = mode\n if (this._opacityMesh) this._opacityMesh.visible = mode === 'behind'\n }\n private _mode: 'front' | 'behind' = 'front'\n\n private _opacityMesh: OpacityMesh\n\n public constructor(params: {\n container?: T\n five?: Five\n mode?: 'front' | 'behind'\n width?: number\n cornerPoints?: Vector3[]\n ratio?: number\n dpr?: number\n pointerEvents?: 'none' | 'auto'\n style?: Partial<CSSStyleDeclaration>\n }) {\n if (isNil(params.cornerPoints) && isNil(params.width)) {\n throw new Error('cornerPoints and width cannot be both empty')\n }\n const container = params.container ?? (document.createElement('div') as unknown as T)\n const cornerPoints =\n params.cornerPoints ??\n (() => {\n const halfWidth = params.width / 2\n return [\n new Vector3(-halfWidth, halfWidth, 0),\n new Vector3(-halfWidth, -halfWidth, 0),\n new Vector3(halfWidth, -halfWidth, 0),\n new Vector3(halfWidth, halfWidth, 0),\n ]\n })()\n const ratio = params.ratio ?? DefaultRatio\n const dpr = params.dpr ?? 1\n const pointerEvents = params.pointerEvents ?? 'auto'\n\n const realRatio = Math.max(MinRatio, ratio)\n const planeWidth = cornerPoints[0].distanceTo(cornerPoints[1])\n const planeHeight = cornerPoints[1].distanceTo(cornerPoints[2])\n let domWidthPx: number = even((planeWidth / ratio) * dpr)\n let domHeightPx: number = even((planeHeight / ratio) * dpr)\n const centerPosition = centerPoint(...cornerPoints)\n\n let css3DObjectElement: HTMLElement\n\n if (realRatio === ratio) {\n container.style.width = `${domWidthPx}px`\n container.style.height = `${domHeightPx}px`\n\n css3DObjectElement = container\n } else {\n // 兼容ratio小于0.00216的情况\n const element = document.createElement('div')\n element.style.width = `${domWidthPx}px`\n element.style.height = `${domHeightPx}px`\n element.style.pointerEvents = 'none'\n\n const scale = ratio / realRatio\n container.style.position = 'absolute'\n container.style.left = '0'\n container.style.top = '0'\n container.style.width = `${scale * domWidthPx}px`\n container.style.height = `${scale * domHeightPx}px`\n element.appendChild(container)\n\n css3DObjectElement = element\n }\n\n super(css3DObjectElement)\n\n css3DObjectElement.id = this.id.toString()\n\n // 注意设置pointerEvents要在super之后,否则会被覆盖\n container.style.pointerEvents = pointerEvents\n Object.assign(container.style, params.style)\n\n this.scale.set(realRatio, realRatio, realRatio)\n\n // set public property\n this.cornerPoints = cornerPoints\n this.ratio = ratio\n this.container = container\n if (params.mode) this.mode = params.mode\n\n if (realRatio === ratio) {\n this.width = planeWidth\n this.height = planeHeight\n this.centerPosition = centerPosition\n } else {\n const scale = ratio / realRatio\n\n this.width = scale * planeWidth\n this.height = scale * planeHeight\n domWidthPx = scale * domWidthPx\n domHeightPx = scale * domHeightPx\n this.centerPosition = new Vector3()\n .subVectors(centerPosition, cornerPoints[0])\n .multiplyScalar(scale)\n .add(cornerPoints[0])\n }\n\n this.domWidthPx = domWidthPx\n this.domHeightPx = domHeightPx\n // end\n\n container.classList.add(`${NAME}__container`)\n\n const targetVector01 = new Vector3().subVectors(cornerPoints[1], cornerPoints[0]) // 点0 -> 点1 的向量\n const targetVector03 = new Vector3().subVectors(cornerPoints[3], cornerPoints[0]) // 点0 -> 点3 的向量\n\n // 旋转法向量\n const targetNormal = new Vector3().crossVectors(targetVector01, targetVector03).normalize() // 旋转后的法向量\n this.lookAt(targetNormal)\n\n // 绕法向量旋转\n const up = this.up.clone().applyQuaternion(this.quaternion)\n const targetUp = targetVector03.clone()\n const rotateAxis = new Vector3().crossVectors(up, targetUp).normalize() // 计算旋转轴\n this.rotateOnWorldAxis(rotateAxis, up.angleTo(targetUp))\n\n // set position\n this.position.copy(centerPosition)\n\n this._opacityMesh = new OpacityMesh(domWidthPx, domHeightPx)\n this._opacityMesh.visible = params.mode === 'behind'\n this.add(this._opacityMesh)\n\n if (params.mode === 'front') {\n addFrontScene(this, undefined, params.five)\n } else if (params.mode === 'behind') {\n addBehindScene(this, undefined, params.five)\n }\n }\n\n public removeFromParent() {\n const parent = this.parent\n if (parent !== null) {\n parent.remove(this)\n }\n return this\n }\n\n public dispose() {\n this.container.remove()\n this.removeFromParent()\n if (this.mode === 'front') {\n removeFrontScene(this)\n } else if (this.mode === 'behind') {\n removeBehindScene(this)\n }\n }\n}\n","<script lang=\"ts\">\n import { linear } from 'svelte/easing'\n import { draw } from 'svelte/transition'\n import uuid from '../../../../shared-utils/uuid'\n\n export let inDelay = 0\n export let outDelay = 0\n export let duration = 1000\n export let unfolded: boolean\n export let length: number\n export let direction: 'vertical' | 'horizontal' = 'horizontal'\n export let useLinearColor = false\n export let color = 'white'\n\n $: isVertical = direction === 'vertical'\n $: width = length\n $: height = 1\n $: path = `M0.5 0.5 H ${length}`\n\n const defsID = uuid()\n</script>\n\n{#if width}\n <div class=\"line\" class:vertical={isVertical} class:horizontal={!isVertical} style:width={width + 'px'} style:height={height + 'px'}>\n <svg class=\"straight-line\" viewBox=\"0 0 {width} {height}\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient x1={0.5} y1={0.5} x2={width} y2={0.5} id={defsID} gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"25%\" stop-color={color} stop-opacity=\"1\" />\n <stop offset=\"100%\" stop-color={color} stop-opacity=\"0.5\" />\n </linearGradient>\n </defs>\n {#if unfolded}\n <path\n in:draw|local={{ duration, delay: inDelay, easing: linear }}\n out:draw|local={{ duration, delay: outDelay, easing: linear }}\n fill=\"none\"\n stroke={useLinearColor ? `url(#${defsID})` : color}\n stroke-width={1}\n d={path}\n />\n {/if}\n </svg>\n </div>\n{/if}\n\n<style lang=\"scss\">\n .line {\n position: absolute;\n pointer-events: none;\n &.vertical {\n transform: rotate(-90deg) translate3d(0.5px, 0, 10px);\n transform-origin: 0 0;\n }\n &.horizontal {\n transform: translate3d(0, -0.5px, 10px);\n }\n }\n .straight-line {\n display: block;\n width: 100%;\n height: 100%;\n overflow: visible;\n }\n</style>\n","<script lang=\"ts\">\n import { fade } from 'svelte/transition'\n\n export let inDelay = 1000\n export let outDelay = 1000\n export let visible = true\n export let width: number | string = 0\n export let height: number | string = 0\n export let left: number | string = 0\n export let bottom: number | string = 0\n export let center = false\n export let horizontalCenter = false\n export let verticalCenter = false\n export let round = false\n export let blurRadius: number\n export let spreadRadius: number\n export let opacity = 0.15\n\n export let zIndex = -1\n\n function px2rem(value: string | number) {\n return typeof value === 'number' ? value / 16 + 'rem' : value\n }\n</script>\n\n{#if visible}\n <div\n class=\"shadow\"\n style:width={px2rem(width)}\n style:height={px2rem(height)}\n style:z-index={zIndex}\n style={`\n left: ${px2rem(left)};\n bottom: ${px2rem(bottom)};\n border-radius: ${round ? '9999px' : '0'};\n box-shadow: 0 0 ${px2rem(blurRadius)} ${px2rem(spreadRadius)} rgba(0, 0, 0, ${opacity});\n ${horizontalCenter ? 'transform: translateX(-50%); left: 50%' : ''}\n ${verticalCenter ? 'transform: translateX(-50%); top: 50%' : ''}\n ${center ? 'transform: translate(-50%, -50%); left: 50%; top: 50%;' : ''}\n `}\n in:fade|local={{ duration: inDelay }}\n out:fade|local={{ duration: outDelay }}\n />\n{/if}\n\n<style>\n .shadow {\n position: absolute;\n }\n</style>\n","export function random() {\n return Math.random().toString(36).slice(-6)\n}\n\nconst RANDON_STRING = random()\n\nexport { RANDON_STRING }\n","<script lang=\"ts\">\n import { animate, stagger, type JSAnimation } from 'animejs'\n import { onDestroy } from 'svelte'\n import uuid from '../../../../shared-utils/uuid'\n import { notNil } from '../../../../shared-utils/isNil'\n import { searchFirstValueSmallThanLastValue } from '../../../utils'\n import { RANDON_STRING } from '../../../utils/constants'\n\n export let inDelay = 0\n export let outDelay = 0\n export let content: string\n export let unfolded: boolean\n export let isFistUnfoldedUpdate = true\n\n const __EmojiSplitFlag__ = `__EMOJI_SPLIT_${RANDON_STRING}__`\n const __EmojiFlag__ = `__EMOJI_${RANDON_STRING}__`\n const __SpaceFlag__ = `__SPACE_${RANDON_STRING}__`\n const __NewLineFlag__ = `__NEW_LINE_${RANDON_STRING}__`\n\n let timeoutID: NodeJS.Timeout\n let openAnimeIns: JSAnimation | undefined\n onDestroy(() => { clearTimeout(timeoutID); openAnimeIns?.cancel() })\n // v0.3.7 emoji support\n $: contentList = getContentList(content)\n let spanEleList: HTMLSpanElement[] = []\n\n function getContentList(content: string) {\n const result: { id: string; content: string }[] = []\n const emojiRegExp = new RegExp(\n /\\p{Regional_Indicator}\\p{Regional_Indicator}|\\p{Emoji}(\\p{Emoji_Modifier}+|\\uFE0F\\u20E3?)?(\\u200D\\p{Emoji}(\\p{Emoji_Modifier}+|\\uFE0F\\u20E3?)?)+|\\p{Emoji_Presentation}(\\p{Emoji_Modifier}+|\\uFE0F\\u20E3?)?|\\p{Emoji}(\\p{Emoji_Modifier}+|\\uFE0F\\u20E3?)/gu,\n )\n // const sentence =\n // 'A ticket to 大阪 costs ¥2000 👌. Repeated emojis: 😁😁. Crying cat: 😿. Repeated emoji with skin tones: ✊🏿✊🏿✊🏿✊✊✊🏿. Flags: 🇱🇹🏴󠁧󠁢󠁷󠁬󠁳󠁿. Scales ⚖️⚖️⚖️.'\n // console.info(sentence)\n // console.info(sentence.match(emojiRegExp))\n content\n .slice()\n .replace(emojiRegExp, (emoji) => `${__EmojiSplitFlag__}${__EmojiFlag__}${emoji}${__EmojiSplitFlag__}`)\n .split(__EmojiSplitFlag__)\n .forEach((item) => {\n if (item.startsWith(__EmojiFlag__)) return result.push({ id: uuid(), content: item.slice(__EmojiFlag__.length) })\n else\n return result.push(\n ...item\n .split('')\n .map((text) => {\n if (text === ' ') return __SpaceFlag__\n else if (text === '\\n') return __NewLineFlag__\n else return text\n })\n .map((content) => ({ id: uuid(), content })),\n )\n })\n return result\n }\n\n function doAnimation() {\n if (!openAnimeIns) return\n // 动画描述的是一个展开动画,如果当前是收起状态,应该执行反向动画\n const shouldAnimeReversed = !unfolded\n // 判断动画当前的反转状态是否符合预期,如果不符合,需要反转动画\n if (openAnimeIns.reversed !== shouldAnimeReversed) openAnimeIns.reverse()\n openAnimeIns.play()\n }\n\n function onUnfoldedUpdate(unfolded: boolean) {\n // 只希望在 unfolded 变化时执行动画,所以在第一次更新时不执行动画\n if (isFistUnfoldedUpdate) {\n isFistUnfoldedUpdate = false\n return\n }\n clearTimeout(timeoutID)\n timeoutID = setTimeout(doAnimation, unfolded ? inDelay : outDelay)\n }\n\n function initAnimation(spanEleList: HTMLSpanElement[]) {\n /** 计算第一行的最后一个字的index */\n const firstLineLastIndex = (function () {\n const resultIndex = searchFirstValueSmallThanLastValue(\n (index) => spanEleList[index]!.getBoundingClientRect().x,\n [Math.min(spanEleList.length - 1, 10), Math.min(spanEleList.length - 1, 30)],\n )\n if (resultIndex > 0) return resultIndex\n })()\n\n /** 文字依次从底部旋转出现\n * @member duration 单个文字的动画时间是 400ms\n * @member scale 大小缩放 [0.7 - 1]\n * @member rotate 旋转 [20 - 0]deg\n * @member opacity 透明度 [0 - 1]\n * @member translateX 水平方向位移 [4 - 0]px\n * @member translateY 水平方向位移 [10 - 0]px\n * @member delay 动画开始的延时是当前元素的索引 index * 50ms\n */\n const targets = spanEleList.slice(0, firstLineLastIndex).filter(notNil)\n openAnimeIns?.cancel()\n openAnimeIns = undefined\n // Svelte updates once before bind:this has populated the span elements.\n if (targets.length === 0) return\n openAnimeIns = animate(targets, {\n autoplay: false,\n duration: 400,\n scale: [0.7, 1],\n rotate: [20, 0],\n opacity: [0, 1],\n translateX: [4, 0],\n translateY: [10, 0],\n delay: stagger(50),\n ease: 'inOutCubic',\n })\n if (unfolded) openAnimeIns.seek(openAnimeIns.duration)\n }\n\n $: {\n onUnfoldedUpdate(unfolded)\n }\n\n $: {\n initAnimation(spanEleList.filter((ele) => !!ele))\n }\n</script>\n\n{#each contentList as { id, content }, index (id)}\n {#if content === __SpaceFlag__}\n <span bind:this={spanEleList[index]} class=\"text-char\">&nbsp;</span>\n {:else if content === __NewLineFlag__}\n <br />\n {:else}\n <span bind:this={spanEleList[index]} class=\"text-char\">{content}</span>\n {/if}\n{/each}\n\n<style>\n .text-char {\n display: inline-block;\n text-shadow: 2px 0px 8px rgba(0, 0, 0, 0.15);\n }\n</style>\n","<script lang=\"ts\">\n import { fade } from 'svelte/transition'\n import { Image_Arrow } from '../../Assets/Icon'\n import { cubicInOut } from 'svelte/easing'\n import Shadow from './Shadow.svelte'\n\n export let direction: 'left' | 'top' | 'right' | 'bottom' = 'right'\n export let visible = true\n export let duration = 0\n export let inDelay = 0\n export let outDelay = 0\n</script>\n\n{#if visible}\n <div class=\"arrow-wrapper\">\n <Shadow center blurRadius={9} spreadRadius={3} />\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n on:click\n in:fade|local={{ duration, delay: inDelay, easing: cubicInOut }}\n out:fade|local={{ duration, delay: outDelay, easing: cubicInOut }}\n class=\"arrow {direction}\"\n style=\"background-image: url({Image_Arrow});\"\n />\n </div>\n{/if}\n\n<style>\n .arrow {\n width: 100%;\n height: 100%;\n background-size: 100%;\n transition: transform 400ms ease-in-out;\n cursor: pointer;\n pointer-events: auto;\n }\n\n .arrow-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .arrow.left {\n transform: rotate(0deg);\n }\n\n .arrow.right {\n transform: rotate(-180deg);\n }\n\n .arrow.top {\n transform: rotate(90deg);\n }\n\n .arrow.bottom {\n transform: rotate(-90deg);\n }\n</style>\n","\nexport default function doUtil<T = any>(func: () => T, util: (value: T) => boolean, duration = 20, times = 5): Promise<T> {\n return new Promise((resolve, reject) => {\n let count = 0\n const timer = setInterval(() => {\n const value = func()\n if (util(value)) {\n clearInterval(timer)\n resolve(value)\n } else if (count >= times) {\n clearInterval(timer)\n reject(value)\n }\n count++\n }, duration)\n })\n}\n","<script lang=\"ts\">\n import FlyText from './FlyText.svelte'\n import Arrow from '../Arrow.svelte'\n import doUtil from '../../../utils/doUtil'\n\n export let visible = false\n export let textUnfolded = false\n export let content: string\n\n let textElement: HTMLDivElement\n let translateY = 0\n let lineHeight = 0\n let textHeight = 0\n\n $: translateY = textUnfolded ? lineHeight - textHeight : 0\n $: transform = `translateY(${translateY}px)`\n $: arrowDirection = textUnfolded ? ('left' as const) : ('right' as const)\n $: foldTextDelay = textUnfolded ? 450 : 0\n\n $: {\n if (textElement && visible && content) {\n const { lineHeight: lineHeightString } = getComputedStyle(textElement)\n textHeight = textElement.offsetHeight\n doUtil(() => textElement?.offsetHeight, Boolean).then(() => {\n textHeight = textElement.offsetHeight\n })\n lineHeight = Number(lineHeightString.replace('px', ''))\n }\n }\n</script>\n\n{#if content}\n <div bind:this={textElement} class=\"text\" style:transform>\n <FlyText unfolded={visible} {content} inDelay={500} outDelay={foldTextDelay} />\n </div>\n{/if}\n{#if lineHeight < textHeight}\n <div class=\"arrow\">\n <Arrow direction={arrowDirection} {visible} inDelay={600} duration={1000} />\n </div>\n{/if}\n\n<style>\n .text {\n pointer-events: auto;\n box-sizing: border-box;\n display: inline-block;\n max-width: 120px;\n transition: transform 400ms ease-in-out;\n font-size: 12px;\n line-height: 18px;\n white-space: initial;\n cursor: pointer;\n }\n\n .arrow {\n pointer-events: auto;\n display: inline-block;\n vertical-align: top;\n width: 14px;\n height: 14px;\n margin-left: 2px;\n margin-top: 2px;\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../../typings'\n import Line from '../../Common/Line/Straight.svelte'\n import Shadow from '../../Common/Shadow.svelte'\n import FlyMText from '../../Common/Text/FlyMText.svelte'\n import { svelteResizeObserver } from '../../../../shared-utils/svelte/resizeObserver'\n\n export let tag: TagInstance<'Text'>\n\n let contentWidth: number\n let textUnfolded = false\n let textItems: { id: string; content: string }[] = []\n $: unfolded = !!tag.state?.unfolded\n $: title = tag.data.title ?? ''\n $: description = tag.data.description ?? ''\n $: content = (() => {\n if (title && description) return title + '\\n' + description\n if (title) return title\n if (description) return description\n })()\n\n // 收起的时候,如果文字展开了,要先下下去,再收起\n $: foldTextDelay = textUnfolded ? 450 : 0\n\n function toggleTextUnfolded() {\n textUnfolded = !textUnfolded\n }\n\n $: {\n if (!unfolded)\n setTimeout(() => {\n textUnfolded = false\n }, 20)\n }\n</script>\n\n{#if tag.state}\n <Shadow visible={unfolded} left={contentWidth / 2 + 'px'} bottom={12} width={2} blurRadius={120} spreadRadius={60} />\n <Line {unfolded} length={contentWidth} outDelay={foldTextDelay + 40 * Math.min(textItems[0]?.content.length ?? 10, 15)} useLinearColor />\n <div\n class=\"content\"\n use:svelteResizeObserver\n on:clientWidth={(e) => {\n contentWidth = e.detail\n }}\n on:click={toggleTextUnfolded}\n >\n <FlyMText visible={unfolded} {textUnfolded} {content} />\n </div>\n{/if}\n\n<style>\n .content {\n --height: 999px;\n width: max-content;\n height: var(--height);\n padding: calc(var(--height) - 18px) 4px 0 16px;\n position: absolute;\n left: 0;\n bottom: 0;\n overflow: hidden;\n box-sizing: border-box;\n font-size: 0;\n pointer-events: none;\n white-space: nowrap;\n font-weight: 600;\n }\n</style>\n","function px2rem(value: number | string): string\nfunction px2rem(value: number | string | undefined): string | undefined\nfunction px2rem(value?: number | string | undefined) {\n return typeof value === 'number' ? value / 16 + 'rem' : value\n}\n\nexport default px2rem\n","<script lang=\"ts\">\n import px2rem from '../../../utils/px2rem'\n\n export let maxLine: number | undefined | null = null\n export let maxWidth: number | null | undefined = null\n export let text: string | null | undefined = null\n export let edit: { inputting?: boolean; placeholder?: string } | null | undefined = null\n $: isEditing = typeof edit?.placeholder === 'string' || edit?.inputting\n</script>\n\n<div class=\"text\" style:max-width={typeof maxWidth === 'number' ? px2rem(maxWidth) : maxWidth} style:-webkit-line-clamp={maxLine}>\n {#if text}\n {text}\n {:else if isEditing}\n {#if edit?.inputting}\n <div class=\"caret\" />\n {/if}\n {#if typeof edit?.placeholder === 'string'}\n <span class=\"placeholder\">\n {edit.placeholder}\n </span>\n {/if}\n {:else}\n <slot />\n {/if}\n</div>\n\n<style lang=\"scss\">\n .text {\n display: -webkit-box;\n display: -ms-box;\n display: -moz-box;\n position: relative;\n width: max-content;\n max-width: 100%;\n -webkit-box-orient: vertical;\n -ms-box-orient: vertical;\n -moz-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n @keyframes blink {\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n\n .caret {\n position: absolute;\n width: 1px;\n height: 100%;\n background-color: #fff;\n animation: blink 1.2s infinite;\n }\n\n .placeholder {\n opacity: 0.5;\n &:empty::after {\n content: ' ';\n }\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../../typings'\n import Line from '../../Common/Line/Straight.svelte'\n import MText from '../../Common/Text/MText.svelte'\n\n export let tag: TagInstance<'Text'>\n\n $: unfolded = !!tag.state?.unfolded\n $: folded = !unfolded\n $: title = tag.data.title ?? ''\n $: descriptionMaxRows = tag.data.descriptionMaxRows ?? null\n $: titleMaxRows = tag.data.titleMaxRows ?? null\n</script>\n\n{#if tag.state}\n <Line {unfolded} direction=\"vertical\" length={15} duration={500} inDelay={200} useLinearColor />\n <div class=\"plane__container\" class:unfolded class:folded>\n <div class=\"plane__wrapper\" style:transform={unfolded ? 'translateY(-15px)' : 'translateY(0)'}>\n <div class=\"plane\">\n <div class=\"title\">\n <MText text={title} edit={tag.data.edit?.title} maxLine={titleMaxRows} />\n </div>\n {#if tag.data.description || tag.data.edit?.description}\n <div class=\"description\">\n <MText text={tag.data.description} edit={tag.data.edit?.description} maxLine={descriptionMaxRows} />\n </div>\n {/if}\n </div>\n </div>\n </div>\n{/if}\n\n<style lang=\"scss\">\n .plane__container {\n position: absolute;\n left: 50%;\n transform: translate(-50%, -100%);\n width: max-content;\n }\n\n .plane__wrapper {\n transition: transform 500ms linear, opacity 200ms linear;\n padding: 10px;\n background-color: rgba(0, 0, 0, 0.5);\n border: 0.5px solid rgba(255, 255, 255, 0.3);\n border-radius: 4px;\n }\n\n .unfolded .plane__wrapper {\n transition-delay: 200ms, 500ms;\n opacity: 1;\n }\n\n .folded .plane__wrapper {\n opacity: 0;\n }\n\n .plane {\n max-width: 188px;\n }\n\n .title {\n white-space: pre-wrap;\n font-weight: bold;\n font-size: 12px;\n line-height: 18px;\n }\n\n .description {\n margin-top: 4px;\n white-space: pre-wrap;\n font-size: 11px;\n line-height: 16px;\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../../typings'\n import TextTag from './TextTag.svelte'\n import TextPlaneTag from './TextPlaneTag.svelte'\n\n export let tag: TagInstance<'Text'>\n\n $: appearance = tag.data.appearance ?? 'line'\n</script>\n\n{#if appearance === 'line'}\n <TextTag {tag} />\n{:else if appearance === 'plane'}\n <TextPlaneTag {tag} />\n{/if}\n","<script lang=\"ts\">\n import uuid from '../../../../shared-utils/uuid'\n import { draw } from 'svelte/transition'\n import { cubicOut, cubicInOut } from 'svelte/easing'\n\n export let inDelay = 0\n export let duration = 1000\n export let outDelay = 0\n export let unfolded: boolean\n\n const defsID = uuid()\n</script>\n\n<svg class=\"line\" viewBox=\"0 0 105 21\">\n <defs>\n <linearGradient id={defsID} gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"25%\" stop-color=\"white\" stop-opacity=\"1\" />\n <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"0.5\" />\n </linearGradient>\n </defs>\n {#if unfolded}\n <path\n in:draw|local={{ duration, delay: inDelay, easing: cubicOut }}\n out:draw|local={{ duration, delay: outDelay, easing: cubicInOut }}\n fill=\"none\"\n stroke=\"url(#{defsID})\"\n stroke-width=\"1\"\n d=\"M0 21 L14 0.5 L105 0.5\"\n />\n {/if}\n</svg>\n\n<style>\n .line {\n width: 100%;\n height: 100%;\n overflow: visible;\n pointer-events: none;\n }\n</style>\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte'\n let { children, onPageChange }: { children: Snippet; onPageChange: (index: number) => void } = $props()\n let element: HTMLDivElement\n let currentIndex = 0\n\n function updateIndex() {\n const nextIndex = Math.round(element.scrollLeft / Math.max(1, element.clientWidth))\n if (nextIndex === currentIndex) return\n currentIndex = nextIndex\n onPageChange(currentIndex)\n }\n\n export function goToNext() {\n const next = (currentIndex + 1) % Math.max(1, element.children.length)\n element.scrollTo({ left: next * element.clientWidth, behavior: 'smooth' })\n }\n</script>\n\n<div class=\"carousel\" bind:this={element} onscroll={updateIndex} role=\"region\" aria-label=\"媒体轮播\" tabindex=\"0\">\n {@render children()}\n</div>\n\n<style>\n .carousel {\n display: flex;\n width: 100%;\n height: 100%;\n overflow-x: auto;\n overscroll-behavior-x: contain;\n scroll-snap-type: x mandatory;\n scrollbar-width: none;\n }\n .carousel::-webkit-scrollbar { display: none; }\n .carousel > :global(*) { flex: 0 0 100%; width: 100%; scroll-snap-align: start; }\n</style>\n","<script lang=\"ts\">\n import type { PlaybackController, PlaybackSession, PlaybackManager } from '../../../shared-utils/playback'\n import type { ObjectFit, MediaData, MediaStore, TagHooks, TagInstance } from '../../typings'\n import { Image_Play_Icon_With_Text, Image_Play_Icon } from '../../Assets/Icon'\n import { getContext, onMount, onDestroy } from 'svelte'\n\n export let mediaInstance: { videoInstance?: HTMLVideoElement; paused: boolean; play?: (userAction?: boolean) => Promise<void>; pause?: () => void } = { videoInstance: undefined, paused: true }\n export let tag: TagInstance\n export let media: (MediaData & { name?: string }) | undefined\n export let playButtonIfNeed: 'withText' | 'withoutText' | string = 'withoutText'\n export let playButtonSizeIfNeed: 'large' | 'small' = 'small'\n export let canPlay = true\n export let autoplayVideo = false\n export let objectFit: ObjectFit = 'fill'\n export let disableVideoIfHavePoster = false\n\n let showPlayButton = true\n let playbackGeneration = 0\n let session: PlaybackSession | undefined\n let playbackController: PlaybackController | undefined\n const stopOutput = () => {\n playbackGeneration++\n session = undefined\n if (mediaInstance.videoInstance) { mediaInstance.videoInstance.muted = true; mediaInstance.videoInstance.pause() }\n mediaInstance.paused = true\n showPlayButton = true\n }\n const setMediaManager = (manager?: PlaybackManager) => {\n playbackController?.dispose()\n stopOutput()\n playbackController = manager?.createController({ label: 'tag-media', onCancel: stopOutput })\n }\n const cancel = () => { playbackController?.cancel(); stopOutput() }\n const finish = () => { session?.finish(); session = undefined }\n setMediaManager(tag?.mediaManager)\n const unbindMediaManager = tag.bindMediaManager(setMediaManager)\n const play = async (userAction = false) => {\n const video = mediaInstance.videoInstance\n if (!video) return\n const next = playbackController?.begin({ userAction, audible: true })\n if (playbackController && !next) return\n session = next\n const generation = ++playbackGeneration\n const operations = next?.bind(video) ?? video\n operations.muted = false\n try { await operations.play() } catch (error) {\n if (next?.signal.aborted || generation !== playbackGeneration || session !== next) return\n if ((error as Error).name === 'AbortError') { cancel(); return }\n cancel()\n throw error\n }\n }\n $: { mediaInstance.play = play; mediaInstance.pause = cancel }\n onDestroy(() => {\n unbindMediaManager()\n playbackController?.dispose()\n stopOutput()\n hooks.off('loadVideoFirstFrame', loadPoster)\n document.removeEventListener('WeixinJSBridgeReady', loadPoster)\n document.removeEventListener('touchstart', loadPoster)\n document.removeEventListener('click', loadPoster)\n })\n $: videoInstance = mediaInstance.videoInstance\n let videoPosterLoaded = false\n\n $: mediaUrl = media?.url\n\n function resetVideoPosterLoaded() {\n videoPosterLoaded = media?.type === 'Video' && Boolean(media.videoCoverUrl)\n }\n\n $: {\n const videoChanged = Boolean(mediaUrl)\n if (videoChanged) resetVideoPosterLoaded()\n }\n\n const mediaStore = getContext<MediaStore>('mediaStore')\n const hooks = getContext<TagHooks>('hooks')\n\n const loadPoster = () => {\n if (videoPosterLoaded) return\n if (!videoInstance) return\n videoInstance.muted = true\n videoInstance.play()\n videoInstance.pause()\n videoPosterLoaded = true\n }\n\n hooks.on('loadVideoFirstFrame', loadPoster)\n\n $: {\n if (videoInstance) showPlayButton = videoInstance.paused\n }\n\n onMount(() => {\n return mediaStore.subscribe(({ currentMediaElement }) => {\n if (currentMediaElement !== videoInstance) cancel()\n })\n })\n\n $: {\n if (media?.type === 'Video' && !videoPosterLoaded) {\n const isWX = navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1\n const isIOS = navigator.userAgent.toLowerCase().indexOf('iphone') !== -1\n const isIOSWX = isIOS && isWX\n // 兼容IOS微信\n if (videoInstance && isIOSWX) {\n if (videoInstance.paused) {\n document.removeEventListener('WeixinJSBridgeReady', loadPoster)\n document.removeEventListener('touchstart', loadPoster)\n document.removeEventListener('click', loadPoster)\n\n document.addEventListener('WeixinJSBridgeReady', loadPoster)\n document.addEventListener('touchstart', loadPoster)\n document.addEventListener('click', loadPoster)\n }\n }\n }\n }\n</script>\n\n{#if media}\n <div class=\"media-item\" draggable=\"false\">\n {#if media.type === 'Image'}\n <img class=\"media-content\" style:object-fit={objectFit} src={media.url} alt={media.name} draggable={false} />\n {:else if media.type === 'Video'}\n {#if disableVideoIfHavePoster && media.videoCoverUrl}\n <img class=\"media-content\" style:object-fit={objectFit} src={media.videoCoverUrl} alt={media.name} draggable={false} />\n {:else}\n <!-- video src '#t=0.1' 兼容 https://www.w3.org/TR/media-frags/ 3.2 Resolving URI fragments within the user agent -->\n <video\n class=\"media-content\"\n style:object-fit={objectFit}\n class:showPlayButton\n src={media.videoCoverUrl ? media.url : media.url + '#t=0.1'}\n poster={media.videoCoverUrl}\n preload={media.videoCoverUrl ? 'none' : 'auto'}\n disablePictureInPicture\n playsinline\n muted\n draggable={false}\n loop={false}\n crossorigin=\"\"\n autoplay={autoplayVideo}\n controls={false}\n on:play={(event) => {\n showPlayButton = false\n mediaInstance.paused = false\n videoPosterLoaded = true\n if (videoInstance) mediaStore.set({ currentMediaElement: videoInstance })\n hooks.emit('playStateChange', { event, state: 'playing', tag, mediaInstance: videoInstance })\n }}\n on:pause={(event) => {\n if (videoInstance?.paused) finish()\n showPlayButton = true\n mediaInstance.paused = true\n hooks.emit('playStateChange', { event, state: 'paused', tag, mediaInstance: videoInstance })\n }}\n on:error={(event) => {\n finish()\n showPlayButton = true\n mediaInstance.paused = true\n hooks.emit('playStateChange', { event, state: 'paused', tag, mediaInstance: videoInstance })\n }}\n on:ended={(event) => {\n finish()\n showPlayButton = true\n mediaInstance.paused = true\n hooks.emit('playStateChange', { event, state: 'paused', tag, mediaInstance: videoInstance })\n }}\n on:click={(event) => {\n cancel()\n }}\n bind:this={mediaInstance.videoInstance}\n />\n {/if}\n <div class=\"video-play-button-container\" class:showPlayButton>\n <div class=\"video-icon\" class:large={playButtonSizeIfNeed === 'large'} class:small={playButtonSizeIfNeed === 'small'}>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class=\"video-icon-img\"\n class:canPlay\n style=\"background-image: url({(() => {\n if (playButtonIfNeed === 'withText') return Image_Play_Icon_With_Text\n if (playButtonIfNeed === 'withoutText') return Image_Play_Icon\n return playButtonIfNeed\n })()});\"\n on:click={(event) => {\n if (!canPlay) return\n if (videoInstance) {\n play(true)\n }\n }}\n />\n </div>\n </div>\n {/if}\n </div>\n{/if}\n\n<style>\n .media-item {\n position: relative;\n height: 100%;\n }\n\n .media-content {\n position: relative;\n pointer-events: auto;\n width: 100%;\n height: 100%;\n user-select: none;\n object-fit: inherit;\n }\n\n .media-content.showPlayButton {\n pointer-events: none;\n }\n\n .video-icon {\n width: 200px;\n height: 100px;\n max-width: 60%;\n max-height: 60%;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n\n .video-play-button-container {\n display: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n transform: translate3d(0, 0, 0);\n }\n\n .video-play-button-container.showPlayButton {\n pointer-events: none;\n display: block;\n }\n\n .video-icon {\n pointer-events: auto;\n }\n\n .video-icon.large {\n width: 200px;\n height: 100px;\n }\n\n .video-icon.small {\n width: 28px;\n height: 28px;\n }\n\n .video-icon .video-icon-img {\n width: 100%;\n height: 100%;\n background-position: center center;\n background-size: contain;\n background-repeat: no-repeat;\n }\n .video-icon .video-icon-img.canPlay {\n cursor: pointer;\n }\n</style>\n","<script lang=\"ts\">\n import type { MediaData, TagInstance, MediaStore, TagHooks, TagClickParams } from '../../typings'\n import Carousel from './Carousel.svelte'\n import { fly } from 'svelte/transition'\n import { linear } from 'svelte/easing'\n import MediaItem from './MediaItem.svelte'\n import { onMount, onDestroy } from 'svelte'\n import { getContext, type ComponentProps } from 'svelte'\n\n export let tag: TagInstance\n export let mediaData: (MediaData & { name?: string })[]\n export let inDelay = 0\n export let outDelay = 0\n export let duration = 0\n export let unfolded = true\n export let animation = true\n export let mediaItemConfig: Partial<ComponentProps<typeof MediaItem>>\n export let enableCarousel = true\n export let autoplayConfig: {\n /** @description 是否自动播放视频 */\n autoplayVideo?: boolean\n /** @description 是否自动轮播 */\n autoplayCarousel?: boolean\n /** @description 轮播中遇到视频是否要自动播放 */\n autoplayVideoInCarousel?: boolean\n } = {}\n\n const { autoplayVideo = false, autoplayCarousel = true, autoplayVideoInCarousel = false } = autoplayConfig\n let mediaInstanceList: { paused: boolean; videoInstance?: HTMLVideoElement; play?: (userAction?: boolean) => Promise<void>; pause?: () => void }[] = []\n let currentIndex = 0\n let carousel\n let intervalId: number | null | NodeJS.Timer = null\n\n const hooks = getContext<TagHooks>('hooks')\n const mediaStore = getContext<MediaStore>('mediaStore')\n\n $: paused = mediaInstanceList.every((mediaInstance) => mediaInstance.paused)\n $: carouselEnabled = enableCarousel && mediaData?.length > 1\n $: mediaDataList = mediaData\n $: autoplay = mediaDataList.length > 1 && autoplayCarousel && paused\n\n function clickMedia() {\n const media = mediaInstanceList[currentIndex]\n const video = media?.videoInstance\n if (!video) return\n if (video.paused) {\n media.play?.(true)\n } else {\n media.pause?.()\n }\n }\n\n const onTagClick = (params: TagClickParams) => {\n if (!tag.tag3DContentSvelte?.css3DInstance || params.tag.id !== tag.id) return\n if (params.target === 'TagContent') clickMedia()\n }\n\n onMount(() => {\n hooks.on('click', onTagClick)\n\n tag.play = (userAction = false) => {\n const media = mediaInstanceList[currentIndex]\n const video = media?.videoInstance\n if (!video) return\n media.play?.(userAction)\n }\n\n tag.pause = () => {\n const media = mediaInstanceList[currentIndex]\n const video = media?.videoInstance\n if (!video) return\n media.pause?.()\n }\n\n intervalId = setInterval(() => {\n if (autoplay) carousel?.goToNext()\n }, 3000)\n })\n\n onDestroy(() => {\n clearInterval(intervalId as any)\n hooks.off('click', onTagClick)\n })\n\n</script>\n\n{#if unfolded}\n <div\n class=\"media-list-wrapper\"\n class:unfolded\n in:fly|local={animation ? { y: 4, duration, delay: inDelay, easing: linear } : undefined}\n out:fly|local={animation ? { y: 4, duration, delay: outDelay, easing: linear } : undefined}\n >\n <div class=\"media-list\" class:carouselEnabled>\n {#if carouselEnabled && mediaDataList.length > 1}\n <Carousel\n bind:this={carousel}\n onPageChange={(index) => {\n if (!paused) mediaStore.set({ currentMediaElement: null })\n currentIndex = index\n }}\n >\n {#each mediaDataList as media, index}\n <MediaItem {...mediaItemConfig} {media} {tag} bind:mediaInstance={mediaInstanceList[index]} />\n {/each}\n </Carousel>\n {:else}\n <MediaItem media={mediaData[0]} {autoplayVideo} {...mediaItemConfig} {tag} bind:mediaInstance={mediaInstanceList[0]} />\n {/if}\n </div>\n </div>\n{/if}\n\n<style lang=\"scss\">\n .media-list-wrapper {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n border-radius: 2px;\n .media-list {\n position: relative;\n pointer-events: auto;\n height: 100%;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n :global(.sc-carousel__carousel-container),\n :global(.sc-carousel__content-container) {\n height: 100%;\n }\n }\n }\n\n // .media-list {\n // pointer-events: none;\n // &.carouselEnabled {\n // pointer-events: auto;\n // }\n // }\n\n</style>\n","<!-- 图文标签 -->\n<script lang=\"ts\">\n import type { TagInstance } from '../../typings'\n import FlyText from '../Common/Text/FlyText.svelte'\n import Line from '../Common/Line/Polyline.svelte'\n import Media from '../Common/Media.svelte'\n import Shadow from '../Common/Shadow.svelte'\n\n export let tag: TagInstance<'ImageText'>\n\n $: unfolded = tag.state ? tag.state.unfolded : false\n $: title = tag.data.title ?? ''\n $: content = (title.length ?? 0) > 7 ? title.substring(0, 6) + '...' : title\n $: mediaData = tag.data.mediaData\n</script>\n\n{#if tag.state}\n <Shadow visible={unfolded} left={61} bottom={57} width={2} blurRadius={150} spreadRadius={75} />\n <div class=\"line\">\n <Line {unfolded} outDelay={400} />\n </div>\n {#if content}\n <div class=\"text\">\n <FlyText {unfolded} {content} inDelay={500} />\n </div>\n {/if}\n {#if mediaData}\n <div class=\"media-wrapper\">\n <Media\n autoplayConfig={{ autoplayCarousel: false }}\n {unfolded}\n {mediaData}\n {tag}\n enableCarousel={false}\n mediaItemConfig={{ canPlay: false, playButtonSizeIfNeed: 'small', disableVideoIfHavePoster: true }}\n inDelay={500}\n duration={500}\n />\n </div>\n {/if}\n{/if}\n\n<style>\n .line {\n position: absolute;\n width: 105px;\n height: 21px;\n transform: translateY(-100%);\n }\n\n .text {\n position: absolute;\n width: 100px;\n left: 16px;\n bottom: 1px;\n font-weight: 600;\n }\n\n .media-wrapper {\n position: absolute;\n left: 14px;\n top: -85px;\n width: 90px;\n height: 60px;\n font-weight: 600;\n }\n</style>\n","export const MARKETING_MORE_ICON = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAOVBMVEUAAAD///////////////////////////////////////////////////////////////////////8KOjVvAAAAE3RSTlMAZV7nzWlZRTewq5CJUlEeHA4Lu1bjhwAAADRJREFUCNdjIAz4mFC4gtyMKHx+TlYUPgcLKp+RmQmVy4aiGFlSgAtZToiHF1kjOzsDUQAAVSIA07bTGZwAAAAASUVORK5CYII='\nexport const MARKETING_LIGHT_MORE_ICON = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAM1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjBUbJAAAAEXRSTlMAUUg+uqRVTBcKjop0bjUtK+w+Um4AAAA1SURBVAjXYyAMmNlRuJw8jCh8Di42FD4/KyqfkYUdlcuExBNgReZxcCPzOHmZkTXygXmEAQBMcAC8/O73cwAAAABJRU5ErkJggg=='\n","<!-- 营销标签 -->\n<script lang=\"ts\">\n import { notNil } from '../../../shared-utils'\n import type { TagInstance } from '../../typings'\n import px2rem from '../../utils/px2rem'\n import Shadow from '../Common/Shadow.svelte'\n import { svelteResizeObserver } from '../../../shared-utils/svelte/resizeObserver'\n import { MARKETING_LIGHT_MORE_ICON, MARKETING_MORE_ICON } from './Assets/marketingIcon'\n import MediaItem from '../Common/MediaItem.svelte'\n\n export let tag: TagInstance<'Marketing'>\n\n const SMALL_SCREEN_MAX_WIDTH = 499\n const SMALL_SCREEN_PANEL_WIDTH = 238\n const DEFAULT_PANEL_WIDTH = 280\n $: unfolded = tag.state?.unfolded ?? false\n $: folded = !unfolded\n $: data = tag.data\n $: havePrice = notNil(data.price?.value) && data.price?.value !== ''\n $: theme = tag.data.theme || 'light'\n $: isLight = theme === 'light'\n $: mediaData = data.mediaData\n $: showMedia = tag.config.popoverConfig?.showMedia === true\n\n const minTagWidth = 40\n\n let windowWidth = 0\n let tagsOffsetHeight: number\n\n $: isSmallScreen = windowWidth > 0 && windowWidth <= SMALL_SCREEN_MAX_WIDTH\n $: maxWidth = (() => {\n const limitWidth = tag.data.limitWidth ?? true\n if (typeof limitWidth === 'number') return limitWidth\n else if (limitWidth === true) return isSmallScreen ? SMALL_SCREEN_PANEL_WIDTH : DEFAULT_PANEL_WIDTH\n return undefined\n })()\n\n // 修复标签计算逻辑,避免循环更新\n let maxTagsLength = 0\n let tagsCalculated = false // 添加标志,防止反复计算\n\n $: {\n // 只有在未计算过或宽度变化时才重新计算\n if (!tagsCalculated || (maxWidth && maxWidth > 0)) {\n const calculatedWidth = maxWidth || 172\n maxTagsLength = Math.max(1, Math.floor((calculatedWidth - 20) / minTagWidth))\n\n // 只在初始化完成后才考虑高度因素\n if (tagsOffsetHeight !== undefined && tagsOffsetHeight > 40) {\n maxTagsLength = Math.max(1, maxTagsLength - 1)\n }\n\n // 标记已计算,避免频繁重新计算\n tagsCalculated = true\n }\n }\n\n // 独立的处理函数,避免在模板中直接修改状态\n function handleHeightChange(height: number) {\n // 添加防抖动逻辑,避免微小变化触发重新计算\n if (Math.abs(tagsOffsetHeight - height) > 5) {\n tagsOffsetHeight = height\n // 重置标志以允许重新计算,但不立即触发\n setTimeout(() => {\n tagsCalculated = false\n }, 100)\n }\n }\n\n // 优化标签过滤逻辑,固定长度避免抖动\n $: primaryTags = (data.brandTags || []).filter(Boolean).slice(0, maxTagsLength)\n $: secondaryTagsLimit = Math.max(0, maxTagsLength - primaryTags.length)\n $: secondaryTags = (data.tags || []).filter(Boolean).slice(0, secondaryTagsLimit)\n\n // 预计算动画时间以提高可维护性\n $: lineDelayUnfolded = 400\n $: lineDelayFolded = 180 + 500 - 500 - 40\n $: contentDelayUnfolded = 400 + 180\n\n // 添加缓存检查以避免不必要的CSS计算\n $: hasTags = primaryTags.length > 0 || secondaryTags.length > 0\n $: hasFooter = havePrice || data.highlightText\n $: hasMore = tag.config.popoverConfig.toolbar.showMore\n\n $: viewMoreText = (() => {\n if (notNil(tag.config.popoverConfig.viewMoreText) && tag.config.popoverConfig.viewMoreText.trim() !== '') {\n return tag.config.popoverConfig.viewMoreText\n }\n return '查看更多'\n })()\n\n // 大小点切换时长/线条开始生长时间\n const bigSmallDotChange = 400\n // 线条生长时长\n const lineGrow = 500\n // 线条开始生长后x秒标签开始出现\n const tagContentShowWhenLineStartGrow = 180\n // 标签出现时长\n const tagContentShow = 500\n\n // 添加辅助函数确保文本显示安全\n function safeHighlightText(text) {\n return text || ''\n }\n</script>\n\n<svelte:window bind:innerWidth={windowWidth} />\n\n<div class={`marketing ${theme}`} class:unfolded class:folded>\n <Shadow visible={unfolded} outDelay={500} left={61} bottom={87} blurRadius={150} spreadRadius={75} />\n <div class=\"line\" style:transition-delay={unfolded ? lineDelayUnfolded + 'ms' : lineDelayFolded + 'ms'} />\n <div\n class=\"content\"\n style:max-width={px2rem(maxWidth)}\n style:transition-delay={unfolded ? contentDelayUnfolded + 'ms' : '0ms'}\n style:border-top-left-radius={data.headerPictureUrl ? '0px' : '6px'}\n style:border-top-right-radius={data.headerPictureUrl ? '0px' : '6px'}\n >\n {#if data.headerPictureUrl}\n <img class=\"headerImage\" src={data.headerPictureUrl} alt=\"\" />\n {/if}\n <div class=\"content-wrapper\" style:padding-top={data.headerPictureUrl ? '10px' : '20px'}>\n <div class=\"title-wrapper\">\n <div class=\"title\">\n <div class=\"text\">{data.title}</div>\n </div>\n </div>\n {#if hasTags}\n <div class=\"tags-wrapper\">\n <div class=\"tags\" use:svelteResizeObserver on:clientHeight={(e) => handleHeightChange(e.detail)}>\n {#each primaryTags || [] as tag}\n <div style:min-width={minTagWidth} class=\"tag primary-tag\">{tag}</div>\n {/each}\n {#each secondaryTags || [] as tag}\n <div style:min-width={minTagWidth} class=\"tag secondary-tag\">{tag}</div>\n {/each}\n </div>\n </div>\n {/if}\n\n {#if showMedia && mediaData && mediaData.length > 0}\n <div class=\"media-wrapper\">\n <MediaItem media={mediaData[0]} {tag} objectFit=\"cover\" />\n </div>\n {/if}\n\n {#if data.description}\n <div class=\"description\">{data.description}</div>\n {/if}\n\n {#if havePrice || data.highlightText}\n <div class=\"price-wrapper\">\n <!-- 左侧价格部分 - 始终优先完整展示 -->\n {#if havePrice}\n <div class=\"price-section\">\n <span class=\"value\">{data.price.value}</span>\n {#if data.price.unit}\n <span class=\"unit\">{data.price.unit}</span>\n {/if}\n </div>\n {/if}\n\n <!-- 右侧高亮文本和箭头 - 只在没有价格时显示高亮文本 -->\n <div class=\"action-section\">\n {#if !havePrice && data.highlightText}\n <span class=\"highlight-text\">{data.highlightText}</span>\n {/if}\n </div>\n </div>\n {/if}\n\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n {#if hasMore}\n <div class=\"more-share-wrapper\">\n <div class=\"more-text\">\n {viewMoreText}\n {#if isLight}\n <img class=\"more-icon\" src={MARKETING_LIGHT_MORE_ICON} alt=\"查看更多\" />\n {:else}\n <img class=\"more-icon\" src={MARKETING_MORE_ICON} alt=\"查看更多\" />\n {/if}\n </div>\n </div>\n {/if}\n </div>\n </div>\n</div>\n\n<style lang=\"scss\">\n * {\n box-sizing: border-box;\n }\n\n .marketing {\n transform: translateY(-100%);\n .line {\n position: absolute;\n height: 30px;\n width: 1px;\n left: 50%;\n transform: translateX(-50%);\n background-color: white;\n bottom: 0;\n transform-origin: bottom;\n transition: all 500ms;\n }\n\n .content {\n position: relative;\n min-width: 120px;\n width: max-content;\n height: max-content;\n border-radius: 6px;\n top: -30px;\n left: -16px;\n transition-property: opacity, transform;\n transition-duration: 500ms;\n .headerImage {\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n transform: translateY(-100%);\n border-top-left-radius: 6px;\n border-top-right-radius: 6px;\n }\n\n .content-wrapper {\n width: 100%;\n padding: 20px;\n }\n }\n }\n\n .title-wrapper {\n position: relative;\n width: 100%;\n .title {\n border-radius: 4px;\n width: 100%;\n .text {\n display: -webkit-box; // 必须设置为弹性盒子\n -webkit-box-orient: vertical; // 设置盒子方向为垂直\n -webkit-line-clamp: 2; // 限制显示4行\n line-clamp: 2;\n width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: normal;\n word-break: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n -webkit-hyphens: auto;\n letter-spacing: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n }\n }\n }\n\n .price-wrapper {\n box-sizing: border-box;\n width: 100%;\n margin-top: 8px;\n display: flex;\n justify-content: space-between; /* 左右两端对齐 */\n align-items: center;\n\n /* 价格部分 - 优先显示,不受挤压 */\n .price-section {\n flex-shrink: 0; /* 不缩小 */\n overflow: hidden; /* 溢出处理 */\n white-space: nowrap;\n\n .value {\n font-size: 20px;\n font-weight: 700;\n line-height: 24px;\n font-family: DINAlternate-Bold TG-TYPE, PingFangSC, Segoe UI, Rototo, sans-serif;\n letter-spacing: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .unit {\n font-size: 20px;\n font-weight: 700;\n line-height: 24px;\n font-family: DINAlternate-Bold TG-TYPE, PingFangSC, Segoe UI, Rototo, sans-serif !important;\n letter-spacing: 0;\n }\n }\n\n /* 高亮文本和箭头部分 */\n .action-section {\n display: flex;\n align-items: center;\n height: 18px;\n\n .highlight-text {\n font-size: 12px;\n line-height: 18px;\n font-weight: 400;\n letter-spacing: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 140px; /* 最大宽度限制 */\n }\n }\n }\n\n .tags-wrapper {\n position: relative;\n overflow: hidden;\n margin-top: 5px;\n .tags {\n position: relative;\n display: inline-flex;\n max-width: 100%;\n flex-wrap: wrap;\n .tag {\n display: block;\n text-align: center;\n flex-shrink: 0;\n flex-grow: 0;\n font-size: 12px;\n font-weight: 400;\n height: 18px;\n line-height: 18px;\n margin-right: 4px;\n margin-bottom: 4px;\n padding: 0 4px;\n border-radius: 2px;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n box-sizing: border-box;\n }\n }\n }\n\n .media-wrapper {\n margin-top: 6px;\n width: 100%;\n aspect-ratio: 16 / 9;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .description {\n display: -webkit-box; // 必须设置为弹性盒子\n -webkit-box-orient: vertical; // 设置盒子方向为垂直\n -webkit-line-clamp: 4; // 限制显示4行\n line-clamp: 4;\n width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n overflow-wrap: break-word;\n hyphens: auto;\n -webkit-hyphens: auto;\n white-space: normal;\n margin-top: 4px;\n font-size: 14px;\n font-weight: 400;\n line-height: 20px;\n letter-spacing: 0;\n }\n\n .more-share-wrapper {\n margin-top: 12px;\n display: block;\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: space-between;\n\n .more-text {\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n justify-content: center;\n height: 20px;\n font-size: 14px;\n font-weight: 500;\n line-height: 20px;\n letter-spacing: 0;\n .more-icon {\n margin-left: 2px;\n width: 14px;\n height: 14px;\n }\n }\n }\n\n .marketing {\n &.light {\n .content {\n background-color: white;\n .title-wrapper {\n .title {\n .text {\n color: rgba(0, 0, 0, 0.8);\n }\n }\n }\n .tags-wrapper {\n .tags {\n .primary-tag {\n background: rgba(234, 208, 154, 0.5);\n color: #946700;\n }\n .secondary-tag {\n background: rgba(0, 0, 0, 0.06);\n color: rgba(0, 0, 0, 0.5);\n }\n }\n }\n\n .description {\n color: #000;\n }\n .price-wrapper {\n color: #ae7900;\n }\n\n .more-share-wrapper {\n .more-text {\n font-family: PingFangSC-Medium;\n color: #000000d9;\n }\n }\n }\n }\n &.dark {\n .content {\n background-color: rgba(0, 0, 0, 0.75);\n .title-wrapper {\n .title {\n .text {\n color: white;\n }\n }\n }\n .tags-wrapper {\n .tags {\n .primary-tag {\n background: rgba(234, 208, 154, 0.5);\n color: white;\n }\n .secondary-tag {\n background: rgba(255, 255, 255, 0.15);\n color: rgba(255, 255, 255, 0.85);\n }\n }\n }\n\n .description {\n color: #fff;\n }\n .price-wrapper {\n color: #ead09a;\n fill: #ead09a;\n }\n\n .more-share-wrapper {\n .more-text {\n font-family: PingFangSC-Medium;\n color: #fff;\n }\n }\n }\n }\n }\n\n /** 动画 */\n .marketing {\n &.unfolded .line {\n transform: translateX(-50%) scale(1, 1);\n transition-timing-function: ease-out;\n }\n &.folded .line {\n transform: translateX(-50%) scale(1, 0);\n transition-timing-function: ease-in;\n }\n &.unfolded .content {\n opacity: 1;\n transform: translateY(0);\n transition-timing-function: ease-out;\n }\n &.folded .content {\n opacity: 0;\n transform: translateY(0.425rem);\n transition-timing-function: ease-in;\n }\n }\n\n /* 优化文本溢出处理 */\n .tag,\n .text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n</style>\n","/**\n * 音频诊断工具\n * 用于检测和诊断音频播放问题\n */\nexport class AudioDiagnostics {\n \n /**\n * 检查浏览器音频支持\n */\n static checkBrowserSupport(): {\n browser: string\n version: string\n supportedFormats: string[]\n warnings: string[]\n } {\n const userAgent = navigator.userAgent\n const audio = document.createElement('audio')\n \n // 检测浏览器\n let browser = 'Unknown'\n let version = 'Unknown'\n \n if (userAgent.includes('Edge/')) {\n browser = 'Microsoft Edge'\n version = userAgent.match(/Edge\\/(\\d+)/)?.[1] || 'Unknown'\n } else if (userAgent.includes('Chrome/')) {\n browser = 'Chrome'\n version = userAgent.match(/Chrome\\/(\\d+)/)?.[1] || 'Unknown'\n } else if (userAgent.includes('Firefox/')) {\n browser = 'Firefox'\n version = userAgent.match(/Firefox\\/(\\d+)/)?.[1] || 'Unknown'\n } else if (userAgent.includes('Safari/') && !userAgent.includes('Chrome')) {\n browser = 'Safari'\n version = userAgent.match(/Version\\/(\\d+)/)?.[1] || 'Unknown'\n }\n \n // 检查支持的格式\n const formats = [\n { name: 'MP3', mime: 'audio/mpeg' },\n { name: 'OGG', mime: 'audio/ogg' },\n { name: 'WAV', mime: 'audio/wav' },\n { name: 'M4A', mime: 'audio/mp4' },\n { name: 'AAC', mime: 'audio/aac' },\n { name: 'WEBM', mime: 'audio/webm' }\n ]\n \n const supportedFormats: string[] = []\n const warnings: string[] = []\n \n formats.forEach(format => {\n const canPlay = audio.canPlayType(format.mime)\n if (canPlay === 'probably') {\n supportedFormats.push(`${format.name} (完全支持)`)\n } else if (canPlay === 'maybe') {\n supportedFormats.push(`${format.name} (可能支持)`)\n warnings.push(`${format.name} 格式支持不确定,建议使用其他格式`)\n } else {\n warnings.push(`${format.name} 格式不被支持`)\n }\n })\n \n return {\n browser: `${browser} ${version}`,\n version,\n supportedFormats,\n warnings\n }\n }\n \n /**\n * 测试音频URL的可访问性\n */\n static async testAudioUrl(url: string): Promise<{\n accessible: boolean\n status?: number\n error?: string\n contentType?: string\n contentLength?: number\n }> {\n try {\n const response = await fetch(url, { method: 'HEAD' })\n \n return {\n accessible: response.ok,\n status: response.status,\n contentType: response.headers.get('content-type') || undefined,\n contentLength: parseInt(response.headers.get('content-length') || '0') || undefined\n }\n } catch (error) {\n return {\n accessible: false,\n error: error instanceof Error ? error.message : String(error)\n }\n }\n }\n \n /**\n * 尝试创建和测试音频元素\n */\n static async testAudioElement(url: string): Promise<{\n success: boolean\n error?: string\n canPlay?: string\n duration?: number\n networkState?: number\n readyState?: number\n }> {\n return new Promise((resolve) => {\n const audio = new Audio()\n let resolved = false\n \n const cleanup = () => {\n if (!resolved) {\n resolved = true\n audio.removeEventListener('loadedmetadata', onSuccess)\n audio.removeEventListener('error', onError)\n audio.removeEventListener('canplay', onCanPlay)\n }\n }\n \n const onSuccess = () => {\n cleanup()\n resolve({\n success: true,\n duration: audio.duration,\n networkState: audio.networkState,\n readyState: audio.readyState\n })\n }\n \n const onCanPlay = () => {\n cleanup()\n resolve({\n success: true,\n canPlay: 'canplay',\n duration: audio.duration,\n networkState: audio.networkState,\n readyState: audio.readyState\n })\n }\n \n const onError = () => {\n cleanup()\n resolve({\n success: false,\n error: audio.error ? `${audio.error.code}: ${audio.error.message}` : 'Unknown audio error',\n networkState: audio.networkState,\n readyState: audio.readyState\n })\n }\n \n // 设置事件监听器\n audio.addEventListener('loadedmetadata', onSuccess)\n audio.addEventListener('canplay', onCanPlay)\n audio.addEventListener('error', onError)\n \n // 超时处理\n setTimeout(() => {\n if (!resolved) {\n cleanup()\n resolve({\n success: false,\n error: '音频加载超时',\n networkState: audio.networkState,\n readyState: audio.readyState\n })\n }\n }, 10000) // 10秒超时\n \n // 开始加载\n audio.src = url\n audio.load()\n })\n }\n \n /**\n * 完整的音频诊断\n */\n static async diagnoseAudio(url: string): Promise<void> {\n console.group('🎵 音频诊断报告')\n \n // 1. 浏览器支持检查\n console.group('1. 浏览器支持检查')\n const browserSupport = this.checkBrowserSupport()\n console.log('浏览器:', browserSupport.browser)\n console.log('支持的格式:', browserSupport.supportedFormats)\n if (browserSupport.warnings.length > 0) {\n console.warn('警告:', browserSupport.warnings)\n }\n console.groupEnd()\n \n // 2. URL 检查\n console.group('2. 音频文件URL检查')\n console.log('音频URL:', url)\n \n try {\n new URL(url, window.location.href)\n console.log('✅ URL格式正确')\n } catch {\n console.error('❌ URL格式错误')\n console.groupEnd()\n console.groupEnd()\n return\n }\n \n // 检查文件扩展名\n const extension = url.split('.').pop()?.toLowerCase()\n if (extension) {\n console.log('文件扩展名:', extension.toUpperCase())\n const commonFormats = ['mp3', 'ogg', 'wav', 'm4a', 'aac', 'webm']\n if (commonFormats.includes(extension)) {\n console.log('✅ 文件格式常见')\n } else {\n console.warn('⚠️ 不常见的文件格式,可能存在兼容性问题')\n }\n }\n console.groupEnd()\n \n // 3. 网络可访问性测试\n console.group('3. 网络可访问性测试')\n const urlTest = await this.testAudioUrl(url)\n \n if (urlTest.accessible) {\n console.log('✅ 文件可访问')\n console.log('HTTP状态:', urlTest.status)\n if (urlTest.contentType) {\n console.log('内容类型:', urlTest.contentType)\n }\n if (urlTest.contentLength) {\n console.log('文件大小:', (urlTest.contentLength / 1024).toFixed(2), 'KB')\n }\n } else {\n console.error('❌ 文件无法访问')\n if (urlTest.status) {\n console.error('HTTP状态:', urlTest.status)\n }\n if (urlTest.error) {\n console.error('错误:', urlTest.error)\n }\n }\n console.groupEnd()\n \n // 4. 音频元素测试\n console.group('4. 音频元素测试')\n const audioTest = await this.testAudioElement(url)\n \n if (audioTest.success) {\n console.log('✅ 音频元素创建成功')\n if (audioTest.duration) {\n console.log('音频时长:', audioTest.duration.toFixed(2), '秒')\n }\n console.log('网络状态:', this.getNetworkStateDescription(audioTest.networkState))\n console.log('就绪状态:', this.getReadyStateDescription(audioTest.readyState))\n } else {\n console.error('❌ 音频元素创建失败')\n console.error('错误:', audioTest.error)\n console.log('网络状态:', this.getNetworkStateDescription(audioTest.networkState))\n console.log('就绪状态:', this.getReadyStateDescription(audioTest.readyState))\n }\n console.groupEnd()\n \n console.groupEnd()\n }\n \n private static getNetworkStateDescription(state?: number): string {\n switch (state) {\n case 0: return 'NETWORK_EMPTY - 音频元素尚未初始化'\n case 1: return 'NETWORK_IDLE - 音频元素处于活动状态但未使用网络'\n case 2: return 'NETWORK_LOADING - 浏览器正在下载数据'\n case 3: return 'NETWORK_NO_SOURCE - 未找到合适的音频源'\n default: return `未知状态 (${state})`\n }\n }\n \n private static getReadyStateDescription(state?: number): string {\n switch (state) {\n case 0: return 'HAVE_NOTHING - 没有音频数据'\n case 1: return 'HAVE_METADATA - 已获取元数据'\n case 2: return 'HAVE_CURRENT_DATA - 有当前播放位置的数据'\n case 3: return 'HAVE_FUTURE_DATA - 有足够的数据开始播放'\n case 4: return 'HAVE_ENOUGH_DATA - 有足够的数据流畅播放'\n default: return `未知状态 (${state})`\n }\n }\n} ","import type { PlaybackManager, PlaybackController, PlaybackSession } from '../../../shared-utils/playback'\nimport type { IAudio } from '../../../shared-utils/audio';\nimport { AudioNamespace, getAudio } from '../../../shared-utils/audio'\nimport { AudioDiagnostics } from './AudioDiagnostics'\n\n// 导出诊断工具供外部使用\nexport { AudioDiagnostics }\n\nconst AudioElement = (() => {\n if (typeof Audio === 'undefined') return class {} as new () => HTMLAudioElement\n return Audio\n})()\n\nexport class SharedAudio extends AudioElement {\n public get paused() {\n return this.sharedAudioPaused ?? true\n }\n public get currentTime() {\n return this.sharedAudioCurrentTime\n }\n public get duration() {\n return this.audioInstance?.duration || 0\n }\n\n private sharedAudioSrc?: string\n private sharedAudioPaused = true\n private sharedAudioCurrentTime = 0\n private tryplaying = false\n private audioInstance?: IAudio\n private eventListenerDisposer?: () => void\n\n private mediaManager?: PlaybackManager\n private controller?: PlaybackController\n private session?: PlaybackSession\n private playGeneration = 0\n private disposed = false\n private poolGeneration = -1\n\n public constructor(src?: string, mediaManager?: PlaybackManager) {\n super()\n this.setMediaManager(mediaManager)\n this.sharedAudioSrc = src\n \n // 预验证音频文件\n if (src) {\n this.validateAudioSource(src)\n }\n }\n\n public async play(userAction = false): Promise<void> {\n if (this.tryplaying || this.disposed) return\n const session = this.controller?.begin({ userAction, audible: true })\n if (this.controller && !session) return\n this.session = session\n const generation = ++this.playGeneration\n const current = () => generation === this.playGeneration && !session?.signal.aborted\n this.tryplaying = true\n if (!this.audioInstance || this.audioInstance.realSrc !== this.sharedAudioSrc || this.audioInstance.generation !== this.poolGeneration) {\n this.audioInstance = getAudio(this.sharedAudioSrc, { namespace: AudioNamespace.PlayAudio })\n this.poolGeneration = this.audioInstance.generation\n }\n const audio = this.audioInstance\n const poolGeneration = this.poolGeneration\n this.eventListenerDisposer?.()\n this.eventListenerDisposer = this.addEventListeners()\n const operations = session?.bind(audio) ?? audio\n const currentTime = this.currentTime ?? 0\n operations.currentTime = currentTime\n // 部分 iOS 机型在 loadeddata 前忽略 seek,播放就绪后恢复暂停位置。\n const restoreTimeAfterPlay = operations.currentTime !== currentTime\n try {\n operations.muted = false\n await operations.play()\n if (!current() || audio.generation !== poolGeneration) return\n if (restoreTimeAfterPlay) operations.currentTime = currentTime\n this.sharedAudioPaused = false\n } catch (error) {\n if (!current()) return\n if ((error as Error).name === 'AbortError') { this.pause(); return }\n this.controller?.cancel()\n this.stopOutput()\n this.handlePlayError(error)\n this.onerror?.(error)\n throw error\n } finally {\n if (audio.generation === poolGeneration) this.tryplaying = false\n }\n }\n\n public setMediaManager(manager?: PlaybackManager) {\n if (this.disposed || manager === this.mediaManager) return\n this.mediaManager = manager\n this.controller?.dispose()\n this.stopOutput()\n this.controller = manager?.createController({ label: 'tag-audio', onCancel: () => this.stopOutput() })\n }\n\n public pause(e?: Event): void { this.controller?.cancel(); this.stopOutput() }\n\n private stopOutput(): void {\n this.playGeneration++\n this.session = undefined\n this.tryplaying = false\n this.sharedAudioPaused = true\n this.eventListenerDisposer?.()\n this.eventListenerDisposer = undefined\n if (this.audioInstance?.generation === this.poolGeneration) {\n this.sharedAudioCurrentTime = this.audioInstance.currentTime\n this.audioInstance.muted = true\n this.audioInstance.pause()\n this.audioInstance.clear()\n }\n this.audioInstance = undefined\n this.onpause?.(new Event('pause'))\n }\n\n public dispose(): void { this.disposed = true; this.controller?.dispose(); this.stopOutput() }\n\n\n private handlePlayError(error: any): void {\n const userAgent = navigator.userAgent\n const audioSrc = this.sharedAudioSrc\n \n console.group('🎵 音频播放错误详情')\n console.error('错误对象:', error)\n console.error('错误名称:', error.name)\n console.error('错误信息:', error.message)\n console.error('音频文件路径:', audioSrc)\n console.error('浏览器信息:', userAgent)\n console.error('音频实例状态:', {\n exists: !!this.audioInstance,\n readyState: this.audioInstance?.readyState,\n networkState: this.audioInstance?.networkState,\n error: this.audioInstance?.error\n })\n \n // 根据错误类型提供具体的解决建议\n if (error.name === 'NotSupportedError') {\n if (error.message.includes('no supported source was found')) {\n console.error('❌ 错误原因: 无法找到支持的音频源')\n console.error('💡 可能的解决方案:')\n console.error(' 1. 检查音频文件路径是否正确')\n console.error(' 2. 检查音频文件是否存在')\n console.error(' 3. 检查音频文件格式是否被浏览器支持 (推荐: MP3, OGG, WAV)')\n console.error(' 4. 检查CORS设置,确保可以跨域访问音频文件')\n \n // 检查文件扩展名\n if (audioSrc) {\n const extension = audioSrc.split('.').pop()?.toLowerCase()\n const supportedFormats = ['mp3', 'ogg', 'wav', 'm4a', 'aac']\n if (extension && !supportedFormats.includes(extension)) {\n console.error(` ⚠️ 检测到不常见的音频格式: .${extension}`)\n console.error(` 📝 建议使用: ${supportedFormats.join(', ')}`)\n }\n }\n }\n } else if (error.name === 'AbortError') {\n console.error('❌ 错误原因: 音频播放被中断')\n } else if (error.name === 'NotAllowedError') {\n console.error('❌ 错误原因: 浏览器阻止了音频播放 (通常需要用户交互)')\n } else if (error.message === 'The operation is not supported.') {\n console.error('❌ 错误原因: 音频文件可能损坏或格式有问题')\n } else {\n console.error('❌ 未知的音频播放错误')\n }\n \n console.groupEnd()\n \n // 如果是严重错误,建议运行完整诊断\n if (error.name === 'NotSupportedError' && audioSrc) {\n console.error('💡 建议运行完整音频诊断来查找问题根源:')\n console.error(`AudioDiagnostics.diagnoseAudio(\"${audioSrc}\")`)\n \n // 自动运行诊断(仅在开发环境)\n if (process.env.NODE_ENV === 'development') {\n console.warn('🔍 自动运行音频诊断...')\n AudioDiagnostics.diagnoseAudio(audioSrc)\n }\n }\n }\n\n private validateAudioSource(src: string): void {\n // 快速检查URL格式\n try {\n new URL(src, window.location.href)\n } catch {\n console.warn('🎵 音频URL格式可能有问题:', src)\n // 如果URL有问题,立即运行完整诊断\n AudioDiagnostics.diagnoseAudio(src)\n return\n }\n\n // 检查文件扩展名\n const extension = src.split('.').pop()?.toLowerCase()\n const supportedFormats = ['mp3', 'ogg', 'wav', 'm4a', 'aac', 'webm']\n \n if (extension && !supportedFormats.includes(extension)) {\n console.warn('🎵 音频格式可能不被广泛支持:', extension)\n console.warn('💡 建议使用常见格式:', supportedFormats.join(', '))\n console.warn('💡 运行音频诊断:AudioDiagnostics.diagnoseAudio(\"' + src + '\")')\n }\n\n // 检查浏览器对该格式的支持\n this.checkBrowserSupport(extension)\n }\n\n private checkBrowserSupport(extension?: string): void {\n if (!extension) return\n\n const audio = document.createElement('audio')\n const mimeTypes: Record<string, string> = {\n 'mp3': 'audio/mpeg',\n 'ogg': 'audio/ogg',\n 'wav': 'audio/wav',\n 'm4a': 'audio/mp4',\n 'aac': 'audio/aac',\n 'webm': 'audio/webm'\n }\n\n const mimeType = mimeTypes[extension]\n if (mimeType) {\n const canPlay = audio.canPlayType(mimeType)\n if (canPlay === '') {\n console.warn(`🎵 当前浏览器可能不支持 ${extension.toUpperCase()} 格式`)\n console.warn('💡 建议提供多种格式的音频文件作为备选')\n } else if (canPlay === 'maybe') {\n console.info(`🎵 当前浏览器可能支持 ${extension.toUpperCase()} 格式 (不确定)`)\n } else {\n console.info(`🎵 当前浏览器支持 ${extension.toUpperCase()} 格式`)\n }\n }\n }\n\n private endedHandler(e?: Event): void {\n const audio = this.audioInstance\n const poolGeneration = this.poolGeneration\n const session = this.session\n this.playGeneration++\n this.session = undefined\n this.tryplaying = false\n this.eventListenerDisposer?.()\n this.eventListenerDisposer = undefined\n this.sharedAudioPaused = true\n this.sharedAudioCurrentTime = 0\n this.audioInstance = undefined\n session?.finish()\n if (audio?.generation === poolGeneration) audio.clear()\n // Consumers may synchronously replay here; no old cleanup may follow it.\n this.onended?.(e ?? new Event('ended'))\n }\n\n private addEventListeners() {\n const audio = this.audioInstance\n if (!audio) return\n const poolGeneration = this.poolGeneration\n\n const ontimeupdate = (e: Event) => {\n this.sharedAudioCurrentTime = audio.currentTime\n this.ontimeupdate?.(e)\n }\n const onplay = (e: Event) => {\n if (audio.isBlankAudio) return\n this.sharedAudioPaused = false\n this.onplay?.(e)\n }\n const ownsAudio = () => this.audioInstance === audio && audio.generation === poolGeneration\n const onpause = (e: Event) => {\n if (!ownsAudio() || !audio.paused || audio.ended) return\n this.pause(e)\n }\n const onended = (e: Event) => {\n if (ownsAudio() && audio.ended) this.endedHandler(e)\n }\n const onerror = (e: Event) => {\n if (!ownsAudio()) return\n this.controller?.cancel()\n // A manager may already have stopped this output in its cancel callback.\n if (ownsAudio()) this.stopOutput()\n if (!this.disposed && !this.audioInstance) this.onerror?.(e)\n }\n const oncanplay = (e: Event) => this.oncanplay?.(e)\n const oncanplaythrough = (e: Event) => this.oncanplaythrough?.(e)\n const onloadeddata = (e: Event) => this.onloadeddata?.(e)\n const onloadedmetadata = (e: Event) => this.onloadedmetadata?.(e)\n\n audio.addEventListener('timeupdate', ontimeupdate)\n audio.addEventListener('play', onplay)\n audio.addEventListener('pause', onpause)\n audio.addEventListener('ended', onended)\n audio.addEventListener('error', onerror)\n audio.addEventListener('canplay', oncanplay)\n audio.addEventListener('canplaythrough', oncanplaythrough)\n audio.addEventListener('loadeddata', onloadeddata)\n audio.addEventListener('loadedmetadata', onloadedmetadata)\n\n return () => {\n audio.removeEventListener('timeupdate', ontimeupdate)\n audio.removeEventListener('play', onplay)\n audio.removeEventListener('pause', onpause)\n audio.removeEventListener('ended', onended)\n audio.removeEventListener('error', onerror)\n audio.removeEventListener('canplay', oncanplay)\n audio.removeEventListener('canplaythrough', oncanplaythrough)\n audio.removeEventListener('loadeddata', onloadeddata)\n audio.removeEventListener('loadedmetadata', onloadedmetadata)\n }\n }\n}\n","<script lang=\"ts\">\n import type { TagHooks, MediaStore, TagInstance } from '../../typings'\n import { createEventDispatcher, getContext, onDestroy } from 'svelte'\n import { SharedAudio } from '../../utils/audio/SharedAudio'\n\n export let url: string\n export let enable = true\n export let style = ''\n export let hooksInfo: {\n tag: TagInstance\n }\n\n const dispatch = createEventDispatcher<{\n audioRef: SharedAudio\n duration: number\n play: undefined\n pause: undefined\n timeupdate: number\n }>()\n const hooks = getContext<TagHooks>('hooks')\n const mediaStore = getContext<MediaStore>('mediaStore')\n\n let unbindMediaManager: (() => void) | undefined\n let audioRefTimeout: ReturnType<typeof setTimeout> | undefined\n let audioUrl: string | undefined\n let audioTag: TagInstance | undefined\n let audio: SharedAudio\n let audioPaused = true\n\n $: {\n if (!url) dispatch('duration', 0)\n }\n\n function addAudioEventListener(instance: SharedAudio, ownerTag: TagInstance) {\n const eventInfo = () => hooksInfo?.tag === ownerTag ? hooksInfo : { tag: ownerTag }\n instance.onplay = (event) => {\n hooks.emit('playStateChange', { event, state: 'playing', mediaInstance: instance, ...eventInfo() })\n dispatch('play')\n audioPaused = false\n }\n instance.onpause = (event) => {\n hooks.emit('playStateChange', { event, state: 'paused', mediaInstance: instance, ...eventInfo() })\n dispatch('pause')\n audioPaused = true\n }\n instance.onended = (event) => {\n hooks.emit('playStateChange', { event, state: 'paused', mediaInstance: instance, ...eventInfo() })\n dispatch('pause')\n audioPaused = true\n }\n instance.onloadedmetadata = (event) => {\n if (typeof instance.duration === 'number' && !Number.isNaN(instance.duration)) dispatch('duration', instance.duration)\n }\n instance.onerror = (event) => {\n dispatch('pause')\n audioPaused = true\n }\n instance.ontimeupdate = (event) => {\n dispatch('timeupdate', instance.currentTime)\n }\n }\n\n const unsubscribeMedia = mediaStore.subscribe(({ currentMediaElement }) => {\n if (currentMediaElement !== audio) {\n if (!audioPaused) audio?.pause()\n }\n })\n\n $: {\n if (!enable) audio?.pause()\n }\n\n $: {\n const playing = enable && !audioPaused\n playing ? dispatch('play') : dispatch('pause')\n }\n\n function releaseAudio() {\n clearTimeout(audioRefTimeout)\n audioRefTimeout = undefined\n unbindMediaManager?.()\n unbindMediaManager = undefined\n audio?.dispose()\n }\n\n function syncAudio(source: string, tag: TagInstance) {\n // Render updates pass a fresh hooksInfo wrapper for the same tag each frame.\n if (audio && source === audioUrl && tag === audioTag) {\n audio.setMediaManager(tag?.mediaManager)\n return\n }\n releaseAudio()\n const instance = new SharedAudio(source, tag?.mediaManager)\n audio = instance\n audioUrl = source\n audioTag = tag\n unbindMediaManager = tag?.bindMediaManager((host) => instance.setMediaManager(host))\n addAudioEventListener(instance, tag)\n dispatch('audioRef', instance)\n audioRefTimeout = setTimeout(() => {\n if (audio === instance) dispatch('audioRef', instance)\n }, 200)\n }\n\n $: syncAudio(url, hooksInfo?.tag)\n\n function onClick(event: MouseEvent) {\n if (!audio) return\n hooks.emit('click', { event, target: 'AudioTagPlayIcon', audioInstance: audio, ...hooksInfo })\n // 暂停其他音频\n mediaStore.set({ currentMediaElement: audio })\n\n if (audio.paused) {\n // SharedAudio already stops output, reports diagnostics and emits onerror.\n void audio.play(true).catch(() => {})\n } else audio.pause()\n }\n onDestroy(() => { unsubscribeMedia(); releaseAudio() })\n</script>\n\n<!-- svelte-ignore a11y-click-events-have-key-events -->\n<div class=\"audio\" on:click|stopPropagation={onClick} {style}>\n <slot />\n</div>\n\n<style>\n .audio {\n pointer-events: auto;\n cursor: pointer;\n width: 100%;\n height: 100%;\n }\n</style>\n","<script lang=\"ts\">\n import px2rem from '../../../utils/px2rem'\n import Shadow from '../Shadow.svelte'\n import { onDestroy } from 'svelte'\n\n export let playing: boolean\n export let shadow = false\n export let style: string | undefined | null = null\n export let width: number | string | undefined | null = '100%'\n export let animated = true\n\n let icon: HTMLDivElement\n let animationStep = 0\n let timer: ReturnType<typeof setInterval> | null = null\n\n const SimpleAnimationSteps = [\n 'M12 3.25c2.416 0 4.604.98 6.187 2.563A8.723 8.723 0 0 1 20.75 12c0 2.416-.98 4.604-2.563 6.187A8.723 8.723 0 0 1 12 20.75a8.723 8.723 0 0 1-6.187-2.563A8.723 8.723 0 0 1 3.25 12c0-2.416.98-4.604 2.563-6.187A8.723 8.723 0 0 1 12 3.25Zm1.534 3.282-1.29 1.289.186.183a5.86 5.86 0 0 1 1.663 4.095c0 1.555-.605 2.965-1.786 4.236l1.118 1.12.2-.19a7.46 7.46 0 0 0 2.225-5.322 7.46 7.46 0 0 0-2.316-5.411Zm-2.046 2.047-1.245 1.243.14.133a3.04 3.04 0 0 1 .882 2.144c0 .795-.308 1.516-.955 2.24l1.23 1.231.168-.168a4.793 4.793 0 0 0 1.314-3.303c0-1.39-.59-2.643-1.534-3.52Zm-1.752 1.78-1.69 1.689 1.745 1.743.132-.13a2.29 2.29 0 0 0-.187-3.302Z',\n 'M12 3.25c2.416 0 4.604.98 6.187 2.563A8.723 8.723 0 0 1 20.75 12c0 2.416-.98 4.604-2.563 6.187A8.723 8.723 0 0 1 12 20.75a8.723 8.723 0 0 1-6.187-2.563A8.723 8.723 0 0 1 3.25 12c0-2.416.98-4.604 2.563-6.187A8.723 8.723 0 0 1 12 3.25Zm-2.264 7.109-1.69 1.689 1.745 1.743.132-.13a2.29 2.29 0 0 0-.187-3.302Z',\n 'M12 3.25c2.416 0 4.604.98 6.187 2.563A8.723 8.723 0 0 1 20.75 12c0 2.416-.98 4.604-2.563 6.187A8.723 8.723 0 0 1 12 20.75a8.723 8.723 0 0 1-6.187-2.563A8.723 8.723 0 0 1 3.25 12c0-2.416.98-4.604 2.563-6.187A8.723 8.723 0 0 1 12 3.25Zm-.512 5.329-1.245 1.243.14.133a3.04 3.04 0 0 1 .882 2.144c0 .795-.308 1.516-.955 2.24l1.23 1.231.168-.168a4.793 4.793 0 0 0 1.314-3.303c0-1.39-.59-2.643-1.534-3.52Zm-1.752 1.78-1.69 1.689 1.745 1.743.132-.13a2.29 2.29 0 0 0-.187-3.302Z',\n ]\n\n $: styleWidth = typeof width === 'number' ? px2rem(width) : width\n\n // 监听 playing 状态变化\n $: if (playing) {\n if (!timer) {\n // 开始动画\n timer = setInterval(() => {\n animationStep = (animationStep + 1) % SimpleAnimationSteps.length\n }, 500)\n }\n } else {\n // 停止动画\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n animationStep = 0\n }\n\n // 计算当前要使用的动画步骤\n $: d = SimpleAnimationSteps[animated ? animationStep : 0] ?? SimpleAnimationSteps[0]\n\n // 组件销毁时清理定时器\n onDestroy(() => {\n if (timer) {\n clearInterval(timer)\n timer = null\n }\n })\n\n</script>\n\n<div class=\"audio-icon__wrapper\" style:width={styleWidth} style:height={styleWidth} {style}>\n {#if shadow}\n <Shadow center blurRadius={12} spreadRadius={5} />\n {/if}\n <div class=\"audio-icon\">\n <div bind:this={icon} class=\"sound-wave__container\">\n <svg viewBox=\"0 0 24 24\" version=\"1.1\" aria-label=\"audio-icon\">\n <defs>\n <linearGradient x1=\"8.653%\" y1=\"15.676%\" x2=\"85.159%\" y2=\"79.274%\" id=\"dnalogel-audio-icon-linear-gradient-1\">\n <stop stop-color=\"rgba(255, 255, 255, 1)\" stop-opacity=\".5\" offset=\"0%\" />\n <stop stop-color=\"rgba(255, 255, 255, 1)\" offset=\"100%\" />\n </linearGradient>\n <linearGradient x1=\"0%\" y1=\"0%\" x2=\"64.422%\" y2=\"62.326%\" id=\"dnalogel-audio-icon-linear-gradient-2\">\n <stop stop-color=\"rgba(255, 255, 255, 1)\" offset=\"0%\" />\n <stop stop-color=\"rgba(255, 255, 255, 1)\" stop-opacity=\"0\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <path\n {d}\n fill=\"url(#dnalogel-audio-icon-linear-gradient-1)\"\n fill-rule=\"nonzero\"\n stroke=\"url(#dnalogel-audio-icon-linear-gradient-2)\"\n stroke-width=\".5\"\n />\n </svg>\n </div>\n </div>\n</div>\n\n<style lang=\"scss\">\n .audio-icon__wrapper {\n display: inline-block;\n }\n\n .audio-icon {\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n .sound-wave__container {\n position: absolute;\n pointer-events: none;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n }\n\n // 动画\n .sound-wave {\n animation-duration: 2s;\n // animation-timing-function: ease-in-out;\n animation-iteration-count: infinite;\n animation-play-state: paused;\n transition: opacity 0;\n }\n .playing {\n .sound-wave {\n animation-play-state: running;\n }\n .sound-wave-1 {\n animation-name: sound_wave_1_animation;\n }\n .sound-wave-2 {\n animation-name: sound_wave_2_animation;\n }\n .sound-wave-3 {\n animation-name: sound_wave_3_animation;\n }\n }\n\n @keyframes sound_wave_1_animation {\n 0%,\n 10% {\n opacity: 0;\n }\n 25%,\n 100% {\n opacity: 1;\n }\n }\n\n @keyframes sound_wave_2_animation {\n 0%,\n 35% {\n opacity: 0;\n }\n 50%,\n 100% {\n opacity: 1;\n }\n }\n\n @keyframes sound_wave_3_animation {\n 0%,\n 60% {\n opacity: 0;\n }\n 75%,\n 100% {\n opacity: 1;\n }\n }\n\n</style>\n","<!-- 图文标签 -->\n<script lang=\"ts\">\n import { cubicInOut } from 'svelte/easing'\n import { fade } from 'svelte/transition'\n import type { TagInstance } from '../../../typings'\n import Audio from '../../Common/Audio.svelte'\n import Line from '../../Common/Line/Straight.svelte'\n import Shadow from '../../Common/Shadow.svelte'\n import FlyMText from '../../Common/Text/FlyMText.svelte'\n import AudioIcon from '../../Common/Icon/audioIcon.svelte'\n import { svelteResizeObserver } from '../../../../shared-utils/svelte/resizeObserver'\n\n export let tag: TagInstance<'Audio'>\n\n let textUnfolded = false\n let playing = false\n let contentWidth: number\n $: unfolded = !!tag.state?.unfolded\n $: content = tag.data.title ?? ''\n\n // 收起的时候,如果文字展开了,要先下下去,再收起\n $: foldTextDelay = textUnfolded ? 450 : 0\n\n function clickContent() {\n textUnfolded = !textUnfolded\n }\n</script>\n\n{#if tag.state}\n <div class=\"audio-tag\" class:unfolded>\n <Shadow visible={unfolded} left={contentWidth / 2 + 'px'} bottom={12} width={2} blurRadius={120} spreadRadius={60} />\n <div class=\"content\">\n <div class=\"wrapper\">\n <div class=\"audio-icon\">\n {#if unfolded}\n <div\n class=\"audio\"\n in:fade|local={{ duration: 1000, delay: 0, easing: cubicInOut }}\n out:fade|local={{ duration: 1000, delay: 20 * Math.min(content?.length ?? 10, 15), easing: cubicInOut }}\n >\n <Shadow center blurRadius={15} spreadRadius={6} />\n <Audio\n enable={unfolded}\n url={tag.data.audioUrl}\n hooksInfo={{ tag }}\n on:play={() => {\n playing = true\n }}\n on:pause={() => {\n playing = false\n }}\n on:error={() => {\n playing = false\n }}\n on:audioRef\n >\n <div class=\"audio-icon__wrapper\">\n <AudioIcon {playing} />\n </div>\n </Audio>\n </div>\n {/if}\n </div>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n style:display=\"inline-block\"\n on:click={clickContent}\n use:svelteResizeObserver\n on:clientWidth={(e) => {\n contentWidth = e.detail\n }}\n >\n <FlyMText visible={unfolded} {textUnfolded} {content} />\n </div>\n </div>\n </div>\n <Line {unfolded} length={contentWidth} outDelay={foldTextDelay + 20 * Math.min(content?.length ?? 10, 15)} useLinearColor />\n </div>\n{/if}\n\n<style>\n .audio-tag {\n position: absolute;\n left: 0;\n top: 0;\n width: 0;\n height: 0;\n overflow: visible;\n }\n\n .audio-icon__wrapper {\n position: relative;\n vertical-align: top;\n width: 100%;\n height: 100%;\n }\n\n .content {\n width: max-content;\n height: 54px;\n padding: 36px 4px 0 16px;\n position: absolute;\n left: 0;\n bottom: 2px;\n overflow: hidden;\n box-sizing: border-box;\n font-size: 0;\n white-space: nowrap;\n font-weight: 600;\n }\n\n .wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .audio-icon {\n pointer-events: none;\n vertical-align: top;\n display: inline-block;\n width: 16px;\n height: 16px;\n margin-right: 4px;\n margin-top: 1px;\n }\n\n .audio {\n position: relative;\n width: 100%;\n height: 100%;\n }\n</style>\n","<!-- 图文标签 -->\n<script lang=\"ts\">\n import type { TagInstance } from '../../../typings'\n import AudioIcon from '../../Common/Icon/audioIcon.svelte'\n import MText from '../../Common/Text/MText.svelte'\n import Audio from '../../Common/Audio.svelte'\n\n export let tag: TagInstance<'Audio'>\n\n let currentTime = 0\n let duration = 0\n let playing = false\n\n $: title = tag.data.title ?? ''\n</script>\n\n{#if tag.state}\n <div class=\"audio-tag__wrapper\">\n <div class=\"audio-tag\">\n <Audio\n style=\"width: max-content; height: max-content;\"\n enable={tag.state.visible}\n url={tag.data.audioUrl}\n hooksInfo={{ tag }}\n on:play={() => {\n playing = true\n }}\n on:pause={() => {\n playing = false\n }}\n on:error={() => {\n playing = false\n }}\n on:timeupdate={(event) => {\n currentTime = event.detail\n }}\n on:duration={(event) => {\n duration = event.detail\n }}\n on:audioRef\n >\n <div class=\"audio__inner\">\n <div class=\"audio-icon__wrapper\">\n <AudioIcon {playing} />\n </div>\n <!-- <div class=\"currentTime\">\n {#if typeof (playing ? currentTime : duration) === 'number'}\n {timeToString(noTypecheck(playing ? currentTime : duration ?? 0))}\n {/if}\n </div> -->\n <div class=\"text\">\n <MText maxWidth={72} maxLine={1}>\n {title}\n </MText>\n </div>\n </div>\n </Audio>\n </div>\n </div>\n{/if}\n\n<style>\n .audio-tag__wrapper {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n }\n .audio-tag {\n position: relative;\n width: max-content;\n height: max-content;\n padding: 4px;\n padding-right: 10px;\n border-radius: 9999999px;\n border: 1px solid rgba(255, 255, 255, 0.6);\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.2));\n box-shadow: inset 0 0 4px 0 rgba(255, 255, 255, 0.3);\n }\n\n .currentTime {\n font-family: TG-TYPE, PingFangSC, Segoe UI, Rototo, sans-serif;\n margin-left: 4px;\n }\n\n .audio__inner {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n }\n\n .text {\n font-weight: bold;\n font-size: 12px;\n margin-left: 4px;\n }\n\n .audio-icon__wrapper {\n position: relative;\n vertical-align: top;\n pointer-events: none;\n width: 24px;\n height: 24px;\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../../typings'\n import type { SharedAudio } from '../../../utils/audio/SharedAudio'\n import AudioTag from './AudioTag.svelte'\n import AudioPlaneTag from './AudioPlaneTag.svelte'\n\n export let tag: TagInstance<'Audio'>\n\n let audio: SharedAudio\n\n function audioRef(event) {\n audio = event.detail\n }\n tag.play = (userAction = false) => audio.play(userAction)\n tag.pause = () => audio.pause()\n\n $: appearance = tag.data.appearance ?? 'line'\n</script>\n\n{#if appearance === 'line'}\n <AudioTag {tag} on:audioRef={audioRef} />\n{:else if appearance === 'plane'}\n <AudioPlaneTag {tag} on:audioRef={audioRef} />\n{/if}\n","<!-- 多媒体贴片; 营销贴片 -->\n<script lang=\"ts\">\n import type { TagInstance } from '../../typings'\n import Media from '../Common/Media.svelte'\n\n export let tag: TagInstance<'MediaPlane'>\n\n $: unfolded = tag.state ? tag.state.unfolded : false\n $: mediaData = tag.data.mediaData\n $: enableCarousel = tag.data.enableCarousel\n $: playIcon = tag.data.playIcon\n $: autoplayConfig = tag.data.autoplayConfig ?? { autoplay: enableCarousel ?? true, autoplayVideo: true }\n $: objectFit = tag.data.objectFit\n</script>\n\n{#if tag.state && mediaData}\n <div class=\"media-wrapper\">\n <Media\n mediaItemConfig={{\n canPlay: true,\n playButtonSizeIfNeed: 'large',\n playButtonIfNeed: playIcon ?? 'withText',\n disableVideoIfHavePoster: false,\n objectFit,\n }}\n {unfolded}\n {mediaData}\n {enableCarousel}\n {autoplayConfig}\n {tag}\n inDelay={500}\n duration={500}\n />\n </div>\n{/if}\n\n<style>\n .media-wrapper {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n</style>\n","import type { TagIconUrl } from '..'\n\nconst cache = new Map<string, Promise<{ width: number; height: number }>>()\n\nexport async function getImageSize(url: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n if (!url) {\n reject(Error('url is empty'))\n return\n }\n\n const img = new Image()\n img.src = url\n img.onload = () => resolve({ width: img.width, height: img.height })\n img.onerror = reject\n })\n}\n\nexport async function getImageInfo<T extends Pick<TagIconUrl, 'url' | 'ratio'>>(params: T) {\n const { url, ratio = 3 } = params\n\n // 建议设置 ratio\n // if (!params.ratio) console.warn('Tag icon ratio is not set, default is 3')\n\n const getImageSizePromise = (() => {\n if (cache.has(url)) return cache.get(url)\n const promise = getImageSize(url)\n cache.set(url, promise)\n return promise\n })()\n const { width: realWidth, height: realHeight } = await getImageSizePromise\n\n return {\n ...params,\n width: realWidth / ratio,\n height: realHeight / ratio,\n }\n}\n\nexport async function getKeyframeInfo<T extends Pick<TagIconUrl, 'fps' | 'ratio' | 'steps' | 'url'>>(params: T) {\n const { steps, url, ratio = 3, fps = 24 } = params\n\n if (!steps || !Number.isInteger(steps) || steps < 2) throw new Error('KeyframeIcon requires at least two frames')\n\n const { width: keyframesRealWidth, height: keyframesRealHeight } = await getImageSize(url)\n\n const keyframesWidth = keyframesRealWidth / ratio\n const keyframesHeight = keyframesRealHeight / ratio\n\n const perWidth = keyframesWidth / steps\n const perHeight = keyframesHeight\n\n const duration = (1 / fps) * steps + 's'\n\n return {\n ...params,\n width: perWidth,\n height: perHeight,\n duration,\n }\n}\n","import type { TagIconAnimationConfig } from '../../../typings/tag/Utils'\n\n// 样式管理器,用于复用相同的动画样式\nclass AnimationStyleManager {\n private static instance: AnimationStyleManager\n private styleRefs: Map<string, { element: HTMLStyleElement; count: number }> = new Map()\n\n // 基于配置生成唯一的样式键\n private generateStyleKey(config: TagIconAnimationConfig, elementIndex: number): string {\n const { duration, timing, loop, loopInterval = 0 } = config\n const elementConfig = config.elements[elementIndex]\n const { properties } = elementConfig\n\n const keyParts = [duration, timing, loop, loopInterval, JSON.stringify(properties)]\n\n return `svg-anim-${keyParts\n .join('-')\n .replace(/[^a-zA-Z0-9-]/g, '')\n .toLowerCase()}`\n }\n\n // 多段插值,支持数组长度大于2\n private interpolateMulti(values: number[], progress: number): number {\n if (values.length === 2) {\n return this.interpolate(values[0], values[1], progress)\n }\n if (values.length < 2) return values[0] ?? 0\n const seg = values.length - 1\n const segProgress = progress * seg\n const segIndex = Math.floor(segProgress)\n const localProgress = segProgress - segIndex\n if (segIndex >= seg) return values[seg]\n return this.interpolate(values[segIndex], values[segIndex + 1], localProgress)\n }\n\n // 生成变换字符串,支持多段\n private generateTransformMulti(properties: any, progress: number): string {\n const transforms: string[] = []\n if (properties.scale) {\n const value = this.interpolateMulti(properties.scale, progress)\n transforms.push(`scale(${value})`)\n }\n if (properties.translateX) {\n const value = this.interpolateMulti(properties.translateX, progress)\n transforms.push(`translateX(${value}px)`)\n }\n if (properties.translateY) {\n const value = this.interpolateMulti(properties.translateY, progress)\n transforms.push(`translateY(${value}px)`)\n }\n if (properties.rotate) {\n const value = this.interpolateMulti(properties.rotate, progress)\n transforms.push(`rotate(${value}deg)`)\n }\n return transforms.join(' ')\n }\n\n // 线性插值\n private interpolate(start: number, end: number, progress: number): number {\n return start + (end - start) * progress\n }\n\n\n public static getInstance() {\n if (!AnimationStyleManager.instance) {\n AnimationStyleManager.instance = new AnimationStyleManager()\n }\n return AnimationStyleManager.instance\n }\n\n // 获取或创建样式(重写关键帧生成,支持多段)\n\n public getOrCreateStyle(config: TagIconAnimationConfig, elementIndex: number): string {\n const styleKey = this.generateStyleKey(config, elementIndex)\n if (this.styleRefs.has(styleKey)) {\n const ref = this.styleRefs.get(styleKey)!\n ref.count++\n return styleKey\n }\n const { duration, timing = 'linear', loop, loopInterval = 0 } = config\n const elementConfig = config.elements[elementIndex]\n const { properties } = elementConfig\n const keyframeName = `${styleKey}-keyframe`\n // 关键帧百分比数组\n let steps = 2\n // 检查所有属性的最大长度\n const propArrays = [properties.translateX, properties.translateY, properties.scale, properties.rotate, properties.opacity].filter(\n (arr) => Array.isArray(arr) && arr.length > 0,\n )\n if (propArrays.length > 0) {\n steps = Math.max(...propArrays.map((arr) => (arr as number[]).length))\n }\n // 计算循环间隔\n const totalDuration = loop && loopInterval > 0 ? duration + loopInterval : duration\n // 活动动画的时间占比(其余为静止,形成 loopInterval 停顿)\n const activePercent = Math.max(0, Math.min(100, (duration / totalDuration) * 100))\n // 生成每个关键帧:在 activePercent 之前完成插值\n let keyframeContent = `@keyframes ${keyframeName} {\\n`\n for (let i = 0; i < steps; i++) {\n const localProgress = i / (steps - 1)\n const percent = localProgress * activePercent\n const transform = this.generateTransformMulti(properties, localProgress)\n let opacityStr = ''\n if (properties.opacity) {\n const opacity = this.interpolateMulti(properties.opacity, localProgress)\n opacityStr = ` opacity: ${opacity};`\n }\n keyframeContent += ` ${percent}% {\\n${transform ? ` transform: ${transform};\\n` : ''}${opacityStr}\\n }\\n`\n }\n // 100% 维持终态,覆盖 activePercent..100% 的静止阶段\n const finalTransform = this.generateTransformMulti(properties, 1)\n let finalOpacityStr = ''\n if (properties.opacity) {\n const finalOpacity = this.interpolateMulti(properties.opacity, 1)\n finalOpacityStr = ` opacity: ${finalOpacity};`\n }\n keyframeContent += ` 100% {\\n${finalTransform ? ` transform: ${finalTransform};\\n` : ''}${finalOpacityStr}\\n }\\n`\n keyframeContent += `}\\n`\n // 生成动画类\n const hasScale = !!properties.scale\n keyframeContent += `.${styleKey} {\\n animation: ${keyframeName} ${totalDuration}ms ${timing} ${loop ? 'infinite' : '1'};\\n${\n hasScale ? ' transform-origin: 50% 50%;\\n transform-box: fill-box;' : ''\n }\\n}`\n const styleElement = document.createElement('style')\n styleElement.id = styleKey\n styleElement.textContent = keyframeContent\n document.head.appendChild(styleElement)\n this.styleRefs.set(styleKey, { element: styleElement, count: 1 })\n return styleKey\n }\n\n // 释放样式引用\n\n public releaseStyle(styleKey: string) {\n const ref = this.styleRefs.get(styleKey)\n if (!ref) return\n\n ref.count--\n if (ref.count <= 0) {\n // 没有元素使用此样式,移除它\n ref.element.remove()\n this.styleRefs.delete(styleKey)\n }\n }\n}\n\n/**\n * 应用 SVG 动画配置\n */\nexport function applySvgAnimation(svgElement: SVGSVGElement, config: TagIconAnimationConfig) {\n if (!svgElement || !config) return\n\n const styleManager = AnimationStyleManager.getInstance()\n const { elements } = config\n\n elements.forEach((elementConfig, index) => {\n const { selector } = elementConfig\n const targetElements = selector ? svgElement.querySelectorAll(selector) : [svgElement]\n\n targetElements.forEach((element) => {\n const htmlElement = element as HTMLElement\n const styleKey = styleManager.getOrCreateStyle(config, index)\n\n // 应用动画类\n htmlElement.classList.add(styleKey)\n\n htmlElement.setAttribute('data-style-key', styleKey)\n })\n })\n}\n\n/**\n * 清除 SVG 动画\n */\nexport function clearSvgAnimation(svgElement: SVGSVGElement) {\n if (!svgElement) return\n\n const styleManager = AnimationStyleManager.getInstance()\n const nodeList = svgElement.querySelectorAll('*')\n const allElements: Element[] = [svgElement, ...Array.from(nodeList)]\n\n allElements.forEach((element) => {\n const htmlElement = element as HTMLElement\n\n // 获取样式键并释放引用\n const styleKey = htmlElement.getAttribute('data-style-key')\n if (styleKey) {\n // 清除动画类\n htmlElement.classList.remove(styleKey)\n styleManager.releaseStyle(styleKey)\n htmlElement.removeAttribute('data-style-key')\n }\n\n // 清除内联样式\n htmlElement.style.animation = ''\n htmlElement.style.transform = ''\n htmlElement.style.opacity = ''\n })\n}\n","<script lang=\"ts\">\n import { createEventDispatcher, onMount, onDestroy, tick } from 'svelte'\n import type { TagIconUrl } from '../../../typings'\n import { noTypecheck } from '../../../utils'\n import { getImageInfo, getKeyframeInfo } from '../../../utils/getImageInfo'\n import px2rem from '../../../utils/px2rem'\n import Shadow from '../Shadow.svelte'\n import { applySvgAnimation, clearSvgAnimation } from './animationUtils'\n\n export let width: number | undefined | null = null\n export let icon: TagIconUrl | undefined | null = null\n export let shadow = false\n\n $: iconUrl = icon?.url\n $: bgcolor = icon?.bgcolor\n $: bgopacity = icon?.bgopacity ?? 0.6\n $: iconSteps = icon?.steps ?? 1\n $: iconFps = icon?.fps\n $: iconRatio = icon?.ratio\n $: iconScale = icon?.scale ?? 1\n $: iconWidth = icon?.width\n $: iconAnimation = icon?.animation\n $: hasIcon = !!icon\n\n $: isKeyframe = iconSteps > 1 && !iconAnimation\n $: paramsWidth = width\n\n const dispatch = createEventDispatcher<{ iconLoaded: { width: number } }>()\n\n async function getKeyframe(params: TagIconUrl) {\n const result = await getKeyframeInfo(params)\n dispatch('iconLoaded', result)\n return result\n }\n\n async function getImage(params: TagIconUrl) {\n if (typeof paramsWidth === 'number') {\n return { ...params, width: paramsWidth }\n }\n const result = await getImageInfo(params)\n dispatch('iconLoaded', result)\n return result\n }\n\n function finalSize(params: { originWidth: number; originHeight?: number; scale?: number; wantedWidth?: number }) {\n const { originWidth, originHeight, scale = 1, wantedWidth } = params\n const width = (wantedWidth ?? originWidth) * scale\n const height = typeof originHeight === 'number' ? width * (originHeight / originWidth) : undefined\n return { ...params, width, height }\n }\n\n function emitIconLoaded() {\n dispatch('iconLoaded')\n }\n\n onMount(() => {\n emitIconLoaded()\n })\n\n $: emitIconLoaded()\n\n // ========= SVG 动画支持 =========\n let svgContainer: HTMLElement | null = null\n let svgHtml: string | null = null\n let currentSvgEl: SVGSVGElement | null = null\n const svgMarkupCache = new Map<string, Promise<string>>()\n let prevAnimationKey: string | null = null\n\n function isSvgUrl(url: string | undefined | null): boolean {\n if (!url) return false\n try {\n const u = new URL(url)\n return u.pathname.endsWith('.svg')\n } catch {\n return url.endsWith('.svg')\n }\n }\n\n async function loadSvgMarkup(url: string): Promise<string> {\n const cached = svgMarkupCache.get(url)\n if (cached) return await cached\n const pending = fetch(url, { cache: 'force-cache' }).then((res) => res.text())\n svgMarkupCache.set(url, pending)\n try {\n return await pending\n } catch (err) {\n svgMarkupCache.delete(url)\n throw err\n }\n }\n\n async function mountSvgAnimation() {\n if (!iconAnimation) return\n if (!svgContainer) {\n await tick()\n if (!svgContainer) return\n }\n // 仅对 svg 资源进行内联与动画\n if (!isSvgUrl(iconUrl)) return\n\n // 重新应用前,清理旧动画与引用\n if (currentSvgEl) {\n clearSvgAnimation(currentSvgEl)\n currentSvgEl = null\n }\n\n // 加载与注入\n if (iconUrl) {\n svgHtml = await loadSvgMarkup(iconUrl)\n await tick()\n }\n const el = svgContainer.querySelector<SVGSVGElement>('svg')\n if (!el) return\n currentSvgEl = el\n applySvgAnimation(currentSvgEl, iconAnimation)\n }\n\n // 当动画配置或 url 变化时,基于稳定 key 触发挂载,避免仅引用变化造成的重复触发\n $: {\n const nextKey = iconAnimation && isSvgUrl(iconUrl) ? iconUrl : null\n if (nextKey && nextKey !== prevAnimationKey) {\n prevAnimationKey = nextKey\n void mountSvgAnimation()\n }\n }\n\n // 当容器绑定完成后,如果存在待应用的动画且尚未挂载,补一次挂载\n $: if (prevAnimationKey && svgContainer && iconAnimation && isSvgUrl(iconUrl) && !currentSvgEl) {\n void mountSvgAnimation()\n }\n\n $: if (!iconAnimation || !isSvgUrl(iconUrl)) {\n if (currentSvgEl) {\n clearSvgAnimation(currentSvgEl)\n currentSvgEl = null\n }\n if (svgHtml !== null) {\n svgHtml = null\n }\n // 重置 key,确保后续真正变化时可触发\n if (prevAnimationKey !== null) {\n prevAnimationKey = null\n }\n }\n\n onDestroy(() => {\n if (currentSvgEl) clearSvgAnimation(currentSvgEl)\n })\n</script>\n\n{#if hasIcon}\n <div class=\"icon\" style:width>\n {#if shadow}\n <Shadow center blurRadius={24} spreadRadius={16} />\n {/if}\n {#if isKeyframe}\n {#await getKeyframe(noTypecheck( { url: iconUrl, steps: iconSteps, fps: iconFps, ratio: iconRatio }, )) then { width, height, steps, duration }}\n <div\n class=\"icon-keyframe\"\n style:width={px2rem(finalSize({ originWidth: width, originHeight: height, scale: iconScale, wantedWidth: iconWidth }).width)}\n style:height={px2rem(finalSize({ originWidth: width, originHeight: height, scale: iconScale, wantedWidth: iconWidth }).height)}\n style:background-image=\"url({iconUrl})\"\n style:animation-duration={duration}\n style:animation-timing-function=\"steps({steps - 1})\"\n ></div>\n {/await}\n {:else if iconAnimation}\n {#await getImage(noTypecheck({ url: iconUrl, ratio: iconRatio })) then { width }}\n {#if bgcolor}\n <div class=\"icon-bg\">\n <div class=\"icon-bg-circle\">\n <div class=\"icon-bg-circle-inner\" style:background={bgcolor} style:opacity={bgopacity}></div>\n <div class=\"icon-bg-circle-inner-shadow\"></div>\n </div>\n </div>\n {/if}\n <div\n class=\"icon-svg\"\n bind:this={svgContainer}\n style:width={px2rem(finalSize({ originWidth: width, scale: iconScale, wantedWidth: iconWidth }).width)}\n >\n {#if isSvgUrl(iconUrl)}\n {@html svgHtml}\n {:else}\n <!-- 非 svg 资源降级为 img(若使用选择器将无法作用到内部) -->\n <img\n alt=\"tag-icon\"\n class=\"icon-image\"\n src={iconUrl}\n style:width=\"100%\"\n style:max-width=\"initial\"\n />\n {/if}\n </div>\n {/await}\n {:else}\n {#await getImage(noTypecheck({ url: iconUrl, ratio: iconRatio })) then { width }}\n {#if bgcolor}\n <div class=\"icon-bg\">\n <div class=\"icon-bg-circle\">\n <div class=\"icon-bg-circle-inner\" style:background={bgcolor} style:opacity={bgopacity}></div>\n <div class=\"icon-bg-circle-inner-shadow\"></div>\n </div>\n </div>\n {/if}\n <img\n alt=\"tag-icon\"\n class=\"icon-image\"\n src={iconUrl}\n style:width={px2rem(finalSize({ originWidth: width, scale: iconScale, wantedWidth: iconWidth }).width)}\n style:max-width=\"initial\"\n />\n {/await}\n {/if}\n </div>\n{/if}\n\n<style>\n @keyframes sprites-animation {\n 0% {\n background-position: 0 0;\n }\n 100% {\n background-position: 100% 0;\n }\n }\n\n .icon-bg {\n position: absolute;\n width: 141%; /* 根号2 */\n height: 141%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n overflow: hidden;\n }\n\n .icon-bg-circle {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .icon-bg-circle-inner {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .icon-bg-circle-inner-shadow {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: radial-gradient(circle at center, transparent 20%, rgba(255,255,255,0.3));\n }\n\n .icon-bg-circle::before {\n content: \"\";\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: 50%;\n /* background: linear-gradient(-45deg, rgba(255,255,255,1), rgba(255,255,255,0.2), rgba(255,255,255,1)); */\n z-index: 1;\n /* mask: radial-gradient(circle at center,\n transparent 65%,\n black 0%);\n -webkit-mask: radial-gradient(circle at center,\n transparent 65%,\n black 0%); */\n border: 1px solid rgba(255,255,255,0.6);\n }\n\n .icon-image {\n position: relative;\n display: block;\n width: auto;\n }\n\n .icon-keyframe {\n background-repeat: no-repeat;\n background-size: auto 100%;\n animation-direction: normal;\n animation-iteration-count: infinite;\n animation-name: sprites-animation;\n animation-delay: 0;\n }\n\n .icon-svg {\n position: relative;\n display: block;\n font-size: 0;\n }\n .icon-svg svg {\n display: block;\n width: 100%;\n height: auto;\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../typings'\n import Shadow from '../Common/Shadow.svelte'\n import Icon from '../Common/Icon/Icon.svelte'\n import px2rem from '../../utils/px2rem'\n\n export let tag: TagInstance<'Link'>\n\n $: iconLoaded = false\n\n $: title = tag.data.title\n\n $: icon = tag.data.icon ?? tag.style?.point\n\n $: width = tag.style?.point?.width\n\n $: scale = tag.style?.point?.scale ?? 1\n\n $: bgcolor = icon?.bgcolor\n\n const TEXT_PADDING = 4;\n\n /**\n * 新版的标签 icon 一定会有 width, 通过 width 计算 text 的 top\n *\n * 这段逻辑比较绕,原因是:\n * 浩正在开发 bgcolor 的时候 bgcolor 的区域是中间图标的 1.414 倍,导致与下方文字的距离无法控制\n * 所以通过 width 计算 text 的 top,来控制文字与图标的距离\n */\n $: textTop = bgcolor && width && typeof width === 'number' ? px2rem((width * 0.414 * scale) / 2 + TEXT_PADDING) : 0\n\n</script>\n\n<div class=\"wrapper\">\n <Icon\n {icon}\n shadow\n on:iconLoaded={() => {\n iconLoaded = true\n }}\n />\n {#if title && iconLoaded}\n <div class=\"text-wrapper\">\n <Shadow outDelay={0} inDelay={0} center width=\"80%\" blurRadius={40} spreadRadius={16} opacity={0.08} />\n <div class=\"text\" style:top={textTop}>\n {title}\n </div>\n </div>\n {/if}\n</div>\n\n<style>\n .wrapper {\n font-weight: 600;\n cursor: pointer;\n width: max-content;\n height: max-content;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n pointer-events: auto;\n }\n .text-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .text {\n position: absolute;\n top: 0;\n font-size: 14px;\n color: #ffffff;\n letter-spacing: 0;\n text-align: center;\n max-width: 140px;\n width: max-content;\n line-height: 18px;\n text-shadow: 2px 0px 8px rgba(0, 0, 0, 0.15);\n }\n\n</style>\n","<script lang=\"ts\">\n import { createEventDispatcher, onMount } from 'svelte'\n import type { TagIconUrl } from '../../../typings'\n import Shadow from '../Shadow.svelte'\n\n export let width: number | undefined | null = null\n export let icon: TagIconUrl | undefined | null = null\n export let shadow = false\n\n $: bgcolor = icon?.bgcolor\n $: bgopacity = icon?.bgopacity ?? 0.6\n $: iconScale = icon?.scale ?? 1\n $: iconWidth = icon?.width\n\n\n function finalSize(params: { originWidth: number; originHeight?: number; scale?: number; wantedWidth?: number }) {\n const { originWidth, originHeight, scale = 1, wantedWidth } = params\n const width = (wantedWidth ?? originWidth) * scale\n const height = typeof originHeight === 'number' ? width * (originHeight / originWidth) : undefined\n return { ...params, width, height }\n }\n\n $: finalWidth = finalSize({ originWidth: 24, originHeight: 24, scale: iconScale, wantedWidth: iconWidth }).width\n</script>\n\n<div class=\"icon\" style:width>\n {#if shadow}\n <Shadow center blurRadius={24} spreadRadius={16} />\n {/if}\n {#if bgcolor}\n <div class=\"icon-bg\">\n <div class=\"icon-bg-circle\">\n <div class=\"icon-bg-circle-inner\" style:background={bgcolor} style:opacity={bgopacity}></div>\n <div class=\"icon-bg-circle-inner-shadow\"></div>\n </div>\n </div>\n {/if}\n <svg height={finalWidth} width={finalWidth} viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><linearGradient id=\"a\" x1=\"78.74567%\" x2=\"5.663764%\" y1=\"94.075617%\" y2=\"5.924383%\"><stop offset=\"0\" stop-color=\"#fff\"/><stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\".7\"/></linearGradient><linearGradient id=\"b\" x1=\"16.588502%\" x2=\"68.285986%\" y1=\"5.924383%\" y2=\"63.800896%\"><stop offset=\"0\" stop-color=\"#fff\"/><stop offset=\"1\" stop-color=\"#fff\" stop-opacity=\"0\"/></linearGradient><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(3 3.1)\"><path d=\"m18 5.4v8c0 1.9329966-4.0294373 3.5-9 3.5-4.97056275 0-9-1.5670034-9-3.5v-8c0 1.93299662 4.02943725 3.5 9 3.5 4.8670094 0 8.8316983-1.50239169 8.9947813-3.37967512zm-13.0396582-.5c.259 0 .504-.063.728-.196.441-.259.721-.728.721-1.26 0-.441-.189-.833-.504-1.085.259-.259.434-.63.434-1.022 0-.245-.063-.476-.182-.679-.252-.413-.693-.658-1.197-.658-.238 0-.462.056-.665.175-.42.238-.679.665-.679 1.162v.035h.721v-.035c0-.315.294-.616.623-.616.357 0 .651.287.651.616 0 .371-.287.658-.651.658h-.14v.728h.14c.399 0 .728.322.728.721s-.329.735-.728.735-.728-.336-.728-.735v-.105h-.728v.105c0 .266.063.511.196.728.259.448.728.728 1.26.728zm3.647 0c.273 0 .518-.07.749-.203.448-.273.742-.763.742-1.302 0-.273-.07-.518-.203-.749-.273-.448-.749-.742-1.288-.742-.077 0-.133 0-.168.007l.875-1.911h-.805l-1.274 2.793c-.091.189-.133.392-.133.602 0 .273.07.525.203.756.273.455.749.749 1.302.749zm0-.742c-.427 0-.763-.336-.763-.763 0-.42.343-.77.763-.77s.77.35.77.77-.35.763-.77.763zm3.654.749c.504 0 .952-.273 1.204-.7.126-.21.189-.441.189-.693v-2.086c0-.511-.273-.98-.693-1.239-.217-.126-.448-.189-.7-.189-.511 0-.98.273-1.232.714-.133.217-.196.455-.196.714v2.086c0 .504.273.952.714 1.204.217.126.455.189.714.189zm0-.721c-.371 0-.693-.301-.693-.672v-2.086c0-.399.308-.693.693-.693.371 0 .651.294.651.693v2.086c0 .385-.28.672-.651.672zm3.2140391-2.11266016c.2734375 0 .5132649-.09855143.7194824-.29565429.2062174-.19710287.3093262-.44376628.3093262-.73999024 0-.28710937-.0991211-.53035481-.2973633-.72973633-.1982422-.19938151-.4420573-.29907226-.7314453-.29907226-.2825521 0-.5257976.10026042-.7297364.30078125s-.3059082.44661458-.3059082.73828125c0 .2734375.0968425.51269531.2905274.71777344.1936849.20507812.4420573.30761718.7451172.30761718zm0-.37255859c-.1822917 0-.3383789-.06494141-.4682618-.19482422-.1298828-.12988281-.1948242-.28369141-.1948242-.46142578 0-.18457031.0655111-.34122721.1965332-.4699707.1310222-.12874349.2865397-.19311524.4665528-.19311524.180013 0 .3343912.06494141.4631347.19482422s.1931153.28369141.1931153.46142578c0 .18457031-.0655111.34122722-.1965332.46997071-.1310222.12874349-.2842611.19311523-.4597168.19311523z\" fill=\"url(#a)\" fill-rule=\"nonzero\"/><path d=\"m18 5.4v8c0 1.9329966-4.0294373 3.5-9 3.5-4.97056275 0-9-1.5670034-9-3.5v-8c0 1.93299662 4.02943725 3.5 9 3.5 4.8670094 0 8.8316983-1.50239169 8.9947813-3.37967512zm-.537 1.917-.0556083.04651904c-1.6129673 1.27557869-4.7855335 2.07278608-8.4073917 2.07278608-3.5667171 0-6.69228643-.77164105-8.32741897-2.0099189l-.13658103-.10838622.00030512 6.082c0 1.4658868 3.60570734 2.8999734 8.15878222 2.9616322l.30491266.0020627c4.6959533 0 8.4636949-1.4652329 8.4636949-2.9636949zm-5.2016582-7.317c.252 0 .483.063.7.189.42.259.693.728.693 1.239v2.086l-.00756.14868c-.02016.19488-.08064.37632-.18144.54432-.252.427-.7.7-1.204.7-.259 0-.497-.063-.714-.189-.441-.252-.714-.7-.714-1.204v-2.086l.007616-.15288c.020384-.20048.081984-.38752.188384-.56112.252-.441.721-.714 1.232-.714zm-7.301 0c.504 0 .945.245 1.197.658.119.203.182.434.182.679 0 .392-.175.763-.434 1.022.315.252.504.644.504 1.085 0 .532-.28 1.001-.721 1.26-.224.133-.469.196-.728.196-.532 0-1.001-.28-1.26-.728-.133-.217-.196-.462-.196-.728v-.105h.728v.105c0 .399.329.735.728.735s.728-.336.728-.735-.329-.721-.728-.721h-.14v-.728h.14c.364 0 .651-.287.651-.658 0-.329-.294-.616-.651-.616-.329 0-.623.301-.623.616v.035h-.721v-.035c0-.497.259-.924.679-1.162.203-.119.427-.175.665-.175zm4.354 0-.875 1.911c.035-.007.091-.007.168-.007.539 0 1.015.294 1.288.742.133.231.203.476.203.749 0 .539-.294 1.029-.742 1.302-.231.133-.476.203-.749.203-.553 0-1.029-.294-1.302-.749-.133-.231-.203-.483-.203-.756 0-.21.042-.413.133-.602l1.274-2.793zm2.947.735c-.385 0-.693.294-.693.693v2.086l.0077784.09927273c.051172.32396694.3479489.57272727.6852216.57272727.371 0 .651-.287.651-.672v-2.086l-.0068002-.10607288c-.044861-.34395191-.3069271-.58692712-.6441998-.58692712zm-3.654 1.89c-.42 0-.763.35-.763.77 0 .427.336.763.763.763.42 0 .77-.343.77-.763s-.35-.77-.77-.77zm6.8680391-2.61611328c.289388 0 .5332031.09969075.7314453.29907226.1982422.19938152.2973633.44262696.2973633.72973633 0 .29622396-.1031088.54288737-.3093262.73999024-.2062175.19710286-.4460449.29565429-.7194824.29565429-.3030599 0-.5514323-.10253906-.7451172-.30761718-.1936849-.20507813-.2905274-.44433594-.2905274-.71777344 0-.29166667.1019694-.53776042.3059082-.73828125s.4471843-.30078125.7297364-.30078125zm0 .37255859c-.1800131 0-.3355306.06437175-.4665528.19311524-.1310221.12874349-.1965332.28540039-.1965332.4699707 0 .17773437.0649414.33154297.1948242.46142578.1298829.12988281.2859701.19482422.4682618.19482422.1754557 0 .3286946-.06437174.4597168-.19311523.1310221-.12874349.1965332-.2854004.1965332-.46997071 0-.17773437-.0643718-.33154297-.1931153-.46142578s-.2831217-.19482422-.4631347-.19482422z\" fill=\"url(#b)\" fill-rule=\"nonzero\"/><path d=\"m3.00030998 2.79110119v5.21779762c-1.84142801-.64087734-3.00030998-1.57225753-3.00030998-2.60889881s1.15888197-1.96802147 3.00030998-2.60889881zm12.00038752.00035068c1.8408432.64086639 2.9993025 1.57209591 2.9993025 2.60854813s-1.1584593 1.96768174-2.9993025 2.60854813z\" fill=\"#d8d8d8\" opacity=\".6\"/></g></svg>\n</div>\n\n\n<style>\n .icon {\n font-size: 0;\n }\n .icon-bg {\n position: absolute; \n width: 141%; /* 根号2 */\n height: 141%;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border-radius: 50%;\n overflow: hidden;\n z-index: -1;\n }\n\n .icon-bg-circle {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .icon-bg-circle-inner {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n .icon-bg-circle-inner-shadow {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: radial-gradient(circle at center, transparent 20%, rgba(255,255,255,0.3));\n }\n \n .icon-bg-circle::before {\n content: \"\";\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: 50%;\n background: linear-gradient(-45deg, rgba(255,255,255,1), rgba(255,255,255,0.2), rgba(255,255,255,1));\n z-index: 1;\n mask: radial-gradient(circle at center, \n transparent 65%, \n black 0%);\n -webkit-mask: radial-gradient(circle at center, \n transparent 65%, \n black 0%);\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance } from '../../typings'\n import PanoramaIcon from '../Common/Icon/PanoramaIcon.svelte'\n\n export let tag: TagInstance<'Panorama'>\n\n $: icon = tag.data.icon ?? tag.style?.point\n</script>\n\n<div class=\"wrapper\">\n <PanoramaIcon\n {icon}\n shadow\n />\n</div>\n\n<style>\n .wrapper {\n font-weight: 600;\n cursor: pointer;\n width: max-content;\n height: max-content;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n pointer-events: auto;\n }\n</style>\n","<script lang=\"ts\">\n import { onDestroy, onMount } from 'svelte'\n import type { TagInstance, TagRendererMap } from '../../typings'\n\n export let tag: TagInstance\n export let rendererMap: TagRendererMap = new Map()\n\n let content: HTMLElement | undefined\n let renderer = tag.element ?? rendererMap.get(tag.contentType)?.renderer\n $: unfolded = tag.state.unfolded\n let destroyTemplate: () => void | undefined\n\n onMount(() => {\n if (content) {\n if (renderer instanceof Element) {\n content.appendChild(renderer)\n destroyTemplate = () => {\n if (renderer instanceof Element) renderer.remove()\n }\n } else if (typeof renderer === 'function') {\n destroyTemplate = renderer(content, tag)\n }\n }\n })\n\n onDestroy(() => {\n destroyTemplate?.()\n })\n</script>\n\n<div class=\"customElement__container\" class:unfolded bind:this={content}>\n {#if typeof renderer === 'string'}\n {@html renderer}\n {/if}\n</div>\n\n<style>\n .customElement__container {\n position: relative;\n }\n</style>\n","<script lang=\"ts\">\n import type { TagInstance, TagHooks, State, TemporaryState, MediaStore, TagRendererMap, TagContentTypeMapping } from '../../typings'\n import TextTag from './TextTag/index.svelte'\n import ImageTextTag from './ImageTextTag.svelte'\n import MarketingTag from './MarketingTag.svelte'\n import { noTypecheck } from '../../utils'\n import { setContext } from 'svelte'\n import AudioTag from './AudioTag/index.svelte'\n import MediaPlane from './MediaPlane.svelte'\n import LinkTag from './LinkTag.svelte'\n import PanoramaTag from './PanoramaTag.svelte'\n import CustomTag from './CustomTag.svelte'\n import classNames from 'classnames'\n import { ModelTag } from '../../controller/Tag/ModelTag'\n import { isModelLike } from '../../../shared-utils'\n\n export let tag: TagInstance\n export let hooks: TagHooks\n export let rendererMap: TagRendererMap = new Map()\n export let contentTypeMap: TagContentTypeMapping = new Map()\n export let state: State\n export let mediaStore: MediaStore\n export let temporaryState: TemporaryState\n\n $: unfolded = tag.state?.unfolded\n $: visible = tag.state?.visible\n $: isVisible = state.visible && temporaryState.visible && tag.state?.visible\n $: tagId = tag.id\n $: isHide = !getTagVisible(tag, state, temporaryState)\n\n setContext('hooks', hooks)\n setContext('mediaStore', mediaStore)\n\n let lastVisibleState: boolean | undefined\n let lastUnfoldedState: boolean | undefined\n\n function exposureEmit(isVisible?: boolean) {\n if (isVisible) hooks.emit('exposure', { id: tagId, type: 'start' })\n else hooks.emit('exposure', { id: tagId, type: 'end' })\n }\n\n $: exposureEmit(isVisible)\n\n $: {\n if (tag.hooks) {\n if (unfolded !== undefined && unfolded !== lastUnfoldedState) {\n lastUnfoldedState = unfolded\n if (unfolded) tag.hooks.emit?.('unfolded')\n else tag?.hooks.emit?.('folded')\n }\n if (visible !== undefined && visible !== lastVisibleState) {\n lastVisibleState = visible\n if (visible) tag.hooks.emit?.('show')\n else tag.hooks.emit?.('hide')\n }\n }\n }\n\n $: haveContent = (() => {\n if (typeof tag.config.unfoldedConfig === 'object' && tag.config.unfoldedConfig.keep === 'folded') return false\n return true\n })()\n\n function getTagVisible(tag: TagInstance, state: State, temporaryState: TemporaryState) {\n if (!tag.enabled) return false\n if (!state.visible) return false\n if (!state.enabled) return false\n if (!temporaryState.visible) return false\n if (!tag.state?.visible) return false\n if (tag.temporaryState?.visible === false) return false\n if (tag instanceof ModelTag && tag.loading) return false\n return true\n }\n\n</script>\n\n{#if tag.element || rendererMap.has(tag.contentType)}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n bind:this={tag.contentDom}\n class={classNames('content__container', tag.className)}\n class:custom-tag-disable={tag.enabled === false}\n class:custom-tag-hide={isHide}\n data-id={tag.id}\n on:click={(event) => hooks.emit('click', { event, target: 'TagContent', tag })}\n >\n <CustomTag tag={noTypecheck(tag)} {rendererMap} />\n </div>\n{:else if haveContent}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n bind:this={tag.contentDom}\n class={classNames('content__container', tag.className)}\n class:disable={tag.enabled === false}\n class:hide={isHide}\n class:unClickable={tag.config.clickable === false}\n style:width={tag.stickType === 'Plane' || tag.contentType === 'MediaModel' ? '100%' : 0}\n style:height={tag.stickType === 'Plane' || tag.contentType === 'MediaModel' ? '100%' : 0}\n data-id={tag.id}\n on:click|capture={(event) => {\n if (tag.entryFromModel && isModelLike(tag.five.state.mode)) {\n event.stopPropagation()\n tag.find({ targetMode: 'Panorama' })\n } else {\n hooks.emit('click', { event, target: 'TagContent', tag })\n }\n }}\n >\n <div class=\"content__wrapper\">\n <div class=\"content\" class:unfolded={tag.state?.unfolded}>\n <!-- 文字标签 -->\n {#if ['Text'].includes(tag.contentType) || ['Text'].includes(contentTypeMap.get(tag.contentType))}\n <TextTag tag={noTypecheck(tag)} />\n <!-- 多媒体标签 -->\n {:else if ['ImageText', 'Image', 'Video'].includes(tag.contentType) || ['ImageText', 'Image', 'Video'].includes(contentTypeMap.get(tag.contentType))}\n <ImageTextTag tag={noTypecheck(tag)} />\n <!-- 音频标签 -->\n {:else if ['Audio'].includes(tag.contentType) || ['Audio'].includes(contentTypeMap.get(tag.contentType))}\n <AudioTag tag={noTypecheck(tag)} />\n <!-- 营销标签 -->\n {:else if ['Marketing'].includes(tag.contentType) || ['Marketing'].includes(contentTypeMap.get(tag.contentType))}\n <MarketingTag tag={noTypecheck(tag)} />\n <!-- 链接标签 -->\n {:else if ['Link', 'VRLink', 'PanoLink', 'Sticker'].includes(tag.contentType) || ['Link', 'VRLink', 'PanoLink', 'Sticker'].includes(contentTypeMap.get(tag.contentType))}\n <LinkTag tag={noTypecheck(tag)} />\n <!-- 模型标签 -->\n {:else if ['MediaPlane', 'MediaModel'].includes(tag.contentType) || ['MediaPlane', 'MediaModel'].includes(contentTypeMap.get(tag.contentType))}\n <MediaPlane tag={noTypecheck(tag)} />\n <!-- 全景标签 -->\n {:else if ['Panorama'].includes(tag.contentType) || ['Panorama'].includes(contentTypeMap.get(tag.contentType))}\n <PanoramaTag tag={noTypecheck(tag)} />\n {/if}\n </div>\n </div>\n </div>\n{:else}\n <div data-info=\"tag content is keep folded\" data-id={tag.id} />\n{/if}\n\n<style lang=\"scss\">@font-face {\n font-family: \"TG-TYPE\";\n font-style: normal;\n font-weight: 400;\n /* src: local('TG-TYPE-Bold'), url(//vr-static.realsee-cdn.cn/release/web/TG-TYPE-Bold.769fe64d.otf) format('woff2'); */\n src: local(\"TG-TYPE-Bold\"), url(data:application/font-woff2;charset=utf-8;base64,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) format(\"woff2\");\n}\n:global(*) {\n -webkit-tap-highlight-color: transparent;\n}\n\n.content__container {\n position: relative;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n font-family: PingFangSC, Segoe UI, Rototo, sans-serif;\n transition: opacity 0.2s linear;\n}\n.content__container.unClickable {\n pointer-events: none !important;\n}\n.content__container.unClickable :global(*) {\n pointer-events: none !important;\n}\n\n.content__wrapper {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.content__container.hide {\n opacity: 0;\n pointer-events: none;\n}\n.content__container.hide :global(*) {\n pointer-events: none !important;\n}\n\n.content__container.disable {\n display: none;\n}\n\n.content {\n position: relative;\n width: 100%;\n height: 100%;\n font-size: 0.75rem;\n color: #fff;\n}\n.content:not(.unfolded) {\n pointer-events: none;\n}\n.content:not(.unfolded) :global(*) {\n pointer-events: none !important;\n}\n.content.unfolded {\n pointer-events: auto;\n cursor: pointer;\n}</style>\n","<script lang=\"ts\">\n import type { TagInstance, TagHooks, State, TemporaryState, MediaStore, TagRendererMap, TagContentTypeMapping } from '../../typings'\n import TextTag from './TextTag/index.svelte'\n import ImageTextTag from './ImageTextTag.svelte'\n import MarketingTag from './MarketingTag.svelte'\n import { noTypecheck } from '../../utils'\n import { setContext } from 'svelte'\n import AudioTag from './AudioTag/index.svelte'\n import MediaPlane from './MediaPlane.svelte'\n import LinkTag from './LinkTag.svelte'\n import PanoramaTag from './PanoramaTag.svelte'\n import CustomTag from './CustomTag.svelte'\n import classNames from 'classnames'\n import { ModelTag } from '../../controller/Tag/ModelTag'\n import { isModelLike } from '../../../shared-utils'\n\n export let tag: TagInstance\n export let hooks: TagHooks\n export let rendererMap: TagRendererMap = new Map()\n export let contentTypeMap: TagContentTypeMapping = new Map()\n export let state: State\n export let mediaStore: MediaStore\n export let temporaryState: TemporaryState\n\n $: unfolded = tag.state?.unfolded\n $: visible = tag.state?.visible\n $: isVisible = state.visible && temporaryState.visible && tag.state?.visible\n $: tagId = tag.id\n $: isHide = !getTagVisible(tag, state, temporaryState)\n\n setContext('hooks', hooks)\n setContext('mediaStore', mediaStore)\n\n let lastVisibleState: boolean | undefined\n let lastUnfoldedState: boolean | undefined\n\n function exposureEmit(isVisible?: boolean) {\n if (isVisible) hooks.emit('exposure', { id: tagId, type: 'start' })\n else hooks.emit('exposure', { id: tagId, type: 'end' })\n }\n\n $: exposureEmit(isVisible)\n\n $: {\n if (tag.hooks) {\n if (unfolded !== undefined && unfolded !== lastUnfoldedState) {\n lastUnfoldedState = unfolded\n if (unfolded) tag.hooks.emit?.('unfolded')\n else tag?.hooks.emit?.('folded')\n }\n if (visible !== undefined && visible !== lastVisibleState) {\n lastVisibleState = visible\n if (visible) tag.hooks.emit?.('show')\n else tag.hooks.emit?.('hide')\n }\n }\n }\n\n $: haveContent = (() => {\n if (typeof tag.config.unfoldedConfig === 'object' && tag.config.unfoldedConfig.keep === 'folded') return false\n return true\n })()\n\n function getTagVisible(tag: TagInstance, state: State, temporaryState: TemporaryState) {\n if (!tag.enabled) return false\n if (!state.visible) return false\n if (!state.enabled) return false\n if (!temporaryState.visible) return false\n if (!tag.state?.visible) return false\n if (tag.temporaryState?.visible === false) return false\n if (tag instanceof ModelTag && tag.loading) return false\n return true\n }\n\n</script>\n\n{#if tag.element || rendererMap.has(tag.contentType)}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n bind:this={tag.contentDom}\n class={classNames('content__container', tag.className)}\n class:custom-tag-disable={tag.enabled === false}\n class:custom-tag-hide={isHide}\n data-id={tag.id}\n on:click={(event) => hooks.emit('click', { event, target: 'TagContent', tag })}\n >\n <CustomTag tag={noTypecheck(tag)} {rendererMap} />\n </div>\n{:else if haveContent}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n bind:this={tag.contentDom}\n class={classNames('content__container', tag.className)}\n class:disable={tag.enabled === false}\n class:hide={isHide}\n class:unClickable={tag.config.clickable === false}\n style:width={tag.stickType === 'Plane' || tag.contentType === 'MediaModel' ? '100%' : 0}\n style:height={tag.stickType === 'Plane' || tag.contentType === 'MediaModel' ? '100%' : 0}\n data-id={tag.id}\n on:click|capture={(event) => {\n if (tag.entryFromModel && isModelLike(tag.five.state.mode)) {\n event.stopPropagation()\n tag.find({ targetMode: 'Panorama' })\n } else {\n hooks.emit('click', { event, target: 'TagContent', tag })\n }\n }}\n >\n <div class=\"content__wrapper\">\n <div class=\"content\" class:unfolded={tag.state?.unfolded}>\n <!-- 文字标签 -->\n {#if ['Text'].includes(tag.contentType) || ['Text'].includes(contentTypeMap.get(tag.contentType))}\n <TextTag tag={noTypecheck(tag)} />\n <!-- 多媒体标签 -->\n {:else if ['ImageText', 'Image', 'Video'].includes(tag.contentType) || ['ImageText', 'Image', 'Video'].includes(contentTypeMap.get(tag.contentType))}\n <ImageTextTag tag={noTypecheck(tag)} />\n <!-- 音频标签 -->\n {:else if ['Audio'].includes(tag.contentType) || ['Audio'].includes(contentTypeMap.get(tag.contentType))}\n <AudioTag tag={noTypecheck(tag)} />\n <!-- 营销标签 -->\n {:else if ['Marketing'].includes(tag.contentType) || ['Marketing'].includes(contentTypeMap.get(tag.contentType))}\n <MarketingTag tag={noTypecheck(tag)} />\n <!-- 链接标签 -->\n {:else if ['Link', 'VRLink', 'PanoLink', 'Sticker'].includes(tag.contentType) || ['Link', 'VRLink', 'PanoLink', 'Sticker'].includes(contentTypeMap.get(tag.contentType))}\n <LinkTag tag={noTypecheck(tag)} />\n <!-- 模型标签 -->\n {:else if ['MediaPlane', 'MediaModel'].includes(tag.contentType) || ['MediaPlane', 'MediaModel'].includes(contentTypeMap.get(tag.contentType))}\n <MediaPlane tag={noTypecheck(tag)} />\n <!-- 全景标签 -->\n {:else if ['Panorama'].includes(tag.contentType) || ['Panorama'].includes(contentTypeMap.get(tag.contentType))}\n <PanoramaTag tag={noTypecheck(tag)} />\n {/if}\n </div>\n </div>\n </div>\n{:else}\n <div data-info=\"tag content is keep folded\" data-id={tag.id} />\n{/if}\n\n<style lang=\"scss\">\n @font-face {\n font-family: 'TG-TYPE';\n font-style: normal;\n font-weight: 400;\n /* src: local('TG-TYPE-Bold'), url(//vr-static.realsee-cdn.cn/release/web/TG-TYPE-Bold.769fe64d.otf) format('woff2'); */\n src: local('TG-TYPE-Bold'),\n url(data:application/font-woff2;charset=utf-8;base64,T1RUTwAKAIAAAwAgQ0ZGINFD4CEAAAaQAAAHC0dTVUIAAQAAAAANnAAAAApPUy8yaB5pEwAAAjQAAABgY21hcEItjGUAAAT0AAABfGhlYWQS1WWOAAAAtAAAADZoaGVhBfMBxwAAAhAAAAAkaG10eJ9gBO8AAADsAAABJG1heHAASVAAAAAArAAAAAZuYW1lqczkZQAAApQAAAJecG9zdP+4ADIAAAZwAAAAIAAAUAAASQAAAAEAAAABAADkeHeyXw889QADA+gAAAAA2NoRKwAAAADY2hErACn/OAHgAyAAAQADAAIAAAAAAAAB9ABdAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACWAAAAlgAAAJYAAACCAA7AcwAdwIIADMCCAA0AhwAMwISADkCCAAuAfQANAH+ACsB/gApAggANAEeAFABHgBQAR4AUAIIADQCCAAuAR4AUAEeAFABfAAxAAEAAAPo/zgAAAIcACkAKQHgAAEAAAAAAAAAAAAAAAAAAABJAAMCLgGQAAUACAKKAlgAAABLAooCWAAAAV4AMgEsAAAAAAgAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFVLV04AIAAg/xsDIP84AMgD6ADIAAAAAQAAAAAB9AK8AAAAIAAAAAAAEADGAAEAAAAAAAEADAAAAAEAAAAAAAIABAAMAAEAAAAAAAMAGwAQAAEAAAAAAAQAEQArAAEAAAAAAAUAPAA8AAEAAAAAAAYAEAB4AAEAAAAAAAgADAAAAAEAAAAAAAkADAAAAAMAAQQJAAEAGACIAAMAAQQJAAIACACgAAMAAQQJAAMANgCoAAMAAQQJAAQAIgDeAAMAAQQJAAUAeAEAAAMAAQQJAAYAIAF4AAMAAQQJAAgAGACIAAMAAQQJAAkAGACIQUxJQkFCQSBGb250Qm9sZDEuMDAwO1VLV047QUxJQkFCQUZvbnQtQm9sZEFMSUJBQkEgRm9udCBCb2xkVmVyc2lvbiAxLjAwMDtQUyAwMDEuMDAwO2hvdGNvbnYgMS4wLjg4O21ha2VvdGYubGliMi41LjY0Nzc1QUxJQkFCQUZvbnQtQm9sZABBAEwASQBCAEEAQgBBACAARgBvAG4AdABCAG8AbABkADEALgAwADAAMAA7AFUASwBXAE4AOwBBAEwASQBCAEEAQgBBAEYAbwBuAHQALQBCAG8AbABkAEEATABJAEIAQQBCAEEAIABGAG8AbgB0ACAAQgBvAGwAZABWAGUAcgBzAGkAbwBuACAAMQAuADAAMAAwADsAUABTACAAMAAwADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADgAOAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADYANAA3ADcANQBBAEwASQBCAEEAQgBBAEYAbwBuAHQALQBCAG8AbABkAAAAAAADAAAAAwAAASIAAQAAAAAAHAADAAEAAAEiAAABBgAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAABCSEMANjc4OTo7PD0+PwAAAAAAAAACAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGwAAAAAAABwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAFoAAAAQABAAAwAAACAALgA5AFoAegCl/xv//wAAACAALAAwAEEAYQCl/xr////hAAAABv/B/7v/nwAAAAEAAAAOAAAAAAAAAAAACgAAAEIASABDAEYARwADAAAAAAAA/7UAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQERQUxJQkFCQUZvbnQtQm9sZAABAQEg+A8A+CAB+CEC+BgEtPtc+HT5tAX3KA/3UBGcHAZWEgAHAQENExoiKTpLbmluZS4wMDEuMDAxbW9uZXkudW5pRkYxQm5pbmUuMDAxdW5pRkYxQWNvcHlyaWdodCBtaXNzaW5nQUxJQkFCQSBGb250IEJvbGQAAAEAAQAAIhkAQhkAEQkBhwABigAADQAADwAAZAABiAABiwABiQAADgAASQIAAQCtAK4ArwCwALEAsgCzALQAtQC2ALcAuAC5ALoAuwC8AL0AvgC/AMAAwQDCAMMAxADFAMYAxwDIAMkAygDLAMwAzQDOAM8A0ADRANIA0wDUANUA1gDXANgA2QDaANsA3ADdAN4A3wDgAOEA4gFDAVoBqwIsAloCuAMcAzkDzwQ4BDoEPARRBFMEVQTNBOIE8QUEmPtc0Ky6rKKsuqzHrKPDoa2irLCspq2vraWssKzOAejVrKytrKzYA/gu+bQV+9H+fPfRBj76ORVqSWbNavs6rM2wSqwH7vsVFUXNafs68wfNaRVqZ6wG704VaklFJ6zNsEmsB/c6TxUn+zqt9xnNB6z7DhX7Bfs69wWsO++6anRpwwfv+0EV+wX7OvcFB/cZahUnXO8GrFMVamsHRVwF8Wr7OqwG0boFRawGDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OrIr5UQH3OPdUA/ebihVmaZSdbB9Mr2TL0xr3vgewlK2eqh7Kr86y1BuvrIJ5qh/HZrJIQhr7vgdngmp5bR5OZ0tkQxv46ARUX2FSH/u+B1a5YMDAs7TCHve+B8RjtVYeDnD4utkB93HzA/cL+QgVPfH8vPP5UgcOrIn5UgG++DYD+GmJFfw28wb3svfUBZ2glKSnGsNduFBWXF1UiB4ijgaMsJWsnqoIyLHMstYbsa6Ceawfy2ezSUAaVndXZ2Me+2/7jQX3pwYOrIvy92Tz90ryEr/zM/L3SvMu8hPy+B/3/xUT7LCwpMDDGq6CrHqoHsZnTK5DG2lrg3puH09pZk5EGobykAe4tba6vrViXFZiYlcedyOfBhPyxLpdUlJcW1JSXLvEH5ojfAdllGiebB5LsM5j1xuwrpSeqx/KsLPO1xrKcMNerx4OwPL1Affi8gP4dPdlFWD4fPshBvuJ/HkF+wH3ryPy87YH+8z1Ffc69+QF++QHDrb3ZNf3ZfAB9zX3YwP3nRZlaJSebB9LsGPO1xrzBlK6XMTEubrEHtcHxF26UlJcXFIeI/g0+BYh+677JAaorK2ZsBuwroJ4qx/LZrNHPxo/B2aCaHhrHktmR2NAGw6si/X3b/IBufX3b/ID95n4QBWAg4uKhh/3EfelBfsHBvtK/CMFfnCFbm0aZJVnnmoeSrLPYdobsq6Vnqwfy7K10dgasoGueKwey2RHtT4b+9YETlu7yMe8vcfHvVlPT1laTx8OmIr5UQG/+B8D93iKFfsIBvdo+OYF+6T2+B8oBg6iifL3bPX3QPEStvNB8vc/8jXxE/L4EvgHFRPss7Cnu78arYOreqgexWpNr0YbaWyDem4fUmlmTUcaXqBftGAeE/JWYmROSxpklWieax5Ksc9i2BuxrpWerB/LsbTP2BrHaMVath4T7PsN93QVu7FjXFtlZltcZbC7urGzuh8T8oX8ghVPW7zHx7q6yMa9W1BPWVpQHw6i96Tz92/0AbTz93DzA/hp+HkVsIGveKwezmNFtUAbZGeBeGofSmNiRT8aZJVnnmseSrHPYtoboAb7EvukBfcHBvdL+CEFmaySqaQa+9gWxry+yJ6dhoGcHq12oWZmGk5YW1BMXLnKHg4gCiEK+11L91IlCvdiyhWtb6hpJgoeJAoOIQogCqz3pe/3b/UBufX3bfQD+G74dxWyga94rB7NZEW0PhtlaIF4ah9KY2FFPxo7tkTPZh6MjIqKjB+TiJCIjYoIjgaCoKGHoRuanY6QoB+IgfsB+6QF9wcG9y/4IgWYppGnqhr7a/sCFVBbvMjHu7zGyLxbTk5aWk4fDvtd+AojCoz7jBUmCh8kCq1vqGkeDvtdi/cS94wjCvwKBCIKDiD3ru8BvPeuA7z4EhUn967vBw4eoDf/DAmLDAv47BT4exWcEwAHAQFBXW97ipCarPcv8+7yAfdl8gP4aPf6FfIjB+r3gwUiBi77gwWHBjH3gwUkBuP7gwUnJPcxKPsxI/cx+y/y9y/3MPP7MO4GDvtdi/cSJQr3JBZkcqOzsKSksrCkcWdlcnFmHw6up6eurm+naGhvb2hop2+uHwv3EiUK9yP4ChUiCgt3SgWxBrnmBZGVj5eZGgsB2/cSAwtobm5paqBzqoYLAAABAAAAAAAAAAAAAA==)\n format('woff2');\n }\n\n :global(*) {\n -webkit-tap-highlight-color: transparent;\n }\n\n .content__container {\n position: relative;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n font-family: PingFangSC, Segoe UI, Rototo, sans-serif;\n transition: opacity 0.2s linear;\n\n &.unClickable {\n pointer-events: none !important;\n }\n &.unClickable :global(*) {\n pointer-events: none !important;\n }\n }\n\n .content__wrapper {\n pointer-events: none;\n width: 100%;\n height: 100%;\n }\n\n .content__container.hide {\n opacity: 0;\n pointer-events: none;\n :global(*) {\n pointer-events: none !important;\n }\n }\n\n .content__container.disable {\n display: none;\n }\n\n .content {\n position: relative;\n width: 100%;\n height: 100%;\n font-size: 12px;\n color: #fff;\n &:not(.unfolded) {\n pointer-events: none;\n }\n &:not(.unfolded) :global(*) {\n pointer-events: none !important;\n }\n &.unfolded {\n pointer-events: auto;\n cursor: pointer;\n }\n }\n\n</style>\n","import type PanoTagPluginController from '..'\nimport type { TagContentType, Tag as TagData, TagGLTFObject, TagInstance } from '../..'\nimport { initialCSS3DRender } from '../../../shared-utils/CSS3DRender'\nimport { CSS3DObjectPlus } from '../../../shared-utils/CSS3DRender/CSS3DObject'\nimport { arrayPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport loadGLTF from '../../../shared-utils/three/GLTFLoader'\nimport { planeNormal } from '../../utils'\nimport { ImagePlane } from '../../utils/model/mediaPlane'\nimport TagContentSvelte from '../../Components/Tag/index.svelte'\nimport { isMediaModelTag } from '../../utils/tag/tagCheck'\nimport { BaseTag } from './BaseTag'\nimport * as THREE from 'three/webgpu'\nimport { CONST } from '../../../shared-utils/constants'\nimport { waitFiveModelLoaded } from '../../../shared-utils'\n\nimport { mountComponent, type MountedComponent } from '../../../shared-utils/svelte/component.svelte'\nexport type ModelTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, 'Model'>\n\nexport class ModelTag<C extends TagContentType = TagContentType> extends BaseTag<C, 'Model'> {\n public loading = false\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n this.state.unfolded = true\n initialCSS3DRender(this.five)\n this.loadModel().then(() => this.updateVisible())\n }\n\n public applyVisible() {\n this.tag3DContentSvelte?.svelteApp.update({\n tag: this,\n state: this.plugin.state,\n temporaryState: this.plugin.temporaryState,\n })\n if (this.model?.object) this.model.object.visible = this.visible\n }\n\n public set(...data: Parameters<InstanceType<typeof BaseTag<C, 'Model'>>['set']>) {\n super.set(...data)\n this.loadModel()\n }\n\n public setData(...data: Parameters<InstanceType<typeof BaseTag<C, 'Model'>>['setData']>) {\n super.setData(...data)\n\n const positions = this.data.mediaPosition.map(arrayPositionToVector3)\n if (this.computeRenderType() === 'Mesh') {\n if (this.mediaPlane && this.mediaPlane.src !== this.data.mediaData[0]!.url) {\n this.mediaPlane.removeFromParent()\n this.mediaPlane = new ImagePlane(this.data.mediaData[0]!.url, positions, { objectFit: this.data.objectFit })\n }\n } else {\n this.tag3DContentSvelte?.svelteApp.update({ tag: this })\n }\n }\n\n /** 加载外部模型 */\n public loadModel = async () => {\n const url = this.data.modelUrl\n if (!url) return\n this.loading = true\n\n await waitFiveModelLoaded(this.five)\n\n if (!this.plugin.tags.includes(this)) return\n\n const loadPromise = loadGLTF(url).then(async (gltf) => {\n const model: TagGLTFObject = Object.assign(gltf.scene, {\n customID: this.id,\n isTagModel: true,\n removeEventListener:\n this.getConfig().clickable === false\n ? () => void 0\n : this.addObjectClickHandler(this, gltf.scene, (event) => {\n this.plugin.hooks.emit('click', { target: 'TagModel', tag: this as any, event })\n }),\n })\n // 还原模型位姿\n const matrix = new THREE.Matrix4().fromArray(this.matrix)\n matrix.decompose(model.position, model.quaternion, model.scale)\n // 更新子元素的 matrix,否则射线检测结果会出问题\n model.updateWorldMatrix(true, true)\n // 模型 visible 跟 tag 保持一致\n model.visible = this.visible\n\n if (this.getConfig().modelConfig?.autoLookAtEnabled) {\n model.lookAt(this.five.camera.position.clone().setY(model.position.y))\n }\n return model\n })\n\n this.model = { promise: loadPromise }\n const object = await loadPromise\n this.loading = false\n\n // 标签在加载的过程中模型可能会被替换,所以需要判断 promise 是否一致\n if (this.model?.promise !== loadPromise) return\n // 异步过程结束后需要判断标签是否被删除\n if (!this.plugin.tags.includes(this)) return\n\n // 更新标签 model 数据\n this.model.object = object\n\n const prevObject = this.plugin.gltfObjectGroup.children.find((obj) => obj.customID === this.id)\n if (prevObject) {\n this.plugin.gltfObjectGroup.remove(prevObject)\n prevObject.removeEventListener()\n }\n\n if (isMediaModelTag(this)) {\n const positions = this.data.mediaPosition.map(arrayPositionToVector3)\n // 添加模型多媒体贴片\n if (this.computeRenderType() === 'Mesh' && !this.mediaPlane) {\n this.mediaPlane = new ImagePlane(this.data.mediaData[0]!.url, positions, { objectFit: this.data.objectFit })\n const center = new THREE.Vector3().addVectors(positions[0], positions[2]).divideScalar(2)\n this.mediaPlane.position.copy(center)\n object.add(this.mediaPlane)\n }\n\n if (this.computeRenderType() !== 'Mesh') {\n this.tag3DContentSvelte?.dispose()\n const container = document.createElement('div')\n container.classList.add('tag-media-container')\n const bgColor = 'black' // 广告牌模型的屏幕一般都是黑的,所以使用相同的背景色\n container.style.backgroundColor = bgColor\n container.style.border = `3px solid ${bgColor}` // 用 border 挡住 mesh 的锯齿\n\n const config = { mode: 'behind', cornerPoints: positions, container, ...this.config.tag3DConfig }\n const mode = this.computeRenderType() === 'BehindDom' || config.mode === 'behind' ? 'behind' : 'front'\n const cssMesh = new CSS3DObjectPlus({ ...config, mode, five: this.five })\n const normal = this.computeNormal()\n // 解决 z-fighting\n cssMesh.position.add(normal.clone().setLength(CONST.Z_FIGHTING_OFFSET))\n\n object.add(cssMesh)\n\n let clickEventDispose: () => void\n if (cssMesh.mode === 'behind' && this.config.clickable !== false) {\n clickEventDispose = this.addObjectClickHandler(this, cssMesh, (e) => {\n this.plugin.hooks.emit('click', { event: e, target: 'TagContent', tag: this })\n })\n }\n\n const svelte = mountComponent(TagContentSvelte, container, {\n tag: this,\n hooks: this.plugin.hooks,\n /** 模型标签要等模型加载好之后再展示 */\n state: this.plugin.state,\n mediaStore: this.plugin.mediaStore,\n temporaryState: this.plugin.temporaryState,\n })\n\n this.tag3DContentSvelte = {\n svelteApp: svelte,\n css3DInstance: cssMesh,\n initialNormal: normal,\n currentNormal: normal,\n dispose: () => {\n svelte.destroy()\n cssMesh.dispose()\n clickEventDispose?.()\n },\n }\n }\n }\n\n this.plugin.gltfObjectGroup.add(object)\n return object\n }\n\n public computeNormal() {\n return planeNormal(this.data.mediaPosition)\n }\n}\n","import { PBMMesh, type Five } from '@realsee/five-webgpu'\nimport * as THREE from 'three/webgpu'\n\nexport const getFloorMesh = (five: Five, floorIndex: number) => {\n const box = new THREE.Box3()\n const model = five.models.find((m) => m.name === five.state.workCode)\n model.traverse((obj: any) => {\n const objFloorIndex = obj?.material?.[0]?.floorIndex\n if (objFloorIndex === floorIndex) {\n box.expandByObject(obj)\n }\n })\n return box\n}\n\n","import type * as THREE from 'three/webgpu'\n\nexport interface AutoPlayIntersectConfig {\n checkPoints?: 'center' | 'corner' | THREE.Vector3[]\n needPassed?: number\n hideWhenModelNotLoaded?: boolean\n startPointMode?: 'observer' | 'horizontal'\n}\n\nexport const autoPlayIntersectConfig: AutoPlayIntersectConfig = {\n startPointMode: 'observer',\n checkPoints: 'corner',\n needPassed: 1,\n // 模型未加载完成时无法证明视线无遮挡,先不自动播放,避免抢占正在播放的媒体。\n hideWhenModelNotLoaded: true,\n}\n\nexport function canAutoPlayByOcclusion(params: {\n currentVisible: boolean\n panoIndex?: number\n computeVisibleByIntersect: (\n panoIndex: number | undefined,\n config: AutoPlayIntersectConfig,\n ) => { value: boolean }\n}) {\n if (!params.currentVisible) return { value: false }\n return params.computeVisibleByIntersect(params.panoIndex, autoPlayIntersectConfig)\n}\n","import type PanoTagPluginController from '..'\nimport type { Tag, TagContentType, Tag as TagData, TagInstance } from '../..'\nimport { CONST } from '../../../shared-utils/constants'\nimport { CSS3DObjectPlus } from '../../../shared-utils/CSS3DRender/CSS3DObject'\nimport { anyPositionToVector3, arrayPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { planeNormal } from '../../utils'\nimport { ImagePlane, VideoPlane } from '../../utils/model/mediaPlane'\nimport TagContentSvelte from '../../Components/Tag/index.svelte'\nimport { BaseTag } from './BaseTag'\nimport { uuid, waitFiveModelLoaded } from '../../../shared-utils'\nimport { initialCSS3DRender } from '../../../shared-utils/CSS3DRender'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { Vector3 } from 'three/webgpu'\nimport { Rectangle } from '../../../Sculpt/Objects/Rectangle'\nimport { getFloorMesh } from '../../../shared-utils/five/getFloorMesh'\nimport { centerPoint } from '../../../shared-utils/three/centerPoint'\nimport * as THREE from 'three/webgpu'\nimport { canAutoPlayByOcclusion } from '../../utils/tag/canAutoPlayByOcclusion'\n\nimport { mountComponent, type MountedComponent } from '../../../shared-utils/svelte/component.svelte'\n\nexport class PlaneTag<C extends TagContentType = TagContentType> extends BaseTag<C, 'Plane'> {\n public declare rectanglePlane?: Rectangle\n\n private _floorIndex?: number\n private _floorIndexDirty = true\n private _opacity?: number\n /**\n * 因不可见被销毁前是否处于播放态。\n * PlaneTag 实例在不可见期间存活(只有 mediaPlane 被销毁),因此状态记在这里。\n */\n private wasPlayingBeforeHidden = false\n private cachedVideoSource?: string\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n this.state.unfolded = true\n this.loadModel()\n }\n\n /** 获取透明度 */\n public get opacity(): number {\n if (this._opacity !== undefined) {\n return this._opacity\n }\n // 从 data 中读取,如果没有则默认为 1\n return (this.data as any)?.opacity ?? 1\n }\n\n /** 设置透明度 (0-1) */\n public set opacity(value: number) {\n if (value !== this._opacity) {\n this._opacity = value\n // 如果 mediaPlane 已创建,同步更新其 opacity\n if (this.mediaPlane) {\n this.mediaPlane.opacity = value\n }\n }\n }\n\n /** 获取楼层索引(惰性计算 + 缓存) */\n public get floorIndex(): number | undefined {\n if (this._floorIndexDirty || this._floorIndex === undefined) {\n this._floorIndex = this.computeFloorIndex()\n this._floorIndexDirty = false\n }\n return this._floorIndex\n }\n\n /** 标记 floorIndex 需要重新计算(在位置等相关数据变化时调用) */\n public invalidateFloorIndex() {\n this._floorIndexDirty = true\n }\n\n public applyVisible() {\n const renderType = this.computeRenderType()\n if (renderType === 'Mesh') {\n this.initialSculpt()\n if (this.data.mediaData?.[0]?.type === 'Video') {\n this.renderVideoPlane()\n } else if (this.data.mediaData?.[0]?.type === 'Image') {\n this.renderImagePlane()\n } else {\n this.renderEmptyPlane()\n }\n } else {\n this.tag3DContentSvelte?.svelteApp.update({\n tag: this,\n state: this.plugin.state,\n temporaryState: this.plugin.temporaryState,\n })\n if (this.tag3DContentSvelte?.css3DInstance) {\n this.tag3DContentSvelte.css3DInstance.visible = this.visible\n this.five.needsRender = true\n }\n }\n this.syncEditorAuxiliaryVisibility()\n }\n\n public set(tag: PartialObjectDeep<Tag<C, 'Plane'>>, deepMerge = true) {\n super.set(tag, deepMerge)\n waitFiveModelLoaded(this.five).then(() => {\n if (!this.tag3DContentSvelte) return\n if (tag.data) {\n this.tag3DContentSvelte.svelteApp.update({\n tag: this,\n state: this.plugin.state,\n temporaryState: this.plugin.temporaryState,\n })\n } else if (tag.position) {\n this.loadModel()\n }\n })\n }\n\n public setData(...data: Parameters<InstanceType<typeof BaseTag<C, 'Plane'>>['setData']>) {\n super.setData(...data)\n\n const renderType = this.computeRenderType()\n if (renderType === 'Mesh') {\n if (this.data.mediaData?.[0]?.type === 'Video') {\n this.renderVideoPlane()\n } else if (this.data.mediaData?.[0]?.type === 'Image') {\n this.renderImagePlane()\n } else {\n this.renderEmptyPlane()\n }\n // 如果 mediaPlane 已存在且未重新创建,同步更新 opacity\n if (this.mediaPlane) {\n this.mediaPlane.opacity = this.opacity\n }\n } else {\n this.tag3DContentSvelte?.svelteApp.update({ tag: this })\n }\n }\n\n /** 计算楼层索引 */\n private computeFloorIndex(): number | undefined {\n // 1. 收集所有楼层索引并缓存对应的 Bounding Box\n const floorBoxMap = new Map<number, THREE.Box3>()\n const observers = this.five.works.getWork(this.workUtil.workCode)?.observers ?? []\n observers.forEach((observer) => {\n const floorIndex = observer.floorIndex ?? 0\n if (!floorBoxMap.has(floorIndex)) {\n const box = getFloorMesh(this.five, floorIndex)\n if (!box.isEmpty()) {\n floorBoxMap.set(floorIndex, box)\n }\n }\n })\n\n // 2. 计算 Tag 中心点\n const center = centerPoint(...this.position.map(anyPositionToVector3))\n\n // 3. 根据缓存的 Bounding Box 判断包含关系\n const containingFloors: { floorIndex: number; box: THREE.Box3 }[] = []\n const allFloors: { floorIndex: number; box: THREE.Box3 }[] = []\n floorBoxMap.forEach((box, floorIndex) => {\n allFloors.push({ floorIndex, box })\n if (box.containsPoint(center)) {\n containingFloors.push({ floorIndex, box })\n }\n })\n\n // 4. 选择楼层\n // 4.1 如果只有一个楼层包含,直接返回\n if (containingFloors.length === 1) {\n return containingFloors[0].floorIndex\n }\n\n // 4.2 如果多个楼层包含,选择最近的\n if (containingFloors.length > 1) {\n let minDistance = Infinity\n let nearestFloor = containingFloors[0].floorIndex\n containingFloors.forEach(({ floorIndex, box }) => {\n const boxCenter = new THREE.Vector3()\n box.getCenter(boxCenter)\n const distance = center.distanceTo(boxCenter)\n if (distance < minDistance) {\n minDistance = distance\n nearestFloor = floorIndex\n }\n })\n return nearestFloor\n }\n\n // 4.3 如果没有楼层包含,按就近原则分配一个\n if (allFloors.length > 0) {\n let minDistance = Infinity\n let nearestFloor = allFloors[0].floorIndex\n allFloors.forEach(({ floorIndex, box }) => {\n const boxCenter = new THREE.Vector3()\n box.getCenter(boxCenter)\n const distance = center.distanceTo(boxCenter)\n if (distance < minDistance) {\n minDistance = distance\n nearestFloor = floorIndex\n }\n })\n return nearestFloor\n }\n\n return undefined\n }\n\n private async loadModel() {\n await waitFiveModelLoaded(this.five)\n const renderType = this.computeRenderType()\n if (renderType === 'Mesh') {\n this.initialSculpt()\n if (this.data.mediaData?.[0]?.type === 'Video') {\n this.renderVideoPlane()\n } else if (this.data.mediaData?.[0]?.type === 'Image') {\n this.renderImagePlane()\n } else {\n this.renderEmptyPlane()\n }\n } else {\n initialCSS3DRender(this.five)\n const positions = this.position.map(anyPositionToVector3)\n this.tag3DContentSvelte?.dispose?.()\n const container = document.createElement('div')\n container.classList.add('tag-media-container')\n const config = { mode: 'front', cornerPoints: positions, container, ...this.config.tag3DConfig }\n const mode = this.computeRenderType() === 'BehindDom' || config.mode === 'behind' ? 'behind' : 'front'\n const cssMesh = new CSS3DObjectPlus({ ...config, mode, five: this.five })\n const normal = this.computeNormal()\n // 解决 z-fighting\n cssMesh.position.add(normal.clone().setLength(CONST.Z_FIGHTING_OFFSET))\n\n this.plugin.group.add(cssMesh)\n\n let clickEventDispose: () => void\n if (cssMesh.mode === 'behind' && this.config.clickable !== false) {\n clickEventDispose = this.addObjectClickHandler(this, cssMesh, (e) => {\n this.plugin.hooks.emit('click', { event: e, target: 'TagContent', tag: this })\n })\n }\n\n const svelte = mountComponent(TagContentSvelte, container, {\n tag: this,\n hooks: this.plugin.hooks,\n /** 模型标签要等模型加载好之后再展示 */\n state: this.plugin.state,\n mediaStore: this.plugin.mediaStore,\n temporaryState: this.plugin.temporaryState,\n })\n\n this.tag3DContentSvelte = {\n svelteApp: svelte,\n css3DInstance: cssMesh,\n initialNormal: normal,\n currentNormal: normal,\n dispose: () => {\n svelte.destroy()\n cssMesh.dispose()\n clickEventDispose?.()\n },\n }\n\n this.five.needsRender = true\n }\n }\n\n private initialSculpt() {\n if (this.rectanglePlane) return\n\n const uniqueId = uuid()\n const rectangle = new Rectangle(\n this.plugin.sculptModules,\n {\n id: uniqueId,\n type: 'Rectangle',\n points: this.position.map(arrayPositionToVector3),\n style: {\n color: 0x219fe4,\n opacity: 0.1,\n lineColor: 0x66cff3,\n },\n },\n {\n defaultAction: false,\n },\n )\n rectangle.visible = false\n this.plugin.imagePlaneGroup.add(rectangle)\n this.rectanglePlane = rectangle\n rectangle.editor.hooks.on('objectUpdate', () => {\n this.mediaPlane?.changePointsOrParams({ cornerPoints: rectangle.data.points.map(arrayPositionToVector3) })\n })\n rectangle.editor.disable()\n }\n\n public editorEnable() {\n if (!this.rectanglePlane) {\n this.initialSculpt()\n }\n this.rectanglePlane.visible = true\n this.rectanglePlane.editor.enable()\n this.syncEditorAuxiliaryVisibility()\n }\n\n public editorDisable(position?: Vector3[]) {\n this.rectanglePlane.visible = false\n const cornerPoints = position || this.position.map(arrayPositionToVector3)\n this.mediaPlane?.changePointsOrParams({ cornerPoints: cornerPoints })\n this.rectanglePlane.setData({\n points: cornerPoints,\n })\n this.rectanglePlane.editor.disable()\n }\n\n private getRectangleHelper() {\n const rectangleMesh = this.rectanglePlane?.rectangleMesh\n if (!rectangleMesh) return\n return this.plugin.sculptModules.object3DHelper.getObject3DHelper(rectangleMesh)?.helper\n }\n\n /**\n * 标签因为 visiblePanoIndex 等可见性规则被隐藏时,同时隐藏编辑辅助元素。\n * 当标签重新可见且仍处于编辑态时,再恢复辅助元素显示。\n */\n private syncEditorAuxiliaryVisibility() {\n if (!this.rectanglePlane) return\n const helper = this.getRectangleHelper()\n const editorEnabled = Boolean(this.rectanglePlane.editor.parent)\n\n if (!this.currentVisible || !editorEnabled) {\n this.rectanglePlane.visible = false\n helper?.hide()\n this.five.needsRender = true\n return\n }\n\n this.rectanglePlane.visible = true\n helper?.show()\n this.five.needsRender = true\n }\n\n /**\n * 自动播放使用真实观察点到屏幕角点的视线检测,不复用展示用的 horizontal 射线。\n * 这样标签仍可按既有策略展示,但真实视线被楼板、墙体等挡住时不会自动播放或抢占音频焦点。\n */\n private canAutoPlayByOcclusion() {\n const { panoIndex } = this.five.getCurrentState()\n return canAutoPlayByOcclusion({\n currentVisible: this.currentVisible,\n panoIndex,\n computeVisibleByIntersect: (targetPanoIndex, config) => this.computeVisibleByIntersect(targetPanoIndex, config),\n }).value\n }\n\n private renderVideoPlane() {\n const mediaData = this.data.mediaData[0]\n if (!mediaData) return\n const { url: src } = mediaData\n if (!src) return\n const objectFit = this.data.objectFit ?? 'contain'\n /** ============ 刷新贴片 ============ */\n // 视频\n const visible = this.currentVisible\n const needRemove = (() => {\n if (this.mediaPlane && !visible) return true\n return false\n })()\n\n const needCreate = (() => {\n if (!this.mediaPlane && visible) return true\n return false\n })()\n\n const needRefresh = (() => {\n if (this.mediaPlane && (this.mediaPlane.src !== src || this.mediaPlane.objectFit !== objectFit)) return true\n return false\n })()\n\n if (needRemove || needRefresh) {\n if (this.mediaPlane) {\n // 销毁前记住播放态:dispose 会连带停播,之后就无法判断「离开时是否在播」。\n // 只有因不可见移除(needRemove)才算「离开」;换源刷新(needRefresh)不算。\n const videoInstance = 'videoInstance' in this.mediaPlane ? this.mediaPlane.videoInstance : undefined\n this.wasPlayingBeforeHidden = needRemove && videoInstance?.paused === false\n this.plugin.imagePlaneGroup.remove(this.mediaPlane)\n this.mediaPlane.dispose()\n // 因为后面有赋值操作,如果已经有mesh了,需要先清除掉\n this.mediaPlane.removeFromParent()\n this.mediaPlane = undefined\n }\n }\n\n const updateObjectFit = (() => {\n if (this.mediaPlane && this.mediaPlane.objectFit && this.mediaPlane.objectFit !== objectFit) return true\n return false\n })()\n\n if (needCreate || needRefresh) {\n if (this.cachedVideoSource !== undefined && this.cachedVideoSource !== src) {\n this.plugin.mediaTextures.release(this)\n }\n this.cachedVideoSource = src\n let cornerPoints = this.position.map(arrayPositionToVector3)\n if (this.rectanglePlane) {\n cornerPoints = this.rectanglePlane.data.points.map(arrayPositionToVector3)\n }\n\n const canAutoPlay = this.canAutoPlayByOcclusion()\n const videoPlane = new VideoPlane(src, cornerPoints, {\n mediaManager: this.mediaManager,\n videoCoverSrc: (mediaData as any).videoCoverUrl,\n playButton: this.data.playIcon,\n paused: !(this.data.autoplayConfig?.autoplayVideo && canAutoPlay),\n objectFit: this.data.objectFit,\n mediaTextures: this.plugin.mediaTextures,\n textureOwner: this,\n domEvents: this.plugin.domEvents,\n opacity: this.opacity,\n // 开启重播时按标签独占 video 元素,避免同 src 的多块屏幕互相干扰进度\n cacheScope: this.data.autoplayConfig?.replayWhenRevisible ? String(this.id) : undefined,\n })\n const onContentAdded = () => {\n if (this.mediaPlane !== videoPlane || !this.currentVisible) return\n this.five.needsRender = true\n }\n videoPlane.addEventListener('childadded', onContentAdded)\n videoPlane.onDispose(() => videoPlane.removeEventListener('childadded', onContentAdded))\n videoPlane.onDispose(this.bindMediaManager((host) => videoPlane.setMediaManager(host)))\n this.plugin.domEvents.addAutoBindEventListener(videoPlane, 'click', (event) => {\n // 静音播放时点击会取消静音不触发play事件,增加点击监听触发playStateChange事件\n if (!videoPlane.videoInstance?.paused && videoPlane.videoInstance?.muted === false) {\n this.plugin.hooks.emit('playStateChange', {\n event: event as unknown as Event,\n state: 'playing',\n tag: this,\n mediaInstance: videoPlane.videoInstance,\n })\n }\n })\n\n videoPlane.onVideoReady = (videoElement) => {\n const onPlay = (event: Event) => {\n this.plugin.mediaStore.set({ currentMediaElement: videoPlane.videoInstance })\n this.plugin.hooks.emit('playStateChange', {\n event,\n state: 'playing',\n tag: this,\n mediaInstance: videoPlane.videoInstance,\n })\n }\n const onPause = (event: Event) => {\n this.plugin.hooks.emit('playStateChange', {\n event,\n state: 'paused',\n tag: this,\n mediaInstance: videoPlane.videoInstance,\n })\n }\n videoElement.addEventListener('play', onPlay)\n videoElement.addEventListener('pause', onPause)\n videoElement.addEventListener('ended', onPause)\n videoPlane.onDispose(() => {\n videoElement.removeEventListener('play', onPlay)\n videoElement.removeEventListener('pause', onPause)\n videoElement.removeEventListener('ended', onPause)\n })\n }\n const renderFrame = (render: () => void) => {\n this.five.on('renderFrame', render)\n return () => this.five.off('renderFrame', render)\n }\n videoPlane.initialRenderHooks(renderFrame)\n this.mediaPlane = videoPlane\n this.play = (userAction = false) => videoPlane.play(false, userAction)\n this.pause = () => videoPlane.pause()\n this.plugin.imagePlaneGroup.add(this.mediaPlane)\n\n // 走回可见范围/遮挡解除后从头重播。只在「离开前确实在播」时触发,\n // 首次创建走 VideoPlane 构造函数里的既有自动播放逻辑,不受影响。\n if (needCreate && this.wasPlayingBeforeHidden && this.data.autoplayConfig?.replayWhenRevisible && canAutoPlay) {\n this.wasPlayingBeforeHidden = false\n void videoPlane.replayFromStart()\n }\n }\n\n if (updateObjectFit) {\n const cornerPoints = this.rectanglePlane.data.points.map(arrayPositionToVector3)\n this.mediaPlane?.changePointsOrParams({ cornerPoints, params: { objectFit } })\n }\n this.five.needsRender = true\n }\n\n private renderImagePlane() {\n this.plugin.mediaTextures.release(this)\n this.cachedVideoSource = undefined\n const mediaData = this.data.mediaData[0]\n const objectFit = this.data.objectFit ?? 'contain'\n if (!mediaData) return\n const { url: src } = mediaData\n if (!src) return\n\n let cornerPoints = this.position.map(arrayPositionToVector3)\n\n /** ============ 刷新贴片 ============ */\n // 图片\n const visible = this.currentVisible\n const needRemove = (() => {\n if (this.mediaPlane && !visible) return true\n return false\n })()\n\n const needCreate = (() => {\n if (!this.mediaPlane && visible) return true\n return false\n })()\n\n const needRefresh = (() => {\n if (this.mediaPlane && this.mediaPlane.src !== src) return true\n return false\n })()\n\n const updateObjectFit = (() => {\n if (this.mediaPlane && this.mediaPlane.objectFit && this.mediaPlane.objectFit !== objectFit) return true\n return false\n })()\n\n if (needRemove || needRefresh) {\n if (this.mediaPlane) {\n this.plugin.imagePlaneGroup.remove(this.mediaPlane)\n this.mediaPlane.dispose()\n // 因为后面有赋值操作,如果已经有mesh了,需要先清除掉\n this.mediaPlane.removeFromParent()\n this.mediaPlane = undefined\n }\n }\n\n if (needCreate || needRefresh) {\n if (this.rectanglePlane) {\n cornerPoints = this.rectanglePlane.data.points.map(arrayPositionToVector3)\n }\n this.mediaPlane = new ImagePlane(src, cornerPoints, { objectFit: this.data.objectFit, opacity: this.opacity })\n if (this.getConfig().clickable !== false) {\n this.plugin.domEvents.addAutoBindEventListener(\n this.mediaPlane,\n 'click',\n (e) => {\n this.plugin.hooks.emit('click', { tag: this, target: 'TagContent', event: e.origDomEvent })\n },\n { noEmitWhenHide: true },\n )\n }\n this.plugin.imagePlaneGroup.add(this.mediaPlane)\n }\n\n if (updateObjectFit) {\n const cornerPoints = this.rectanglePlane.data.points.map(arrayPositionToVector3)\n this.mediaPlane?.changePointsOrParams({ cornerPoints, params: { objectFit } })\n }\n\n this.five.needsRender = true\n }\n\n private renderEmptyPlane() {\n if (this.mediaPlane) {\n this.plugin.imagePlaneGroup.remove(this.mediaPlane)\n this.mediaPlane.dispose()\n this.mediaPlane.removeFromParent()\n this.mediaPlane = undefined\n }\n this.plugin.mediaTextures.release(this)\n this.cachedVideoSource = undefined\n }\n\n public override destroy(notify = true) {\n super.destroy(notify)\n this.plugin.mediaTextures.release(this)\n }\n\n public computeNormal() {\n return planeNormal(this.position)\n }\n}\n\nexport type PlaneTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, 'Plane'>\n","import * as THREE from 'three/webgpu'\nimport type { BoxPosition } from '../typings'\n\n/**\n * 将 Sculpt 数据转换为 BoxPosition\n */\nexport function sculptDataToBoxPosition(bottomPoints: THREE.Vector3[], heightPoint: THREE.Vector3): BoxPosition {\n // 计算所有8个角点\n const heightVector = new THREE.Vector3().subVectors(heightPoint, bottomPoints[0])\n const topPoints = bottomPoints.map((p) => p.clone().add(heightVector))\n const allPoints = [...bottomPoints, ...topPoints]\n\n // 计算中心点\n const center = new THREE.Vector3()\n allPoints.forEach((p) => center.add(p))\n center.divideScalar(8)\n\n // 计算旋转\n const edge01 = new THREE.Vector3().subVectors(bottomPoints[1], bottomPoints[0])\n const xAxis = edge01.clone().normalize()\n const yAxis = heightVector.clone().normalize()\n const zAxis = new THREE.Vector3().crossVectors(xAxis, yAxis).normalize()\n\n const rotationMatrix = new THREE.Matrix4().makeBasis(xAxis, yAxis, zAxis)\n const quaternion = new THREE.Quaternion().setFromRotationMatrix(rotationMatrix)\n const euler = new THREE.Euler().setFromQuaternion(quaternion)\n\n // 计算尺寸:将所有点转换到局部坐标系\n const invertedQuaternion = quaternion.clone().invert()\n const boxLocalPoints = allPoints.map((p) => {\n return p.clone().sub(center).applyQuaternion(invertedQuaternion)\n })\n\n const xs = boxLocalPoints.map((p) => p.x)\n const ys = boxLocalPoints.map((p) => p.y)\n const zs = boxLocalPoints.map((p) => p.z)\n\n const halfSize = new THREE.Vector3(\n (Math.max(...xs) - Math.min(...xs)) / 2,\n (Math.max(...ys) - Math.min(...ys)) / 2,\n (Math.max(...zs) - Math.min(...zs)) / 2,\n )\n\n const start = new THREE.Vector3(center.x - halfSize.x, center.y - halfSize.y, center.z - halfSize.z)\n const end = new THREE.Vector3(center.x + halfSize.x, center.y + halfSize.y, center.z + halfSize.z)\n\n return {\n start: start.toArray() as [number, number, number],\n end: end.toArray() as [number, number, number],\n rotation: [euler.x, euler.y, euler.z],\n }\n}\n","import type PanoTagPluginController from '..'\nimport type { TagContentType, Tag as TagData, TagInstance, BoxPosition, ArrayPosition, TagClickParams } from '../..'\nimport { BaseTag } from './BaseTag'\nimport * as THREE from 'three/webgpu'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { Tag } from '../..'\nimport { Box } from '../../../Sculpt/Objects/Box'\nimport { uuid } from '../../../shared-utils'\nimport { applyMatrixToPoints, getBoxCorners } from '../../utils/tagPosition'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\nimport { sculptDataToBoxPosition } from '../../utils/sculptDataToBoxPosition'\nimport { transformPosition } from '../../../shared-utils/five/transformPosition'\n\nexport type BoxTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, '3DBox'>\n\n/**\n * 3DBox 类型的标签\n * 使用 Sculpt Box 进行渲染,避免复杂的坐标转换\n */\nexport class BoxTag<C extends TagContentType = TagContentType> extends BaseTag<C, '3DBox'> {\n public declare boxShape?: Box\n private tagStyle?: TagData['style']\n private clickEventDispose?: () => void\n private domClickDispose?: () => void\n public screenPosition: { leftPx: number; topPx: number; scale: number } | null = null\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n this.tagStyle = tagData.style\n this.initializeSculptBox()\n this.updateVisible()\n }\n\n /**\n * 获取 Box 样式配置(合并用户配置和默认值)\n */\n private getBoxStyle() {\n const userStyle = (this.tagStyle as any)?.boxOrPolygon || {}\n return {\n color: userStyle.color ?? 0xffffff,\n opacity: userStyle.opacity ?? 0.4,\n lineColor: userStyle.color ?? 0xffffff,\n lineWidth: 1,\n }\n }\n\n /**\n * 更新 Box 样式\n */\n private updateBoxStyle() {\n if (!this.boxShape || !this.boxShape.boxMesh) return\n\n const style = this.getBoxStyle()\n this.boxShape.boxMesh.setStyle(style)\n }\n\n /**\n * 更新标签数据\n */\n public set(tag: PartialObjectDeep<Tag<C, '3DBox'>>, deepMerge = true) {\n super.set(tag, deepMerge)\n\n // 更新 style\n if (tag.style) {\n this.tagStyle = { ...this.tagStyle, ...tag.style } as any\n }\n\n if (tag.position) {\n // 更新 Sculpt Box 的数据\n if (this.boxShape) {\n this.updateSculptBox()\n } else {\n this.initializeSculptBox()\n }\n }\n\n // 如果样式变化,更新 box 样式\n if (tag.style && this.boxShape) {\n this.updateBoxStyle()\n }\n }\n\n /**\n * 设置标签数据\n */\n public setData(...data: Parameters<InstanceType<typeof BaseTag<C, '3DBox'>>['setData']>) {\n super.setData(...data)\n }\n\n /**\n * 获取盒子的中心点\n */\n public getCenter(): ArrayPosition {\n const boxPosition = this.position as unknown as BoxPosition\n if (!boxPosition?.start || !boxPosition?.end) {\n return [0, 0, 0]\n }\n const point1 = boxPosition.end.map((p: number) => Number(p))\n const point2 = boxPosition.start.map((p: number) => Number(p))\n const x = point1[0] / 2 + point2[0] / 2\n const y = point1[1] / 2 + point2[1] / 2\n const z = point1[2] / 2 + point2[2] / 2\n const center = new THREE.Vector3(x, y, z)\n return transformPosition(center, this.workUtil.transform).toArray() as [number, number, number]\n }\n\n /**\n * 获取盒子的8个角点坐标\n */\n public getCorners(): THREE.Vector3[] {\n if (this.boxShape) {\n // 如果有 Sculpt Box,直接从它获取\n const data = this.boxShape.data\n const bottomPoints = (data.points as [number, number, number][]).map((p) => anyPositionToVector3(p))\n const heightVector = new THREE.Vector3().subVectors(\n anyPositionToVector3(data.heightPoint as [number, number, number]),\n bottomPoints[0],\n )\n const topPoints = bottomPoints.map((p) => p.clone().add(heightVector))\n return [...bottomPoints, ...topPoints]\n }\n return []\n }\n\n /**\n * 计算盒子的法向量\n */\n public computeNormal(): THREE.Vector3 {\n const boxPosition = this.position as unknown as BoxPosition\n if (!boxPosition.rotation) {\n return new THREE.Vector3(0, 1, 0)\n }\n\n const rotation = new THREE.Euler().fromArray(boxPosition.rotation as [number, number, number])\n const upVector = new THREE.Vector3(0, 1, 0)\n upVector.applyEuler(rotation)\n return upVector\n }\n\n /**\n * 初始化 Sculpt Box\n */\n private initializeSculptBox() {\n if (this.boxShape) return\n\n const boxPosition = this.position as unknown as BoxPosition\n\n // 如果没有 position,跳过初始化,等待交互式创建\n if (!boxPosition?.start || !boxPosition?.end || !boxPosition?.rotation) {\n return\n }\n\n\n // 将 BoxPosition 转换为 Sculpt 数据格式\n const sculptData = this.boxPositionToSculptData(boxPosition)\n\n // 获取样式配置\n const style = this.getBoxStyle()\n\n const box = new Box(\n this.plugin.sculptModules,\n {\n id: uuid(),\n type: 'Box',\n points: sculptData.bottomPoints,\n heightPoint: sculptData.heightPoint,\n style,\n },\n {\n defaultAction: false,\n occlusionVisibility: false,\n // occlusionMode: 'translucence' as any,\n },\n )\n box.visible = this.visible\n this.plugin.imagePlaneGroup.add(box)\n this.boxShape = box\n\n // 监听编辑事件\n box.editor.hooks.on('objectUpdate', () => {\n this.syncBoxPositionFromSculpt()\n })\n\n box.editor.disable()\n\n // 添加点击事件监听\n this.setupClickEvents()\n }\n\n /**\n * 设置点击事件\n */\n private setupClickEvents() {\n if (!this.boxShape || !this.boxShape.boxMesh || this.config.clickable === false) {\n console.warn(\n `[BoxTag ${this.id}] Cannot setup click events: boxShape=${!!this.boxShape}, boxMesh=${!!this.boxShape?.boxMesh}, clickable=${\n this.config.clickable\n }`,\n )\n return\n }\n\n // 清理旧的事件监听器\n this.cleanupClickEvents()\n\n const handler = (e: Event) => {\n this.plugin.hooks.emit('click', { event: e, target: 'TagBoxModel', tag: this })\n }\n\n // 延迟绑定点击事件,确保 domEvents 系统能够识别新添加的对象\n requestAnimationFrame(() => {\n if (!this.boxShape || !this.plugin.domEvents) {\n console.warn(`[BoxTag ${this.id}] Cannot bind click events: boxShape or domEvents not available`)\n return\n }\n // 只监听 box 本身\n this.clickEventDispose = this.addObjectClickHandler(this, this.boxShape, handler)\n })\n }\n\n /**\n * 清理点击事件\n */\n private cleanupClickEvents() {\n if (this.clickEventDispose) {\n this.clickEventDispose()\n this.clickEventDispose = undefined\n }\n }\n\n /**\n * 更新 Sculpt Box 的数据\n */\n private updateSculptBox() {\n if (!this.boxShape) return\n\n const boxPosition = this.position as unknown as BoxPosition\n if (!boxPosition?.start || !boxPosition?.end || !boxPosition?.rotation) return\n\n // 将 BoxPosition 转换为 Sculpt 数据格式\n const sculptData = this.boxPositionToSculptData(boxPosition)\n\n this.boxShape.setData({\n points: sculptData.bottomPoints.map((p) => p.toArray()) as any,\n heightPoint: sculptData.heightPoint.toArray() as any,\n })\n\n // 重新设置点击事件(子对象可能已更新)\n this.setupClickEvents()\n }\n\n /**\n * 启用编辑器\n * 用于编辑已存在的 Box\n */\n public async editorEnable() {\n // 如果 position 不存在,需要先调用 startDrawing() 创建\n if (!this.position) {\n console.warn('[BoxTag] Cannot enable editor without position. Call startDrawing() first.')\n return\n }\n\n if (!this.boxShape) {\n this.initializeSculptBox()\n }\n\n if (this.boxShape) {\n this.boxShape.visible = true\n this.boxShape.editor.enable()\n }\n }\n\n /**\n * 禁用编辑器\n */\n public editorDisable() {\n if (!this.boxShape) return\n this.boxShape.editor.disable()\n }\n\n /**\n * 从 Sculpt Box 同步 position 到 BoxTag\n */\n private syncBoxPositionFromSculpt() {\n if (!this.boxShape) return\n\n const data = this.boxShape.data\n const bottomPoints = (data.points as [number, number, number][]).map((p) => anyPositionToVector3(p))\n const heightPoint = anyPositionToVector3(data.heightPoint as [number, number, number])\n const newPosition = sculptDataToBoxPosition(bottomPoints, heightPoint)\n\n // 更新内部 position 数据(不触发 set 避免递归)\n ;(this.position as any) = newPosition\n\n // 触发事件\n this.hooks.emit('positionChanged', newPosition)\n }\n\n /**\n * 将 BoxPosition 转换为 Sculpt 需要的数据格式\n */\n private boxPositionToSculptData(boxPosition: BoxPosition): { bottomPoints: THREE.Vector3[]; heightPoint: THREE.Vector3 } {\n const start = anyPositionToVector3(boxPosition.start)\n const end = anyPositionToVector3(boxPosition.end)\n const rotation = new THREE.Euler().fromArray(boxPosition.rotation as [number, number, number])\n\n const center = new THREE.Vector3((start.x + end.x) / 2, (start.y + end.y) / 2, (start.z + end.z) / 2)\n const halfSize = new THREE.Vector3(Math.abs(end.x - start.x) / 2, Math.abs(end.y - start.y) / 2, Math.abs(end.z - start.z) / 2)\n\n // 构建旋转矩阵\n const rotationMatrix = new THREE.Matrix4().makeRotationFromEuler(rotation)\n\n // 单位立方体的底面4个点和一个顶面点\n const unitBottomCorners = [\n new THREE.Vector3(-0.5, -0.5, -0.5),\n new THREE.Vector3(0.5, -0.5, -0.5),\n new THREE.Vector3(0.5, -0.5, 0.5),\n new THREE.Vector3(-0.5, -0.5, 0.5),\n ]\n const unitTopCorner = new THREE.Vector3(-0.5, 0.5, -0.5)\n\n const size = halfSize.clone().multiplyScalar(2)\n const transform = this.workUtil.transform\n const bottomPoints = unitBottomCorners.map((corner) => {\n const point = corner.clone().multiply(size).applyMatrix4(rotationMatrix).add(center)\n return transformPosition(point, transform)\n })\n\n const rawHeightPoint = unitTopCorner.clone().multiply(size).applyMatrix4(rotationMatrix).add(center)\n const heightPoint = transformPosition(rawHeightPoint, transform)\n return { bottomPoints, heightPoint }\n }\n\n /**\n * @description 点击事件处理\n */\n public onClick(params: Pick<TagClickParams, 'target'>) {\n if (params.target !== 'TagBoxModel') return\n this.unfoldAndFoldOthers()\n }\n\n /**\n * @description 展开自己,收起其他标签\n */\n public unfoldAndFoldOthers() {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n // 先检查一下能不能打开/关闭\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n // 展开/收起 点击的标签\n this.state.unfolded = !this.state.unfolded\n this.manuallyOperated = true\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n\n // 点开的话,收起其他标签\n if (this.state.unfolded) {\n this.plugin.tags.forEach((tag) => {\n if (tag.id === this.id) return\n tag.fold()\n })\n }\n }\n }\n\n /**\n * 展开标签详情\n */\n public unfold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(true)\n }\n\n /**\n * 折叠标签详情\n */\n public fold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(false)\n }\n\n /**\n * 设置展开/折叠状态\n */\n public setUnfold(unfolded: boolean) {\n if (this.isPopoverConfigEnabled()) return\n\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n this.state.unfolded = unfolded\n this.hooks.emit(unfolded ? 'unfolded' : 'folded')\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n }\n\n /**\n * 更新屏幕位置(用于在 2D UI 中显示内容)\n * 显示在 Box 最右侧的顶点位置\n */\n public updateScreenPosition() {\n const visible = this.currentVisible\n if (!visible) {\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n return\n }\n\n const boxPosition = this.position as unknown as BoxPosition\n if (!boxPosition?.start || !boxPosition?.end) {\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n return\n }\n\n // 获取 Box 的 8 个顶点\n const start = new THREE.Vector3().fromArray(boxPosition.start)\n const end = new THREE.Vector3().fromArray(boxPosition.end)\n const rotation = new THREE.Euler().fromArray(boxPosition.rotation as [number, number, number])\n\n // 计算 8 个顶点(考虑旋转)\n const vertices = [\n new THREE.Vector3(start.x, start.y, start.z),\n new THREE.Vector3(end.x, start.y, start.z),\n new THREE.Vector3(start.x, end.y, start.z),\n new THREE.Vector3(end.x, end.y, start.z),\n new THREE.Vector3(start.x, start.y, end.z),\n new THREE.Vector3(end.x, start.y, end.z),\n new THREE.Vector3(start.x, end.y, end.z),\n new THREE.Vector3(end.x, end.y, end.z),\n ]\n\n const center = new THREE.Vector3().addVectors(start, end).multiplyScalar(0.5)\n const transform = this.workUtil.transform\n vertices.forEach((v) => {\n v.sub(center).applyEuler(rotation).add(center)\n v.copy(transformPosition(v, transform))\n })\n\n // 找到 x 坐标最大的顶点(最右侧)\n let rightmostVertex = vertices[0]\n vertices.forEach((v) => {\n if (v.x > rightmostVertex.x) {\n rightmostVertex = v\n }\n })\n\n const projected = rightmostVertex.clone().project(this.five.camera)\n\n // 检查是否在视锥体内\n if (projected.x < -1 || projected.x > 1 || projected.y < -1 || projected.y > 1 || projected.z < 0 || projected.z > 1) {\n this.screenPosition = null\n } else if (this.five.renderer) {\n const rendererSize = this.five.renderer.getSize(new THREE.Vector2())\n this.screenPosition = {\n leftPx: ((projected.x + 1) / 2) * rendererSize.x,\n topPx: ((-projected.y + 1) / 2) * rendererSize.y,\n scale: 1,\n }\n }\n\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n public get centerPosition() {\n const corners = getBoxCorners(this.position as BoxPosition, this.workUtil.transform)\n const tagPosition = applyMatrixToPoints(corners, this.matrix)\n\n // 找到 x 坐标最大的顶点(最右侧),与 screenPosition 计算逻辑一致\n let rightmostVertex = tagPosition[0]\n tagPosition.forEach((v) => {\n if (v.x > rightmostVertex.x) {\n rightmostVertex = v\n }\n })\n\n return rightmostVertex\n }\n\n /**\n * 应用可见性变化\n */\n public applyVisible() {\n if (this.boxShape) {\n // 检查 boxShape 是否还在 imagePlaneGroup 中\n if (!this.plugin.imagePlaneGroup.children.includes(this.boxShape as any)) {\n console.warn(`[BoxTag ${this.id}] applyVisible: boxShape not in imagePlaneGroup, re-adding...`, {\n boxShapeParent: this.boxShape.parent?.name || 'null',\n imagePlaneGroupChildren: this.plugin.imagePlaneGroup.children.length,\n })\n // 自动修复:重新添加到 imagePlaneGroup\n if (this.boxShape.parent) {\n this.boxShape.parent.remove(this.boxShape)\n }\n this.plugin.imagePlaneGroup.add(this.boxShape)\n }\n this.boxShape.visible = this.visible\n }\n\n // 更新屏幕位置\n this.updateScreenPosition()\n }\n\n /**\n * 销毁标签\n */\n public dispose() {\n // 清理点击事件\n this.cleanupClickEvents()\n\n // 清理 DOM 点击监听\n if (this.domClickDispose) {\n this.domClickDispose()\n this.domClickDispose = undefined\n }\n\n // 清理 Box\n if (this.boxShape) {\n this.boxShape.removeFromParent()\n this.boxShape = undefined\n }\n }\n}\n","import type PanoTagPluginController from '..'\nimport type { TagContentType, Tag as TagData, TagInstance, PolygonPosition, ArrayPosition, TagClickParams } from '../..'\nimport { BaseTag } from './BaseTag'\nimport * as THREE from 'three/webgpu'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { Tag } from '../..'\nimport { Polygon } from '../../../Sculpt/Objects/Polygon'\nimport { uuid } from '../../../shared-utils'\nimport { anyPositionToVector3 } from '../../../shared-utils/positionToVector3'\n\nexport type PolygonTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, 'Polygon'>\n\n/**\n * Polygon 类型的标签\n * 使用 Sculpt Polygon 进行渲染\n */\nexport class PolygonTag<C extends TagContentType = TagContentType> extends BaseTag<C, 'Polygon'> {\n public declare polygonShape?: Polygon\n private tagStyle?: TagData['style']\n private clickEventDispose?: () => void\n private domClickDispose?: () => void\n public screenPosition: { leftPx: number; topPx: number; scale: number } | null = null\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n this.tagStyle = tagData.style\n this.initializeSculptPolygon()\n this.updateVisible()\n }\n\n /**\n * 获取 Polygon 样式配置(合并用户配置和默认值)\n */\n private getPolygonStyle() {\n const userStyle = (this.tagStyle as any)?.boxOrPolygon || {}\n return {\n color: userStyle.color ?? 0xffffff,\n opacity: userStyle.opacity ?? 0.4,\n lineColor: userStyle.lineColor ?? userStyle.color ?? 0xffffff,\n lineWidth: userStyle.lineWidth ?? 1,\n }\n }\n\n /**\n * 更新 Polygon 样式\n */\n private updatePolygonStyle() {\n if (!this.polygonShape || !this.polygonShape.areaMesh) return\n\n const style = this.getPolygonStyle()\n this.polygonShape.areaMesh.setStyle(style)\n }\n\n /**\n * 更新标签数据\n */\n public set(tag: PartialObjectDeep<Tag<C, 'Polygon'>>, deepMerge = true) {\n super.set(tag, deepMerge)\n // 更新 style\n if (tag.style) {\n this.tagStyle = { ...this.tagStyle, ...tag.style } as any\n }\n\n if (tag.position) {\n // 更新 Sculpt Polygon 的数据\n if (this.polygonShape) {\n this.updateSculptPolygon()\n } else {\n this.initializeSculptPolygon()\n }\n }\n\n // 如果样式变化,更新 polygon 样式\n if (tag.style && this.polygonShape) {\n this.updatePolygonStyle()\n }\n }\n\n /**\n * 获取多边形的所有角点(世界坐标)\n */\n public getCorners(): THREE.Vector3[] {\n if (!this.polygonShape) return []\n return this.polygonShape.areaMesh.points.map((p) => p.clone())\n }\n\n public getCenter(): ArrayPosition {\n const polygonPosition = this.originPosition as PolygonPosition\n if (!polygonPosition || polygonPosition.length === 0) {\n return [0, 0, 0]\n }\n const center = new THREE.Vector3()\n polygonPosition.forEach((p) => {\n center.add(anyPositionToVector3(p))\n })\n center.divideScalar(polygonPosition.length)\n return center.toArray() as [number, number, number]\n }\n\n /**\n * 计算多边形的法向量\n * 使用前三个点来计算平面的法向量\n */\n public computeNormal(): THREE.Vector3 | undefined {\n const polygonPosition = this.position as unknown as PolygonPosition\n if (!polygonPosition || polygonPosition.length < 3) {\n return new THREE.Vector3(0, 1, 0)\n }\n\n const p0 = anyPositionToVector3(polygonPosition[0])\n const p1 = anyPositionToVector3(polygonPosition[1])\n const p2 = anyPositionToVector3(polygonPosition[2])\n\n const v1 = new THREE.Vector3().subVectors(p1, p0)\n const v2 = new THREE.Vector3().subVectors(p2, p0)\n\n return new THREE.Vector3().crossVectors(v1, v2).normalize()\n }\n\n /**\n * 初始化 Sculpt Polygon\n */\n private initializeSculptPolygon() {\n if (this.polygonShape) return\n\n // 如果业务侧禁用了默认 Polygon mesh 渲染,直接跳过\n if (this.getConfig()?.__experimental_PolygonMeshConfig?.enabled === false) return\n\n const polygonPosition = this.position as unknown as PolygonPosition\n\n // 如果没有 position 或点数少于 3,跳过初始化\n if (!polygonPosition || polygonPosition.length < 3) {\n return\n }\n\n\n // 将 PolygonPosition 转换为 Sculpt 数据格式\n const points = polygonPosition.map((p) => anyPositionToVector3(p))\n // 获取样式配置\n const style = this.getPolygonStyle()\n\n // // 往法向量方向位移一点点\n // const normal = getNormal(points).multiplyScalar(CONST.Z_FIGHTING_OFFSET)\n // const newPoints = points.map((p) => p.clone().add(normal))\n const polygon = new Polygon(\n this.plugin.sculptModules,\n {\n id: uuid(),\n type: 'Polygon',\n points: points,\n style,\n },\n {\n defaultAction: false,\n occlusionVisibility: true,\n occlusionMode: 'depthTest',\n },\n )\n\n polygon.visible = this.visible\n this.plugin.imagePlaneGroup.add(polygon)\n this.polygonShape = polygon\n\n // 监听编辑事件\n polygon.editor.hooks.on('objectUpdate', () => {\n this.syncPolygonPositionFromSculpt()\n })\n\n polygon.editor.disable()\n\n // 添加点击事件监听\n this.setupClickEvents()\n }\n\n /**\n * 设置点击事件\n */\n private setupClickEvents() {\n if (!this.polygonShape || this.config.clickable === false) {\n console.warn(\n `[PolygonTag ${this.id}] Cannot setup click events: polygonShape=${!!this.polygonShape}, clickable=${this.config.clickable}`,\n )\n return\n }\n\n // 清理旧的事件监听器\n this.cleanupClickEvents()\n\n const handler = (e: Event) => {\n this.plugin.hooks.emit('click', { event: e, target: 'TagPolygonModel', tag: this })\n }\n\n requestAnimationFrame(() => {\n if (!this.polygonShape || !this.plugin.domEvents) {\n console.warn(`[PolygonTag ${this.id}] Cannot bind click events: polygonShape or domEvents not available`)\n return\n }\n // 只监听 polygon 本身\n this.clickEventDispose = this.addObjectClickHandler(this, this.polygonShape, handler)\n })\n }\n\n /**\n * 清理点击事件\n */\n private cleanupClickEvents() {\n if (this.clickEventDispose) {\n this.clickEventDispose()\n this.clickEventDispose = undefined\n }\n }\n\n /**\n * 更新 Sculpt Polygon 的数据\n */\n private updateSculptPolygon() {\n if (!this.polygonShape) return\n\n const polygonPosition = this.position as unknown as PolygonPosition\n if (!polygonPosition || polygonPosition.length < 3) return\n\n // 将 PolygonPosition 转换为 Sculpt 数据格式\n const points = polygonPosition.map((p) => anyPositionToVector3(p))\n this.polygonShape.setData({\n points: points.map((p) => p.toArray()) as any,\n style: this.getPolygonStyle(),\n })\n\n // 重新设置点击事件(子对象可能已更新)\n this.setupClickEvents()\n }\n\n /**\n * 启用编辑器\n * 用于编辑已存在的 Polygon\n */\n public async editorEnable() {\n // 如果 position 不存在,需要先调用 startDrawing() 创建\n if (!this.position) {\n console.warn('[PolygonTag] Cannot enable editor without position. Call startDrawing() first.')\n return\n }\n\n if (!this.polygonShape) {\n this.initializeSculptPolygon()\n }\n\n if (this.polygonShape) {\n this.polygonShape.visible = true\n this.polygonShape.editor.enable()\n }\n }\n\n /**\n * 禁用编辑器\n */\n public editorDisable() {\n if (!this.polygonShape) return\n this.polygonShape.editor.disable()\n }\n\n /**\n * 同步 Sculpt Polygon 的数据到 PolygonPosition\n */\n private syncPolygonPositionFromSculpt() {\n if (!this.polygonShape) return\n\n const data = this.polygonShape.data\n const points = (data.points as [number, number, number][]).map((p) => anyPositionToVector3(p))\n\n const newPosition: PolygonPosition = points.map((p) => p.toArray() as [number, number, number])\n\n // 更新内部 position 数据(不触发 set 避免递归)\n ;(this as any).position = newPosition\n\n this.hooks.emit('positionChanged', newPosition)\n }\n\n /**\n * @description 点击事件处理\n */\n public onClick(params: Pick<TagClickParams, 'target'>) {\n if (params.target !== 'TagPolygonModel') return\n this.unfoldAndFoldOthers()\n }\n\n /**\n * @description 展开自己,收起其他标签\n */\n public unfoldAndFoldOthers() {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n // 先检查一下能不能打开/关闭\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n // 展开/收起 点击的标签\n this.state.unfolded = !this.state.unfolded\n this.manuallyOperated = true\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n\n // 点开的话,收起其他标签\n if (this.state.unfolded) {\n this.plugin.tags.forEach((tag) => {\n if (tag.id === this.id) return\n tag.fold()\n })\n }\n }\n }\n\n /**\n * 展开标签详情\n */\n public unfold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(true)\n }\n\n /**\n * 折叠标签详情\n */\n public fold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(false)\n }\n\n /**\n * 设置展开/折叠状态\n */\n public setUnfold(unfolded: boolean) {\n if (this.isPopoverConfigEnabled()) return\n\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n this.state.unfolded = unfolded\n this.hooks.emit(unfolded ? 'unfolded' : 'folded')\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n }\n\n /**\n * 获取多边形的中心点\n */\n private getPolygonCenter(): THREE.Vector3 {\n const polygonPosition = this.position as unknown as PolygonPosition\n if (!polygonPosition || polygonPosition.length === 0) {\n return new THREE.Vector3()\n }\n\n const center = new THREE.Vector3()\n polygonPosition.forEach((p) => {\n const point = anyPositionToVector3(p)\n center.add(point)\n })\n center.divideScalar(polygonPosition.length)\n return center\n }\n\n /**\n * 更新屏幕位置(用于在 2D UI 中显示内容)\n * 显示在 Polygon 最右侧的顶点位置\n */\n public updateScreenPosition() {\n const visible = this.currentVisible\n if (!visible) {\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n return\n }\n\n const polygonPosition = this.position as unknown as PolygonPosition\n if (!polygonPosition || polygonPosition.length === 0) {\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n return\n }\n\n // 找到 x 坐标最大的顶点(最右侧)\n let rightmostVertex = anyPositionToVector3(polygonPosition[0])\n polygonPosition.forEach((pos) => {\n const vertex = anyPositionToVector3(pos)\n if (vertex.x > rightmostVertex.x) {\n rightmostVertex = vertex\n }\n })\n\n const projected = rightmostVertex.clone().project(this.five.camera)\n\n // 检查是否在视锥体内\n if (projected.x < -1 || projected.x > 1 || projected.y < -1 || projected.y > 1 || projected.z < 0 || projected.z > 1) {\n this.screenPosition = null\n } else if (this.five.renderer) {\n const rendererSize = this.five.renderer.getSize(new THREE.Vector2())\n this.screenPosition = {\n leftPx: ((projected.x + 1) / 2) * rendererSize.x,\n topPx: ((-projected.y + 1) / 2) * rendererSize.y,\n scale: 1,\n }\n }\n\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n /**\n * 应用可见性变化\n */\n public applyVisible() {\n if (this.polygonShape) {\n // 检查 polygonShape 是否还在 imagePlaneGroup 中\n if (!this.plugin.imagePlaneGroup.children.includes(this.polygonShape as any)) {\n console.warn(`[PolygonTag ${this.id}] applyVisible: polygonShape not in imagePlaneGroup, re-adding...`, {\n polygonShapeParent: this.polygonShape.parent?.name || 'null',\n imagePlaneGroupChildren: this.plugin.imagePlaneGroup.children.length,\n })\n // 自动修复:重新添加到 imagePlaneGroup\n if (this.polygonShape.parent) {\n this.polygonShape.parent.remove(this.polygonShape)\n }\n this.plugin.imagePlaneGroup.add(this.polygonShape)\n }\n this.polygonShape.visible = this.visible\n }\n\n // 更新屏幕位置\n this.updateScreenPosition()\n }\n\n /**\n * 销毁标签\n */\n public dispose() {\n // 清理点击事件\n this.cleanupClickEvents()\n\n // 清理 DOM 点击监听\n if (this.domClickDispose) {\n this.domClickDispose()\n this.domClickDispose = undefined\n }\n\n // 清理 Polygon\n if (this.polygonShape) {\n this.polygonShape.removeFromParent()\n this.polygonShape = undefined\n }\n }\n}\n","import * as THREE from 'three/webgpu'\n\nexport type MaskMaterialStyle = {\n color: number[]\n tolerance: number\n highlightColor: number[]\n opacity: number\n}\n\nconst MAX_MASK_STYLES = 64\nconst STRICT_COLOR_MATCH = 0.5 / 255\n\nexport class MaskNodeMaterial extends THREE.MeshBasicNodeMaterial {\n private readonly maskTextureNode: ReturnType<typeof THREE.TSL.texture>\n private readonly maskTexelSize = THREE.TSL.uniform(new THREE.Vector2(1, 1))\n private readonly slots = Array.from({ length: MAX_MASK_STYLES }, () => ({\n color: THREE.TSL.uniform(new THREE.Vector3()),\n highlight: THREE.TSL.uniform(new THREE.Vector3()),\n opacity: THREE.TSL.uniform(0),\n }))\n private styles: MaskMaterialStyle[] = []\n\n public constructor(texture: THREE.Texture) {\n super({ depthWrite: false, depthTest: false, transparent: true })\n this.maskTextureNode = THREE.TSL.texture(texture)\n this.updateMaskTexture(texture)\n\n const uv = THREE.TSL.uv()\n const quarterTexel = this.maskTexelSize.mul(0.25)\n const center = this.maskTextureNode.sample(uv).rgb\n const samples = [\n this.maskTextureNode.sample(uv.add(quarterTexel.mul(THREE.TSL.vec2(-1, -1)))).rgb,\n this.maskTextureNode.sample(uv.add(quarterTexel.mul(THREE.TSL.vec2(1, -1)))).rgb,\n this.maskTextureNode.sample(uv.add(quarterTexel.mul(THREE.TSL.vec2(-1, 1)))).rgb,\n this.maskTextureNode.sample(uv.add(quarterTexel.mul(THREE.TSL.vec2(1, 1)))).rgb,\n ]\n\n // Use imperative TSL variables so style selection emits a flat WGSL body.\n // Chaining 64 nested selects exceeds shader expression nesting limits.\n const selectedStyle = THREE.TSL.Fn(() => {\n const bestScore = THREE.TSL.float(-1).toVar()\n const bestCoverage = THREE.TSL.float(0).toVar()\n const bestOpacity = THREE.TSL.float(0).toVar()\n const bestHighlight = THREE.TSL.vec3(0).toVar()\n\n for (const slot of this.slots) {\n const exactMatch = (sample: typeof center) =>\n THREE.TSL.select(\n THREE.TSL.abs(sample.r.sub(slot.color.r))\n .add(THREE.TSL.abs(sample.g.sub(slot.color.g)))\n .add(THREE.TSL.abs(sample.b.sub(slot.color.b)))\n .lessThanEqual(STRICT_COLOR_MATCH),\n 1,\n 0,\n )\n const coverage = exactMatch(samples[0]).add(exactMatch(samples[1])).add(exactMatch(samples[2])).add(exactMatch(samples[3])).mul(0.25).toVar()\n const score = coverage.add(exactMatch(center).mul(0.001)).toVar()\n THREE.TSL.If(slot.opacity.greaterThan(0).and(coverage.greaterThan(0)).and(score.greaterThan(bestScore)), () => {\n bestCoverage.assign(coverage)\n bestScore.assign(score)\n bestOpacity.assign(slot.opacity)\n bestHighlight.assign(slot.highlight)\n })\n }\n return THREE.TSL.vec4(bestHighlight, bestOpacity.mul(bestCoverage))\n })()\n this.colorNode = selectedStyle.rgb\n this.opacityNode = selectedStyle.a\n }\n\n public updateMaskTexture(texture: THREE.Texture) {\n this.maskTextureNode.value = texture\n const image = texture.image as { width?: number; height?: number } | undefined\n this.maskTexelSize.value.set(1 / Math.max(image?.width ?? 1, 1), 1 / Math.max(image?.height ?? 1, 1))\n }\n\n public appendStyle(style: MaskMaterialStyle) {\n if (this.styles.length >= MAX_MASK_STYLES) throw new RangeError(`A mask supports at most ${MAX_MASK_STYLES} styles`)\n this.styles.push(style)\n this.writeSlot(this.styles.length - 1, style)\n }\n\n public updateStyle(index: number, style: MaskMaterialStyle) {\n if (index < 0 || index >= this.styles.length) return\n this.styles[index] = style\n this.writeSlot(index, style)\n }\n\n public replaceStyles(styles: MaskMaterialStyle[]) {\n if (styles.length > MAX_MASK_STYLES) throw new RangeError(`A mask supports at most ${MAX_MASK_STYLES} styles`)\n this.styles = styles.slice()\n this.slots.forEach((slot, index) => {\n const style = this.styles[index]\n if (style) this.writeSlot(index, style)\n else slot.opacity.value = 0\n })\n }\n\n private writeSlot(index: number, style: MaskMaterialStyle) {\n const slot = this.slots[index]\n slot.color.value.set(style.color[0] / 255, style.color[1] / 255, style.color[2] / 255)\n slot.highlight.value.set(style.highlightColor[0] / 255, style.highlightColor[1] / 255, style.highlightColor[2] / 255)\n slot.opacity.value = style.opacity\n }\n}\n","import { MaskNodeMaterial, type MaskMaterialStyle } from '../../utils/model/MaskNodeMaterial'\nimport type PanoTagPluginController from '..'\nimport type { TagContentType, Tag as TagData, TagInstance, TagClickParams } from '../..'\nimport { BaseTag } from './BaseTag'\nimport * as THREE from 'three/webgpu'\nimport type { PartialObjectDeep } from '../../../typings/typings'\nimport type { Tag } from '../..'\nimport type { State as FiveState } from '@realsee/five-webgpu'\nimport { animate } from 'animejs'\nimport { transformPosition } from '../../../shared-utils/five/transformPosition'\nimport type { BlinkOptions } from '../../../shared-utils/three/blink'\n\nexport type MaskTagInterface<C extends TagContentType = TagContentType> = TagInstance<C, 'Mask'>\n\n\n/**\n * 解析颜色为 RGB 数组\n * 支持:RGB 数组、十六进制数字、十六进制字符串(#FFFFFF 或 #FFF)\n */\nfunction parseColor(color: [number, number, number] | number | string | undefined): [number, number, number] {\n // RGB 数组\n if (Array.isArray(color)) {\n return color as [number, number, number]\n }\n\n // 十六进制数字\n if (typeof color === 'number') {\n return [(color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff]\n }\n\n // 十六进制字符串\n if (typeof color === 'string') {\n // 移除 # 符号\n let hex = color.trim().replace(/^#/, '')\n\n // 支持简写格式 #FFF -> #FFFFFF\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]\n }\n\n // 解析 RGB\n if (hex.length === 6) {\n const r = parseInt(hex.substring(0, 2), 16)\n const g = parseInt(hex.substring(2, 4), 16)\n const b = parseInt(hex.substring(4, 6), 16)\n\n if (!isNaN(r) && !isNaN(g) && !isNaN(b)) {\n return [r, g, b]\n }\n }\n\n console.warn('[MaskTag] Invalid hex color string:', color)\n }\n\n // 默认黑色\n return [0, 0, 0]\n}\n\n/**\n * Mask 类型的标签\n * 基于全景图 mask 和颜色区域进行物体标记\n */\nexport class MaskTag<C extends TagContentType = TagContentType> extends BaseTag<C, 'Mask'> {\n /**\n * Mask 纹理缓存(静态,所有 MaskTag 实例共享)\n * key: mask URL 或 canvas 的 symbol, value: { texture: THREE.Texture, refCount: number, abortController?: AbortController }\n */\n private static maskTextureCache: Map<string | symbol, { texture: THREE.Texture; refCount: number; abortController?: AbortController }> =\n new Map()\n\n /**\n * Canvas 到 Symbol 的映射(用于缓存 canvas 纹理)\n */\n private static canvasSymbolMap: WeakMap<HTMLCanvasElement, symbol> = new WeakMap()\n\n /** 同点位共用 mesh:key = meshKey(panoIndex + maskKey), value = 共享数据 */\n private static sharedMeshRegistry: Map<\n string,\n {\n mesh: THREE.Mesh\n material: MaskNodeMaterial\n maskTexture: THREE.Texture\n maskSource: string | HTMLCanvasElement\n tagsByColorKey: Map<string, MaskTag>\n styleIndexByColorKey: Map<string, number>\n }\n > = new Map()\n\n /**\n * mask 图片 URL 或 Canvas 元素(2:1 全景图格式)\n */\n public maskUrl: string | HTMLCanvasElement\n\n /**\n * 目标颜色(RGB 格式)\n */\n public targetColor: [number, number, number]\n\n /**\n * mask 渲染的 mesh 对象(使用 Sphere)\n */\n public maskMesh?: THREE.Mesh\n\n /**\n * mask 纹理对象\n */\n private maskTexture?: THREE.Texture\n\n /**\n * 是否正在加载 mask\n */\n private loadingMask = false\n\n /**\n * 资源是否已释放\n */\n private _disposed = false\n\n /**\n * 标签样式配置\n */\n private tagStyle?: TagData['style']\n\n /**\n * 点击事件清理函数\n */\n private clickEventDispose?: () => void\n\n /** 当前 tag 在共享 style 纹理中的下标(color 即 id) */\n private sharedStyleIndex = -1\n /** 共享 mesh 的 registry key,用于 updateMaskStyle / dispose 查找 entry */\n private _sharedMeshKey: string | null = null\n\n public constructor(plugin: PanoTagPluginController, tagData: TagData) {\n super(plugin, tagData)\n\n const maskSource = (tagData as any).mask ?? (tagData as any).maskUrl\n this.maskUrl = maskSource instanceof HTMLCanvasElement || (typeof maskSource === 'string' && maskSource) ? maskSource : ('' as string)\n\n const color = (tagData as any).color\n this.targetColor = parseColor(color)\n if (!color) {\n console.warn(`[MaskTag] No color provided for tag ${tagData.id}, using default [0, 0, 0]`)\n }\n this.tagStyle = tagData.style\n this.updateVisible()\n if (this.currentVisible) {\n this.initializeMaskMesh()\n }\n }\n\n private getColorKey(): string {\n return `${this.targetColor[0]},${this.targetColor[1]},${this.targetColor[2]}`\n }\n\n /** 同点位共用一个 mesh,key 仅用 panoIndex(string/canvas 切换时不会因 key 不同而重复创建) */\n private static getMeshKey(panoIndex: number): string {\n return String(panoIndex)\n }\n\n /**\n * 初始化/挂载到同点位共享 mesh,用 appendStyleToMaterial 注册本 tag 的 style(color 即 id)\n */\n private async initializeMaskMesh() {\n if (this._disposed || !this.maskUrl) return\n const panoIndex = this.fiveState?.panoIndex\n if (typeof panoIndex !== 'number') return\n this.loadingMask = true\n try {\n const texture = await MaskTag.loadMaskTexture(this.maskUrl)\n this.maskTexture = texture\n const meshKey = MaskTag.getMeshKey(panoIndex)\n this._sharedMeshKey = meshKey\n let entry = MaskTag.sharedMeshRegistry.get(meshKey)\n const colorKey = this.getColorKey()\n const style = this.buildStyleForMaterial()\n\n if (!entry) {\n entry = MaskTag.createSharedMesh(texture, this.maskUrl, this.plugin)\n MaskTag.sharedMeshRegistry.set(meshKey, entry)\n this.plugin.imagePlaneGroup.add(entry.mesh)\n } else if (entry.maskSource !== this.maskUrl) {\n // 同点位 mask 源从 string↔canvas 切换:只换纹理,不新建 mesh\n MaskTag.releaseMaskTexture(entry.maskSource)\n entry.maskTexture = texture\n entry.maskSource = this.maskUrl\n entry.material.updateMaskTexture(texture)\n }\n\n const idx = entry.styleIndexByColorKey.get(colorKey)\n if (idx !== undefined) {\n this.sharedStyleIndex = idx\n this.maskMesh = entry.mesh\n this.updateStyleSlotInMaterial(entry.material, idx, style)\n } else {\n entry.tagsByColorKey.set(colorKey, this)\n this.appendStyleToMaterial(entry.material, style)\n this.sharedStyleIndex = entry.tagsByColorKey.size - 1\n entry.styleIndexByColorKey.set(colorKey, this.sharedStyleIndex)\n this.maskMesh = entry.mesh\n }\n\n this.setupSharedMeshRaycast(entry)\n this.updateMeshTransform()\n this.setupClickEvents()\n this.updateScreenPosition()\n entry.mesh.visible = true\n } finally {\n this.loadingMask = false\n }\n }\n\n /** 构建用于 mergedTexture 的 style 对象(color 作 id),tolerance 0–255 */\n private buildStyleForMaterial(): MaskMaterialStyle {\n const s = this.getMaskStyle()\n const tol = s.tolerance\n const tolerance255 = tol <= 1 ? tol * 255 : tol\n return {\n color: [this.targetColor[0], this.targetColor[1], this.targetColor[2], 1],\n tolerance: tolerance255,\n highlightColor: s.highlightColor,\n opacity: this.enabled && this.visible ? s.opacity : 0,\n }\n }\n\n private static createSharedMesh(\n maskTexture: THREE.Texture,\n maskSource: string | HTMLCanvasElement,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- 保留参数以统一调用方式\n _plugin: PanoTagPluginController,\n ): NonNullable<ReturnType<typeof MaskTag.sharedMeshRegistry.get>> {\n const material = new MaskNodeMaterial(maskTexture)\n const geometry = new THREE.SphereGeometry(1, 60, 40)\n geometry.rotateY(-Math.PI / 2)\n geometry.scale(-1, 1, 1)\n const mesh = new THREE.Mesh(geometry, material)\n mesh.renderOrder = -1000\n ;(mesh as any).__maskMesh = true\n\n return {\n mesh,\n material,\n maskTexture,\n maskSource,\n tagsByColorKey: new Map(),\n styleIndexByColorKey: new Map(),\n }\n }\n\n /** 仅更新材质中某一 slot 的 style(用于 enable/disable/updateMaskStyle) */\n private updateStyleSlotInMaterial(material: MaskNodeMaterial, styleIndex: number, newStyle: MaskMaterialStyle) {\n material.updateStyle(styleIndex, newStyle)\n this.five.needsRender = true\n }\n\n private setupSharedMeshRaycast(entry: NonNullable<ReturnType<typeof MaskTag.sharedMeshRegistry.get>>) {\n const mesh = entry.mesh\n if ((mesh as any).__maskRaycastSet) return\n ;(mesh as any).__maskRaycastSet = true\n\n let cachedImageData: ImageData | null = null\n let cachedTexture: THREE.Texture | null = null\n const getImageData = (): ImageData | null => {\n const tex = entry.maskTexture\n if (!tex?.image) return null\n if (cachedTexture === tex && cachedImageData) return cachedImageData\n cachedTexture = tex\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n const img = tex.image as CanvasImageSource & { width: number; height: number }\n canvas.width = img.width\n canvas.height = img.height\n ctx.drawImage(img, 0, 0)\n cachedImageData = ctx.getImageData(0, 0, img.width, img.height)\n return cachedImageData\n } catch {\n return null\n }\n }\n\n const originalRaycast = mesh.raycast.bind(mesh)\n mesh.raycast = (raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) => {\n const temp: THREE.Intersection[] = []\n originalRaycast(raycaster, temp)\n if (temp.length === 0) return\n const intersection = temp[0]\n if (!intersection.uv || !entry.maskTexture?.image) return\n const imageData = getImageData()\n if (!imageData) return\n const x = Math.floor(intersection.uv.x * imageData.width)\n const y = Math.floor((1 - intersection.uv.y) * imageData.height)\n const i = (y * imageData.width + x) * 4\n const pixel = [imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]]\n\n const STRICT_MATCH = 0.5 / 255\n for (const [, tag] of entry.tagsByColorKey) {\n if (!tag.enabled || tag.config?.clickable === false) continue\n const [r, g, b] = tag.targetColor\n const gap = Math.abs(pixel[0] / 255 - r / 255) + Math.abs(pixel[1] / 255 - g / 255) + Math.abs(pixel[2] / 255 - b / 255)\n if (gap <= STRICT_MATCH) {\n ;(mesh.userData as any).__lastHitTag = tag\n intersects.push(intersection)\n return\n }\n }\n }\n }\n\n /**\n * 计算法向量\n * Mask 标签返回向上的法向量(因为是贴在 cube 面上)\n */\n public computeNormal(): THREE.Vector3 {\n return new THREE.Vector3(0, 1, 0)\n }\n\n /**\n * 不把共享 mesh 作为 blink 目标,闪烁通过本 tag 的 style opacity 动画实现\n */\n protected getAdditionalBlinkTargets(): any | any[] | null {\n return null\n }\n\n /**\n * 闪烁仅针对本 tag:通过改变本 tag 在 merged texture 中的 opacity 实现\n */\n public override async blink(animeConfig?: BlinkOptions) {\n if (!this.maskMesh || this._sharedMeshKey === null || this.sharedStyleIndex < 0) return\n const entry = MaskTag.sharedMeshRegistry.get(this._sharedMeshKey)\n if (!entry) return\n\n const baseStyle = this.buildStyleForMaterial()\n const baseOpacity = baseStyle.opacity\n const blinkTarget = { opacity: baseOpacity }\n\n const duration = (animeConfig?.duration as number) ?? 300\n const loop = (animeConfig?.loop as number) ?? 4\n\n const instance = animate(blinkTarget, {\n opacity: [0, 1],\n duration,\n ease: (animeConfig?.ease as string) ?? 'inOutQuad',\n alternate: true,\n loop,\n onUpdate: () => {\n const style = this.buildStyleForMaterial()\n style.opacity = blinkTarget.opacity\n this.updateStyleSlotInMaterial(entry.material, this.sharedStyleIndex, style)\n },\n })\n\n try {\n await instance\n } catch {\n // 动画被中断忽略\n } finally {\n this.updateMaskStyle()\n }\n }\n\n /**\n * 更新标签数据\n */\n public set(tag: PartialObjectDeep<Tag<C, 'Mask'>>, deepMerge = true) {\n super.set(tag, deepMerge)\n\n // 更新 style\n if (tag.style) {\n this.tagStyle = { ...this.tagStyle, ...tag.style } as any\n // style.mask 影响高亮颜色等渲染,需更新 shader\n if ((tag.style as any)?.mask) {\n this.updateMaskStyle()\n }\n }\n\n // 更新 mask URL(支持 mask 或 maskUrl 字段):只更新共享 mesh 的 texture,不 unregister\n const newMask = (tag as any).mask ?? (tag as any).maskUrl\n if (newMask && newMask !== this.maskUrl) {\n this.maskUrl = newMask\n this.updateSharedMeshTexture()\n }\n\n // 更新颜色\n if ((tag as any).color !== undefined) {\n this.targetColor = parseColor((tag as any).color)\n // 颜色变化,需要更新 shader uniform\n this.updateMaskStyle()\n }\n\n if (this.maskMesh) this.updateMaskStyle()\n }\n\n /** 供 rebuildEntryMaterial 使用:返回当前 tag 的 style 对象 */\n public getStyleForMaterial(): MaskMaterialStyle {\n return this.buildStyleForMaterial()\n }\n\n /**\n * 重写 getVisible 方法\n * Mask 标签仅在当前点位可见\n */\n public getVisible(fiveState?: Partial<FiveState>) {\n try {\n if (!this.enabled) return false\n if (!this.plugin.state.enabled) return false\n if (!this.fiveUtil.model) return false\n\n // 检查 maskUrl 是否有效\n if (!this.maskUrl) {\n return false\n }\n\n const state = { ...this.five.getCurrentState(), ...fiveState }\n const { panoIndex } = state\n\n // 强制检查:仅当前点位的标签才可见\n if (panoIndex !== this.fiveState?.panoIndex) {\n return false\n }\n\n // 调用父类的可见性检查(mode、距离等)\n return super.getVisible(state)\n } catch (error) {\n return false\n }\n }\n\n /**\n * 重写 computeVisible 方法\n * 增加 Mask 特有的可见性检查逻辑,用于 whyHide 功能\n */\n protected computeVisible(_fiveState?: Partial<FiveState>) {\n const state = { ...this.five.getCurrentState(), ..._fiveState }\n const { panoIndex } = state\n\n // Mask 特有检查:maskUrl 是否有效\n // if (!this.maskUrl) {\n // return {\n // value: false,\n // reason: {\n // type: 'maskUrl invalid',\n // detail: `Mask 标签 ${this.id} 的 maskUrl 无效`,\n // maskUrl: this.maskUrl,\n // },\n // }\n // }\n\n // Mask 特有检查:点位是否一致\n if (panoIndex !== this.fiveState?.panoIndex) {\n return {\n value: false,\n reason: {\n type: 'panoIndex mismatch',\n detail: `Mask 标签仅在当前点位可见。当前点位: ${panoIndex}, 标签点位: ${this.fiveState?.panoIndex}`,\n currentPanoIndex: panoIndex,\n tagPanoIndex: this.fiveState?.panoIndex,\n },\n }\n }\n\n // 调用父类的可见性检查(mode、距离等)\n return super.computeVisible(_fiveState)\n }\n\n /**\n * 点击事件处理\n */\n public onClick(params: Pick<TagClickParams, 'target'>) {\n if (params.target !== 'TagMaskModel') return\n this.unfoldAndFoldOthers()\n }\n\n /**\n * 展开自己,收起其他标签\n */\n public unfoldAndFoldOthers() {\n // 当 popoverConfig.enabled 为 true 时,展开/收起逻辑无效\n if (this.isPopoverConfigEnabled()) return\n\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n this.state.unfolded = !this.state.unfolded\n this.manuallyOperated = true\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n\n if (this.state.unfolded) {\n this.plugin.tags.forEach((tag) => {\n if (tag.id === this.id) return\n tag.fold()\n })\n }\n }\n }\n\n /**\n * 展开标签详情\n */\n public unfold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(true)\n }\n\n /**\n * 折叠标签详情\n */\n public fold() {\n if (this.isPopoverConfigEnabled()) return\n this.setUnfold(false)\n }\n\n /**\n * 设置展开/折叠状态\n */\n public setUnfold(unfolded: boolean) {\n if (this.isPopoverConfigEnabled()) return\n\n const canFold = this.can('fold')\n const canUnfold = this.can('unfold')\n if (canFold && canUnfold) {\n this.state.unfolded = unfolded\n this.hooks.emit(unfolded ? 'unfolded' : 'folded')\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n }\n\n /**\n * 更新屏幕位置\n */\n public updateScreenPosition() {\n if (!this.currentVisible || !this.position || !Array.isArray(this.position)) {\n this.screenPosition = null\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n return\n }\n\n const worldPosition = new THREE.Vector3(...(this.position as [number, number, number]))\n const projected = worldPosition.clone().project(this.five.camera)\n\n if (this.five.renderer) {\n const rendererSize = this.five.renderer.getSize(new THREE.Vector2())\n this.screenPosition = {\n leftPx: ((projected.x + 1) / 2) * rendererSize.x,\n topPx: ((-projected.y + 1) / 2) * rendererSize.y,\n scale: 1,\n }\n }\n\n this.plugin.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n }\n\n /**\n * 应用可见性变化(通过 style opacity 控制展示,共享 mesh 保持 visible)\n */\n public applyVisible() {\n try {\n if (!this.maskUrl) return\n if (this.visible && !this.loadingMask) {\n this.initializeMaskMesh()\n }\n if (this.maskMesh) {\n this.updateMaskStyle()\n this.updateMeshTransform()\n }\n this.updateScreenPosition()\n } catch (error) {\n console.error(`[MaskTag] Error in applyVisible for tag ${this.id}:`, error)\n }\n }\n\n /**\n * 更新 mesh 的位置和旋转(跟随观察者)\n * 参考 itemMask 实现\n */\n private updateMeshTransform() {\n if (!this.maskMesh) return\n\n const panoIndex = this.fiveState?.panoIndex\n if (panoIndex === undefined) return\n\n const observer = this.workUtil.getObserver(panoIndex)\n if (!observer) return\n\n // 设置 mesh 位置和旋转与观察者一致(参考 itemMask)\n this.maskMesh.position.copy(transformPosition(observer.position, this.workUtil.transform))\n this.maskMesh.quaternion.copy(observer.quaternion)\n\n const translation = new THREE.Vector3()\n const quaternion = new THREE.Quaternion()\n const scale = new THREE.Vector3()\n this.workUtil.transform.decompose(translation, quaternion, scale)\n this.maskMesh.quaternion.multiply(quaternion)\n\n this.five.needsRender = true\n }\n\n /**\n * 步骤1:从材质中解析出 styleList\n * @param {MaskNodeMaterial} material - 目标材质\n * @returns {Array} 解析后的 styleList\n */\n private appendStyleToMaterial(material: MaskNodeMaterial, newStyle: MaskMaterialStyle) {\n material.appendStyle(newStyle)\n }\n\n /**\n * 获取 Mask 样式配置(合并用户配置和默认值)\n */\n private getMaskStyle() {\n const userStyle = (this.tagStyle as any)?.mask || {}\n\n // 处理高亮颜色:支持 RGB 数组、十六进制数字、十六进制字符串,或默认蓝色\n let highlightColor: [number, number, number] = [255, 255, 255] // 默认蓝色\n if (userStyle.color !== undefined) {\n highlightColor = parseColor(userStyle.color)\n } else if (userStyle.highlightColor !== undefined) {\n // 兼容旧的 highlightColor 字段\n highlightColor = parseColor(userStyle.highlightColor as any)\n }\n\n return {\n tolerance: userStyle.tolerance ?? 0.001, // 参考 itemMask 默认 0.001(归一化后的值)\n highlightColor: highlightColor,\n opacity: userStyle.opacity ?? 0.6, // 默认 0.6(用于填充区域)\n }\n }\n\n /**\n * 设置点击事件(仅当 raycast 命中本 tag 的 color 时触发)\n */\n private setupClickEvents() {\n if (!this.maskMesh || this.config?.clickable === false) return\n this.cleanupClickEvents()\n const handler = (e: Event) => {\n const hitTag = (this.maskMesh?.userData as any)?.__lastHitTag\n if (hitTag === this) {\n this.plugin.hooks.emit('click', { event: e, target: 'TagMaskModel', tag: this })\n }\n }\n requestAnimationFrame(() => {\n if (!this.maskMesh || !this.plugin.domEvents) return\n this.clickEventDispose = this.addObjectClickHandler(this, this.maskMesh, handler)\n })\n }\n\n /**\n * 清理点击事件\n */\n private cleanupClickEvents() {\n if (this.clickEventDispose) {\n this.clickEventDispose()\n this.clickEventDispose = undefined\n }\n }\n\n /**\n * 重新加载 mask 图:从旧点位 mesh 注销,再按新 maskUrl 初始化\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- 保留参数与 set() 调用一致\n private reloadMask(_oldMaskUrl?: string | HTMLCanvasElement) {\n const panoIndex = this.fiveState?.panoIndex\n const colorKey = this.getColorKey()\n const oldKey = typeof panoIndex === 'number' ? MaskTag.getMeshKey(panoIndex) : this._sharedMeshKey\n\n if (oldKey) {\n const entry = MaskTag.sharedMeshRegistry.get(oldKey)\n if (entry) {\n entry.tagsByColorKey.delete(colorKey)\n entry.styleIndexByColorKey.delete(colorKey)\n if (entry.tagsByColorKey.size === 0) {\n if (entry.mesh.parent) entry.mesh.parent.remove(entry.mesh)\n entry.mesh.geometry.dispose()\n ;(entry.mesh.material as THREE.Material).dispose()\n MaskTag.releaseMaskTexture(entry.maskSource)\n MaskTag.sharedMeshRegistry.delete(oldKey)\n }\n }\n }\n\n this.maskMesh = undefined\n this._sharedMeshKey = null\n this.sharedStyleIndex = -1\n this.maskTexture = undefined\n\n if (this.visible && !this.loadingMask) {\n this.initializeMaskMesh()\n }\n }\n\n /**\n * changeTagById 改 mask 时:只更新共享 mesh 的 texture,不 unregister\n * 有 entry 则换图;无 entry 则走完整初始化\n */\n private async updateSharedMeshTexture(): Promise<void> {\n if (this._disposed || !this.maskUrl) return\n const panoIndex = this.fiveState?.panoIndex\n if (typeof panoIndex !== 'number') return\n const meshKey = MaskTag.getMeshKey(panoIndex)\n const entry = MaskTag.sharedMeshRegistry.get(meshKey)\n if (!entry) {\n await this.initializeMaskMesh()\n return\n }\n if (entry.maskSource === this.maskUrl) return\n const texture = await MaskTag.loadMaskTexture(this.maskUrl)\n this.maskTexture = texture\n MaskTag.releaseMaskTexture(entry.maskSource)\n entry.maskTexture = texture\n entry.maskSource = this.maskUrl\n entry.material.updateMaskTexture(texture)\n this.five.needsRender = true\n }\n\n /**\n * 更新当前 tag 在共享材质中的 style slot(color/style 控制展示)\n */\n public updateMaskStyle() {\n if (!this.maskMesh || this._sharedMeshKey === null || this.sharedStyleIndex < 0) return\n const entry = MaskTag.sharedMeshRegistry.get(this._sharedMeshKey)\n if (!entry) return\n this.updateStyleSlotInMaterial(entry.material, this.sharedStyleIndex, this.buildStyleForMaterial())\n }\n\n /**\n * 更新 Canvas 纹理(仅当 maskUrl 为 Canvas 时有效)\n * 当 canvas 内容发生变化时,调用此方法更新渲染\n */\n public updateCanvasTexture() {\n if (!this.maskTexture || typeof this.maskUrl === 'string') {\n console.warn('[MaskTag] updateCanvasTexture only works for Canvas-based masks')\n return\n }\n\n // 标记纹理需要更新\n if (this.maskTexture instanceof THREE.CanvasTexture) {\n this.maskTexture.needsUpdate = true\n this.five.needsRender = true\n console.log('[MaskTag] Canvas texture updated')\n }\n }\n\n /**\n * 清理当前标签:从共享材质中删除本 tag 的样式槽,并更新材质;\n * 若该点位已无其他 tag 则销毁 mesh 并释放纹理。\n */\n private disposeMaskResources() {\n if (this._disposed) return\n this._disposed = true\n\n this.cleanupClickEvents()\n\n const meshKey = this._sharedMeshKey\n const colorKey = this.getColorKey()\n if (meshKey) {\n const entry = MaskTag.sharedMeshRegistry.get(meshKey)\n if (entry) {\n // 只删除当前这一个标签的样式:从 map 移除\n entry.tagsByColorKey.delete(colorKey)\n entry.styleIndexByColorKey.delete(colorKey)\n if (entry.tagsByColorKey.size === 0) {\n // 该点位已无 tag,销毁 mesh\n if (entry.mesh.parent) entry.mesh.parent.remove(entry.mesh)\n entry.mesh.geometry.dispose()\n ;(entry.mesh.material as THREE.Material).dispose()\n MaskTag.releaseMaskTexture(entry.maskSource)\n MaskTag.sharedMeshRegistry.delete(meshKey)\n } else {\n // 还有其它 tag:从材质中移除本 tag 的样式槽,按剩余 tag 重建 mergedTexture\n MaskTag.rebuildEntryMaterial(entry)\n }\n }\n }\n\n this.maskMesh = undefined\n this._sharedMeshKey = null\n this.sharedStyleIndex = -1\n this.maskTexture = undefined\n this.five.needsRender = true\n }\n\n /**\n * 清理 MaskTag 特有的资源(公开方法)\n */\n public dispose() {\n this.disposeMaskResources()\n }\n\n /**\n * 禁用标签(通过 style opacity=0 隐藏,不拆 mesh)\n */\n public override disable() {\n super.disable()\n this.updateMaskStyle()\n }\n\n /**\n * 启用标签(恢复 style 展示)\n */\n public override enable() {\n super.enable()\n this.updateMaskStyle()\n }\n\n /**\n * 销毁标签(重写父类方法)\n */\n public override destroy(notify = true) {\n this.disposeMaskResources()\n super.destroy(notify)\n }\n\n /**\n * 清除所有点位共享 mesh(重新 load 数据前调用)\n */\n public static clearSharedMeshRegistry(): void {\n MaskTag.sharedMeshRegistry.forEach((entry) => {\n entry.tagsByColorKey.forEach((tag) => {\n tag.maskMesh = undefined\n tag._sharedMeshKey = null\n tag.sharedStyleIndex = -1\n })\n if (entry.mesh.parent) entry.mesh.parent.remove(entry.mesh)\n entry.mesh.geometry.dispose()\n ;(entry.mesh.material as THREE.Material).dispose()\n MaskTag.releaseMaskTexture(entry.maskSource)\n })\n MaskTag.sharedMeshRegistry.clear()\n }\n\n /**\n * 将 style 列表写入材质(用于重建材质)\n */\n private static writeStyleListToMaterial(material: MaskNodeMaterial, styleList: MaskMaterialStyle[]): void {\n material.replaceStyles(styleList)\n }\n\n /**\n * destroy 后重建该点位材质,更新剩余 tag 的 styleIndex\n */\n private static rebuildEntryMaterial(entry: NonNullable<ReturnType<typeof MaskTag.sharedMeshRegistry.get>>): void {\n const tags = Array.from(entry.tagsByColorKey.values()).sort((a, b) => a.sharedStyleIndex - b.sharedStyleIndex)\n if (tags.length === 0) return\n const styleList = tags.map((t) => t.getStyleForMaterial())\n MaskTag.writeStyleListToMaterial(entry.material, styleList)\n tags.forEach((t, i) => {\n t.sharedStyleIndex = i\n entry.styleIndexByColorKey.set(`${t.targetColor[0]},${t.targetColor[1]},${t.targetColor[2]}`, i)\n })\n }\n\n /**\n * 获取 mask 的缓存 key\n * @param maskSource mask URL 或 Canvas\n * @returns 缓存 key\n */\n private static getMaskCacheKey(maskSource: string | HTMLCanvasElement): string | symbol {\n if (typeof maskSource === 'string') {\n return maskSource\n } else {\n // Canvas 使用 WeakMap 存储的 symbol 作为 key\n let symbol = MaskTag.canvasSymbolMap.get(maskSource)\n if (!symbol) {\n symbol = Symbol('canvas-mask')\n MaskTag.canvasSymbolMap.set(maskSource, symbol)\n }\n return symbol\n }\n }\n\n /**\n * 加载 Mask 纹理(静态方法,支持缓存和引用计数)\n * @param maskSource mask 图片 URL 或 Canvas 元素\n * @returns Promise<THREE.Texture>\n */\n private static async loadMaskTexture(maskSource: string | HTMLCanvasElement): Promise<THREE.Texture> {\n const cacheKey = MaskTag.getMaskCacheKey(maskSource)\n\n // 检查缓存\n const cached = MaskTag.maskTextureCache.get(cacheKey)\n if (cached) {\n // 增加引用计数\n cached.refCount++\n return cached.texture\n }\n\n // 性能监控:记录开始时间\n const loadStartTime = performance.now()\n\n // 创建 AbortController 用于取消加载\n const abortController = new AbortController()\n\n try {\n let texture: THREE.Texture\n\n if (typeof maskSource === 'string') {\n // 从 URL 加载纹理\n const textureLoader = new THREE.TextureLoader()\n\n texture = await new Promise<THREE.Texture>((resolve, reject) => {\n // 检查是否已取消\n if (abortController.signal.aborted) {\n reject(new Error('Load aborted'))\n return\n }\n\n textureLoader.load(\n maskSource,\n (tex) => {\n if (abortController.signal.aborted) {\n tex.dispose()\n reject(new Error('Load aborted'))\n } else {\n resolve(tex)\n }\n },\n undefined,\n (error) => {\n reject(error)\n },\n )\n\n // 监听取消信号\n abortController.signal.addEventListener('abort', () => {\n reject(new Error('Load aborted'))\n })\n })\n } else {\n // 从 Canvas 创建纹理\n texture = new THREE.CanvasTexture(maskSource)\n // 重要:标记纹理需要更新,确保上传到 GPU\n texture.needsUpdate = true\n console.log('[MaskTag] Created texture from canvas, size:', maskSource.width, 'x', maskSource.height)\n }\n\n // 性能优化:配置纹理参数\n texture.wrapS = THREE.ClampToEdgeWrapping\n texture.wrapT = THREE.ClampToEdgeWrapping\n\n // Mask 依赖精确颜色作为标签 ID,使用最近邻过滤避免颜色在边界处被插值污染\n texture.minFilter = THREE.NearestFilter\n texture.magFilter = THREE.NearestFilter\n\n // 性能优化:生成 mipmap(如果需要)\n // 注意:对于需要精确颜色匹配的 mask 图,不建议使用 mipmap\n // texture.generateMipmaps = false\n\n // 性能优化:设置各向异性过滤(提升倾斜角度观看的质量)\n // 适度的各向异性过滤可以在不显著增加性能开销的情况下提升质量\n texture.anisotropy = 4\n\n // Canvas 纹理需要确保立即更新\n if (texture instanceof THREE.CanvasTexture) {\n texture.needsUpdate = true\n }\n\n // 缓存纹理\n MaskTag.maskTextureCache.set(cacheKey, {\n texture,\n refCount: 1,\n abortController,\n })\n\n // 性能监控:记录加载时间\n const loadTime = performance.now() - loadStartTime\n const sourceDesc = typeof maskSource === 'string' ? maskSource.substring(0, 50) : 'Canvas'\n console.log(`[MaskTag Performance] Texture loaded in ${loadTime.toFixed(2)}ms, source: ${sourceDesc}`)\n\n // 内存监控:记录纹理信息\n if (texture.image) {\n const memoryMB = (((texture.image as { width: number; height: number }).width * (texture.image as { width: number; height: number }).height * 4) / (1024 * 1024)).toFixed(2)\n console.log(`[MaskTag Memory] Texture size: ${(texture.image as { width: number; height: number }).width}x${(texture.image as { width: number; height: number }).height}, estimated memory: ${memoryMB}MB`)\n }\n\n return texture\n } catch (error) {\n const sourceDesc = typeof maskSource === 'string' ? maskSource : 'Canvas'\n console.error('[MaskTag] Failed to load mask texture:', sourceDesc, error)\n throw error\n }\n }\n\n /**\n * 释放 Mask 纹理(静态方法)\n * @param maskSource mask 图片 URL 或 Canvas 元素\n */\n private static releaseMaskTexture(maskSource: string | HTMLCanvasElement): void {\n const cacheKey = MaskTag.getMaskCacheKey(maskSource)\n const cached = MaskTag.maskTextureCache.get(cacheKey)\n if (!cached) return\n\n // 减少引用计数\n cached.refCount--\n\n // 如果引用计数为 0,释放纹理\n if (cached.refCount <= 0) {\n // 性能监控:记录释放的纹理\n const sourceDesc = typeof maskSource === 'string' ? maskSource.substring(0, 50) : 'Canvas'\n console.log(`[MaskTag Memory] Releasing texture (refCount=0): ${sourceDesc}`)\n\n // 取消加载(如果还在加载中)\n cached.abortController?.abort()\n\n // 释放纹理资源\n cached.texture.dispose()\n\n // 从缓存中移除\n MaskTag.maskTextureCache.delete(cacheKey)\n }\n }\n\n /**\n * 获取当前缓存的纹理统计信息(用于性能监控和调试)\n * @returns 缓存统计信息\n */\n public static getCacheStats(): {\n totalCached: number\n totalRefCount: number\n estimatedMemoryMB: number\n cacheEntries: Array<{ source: string; refCount: number; sizeMB: number }>\n } {\n let totalRefCount = 0\n let estimatedMemoryMB = 0\n const cacheEntries: Array<{ source: string; refCount: number; sizeMB: number }> = []\n\n MaskTag.maskTextureCache.forEach((cached, key) => {\n totalRefCount += cached.refCount\n\n // 估算内存占用\n let sizeMB = 0\n if (cached.texture.image) {\n const width = (cached.texture.image as { width?: number; height?: number }).width || 0\n const height = (cached.texture.image as { width?: number; height?: number }).height || 0\n sizeMB = (width * height * 4) / (1024 * 1024) // RGBA 4 bytes per pixel\n estimatedMemoryMB += sizeMB\n }\n\n // 根据 key 类型生成描述\n const sourceDesc = typeof key === 'string' ? key.substring(0, 80) : '[Canvas]'\n\n cacheEntries.push({\n source: sourceDesc,\n refCount: cached.refCount,\n sizeMB: parseFloat(sizeMB.toFixed(2)),\n })\n })\n\n return {\n totalCached: MaskTag.maskTextureCache.size,\n totalRefCount,\n estimatedMemoryMB: parseFloat(estimatedMemoryMB.toFixed(2)),\n cacheEntries,\n }\n }\n\n /**\n * 强制清理所有缓存的纹理(用于内存管理,谨慎使用)\n * 注意:这会释放所有纹理,即使它们仍在使用中\n */\n public static clearAllCache(): void {\n console.warn('[MaskTag] Clearing all texture cache')\n\n MaskTag.maskTextureCache.forEach((cached) => {\n cached.abortController?.abort()\n cached.texture.dispose()\n })\n\n MaskTag.maskTextureCache.clear()\n }\n}\n","<!-- 图文标签 -->\n<script lang=\"ts\">\n import type { PointTagInstance } from '../../../typings'\n import Audio from '../../Common/Audio.svelte'\n import AudioIcon from '../../Common/Icon/audioIcon.svelte'\n import { createEventDispatcher } from 'svelte'\n\n export let playing = false\n export let tag: PointTagInstance<'Audio'>\n \n // 接收来自 TagPoint 的事件处理器\n export let handlePointClick: (event: MouseEvent) => void = () => {}\n export let handleMouseEnter: (event: PointerEvent) => void = () => {}\n export let handleMouseLeave: (event: PointerEvent) => void = () => {}\n \n const dispatch = createEventDispatcher()\n \n // 音频事件处理器\n const audioEventHandlers = {\n audioRef: (event) => dispatch('audioRef', event.detail),\n play: () => {\n playing = true\n dispatch('play')\n },\n pause: () => {\n playing = false\n dispatch('pause')\n },\n error: () => {\n playing = false\n dispatch('pause')\n },\n timeupdate: (event) => dispatch('timeupdate', event.detail),\n duration: (event) => dispatch('duration', event.detail)\n }\n</script>\n\n<Audio\n url={tag.data.audioUrl}\n enable={tag.state.visible}\n style=\"width: max-content; height: max-content;\"\n hooksInfo={{ tag }}\n on:play={audioEventHandlers.play}\n on:pause={audioEventHandlers.pause}\n on:error={audioEventHandlers.error}\n on:timeupdate={audioEventHandlers.timeupdate}\n on:duration={audioEventHandlers.duration}\n on:audioRef={audioEventHandlers.audioRef}\n>\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div \n class=\"audio-tag-point\"\n on:click={handlePointClick}\n on:pointerenter={handleMouseEnter}\n on:pointerleave={handleMouseLeave}\n >\n <AudioIcon {playing} width={24} />\n </div>\n</Audio>\n\n<style>\n .audio-tag-point {\n position: relative;\n width: max-content;\n height: max-content;\n padding: 4px;\n border-radius: 100%;\n border: 1px solid rgba(255, 255, 255, 0.6);\n background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.2));\n box-shadow: inset 0 0 4px 0 rgba(255, 255, 255, 0.3);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n</style>\n","<svelte:options accessors/>\n\n<script lang=\"ts\">\n import type { PointTagInstance, Tag, TagHooks } from '../../typings'\n import Shadow from './Shadow.svelte'\n import Icon from './Icon/Icon.svelte'\n import { Image_Default_Point } from '../../Assets/Icon'\n import { getContext, createEventDispatcher } from 'svelte'\n import { isModelLike } from '../../../shared-utils'\n import AudioPoint from '../Tag/AudioTag/AudioPoint.svelte'\n import { noTypecheck } from '../../utils'\n import type { SharedAudio } from '../../utils/audio/SharedAudio'\n\n const hooks = getContext<TagHooks>('hooks')\n const dispatch = createEventDispatcher<{\n audioInstanceReady: SharedAudio\n audioPlay: undefined\n audioPause: undefined\n audioTimeUpdate: number\n audioDuration: number\n }>()\n\n export let tag: PointTagInstance\n\n let timeout: NodeJS.Timeout | undefined\n let animating = false\n\n const setAnimating = () => {\n if (timeout !== undefined) clearTimeout(timeout)\n animating = true\n timeout = setTimeout(() => {\n animating = false\n }, 800)\n }\n\n const handlePointClick = (event: MouseEvent) => {\n if (animating) return\n if (tag.entryFromModel && isModelLike(tag.five.state.mode)) {\n tag.find({ targetMode: 'Panorama' }).then(() => tag.unfoldAndFoldOthers())\n } else {\n hooks.emit('click', { event, target: 'TagPoint', tag })\n }\n }\n\n $: unfolded = tag.state?.unfolded\n $: folded = !unfolded\n $: setAnimating()\n $: url = tag.style?.point?.url ? tag.style?.point : { url: Image_Default_Point }\n $: width = (() => {\n const pointWidth = tag.style?.point?.width\n if (typeof pointWidth === 'number') return pointWidth\n return 20\n })()\n\n const foldDelay = (() => {\n if (tag.contentType === 'Text' && (tag as Tag<'Text'>).data.appearance === 'plane') return 500\n return 800\n })()\n\n export let tagPointClickHelper: HTMLElement | null = null\n export let handleMouseEnter: (event: PointerEvent) => void = () => {}\n export let handleMouseLeave: (event: PointerEvent) => void = () => {}\n export let handleTagPointClick: (event: MouseEvent) => void = () => {}\n\n const defaultBeforeHover = () => true\n const beforeHover = tag.config.popoverConfig?.beforeOpen ?? defaultBeforeHover\n const onHoverEnd = tag.config.popoverConfig?.onHoverEnd\n\n $: isAudioTag = tag.contentType === 'Audio' && (tag as PointTagInstance<'Audio'>).data.appearance === 'plane'\n\n // 音频实例引用\n let audioInstance: SharedAudio | null = null\n export { audioInstance }\n\n // 音频事件处理器\n const audioEventHandlers = {\n audioRef: (event: CustomEvent<SharedAudio>) => {\n audioInstance = event.detail\n dispatch('audioInstanceReady', audioInstance)\n },\n play: () => dispatch('audioPlay'),\n pause: () => dispatch('audioPause'),\n timeupdate: (e) => dispatch('audioTimeUpdate', e.detail),\n duration: (e) => dispatch('audioDuration', e.detail)\n }\n</script>\n\n<!-- svelte-ignore a11y-click-events-have-key-events -->\n<div class=\"tag-point-wrapper\" class:unfolded class:folded class:disable-unfold={tag.isPopoverConfigEnabled()}>\n <!-- 标签比较小,加一个大一点的点击区域 -->\n {#if !isAudioTag}\n <div\n class=\"tag-point-click-helper\"\n on:click={(event) => {\n handleTagPointClick(event)\n handlePointClick(event)\n }}\n on:pointerenter={(event) => {\n if (beforeHover(tag)) {\n handleMouseEnter(event)\n }\n }}\n on:pointerleave={(event) => {\n handleMouseLeave(event)\n onHoverEnd?.(tag, event)\n }}\n bind:this={tagPointClickHelper}\n />\n {:else}\n <!-- 音频标签不需要点击辅助区域,事件由 AudioPoint 处理 -->\n <div class=\"audio-tag-point-click-helper\" bind:this={tagPointClickHelper} />\n {/if}\n <!-- 标签点阴影 -->\n <Shadow center blurRadius={15} spreadRadius={5} opacity={0.3} />\n <!-- 有两层,一层是标签展开时的小点,一层是标签收起时的大圈 -->\n <!-- 小点 -->\n <div class=\"tag-unfolded-point\" style:transition-delay={(folded ? foldDelay : 0) + 'ms'} />\n <!-- 大圈 -->\n <div class=\"tag-folded-point\" style:transition-delay={(folded ? foldDelay : 0) + 'ms'}>\n {#if isAudioTag}\n <AudioPoint\n tag={noTypecheck(tag)}\n handlePointClick={(event) => {\n handleTagPointClick(event)\n handlePointClick(event)\n }}\n handleMouseEnter={(event) => {\n if (beforeHover(tag)) {\n handleMouseEnter(event)\n }\n }}\n handleMouseLeave={handleMouseLeave}\n on:audioRef={audioEventHandlers.audioRef}\n on:play={audioEventHandlers.play}\n on:pause={audioEventHandlers.pause}\n on:timeupdate={audioEventHandlers.timeupdate}\n on:duration={audioEventHandlers.duration}\n />\n {:else}\n <Icon icon={url} {width} on:iconLoaded />\n {/if}\n </div>\n</div>\n\n<style lang=\"scss\">\n .tag-point-click-helper {\n position: absolute;\n pointer-events: auto;\n cursor: pointer;\n width: calc(141%);\n height: calc(141%);\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n z-index: 1000000;\n }\n // 音频标签的辅助区域仅用于绑定引用,不处理任何事件\n .audio-tag-point-click-helper {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1;\n }\n .tag-point-wrapper {\n pointer-events: none;\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n z-index: 1040;\n }\n\n .tag-folded-point,\n .tag-unfolded-point {\n transition: all 0.5s;\n }\n\n .tag-point-wrapper {\n .tag-unfolded-point {\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n &:after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 5px;\n height: 5px;\n border-radius: 50%;\n background-color: white;\n }\n &:before {\n content: '';\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background-color: rgba(0, 0, 0, 0.2);\n }\n }\n }\n\n /** 动画 */\n .tag-point-wrapper.folded {\n .tag-folded-point {\n opacity: 1;\n scale: 1;\n }\n .tag-unfolded-point {\n opacity: 0;\n scale: 1;\n }\n }\n\n .tag-point-wrapper.unfolded {\n .tag-folded-point {\n opacity: 0;\n scale: 0.2;\n }\n .tag-unfolded-point {\n opacity: 1;\n scale: 1;\n }\n }\n\n /* 当启用了popover时,强制保持折叠状态的样式 */\n .tag-point-wrapper.disable-unfold {\n .tag-folded-point {\n opacity: 1 !important;\n scale: 1 !important;\n }\n .tag-unfolded-point {\n opacity: 0 !important;\n scale: 1 !important;\n }\n }\n</style>\n","// base64 encoded PNG images for tag popover arrows\nexport const tagPopoverArrowDarkBottom =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAMKADAAQAAAABAAAAHgAAAAC3G9N3AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACfklEQVRYCe2Yu2tVQRCHb1QQFQRBKzEkooJoISL+ATYW/kXBSrBKLxZaidaKhSCxs1Asg4qgRhHBB6IkKr4f3yd3vCfHezfnsTGnuD/4ZWf3zO7M7M4+biZ6vd5muBsehydg1/EdB6/3uTBR8vYg9dPQoLqILzg1A++Gc+tD6JevKR/AY/BXB3kSn+bhX5QD8MNLuAnugz87xMv4cg0uw7AAVDDKo3Ar7MJKPMWPWeiELsOoAFS8D00l98laBvEN+6fgO/gPRgWg4iL8Ct3Ya5lKl7B/Bw7FhqGtg8ariAZwYND0X6V7WNOHkVg38svgw1nED/2qyykDIRfLsmy93Falvza1nUQqhaLjZ4Q38HA0UOqQ+0LExoqy2PaDipNkGfp+r9L/PHqPVE6hSgD2fw63w51QR7wN3dw6EqVOhhylQSmL0K3S/zb6ydT5MyJ/qgagvhfcEbjRCogZjzLVFjqWRbnYJ+S3CGegAa+IOgE44DPo/RCOrEZp3r+ClVAnAAd0djy5puBqOD/HuLdgZdQNwIEfQ4/WLdB8zsUXjHUBRoohrowmAWhgAbofRI6VMD3PwSUHrIMmATi+Z7S39B6YYwV8pHlp1UbTADTkhp6GPvjarMIT+l+BjdAmAA1q/FDfsmOZCuVgUu3v0b8IvSwboW0AGvaVuDdh3YCGwXYvK1eyMdoGoGF/xW2D3tTl2U/V59G/CVvBMz0HbjDILujRWgUfUbJPa+RYAZ0w970998Mqp5I/D30gtkauAHTEH0BuyimYSp05vj+EWZAzAB1yP/jc2AFNz2Ign6ibNj4KsyGeutkGLAw0iewdIfx/jkeuz/AxxjMwnoGMM/AbzDbNM/bhiRQAAAAASUVORK5CYII='\n\nexport const tagPopoverArrowDarkTop =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAMAAABdem3zAAAAb1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABt6r1GAAAAJXRSTlMApb6gupm3s7CprZWRfoeOg4qdenZzLG9ka04KJR4EET04MBlfDzTkzgAAAMpJREFUOMvd0dsSgiAQBuA1o7KMTJRUEE+9/zOGjhmjIHvdtyizM1zAv/C3lOS8BjxZlNpbAhJ/zTig1PkCdS1RZotSgF/FDBXiAXcT8z6jyZLp5PfPGthXJCsF7GrpRgs7BvrcoAM4qexhkSl3orGVM1t5c5COEVPiQIU9UZISvXRNi6S/3pptF87S8dNl9p1lxCQIw2CsadfMnmwHzoJdbJNo5LHKto6uHlENBhVfvGJlJnpGMLLtTyg9zPj5iHLhoAmeHw9YORcf/XMbuOSlzkgAAAAASUVORK5CYII='\n\nexport const tagPopoverArrowDarkLeft =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAwCAYAAAAGlsrkAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAMAAAAACmbYh+AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACtUlEQVRYCcWXzUtWQRSHb1ZWL1FYIH2AkSaEBbkMsTYFQVCbdkVQ7Vr3L/RXRQURIrVopxAuBEmIwCBqkfZBz2/0yLV35oz39X4c+HnHuXPOM2c+ztWi6MZ6Q91wi/GuwLe6SPgy0NdtZzwN9LmyPaAfLZg4j9A9tB+1Ah6D8wyNC2jWdMZ3AT1Ahwxoz6bAIwCeoisoyoh22qwGfF7F7zE66vnXCe4Buo9m0UEPqnd1gSeJ9QSNKij2C7nwvYLlfxupElWKVWkwwct2ml8eorOlzt9b7cOlvmhzUPA1oinT/6+J4oUCEaWVOquCdU1UfSZQDKCM1V/rHqu4qyAcQSmzRNyDJWcbmAqkfl2Tm0jg3PjaMladvYOOb0GzmTBOlh3nZaAMdU3Ke5nbO4uXG1ekvseTAG+gqmbXKeuXAs9kPeMDLOPsUsfA2le3wMeZodcy1lK7FgMfcz3yL//khxTJPU755pZQS10+jKk4UfB6cvRmRXJeh1cDZ7yMuwf3wFZAcisTzVjOb7zozjs71QMdLsVdQq8cwJ5feQfhC9FX0Xmk76vdAPmoHdNf+vch+1zGxoQ+D4x/8Q0tIN3rU8j2LhXQTrXFTY0bsgHETJr26yNaQ+eQskkFVMaC6+mtzK7AxAimpV9EZ9AJFIMLqv7cylQCE6/4iT6gDXQBGcgm0UjGcLZthZayn0AqsQamGSZTe8YKbPaDxjukrJW94LYCte4xcftMAB083fuLSAdPcFlth2szXPznV7rn0Uk0hhpdauLvMF07HbzP6BIaRrb3fc/d3GP8K9knRs8h3XkVnT6o+poAEzdcu7c8de3sz+IdE2gKLLhMB+89mkL6L2Qb3jQYVqj3L3nqPxBNIMDbAMMKtVsHTx+c60gHr3XTnr9oK+NydvrYjHYB1iS+l2fSZrv3D/+KTyvCdHWgAAAAAElFTkSuQmCC'\n\nexport const tagPopoverArrowDarkRight =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAwCAYAAAAGlsrkAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAMAAAAACmbYh+AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACpklEQVRYCcWYPYwOURSGP38Rv4lEsZoVkq0oNEQjEopNFCQSlUIkJCqFUiLR0ah1SIROgWQLQSNBKUIhGwUNUZD4K/w/b3wnmZ1v7tx3xsw4ybsz994z57nn3J9lR6PRaCUa3BZD3Dw4FaDAs/8DLOYdtHVouDJeis6hbUPClwA7gjSBPWgFeop+oV5NwKIdoHEBTRc7+3iPjJXhb6TnWqTsv6EXqBcrZxwQrfthdBqti84unylwMLbwch7tjI6unjmwOKvRCXQMdXbLOeDvAGXb0Rk0o8a/WtXm0iaLjabNJskWoeVoB9IeeIlijNdm5mS8bBzyRyH0Xt5PoQ2FvkavDjhKXQ48RcdJtKs84LQdcGSs8pZNS7UPaeM1OnYOODIulro8gY10HEf2LxsHXJdxcQJraBxE+1H22DlgBf+J6jKWT1RGWR9F0+pMmQNWQK1l1Rqn4q5i4BBKlt4Bp4I7/Tp2M1WODjjWOFfqqvjq240mquWAVWqt8cTH9Dmm225T2dEB6xutcc6iMlV+gi8wF9xkVy8ApBou2Mk4xVD/x/KgA44Stl3jz0BftwHHxdB2Vz8sQ9V2Mo7v2mR8j4/nI0Dx6QRTqZV1LuPwU/wv6DaaKLEGZQ44Sv33i/TPmNwzXO6ir2lXDxyZaJJ1WWvsFhI4a00yroO+gnQDfcgSxw4OuC5jXSxz6IELDD8HLN+qm+st/VfRGzk0NQesTRM3V5Rbx0SZRrsp19rVxaDvaVxC88XONu9OxrHGjwBcR7XHxJ2EA9Zdexk9doM6fjnwc4JcRPYxcaDySYG1aa4hXQi9WBVYl4H+HJG8Z7uYSRl8k6BXUOtj4k4qwNqpZ9ET98Mu/O4TJPkP7y4AVTF0I61HKvGgJvAn9G5Q6hiW/Z9dH5P6A8K2bfEUA9VoAAAAAElFTkSuQmCC'\n\nexport const tagPopoverArrowLightBottom =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAMKADAAQAAAABAAAAHgAAAAC3G9N3AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACfElEQVRYCe2XP2sVQRTFd0VsIgmpTAqx1EAStLAIpowgFmohFkEQ0+UbBEEJCpJvkE4REguVoBY2EaysLJSkSCzFQq1EMQg2z9+Jc2EyziSzb/eZJ7wLlzv37v1zzuy82aRstVr9RVGModfQGfR/kHuAfICulz5ayJzBf4oe9uNdtP4BlktlWb42TDsIKAiJs5gnltBl9jLgV31MfxHQQ0jcxsz6iV2wXgT8rRBHisAhEl+gI2HBPvkbzD0PgV/h/CgBJfEWjmOeoyKznyLQFwD/PgYiSUDJkLiOmYsV/sPYAuDvp+btSkBFkFDx6VSDDsffAF6bmJQcAkNUP0J1tbZcJ6uTr7VZPba1nxuLhblhT12ZVyDwWYkpsaLU8+04b0FX651dk5p/eBPwO67M2IiDsWAYUyNITBCfCp91yH+ZA16zs96AEiGgPzkW0SPyOyhf6D0Lge85M7IJqBkkxjELOY1r5MwBfi23PusIWTM1hsRj/IsWa9g+qwJesysRcGCXsaPoUec3ZT7SSL0rSaUjZJ15C8dYz6NNfaX1tZ1n9z9gK0lbBDQBErpapytNSyc/BPyeV2asvJ0jtN1HAyGho3QC9T9Util+TDVhXDHJZrvgVWxNta4sENDVegPtq1z8p2ALcxcCWVdmbEYtAmoIiVOYq7HmGbElwL/NyEumtH2ErKMAQEJ/ep+0WKZ9Vxe85tQm4MCuYIfRQefvZb6SoJracqB2Bxqwk7oGBUg2R1dcDen1pPZvwB/PURrHP+fHIuvVJo6O9W2UgJq638Mky34b4uxP7CvAR/81DHKz3cYJ2GSI6Gs94Pxv2E9NHRub0bO9HejtQFH8BvWooa9jGY/wAAAAAElFTkSuQmCC'\n\nexport const tagPopoverArrowLightTop =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAMAAABdem3zAAAAgVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9d3yJTAAAAK3RSTlMA/Pfx6+XZ39TIwry2sJ+qpY3Ok4jNgpl8dnEGmEUfDi5hOycxmn5YGGhjcHcwqwAAAMZJREFUOMvd0e0OgiAUgGEqs9IiLdNCRQS/6v4vMGrNofJxfvfIzuZ2fugL+ls5ZYwiOPEk0ktA95vHD4Pt0/uIgr6fpCOSI7c+UfSAH4gnGtd+lVwnkgrZkSzLCnmK75QPse+XeKG0FsXRAqaWovFZIza3rU9atWmfHQ2YoWgUGkT6tl1g1GmLHiw0bYfgcrvI8xlyyqG+BwOaw3srvCjqO8zaCn/n4IvJFYdbp1C98NQDSJWiG5CxLffWIB5HUsXbFVjLqzcmgh9KFWWqZgAAAABJRU5ErkJggg=='\n\nexport const tagPopoverArrowLightLeft =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAwCAYAAAAGlsrkAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAMAAAAACmbYh+AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACiElEQVRYCcWYsUscQRSH74LaBE60MU2wsBALBQsbTSuEFCkCKmghYmUjdmohiIUpU6WxSZEQQrqkjZA/IEXESksREbEQBRFEOL+nOzK3O7NvvNudG/g5s29m3je/mbnz2EqlDaVer9detIEryOF2geejG2abJ9BdVDDASXQeDQyoC22hS3SDyncMZBDtInH6BC71cgFa4Cx/o6H0mXakA0U8A3xFno9oHHW5chbuGOgkoJ9ozAU0scIcA6yRdAW9Q06XBip1IWCgI+RaRa8lKaX+WPn/tgQGKM7m0BRSXdrLaBoMtJ9Ey2jATpi0q45YQ6gpMFC5QLPoZUO2Zzw8CwxQLtAikjPN29rizhjoKLAZ1IO00vpWAxRnH5B8LqWtugkZk7vVQOUCCbQPmaK6YaA6xgsGKuf4HqXPMsSxWaS3dn5lAh1kxlvPLNUN89TFOcFMfOOBhobVxWXAybnKx8ZXVDdMVMdkwEzq9hGTuOpGmf/Q7QJr81Q3JFAX5wJfauSAfnVxLvApiW9ykqtumKuOyYCr1eotE//mgEO6mnJcAX5I9j8egprUM68hnHFseoH/p/0VXZhYUqvbyDh1jBcsEOBHVJ/RnjwXWXLBApIzRz9ofkPXEgso6nGoYANJtn6b5wMTy6lb2+p0YuBX6BPx70huv68U59gmAJcbv4mO7bjVLtaxldhcvHViv+x4aDv4jF0JcS4X7wt9a+jMGlPOVluAhybwfRpLaDfpU7daHZAkCq74fy6/uTdQL+pE8tMprc6WtpqEmZJcvGk6/mU6YwVwv4AO0QlqeCNQ+hoAOl9FlA4WAPD4L19sZywg7uumFDz+CzazAJzvmHbUGvBEVKCBAa7dA6h+CDnUpjBPAAAAAElFTkSuQmCC'\n\nexport const tagPopoverArrowLightRight =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAwCAYAAAAGlsrkAAAAAXNSR0IArs4c6QAAAFBlWElmTU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAMAAAAACmbYh+AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAACXElEQVRYCcWYQSgFQRjHdyUlRU5ykCMOxMHJSXlnV4nk7OTISRw8N7koJSeKg+Ig5R3l4kBOHF8u5KD3IoVa/692XtPXzOz3Ztfu1jQz35v5ft//2++1uxNEUdQZFHC1gDlcADcg8EIR4ACp/kWbyB0eg9/Ql3KFx+Av9DW0dbS2XAJgYFJeQRv4bzgVF7+GYDgHfJH/kOU8JMVw+IP2bWg3sK2EYfiCPtPLpFgHjGNyguAyL7wkxXomLhDENtTX9ch8x0mKyW8UO59Cvwv1I/E8VScBhxqhB+MyFR5aqr+dBKxxG8NpjDYB729YmhxIwCrV3HUfDGuAexWeBKynmsMp3bOAL6M19XiVgG2K9SAGMVkFfEw3usYSsEux7rsDkznAZ9ASC08C1p1LxqNYtAS4s/AkYEmq+ZpuwOddqZeAJSptt6MEuPFJJwHbnEoCojWTpnsuAfM0moCuNe3Y0Ms3ScBpFROzywfsUqP8NR2cRLFy7uqTgqvxzRKwRI1rTR3P8KoPOEkN98nn19xA86wU24K7hNonE7jVZPSw8VS/w8epKcXKtwRsU6N8UK+vucecoPTWar0kYK7G5IzWfKIdA3hnWsBtErCuhu9X80cM9gEVv4FKwC7FlM4jAK9UBNJeArb5esYPO4BWbQtcdgnYlOozOD0E1FlAacH6/ldMtgB80I0+Y4lidY8rAGT2CSMBfwC44VNArkwkgW+x+V8+U21gKpoyVB64ok71G96H6NRHnYHkdhShjpsUOPfDl8KOmwo5YNtLVSS+m1FY+aulYAFu6rvWVyDf9wc6+wpavsNbLQAAAABJRU5ErkJggg=='\n","<script lang=\"ts\">\n import {\n tagPopoverArrowLightRight,\n tagPopoverArrowLightLeft,\n tagPopoverArrowLightTop,\n tagPopoverArrowLightBottom,\n tagPopoverArrowDarkRight,\n tagPopoverArrowDarkLeft,\n tagPopoverArrowDarkTop,\n tagPopoverArrowDarkBottom,\n } from '../Icon/tag-popover-arrow-base64'\n\n // 箭头方向,如 top, bottom, left, right\n export let direction: string = 'bottom'\n // 是否显示箭头\n export let show: boolean = true\n // 主题\n export let theme: 'dark' | 'light' = 'dark'\n\n $: arrowImage = (() => {\n switch (theme) {\n case 'dark':\n switch (direction) {\n case 'top':\n return tagPopoverArrowDarkTop\n case 'bottom':\n return tagPopoverArrowDarkBottom\n case 'left':\n return tagPopoverArrowDarkLeft\n case 'right':\n return tagPopoverArrowDarkRight\n }\n case 'light':\n switch (direction) {\n case 'top':\n return tagPopoverArrowLightTop\n case 'bottom':\n return tagPopoverArrowLightBottom\n case 'left':\n return tagPopoverArrowLightLeft\n case 'right':\n return tagPopoverArrowLightRight\n }\n }\n })()\n</script>\n\n{#if show}\n <div class=\"tag-popover-arrow-wrapper tag-popover-arrow-{direction} theme-{theme}\" style={`background-image: url(${arrowImage})`} />\n{/if}\n\n<style lang=\"scss\">\n .tag-popover-arrow-wrapper {\n position: absolute;\n transform-origin: center;\n background-position: center;\n background-repeat: no-repeat;\n background-size: 100% 100%;\n }\n\n .tag-popover-arrow-top {\n width: 16px;\n height: 10px;\n top: 8px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tag-popover-arrow-bottom {\n width: 16px;\n height: 10px;\n bottom: 8px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tag-popover-arrow-left {\n width: 10px;\n height: 16px;\n top: 50%;\n left: 8px;\n transform: translateY(-50%);\n }\n\n .tag-popover-arrow-right {\n width: 10px;\n height: 16px;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n }\n</style>\n","<script lang=\"ts\">\n export let size = \"28\";\n export let color = \"#ffffff\";\n export let bgColor = \"#0000004d\";\n</script>\n\n<div class=\"icon-container\" style=\"--bg-color: {bgColor};\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 28 28\" width={size} height={size}>\n <defs>\n <linearGradient x1=\"53.2804066%\" y1=\"100%\" x2=\"64.4764442%\" y2=\"2.52981206%\" id=\"video-icon-gradient-a\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\".5\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient x1=\"50%\" y1=\"-5.89066117%\" x2=\"60.3018289%\" y2=\"32.0415872%\" id=\"video-icon-gradient-b\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\"0\" offset=\"100%\"/>\n </linearGradient>\n </defs>\n <path d=\"M8.0883645,5.35 C8.27319183,5.35 8.45426937,5.40368245 8.61098984,5.50477659 L20.4341152,13.1314044 C20.6662958,13.2811749 20.8173539,13.5140616 20.8743923,13.7691613 C20.9300733,14.0181899 20.8962437,14.2885953 20.7601668,14.5243865 L8.61098984,22.4950731 C8.38014238,22.6439836 8.11267156,22.6823641 7.86680489,22.6238045 C7.62023287,22.5650769 7.39563144,22.408984 7.25097187,22.1700998 C7.15226844,22.0071054 7.1,21.8187509 7.1,21.6265526 L7.1,6.37329702 C7.1,6.09035119 7.2108925,5.83405961 7.39059316,5.64859123 C7.56916841,5.46428435 7.81578724,5.35 8.0883645,5.35 Z\" \n fill=\"url(#video-icon-gradient-a)\" \n fill-rule=\"nonzero\" \n stroke=\"url(#video-icon-gradient-b)\" \n stroke-width=\".2\"/>\n </svg>\n</div>\n\n<style>\n .icon-container {\n width: 52px;\n height: 52px;\n background-color: var(--bg-color);\n border-radius: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n }\n</style> ","<script lang=\"ts\">\n export let size = '28'\n export let color = '#ffffff'\n export let bgColor = '#0000004d'\n</script>\n\n<div class=\"icon-container\" style=\"--bg-color: {bgColor};\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size}>\n <defs>\n <linearGradient x1=\"54.417371%\" y1=\"106.742364%\" x2=\"72.619444%\" y2=\"8.15444328%\" id=\"xmfpi7cnc__sgsykm5x9a\">\n <stop stop-color=\"#FFF\" offset=\"0%\" />\n <stop stop-color=\"#FFF\" stop-opacity=\".5\" offset=\"100%\" />\n </linearGradient>\n <linearGradient x1=\"50%\" y1=\".73169217%\" x2=\"66.0966077%\" y2=\"34.1694374%\" id=\"xmfpi7cnc__tjqs3iy6kb\">\n <stop stop-color=\"#FFF\" offset=\"0%\" />\n <stop stop-color=\"#FFF\" stop-opacity=\"0\" offset=\"100%\" />\n </linearGradient>\n <linearGradient x1=\"55.1256353%\" y1=\"273.650936%\" x2=\"55.1256353%\" y2=\"81.7206937%\" id=\"xmfpi7cnc__rs5hxavsyc\">\n <stop stop-color=\"#FFF\" offset=\"0%\" />\n <stop stop-color=\"#FFF\" stop-opacity=\".5\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <g fill-rule=\"nonzero\" fill=\"none\">\n <path\n d=\"M18,5.4 L18,13.4 C18,15.3329966 13.9705627,16.9 9,16.9 C4.02943725,16.9 0,15.3329966 0,13.4 L0,5.4 C0,7.33299662 4.02943725,8.9 9,8.9 C13.8670094,8.9 17.8316983,7.39760831 17.9947813,5.52032488 L18,5.4 Z M4.9603418,4.9 C5.2193418,4.9 5.4643418,4.837 5.6883418,4.704 C6.1293418,4.445 6.4093418,3.976 6.4093418,3.444 C6.4093418,3.003 6.2203418,2.611 5.9053418,2.359 C6.1643418,2.1 6.3393418,1.729 6.3393418,1.337 C6.3393418,1.092 6.2763418,0.861 6.1573418,0.658 C5.9053418,0.245 5.4643418,0 4.9603418,0 C4.7223418,0 4.4983418,0.056 4.2953418,0.175 C3.8753418,0.413 3.6163418,0.84 3.6163418,1.337 L3.6163418,1.372 L4.3373418,1.372 L4.3373418,1.337 C4.3373418,1.022 4.6313418,0.721 4.9603418,0.721 C5.3173418,0.721 5.6113418,1.008 5.6113418,1.337 C5.6113418,1.708 5.3243418,1.995 4.9603418,1.995 L4.8203418,1.995 L4.8203418,2.723 L4.9603418,2.723 C5.3593418,2.723 5.6883418,3.045 5.6883418,3.444 C5.6883418,3.843 5.3593418,4.179 4.9603418,4.179 C4.5613418,4.179 4.2323418,3.843 4.2323418,3.444 L4.2323418,3.339 L3.5043418,3.339 L3.5043418,3.444 C3.5043418,3.71 3.5673418,3.955 3.7003418,4.172 C3.9593418,4.62 4.4283418,4.9 4.9603418,4.9 Z M8.6073418,4.9 C8.8803418,4.9 9.1253418,4.83 9.3563418,4.697 C9.8043418,4.424 10.0983418,3.934 10.0983418,3.395 C10.0983418,3.122 10.0283418,2.877 9.8953418,2.646 C9.6223418,2.198 9.1463418,1.904 8.6073418,1.904 C8.5303418,1.904 8.4743418,1.904 8.4393418,1.911 L9.3143418,0 L8.5093418,0 L7.2353418,2.793 C7.1443418,2.982 7.1023418,3.185 7.1023418,3.395 C7.1023418,3.668 7.1723418,3.92 7.3053418,4.151 C7.5783418,4.606 8.0543418,4.9 8.6073418,4.9 Z M8.6073418,4.158 C8.1803418,4.158 7.8443418,3.822 7.8443418,3.395 C7.8443418,2.975 8.1873418,2.625 8.6073418,2.625 C9.0273418,2.625 9.3773418,2.975 9.3773418,3.395 C9.3773418,3.815 9.0273418,4.158 8.6073418,4.158 Z M12.2613418,4.907 C12.7653418,4.907 13.2133418,4.634 13.4653418,4.207 C13.5913418,3.997 13.6543418,3.766 13.6543418,3.514 L13.6543418,3.514 L13.6543418,1.428 C13.6543418,0.917 13.3813418,0.448 12.9613418,0.189 C12.7443418,0.063 12.5133418,0 12.2613418,0 C11.7503418,0 11.2813418,0.273 11.0293418,0.714 C10.8963418,0.931 10.8333418,1.169 10.8333418,1.428 L10.8333418,1.428 L10.8333418,3.514 C10.8333418,4.018 11.1063418,4.466 11.5473418,4.718 C11.7643418,4.844 12.0023418,4.907 12.2613418,4.907 Z M12.2613418,4.186 C11.8903418,4.186 11.5683418,3.885 11.5683418,3.514 L11.5683418,3.514 L11.5683418,1.428 C11.5683418,1.029 11.8763418,0.735 12.2613418,0.735 C12.6323418,0.735 12.9123418,1.029 12.9123418,1.428 L12.9123418,1.428 L12.9123418,3.514 C12.9123418,3.899 12.6323418,4.186 12.2613418,4.186 Z M15.4753809,2.07333984 C15.7488184,2.07333984 15.9886458,1.97478841 16.1948633,1.77768555 C16.4010807,1.58058268 16.5041895,1.33391927 16.5041895,1.03769531 C16.5041895,0.750585938 16.4050684,0.507340495 16.2068262,0.307958984 C16.008584,0.108577474 15.7647689,0.00888671875 15.4753809,0.00888671875 C15.1928288,0.00888671875 14.9495833,0.109147135 14.7456445,0.309667969 C14.5417057,0.510188802 14.4397363,0.756282552 14.4397363,1.04794922 C14.4397363,1.32138672 14.5365788,1.56064453 14.7302637,1.76572266 C14.9239486,1.97080078 15.172321,2.07333984 15.4753809,2.07333984 Z M15.4753809,1.70078125 C15.2930892,1.70078125 15.137002,1.63583984 15.0071191,1.50595703 C14.8772363,1.37607422 14.8122949,1.22226563 14.8122949,1.04453125 C14.8122949,0.859960938 14.877806,0.703304036 15.0088281,0.574560547 C15.1398503,0.445817057 15.2953678,0.381445313 15.4753809,0.381445313 C15.6553939,0.381445313 15.8097721,0.446386719 15.9385156,0.576269531 C16.0672591,0.706152344 16.1316309,0.859960938 16.1316309,1.03769531 C16.1316309,1.22226563 16.0661198,1.37892253 15.9350977,1.50766602 C15.8040755,1.63640951 15.6508366,1.70078125 15.4753809,1.70078125 Z\"\n fill=\"url(#xmfpi7cnc__sgsykm5x9a)\"\n transform=\"translate(3 3.1)\"\n />\n <path\n d=\"M18,5.4 L18,13.4 C18,15.3329966 13.9705627,16.9 9,16.9 C4.02943725,16.9 0,15.3329966 0,13.4 L0,5.4 C0,7.33299662 4.02943725,8.9 9,8.9 C13.8670094,8.9 17.8316983,7.39760831 17.9947813,5.52032488 L18,5.4 Z M17.8,6.499 L17.7806846,6.52607583 C16.6077599,8.0452893 13.108676,9.1 9,9.1 C4.87821133,9.1 1.38089175,8.04047836 0.214303539,6.51942435 L0.2,6.5 L0.2,13.4 C0.2,15.1332693 3.96631253,16.6348245 8.69056715,16.6979358 L9,16.7 C13.8681548,16.7 17.8,15.1709491 17.8,13.4 L17.8,6.499 Z M12.2613418,0 C12.5133418,0 12.7443418,0.063 12.9613418,0.189 C13.3813418,0.448 13.6543418,0.917 13.6543418,1.428 L13.6543418,3.514 L13.6467818,3.66268 C13.6266218,3.85756 13.5661418,4.039 13.4653418,4.207 C13.2133418,4.634 12.7653418,4.907 12.2613418,4.907 C12.0023418,4.907 11.7643418,4.844 11.5473418,4.718 C11.1063418,4.466 10.8333418,4.018 10.8333418,3.514 L10.8333418,1.428 L10.8409578,1.27512 C10.8613418,1.07464 10.9229418,0.8876 11.0293418,0.714 C11.2813418,0.273 11.7503418,0 12.2613418,0 Z M9.3143418,0 L8.4393418,1.911 C8.4743418,1.904 8.5303418,1.904 8.6073418,1.904 C9.1463418,1.904 9.6223418,2.198 9.8953418,2.646 C10.0283418,2.877 10.0983418,3.122 10.0983418,3.395 C10.0983418,3.934 9.8043418,4.424 9.3563418,4.697 C9.1253418,4.83 8.8803418,4.9 8.6073418,4.9 C8.0543418,4.9 7.5783418,4.606 7.3053418,4.151 C7.1723418,3.92 7.1023418,3.668 7.1023418,3.395 C7.1023418,3.185 7.1443418,2.982 7.2353418,2.793 L8.5093418,0 L9.3143418,0 Z M4.9603418,0 C5.4643418,0 5.9053418,0.245 6.1573418,0.658 C6.2763418,0.861 6.3393418,1.092 6.3393418,1.337 C6.3393418,1.729 6.1643418,2.1 5.9053418,2.359 C6.2203418,2.611 6.4093418,3.003 6.4093418,3.444 C6.4093418,3.976 6.1293418,4.445 5.6883418,4.704 C5.4643418,4.837 5.2193418,4.9 4.9603418,4.9 C4.4283418,4.9 3.9593418,4.62 3.7003418,4.172 C3.5673418,3.955 3.5043418,3.71 3.5043418,3.444 L3.5043418,3.339 L4.2323418,3.339 L4.2323418,3.444 C4.2323418,3.843 4.5613418,4.179 4.9603418,4.179 C5.3593418,4.179 5.6883418,3.843 5.6883418,3.444 C5.6883418,3.045 5.3593418,2.723 4.9603418,2.723 L4.8203418,2.723 L4.8203418,1.995 L4.9603418,1.995 C5.3243418,1.995 5.6113418,1.708 5.6113418,1.337 C5.6113418,1.008 5.3173418,0.721 4.9603418,0.721 C4.6313418,0.721 4.3373418,1.022 4.3373418,1.337 L4.3373418,1.372 L3.6163418,1.372 L3.6163418,1.337 C3.6163418,0.84 3.8753418,0.413 4.2953418,0.175 C4.4983418,0.056 4.7223418,0 4.9603418,0 Z M12.2613418,0.2 C11.8228535,0.2 11.4197491,0.433900098 11.199862,0.818512412 C11.0880596,1.00092699 11.0333418,1.20205175 11.0333418,1.428 L11.0333418,3.514 C11.0333418,3.94076817 11.2630074,4.32517296 11.6477689,4.54504221 C11.8340054,4.65317955 12.0373271,4.707 12.2613418,4.707 C12.685768,4.707 13.0724302,4.4792625 13.2938432,4.10410085 C13.4010506,3.92542185 13.4543418,3.73002084 13.4543418,3.514 L13.4543418,1.428 C13.4543418,0.993663172 13.2236099,0.585702454 12.8609147,0.361957789 C12.673578,0.253181671 12.4771013,0.2 12.2613418,0.2 Z M4.9603418,0.2 C4.75293536,0.2 4.56476024,0.248895899 4.39394431,0.349004437 C4.11167513,0.508956972 3.91907748,0.764507622 3.84741774,1.06716925 L3.829,1.171 L4.157,1.171 L4.1635929,1.14325273 C4.24904453,0.829489942 4.53273472,0.571946496 4.86075855,0.527713496 L4.9603418,0.521 C5.42264158,0.521 5.8113418,0.89242465 5.8113418,1.337 C5.8113418,1.78012728 5.4916909,2.13625035 5.06824166,2.18841646 L5.02,2.191 L5.02,2.526 L5.06813812,2.52919506 C5.49271718,2.57829524 5.83232975,2.91371045 5.88206553,3.33657664 L5.8883418,3.444 C5.8883418,3.95419336 5.46908818,4.379 4.9603418,4.379 C4.48793444,4.379 4.09269177,4.01271264 4.03863877,3.55189651 L4.037,3.539 L3.709,3.539 L3.71100539,3.58140766 C3.72435814,3.71571552 3.75785509,3.84083114 3.8121867,3.95771875 L3.87348876,4.07189941 C4.09978468,4.46333019 4.50573915,4.7 4.9603418,4.7 C5.18808795,4.7 5.39698916,4.6443932 5.58705743,4.53154283 C5.97364119,4.30450157 6.2093418,3.89738234 6.2093418,3.444 C6.2093418,3.06849319 6.05147644,2.73203269 5.78040279,2.51517376 L5.60591531,2.37558378 L5.76392044,2.21757864 C5.99772857,1.98377051 6.1393418,1.65985061 6.1393418,1.337 C6.1393418,1.12891147 6.08649325,0.932616859 5.98661394,0.762172929 C5.77036899,0.407771483 5.39348118,0.2 4.9603418,0.2 Z M9.002,0.2 L8.638,0.2 L7.41554213,2.87976312 C7.3587619,2.9976913 7.32347683,3.1241874 7.30938306,3.25833536 L7.3023418,3.395 C7.3023418,3.62951354 7.36137928,3.8474981 7.47684038,4.04810085 C7.72111603,4.45522692 8.1383802,4.7 8.6073418,4.7 C8.83989632,4.7 9.05100342,4.64201988 9.25226776,4.52621184 C9.649754,4.28399367 9.8983418,3.85400396 9.8983418,3.395 C9.8983418,3.16244548 9.84036168,2.95133838 9.72455364,2.75007403 C9.48026964,2.34919774 9.06277079,2.104 8.6073418,2.104 L8.51445661,2.10475811 C8.49442789,2.10527049 8.48389809,2.10604952 8.47856502,2.10711614 L8.0943966,2.18394982 L8.25749731,1.82773787 L9.002,0.2 Z M12.2613418,0.535 C12.7468356,0.535 13.1123418,0.922491584 13.1123418,1.428 L13.1123418,3.514 C13.1123418,4.00744192 12.7448365,4.386 12.2613418,4.386 C11.7777279,4.386 11.3683418,3.99355405 11.3683418,3.514 L11.3683418,1.428 C11.3683418,0.922753743 11.7615956,0.535 12.2613418,0.535 Z M8.6073418,2.425 C9.13779875,2.425 9.5773418,2.86454305 9.5773418,3.395 C9.5773418,3.92471151 9.13856864,4.358 8.6073418,4.358 C8.06988485,4.358 7.6443418,3.93245695 7.6443418,3.395 C7.6443418,2.86377316 8.07763029,2.425 8.6073418,2.425 Z M12.2613418,0.735 C11.8763418,0.735 11.5683418,1.029 11.5683418,1.428 L11.5683418,3.514 L11.5761202,3.61327273 C11.6272922,3.93723967 11.9240691,4.186 12.2613418,4.186 C12.6323418,4.186 12.9123418,3.899 12.9123418,3.514 L12.9123418,1.428 L12.9055416,1.32192712 C12.8606806,0.977975207 12.5986145,0.735 12.2613418,0.735 Z M8.6073418,2.625 C8.1873418,2.625 7.8443418,2.975 7.8443418,3.395 C7.8443418,3.822 8.1803418,4.158 8.6073418,4.158 C9.0273418,4.158 9.3773418,3.815 9.3773418,3.395 C9.3773418,2.975 9.0273418,2.625 8.6073418,2.625 Z M15.4753809,0.00888671875 C15.7647689,0.00888671875 16.008584,0.108577474 16.2068262,0.307958984 C16.4050684,0.507340495 16.5041895,0.750585938 16.5041895,1.03769531 C16.5041895,1.33391927 16.4010807,1.58058268 16.1948633,1.77768555 C15.9886458,1.97478841 15.7488184,2.07333984 15.4753809,2.07333984 C15.172321,2.07333984 14.9239486,1.97080078 14.7302637,1.76572266 C14.5365788,1.56064453 14.4397363,1.32138672 14.4397363,1.04794922 C14.4397363,0.756282552 14.5417057,0.510188802 14.7456445,0.309667969 C14.9495833,0.109147135 15.1928288,0.00888671875 15.4753809,0.00888671875 Z M15.4753809,0.381445313 C15.2953678,0.381445313 15.1398503,0.445817057 15.0088281,0.574560547 C14.877806,0.703304036 14.8122949,0.859960938 14.8122949,1.04453125 C14.8122949,1.22226563 14.8772363,1.37607422 15.0071191,1.50595703 C15.137002,1.63583984 15.2930892,1.70078125 15.4753809,1.70078125 C15.6508366,1.70078125 15.8040755,1.63640951 15.9350977,1.50766602 C16.0661198,1.37892253 16.1316309,1.22226563 16.1316309,1.03769531 C16.1316309,0.859960938 16.0672591,0.706152344 15.9385156,0.576269531 C15.8097721,0.446386719 15.6553939,0.381445313 15.4753809,0.381445313 Z\"\n fill=\"url(#xmfpi7cnc__tjqs3iy6kb)\"\n transform=\"translate(3 3.1)\"\n />\n <path\n d=\"M3.00030998,2.79110119 L3.00030998,8.00889881 C1.15888197,7.36802147 0,6.43664128 0,5.4 C0,4.36335872 1.15888197,3.43197853 3.00030998,2.79110119 Z M15.0006975,2.79145187 C16.8415407,3.43231826 18,4.36354778 18,5.4 C18,6.43645222 16.8415407,7.36768174 15.0006975,8.00854813 Z\"\n fill=\"url(#xmfpi7cnc__rs5hxavsyc)\"\n transform=\"translate(3 3.1)\"\n />\n </g>\n </svg>\n</div>\n\n<style>\n .icon-container {\n width: 52px;\n height: 52px;\n background-color: var(--bg-color);\n border-radius: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 2;\n }\n</style>\n","<script lang=\"ts\">\n import AudioIcon from './Icon/audioIcon.svelte'\n\n export let playing = false\n export let elapsedTime = '00:00'\n export let progress = 0\n export let onClick = () => {}\n</script>\n\n<!-- svelte-ignore a11y-click-events-have-key-events -->\n<div class=\"pano-tag-audio-popup-inline-player-wrapper\" on:click|stopPropagation={onClick}>\n <div class=\"pano-tag-audio-popup-inline-player-icon\">\n <AudioIcon {playing} width={24} />\n </div>\n <div class=\"pano-tag-audio-popup-inline-player-progress\">\n <div class=\"pano-tag-audio-popup-inline-player-progress-bar\" style=\"width: {progress}%\" />\n <div class=\"pano-tag-audio-popup-inline-player-elapsed-time\">{elapsedTime}</div>\n </div>\n</div>\n\n<style lang=\"scss\">\n .pano-tag-audio-popup-inline-player-wrapper {\n width: 100%;\n height: 28px;\n background-color: rgba(255, 255, 255, 0.06);\n border-radius: 2px;\n display: flex;\n align-items: center;\n cursor: pointer;\n }\n\n .pano-tag-audio-popup-inline-player-icon {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .pano-tag-audio-popup-inline-player-progress {\n flex-grow: 1;\n display: flex;\n position: relative;\n height: 100%;\n align-items: center;\n }\n\n .pano-tag-audio-popup-inline-player-progress-bar {\n width: 0;\n height: 100%;\n background: linear-gradient(to right, rgba(238, 238, 238, 0) 0, rgba(216, 216, 216, 0.3) 100%);\n position: absolute;\n top: 0;\n left: 0;\n z-index: 0;\n }\n\n .pano-tag-audio-popup-inline-player-elapsed-time {\n position: absolute;\n z-index: 1;\n font-weight: 500;\n font-size: 14px;\n color: #ffffff;\n line-height: 20px;\n padding-left: 4px;\n }\n</style>\n","<script lang=\"ts\">\n import VideoIcon from '../VideoIcon.svelte'\n import PanoramaIcon from './PanoramaIcon.svelte'\n import type { PointTagInstance, Tag, TagPlacement } from '../../../typings'\n import { getYouTubeId, getVimeoId, isYouTube, isVimeo, formatVideo, getVideoThumbnail } from '../../../utils/videoHelper'\n import AudioPlayer from '../AudioPlayer.svelte'\n import type { SharedAudio } from '../../../utils/audio/SharedAudio'\n import { onDestroy } from 'svelte'\n\n // 主要参数\n export let tag: PointTagInstance\n export let config: Tag['config']['popoverConfig'] = {}\n export let theme: 'dark' | 'light' | undefined = undefined\n export let placement: TagPlacement = 'right-top'\n // 接收音频实例引用\n export let audioInstance: SharedAudio | null = null\n export let audioPlaying: boolean = false\n export let audioCurrentTime: number = 0\n export let audioDuration: number = 0\n\n // 判断是否为营销标签,营销标签有特殊模板\n $: isMarketingTag = tag.contentType === 'Marketing'\n\n // 是否是音频标签\n $: isAudioTag = tag.contentType === 'Audio'\n\n // 预设默认主题\n $: defaultTheme = isMarketingTag ? 'light' : 'dark'\n\n // 计算实际使用的主题\n $: effectiveTheme =\n tag.data.theme !== undefined && tag.data.theme !== null ? tag.data.theme : theme !== undefined && theme !== null ? theme : defaultTheme\n\n // 从tag中提取标题和描述\n $: title = tag.data.title || tag.data.name || ''\n $: description = tag.data.description || tag.data.tooltip || ''\n\n // 计算最终标题和描述\n $: finalTitle = title || ''\n $: finalDescription = description || ''\n\n // 音频显示状态\n let audioProgress = 0\n let audioElapsedTime = '00:00'\n\n // 平滑更新相关变量\n let smoothUpdateFrame: number | null = null\n let lastUpdateTime = 0\n let smoothProgress = 0\n\n // 格式化时间显示\n function formatTime(seconds: number): string {\n const mins = Math.floor(seconds / 60)\n const secs = Math.floor(seconds % 60)\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n }\n\n // 计算目标进度\n function getTargetProgress(): number {\n return audioDuration > 0 ? (audioCurrentTime / audioDuration) * 100 : 0\n }\n\n // 平滑更新函数\n function smoothUpdate() {\n if (!audioPlaying || audioDuration <= 0) {\n smoothUpdateFrame = null\n return\n }\n\n const now = Date.now()\n const timeSinceLastUpdate = (now - lastUpdateTime) / 1000\n\n // 估算当前进度(基于时间流逝)\n const estimatedCurrentTime = audioCurrentTime + timeSinceLastUpdate\n const estimatedProgress = Math.min((estimatedCurrentTime / audioDuration) * 100, 100)\n\n // 平滑插值到估算位置\n const progressDiff = estimatedProgress - smoothProgress\n if (Math.abs(progressDiff) > 0.05) {\n smoothProgress += progressDiff * 0.2 // 20%的插值速度\n }\n\n // 请求下一帧\n smoothUpdateFrame = requestAnimationFrame(smoothUpdate)\n }\n\n // 更新显示状态\n function updateDisplayState() {\n if (!isAudioTag) return\n\n const targetProgress = getTargetProgress()\n\n if (audioDuration > 0) {\n if (!audioPlaying) {\n // 暂停时立即同步到准确位置\n smoothProgress = targetProgress\n }\n audioProgress = smoothProgress\n audioElapsedTime = formatTime((smoothProgress / 100) * audioDuration)\n lastUpdateTime = Date.now()\n } else {\n // 重置状态\n smoothProgress = 0\n audioProgress = 0\n audioElapsedTime = '00:00'\n }\n }\n\n // 控制平滑更新的启动和停止\n function manageSmoothUpdate() {\n if (audioPlaying && audioDuration > 0) {\n if (!smoothUpdateFrame) {\n smoothUpdate()\n }\n } else {\n if (smoothUpdateFrame) {\n cancelAnimationFrame(smoothUpdateFrame)\n smoothUpdateFrame = null\n }\n }\n }\n\n // 响应式更新\n $: audioCurrentTime, audioDuration, audioPlaying, updateDisplayState()\n $: audioPlaying, audioDuration, manageSmoothUpdate()\n\n // AudioPlayer 点击事件处理\n function handleAudioPlayerClick() {\n if (!audioInstance) return\n\n if (audioInstance.paused) {\n audioInstance.play(true)\n } else {\n audioInstance.pause()\n }\n }\n\n // 确定媒体URL和类型\n $: mediaRawUrl = (() => {\n if (isAudioTag) return null\n if (isMarketingTag) return null\n // 安全地访问mediaData数组\n if (tag.data.mediaData && tag.data.mediaData.length > 0) {\n const mediaItem = tag.data.mediaData[0]\n\n // 检查是否为视频类型\n if (mediaItem.type === 'Video') {\n // 1. 优先使用视频封面图\n if (mediaItem.videoCoverUrl) {\n return mediaItem.videoCoverUrl\n }\n\n // 2. 尝试从视频URL生成封面图\n if (mediaItem.url) {\n const videoUrl = mediaItem.url.toLowerCase()\n\n // YouTube\n if (isYouTube(videoUrl)) {\n const videoId = getYouTubeId(videoUrl)\n if (videoId) {\n return `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`\n }\n }\n\n // Vimeo\n if (isVimeo(videoUrl)) {\n const vimeoId = getVimeoId(videoUrl)\n if (vimeoId) {\n // Vimeo缩略图需要通过API获取,这里提供一个代理实现\n return `https://vumbnail.com/${vimeoId}.jpg`\n }\n }\n\n // 如果都失败了,返回一个默认的视频封面图\n return\n }\n }\n\n if (tag.contentType === 'Panorama') {\n // 对于全景标签,优先使用切瓦片再使用缩略图,最后使用原图\n return (\n tag.data.mediaData?.[0]?.cube?.front ??\n tag.data.mediaData?.[0]?.thumbnail?.split('?')[0] ??\n tag.data.mediaData?.[0]?.url?.split('?')[0]\n )\n } else if (mediaItem.url || mediaItem.thumbnail) {\n // 对于图片和其他类型,直接使用URL\n return mediaItem.url || mediaItem.thumbnail\n }\n }\n\n // 如果没有mediaData或URL,尝试使用imageUrl或返回默认图片\n return tag.data.imageUrl\n })()\n\n $: mediaUrl =\n config?.imageURLTransform && (mediaRawUrl?.includes('realsee-cdn') || mediaRawUrl?.includes('ljcdn.com'))\n ? config.imageURLTransform(mediaRawUrl, { width: 280, height: 280 })\n : mediaRawUrl || tag.data.mediaUrl || ''\n\n // 添加媒体类型检测变量\n $: isVideoMedia = tag.contentType === 'Video' || tag.data.mediaType === 'video'\n $: isPanoramaMedia = tag.contentType === 'Panorama' || tag.data.mediaType === 'panorama'\n\n // 检查是否为YouTube或Vimeo视频\n $: isYouTubeVideo = isVideoMedia && tag.data.mediaData && tag.data.mediaData[0]?.url && isYouTube(tag.data.mediaData[0].url)\n $: isVimeoVideo = isVideoMedia && tag.data.mediaData && tag.data.mediaData[0]?.url && isVimeo(tag.data.mediaData[0].url)\n $: isExternalVideo = isYouTubeVideo || isVimeoVideo\n\n // 格式化外部视频URL\n $: formattedVideoUrl =\n isExternalVideo && tag.data.mediaData && tag.data.mediaData[0]?.url ? formatVideo(tag.data.mediaData[0].url, { autoplay: 0 }) : ''\n\n // 视频播放器标题\n $: videoPlayerTitle = isYouTubeVideo ? 'YouTube video player' : isVimeoVideo ? 'Vimeo video player' : finalTitle\n\n // 媒体数据的数量\n $: mediaCount = tag.data.mediaData?.length || 0\n $: currentMediaIndex = 1\n\n // 处理营销标签的 tags,primaryTags + secondaryTags 最多显示2个\n $: marketingBrandTags = isMarketingTag ? tag.data.brandTags || [] : []\n $: marketingTags = isMarketingTag ? tag.data.tags || [] : []\n $: primaryTags = marketingBrandTags.filter(Boolean).slice(0, 2)\n $: remainingCount = Math.max(0, 2 - primaryTags.length)\n $: secondaryTags = remainingCount > 0 ? marketingTags.filter(Boolean).slice(0, remainingCount) : []\n\n // 获取营销数据(如果有)\n $: marketingPrice = isMarketingTag ? tag.data.price?.value || '' : ''\n $: marketingPriceUnit = isMarketingTag ? tag.data.price?.unit || '' : ''\n\n // 组件销毁时清理动画帧\n onDestroy(() => {\n if (smoothUpdateFrame) {\n cancelAnimationFrame(smoothUpdateFrame)\n smoothUpdateFrame = null\n }\n })\n</script>\n\n<div class=\"tag-popup tag-popup-{placement}\">\n <div class=\"tag-popup-content {effectiveTheme}\">\n <!-- 标题 -->\n {#if finalTitle}\n <h3 class=\"tag-popup-title\">{finalTitle}</h3>\n {/if}\n\n <!-- 营销的 tags -->\n {#if isMarketingTag && (primaryTags.length > 0 || secondaryTags.length > 0)}\n <div class=\"tag-popup-tags\">\n {#each primaryTags as tag}\n <div class=\"tag-popup-tag tag-popup-tag-primary\">{tag}</div>\n {/each}\n {#each secondaryTags as tag}\n <div class=\"tag-popup-tag tag-popup-tag-secondary\">{tag}</div>\n {/each}\n </div>\n {/if}\n\n <!-- 媒体信息 -->\n {#if isExternalVideo && formattedVideoUrl}\n <!-- YouTube/Vimeo视频使用iframe嵌入 -->\n <div class=\"tag-popup-media\">\n <iframe\n title={videoPlayerTitle}\n src={formattedVideoUrl}\n class=\"tag-popup-video-iframe\"\n frameborder=\"0\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n referrerpolicy=\"strict-origin-when-cross-origin\"\n allowfullscreen\n style=\"width: 100%; height: 100%; position: absolute; top: 0; left: 0;\"\n />\n <div class=\"iframe-overlay\" />\n {#if mediaCount > 1}\n <div class=\"tag-popup-media-index\">{currentMediaIndex}/{mediaCount}</div>\n {/if}\n </div>\n {:else if mediaUrl}\n <div class=\"tag-popup-media\">\n <img src={mediaUrl} alt={finalTitle || ''} draggable=\"false\" />\n {#if isVideoMedia}\n <div class=\"tag-popup-media-type\">\n <VideoIcon />\n </div>\n {:else if isPanoramaMedia}\n <div class=\"tag-popup-media-type\">\n <PanoramaIcon />\n </div>\n {/if}\n {#if mediaCount > 1}\n <div class=\"tag-popup-media-index\">{currentMediaIndex}/{mediaCount}</div>\n {/if}\n </div>\n {:else if isVideoMedia && tag.data.mediaData && tag.data.mediaData[0]?.url}\n <div class=\"tag-popup-media\">\n <video\n src={tag.data.mediaData[0].url}\n class=\"tag-popup-video-fallback\"\n controls={false}\n autoplay={false}\n muted\n loop\n preload=\"metadata\"\n disablePictureInPicture\n playsinline\n style=\"width: 100%; height: 100%; object-fit: cover;\"\n />\n <div class=\"tag-popup-media-type\">\n <VideoIcon />\n </div>\n {#if mediaCount > 1}\n <div class=\"tag-popup-media-index\">{currentMediaIndex}/{mediaCount}</div>\n {/if}\n </div>\n {/if}\n\n <!-- 描述信息 -->\n {#if finalDescription}\n <div class=\"tag-popup-description\">{finalDescription}</div>\n {/if}\n\n <!-- 音频标签 -->\n {#if isAudioTag}\n <div class=\"tag-popup-audio-player-wrapper\">\n <AudioPlayer playing={audioPlaying} progress={audioProgress} elapsedTime={audioElapsedTime} onClick={handleAudioPlayerClick} />\n </div>\n {/if}\n\n <!-- 营销的 price -->\n {#if marketingPrice}\n <div class=\"tag-popup-price\">\n {#if marketingPriceUnit}\n <span class=\"tag-popup-price-unit\">{marketingPriceUnit}</span>\n {/if}\n <span class=\"tag-popup-price-value\">{marketingPrice}</span>\n </div>\n {/if}\n\n <!-- 插槽用于底部工具栏 -->\n <slot name=\"toolbar\" />\n\n <!-- 插槽用于箭头 -->\n <slot name=\"arrow\" />\n </div>\n</div>\n\n<style lang=\"scss\">\n .tag-popup {\n position: absolute;\n pointer-events: auto;\n padding: 10px 10px 10px 18px;\n width: fit-content;\n height: fit-content;\n transform-origin: center;\n }\n\n .tag-popup-top {\n transform: translate(-50%, -100%);\n left: 50%;\n }\n\n .tag-popup-bottom {\n transform: translate(-50%, 0);\n left: 50%;\n }\n\n .tag-popup-left {\n transform: translate(-100%, -50%);\n top: 50%;\n }\n\n .tag-popup-right {\n transform: translate(0, -50%);\n top: 50%;\n }\n\n .tag-popup-top-left {\n transform: translate(calc(42px - 100%), -100%);\n }\n\n .tag-popup-top-right {\n transform: translate(-42px, -100%);\n }\n\n .tag-popup-bottom-left {\n transform: translate(calc(42px - 100%), 0);\n }\n\n .tag-popup-bottom-right {\n transform: translate(-42px, 0);\n }\n\n .tag-popup-left-top {\n transform: translate(-100%, -42px);\n }\n\n .tag-popup-left-bottom {\n transform: translate(-100%, calc(42px - 100%));\n }\n\n .tag-popup-right-top {\n transform: translate(0, -42px);\n }\n\n .tag-popup-right-bottom {\n transform: translate(0, calc(42px - 100%));\n }\n\n .tag-popup-content {\n position: relative;\n pointer-events: auto;\n cursor: pointer;\n padding: 20px;\n border-radius: 6px;\n max-width: 280px;\n width: 280px;\n background: #000000bf;\n }\n\n /* 顶部朝向 - 只显示左右边框 */\n .tag-popup-top .tag-popup-content,\n .tag-popup-top-left .tag-popup-content,\n .tag-popup-top-right .tag-popup-content {\n box-shadow: 0.5px 0 0 0 rgba(255, 255, 255, 0.3), /* 右 */ -0.5px 0 0 0 rgba(255, 255, 255, 0.3); /* 左 */\n }\n\n /* 底部朝向 - 只显示左右边框 */\n .tag-popup-bottom .tag-popup-content,\n .tag-popup-bottom-left .tag-popup-content,\n .tag-popup-bottom-right .tag-popup-content {\n box-shadow: 0.5px 0 0 0 rgba(255, 255, 255, 0.3), /* 右 */ -0.5px 0 0 0 rgba(255, 255, 255, 0.3); /* 左 */\n }\n\n /* 左侧朝向 - 只显示上下边框 */\n .tag-popup-left .tag-popup-content,\n .tag-popup-left-top .tag-popup-content,\n .tag-popup-left-bottom .tag-popup-content {\n box-shadow: 0 0.5px 0 0 rgba(255, 255, 255, 0.3), /* 上 */ 0 -0.5px 0 0 rgba(255, 255, 255, 0.3); /* 下 */\n }\n\n /* 右侧朝向 - 只显示上下边框 */\n .tag-popup-right .tag-popup-content,\n .tag-popup-right-top .tag-popup-content,\n .tag-popup-right-bottom .tag-popup-content {\n box-shadow: 0 0.5px 0 0 rgba(255, 255, 255, 0.3), /* 上 */ 0 -0.5px 0 0 rgba(255, 255, 255, 0.3); /* 下 */\n }\n\n .light {\n background: #ffffff;\n }\n\n .tag-popup-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 22px;\n letter-spacing: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2; /* 最多显示两行 */\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n color: #ffffff;\n }\n\n .light .tag-popup-title {\n color: #000000d9;\n }\n\n .tag-popup-description {\n margin: 0;\n font-size: 14px;\n font-weight: 400;\n color: #ffffff;\n line-height: 20px;\n display: -webkit-box;\n -webkit-line-clamp: 4; /* 最多显示4行 */\n -webkit-box-orient: vertical;\n max-height: 80px; /* 4行 * 20px行高 */\n overflow: hidden;\n word-wrap: break-word;\n word-break: break-word;\n text-overflow: ellipsis;\n white-space: pre-wrap;\n }\n\n .light .tag-popup-description {\n color: #000000d9;\n }\n\n .tag-popup-tags {\n display: flex;\n align-items: center;\n margin: 0;\n margin-bottom: 0;\n\n .tag-popup-tag + .tag-popup-tag {\n margin-left: 4px;\n }\n }\n\n .tag-popup-tag {\n padding: 2px 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n font-size: 12px;\n line-height: 18px;\n letter-spacing: 0;\n border-radius: 2px;\n max-width: 120px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .tag-popup-tag-primary {\n color: #ffffff;\n background-image: linear-gradient(90deg, #ead09a 0%, #e0cca3 100%);\n }\n\n .light .tag-popup-tag-primary {\n color: #946700;\n background-image: linear-gradient(90deg, #ead09a 0%, #e0cca3 100%);\n }\n\n .tag-popup-tag-secondary {\n color: #ffffff;\n background: #ffffff26;\n }\n\n .light .tag-popup-tag-secondary {\n color: #00000080;\n background: #0000000f;\n }\n\n .tag-popup-price {\n font-family: DINAlternate-Bold;\n font-weight: 700;\n font-size: 20px;\n color: #ae7900;\n letter-spacing: 0;\n text-align: center;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n margin: 0;\n }\n\n .tag-popup-media {\n width: 240px;\n height: 160px;\n margin: 0 auto;\n overflow: hidden;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n }\n\n .tag-popup-media-type {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 2;\n }\n\n .tag-popup-media-index {\n position: absolute;\n right: 6px;\n bottom: 6px;\n padding: 1px 4px;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 2px;\n font-weight: bold;\n font-size: 12px;\n color: #ffffff;\n letter-spacing: 0;\n line-height: 18px;\n }\n\n .iframe-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n z-index: 10;\n }\n\n /* 统一内容块间距,只有有多个内容块时才有间距 */\n .tag-popup-content > * + * {\n margin-top: 8px;\n }\n\n .tag-popup-content > *:first-child {\n margin-top: 0 !important;\n }\n</style>\n","<script lang=\"ts\">\n export let size = \"14\";\n export let color = \"#ffffff\";\n export let opacity = 1;\n</script>\n\n<svg \n xmlns=\"http://www.w3.org/2000/svg\" \n viewBox=\"0 0 14 14\" \n width={size} \n height={size}\n style=\"opacity: {opacity};\"\n>\n <defs>\n <linearGradient id=\"arrow-right-icon-gradient-{color}\" x1=\"96.2%\" y1=\"50%\" x2=\"0%\" y2=\"50%\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\".5\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient id=\"arrow-right-icon-stroke-{color}\" x1=\"50%\" y1=\"9.83%\" x2=\"41.99%\" y2=\"24.46%\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\"0\" offset=\"100%\"/>\n </linearGradient>\n </defs>\n <path \n d=\"M4.84572153,2.14166669 C4.94036186,2.14170036 5.03490004,2.17870347 5.10676798,2.25203341 L9.39516942,6.66308361 C9.48635681,6.75687897 9.53195051,6.87843949 9.53195051,7 C9.53195051,7.12156051 9.48635681,7.24312103 9.39516942,7.33691639 L5.11673708,11.7390017 C5.02118573,11.813978 4.92122439,11.8514005 4.82705048,11.851434 C4.73517505,11.8514667 4.65029153,11.8150862 4.59276829,11.7576692 C4.51856427,11.6593496 4.48179951,11.5564146 4.48176638,11.4595899 C4.48173399,11.3649536 4.51747117,11.2773335 4.58937836,11.2035272 L7.74273899,7.43877755 C7.84906128,7.31184097 7.90222243,7.15592048 7.90222243,7 C7.90222243,6.84407952 7.84906128,6.68815903 7.74273449,6.56121708 L4.54804918,2.74803934 C4.65338339,2.20863952 4.74441906,2.14163065 4.84572153,2.14166669 Z\" \n fill={`url(#arrow-right-icon-gradient-${color})`}\n fill-rule=\"nonzero\"\n stroke={`url(#arrow-right-icon-stroke-${color})`}\n stroke-width=\".2\"\n />\n</svg> ","<script lang=\"ts\">\n export let size = \"20\";\n export let color = \"#ffffff\";\n export let opacity = 1;\n</script>\n\n<svg \n xmlns=\"http://www.w3.org/2000/svg\" \n viewBox=\"0 0 20 20\" \n width={size} \n height={size}\n style=\"opacity: {opacity};\"\n>\n <defs>\n <linearGradient id=\"share-icon-gradient-{color}\" x1=\"41.65%\" y1=\"59.05%\" x2=\"66.13%\" y2=\"9.07%\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\".5\" offset=\"100%\"/>\n </linearGradient>\n <linearGradient id=\"share-icon-stroke-{color}\" x1=\"55.68%\" y1=\"2.48%\" x2=\"60.83%\" y2=\"14.28%\">\n <stop stop-color={color} offset=\"0%\"/>\n <stop stop-color={color} stop-opacity=\"0\" offset=\"100%\"/>\n </linearGradient>\n </defs>\n <path \n d=\"M12.4937515,2.60140991 L12.6834904,2.60248871 C13.307774,2.63121157 13.9222065,2.90874077 14.3642696,3.436433 C14.7794904,3.93278385 14.923342,4.60854408 14.8265514,5.24548738 C14.7279361,5.89144103 14.4428997,6.3527969 14.063774,6.65956953 C13.6079793,7.02837949 13.0189069,7.17403325 12.4632035,7.15562178 C11.7380729,7.13162078 11.0390809,7.42803145 10.5261758,7.9357119 C9.96083448,8.49643643 9.67596892,9.19792997 9.69443632,9.91942004 C9.66449732,10.8859455 9.96309104,11.5807243 10.4796578,12.092029 C11.0239965,12.6296813 11.7402488,12.9101676 12.4817091,12.8884813 C13.0940469,12.8705618 13.7481304,13.0495781 14.2150699,13.5117611 C14.6987029,13.9904677 14.9268415,14.6256711 14.8974895,15.2508921 C14.8684928,15.868544 14.5880857,16.4761837 14.055365,16.9134138 C13.5533941,17.3248246 12.8689122,17.4672624 12.2258037,17.3713572 C11.5727886,17.2736846 11.1063284,16.991503 10.7961882,16.6159844 C10.4239402,16.1652655 10.2768519,15.5827583 10.2954352,15.0332376 C10.3197006,14.3149783 10.0202124,13.6224897 9.50703789,13.1145427 C8.94671715,12.5587885 8.2455275,12.2800717 7.51547371,12.2927077 C7.23521908,12.3053648 6.95603622,12.2673623 6.69423123,12.1827116 C6.1605306,11.9588888 5.9529663,11.8380114 5.77703284,11.66387 C5.40155143,11.2922134 5.1829777,10.8272392 5.11950899,10.3459077 C5.05433663,9.85165608 5.15259721,9.34024891 5.41443015,8.89062791 C5.61688125,8.49864777 5.91421421,8.21950306 6.25529625,8.03627882 C6.64911257,7.8247265 7.1008248,7.74055154 7.53306889,7.75691992 L7.73219905,7.75624362 C8.39290266,7.7280909 9.01896921,7.44343917 9.49037385,6.97683639 C10.0339806,6.43762468 10.3173723,5.72806794 10.2954528,4.99382841 C10.2784266,4.38712951 10.4592448,3.74020534 10.9258673,3.27833603 C11.4093877,2.79921041 12.051472,2.57340998 12.6834904,2.60248871 Z\" \n fill={`url(#share-icon-gradient-${color})`}\n fill-rule=\"nonzero\"\n stroke={`url(#share-icon-stroke-${color})`}\n stroke-width=\".2\"\n />\n</svg> ","<script lang=\"ts\">\n import { createEventDispatcher, getContext, onMount } from 'svelte'\n import ArrowRightIcon from './ArrowRightIcon.svelte'\n import ShareIcon from './ShareIcon.svelte'\n import { notNil } from '../../../../shared-utils'\n import type { PointTagInstance, TagHooks } from '../../../typings'\n\n const hooks = getContext<TagHooks>('hooks')\n const dispatch = createEventDispatcher()\n\n export let tag: PointTagInstance\n\n export let toolbar: { showMore: boolean; showShare: boolean } = { showMore: true, showShare: true }\n export let theme: 'dark' | 'light' = 'dark'\n export let closePopover: (() => void) | undefined = undefined;\n\n // 组件显示时发送emit事件\n onMount(() => {\n hooks.emit('popoverToolbarShow', { tag })\n })\n\n $: viewMoreText = (() => {\n if (notNil(tag.data.highlightText) && tag.data.highlightText.trim() !== '') {\n return tag.data.highlightText\n }\n if (notNil(tag.config.popoverConfig.viewMoreText) && tag.config.popoverConfig.viewMoreText.trim() !== '') {\n return tag.config.popoverConfig.viewMoreText\n }\n return '查看更多'\n })()\n\n // 处理点击查看更多\n function handleViewMore(event: MouseEvent) {\n event.stopPropagation()\n if (typeof closePopover === 'function') closePopover();\n hooks.emit('click', { event, target: 'TagPopoverViewMore', tag })\n }\n\n // 处理点击分享\n function handleShare(event: MouseEvent) {\n event.stopPropagation()\n if (typeof closePopover === 'function') closePopover();\n hooks.emit('click', { event, target: 'TagPopoverShare', tag })\n }\n</script>\n\n{#if toolbar.showMore || toolbar.showShare}\n <div class=\"tag-popover-toolbar tag-popover-toolbar-{theme} {toolbar.showMore && toolbar.showShare ? 'both-buttons' : 'single-button'}\">\n {#if toolbar.showMore}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div class=\"tag-popover-btn view-more\" on:click={handleViewMore}>\n {viewMoreText}\n <ArrowRightIcon size=\"14\" color={theme === 'light' ? '#000000' : '#ffffff'} opacity={theme === 'light' ? 0.8 : 1} />\n </div>\n {/if}\n {#if toolbar.showShare}\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div class=\"tag-popover-btn share\" on:click={handleShare}>\n <ShareIcon size=\"20\" color={theme === 'light' ? '#000000' : '#ffffff'} opacity={theme === 'light' ? 0.8 : 1} />\n </div>\n {/if}\n </div>\n{/if}\n\n<style lang=\"scss\">\n .tag-popover-toolbar {\n display: flex;\n align-items: center;\n margin-top: 12px;\n padding-top: 0;\n border-top: none;\n\n &.both-buttons {\n justify-content: space-between;\n }\n\n &.single-button {\n justify-content: flex-end;\n }\n }\n\n .tag-popover-toolbar-dark .tag-popover-btn {\n color: #ffffff;\n }\n\n .tag-popover-toolbar-light .tag-popover-btn {\n color: rgba(0, 0, 0, 0.85);\n }\n\n .tag-popover-btn {\n &.view-more {\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 500;\n font-size: 14px;\n letter-spacing: 0;\n line-height: 20px;\n }\n\n &.share {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n }\n }\n</style>\n","<script lang=\"ts\">\n import type { PointTagInstance, Tag, TagPlacement } from '../../../typings'\n import TagPopoverArrow from './TagPopoverArrow.svelte'\n import TagPopup from './TagPopup.svelte'\n import TagPopoverToolBar from './TagPopoverToolBar.svelte'\n import type { SharedAudio } from '../../../utils/audio/SharedAudio'\n \n export let showArrow: boolean\n export let arrowDirection: 'top' | 'bottom' | 'left' | 'right'\n export let effectiveTheme: 'dark' | 'light'\n export let adjustedPlacement: TagPlacement\n export let tag: PointTagInstance\n export let config: Tag['config']['popoverConfig']\n export let theme: 'dark' | 'light' | undefined\n export let toolbar: { showMore?: boolean; showShare?: boolean }\n export let closePopover: () => void\n // 音频实例引用\n export let audioInstance: SharedAudio | null = null\n export let audioPlaying: boolean = false\n export let audioCurrentTime: number = 0\n export let audioDuration: number = 0\n\n\n</script>\n\n<TagPopoverArrow show={showArrow} direction={arrowDirection} theme={effectiveTheme} />\n<TagPopup placement={adjustedPlacement} {tag} {config} {theme} {audioInstance} {audioPlaying} {audioCurrentTime} {audioDuration} on:resize>\n <svelte:fragment slot=\"toolbar\">\n <TagPopoverToolBar\n toolbar={{\n showMore: toolbar.showMore === undefined ? true : toolbar.showMore,\n showShare: toolbar.showShare === undefined ? true : toolbar.showShare,\n }}\n theme={effectiveTheme}\n tag={tag}\n closePopover={closePopover}\n />\n </svelte:fragment>\n</TagPopup>\n","<script lang=\"ts\">\n import type { PointTagInstance, Tag, TagHooks, TagPlacement } from '../../../typings'\n import { onMount, tick, getContext, onDestroy, afterUpdate } from 'svelte'\n import { cubicOut } from 'svelte/easing'\n import { notNil } from '../../../../shared-utils'\n import PopoverContent from './PopoverContent.svelte'\n import { createEventDispatcher } from 'svelte'\n import type { SharedAudio } from '../../../utils/audio/SharedAudio'\n\n const hooks = getContext<TagHooks>('hooks')\n\n export let tag: PointTagInstance\n export let config: Tag['config']['popoverConfig'] = {}\n export let triggerElement: HTMLElement // 必传参数,不得为空\n export let wrapperElement: HTMLElement = document.body\n export let popoverContainer: HTMLElement | null = null\n export let theme: 'dark' | 'light' | undefined = undefined\n export let visible: boolean = true\n export let closePopover: (() => void) | undefined = undefined\n // 音频实例引用\n export let audioInstance: SharedAudio | null = null\n export let audioPlaying: boolean = false\n export let audioCurrentTime: number = 0\n export let audioDuration: number = 0\n\n const dispatch = createEventDispatcher()\n\n // 计算实际使用的主题\n $: effectiveTheme = (() => {\n if (notNil(theme)) {\n return theme\n }\n\n if (notNil(tag.data.theme) && ['light', 'dark'].includes(tag.data.theme)) {\n return tag.data.theme\n }\n\n return tag.contentType === 'Marketing' ? 'light' : 'dark'\n })()\n\n // 内部状态\n let popoverContentElement: HTMLElement\n let popoverContentElementRect = { width: 0, height: 0 }\n // 存储锚点坐标,初始值为null\n let anchorPosition: { x: number; y: number } | null = null\n\n // 解析配置\n $: placement = (config?.placement || 'right-top') as TagPlacement\n $: arrow = true\n $: zIndex = 1060\n $: toolbar = (() => {\n if (typeof config?.toolbar === 'boolean') {\n return config.toolbar ? { showMore: true, showShare: true } : { showMore: false, showShare: false }\n }\n return config?.toolbar || { showMore: true, showShare: true }\n })()\n\n // 存储调整后的placement,初始值为传入的placement\n let adjustedPlacement: TagPlacement = placement\n\n // 当placement变化时,如果是'auto',则计算最佳位置\n $: if (placement === 'auto') {\n adjustedPlacement = calculateOptimalPlacement()\n } else {\n adjustedPlacement = placement\n }\n\n // 动画配置\n $: transitionDuration = config?.transitionDuration || 350 // 增加默认时长\n\n // 自定义过渡函数,同时具有fade和fly效果\n function fadeAndFly(node, { duration = 400, easing = cubicOut, x = 0, y = 0 }) {\n return {\n duration,\n css: (t, u) => {\n return `\n opacity: ${t};\n transform: translate(${u * x}px, ${u * y}px);\n `\n },\n }\n }\n\n // 创建一个函数来计算最优placement\n const calculateOptimalPlacement = (): TagPlacement => {\n if (!tag.screenPosition || !triggerElement || !wrapperElement) return placement\n\n // 获取配置的区域划分比例,使用默认值或配置值\n const baseSpace = config?.autoPlacementBaseSpace || {\n top: 0.2, // 顶部区域占比20%\n bottom: 0.2, // 底部区域占比20%\n right: 0.15, // 右侧区域占比15%\n }\n\n // 获取视口尺寸\n const viewportWidth = wrapperElement.clientWidth\n const viewportHeight = wrapperElement.clientHeight\n\n // 计算各区域的边界值\n const topBoundary = viewportHeight * baseSpace.top\n const bottomBoundary = viewportHeight * (1 - baseSpace.bottom)\n const rightBoundary = viewportWidth * (1 - baseSpace.right)\n\n // 获取标签在屏幕上的位置\n const x = tag.screenPosition.leftPx\n const y = tag.screenPosition.topPx\n\n // 弹出框的尺寸\n const popoverWidth = popoverContentElementRect.width || 280\n const popoverHeight = popoverContentElementRect.height || 200\n\n // 根据标签位置判断所在区域\n if (y <= topBoundary) {\n // 在顶部区域 (top-left)\n if (x <= rightBoundary) {\n // 确保有足够空间显示popover\n if (x + popoverWidth <= viewportWidth && y + popoverHeight <= viewportHeight) {\n return 'right-top'\n }\n return 'bottom-left'\n } else {\n // 在右上角区域 (top-right)\n if (x - popoverWidth >= 0 && y + popoverHeight <= viewportHeight) {\n return 'left-top'\n }\n return 'bottom-right'\n }\n } else if (y >= bottomBoundary) {\n // 在底部区域 (bottom-left)\n if (x <= rightBoundary) {\n if (x + popoverWidth <= viewportWidth && y - popoverHeight >= 0) {\n return 'right-bottom'\n }\n return 'top-left'\n } else {\n // 在右下角\n if (x - popoverWidth >= 0 && y - popoverHeight >= 0) {\n return 'left-bottom'\n }\n return 'top-right'\n }\n } else {\n // 在中间区域 (right-top)\n if (x <= rightBoundary) {\n if (x + popoverWidth <= viewportWidth) {\n return 'right-top'\n }\n return 'left-top'\n } else {\n if (x - popoverWidth >= 0) {\n return 'left-top'\n }\n return 'right-top'\n }\n }\n }\n\n // 监听 tag.screenPosition 的变化\n $: if (tag.screenPosition && triggerElement) {\n adjustedPlacement = calculateOptimalPlacement()\n }\n\n // 监听 contentRect 的变化\n $: if (popoverContentElementRect.width > 0 && popoverContentElementRect.height > 0) {\n adjustedPlacement = calculateOptimalPlacement()\n }\n\n // 添加一个用于计算最终位置的函数,考虑 8px 的间距\n const calculateFinalPosition = (basePosition: { x: number; y: number } | null, placement: TagPlacement) => {\n if (!basePosition) return null\n\n const offset = 8 // 设置 8px 的间距\n const position = { ...basePosition }\n\n // 根据方位调整位置\n if (['top', 'top-left', 'top-right'].includes(placement)) {\n position.y -= offset // 顶部位置,向上偏移\n } else if (['bottom', 'bottom-left', 'bottom-right'].includes(placement)) {\n position.y += offset // 底部位置,向下偏移\n } else if (['left', 'left-top', 'left-bottom'].includes(placement)) {\n position.x -= offset // 左侧位置,向左偏移\n } else if (['right', 'right-top', 'right-bottom'].includes(placement)) {\n position.x += offset // 右侧位置,向右偏移\n }\n\n return position\n }\n\n // 计算相对于body的锚点位置(全局坐标)\n const calculateAnchorPositionGlobal = (placement: TagPlacement, triggerRect: DOMRect): { x: number; y: number } => {\n switch (placement) {\n case 'top':\n case 'top-left':\n case 'top-right':\n return {\n x: triggerRect.left + triggerRect.width / 2,\n y: triggerRect.top,\n }\n case 'bottom':\n case 'bottom-left':\n case 'bottom-right':\n return {\n x: triggerRect.left + triggerRect.width / 2,\n y: triggerRect.top + triggerRect.height,\n }\n case 'left':\n case 'left-top':\n case 'left-bottom':\n return {\n x: triggerRect.left,\n y: triggerRect.top + triggerRect.height / 2,\n }\n case 'right':\n case 'right-top':\n case 'right-bottom':\n return {\n x: triggerRect.left + triggerRect.width,\n y: triggerRect.top + triggerRect.height / 2,\n }\n default:\n return {\n x: triggerRect.left + triggerRect.width / 2,\n y: triggerRect.top,\n }\n }\n }\n\n // 当adjustedPlacement发生变化时,重新计算锚点坐标(全局坐标)\n $: if (tag.screenPosition && adjustedPlacement && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect()\n if (triggerRect.width > 0 && triggerRect.height > 0) {\n anchorPosition = calculateAnchorPositionGlobal(adjustedPlacement, triggerRect)\n }\n }\n\n // 计算最终位置,添加间距\n $: finalPosition = anchorPosition\n\n // 处理底部工具栏事件\n const handleViewMore = (event: CustomEvent<{ event: MouseEvent }>) => {\n closePopoverInternal()\n if (hooks) {\n hooks.emit('click', { event: event.detail.event, target: 'TagPopoverViewMore', tag })\n }\n }\n\n const handleShare = (event: CustomEvent<{ event: MouseEvent }>) => {\n closePopoverInternal()\n if (hooks) {\n hooks.emit('click', { event: event.detail.event, target: 'TagPopoverShare', tag })\n }\n }\n\n // 从tag和props中获取内容\n $: showArrow = typeof arrow === 'boolean' ? arrow : true\n\n // 定义箭头方向的类型\n type ArrowDirection = 'top' | 'bottom' | 'left' | 'right'\n\n // 计算箭头朝向,如 top, bottom, left, right\n $: arrowDirection = ((): ArrowDirection => {\n switch (adjustedPlacement) {\n case 'top':\n case 'top-left':\n case 'top-right':\n return 'bottom'\n case 'bottom':\n case 'bottom-left':\n case 'bottom-right':\n return 'top'\n case 'left':\n case 'left-top':\n case 'left-bottom':\n return 'right'\n case 'right':\n case 'right-top':\n case 'right-bottom':\n return 'left'\n default:\n return 'bottom' // 默认值\n }\n })()\n\n // 计算内容大小,用于辅助定位\n const updateContentRect = () => {\n if (popoverContentElement) {\n const rect = popoverContentElement.getBoundingClientRect()\n popoverContentElementRect = { width: rect.width, height: rect.height }\n // 获取到新的内容尺寸后重新计算placement\n if (popoverContentElementRect.width > 0 && popoverContentElementRect.height > 0) {\n adjustedPlacement = calculateOptimalPlacement()\n }\n }\n }\n\n // 处理内容resize事件\n const handleContentResize = (event) => {\n popoverContentElementRect = event.detail\n // 当内容尺寸变化时,立即重新计算最佳位置\n if (popoverContentElementRect.width > 0 && popoverContentElementRect.height > 0) {\n adjustedPlacement = calculateOptimalPlacement()\n }\n }\n\n const handleClick = (event: MouseEvent) => {\n // 音频标签的 popover 内容点击不关闭 popover\n if (!isAudioTag) {\n closePopoverInternal()\n }\n event.stopPropagation()\n hooks.emit('click', { event, target: 'TagPopoverContent', tag })\n }\n\n let popoverEl: HTMLElement | null = null\n let mounted = false\n\n function mountToContainer() {\n if (popoverContainer && popoverEl && popoverEl.parentNode !== popoverContainer) {\n popoverContainer.appendChild(popoverEl)\n }\n }\n\n onMount(() => {\n if (!wrapperElement || wrapperElement === document.body) {\n console.warn('TagPopover 组件警告:禁止使用 document.body 作为 wrapperElement,请传入自定义容器元素。')\n }\n mounted = true\n mountToContainer()\n // 只对自定义 wrapperElement 设置 overflow,不能是 document.body\n if (wrapperElement && wrapperElement !== document.body) {\n wrapperElement.style.overflow = 'hidden'\n }\n })\n\n afterUpdate(() => {\n if (mounted) mountToContainer()\n })\n\n onDestroy(() => {\n if (popoverEl && popoverEl.parentNode) {\n popoverEl.parentNode.removeChild(popoverEl)\n }\n // 只恢复自定义 wrapperElement 的 overflow\n if (wrapperElement && wrapperElement !== document.body) {\n wrapperElement.style.overflow = ''\n }\n })\n\n function closePopoverInternal() {\n if (typeof closePopover === 'function') closePopover()\n dispatch('close')\n }\n\n // 计算是否为音频标签\n $: isAudioTag = tag.contentType === 'Audio' && (tag as any).data.appearance === 'plane'\n</script>\n\n{#if visible && finalPosition}\n <div\n class=\"tag-popover tag-popover-{effectiveTheme} tag-popover-{adjustedPlacement}\"\n data-tag-id={tag.id}\n style=\"z-index: {zIndex}; left: {finalPosition.x}px; top: {finalPosition.y}px;\"\n bind:this={popoverEl}\n >\n <!-- svelte-ignore a11y-click-events-have-key-events -->\n <div\n class=\"tag-popover-content\"\n class:audio-tag-popover={isAudioTag}\n bind:this={popoverContentElement}\n on:mouseenter\n on:mouseleave\n transition:fadeAndFly={{\n duration: transitionDuration,\n easing: cubicOut,\n y: arrowDirection === 'top' ? -8 : arrowDirection === 'bottom' ? 8 : 0,\n x: arrowDirection === 'left' ? -8 : arrowDirection === 'right' ? 8 : 0,\n }}\n on:click={handleClick}\n >\n <PopoverContent\n {showArrow}\n {arrowDirection}\n {effectiveTheme}\n {adjustedPlacement}\n {tag}\n {config}\n {theme}\n {toolbar}\n {audioInstance}\n {audioPlaying}\n {audioCurrentTime}\n {audioDuration}\n closePopover={closePopoverInternal}\n on:viewMore={handleViewMore}\n on:share={handleShare}\n on:resize={handleContentResize}\n />\n </div>\n </div>\n{/if}\n\n<style lang=\"scss\">\n .tag-popover {\n position: absolute;\n z-index: 1000010;\n pointer-events: auto;\n width: auto;\n height: auto;\n padding: 0;\n margin: 0;\n visibility: visible;\n opacity: 1;\n }\n .tag-popover-content {\n cursor: pointer;\n pointer-events: auto;\n }\n\n .tag-popover-content.audio-tag-popover {\n cursor: default; /* 音频标签的 popover 不显示点击光标 */\n }\n</style>\n","<script lang=\"ts\">\n import { getContext, onMount } from 'svelte'\n import type {\n PointTagInstance,\n State,\n TemporaryState,\n MediaStore,\n TagHooks,\n TagRendererMap,\n TagContentTypeMapping,\n TagInstance,\n } from '../typings'\n import TagContent from './Tag/index.svelte'\n import { noTypecheck } from '../utils'\n import TagPoint from './Common/TagPoint.svelte'\n import { isModelLike } from '../../shared-utils'\n import TagPopover from './Common/TagPopover/index.svelte'\n import type { SharedAudio } from '../utils/audio/SharedAudio'\n\n export let tag: PointTagInstance | TagInstance\n export let mediaStore: MediaStore\n export let rendererMap: TagRendererMap = new Map()\n export let contentTypeMap: TagContentTypeMapping = new Map()\n export let state: State\n export let temporaryState: TemporaryState\n export let wrapperElement: HTMLElement | null = null\n export let popoverContainer: HTMLElement | null = null\n\n $: havePoint = (() => {\n if (tag.style?.point?.enabled === false) return false\n if (rendererMap.get(tag.contentType)?.usePoint === false) return false\n if (tag.contentType === 'Sticker') return false\n if (tag.contentType === 'Link') return false\n if (tag.contentType === 'VRLink') return false\n if (tag.contentType === 'PanoLink') return false\n if (tag.contentType === 'Panorama') return true\n if (tag.contentType === 'Audio' && (tag as PointTagInstance<'Audio'>).data.appearance === 'plane') return tag.isPopoverConfigEnabled()\n // 非 2DPoint / 3DPoint 的 stickType(如 Polygon、3DBox、Mask)不渲染标签点\n if (tag.stickType && tag.stickType !== '2DPoint' && tag.stickType !== '3DPoint') return false\n return true\n })()\n\n $: haveContent = (() => {\n if (tag.isPopoverConfigEnabled() && tag.contentType === 'Panorama') return false\n if (tag.isPopoverConfigEnabled() && tag.contentType === 'ImageText') return false\n if (tag.isPopoverConfigEnabled() && tag.contentType === 'Text') return false\n if (tag.isPopoverConfigEnabled() && tag.contentType === 'Audio') return false\n // TODO\n // if (tag.isPopoverConfigEnabled() && tag.contentType === 'Marketing') return false\n // 有自定义渲染器/自定义 element 时,必须渲染 content(否则会导致 Mask/3DBox 等非 Point stickType 无法渲染业务侧面板)\n if (tag.element || rendererMap.has(tag.contentType)) return true\n // 仅 2DPoint / 3DPoint 类型显示内容\n if (tag.stickType && tag.stickType !== '2DPoint' && tag.stickType !== '3DPoint') return false\n if (tag.entryFromModel && isModelLike(tag.five.state.mode) && havePoint) return false\n return true\n })()\n\n // 检查标签是否有内容,只有当有内容时才显示 popover\n $: hasPopoverContent = (() => {\n // 营销标签判断\n if (tag.contentType === 'Marketing') {\n return !!(\n tag.data.title ||\n tag.data.name ||\n tag.data.description ||\n tag.data.tooltip ||\n tag.data.price?.value ||\n (tag.data.brandTags && tag.data.brandTags.length > 0) ||\n (tag.data.tags && tag.data.tags.length > 0) ||\n tag.data.imageUrl ||\n tag.data.mediaUrl ||\n (tag.data.mediaData && tag.data.mediaData.length > 0)\n )\n }\n\n // 普通标签判断\n return !!(\n tag.data.title ||\n tag.data.name ||\n tag.data.description ||\n tag.data.tooltip ||\n tag.data.imageUrl ||\n tag.data.mediaUrl ||\n tag.data.audioUrl ||\n (tag.data.mediaData && tag.data.mediaData.length > 0)\n )\n })()\n\n $: id = tag.id\n $: screenPosition = tag.screenPosition\n $: disable = tag.enabled === false || !tag.state\n $: hide = !tag.state?.visible || tag.temporaryState?.visible === false || !screenPosition\n $: unfolded = tag.state?.unfolded && !tag.isPopoverConfigEnabled()\n $: left = screenPosition?.leftPx + 'px'\n $: top = screenPosition?.topPx + 'px'\n // 由于性能问题,只有展开的标签生效\n $: zIndex = unfolded ? (tag.zIndex ?? 0) + (unfolded ? 1000000 : 0) : undefined // 之前展开后的zIndex统一为是9999,但是会忽略距离因素,现在展开的话也要按距离来展示\n\n const hooks: TagHooks = getContext('hooks')\n\n let isHovering = false\n let hoverTimeout: NodeJS.Timeout | undefined\n let hideTimeout: NodeJS.Timeout | undefined\n let debounceTimeout: NodeJS.Timeout | undefined\n let tagPointClickHelper: HTMLElement | null = null\n let isMouseOverPopover = false\n let isMouseOverTagPoint = false\n let tagPointComponent: any = null\n\n // 音频状态管理\n let audioInstance: SharedAudio | null = null\n let audioPlaying = false\n let audioCurrentTime = 0\n let audioDuration = 0\n\n // 音频事件处理器映射\n const audioEventHandlers = {\n audioInstanceReady: (event: CustomEvent<SharedAudio>) => {\n audioInstance = event.detail\n audioPlaying = !audioInstance.paused\n },\n audioPlay: () => {\n audioPlaying = true\n },\n audioPause: () => {\n audioPlaying = false\n },\n audioTimeUpdate: (event: CustomEvent<number>) => {\n audioCurrentTime = event.detail\n },\n audioDuration: (event: CustomEvent<number>) => {\n audioDuration = event.detail\n },\n }\n\n let hoverState = false // 真实的hover状态,用于防抖处理\n\n // 使用防抖函数设置hover状态,避免频繁切换\n const setHoverStateDebounced = (newState: boolean) => {\n if (debounceTimeout) {\n clearTimeout(debounceTimeout)\n }\n\n // 如果是设置为true,直接设置不需要防抖\n if (newState === true && !hoverState) {\n hoverState = true\n isHovering = true\n return\n }\n\n // 如果是设置为false,添加延迟\n debounceTimeout = setTimeout(() => {\n // 只有当鼠标既不在TagPoint上也不在Popover上时才隐藏\n if (!isMouseOverPopover && !isMouseOverTagPoint && !tag.config.popoverConfig?.debug) {\n hoverState = false\n isHovering = false\n }\n }, 300)\n }\n\n const handlePopoverMouseEnter = () => {\n isMouseOverPopover = true\n // 进入popover区域时,清除可能存在的隐藏定时器\n if (hideTimeout) {\n clearTimeout(hideTimeout)\n hideTimeout = undefined\n }\n if (debounceTimeout) {\n clearTimeout(debounceTimeout)\n }\n }\n\n const handlePopoverMouseLeave = () => {\n isMouseOverPopover = false\n // 使用防抖设置hover状态\n setHoverStateDebounced(false)\n }\n\n const handleMouseEnter = (event: PointerEvent) => {\n if (event.pointerType !== 'mouse') return // 只响应鼠标事件\n isMouseOverTagPoint = true\n\n const trigger = tag.currentConfig?.popoverConfig?.trigger\n if (tag.isPopoverConfigEnabled() && tag.isHoverEnabled() && trigger === 'hover') {\n // 清除隐藏相关的定时器\n if (hideTimeout) {\n clearTimeout(hideTimeout)\n hideTimeout = undefined\n }\n if (debounceTimeout) {\n clearTimeout(debounceTimeout)\n }\n\n // 如果已经有延迟显示的定时器,不需要重新创建\n if (hoverTimeout !== undefined) {\n return\n }\n\n if (tag.currentConfig?.popoverConfig?.triggerDelay > 0) {\n hoverTimeout = setTimeout(() => {\n setHoverStateDebounced(true)\n tag.hooks.emit('hover', { event, tag })\n hoverTimeout = undefined\n }, tag.currentConfig?.popoverConfig?.triggerDelay)\n } else {\n setHoverStateDebounced(true)\n tag.hooks.emit('hover', { event, tag })\n }\n }\n }\n\n const handleMouseLeave = (event: PointerEvent) => {\n if (event.pointerType !== 'mouse') return // 只响应鼠标事件\n isMouseOverTagPoint = false\n\n const trigger = tag.currentConfig?.popoverConfig?.trigger\n if (tag.isHoverEnabled() && tag.isPopoverConfigEnabled() && trigger === 'hover') {\n // 清除显示定时器\n if (hoverTimeout !== undefined) {\n clearTimeout(hoverTimeout)\n hoverTimeout = undefined\n }\n\n // 使用防抖设置hover状态\n setHoverStateDebounced(false)\n }\n }\n\n const handleTagPointClick = (event: MouseEvent) => {\n // 音频标签的点击应该控制播放/暂停,不影响 popover 状态\n const isAudioTag = tag.contentType === 'Audio' && (tag as any).data.appearance === 'plane'\n\n const trigger = tag.currentConfig?.popoverConfig?.trigger\n\n if (tag.isPopoverConfigEnabled() && tag.isHoverEnabled() && trigger === 'click') {\n if (!isAudioTag) {\n // 非音频标签:切换 popover 显示状态\n isHovering = !isHovering\n if (isHovering) {\n tag.hooks.emit('hover', { event, tag })\n }\n } else {\n // 音频标签:只在首次点击时显示 popover,后续点击不影响 popover 状态\n if (!isHovering) {\n isHovering = true\n tag.hooks.emit('hover', { event, tag })\n }\n // 如果 popover 已显示,点击不关闭它,让音频播放/暂停逻辑自己处理\n }\n }\n }\n\n function closePopover() {\n hoverState = false\n isHovering = false\n }\n\n onMount(() => {\n return () => {\n if (hoverTimeout) clearTimeout(hoverTimeout)\n if (hideTimeout) clearTimeout(hideTimeout)\n if (debounceTimeout) clearTimeout(debounceTimeout)\n }\n })\n</script>\n\n<!--\n 不用 hide 作为判断条件是因为 svelte if 为 false 的时候,里面的 dom 就不会更新了, 会导致消失动画期间标签位置不更新,\n 所以在使用 screenPosition (相当于延迟更新的 hide) 来代替 hide\n-->\n{#if screenPosition && (!disable || isHovering)}\n <div\n class=\"tag\"\n class:unClickable={tag.config.clickable === false}\n data-tag-id={id}\n data-tag-unfolded={unfolded}\n data-content-type={tag.contentType}\n data-popover-enabled={tag.isPopoverConfigEnabled()}\n id={`tag-${id}`}\n class:hide\n class:enableZIndex={zIndex}\n style:z-index={zIndex}\n style:transform={`translate3d(${left}, ${top}, 0) scale(${screenPosition.scale})`}\n bind:this={tag.dom}\n >\n {#if havePoint}\n <TagPoint\n tag={noTypecheck(tag)}\n {handleMouseEnter}\n {handleMouseLeave}\n {handleTagPointClick}\n bind:tagPointClickHelper\n bind:this={tagPointComponent}\n on:audioInstanceReady={audioEventHandlers.audioInstanceReady}\n on:audioPlay={audioEventHandlers.audioPlay}\n on:audioPause={audioEventHandlers.audioPause}\n on:audioTimeUpdate={audioEventHandlers.audioTimeUpdate}\n on:audioDuration={audioEventHandlers.audioDuration}\n />\n {:else}\n <div data-info=\"tag point is disable\" />\n {/if}\n {#if haveContent}\n <TagContent {mediaStore} tag={noTypecheck(tag)} {hooks} {state} {temporaryState} {rendererMap} {contentTypeMap} />\n {:else}\n <div data-info=\"tag content is disable\" />\n {/if}\n </div>\n{/if}\n<!-- Popover 组件 -->\n{#if tag.isPopoverConfigEnabled() && hasPopoverContent && (isHovering || tag.config.popoverConfig?.debug)}\n <TagPopover\n tag={noTypecheck(tag)}\n config={tag.config.popoverConfig}\n theme={tag.config.popoverConfig?.theme}\n {wrapperElement}\n triggerElement={tagPointClickHelper}\n {popoverContainer}\n visible={true}\n {closePopover}\n {audioInstance}\n {audioPlaying}\n {audioCurrentTime}\n {audioDuration}\n on:mouseenter={handlePopoverMouseEnter}\n on:mouseleave={handlePopoverMouseLeave}\n on:close={closePopover}\n />\n{/if}\n\n<style lang=\"scss\">\n .tag {\n position: absolute;\n width: 0px;\n height: 0px;\n overflow: visible;\n pointer-events: auto;\n will-change: opacity; // 修复safari中模型态标签hide时,opacity不会立即生效的问题\n transition: opacity 0.2s linear;\n\n &.enableZIndex {\n position: absolute;\n }\n &.hide {\n opacity: 0;\n pointer-events: none;\n }\n &.hide :global(*) {\n pointer-events: none !important;\n }\n\n &.unClickable {\n pointer-events: none !important;\n }\n\n &.unClickable :global(*) {\n pointer-events: none !important;\n }\n }\n</style>\n","let popoverContainer: HTMLElement | null = null;\n\nexport function getOrCreatePopoverContainer(zIndex: number = 2000000) {\n if (popoverContainer && document.body.contains(popoverContainer)) {\n popoverContainer.style.zIndex = String(zIndex);\n return popoverContainer;\n }\n popoverContainer = document.createElement('div');\n popoverContainer.className = 'tag-popover-container';\n Object.assign(popoverContainer.style, {\n position: 'absolute',\n left: '0',\n top: '0',\n width: '100%',\n height: '100%',\n zIndex: String(zIndex),\n pointerEvents: 'none',\n overflow: 'hidden',\n });\n document.body.appendChild(popoverContainer);\n return popoverContainer;\n} ","<script lang=\"ts\">\n import { setContext } from 'svelte'\n import type { TagHooks, PointTagInstance, State, TemporaryState, MediaStore, TagRendererMap, TagContentTypeMapping, TagInstance } from '../typings'\n import TagItem from './TagItem.svelte'\n import { fade } from 'svelte/transition'\n import { getOrCreatePopoverContainer } from '../utils/popoverContainer'\n import { onMount } from 'svelte'\n\n export let tags: (PointTagInstance | TagInstance)[] = []\n export let hooks: TagHooks\n export let mediaStore: MediaStore\n export let rendererMap: TagRendererMap\n export let contentTypeMap: TagContentTypeMapping\n export let state: State\n export let temporaryState: TemporaryState\n export let zIndex: number | undefined = undefined\n let wrapperElement: HTMLElement | null = null\n let popoverContainerEl: HTMLElement | null = null\n let popoverZIndex = 2000\n $: if (tags && tags.length > 0) {\n // 取第一个 tag 的 popoverConfig.zIndex,或默认值\n popoverZIndex = tags[0]?.config?.popoverConfig?.zIndex ?? 2000000\n }\n setContext('hooks', hooks)\n setContext('mediaStore', mediaStore)\n\n onMount(() => {\n popoverContainerEl = getOrCreatePopoverContainer(popoverZIndex)\n })\n</script>\n\n<!-- 当data-infive为0时,opacity为1,否则为null -->\n{#if state.enabled}\n <div\n in:fade\n class=\"tag--container\"\n data-infive={!state.visible || !temporaryState.visible ? '1' : '0'}\n class:hide={!state.visible || !temporaryState.visible}\n style:z-index={zIndex ?? ''}\n style:opacity={!state.visible || !temporaryState.visible ? null : 1}\n bind:this={wrapperElement}\n >\n {#each tags as tag (tag.id)}\n <TagItem\n {state}\n {temporaryState}\n {tag}\n {mediaStore}\n {rendererMap}\n {contentTypeMap}\n {wrapperElement}\n popoverContainer={popoverContainerEl}\n />\n {/each}\n </div>\n{/if}\n\n<style>\n .tag--container {\n box-sizing: border-box;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n opacity: 1;\n user-select: none;\n transform: translate3d(0, 0, 0);\n transition: opacity 0.2s linear;\n overflow: hidden;\n }\n\n .tag--container.hide {\n /* 别删 important,因为有 infive */\n opacity: 0 !important;\n pointer-events: none;\n }\n\n .tag--container.hide :global(*) {\n pointer-events: none !important;\n }\n</style>\n","import type { BlinkOptions } from '../../shared-utils/three/blink'\nimport { SculptModules } from '../../Sculpt/utils/Modules/Global'\nimport type { PlaybackManager } from '../../shared-utils/playback'\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\n\nimport * as THREE from 'three/webgpu'\nimport type { Tag, TagId, Tags, State, ContentTypeConfigKey, TagInstance } from '../typings'\nimport type { TagClickParams, TagConfigByKey, TagContentType } from '..'\nimport type { ArrayPosition } from '../typings'\nimport type { Five, Mode } from '@realsee/five-webgpu'\nimport objectAssignDeep from 'object-assign-deep'\nimport { debounce, throttle } from '../utils'\nimport formatTag, { getTagStickType } from '../utils/tag/format'\nimport { AudioNamespace, generateBlankAudio } from '../../shared-utils/audio'\nimport { resizeObserver } from '../../shared-utils/dom/resizeObserver'\nimport { isMediaModelTag, isAutoLookAtModelTag } from '../utils/tag/tagCheck'\nimport { TagRender } from './TagRender'\nimport { isModelLike, nextFrame, tweenProgress } from '../../shared-utils'\nimport type { PartialObjectDeep } from '../../typings/typings'\nimport { waitFiveModelLoaded } from '../../shared-utils/five/fiveModelLoad'\nimport { arrayPositionToVector3 } from '../../shared-utils/positionToVector3'\nimport { DebugUtil } from '../utils/DebugUtil'\nimport safeObj from '../../shared-utils/safeObj'\nimport { PointTag } from './Tag/PointTag'\nimport { ModelTag } from './Tag/ModelTag'\nimport { PlaneTag } from './Tag/PlaneTag'\nimport { BoxTag } from './Tag/BoxTag'\nimport { PolygonTag } from './Tag/PolygonTag'\nimport { MaskTag } from './Tag/MaskTag'\nimport TagContainerSvelte from '../Components/TagContainer.svelte'\nimport { fiveEveryReadyListener } from '../../shared-utils/five/fiveEveryReadyListener'\nimport { getFiveModel } from '../../shared-utils/five/getFiveModel'\nimport vector3ToArray from '../../shared-utils/three/vector3ToArray'\n\nconst PLUGIN_NAME = 'Dnalogel-PanoTagPlugin'\n\nexport const pluginFlag = (name: string) => `${PLUGIN_NAME}--${name}`\n\nclass PanoTagPluginController extends TagRender {\n public readonly sculptModules: SculptModules\n public mediaManager?: PlaybackManager\n /** state */\n public state = { enabled: true, visible: true }\n\n /** debug */\n private debug: boolean\n\n private debugUtil = new DebugUtil(this)\n\n /** 全局 hover 启用状态,默认 true */\n public globalHoverEnabled = true\n\n private tagContainerTarget?: Element\n\n private readonly handleFiveDispose = () => this.dispose()\n\n public constructor(\n five: Five,\n params?: {\n mediaManager?: PlaybackManager\n config?: Pick<Tags, 'contentTypeConfig' | 'globalConfig'>\n debug?: boolean\n containerZIndex?: number\n },\n ) {\n super(five)\n this.sculptModules = new SculptModules(five, { magnifier: null })\n five.on('dispose', this.handleFiveDispose)\n this.mediaManager = params?.mediaManager\n\n this.params = objectAssignDeep({}, { debug: false, config: this.config }, { ...params, mediaManager: undefined })\n this.debug = this.params.debug\n this.config = this.params.config\n\n if (this.debug) {\n this.debugUtil.bindLog()\n }\n\n // generateBlankAudio(1, { namespace: AudioNamespace.GetAudioDuration })\n generateBlankAudio(1, { namespace: AudioNamespace.PlayAudio })\n\n // Explicit debug opt-in only; normal instances must not retain a global scene.\n if (this.debug) try {\n if (!Array.isArray(window['__PANOTAGPLUGIN_DEBUG_LIST__'])) window['__PANOTAGPLUGIN_DEBUG_LIST__'] = []\n this.NAME = PLUGIN_NAME + '-' + window['__PANOTAGPLUGIN_DEBUG_LIST__'].length\n\n window['__PANOTAGPLUGIN_DEBUG_LIST__'].push(this)\n\n if (!window['__PANOTAGPLUGIN_DEBUG__']) {\n Object.defineProperty(window, '__PANOTAGPLUGIN_DEBUG__', {\n get: function () {\n return window['__PANOTAGPLUGIN_DEBUG_LIST__'].sort((a, b) => b.tags.length - a.tags.length)[0]\n },\n })\n }\n } catch {}\n }\n\n public updateFive(five: Five) {\n if (this.store.disposed) return\n this.five.off('dispose', this.handleFiveDispose)\n super.updateFive(five)\n five.on('dispose', this.handleFiveDispose)\n }\n\n public appendTo(wrapper: Element): void {\n this.container = wrapper\n\n if (this.TagContainerSvelte && this.tagContainerTarget !== wrapper) {\n this.TagContainerSvelte.destroy()\n this.TagContainerSvelte = undefined\n this.tagContainerTarget = undefined\n this.addRenderQueue({ type: 'TagContainerSvelte' })\n }\n if (this.renderQueue.size) this.render()\n }\n\n /**\n * @description 加载数据\n */\n public async load(data: Tags) {\n MaskTag.clearSharedMeshRegistry()\n this.clearTags()\n\n try {\n console.debug(this.NAME, ' load:', { data: JSON.parse(JSON.stringify(data)) })\n } catch (e) {}\n this.config = objectAssignDeep({}, this.config, {\n globalConfig: data.globalConfig ?? {},\n contentTypeConfig: data.contentTypeConfig ?? {},\n })\n\n const result = await this.addTag(data.tagList)\n if (this.store.disposed) return result\n\n // 初始加载后,如果当前在 Panorama 模式,需要触发 Mask 标签的初始化\n if (this.five.state.mode === 'Panorama') {\n this.updateMaskTagsForCurrentPano()\n }\n\n this.hooks.emit('loaded')\n\n return result\n }\n\n /**\n * @description 添加标签\n * @param tag 标签或标签数组\n * @param options 可选配置\n * @param options.updateMaskUrl 是否更新 mask。若为 true 且该 panoIndex 已有 Mask 标签,仅更新其 maskUrl(不变 color、style),并添加新标签\n */\n public async addTag(tag: Tag | Tag[], options?: { updateMaskUrl?: boolean }) {\n const tags = Array.isArray(tag) ? tag : [tag]\n const validTags = tags.filter((tag) => tag.stickType === '3DBox' || tag.stickType === 'Mask' || tag.position)\n\n // 若 updateMaskUrl 为 true,仅更新该点位已有 Mask 标签的 maskUrl(不变 color、style)\n if (options?.updateMaskUrl && validTags.length === 1 && validTags[0].stickType === 'Mask') {\n const tagData = validTags[0]\n const maskUrl = (tagData as any).maskUrl ?? (tagData as any).mask\n const panoIndex = (tagData as any).fiveState?.panoIndex\n if (maskUrl && typeof panoIndex === 'number') {\n const maskTagsAtIndex = this.tags.filter((t) => t instanceof MaskTag && t.fiveState?.panoIndex === panoIndex) as MaskTag[]\n maskTagsAtIndex.forEach((t) => t.set({ mask: maskUrl } as any))\n }\n }\n\n const _tags = validTags.map((tag) => {\n const stickType = getTagStickType(tag)\n\n if (stickType === '2DPoint' || stickType === '3DPoint') {\n return new PointTag(this, tag)\n } else if (stickType === 'Model') {\n return new ModelTag(this, tag)\n } else if (stickType === 'Plane') {\n // 虚拟屏幕等\n return new PlaneTag(this, tag)\n } else if (stickType === '3DBox') {\n return new BoxTag(this, tag)\n } else if (stickType === 'Polygon') {\n return new PolygonTag(this, tag)\n } else if (stickType === 'Mask') {\n return new MaskTag(this, tag)\n }\n\n return null\n })\n _tags.forEach((tag) => formatTag(tag))\n this.tags.push(...(_tags as any[]))\n\n this.tagsLengthWillUpdate = true\n\n return waitFiveModelLoaded(this.five).then(async () => {\n if (this.store.disposed) return\n // 添加事件\n if (this.store.eventListenerDisposer) {\n this.store.eventListenerDisposer?.()\n }\n if (this.state.enabled) {\n this.handleEnable()\n }\n\n this.addResizeListener()\n this.clearUnusedPanelTag()\n\n this.tagsDo(_tags, (tag) => {\n if (this.tags.includes(tag)) {\n tag.updateVisible()\n tag.updateZIndex()\n }\n })\n\n this.setUnfolded()\n\n this.addRenderQueue({ type: 'TagContainerSvelte' })\n\n this.hooks.emit('tagsLengthChange')\n })\n }\n\n /**\n * @description 改变配置\n */\n public changeConfig(config: Pick<Tags, 'globalConfig' | 'contentTypeConfig'>, merge = true) {\n if (merge) {\n this.config = objectAssignDeep({}, this.config, config)\n } else {\n this.config = config\n }\n // 配置改变后要清空缓存,重新计算\n this.tags.forEach((tag) => {\n tag.updateConfig()\n })\n\n this.tagsDo(this.tags, (tag) => tag.updateVisible())\n }\n\n /**\n * @description 改变全局配置\n */\n public changeGlobalConfig(globalConfig: Tags['globalConfig'], merge = true) {\n if (merge) {\n this.config.globalConfig = objectAssignDeep({}, this.config.globalConfig, globalConfig)\n } else {\n this.config.globalConfig = globalConfig\n }\n // 配置改变后要清空缓存,重新计算\n this.tags.forEach((tag) => {\n tag.updateConfig()\n })\n\n this.tagsDo(this.tags, (tag) => {\n tag.updateVisible()\n })\n }\n\n /**\n * @description 改变类型配置\n */\n public changeContentTypeConfig<T extends ContentTypeConfigKey>(key: T, contentTypeConfig: TagConfigByKey<T>, merge = true) {\n if (!this.config.contentTypeConfig) this.config.contentTypeConfig = {}\n if (merge) {\n // @ts-ignore\n this.config.contentTypeConfig[key] = objectAssignDeep({}, this.config.contentTypeConfig[key], contentTypeConfig)\n } else {\n this.config.contentTypeConfig[key] = contentTypeConfig as any\n }\n // 配置改变后要清空缓存,重新计算\n this.tags.forEach((tag) => {\n tag.updateConfig()\n })\n\n this.tagsDo(this.tags, (tag) => {\n tag.updateVisible()\n })\n }\n\n public async show(params?: { userAction?: boolean }) {\n if (this.checkDisposed()) return\n const { userAction = true } = params ?? {}\n this.setState({ visible: true }, { userAction })\n this.hooks.emit('show', { userAction })\n }\n\n public async hide(params?: { userAction?: boolean }) {\n if (this.checkDisposed()) return\n const { userAction = true } = params ?? {}\n this.setState({ visible: false }, { userAction })\n this.hooks.emit('hide', { userAction })\n }\n\n public enable(params?: { userAction?: boolean }) {\n if (this.checkDisposed()) return\n const { userAction = true } = params ?? {}\n this.setState({ enabled: true }, { userAction })\n this.hooks.emit('enable', { userAction })\n }\n\n public disable(params?: { userAction?: boolean }) {\n if (this.checkDisposed()) return\n const { userAction = true } = params ?? {}\n this.setState({ enabled: false }, { userAction })\n this.hooks.emit('disable', { userAction })\n }\n\n public setState(state: Partial<State>, params?: { userAction?: boolean }): void {\n if (this.checkDisposed()) return\n const { userAction = true } = params ?? {}\n const prevState = { ...this.state }\n this.state = Object.assign(this.state, state)\n if (prevState.visible !== this.state.visible) {\n state.visible ? this.handleShow() : this.handleHide()\n }\n if (prevState.enabled !== this.state.enabled) {\n state.enabled ? this.handleEnable() : this.handleDisable()\n }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n /**\n * @description 销毁\n */\n public dispose(): void {\n if (this.store.disposed) return\n this.store.disposed = true\n this.five.off('dispose', this.handleFiveDispose)\n // Debug references must not retain a disposed Five/Three scene across sessions.\n if (typeof window !== 'undefined') {\n const plugins = window['__PANOTAGPLUGIN_DEBUG_LIST__']\n if (Array.isArray(plugins)) {\n const index = plugins.indexOf(this)\n if (index >= 0) plugins.splice(index, 1)\n }\n }\n this.pauseCurrentMedia()\n this.clearTags()\n this.disposeAllCSS3DContainer()\n this.store.disposers?.forEach((d) => d?.())\n this.store.disposers = []\n this.store.eventListenerDisposer?.()\n this.store.eventListenerDisposer = undefined\n this.store.resizeObserverDisposer?.()\n this.store.resizeObserverDisposer = undefined\n this.store.resizeObserverDisposerAdding = false\n this.five.scene.remove(this.group)\n this.group.remove(...this.group.children)\n this.gltfObjectGroup.remove(...this.gltfObjectGroup.children)\n this.imagePlaneGroup.remove(...this.imagePlaneGroup.children)\n this.five.needsRender = true\n this.sculptModules.dispose()\n this.domEvents.dispose()\n this.renderQueue.clear()\n this.hooks.emit('dispose')\n }\n\n /**\n * @description 闪烁标签\n * @param {TagId} id\n * @param {BlinkOptions} animeConfig\n */\n public async blinkTagById(id: TagId, animeConfig?: BlinkOptions) {\n return this.getTagById(id)?.blink(animeConfig)\n }\n\n /**\n * @description 展开/收起指定id的标签\n * @param {TagId} id\n * @param {boolean} unfolded\n */\n public changeUnfoldedById(id: TagId, unfolded: boolean) {\n const tag = this.getTagById(id)\n unfolded ? tag?.unfold() : tag?.fold()\n }\n\n /**\n * @description 启用/停用指定id的标签\n * @param {TagId} id\n * @param {boolean} enabled\n */\n public changeEnabledById(id: TagId, enabled: boolean) {\n const tag = this.getTagById(id)\n if (!tag) return\n tag.enabled = enabled\n tag.hooks?.emit(enabled ? 'enable' : 'disable')\n }\n\n /**\n * @description 修改3D标签normal\n * @param {TagId} id\n * @param {ArrayPosition} normal\n */\n public changeTagNormalById(id: TagId, normal: ArrayPosition) {\n const tag = this.getTagById(id)\n if (!tag) return\n if (!tag.tag3DContentSvelte) return\n tag.tag3DContentSvelte.currentNormal = arrayPositionToVector3(normal)\n }\n\n /**\n * @description 改变data\n */\n public changePositionById(id: TagId, position: Tag['position']) {\n const tag = this.getTagById(id)\n if (!tag) return\n\n tag.setPosition(position)\n }\n\n /**\n * @description 改变data\n */\n public changeDataById<C extends TagContentType = TagContentType>(id: TagId, data: PartialObjectDeep<Tag<C>['data']>, deepMerge = true) {\n const tag = this.getTagById<C>(id)\n if (!tag) return\n tag.setData(data, deepMerge)\n // 3D 转 2D 的时候要销毁 3D container\n this.clearUnusedPanelTag()\n tag.hooks.emit('dataChanged', tag.data)\n }\n\n /**\n * @description 改变tag的stickType\n */\n public changeStickTypeById<C extends TagContentType = TagContentType>(\n id: TagId,\n data: PartialObjectDeep<{ [P in keyof Pick<Tag<C>, 'stickType' | 'position' | 'normal' | 'data'>]: Tag[P] }>,\n deepMerge = true,\n ) {\n this.changeTagById(id, data, deepMerge)\n }\n\n /**\n * @description 改变tag任意属性\n */\n public changeTagById<C extends TagContentType = TagContentType>(id: TagId, tag: PartialObjectDeep<Tag<C>>, deepMerge = true) {\n const currentTag = this.getTagById<C>(id)\n if (!currentTag) return\n\n // 检测 stickType 变更\n if (tag.stickType && tag.stickType !== currentTag.stickType) {\n console.log(`[PanoTagPlugin] stickType changed from ${currentTag.stickType} to ${tag.stickType}, recreating tag`)\n\n // 收集当前 tag 的数据\n const oldTagData: any = { ...currentTag }\n\n // 销毁旧 tag\n this.destroyTagById(id)\n this.five.ready().then(() => {\n // 创建新 tag(合并新数据)\n this.addTag({ ...oldTagData, ...tag } as any)\n })\n return\n }\n\n currentTag.set(tag)\n if (currentTag instanceof MaskTag) (currentTag as MaskTag).updateMaskStyle()\n currentTag.updateVisible()\n\n this.clearUnusedPanelTag()\n currentTag.hooks.emit('dataChanged', currentTag.data)\n }\n\n /**\n * @description 批量更新指定点位的 Mask 图\n * @param maskUpdates 包含点位索引和对应 mask 的数组\n * @example\n * changeMask([\n * { index: 0, mask: 'https://example.com/mask1.png' },\n * { index: 1, mask: canvasElement }\n * ])\n */\n public changeMask(maskUpdates: Array<{ index: number; mask: string | HTMLCanvasElement }>) {\n if (!Array.isArray(maskUpdates) || maskUpdates.length === 0) {\n console.warn('[PanoTagPlugin] changeMask: invalid or empty maskUpdates')\n return\n }\n\n // 遍历每个 mask 更新请求\n maskUpdates.forEach(({ index, mask }) => {\n if (typeof index !== 'number') {\n console.warn('[PanoTagPlugin] changeMask: invalid index', index)\n return\n }\n\n if (!mask) {\n console.warn('[PanoTagPlugin] changeMask: invalid mask for index', index)\n return\n }\n\n // 找到所有在该点位的 MaskTag\n const maskTagsAtIndex = this.tags.filter((tag) => {\n return tag instanceof MaskTag && tag.fiveState?.panoIndex === index\n }) as MaskTag[]\n\n if (maskTagsAtIndex.length === 0) {\n console.debug(`[PanoTagPlugin] changeMask: no MaskTag found at panoIndex ${index}`)\n return\n }\n\n // 更新所有找到的 MaskTag\n maskTagsAtIndex.forEach((tag) => {\n tag.set({ mask } as any)\n console.log(`[PanoTagPlugin] Updated mask for tag ${tag.id} at panoIndex ${index}`)\n })\n })\n\n // 触发渲染\n this.five.needsRender = true\n }\n\n /**\n * @description 销毁tag\n */\n public destroyTagById(id: TagId | TagId[]) {\n const ids = Array.isArray(id) ? id : [id]\n ids.forEach((id) => this.getTagById(id)?.destroy())\n }\n\n /** 更改 tag 模型 */\n public changeTagModel = async (tag: any, data: PartialObjectDeep<Tag<'MediaModel'>['data']>) => {\n tag.data = objectAssignDeep({}, tag.data, data)\n await tag.loadModel?.()\n }\n\n /**\n * @description 清除所有标签\n */\n public clearTags() {\n if (this.tags.length) {\n // Destroy owned resources while retaining the single batch length-change event.\n for (const tag of [...this.tags]) tag.destroy(false)\n this.tags = []\n this.tagsLengthWillUpdate = true\n this.hooks.emit('tagsLengthChange')\n this.disposeAllCSS3DContainer()\n }\n this.TagContainerSvelte?.destroy()\n this.TagContainerSvelte = undefined\n this.tagContainerTarget = undefined\n this.mediaTextures.clear()\n this.enabledModelTagSet.clear()\n this.cache.clear()\n }\n\n /**\n * @description 设置 unfolded\n */\n private async setUnfolded() {\n return new Promise<void>((resolve) => {\n // setTimeout 初始隐藏,然后展开,而不是一步到位,要不就没动画了\n setTimeout(() => {\n this.setUnfoldedByCamera()\n resolve()\n }, 100) // 10ms 是等待 TextTag onMount\n })\n }\n\n private handleShow() {\n this.state.visible = true\n this.group.visible = this.state.enabled\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['state'] })\n this.tagsDo(this.tags, (tag) => tag.updateVisible())\n this.five.needsRender = true\n }\n\n private handleHide() {\n this.pauseCurrentMedia()\n this.state.visible = false\n this.group.visible = false\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['state'] })\n this.five.needsRender = true\n }\n\n private handleEnable() {\n this.state.enabled = true\n this.group.visible = this.state.visible\n this.store.eventListenerDisposer = this.addEventListener()\n if (!this.five.scene.children.includes(this.group)) this.five.scene.add(this.group)\n this.five.needsRender = true\n }\n\n private handleDisable() {\n this.group.visible = false\n this.pauseCurrentMedia()\n this.tags.forEach((item) => item.rectanglePlane?.delete())\n this.state.enabled = false\n this.store.eventListenerDisposer?.()\n this.five.scene.remove(this.group)\n this.TagContainerSvelte?.update({ tags: [] })\n this.five.needsRender = true\n }\n\n private addResizeListener() {\n // resizeObserverDisposerAdding 避免200ms内重复执行 addResizeObserver\n if (!this.store.resizeObserverDisposer && !this.store.resizeObserverDisposerAdding) {\n const resizeObserverDisposer = this.addResizeObserver()\n this.store.resizeObserverDisposerAdding = true\n setTimeout(() => {\n this.store.resizeObserverDisposer = resizeObserverDisposer\n this.store.resizeObserverDisposerAdding = false\n }, 200)\n }\n }\n\n private addResizeObserver() {\n if (this.store.disposed) return\n const observerELement = this.five.getElement()\n // resize\n const show = () => {\n if (!this.state.enabled) return\n this.filterPointTag.forEach((tag) => tag.updateScreenPosition({ force: true }))\n this.temporaryState.visible = true\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['temporaryState'] })\n }\n const hide = () => {\n if (!this.state.enabled) return\n this.temporaryState.visible = false\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['temporaryState'] })\n }\n const { observe: hideObserve, unobserve: hideUnobserve } = resizeObserver(\n throttle(() => {\n /**\n * 加这个判断是因为,第一次添加监听的时候会触发此函数,本来是没问题的,hide()后立马show(),但是show()加了debounce,所以resize触发后先hide,再过500ms才show,就有问题,所以加了这么一个限制\n * 在addTag函数中,先addResizeObserver(),过150ms再设置this.store.resizeObserverDisposer,200ms是resizeObserver添加时间到检测到resize触发resizeObserver的时间,大约100ms,这里加一点\n */\n if (!this.store.resizeObserverDisposer) return\n hide()\n }, 500),\n observerELement,\n )\n const { observe: showObserve, unobserve: showUnobserve } = resizeObserver(\n debounce(() => show(), 400),\n observerELement,\n )\n hideObserve()\n showObserve()\n\n return () => {\n hideUnobserve()\n showUnobserve()\n }\n }\n\n private handleFiveModeChange = (mode: Mode) => {\n const func = () => {\n this.filter2DPointTag.forEach((t) => {\n // 先隐藏,再异步计算可见性\n t.state.visible = false\n t.applyVisible()\n })\n\n this.five.ready().then(() => {\n this.tagsDo(this.tags, (t) => {\n t.updateVisible()\n if (isMediaModelTag(t) && mode !== 'Panorama') this.changeTagMode(t, 'behind')\n })\n\n // 模态切换时更新 Mask 标签:仅在 Panorama 模式下显示\n if (mode === 'Panorama') {\n this.updateMaskTagsForCurrentPano()\n } else {\n // 非 Panorama 模式下隐藏所有 Mask 标签\n this.filterMaskTag.forEach((tag) => {\n tag.state.visible = false\n tag.applyVisible()\n })\n }\n })\n }\n\n if (this.tags.length < 500) func()\n else this.five.ready().then(() => func())\n }\n\n private handleFiveWantsMoveToPano = () => {\n if (this.tags.length > 500) {\n this.temporaryState.visible = false\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['temporaryState'] })\n return\n } else {\n this.temporaryState.visible = true\n this.tags.forEach((tag) => {\n tag.temporaryState.visible = true\n })\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['tags'] })\n this.tags.forEach((tag) => tag.applyVisible())\n }\n }\n\n public clickhandler = (params: TagClickParams) => {\n params.tag.onClick(params)\n }\n\n private handleFiveCameraUpdate = () => {\n this.filterPointTag.forEach((t) => t.updateScreenPosition())\n }\n\n private handleFiveCameraFovUpdate = () => {\n this.handleFiveCameraUpdate()\n this.five.off('render.prepare', this.handleFiveCameraUpdate)\n this.five.on('render.prepare', this.handleFiveCameraUpdate)\n setTimeout(() => {\n this.five.off('render.prepare', this.handleFiveCameraUpdate)\n }, 1000)\n }\n\n private handleFivePanoArrived = async () => {\n this.filter2DPointTag.forEach((t) => {\n // 先隐藏,再异步计算可见性\n t.state.visible = false\n t.applyVisible()\n })\n\n // 更新所有标签的可见性\n this.tagsDo(this.tags, (tag) => {\n tag.updateVisible()\n })\n\n // 处理 Mask 标签:仅当前点位的 Mask 标签可见\n this.updateMaskTagsForCurrentPano()\n\n this.temporaryState.visible = true\n this.addRenderQueue({ type: 'TagContainerSvelte', keys: ['temporaryState'] })\n\n await this.setUnfolded()\n // 处理自动转向(纯模型 Model 与 虚拟模型 VirtualObject 均支持)\n this.tags\n .filter(isAutoLookAtModelTag)\n .filter((tag) => tag.getConfig().modelConfig?.autoLookAtEnabled)\n .forEach((tag) => {\n const tempObject = new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial())\n const object = tag.model?.object\n if (!object) return\n tempObject.position.copy(object.position)\n tempObject.quaternion.copy(object.quaternion)\n const cameraPosition = this.five.camera.position\n tempObject.lookAt(cameraPosition.clone().setY(tempObject.position.y))\n const startQuaternion = object.quaternion.clone()\n const endQuaternion = tempObject.quaternion.clone()\n const anime = tweenProgress()\n anime.onUpdate(({ progress }) => {\n object.quaternion.copy(startQuaternion.clone().slerp(endQuaternion, progress))\n })\n anime.play()\n })\n }\n\n /** 楼层切换时,需要更新标签可见性 */\n private handleFiveModelShownFloorChange = () => {\n this.tagsDo(this.tags, (tag) => tag.updateVisible())\n }\n\n private onFiveRefined = debounce(() => {\n if (isModelLike(this.five.getCurrentState().mode)) {\n this.setUnfoldedByCamera()\n } else {\n this.tags.forEach((tag) => tag.cache.clear())\n }\n\n this.tagsDo(this.tags, (tag) => tag.updateVisible())\n })\n\n private onFiveEveryReady = () => {\n this.setUnfoldedByCamera()\n if (isModelLike(this.five.getCurrentState().mode)) {\n this.tagsDo(this.tags, (tag) => tag.updateVisible())\n }\n }\n\n private setUnfoldedByCamera() {\n let hasTagUnfolded = false // 是否有标签由于camera的转动而展开\n this.filterPointTag.forEach((tag) => {\n const unfolded = tag.getUnfoldedByCamera()\n if (!tag.state) return\n if (unfolded === undefined) return\n // 视野外的/保持开启的标签,不应该认为是展开了而导致其他标签收起,所以这里的 `hasTagUnfolded=true` 是否执行要有一些判断\n if (unfolded === true && tag.screenPosition) {\n const unfoldedConfig = tag.getConfig().unfoldedConfig\n if (safeObj(unfoldedConfig).keep !== 'unfolded') {\n hasTagUnfolded = true\n }\n }\n tag.state.unfolded = unfolded\n })\n\n if (hasTagUnfolded) {\n this.filterPointTag.forEach((tag) => {\n const unfoldedConfig = tag.getConfig().unfoldedConfig\n if (typeof unfoldedConfig === 'object') {\n if (unfoldedConfig.autoUnfold) return // 如果有标签由于camera的转动而展开,则将所有没有配置autoUnfold的标签收起\n if (unfoldedConfig.autoUnfold === false) return // 如果有标签不需要自动展开/收起,跳过\n if (safeObj(unfoldedConfig.autoUnfold).enable === false) return // 同上, 另一种配置方式\n if (unfoldedConfig.keep) return // 不动keep标签\n }\n if (tag.state) tag.state.unfolded = false\n })\n }\n }\n\n private changeTagMode(tag: TagInstance, mode: 'behind' | 'front') {\n if (tag.tag3DContentSvelte?.css3DInstance) {\n tag.tag3DContentSvelte.css3DInstance.mode = mode\n }\n }\n\n /**\n * @description 添加 cameraUpdate, panoArrived 等事件监听\n */\n private addEventListener() {\n const { five, hooks } = this\n\n const fiveEveryReadyListenerDisposer = fiveEveryReadyListener(this.five, this.onFiveEveryReady)\n\n this.handleFivePanoArrived()\n\n // 走点/切换模型时临时隐藏\n five.on('wantsMoveToPano', this.handleFiveWantsMoveToPano)\n // 模型替换,需要视为一次新的加载\n five.on('models.refined', this.onFiveRefined)\n five.on('modeChange', this.handleFiveModeChange)\n five.on('modelShownFloorChange', this.handleFiveModelShownFloorChange)\n // Five旋转时更新位置\n five.on('cameraUpdate', this.handleFiveCameraUpdate)\n five.on('cameraFovUpdate', this.handleFiveCameraFovUpdate)\n five.on('panoArrived', this.handleFivePanoArrived)\n five.on('panoArrived', this.loadVideoFirstFrame)\n five.on('render.prepare', this.render)\n hooks.on('click', this.clickhandler)\n\n return () => {\n fiveEveryReadyListenerDisposer()\n five.off('wantsMoveToPano', this.handleFiveWantsMoveToPano)\n five.off('models.refined', this.onFiveRefined)\n five.off('modeChange', this.handleFiveModeChange)\n five.off('modelShownFloorChange', this.handleFiveModelShownFloorChange)\n five.off('cameraUpdate', this.handleFiveCameraUpdate)\n five.off('cameraFovUpdate', this.handleFiveCameraFovUpdate)\n five.off('panoArrived', this.handleFivePanoArrived)\n five.off('panoArrived', this.loadVideoFirstFrame)\n five.off('render.prepare', this.render)\n hooks.off('click', this.clickhandler)\n this.store.eventListenerDisposer = undefined\n }\n }\n\n public render = () => {\n if (this.store.disposed) {\n this.renderQueue.clear()\n return\n }\n const container = this.container\n // A live Five can be detached briefly during a host change. Retain work until it is attached.\n if (!container?.isConnected) return\n if (this.TagContainerSvelte && this.tagContainerTarget !== container) {\n this.TagContainerSvelte.destroy()\n this.TagContainerSvelte = undefined\n this.tagContainerTarget = undefined\n this.addRenderQueue({ type: 'TagContainerSvelte' })\n }\n this.renderQueue.forEach((value, key) => {\n const { keys } = value\n const type = key\n\n if (type === 'TagContainerSvelte') {\n const tags = this.filterPointTag.filter((tag) => tag.screenPosition)\n const props = {\n hooks: this.hooks,\n tags,\n state: this.state,\n temporaryState: this.temporaryState,\n mediaStore: this.mediaStore,\n rendererMap: this.rendererMap,\n contentTypeMap: this.contentTypeMap,\n zIndex: this.params.containerZIndex,\n }\n\n if (!this.TagContainerSvelte) {\n this.TagContainerSvelte = mountComponent(TagContainerSvelte, container, { ...props, state: { ...this.state, enabled: false } })\n this.tagContainerTarget = container\n nextFrame(() => {\n // 为了渐显的动画效果\n this.TagContainerSvelte?.update({ state: this.state })\n })\n } else {\n let partialProps = {}\n if (keys.length === 0) {\n partialProps = props\n } else {\n for (const key of keys) {\n partialProps[key] = props[key]\n }\n }\n this.TagContainerSvelte.update(partialProps)\n }\n }\n })\n this.renderQueue.clear()\n }\n\n /**\n * @description 设置标签 hover 启用状态\n */\n public setTagHoverEnabled(id: TagId, enabled: boolean) {\n const tag = this.getTagById(id)\n if (tag) tag.hoverEnabled = enabled\n }\n\n /**\n * @description 获取标签 hover 启用状态\n */\n public getTagHoverEnabled(id: TagId): boolean | undefined {\n const tag = this.getTagById(id)\n return tag?.hoverEnabled\n }\n\n /**\n * 设置全局 hover 启用状态\n */\n public setGlobalHoverEnabled(enabled: boolean) {\n this.globalHoverEnabled = enabled\n }\n\n /**\n * 获取全局 hover 启用状态\n */\n public getGlobalHoverEnabled() {\n return this.globalHoverEnabled\n }\n\n /**\n * 验证 ArrayPosition 是否为有效格式\n * @param value 待验证的值\n * @returns 是否为有效的 ArrayPosition\n */\n private isValidArrayPosition(value: any): value is ArrayPosition {\n // 检查是否为数组\n if (!Array.isArray(value)) {\n return false\n }\n\n // 检查数组长度是否为3(x, y, z坐标)\n if (value.length !== 3) {\n return false\n }\n\n // 检查所有元素是否为有效数字\n return value.every((item) => typeof item === 'number' && !isNaN(item) && isFinite(item))\n }\n\n /**\n * 更新当前点位的 Mask 标签\n * Mask 标签仅在当前点位可见\n */\n private updateMaskTagsForCurrentPano(): void {\n const currentPanoIndex = this.five.getCurrentState().panoIndex\n console.log(\n '[PanoTagPlugin] updateMaskTagsForCurrentPano, current panoIndex:',\n currentPanoIndex,\n 'mask tags count:',\n this.filterMaskTag.length,\n )\n\n // 筛选 Mask 类型的标签并更新\n this.filterMaskTag.forEach((tag) => {\n const tagPanoIndex = tag.fiveState?.panoIndex\n console.log(\n '[PanoTagPlugin] Processing mask tag:',\n tag.id,\n 'tagPanoIndex:',\n tagPanoIndex,\n 'matches current:',\n tagPanoIndex === currentPanoIndex,\n )\n\n // 如果是当前点位的标签,确保可见性已更新\n if (tagPanoIndex === currentPanoIndex) {\n console.log('[PanoTagPlugin] Tag matches current pano, updating visibility...')\n tag.updateVisible()\n // 触发 applyVisible 以加载 mask\n tag.applyVisible()\n } else {\n // 不是当前点位的标签,确保不可见\n if (tag.visible) {\n console.log('[PanoTagPlugin] Tag is from different pano, hiding...')\n tag.state.visible = false\n tag.applyVisible()\n }\n }\n })\n }\n\n /**\n * 获取所有 Mask 类型的标签\n */\n public get filterMaskTag() {\n return this.tags.filter((tag) => tag.stickType === 'Mask')\n }\n\n /**\n * 获取 MaskTag 性能统计信息(用于性能监控和调试)\n * @returns 性能统计信息\n */\n public getMaskTagPerformanceStats() {\n const cacheStats = MaskTag.getCacheStats()\n const maskTagCount = this.filterMaskTag.length\n const visibleMaskTags = this.filterMaskTag.filter((tag) => tag.visible).length\n\n return {\n // 标签统计\n totalMaskTags: maskTagCount,\n visibleMaskTags,\n // 纹理缓存统计\n textureCache: cacheStats,\n // 当前点位\n currentPanoIndex: this.five.state.panoIndex,\n }\n }\n\n /**\n * 清理所有 MaskTag 纹理缓存(用于内存管理)\n * 注意:这会释放所有纹理缓存,谨慎使用\n */\n public clearMaskTagCache() {\n MaskTag.clearAllCache()\n }\n}\n\nexport default PanoTagPluginController\nexport { PanoTagPluginController }\n"],"ignoreList":[0,1,2],"mappings":"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"}