@crystaldesign/diva-web-planner-react 26.11.0-beta.3 → 26.11.0-beta.31

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 (325) hide show
  1. package/build/esm/{Planner2DGrid-be22bf89.js → Planner2DGrid-2b75d076.js} +196 -49
  2. package/build/esm/{Planner3DImage-8f21be56.js → Planner3DImage-1227ae4d.js} +1 -1
  3. package/build/esm/{UnlockCard-3fb76e70.js → UnlockCard-d453caf5.js} +1 -1
  4. package/build/esm/{index-94eb5a0b.js → index-02bf80c2.js} +19 -19
  5. package/build/esm/{index-854179de.js → index-0333c640.js} +1 -1
  6. package/build/esm/{index-624149c8.js → index-03f331f1.js} +2 -2
  7. package/build/esm/{index-345aba6b.js → index-0853f3bb.js} +65 -65
  8. package/build/esm/{index-e7790e24.js → index-0c2e994b.js} +5 -5
  9. package/build/esm/index-0db38456.js +965 -0
  10. package/build/esm/{index-3c925a9c.js → index-1072cce1.js} +2 -2
  11. package/build/esm/{index-a01e0683.js → index-10c55954.js} +1 -1
  12. package/build/esm/{index-61b4ebd3.js → index-10c77efd.js} +1 -1
  13. package/build/esm/{index-882e9781.js → index-10eb429e.js} +1 -1
  14. package/build/esm/{index-2b748074.js → index-16180e43.js} +1 -1
  15. package/build/esm/{index-180189d9.js → index-18691afe.js} +70 -70
  16. package/build/esm/{index-e484cb4b.js → index-194db4dd.js} +3 -3
  17. package/build/esm/{index-369fda13.js → index-19924394.js} +2 -2
  18. package/build/esm/{index-031864a2.js → index-1a1d9d49.js} +1 -1
  19. package/build/esm/{index-57f6aec3.js → index-1b0f4452.js} +1 -1
  20. package/build/esm/{index-aecb9e6f.js → index-1c06aee7.js} +6 -6
  21. package/build/esm/{index-e660d80c.js → index-1cda158b.js} +1 -1
  22. package/build/esm/{index-c5945db2.js → index-206543ad.js} +2 -4
  23. package/build/esm/{index-765505ab.js → index-2404c1a5.js} +3 -3
  24. package/build/esm/{index-e6d39b9d.js → index-2464d448.js} +18 -18
  25. package/build/esm/{index-23cd98ff.js → index-2487bbcd.js} +4 -4
  26. package/build/esm/{index-fbd3287b.js → index-271b050d.js} +5 -5
  27. package/build/esm/{index-9a249b74.js → index-272fbc41.js} +1 -1
  28. package/build/esm/{index-1e8d1616.js → index-27d63749.js} +66 -66
  29. package/build/esm/{index-84f83c67.js → index-28e8c543.js} +1 -1
  30. package/build/esm/{index-c7d3af7e.js → index-29152556.js} +73 -73
  31. package/build/esm/{index-fdf86798.js → index-299dd1d7.js} +91 -91
  32. package/build/esm/{index-24df5db1.js → index-2b222904.js} +3 -3
  33. package/build/esm/{index-fcb72e7d.js → index-2b311736.js} +89 -87
  34. package/build/esm/{index-83d6bb83.js → index-2b816cbb.js} +1 -1
  35. package/build/esm/{index-dc3778bc.js → index-2cae4848.js} +1 -1
  36. package/build/esm/{index-1e23c982.js → index-2cf7b7c7.js} +1 -1
  37. package/build/esm/{index-69650205.js → index-2e37ec62.js} +5 -5
  38. package/build/esm/{index-8b0a3174.js → index-2ed702ed.js} +1 -1
  39. package/build/esm/{index-a52f90e6.js → index-2f6a6006.js} +2 -2
  40. package/build/esm/{index-6092fed5.js → index-2f9f8710.js} +8 -8
  41. package/build/esm/{index-4a1aeedd.js → index-3258f83f.js} +20 -20
  42. package/build/esm/{index-73c75e94.js → index-32ce6566.js} +4 -4
  43. package/build/esm/{index-45ae8ca7.js → index-3320c27f.js} +1 -1
  44. package/build/esm/{index-34149b78.js → index-338ca5e6.js} +5 -5
  45. package/build/esm/{index-b48334cf.js → index-33eb7ce7.js} +10 -1
  46. package/build/esm/{index-7c7b6fc7.js → index-358782f0.js} +1 -1
  47. package/build/esm/{index-f3c7eafa.js → index-379178ce.js} +1 -1
  48. package/build/esm/{index-89fd7133.js → index-37992051.js} +1 -1
  49. package/build/esm/{index-0b387613.js → index-3850649b.js} +90 -90
  50. package/build/esm/{index-8839bff1.js → index-391a1ec3.js} +6 -6
  51. package/build/esm/{index-938c8c26.js → index-3a045c84.js} +2 -2
  52. package/build/esm/{index-7e78bbac.js → index-3c161268.js} +76 -76
  53. package/build/esm/{index-1ddf1648.js → index-3c381642.js} +1 -1
  54. package/build/esm/{index-0e80abeb.js → index-3dc757b3.js} +1 -1
  55. package/build/esm/{index-10cd9e60.js → index-3f715701.js} +7 -7
  56. package/build/esm/{index-1010faf1.js → index-3f7ecb08.js} +3 -3
  57. package/build/esm/{index-6c6b3de5.js → index-3fdc60c5.js} +13 -13
  58. package/build/esm/{index-52eb8599.js → index-3fe0571a.js} +1 -1
  59. package/build/esm/{index-00e54c23.js → index-400d2ad9.js} +1 -1
  60. package/build/esm/{index-7176a968.js → index-40a7066f.js} +3 -3
  61. package/build/esm/{index-959f5aa0.js → index-40ca64b7.js} +22 -22
  62. package/build/esm/{index-15d52408.js → index-414bc9db.js} +1 -1
  63. package/build/esm/{index-0908ac1e.js → index-422b59cb.js} +3 -3
  64. package/build/esm/{index-8b6d1b2c.js → index-45153c84.js} +4 -4
  65. package/build/esm/{index-4d855034.js → index-48709d20.js} +6 -4
  66. package/build/esm/{index-37df8f9a.js → index-4a8a4ca9.js} +1 -1
  67. package/build/esm/index-4bb61877.js +99 -0
  68. package/build/esm/{index-661042a0.js → index-4cbc4390.js} +2 -2
  69. package/build/esm/{index-bb42994c.js → index-5008e5b3.js} +89 -89
  70. package/build/esm/{index-f1c2ec32.js → index-5119923c.js} +1 -1
  71. package/build/esm/{index-42b71e75.js → index-52b3d317.js} +101 -101
  72. package/build/esm/{index-ef5f8f90.js → index-547fbb34.js} +1 -1
  73. package/build/esm/{index-33722dfd.js → index-55098080.js} +1 -1
  74. package/build/esm/{index-e8eb5116.js → index-556e0a0d.js} +2 -2
  75. package/build/esm/{index-2e12b9e1.js → index-57eef9cd.js} +1 -1
  76. package/build/esm/{index-415fbe83.js → index-59ab02a8.js} +1 -1
  77. package/build/esm/{index-b6397dbb.js → index-5bad73d3.js} +1 -1
  78. package/build/esm/{index-45b6610c.js → index-5e2f0c6a.js} +69 -69
  79. package/build/esm/{index-dca10eb4.js → index-5f7f6732.js} +1 -1
  80. package/build/esm/{index-1ff0dfac.js → index-6039a611.js} +17 -17
  81. package/build/esm/{index-b85db3a5.js → index-616c60b0.js} +2 -2
  82. package/build/esm/{index-84657f6d.js → index-641d330b.js} +1 -1
  83. package/build/esm/{index-5ad09ef7.js → index-6451eefd.js} +1 -1
  84. package/build/esm/{index-46e9d390.js → index-64c00abe.js} +2 -2
  85. package/build/esm/{index-bc988fdf.js → index-662eb542.js} +1 -1
  86. package/build/esm/{index-9663c0f2.js → index-669f8a5e.js} +1 -1
  87. package/build/esm/{index-9562a9d8.js → index-67dafeb1.js} +1 -1
  88. package/build/esm/{index-985d0ac1.js → index-67fd43fc.js} +1 -1
  89. package/build/esm/{index-b9739a43.js → index-68aac09d.js} +85 -85
  90. package/build/esm/{index-d6856cc5.js → index-690d4a89.js} +2 -2
  91. package/build/esm/{index-d8f30b62.js → index-694817c3.js} +1 -1
  92. package/build/esm/{index-ff020436.js → index-6a7c9333.js} +1 -1
  93. package/build/esm/{index-47939b53.js → index-6a8751d6.js} +1 -1
  94. package/build/esm/{index-69436c25.js → index-6b77bd94.js} +3 -3
  95. package/build/esm/{index-181ff2a0.js → index-6c60ca58.js} +2 -2
  96. package/build/esm/{index-a0e22978.js → index-6d2016bc.js} +1 -1
  97. package/build/esm/{index-e56bf428.js → index-6e47a0c6.js} +1 -1
  98. package/build/esm/{index-0c7b8562.js → index-6f763a0d.js} +1 -1
  99. package/build/esm/{index-efa06494.js → index-7073f1d4.js} +3 -3
  100. package/build/esm/{index-01e167be.js → index-7236a7cb.js} +1 -1
  101. package/build/esm/{index-315a6526.js → index-75224a75.js} +7 -3
  102. package/build/esm/{index-bd8d0479.js → index-77d97795.js} +5 -5
  103. package/build/esm/{index-8a26a858.js → index-7847734a.js} +141 -76
  104. package/build/esm/{index-08d97746.js → index-79f86b9d.js} +25 -25
  105. package/build/esm/{index-f74add7e.js → index-7acb06b8.js} +5 -5
  106. package/build/esm/{index-f45ab225.js → index-7af6bd59.js} +1 -1
  107. package/build/esm/{index-1f095fe3.js → index-7b297c46.js} +1 -1
  108. package/build/esm/{index-869d65ec.js → index-7b53cb6f.js} +8 -8
  109. package/build/esm/{index-102ef56e.js → index-7c6580b8.js} +1 -1
  110. package/build/esm/{index-f930afa0.js → index-7e9f924b.js} +6 -6
  111. package/build/esm/{index-606a110b.js → index-7fe3a425.js} +1 -1
  112. package/build/esm/{index-9eccf0e1.js → index-8060c2a2.js} +71 -71
  113. package/build/esm/{index-17bcc39b.js → index-8061e6bf.js} +14 -3
  114. package/build/esm/{index-5665b09a.js → index-83047454.js} +1 -1
  115. package/build/esm/{index-c87402ba.js → index-8331fe6e.js} +2 -2
  116. package/build/esm/{index-74d46a1a.js → index-833cefe9.js} +1 -1
  117. package/build/esm/{index-555b281e.js → index-8463c6a5.js} +3 -3
  118. package/build/esm/{index-892ffe4d.js → index-8499494f.js} +1 -1
  119. package/build/esm/{index-e46ca62c.js → index-85481862.js} +4 -4
  120. package/build/esm/{index-40ca5eeb.js → index-887c29b3.js} +1 -1
  121. package/build/esm/{index-0895f2f3.js → index-8b6c72e9.js} +3 -3
  122. package/build/esm/{index-9e661597.js → index-8d0b4891.js} +1 -1
  123. package/build/esm/{index-eee225cf.js → index-8d4146a2.js} +2 -2
  124. package/build/esm/{index-b692e521.js → index-8d7257ee.js} +1 -1
  125. package/build/esm/{index-1d481484.js → index-8e185186.js} +90 -90
  126. package/build/esm/{index-8ce6adb9.js → index-8f5fa9b4.js} +2 -2
  127. package/build/esm/{index-8f8d141b.js → index-908bce4f.js} +3 -3
  128. package/build/esm/{index-048552f0.js → index-9165b357.js} +1 -1
  129. package/build/esm/{index-bf19aa67.js → index-91ad05f6.js} +1 -1
  130. package/build/esm/{index-3e454946.js → index-92417bd8.js} +68 -68
  131. package/build/esm/{index-2a46675e.js → index-93f74e2c.js} +66 -66
  132. package/build/esm/{index-347c80d9.js → index-946da47d.js} +1 -1
  133. package/build/esm/{index-f8660916.js → index-94d86bd9.js} +1 -1
  134. package/build/esm/{index-d4be771b.js → index-9575339b.js} +1 -1
  135. package/build/esm/{index-6b55f02e.js → index-96514191.js} +1 -1
  136. package/build/esm/{index-fdd2f2b6.js → index-98e4cdc7.js} +3 -3
  137. package/build/esm/{index-b9ea263d.js → index-9a895999.js} +1 -1
  138. package/build/esm/{index-0e05b6b9.js → index-9b6a85c0.js} +1 -1
  139. package/build/esm/{index-e2678bc3.js → index-9c36655a.js} +1 -1
  140. package/build/esm/{index-149ee0c3.js → index-9d20e056.js} +1 -1
  141. package/build/esm/{index-cdb372f1.js → index-9f13b7ff.js} +2 -2
  142. package/build/esm/{index-9e2ca930.js → index-9f80fe18.js} +18 -18
  143. package/build/esm/{index-87345a21.js → index-a271c87b.js} +2 -2
  144. package/build/esm/{index-5c1c1b31.js → index-a3ee4fb5.js} +2 -2
  145. package/build/esm/{index-2ad23b0d.js → index-a52784b9.js} +1 -1
  146. package/build/esm/{index-337b35af.js → index-a7227654.js} +2 -2
  147. package/build/esm/{index-8d2f95c8.js → index-a89b343c.js} +1 -1
  148. package/build/esm/{index-3ee68248.js → index-a8c57af9.js} +2 -2
  149. package/build/esm/{index-b011252f.js → index-a9073adb.js} +7 -7
  150. package/build/esm/{index-17ba7b38.js → index-aaa125d1.js} +5 -5
  151. package/build/esm/{index-ff3db23f.js → index-ab54b2e5.js} +5 -5
  152. package/build/esm/{index-56d95f56.js → index-ab8dc8e0.js} +21 -21
  153. package/build/esm/{index-85269def.js → index-ac1c2f4d.js} +8 -8
  154. package/build/esm/{index-07075961.js → index-aea56c2a.js} +1 -1
  155. package/build/esm/{index-5d29eff3.js → index-b39ee00c.js} +4 -4
  156. package/build/esm/{index-da2a2a8b.js → index-b3b30d08.js} +18 -18
  157. package/build/esm/{index-5dce3fc8.js → index-b3de81d6.js} +1 -1
  158. package/build/esm/{index-5b795c7b.js → index-b83c7ccf.js} +1 -1
  159. package/build/esm/{index-c45f18fe.js → index-b8763b90.js} +1 -1
  160. package/build/esm/{index-bdf5827b.js → index-b9802779.js} +5 -5
  161. package/build/esm/{index-eb30bc4d.js → index-b9c5ddd0.js} +1 -1
  162. package/build/esm/{index-0ec473cc.js → index-ba7e105d.js} +1 -1
  163. package/build/esm/{index-e5e0e394.js → index-be32a2e2.js} +5 -5
  164. package/build/esm/{index-f3bca3be.js → index-c0027e7d.js} +1 -1
  165. package/build/esm/{index-c1bf3a44.js → index-c0eee176.js} +1 -1
  166. package/build/esm/{index-af4148a4.js → index-c176f45a.js} +2 -2
  167. package/build/esm/{index-03a0fdc9.js → index-c4c5a8a3.js} +1 -1
  168. package/build/esm/{index-be4baeb9.js → index-c703f557.js} +2 -2
  169. package/build/esm/{index-16fe405b.js → index-c73d78e9.js} +3 -3
  170. package/build/esm/{index-4be1fee3.js → index-c79424f1.js} +2 -2
  171. package/build/esm/{index-8d52e836.js → index-c883c4df.js} +3 -3
  172. package/build/esm/{index-70bf7fb6.js → index-c8b29988.js} +2 -2
  173. package/build/esm/{index-36c018f3.js → index-c8cae97b.js} +99 -9
  174. package/build/esm/{index-0029288b.js → index-c9846514.js} +1 -1
  175. package/build/esm/{index-0db57583.js → index-caa3b342.js} +1 -1
  176. package/build/esm/{index-899b8922.js → index-cb3f6a27.js} +1122 -664
  177. package/build/esm/{index-26dda831.js → index-cb9081ef.js} +65 -65
  178. package/build/esm/{index-5ec0c2dc.js → index-cbd560c7.js} +1 -1
  179. package/build/esm/{index-fedccb21.js → index-cd273297.js} +100 -100
  180. package/build/esm/{index-c46b6740.js → index-cdeee431.js} +1 -1
  181. package/build/esm/{index-5db7e072.js → index-ce0d2469.js} +5 -5
  182. package/build/esm/{index-1d2d7fb6.js → index-cf02d8ed.js} +1 -1
  183. package/build/esm/{index-1487d493.js → index-cf1ece86.js} +2 -2
  184. package/build/esm/{index-5ad9fa64.js → index-cf2be7df.js} +1 -1
  185. package/build/esm/{index-b6aaff5c.js → index-cf741bb6.js} +3 -3
  186. package/build/esm/{index-5ec31db5.js → index-d1328d1a.js} +2 -2
  187. package/build/esm/{index-e260a81a.js → index-d1f0b856.js} +2 -2
  188. package/build/esm/{index-6fe3ff14.js → index-d40b4ce1.js} +1 -1
  189. package/build/esm/{index-06656766.js → index-d4eab021.js} +1 -1
  190. package/build/esm/{index-93284a2c.js → index-d4ec5318.js} +3 -3
  191. package/build/esm/{index-618fdc08.js → index-d52c9f36.js} +39 -21
  192. package/build/esm/{index-faafc31d.js → index-d75c35b5.js} +2 -2
  193. package/build/esm/{index-08994c71.js → index-d9da042a.js} +1 -1
  194. package/build/esm/{index-7488e2e2.js → index-dc237063.js} +84 -84
  195. package/build/esm/{index-afe33b8f.js → index-dc8c8574.js} +1 -1
  196. package/build/esm/{index-74d5ee8b.js → index-dcd6a0ea.js} +1 -1
  197. package/build/esm/{index-73463d9f.js → index-dd8ec79f.js} +1 -1
  198. package/build/esm/{index-bc8576ec.js → index-ddda70a5.js} +1 -1
  199. package/build/esm/{index-a7de9a70.js → index-df8e375c.js} +3 -3
  200. package/build/esm/{index-82a28d6e.js → index-dff2807c.js} +1 -1
  201. package/build/esm/{index-8cef9ec1.js → index-e07e8f93.js} +68 -68
  202. package/build/esm/{index-5abf6852.js → index-e18c00bd.js} +15 -15
  203. package/build/esm/{index-4daa80c5.js → index-e1c75dfc.js} +1 -1
  204. package/build/esm/{index-43d382c8.js → index-e2aeaa39.js} +3 -3
  205. package/build/esm/{index-895e928a.js → index-e2e6dcb6.js} +1 -1
  206. package/build/esm/{index-c8de3993.js → index-eaf1a6ef.js} +1 -1
  207. package/build/esm/{index-a1680ef5.js → index-ebf38440.js} +2 -2
  208. package/build/esm/{index-ada3c152.js → index-ed1206ec.js} +1 -1
  209. package/build/esm/{index-ac5a2704.js → index-ed7bf98f.js} +3 -3
  210. package/build/esm/{index-a784e48f.js → index-f07c90dd.js} +1 -1
  211. package/build/esm/{index-34a1419b.js → index-f330506c.js} +1 -1
  212. package/build/esm/{index-581409b8.js → index-f450f41e.js} +2 -2
  213. package/build/esm/{index-e0900a31.js → index-f716563e.js} +1 -1
  214. package/build/esm/{index-a01842a6.js → index-f717b58f.js} +1 -1
  215. package/build/esm/{index-4e4215ad.js → index-f755ce67.js} +1 -1
  216. package/build/esm/{index-e424ab5b.js → index-f89aa898.js} +2 -2
  217. package/build/esm/{index-5bd398a7.js → index-f8c8fae6.js} +1 -1
  218. package/build/esm/{index-99c94447.js → index-f8d7c164.js} +3 -3
  219. package/build/esm/{index-cfc0389d.js → index-fcd58621.js} +70 -70
  220. package/build/esm/{index-7ae6b393.js → index-fd1c9763.js} +67 -67
  221. package/build/esm/{index-71c05fb2.js → index-fe3494ee.js} +1 -1
  222. package/build/esm/{index-ead3c18e.js → index-ff1065a1.js} +2 -2
  223. package/build/esm/{index-a366d35e.js → index-ff268b26.js} +1 -1
  224. package/build/esm/index.js +1 -1
  225. package/build/esm/{index.module-ce9cbd44.js → index.module-1cc8ad31.js} +1 -1
  226. package/build/esm/{index.module-efce36dc.js → index.module-3f8bfc0b.js} +1 -1
  227. package/build/esm/{index.module-d13df9cf.js → index.module-4cc34c00.js} +1 -1
  228. package/build/esm/{index.module-41cf846f.js → index.module-4ecae8d9.js} +1 -1
  229. package/build/esm/{index.module-15c22604.js → index.module-78232b3d.js} +1 -1
  230. package/build/esm/{index.module-76c17bd6.js → index.module-b5b7f250.js} +1 -1
  231. package/build/esm/{index.module-25cdca01.js → index.module-e90b0636.js} +1 -1
  232. package/build/esm/{index.module-5bcecdc6.js → index.module-ffca26b5.js} +1 -1
  233. package/build/esm/{useCustomDimensions-f2bb4edd.js → useCustomDimensions-9be96ee7.js} +1 -1
  234. package/build/esm/{ussIsSticky-6dac519b.js → ussIsSticky-e203c3a2.js} +1 -1
  235. package/build/types/web-planner-react/src/analyzerComponents.d.ts +5 -1
  236. package/build/types/web-planner-react/src/analyzerComponents.d.ts.map +1 -1
  237. package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/ToolContainer/index.d.ts.map +1 -1
  238. package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/index.d.ts.map +1 -1
  239. package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/types.d.ts +1 -1
  240. package/build/types/web-planner-react/src/components/Layout/wysiwyg/Toolbar/types.d.ts.map +1 -1
  241. package/build/types/web-planner-react/src/components/Product/Product/catalog/Sidebar/index.d.ts.map +1 -1
  242. package/build/types/web-planner-react/src/components/Product/Product/catalog/index.d.ts +1 -1
  243. package/build/types/web-planner-react/src/components/Product/Product/catalog/index.d.ts.map +1 -1
  244. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerMsgContainer/PlannerMsgItem/index.d.ts.map +1 -1
  245. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/accessoryPlacementMode.d.ts +8 -0
  246. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/accessoryPlacementMode.d.ts.map +1 -0
  247. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/index.d.ts +6 -0
  248. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/index.d.ts.map +1 -0
  249. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/poolDimensionConfigs.d.ts +18 -0
  250. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/poolDimensionConfigs.d.ts.map +1 -0
  251. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/useCreateImageShot.d.ts +15 -0
  252. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerRTVNext/useCreateImageShot.d.ts.map +1 -0
  253. package/build/types/web-planner-react/src/components/Product/ProductCenter/PlannerUI/Items/PosNr/index.d.ts.map +1 -1
  254. package/build/types/web-planner-react/src/components/Product/ProductCenter/index.d.ts.map +1 -1
  255. package/build/types/web-planner-react/src/components/Settings/SettingsHeaderContainer/SettingsItemHeader/SettingsPosNrContainer/index.d.ts.map +1 -1
  256. package/build/types/web-planner-react/src/components/Settings/SettingsScroller/SettingsItem/ItemPalette/ShelfPlanner/ShelfAccessoires/index.d.ts.map +1 -1
  257. package/build/types/web-planner-react/src/components/Settings/SettingsScroller/SettingsItem/ItemPalette/ShelfPlanner/index.d.ts.map +1 -1
  258. package/build/types/web-planner-react/src/index.d.ts +9 -1
  259. package/build/types/web-planner-react/src/index.d.ts.map +1 -1
  260. package/build/types/web-planner-react/src/model/DivaViewHandler.d.ts +10 -1
  261. package/build/types/web-planner-react/src/model/DivaViewHandler.d.ts.map +1 -1
  262. package/build/types/web-planner-react/src/model/Palette/PaletteViewHandler.d.ts +7 -3
  263. package/build/types/web-planner-react/src/model/Palette/PaletteViewHandler.d.ts.map +1 -1
  264. package/build/types/web-planner-react/src/model/Planner/ViewPlannerHandler.d.ts +11 -1
  265. package/build/types/web-planner-react/src/model/Planner/ViewPlannerHandler.d.ts.map +1 -1
  266. package/build/types/web-planner-react/src/model/Planner/Viewer/Interface/IViewPlanner2DGrid.d.ts +1 -1
  267. package/build/types/web-planner-react/src/model/Planner/Viewer/Interface/IViewPlanner2DGrid.d.ts.map +1 -1
  268. package/build/types/web-planner-react/src/model/Planner/Viewer/Planner2DGrid.d.ts +14 -1
  269. package/build/types/web-planner-react/src/model/Planner/Viewer/Planner2DGrid.d.ts.map +1 -1
  270. package/build/types/web-planner-react/src/model/States/ConfigState/index.d.ts +7 -1
  271. package/build/types/web-planner-react/src/model/States/ConfigState/index.d.ts.map +1 -1
  272. package/build/types/web-planner-react/src/model/States/UIState/Product/index.d.ts +26 -0
  273. package/build/types/web-planner-react/src/model/States/UIState/Product/index.d.ts.map +1 -1
  274. package/build/types/web-planner-react/src/model/States/UIState/Settings/index.d.ts +7 -0
  275. package/build/types/web-planner-react/src/model/States/UIState/Settings/index.d.ts.map +1 -1
  276. package/build/types/web-planner-react/src/model/TabGroup/ConfiguratorStructureHandler.d.ts.map +1 -1
  277. package/build/types/web-planner-react/src/model/index.d.ts.map +1 -1
  278. package/build/types/web-planner-react/src/tests/planner/articleGeometryFabricParity.test.d.ts +3 -0
  279. package/build/types/web-planner-react/src/tests/planner/articleGeometryFabricParity.test.d.ts.map +1 -0
  280. package/build/types/web-planner-react/src/tests/planner/legacy/legacyStretchEngine.d.ts +9 -0
  281. package/build/types/web-planner-react/src/tests/planner/legacy/legacyStretchEngine.d.ts.map +1 -0
  282. package/build/types/web-planner-react/src/tests/planner/minBorderFabricParity.test.d.ts +3 -0
  283. package/build/types/web-planner-react/src/tests/planner/minBorderFabricParity.test.d.ts.map +1 -0
  284. package/build/types/web-planner-react/src/tests/planner/stretchFabricParity.test.d.ts +3 -0
  285. package/build/types/web-planner-react/src/tests/planner/stretchFabricParity.test.d.ts.map +1 -0
  286. package/build/types/web-planner-react/src/utils/rtvNext.d.ts +21 -0
  287. package/build/types/web-planner-react/src/utils/rtvNext.d.ts.map +1 -0
  288. package/build/umd/1219.diva-web-planner-react.umd.min.js +2 -0
  289. package/build/umd/1219.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
  290. package/build/umd/1316.diva-web-planner-react.umd.min.js +1 -1
  291. package/build/umd/1492.diva-web-planner-react.umd.min.js +1 -1
  292. package/build/umd/1902.diva-web-planner-react.umd.min.js +1 -1
  293. package/build/umd/1932.diva-web-planner-react.umd.min.js +1 -1
  294. package/build/umd/1936.diva-web-planner-react.umd.min.js +1 -1
  295. package/build/umd/2568.diva-web-planner-react.umd.min.js +1 -1
  296. package/build/umd/2794.diva-web-planner-react.umd.min.js +1 -1
  297. package/build/umd/282.diva-web-planner-react.umd.min.js +1 -1
  298. package/build/umd/2939.diva-web-planner-react.umd.min.js +1 -1
  299. package/build/umd/2994.diva-web-planner-react.umd.min.js +1 -1
  300. package/build/umd/3596.diva-web-planner-react.umd.min.js +1 -1
  301. package/build/umd/4529.diva-web-planner-react.umd.min.js +1 -1
  302. package/build/umd/7020.diva-web-planner-react.umd.min.js +1 -1
  303. package/build/umd/7118.diva-web-planner-react.umd.min.js +2 -0
  304. package/build/umd/7118.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
  305. package/build/umd/7442.diva-web-planner-react.umd.min.js +1 -1
  306. package/build/umd/7909.diva-web-planner-react.umd.min.js +2 -0
  307. package/build/umd/7909.diva-web-planner-react.umd.min.js.LICENSE.txt +1 -0
  308. package/build/umd/8445.diva-web-planner-react.umd.min.js +1 -1
  309. package/build/umd/8616.diva-web-planner-react.umd.min.js +1 -1
  310. package/build/umd/8701.diva-web-planner-react.umd.min.js +1 -1
  311. package/build/umd/8759.diva-web-planner-react.umd.min.js +1 -1
  312. package/build/umd/9054.diva-web-planner-react.umd.min.js +1 -1
  313. package/build/umd/9339.diva-web-planner-react.umd.min.js +1 -1
  314. package/build/umd/9446.diva-web-planner-react.umd.min.js +1 -1
  315. package/build/umd/9583.diva-web-planner-react.umd.min.js +1 -1
  316. package/build/umd/9679.diva-web-planner-react.umd.min.js +1 -1
  317. package/build/umd/9715.diva-web-planner-react.umd.min.js +1 -1
  318. package/build/umd/diva-web-planner-react.umd.min.js +1 -1
  319. package/build/umd/report.html +1 -1
  320. package/package.json +16 -10
  321. package/build/esm/index-05e1fe0a.js +0 -99
  322. package/build/umd/8332.diva-web-planner-react.umd.min.js +0 -2
  323. package/build/umd/8332.diva-web-planner-react.umd.min.js.LICENSE.txt +0 -1
  324. package/build/umd/8757.diva-web-planner-react.umd.min.js +0 -2
  325. package/build/umd/8757.diva-web-planner-react.umd.min.js.LICENSE.txt +0 -1
