@imagineio/configurator-sdk 0.1.0-beta.1

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 (246) hide show
  1. package/LICENSE.md +294 -0
  2. package/README.md +103 -0
  3. package/dist/00a41227ff.js +1 -0
  4. package/dist/00ab3dcbb5.js +1 -0
  5. package/dist/01a664fa9f.css +51 -0
  6. package/dist/04746bff9a.js +1 -0
  7. package/dist/04931f795e.js +1 -0
  8. package/dist/05973a4da2.js +3 -0
  9. package/dist/061b81ad81.js +1 -0
  10. package/dist/066fc9aa40.js +1 -0
  11. package/dist/09c4973968.js +1 -0
  12. package/dist/0a35b2c5f4.js +1 -0
  13. package/dist/0af28430ab.js +1 -0
  14. package/dist/0e2dedae0d.js +1 -0
  15. package/dist/0f7c8345a8.js +1 -0
  16. package/dist/12b8165d6d.js +1 -0
  17. package/dist/1458417bdb.js +1 -0
  18. package/dist/14c83bc57a.js +1 -0
  19. package/dist/15d6bec3b5.css +150 -0
  20. package/dist/16a399703e.js +1 -0
  21. package/dist/17876f4322.css +114 -0
  22. package/dist/1870fc037b.js +1 -0
  23. package/dist/1a2629800a.css +196 -0
  24. package/dist/1e243363f6.js +1 -0
  25. package/dist/1fac915f8b.js +1 -0
  26. package/dist/1fff100656.js +1 -0
  27. package/dist/205827c5c8.js +1 -0
  28. package/dist/20b0104576.js +1 -0
  29. package/dist/2239b22616.js +1 -0
  30. package/dist/22bd38ddcf.js +1 -0
  31. package/dist/239b619005.css +1849 -0
  32. package/dist/23dc0ccf32.js +1 -0
  33. package/dist/26155bf68c.js +1 -0
  34. package/dist/2774152dd2.js +1 -0
  35. package/dist/27fee7007f.js +1 -0
  36. package/dist/281cf952fa.js +1 -0
  37. package/dist/28a9d58274.js +1 -0
  38. package/dist/28d887bf8a.js +1 -0
  39. package/dist/28df2aa12f.js +1 -0
  40. package/dist/297e653adf.js +1 -0
  41. package/dist/2990ba64d6.js +1 -0
  42. package/dist/2b6aa27f6d.js +1 -0
  43. package/dist/2c7c1bcef1.js +1 -0
  44. package/dist/2cab5c5c23.js +1 -0
  45. package/dist/2cafe3274b.js +1 -0
  46. package/dist/2e366d7386.js +1 -0
  47. package/dist/2f8cc8b292.js +1 -0
  48. package/dist/30be653f00.css +110 -0
  49. package/dist/31ea036f5c.js +1 -0
  50. package/dist/32861ea2b0.js +1 -0
  51. package/dist/33fa2c8ca2.js +1 -0
  52. package/dist/35d8449ed8.js +1 -0
  53. package/dist/3656ffa1b8.js +1 -0
  54. package/dist/367a479d3a.js +1 -0
  55. package/dist/371ed78aa2.js +1 -0
  56. package/dist/37596ace72.js +1 -0
  57. package/dist/37addc7fb3.js +1 -0
  58. package/dist/388cadacbd.js +1 -0
  59. package/dist/39a62ef7b8.js +1 -0
  60. package/dist/3bbcee0334.js +1 -0
  61. package/dist/3c916f744f.js +1 -0
  62. package/dist/3f37665dd1.js +1 -0
  63. package/dist/3fb3ab6757.js +1 -0
  64. package/dist/40d6aeb28c.js +1 -0
  65. package/dist/41ed5985ad.js +1 -0
  66. package/dist/431a2d8618.js +1 -0
  67. package/dist/44a229099f.js +1 -0
  68. package/dist/4741e5d07d.css +263 -0
  69. package/dist/4910c07ca8.css +411 -0
  70. package/dist/4a99ddb3fd.js +1 -0
  71. package/dist/4aa671f9f6.js +1 -0
  72. package/dist/4b8958aa4c.js +1 -0
  73. package/dist/4ba4f544b9.js +1 -0
  74. package/dist/4c24338793.js +1 -0
  75. package/dist/4d7a0d1897.js +1 -0
  76. package/dist/4e1db1e3b0.js +1 -0
  77. package/dist/4e7d0a0d4a.js +1 -0
  78. package/dist/51b23203e5.css +1447 -0
  79. package/dist/52436e0169.js +1 -0
  80. package/dist/54413c1eae.js +1 -0
  81. package/dist/54f0fcf38b.js +1 -0
  82. package/dist/55ab45ada4.css +370 -0
  83. package/dist/561dc3f1ab.js +1 -0
  84. package/dist/58e6419ba8.js +1 -0
  85. package/dist/5c9fd9201c.js +1 -0
  86. package/dist/5d05e8982e.js +1 -0
  87. package/dist/5d5e8a9c58.js +3 -0
  88. package/dist/5e4f2349ff.js +1 -0
  89. package/dist/609e5e5d28.js +1 -0
  90. package/dist/60d697292c.js +1 -0
  91. package/dist/61e0c0c9b5.js +1 -0
  92. package/dist/631a9f7fac.js +1 -0
  93. package/dist/64e9020b49.js +1 -0
  94. package/dist/66c461dc2c.js +1 -0
  95. package/dist/672404d987.js +1 -0
  96. package/dist/67f6338a4a.js +1 -0
  97. package/dist/6855e6a3b1.js +1 -0
  98. package/dist/6b0a81e4f8.js +1 -0
  99. package/dist/6ba86aa3b8.js +1 -0
  100. package/dist/6bff84d27e.js +1 -0
  101. package/dist/6c0a2572dd.js +1 -0
  102. package/dist/6d238282c1.js +1 -0
  103. package/dist/6e2595aa36.js +1 -0
  104. package/dist/6f9ae59d6c.js +1 -0
  105. package/dist/70dd811d74.js +1 -0
  106. package/dist/710c1ab641.js +1 -0
  107. package/dist/7206ce49c6.js +1 -0
  108. package/dist/7281d77ed9.js +1 -0
  109. package/dist/73f7d65985.js +1 -0
  110. package/dist/776277593f.js +1 -0
  111. package/dist/79a397bb92.js +1 -0
  112. package/dist/7a748aae59.js +1 -0
  113. package/dist/7bfb0ecfbb.css +572 -0
  114. package/dist/7bfcd0a517.js +1 -0
  115. package/dist/7d9ddaeb47.js +1 -0
  116. package/dist/7f833bc5af.js +1 -0
  117. package/dist/811b403d43.js +1 -0
  118. package/dist/817d930a49.js +1 -0
  119. package/dist/81802759ca.js +1 -0
  120. package/dist/81eb433604.js +1 -0
  121. package/dist/82a8a4bc35.js +1 -0
  122. package/dist/85af90fade.js +1 -0
  123. package/dist/872c4302e0.js +1 -0
  124. package/dist/87bb469216.js +1 -0
  125. package/dist/87dcc12b65.js +1 -0
  126. package/dist/87f511c4a8.js +1 -0
  127. package/dist/88251d6671.js +1 -0
  128. package/dist/882bc739c8.js +1 -0
  129. package/dist/89ab18ebc5.js +1 -0
  130. package/dist/8a22e8944f.css +563 -0
  131. package/dist/8a3a57c008.js +1 -0
  132. package/dist/8ade32d067.js +1 -0
  133. package/dist/8bf6d26ad6.css +233 -0
  134. package/dist/8c27edda0f.js +1 -0
  135. package/dist/8db8655f21.js +24 -0
  136. package/dist/8f60e5059a.js +1 -0
  137. package/dist/91707f5ca0.css +78 -0
  138. package/dist/921bf270dd.js +20 -0
  139. package/dist/9326c23506.js +1 -0
  140. package/dist/94a0a79c65.js +1 -0
  141. package/dist/9526094bb7.js +1 -0
  142. package/dist/9544661159.js +1 -0
  143. package/dist/95a44ebec2.js +1 -0
  144. package/dist/970313b92b.js +1 -0
  145. package/dist/9794652102.js +1 -0
  146. package/dist/983cbed22c.js +1 -0
  147. package/dist/9840b9ce12.js +1 -0
  148. package/dist/98f3644031.js +1 -0
  149. package/dist/992778075d.css +353 -0
  150. package/dist/9c6c598569.js +1 -0
  151. package/dist/9f474b5d1a.js +1 -0
  152. package/dist/a0f71d0bf5.js +1 -0
  153. package/dist/a3c983d431.js +1 -0
  154. package/dist/a3f18e76fe.js +1 -0
  155. package/dist/a493e9aa8f.js +1 -0
  156. package/dist/a77b15c0d6.js +1 -0
  157. package/dist/a811c90bd5.js +1 -0
  158. package/dist/a822c5e4f2.js +1 -0
  159. package/dist/aaa0e82d7f.css +69 -0
  160. package/dist/ab6c80484f.js +1 -0
  161. package/dist/ae96f219e3.js +1 -0
  162. package/dist/b11b38869d.css +427 -0
  163. package/dist/b1349d5a21.js +4 -0
  164. package/dist/b14379d31b.css +151 -0
  165. package/dist/b3efb26fd7.js +1 -0
  166. package/dist/b59b0dde17.js +1 -0
  167. package/dist/b5c372377f.js +1 -0
  168. package/dist/b976df09ec.js +1 -0
  169. package/dist/baeaed46c9.js +1 -0
  170. package/dist/bb719febc6.js +1 -0
  171. package/dist/bcd44b4040.js +1 -0
  172. package/dist/bdc4e4c5b9.css +209 -0
  173. package/dist/bdec200d00.js +1 -0
  174. package/dist/be0cfe2236.js +1 -0
  175. package/dist/be337ddda5.js +1 -0
  176. package/dist/c12c112c6f.js +1 -0
  177. package/dist/c2a14a77ae.js +1 -0
  178. package/dist/c3b8f1973b.js +1 -0
  179. package/dist/c44d37da7a.js +1 -0
  180. package/dist/c4790179f1.js +1 -0
  181. package/dist/c5e990946e.js +1 -0
  182. package/dist/c71892453b.js +1 -0
  183. package/dist/c9a1656c62.js +1 -0
  184. package/dist/ca497b066c.js +1 -0
  185. package/dist/cdb4a0f7b3.js +3 -0
  186. package/dist/ce663020e4.js +60 -0
  187. package/dist/cec035efb1.js +1 -0
  188. package/dist/d0f9681634.js +1 -0
  189. package/dist/d118c2e7ba.js +1 -0
  190. package/dist/d20718159b.js +3 -0
  191. package/dist/d30f1f506e.js +1 -0
  192. package/dist/d3cd7f1bc1.js +1 -0
  193. package/dist/d4378d9afa.js +1 -0
  194. package/dist/d464da28a5.js +1 -0
  195. package/dist/d566d3874b.js +1 -0
  196. package/dist/d617bbb9f5.js +26 -0
  197. package/dist/d65f32e004.js +1 -0
  198. package/dist/d6851ea979.js +1 -0
  199. package/dist/d7c9500ba9.js +1 -0
  200. package/dist/d803155241.js +1 -0
  201. package/dist/d903df4e0d.js +1 -0
  202. package/dist/d94df858ea.js +1 -0
  203. package/dist/da7b5f450d.js +1 -0
  204. package/dist/daa11edd01.js +1 -0
  205. package/dist/db4afd43c9.js +1 -0
  206. package/dist/dbd5ba1d07.js +1 -0
  207. package/dist/dc2a1a0e13.js +1 -0
  208. package/dist/dc812f3e14.js +1 -0
  209. package/dist/dcbf419090.css +122 -0
  210. package/dist/dcdba78ddf.js +1 -0
  211. package/dist/de408c4516.js +1 -0
  212. package/dist/e1cd279733.js +1 -0
  213. package/dist/e379e0039b.js +1 -0
  214. package/dist/e4fe0551fd.js +1 -0
  215. package/dist/e6eed481cc.css +28 -0
  216. package/dist/e75f1e5992.js +1 -0
  217. package/dist/ea8577d22b.js +1 -0
  218. package/dist/ec4a34fc80.css +313 -0
  219. package/dist/ed6a54cdf6.js +1 -0
  220. package/dist/ee242c0099.js +1 -0
  221. package/dist/ee9b9fd7d1.js +1 -0
  222. package/dist/f0c3d8a28a.js +1 -0
  223. package/dist/f11a45a150.js +1 -0
  224. package/dist/f1b3b2622a.js +1 -0
  225. package/dist/f7b4a178e3.js +1 -0
  226. package/dist/f89d7cd931.js +1 -0
  227. package/dist/f8cb80a93c.js +1 -0
  228. package/dist/f8fec86f10.js +1 -0
  229. package/dist/fbd844f2d1.js +1 -0
  230. package/dist/fe235d7160.js +1 -0
  231. package/dist/fe58a84b85.js +1 -0
  232. package/dist/fe68b361ba.js +1 -0
  233. package/dist/ff5b3d17e2.js +1 -0
  234. package/dist/styles/globals.css +442 -0
  235. package/dist/styles/themes.css +532 -0
  236. package/dist/styles/variables.css +299 -0
  237. package/package.json +68 -0
  238. package/static/assets/draco/README.md +32 -0
  239. package/static/assets/draco/draco_decoder.js +34 -0
  240. package/static/assets/draco/draco_decoder.wasm +0 -0
  241. package/static/assets/draco/draco_encoder.js +35 -0
  242. package/static/assets/draco/draco_encoder.wasm +0 -0
  243. package/static/assets/draco/draco_encoder_wrapper.js +98 -0
  244. package/static/assets/draco/draco_wasm_wrapper.js +117 -0
  245. package/static/favicon.svg +28 -0
  246. package/static/version.txt +1 -0
