@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.
- package/LICENSE.md +294 -0
- package/README.md +103 -0
- package/dist/00a41227ff.js +1 -0
- package/dist/00ab3dcbb5.js +1 -0
- package/dist/01a664fa9f.css +51 -0
- package/dist/04746bff9a.js +1 -0
- package/dist/04931f795e.js +1 -0
- package/dist/05973a4da2.js +3 -0
- package/dist/061b81ad81.js +1 -0
- package/dist/066fc9aa40.js +1 -0
- package/dist/09c4973968.js +1 -0
- package/dist/0a35b2c5f4.js +1 -0
- package/dist/0af28430ab.js +1 -0
- package/dist/0e2dedae0d.js +1 -0
- package/dist/0f7c8345a8.js +1 -0
- package/dist/12b8165d6d.js +1 -0
- package/dist/1458417bdb.js +1 -0
- package/dist/14c83bc57a.js +1 -0
- package/dist/15d6bec3b5.css +150 -0
- package/dist/16a399703e.js +1 -0
- package/dist/17876f4322.css +114 -0
- package/dist/1870fc037b.js +1 -0
- package/dist/1a2629800a.css +196 -0
- package/dist/1e243363f6.js +1 -0
- package/dist/1fac915f8b.js +1 -0
- package/dist/1fff100656.js +1 -0
- package/dist/205827c5c8.js +1 -0
- package/dist/20b0104576.js +1 -0
- package/dist/2239b22616.js +1 -0
- package/dist/22bd38ddcf.js +1 -0
- package/dist/239b619005.css +1849 -0
- package/dist/23dc0ccf32.js +1 -0
- package/dist/26155bf68c.js +1 -0
- package/dist/2774152dd2.js +1 -0
- package/dist/27fee7007f.js +1 -0
- package/dist/281cf952fa.js +1 -0
- package/dist/28a9d58274.js +1 -0
- package/dist/28d887bf8a.js +1 -0
- package/dist/28df2aa12f.js +1 -0
- package/dist/297e653adf.js +1 -0
- package/dist/2990ba64d6.js +1 -0
- package/dist/2b6aa27f6d.js +1 -0
- package/dist/2c7c1bcef1.js +1 -0
- package/dist/2cab5c5c23.js +1 -0
- package/dist/2cafe3274b.js +1 -0
- package/dist/2e366d7386.js +1 -0
- package/dist/2f8cc8b292.js +1 -0
- package/dist/30be653f00.css +110 -0
- package/dist/31ea036f5c.js +1 -0
- package/dist/32861ea2b0.js +1 -0
- package/dist/33fa2c8ca2.js +1 -0
- package/dist/35d8449ed8.js +1 -0
- package/dist/3656ffa1b8.js +1 -0
- package/dist/367a479d3a.js +1 -0
- package/dist/371ed78aa2.js +1 -0
- package/dist/37596ace72.js +1 -0
- package/dist/37addc7fb3.js +1 -0
- package/dist/388cadacbd.js +1 -0
- package/dist/39a62ef7b8.js +1 -0
- package/dist/3bbcee0334.js +1 -0
- package/dist/3c916f744f.js +1 -0
- package/dist/3f37665dd1.js +1 -0
- package/dist/3fb3ab6757.js +1 -0
- package/dist/40d6aeb28c.js +1 -0
- package/dist/41ed5985ad.js +1 -0
- package/dist/431a2d8618.js +1 -0
- package/dist/44a229099f.js +1 -0
- package/dist/4741e5d07d.css +263 -0
- package/dist/4910c07ca8.css +411 -0
- package/dist/4a99ddb3fd.js +1 -0
- package/dist/4aa671f9f6.js +1 -0
- package/dist/4b8958aa4c.js +1 -0
- package/dist/4ba4f544b9.js +1 -0
- package/dist/4c24338793.js +1 -0
- package/dist/4d7a0d1897.js +1 -0
- package/dist/4e1db1e3b0.js +1 -0
- package/dist/4e7d0a0d4a.js +1 -0
- package/dist/51b23203e5.css +1447 -0
- package/dist/52436e0169.js +1 -0
- package/dist/54413c1eae.js +1 -0
- package/dist/54f0fcf38b.js +1 -0
- package/dist/55ab45ada4.css +370 -0
- package/dist/561dc3f1ab.js +1 -0
- package/dist/58e6419ba8.js +1 -0
- package/dist/5c9fd9201c.js +1 -0
- package/dist/5d05e8982e.js +1 -0
- package/dist/5d5e8a9c58.js +3 -0
- package/dist/5e4f2349ff.js +1 -0
- package/dist/609e5e5d28.js +1 -0
- package/dist/60d697292c.js +1 -0
- package/dist/61e0c0c9b5.js +1 -0
- package/dist/631a9f7fac.js +1 -0
- package/dist/64e9020b49.js +1 -0
- package/dist/66c461dc2c.js +1 -0
- package/dist/672404d987.js +1 -0
- package/dist/67f6338a4a.js +1 -0
- package/dist/6855e6a3b1.js +1 -0
- package/dist/6b0a81e4f8.js +1 -0
- package/dist/6ba86aa3b8.js +1 -0
- package/dist/6bff84d27e.js +1 -0
- package/dist/6c0a2572dd.js +1 -0
- package/dist/6d238282c1.js +1 -0
- package/dist/6e2595aa36.js +1 -0
- package/dist/6f9ae59d6c.js +1 -0
- package/dist/70dd811d74.js +1 -0
- package/dist/710c1ab641.js +1 -0
- package/dist/7206ce49c6.js +1 -0
- package/dist/7281d77ed9.js +1 -0
- package/dist/73f7d65985.js +1 -0
- package/dist/776277593f.js +1 -0
- package/dist/79a397bb92.js +1 -0
- package/dist/7a748aae59.js +1 -0
- package/dist/7bfb0ecfbb.css +572 -0
- package/dist/7bfcd0a517.js +1 -0
- package/dist/7d9ddaeb47.js +1 -0
- package/dist/7f833bc5af.js +1 -0
- package/dist/811b403d43.js +1 -0
- package/dist/817d930a49.js +1 -0
- package/dist/81802759ca.js +1 -0
- package/dist/81eb433604.js +1 -0
- package/dist/82a8a4bc35.js +1 -0
- package/dist/85af90fade.js +1 -0
- package/dist/872c4302e0.js +1 -0
- package/dist/87bb469216.js +1 -0
- package/dist/87dcc12b65.js +1 -0
- package/dist/87f511c4a8.js +1 -0
- package/dist/88251d6671.js +1 -0
- package/dist/882bc739c8.js +1 -0
- package/dist/89ab18ebc5.js +1 -0
- package/dist/8a22e8944f.css +563 -0
- package/dist/8a3a57c008.js +1 -0
- package/dist/8ade32d067.js +1 -0
- package/dist/8bf6d26ad6.css +233 -0
- package/dist/8c27edda0f.js +1 -0
- package/dist/8db8655f21.js +24 -0
- package/dist/8f60e5059a.js +1 -0
- package/dist/91707f5ca0.css +78 -0
- package/dist/921bf270dd.js +20 -0
- package/dist/9326c23506.js +1 -0
- package/dist/94a0a79c65.js +1 -0
- package/dist/9526094bb7.js +1 -0
- package/dist/9544661159.js +1 -0
- package/dist/95a44ebec2.js +1 -0
- package/dist/970313b92b.js +1 -0
- package/dist/9794652102.js +1 -0
- package/dist/983cbed22c.js +1 -0
- package/dist/9840b9ce12.js +1 -0
- package/dist/98f3644031.js +1 -0
- package/dist/992778075d.css +353 -0
- package/dist/9c6c598569.js +1 -0
- package/dist/9f474b5d1a.js +1 -0
- package/dist/a0f71d0bf5.js +1 -0
- package/dist/a3c983d431.js +1 -0
- package/dist/a3f18e76fe.js +1 -0
- package/dist/a493e9aa8f.js +1 -0
- package/dist/a77b15c0d6.js +1 -0
- package/dist/a811c90bd5.js +1 -0
- package/dist/a822c5e4f2.js +1 -0
- package/dist/aaa0e82d7f.css +69 -0
- package/dist/ab6c80484f.js +1 -0
- package/dist/ae96f219e3.js +1 -0
- package/dist/b11b38869d.css +427 -0
- package/dist/b1349d5a21.js +4 -0
- package/dist/b14379d31b.css +151 -0
- package/dist/b3efb26fd7.js +1 -0
- package/dist/b59b0dde17.js +1 -0
- package/dist/b5c372377f.js +1 -0
- package/dist/b976df09ec.js +1 -0
- package/dist/baeaed46c9.js +1 -0
- package/dist/bb719febc6.js +1 -0
- package/dist/bcd44b4040.js +1 -0
- package/dist/bdc4e4c5b9.css +209 -0
- package/dist/bdec200d00.js +1 -0
- package/dist/be0cfe2236.js +1 -0
- package/dist/be337ddda5.js +1 -0
- package/dist/c12c112c6f.js +1 -0
- package/dist/c2a14a77ae.js +1 -0
- package/dist/c3b8f1973b.js +1 -0
- package/dist/c44d37da7a.js +1 -0
- package/dist/c4790179f1.js +1 -0
- package/dist/c5e990946e.js +1 -0
- package/dist/c71892453b.js +1 -0
- package/dist/c9a1656c62.js +1 -0
- package/dist/ca497b066c.js +1 -0
- package/dist/cdb4a0f7b3.js +3 -0
- package/dist/ce663020e4.js +60 -0
- package/dist/cec035efb1.js +1 -0
- package/dist/d0f9681634.js +1 -0
- package/dist/d118c2e7ba.js +1 -0
- package/dist/d20718159b.js +3 -0
- package/dist/d30f1f506e.js +1 -0
- package/dist/d3cd7f1bc1.js +1 -0
- package/dist/d4378d9afa.js +1 -0
- package/dist/d464da28a5.js +1 -0
- package/dist/d566d3874b.js +1 -0
- package/dist/d617bbb9f5.js +26 -0
- package/dist/d65f32e004.js +1 -0
- package/dist/d6851ea979.js +1 -0
- package/dist/d7c9500ba9.js +1 -0
- package/dist/d803155241.js +1 -0
- package/dist/d903df4e0d.js +1 -0
- package/dist/d94df858ea.js +1 -0
- package/dist/da7b5f450d.js +1 -0
- package/dist/daa11edd01.js +1 -0
- package/dist/db4afd43c9.js +1 -0
- package/dist/dbd5ba1d07.js +1 -0
- package/dist/dc2a1a0e13.js +1 -0
- package/dist/dc812f3e14.js +1 -0
- package/dist/dcbf419090.css +122 -0
- package/dist/dcdba78ddf.js +1 -0
- package/dist/de408c4516.js +1 -0
- package/dist/e1cd279733.js +1 -0
- package/dist/e379e0039b.js +1 -0
- package/dist/e4fe0551fd.js +1 -0
- package/dist/e6eed481cc.css +28 -0
- package/dist/e75f1e5992.js +1 -0
- package/dist/ea8577d22b.js +1 -0
- package/dist/ec4a34fc80.css +313 -0
- package/dist/ed6a54cdf6.js +1 -0
- package/dist/ee242c0099.js +1 -0
- package/dist/ee9b9fd7d1.js +1 -0
- package/dist/f0c3d8a28a.js +1 -0
- package/dist/f11a45a150.js +1 -0
- package/dist/f1b3b2622a.js +1 -0
- package/dist/f7b4a178e3.js +1 -0
- package/dist/f89d7cd931.js +1 -0
- package/dist/f8cb80a93c.js +1 -0
- package/dist/f8fec86f10.js +1 -0
- package/dist/fbd844f2d1.js +1 -0
- package/dist/fe235d7160.js +1 -0
- package/dist/fe58a84b85.js +1 -0
- package/dist/fe68b361ba.js +1 -0
- package/dist/ff5b3d17e2.js +1 -0
- package/dist/styles/globals.css +442 -0
- package/dist/styles/themes.css +532 -0
- package/dist/styles/variables.css +299 -0
- package/package.json +68 -0
- package/static/assets/draco/README.md +32 -0
- package/static/assets/draco/draco_decoder.js +34 -0
- package/static/assets/draco/draco_decoder.wasm +0 -0
- package/static/assets/draco/draco_encoder.js +35 -0
- package/static/assets/draco/draco_encoder.wasm +0 -0
- package/static/assets/draco/draco_encoder_wrapper.js +98 -0
- package/static/assets/draco/draco_wasm_wrapper.js +117 -0
- package/static/favicon.svg +28 -0
- 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};
|