@@ -0,0 +1,965 @@
1
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
2
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
+ import { u as useViewHandler, g as useRTVAnalyzerComponentsFromPlanner, h as registerRtvNextViewer } from './index-cb3f6a27.js';
4
+ import { useRef, useEffect, useMemo } from 'react';
5
+ import { observer } from 'mobx-react-lite';
6
+ import { getLogger, useDivaCore } from '@crystaldesign/diva-core';
7
+ import RealTimeRendererNext, { emitConfig, ENVIRONMENT_CONFIG, useRTVStore, WHITE_ROOM_PRESET } from '@crystaldesign/real-time-viewer-next';
8
+ import { bootMark } from '@crystaldesign/web-planner-logic';
9
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
10
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
11
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
12
+ import { jsx } from 'react/jsx-runtime';
13
+ import 'react-dynamic-multi-render';
14
+ import '@babel/runtime/helpers/objectWithoutProperties';
15
+ import '@babel/runtime/helpers/classCallCheck';
16
+ import '@babel/runtime/helpers/createClass';
17
+ import '@crystaldesign/diva-utils';
18
+ import 'mobx';
19
+ import 'classnames';
20
+ import 'qrcode.react';
21
+ import '@babel/runtime/helpers/typeof';
22
+ import 'flat';
23
+ import 'react-switch';
24
+ import 'react-countup';
25
+
26
+ /**
27
+ * Host-side accessory placement mode for the rtv-next planner. Single source of truth shared by the
28
+ * viewer host (passed into `uiConfig.accessoryPlacement`) and the accessory palette (which collapses
29
+ * variant families to one entry only in `autoPlaceDrag`). Flip to `'cellBoxes'` for the legacy
30
+ * click-to-place behavior.
31
+ */
32
+ var ACCESSORY_PLACEMENT_MODE = 'autoPlaceDrag';
33
+
34
+ function _createForOfIteratorHelper$1(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$1(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
35
+ function _unsupportedIterableToArray$1(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$1(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$1(r, a) : void 0; } }
36
+ function _arrayLikeToArray$1(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
37
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
38
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
39
+ var LOG = getLogger('Planner', 'CreateImageShot');
40
+
41
+ /**
42
+ * Fallback defaults for {@link CreateImageConfig} — overridden field-wise by the active RTV
43
+ * preset's `createImage` section, which in turn is overridden by the host's `createImageConfig`
44
+ * component parameter.
45
+ */
46
+ var DEFAULTS = {
47
+ /** 4K at the 16:9 proportions of the host's capture stage — supersampled output. */
48
+ width: 3840,
49
+ height: 2160,
50
+ formats: ['png'],
51
+ jpegQuality: 0.92,
52
+ /** Extra render frames before the shutter, covering async label-font and SVG-texture loads. */
53
+ settleFrames: 60,
54
+ /**
55
+ * How long the 2D scene must stay unchanged before it counts as settled — an init with
56
+ * custom measures re-sizes/re-docks elements shortly after the first elements appear.
57
+ */
58
+ stableMs: 800,
59
+ /** Tight plan framing; the margin leaves room for dimension labels outside the element bounds. */
60
+ cameraPadding: 1.25
61
+ };
62
+ /**
63
+ * `initMode: 'CREATE_IMAGE'` — once the 2D plan has settled after planner init, captures it
64
+ * via the rtv-next capture engine and emits a `planImageCreated` event to the host
65
+ * (data: `{ images: PlanImage[] }`, one image per requested format). Fires once per mount.
66
+ */
67
+ function useCreateImageShot(viewHandler, scene2d, preset) {
68
+ var enabled = viewHandler.configState.initMode === 'CREATE_IMAGE';
69
+ var firedRef = useRef(false);
70
+
71
+ // scene2d is rebuilt every render, so its identity is useless as a settle signal — track content.
72
+ var signature = enabled && scene2d ? scene2d.elements.map(function (e) {
73
+ return "".concat(e.elementId, ":").concat(e.width, "x").concat(e.depth, "@").concat(e.position[0], ",").concat(e.position[1]);
74
+ }).join('|') : '';
75
+ useEffect(function () {
76
+ if (!enabled || !signature || firedRef.current) return;
77
+ var cfg = _objectSpread$1(_objectSpread$1(_objectSpread$1({}, DEFAULTS), preset.createImage), viewHandler.configState.createImageConfig);
78
+ var timer = window.setTimeout(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
79
+ var _viewHandler$actions, shot, _yield$useRTVStore$ge, _yield$useRTVStore$ge2, result, images, _iterator, _step, format, dataUrl, _viewHandler$actions2;
80
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
81
+ while (1) switch (_context.prev = _context.next) {
82
+ case 0:
83
+ if (!firedRef.current) {
84
+ _context.next = 2;
85
+ break;
86
+ }
87
+ return _context.abrupt("return");
88
+ case 2:
89
+ firedRef.current = true;
90
+ _context.prev = 3;
91
+ shot = {
92
+ id: 'plan-2d',
93
+ viewMode: '2d',
94
+ showGrid: false,
95
+ showDimensionLines: true,
96
+ showPosNr: false,
97
+ environment: _objectSpread$1(_objectSpread$1(_objectSpread$1(_objectSpread$1({}, emitConfig(ENVIRONMENT_CONFIG, useRTVStore.getState().resolvedEnvironment)), cfg.dimensionLineUnit ? {
98
+ dimensionLineUnit: cfg.dimensionLineUnit
99
+ } : {}), cfg.dimensionLineHideUnit !== undefined ? {
100
+ dimensionLineHideUnit: cfg.dimensionLineHideUnit
101
+ } : {}), cfg.dimensionLineColor ? {
102
+ dimensionLineColor: cfg.dimensionLineColor
103
+ } : {}),
104
+ resolution: {
105
+ width: cfg.width,
106
+ height: cfg.height
107
+ },
108
+ camera: {
109
+ padding: cfg.cameraPadding
110
+ },
111
+ // Always capture a lossless PNG master; JPEG variants are re-encoded from it below.
112
+ format: 'png',
113
+ settleFrames: cfg.settleFrames
114
+ };
115
+ _context.next = 7;
116
+ return useRTVStore.getState().captureShots({
117
+ shots: [shot]
118
+ });
119
+ case 7:
120
+ _yield$useRTVStore$ge = _context.sent;
121
+ _yield$useRTVStore$ge2 = _slicedToArray(_yield$useRTVStore$ge, 1);
122
+ result = _yield$useRTVStore$ge2[0];
123
+ if (result) {
124
+ _context.next = 12;
125
+ break;
126
+ }
127
+ throw new Error('captureShots returned no result');
128
+ case 12:
129
+ images = [];
130
+ _iterator = _createForOfIteratorHelper$1(cfg.formats);
131
+ _context.prev = 14;
132
+ _iterator.s();
133
+ case 16:
134
+ if ((_step = _iterator.n()).done) {
135
+ _context.next = 31;
136
+ break;
137
+ }
138
+ format = _step.value;
139
+ if (!(format === 'jpeg')) {
140
+ _context.next = 24;
141
+ break;
142
+ }
143
+ _context.next = 21;
144
+ return reencodeJpeg(result.blob, cfg.jpegQuality);
145
+ case 21:
146
+ _context.t0 = _context.sent;
147
+ _context.next = 27;
148
+ break;
149
+ case 24:
150
+ _context.next = 26;
151
+ return blobToDataUrl(result.blob);
152
+ case 26:
153
+ _context.t0 = _context.sent;
154
+ case 27:
155
+ dataUrl = _context.t0;
156
+ images.push({
157
+ format: format,
158
+ dataUrl: dataUrl,
159
+ width: result.width,
160
+ height: result.height
161
+ });
162
+ case 29:
163
+ _context.next = 16;
164
+ break;
165
+ case 31:
166
+ _context.next = 36;
167
+ break;
168
+ case 33:
169
+ _context.prev = 33;
170
+ _context.t1 = _context["catch"](14);
171
+ _iterator.e(_context.t1);
172
+ case 36:
173
+ _context.prev = 36;
174
+ _iterator.f();
175
+ return _context.finish(36);
176
+ case 39:
177
+ (_viewHandler$actions = viewHandler.actions) === null || _viewHandler$actions === void 0 || _viewHandler$actions.onEvent({
178
+ type: 'planImageCreated',
179
+ data: {
180
+ images: images
181
+ }
182
+ });
183
+ _context.next = 47;
184
+ break;
185
+ case 42:
186
+ _context.prev = 42;
187
+ _context.t2 = _context["catch"](3);
188
+ LOG.warn('CREATE_IMAGE capture failed', _context.t2);
189
+ // Never leave the host waiting for a `planImageCreated` that can no longer come: report the
190
+ // failure and re-arm, so a later scene change gets another attempt.
191
+ firedRef.current = false;
192
+ (_viewHandler$actions2 = viewHandler.actions) === null || _viewHandler$actions2 === void 0 || _viewHandler$actions2.onEvent({
193
+ type: 'planImageFailed',
194
+ data: {
195
+ message: _context.t2 instanceof Error ? _context.t2.message : String(_context.t2)
196
+ }
197
+ });
198
+ case 47:
199
+ case "end":
200
+ return _context.stop();
201
+ }
202
+ }, _callee, null, [[3, 42], [14, 33, 36, 39]]);
203
+ })), cfg.stableMs);
204
+ return function () {
205
+ return window.clearTimeout(timer);
206
+ };
207
+ }, [enabled, signature, viewHandler, preset]);
208
+ }
209
+ function blobToDataUrl(blob) {
210
+ return new Promise(function (resolve, reject) {
211
+ var reader = new FileReader();
212
+ reader.onload = function () {
213
+ return resolve(reader.result);
214
+ };
215
+ reader.onerror = function () {
216
+ var _reader$error;
217
+ return reject((_reader$error = reader.error) !== null && _reader$error !== void 0 ? _reader$error : new Error('Failed to read image blob'));
218
+ };
219
+ reader.readAsDataURL(blob);
220
+ });
221
+ }
222
+
223
+ /**
224
+ * JPEG has no alpha channel and a direct JPEG read of the (transparent) WebGL canvas would
225
+ * composite onto black — re-encode the PNG master onto a white background instead.
226
+ */
227
+ function reencodeJpeg(_x, _x2) {
228
+ return _reencodeJpeg.apply(this, arguments);
229
+ }
230
+ function _reencodeJpeg() {
231
+ _reencodeJpeg = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(pngBlob, quality) {
232
+ var bitmap, canvas, ctx;
233
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
234
+ while (1) switch (_context2.prev = _context2.next) {
235
+ case 0:
236
+ _context2.next = 2;
237
+ return createImageBitmap(pngBlob);
238
+ case 2:
239
+ bitmap = _context2.sent;
240
+ canvas = document.createElement('canvas');
241
+ canvas.width = bitmap.width;
242
+ canvas.height = bitmap.height;
243
+ ctx = canvas.getContext('2d');
244
+ if (ctx) {
245
+ _context2.next = 9;
246
+ break;
247
+ }
248
+ throw new Error('2D canvas context unavailable for JPEG encoding');
249
+ case 9:
250
+ ctx.fillStyle = '#ffffff';
251
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
252
+ ctx.drawImage(bitmap, 0, 0);
253
+ bitmap.close();
254
+ return _context2.abrupt("return", canvas.toDataURL('image/jpeg', quality));
255
+ case 14:
256
+ case "end":
257
+ return _context2.stop();
258
+ }
259
+ }, _callee2);
260
+ }));
261
+ return _reencodeJpeg.apply(this, arguments);
262
+ }
263
+
264
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
265
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
266
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
267
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
268
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
269
+ var PLANNER_TAB_GROUP_TYPES = new Set(['PLANNER', 'ACC_PLANNER', 'PLANNER_2.0']);
270
+
271
+ // Accessory docking-point types rendered as attach/remove buttons in the 2D viewer (old planner's
272
+ // `addDPUI` ACC branch — AVL/AVR are the side-copy buttons, handled separately).
273
+ var ACC_DP_TYPES = new Set(['AVO', 'AVU', 'AVC', 'AVN', 'AVS']);
274
+
275
+ // Environment config (lighting / HDRI / dome / post-processing / selection look) comes from ONE
276
+ // channel: the preset — catalog RTV_PRESET meta tag when present, else WHITE_ROOM_PRESET — passed
277
+ // via `config.profiles` below. With ?rtv-debug mounted, the analyzer preset channel overrides it.
278
+
279
+ // Shelf-accessory placement UX. `cellBoxes` = current click-a-box-to-place. `autoPlaceDrag` =
280
+ /** No catalog config → the viewer draws its default dimensions, no annotations. */
281
+ var EMPTY_DIMENSION_CONFIGS = {};
282
+
283
+ /**
284
+ * Per-article 2D dimension/annotation config: the catalog-level DIMENSION_CONFIG meta tag
285
+ * (ONE dictionary keyed by articleCodex, JSON). Absent → no per-article overrides. Entries are consumed structurally — the tag's JSON mirrors
286
+ * {@link ArticleDimensionMeta}.
287
+ */
288
+ function getDimensionConfigs(viewHandler) {
289
+ var _viewHandler$divaWebP, _ref;
290
+ var fromCatalog = (_viewHandler$divaWebP = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP === void 0 ? void 0 : _viewHandler$divaWebP.dimensionConfig2D;
291
+ return (_ref = fromCatalog) !== null && _ref !== void 0 ? _ref : EMPTY_DIMENSION_CONFIGS;
292
+ }
293
+
294
+ /**
295
+ * Resolves `{...}` placeholders in a dimension-config label via the article template engine
296
+ * (`convertTemplateToCodex`, same syntax as supplierOrderCodex templates) — e.g.
297
+ * `widthPrefix: '{2300.vCodex}x'` → "6x".
298
+ */
299
+ function resolveOptionPlaceholders(viewHandler, basketId, text) {
300
+ var _viewHandler$divaWebP2;
301
+ if (!text || !text.includes('{')) return text;
302
+ return (_viewHandler$divaWebP2 = viewHandler.divaWebPlanner.convertTemplateToCodex(basketId, text)) !== null && _viewHandler$divaWebP2 !== void 0 ? _viewHandler$divaWebP2 : text;
303
+ }
304
+
305
+ /**
306
+ * Translates the planner's `plannedElementsDict` into the viewer's 2D scene. `isPoolPlanning` is
307
+ * reported alongside it because it falls out of the same per-element dimension-config lookup: a
308
+ * planning whose articles carry a dimension config is a static drawing (pool plan).
309
+ */
310
+ function buildScene2D(viewHandler) {
311
+ var _viewHandler$divaWebP3;
312
+ var fontUrl = (_viewHandler$divaWebP3 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP3 === void 0 ? void 0 : _viewHandler$divaWebP3.plan2DFontUrl;
313
+ var dict = viewHandler.viewPlannerHandler.plannedElementsDict;
314
+ if (!dict || dict.size === 0) return {
315
+ isPoolPlanning: false
316
+ };
317
+ var dimConfigs = getDimensionConfigs(viewHandler);
318
+ var isPoolPlanning = false;
319
+ var elements = [];
320
+ var minX = Infinity,
321
+ minZ = Infinity,
322
+ maxX = -Infinity,
323
+ maxZ = -Infinity;
324
+ dict.forEach(function (plannerElements, setId) {
325
+ var _iterator = _createForOfIteratorHelper(plannerElements),
326
+ _step;
327
+ try {
328
+ var _loop = function _loop() {
329
+ var _pe$getGlobalWidth, _pe$getGlobalDepth, _dimMeta$annotations, _dimMeta$zLayer;
330
+ var pe = _step.value;
331
+ var center = pe.getWorldPosCenter();
332
+ // getSVGData() is the full OLF SVG and getGlobalWidth()/Depth() (ignoreOLF=false) are the OLF
333
+ // footprint size, so the plane is OLF-sized. getWorldPosCenter() is the OLF centre (see
334
+ // PlannerElementData.getWorldPosCornerOLF), so the plane sits on `position` directly — no pivot
335
+ // offset. Using the OLT size here (oltW/2 - w/2) mis-placed elements whose OLF differs from their
336
+ // OLT (e.g. a sofa's leg extension). The old real-time-viewer likewise centred the OLF shape on
337
+ // worldPosCenter with no OLT offset (Planner2DGrid.updatePlannerView).
338
+ var w = (_pe$getGlobalWidth = pe.getGlobalWidth()) !== null && _pe$getGlobalWidth !== void 0 ? _pe$getGlobalWidth : 0;
339
+ var d = (_pe$getGlobalDepth = pe.getGlobalDepth()) !== null && _pe$getGlobalDepth !== void 0 ? _pe$getGlobalDepth : 0;
340
+ var svgRaw = pe.getSVGData();
341
+ var h = pe.getHeightOLT();
342
+
343
+ // Accessory docking-point buttons. `LocalWorldPos` is OLF-corner-relative (cm) and the corner
344
+ // sits at the element centre + (-w/2, -d/2) in the unrotated frame, so the offset from the centre
345
+ // is `LocalWorldPos - (w/2, d/2)`. The viewer rotates it with the element. Skip a docked point on
346
+ // an element that is itself a docked accessory (mirrors Planner2DGrid.addDPUI).
347
+ var isDockedAcc = pe.getIsDockedAccessoire();
348
+ var dockingButtons = [];
349
+ var dockingPointsDebug = [];
350
+ var _iterator2 = _createForOfIteratorHelper(pe.getAllDockingPoints()),
351
+ _step2;
352
+ try {
353
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
354
+ var dp = _step2.value;
355
+ dockingPointsDebug.push({
356
+ dpId: dp.DpId,
357
+ type: dp.Type,
358
+ localOffset: [dp.LocalWorldPos.x - w / 2, dp.LocalWorldPos.z - d / 2],
359
+ rotDeg: dp.RotDeg,
360
+ isDocking: dp.IsDocking,
361
+ onElementId: dp.OnElementId,
362
+ number: dp.HasNumber ? dp.Number : undefined
363
+ });
364
+ if (!ACC_DP_TYPES.has(dp.Type)) continue;
365
+ if (dp.IsDocking && isDockedAcc) continue;
366
+ dockingButtons.push({
367
+ dpId: dp.DpId,
368
+ localOffset: [dp.LocalWorldPos.x - w / 2, dp.LocalWorldPos.z - d / 2],
369
+ iconRotDeg: dp.RotDeg,
370
+ isDocking: dp.IsDocking,
371
+ onElementId: dp.OnElementId
372
+ });
373
+ }
374
+
375
+ // OLT/OLF outlines for the analyzer's "Analyze OLT/OLF" overlay: the planner's world-space
376
+ // polygons (the exact geometry collision/placement uses) mapped back into the element-local
377
+ // unrotated frame around `center` — the inverse of Vector2.rotateOrigin(+RotDeg) + corner offset.
378
+ } catch (err) {
379
+ _iterator2.e(err);
380
+ } finally {
381
+ _iterator2.f();
382
+ }
383
+ var rotRad = pe.getRotDeg() * Math.PI / 180;
384
+ var rotCos = Math.cos(rotRad);
385
+ var rotSin = Math.sin(rotRad);
386
+ var toLocalOutline = function toLocalOutline(poly) {
387
+ return poly.map(function (p) {
388
+ var dx = p.x - center.x;
389
+ var dz = p.y - center.z;
390
+ return [dx * rotCos + dz * rotSin, -dx * rotSin + dz * rotCos];
391
+ });
392
+ };
393
+ var oltWorld = pe.getOLTPolygonWorldPos();
394
+ var olfWorld = pe.getOLFPolygonWorldPos();
395
+ var outlinesDebug = oltWorld.length > 0 || olfWorld.length > 0 ? _objectSpread(_objectSpread({}, oltWorld.length > 0 ? {
396
+ olt: toLocalOutline(oltWorld)
397
+ } : {}), olfWorld.length > 0 ? {
398
+ olf: toLocalOutline(olfWorld)
399
+ } : {}) : undefined;
400
+ var dimMeta = dimConfigs[pe.ArticleCodex];
401
+ if (dimMeta != null) isPoolPlanning = true;
402
+
403
+ // Option-driven label texts: `{optionCodex}` placeholders in prefixes/postfixes and
404
+ // annotation texts resolve against the element's article options.
405
+ var resolveText = function resolveText(t) {
406
+ return resolveOptionPlaceholders(viewHandler, pe.getBasketId(), t);
407
+ };
408
+ var rawCfg = dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.dimensionConfig;
409
+ var dimensionConfig = rawCfg && [rawCfg.widthPrefix, rawCfg.widthPostfix, rawCfg.depthPrefix, rawCfg.depthPostfix].some(function (t) {
410
+ return t === null || t === void 0 ? void 0 : t.includes('{');
411
+ }) ? _objectSpread(_objectSpread({}, rawCfg), {}, {
412
+ widthPrefix: resolveText(rawCfg.widthPrefix),
413
+ widthPostfix: resolveText(rawCfg.widthPostfix),
414
+ depthPrefix: resolveText(rawCfg.depthPrefix),
415
+ depthPostfix: resolveText(rawCfg.depthPostfix)
416
+ }) : rawCfg;
417
+ var annotations = dimMeta !== null && dimMeta !== void 0 && (_dimMeta$annotations = dimMeta.annotations) !== null && _dimMeta$annotations !== void 0 && _dimMeta$annotations.some(function (a) {
418
+ return a.text.includes('{');
419
+ }) ? dimMeta.annotations.map(function (a) {
420
+ var _resolveText;
421
+ return _objectSpread(_objectSpread({}, a), {}, {
422
+ text: (_resolveText = resolveText(a.text)) !== null && _resolveText !== void 0 ? _resolveText : a.text
423
+ });
424
+ }) : dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.annotations;
425
+ elements.push({
426
+ name: "Element".concat(pe.getElementId()),
427
+ setId: setId,
428
+ elementId: pe.getElementId(),
429
+ position: [center.x, center.z],
430
+ pivotOffset: [0, 0],
431
+ rotation: pe.getRotDeg(),
432
+ width: w,
433
+ depth: d,
434
+ svgDataUrl: svgRaw ? "data:image/svg+xml;base64,".concat(btoa(unescape(encodeURIComponent(svgRaw)))) : undefined,
435
+ height: h > 0 ? h : undefined,
436
+ dockingButtons: dockingButtons.length > 0 ? dockingButtons : undefined,
437
+ dockingPointsDebug: dockingPointsDebug.length > 0 ? dockingPointsDebug : undefined,
438
+ outlinesDebug: outlinesDebug,
439
+ zLayer: (_dimMeta$zLayer = dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.zLayer) !== null && _dimMeta$zLayer !== void 0 ? _dimMeta$zLayer : pe.getLayer(),
440
+ opacity: dimMeta === null || dimMeta === void 0 ? void 0 : dimMeta.opacity,
441
+ dimensionConfig: dimensionConfig,
442
+ annotations: annotations
443
+ });
444
+ var halfW = w / 2;
445
+ var halfD = d / 2;
446
+ minX = Math.min(minX, center.x - halfW);
447
+ maxX = Math.max(maxX, center.x + halfW);
448
+ minZ = Math.min(minZ, center.z - halfD);
449
+ maxZ = Math.max(maxZ, center.z + halfD);
450
+ };
451
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
452
+ _loop();
453
+ }
454
+ } catch (err) {
455
+ _iterator.e(err);
456
+ } finally {
457
+ _iterator.f();
458
+ }
459
+ });
460
+ if (elements.length === 0) return {
461
+ isPoolPlanning: isPoolPlanning
462
+ };
463
+ var dockingGroups = buildDockingGroups(dict);
464
+ return {
465
+ scene2d: _objectSpread(_objectSpread({
466
+ elements: elements,
467
+ boundingBox: {
468
+ x: (minX + maxX) / 2,
469
+ z: (minZ + maxZ) / 2,
470
+ width: maxX - minX,
471
+ depth: maxZ - minZ
472
+ }
473
+ }, fontUrl ? {
474
+ fontUrl: fontUrl
475
+ } : {}), dockingGroups.length > 0 ? {
476
+ dockingGroups: dockingGroups
477
+ } : {}),
478
+ isPoolPlanning: isPoolPlanning
479
+ };
480
+ }
481
+
482
+ /** Union-find on docking points to discover connected element groups. */
483
+ function buildDockingGroups(dict) {
484
+ var parent = new Map();
485
+ function find(x) {
486
+ var root = x;
487
+ while (parent.get(root) !== root) root = parent.get(root);
488
+ var cur = x;
489
+ while (cur !== root) {
490
+ var next = parent.get(cur);
491
+ parent.set(cur, root);
492
+ cur = next;
493
+ }
494
+ return root;
495
+ }
496
+ function union(a, b) {
497
+ var ra = find(a);
498
+ var rb = find(b);
499
+ if (ra !== rb) parent.set(ra, rb);
500
+ }
501
+ dict.forEach(function (plannerElements) {
502
+ var _iterator3 = _createForOfIteratorHelper(plannerElements),
503
+ _step3;
504
+ try {
505
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
506
+ var pe = _step3.value;
507
+ var elId = pe.getElementId();
508
+ if (!parent.has(elId)) parent.set(elId, elId);
509
+ var _iterator4 = _createForOfIteratorHelper(pe.getDockingPoints()),
510
+ _step4;
511
+ try {
512
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
513
+ var dp = _step4.value;
514
+ if (dp.IsDocking && dp.OnElementId != null) {
515
+ var targetId = dp.OnElementId;
516
+ if (!parent.has(targetId)) parent.set(targetId, targetId);
517
+ union(elId, targetId);
518
+ }
519
+ }
520
+ } catch (err) {
521
+ _iterator4.e(err);
522
+ } finally {
523
+ _iterator4.f();
524
+ }
525
+ }
526
+ } catch (err) {
527
+ _iterator3.e(err);
528
+ } finally {
529
+ _iterator3.f();
530
+ }
531
+ });
532
+ var groups = new Map();
533
+ var _iterator5 = _createForOfIteratorHelper(parent.keys()),
534
+ _step5;
535
+ try {
536
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
537
+ var id = _step5.value;
538
+ var root = find(id);
539
+ var group = groups.get(root);
540
+ if (!group) {
541
+ group = [];
542
+ groups.set(root, group);
543
+ }
544
+ group.push(id);
545
+ }
546
+ } catch (err) {
547
+ _iterator5.e(err);
548
+ } finally {
549
+ _iterator5.f();
550
+ }
551
+ return _toConsumableArray(groups.values()).filter(function (g) {
552
+ return g.length > 1;
553
+ });
554
+ }
555
+
556
+ /**
557
+ * Phase 6 plumbing: build per-element overlay info from `plannedElementsDict`
558
+ * + `articleInfos`. The "selected" overlay state is sourced from
559
+ * `productState.rtvSelectedElementId` (planner truth) — `articleInfos.isActive`
560
+ * is only consulted for `posNr` / `canDelete` metadata so that a configurator
561
+ * lag after canvas deselect does not paint a deselected element as selected.
562
+ */
563
+ function buildElementsInfoFromArticles(viewHandler) {
564
+ var _viewHandler$tabGroup, _viewHandler$divaWebP4, _viewHandler$tabGroup3;
565
+ // Keyed by the composite element key (`shelfElementId`): `"2"` for mains, `"2.0.6"` for
566
+ // accessories — matches what rtv-next parses from the 3D node name.
567
+ var map = new Map();
568
+ var articleInfos = viewHandler.settingsState.articleInfos;
569
+ var dict = viewHandler.viewPlannerHandler.plannedElementsDict;
570
+ var selectedElementId = viewHandler.productState.rtvSelectedElementId;
571
+ // In the shelf-planner step planning targets ALL corpora, so no main article is pickable (the
572
+ // corpus is navigated context → `active`: no hover, click is a no-op) and the shelf accessories
573
+ // are the only selectable things. Outside the step a shelf accessory is only pickable when the
574
+ // current configStep makes it configurable (`article.isActive`); otherwise it's inert and clicks/
575
+ // hover fall through to the parent corpus (`unselectable` → walk-to-ancestor in rtv-next).
576
+ var isShelfStep = ((_viewHandler$tabGroup = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup === void 0 ? void 0 : _viewHandler$tabGroup.type) === 'SHELFPLANNER';
577
+
578
+ // AVL/AVR element copy (catalog property ELEMENT_COPY_AVLR): copy buttons on the selected
579
+ // standard-planner element that plan a copy docked at its free AVL/AVR docking point. `true`
580
+ // enables them in planner steps; a list of option codexes additionally enables them while one
581
+ // of those option steps is visited (the configurator-selected element is the copy source).
582
+ var inPlannerStep = function (_viewHandler$tabGroup2) {
583
+ var t = (_viewHandler$tabGroup2 = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup2 === void 0 ? void 0 : _viewHandler$tabGroup2.type;
584
+ return t != null && PLANNER_TAB_GROUP_TYPES.has(t);
585
+ }();
586
+ var copyAVLRCfg = (_viewHandler$divaWebP4 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP4 === void 0 ? void 0 : _viewHandler$divaWebP4.elementCopyAVLR;
587
+ var curOptionCodex = (_viewHandler$tabGroup3 = viewHandler.tabGroupState.curOption) === null || _viewHandler$tabGroup3 === void 0 ? void 0 : _viewHandler$tabGroup3.codex;
588
+ var avlrCopyEnabled = copyAVLRCfg != null && (inPlannerStep || Array.isArray(copyAVLRCfg) && curOptionCodex != null && copyAVLRCfg.includes(curOptionCodex));
589
+
590
+ // State for a single article entry, applying the step-aware accessory/corpus gating above.
591
+ // Accessory selection is NOT tracked by the numeric `selectedElementId` (rtv-next drives the
592
+ // accessory outline locally + via `selectedAccessoryKey`), so only mains resolve to `selected`.
593
+ var resolveState = function resolveState(elementId, isActive, isShelfAccessoire) {
594
+ if (isShelfAccessoire) {
595
+ if (isShelfStep) return 'selectable';
596
+ return isActive ? 'selectable' : 'unselectable';
597
+ }
598
+ // Main / corpus: never hover- or select-able while planning all corpora in the shelf step.
599
+ if (isShelfStep) return 'active';
600
+ if (elementId !== undefined && selectedElementId === elementId) return 'selected';
601
+ return isActive ? 'active' : 'selectable';
602
+ };
603
+ var articleByElementId = new Map();
604
+ for (var _i = 0, _Object$keys = Object.keys(articleInfos); _i < _Object$keys.length; _i++) {
605
+ var key = _Object$keys[_i];
606
+ var a = articleInfos[key];
607
+ if (a.elementId !== undefined) {
608
+ articleByElementId.set(a.elementId, {
609
+ setId: a.setId,
610
+ posNr: String(a.posNr),
611
+ isActive: a.isActive,
612
+ canDelete: a.isActive,
613
+ isShelfAccessoire: !!a.isShelfAccessoire,
614
+ shelfElementId: a.shelfElementId
615
+ });
616
+ }
617
+ }
618
+ if (dict) {
619
+ dict.forEach(function (plannerElements, setId) {
620
+ var _iterator6 = _createForOfIteratorHelper(plannerElements),
621
+ _step6;
622
+ try {
623
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
624
+ var _article$shelfElement, _article$setId, _article$canDelete;
625
+ var pe = _step6.value;
626
+ var elementId = pe.getElementId();
627
+ var parentElementId = pe.getParentElementId();
628
+ var article = articleByElementId.get(elementId);
629
+ var isBox = pe.getPlannerType() === 'BOX';
630
+ var canCopyLeft = void 0;
631
+ var canCopyRight = void 0;
632
+ var canCopyTop = void 0;
633
+ var copyAlwaysVisible = void 0;
634
+ if (isBox) {
635
+ // Not step-gated: box catalogs hide the planner step entirely, so box planning happens via
636
+ // these buttons during option steps. The viewer shows them on the selected element only.
637
+ canCopyLeft = true;
638
+ canCopyRight = true;
639
+ var avoDP = pe.getFreeDockingPointByTypeAndNumber('AVO', 1);
640
+ canCopyTop = avoDP != null && !avoDP.IsDisabled;
641
+ } else if (avlrCopyEnabled && parentElementId == null && !(article !== null && article !== void 0 && article.isShelfAccessoire)) {
642
+ canCopyLeft = pe.getFreeDockingPointsByType('AVL').some(function (dp) {
643
+ return !dp.IsDisabled;
644
+ });
645
+ canCopyRight = pe.getFreeDockingPointsByType('AVR').some(function (dp) {
646
+ return !dp.IsDisabled;
647
+ });
648
+ copyAlwaysVisible = true;
649
+ }
650
+
651
+ // `isActive` is computed per-context by the logic layer (loadPaletteInfos) and is exactly
652
+ // what drives the planner header's active badges: planner mode → none active (all selectable);
653
+ // shelf mode → the navigated main group is active; configStep → the current choice is active,
654
+ // alternatives are selectable. `resolveState` layers the step-aware accessory/corpus gating
655
+ // on top (see its definition above).
656
+ var state = !article ? 'unselectable' : resolveState(elementId, article.isActive, !!article.isShelfAccessoire);
657
+
658
+ // Element-type taxonomy. `isShelfAccessoire` comes from articleInfos (logic layer); box/
659
+ // accessoire are detectable from the planner element.
660
+ var type = article !== null && article !== void 0 && article.isShelfAccessoire ? 'shelfAccessoire' : isBox ? 'boxElement' : parentElementId != null ? 'accessoire' : 'planned';
661
+ map.set((_article$shelfElement = article === null || article === void 0 ? void 0 : article.shelfElementId) !== null && _article$shelfElement !== void 0 ? _article$shelfElement : String(elementId), {
662
+ setId: (_article$setId = article === null || article === void 0 ? void 0 : article.setId) !== null && _article$setId !== void 0 ? _article$setId : setId,
663
+ posNr: article === null || article === void 0 ? void 0 : article.posNr,
664
+ state: state,
665
+ type: type,
666
+ articleCodex: pe.ArticleCodex,
667
+ // Shelf accessories are deletable; an AVL/AVR-copy element (ELEMENT_COPY_AVLR) is a planned
668
+ // main you can copy right there, so it's deletable too. All other mains keep the
669
+ // active/selectable canDelete signal.
670
+ canDelete: article !== null && article !== void 0 && article.isShelfAccessoire || copyAlwaysVisible ? true : (_article$canDelete = article === null || article === void 0 ? void 0 : article.canDelete) !== null && _article$canDelete !== void 0 ? _article$canDelete : false,
671
+ parentElementId: parentElementId,
672
+ canCopyLeft: canCopyLeft,
673
+ canCopyRight: canCopyRight,
674
+ canCopyTop: canCopyTop,
675
+ copyAlwaysVisible: copyAlwaysVisible
676
+ });
677
+ }
678
+ } catch (err) {
679
+ _iterator6.e(err);
680
+ } finally {
681
+ _iterator6.f();
682
+ }
683
+ });
684
+ }
685
+
686
+ // Shelf accessories that aren't planner elements (absent from plannedElementsDict) still need an
687
+ // overlay entry — add them straight from articleInfos, keyed by their composite `shelfElementId`
688
+ // (e.g. "2.0.6"), which is what rtv-next parses from the accessory's node name. Their selectability
689
+ // is step-gated identically to the dict path (`resolveState`).
690
+ for (var _i2 = 0, _Object$keys2 = Object.keys(articleInfos); _i2 < _Object$keys2.length; _i2++) {
691
+ var _key = _Object$keys2[_i2];
692
+ var _a = articleInfos[_key];
693
+ if (!_a.isShelfAccessoire || !_a.shelfElementId || map.has(_a.shelfElementId)) continue;
694
+ map.set(_a.shelfElementId, {
695
+ setId: _a.setId,
696
+ posNr: String(_a.posNr),
697
+ state: resolveState(_a.elementId, _a.isActive, true),
698
+ type: 'shelfAccessoire',
699
+ canDelete: true
700
+ });
701
+ }
702
+ return map;
703
+ }
704
+
705
+ /**
706
+ * Resolve an accessory's composite ref (parent/grid/cell, recursion-safe) to the basket ids the
707
+ * paletteViewHandler needs: the parent shelf basket (for delete) and the accessory's own basket +
708
+ * codex (for select). Looks up `plannedPlacesOnGrids` by the parent element key + grid idx + cell.
709
+ */
710
+ function resolveAccessoryTargets(viewHandler, ref) {
711
+ var _viewHandler$settings;
712
+ // `plannedPlacesOnGrids[].elementId` is the `E`-prefixed form ("E1"); the composite key from
713
+ // `shelfElementId`/`parseElementKey` is the bare form ("1"). Strip the leading `E` to match.
714
+ var parent = (_viewHandler$settings = viewHandler.settingsState.plannedPlacesOnGrids) === null || _viewHandler$settings === void 0 ? void 0 : _viewHandler$settings.find(function (p) {
715
+ var _p$elementId;
716
+ return ((_p$elementId = p.elementId) !== null && _p$elementId !== void 0 ? _p$elementId : '').replace(/^E/, '') === ref.parentElementKey;
717
+ });
718
+ if (!parent) return null;
719
+ var accBasketId;
720
+ var accCodex;
721
+ var gridName;
722
+ for (var _i3 = 0, _Object$keys3 = Object.keys(parent.grids); _i3 < _Object$keys3.length; _i3++) {
723
+ var name = _Object$keys3[_i3];
724
+ var g = parent.grids[name];
725
+ if (g.idx !== ref.gridId) continue;
726
+ gridName = name;
727
+ var acc = g.accessories.find(function (a) {
728
+ return a.index === ref.cellIdx;
729
+ });
730
+ if (acc) {
731
+ accBasketId = acc.basketId;
732
+ accCodex = acc.articleCodex;
733
+ break;
734
+ }
735
+ }
736
+ return {
737
+ parentBasketId: parent.basketId,
738
+ accBasketId: accBasketId,
739
+ accCodex: accCodex,
740
+ gridName: gridName
741
+ };
742
+ }
743
+ var PlannerRTVNext = function PlannerRTVNext() {
744
+ var _scene$isPoolPlanning, _ref2, _viewHandler$divaWebP5, _viewHandler$tabGroup4, _Object$values$find$s, _Object$values$find, _elementsInfo$get;
745
+ var viewHandler = useViewHandler();
746
+ var rtvAnalyzerComponents = useRTVAnalyzerComponentsFromPlanner();
747
+ var _useDivaCore = useDivaCore(),
748
+ _useDivaCore$state = _useDivaCore.state,
749
+ apiConfig = _useDivaCore$state.apiConfig,
750
+ jwt = _useDivaCore$state.jwt,
751
+ actions = _useDivaCore.actions;
752
+
753
+ // Mount effect, not the render body: this is the first moment the viewer component exists in the
754
+ // tree, which is what the boot report needs — the props it reads are re-derived on every render.
755
+ useEffect(function () {
756
+ bootMark('rtv: PlannerRTVNext mounted');
757
+ }, []);
758
+
759
+ // A new render script means the viewer is about to rebuild its scene — show the loading state
760
+ // until `onSceneReady` reports the rebuilt scene as live.
761
+ var prevHQRenderScript = useRef(viewHandler.hqRenderScript);
762
+ useEffect(function () {
763
+ if (viewHandler.hqRenderScript !== prevHQRenderScript.current) {
764
+ prevHQRenderScript.current = viewHandler.hqRenderScript;
765
+ if (viewHandler.hqRenderScript) {
766
+ actions.toggleLoading('RTV_Assembling', false, true);
767
+ }
768
+ }
769
+ }, [viewHandler.hqRenderScript, actions]);
770
+ var callbacks = useMemo(function () {
771
+ return {
772
+ onElementSelected: function onElementSelected(setId, elementId) {
773
+ viewHandler.viewPlannerHandler.onElementSelected(setId, elementId);
774
+ },
775
+ onElementDeselected: function onElementDeselected() {
776
+ viewHandler.viewPlannerHandler.onClearElementSelection();
777
+ },
778
+ updatePlannerTrans: function updatePlannerTrans(setId, plannerElementID, deltaMove, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint) {
779
+ viewHandler.divaWebPlanner.updatePlannerTrans(setId, plannerElementID, {
780
+ x: deltaMove.x,
781
+ y: deltaMove.y,
782
+ z: deltaMove.z
783
+ }, deltaAngleDeg, rotCorrection, transState, autoDockingDistance, turningPoint);
784
+ },
785
+ getDockSnapPreview: function getDockSnapPreview(setId, plannerElementID, autoDockingDistance, excludeElementIds) {
786
+ return viewHandler.divaWebPlanner.getDockSnapPreview(plannerElementID, autoDockingDistance, excludeElementIds);
787
+ },
788
+ onElementDeleted: function onElementDeleted(setId, elementId) {
789
+ viewHandler.viewPlannerHandler.onElementDeleted(setId, elementId);
790
+ },
791
+ onElementCopy: function onElementCopy(setId, elementId, copyIndex) {
792
+ return viewHandler.viewPlannerHandler.onElementCopy(setId, elementId, copyIndex);
793
+ },
794
+ onDockingPointInteraction: function onDockingPointInteraction(setId, elementId, dpId, isSelected, onElementId) {
795
+ return viewHandler.viewPlannerHandler.onDockingPointInteraction(setId, elementId, dpId, isSelected, onElementId);
796
+ },
797
+ onAccessoryPlace: function onAccessoryPlace(gridIdx, cellIdx, parentBasketId, articleCodex) {
798
+ viewHandler.paletteViewHandler.addAccessorieOnShelfPlannerView(gridIdx, cellIdx, parentBasketId, articleCodex);
799
+ },
800
+ onAccessoryDragOver: function onAccessoryDragOver(hasTarget) {
801
+ viewHandler.settingsState.setDraggedAccessoryHasTarget(hasTarget);
802
+ },
803
+ onAccessorySelect: function onAccessorySelect(ref) {
804
+ var t = resolveAccessoryTargets(viewHandler, ref);
805
+ if (!t) return;
806
+ viewHandler.paletteViewHandler.selectShelfAccessorie(t.accCodex, t.accBasketId);
807
+ },
808
+ onAccessoryDeselect: function onAccessoryDeselect() {
809
+ viewHandler.paletteViewHandler.selectShelfAccessorie(undefined);
810
+ },
811
+ onAccessoryDelete: function onAccessoryDelete(ref) {
812
+ var t = resolveAccessoryTargets(viewHandler, ref);
813
+ if (!t) return;
814
+ viewHandler.paletteViewHandler.deleteAccessorieOnShelfPlannerView(ref.gridId, ref.cellIdx, t.parentBasketId);
815
+ },
816
+ onAccessoryMoveStart: function onAccessoryMoveStart(ref) {
817
+ // The accessory's free-to-move target cells (old RTV's getMoveGrids) — own cells PLUS its
818
+ // variant-family siblings' cells (`includeFamily`), so the viewer can offer differently-sized
819
+ // drop targets and switch the article on release. Async (family variants are instantiated).
820
+ var t = resolveAccessoryTargets(viewHandler, ref);
821
+ if (!t || !t.accBasketId || !t.gridName) return undefined;
822
+ return viewHandler.divaWebPlanner.getFreeToMovePlacesOnGrids(t.gridName, t.accBasketId, true);
823
+ },
824
+ onAccessoryMove: function onAccessoryMove(ref, target) {
825
+ // `target` carries the DESTINATION element's basket + grid + cell (may differ from the source
826
+ // element — cross-element move), so we only need the accessory's own basket from the ref.
827
+ var t = resolveAccessoryTargets(viewHandler, ref);
828
+ if (!t || !t.accBasketId) return;
829
+ // If the target cell expects a different variant-family member, switch the article on move.
830
+ var switchTo = target.articleCodex && target.articleCodex !== t.accCodex ? target.articleCodex : undefined;
831
+ viewHandler.divaWebPlanner.moveShelfItemToGrid(t.accBasketId, target.parentBasketId, target.gridName, target.cellIdx, switchTo);
832
+ },
833
+ onSceneReady: function onSceneReady() {
834
+ bootMark('rtv: onSceneReady');
835
+ actions.toggleLoading('RTV_Assembling', false, false);
836
+ }
837
+ };
838
+ }, [viewHandler.viewPlannerHandler, viewHandler.divaWebPlanner, viewHandler, actions]);
839
+
840
+ // Planner-side single source of truth for canvas selection. Tracks
841
+ // `selectedElementsDict` in ViewPlannerHandler — kept in sync at all 3
842
+ // selection entry points (canvas-side `onElementSelected` /
843
+ // `onClearElementSelection`, and configurator-driven
844
+ // `updateElementSelectionConfig` / `updateElementSelectionPlanner`).
845
+ // Previously derived from `articleInfos.isActive`, which lagged after a
846
+ // canvas deselect and caused `setSelectedElementFromProp` to re-select
847
+ // the just-deselected element on the next render.
848
+ var selectedElementId = viewHandler.productState.rtvSelectedElementId;
849
+ var isVisible = viewHandler.isParentViewVisible;
850
+ // Announce the live rtv-next viewer page-wide: hidden sibling planner instances defer their
851
+ // whole boot while one is registered (see `ViewHandlerProvider`).
852
+ useEffect(function () {
853
+ if (!isVisible) return;
854
+ return registerRtvNextViewer();
855
+ }, [isVisible]);
856
+ var showRTV = viewHandler.productState.doShowRTV;
857
+ var show3DComb = viewHandler.productState.doShow3DComb;
858
+ var showGrid = viewHandler.productState.doShowGrid;
859
+ // Nothing is rendered in either case, so the planner→viewer translation is skipped: a hidden
860
+ // planner still re-renders on every MobX planner change and would otherwise walk the whole
861
+ // planned-elements dict and re-encode every element SVG for a viewer that is not mounted.
862
+ // CREATE_IMAGE never goes through the footer, so none of the view flags is ever set for it — the
863
+ // viewer must still mount, it *is* the capture source (see useCreateImageShot below).
864
+ var isCreateImage = viewHandler.configState.initMode === 'CREATE_IMAGE';
865
+ var isHidden = !isVisible || !showRTV && !show3DComb && !showGrid && !isCreateImage;
866
+
867
+ // `isPoolPlanning`: a planning whose articles carry a dimension config is a static drawing (pool
868
+ // plan) — hide all on-canvas buttons (posNr/move/rotate/trash chrome and docking-point buttons,
869
+ // both gated on `hideUiIcons` inside rtv-next) and force the dimension lines on.
870
+ var scene = isHidden ? undefined : buildScene2D(viewHandler);
871
+ var scene2d = scene === null || scene === void 0 ? void 0 : scene.scene2d;
872
+ var isPoolPlanning = (_scene$isPoolPlanning = scene === null || scene === void 0 ? void 0 : scene.isPoolPlanning) !== null && _scene$isPoolPlanning !== void 0 ? _scene$isPoolPlanning : false;
873
+
874
+ // Environment preset: the catalog-level RTV_PRESET meta tag when present (a DB source
875
+ // later), else the white-room default. Both are parse-once/module objects, so the
876
+ // identity is stable across renders. NOTE: with ?rtv-debug the analyzer preset channel
877
+ // applies AFTER this on mount and wins (use ?preset=<id> there to pick explicitly).
878
+ var rtvPreset = (_ref2 = (_viewHandler$divaWebP5 = viewHandler.divaWebPlanner.getCatalogData()) === null || _viewHandler$divaWebP5 === void 0 ? void 0 : _viewHandler$divaWebP5.rtvPreset) !== null && _ref2 !== void 0 ? _ref2 : WHITE_ROOM_PRESET;
879
+
880
+ // initMode CREATE_IMAGE: auto-capture the settled 2D plan and emit it to the host. A hook, so it
881
+ // has to stay above the guard below — it is inert without a scene, and while the planner renders
882
+ // nothing there is no mounted viewer to capture from anyway.
883
+ useCreateImageShot(viewHandler, scene2d, rtvPreset);
884
+ if (isHidden) return null;
885
+ var viewMode = showGrid || isCreateImage ? '2d' : '3d';
886
+ var curTabGroupType = (_viewHandler$tabGroup4 = viewHandler.tabGroupState.curTabGroup) === null || _viewHandler$tabGroup4 === void 0 ? void 0 : _viewHandler$tabGroup4.type;
887
+ var plannerMode = curTabGroupType != null && PLANNER_TAB_GROUP_TYPES.has(curTabGroupType);
888
+ var focusElementId = viewHandler.productState.rtvFocusElementId;
889
+ // Pool plannings are static drawings: dimension lines are always on (the UI toggle that
890
+ // would enable them is hidden along with the other buttons — see isPoolPlanning above).
891
+ var showDimensionLines = isPoolPlanning || viewHandler.productState.doShow3DDimensionLines;
892
+ var elementsInfo = buildElementsInfoFromArticles(viewHandler);
893
+
894
+ // Controlled accessory selection: map the host's selected shelf accessory (a basketId) to its
895
+ // composite 3D key ("2.0.6") so the canvas re-selects it after a place/move. `null` clears it.
896
+ var selectedAccessoryBasketId = viewHandler.settingsState.selectedShelfAccessoire;
897
+ var resolvedAccessoryKey = selectedAccessoryBasketId ? (_Object$values$find$s = (_Object$values$find = Object.values(viewHandler.settingsState.articleInfos).find(function (a) {
898
+ return a.basketId === selectedAccessoryBasketId;
899
+ })) === null || _Object$values$find === void 0 ? void 0 : _Object$values$find.shelfElementId) !== null && _Object$values$find$s !== void 0 ? _Object$values$find$s : null : null;
900
+ // `selectedShelfAccessoire` survives step navigation and config changes (it's only cleared by an
901
+ // explicit deselect), and rtv-next re-applies `selectedAccessoryKey` after every re-assembly — so
902
+ // a config change in a step where the accessory is not selectable would re-select it in the
903
+ // canvas. Gate the prop on the same step-aware overlay state that already gates clicks/hover.
904
+ var accessoryState = resolvedAccessoryKey ? (_elementsInfo$get = elementsInfo.get(resolvedAccessoryKey)) === null || _elementsInfo$get === void 0 ? void 0 : _elementsInfo$get.state : undefined;
905
+ var selectedAccessoryKey = resolvedAccessoryKey != null && accessoryState != null && accessoryState !== 'unselectable' ? resolvedAccessoryKey : null;
906
+
907
+ // In pure 2D / grid mode the viewer only needs scene2d — skip the 3D inputs so it never tries
908
+ // to fetch GLBs or accessory grid geometry for a view that shows neither.
909
+ var needs3D = viewMode !== '2d';
910
+ // The shelf-accessory grid geometry is fetched per catalog; the viewer falls back to this
911
+ // identity while nothing is placed yet to read it off (`plannedPlacesOnGrids` empty).
912
+ var catalogData = viewHandler.divaWebPlanner.getCatalogData();
913
+ var catalogInfo = catalogData !== null && catalogData !== void 0 && catalogData.catalogCodex ? {
914
+ catalogCodex: catalogData.catalogCodex,
915
+ iln: catalogData.supplierILN
916
+ } : undefined;
917
+ return /*#__PURE__*/jsx(RealTimeRendererNext, {
918
+ catalogInfo: needs3D ? catalogInfo : undefined,
919
+ hqRenderScript: needs3D ? viewHandler.hqRenderScript : undefined,
920
+ scene2d: scene2d,
921
+ viewMode: viewMode,
922
+ stopRender: !isVisible,
923
+ config: {
924
+ // Strip a trailing slash so downstream URL building (material blob paths, geo/texture URLs)
925
+ // doesn't emit `…/diva3darchiv//…` double slashes that the archive host may mis-route.
926
+ archiveBaseUrl: apiConfig.diva3darchive.endsWith('/') ? apiConfig.diva3darchive.slice(0, -1) : apiConfig.diva3darchive,
927
+ constructorServiceUrl: apiConfig.constructorService,
928
+ jwt: jwt,
929
+ // COBI-class planner: 3D is always available. The store default is
930
+ // already `{ supports3d: true }` but we pass it explicitly to make
931
+ // the contract obvious — flip to `false` to skip the geo preload and
932
+ // (once the lazy capsule lands) the entire 3D code chunk for a
933
+ // pure-2D catalog.
934
+ capabilities: {
935
+ supports3d: true
936
+ },
937
+ // Environment preset: catalog RTV_PRESET meta tag » white-room default (see
938
+ // `rtvPreset` above). With ?rtv-debug the analyzer preset channel overrides this.
939
+ profiles: rtvPreset.profiles,
940
+ profileMode: rtvPreset.profileMode,
941
+ camera: rtvPreset.camera,
942
+ uiConfig: _objectSpread({
943
+ plannerMode: viewHandler.productState.isBoxPlanner ? 'BoxPlanner' : '3DCOMB',
944
+ accessoryPlacement: ACCESSORY_PLACEMENT_MODE
945
+ }, isPoolPlanning ? {
946
+ hideUiIcons: true
947
+ } : {})
948
+ },
949
+ plannerMode: plannerMode,
950
+ freePlacesOnGrids: viewHandler.settingsState.freePlacesOnGrids,
951
+ plannedPlacesOnGrids: viewHandler.settingsState.plannedPlacesOnGrids,
952
+ armedAccessoryCodex: viewHandler.settingsState.armedAccessoryToken,
953
+ draggedAccessoryCodex: viewHandler.settingsState.draggedAccessoryCodex,
954
+ callbacks: callbacks,
955
+ analyzerComponents: rtvAnalyzerComponents,
956
+ focusElementId: focusElementId,
957
+ elementsInfo: elementsInfo,
958
+ selectedElementId: selectedElementId,
959
+ selectedAccessoryKey: selectedAccessoryKey,
960
+ showDimensionLines: showDimensionLines
961
+ });
962
+ };
963
+ var index = observer(PlannerRTVNext);
964
+
965
+ export { index as default };