@@ -0,0 +1,150 @@
1
+ @layer sdk-base, vendor, sdk;
2
+ @layer sdk {
3
+ .modal-overlay {
4
+ position: fixed;
5
+ inset: 0;
6
+ background: rgba(0, 0, 0, 0.25);
7
+ /* Every dialog backdrop (ours, host-registered, quote, backend show_message) blurs the page
8
+ behind it by this much. 0 turns it off; the dimming stays. */
9
+ backdrop-filter: blur(var(--modal-backdrop-blur, 4px));
10
+ -webkit-backdrop-filter: blur(var(--modal-backdrop-blur, 4px));
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ z-index: 200;
15
+ animation: fadeIn 0.2s ease;
16
+ }
17
+
18
+ @keyframes fadeIn {
19
+ from {
20
+ opacity: 0;
21
+ }
22
+ to {
23
+ opacity: 1;
24
+ }
25
+ }
26
+
27
+ .modal {
28
+ background: var(--bg-primary);
29
+ border-radius: var(--border-radius-lg);
30
+ box-shadow: var(--shadow-lg);
31
+ max-width: 90vw;
32
+ max-height: 90vh;
33
+ overflow: hidden;
34
+ display: flex;
35
+ flex-direction: column;
36
+ animation: slideUp 0.3s ease;
37
+ }
38
+
39
+ @keyframes slideUp {
40
+ from {
41
+ transform: translateY(20px);
42
+ opacity: 0;
43
+ }
44
+ to {
45
+ transform: translateY(0);
46
+ opacity: 1;
47
+ }
48
+ }
49
+
50
+ .modal--small {
51
+ width: 400px;
52
+ }
53
+
54
+ .modal--medium {
55
+ width: 560px;
56
+ }
57
+
58
+ .modal--large {
59
+ width: 800px;
60
+ }
61
+
62
+ .modal--xlarge {
63
+ width: 1040px;
64
+ }
65
+
66
+ .modal__header {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: space-between;
70
+ padding: var(--spacing-md) var(--spacing-lg);
71
+ border-bottom: 1px solid var(--border-color);
72
+ }
73
+
74
+ .modal__title {
75
+ font-size: var(--font-size-lg);
76
+ font-weight: 600;
77
+ }
78
+
79
+ .modal__close {
80
+ background: transparent;
81
+ border: none;
82
+ padding: var(--spacing-xs);
83
+ cursor: pointer;
84
+ color: var(--text-secondary);
85
+ transition: color 0.2s ease;
86
+ }
87
+
88
+ .modal__close:hover {
89
+ color: var(--text-primary);
90
+ }
91
+
92
+ .modal__close svg {
93
+ width: 20px;
94
+ height: 20px;
95
+ }
96
+
97
+ .modal__content {
98
+ flex: 1;
99
+ padding: var(--spacing-lg);
100
+ overflow-y: auto;
101
+ }
102
+
103
+ .modal__footer {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: flex-end;
107
+ gap: var(--spacing-sm);
108
+ padding: var(--spacing-md) var(--spacing-lg);
109
+ border-top: 1px solid var(--border-color);
110
+ }
111
+
112
+ .dialog-hint {
113
+ font-size: var(--font-size-sm);
114
+ color: #d32f2f;
115
+ line-height: 1.4;
116
+ margin: 10px 0 0;
117
+ font-weight: 500;
118
+ background: #ffeaea;
119
+ padding: 6px 10px;
120
+ border-radius: 4px;
121
+ display: flex;
122
+ align-items: flex-start;
123
+ gap: 6px;
124
+ }
125
+
126
+ .dialog-hint__icon {
127
+ flex-shrink: 0;
128
+ width: 16px;
129
+ height: 16px;
130
+ color: #d32f2f;
131
+ margin-top: 1px;
132
+ }
133
+
134
+ /* Responsive */
135
+ @media (max-width: 768px) {
136
+ .modal {
137
+ max-width: calc(100% - 32px);
138
+ max-height: 90vh;
139
+ margin: 0 16px;
140
+ }
141
+
142
+ .modal--small,
143
+ .modal--medium,
144
+ .modal--large,
145
+ .modal--xlarge {
146
+ width: calc(100% - 32px);
147
+ }
148
+ }
149
+
150
+ }
@@ -0,0 +1 @@
1
+ import{useMemo as l}from"react";import r from"./9c6c598569.js";import u from"./d94df858ea.js";function i(e){if(e==null||typeof e!="object")return e;let t;try{t=structuredClone(e)}catch{try{t=JSON.parse(JSON.stringify(e))}catch{return null}}const n=c=>{if(c==null||typeof c!="object"||Object.isFrozen(c))return c;Object.freeze(c);for(const s of Object.keys(c))n(c[s]);return c};return n(t)}function f(){const e=r(n=>n.selectedInstanceId),t=r(n=>n.productInstances);return l(()=>{const n=e!=null?String(e):null,c=n?t?.[n]:null;return i({placementId:n,isSelected:n!=null,piece:c??null})},[e,t])}function g(){const e=r(t=>t.productInstances);return l(()=>{const t=Object.entries(e||{}).map(([n,c])=>({placementId:String(n),...c}));return t.sort((n,c)=>Number(n?.sequence??0)-Number(c?.sequence??0)),i(t)||[]},[e])}function m(){const e=r.getState();return{productInstances:e.productInstances||{},selectedInstanceId:e.selectedInstanceId??null,placementSelections:e.placementSelections||{},activeSceneConfigId:e.activeSceneConfigId??null}}function y(){const e=r(o=>o.productInstances),t=r(o=>o.selectedInstanceId),n=r(o=>!!o.productInstances?.[String(o.selectedInstanceId)]?.locked),c=r(o=>o.placementSelections),s=r(o=>o.activeSceneConfigId),a=d();return l(()=>({instances:e||{},selectedId:t??null,locked:n,placementSelections:c||{},activeSceneConfigId:s??null,sceneSelections:a}),[e,t,n,c,s,a])}function d(){const e=u(t=>t.sceneSelections);return l(()=>i(e||{})||{},[e])}function j(){const e=u(s=>s.placementPricing),t=u(s=>s.totalPrice??s.sceneTotal??s.grandTotal??null),n=u(s=>s.currency??null),c=u(s=>s.aggregateAdjustments);return l(()=>i({grandTotal:t??null,currency:n??null,placements:e||{},aggregateAdjustments:c||[]}),[t,n,e,c])}export{m as getSceneState,j as usePrice,g as useProducts,y as useSceneState,f as useSelection};
@@ -0,0 +1,114 @@
1
+ @layer sdk-base, vendor, sdk;
2
+ @layer sdk {
3
+ /* AR Viewer Page */
4
+ .arv-wrapper {
5
+ position: relative;
6
+ width: 100vw;
7
+ height: 100dvh;
8
+ display: flex;
9
+ flex-direction: column;
10
+ background: var(--bg-secondary, #f0ece6);
11
+ }
12
+
13
+ .arv-info {
14
+ position: absolute;
15
+ top: 16px;
16
+ left: 16px;
17
+ right: 16px;
18
+ z-index: 10;
19
+ background: rgba(255, 255, 255, 0.75);
20
+ color: var(--text-primary, #1a1a1a);
21
+ padding: 12px 16px;
22
+ border-radius: 10px;
23
+ font-size: 14px;
24
+ text-align: center;
25
+ backdrop-filter: blur(8px);
26
+ }
27
+
28
+ .arv-model-viewer,
29
+ .arv-wrapper model-viewer {
30
+ flex: 1;
31
+ width: 100%;
32
+ height: 100%;
33
+ }
34
+
35
+ .arv-view-btn {
36
+ position: absolute;
37
+ bottom: 32px;
38
+ left: 50%;
39
+ transform: translateX(-50%);
40
+ z-index: 10;
41
+ display: flex;
42
+ align-items: center;
43
+ gap: 8px;
44
+ padding: 16px 32px;
45
+ white-space: nowrap;
46
+ background: var(--color-brand-primary, #ff5722);
47
+ color: var(--bg-primary, #fff);
48
+ border: none;
49
+ border-radius: 50px;
50
+ font-size: 17px;
51
+ font-weight: 600;
52
+ cursor: pointer;
53
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
54
+ transition: background 0.2s;
55
+ }
56
+
57
+ .arv-view-btn:active {
58
+ background: var(--color-brand-primary-dark, #e64a19);
59
+ }
60
+
61
+ /* Desktop QR Code View */
62
+ .arv-center {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ width: 100vw;
67
+ height: 100vh;
68
+ background: var(--bg-secondary, #f5f5f5);
69
+ }
70
+
71
+ .arv-qr-card {
72
+ display: flex;
73
+ flex-direction: column;
74
+ align-items: center;
75
+ gap: 12px;
76
+ padding: 40px;
77
+ background: var(--bg-primary, #fff);
78
+ border-radius: 16px;
79
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.1);
80
+ text-align: center;
81
+ }
82
+
83
+ .arv-qr-title {
84
+ margin: 0;
85
+ font-size: 24px;
86
+ font-weight: 700;
87
+ color: var(--text-primary, #1a1a1a);
88
+ }
89
+
90
+ .arv-qr-subtitle {
91
+ margin: 0;
92
+ font-size: 15px;
93
+ color: var(--text-secondary, #666);
94
+ }
95
+
96
+ .arv-qr-wrapper {
97
+ padding: 20px;
98
+ background: var(--bg-primary, #fff);
99
+ border-radius: 12px;
100
+ border: 1px solid var(--bg-tertiary, #eee);
101
+ }
102
+
103
+ .arv-qr-hint {
104
+ margin: 0;
105
+ font-size: 13px;
106
+ color: var(--text-tertiary, #999);
107
+ }
108
+
109
+ .arv-error {
110
+ font-size: 16px;
111
+ color: var(--text-secondary, #666);
112
+ }
113
+
114
+ }
@@ -0,0 +1 @@
1
+ import{Fragment as oe,jsx as r,jsxs as te}from"react/jsx-runtime";import{setTokenProvider as L}from"./33fa2c8ca2.js";import{adoptUrlCredentials as R}from"./1fff100656.js";import{copilotAuthHeaders as _}from"./431a2d8618.js";import{useEffect as s,useState as A,useSyncExternalStore as y,lazy as C,Suspense as b}from"react";import k from"react-dom/client";import"./styles/globals.css";import B from"./87bb469216.js";import T from"./88251d6671.js";import v from"./d617bbb9f5.js";import I from"./7bfcd0a517.js";import{bootConfigurator as E}from"./371ed78aa2.js";import a from"./8f60e5059a.js";import{markThemeReady as D}from"./066fc9aa40.js";import{CopilotContext as M}from"./672404d987.js";import{checkCopilotAvailability as K,getCopilotRuntimeUrl as O,getCopilotWarmupUrl as P}from"./fe58a84b85.js";import{whenConfiguratorLicenceSettled as U,subscribeConfiguratorLicence as x,getConfiguratorAllowed as w,getConfiguratorBlockedMessage as z}from"./3bbcee0334.js";import{resolveRoute as h}from"./61e0c0c9b5.js";import{resolveComponent as S,useComponentRegistry as V}from"./882bc739c8.js";import{useLabels as N}from"./28d887bf8a.js";const W=C(()=>import("./81eb433604.js")),H=6e3,q=3e4,F=C(async()=>{const[{CopilotKit:e}]=await Promise.all([import("@copilotkit/react-core"),import("@copilotkit/react-ui/styles.css")]);return{default:e}});let u=null,c={ready:!1,error:null},d=0;const m=new Set;let p={};function f(){d+=1;for(const e of m)try{e()}catch{}}function G(e){return m.add(e),()=>{m.delete(e)}}function X(e={}){if(u)try{u.cancel()}catch{}return c={ready:!1,error:null},f(),u=E({resolveInitialSystemId:e.resolveInitialSystemId??(()=>e.systemId??null),resolveConfigurator:e.resolveConfigurator,resolveConfiguratorKey:e.resolveConfiguratorKey,resolveInitialChannelId:e.resolveInitialChannelId,getToken:e.getToken,onReady:()=>{c={ready:!0,error:null},f()},onError:(o,t)=>{let l=o;t?.code==="unlicensed"?l={unlicensed:!0,message:o}:l={...t,message:o},c={ready:!1,error:l},f()}}),u}function Y(){try{u?.cancel()}catch{}u=null,c={ready:!1,error:null},f()}function $(){return y(G,()=>d,()=>d),c}function J(){const e=a(i=>i.bootLoading),o=a(i=>i.bootDetail),t=a(i=>i.bootProgress),l=a(i=>i.themeReady);V();const n=S("LoadingScreen",T),g=N();return!e||!l?null:r(n,{overlay:!0,message:g("loading.message","Loading your configurator\u2026"),detail:o,progress:t})}function Q(){const{ready:e,error:o}=$(),t=y(x,w,w);return s(()=>{o&&a.getState().endBootLoading?.()},[o]),s(()=>{t||a.getState().endBootLoading?.()},[t]),!t&&!o?.unlicensed?r(v,{message:z()}):o?o?.unlicensed?r(v,{message:o.message}):r(I,{title:o?.title||"Could not load the configurator.",body:o?.body,fix:o?.fix,reason:o?.reason||"error",onRetry:o?.code==="network"?()=>window.location.reload():null}):e?r(B,{}):null}function Z(){const[e,o]=A(null);s(()=>{let n=!0;const g=P();return R(),typeof p.getToken=="function"&&L(p.getToken),U().then(i=>n?i?K():(o(!1),null):null).then(i=>{!n||i===null||o(!!i)}).catch(()=>{n&&o(!1)}),()=>{n=!1}},[]),s(()=>{const n=setTimeout(()=>D(),H);return()=>clearTimeout(n)},[]),s(()=>{const n=setTimeout(()=>a.getState().endBootLoading?.(),q);return()=>clearTimeout(n)},[]);const t=r(M.Provider,{value:{isAvailable:!!e},children:r(Q,{})}),l=e===null?null:e?r(b,{fallback:null,children:r(F,{showDevConsole:!1,enableInspector:!1,runtimeUrl:O(),headers:_,children:t})}):t;return te(oe,{children:[l,r(J,{})]})}function j(){const e=typeof window<"u"?window.location.pathname:"",o=h(e);if(o)return r(o,{});if(e==="/ar-viewer"||e.endsWith("/ar-viewer")){const t=S("ARViewer",W);return r(b,{fallback:null,children:r(t,{})})}return r(Z,{})}function ee(){const e=typeof window<"u"?window.location.pathname:"";return!(h(e)||e==="/ar-viewer"||e.endsWith("/ar-viewer"))}function Se(e,o={}){const t=typeof e=="string"?document.querySelector(e):e;if(t&&typeof t.setAttribute=="function"&&t.setAttribute("data-imagine-root",""),!t)throw new Error(`mountConfigurator: target not found: ${e}`);p=o;const l=ee();l&&X(o);const n=k.createRoot(t);return n.render(j()),{unmount:()=>{l&&Y(),n.unmount()}}}export{Se as mountConfigurator};
@@ -0,0 +1,196 @@
1
+ /* Default configurator UI — minimal, unopinionated layout. Override freely. */
2
+ .sdk-configurator {
3
+ display: flex;
4
+ width: 100%;
5
+ height: 100%;
6
+ min-height: 480px;
7
+ }
8
+ .sdk-configurator__scene {
9
+ position: relative;
10
+ flex: 1 1 auto;
11
+ min-width: 0;
12
+ }
13
+ .sdk-configurator__sidebar {
14
+ flex: 0 0 300px;
15
+ overflow-y: auto;
16
+ padding: 16px;
17
+ border-left: 1px solid rgba(0, 0, 0, 0.08);
18
+ background: var(--bg-muted, #fafafa);
19
+ }
20
+
21
+ .sdk-option-sidebar__section { margin-bottom: 20px; }
22
+ .sdk-option-sidebar__title {
23
+ margin: 0 0 8px;
24
+ font: 600 12px/1.4 system-ui, sans-serif;
25
+ text-transform: uppercase;
26
+ letter-spacing: 0.04em;
27
+ color: var(--text-secondary, #555);
28
+ }
29
+ .sdk-option-sidebar__grid {
30
+ display: grid;
31
+ gap: 8px;
32
+ }
33
+ .sdk-option-sidebar__grid.is-finish { grid-template-columns: repeat(auto-fill, minmax(44px, 1fr)); }
34
+ .sdk-option-sidebar__grid.is-options { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); }
35
+
36
+ .sdk-option-tile {
37
+ border: 1px solid rgba(0, 0, 0, 0.12);
38
+ border-radius: 6px;
39
+ background: var(--bg-primary, #fff);
40
+ cursor: pointer;
41
+ padding: 8px;
42
+ font: 500 12px/1.3 system-ui, sans-serif;
43
+ color: var(--text-primary, #222);
44
+ transition: border-color 0.12s, box-shadow 0.12s;
45
+ }
46
+ .sdk-option-tile:hover { border-color: var(--text-tertiary, #999); }
47
+ .sdk-option-tile.is-selected {
48
+ border-color: var(--color-brand-primary, #ec4e0b);
49
+ box-shadow: 0 0 0 1px var(--color-brand-primary, #ec4e0b);
50
+ }
51
+ .sdk-option-tile.is-swatch {
52
+ height: 44px;
53
+ padding: 0;
54
+ border-radius: 8px;
55
+ }
56
+
57
+ /* Slot-placement banner — same look as the legacy appliance placement overlay
58
+ (SceneCanvas.css .placement-mode-overlay), copied here so the single-canvas
59
+ SDK scene is self-contained. */
60
+ .placement-mode-overlay {
61
+ position: absolute;
62
+ top: 12px;
63
+ left: 50%;
64
+ transform: translateX(-50%);
65
+ z-index: 20;
66
+ pointer-events: auto;
67
+ }
68
+ .placement-mode-overlay__content {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: space-between;
72
+ gap: 16px;
73
+ background: rgba(var(--color-brand-primary-rgb, 75, 85, 99), 0.95);
74
+ color: var(--text-inverse, var(--bg-primary, #fff));
75
+ padding: 8px 12px 8px 20px;
76
+ border-radius: var(--radius-full, 9999px);
77
+ box-shadow: 0 4px 20px rgba(var(--color-brand-primary-rgb, 75, 85, 99), 0.4);
78
+ animation: sdk-slideDown 0.3s ease-out;
79
+ }
80
+ @keyframes sdk-slideDown {
81
+ from { opacity: 0; transform: translateY(-10px); }
82
+ to { opacity: 1; transform: translateY(0); }
83
+ }
84
+ .placement-mode-overlay__text {
85
+ font-size: var(--font-size-md, 14px);
86
+ font-weight: var(--font-weight-medium, 500);
87
+ }
88
+ .placement-mode-overlay__text strong { font-weight: var(--font-weight-semibold, 600); }
89
+ .placement-mode-overlay__cancel {
90
+ padding: 6px 14px;
91
+ border: 2px solid rgba(255, 255, 255, 0.5);
92
+ background: transparent;
93
+ color: var(--text-inverse, var(--bg-primary, #fff));
94
+ border-radius: 20px;
95
+ font-size: var(--font-size-md, 14px);
96
+ font-weight: var(--font-weight-medium, 500);
97
+ cursor: pointer;
98
+ transition: all 0.15s ease;
99
+ display: flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ flex-shrink: 0;
103
+ }
104
+ .placement-mode-overlay__cancel:hover {
105
+ background: rgba(255, 255, 255, 0.2);
106
+ border-color: var(--text-inverse, var(--bg-primary, #fff));
107
+ }
108
+
109
+ /* ═══════════════════════════════════════════════════════════════════════════
110
+ BASE BUTTON — what a public part looks like with no className of its own.
111
+ ═══════════════════════════════════════════════════════════════════════════
112
+ `GenerateAssetsButton` rendered `className={className}` with NO default, and every one of
113
+ our shells passes a shell-specific class (`header__generate-btn`, `showroom-cta`,
114
+ `wizard-header__cta`). So the component looked right in all four of OUR layouts and rendered
115
+ as a bare browser button for any host who mounted it from `parts` — the styling lived in
116
+ stylesheets a host does not own, keyed by class names they had no reason to know.
117
+
118
+ Fully tokenised, INCLUDING the font: typography is most of what reads as "themed", and a
119
+ serif brand whose buttons stay system-sans looks untouched no matter how the colours move. */
120
+ .sdk-btn {
121
+ display: inline-flex;
122
+ align-items: center;
123
+ gap: 6px;
124
+ padding: 8px 16px;
125
+ border: 1px solid var(--border-default, #e5e5e5);
126
+ border-radius: var(--btn-border-radius, 6px);
127
+ background: var(--bg-primary, #fff);
128
+ color: var(--text-primary, #1a1a1a);
129
+ font-family: var(--font-family-base, inherit);
130
+ font-size: 13px;
131
+ font-weight: 500;
132
+ line-height: 1;
133
+ cursor: pointer;
134
+ box-shadow: var(--btn-shadow, none);
135
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
136
+ }
137
+
138
+ .sdk-btn:hover:not(:disabled) {
139
+ border-color: var(--color-brand-primary, #ff5722);
140
+ color: var(--color-brand-primary, #ff5722);
141
+ }
142
+
143
+ .sdk-btn:disabled {
144
+ opacity: 0.5;
145
+ pointer-events: none;
146
+ }
147
+
148
+ .sdk-btn--primary {
149
+ background: var(--color-brand-primary, #ff5722);
150
+ border-color: var(--color-brand-primary, #ff5722);
151
+ color: #fff;
152
+ }
153
+
154
+ .sdk-btn--primary:hover:not(:disabled) {
155
+ background: var(--color-brand-primary-dark, #e64a19);
156
+ border-color: var(--color-brand-primary-dark, #e64a19);
157
+ color: #fff;
158
+ }
159
+
160
+ /* ── the assistant, following the theme ──────────────────────────────────────
161
+ CopilotKit ships its own stylesheet with its own font stack and radii. Nothing here
162
+ restyled it, so a serif brand got a system-sans chat panel — the single biggest reason the
163
+ chat "looks old" while its container is themed. These map its surface onto our tokens; they
164
+ are additive, so an unthemed app is unchanged. */
165
+ .copilotKitChat,
166
+ .copilotKitMessages,
167
+ .copilotKitInput,
168
+ .copilotKitInput > textarea,
169
+ .copilotKitMessage {
170
+ font-family: var(--font-family-base, inherit);
171
+ }
172
+
173
+ .copilotKitChat {
174
+ background: var(--bg-primary, #fff);
175
+ color: var(--text-primary, #1a1a1a);
176
+ }
177
+
178
+ .copilotKitInputContainer,
179
+ .copilotKitInput {
180
+ border-radius: var(--btn-border-radius, 6px);
181
+ border-color: var(--border-default, #e5e5e5);
182
+ background: var(--bg-primary, #fff);
183
+ color: var(--text-primary, #1a1a1a);
184
+ }
185
+
186
+ /* The assistant's own bubbles take the brand; the user's stay neutral, so the two remain
187
+ distinguishable in any palette. */
188
+ .copilotKitAssistantMessage {
189
+ background: var(--bg-secondary, #f5f5f5);
190
+ color: var(--text-primary, #1a1a1a);
191
+ }
192
+
193
+ .copilotKitUserMessage {
194
+ background: var(--color-brand-primary, #ff5722);
195
+ color: #fff;
196
+ }
@@ -0,0 +1 @@
1
+ import{onEvent as w}from"./2e366d7386.js";let c=null;function m(e){c=Array.isArray(e)?e.map(t=>String(t).replace(/\/+$/,"")):null}function S(){return c?[...c]:null}const f=e=>!c||c.includes(e);function u(e){if(e==null)return e;try{return JSON.parse(JSON.stringify(e))}catch{return{_unserializable:!0}}}function d(e){if(typeof window>"u"||window.parent===window)return;const t=c||["*"];for(const n of t)try{window.parent.postMessage(e,n)}catch{}}function l(e,t){const n=e.filter(s=>!t.includes(s));if(n.length)throw new Error(`unknown region(s): ${n.join(", ")}. Available: ${t.join(", ")}`)}const a={async selectOption(e={}){const{options:t}=await import("./a0f71d0bf5.js"),{optionSet:n,option:s,optionSetId:o,optionId:r}=e;if(!(o!=null&&r!=null?await t.selectByIds(o,r):n!=null?await t.select(n,s):await t.select(s)))throw new Error("selectOption: not applied \u2014 unknown, ambiguous, or unavailable (see configurator console)");return{applied:!0}},async setSceneOption({optionSetId:e,featureId:t,optionId:n}){const{options:s}=await import("./a0f71d0bf5.js"),o=e??t;return await s.selectForScene({optionSetId:o,optionId:n}),{optionSetId:o,optionId:n}},async setProductOption({placementId:e,instanceId:t,optionSetId:n,featureId:s,optionId:o}){const{options:r}=await import("./a0f71d0bf5.js"),i=e??t,p=n??s;return await r.selectForProduct({placementId:i,optionSetId:p,optionId:o}),{placementId:i,optionSetId:p,optionId:o}},async setLayout({layoutId:e}){const{options:t}=await import("./a0f71d0bf5.js");if(!await t.select(e))throw new Error(`setLayout: "${e}" did not resolve to a selectable option`);return{layoutId:e}},async getQuote(){const{quote:e}=await import("./a0f71d0bf5.js");return u(e.read())},async getSelections(){const{options:e}=await import("./a0f71d0bf5.js"),{default:t}=await import("./9c6c598569.js"),{default:n}=await import("./d94df858ea.js"),s={};for(const o of Object.keys(t.getState().productInstances||{})){const r=e.effective(o);r&&(s[o]=r)}return u({scene:n.getState().sceneSelections||{},placements:s})},async getOptionSets(){const{default:e}=await import("./872c4302e0.js"),{features:t={},options:n={}}=e.getState(),s={};for(const[o,r]of Object.entries(t))s[o]={id:o,name:r.name,type:r.type,options:(r.options||[]).map(i=>({id:i,name:n[i]?.name,value:n[i]?.value}))};return s},async getProductInstances(){const{default:e}=await import("./9c6c598569.js"),{default:t}=await import("./d94df858ea.js"),n=e.getState().productInstances||{},s=t.getState().instanceSelections||{},o={};for(const[r,i]of Object.entries(n))o[r]={instanceId:r,productId:i.productId,selections:u(s[r])||{}};return o},async getSceneSelections(){const{default:e}=await import("./d94df858ea.js");return u(e.getState().sceneSelections)},async getConfiguration(){const{snapshotScene:e}=await import("./2cafe3274b.js");return u(await e())},async getScreenshot(){const e=document.querySelector(".scene-canvas canvas")||document.querySelector("canvas");if(!e)throw new Error("Canvas not found");return{dataUrl:e.toDataURL("image/jpeg",.92)}},async setCameraPosition({position:e}){if(!Array.isArray(e)||e.length!==3)throw new Error("position must be [x, y, z] array");const{default:t}=await import("./9c6c598569.js");return t.getState().setCameraPosition(e),{position:e}},async resetCamera(){const{scene:e}=await import("./a0f71d0bf5.js");return e.camera.reset(),{reset:!0}},async toggleView(){const{scene:e}=await import("./a0f71d0bf5.js");return e.view.toggle(),{is3D:e.view.is3D()}},async toggleWalls(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.walls(),{toggled:"walls"}},async toggleDimensions(){const{scene:e}=await import("./a0f71d0bf5.js");return e.toggle.dimensions(),{toggled:"dimensions"}},async setGuiVisible({visible:e}){const{ui:t}=await import("./a0f71d0bf5.js");return t.setSceneOverlaysVisible(e),{guiVisible:e}},async hideUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.hide(...n),t.visible()},async showUI({regions:e}={}){const{ui:t}=await import("./a0f71d0bf5.js"),n=e==null?[]:[].concat(e);return l(n,t.regions),t.show(...n),t.visible()},async setUIRegions(e={}){const{ui:t}=await import("./a0f71d0bf5.js");return l(Object.keys(e),t.regions),t.setVisible(e),t.visible()},async getUIRegions(){const{ui:e}=await import("./a0f71d0bf5.js");return{regions:e.visible(),available:[...e.regions]}},async undo(){const{history:e}=await import("./a0f71d0bf5.js");return e.undo(),{undone:!0}},async redo(){const{history:e}=await import("./a0f71d0bf5.js");return e.redo(),{redone:!0}}};a.setSceneFeature=a.setSceneOption,a.setProductFeature=a.setProductOption,a.getFeatures=a.getOptionSets;let g=!1;function b(){g||(g=!0,!(typeof window>"u"||window.parent===window)&&(window.addEventListener("message",async e=>{const{action:t,payload:n,requestId:s}=e.data||{};if(!(!t||typeof t!="string")&&f(e.origin)){if(!a[t]){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:`Unknown action: "${t}". Available: ${Object.keys(a).join(", ")}`},e.origin);return}try{const o=await a[t](n||{});e.source?.postMessage({type:"configurator:response",requestId:s,success:!0,data:u(o)},e.origin)}catch(o){e.source?.postMessage({type:"configurator:response",requestId:s,success:!1,error:o?.message||String(o)},e.origin)}}}),w("*",(e,t)=>{d({type:"configurator:event",event:e,data:u(t)})}),d({type:"configurator:ready"})))}export{S as getAllowedOrigins,b as initIframeMessageService,m as setAllowedOrigins};
@@ -0,0 +1 @@
1
+ import{create as _}from"zustand";import C from"./d94df858ea.js";import h from"./8f60e5059a.js";import O from"./9c6c598569.js";import{isEvaluationPending as A}from"./9f474b5d1a.js";import{isUserActionOpen as I,msSinceUserAction as M}from"./561dc3f1ab.js";import{migrateLegacyUiKeys as H}from"./bb719febc6.js";const b=50,P=["instanceSelections","sceneSelections","lockedFeatures","disabledOptions","filteredOptions","validationErrors","calculatedValues","totalPrice"],E=["freePieceTier","freePieceWidthOption","freePiecePosition","freePieceRotation","hostFinishes","hostMaterials","hostMaterialOverrides","hostWidths","hostDoorTypes","hostStyles","hostHardwareFinishes","hostHandleTypes","hostProductOverrides","sceneHostedProducts","occupiedPieceSlots","pieceConfigSnapshot","disabledWalls"],j=["activeSceneConfigId","productInstances","componentStates","placementOverrides"];function c(e){if(typeof structuredClone=="function")try{return structuredClone(e)}catch{}return JSON.parse(JSON.stringify(e))}function f(){const e=C.getState(),n=h.getState(),s=O.getState(),r={sceneConfig:{},ui:{},sceneGraph:{}};for(const t of P)r.sceneConfig[t]=e[t];for(const t of E)r.ui[t]=n[t];for(const t of j)r.sceneGraph[t]=s[t];return r}function F(e,n){const s={sceneConfig:{},ui:{},sceneGraph:{}};let r=!1;for(const t of P)Object.is(e.sceneConfig[t],n.sceneConfig[t])||(s.sceneConfig[t]={prev:c(e.sceneConfig[t]),next:c(n.sceneConfig[t])},r=!0);for(const t of E)Object.is(e.ui[t],n.ui[t])||(s.ui[t]={prev:c(e.ui[t]),next:c(n.ui[t])},r=!0);for(const t of j)Object.is(e.sceneGraph[t],n.sceneGraph[t])||(s.sceneGraph[t]={prev:c(e.sceneGraph[t]),next:c(n.sceneGraph[t])},r=!0);return r?s:null}function v(e,n){const s={},r={},t={};for(const[d,y]of Object.entries(e.sceneConfig))s[d]=c(y[n]);for(const[d,y]of Object.entries(e.ui))r[d]=c(y[n]);for(const[d,y]of Object.entries(e.sceneGraph))t[d]=c(y[n]);Object.keys(s).length>0&&C.setState(s),Object.keys(r).length>0&&h.setState(r),Object.keys(t).length>0&&O.setState(t)}let l=!1,a=0,p=f(),o=[],i=-1,g=null,u=null;const U=40;function m(){x.setState({past:o.slice(0,i+1),future:o.slice(i+1)})}function N(e){if(i<o.length-1&&(o=o.slice(0,i+1)),o.push(e),i+=1,o.length>b){const n=o.length-b;o=o.slice(n),i=Math.max(-1,i-n)}m()}function W(e,n){if(!e)return n;const s={sceneConfig:{...e.sceneConfig},ui:{...e.ui},sceneGraph:{...e.sceneGraph}};for(const[r,t]of Object.entries(n.sceneConfig))s.sceneConfig[r]=s.sceneConfig[r]?{prev:s.sceneConfig[r].prev,next:t.next}:t;for(const[r,t]of Object.entries(n.ui))s.ui[r]=s.ui[r]?{prev:s.ui[r].prev,next:t.next}:t;for(const[r,t]of Object.entries(n.sceneGraph))s.sceneGraph[r]=s.sceneGraph[r]?{prev:s.sceneGraph[r].prev,next:t.next}:t;return s}function k(){u&&(clearTimeout(u),u=null),S=0,g&&(N(g),g=null)}const D=8e3,K=900;let S=0;function T(){u&&clearTimeout(u),u=setTimeout(()=>{if(u=null,(I()||A()||M()<K)&&(S||(S=Date.now()),Date.now()-S<D)){T();return}S=0,k()},U)}const x=_(e=>({past:[],future:[],undo:()=>{if(l||(k(),i<0))return;const n=o[i];n&&(l=!0,v(n,"prev"),h.setState({selectedFeatureId:null,selectedElementType:null,selectedPieceIndex:null}),i-=1,p=f(),m(),l=!1)},redo:()=>{if(l||(k(),i>=o.length-1))return;const n=o[i+1];n&&(l=!0,v(n,"next"),h.setState({selectedFeatureId:null,selectedElementType:null,selectedPieceIndex:null}),i+=1,p=f(),m(),l=!1)},clearHistory:()=>{u&&(clearTimeout(u),u=null),g=null,S=0,o=[],i=-1,p=f(),e({past:[],future:[]})},pauseTracking:()=>{a+=1},resumeTracking:()=>{a=Math.max(0,a-1),p=f()}}));function z(){return c(f())}function B(e){if(!e||typeof e!="object")return!1;a+=1,l=!0;try{e.sceneConfig&&Object.keys(e.sceneConfig).length>0&&C.setState(c(e.sceneConfig)),e.ui&&Object.keys(e.ui).length>0&&h.setState(H(c(e.ui))),e.sceneGraph&&Object.keys(e.sceneGraph).length>0&&O.setState(c(e.sceneGraph))}finally{l=!1,a=Math.max(0,a-1),p=f()}return!0}function G(){if(l||a>0)return;const e=f(),n=F(p,e);p=e,n&&(g=W(g,n),T())}C.subscribe(G),h.subscribe(G),O.subscribe(G);var Q=x;export{z as captureSceneState,Q as default,B as restoreSceneState};
@@ -0,0 +1 @@
1
+ import{setShareToken as r,setEmbedSlug as a}from"./431a2d8618.js";const c=new Set(["p","embed","ar-viewer","configure","health","copilotkit","assets","favicon.svg","index.html","warmup"]),o="lk_";function i(){try{const e=window.location.pathname.match(/\/p\/([^/?#]+)/);if(e)return decodeURIComponent(e[1]);const t=window.location.pathname.match(/^\/([^/?#]+)\/?$/);if(t){const n=decodeURIComponent(t[1]);if(!c.has(n)&&!n.startsWith(o))return n}return new URL(window.location.href).searchParams.get("project")||null}catch{return null}}function s(){try{const e=window.location.pathname,t=e.match(new RegExp(`^/(${o}[^/?#]+)`))||e.match(/\/embed\/([^/?#]+)/);return t?decodeURIComponent(t[1]):null}catch{return null}}function m(){const e=i();e&&r(e);const t=s();return t&&a(t),{shareToken:e,embedSlug:t}}export{m as adoptUrlCredentials,s as parseEmbedSlugFromUrl,i as parseShareTokenFromUrl};
@@ -0,0 +1 @@
1
+ import{jsx as a}from"react/jsx-runtime";import{useState as p,useSyncExternalStore as u}from"react";import{resolveTargetRenderer as c,subscribeTargets as f,getTargetsVersion as i}from"./58e6419ba8.js";function h({targets:r,onPick:s}){u(f,i,i);const[l,n]=p(null);if(!Array.isArray(r)||r.length===0)return null;const t=c();return t?r.map(e=>{const d=e.valid===!1?"invalid":l===e.id?"hovered":"idle";return a("group",{position:e.position,rotation:(e.rotation||[0,0,0]).map(o=>o*Math.PI/180),onPointerOver:o=>{o.stopPropagation(),n(e.id)},onPointerOut:o=>{o.stopPropagation(),n(null)},onClick:o=>{o.stopPropagation(),e.valid!==!1&&s?.(e)},children:a(t,{target:e,state:d})},e.id)}):null}export{h as default};
@@ -0,0 +1 @@
1
+ import{Fragment as X,jsx as d,jsxs as y}from"react/jsx-runtime";import{Html as g,Line as H}from"@react-three/drei";const n=.02,f=.28,t=.09,I="#2b6cb0";function u(e){return`${e.toFixed(2)} m`}const v={padding:"2px 7px",borderRadius:5,background:"rgba(43, 108, 176, 0.92)",color:"#fff",fontSize:12,fontWeight:600,whiteSpace:"nowrap",pointerEvents:"none",transform:"translateY(-1px)"};function S({bbox:e}){if(!e||!(e.w>0)||!(e.d>0))return null;const{minX:a,maxX:h,minZ:m,maxZ:l,w,d:R}=e,p=e.height>0?e.height:e.h>0?e.h:0,i=l+f,s=a-f,r=h+f,c=l+f,o=(z,E)=>d(H,{points:z,color:I,lineWidth:1.5},E);return y("group",{name:"scene-dimensions",children:[o([[a,n,i],[h,n,i]],"w"),o([[a,n,i-t],[a,n,i+t]],"wt0"),o([[h,n,i-t],[h,n,i+t]],"wt1"),d(g,{position:[(a+h)/2,n,i],center:!0,zIndexRange:[50,0],style:{pointerEvents:"none"},children:d("div",{style:v,children:u(w)})}),o([[s,n,m],[s,n,l]],"d"),o([[s-t,n,m],[s+t,n,m]],"dt0"),o([[s-t,n,l],[s+t,n,l]],"dt1"),d(g,{position:[s,n,(m+l)/2],center:!0,zIndexRange:[50,0],style:{pointerEvents:"none"},children:d("div",{style:v,children:u(R)})}),p>0&&y(X,{children:[o([[r,n,c],[r,p,c]],"h"),o([[r-t,n,c],[r+t,n,c]],"ht0"),o([[r-t,p,c],[r+t,p,c]],"ht1"),d(g,{position:[r,p/2,c],center:!0,zIndexRange:[50,0],style:{pointerEvents:"none"},children:d("div",{style:v,children:u(p)})})]})]})}export{S as default};
@@ -0,0 +1 @@
1
+ const I={width:256,height:192},b={x:.05,y:.12,w:.9,h:.8};function g(t){return Math.max(0,Math.min(1,t))}async function m(t,o=3){let r;for(let n=0;n<o;n++)try{const c=await fetch(t,{mode:"cors"});if(!c.ok)throw new Error(`Image fetch failed: ${c.status} ${c.statusText}`);const s=await c.blob();return await createImageBitmap(s)}catch(c){r=c,n<o-1&&await new Promise(s=>setTimeout(s,500*(n+1)))}throw r}function y(t,o,r){const n=document.createElement("canvas");n.width=o.width,n.height=o.height;const c=n.getContext("2d",{willReadFrequently:!0}),s=g(r.x),e=g(r.y),i=g(r.w),a=g(r.h),f=Math.floor(t.width*s),l=Math.floor(t.height*e),p=Math.max(1,Math.floor(t.width*i)),M=Math.max(1,Math.floor(t.height*a));c.drawImage(t,f,l,p,M,0,0,o.width,o.height);const{data:u}=c.getImageData(0,0,o.width,o.height),w=new Float32Array(o.width*o.height);for(let d=0,h=0;d<w.length;d++,h+=4)w[d]=(u[h]*.299+u[h+1]*.587+u[h+2]*.114)/255;return w}function x(t,o,r){const n=new Float32Array(o*r);let c=0;const s=(e,i)=>i*o+e;for(let e=1;e<r-1;e++)for(let i=1;i<o-1;i++){const a=t[s(i-1,e-1)],f=t[s(i,e-1)],l=t[s(i+1,e-1)],p=t[s(i-1,e)],M=t[s(i+1,e)],u=t[s(i-1,e+1)],w=t[s(i,e+1)],d=t[s(i+1,e+1)],h=-a+l-2*p+2*M-u+d,A=-a-2*f-l+u+2*w+d,E=Math.sqrt(h*h+A*A);n[s(i,e)]=E,E>c&&(c=E)}if(c>0)for(let e=0;e<n.length;e++)n[e]/=c;return n}function B(t,o){if(t.length!==o.length||t.length===0)return 0;let r=0,n=0,c=0;for(let e=0;e<t.length;e++){const i=t[e],a=o[e];r+=i*a,n+=i*i,c+=a*a}const s=Math.sqrt(n*c);return s===0?0:r/s}async function F(t,o={}){const r=o.size||I,n=o.crop||b;try{const c=await m(t),s=y(c,r,n);return c.close?.(),{edges:x(s,r.width,r.height),size:r,crop:n}}catch{return null}}async function L(t,o){if(!t?.edges)return null;try{const r=await m(o),n=y(r,t.size,t.crop);r.close?.();const c=x(n,t.size.width,t.size.height);return B(t.edges,c)}catch{return null}}async function v(t,o,r={}){const n=r.size||I,c=r.crop||b;try{const[s,e]=await Promise.all([m(t),m(o)]),i=y(s,n,c),a=y(e,n,c);s.close?.(),e.close?.();const f=x(i,n.width,n.height),l=x(a,n.width,n.height);return B(f,l)}catch{return null}}function C(t,o=.53){return t==null?null:t>=o}export{F as buildStructureSignature,C as isStructureConsistent,v as measureStructureSimilarity,L as scoreAgainstSignature};
@@ -0,0 +1 @@
1
+ import*as n from"three";const s=typeof navigator<"u"&&/iPhone|iPad|Android/i.test(navigator.userAgent||""),w=4,v=8,L=3;function d(e,a,t){const l=a/w,r=a/v,i=L;for(let o=0;o<v;o++){const p=o%2===1?l/2:0;for(let c=-1;c<=w;c++)t(e,c*l+p+i/2,o*r+i/2,l-i,r-i)}}function x(e=512){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d");t.fillStyle="#b8b0a4",t.fillRect(0,0,e,e),d(t,e,(r,i,o,p,c)=>{const f=Math.floor(Math.random()*5),g=Math.random()>.5,S=200+f+(g?2:0),M=200+f,b=200+f+(g?0:1);r.fillStyle=`rgb(${S},${M},${b})`,r.fillRect(i,o,p,c);const h=r.createLinearGradient(i,o,i,o+c);h.addColorStop(0,"rgba(255,255,255,0.12)"),h.addColorStop(.5,"rgba(255,255,255,0)"),h.addColorStop(1,"rgba(0,0,0,0.03)"),r.fillStyle=h,r.fillRect(i,o,p,c),r.fillStyle="rgba(255,255,255,0.5)",r.fillRect(i,o,p,1.5),r.fillRect(i,o,1.5,c),r.fillStyle="rgba(0,0,0,0.08)",r.fillRect(i,o+c-1.5,p,1.5),r.fillRect(i+p-1.5,o,1.5,c)});const l=new n.CanvasTexture(a);return l.wrapS=l.wrapT=n.RepeatWrapping,l.colorSpace=n.SRGBColorSpace,l.generateMipmaps=!s,l.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,l.magFilter=n.LinearFilter,l}function F(e=512){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d");t.fillStyle="rgb(128,128,255)",t.fillRect(0,0,e,e),d(t,e,(r,i,o,p,c)=>{r.fillStyle="rgb(128,128,255)",r.fillRect(i,o,p,c),r.fillStyle="rgb(128,100,255)",r.fillRect(i,o,p,3),r.fillStyle="rgb(128,156,255)",r.fillRect(i,o+c-3,p,3),r.fillStyle="rgb(100,128,255)",r.fillRect(i,o,3,c),r.fillStyle="rgb(156,128,255)",r.fillRect(i+p-3,o,3,c)});const l=new n.CanvasTexture(a);return l.wrapS=l.wrapT=n.RepeatWrapping,l.colorSpace=n.LinearSRGBColorSpace,l.generateMipmaps=!s,l.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,l}function y(e=512){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d");t.fillStyle="rgb(220,220,220)",t.fillRect(0,0,e,e),d(t,e,(r,i,o,p,c)=>{r.fillStyle="rgb(50,50,50)",r.fillRect(i,o,p,c)});const l=new n.CanvasTexture(a);return l.wrapS=l.wrapT=n.RepeatWrapping,l.generateMipmaps=!s,l.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,l}let m=null;const R={};let u=null;function A(){if(m)return m;const e=x(),a=F(),t=y(),l=[3,3];return e.repeat.set(...l),a.repeat.set(...l),t.repeat.set(...l),m=new n.MeshPhysicalMaterial({map:e,normalMap:a,normalScale:new n.Vector2(.8,.8),roughnessMap:t,roughness:.35,metalness:0,clearcoat:.6,clearcoatRoughness:.15,sheen:.1,sheenRoughness:.3,sheenColor:new n.Color("#f5f0ea"),reflectivity:.5,specularIntensity:.8,specularColor:new n.Color("#ffffff"),side:n.FrontSide}),m}function T(){return A()}function W(e=4){if(R[e])return R[e];const a=T();u||(u=new n.MeshBasicMaterial({visible:!1}));const t=[u,u,u,u,u,u];return t[e]=a,R[e]=t,t}function C(e){let a=e>>>0;return()=>{a|=0,a=a+1831565813|0;let t=Math.imul(a^a>>>15,1|a);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function B(e=1024){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d"),l=C(42);t.fillStyle="#C8C0B4",t.fillRect(0,0,e,e);const r=["#BDB5A8","#C9C1B5","#D4CCC0","#B5ADA0","#CAC2B6","#D8D0C4","#AFAA9E"];for(let p=0;p<260;p++){const c=l()*e,f=l()*e,g=(.08+l()*.28)*e,S=(.01+l()*.06)*e,M=(l()-.5)*.25,b=r[Math.floor(l()*r.length)];t.save(),t.translate(c,f),t.rotate(M),t.globalAlpha=.06+l()*.1,t.fillStyle=b,t.beginPath(),t.ellipse(0,0,g/2,S/2,0,0,Math.PI*2),t.fill(),t.restore()}for(let p=0;p<18e3;p++){const c=l()*e,f=l()*e,g=.5+l()*1.5,S=Math.floor(140+l()*40);t.globalAlpha=.04+l()*.08,t.fillStyle=`rgb(${S},${S-5},${S-10})`,t.beginPath(),t.arc(c,f,g,0,Math.PI*2),t.fill()}t.globalAlpha=1;const i=t.createRadialGradient(e/2,e/2,e*.25,e/2,e/2,e*.85);i.addColorStop(0,"rgba(0,0,0,0)"),i.addColorStop(1,"rgba(0,0,0,0.06)"),t.fillStyle=i,t.fillRect(0,0,e,e);const o=new n.CanvasTexture(a);return o.wrapS=o.wrapT=n.RepeatWrapping,o.colorSpace=n.SRGBColorSpace,o.generateMipmaps=!s,o.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,o.magFilter=n.LinearFilter,o}function P(e=512){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d"),l=C(99);t.fillStyle="rgb(128,128,255)",t.fillRect(0,0,e,e);for(let i=0;i<4e3;i++){const o=l()*e,p=l()*e,c=2+l()*8,f=Math.floor(128+(l()-.5)*14),g=Math.floor(128+(l()-.5)*14);t.globalAlpha=.12+l()*.15,t.fillStyle=`rgb(${f},${g},255)`,t.beginPath(),t.arc(o,p,c,0,Math.PI*2),t.fill()}t.globalAlpha=1;const r=new n.CanvasTexture(a);return r.wrapS=r.wrapT=n.RepeatWrapping,r.colorSpace=n.LinearSRGBColorSpace,r.generateMipmaps=!s,r.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,r}function $(e=512){const a=document.createElement("canvas");a.width=e,a.height=e;const t=a.getContext("2d"),l=C(7);t.fillStyle="rgb(165,165,165)",t.fillRect(0,0,e,e);for(let i=0;i<3e3;i++){const o=l()*e,p=l()*e,c=3+l()*12,f=Math.floor(140+l()*50);t.globalAlpha=.06+l()*.12,t.fillStyle=`rgb(${f},${f},${f})`,t.beginPath(),t.arc(o,p,c,0,Math.PI*2),t.fill()}t.globalAlpha=1;const r=new n.CanvasTexture(a);return r.wrapS=r.wrapT=n.RepeatWrapping,r.generateMipmaps=!s,r.minFilter=s?n.LinearFilter:n.LinearMipmapLinearFilter,r}export{B as createWallDiffuse,P as createWallNormalMap,$ as createWallRoughnessMap,T as getConcreteWallMaterial,W as getWallBoxMaterials,A as loadWallMaterial};