@virtualdisplay.io/client 4.0.0-alpha.20 → 4.0.0-alpha.22
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/CHANGELOG.md +18 -0
- package/dist/index.d.ts +135 -3
- package/dist/virtualdisplay.client.cjs.js +64 -17
- package/dist/virtualdisplay.client.es.js +2096 -1882
- package/dist/virtualdisplay.client.umd.js +95 -48
- package/package.json +1 -1
|
@@ -12,66 +12,72 @@ const c = {
|
|
|
12
12
|
CONFIG: "config",
|
|
13
13
|
ANNOTATION_TOGGLE: "annotation_toggle",
|
|
14
14
|
FOCUS: "focus",
|
|
15
|
-
PRICING: "pricing"
|
|
16
|
-
|
|
15
|
+
PRICING: "pricing",
|
|
16
|
+
QR_SHOWN: "qr_shown",
|
|
17
|
+
SYNC: "sync"
|
|
18
|
+
}, Q = {
|
|
17
19
|
FOCUS: "focus",
|
|
18
20
|
UNFOCUS: "unfocus"
|
|
19
21
|
}, kt = {
|
|
20
22
|
FOCUSED: "focused"
|
|
21
|
-
},
|
|
23
|
+
}, At = {
|
|
22
24
|
/** Behaves exactly like an unpriced combination: no price, no button. */
|
|
23
25
|
HIDDEN: "hidden"
|
|
24
26
|
}, Et = new Set(Object.values(c));
|
|
25
|
-
function
|
|
27
|
+
function xt(n) {
|
|
26
28
|
if (typeof n != "object" || n === null)
|
|
27
29
|
return !1;
|
|
28
30
|
const t = n;
|
|
29
31
|
return typeof t.target == "string" ? !1 : typeof t.type == "string" && Et.has(t.type);
|
|
30
32
|
}
|
|
31
|
-
function
|
|
32
|
-
const t =
|
|
33
|
+
function Tt(n) {
|
|
34
|
+
const t = C(n);
|
|
33
35
|
return t !== null && t.type === c.HANDSHAKE;
|
|
34
36
|
}
|
|
35
|
-
function
|
|
36
|
-
const t =
|
|
37
|
+
function Rt(n) {
|
|
38
|
+
const t = C(n);
|
|
37
39
|
return t !== null && t.type === c.SESSION && typeof t.sessionId == "string";
|
|
38
40
|
}
|
|
39
|
-
function
|
|
40
|
-
const t =
|
|
41
|
+
function It(n) {
|
|
42
|
+
const t = C(n);
|
|
41
43
|
return t !== null && t.type === c.MUTATION && Array.isArray(t.results);
|
|
42
44
|
}
|
|
43
|
-
function
|
|
44
|
-
const t =
|
|
45
|
+
function Ot(n) {
|
|
46
|
+
const t = C(n);
|
|
45
47
|
return t !== null && t.type === c.SNAPSHOT && ("data" in t || "error" in t);
|
|
46
48
|
}
|
|
47
|
-
function
|
|
48
|
-
const t =
|
|
49
|
+
function Nt(n) {
|
|
50
|
+
const t = C(n);
|
|
49
51
|
return t !== null && t.type === c.CAMERA && Array.isArray(t.transforms);
|
|
50
52
|
}
|
|
51
|
-
function
|
|
52
|
-
const t =
|
|
53
|
+
function Lt(n) {
|
|
54
|
+
const t = C(n);
|
|
53
55
|
return t !== null && t.type === c.MAPPING && Array.isArray(t.attributes);
|
|
54
56
|
}
|
|
55
|
-
function
|
|
56
|
-
const t =
|
|
57
|
+
function Mt(n) {
|
|
58
|
+
const t = C(n);
|
|
57
59
|
return t !== null && t.type === c.LOADING_INDICATOR && typeof t.progress == "number";
|
|
58
60
|
}
|
|
59
|
-
function
|
|
60
|
-
const t =
|
|
61
|
+
function zt(n) {
|
|
62
|
+
const t = C(n);
|
|
63
|
+
return t !== null && t.type === c.SYNC && typeof t.connected == "boolean";
|
|
64
|
+
}
|
|
65
|
+
function Pt(n) {
|
|
66
|
+
const t = C(n);
|
|
61
67
|
return t !== null && t.type === c.CONFIG && typeof t.viewerSettings == "object";
|
|
62
68
|
}
|
|
63
|
-
function
|
|
64
|
-
const t =
|
|
69
|
+
function Ft(n) {
|
|
70
|
+
const t = C(n);
|
|
65
71
|
return t !== null && t.type === c.FOCUS && typeof t.state == "string";
|
|
66
72
|
}
|
|
67
|
-
function
|
|
68
|
-
const t =
|
|
73
|
+
function $t(n) {
|
|
74
|
+
const t = C(n);
|
|
69
75
|
return t !== null && t.type === c.PRICING && typeof t.pricing == "object" && t.pricing !== null;
|
|
70
76
|
}
|
|
71
|
-
function
|
|
77
|
+
function C(n) {
|
|
72
78
|
return typeof n != "object" || n === null ? null : n;
|
|
73
79
|
}
|
|
74
|
-
class
|
|
80
|
+
class Y {
|
|
75
81
|
constructor(t) {
|
|
76
82
|
this.processor = t;
|
|
77
83
|
}
|
|
@@ -118,9 +124,9 @@ class X {
|
|
|
118
124
|
this.pending.length = 0;
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
|
-
class
|
|
127
|
+
class Dt {
|
|
122
128
|
constructor(t, e) {
|
|
123
|
-
this.getTarget = t, this.sourceId = `vd-${Math.random().toString(36).slice(2, 8)}`, this.targetOrigin = e?.targetOrigin ?? "*", this.isValid = e?.isValid ??
|
|
129
|
+
this.getTarget = t, this.sourceId = `vd-${Math.random().toString(36).slice(2, 8)}`, this.targetOrigin = e?.targetOrigin ?? "*", this.isValid = e?.isValid ?? xt, this.publisher = new Y((i) => this.post(i)), this.consumer = new Y((i) => this.routeToHandler(i)), this.shouldBuffer = e?.shouldBuffer ?? null, e?.bufferIncoming !== !0 && this.consumer.markReady();
|
|
124
130
|
}
|
|
125
131
|
getTarget;
|
|
126
132
|
handlers = /* @__PURE__ */ new Map();
|
|
@@ -157,6 +163,24 @@ class Pt {
|
|
|
157
163
|
send(t) {
|
|
158
164
|
this.publisher.enqueue(t);
|
|
159
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Feed a message through the same routing path as one that just arrived via
|
|
168
|
+
* postMessage, without an actual postMessage round-trip: still validated
|
|
169
|
+
* against `isValid`, and still respects the consumer queue's buffering and
|
|
170
|
+
* the `shouldBuffer` bypass. For a transport that delivers messages some
|
|
171
|
+
* other way than the iframe channel this messenger already listens on (the
|
|
172
|
+
* viewer engine's SSE-sourced live sync channel, ar-session-handoff) and
|
|
173
|
+
* needs them to land exactly where a postMessage would.
|
|
174
|
+
*/
|
|
175
|
+
receive(t) {
|
|
176
|
+
if (this.isValid(t)) {
|
|
177
|
+
if (this.shouldBuffer !== null && !this.shouldBuffer(t)) {
|
|
178
|
+
this.routeToHandler(t);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.consumer.enqueue(t);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
160
184
|
/**
|
|
161
185
|
* Enable sending and flush queued outgoing messages
|
|
162
186
|
*/
|
|
@@ -228,1467 +252,281 @@ class Pt {
|
|
|
228
252
|
});
|
|
229
253
|
}
|
|
230
254
|
}
|
|
231
|
-
class
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
this.element = document.createElement("button"), this.element.className = `ui-btn ui-btn--${t} ui-btn--size-${e}`, i !== void 0 && (this.element.setAttribute("aria-label", i), this.element.title = i), o !== void 0 ? this.element.appendChild(o) : i !== void 0 && (this.element.textContent = i), s && this.element.addEventListener("click", s), this.element.disabled = r;
|
|
235
|
-
}
|
|
236
|
-
setIcon(t) {
|
|
237
|
-
const e = this.element.querySelector("svg");
|
|
238
|
-
e !== null ? e.replaceWith(t) : this.element.appendChild(t);
|
|
255
|
+
class Bt {
|
|
256
|
+
constructor(t) {
|
|
257
|
+
this.send = t;
|
|
239
258
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
viewBox: "0 0 24 24",
|
|
246
|
-
fill: "none",
|
|
247
|
-
stroke: "currentColor",
|
|
248
|
-
"stroke-width": 2,
|
|
249
|
-
"stroke-linecap": "round",
|
|
250
|
-
"stroke-linejoin": "round"
|
|
251
|
-
};
|
|
252
|
-
const lt = ([n, t, e]) => {
|
|
253
|
-
const i = document.createElementNS("http://www.w3.org/2000/svg", n);
|
|
254
|
-
return Object.keys(t).forEach((o) => {
|
|
255
|
-
i.setAttribute(o, String(t[o]));
|
|
256
|
-
}), e?.length && e.forEach((o) => {
|
|
257
|
-
const s = lt(o);
|
|
258
|
-
i.appendChild(s);
|
|
259
|
-
}), i;
|
|
260
|
-
}, ct = (n, t = {}) => {
|
|
261
|
-
const i = {
|
|
262
|
-
...$t,
|
|
263
|
-
...t
|
|
264
|
-
};
|
|
265
|
-
return lt(["svg", i, n]);
|
|
266
|
-
};
|
|
267
|
-
const Dt = [
|
|
268
|
-
[
|
|
269
|
-
"path",
|
|
270
|
-
{
|
|
271
|
-
d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"
|
|
272
|
-
}
|
|
273
|
-
],
|
|
274
|
-
["path", { d: "m3.3 7 8.7 5 8.7-5" }],
|
|
275
|
-
["path", { d: "M12 22V12" }]
|
|
276
|
-
];
|
|
277
|
-
const Bt = [
|
|
278
|
-
[
|
|
279
|
-
"path",
|
|
280
|
-
{
|
|
281
|
-
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"
|
|
282
|
-
}
|
|
283
|
-
],
|
|
284
|
-
["circle", { cx: "12", cy: "13", r: "3" }]
|
|
285
|
-
];
|
|
286
|
-
const ut = [["path", { d: "m6 9 6 6 6-6" }]];
|
|
287
|
-
const Ut = [["path", { d: "m15 18-6-6 6-6" }]];
|
|
288
|
-
const Vt = [["path", { d: "m9 18 6-6-6-6" }]];
|
|
289
|
-
const jt = [["path", { d: "m18 15-6-6-6 6" }]];
|
|
290
|
-
const Ht = [
|
|
291
|
-
["path", { d: "M15 3h6v6" }],
|
|
292
|
-
["path", { d: "m21 3-7 7" }],
|
|
293
|
-
["path", { d: "m3 21 7-7" }],
|
|
294
|
-
["path", { d: "M9 21H3v-6" }]
|
|
295
|
-
];
|
|
296
|
-
const Gt = [
|
|
297
|
-
["path", { d: "m14 10 7-7" }],
|
|
298
|
-
["path", { d: "M20 10h-6V4" }],
|
|
299
|
-
["path", { d: "m3 21 7-7" }],
|
|
300
|
-
["path", { d: "M4 14h6v6" }]
|
|
301
|
-
];
|
|
302
|
-
const qt = [
|
|
303
|
-
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }],
|
|
304
|
-
["path", { d: "M3 3v5h5" }]
|
|
305
|
-
];
|
|
306
|
-
const Zt = [
|
|
307
|
-
["path", { d: "M10 5H3" }],
|
|
308
|
-
["path", { d: "M12 19H3" }],
|
|
309
|
-
["path", { d: "M14 3v4" }],
|
|
310
|
-
["path", { d: "M16 17v4" }],
|
|
311
|
-
["path", { d: "M21 12h-9" }],
|
|
312
|
-
["path", { d: "M21 19h-5" }],
|
|
313
|
-
["path", { d: "M21 5h-7" }],
|
|
314
|
-
["path", { d: "M8 10v4" }],
|
|
315
|
-
["path", { d: "M8 12H3" }]
|
|
316
|
-
];
|
|
317
|
-
const Wt = [
|
|
318
|
-
["path", { d: "M18 6 6 18" }],
|
|
319
|
-
["path", { d: "m6 6 12 12" }]
|
|
320
|
-
];
|
|
321
|
-
const Yt = [
|
|
322
|
-
["circle", { cx: "11", cy: "11", r: "8" }],
|
|
323
|
-
["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
|
|
324
|
-
["line", { x1: "11", x2: "11", y1: "8", y2: "14" }],
|
|
325
|
-
["line", { x1: "8", x2: "14", y1: "11", y2: "11" }]
|
|
326
|
-
];
|
|
327
|
-
const Xt = [
|
|
328
|
-
["circle", { cx: "11", cy: "11", r: "8" }],
|
|
329
|
-
["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
|
|
330
|
-
["line", { x1: "8", x2: "14", y1: "11", y2: "11" }]
|
|
331
|
-
], m = {
|
|
332
|
-
semantic: {
|
|
333
|
-
// eslint-disable-next-line vd-custom/enforce-error-codes -- This is a hex color, not an error code
|
|
334
|
-
error: "#dc2626"
|
|
335
|
-
},
|
|
336
|
-
neutral: {
|
|
337
|
-
500: "#737373",
|
|
338
|
-
600: "#525252",
|
|
339
|
-
900: "#171717"
|
|
340
|
-
},
|
|
341
|
-
white: "#ffffff",
|
|
342
|
-
black: "#000000"
|
|
343
|
-
}, a = {
|
|
344
|
-
0: "0",
|
|
345
|
-
0.5: "0.125rem",
|
|
346
|
-
// 2px
|
|
347
|
-
1: "0.25rem",
|
|
348
|
-
// 4px
|
|
349
|
-
1.5: "0.375rem",
|
|
350
|
-
// 6px
|
|
351
|
-
2: "0.5rem",
|
|
352
|
-
// 10px
|
|
353
|
-
3: "0.75rem",
|
|
354
|
-
// 14px
|
|
355
|
-
4: "1rem",
|
|
356
|
-
// 16px
|
|
357
|
-
5: "1.25rem",
|
|
358
|
-
// 20px
|
|
359
|
-
6: "1.5rem",
|
|
360
|
-
// 28px
|
|
361
|
-
8: "2rem",
|
|
362
|
-
// 32px
|
|
363
|
-
9: "2.25rem",
|
|
364
|
-
// 80px
|
|
365
|
-
24: "6rem"
|
|
366
|
-
// 96px
|
|
367
|
-
};
|
|
368
|
-
class Kt {
|
|
369
|
-
element;
|
|
370
|
-
constructor() {
|
|
371
|
-
this.element = document.createElement("div"), Object.assign(this.element.style, {
|
|
372
|
-
background: m.white,
|
|
373
|
-
borderRadius: a[3],
|
|
374
|
-
padding: a[6],
|
|
375
|
-
boxShadow: `0 ${a[2]} ${a[8]} oklch(0% 0 0 / 20%)`,
|
|
376
|
-
maxWidth: "20rem",
|
|
377
|
-
width: "100%"
|
|
259
|
+
send;
|
|
260
|
+
setEnabled(t) {
|
|
261
|
+
this.send({
|
|
262
|
+
type: c.ANNOTATION_TOGGLE,
|
|
263
|
+
enabled: t
|
|
378
264
|
});
|
|
379
265
|
}
|
|
380
266
|
}
|
|
381
|
-
class
|
|
382
|
-
constructor(t
|
|
383
|
-
this.
|
|
384
|
-
}
|
|
385
|
-
options;
|
|
386
|
-
card;
|
|
387
|
-
backdrop;
|
|
388
|
-
keyHandler = null;
|
|
389
|
-
open() {
|
|
390
|
-
document.body.appendChild(this.backdrop), this.keyHandler = (t) => {
|
|
391
|
-
t.key === "Escape" && this.close();
|
|
392
|
-
}, document.addEventListener("keydown", this.keyHandler);
|
|
267
|
+
class Ut {
|
|
268
|
+
constructor(t, e) {
|
|
269
|
+
this.value = t, this.attribute = e;
|
|
393
270
|
}
|
|
394
|
-
|
|
395
|
-
|
|
271
|
+
value;
|
|
272
|
+
attribute;
|
|
273
|
+
isSelectedValue = !1;
|
|
274
|
+
get isSelected() {
|
|
275
|
+
return this.isSelectedValue;
|
|
396
276
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
return Object.assign(t.style, {
|
|
400
|
-
position: "fixed",
|
|
401
|
-
inset: a[0],
|
|
402
|
-
background: "oklch(0% 0 0 / 50%)",
|
|
403
|
-
zIndex: "9999",
|
|
404
|
-
display: "flex",
|
|
405
|
-
alignItems: "center",
|
|
406
|
-
justifyContent: "center"
|
|
407
|
-
}), t.addEventListener("click", (e) => {
|
|
408
|
-
e.target === t && this.close();
|
|
409
|
-
}), t;
|
|
277
|
+
setSelected(t) {
|
|
278
|
+
this.isSelectedValue = t;
|
|
410
279
|
}
|
|
411
280
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
281
|
+
const A = {
|
|
282
|
+
NO_MAPPING: "NO_MAPPING",
|
|
283
|
+
ATTRIBUTE_NOT_FOUND: "ATTRIBUTE_NOT_FOUND",
|
|
284
|
+
VALUE_NOT_FOUND: "VALUE_NOT_FOUND",
|
|
285
|
+
PARENT_NOT_FOUND: "PARENT_NOT_FOUND",
|
|
286
|
+
INVALID_PARAMETER: "INVALID_PARAMETER",
|
|
287
|
+
SNAPSHOT_FAILED: "SNAPSHOT_FAILED"
|
|
288
|
+
};
|
|
289
|
+
class f extends Error {
|
|
290
|
+
code;
|
|
291
|
+
constructor(t, e) {
|
|
292
|
+
super(t), this.name = "VirtualdisplayError", this.code = e;
|
|
423
293
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
294
|
+
static valueNotFound(t, e) {
|
|
295
|
+
return new f(
|
|
296
|
+
`Value "${e}" not found for attribute "${t}"`,
|
|
297
|
+
A.VALUE_NOT_FOUND
|
|
298
|
+
);
|
|
429
299
|
}
|
|
430
|
-
|
|
431
|
-
|
|
300
|
+
static parentNotFound(t) {
|
|
301
|
+
return new f(
|
|
302
|
+
`Parent element not found: ${t}`,
|
|
303
|
+
A.PARENT_NOT_FOUND
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
static invalidParameter(t) {
|
|
307
|
+
return new f(t, A.INVALID_PARAMETER);
|
|
432
308
|
}
|
|
433
309
|
}
|
|
434
|
-
class
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
for (let u = 0; u < e.length; u++) {
|
|
443
|
-
const p = e[u], v = document.createElement("option");
|
|
444
|
-
v.value = p, v.textContent = s?.[u] ?? p, p === o && (v.selected = !0, l = !0), this.select.appendChild(v);
|
|
445
|
-
}
|
|
446
|
-
l || (r.selected = !0);
|
|
447
|
-
const d = ct(ut, { width: 16, height: 16, "stroke-width": 2 });
|
|
448
|
-
d.classList.add("ui-native-select-icon"), this.element = document.createElement("div"), this.element.className = "ui-native-select-wrap", this.element.appendChild(this.select), this.element.appendChild(d);
|
|
310
|
+
class Vt {
|
|
311
|
+
name;
|
|
312
|
+
defaultValue;
|
|
313
|
+
values;
|
|
314
|
+
onSelect;
|
|
315
|
+
onChangeCallback;
|
|
316
|
+
constructor(t) {
|
|
317
|
+
this.name = t.name, this.defaultValue = t.defaultValue, this.onSelect = t.onSelect, this.values = this.createValues(t.values);
|
|
449
318
|
}
|
|
450
|
-
|
|
451
|
-
|
|
319
|
+
/**
|
|
320
|
+
* Select a value for this attribute
|
|
321
|
+
* @throws {VirtualdisplayError} When value not found
|
|
322
|
+
*/
|
|
323
|
+
select(t) {
|
|
324
|
+
if (!this.values.has(t))
|
|
325
|
+
throw f.valueNotFound(this.name, t);
|
|
326
|
+
this.onSelect(this.name, t);
|
|
452
327
|
}
|
|
453
|
-
|
|
454
|
-
this.
|
|
455
|
-
t(this.select.value);
|
|
456
|
-
});
|
|
328
|
+
getValues() {
|
|
329
|
+
return Array.from(this.values.values());
|
|
457
330
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
)
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
331
|
+
getValue(t) {
|
|
332
|
+
return this.values.get(t);
|
|
333
|
+
}
|
|
334
|
+
/** The currently selected value, or undefined before any selection lands. */
|
|
335
|
+
get selected() {
|
|
336
|
+
for (const t of this.values.values())
|
|
337
|
+
if (t.isSelected)
|
|
338
|
+
return t.value;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Register callback that fires when selection changes
|
|
342
|
+
* Receives the newly selected AttributeValue
|
|
343
|
+
*/
|
|
344
|
+
onChange(t) {
|
|
345
|
+
this.onChangeCallback = t;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Update selection state from server mutation result
|
|
349
|
+
* Direct value comparison - no source/target translation
|
|
350
|
+
*/
|
|
351
|
+
handleResult(t) {
|
|
352
|
+
let e;
|
|
353
|
+
for (const i of this.values.values()) {
|
|
354
|
+
const o = i.value === t;
|
|
355
|
+
i.setSelected(o), o && (e = i);
|
|
478
356
|
}
|
|
479
|
-
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
357
|
+
e !== void 0 && this.onChangeCallback !== void 0 && this.onChangeCallback(e);
|
|
358
|
+
}
|
|
359
|
+
createValues(t) {
|
|
360
|
+
const e = /* @__PURE__ */ new Map();
|
|
361
|
+
for (const i of t) {
|
|
362
|
+
const o = new Ut(i, this.name);
|
|
363
|
+
i === this.defaultValue && o.setSelected(!0), e.set(i, o);
|
|
364
|
+
}
|
|
365
|
+
return e;
|
|
366
|
+
}
|
|
484
367
|
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
368
|
+
class jt {
|
|
369
|
+
attributes = /* @__PURE__ */ new Map();
|
|
370
|
+
constructor(t, e, i) {
|
|
371
|
+
for (const o of t) {
|
|
372
|
+
const s = this.buildOptions(o, e);
|
|
373
|
+
this.attributes.set(o.name, new Vt(s));
|
|
374
|
+
}
|
|
375
|
+
this.onMutationFailed = i;
|
|
376
|
+
}
|
|
377
|
+
onMutationFailed;
|
|
378
|
+
get(t) {
|
|
379
|
+
return this.attributes.get(t);
|
|
380
|
+
}
|
|
381
|
+
/** The current selection as attribute name→value pairs, skipping unset attributes. */
|
|
382
|
+
getSelection() {
|
|
383
|
+
const t = {};
|
|
384
|
+
for (const [e, i] of this.attributes) {
|
|
385
|
+
const o = i.selected;
|
|
386
|
+
o !== void 0 && (t[e] = o);
|
|
387
|
+
}
|
|
388
|
+
return t;
|
|
389
|
+
}
|
|
390
|
+
handleResults(t) {
|
|
391
|
+
for (const e of t) {
|
|
392
|
+
if (!e.success) {
|
|
393
|
+
this.onMutationFailed?.(e.name, e.value);
|
|
394
|
+
continue;
|
|
511
395
|
}
|
|
396
|
+
this.get(e.name)?.handleResult(e.value);
|
|
512
397
|
}
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
398
|
+
}
|
|
399
|
+
buildOptions(t, e) {
|
|
400
|
+
const i = {
|
|
401
|
+
name: t.name,
|
|
402
|
+
values: t.values,
|
|
403
|
+
onSelect: (o, s) => {
|
|
404
|
+
e([{ name: o, value: s }], !1);
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
return t.defaultValue !== void 0 ? { ...i, defaultValue: t.defaultValue } : i;
|
|
516
408
|
}
|
|
517
409
|
}
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
}
|
|
521
|
-
|
|
410
|
+
function Ht(n) {
|
|
411
|
+
const t = new Date(n.timestamp).toLocaleTimeString("en-GB", { hour12: !1 }), e = n.level.toUpperCase().padEnd(5), i = n.trace_id?.slice(0, 8) ?? "--------", o = n.msg, s = ["timestamp", "level", "msg", "service", "trace_id", "span_id"], r = Object.entries(n).filter(([l]) => !s.includes(l)).map(([l, u]) => `${l}=${JSON.stringify(u)}`).join(" ");
|
|
412
|
+
return `${t} ${e} [${i}] ${o}${r ? " " + r : ""}`;
|
|
413
|
+
}
|
|
414
|
+
function qt(n) {
|
|
415
|
+
return JSON.stringify(n);
|
|
416
|
+
}
|
|
417
|
+
function Gt(n, t) {
|
|
418
|
+
const e = t ? Ht(n) : qt(n);
|
|
419
|
+
n.level === "error" ? console.error(e) : n.level === "warn" ? console.warn(e) : console.log(e);
|
|
420
|
+
}
|
|
421
|
+
function lt(n, t = 0) {
|
|
522
422
|
const e = {
|
|
523
|
-
|
|
524
|
-
|
|
423
|
+
name: n.name,
|
|
424
|
+
message: n.message
|
|
525
425
|
};
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
i
|
|
529
|
-
|
|
426
|
+
n.stack !== void 0 && (e.stack = n.stack);
|
|
427
|
+
for (const i of Object.getOwnPropertyNames(n)) {
|
|
428
|
+
if (i === "name" || i === "message" || i === "stack" || i === "cause")
|
|
429
|
+
continue;
|
|
430
|
+
const o = n[i];
|
|
431
|
+
o !== void 0 && (e[i] = o);
|
|
530
432
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
433
|
+
return n.cause !== void 0 && n.cause !== null && (e.cause = n.cause instanceof Error && t < 5 ? lt(n.cause, t + 1) : String(n.cause)), e;
|
|
434
|
+
}
|
|
435
|
+
function Zt(n) {
|
|
436
|
+
const t = {};
|
|
437
|
+
for (const [e, i] of Object.entries(n))
|
|
438
|
+
t[e] = i instanceof Error ? lt(i) : i;
|
|
439
|
+
return t;
|
|
440
|
+
}
|
|
441
|
+
function Wt() {
|
|
442
|
+
return /* @__PURE__ */ new Date();
|
|
443
|
+
}
|
|
444
|
+
function Qt(n) {
|
|
445
|
+
return n.toISOString();
|
|
446
|
+
}
|
|
447
|
+
function ct() {
|
|
448
|
+
return typeof navigator > "u" ? "" : navigator.userAgent;
|
|
449
|
+
}
|
|
450
|
+
function Yt() {
|
|
451
|
+
return typeof navigator > "u" ? !1 : navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
|
|
452
|
+
}
|
|
453
|
+
function Kt() {
|
|
454
|
+
return /iPhone|iPad|iPod/i.test(ct()) || Yt();
|
|
455
|
+
}
|
|
456
|
+
function Xt() {
|
|
457
|
+
return /Android/i.test(ct());
|
|
458
|
+
}
|
|
459
|
+
function Jt() {
|
|
460
|
+
return Kt() || Xt();
|
|
461
|
+
}
|
|
462
|
+
class te {
|
|
463
|
+
constructor(t) {
|
|
464
|
+
this.config = t;
|
|
465
|
+
}
|
|
466
|
+
config;
|
|
467
|
+
/**
|
|
468
|
+
* Log at specified level with optional attributes.
|
|
469
|
+
*/
|
|
470
|
+
log(t, e, i = {}) {
|
|
471
|
+
const o = this.config.traceProvider?.() ?? {}, s = {
|
|
472
|
+
timestamp: Qt(Wt()),
|
|
473
|
+
level: t,
|
|
474
|
+
msg: e,
|
|
475
|
+
service: this.config.service,
|
|
476
|
+
...o,
|
|
477
|
+
...Zt(i)
|
|
478
|
+
};
|
|
479
|
+
Gt(s, this.config.isDev);
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Log at DEBUG level (development only).
|
|
483
|
+
*/
|
|
484
|
+
debug(t, e) {
|
|
485
|
+
this.config.isDev && this.log("debug", t, e);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Log at INFO level.
|
|
489
|
+
*/
|
|
490
|
+
info(t, e) {
|
|
491
|
+
this.log("info", t, e);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Log at WARN level.
|
|
495
|
+
*/
|
|
496
|
+
warn(t, e) {
|
|
497
|
+
this.log("warn", t, e);
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Log at ERROR level.
|
|
501
|
+
*/
|
|
502
|
+
error(t, e) {
|
|
503
|
+
this.log("error", t, e);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function dt(n, t) {
|
|
507
|
+
const e = t?.isDev !== void 0 ? t.isDev : typeof process < "u" ? process.env.NODE_ENV !== "production" : !0;
|
|
508
|
+
return new te({ service: n, isDev: e, traceProvider: t?.traceProvider });
|
|
509
|
+
}
|
|
510
|
+
function O(n) {
|
|
511
|
+
if (n !== void 0)
|
|
512
|
+
return typeof n == "object" && n !== null && !Array.isArray(n) && !(n instanceof Error) ? n : n instanceof Error ? { error: n.message } : { value: n };
|
|
513
|
+
}
|
|
514
|
+
function ut(n) {
|
|
515
|
+
return {
|
|
516
|
+
debug: (t, e) => n.debug(t, O(e)),
|
|
517
|
+
info: (t, e) => n.info(t, O(e)),
|
|
518
|
+
warn: (t, e) => n.warn(t, O(e)),
|
|
519
|
+
error: (t, e) => n.error(t, O(e))
|
|
548
520
|
};
|
|
549
|
-
if (o.length)
|
|
550
|
-
return Promise.all(o).then(() => {
|
|
551
|
-
r();
|
|
552
|
-
});
|
|
553
|
-
r();
|
|
554
|
-
};
|
|
555
|
-
function pt(n) {
|
|
556
|
-
if (typeof n != "string")
|
|
557
|
-
return;
|
|
558
|
-
const t = n.toLowerCase();
|
|
559
|
-
for (const e of dt)
|
|
560
|
-
if (e.toLowerCase() === t)
|
|
561
|
-
return e;
|
|
562
521
|
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
return t;
|
|
567
|
-
throw new Error(`Invalid locale: ${n}. Expected one of: ${dt.join(", ")}`);
|
|
522
|
+
let ht = !1, _ = ut(dt("client", { isDev: !1 }));
|
|
523
|
+
function ee() {
|
|
524
|
+
ht = !0, _ = ut(dt("client", { isDev: !0 }));
|
|
568
525
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
return typeof n == "string" && /^custom-[A-Za-z0-9_-]+$/.test(n);
|
|
526
|
+
function Ki() {
|
|
527
|
+
return ht;
|
|
572
528
|
}
|
|
573
|
-
|
|
574
|
-
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
575
|
-
() => (
|
|
576
|
-
/** @type {LocalizedString} */
|
|
577
|
-
"Activate AR"
|
|
578
|
-
)
|
|
579
|
-
), le = (
|
|
580
|
-
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
581
|
-
() => (
|
|
582
|
-
/** @type {LocalizedString} */
|
|
583
|
-
"AR activeren"
|
|
584
|
-
)
|
|
585
|
-
), ce = (
|
|
586
|
-
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
587
|
-
() => (
|
|
588
|
-
/** @type {LocalizedString} */
|
|
589
|
-
"AR aktivieren"
|
|
590
|
-
)
|
|
591
|
-
), ue = (
|
|
592
|
-
/** @type {((inputs?: Controls_Ar_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Ar_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
593
|
-
((n = {}, t = {}) => {
|
|
594
|
-
const e = t.locale ?? h();
|
|
595
|
-
return e === "en" ? ae() : e === "nl" ? le() : ce();
|
|
596
|
-
})
|
|
597
|
-
), de = (
|
|
598
|
-
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
599
|
-
() => (
|
|
600
|
-
/** @type {LocalizedString} */
|
|
601
|
-
"Scan to view in AR"
|
|
602
|
-
)
|
|
603
|
-
), he = (
|
|
604
|
-
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
605
|
-
() => (
|
|
606
|
-
/** @type {LocalizedString} */
|
|
607
|
-
"Scan om in AR te bekijken"
|
|
608
|
-
)
|
|
609
|
-
), me = (
|
|
610
|
-
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
611
|
-
() => (
|
|
612
|
-
/** @type {LocalizedString} */
|
|
613
|
-
"Scannen für AR-Ansicht"
|
|
614
|
-
)
|
|
615
|
-
), pe = (
|
|
616
|
-
/** @type {((inputs?: Controls_Qr_Modaltitle1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaltitle1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
617
|
-
((n = {}, t = {}) => {
|
|
618
|
-
const e = t.locale ?? h();
|
|
619
|
-
return e === "en" ? de() : e === "nl" ? he() : me();
|
|
620
|
-
})
|
|
621
|
-
), fe = (
|
|
622
|
-
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
623
|
-
() => (
|
|
624
|
-
/** @type {LocalizedString} */
|
|
625
|
-
"Use your smartphone camera to scan this QR code"
|
|
626
|
-
)
|
|
627
|
-
), ge = (
|
|
628
|
-
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
629
|
-
() => (
|
|
630
|
-
/** @type {LocalizedString} */
|
|
631
|
-
"Gebruik de camera van je smartphone om deze QR-code te scannen"
|
|
632
|
-
)
|
|
633
|
-
), be = (
|
|
634
|
-
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
635
|
-
() => (
|
|
636
|
-
/** @type {LocalizedString} */
|
|
637
|
-
"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen"
|
|
638
|
-
)
|
|
639
|
-
), ve = (
|
|
640
|
-
/** @type {((inputs?: Controls_Qr_Modaldescription1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaldescription1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
641
|
-
((n = {}, t = {}) => {
|
|
642
|
-
const e = t.locale ?? h();
|
|
643
|
-
return e === "en" ? fe() : e === "nl" ? ge() : be();
|
|
644
|
-
})
|
|
645
|
-
), ye = (
|
|
646
|
-
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
647
|
-
() => (
|
|
648
|
-
/** @type {LocalizedString} */
|
|
649
|
-
"Your phone will open the 3D model in AR mode."
|
|
650
|
-
)
|
|
651
|
-
), _e = (
|
|
652
|
-
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
653
|
-
() => (
|
|
654
|
-
/** @type {LocalizedString} */
|
|
655
|
-
"Je telefoon opent het 3D-model in AR-modus."
|
|
656
|
-
)
|
|
657
|
-
), we = (
|
|
658
|
-
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
659
|
-
() => (
|
|
660
|
-
/** @type {LocalizedString} */
|
|
661
|
-
"Dein Telefon öffnet das 3D-Modell im AR-Modus."
|
|
662
|
-
)
|
|
663
|
-
), Ce = (
|
|
664
|
-
/** @type {((inputs?: Controls_Qr_Modalinstructions1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modalinstructions1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
665
|
-
((n = {}, t = {}) => {
|
|
666
|
-
const e = t.locale ?? h();
|
|
667
|
-
return e === "en" ? ye() : e === "nl" ? _e() : we();
|
|
668
|
-
})
|
|
669
|
-
), ke = (
|
|
670
|
-
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
671
|
-
() => (
|
|
672
|
-
/** @type {LocalizedString} */
|
|
673
|
-
"Close"
|
|
674
|
-
)
|
|
675
|
-
), Se = (
|
|
676
|
-
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
677
|
-
() => (
|
|
678
|
-
/** @type {LocalizedString} */
|
|
679
|
-
"Sluiten"
|
|
680
|
-
)
|
|
681
|
-
), Ee = (
|
|
682
|
-
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
683
|
-
() => (
|
|
684
|
-
/** @type {LocalizedString} */
|
|
685
|
-
"Schließen"
|
|
686
|
-
)
|
|
687
|
-
), Ae = (
|
|
688
|
-
/** @type {((inputs?: Controls_Qr_Closebutton1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Closebutton1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
689
|
-
((n = {}, t = {}) => {
|
|
690
|
-
const e = t.locale ?? h();
|
|
691
|
-
return e === "en" ? ke() : e === "nl" ? Se() : Ee();
|
|
692
|
-
})
|
|
693
|
-
), xe = (
|
|
694
|
-
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
695
|
-
() => (
|
|
696
|
-
/** @type {LocalizedString} */
|
|
697
|
-
"Fullscreen"
|
|
698
|
-
)
|
|
699
|
-
), Te = (
|
|
700
|
-
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
701
|
-
() => (
|
|
702
|
-
/** @type {LocalizedString} */
|
|
703
|
-
"Volledig scherm"
|
|
704
|
-
)
|
|
705
|
-
), Re = (
|
|
706
|
-
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
707
|
-
() => (
|
|
708
|
-
/** @type {LocalizedString} */
|
|
709
|
-
"Vollbild"
|
|
710
|
-
)
|
|
711
|
-
), Ie = (
|
|
712
|
-
/** @type {((inputs?: Controls_Fullscreen_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Fullscreen_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
713
|
-
((n = {}, t = {}) => {
|
|
714
|
-
const e = t.locale ?? h();
|
|
715
|
-
return e === "en" ? xe() : e === "nl" ? Te() : Re();
|
|
716
|
-
})
|
|
717
|
-
), Oe = (
|
|
718
|
-
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
719
|
-
() => (
|
|
720
|
-
/** @type {LocalizedString} */
|
|
721
|
-
"Downloading"
|
|
722
|
-
)
|
|
723
|
-
), Ne = (
|
|
724
|
-
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
725
|
-
() => (
|
|
726
|
-
/** @type {LocalizedString} */
|
|
727
|
-
"Downloaden"
|
|
728
|
-
)
|
|
729
|
-
), Le = (
|
|
730
|
-
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
731
|
-
() => (
|
|
732
|
-
/** @type {LocalizedString} */
|
|
733
|
-
"Herunterladen"
|
|
734
|
-
)
|
|
735
|
-
), gt = (
|
|
736
|
-
/** @type {((inputs?: Loading_Downloadingshort1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_Downloadingshort1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
737
|
-
((n = {}, t = {}) => {
|
|
738
|
-
const e = t.locale ?? h();
|
|
739
|
-
return e === "en" ? Oe() : e === "nl" ? Ne() : Le();
|
|
740
|
-
})
|
|
741
|
-
), Me = (
|
|
742
|
-
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
743
|
-
() => (
|
|
744
|
-
/** @type {LocalizedString} */
|
|
745
|
-
"Rendering"
|
|
746
|
-
)
|
|
747
|
-
), ze = (
|
|
748
|
-
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
749
|
-
() => (
|
|
750
|
-
/** @type {LocalizedString} */
|
|
751
|
-
"Renderen"
|
|
752
|
-
)
|
|
753
|
-
), Fe = (
|
|
754
|
-
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
755
|
-
() => (
|
|
756
|
-
/** @type {LocalizedString} */
|
|
757
|
-
"Rendern"
|
|
758
|
-
)
|
|
759
|
-
), Pe = (
|
|
760
|
-
/** @type {((inputs?: Loading_RenderingInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_RenderingInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
761
|
-
((n = {}, t = {}) => {
|
|
762
|
-
const e = t.locale ?? h();
|
|
763
|
-
return e === "en" ? Me() : e === "nl" ? ze() : Fe();
|
|
764
|
-
})
|
|
765
|
-
), $e = (
|
|
766
|
-
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
767
|
-
() => (
|
|
768
|
-
/** @type {LocalizedString} */
|
|
769
|
-
"Screenshot"
|
|
770
|
-
)
|
|
771
|
-
), De = (
|
|
772
|
-
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
773
|
-
() => (
|
|
774
|
-
/** @type {LocalizedString} */
|
|
775
|
-
"Screenshot"
|
|
776
|
-
)
|
|
777
|
-
), Be = (
|
|
778
|
-
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
779
|
-
() => (
|
|
780
|
-
/** @type {LocalizedString} */
|
|
781
|
-
"Screenshot"
|
|
782
|
-
)
|
|
783
|
-
), Ue = (
|
|
784
|
-
/** @type {((inputs?: Controls_Screenshot_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Screenshot_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
785
|
-
((n = {}, t = {}) => {
|
|
786
|
-
const e = t.locale ?? h();
|
|
787
|
-
return e === "en" ? $e() : e === "nl" ? De() : Be();
|
|
788
|
-
})
|
|
789
|
-
), Ve = (
|
|
790
|
-
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
791
|
-
() => (
|
|
792
|
-
/** @type {LocalizedString} */
|
|
793
|
-
"Configure"
|
|
794
|
-
)
|
|
795
|
-
), je = (
|
|
796
|
-
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
797
|
-
() => (
|
|
798
|
-
/** @type {LocalizedString} */
|
|
799
|
-
"Configureren"
|
|
800
|
-
)
|
|
801
|
-
), He = (
|
|
802
|
-
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
803
|
-
() => (
|
|
804
|
-
/** @type {LocalizedString} */
|
|
805
|
-
"Konfigurieren"
|
|
806
|
-
)
|
|
807
|
-
), Ge = (
|
|
808
|
-
/** @type {((inputs?: Controls_Configurator_OpenInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_OpenInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
809
|
-
((n = {}, t = {}) => {
|
|
810
|
-
const e = t.locale ?? h();
|
|
811
|
-
return e === "en" ? Ve() : e === "nl" ? je() : He();
|
|
812
|
-
})
|
|
813
|
-
), qe = (
|
|
814
|
-
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
815
|
-
() => (
|
|
816
|
-
/** @type {LocalizedString} */
|
|
817
|
-
"Close"
|
|
818
|
-
)
|
|
819
|
-
), Ze = (
|
|
820
|
-
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
821
|
-
() => (
|
|
822
|
-
/** @type {LocalizedString} */
|
|
823
|
-
"Sluiten"
|
|
824
|
-
)
|
|
825
|
-
), We = (
|
|
826
|
-
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
827
|
-
() => (
|
|
828
|
-
/** @type {LocalizedString} */
|
|
829
|
-
"Schließen"
|
|
830
|
-
)
|
|
831
|
-
), Ye = (
|
|
832
|
-
/** @type {((inputs?: Controls_Configurator_CloseInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_CloseInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
833
|
-
((n = {}, t = {}) => {
|
|
834
|
-
const e = t.locale ?? h();
|
|
835
|
-
return e === "en" ? qe() : e === "nl" ? Ze() : We();
|
|
836
|
-
})
|
|
837
|
-
), Xe = (
|
|
838
|
-
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
839
|
-
() => (
|
|
840
|
-
/** @type {LocalizedString} */
|
|
841
|
-
"Reset camera"
|
|
842
|
-
)
|
|
843
|
-
), Ke = (
|
|
844
|
-
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
845
|
-
() => (
|
|
846
|
-
/** @type {LocalizedString} */
|
|
847
|
-
"Camera resetten"
|
|
848
|
-
)
|
|
849
|
-
), Qe = (
|
|
850
|
-
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
851
|
-
() => (
|
|
852
|
-
/** @type {LocalizedString} */
|
|
853
|
-
"Kamera zurücksetzen"
|
|
854
|
-
)
|
|
855
|
-
), Je = (
|
|
856
|
-
/** @type {((inputs?: Controls_Camera_ResetInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_ResetInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
857
|
-
((n = {}, t = {}) => {
|
|
858
|
-
const e = t.locale ?? h();
|
|
859
|
-
return e === "en" ? Xe() : e === "nl" ? Ke() : Qe();
|
|
860
|
-
})
|
|
861
|
-
), tn = (
|
|
862
|
-
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
863
|
-
() => (
|
|
864
|
-
/** @type {LocalizedString} */
|
|
865
|
-
"Zoom in"
|
|
866
|
-
)
|
|
867
|
-
), en = (
|
|
868
|
-
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
869
|
-
() => (
|
|
870
|
-
/** @type {LocalizedString} */
|
|
871
|
-
"Inzoomen"
|
|
872
|
-
)
|
|
873
|
-
), nn = (
|
|
874
|
-
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
875
|
-
() => (
|
|
876
|
-
/** @type {LocalizedString} */
|
|
877
|
-
"Hineinzoomen"
|
|
878
|
-
)
|
|
879
|
-
), on = (
|
|
880
|
-
/** @type {((inputs?: Controls_Camera_Zoomin1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomin1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
881
|
-
((n = {}, t = {}) => {
|
|
882
|
-
const e = t.locale ?? h();
|
|
883
|
-
return e === "en" ? tn() : e === "nl" ? en() : nn();
|
|
884
|
-
})
|
|
885
|
-
), sn = (
|
|
886
|
-
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
887
|
-
() => (
|
|
888
|
-
/** @type {LocalizedString} */
|
|
889
|
-
"Zoom out"
|
|
890
|
-
)
|
|
891
|
-
), rn = (
|
|
892
|
-
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
893
|
-
() => (
|
|
894
|
-
/** @type {LocalizedString} */
|
|
895
|
-
"Uitzoomen"
|
|
896
|
-
)
|
|
897
|
-
), an = (
|
|
898
|
-
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
899
|
-
() => (
|
|
900
|
-
/** @type {LocalizedString} */
|
|
901
|
-
"Herauszoomen"
|
|
902
|
-
)
|
|
903
|
-
), ln = (
|
|
904
|
-
/** @type {((inputs?: Controls_Camera_Zoomout1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomout1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
905
|
-
((n = {}, t = {}) => {
|
|
906
|
-
const e = t.locale ?? h();
|
|
907
|
-
return e === "en" ? sn() : e === "nl" ? rn() : an();
|
|
908
|
-
})
|
|
909
|
-
), cn = (
|
|
910
|
-
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
911
|
-
() => (
|
|
912
|
-
/** @type {LocalizedString} */
|
|
913
|
-
"Rotate left"
|
|
914
|
-
)
|
|
915
|
-
), un = (
|
|
916
|
-
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
917
|
-
() => (
|
|
918
|
-
/** @type {LocalizedString} */
|
|
919
|
-
"Naar links draaien"
|
|
920
|
-
)
|
|
921
|
-
), dn = (
|
|
922
|
-
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
923
|
-
() => (
|
|
924
|
-
/** @type {LocalizedString} */
|
|
925
|
-
"Nach links drehen"
|
|
926
|
-
)
|
|
927
|
-
), hn = (
|
|
928
|
-
/** @type {((inputs?: Controls_Camera_Rotateleft1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateleft1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
929
|
-
((n = {}, t = {}) => {
|
|
930
|
-
const e = t.locale ?? h();
|
|
931
|
-
return e === "en" ? cn() : e === "nl" ? un() : dn();
|
|
932
|
-
})
|
|
933
|
-
), mn = (
|
|
934
|
-
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
935
|
-
() => (
|
|
936
|
-
/** @type {LocalizedString} */
|
|
937
|
-
"Rotate right"
|
|
938
|
-
)
|
|
939
|
-
), pn = (
|
|
940
|
-
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
941
|
-
() => (
|
|
942
|
-
/** @type {LocalizedString} */
|
|
943
|
-
"Naar rechts draaien"
|
|
944
|
-
)
|
|
945
|
-
), fn = (
|
|
946
|
-
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
947
|
-
() => (
|
|
948
|
-
/** @type {LocalizedString} */
|
|
949
|
-
"Nach rechts drehen"
|
|
950
|
-
)
|
|
951
|
-
), gn = (
|
|
952
|
-
/** @type {((inputs?: Controls_Camera_Rotateright1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateright1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
953
|
-
((n = {}, t = {}) => {
|
|
954
|
-
const e = t.locale ?? h();
|
|
955
|
-
return e === "en" ? mn() : e === "nl" ? pn() : fn();
|
|
956
|
-
})
|
|
957
|
-
), bn = (
|
|
958
|
-
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
959
|
-
() => (
|
|
960
|
-
/** @type {LocalizedString} */
|
|
961
|
-
"Tilt up"
|
|
962
|
-
)
|
|
963
|
-
), vn = (
|
|
964
|
-
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
965
|
-
() => (
|
|
966
|
-
/** @type {LocalizedString} */
|
|
967
|
-
"Omhoog kantelen"
|
|
968
|
-
)
|
|
969
|
-
), yn = (
|
|
970
|
-
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
971
|
-
() => (
|
|
972
|
-
/** @type {LocalizedString} */
|
|
973
|
-
"Nach oben kippen"
|
|
974
|
-
)
|
|
975
|
-
), _n = (
|
|
976
|
-
/** @type {((inputs?: Controls_Camera_Tiltup1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltup1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
977
|
-
((n = {}, t = {}) => {
|
|
978
|
-
const e = t.locale ?? h();
|
|
979
|
-
return e === "en" ? bn() : e === "nl" ? vn() : yn();
|
|
980
|
-
})
|
|
981
|
-
), wn = (
|
|
982
|
-
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
983
|
-
() => (
|
|
984
|
-
/** @type {LocalizedString} */
|
|
985
|
-
"Tilt down"
|
|
986
|
-
)
|
|
987
|
-
), Cn = (
|
|
988
|
-
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
989
|
-
() => (
|
|
990
|
-
/** @type {LocalizedString} */
|
|
991
|
-
"Omlaag kantelen"
|
|
992
|
-
)
|
|
993
|
-
), kn = (
|
|
994
|
-
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
995
|
-
() => (
|
|
996
|
-
/** @type {LocalizedString} */
|
|
997
|
-
"Nach unten kippen"
|
|
998
|
-
)
|
|
999
|
-
), Sn = (
|
|
1000
|
-
/** @type {((inputs?: Controls_Camera_Tiltdown1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltdown1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1001
|
-
((n = {}, t = {}) => {
|
|
1002
|
-
const e = t.locale ?? h();
|
|
1003
|
-
return e === "en" ? wn() : e === "nl" ? Cn() : kn();
|
|
1004
|
-
})
|
|
1005
|
-
), En = (
|
|
1006
|
-
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1007
|
-
() => (
|
|
1008
|
-
/** @type {LocalizedString} */
|
|
1009
|
-
"Working…"
|
|
1010
|
-
)
|
|
1011
|
-
), An = (
|
|
1012
|
-
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1013
|
-
() => (
|
|
1014
|
-
/** @type {LocalizedString} */
|
|
1015
|
-
"Bezig…"
|
|
1016
|
-
)
|
|
1017
|
-
), xn = (
|
|
1018
|
-
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1019
|
-
() => (
|
|
1020
|
-
/** @type {LocalizedString} */
|
|
1021
|
-
"Läuft…"
|
|
1022
|
-
)
|
|
1023
|
-
), Tn = (
|
|
1024
|
-
/** @type {((inputs?: Commerce_Submit_BusyInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_BusyInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1025
|
-
((n = {}, t = {}) => {
|
|
1026
|
-
const e = t.locale ?? h();
|
|
1027
|
-
return e === "en" ? En() : e === "nl" ? An() : xn();
|
|
1028
|
-
})
|
|
1029
|
-
), Rn = (
|
|
1030
|
-
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1031
|
-
() => (
|
|
1032
|
-
/** @type {LocalizedString} */
|
|
1033
|
-
"Done"
|
|
1034
|
-
)
|
|
1035
|
-
), In = (
|
|
1036
|
-
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1037
|
-
() => (
|
|
1038
|
-
/** @type {LocalizedString} */
|
|
1039
|
-
"Gelukt"
|
|
1040
|
-
)
|
|
1041
|
-
), On = (
|
|
1042
|
-
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1043
|
-
() => (
|
|
1044
|
-
/** @type {LocalizedString} */
|
|
1045
|
-
"Fertig"
|
|
1046
|
-
)
|
|
1047
|
-
), Nn = (
|
|
1048
|
-
/** @type {((inputs?: Commerce_Submit_SuccessInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_SuccessInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1049
|
-
((n = {}, t = {}) => {
|
|
1050
|
-
const e = t.locale ?? h();
|
|
1051
|
-
return e === "en" ? Rn() : e === "nl" ? In() : On();
|
|
1052
|
-
})
|
|
1053
|
-
), Ln = (
|
|
1054
|
-
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1055
|
-
() => (
|
|
1056
|
-
/** @type {LocalizedString} */
|
|
1057
|
-
"Failed"
|
|
1058
|
-
)
|
|
1059
|
-
), Mn = (
|
|
1060
|
-
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1061
|
-
() => (
|
|
1062
|
-
/** @type {LocalizedString} */
|
|
1063
|
-
"Mislukt"
|
|
1064
|
-
)
|
|
1065
|
-
), zn = (
|
|
1066
|
-
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1067
|
-
() => (
|
|
1068
|
-
/** @type {LocalizedString} */
|
|
1069
|
-
"Fehlgeschlagen"
|
|
1070
|
-
)
|
|
1071
|
-
), Fn = (
|
|
1072
|
-
/** @type {((inputs?: Commerce_Submit_FailedInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_FailedInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1073
|
-
((n = {}, t = {}) => {
|
|
1074
|
-
const e = t.locale ?? h();
|
|
1075
|
-
return e === "en" ? Ln() : e === "nl" ? Mn() : zn();
|
|
1076
|
-
})
|
|
1077
|
-
), _ = {
|
|
1078
|
-
fontFamily: {
|
|
1079
|
-
sans: ["Mona Sans", "ui-sans-serif", "system-ui", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"]
|
|
1080
|
-
},
|
|
1081
|
-
fontSize: {
|
|
1082
|
-
xs: "0.75rem",
|
|
1083
|
-
// 12px
|
|
1084
|
-
sm: "0.875rem",
|
|
1085
|
-
// 14px
|
|
1086
|
-
base: "1rem",
|
|
1087
|
-
// 16px
|
|
1088
|
-
lg: "1.125rem"
|
|
1089
|
-
},
|
|
1090
|
-
fontWeight: {
|
|
1091
|
-
medium: "500",
|
|
1092
|
-
semibold: "600"
|
|
1093
|
-
}
|
|
1094
|
-
}, Pn = _.fontFamily.sans.join(", ");
|
|
1095
|
-
class $n {
|
|
1096
|
-
qrLib = null;
|
|
1097
|
-
dialog = null;
|
|
1098
|
-
async show(t) {
|
|
1099
|
-
this.hide(), this.qrLib ??= await import("./browser-ey6Iih3j.js").then((o) => o.b);
|
|
1100
|
-
const e = await this.qrLib.toDataURL(t, {
|
|
1101
|
-
width: 256,
|
|
1102
|
-
margin: 4,
|
|
1103
|
-
errorCorrectionLevel: "M",
|
|
1104
|
-
color: { dark: m.black, light: m.white }
|
|
1105
|
-
});
|
|
1106
|
-
this.dialog = new Qt({ onClose: () => {
|
|
1107
|
-
this.dialog = null;
|
|
1108
|
-
} }), Object.assign(this.dialog.card.element.style, {
|
|
1109
|
-
display: "flex",
|
|
1110
|
-
flexDirection: "column",
|
|
1111
|
-
alignItems: "center",
|
|
1112
|
-
gap: a[3],
|
|
1113
|
-
fontFamily: Pn
|
|
1114
|
-
}), this.dialog.card.element.appendChild(this.createText(pe(), {
|
|
1115
|
-
fontSize: _.fontSize.base,
|
|
1116
|
-
fontWeight: _.fontWeight.semibold,
|
|
1117
|
-
color: m.neutral[900]
|
|
1118
|
-
})), this.dialog.card.element.appendChild(this.createText(ve(), {
|
|
1119
|
-
fontSize: _.fontSize.sm,
|
|
1120
|
-
color: m.neutral[600]
|
|
1121
|
-
})), this.dialog.card.element.appendChild(this.createQrImage(e)), this.dialog.card.element.appendChild(this.createText(Ce(), {
|
|
1122
|
-
fontSize: _.fontSize.xs,
|
|
1123
|
-
color: m.neutral[500]
|
|
1124
|
-
}));
|
|
1125
|
-
const i = new g({
|
|
1126
|
-
variant: "outline",
|
|
1127
|
-
label: Ae(),
|
|
1128
|
-
onClick: () => {
|
|
1129
|
-
this.hide();
|
|
1130
|
-
}
|
|
1131
|
-
});
|
|
1132
|
-
this.dialog.card.element.appendChild(i.element), this.dialog.open();
|
|
1133
|
-
}
|
|
1134
|
-
hide() {
|
|
1135
|
-
this.dialog?.close(), this.dialog = null;
|
|
1136
|
-
}
|
|
1137
|
-
createText(t, e) {
|
|
1138
|
-
const i = document.createElement("p");
|
|
1139
|
-
return i.textContent = t, Object.assign(i.style, { margin: "0", textAlign: "center", ...e }), i;
|
|
1140
|
-
}
|
|
1141
|
-
createQrImage(t) {
|
|
1142
|
-
const e = document.createElement("img");
|
|
1143
|
-
return e.src = t, e.alt = "QR code", Object.assign(e.style, {
|
|
1144
|
-
width: a[24],
|
|
1145
|
-
height: a[24],
|
|
1146
|
-
borderRadius: a[1]
|
|
1147
|
-
}), e;
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
const x = _.fontFamily.sans.join(", "), Dn = `
|
|
1151
|
-
--primary: oklch(5% 0 0);
|
|
1152
|
-
--primary-foreground: oklch(100% 0 0);
|
|
1153
|
-
--secondary: oklch(92% 0 0);
|
|
1154
|
-
--secondary-foreground: oklch(5% 0 0);
|
|
1155
|
-
--background: oklch(100% 0 0);
|
|
1156
|
-
--foreground: oklch(5% 0 0);
|
|
1157
|
-
--border: oklch(92% 0 0);
|
|
1158
|
-
--ring: oklch(44% 0 0);
|
|
1159
|
-
--radius: 0.625rem;
|
|
1160
|
-
--accent: oklch(92% 0 0);
|
|
1161
|
-
--accent-foreground: oklch(5% 0 0);
|
|
1162
|
-
--muted-foreground: oklch(44% 0 0);
|
|
1163
|
-
`, Bn = `
|
|
1164
|
-
:root { ${Dn} }
|
|
1165
|
-
|
|
1166
|
-
/* ── Button ──────────────────────────────────────────────── */
|
|
1167
|
-
.ui-btn {
|
|
1168
|
-
display: inline-flex;
|
|
1169
|
-
align-items: center;
|
|
1170
|
-
justify-content: center;
|
|
1171
|
-
gap: 0.5rem;
|
|
1172
|
-
border: 1px solid transparent;
|
|
1173
|
-
border-radius: var(--radius);
|
|
1174
|
-
font-family: ${x};
|
|
1175
|
-
font-size: 0.875rem;
|
|
1176
|
-
font-weight: 600;
|
|
1177
|
-
white-space: nowrap;
|
|
1178
|
-
cursor: pointer;
|
|
1179
|
-
transition: all 200ms;
|
|
1180
|
-
flex-shrink: 0;
|
|
1181
|
-
}
|
|
1182
|
-
.ui-btn:active { transform: scale(0.98); }
|
|
1183
|
-
.ui-btn:disabled { opacity: 0.5; pointer-events: none; }
|
|
1184
|
-
.ui-btn svg { inline-size: 1rem; block-size: 1rem; pointer-events: none; flex-shrink: 0; }
|
|
1185
|
-
|
|
1186
|
-
.ui-btn--default {
|
|
1187
|
-
background: var(--primary);
|
|
1188
|
-
color: var(--primary-foreground);
|
|
1189
|
-
box-shadow: 0 1px 3px oklch(5% 0 0 / 20%);
|
|
1190
|
-
}
|
|
1191
|
-
.ui-btn--default:hover { background: oklch(10% 0 0); }
|
|
1192
|
-
|
|
1193
|
-
.ui-btn--outline {
|
|
1194
|
-
background: var(--background);
|
|
1195
|
-
color: var(--foreground);
|
|
1196
|
-
border-color: var(--border);
|
|
1197
|
-
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
1198
|
-
}
|
|
1199
|
-
.ui-btn--outline:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
1200
|
-
|
|
1201
|
-
.ui-btn--secondary {
|
|
1202
|
-
background: var(--secondary);
|
|
1203
|
-
color: var(--secondary-foreground);
|
|
1204
|
-
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
1205
|
-
}
|
|
1206
|
-
.ui-btn--secondary:hover { background: oklch(88% 0 0); }
|
|
1207
|
-
|
|
1208
|
-
.ui-btn--ghost { background: transparent; color: var(--foreground); }
|
|
1209
|
-
.ui-btn--ghost:hover { background: var(--accent); }
|
|
1210
|
-
|
|
1211
|
-
.ui-btn--size-default { block-size: 2.25rem; padding: 0 1rem; }
|
|
1212
|
-
.ui-btn--size-sm { block-size: 2rem; padding: 0 0.75rem; border-radius: calc(var(--radius) - 0.125rem); }
|
|
1213
|
-
.ui-btn--size-lg { block-size: 2.5rem; padding: 0 1.5rem; }
|
|
1214
|
-
.ui-btn--size-icon { inline-size: 2.25rem; block-size: 2.25rem; padding: 0; }
|
|
1215
|
-
.ui-btn--size-icon-sm { inline-size: 2rem; block-size: 2rem; padding: 0; }
|
|
1216
|
-
.ui-btn--size-icon-lg { inline-size: 2.5rem; block-size: 2.5rem; padding: 0; }
|
|
1217
|
-
|
|
1218
|
-
/* ── Toggle group ────────────────────────────────────────── */
|
|
1219
|
-
.ui-toggle-group { display: inline-flex; flex-wrap: wrap; gap: 0.25rem; }
|
|
1220
|
-
|
|
1221
|
-
.ui-toggle-group-item {
|
|
1222
|
-
display: inline-flex;
|
|
1223
|
-
align-items: center;
|
|
1224
|
-
justify-content: center;
|
|
1225
|
-
block-size: 2rem;
|
|
1226
|
-
padding: 0 0.75rem;
|
|
1227
|
-
border: 1px solid var(--border);
|
|
1228
|
-
border-radius: var(--radius);
|
|
1229
|
-
background: var(--background);
|
|
1230
|
-
color: var(--foreground);
|
|
1231
|
-
font-family: ${x};
|
|
1232
|
-
font-size: 0.875rem;
|
|
1233
|
-
font-weight: 600;
|
|
1234
|
-
cursor: pointer;
|
|
1235
|
-
white-space: nowrap;
|
|
1236
|
-
transition: all 200ms;
|
|
1237
|
-
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
1238
|
-
}
|
|
1239
|
-
.ui-toggle-group-item:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
1240
|
-
.ui-toggle-group-item:active { transform: scale(0.98); }
|
|
1241
|
-
.ui-toggle-group-item:focus-visible {
|
|
1242
|
-
outline: none;
|
|
1243
|
-
border-color: var(--ring);
|
|
1244
|
-
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
1245
|
-
}
|
|
1246
|
-
.ui-toggle-group-item[data-state="on"] {
|
|
1247
|
-
background: var(--primary);
|
|
1248
|
-
color: var(--primary-foreground);
|
|
1249
|
-
border-color: var(--primary);
|
|
1250
|
-
}
|
|
1251
|
-
.ui-toggle-group-item[data-state="on"]:hover { background: oklch(10% 0 0); }
|
|
1252
|
-
|
|
1253
|
-
/* ── Native select ───────────────────────────────────────── */
|
|
1254
|
-
.ui-native-select-wrap {
|
|
1255
|
-
position: relative;
|
|
1256
|
-
display: inline-flex;
|
|
1257
|
-
min-inline-size: 8rem;
|
|
1258
|
-
}
|
|
1259
|
-
|
|
1260
|
-
.ui-native-select {
|
|
1261
|
-
display: block;
|
|
1262
|
-
inline-size: 100%;
|
|
1263
|
-
block-size: 2.25rem;
|
|
1264
|
-
padding: 0 2.25rem 0 0.75rem;
|
|
1265
|
-
border: 1px solid var(--border);
|
|
1266
|
-
border-radius: var(--radius);
|
|
1267
|
-
background: var(--background);
|
|
1268
|
-
appearance: none;
|
|
1269
|
-
color: var(--foreground);
|
|
1270
|
-
font-family: ${x};
|
|
1271
|
-
font-size: 0.875rem;
|
|
1272
|
-
font-weight: 400;
|
|
1273
|
-
cursor: pointer;
|
|
1274
|
-
transition: color 200ms, box-shadow 200ms, border-color 200ms;
|
|
1275
|
-
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
1276
|
-
}
|
|
1277
|
-
.ui-native-select:hover { border-color: oklch(85% 0 0); }
|
|
1278
|
-
.ui-native-select:focus-visible {
|
|
1279
|
-
outline: none;
|
|
1280
|
-
border-color: var(--ring);
|
|
1281
|
-
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
1282
|
-
}
|
|
1283
|
-
|
|
1284
|
-
.ui-native-select-icon {
|
|
1285
|
-
position: absolute;
|
|
1286
|
-
inset-block-start: 50%;
|
|
1287
|
-
inset-inline-end: 0.625rem;
|
|
1288
|
-
transform: translateY(-50%);
|
|
1289
|
-
color: var(--muted-foreground);
|
|
1290
|
-
pointer-events: none;
|
|
1291
|
-
}
|
|
1292
|
-
|
|
1293
|
-
/* ── Annotation layer ───────────────────────────────────── */
|
|
1294
|
-
.vd-annotations-layer {
|
|
1295
|
-
position: absolute;
|
|
1296
|
-
inset-block-start: 0;
|
|
1297
|
-
inset-inline-start: 0;
|
|
1298
|
-
inline-size: 100%;
|
|
1299
|
-
block-size: 100%;
|
|
1300
|
-
pointer-events: none;
|
|
1301
|
-
overflow: visible !important; /* override CSS2DRenderer inline style */
|
|
1302
|
-
}
|
|
1303
|
-
|
|
1304
|
-
.vd-annotation-anchor {
|
|
1305
|
-
position: relative;
|
|
1306
|
-
}
|
|
1307
|
-
|
|
1308
|
-
.vd-annotation-marker {
|
|
1309
|
-
display: flex;
|
|
1310
|
-
align-items: center;
|
|
1311
|
-
justify-content: center;
|
|
1312
|
-
inline-size: 1.75rem;
|
|
1313
|
-
block-size: 1.75rem;
|
|
1314
|
-
border-radius: 50%;
|
|
1315
|
-
border: 2px solid oklch(100% 0 0);
|
|
1316
|
-
background: var(--primary);
|
|
1317
|
-
color: var(--primary-foreground);
|
|
1318
|
-
font-family: ${x};
|
|
1319
|
-
font-size: 0.8125rem;
|
|
1320
|
-
font-weight: 600;
|
|
1321
|
-
cursor: pointer;
|
|
1322
|
-
pointer-events: auto;
|
|
1323
|
-
box-shadow: 0 2px 8px oklch(5% 0 0 / 20%);
|
|
1324
|
-
transition: transform 100ms ease;
|
|
1325
|
-
position: relative;
|
|
1326
|
-
}
|
|
1327
|
-
.vd-annotation-marker:hover { transform: scale(1.1); }
|
|
1328
|
-
.vd-annotation-marker:focus-visible {
|
|
1329
|
-
outline: 2px solid var(--ring);
|
|
1330
|
-
outline-offset: 2px;
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1333
|
-
.vd-annotation-popup {
|
|
1334
|
-
position: absolute;
|
|
1335
|
-
inset-block-end: calc(100% + 0.5rem);
|
|
1336
|
-
inset-inline-start: 50%;
|
|
1337
|
-
transform: translateX(-50%);
|
|
1338
|
-
background: var(--background);
|
|
1339
|
-
color: var(--foreground);
|
|
1340
|
-
border: 1px solid var(--border);
|
|
1341
|
-
border-radius: var(--radius);
|
|
1342
|
-
padding: 0.75rem 1rem;
|
|
1343
|
-
max-inline-size: 15rem;
|
|
1344
|
-
box-shadow: 0 4px 6px oklch(5% 0 0 / 8%), 0 2px 4px oklch(5% 0 0 / 6%);
|
|
1345
|
-
pointer-events: auto;
|
|
1346
|
-
white-space: normal;
|
|
1347
|
-
}
|
|
1348
|
-
.vd-annotation-popup:focus { outline: none; }
|
|
1349
|
-
|
|
1350
|
-
.vd-annotation-popup-close {
|
|
1351
|
-
position: absolute;
|
|
1352
|
-
inset-block-start: 0.375rem;
|
|
1353
|
-
inset-inline-end: 0.375rem;
|
|
1354
|
-
display: flex;
|
|
1355
|
-
align-items: center;
|
|
1356
|
-
justify-content: center;
|
|
1357
|
-
inline-size: 1.25rem;
|
|
1358
|
-
block-size: 1.25rem;
|
|
1359
|
-
padding: 0;
|
|
1360
|
-
border: none;
|
|
1361
|
-
border-radius: calc(var(--radius) - 4px);
|
|
1362
|
-
background: transparent;
|
|
1363
|
-
color: var(--muted-foreground);
|
|
1364
|
-
cursor: pointer;
|
|
1365
|
-
pointer-events: auto;
|
|
1366
|
-
}
|
|
1367
|
-
.vd-annotation-popup-close:hover {
|
|
1368
|
-
color: var(--foreground);
|
|
1369
|
-
background: var(--secondary);
|
|
1370
|
-
}
|
|
1371
|
-
.vd-annotation-popup-close:focus-visible {
|
|
1372
|
-
outline: 2px solid var(--ring);
|
|
1373
|
-
outline-offset: 1px;
|
|
1374
|
-
}
|
|
1375
|
-
.vd-annotation-popup-close svg {
|
|
1376
|
-
inline-size: 0.875rem;
|
|
1377
|
-
block-size: 0.875rem;
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
1381
|
-
.vd-annotation-popup {
|
|
1382
|
-
animation: vd-popup-in 150ms ease;
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
|
|
1386
|
-
@keyframes vd-popup-in {
|
|
1387
|
-
from { opacity: 0; transform: translateX(-50%) translateY(4px); }
|
|
1388
|
-
to { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
1389
|
-
}
|
|
1390
|
-
|
|
1391
|
-
.vd-annotation-popup-title {
|
|
1392
|
-
font-family: ${x};
|
|
1393
|
-
font-size: 0.875rem;
|
|
1394
|
-
font-weight: 600;
|
|
1395
|
-
line-height: 1.25rem;
|
|
1396
|
-
/* Keep the title clear of the absolutely positioned close button. */
|
|
1397
|
-
padding-inline-end: 1.5rem;
|
|
1398
|
-
}
|
|
1399
|
-
|
|
1400
|
-
.vd-annotation-popup-description {
|
|
1401
|
-
font-family: ${x};
|
|
1402
|
-
font-size: 0.8125rem;
|
|
1403
|
-
font-weight: 400;
|
|
1404
|
-
line-height: 1.125rem;
|
|
1405
|
-
color: var(--muted-foreground);
|
|
1406
|
-
margin-block-start: 0.25rem;
|
|
1407
|
-
}
|
|
1408
|
-
`;
|
|
1409
|
-
let et = !1;
|
|
1410
|
-
function Un() {
|
|
1411
|
-
if (et || typeof document > "u")
|
|
1412
|
-
return;
|
|
1413
|
-
et = !0;
|
|
1414
|
-
const n = document.createElement("style");
|
|
1415
|
-
n.id = "vd-ui-vanilla", n.textContent = Bn, document.head.appendChild(n);
|
|
1416
|
-
}
|
|
1417
|
-
function Vn() {
|
|
1418
|
-
return /* @__PURE__ */ new Date();
|
|
1419
|
-
}
|
|
1420
|
-
function jn(n) {
|
|
1421
|
-
return n.toISOString();
|
|
1422
|
-
}
|
|
1423
|
-
function bt() {
|
|
1424
|
-
return typeof navigator > "u" ? "" : navigator.userAgent;
|
|
1425
|
-
}
|
|
1426
|
-
function Hn() {
|
|
1427
|
-
return typeof navigator > "u" ? !1 : navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
|
|
1428
|
-
}
|
|
1429
|
-
function Gn() {
|
|
1430
|
-
return /iPhone|iPad|iPod/i.test(bt()) || Hn();
|
|
1431
|
-
}
|
|
1432
|
-
function qn() {
|
|
1433
|
-
return /Android/i.test(bt());
|
|
1434
|
-
}
|
|
1435
|
-
function Zn() {
|
|
1436
|
-
return Gn() || qn();
|
|
1437
|
-
}
|
|
1438
|
-
class Wn {
|
|
1439
|
-
constructor(t) {
|
|
1440
|
-
this.send = t;
|
|
1441
|
-
}
|
|
1442
|
-
send;
|
|
1443
|
-
setEnabled(t) {
|
|
1444
|
-
this.send({
|
|
1445
|
-
type: c.ANNOTATION_TOGGLE,
|
|
1446
|
-
enabled: t
|
|
1447
|
-
});
|
|
1448
|
-
}
|
|
1449
|
-
}
|
|
1450
|
-
class Yn {
|
|
1451
|
-
constructor(t, e) {
|
|
1452
|
-
this.value = t, this.attribute = e;
|
|
1453
|
-
}
|
|
1454
|
-
value;
|
|
1455
|
-
attribute;
|
|
1456
|
-
isSelectedValue = !1;
|
|
1457
|
-
get isSelected() {
|
|
1458
|
-
return this.isSelectedValue;
|
|
1459
|
-
}
|
|
1460
|
-
setSelected(t) {
|
|
1461
|
-
this.isSelectedValue = t;
|
|
1462
|
-
}
|
|
1463
|
-
}
|
|
1464
|
-
const E = {
|
|
1465
|
-
NO_MAPPING: "NO_MAPPING",
|
|
1466
|
-
ATTRIBUTE_NOT_FOUND: "ATTRIBUTE_NOT_FOUND",
|
|
1467
|
-
VALUE_NOT_FOUND: "VALUE_NOT_FOUND",
|
|
1468
|
-
PARENT_NOT_FOUND: "PARENT_NOT_FOUND",
|
|
1469
|
-
INVALID_PARAMETER: "INVALID_PARAMETER",
|
|
1470
|
-
SNAPSHOT_FAILED: "SNAPSHOT_FAILED"
|
|
1471
|
-
};
|
|
1472
|
-
class f extends Error {
|
|
1473
|
-
code;
|
|
1474
|
-
constructor(t, e) {
|
|
1475
|
-
super(t), this.name = "VirtualdisplayError", this.code = e;
|
|
1476
|
-
}
|
|
1477
|
-
static valueNotFound(t, e) {
|
|
1478
|
-
return new f(
|
|
1479
|
-
`Value "${e}" not found for attribute "${t}"`,
|
|
1480
|
-
E.VALUE_NOT_FOUND
|
|
1481
|
-
);
|
|
1482
|
-
}
|
|
1483
|
-
static parentNotFound(t) {
|
|
1484
|
-
return new f(
|
|
1485
|
-
`Parent element not found: ${t}`,
|
|
1486
|
-
E.PARENT_NOT_FOUND
|
|
1487
|
-
);
|
|
1488
|
-
}
|
|
1489
|
-
static invalidParameter(t) {
|
|
1490
|
-
return new f(t, E.INVALID_PARAMETER);
|
|
1491
|
-
}
|
|
1492
|
-
}
|
|
1493
|
-
class Xn {
|
|
1494
|
-
name;
|
|
1495
|
-
defaultValue;
|
|
1496
|
-
values;
|
|
1497
|
-
onSelect;
|
|
1498
|
-
onChangeCallback;
|
|
1499
|
-
constructor(t) {
|
|
1500
|
-
this.name = t.name, this.defaultValue = t.defaultValue, this.onSelect = t.onSelect, this.values = this.createValues(t.values);
|
|
1501
|
-
}
|
|
1502
|
-
/**
|
|
1503
|
-
* Select a value for this attribute
|
|
1504
|
-
* @throws {VirtualdisplayError} When value not found
|
|
1505
|
-
*/
|
|
1506
|
-
select(t) {
|
|
1507
|
-
if (!this.values.has(t))
|
|
1508
|
-
throw f.valueNotFound(this.name, t);
|
|
1509
|
-
this.onSelect(this.name, t);
|
|
1510
|
-
}
|
|
1511
|
-
getValues() {
|
|
1512
|
-
return Array.from(this.values.values());
|
|
1513
|
-
}
|
|
1514
|
-
getValue(t) {
|
|
1515
|
-
return this.values.get(t);
|
|
1516
|
-
}
|
|
1517
|
-
/** The currently selected value, or undefined before any selection lands. */
|
|
1518
|
-
get selected() {
|
|
1519
|
-
for (const t of this.values.values())
|
|
1520
|
-
if (t.isSelected)
|
|
1521
|
-
return t.value;
|
|
1522
|
-
}
|
|
1523
|
-
/**
|
|
1524
|
-
* Register callback that fires when selection changes
|
|
1525
|
-
* Receives the newly selected AttributeValue
|
|
1526
|
-
*/
|
|
1527
|
-
onChange(t) {
|
|
1528
|
-
this.onChangeCallback = t;
|
|
1529
|
-
}
|
|
1530
|
-
/**
|
|
1531
|
-
* Update selection state from server mutation result
|
|
1532
|
-
* Direct value comparison - no source/target translation
|
|
1533
|
-
*/
|
|
1534
|
-
handleResult(t) {
|
|
1535
|
-
let e;
|
|
1536
|
-
for (const i of this.values.values()) {
|
|
1537
|
-
const o = i.value === t;
|
|
1538
|
-
i.setSelected(o), o && (e = i);
|
|
1539
|
-
}
|
|
1540
|
-
e !== void 0 && this.onChangeCallback !== void 0 && this.onChangeCallback(e);
|
|
1541
|
-
}
|
|
1542
|
-
createValues(t) {
|
|
1543
|
-
const e = /* @__PURE__ */ new Map();
|
|
1544
|
-
for (const i of t) {
|
|
1545
|
-
const o = new Yn(i, this.name);
|
|
1546
|
-
i === this.defaultValue && o.setSelected(!0), e.set(i, o);
|
|
1547
|
-
}
|
|
1548
|
-
return e;
|
|
1549
|
-
}
|
|
1550
|
-
}
|
|
1551
|
-
class Kn {
|
|
1552
|
-
attributes = /* @__PURE__ */ new Map();
|
|
1553
|
-
constructor(t, e, i) {
|
|
1554
|
-
for (const o of t) {
|
|
1555
|
-
const s = this.buildOptions(o, e);
|
|
1556
|
-
this.attributes.set(o.name, new Xn(s));
|
|
1557
|
-
}
|
|
1558
|
-
this.onMutationFailed = i;
|
|
1559
|
-
}
|
|
1560
|
-
onMutationFailed;
|
|
1561
|
-
get(t) {
|
|
1562
|
-
return this.attributes.get(t);
|
|
1563
|
-
}
|
|
1564
|
-
/** The current selection as attribute name→value pairs, skipping unset attributes. */
|
|
1565
|
-
getSelection() {
|
|
1566
|
-
const t = {};
|
|
1567
|
-
for (const [e, i] of this.attributes) {
|
|
1568
|
-
const o = i.selected;
|
|
1569
|
-
o !== void 0 && (t[e] = o);
|
|
1570
|
-
}
|
|
1571
|
-
return t;
|
|
1572
|
-
}
|
|
1573
|
-
handleResults(t) {
|
|
1574
|
-
for (const e of t) {
|
|
1575
|
-
if (!e.success) {
|
|
1576
|
-
this.onMutationFailed?.(e.name, e.value);
|
|
1577
|
-
continue;
|
|
1578
|
-
}
|
|
1579
|
-
this.get(e.name)?.handleResult(e.value);
|
|
1580
|
-
}
|
|
1581
|
-
}
|
|
1582
|
-
buildOptions(t, e) {
|
|
1583
|
-
const i = {
|
|
1584
|
-
name: t.name,
|
|
1585
|
-
values: t.values,
|
|
1586
|
-
onSelect: (o, s) => {
|
|
1587
|
-
e([{ name: o, value: s }], !1);
|
|
1588
|
-
}
|
|
1589
|
-
};
|
|
1590
|
-
return t.defaultValue !== void 0 ? { ...i, defaultValue: t.defaultValue } : i;
|
|
1591
|
-
}
|
|
1592
|
-
}
|
|
1593
|
-
function Qn(n) {
|
|
1594
|
-
const t = new Date(n.timestamp).toLocaleTimeString("en-GB", { hour12: !1 }), e = n.level.toUpperCase().padEnd(5), i = n.trace_id?.slice(0, 8) ?? "--------", o = n.msg, s = ["timestamp", "level", "msg", "service", "trace_id", "span_id"], r = Object.entries(n).filter(([l]) => !s.includes(l)).map(([l, d]) => `${l}=${JSON.stringify(d)}`).join(" ");
|
|
1595
|
-
return `${t} ${e} [${i}] ${o}${r ? " " + r : ""}`;
|
|
1596
|
-
}
|
|
1597
|
-
function Jn(n) {
|
|
1598
|
-
return JSON.stringify(n);
|
|
1599
|
-
}
|
|
1600
|
-
function ti(n, t) {
|
|
1601
|
-
const e = t ? Qn(n) : Jn(n);
|
|
1602
|
-
n.level === "error" ? console.error(e) : n.level === "warn" ? console.warn(e) : console.log(e);
|
|
1603
|
-
}
|
|
1604
|
-
function vt(n, t = 0) {
|
|
1605
|
-
const e = {
|
|
1606
|
-
name: n.name,
|
|
1607
|
-
message: n.message
|
|
1608
|
-
};
|
|
1609
|
-
n.stack !== void 0 && (e.stack = n.stack);
|
|
1610
|
-
for (const i of Object.getOwnPropertyNames(n)) {
|
|
1611
|
-
if (i === "name" || i === "message" || i === "stack" || i === "cause")
|
|
1612
|
-
continue;
|
|
1613
|
-
const o = n[i];
|
|
1614
|
-
o !== void 0 && (e[i] = o);
|
|
1615
|
-
}
|
|
1616
|
-
return n.cause !== void 0 && n.cause !== null && (e.cause = n.cause instanceof Error && t < 5 ? vt(n.cause, t + 1) : String(n.cause)), e;
|
|
1617
|
-
}
|
|
1618
|
-
function ei(n) {
|
|
1619
|
-
const t = {};
|
|
1620
|
-
for (const [e, i] of Object.entries(n))
|
|
1621
|
-
t[e] = i instanceof Error ? vt(i) : i;
|
|
1622
|
-
return t;
|
|
1623
|
-
}
|
|
1624
|
-
class ni {
|
|
1625
|
-
constructor(t) {
|
|
1626
|
-
this.config = t;
|
|
1627
|
-
}
|
|
1628
|
-
config;
|
|
1629
|
-
/**
|
|
1630
|
-
* Log at specified level with optional attributes.
|
|
1631
|
-
*/
|
|
1632
|
-
log(t, e, i = {}) {
|
|
1633
|
-
const o = this.config.traceProvider?.() ?? {}, s = {
|
|
1634
|
-
timestamp: jn(Vn()),
|
|
1635
|
-
level: t,
|
|
1636
|
-
msg: e,
|
|
1637
|
-
service: this.config.service,
|
|
1638
|
-
...o,
|
|
1639
|
-
...ei(i)
|
|
1640
|
-
};
|
|
1641
|
-
ti(s, this.config.isDev);
|
|
1642
|
-
}
|
|
1643
|
-
/**
|
|
1644
|
-
* Log at DEBUG level (development only).
|
|
1645
|
-
*/
|
|
1646
|
-
debug(t, e) {
|
|
1647
|
-
this.config.isDev && this.log("debug", t, e);
|
|
1648
|
-
}
|
|
1649
|
-
/**
|
|
1650
|
-
* Log at INFO level.
|
|
1651
|
-
*/
|
|
1652
|
-
info(t, e) {
|
|
1653
|
-
this.log("info", t, e);
|
|
1654
|
-
}
|
|
1655
|
-
/**
|
|
1656
|
-
* Log at WARN level.
|
|
1657
|
-
*/
|
|
1658
|
-
warn(t, e) {
|
|
1659
|
-
this.log("warn", t, e);
|
|
1660
|
-
}
|
|
1661
|
-
/**
|
|
1662
|
-
* Log at ERROR level.
|
|
1663
|
-
*/
|
|
1664
|
-
error(t, e) {
|
|
1665
|
-
this.log("error", t, e);
|
|
1666
|
-
}
|
|
1667
|
-
}
|
|
1668
|
-
function yt(n, t) {
|
|
1669
|
-
const e = t?.isDev !== void 0 ? t.isDev : typeof process < "u" ? process.env.NODE_ENV !== "production" : !0;
|
|
1670
|
-
return new ni({ service: n, isDev: e, traceProvider: t?.traceProvider });
|
|
1671
|
-
}
|
|
1672
|
-
function O(n) {
|
|
1673
|
-
if (n !== void 0)
|
|
1674
|
-
return typeof n == "object" && n !== null && !Array.isArray(n) && !(n instanceof Error) ? n : n instanceof Error ? { error: n.message } : { value: n };
|
|
1675
|
-
}
|
|
1676
|
-
function _t(n) {
|
|
1677
|
-
return {
|
|
1678
|
-
debug: (t, e) => n.debug(t, O(e)),
|
|
1679
|
-
info: (t, e) => n.info(t, O(e)),
|
|
1680
|
-
warn: (t, e) => n.warn(t, O(e)),
|
|
1681
|
-
error: (t, e) => n.error(t, O(e))
|
|
1682
|
-
};
|
|
1683
|
-
}
|
|
1684
|
-
let wt = !1, w = _t(yt("client", { isDev: !1 }));
|
|
1685
|
-
function ii() {
|
|
1686
|
-
wt = !0, w = _t(yt("client", { isDev: !0 }));
|
|
1687
|
-
}
|
|
1688
|
-
function Gi() {
|
|
1689
|
-
return wt;
|
|
1690
|
-
}
|
|
1691
|
-
class oi {
|
|
529
|
+
class ne {
|
|
1692
530
|
constructor(t, e) {
|
|
1693
531
|
this.send = t, this.onMutationFailed = e;
|
|
1694
532
|
}
|
|
@@ -1700,9 +538,9 @@ class oi {
|
|
|
1700
538
|
* Handle incoming MAPPING message from server
|
|
1701
539
|
*/
|
|
1702
540
|
handleMappingReceived(t) {
|
|
1703
|
-
|
|
541
|
+
_.debug("Initializing from server mapping", {
|
|
1704
542
|
attributeCount: t.attributes.length
|
|
1705
|
-
}), this.registry = new
|
|
543
|
+
}), this.registry = new jt(
|
|
1706
544
|
t.attributes,
|
|
1707
545
|
(e, i) => this.sendMutation(e, i),
|
|
1708
546
|
this.onMutationFailed
|
|
@@ -1736,7 +574,7 @@ class oi {
|
|
|
1736
574
|
}
|
|
1737
575
|
const i = this.registry.get(t);
|
|
1738
576
|
if (i === void 0) {
|
|
1739
|
-
|
|
577
|
+
_.warn(`onChange: attribute "${t}" not found — callback will not fire`);
|
|
1740
578
|
return;
|
|
1741
579
|
}
|
|
1742
580
|
i.onChange(e);
|
|
@@ -1762,12 +600,12 @@ class oi {
|
|
|
1762
600
|
replayPendingCallbacks() {
|
|
1763
601
|
for (const { name: t, callback: e } of this.pendingCallbacks) {
|
|
1764
602
|
const i = this.registry?.get(t);
|
|
1765
|
-
i === void 0 &&
|
|
603
|
+
i === void 0 && _.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`), i?.onChange(e);
|
|
1766
604
|
}
|
|
1767
605
|
this.pendingCallbacks.length = 0;
|
|
1768
606
|
}
|
|
1769
607
|
}
|
|
1770
|
-
class
|
|
608
|
+
let ie = class {
|
|
1771
609
|
constructor(t) {
|
|
1772
610
|
this.send = t;
|
|
1773
611
|
}
|
|
@@ -1829,8 +667,8 @@ class si {
|
|
|
1829
667
|
};
|
|
1830
668
|
this.send(t);
|
|
1831
669
|
}
|
|
1832
|
-
}
|
|
1833
|
-
class
|
|
670
|
+
};
|
|
671
|
+
class oe {
|
|
1834
672
|
state;
|
|
1835
673
|
limitsState;
|
|
1836
674
|
changeCallbacks = [];
|
|
@@ -1918,20 +756,20 @@ class ri {
|
|
|
1918
756
|
}
|
|
1919
757
|
}
|
|
1920
758
|
}
|
|
1921
|
-
function
|
|
1922
|
-
const e = n.filter((s) =>
|
|
759
|
+
function se(n, t) {
|
|
760
|
+
const e = n.filter((s) => re(s, t));
|
|
1923
761
|
if (e.length === 0)
|
|
1924
762
|
return;
|
|
1925
|
-
const i = Math.max(...e.map(
|
|
763
|
+
const i = Math.max(...e.map(K)), o = e.filter((s) => K(s) === i);
|
|
1926
764
|
return o.length === 1 ? o[0] : void 0;
|
|
1927
765
|
}
|
|
1928
|
-
function
|
|
766
|
+
function re(n, t) {
|
|
1929
767
|
return Object.entries(n.attributes).every(([e, i]) => t[e] === i);
|
|
1930
768
|
}
|
|
1931
|
-
function
|
|
769
|
+
function K(n) {
|
|
1932
770
|
return Object.keys(n.attributes).length;
|
|
1933
771
|
}
|
|
1934
|
-
class
|
|
772
|
+
class ae {
|
|
1935
773
|
constructor(t, e) {
|
|
1936
774
|
this.dispatchChange = t, this.dispatchSubmit = e;
|
|
1937
775
|
}
|
|
@@ -2028,288 +866,1515 @@ class ci {
|
|
|
2028
866
|
handleSelectionChanged(t) {
|
|
2029
867
|
this.selection = t, this.recompute();
|
|
2030
868
|
}
|
|
2031
|
-
recompute() {
|
|
2032
|
-
this.resolved = this.resolve();
|
|
2033
|
-
for (const t of this.changeCallbacks)
|
|
2034
|
-
t(this.resolved);
|
|
2035
|
-
this.dispatchChange(this.resolved), this.notifyRender();
|
|
869
|
+
recompute() {
|
|
870
|
+
this.resolved = this.resolve();
|
|
871
|
+
for (const t of this.changeCallbacks)
|
|
872
|
+
t(this.resolved);
|
|
873
|
+
this.dispatchChange(this.resolved), this.notifyRender();
|
|
874
|
+
}
|
|
875
|
+
notifyRender() {
|
|
876
|
+
for (const t of this.renderCallbacks)
|
|
877
|
+
t();
|
|
878
|
+
}
|
|
879
|
+
resolve() {
|
|
880
|
+
if (this.pricing === void 0)
|
|
881
|
+
return;
|
|
882
|
+
const t = se(this.pricing.rules, this.selection);
|
|
883
|
+
if (!(t === void 0 || t.availability === At.HIDDEN))
|
|
884
|
+
return {
|
|
885
|
+
attributes: { ...this.selection },
|
|
886
|
+
reference: t.reference,
|
|
887
|
+
price: t.priceCents,
|
|
888
|
+
currency: this.pricing.currency,
|
|
889
|
+
availability: t.availability
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
}
|
|
893
|
+
class le {
|
|
894
|
+
constructor(t, e) {
|
|
895
|
+
this.send = t, this.dispatch = e;
|
|
896
|
+
}
|
|
897
|
+
send;
|
|
898
|
+
dispatch;
|
|
899
|
+
focused = null;
|
|
900
|
+
attributes = [];
|
|
901
|
+
changeCallbacks = [];
|
|
902
|
+
/** The focused component name, or null in overview. */
|
|
903
|
+
get current() {
|
|
904
|
+
return this.focused;
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Focus a component by name. Sends a focus message to the viewer.
|
|
908
|
+
* @throws VirtualdisplayError if component is not a non-empty string
|
|
909
|
+
*/
|
|
910
|
+
set(t) {
|
|
911
|
+
if (typeof t != "string" || t.length === 0)
|
|
912
|
+
throw f.invalidParameter(
|
|
913
|
+
`set() requires a non-empty component name, got ${String(t)}`
|
|
914
|
+
);
|
|
915
|
+
this.send({ type: c.FOCUS, action: Q.FOCUS, component: t });
|
|
916
|
+
}
|
|
917
|
+
/** Return to the overview — unfocus the current component. */
|
|
918
|
+
clear() {
|
|
919
|
+
this.send({ type: c.FOCUS, action: Q.UNFOCUS });
|
|
920
|
+
}
|
|
921
|
+
/**
|
|
922
|
+
* Subscribe to focus changes. The callback fires with the focus state when a
|
|
923
|
+
* component is focused, and with null when returning to overview.
|
|
924
|
+
*/
|
|
925
|
+
onChange(t) {
|
|
926
|
+
this.changeCallbacks.push(t);
|
|
927
|
+
}
|
|
928
|
+
/** Called by the client when a FocusStateMessage is received from the viewer. */
|
|
929
|
+
handleStateReceived(t) {
|
|
930
|
+
t.state === kt.FOCUSED && t.component !== void 0 ? (this.focused = t.component, this.attributes = t.attributes ?? []) : (this.focused = null, this.attributes = []);
|
|
931
|
+
const e = this.focused !== null ? { component: this.focused, attributes: this.attributes } : null;
|
|
932
|
+
for (const i of this.changeCallbacks)
|
|
933
|
+
i(e);
|
|
934
|
+
this.dispatch(e);
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
class ce {
|
|
938
|
+
constructor(t) {
|
|
939
|
+
this.filename = t;
|
|
940
|
+
}
|
|
941
|
+
filename;
|
|
942
|
+
developedCallbacks = /* @__PURE__ */ new Set();
|
|
943
|
+
errorCallbacks = /* @__PURE__ */ new Set();
|
|
944
|
+
developed = !1;
|
|
945
|
+
failed = !1;
|
|
946
|
+
photoData = null;
|
|
947
|
+
/**
|
|
948
|
+
* Register a callback for when the photo is developed
|
|
949
|
+
* If the photo is already developed, the callback is called immediately
|
|
950
|
+
*
|
|
951
|
+
* @param callback Function to call with photo data
|
|
952
|
+
* @returns This Photo instance for chaining
|
|
953
|
+
*/
|
|
954
|
+
onDeveloped(t) {
|
|
955
|
+
return this.developed && this.photoData !== null ? (t(this.photoData), this) : (this.developedCallbacks.add(t), this);
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* Register a callback for when the photo capture fails
|
|
959
|
+
*
|
|
960
|
+
* @param callback Function to call with error
|
|
961
|
+
* @returns This Photo instance for chaining
|
|
962
|
+
*/
|
|
963
|
+
onError(t) {
|
|
964
|
+
return this.errorCallbacks.add(t), this;
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Get the filename for this photo
|
|
968
|
+
*/
|
|
969
|
+
getFilename() {
|
|
970
|
+
return this.filename;
|
|
971
|
+
}
|
|
972
|
+
/**
|
|
973
|
+
* Mark the photo as developed and notify all callbacks
|
|
974
|
+
* This method is called by Snapshot when the photo data arrives from the server
|
|
975
|
+
*/
|
|
976
|
+
develop(t) {
|
|
977
|
+
this.developed || this.failed || (this.photoData = t, this.developed = !0, this.developedCallbacks.forEach((e) => {
|
|
978
|
+
e(this.photoData);
|
|
979
|
+
}), this.developedCallbacks.clear(), this.errorCallbacks.clear());
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* Mark the photo as failed and notify error callbacks
|
|
983
|
+
*/
|
|
984
|
+
fail(t) {
|
|
985
|
+
this.developed || this.failed || (this.failed = !0, this.errorCallbacks.forEach((e) => {
|
|
986
|
+
e(t);
|
|
987
|
+
}), this.developedCallbacks.clear(), this.errorCallbacks.clear());
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
const X = 3e4;
|
|
991
|
+
class de {
|
|
992
|
+
constructor(t) {
|
|
993
|
+
this.send = t;
|
|
994
|
+
}
|
|
995
|
+
send;
|
|
996
|
+
validExtensions = [".png"];
|
|
997
|
+
pendingPhotos = /* @__PURE__ */ new Map();
|
|
998
|
+
/**
|
|
999
|
+
* Take a snapshot of the current 3D model view
|
|
1000
|
+
*
|
|
1001
|
+
* @param filename The filename for the snapshot (must include valid extension)
|
|
1002
|
+
* @returns Photo object for registering callbacks
|
|
1003
|
+
* @throws VirtualdisplayError if filename is invalid
|
|
1004
|
+
*/
|
|
1005
|
+
take(t) {
|
|
1006
|
+
this.validateFilename(t), _.debug("Taking snapshot", { filename: t });
|
|
1007
|
+
const e = new ce(t), i = setTimeout(() => {
|
|
1008
|
+
this.pendingPhotos.delete(t), _.warn("Snapshot timed out", { filename: t }), e.fail(new f(
|
|
1009
|
+
`Snapshot timed out: the viewer did not respond within ${X}ms`,
|
|
1010
|
+
A.SNAPSHOT_FAILED
|
|
1011
|
+
));
|
|
1012
|
+
}, X);
|
|
1013
|
+
return this.pendingPhotos.set(t, { photo: e, timeout: i }), this.send({
|
|
1014
|
+
type: c.SNAPSHOT,
|
|
1015
|
+
filename: t
|
|
1016
|
+
}), e;
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Handle incoming snapshot result from server
|
|
1020
|
+
* Matches the message to a pending photo by filename, then develops or fails it
|
|
1021
|
+
*/
|
|
1022
|
+
handleSnapshotResult(t) {
|
|
1023
|
+
const e = this.pendingPhotos.get(t.filename);
|
|
1024
|
+
if (e === void 0) {
|
|
1025
|
+
_.warn("No pending photo found for filename", {
|
|
1026
|
+
filename: t.filename,
|
|
1027
|
+
pendingFilenames: Array.from(this.pendingPhotos.keys())
|
|
1028
|
+
});
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
clearTimeout(e.timeout), this.pendingPhotos.delete(t.filename);
|
|
1032
|
+
const { photo: i } = e;
|
|
1033
|
+
if (t.error !== void 0) {
|
|
1034
|
+
i.fail(new f(t.error, A.SNAPSHOT_FAILED));
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
t.data !== void 0 && i.develop({ filename: t.filename, data: t.data });
|
|
1038
|
+
}
|
|
1039
|
+
/**
|
|
1040
|
+
* Fail any pending photos and forget them. Called from client destroy
|
|
1041
|
+
* so callers awaiting onError() see a deterministic outcome instead of
|
|
1042
|
+
* leaking captures whose results will never arrive.
|
|
1043
|
+
*/
|
|
1044
|
+
clear() {
|
|
1045
|
+
if (this.pendingPhotos.size === 0)
|
|
1046
|
+
return;
|
|
1047
|
+
const t = new f(
|
|
1048
|
+
"Client destroyed before snapshot completed",
|
|
1049
|
+
A.SNAPSHOT_FAILED
|
|
1050
|
+
);
|
|
1051
|
+
for (const { photo: e, timeout: i } of this.pendingPhotos.values())
|
|
1052
|
+
clearTimeout(i), e.fail(t);
|
|
1053
|
+
this.pendingPhotos.clear();
|
|
1054
|
+
}
|
|
1055
|
+
/**
|
|
1056
|
+
* Validate filename has a valid image extension
|
|
1057
|
+
*/
|
|
1058
|
+
validateFilename(t) {
|
|
1059
|
+
if (t === "" || typeof t != "string")
|
|
1060
|
+
throw new f(
|
|
1061
|
+
"Filename must be a non-empty string",
|
|
1062
|
+
A.INVALID_PARAMETER
|
|
1063
|
+
);
|
|
1064
|
+
if (!this.validExtensions.some(
|
|
1065
|
+
(i) => t.toLowerCase().endsWith(i)
|
|
1066
|
+
))
|
|
1067
|
+
throw new f(
|
|
1068
|
+
`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,
|
|
1069
|
+
A.INVALID_PARAMETER
|
|
1070
|
+
);
|
|
1071
|
+
if (t.includes("..") || t.includes("/") || t.includes("\\"))
|
|
1072
|
+
throw new f(
|
|
1073
|
+
'Filename cannot contain path separators or ".."',
|
|
1074
|
+
A.INVALID_PARAMETER
|
|
1075
|
+
);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
class ue {
|
|
1079
|
+
container = null;
|
|
1080
|
+
attach(t) {
|
|
1081
|
+
this.container = t;
|
|
1082
|
+
}
|
|
1083
|
+
dispatch(t, e, i = !1) {
|
|
1084
|
+
const o = new CustomEvent(t, { detail: e, cancelable: i });
|
|
1085
|
+
return this.container?.dispatchEvent(o), o;
|
|
1086
|
+
}
|
|
1087
|
+
on(t, e) {
|
|
1088
|
+
const i = (o) => {
|
|
1089
|
+
const s = o, r = { ...s.detail, preventDefault: () => {
|
|
1090
|
+
s.preventDefault();
|
|
1091
|
+
} };
|
|
1092
|
+
e(r);
|
|
1093
|
+
};
|
|
1094
|
+
return this.container?.addEventListener(t, i), () => {
|
|
1095
|
+
this.container?.removeEventListener(t, i);
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
const he = {}, me = "en", mt = (
|
|
1100
|
+
/** @type {const} */
|
|
1101
|
+
["en", "nl", "de"]
|
|
1102
|
+
), Z = [
|
|
1103
|
+
"baseLocale"
|
|
1104
|
+
], J = [];
|
|
1105
|
+
let tt, et;
|
|
1106
|
+
function pe(n) {
|
|
1107
|
+
if (J.length === 0)
|
|
1108
|
+
return;
|
|
1109
|
+
const t = typeof n == "string" ? n : n.href;
|
|
1110
|
+
if (tt === t)
|
|
1111
|
+
return et;
|
|
1112
|
+
const e = new URL(t, "http://dummy.com");
|
|
1113
|
+
let i;
|
|
1114
|
+
for (const o of J)
|
|
1115
|
+
if (new he(o.match, e.href).exec(e.href)) {
|
|
1116
|
+
i = o;
|
|
1117
|
+
break;
|
|
1118
|
+
}
|
|
1119
|
+
return tt = t, et = i, i;
|
|
1120
|
+
}
|
|
1121
|
+
function pt(n) {
|
|
1122
|
+
const t = pe(n);
|
|
1123
|
+
return t && t.exclude !== !0 && Array.isArray(t.strategy) ? t.strategy : Z;
|
|
1124
|
+
}
|
|
1125
|
+
const G = typeof window > "u";
|
|
1126
|
+
globalThis.__paraglide = /** @type {any} */
|
|
1127
|
+
globalThis.__paraglide ?? {};
|
|
1128
|
+
globalThis.__paraglide.ssr = /** @type {any} */
|
|
1129
|
+
globalThis.__paraglide.ssr ?? {};
|
|
1130
|
+
let nt = !1, h = () => {
|
|
1131
|
+
let n = Z;
|
|
1132
|
+
!G && typeof window < "u" && window.location?.href && (n = pt(window.location.href));
|
|
1133
|
+
const t = fe(n);
|
|
1134
|
+
if (t)
|
|
1135
|
+
return nt || (nt = !0, ft(t, { reload: !1 })), t;
|
|
1136
|
+
throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found");
|
|
1137
|
+
};
|
|
1138
|
+
function fe(n, t) {
|
|
1139
|
+
let e;
|
|
1140
|
+
for (const i of n) {
|
|
1141
|
+
if (i === "baseLocale")
|
|
1142
|
+
e = me;
|
|
1143
|
+
else if (bt(i) && N.has(i)) {
|
|
1144
|
+
const s = N.get(i);
|
|
1145
|
+
if (s) {
|
|
1146
|
+
const r = s.getLocale();
|
|
1147
|
+
if (r instanceof Promise)
|
|
1148
|
+
continue;
|
|
1149
|
+
if (r !== void 0)
|
|
1150
|
+
return be(r);
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
const o = gt(e);
|
|
1154
|
+
if (o)
|
|
1155
|
+
return o;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
const ge = (n) => {
|
|
1159
|
+
window.location.reload();
|
|
1160
|
+
};
|
|
1161
|
+
let ft = (n, t) => {
|
|
1162
|
+
const e = {
|
|
1163
|
+
reload: !0,
|
|
1164
|
+
...t
|
|
1165
|
+
};
|
|
1166
|
+
let i;
|
|
1167
|
+
try {
|
|
1168
|
+
i = h();
|
|
1169
|
+
} catch {
|
|
2036
1170
|
}
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
1171
|
+
const o = [];
|
|
1172
|
+
let s = Z;
|
|
1173
|
+
!G && typeof window < "u" && window.location?.href && (s = pt(window.location.href));
|
|
1174
|
+
for (const l of s)
|
|
1175
|
+
if (l !== "baseLocale" && bt(l) && N.has(l)) {
|
|
1176
|
+
const u = N.get(l);
|
|
1177
|
+
if (u) {
|
|
1178
|
+
let d = u.setLocale(n);
|
|
1179
|
+
d instanceof Promise && (d = d.catch((p) => {
|
|
1180
|
+
throw new Error(`Custom strategy "${l}" setLocale failed.`, {
|
|
1181
|
+
cause: p
|
|
1182
|
+
});
|
|
1183
|
+
}), o.push(d));
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
const r = () => {
|
|
1187
|
+
!G && e.reload && window.location && n !== i && ge();
|
|
1188
|
+
};
|
|
1189
|
+
if (o.length)
|
|
1190
|
+
return Promise.all(o).then(() => {
|
|
1191
|
+
r();
|
|
1192
|
+
});
|
|
1193
|
+
r();
|
|
1194
|
+
};
|
|
1195
|
+
function gt(n) {
|
|
1196
|
+
if (typeof n != "string")
|
|
1197
|
+
return;
|
|
1198
|
+
const t = n.toLowerCase();
|
|
1199
|
+
for (const e of mt)
|
|
1200
|
+
if (e.toLowerCase() === t)
|
|
1201
|
+
return e;
|
|
1202
|
+
}
|
|
1203
|
+
function be(n) {
|
|
1204
|
+
const t = gt(n);
|
|
1205
|
+
if (t)
|
|
1206
|
+
return t;
|
|
1207
|
+
throw new Error(`Invalid locale: ${n}. Expected one of: ${mt.join(", ")}`);
|
|
1208
|
+
}
|
|
1209
|
+
const N = /* @__PURE__ */ new Map();
|
|
1210
|
+
function bt(n) {
|
|
1211
|
+
return typeof n == "string" && /^custom-[A-Za-z0-9_-]+$/.test(n);
|
|
1212
|
+
}
|
|
1213
|
+
const ve = (
|
|
1214
|
+
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
1215
|
+
() => (
|
|
1216
|
+
/** @type {LocalizedString} */
|
|
1217
|
+
"Activate AR"
|
|
1218
|
+
)
|
|
1219
|
+
), ye = (
|
|
1220
|
+
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
1221
|
+
() => (
|
|
1222
|
+
/** @type {LocalizedString} */
|
|
1223
|
+
"AR activeren"
|
|
1224
|
+
)
|
|
1225
|
+
), we = (
|
|
1226
|
+
/** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
|
|
1227
|
+
() => (
|
|
1228
|
+
/** @type {LocalizedString} */
|
|
1229
|
+
"AR aktivieren"
|
|
1230
|
+
)
|
|
1231
|
+
), _e = (
|
|
1232
|
+
/** @type {((inputs?: Controls_Ar_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Ar_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1233
|
+
((n = {}, t = {}) => {
|
|
1234
|
+
const e = t.locale ?? h();
|
|
1235
|
+
return e === "en" ? ve() : e === "nl" ? ye() : we();
|
|
1236
|
+
})
|
|
1237
|
+
), Ce = (
|
|
1238
|
+
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
1239
|
+
() => (
|
|
1240
|
+
/** @type {LocalizedString} */
|
|
1241
|
+
"Scan to view in AR"
|
|
1242
|
+
)
|
|
1243
|
+
), Se = (
|
|
1244
|
+
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
1245
|
+
() => (
|
|
1246
|
+
/** @type {LocalizedString} */
|
|
1247
|
+
"Scan om in AR te bekijken"
|
|
1248
|
+
)
|
|
1249
|
+
), ke = (
|
|
1250
|
+
/** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
|
|
1251
|
+
() => (
|
|
1252
|
+
/** @type {LocalizedString} */
|
|
1253
|
+
"Scannen für AR-Ansicht"
|
|
1254
|
+
)
|
|
1255
|
+
), Ae = (
|
|
1256
|
+
/** @type {((inputs?: Controls_Qr_Modaltitle1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaltitle1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1257
|
+
((n = {}, t = {}) => {
|
|
1258
|
+
const e = t.locale ?? h();
|
|
1259
|
+
return e === "en" ? Ce() : e === "nl" ? Se() : ke();
|
|
1260
|
+
})
|
|
1261
|
+
), Ee = (
|
|
1262
|
+
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
1263
|
+
() => (
|
|
1264
|
+
/** @type {LocalizedString} */
|
|
1265
|
+
"Use your smartphone camera to scan this QR code"
|
|
1266
|
+
)
|
|
1267
|
+
), xe = (
|
|
1268
|
+
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
1269
|
+
() => (
|
|
1270
|
+
/** @type {LocalizedString} */
|
|
1271
|
+
"Gebruik de camera van je smartphone om deze QR-code te scannen"
|
|
1272
|
+
)
|
|
1273
|
+
), Te = (
|
|
1274
|
+
/** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
|
|
1275
|
+
() => (
|
|
1276
|
+
/** @type {LocalizedString} */
|
|
1277
|
+
"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen"
|
|
1278
|
+
)
|
|
1279
|
+
), Re = (
|
|
1280
|
+
/** @type {((inputs?: Controls_Qr_Modaldescription1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaldescription1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1281
|
+
((n = {}, t = {}) => {
|
|
1282
|
+
const e = t.locale ?? h();
|
|
1283
|
+
return e === "en" ? Ee() : e === "nl" ? xe() : Te();
|
|
1284
|
+
})
|
|
1285
|
+
), Ie = (
|
|
1286
|
+
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
1287
|
+
() => (
|
|
1288
|
+
/** @type {LocalizedString} */
|
|
1289
|
+
"Your phone will open the 3D model in AR mode."
|
|
1290
|
+
)
|
|
1291
|
+
), Oe = (
|
|
1292
|
+
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
1293
|
+
() => (
|
|
1294
|
+
/** @type {LocalizedString} */
|
|
1295
|
+
"Je telefoon opent het 3D-model in AR-modus."
|
|
1296
|
+
)
|
|
1297
|
+
), Ne = (
|
|
1298
|
+
/** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
|
|
1299
|
+
() => (
|
|
1300
|
+
/** @type {LocalizedString} */
|
|
1301
|
+
"Dein Telefon öffnet das 3D-Modell im AR-Modus."
|
|
1302
|
+
)
|
|
1303
|
+
), Le = (
|
|
1304
|
+
/** @type {((inputs?: Controls_Qr_Modalinstructions1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modalinstructions1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1305
|
+
((n = {}, t = {}) => {
|
|
1306
|
+
const e = t.locale ?? h();
|
|
1307
|
+
return e === "en" ? Ie() : e === "nl" ? Oe() : Ne();
|
|
1308
|
+
})
|
|
1309
|
+
), Me = (
|
|
1310
|
+
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
1311
|
+
() => (
|
|
1312
|
+
/** @type {LocalizedString} */
|
|
1313
|
+
"Close"
|
|
1314
|
+
)
|
|
1315
|
+
), ze = (
|
|
1316
|
+
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
1317
|
+
() => (
|
|
1318
|
+
/** @type {LocalizedString} */
|
|
1319
|
+
"Sluiten"
|
|
1320
|
+
)
|
|
1321
|
+
), Pe = (
|
|
1322
|
+
/** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
|
|
1323
|
+
() => (
|
|
1324
|
+
/** @type {LocalizedString} */
|
|
1325
|
+
"Schließen"
|
|
1326
|
+
)
|
|
1327
|
+
), Fe = (
|
|
1328
|
+
/** @type {((inputs?: Controls_Qr_Closebutton1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Closebutton1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1329
|
+
((n = {}, t = {}) => {
|
|
1330
|
+
const e = t.locale ?? h();
|
|
1331
|
+
return e === "en" ? Me() : e === "nl" ? ze() : Pe();
|
|
1332
|
+
})
|
|
1333
|
+
), $e = (
|
|
1334
|
+
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
1335
|
+
() => (
|
|
1336
|
+
/** @type {LocalizedString} */
|
|
1337
|
+
"Fullscreen"
|
|
1338
|
+
)
|
|
1339
|
+
), De = (
|
|
1340
|
+
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
1341
|
+
() => (
|
|
1342
|
+
/** @type {LocalizedString} */
|
|
1343
|
+
"Volledig scherm"
|
|
1344
|
+
)
|
|
1345
|
+
), Be = (
|
|
1346
|
+
/** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
|
|
1347
|
+
() => (
|
|
1348
|
+
/** @type {LocalizedString} */
|
|
1349
|
+
"Vollbild"
|
|
1350
|
+
)
|
|
1351
|
+
), Ue = (
|
|
1352
|
+
/** @type {((inputs?: Controls_Fullscreen_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Fullscreen_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1353
|
+
((n = {}, t = {}) => {
|
|
1354
|
+
const e = t.locale ?? h();
|
|
1355
|
+
return e === "en" ? $e() : e === "nl" ? De() : Be();
|
|
1356
|
+
})
|
|
1357
|
+
), Ve = (
|
|
1358
|
+
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
1359
|
+
() => (
|
|
1360
|
+
/** @type {LocalizedString} */
|
|
1361
|
+
"Downloading"
|
|
1362
|
+
)
|
|
1363
|
+
), je = (
|
|
1364
|
+
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
1365
|
+
() => (
|
|
1366
|
+
/** @type {LocalizedString} */
|
|
1367
|
+
"Downloaden"
|
|
1368
|
+
)
|
|
1369
|
+
), He = (
|
|
1370
|
+
/** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
|
|
1371
|
+
() => (
|
|
1372
|
+
/** @type {LocalizedString} */
|
|
1373
|
+
"Herunterladen"
|
|
1374
|
+
)
|
|
1375
|
+
), vt = (
|
|
1376
|
+
/** @type {((inputs?: Loading_Downloadingshort1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_Downloadingshort1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1377
|
+
((n = {}, t = {}) => {
|
|
1378
|
+
const e = t.locale ?? h();
|
|
1379
|
+
return e === "en" ? Ve() : e === "nl" ? je() : He();
|
|
1380
|
+
})
|
|
1381
|
+
), qe = (
|
|
1382
|
+
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
1383
|
+
() => (
|
|
1384
|
+
/** @type {LocalizedString} */
|
|
1385
|
+
"Rendering"
|
|
1386
|
+
)
|
|
1387
|
+
), Ge = (
|
|
1388
|
+
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
1389
|
+
() => (
|
|
1390
|
+
/** @type {LocalizedString} */
|
|
1391
|
+
"Renderen"
|
|
1392
|
+
)
|
|
1393
|
+
), Ze = (
|
|
1394
|
+
/** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
|
|
1395
|
+
() => (
|
|
1396
|
+
/** @type {LocalizedString} */
|
|
1397
|
+
"Rendern"
|
|
1398
|
+
)
|
|
1399
|
+
), We = (
|
|
1400
|
+
/** @type {((inputs?: Loading_RenderingInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_RenderingInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1401
|
+
((n = {}, t = {}) => {
|
|
1402
|
+
const e = t.locale ?? h();
|
|
1403
|
+
return e === "en" ? qe() : e === "nl" ? Ge() : Ze();
|
|
1404
|
+
})
|
|
1405
|
+
), Qe = (
|
|
1406
|
+
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
1407
|
+
() => (
|
|
1408
|
+
/** @type {LocalizedString} */
|
|
1409
|
+
"Screenshot"
|
|
1410
|
+
)
|
|
1411
|
+
), Ye = (
|
|
1412
|
+
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
1413
|
+
() => (
|
|
1414
|
+
/** @type {LocalizedString} */
|
|
1415
|
+
"Screenshot"
|
|
1416
|
+
)
|
|
1417
|
+
), Ke = (
|
|
1418
|
+
/** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
|
|
1419
|
+
() => (
|
|
1420
|
+
/** @type {LocalizedString} */
|
|
1421
|
+
"Screenshot"
|
|
1422
|
+
)
|
|
1423
|
+
), Xe = (
|
|
1424
|
+
/** @type {((inputs?: Controls_Screenshot_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Screenshot_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1425
|
+
((n = {}, t = {}) => {
|
|
1426
|
+
const e = t.locale ?? h();
|
|
1427
|
+
return e === "en" ? Qe() : e === "nl" ? Ye() : Ke();
|
|
1428
|
+
})
|
|
1429
|
+
), Je = (
|
|
1430
|
+
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
1431
|
+
() => (
|
|
1432
|
+
/** @type {LocalizedString} */
|
|
1433
|
+
"Configure"
|
|
1434
|
+
)
|
|
1435
|
+
), tn = (
|
|
1436
|
+
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
1437
|
+
() => (
|
|
1438
|
+
/** @type {LocalizedString} */
|
|
1439
|
+
"Configureren"
|
|
1440
|
+
)
|
|
1441
|
+
), en = (
|
|
1442
|
+
/** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
|
|
1443
|
+
() => (
|
|
1444
|
+
/** @type {LocalizedString} */
|
|
1445
|
+
"Konfigurieren"
|
|
1446
|
+
)
|
|
1447
|
+
), nn = (
|
|
1448
|
+
/** @type {((inputs?: Controls_Configurator_OpenInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_OpenInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1449
|
+
((n = {}, t = {}) => {
|
|
1450
|
+
const e = t.locale ?? h();
|
|
1451
|
+
return e === "en" ? Je() : e === "nl" ? tn() : en();
|
|
1452
|
+
})
|
|
1453
|
+
), on = (
|
|
1454
|
+
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
1455
|
+
() => (
|
|
1456
|
+
/** @type {LocalizedString} */
|
|
1457
|
+
"Close"
|
|
1458
|
+
)
|
|
1459
|
+
), sn = (
|
|
1460
|
+
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
1461
|
+
() => (
|
|
1462
|
+
/** @type {LocalizedString} */
|
|
1463
|
+
"Sluiten"
|
|
1464
|
+
)
|
|
1465
|
+
), rn = (
|
|
1466
|
+
/** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
|
|
1467
|
+
() => (
|
|
1468
|
+
/** @type {LocalizedString} */
|
|
1469
|
+
"Schließen"
|
|
1470
|
+
)
|
|
1471
|
+
), an = (
|
|
1472
|
+
/** @type {((inputs?: Controls_Configurator_CloseInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_CloseInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1473
|
+
((n = {}, t = {}) => {
|
|
1474
|
+
const e = t.locale ?? h();
|
|
1475
|
+
return e === "en" ? on() : e === "nl" ? sn() : rn();
|
|
1476
|
+
})
|
|
1477
|
+
), ln = (
|
|
1478
|
+
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
1479
|
+
() => (
|
|
1480
|
+
/** @type {LocalizedString} */
|
|
1481
|
+
"Reset camera"
|
|
1482
|
+
)
|
|
1483
|
+
), cn = (
|
|
1484
|
+
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
1485
|
+
() => (
|
|
1486
|
+
/** @type {LocalizedString} */
|
|
1487
|
+
"Camera resetten"
|
|
1488
|
+
)
|
|
1489
|
+
), dn = (
|
|
1490
|
+
/** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
|
|
1491
|
+
() => (
|
|
1492
|
+
/** @type {LocalizedString} */
|
|
1493
|
+
"Kamera zurücksetzen"
|
|
1494
|
+
)
|
|
1495
|
+
), un = (
|
|
1496
|
+
/** @type {((inputs?: Controls_Camera_ResetInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_ResetInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1497
|
+
((n = {}, t = {}) => {
|
|
1498
|
+
const e = t.locale ?? h();
|
|
1499
|
+
return e === "en" ? ln() : e === "nl" ? cn() : dn();
|
|
1500
|
+
})
|
|
1501
|
+
), hn = (
|
|
1502
|
+
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
1503
|
+
() => (
|
|
1504
|
+
/** @type {LocalizedString} */
|
|
1505
|
+
"Zoom in"
|
|
1506
|
+
)
|
|
1507
|
+
), mn = (
|
|
1508
|
+
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
1509
|
+
() => (
|
|
1510
|
+
/** @type {LocalizedString} */
|
|
1511
|
+
"Inzoomen"
|
|
1512
|
+
)
|
|
1513
|
+
), pn = (
|
|
1514
|
+
/** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
|
|
1515
|
+
() => (
|
|
1516
|
+
/** @type {LocalizedString} */
|
|
1517
|
+
"Hineinzoomen"
|
|
1518
|
+
)
|
|
1519
|
+
), fn = (
|
|
1520
|
+
/** @type {((inputs?: Controls_Camera_Zoomin1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomin1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1521
|
+
((n = {}, t = {}) => {
|
|
1522
|
+
const e = t.locale ?? h();
|
|
1523
|
+
return e === "en" ? hn() : e === "nl" ? mn() : pn();
|
|
1524
|
+
})
|
|
1525
|
+
), gn = (
|
|
1526
|
+
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
1527
|
+
() => (
|
|
1528
|
+
/** @type {LocalizedString} */
|
|
1529
|
+
"Zoom out"
|
|
1530
|
+
)
|
|
1531
|
+
), bn = (
|
|
1532
|
+
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
1533
|
+
() => (
|
|
1534
|
+
/** @type {LocalizedString} */
|
|
1535
|
+
"Uitzoomen"
|
|
1536
|
+
)
|
|
1537
|
+
), vn = (
|
|
1538
|
+
/** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
|
|
1539
|
+
() => (
|
|
1540
|
+
/** @type {LocalizedString} */
|
|
1541
|
+
"Herauszoomen"
|
|
1542
|
+
)
|
|
1543
|
+
), yn = (
|
|
1544
|
+
/** @type {((inputs?: Controls_Camera_Zoomout1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomout1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1545
|
+
((n = {}, t = {}) => {
|
|
1546
|
+
const e = t.locale ?? h();
|
|
1547
|
+
return e === "en" ? gn() : e === "nl" ? bn() : vn();
|
|
1548
|
+
})
|
|
1549
|
+
), wn = (
|
|
1550
|
+
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
1551
|
+
() => (
|
|
1552
|
+
/** @type {LocalizedString} */
|
|
1553
|
+
"Rotate left"
|
|
1554
|
+
)
|
|
1555
|
+
), _n = (
|
|
1556
|
+
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
1557
|
+
() => (
|
|
1558
|
+
/** @type {LocalizedString} */
|
|
1559
|
+
"Naar links draaien"
|
|
1560
|
+
)
|
|
1561
|
+
), Cn = (
|
|
1562
|
+
/** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
|
|
1563
|
+
() => (
|
|
1564
|
+
/** @type {LocalizedString} */
|
|
1565
|
+
"Nach links drehen"
|
|
1566
|
+
)
|
|
1567
|
+
), Sn = (
|
|
1568
|
+
/** @type {((inputs?: Controls_Camera_Rotateleft1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateleft1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1569
|
+
((n = {}, t = {}) => {
|
|
1570
|
+
const e = t.locale ?? h();
|
|
1571
|
+
return e === "en" ? wn() : e === "nl" ? _n() : Cn();
|
|
1572
|
+
})
|
|
1573
|
+
), kn = (
|
|
1574
|
+
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
1575
|
+
() => (
|
|
1576
|
+
/** @type {LocalizedString} */
|
|
1577
|
+
"Rotate right"
|
|
1578
|
+
)
|
|
1579
|
+
), An = (
|
|
1580
|
+
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
1581
|
+
() => (
|
|
1582
|
+
/** @type {LocalizedString} */
|
|
1583
|
+
"Naar rechts draaien"
|
|
1584
|
+
)
|
|
1585
|
+
), En = (
|
|
1586
|
+
/** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
|
|
1587
|
+
() => (
|
|
1588
|
+
/** @type {LocalizedString} */
|
|
1589
|
+
"Nach rechts drehen"
|
|
1590
|
+
)
|
|
1591
|
+
), xn = (
|
|
1592
|
+
/** @type {((inputs?: Controls_Camera_Rotateright1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateright1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1593
|
+
((n = {}, t = {}) => {
|
|
1594
|
+
const e = t.locale ?? h();
|
|
1595
|
+
return e === "en" ? kn() : e === "nl" ? An() : En();
|
|
1596
|
+
})
|
|
1597
|
+
), Tn = (
|
|
1598
|
+
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
1599
|
+
() => (
|
|
1600
|
+
/** @type {LocalizedString} */
|
|
1601
|
+
"Tilt up"
|
|
1602
|
+
)
|
|
1603
|
+
), Rn = (
|
|
1604
|
+
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
1605
|
+
() => (
|
|
1606
|
+
/** @type {LocalizedString} */
|
|
1607
|
+
"Omhoog kantelen"
|
|
1608
|
+
)
|
|
1609
|
+
), In = (
|
|
1610
|
+
/** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
|
|
1611
|
+
() => (
|
|
1612
|
+
/** @type {LocalizedString} */
|
|
1613
|
+
"Nach oben kippen"
|
|
1614
|
+
)
|
|
1615
|
+
), On = (
|
|
1616
|
+
/** @type {((inputs?: Controls_Camera_Tiltup1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltup1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1617
|
+
((n = {}, t = {}) => {
|
|
1618
|
+
const e = t.locale ?? h();
|
|
1619
|
+
return e === "en" ? Tn() : e === "nl" ? Rn() : In();
|
|
1620
|
+
})
|
|
1621
|
+
), Nn = (
|
|
1622
|
+
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
1623
|
+
() => (
|
|
1624
|
+
/** @type {LocalizedString} */
|
|
1625
|
+
"Tilt down"
|
|
1626
|
+
)
|
|
1627
|
+
), Ln = (
|
|
1628
|
+
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
1629
|
+
() => (
|
|
1630
|
+
/** @type {LocalizedString} */
|
|
1631
|
+
"Omlaag kantelen"
|
|
1632
|
+
)
|
|
1633
|
+
), Mn = (
|
|
1634
|
+
/** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
|
|
1635
|
+
() => (
|
|
1636
|
+
/** @type {LocalizedString} */
|
|
1637
|
+
"Nach unten kippen"
|
|
1638
|
+
)
|
|
1639
|
+
), zn = (
|
|
1640
|
+
/** @type {((inputs?: Controls_Camera_Tiltdown1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltdown1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1641
|
+
((n = {}, t = {}) => {
|
|
1642
|
+
const e = t.locale ?? h();
|
|
1643
|
+
return e === "en" ? Nn() : e === "nl" ? Ln() : Mn();
|
|
1644
|
+
})
|
|
1645
|
+
), Pn = (
|
|
1646
|
+
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1647
|
+
() => (
|
|
1648
|
+
/** @type {LocalizedString} */
|
|
1649
|
+
"Working…"
|
|
1650
|
+
)
|
|
1651
|
+
), Fn = (
|
|
1652
|
+
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1653
|
+
() => (
|
|
1654
|
+
/** @type {LocalizedString} */
|
|
1655
|
+
"Bezig…"
|
|
1656
|
+
)
|
|
1657
|
+
), $n = (
|
|
1658
|
+
/** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
|
|
1659
|
+
() => (
|
|
1660
|
+
/** @type {LocalizedString} */
|
|
1661
|
+
"Läuft…"
|
|
1662
|
+
)
|
|
1663
|
+
), Dn = (
|
|
1664
|
+
/** @type {((inputs?: Commerce_Submit_BusyInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_BusyInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1665
|
+
((n = {}, t = {}) => {
|
|
1666
|
+
const e = t.locale ?? h();
|
|
1667
|
+
return e === "en" ? Pn() : e === "nl" ? Fn() : $n();
|
|
1668
|
+
})
|
|
1669
|
+
), Bn = (
|
|
1670
|
+
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1671
|
+
() => (
|
|
1672
|
+
/** @type {LocalizedString} */
|
|
1673
|
+
"Done"
|
|
1674
|
+
)
|
|
1675
|
+
), Un = (
|
|
1676
|
+
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1677
|
+
() => (
|
|
1678
|
+
/** @type {LocalizedString} */
|
|
1679
|
+
"Gelukt"
|
|
1680
|
+
)
|
|
1681
|
+
), Vn = (
|
|
1682
|
+
/** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
|
|
1683
|
+
() => (
|
|
1684
|
+
/** @type {LocalizedString} */
|
|
1685
|
+
"Fertig"
|
|
1686
|
+
)
|
|
1687
|
+
), jn = (
|
|
1688
|
+
/** @type {((inputs?: Commerce_Submit_SuccessInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_SuccessInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1689
|
+
((n = {}, t = {}) => {
|
|
1690
|
+
const e = t.locale ?? h();
|
|
1691
|
+
return e === "en" ? Bn() : e === "nl" ? Un() : Vn();
|
|
1692
|
+
})
|
|
1693
|
+
), Hn = (
|
|
1694
|
+
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1695
|
+
() => (
|
|
1696
|
+
/** @type {LocalizedString} */
|
|
1697
|
+
"Failed"
|
|
1698
|
+
)
|
|
1699
|
+
), qn = (
|
|
1700
|
+
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1701
|
+
() => (
|
|
1702
|
+
/** @type {LocalizedString} */
|
|
1703
|
+
"Mislukt"
|
|
1704
|
+
)
|
|
1705
|
+
), Gn = (
|
|
1706
|
+
/** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
|
|
1707
|
+
() => (
|
|
1708
|
+
/** @type {LocalizedString} */
|
|
1709
|
+
"Fehlgeschlagen"
|
|
1710
|
+
)
|
|
1711
|
+
), Zn = (
|
|
1712
|
+
/** @type {((inputs?: Commerce_Submit_FailedInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_FailedInputs, { locale?: "en" | "nl" | "de" }, {}>} */
|
|
1713
|
+
((n = {}, t = {}) => {
|
|
1714
|
+
const e = t.locale ?? h();
|
|
1715
|
+
return e === "en" ? Hn() : e === "nl" ? qn() : Gn();
|
|
1716
|
+
})
|
|
1717
|
+
);
|
|
1718
|
+
const Wn = {
|
|
1719
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1720
|
+
width: 24,
|
|
1721
|
+
height: 24,
|
|
1722
|
+
viewBox: "0 0 24 24",
|
|
1723
|
+
fill: "none",
|
|
1724
|
+
stroke: "currentColor",
|
|
1725
|
+
"stroke-width": 2,
|
|
1726
|
+
"stroke-linecap": "round",
|
|
1727
|
+
"stroke-linejoin": "round"
|
|
1728
|
+
};
|
|
1729
|
+
const yt = ([n, t, e]) => {
|
|
1730
|
+
const i = document.createElementNS("http://www.w3.org/2000/svg", n);
|
|
1731
|
+
return Object.keys(t).forEach((o) => {
|
|
1732
|
+
i.setAttribute(o, String(t[o]));
|
|
1733
|
+
}), e?.length && e.forEach((o) => {
|
|
1734
|
+
const s = yt(o);
|
|
1735
|
+
i.appendChild(s);
|
|
1736
|
+
}), i;
|
|
1737
|
+
}, wt = (n, t = {}) => {
|
|
1738
|
+
const i = {
|
|
1739
|
+
...Wn,
|
|
1740
|
+
...t
|
|
1741
|
+
};
|
|
1742
|
+
return yt(["svg", i, n]);
|
|
1743
|
+
};
|
|
1744
|
+
const Qn = [
|
|
1745
|
+
[
|
|
1746
|
+
"path",
|
|
1747
|
+
{
|
|
1748
|
+
d: "M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"
|
|
1749
|
+
}
|
|
1750
|
+
],
|
|
1751
|
+
["path", { d: "m3.3 7 8.7 5 8.7-5" }],
|
|
1752
|
+
["path", { d: "M12 22V12" }]
|
|
1753
|
+
];
|
|
1754
|
+
const Yn = [
|
|
1755
|
+
[
|
|
1756
|
+
"path",
|
|
1757
|
+
{
|
|
1758
|
+
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"
|
|
1759
|
+
}
|
|
1760
|
+
],
|
|
1761
|
+
["circle", { cx: "12", cy: "13", r: "3" }]
|
|
1762
|
+
];
|
|
1763
|
+
const _t = [["path", { d: "m6 9 6 6 6-6" }]];
|
|
1764
|
+
const Kn = [["path", { d: "m15 18-6-6 6-6" }]];
|
|
1765
|
+
const Xn = [["path", { d: "m9 18 6-6-6-6" }]];
|
|
1766
|
+
const Jn = [["path", { d: "m18 15-6-6-6 6" }]];
|
|
1767
|
+
const ti = [
|
|
1768
|
+
["path", { d: "M15 3h6v6" }],
|
|
1769
|
+
["path", { d: "m21 3-7 7" }],
|
|
1770
|
+
["path", { d: "m3 21 7-7" }],
|
|
1771
|
+
["path", { d: "M9 21H3v-6" }]
|
|
1772
|
+
];
|
|
1773
|
+
const ei = [
|
|
1774
|
+
["path", { d: "m14 10 7-7" }],
|
|
1775
|
+
["path", { d: "M20 10h-6V4" }],
|
|
1776
|
+
["path", { d: "m3 21 7-7" }],
|
|
1777
|
+
["path", { d: "M4 14h6v6" }]
|
|
1778
|
+
];
|
|
1779
|
+
const ni = [
|
|
1780
|
+
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }],
|
|
1781
|
+
["path", { d: "M3 3v5h5" }]
|
|
1782
|
+
];
|
|
1783
|
+
const ii = [
|
|
1784
|
+
["path", { d: "M10 5H3" }],
|
|
1785
|
+
["path", { d: "M12 19H3" }],
|
|
1786
|
+
["path", { d: "M14 3v4" }],
|
|
1787
|
+
["path", { d: "M16 17v4" }],
|
|
1788
|
+
["path", { d: "M21 12h-9" }],
|
|
1789
|
+
["path", { d: "M21 19h-5" }],
|
|
1790
|
+
["path", { d: "M21 5h-7" }],
|
|
1791
|
+
["path", { d: "M8 10v4" }],
|
|
1792
|
+
["path", { d: "M8 12H3" }]
|
|
1793
|
+
];
|
|
1794
|
+
const oi = [
|
|
1795
|
+
["path", { d: "M18 6 6 18" }],
|
|
1796
|
+
["path", { d: "m6 6 12 12" }]
|
|
1797
|
+
];
|
|
1798
|
+
const si = [
|
|
1799
|
+
["circle", { cx: "11", cy: "11", r: "8" }],
|
|
1800
|
+
["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
|
|
1801
|
+
["line", { x1: "11", x2: "11", y1: "8", y2: "14" }],
|
|
1802
|
+
["line", { x1: "8", x2: "14", y1: "11", y2: "11" }]
|
|
1803
|
+
];
|
|
1804
|
+
const ri = [
|
|
1805
|
+
["circle", { cx: "11", cy: "11", r: "8" }],
|
|
1806
|
+
["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
|
|
1807
|
+
["line", { x1: "8", x2: "14", y1: "11", y2: "11" }]
|
|
1808
|
+
];
|
|
1809
|
+
function y(n, { size: t = 20, strokeWidth: e = 1.75 } = {}) {
|
|
1810
|
+
return wt(n, { width: t, height: t, "stroke-width": e });
|
|
1811
|
+
}
|
|
1812
|
+
const g = {
|
|
1813
|
+
ar: (n) => y(Qn, n),
|
|
1814
|
+
fullscreen: (n) => y(ti, n),
|
|
1815
|
+
exitFullscreen: (n) => y(ei, n),
|
|
1816
|
+
screenshot: (n) => y(Yn, n),
|
|
1817
|
+
tiltUp: (n) => y(Jn, n),
|
|
1818
|
+
tiltDown: (n) => y(_t, n),
|
|
1819
|
+
rotateLeft: (n) => y(Kn, n),
|
|
1820
|
+
rotateRight: (n) => y(Xn, n),
|
|
1821
|
+
zoomIn: (n) => y(si, n),
|
|
1822
|
+
zoomOut: (n) => y(ri, n),
|
|
1823
|
+
reset: (n) => y(ni, n),
|
|
1824
|
+
configurator: (n) => y(ii, n),
|
|
1825
|
+
close: (n) => y(oi, n)
|
|
1826
|
+
};
|
|
1827
|
+
class b {
|
|
1828
|
+
element;
|
|
1829
|
+
constructor({ variant: t = "default", size: e = "default", label: i, icon: o, onClick: s, disabled: r = !1 } = {}) {
|
|
1830
|
+
this.element = document.createElement("button"), this.element.className = `ui-btn ui-btn--${t} ui-btn--size-${e}`, i !== void 0 && (this.element.setAttribute("aria-label", i), this.element.title = i), o !== void 0 ? this.element.appendChild(o) : i !== void 0 && (this.element.textContent = i), s && this.element.addEventListener("click", s), this.element.disabled = r;
|
|
2040
1831
|
}
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
const t = ai(this.pricing.rules, this.selection);
|
|
2045
|
-
if (!(t === void 0 || t.availability === St.HIDDEN))
|
|
2046
|
-
return {
|
|
2047
|
-
attributes: { ...this.selection },
|
|
2048
|
-
reference: t.reference,
|
|
2049
|
-
price: t.priceCents,
|
|
2050
|
-
currency: this.pricing.currency,
|
|
2051
|
-
availability: t.availability
|
|
2052
|
-
};
|
|
1832
|
+
setIcon(t) {
|
|
1833
|
+
const e = this.element.querySelector("svg");
|
|
1834
|
+
e !== null ? e.replaceWith(t) : this.element.appendChild(t);
|
|
2053
1835
|
}
|
|
2054
1836
|
}
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
1837
|
+
const m = {
|
|
1838
|
+
semantic: {
|
|
1839
|
+
// eslint-disable-next-line vd-custom/enforce-error-codes -- This is a hex color, not an error code
|
|
1840
|
+
error: "#dc2626"
|
|
1841
|
+
},
|
|
1842
|
+
neutral: {
|
|
1843
|
+
500: "#737373",
|
|
1844
|
+
600: "#525252",
|
|
1845
|
+
900: "#171717"
|
|
1846
|
+
},
|
|
1847
|
+
white: "#ffffff",
|
|
1848
|
+
black: "#000000"
|
|
1849
|
+
}, a = {
|
|
1850
|
+
0: "0",
|
|
1851
|
+
0.5: "0.125rem",
|
|
1852
|
+
// 2px
|
|
1853
|
+
1: "0.25rem",
|
|
1854
|
+
// 4px
|
|
1855
|
+
1.5: "0.375rem",
|
|
1856
|
+
// 6px
|
|
1857
|
+
2: "0.5rem",
|
|
1858
|
+
// 10px
|
|
1859
|
+
3: "0.75rem",
|
|
1860
|
+
// 14px
|
|
1861
|
+
4: "1rem",
|
|
1862
|
+
// 16px
|
|
1863
|
+
5: "1.25rem",
|
|
1864
|
+
// 20px
|
|
1865
|
+
6: "1.5rem",
|
|
1866
|
+
// 28px
|
|
1867
|
+
8: "2rem",
|
|
1868
|
+
// 32px
|
|
1869
|
+
9: "2.25rem"
|
|
1870
|
+
};
|
|
1871
|
+
class ai {
|
|
1872
|
+
element;
|
|
1873
|
+
constructor() {
|
|
1874
|
+
this.element = document.createElement("div"), Object.assign(this.element.style, {
|
|
1875
|
+
background: m.white,
|
|
1876
|
+
borderRadius: a[3],
|
|
1877
|
+
padding: a[6],
|
|
1878
|
+
boxShadow: `0 ${a[2]} ${a[8]} oklch(0% 0 0 / 20%)`,
|
|
1879
|
+
maxWidth: "20rem",
|
|
1880
|
+
width: "100%"
|
|
1881
|
+
});
|
|
2067
1882
|
}
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
set(t) {
|
|
2073
|
-
if (typeof t != "string" || t.length === 0)
|
|
2074
|
-
throw f.invalidParameter(
|
|
2075
|
-
`set() requires a non-empty component name, got ${String(t)}`
|
|
2076
|
-
);
|
|
2077
|
-
this.send({ type: c.FOCUS, action: Y.FOCUS, component: t });
|
|
1883
|
+
}
|
|
1884
|
+
class li {
|
|
1885
|
+
constructor(t = {}) {
|
|
1886
|
+
this.options = t, this.card = new ai(), this.backdrop = this.createBackdrop(), this.backdrop.appendChild(this.card.element);
|
|
2078
1887
|
}
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
1888
|
+
options;
|
|
1889
|
+
card;
|
|
1890
|
+
backdrop;
|
|
1891
|
+
keyHandler = null;
|
|
1892
|
+
open() {
|
|
1893
|
+
document.body.appendChild(this.backdrop), this.keyHandler = (t) => {
|
|
1894
|
+
t.key === "Escape" && this.close();
|
|
1895
|
+
}, document.addEventListener("keydown", this.keyHandler);
|
|
2082
1896
|
}
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
* component is focused, and with null when returning to overview.
|
|
2086
|
-
*/
|
|
2087
|
-
onChange(t) {
|
|
2088
|
-
this.changeCallbacks.push(t);
|
|
1897
|
+
close() {
|
|
1898
|
+
this.backdrop.remove(), this.keyHandler !== null && (document.removeEventListener("keydown", this.keyHandler), this.keyHandler = null), this.options.onClose?.();
|
|
2089
1899
|
}
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
1900
|
+
createBackdrop() {
|
|
1901
|
+
const t = document.createElement("div");
|
|
1902
|
+
return Object.assign(t.style, {
|
|
1903
|
+
position: "fixed",
|
|
1904
|
+
inset: a[0],
|
|
1905
|
+
background: "oklch(0% 0 0 / 50%)",
|
|
1906
|
+
zIndex: "9999",
|
|
1907
|
+
display: "flex",
|
|
1908
|
+
alignItems: "center",
|
|
1909
|
+
justifyContent: "center"
|
|
1910
|
+
}), t.addEventListener("click", (e) => {
|
|
1911
|
+
e.target === t && this.close();
|
|
1912
|
+
}), t;
|
|
2097
1913
|
}
|
|
2098
1914
|
}
|
|
2099
|
-
class
|
|
2100
|
-
|
|
2101
|
-
|
|
1915
|
+
class ci {
|
|
1916
|
+
element;
|
|
1917
|
+
selectCallback = null;
|
|
1918
|
+
constructor(t, e, i) {
|
|
1919
|
+
this.element = document.createElement("div"), this.element.className = "ui-toggle-group";
|
|
1920
|
+
for (let o = 0; o < t.length; o++) {
|
|
1921
|
+
const s = t[o], r = document.createElement("button");
|
|
1922
|
+
r.className = "ui-toggle-group-item", r.dataset.value = s, r.textContent = i?.[o] ?? s, r.dataset.state = s === e ? "on" : "off", r.setAttribute("aria-pressed", s === e ? "true" : "false"), r.addEventListener("click", () => {
|
|
1923
|
+
this.selectCallback?.(s);
|
|
1924
|
+
}), this.element.appendChild(r);
|
|
1925
|
+
}
|
|
2102
1926
|
}
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
* If the photo is already developed, the callback is called immediately
|
|
2112
|
-
*
|
|
2113
|
-
* @param callback Function to call with photo data
|
|
2114
|
-
* @returns This Photo instance for chaining
|
|
2115
|
-
*/
|
|
2116
|
-
onDeveloped(t) {
|
|
2117
|
-
return this.developed && this.photoData !== null ? (t(this.photoData), this) : (this.developedCallbacks.add(t), this);
|
|
1927
|
+
setSelected(t) {
|
|
1928
|
+
for (const e of this.element.querySelectorAll(".ui-toggle-group-item")) {
|
|
1929
|
+
const i = e.dataset.value === t;
|
|
1930
|
+
e.dataset.state = i ? "on" : "off", e.setAttribute("aria-pressed", i ? "true" : "false");
|
|
1931
|
+
}
|
|
1932
|
+
}
|
|
1933
|
+
onSelect(t) {
|
|
1934
|
+
this.selectCallback = t;
|
|
2118
1935
|
}
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
1936
|
+
}
|
|
1937
|
+
class di {
|
|
1938
|
+
element;
|
|
1939
|
+
select;
|
|
1940
|
+
constructor(t, e, i, o, s) {
|
|
1941
|
+
this.select = document.createElement("select"), this.select.className = "ui-native-select", this.select.dataset.name = t, this.select.setAttribute("aria-label", i);
|
|
1942
|
+
const r = document.createElement("option");
|
|
1943
|
+
r.value = "", r.disabled = !0, r.textContent = i, this.select.appendChild(r);
|
|
1944
|
+
let l = !1;
|
|
1945
|
+
for (let d = 0; d < e.length; d++) {
|
|
1946
|
+
const p = e[d], v = document.createElement("option");
|
|
1947
|
+
v.value = p, v.textContent = s?.[d] ?? p, p === o && (v.selected = !0, l = !0), this.select.appendChild(v);
|
|
1948
|
+
}
|
|
1949
|
+
l || (r.selected = !0);
|
|
1950
|
+
const u = wt(_t, { width: 16, height: 16, "stroke-width": 2 });
|
|
1951
|
+
u.classList.add("ui-native-select-icon"), this.element = document.createElement("div"), this.element.className = "ui-native-select-wrap", this.element.appendChild(this.select), this.element.appendChild(u);
|
|
2127
1952
|
}
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
*/
|
|
2131
|
-
getFilename() {
|
|
2132
|
-
return this.filename;
|
|
1953
|
+
setSelected(t) {
|
|
1954
|
+
this.select.value = t;
|
|
2133
1955
|
}
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
develop(t) {
|
|
2139
|
-
this.developed || this.failed || (this.photoData = t, this.developed = !0, this.developedCallbacks.forEach((e) => {
|
|
2140
|
-
e(this.photoData);
|
|
2141
|
-
}), this.developedCallbacks.clear(), this.errorCallbacks.clear());
|
|
1956
|
+
onSelect(t) {
|
|
1957
|
+
this.select.addEventListener("change", () => {
|
|
1958
|
+
t(this.select.value);
|
|
1959
|
+
});
|
|
2142
1960
|
}
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
1961
|
+
}
|
|
1962
|
+
const w = {
|
|
1963
|
+
fontFamily: {
|
|
1964
|
+
sans: ["Mona Sans", "ui-sans-serif", "system-ui", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"]
|
|
1965
|
+
},
|
|
1966
|
+
fontSize: {
|
|
1967
|
+
xs: "0.75rem",
|
|
1968
|
+
// 12px
|
|
1969
|
+
sm: "0.875rem",
|
|
1970
|
+
// 14px
|
|
1971
|
+
base: "1rem",
|
|
1972
|
+
// 16px
|
|
1973
|
+
lg: "1.125rem"
|
|
1974
|
+
},
|
|
1975
|
+
fontWeight: {
|
|
1976
|
+
medium: "500",
|
|
1977
|
+
semibold: "600"
|
|
2150
1978
|
}
|
|
1979
|
+
}, x = w.fontFamily.sans.join(", "), ui = `
|
|
1980
|
+
--primary: oklch(5% 0 0);
|
|
1981
|
+
--primary-foreground: oklch(100% 0 0);
|
|
1982
|
+
--secondary: oklch(92% 0 0);
|
|
1983
|
+
--secondary-foreground: oklch(5% 0 0);
|
|
1984
|
+
--background: oklch(100% 0 0);
|
|
1985
|
+
--foreground: oklch(5% 0 0);
|
|
1986
|
+
--border: oklch(92% 0 0);
|
|
1987
|
+
--ring: oklch(44% 0 0);
|
|
1988
|
+
--radius: 0.625rem;
|
|
1989
|
+
--accent: oklch(92% 0 0);
|
|
1990
|
+
--accent-foreground: oklch(5% 0 0);
|
|
1991
|
+
--muted-foreground: oklch(44% 0 0);
|
|
1992
|
+
`, hi = `
|
|
1993
|
+
:root { ${ui} }
|
|
1994
|
+
|
|
1995
|
+
/* ── Button ──────────────────────────────────────────────── */
|
|
1996
|
+
.ui-btn {
|
|
1997
|
+
display: inline-flex;
|
|
1998
|
+
align-items: center;
|
|
1999
|
+
justify-content: center;
|
|
2000
|
+
gap: 0.5rem;
|
|
2001
|
+
border: 1px solid transparent;
|
|
2002
|
+
border-radius: var(--radius);
|
|
2003
|
+
font-family: ${x};
|
|
2004
|
+
font-size: 0.875rem;
|
|
2005
|
+
font-weight: 600;
|
|
2006
|
+
white-space: nowrap;
|
|
2007
|
+
cursor: pointer;
|
|
2008
|
+
transition: all 200ms;
|
|
2009
|
+
flex-shrink: 0;
|
|
2010
|
+
}
|
|
2011
|
+
.ui-btn:active { transform: scale(0.98); }
|
|
2012
|
+
.ui-btn:disabled { opacity: 0.5; pointer-events: none; }
|
|
2013
|
+
.ui-btn svg { inline-size: 1rem; block-size: 1rem; pointer-events: none; flex-shrink: 0; }
|
|
2014
|
+
|
|
2015
|
+
.ui-btn--default {
|
|
2016
|
+
background: var(--primary);
|
|
2017
|
+
color: var(--primary-foreground);
|
|
2018
|
+
box-shadow: 0 1px 3px oklch(5% 0 0 / 20%);
|
|
2019
|
+
}
|
|
2020
|
+
.ui-btn--default:hover { background: oklch(10% 0 0); }
|
|
2021
|
+
|
|
2022
|
+
.ui-btn--outline {
|
|
2023
|
+
background: var(--background);
|
|
2024
|
+
color: var(--foreground);
|
|
2025
|
+
border-color: var(--border);
|
|
2026
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
2027
|
+
}
|
|
2028
|
+
.ui-btn--outline:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
2029
|
+
|
|
2030
|
+
.ui-btn--secondary {
|
|
2031
|
+
background: var(--secondary);
|
|
2032
|
+
color: var(--secondary-foreground);
|
|
2033
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
2034
|
+
}
|
|
2035
|
+
.ui-btn--secondary:hover { background: oklch(88% 0 0); }
|
|
2036
|
+
|
|
2037
|
+
.ui-btn--ghost { background: transparent; color: var(--foreground); }
|
|
2038
|
+
.ui-btn--ghost:hover { background: var(--accent); }
|
|
2039
|
+
|
|
2040
|
+
.ui-btn--size-default { block-size: 2.25rem; padding: 0 1rem; }
|
|
2041
|
+
.ui-btn--size-sm { block-size: 2rem; padding: 0 0.75rem; border-radius: calc(var(--radius) - 0.125rem); }
|
|
2042
|
+
.ui-btn--size-lg { block-size: 2.5rem; padding: 0 1.5rem; }
|
|
2043
|
+
.ui-btn--size-icon { inline-size: 2.25rem; block-size: 2.25rem; padding: 0; }
|
|
2044
|
+
.ui-btn--size-icon-sm { inline-size: 2rem; block-size: 2rem; padding: 0; }
|
|
2045
|
+
.ui-btn--size-icon-lg { inline-size: 2.5rem; block-size: 2.5rem; padding: 0; }
|
|
2046
|
+
|
|
2047
|
+
/* ── Toggle group ────────────────────────────────────────── */
|
|
2048
|
+
.ui-toggle-group { display: inline-flex; flex-wrap: wrap; gap: 0.25rem; }
|
|
2049
|
+
|
|
2050
|
+
.ui-toggle-group-item {
|
|
2051
|
+
display: inline-flex;
|
|
2052
|
+
align-items: center;
|
|
2053
|
+
justify-content: center;
|
|
2054
|
+
block-size: 2rem;
|
|
2055
|
+
padding: 0 0.75rem;
|
|
2056
|
+
border: 1px solid var(--border);
|
|
2057
|
+
border-radius: var(--radius);
|
|
2058
|
+
background: var(--background);
|
|
2059
|
+
color: var(--foreground);
|
|
2060
|
+
font-family: ${x};
|
|
2061
|
+
font-size: 0.875rem;
|
|
2062
|
+
font-weight: 600;
|
|
2063
|
+
cursor: pointer;
|
|
2064
|
+
white-space: nowrap;
|
|
2065
|
+
transition: all 200ms;
|
|
2066
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
2067
|
+
}
|
|
2068
|
+
.ui-toggle-group-item:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
2069
|
+
.ui-toggle-group-item:active { transform: scale(0.98); }
|
|
2070
|
+
.ui-toggle-group-item:focus-visible {
|
|
2071
|
+
outline: none;
|
|
2072
|
+
border-color: var(--ring);
|
|
2073
|
+
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
2074
|
+
}
|
|
2075
|
+
.ui-toggle-group-item[data-state="on"] {
|
|
2076
|
+
background: var(--primary);
|
|
2077
|
+
color: var(--primary-foreground);
|
|
2078
|
+
border-color: var(--primary);
|
|
2079
|
+
}
|
|
2080
|
+
.ui-toggle-group-item[data-state="on"]:hover { background: oklch(10% 0 0); }
|
|
2081
|
+
|
|
2082
|
+
/* ── Native select ───────────────────────────────────────── */
|
|
2083
|
+
.ui-native-select-wrap {
|
|
2084
|
+
position: relative;
|
|
2085
|
+
display: inline-flex;
|
|
2086
|
+
min-inline-size: 8rem;
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
.ui-native-select {
|
|
2090
|
+
display: block;
|
|
2091
|
+
inline-size: 100%;
|
|
2092
|
+
block-size: 2.25rem;
|
|
2093
|
+
padding: 0 2.25rem 0 0.75rem;
|
|
2094
|
+
border: 1px solid var(--border);
|
|
2095
|
+
border-radius: var(--radius);
|
|
2096
|
+
background: var(--background);
|
|
2097
|
+
appearance: none;
|
|
2098
|
+
color: var(--foreground);
|
|
2099
|
+
font-family: ${x};
|
|
2100
|
+
font-size: 0.875rem;
|
|
2101
|
+
font-weight: 400;
|
|
2102
|
+
cursor: pointer;
|
|
2103
|
+
transition: color 200ms, box-shadow 200ms, border-color 200ms;
|
|
2104
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
2105
|
+
}
|
|
2106
|
+
.ui-native-select:hover { border-color: oklch(85% 0 0); }
|
|
2107
|
+
.ui-native-select:focus-visible {
|
|
2108
|
+
outline: none;
|
|
2109
|
+
border-color: var(--ring);
|
|
2110
|
+
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
2111
|
+
}
|
|
2112
|
+
|
|
2113
|
+
.ui-native-select-icon {
|
|
2114
|
+
position: absolute;
|
|
2115
|
+
inset-block-start: 50%;
|
|
2116
|
+
inset-inline-end: 0.625rem;
|
|
2117
|
+
transform: translateY(-50%);
|
|
2118
|
+
color: var(--muted-foreground);
|
|
2119
|
+
pointer-events: none;
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
/* ── Annotation layer ───────────────────────────────────── */
|
|
2123
|
+
.vd-annotations-layer {
|
|
2124
|
+
position: absolute;
|
|
2125
|
+
inset-block-start: 0;
|
|
2126
|
+
inset-inline-start: 0;
|
|
2127
|
+
inline-size: 100%;
|
|
2128
|
+
block-size: 100%;
|
|
2129
|
+
pointer-events: none;
|
|
2130
|
+
overflow: visible !important; /* override CSS2DRenderer inline style */
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2133
|
+
.vd-annotation-anchor {
|
|
2134
|
+
position: relative;
|
|
2135
|
+
}
|
|
2136
|
+
|
|
2137
|
+
.vd-annotation-marker {
|
|
2138
|
+
display: flex;
|
|
2139
|
+
align-items: center;
|
|
2140
|
+
justify-content: center;
|
|
2141
|
+
inline-size: 1.75rem;
|
|
2142
|
+
block-size: 1.75rem;
|
|
2143
|
+
border-radius: 50%;
|
|
2144
|
+
border: 2px solid oklch(100% 0 0);
|
|
2145
|
+
background: var(--primary);
|
|
2146
|
+
color: var(--primary-foreground);
|
|
2147
|
+
font-family: ${x};
|
|
2148
|
+
font-size: 0.8125rem;
|
|
2149
|
+
font-weight: 600;
|
|
2150
|
+
cursor: pointer;
|
|
2151
|
+
pointer-events: auto;
|
|
2152
|
+
box-shadow: 0 2px 8px oklch(5% 0 0 / 20%);
|
|
2153
|
+
transition: transform 100ms ease;
|
|
2154
|
+
position: relative;
|
|
2155
|
+
}
|
|
2156
|
+
.vd-annotation-marker:hover { transform: scale(1.1); }
|
|
2157
|
+
.vd-annotation-marker:focus-visible {
|
|
2158
|
+
outline: 2px solid var(--ring);
|
|
2159
|
+
outline-offset: 2px;
|
|
2160
|
+
}
|
|
2161
|
+
|
|
2162
|
+
.vd-annotation-popup {
|
|
2163
|
+
position: absolute;
|
|
2164
|
+
inset-block-end: calc(100% + 0.5rem);
|
|
2165
|
+
inset-inline-start: 50%;
|
|
2166
|
+
transform: translateX(-50%);
|
|
2167
|
+
background: var(--background);
|
|
2168
|
+
color: var(--foreground);
|
|
2169
|
+
border: 1px solid var(--border);
|
|
2170
|
+
border-radius: var(--radius);
|
|
2171
|
+
padding: 0.75rem 1rem;
|
|
2172
|
+
max-inline-size: 15rem;
|
|
2173
|
+
box-shadow: 0 4px 6px oklch(5% 0 0 / 8%), 0 2px 4px oklch(5% 0 0 / 6%);
|
|
2174
|
+
pointer-events: auto;
|
|
2175
|
+
white-space: normal;
|
|
2151
2176
|
}
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2177
|
+
.vd-annotation-popup:focus { outline: none; }
|
|
2178
|
+
|
|
2179
|
+
.vd-annotation-popup-close {
|
|
2180
|
+
position: absolute;
|
|
2181
|
+
inset-block-start: 0.375rem;
|
|
2182
|
+
inset-inline-end: 0.375rem;
|
|
2183
|
+
display: flex;
|
|
2184
|
+
align-items: center;
|
|
2185
|
+
justify-content: center;
|
|
2186
|
+
inline-size: 1.25rem;
|
|
2187
|
+
block-size: 1.25rem;
|
|
2188
|
+
padding: 0;
|
|
2189
|
+
border: none;
|
|
2190
|
+
border-radius: calc(var(--radius) - 4px);
|
|
2191
|
+
background: transparent;
|
|
2192
|
+
color: var(--muted-foreground);
|
|
2193
|
+
cursor: pointer;
|
|
2194
|
+
pointer-events: auto;
|
|
2195
|
+
}
|
|
2196
|
+
.vd-annotation-popup-close:hover {
|
|
2197
|
+
color: var(--foreground);
|
|
2198
|
+
background: var(--secondary);
|
|
2199
|
+
}
|
|
2200
|
+
.vd-annotation-popup-close:focus-visible {
|
|
2201
|
+
outline: 2px solid var(--ring);
|
|
2202
|
+
outline-offset: 1px;
|
|
2203
|
+
}
|
|
2204
|
+
.vd-annotation-popup-close svg {
|
|
2205
|
+
inline-size: 0.875rem;
|
|
2206
|
+
block-size: 0.875rem;
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2210
|
+
.vd-annotation-popup {
|
|
2211
|
+
animation: vd-popup-in 150ms ease;
|
|
2156
2212
|
}
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
@keyframes vd-popup-in {
|
|
2216
|
+
from { opacity: 0; transform: translateX(-50%) translateY(4px); }
|
|
2217
|
+
to { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
.vd-annotation-popup-title {
|
|
2221
|
+
font-family: ${x};
|
|
2222
|
+
font-size: 0.875rem;
|
|
2223
|
+
font-weight: 600;
|
|
2224
|
+
line-height: 1.25rem;
|
|
2225
|
+
/* Keep the title clear of the absolutely positioned close button. */
|
|
2226
|
+
padding-inline-end: 1.5rem;
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2229
|
+
.vd-annotation-popup-description {
|
|
2230
|
+
font-family: ${x};
|
|
2231
|
+
font-size: 0.8125rem;
|
|
2232
|
+
font-weight: 400;
|
|
2233
|
+
line-height: 1.125rem;
|
|
2234
|
+
color: var(--muted-foreground);
|
|
2235
|
+
margin-block-start: 0.25rem;
|
|
2236
|
+
}
|
|
2237
|
+
|
|
2238
|
+
/* ── QR modal ────────────────────────────────────────────── */
|
|
2239
|
+
/* The slot the QR renders into. While loading it is a calm pulsing
|
|
2240
|
+
placeholder of the same size, so the modal opens instantly and the QR
|
|
2241
|
+
swaps in without any layout shift. */
|
|
2242
|
+
.ui-qr-slot {
|
|
2243
|
+
inline-size: 6rem;
|
|
2244
|
+
block-size: 6rem;
|
|
2245
|
+
border-radius: 0.25rem;
|
|
2246
|
+
overflow: hidden;
|
|
2247
|
+
}
|
|
2248
|
+
|
|
2249
|
+
.ui-qr-slot img {
|
|
2250
|
+
inline-size: 100%;
|
|
2251
|
+
block-size: 100%;
|
|
2252
|
+
display: block;
|
|
2253
|
+
}
|
|
2254
|
+
|
|
2255
|
+
.ui-qr-slot--loading {
|
|
2256
|
+
background: var(--secondary);
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2259
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2260
|
+
.ui-qr-slot--loading {
|
|
2261
|
+
animation: vd-qr-pulse 1.6s ease-in-out infinite;
|
|
2179
2262
|
}
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
@keyframes vd-qr-pulse {
|
|
2266
|
+
0%, 100% { opacity: 1; }
|
|
2267
|
+
50% { opacity: 0.55; }
|
|
2268
|
+
}
|
|
2269
|
+
`;
|
|
2270
|
+
let it = !1;
|
|
2271
|
+
function Ct() {
|
|
2272
|
+
if (it || typeof document > "u")
|
|
2273
|
+
return;
|
|
2274
|
+
it = !0;
|
|
2275
|
+
const n = document.createElement("style");
|
|
2276
|
+
n.id = "vd-ui-vanilla", n.textContent = hi, document.head.appendChild(n);
|
|
2277
|
+
}
|
|
2278
|
+
const mi = w.fontFamily.sans.join(", ");
|
|
2279
|
+
class pi {
|
|
2280
|
+
qrLib = null;
|
|
2281
|
+
dialog = null;
|
|
2282
|
+
qrSlot = null;
|
|
2283
|
+
/** Open the modal immediately, with a loading placeholder in the QR slot. */
|
|
2284
|
+
show() {
|
|
2285
|
+
this.hide(), Ct(), this.dialog = new li({ onClose: () => {
|
|
2286
|
+
this.dialog = null, this.qrSlot = null;
|
|
2287
|
+
} }), Object.assign(this.dialog.card.element.style, {
|
|
2288
|
+
display: "flex",
|
|
2289
|
+
flexDirection: "column",
|
|
2290
|
+
alignItems: "center",
|
|
2291
|
+
gap: a[3],
|
|
2292
|
+
fontFamily: mi
|
|
2293
|
+
}), this.dialog.card.element.appendChild(this.createText(Ae(), {
|
|
2294
|
+
fontSize: w.fontSize.base,
|
|
2295
|
+
fontWeight: w.fontWeight.semibold,
|
|
2296
|
+
color: m.neutral[900]
|
|
2297
|
+
})), this.dialog.card.element.appendChild(this.createText(Re(), {
|
|
2298
|
+
fontSize: w.fontSize.sm,
|
|
2299
|
+
color: m.neutral[600]
|
|
2300
|
+
})), this.qrSlot = this.createQrSlot(), this.dialog.card.element.appendChild(this.qrSlot), this.dialog.card.element.appendChild(this.createText(Le(), {
|
|
2301
|
+
fontSize: w.fontSize.xs,
|
|
2302
|
+
color: m.neutral[500]
|
|
2303
|
+
}));
|
|
2304
|
+
const t = new b({
|
|
2305
|
+
variant: "outline",
|
|
2306
|
+
label: Fe(),
|
|
2307
|
+
onClick: () => {
|
|
2308
|
+
this.hide();
|
|
2309
|
+
}
|
|
2310
|
+
});
|
|
2311
|
+
this.dialog.card.element.appendChild(t.element), this.dialog.open();
|
|
2200
2312
|
}
|
|
2201
2313
|
/**
|
|
2202
|
-
*
|
|
2203
|
-
*
|
|
2204
|
-
*
|
|
2314
|
+
* Render the QR for `url` into the open modal's slot, replacing the loading
|
|
2315
|
+
* placeholder. Resolves `true` once the QR is actually on screen; `false`
|
|
2316
|
+
* when the modal was closed before it could render (nothing reopens).
|
|
2205
2317
|
*/
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
this.pendingPhotos.clear();
|
|
2318
|
+
async update(t) {
|
|
2319
|
+
this.qrLib ??= await import("./browser-ey6Iih3j.js").then((i) => i.b);
|
|
2320
|
+
const e = await this.qrLib.toDataURL(t, {
|
|
2321
|
+
width: 256,
|
|
2322
|
+
margin: 4,
|
|
2323
|
+
errorCorrectionLevel: "M",
|
|
2324
|
+
color: { dark: m.black, light: m.white }
|
|
2325
|
+
});
|
|
2326
|
+
return this.qrSlot === null ? !1 : (this.qrSlot.classList.remove("ui-qr-slot--loading"), this.qrSlot.replaceChildren(this.createQrImage(e)), !0);
|
|
2216
2327
|
}
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
*/
|
|
2220
|
-
validateFilename(t) {
|
|
2221
|
-
if (t === "" || typeof t != "string")
|
|
2222
|
-
throw new f(
|
|
2223
|
-
"Filename must be a non-empty string",
|
|
2224
|
-
E.INVALID_PARAMETER
|
|
2225
|
-
);
|
|
2226
|
-
if (!this.validExtensions.some(
|
|
2227
|
-
(i) => t.toLowerCase().endsWith(i)
|
|
2228
|
-
))
|
|
2229
|
-
throw new f(
|
|
2230
|
-
`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,
|
|
2231
|
-
E.INVALID_PARAMETER
|
|
2232
|
-
);
|
|
2233
|
-
if (t.includes("..") || t.includes("/") || t.includes("\\"))
|
|
2234
|
-
throw new f(
|
|
2235
|
-
'Filename cannot contain path separators or ".."',
|
|
2236
|
-
E.INVALID_PARAMETER
|
|
2237
|
-
);
|
|
2328
|
+
hide() {
|
|
2329
|
+
this.dialog?.close(), this.dialog = null, this.qrSlot = null;
|
|
2238
2330
|
}
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
attach(t) {
|
|
2243
|
-
this.container = t;
|
|
2331
|
+
createText(t, e) {
|
|
2332
|
+
const i = document.createElement("p");
|
|
2333
|
+
return i.textContent = t, Object.assign(i.style, { margin: "0", textAlign: "center", ...e }), i;
|
|
2244
2334
|
}
|
|
2245
|
-
|
|
2246
|
-
const
|
|
2247
|
-
return
|
|
2335
|
+
createQrSlot() {
|
|
2336
|
+
const t = document.createElement("div");
|
|
2337
|
+
return t.className = "ui-qr-slot ui-qr-slot--loading", t;
|
|
2248
2338
|
}
|
|
2249
|
-
|
|
2250
|
-
const
|
|
2251
|
-
|
|
2252
|
-
s.preventDefault();
|
|
2253
|
-
} };
|
|
2254
|
-
e(r);
|
|
2255
|
-
};
|
|
2256
|
-
return this.container?.addEventListener(t, i), () => {
|
|
2257
|
-
this.container?.removeEventListener(t, i);
|
|
2258
|
-
};
|
|
2339
|
+
createQrImage(t) {
|
|
2340
|
+
const e = document.createElement("img");
|
|
2341
|
+
return e.src = t, e.alt = "QR code", e;
|
|
2259
2342
|
}
|
|
2260
2343
|
}
|
|
2261
|
-
function y(n, { size: t = 20, strokeWidth: e = 1.75 } = {}) {
|
|
2262
|
-
return ct(n, { width: t, height: t, "stroke-width": e });
|
|
2263
|
-
}
|
|
2264
|
-
const b = {
|
|
2265
|
-
ar: (n) => y(Dt, n),
|
|
2266
|
-
fullscreen: (n) => y(Ht, n),
|
|
2267
|
-
exitFullscreen: (n) => y(Gt, n),
|
|
2268
|
-
screenshot: (n) => y(Bt, n),
|
|
2269
|
-
tiltUp: (n) => y(jt, n),
|
|
2270
|
-
tiltDown: (n) => y(ut, n),
|
|
2271
|
-
rotateLeft: (n) => y(Ut, n),
|
|
2272
|
-
rotateRight: (n) => y(Vt, n),
|
|
2273
|
-
zoomIn: (n) => y(Yt, n),
|
|
2274
|
-
zoomOut: (n) => y(Xt, n),
|
|
2275
|
-
reset: (n) => y(qt, n),
|
|
2276
|
-
configurator: (n) => y(Zt, n),
|
|
2277
|
-
close: (n) => y(Wt, n)
|
|
2278
|
-
};
|
|
2279
2344
|
function ot(n) {
|
|
2280
2345
|
const t = Math.max(0, Math.min(1, n));
|
|
2281
2346
|
return t * t * (3 - 2 * t);
|
|
2282
2347
|
}
|
|
2283
|
-
function
|
|
2284
|
-
const [r, l,
|
|
2348
|
+
function fi(n, t, e, i, o, s) {
|
|
2349
|
+
const [r, l, u] = n, d = Math.cos(t), p = Math.sin(t), v = d * r + p * u, E = -p * r + d * u, k = Math.cos(e), S = Math.sin(e), R = k * l - S * E, M = S * l + k * E, W = 0.55;
|
|
2285
2350
|
return [i + v * s * W, o - R * s * W, M];
|
|
2286
2351
|
}
|
|
2287
|
-
function
|
|
2352
|
+
function gi(n, t, e) {
|
|
2288
2353
|
n.beginPath(), n.moveTo(t[0], t[1]), n.lineTo(e[0], e[1]), n.strokeStyle = "#000", n.lineWidth = 2, n.stroke();
|
|
2289
2354
|
}
|
|
2290
|
-
function
|
|
2355
|
+
function bi(n, t, e, i, o) {
|
|
2291
2356
|
const s = t(e), r = t(i), l = [
|
|
2292
2357
|
s[0] + (r[0] - s[0]) * o,
|
|
2293
2358
|
s[1] + (r[1] - s[1]) * o,
|
|
2294
2359
|
s[2]
|
|
2295
2360
|
];
|
|
2296
|
-
|
|
2361
|
+
gi(n, s, l);
|
|
2297
2362
|
}
|
|
2298
|
-
const z = [-1, -1, 1],
|
|
2299
|
-
[z,
|
|
2300
|
-
[
|
|
2301
|
-
[
|
|
2363
|
+
const z = [-1, -1, 1], P = [1, -1, 1], F = [1, -1, -1], $ = [-1, -1, -1], D = [-1, 1, 1], B = [1, 1, 1], U = [1, 1, -1], V = [-1, 1, -1], st = [
|
|
2364
|
+
[z, P],
|
|
2365
|
+
[P, F],
|
|
2366
|
+
[F, $],
|
|
2302
2367
|
[$, z],
|
|
2303
2368
|
[z, D],
|
|
2304
|
-
[
|
|
2305
|
-
[
|
|
2369
|
+
[P, B],
|
|
2370
|
+
[F, U],
|
|
2306
2371
|
[$, V],
|
|
2307
2372
|
[D, B],
|
|
2308
2373
|
[B, U],
|
|
2309
2374
|
[U, V],
|
|
2310
2375
|
[V, D]
|
|
2311
|
-
],
|
|
2312
|
-
function
|
|
2376
|
+
], vi = 400, rt = '-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';
|
|
2377
|
+
function yi() {
|
|
2313
2378
|
const n = document.createElement("div");
|
|
2314
2379
|
Object.assign(n.style, {
|
|
2315
2380
|
position: "absolute",
|
|
@@ -2352,9 +2417,9 @@ function vi() {
|
|
|
2352
2417
|
fontSize: "13px",
|
|
2353
2418
|
color: "#000",
|
|
2354
2419
|
fontFamily: rt
|
|
2355
|
-
}), o.textContent =
|
|
2420
|
+
}), o.textContent = vt(), e.appendChild(i), e.appendChild(o), n.appendChild(t), n.appendChild(e), { overlay: n, canvas: t, pctEl: i, phaseEl: o };
|
|
2356
2421
|
}
|
|
2357
|
-
class
|
|
2422
|
+
class wi {
|
|
2358
2423
|
overlay;
|
|
2359
2424
|
canvas;
|
|
2360
2425
|
ctx;
|
|
@@ -2367,17 +2432,17 @@ class yi {
|
|
|
2367
2432
|
visible = !1;
|
|
2368
2433
|
constructor(t, e = {}) {
|
|
2369
2434
|
this.startTime = performance.now();
|
|
2370
|
-
const i =
|
|
2435
|
+
const i = yi();
|
|
2371
2436
|
this.overlay = i.overlay, this.canvas = i.canvas, this.pctEl = i.pctEl, this.phaseEl = i.phaseEl, t.appendChild(this.overlay), this.ctx = this.canvas.getContext("2d"), this.ctx !== null && (this.sizeCanvas(), this.tick());
|
|
2372
|
-
const o = e.showDelay ??
|
|
2437
|
+
const o = e.showDelay ?? vi;
|
|
2373
2438
|
this.showTimerId = setTimeout(() => {
|
|
2374
2439
|
this.reveal();
|
|
2375
2440
|
}, o);
|
|
2376
2441
|
}
|
|
2377
2442
|
get loadingTexts() {
|
|
2378
2443
|
return {
|
|
2379
|
-
downloading:
|
|
2380
|
-
rendering:
|
|
2444
|
+
downloading: vt(),
|
|
2445
|
+
rendering: We()
|
|
2381
2446
|
};
|
|
2382
2447
|
}
|
|
2383
2448
|
updateProgress(t, e) {
|
|
@@ -2430,15 +2495,15 @@ class yi {
|
|
|
2430
2495
|
return;
|
|
2431
2496
|
const t = this.canvas.width / Math.min(devicePixelRatio, 2), e = this.canvas.height / Math.min(devicePixelRatio, 2), i = (performance.now() - this.startTime) / 1e3;
|
|
2432
2497
|
this.ctx.fillStyle = "#fff", this.ctx.fillRect(0, 0, t, e);
|
|
2433
|
-
const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, l = 0.785,
|
|
2434
|
-
let
|
|
2435
|
-
v < 0.35 ?
|
|
2436
|
-
for (let
|
|
2437
|
-
const R = st[
|
|
2498
|
+
const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, l = 0.785, u = 0.615, d = (S) => fi(S, l, u, o, s, r), p = 6, v = i % p / p, E = st.length;
|
|
2499
|
+
let k;
|
|
2500
|
+
v < 0.35 ? k = ot(v / 0.35) * E : v < 0.55 ? k = E : v < 0.9 ? k = (1 - ot((v - 0.55) / 0.35)) * E : k = 0, this.ctx.shadowBlur = 5, this.ctx.shadowColor = "rgba(30,30,30,0.08)";
|
|
2501
|
+
for (let S = 0; S < E && !(S >= k); S++) {
|
|
2502
|
+
const R = st[S];
|
|
2438
2503
|
if (R === void 0)
|
|
2439
2504
|
continue;
|
|
2440
|
-
const M = Math.min(1,
|
|
2441
|
-
|
|
2505
|
+
const M = Math.min(1, k - S);
|
|
2506
|
+
bi(this.ctx, d, R[0], R[1], M);
|
|
2442
2507
|
}
|
|
2443
2508
|
this.ctx.shadowBlur = 0;
|
|
2444
2509
|
}
|
|
@@ -2455,7 +2520,7 @@ class _i {
|
|
|
2455
2520
|
fullscreenBtn = null;
|
|
2456
2521
|
onFullscreenChange;
|
|
2457
2522
|
setFullscreenIcon(t) {
|
|
2458
|
-
this.fullscreenBtn !== null && this.fullscreenBtn.setIcon(t ?
|
|
2523
|
+
this.fullscreenBtn !== null && this.fullscreenBtn.setIcon(t ? g.exitFullscreen() : g.fullscreen());
|
|
2459
2524
|
}
|
|
2460
2525
|
syncButton(t, e, i) {
|
|
2461
2526
|
if (e && t === null) {
|
|
@@ -2465,19 +2530,19 @@ class _i {
|
|
|
2465
2530
|
return !e && t !== null ? (t.element.remove(), null) : t;
|
|
2466
2531
|
}
|
|
2467
2532
|
applySettings(t) {
|
|
2468
|
-
this.arBtn = this.syncButton(this.arBtn, t.ar !== !1 && this.options.onAr !== void 0, () => new
|
|
2533
|
+
this.arBtn = this.syncButton(this.arBtn, t.ar !== !1 && this.options.onAr !== void 0, () => new b({
|
|
2469
2534
|
variant: "outline",
|
|
2470
2535
|
size: "icon",
|
|
2471
|
-
label:
|
|
2472
|
-
icon:
|
|
2536
|
+
label: _e(),
|
|
2537
|
+
icon: g.ar(),
|
|
2473
2538
|
onClick: () => {
|
|
2474
2539
|
this.options.onAr?.();
|
|
2475
2540
|
}
|
|
2476
|
-
})), this.fullscreenBtn = this.syncButton(this.fullscreenBtn, t.fullscreen !== !1 && this.options.onFullscreen !== void 0, () => new
|
|
2541
|
+
})), this.fullscreenBtn = this.syncButton(this.fullscreenBtn, t.fullscreen !== !1 && this.options.onFullscreen !== void 0, () => new b({
|
|
2477
2542
|
variant: "outline",
|
|
2478
2543
|
size: "icon",
|
|
2479
|
-
label:
|
|
2480
|
-
icon:
|
|
2544
|
+
label: Ue(),
|
|
2545
|
+
icon: g.fullscreen(),
|
|
2481
2546
|
onClick: () => {
|
|
2482
2547
|
this.options.onFullscreen?.();
|
|
2483
2548
|
}
|
|
@@ -2497,9 +2562,9 @@ class L {
|
|
|
2497
2562
|
targetTilt: e.tilt,
|
|
2498
2563
|
targetZoom: e.zoom,
|
|
2499
2564
|
thetaOffset: 0
|
|
2500
|
-
}, o =
|
|
2565
|
+
}, o = Ci(t, e, i);
|
|
2501
2566
|
e.onChange((s) => {
|
|
2502
|
-
i.targetRotation = s.rotation - i.thetaOffset, i.targetTilt = s.tilt, i.targetZoom = s.zoom,
|
|
2567
|
+
i.targetRotation = s.rotation - i.thetaOffset, i.targetTilt = s.tilt, i.targetZoom = s.zoom, Si(o, e, s);
|
|
2503
2568
|
}), this.element.appendChild(L.buildZoom(o.zoomOut, o.zoomIn)), this.element.appendChild(L.buildDpad(o.tiltUp, o.rotateLeft, o.reset, o.rotateRight, o.tiltDown));
|
|
2504
2569
|
}
|
|
2505
2570
|
static buildZoom(t, e) {
|
|
@@ -2509,55 +2574,55 @@ class L {
|
|
|
2509
2574
|
static buildDpad(t, e, i, o, s) {
|
|
2510
2575
|
const r = document.createElement("div");
|
|
2511
2576
|
r.className = "vd-dpad";
|
|
2512
|
-
for (const [l,
|
|
2577
|
+
for (const [l, u] of [
|
|
2513
2578
|
[t, "up"],
|
|
2514
2579
|
[e, "left"],
|
|
2515
2580
|
[i, "center"],
|
|
2516
2581
|
[o, "right"],
|
|
2517
2582
|
[s, "down"]
|
|
2518
2583
|
])
|
|
2519
|
-
l.element.classList.add(`vd-dpad-${
|
|
2584
|
+
l.element.classList.add(`vd-dpad-${u}`), r.appendChild(l.element);
|
|
2520
2585
|
return r;
|
|
2521
2586
|
}
|
|
2522
2587
|
}
|
|
2523
|
-
function
|
|
2588
|
+
function Ci(n, t, e) {
|
|
2524
2589
|
const i = (r) => Math.max(t.limits?.minZoom ?? 1, Math.min(t.limits?.maxZoom ?? 1 / 0, r)), o = (r) => {
|
|
2525
|
-
const l = t.limits?.minRotate,
|
|
2526
|
-
return l !== void 0 ||
|
|
2590
|
+
const l = t.limits?.minRotate, u = t.limits?.maxRotate;
|
|
2591
|
+
return l !== void 0 || u !== void 0 ? Math.max(l ?? -1 / 0, Math.min(u ?? 1 / 0, r)) : r;
|
|
2527
2592
|
}, s = (r) => {
|
|
2528
|
-
const l = t.limits?.minTilt,
|
|
2529
|
-
if (l !== void 0 ||
|
|
2530
|
-
e.targetTilt = Math.max(l ?? 0, Math.min(
|
|
2593
|
+
const l = t.limits?.minTilt, u = t.limits?.maxTilt;
|
|
2594
|
+
if (l !== void 0 || u !== void 0) {
|
|
2595
|
+
e.targetTilt = Math.max(l ?? 0, Math.min(u ?? 180, e.targetTilt + r)), n.tilt(e.targetTilt).set();
|
|
2531
2596
|
return;
|
|
2532
2597
|
}
|
|
2533
|
-
const
|
|
2534
|
-
|
|
2598
|
+
const d = e.targetTilt + r;
|
|
2599
|
+
d > 180 || d < 0 ? (e.targetTilt = d > 180 ? 360 - d : -d, e.thetaOffset = (e.thetaOffset + 180) % 360, n.tilt(e.targetTilt).rotate(e.targetRotation + e.thetaOffset).set()) : (e.targetTilt = d, n.tilt(e.targetTilt).set());
|
|
2535
2600
|
};
|
|
2536
2601
|
return {
|
|
2537
|
-
zoomOut: new
|
|
2602
|
+
zoomOut: new b({ variant: "outline", size: "icon", label: yn(), icon: g.zoomOut(), onClick: () => {
|
|
2538
2603
|
e.targetZoom = i(e.targetZoom - 10), n.zoom(e.targetZoom).set();
|
|
2539
2604
|
} }),
|
|
2540
|
-
zoomIn: new
|
|
2605
|
+
zoomIn: new b({ variant: "outline", size: "icon", label: fn(), icon: g.zoomIn(), onClick: () => {
|
|
2541
2606
|
e.targetZoom = i(e.targetZoom + 10), n.zoom(e.targetZoom).set();
|
|
2542
2607
|
} }),
|
|
2543
|
-
tiltUp: new
|
|
2608
|
+
tiltUp: new b({ variant: "outline", size: "icon", label: On(), icon: g.tiltUp(), onClick: () => {
|
|
2544
2609
|
s(-15);
|
|
2545
2610
|
} }),
|
|
2546
|
-
rotateLeft: new
|
|
2611
|
+
rotateLeft: new b({ variant: "outline", size: "icon", label: Sn(), icon: g.rotateLeft(), onClick: () => {
|
|
2547
2612
|
e.targetRotation = o(e.targetRotation - 15), n.rotate(e.targetRotation + e.thetaOffset).set();
|
|
2548
2613
|
} }),
|
|
2549
|
-
reset: new
|
|
2614
|
+
reset: new b({ variant: "outline", size: "icon", label: un(), icon: g.reset(), onClick: () => {
|
|
2550
2615
|
e.thetaOffset = 0, n.reset();
|
|
2551
2616
|
} }),
|
|
2552
|
-
rotateRight: new
|
|
2617
|
+
rotateRight: new b({ variant: "outline", size: "icon", label: xn(), icon: g.rotateRight(), onClick: () => {
|
|
2553
2618
|
e.targetRotation = o(e.targetRotation + 15), n.rotate(e.targetRotation + e.thetaOffset).set();
|
|
2554
2619
|
} }),
|
|
2555
|
-
tiltDown: new
|
|
2620
|
+
tiltDown: new b({ variant: "outline", size: "icon", label: zn(), icon: g.tiltDown(), onClick: () => {
|
|
2556
2621
|
s(15);
|
|
2557
2622
|
} })
|
|
2558
2623
|
};
|
|
2559
2624
|
}
|
|
2560
|
-
function
|
|
2625
|
+
function Si(n, t, e) {
|
|
2561
2626
|
const i = t.limits;
|
|
2562
2627
|
i !== void 0 && (n.zoomOut.element.disabled = i.minZoom !== void 0 && e.zoom <= i.minZoom + T, n.zoomIn.element.disabled = i.maxZoom !== void 0 && e.zoom >= i.maxZoom - T, n.tiltUp.element.disabled = i.minTilt !== void 0 && e.tilt <= i.minTilt + T, n.tiltDown.element.disabled = i.maxTilt !== void 0 && e.tilt >= i.maxTilt - T, n.rotateLeft.element.disabled = i.minRotate !== void 0 && e.rotation <= i.minRotate + T, n.rotateRight.element.disabled = i.maxRotate !== void 0 && e.rotation >= i.maxRotate - T);
|
|
2563
2628
|
}
|
|
@@ -2573,7 +2638,7 @@ const I = {
|
|
|
2573
2638
|
/** Configuration submitted (bubbles). `detail`: the resolved configuration handed to the host. */
|
|
2574
2639
|
CONFIGURATION_SUBMIT: "vd:configuration-submit"
|
|
2575
2640
|
}, ki = 5;
|
|
2576
|
-
let
|
|
2641
|
+
let Ai = 0;
|
|
2577
2642
|
function j(n) {
|
|
2578
2643
|
const t = n.replace(/([A-Z])/g, " $1").trim();
|
|
2579
2644
|
return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
|
|
@@ -2582,20 +2647,20 @@ function Ei(n, t, e, i, o) {
|
|
|
2582
2647
|
const s = document.createElement("div");
|
|
2583
2648
|
s.className = "vd-attribute", s.dataset.name = n.name;
|
|
2584
2649
|
const r = document.createElement("span");
|
|
2585
|
-
r.className = "vd-attribute-label", r.textContent = j(n.name), r.id = `vd-attribute-label-${
|
|
2586
|
-
const l = n.values.find((p) => t.getValue(n.name, p)?.isSelected === !0),
|
|
2587
|
-
return
|
|
2650
|
+
r.className = "vd-attribute-label", r.textContent = j(n.name), r.id = `vd-attribute-label-${Ai++}`, s.appendChild(r), s.setAttribute("role", "group"), s.setAttribute("aria-labelledby", r.id);
|
|
2651
|
+
const l = n.values.find((p) => t.getValue(n.name, p)?.isSelected === !0), u = n.values.map(j), d = n.values.length <= ki ? new ci(n.values, l, u) : new di(n.name, n.values, j(n.name), l, u);
|
|
2652
|
+
return d.onSelect((p) => {
|
|
2588
2653
|
e.dispatch(I.SELECT, { attribute: n.name, value: p }, !0).defaultPrevented || i(n.name, p);
|
|
2589
2654
|
}), o(n.name, (p) => {
|
|
2590
|
-
|
|
2591
|
-
}), s.appendChild(
|
|
2655
|
+
d.setSelected(p.value), e.dispatch(I.SELECTED, { attribute: n.name, value: p.value });
|
|
2656
|
+
}), s.appendChild(d.element), s;
|
|
2592
2657
|
}
|
|
2593
|
-
const
|
|
2594
|
-
class
|
|
2595
|
-
constructor(t, e =
|
|
2658
|
+
const xi = 80, Ti = 2500;
|
|
2659
|
+
class Ri {
|
|
2660
|
+
constructor(t, e = Ti) {
|
|
2596
2661
|
this.configuration = t, this.resetMs = e, this.element = document.createElement("div"), this.element.className = "vd-commerce vd-hidden";
|
|
2597
2662
|
const i = document.createElement("div");
|
|
2598
|
-
i.className = "vd-commerce-price", this.priceEl = document.createElement("span"), this.priceEl.className = "vd-price", this.vatEl = document.createElement("span"), this.vatEl.className = "vd-vat", i.append(this.priceEl, this.vatEl), this.button = new
|
|
2663
|
+
i.className = "vd-commerce-price", this.priceEl = document.createElement("span"), this.priceEl.className = "vd-price", this.vatEl = document.createElement("span"), this.vatEl.className = "vd-vat", i.append(this.priceEl, this.vatEl), this.button = new b({ variant: "default", onClick: () => {
|
|
2599
2664
|
this.handleSubmit();
|
|
2600
2665
|
} }), this.button.element.classList.add("vd-cta", "vd-hidden"), this.element.append(i, this.button.element), this.unsubscribe = this.configuration.onRender(() => {
|
|
2601
2666
|
this.update();
|
|
@@ -2624,7 +2689,7 @@ class Ti {
|
|
|
2624
2689
|
this.priceEl.textContent = "", this.vatEl.textContent = "";
|
|
2625
2690
|
return;
|
|
2626
2691
|
}
|
|
2627
|
-
this.priceEl.textContent =
|
|
2692
|
+
this.priceEl.textContent = Ii(t.price, t.currency), this.vatEl.textContent = at(this.configuration.vatDisplay);
|
|
2628
2693
|
}
|
|
2629
2694
|
renderButton() {
|
|
2630
2695
|
const t = this.configuration.submitEnabled;
|
|
@@ -2632,11 +2697,11 @@ class Ti {
|
|
|
2632
2697
|
}
|
|
2633
2698
|
async handleSubmit() {
|
|
2634
2699
|
if (this.state !== "busy") {
|
|
2635
|
-
this.setState("busy",
|
|
2700
|
+
this.setState("busy", Dn());
|
|
2636
2701
|
try {
|
|
2637
|
-
await this.configuration.submit(), this.setState("success",
|
|
2702
|
+
await this.configuration.submit(), this.setState("success", jn());
|
|
2638
2703
|
} catch {
|
|
2639
|
-
this.setState("failed",
|
|
2704
|
+
this.setState("failed", Zn());
|
|
2640
2705
|
}
|
|
2641
2706
|
this.scheduleReset();
|
|
2642
2707
|
}
|
|
@@ -2654,9 +2719,9 @@ class Ti {
|
|
|
2654
2719
|
}
|
|
2655
2720
|
}
|
|
2656
2721
|
function at(n) {
|
|
2657
|
-
return (n ?? "").slice(0,
|
|
2722
|
+
return (n ?? "").slice(0, xi);
|
|
2658
2723
|
}
|
|
2659
|
-
function
|
|
2724
|
+
function Ii(n, t) {
|
|
2660
2725
|
try {
|
|
2661
2726
|
const e = new Intl.NumberFormat(h(), { style: "currency", currency: t }), i = e.resolvedOptions().maximumFractionDigits ?? 2;
|
|
2662
2727
|
return e.format(n / 10 ** i);
|
|
@@ -2664,7 +2729,7 @@ function Ri(n, t) {
|
|
|
2664
2729
|
return `${t} ${(n / 100).toFixed(2)}`;
|
|
2665
2730
|
}
|
|
2666
2731
|
}
|
|
2667
|
-
class
|
|
2732
|
+
class St {
|
|
2668
2733
|
slot = null;
|
|
2669
2734
|
panel = null;
|
|
2670
2735
|
attach(t, e) {
|
|
@@ -2677,8 +2742,8 @@ class Ct {
|
|
|
2677
2742
|
this.slot?.remove(), this.slot = null, this.panel = null;
|
|
2678
2743
|
}
|
|
2679
2744
|
}
|
|
2680
|
-
const
|
|
2681
|
-
class
|
|
2745
|
+
const Oi = 572;
|
|
2746
|
+
class Ni {
|
|
2682
2747
|
element = null;
|
|
2683
2748
|
body = null;
|
|
2684
2749
|
openButton = null;
|
|
@@ -2689,21 +2754,21 @@ class Oi {
|
|
|
2689
2754
|
expanded = !0;
|
|
2690
2755
|
visible = !1;
|
|
2691
2756
|
attach(t, e) {
|
|
2692
|
-
this.container = t, e.classList.add("vd-attributes-sidebar"), this.closeButton = new
|
|
2757
|
+
this.container = t, e.classList.add("vd-attributes-sidebar"), this.closeButton = new b({
|
|
2693
2758
|
variant: "ghost",
|
|
2694
2759
|
size: "icon-sm",
|
|
2695
|
-
label:
|
|
2696
|
-
icon:
|
|
2760
|
+
label: an(),
|
|
2761
|
+
icon: g.close({ size: 18 }),
|
|
2697
2762
|
onClick: () => {
|
|
2698
2763
|
this.expanded = !1, this.render();
|
|
2699
2764
|
}
|
|
2700
2765
|
});
|
|
2701
2766
|
const i = document.createElement("div");
|
|
2702
|
-
i.className = "vd-sidebar-header", i.appendChild(this.closeButton.element), this.body = document.createElement("div"), this.body.className = "vd-sidebar-body", this.body.appendChild(e), this.element = document.createElement("div"), this.element.className = "vd-sidebar vd-hidden", this.element.append(i, this.body), t.appendChild(this.element), this.openButton = new
|
|
2767
|
+
i.className = "vd-sidebar-header", i.appendChild(this.closeButton.element), this.body = document.createElement("div"), this.body.className = "vd-sidebar-body", this.body.appendChild(e), this.element = document.createElement("div"), this.element.className = "vd-sidebar vd-hidden", this.element.append(i, this.body), t.appendChild(this.element), this.openButton = new b({
|
|
2703
2768
|
variant: "outline",
|
|
2704
2769
|
size: "default",
|
|
2705
|
-
label:
|
|
2706
|
-
icon:
|
|
2770
|
+
label: nn(),
|
|
2771
|
+
icon: g.configurator({ size: 18 }),
|
|
2707
2772
|
onClick: () => {
|
|
2708
2773
|
this.expanded = !0, this.render();
|
|
2709
2774
|
}
|
|
@@ -2713,12 +2778,16 @@ class Oi {
|
|
|
2713
2778
|
this.visible = t, this.render();
|
|
2714
2779
|
}
|
|
2715
2780
|
destroy() {
|
|
2716
|
-
this.observer?.disconnect(), this.observer = null, this.openButton?.element.remove(), this.element?.remove(), this.container?.classList.remove(
|
|
2781
|
+
this.observer?.disconnect(), this.observer = null, this.openButton?.element.remove(), this.element?.remove(), this.container?.classList.remove(
|
|
2782
|
+
"vd-layout-sidebar-right",
|
|
2783
|
+
"vd-layout-sidebar-collapsed",
|
|
2784
|
+
"vd-layout-sidebar-permanent"
|
|
2785
|
+
), this.container = null;
|
|
2717
2786
|
}
|
|
2718
2787
|
observe() {
|
|
2719
2788
|
typeof ResizeObserver > "u" || this.container === null || (this.observer = new ResizeObserver((t) => {
|
|
2720
2789
|
const e = t[0]?.contentRect.width ?? 0;
|
|
2721
|
-
this.setCollapsible(e > 0 && e <
|
|
2790
|
+
this.setCollapsible(e > 0 && e < Oi);
|
|
2722
2791
|
}), this.observer.observe(this.container));
|
|
2723
2792
|
}
|
|
2724
2793
|
setCollapsible(t) {
|
|
@@ -2728,10 +2797,10 @@ class Oi {
|
|
|
2728
2797
|
if (this.element === null || this.openButton === null || this.closeButton === null || this.container === null)
|
|
2729
2798
|
return;
|
|
2730
2799
|
const t = this.visible && this.expanded, e = this.visible && !this.expanded;
|
|
2731
|
-
this.element.classList.toggle("vd-hidden", !this.visible), this.element.classList.toggle("vd-sidebar-collapsed", e), this.openButton.element.classList.toggle("vd-hidden", !e), this.closeButton.element.style.display = this.collapsible ? "" : "none", this.container.classList.toggle("vd-layout-sidebar-right", t), this.container.classList.toggle("vd-layout-sidebar-collapsed", e);
|
|
2800
|
+
this.element.classList.toggle("vd-hidden", !this.visible), this.element.classList.toggle("vd-sidebar-collapsed", e), this.openButton.element.classList.toggle("vd-hidden", !e), this.closeButton.element.style.display = this.collapsible ? "" : "none", this.container.classList.toggle("vd-layout-sidebar-right", t), this.container.classList.toggle("vd-layout-sidebar-collapsed", e), this.container.classList.toggle("vd-layout-sidebar-permanent", t && !this.collapsible);
|
|
2732
2801
|
}
|
|
2733
2802
|
}
|
|
2734
|
-
class
|
|
2803
|
+
class Li {
|
|
2735
2804
|
attach(t, e) {
|
|
2736
2805
|
}
|
|
2737
2806
|
setVisible(t) {
|
|
@@ -2739,20 +2808,20 @@ class Ni {
|
|
|
2739
2808
|
destroy() {
|
|
2740
2809
|
}
|
|
2741
2810
|
}
|
|
2742
|
-
const
|
|
2743
|
-
"inframe-bottom-left": () => new
|
|
2744
|
-
"sidebar-right": () => new
|
|
2745
|
-
hidden: () => new
|
|
2811
|
+
const Mi = {
|
|
2812
|
+
"inframe-bottom-left": () => new St(),
|
|
2813
|
+
"sidebar-right": () => new Ni(),
|
|
2814
|
+
hidden: () => new Li()
|
|
2746
2815
|
};
|
|
2747
|
-
function
|
|
2748
|
-
return (
|
|
2816
|
+
function zi(n) {
|
|
2817
|
+
return (Mi[n ?? ""] ?? (() => new St()))();
|
|
2749
2818
|
}
|
|
2750
|
-
const H =
|
|
2819
|
+
const H = w.fontFamily.sans.join(", "), q = `
|
|
2751
2820
|
position: absolute;
|
|
2752
2821
|
display: flex;
|
|
2753
2822
|
z-index: 10;
|
|
2754
2823
|
transition: inset-inline-end 0.18s ease;
|
|
2755
|
-
`,
|
|
2824
|
+
`, Pi = `
|
|
2756
2825
|
/* Override browser's default black fullscreen backdrop */
|
|
2757
2826
|
.vd-container:fullscreen {
|
|
2758
2827
|
background: oklch(100% 0 0);
|
|
@@ -2760,7 +2829,7 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2760
2829
|
|
|
2761
2830
|
/* Layout slots — four corners */
|
|
2762
2831
|
.vd-slot-top-right {
|
|
2763
|
-
${
|
|
2832
|
+
${q}
|
|
2764
2833
|
inset-block-start: ${a[3]};
|
|
2765
2834
|
inset-inline-end: ${a[3]};
|
|
2766
2835
|
flex-direction: column;
|
|
@@ -2769,7 +2838,7 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2769
2838
|
}
|
|
2770
2839
|
|
|
2771
2840
|
.vd-slot-bottom-left {
|
|
2772
|
-
${
|
|
2841
|
+
${q}
|
|
2773
2842
|
inset-block-end: ${a[3]};
|
|
2774
2843
|
inset-inline-start: ${a[3]};
|
|
2775
2844
|
flex-direction: column;
|
|
@@ -2778,7 +2847,7 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2778
2847
|
}
|
|
2779
2848
|
|
|
2780
2849
|
.vd-slot-bottom-right {
|
|
2781
|
-
${
|
|
2850
|
+
${q}
|
|
2782
2851
|
inset-block-end: ${a[3]};
|
|
2783
2852
|
inset-inline-end: ${a[3]};
|
|
2784
2853
|
flex-direction: row;
|
|
@@ -2835,8 +2904,8 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2835
2904
|
|
|
2836
2905
|
/* Micro-label: recedes so the controls lead. */
|
|
2837
2906
|
.vd-attribute-label {
|
|
2838
|
-
font-size: ${
|
|
2839
|
-
font-weight: ${
|
|
2907
|
+
font-size: ${w.fontSize.xs};
|
|
2908
|
+
font-weight: ${w.fontWeight.medium};
|
|
2840
2909
|
color: ${m.neutral[500]};
|
|
2841
2910
|
text-transform: uppercase;
|
|
2842
2911
|
letter-spacing: 0.05em;
|
|
@@ -2846,6 +2915,21 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2846
2915
|
/* sidebar-right layout — a docked, full-height right panel */
|
|
2847
2916
|
.vd-container { --vd-sidebar-width: 300px; }
|
|
2848
2917
|
|
|
2918
|
+
.vd-container > iframe {
|
|
2919
|
+
width: 100%;
|
|
2920
|
+
height: 100%;
|
|
2921
|
+
border: none;
|
|
2922
|
+
display: block;
|
|
2923
|
+
}
|
|
2924
|
+
|
|
2925
|
+
/* Permanently docked panel (wide embeds, not collapsible): the viewer fills the
|
|
2926
|
+
remaining width instead of the panel floating over it. On narrow embeds the
|
|
2927
|
+
panel is a temporary tap-to-reveal overlay instead (vd-layout-sidebar-right
|
|
2928
|
+
without -permanent), where covering part of the model briefly is expected. */
|
|
2929
|
+
.vd-container.vd-layout-sidebar-permanent > iframe {
|
|
2930
|
+
width: calc(100% - var(--vd-sidebar-width));
|
|
2931
|
+
}
|
|
2932
|
+
|
|
2849
2933
|
.vd-hidden { display: none !important; }
|
|
2850
2934
|
|
|
2851
2935
|
.vd-sidebar {
|
|
@@ -2927,13 +3011,13 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2927
3011
|
}
|
|
2928
3012
|
|
|
2929
3013
|
.vd-price {
|
|
2930
|
-
font-size: ${
|
|
2931
|
-
font-weight: ${
|
|
3014
|
+
font-size: ${w.fontSize.lg};
|
|
3015
|
+
font-weight: ${w.fontWeight.semibold};
|
|
2932
3016
|
color: ${m.neutral[900]};
|
|
2933
3017
|
}
|
|
2934
3018
|
|
|
2935
3019
|
.vd-vat {
|
|
2936
|
-
font-size: ${
|
|
3020
|
+
font-size: ${w.fontSize.xs};
|
|
2937
3021
|
color: ${m.neutral[500]};
|
|
2938
3022
|
}
|
|
2939
3023
|
|
|
@@ -2951,16 +3035,16 @@ const H = _.fontFamily.sans.join(", "), G = `
|
|
|
2951
3035
|
|
|
2952
3036
|
`;
|
|
2953
3037
|
function Fi() {
|
|
2954
|
-
if (
|
|
3038
|
+
if (Ct(), document.getElementById("vd-styles") !== null)
|
|
2955
3039
|
return;
|
|
2956
3040
|
const n = document.createElement("style");
|
|
2957
|
-
n.id = "vd-styles", n.textContent =
|
|
3041
|
+
n.id = "vd-styles", n.textContent = Pi, document.head.appendChild(n);
|
|
2958
3042
|
}
|
|
2959
|
-
function
|
|
3043
|
+
function $i(n, t) {
|
|
2960
3044
|
const e = document.createElement("a");
|
|
2961
3045
|
e.href = `data:image/png;base64,${n}`, e.download = t, e.click();
|
|
2962
3046
|
}
|
|
2963
|
-
class
|
|
3047
|
+
class Di {
|
|
2964
3048
|
options;
|
|
2965
3049
|
settings = {};
|
|
2966
3050
|
container = null;
|
|
@@ -2976,7 +3060,7 @@ class $i {
|
|
|
2976
3060
|
this.options = t;
|
|
2977
3061
|
}
|
|
2978
3062
|
attach(t) {
|
|
2979
|
-
Fi(), this.container = t, this.loading = new
|
|
3063
|
+
Fi(), this.container = t, this.loading = new wi(t), this.slots.topRight = this.createSlot(t, "vd-slot-top-right"), this.slots.bottomRight = this.createSlot(t, "vd-slot-bottom-right");
|
|
2980
3064
|
}
|
|
2981
3065
|
onReady() {
|
|
2982
3066
|
this.loading?.hide(), this.loading = null, this.mountToolbar(), this.cameraControls !== null && (this.cameraControls.element.style.display = "flex"), this.layout?.setVisible(!0);
|
|
@@ -3002,7 +3086,7 @@ class $i {
|
|
|
3002
3086
|
this.loading?.showError(t);
|
|
3003
3087
|
}
|
|
3004
3088
|
applyViewerSettings(t) {
|
|
3005
|
-
this.settings = t, t.language !== void 0 &&
|
|
3089
|
+
this.settings = t, t.language !== void 0 && ft(t.language, { reload: !1 }), this.syncScreenshotButton(), this.actionBar?.applySettings(t), this.cameraControls !== null && (this.cameraControls.element.style.display = t.cameraControls === !0 ? "flex" : "none"), this.placeScreenshotButton();
|
|
3006
3090
|
}
|
|
3007
3091
|
renderAttributeControls(t, e) {
|
|
3008
3092
|
if (!(this.container === null || this.slots.topRight === null) && (this.cameraControls?.element.remove(), this.cameraControls = null, this.teardownConfigurator(), this.settings.cameraControls === !0 && (this.cameraControls = new L(this.options.cameraApi, this.options.cameraPositionApi), this.cameraControls.element.style.display = "none", this.slots.topRight.appendChild(this.cameraControls.element)), this.placeScreenshotButton(), e.length !== 0)) {
|
|
@@ -3015,7 +3099,7 @@ class $i {
|
|
|
3015
3099
|
this.options.onSelect,
|
|
3016
3100
|
this.options.onSubscribe
|
|
3017
3101
|
));
|
|
3018
|
-
this.commerce = new
|
|
3102
|
+
this.commerce = new Ri(this.options.configuration), this.attributes.appendChild(this.commerce.element), this.layout = zi(this.settings.configuratorLayout), this.layout.attach(this.container, this.attributes);
|
|
3019
3103
|
}
|
|
3020
3104
|
}
|
|
3021
3105
|
get viewerSettings() {
|
|
@@ -3037,14 +3121,14 @@ class $i {
|
|
|
3037
3121
|
}
|
|
3038
3122
|
syncScreenshotButton() {
|
|
3039
3123
|
const t = this.settings.screenshot === !0;
|
|
3040
|
-
t && this.screenshotBtn === null && (this.screenshotBtn = new
|
|
3124
|
+
t && this.screenshotBtn === null && (this.screenshotBtn = new b({
|
|
3041
3125
|
variant: "outline",
|
|
3042
3126
|
size: "icon",
|
|
3043
|
-
label:
|
|
3044
|
-
icon:
|
|
3127
|
+
label: Xe(),
|
|
3128
|
+
icon: g.screenshot(),
|
|
3045
3129
|
onClick: () => {
|
|
3046
3130
|
this.options.snapshotApi.take("snapshot.png").onDeveloped(({ data: e, filename: i }) => {
|
|
3047
|
-
|
|
3131
|
+
$i(e, i);
|
|
3048
3132
|
});
|
|
3049
3133
|
}
|
|
3050
3134
|
})), !t && this.screenshotBtn !== null && (this.screenshotBtn.element.remove(), this.screenshotBtn = null);
|
|
@@ -3053,8 +3137,8 @@ class $i {
|
|
|
3053
3137
|
this.screenshotBtn === null || this.slots.topRight === null || (this.cameraControls !== null ? this.cameraControls.element.appendChild(this.screenshotBtn.element) : this.slots.topRight.appendChild(this.screenshotBtn.element));
|
|
3054
3138
|
}
|
|
3055
3139
|
}
|
|
3056
|
-
const
|
|
3057
|
-
class
|
|
3140
|
+
const Bi = {};
|
|
3141
|
+
class Ui {
|
|
3058
3142
|
defaultServer = "https://server.virtualdisplay.io";
|
|
3059
3143
|
options;
|
|
3060
3144
|
serverHost;
|
|
@@ -3079,24 +3163,19 @@ class Bi {
|
|
|
3079
3163
|
}
|
|
3080
3164
|
createIframe() {
|
|
3081
3165
|
const t = document.createElement("iframe");
|
|
3082
|
-
return t.src = this.buildUrl(),
|
|
3083
|
-
width: "100%",
|
|
3084
|
-
height: "100%",
|
|
3085
|
-
border: "none",
|
|
3086
|
-
display: "block"
|
|
3087
|
-
}), t.setAttribute("allow", "xr-spatial-tracking; fullscreen"), t;
|
|
3166
|
+
return t.src = this.buildUrl(), t.setAttribute("allow", "xr-spatial-tracking; fullscreen"), t;
|
|
3088
3167
|
}
|
|
3089
3168
|
attachToParent(t) {
|
|
3090
3169
|
this.getParentElement().appendChild(t);
|
|
3091
3170
|
}
|
|
3092
3171
|
buildUrl() {
|
|
3093
3172
|
const t = this.getServerUrl(), e = new URL(t);
|
|
3094
|
-
return e.searchParams.set("license", this.options.license), e.searchParams.set("model", this.options.model), this.options.language !== void 0 && e.searchParams.set("language", this.options.language), this.options.debug === !0 && e.searchParams.set("debug", "true"), this.options.traceparent !== void 0 && e.searchParams.set("traceparent", this.options.traceparent), e.toString();
|
|
3173
|
+
return e.searchParams.set("license", this.options.license), e.searchParams.set("model", this.options.model), this.options.language !== void 0 && e.searchParams.set("language", this.options.language), this.options.session !== void 0 && e.searchParams.set("session", this.options.session), this.options.debug === !0 && e.searchParams.set("debug", "true"), this.options.traceparent !== void 0 && e.searchParams.set("traceparent", this.options.traceparent), e.toString();
|
|
3095
3174
|
}
|
|
3096
3175
|
getServerUrl() {
|
|
3097
3176
|
if (this.serverHost !== void 0)
|
|
3098
3177
|
return this.serverHost;
|
|
3099
|
-
if (
|
|
3178
|
+
if (Bi?.VITE_VIRTUALDISPLAY_SERVER_HOST === void 0)
|
|
3100
3179
|
return this.defaultServer;
|
|
3101
3180
|
}
|
|
3102
3181
|
getParentElement() {
|
|
@@ -3108,42 +3187,44 @@ class Bi {
|
|
|
3108
3187
|
return t;
|
|
3109
3188
|
}
|
|
3110
3189
|
}
|
|
3111
|
-
function
|
|
3190
|
+
function Vi(n) {
|
|
3112
3191
|
const { messenger: t } = n;
|
|
3113
3192
|
t.on(c.HANDSHAKE, (e) => {
|
|
3114
|
-
|
|
3193
|
+
Tt(e) && (_.info("Server handshake received, flushing publisher queue"), t.markReady());
|
|
3115
3194
|
}), t.on(c.SESSION, (e) => {
|
|
3116
|
-
|
|
3195
|
+
Rt(e) && n.onSession(e.sessionId);
|
|
3117
3196
|
}), t.on(c.MUTATION, (e) => {
|
|
3118
|
-
|
|
3197
|
+
It(e) && (n.attributes.handleMutationResult(e), n.configuration.handleSelectionChanged(n.attributes.getSelection()));
|
|
3119
3198
|
}), t.on(c.SNAPSHOT, (e) => {
|
|
3120
|
-
|
|
3199
|
+
Ot(e) && n.snapshot.handleSnapshotResult(e);
|
|
3121
3200
|
}), t.on(c.CAMERA, (e) => {
|
|
3122
|
-
|
|
3201
|
+
Nt(e) && n.cameraPosition.handlePositionUpdate(e);
|
|
3123
3202
|
}), t.on(c.LOADING_INDICATOR, (e) => {
|
|
3124
|
-
|
|
3203
|
+
Mt(e) && (e.error !== void 0 ? n.ui.showError(e.error) : n.ui.updateProgress(e.progress, e.phase));
|
|
3125
3204
|
}), t.on(c.CONFIG, (e) => {
|
|
3126
|
-
|
|
3205
|
+
Pt(e) && n.applyConfig(e);
|
|
3127
3206
|
}), t.on(c.MAPPING, (e) => {
|
|
3128
|
-
|
|
3129
|
-
}),
|
|
3207
|
+
Lt(e) && (n.attributes.handleMappingReceived(e), n.configuration.handleSelectionChanged(n.attributes.getSelection()), n.ui.renderAttributeControls(n.attributes, e.attributes), n.readyStateTracker.handleMappingReceived());
|
|
3208
|
+
}), ji(n);
|
|
3130
3209
|
}
|
|
3131
|
-
function
|
|
3210
|
+
function ji(n) {
|
|
3132
3211
|
const { messenger: t } = n;
|
|
3133
3212
|
t.on(c.FOCUS, (e) => {
|
|
3134
|
-
|
|
3213
|
+
Ft(e) && n.focus.handleStateReceived(e);
|
|
3135
3214
|
}), t.on(c.PRICING, (e) => {
|
|
3136
|
-
|
|
3215
|
+
$t(e) && n.configuration.handlePricingReceived(e.pricing);
|
|
3216
|
+
}), t.on(c.SYNC, (e) => {
|
|
3217
|
+
zt(e) && n.onSync(e.connected);
|
|
3137
3218
|
});
|
|
3138
3219
|
}
|
|
3139
|
-
class
|
|
3220
|
+
class Hi {
|
|
3140
3221
|
ready = !1;
|
|
3141
3222
|
onReady;
|
|
3142
3223
|
constructor(t) {
|
|
3143
3224
|
this.onReady = t;
|
|
3144
3225
|
}
|
|
3145
3226
|
handleMappingReceived() {
|
|
3146
|
-
this.ready || (this.ready = !0,
|
|
3227
|
+
this.ready || (this.ready = !0, _.info("Mapping received from server, client is now ready"), this.onReady?.());
|
|
3147
3228
|
}
|
|
3148
3229
|
get isReady() {
|
|
3149
3230
|
return this.ready;
|
|
@@ -3152,7 +3233,7 @@ class ji {
|
|
|
3152
3233
|
this.ready = !1;
|
|
3153
3234
|
}
|
|
3154
3235
|
}
|
|
3155
|
-
class
|
|
3236
|
+
class qi {
|
|
3156
3237
|
attributes;
|
|
3157
3238
|
readyStateTracker;
|
|
3158
3239
|
messenger;
|
|
@@ -3164,9 +3245,12 @@ class Hi {
|
|
|
3164
3245
|
annotationsApi;
|
|
3165
3246
|
eventBus;
|
|
3166
3247
|
ui;
|
|
3167
|
-
qrModal;
|
|
3168
3248
|
options;
|
|
3169
3249
|
serverHost;
|
|
3250
|
+
/** The composed AR flow, or undefined in builds without one (the studio). */
|
|
3251
|
+
arActivation;
|
|
3252
|
+
/** The composed sync tracker, or undefined in builds without one (the studio). */
|
|
3253
|
+
syncTracker;
|
|
3170
3254
|
iframe;
|
|
3171
3255
|
container;
|
|
3172
3256
|
readyCallbacks = [];
|
|
@@ -3174,42 +3258,39 @@ class Hi {
|
|
|
3174
3258
|
/** The viewer's tracking session id, once the server announces it (SESSION). */
|
|
3175
3259
|
viewerSessionId;
|
|
3176
3260
|
constructor(t, e) {
|
|
3177
|
-
this.options = t, this.serverHost = e?.serverHost, this.initializeLogging(), this.messenger = new
|
|
3261
|
+
this.options = t, this.serverHost = e?.serverHost, this.initializeLogging(), this.messenger = new Dt(
|
|
3178
3262
|
() => this.iframe?.contentWindow ?? null,
|
|
3179
3263
|
e?.messengerOptions
|
|
3180
3264
|
);
|
|
3181
|
-
const i = (
|
|
3182
|
-
this.messenger.send(
|
|
3265
|
+
const i = (s) => {
|
|
3266
|
+
this.messenger.send(s);
|
|
3183
3267
|
};
|
|
3184
|
-
this.attributes = new
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3191
|
-
this.dispatchConfigurationChange(o);
|
|
3268
|
+
this.attributes = new ne(i, (s, r) => {
|
|
3269
|
+
this.notifyMutationFailed(s, r);
|
|
3270
|
+
}), this.snapshotApi = new de(i), this.annotationsApi = new Bt(i), this.cameraApi = new ie(i), this.cameraPositionApi = new oe(), this.focusApi = new le(i, (s) => {
|
|
3271
|
+
this.dispatchFocusChange(s);
|
|
3272
|
+
}), this.configurationApi = new ae(
|
|
3273
|
+
(s) => {
|
|
3274
|
+
this.dispatchConfigurationChange(s);
|
|
3192
3275
|
},
|
|
3193
|
-
(
|
|
3194
|
-
this.dispatchConfigurationSubmit(
|
|
3276
|
+
(s) => {
|
|
3277
|
+
this.dispatchConfigurationSubmit(s);
|
|
3195
3278
|
}
|
|
3196
|
-
), this.eventBus = new
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
this.ui.onReady();
|
|
3202
|
-
}), this.ui = new $i({
|
|
3279
|
+
), this.eventBus = new ue(), this.arActivation = e?.createArActivation?.(i), this.syncTracker = e?.createSyncTracker?.(), this.readyStateTracker = new Hi(() => {
|
|
3280
|
+
this.notifyReady();
|
|
3281
|
+
});
|
|
3282
|
+
const o = this.arActivation;
|
|
3283
|
+
this.ui = new Di({
|
|
3203
3284
|
snapshotApi: this.snapshotApi,
|
|
3204
3285
|
cameraApi: this.cameraApi,
|
|
3205
3286
|
cameraPositionApi: this.cameraPositionApi,
|
|
3206
3287
|
eventBus: this.eventBus,
|
|
3207
3288
|
configuration: this.configurationApi,
|
|
3208
|
-
onSelect: (
|
|
3209
|
-
onSubscribe: (
|
|
3210
|
-
onAr: () => {
|
|
3211
|
-
|
|
3212
|
-
},
|
|
3289
|
+
onSelect: (s, r) => this.attributes.select(s, r),
|
|
3290
|
+
onSubscribe: (s, r) => this.attributes.onChange(s, r),
|
|
3291
|
+
...o !== void 0 && { onAr: () => {
|
|
3292
|
+
o.activate();
|
|
3293
|
+
} },
|
|
3213
3294
|
onFullscreenEnter: () => {
|
|
3214
3295
|
this.trackFullscreen();
|
|
3215
3296
|
}
|
|
@@ -3217,7 +3298,7 @@ class Hi {
|
|
|
3217
3298
|
}
|
|
3218
3299
|
/** Wire the inbound viewer protocol to the facades. */
|
|
3219
3300
|
wireIncomingMessages() {
|
|
3220
|
-
|
|
3301
|
+
Vi({
|
|
3221
3302
|
messenger: this.messenger,
|
|
3222
3303
|
attributes: this.attributes,
|
|
3223
3304
|
configuration: this.configurationApi,
|
|
@@ -3230,10 +3311,30 @@ class Hi {
|
|
|
3230
3311
|
this.handleConfig(t);
|
|
3231
3312
|
},
|
|
3232
3313
|
onSession: (t) => {
|
|
3233
|
-
this.
|
|
3314
|
+
this.handleSession(t);
|
|
3315
|
+
},
|
|
3316
|
+
onSync: (t) => {
|
|
3317
|
+
this.syncTracker?.handleSync(t);
|
|
3234
3318
|
}
|
|
3235
3319
|
});
|
|
3236
3320
|
}
|
|
3321
|
+
/** Store the tracking session id and hand it to the AR flow, which waits on it for the QR. */
|
|
3322
|
+
handleSession(t) {
|
|
3323
|
+
this.viewerSessionId = t, this.arActivation?.onSession(t);
|
|
3324
|
+
}
|
|
3325
|
+
/** Forward a failed mutation to every registered `onMutationFailed` callback. */
|
|
3326
|
+
notifyMutationFailed(t, e) {
|
|
3327
|
+
for (const i of this.mutationFailedCallbacks)
|
|
3328
|
+
i({ attribute: t, value: e });
|
|
3329
|
+
}
|
|
3330
|
+
/** Flush the queued `onReady` callbacks once, then let the standard interface know. */
|
|
3331
|
+
notifyReady() {
|
|
3332
|
+
const t = this.readyCallbacks;
|
|
3333
|
+
this.readyCallbacks = [];
|
|
3334
|
+
for (const e of t)
|
|
3335
|
+
e(this);
|
|
3336
|
+
this.ui.onReady();
|
|
3337
|
+
}
|
|
3237
3338
|
/**
|
|
3238
3339
|
* Dispatch a bubbling `vd:focus-change` event on the container so a page can
|
|
3239
3340
|
* react to focus without registering an `onChange` callback.
|
|
@@ -3264,28 +3365,21 @@ class Hi {
|
|
|
3264
3365
|
const o = i !== void 0 ? { ...e ?? {}, ...i } : e;
|
|
3265
3366
|
if (i !== void 0 && e !== void 0) {
|
|
3266
3367
|
const s = Object.entries(i).filter(([r, l]) => e[r] !== l).map(([r, l]) => `${r} (metadata: ${e[r] ?? "undefined"}, override: ${l})`);
|
|
3267
|
-
s.length > 0 &&
|
|
3368
|
+
s.length > 0 && _.warn(`Viewer settings override active: ${s.join(", ")}`);
|
|
3268
3369
|
}
|
|
3269
3370
|
this.ui.applyViewerSettings(o), this.annotationsApi.setEnabled(o.annotations !== !1);
|
|
3270
3371
|
}
|
|
3271
3372
|
this.cameraPositionApi.applyLimits(t.cameraLimits);
|
|
3272
3373
|
}
|
|
3273
|
-
activateAr() {
|
|
3274
|
-
if (Zn()) {
|
|
3275
|
-
this.messenger.send({ type: c.AR_ACTIVATE });
|
|
3276
|
-
return;
|
|
3277
|
-
}
|
|
3278
|
-
this.qrModal.show(this.iframe?.src ?? "");
|
|
3279
|
-
}
|
|
3280
3374
|
/** Tell the viewer the user entered fullscreen, so it records the engagement. */
|
|
3281
3375
|
trackFullscreen() {
|
|
3282
3376
|
this.messenger.send({ type: c.FULLSCREEN });
|
|
3283
3377
|
}
|
|
3284
3378
|
initializeLogging() {
|
|
3285
|
-
this.options.debug === !0 &&
|
|
3379
|
+
this.options.debug === !0 && ee(), _.info("Initializing Virtualdisplay client", { model: this.options.model });
|
|
3286
3380
|
}
|
|
3287
3381
|
createAndConnectIframe() {
|
|
3288
|
-
const e = new
|
|
3382
|
+
const e = new Ui(this.options, this.serverHost).create();
|
|
3289
3383
|
this.container = e.container, this.iframe = e.iframe, this.eventBus.attach(this.container), this.ui.attach(this.container);
|
|
3290
3384
|
try {
|
|
3291
3385
|
const i = new URL(this.iframe.src).origin;
|
|
@@ -3321,6 +3415,16 @@ class Hi {
|
|
|
3321
3415
|
onMutationFailed(t) {
|
|
3322
3416
|
this.mutationFailedCallbacks.push(t);
|
|
3323
3417
|
}
|
|
3418
|
+
/**
|
|
3419
|
+
* Trigger the composed AR flow directly (ar-session-handoff task 035): a host
|
|
3420
|
+
* page that hides the built-in corner button (`viewerSettings.ar = false`,
|
|
3421
|
+
* e.g. the AR landing, which owns a single custom AR affordance) still needs
|
|
3422
|
+
* an entry point to the same flow that button would have called. A no-op
|
|
3423
|
+
* where no AR flow is composed (the studio client has none).
|
|
3424
|
+
*/
|
|
3425
|
+
activateAr() {
|
|
3426
|
+
this.arActivation?.activate();
|
|
3427
|
+
}
|
|
3324
3428
|
on(t, e) {
|
|
3325
3429
|
this.eventBus.on(t, e);
|
|
3326
3430
|
}
|
|
@@ -3350,25 +3454,135 @@ class Hi {
|
|
|
3350
3454
|
return this.ui.viewerSettings;
|
|
3351
3455
|
}
|
|
3352
3456
|
destroy() {
|
|
3353
|
-
this.readyStateTracker.clear(), this.readyCallbacks = [], this.mutationFailedCallbacks.length = 0, this.snapshotApi.clear(), this.messenger.destroy(), this.
|
|
3457
|
+
this.readyStateTracker.clear(), this.readyCallbacks = [], this.mutationFailedCallbacks.length = 0, this.snapshotApi.clear(), this.messenger.destroy(), this.arActivation?.destroy(), this.ui.destroy(), this.container?.parentElement !== null && this.container?.parentElement !== void 0 && this.container.parentElement.removeChild(this.container), this.container = void 0, this.iframe = void 0;
|
|
3458
|
+
}
|
|
3459
|
+
}
|
|
3460
|
+
const Gi = "ar.virtualdisplay.io";
|
|
3461
|
+
function Zi(n) {
|
|
3462
|
+
const t = new URL(`https://${Gi}/go`);
|
|
3463
|
+
return n.sessionId !== void 0 ? t.searchParams.set("session", n.sessionId) : (t.searchParams.set("license", n.license), t.searchParams.set("model", n.model)), t.toString();
|
|
3464
|
+
}
|
|
3465
|
+
const Wi = 1500;
|
|
3466
|
+
class Qi {
|
|
3467
|
+
options;
|
|
3468
|
+
qrModal = new pi();
|
|
3469
|
+
/** The viewer's tracking session id, once the engine announces it (SESSION). */
|
|
3470
|
+
sessionId;
|
|
3471
|
+
/** Callbacks waiting on the SESSION message, resolved (or timed out) exactly once each. */
|
|
3472
|
+
waiters = [];
|
|
3473
|
+
/** Session-wait timers still pending, cleared on destroy so no wait outlives the client. */
|
|
3474
|
+
pendingTimers = /* @__PURE__ */ new Set();
|
|
3475
|
+
/** Set on destroy: an in-flight hand-off must not re-mount the modal or send QR_SHOWN. */
|
|
3476
|
+
destroyed = !1;
|
|
3477
|
+
constructor(t) {
|
|
3478
|
+
this.options = t;
|
|
3479
|
+
}
|
|
3480
|
+
/** Store the engine-announced tracking session id and resolve anyone waiting on it. */
|
|
3481
|
+
onSession(t) {
|
|
3482
|
+
this.sessionId = t;
|
|
3483
|
+
const e = this.waiters;
|
|
3484
|
+
this.waiters = [];
|
|
3485
|
+
for (const i of e)
|
|
3486
|
+
i(t);
|
|
3487
|
+
}
|
|
3488
|
+
/** The AR button handler: mobile activates AR in the engine, desktop shows the hand-off QR. */
|
|
3489
|
+
activate() {
|
|
3490
|
+
if (Jt()) {
|
|
3491
|
+
this.options.send({ type: c.AR_ACTIVATE });
|
|
3492
|
+
return;
|
|
3493
|
+
}
|
|
3494
|
+
this.showQrCode();
|
|
3495
|
+
}
|
|
3496
|
+
destroy() {
|
|
3497
|
+
this.destroyed = !0;
|
|
3498
|
+
for (const t of this.pendingTimers)
|
|
3499
|
+
clearTimeout(t);
|
|
3500
|
+
this.pendingTimers.clear(), this.waiters = [], this.qrModal.hide();
|
|
3501
|
+
}
|
|
3502
|
+
/**
|
|
3503
|
+
* Desktop hand-off: open the modal at once in its loading state (the click
|
|
3504
|
+
* must respond immediately, even when the session id is still resolving),
|
|
3505
|
+
* then swap the AR landing QR in as soon as the URL is known. Guarded after
|
|
3506
|
+
* each await: a client torn down during the session wait must not update
|
|
3507
|
+
* the modal or send a stray QR_SHOWN through a dead messenger.
|
|
3508
|
+
*/
|
|
3509
|
+
async showQrCode() {
|
|
3510
|
+
this.qrModal.show();
|
|
3511
|
+
const t = await this.waitForSessionId();
|
|
3512
|
+
if (this.destroyed)
|
|
3513
|
+
return;
|
|
3514
|
+
const e = Zi({
|
|
3515
|
+
sessionId: t,
|
|
3516
|
+
license: this.options.license,
|
|
3517
|
+
model: this.options.model
|
|
3518
|
+
}), i = await this.qrModal.update(e);
|
|
3519
|
+
if (this.destroyed) {
|
|
3520
|
+
this.qrModal.hide();
|
|
3521
|
+
return;
|
|
3522
|
+
}
|
|
3523
|
+
i && this.options.send({ type: c.QR_SHOWN });
|
|
3524
|
+
}
|
|
3525
|
+
/**
|
|
3526
|
+
* Resolve once the SESSION message arrives, or `undefined` after
|
|
3527
|
+
* {@link SESSION_WAIT_TIMEOUT_MS} if it never does (e.g. tracking blocked by
|
|
3528
|
+
* an ad blocker). The QR then falls back to a working sessionless landing URL
|
|
3529
|
+
* rather than encoding a wrong one.
|
|
3530
|
+
*/
|
|
3531
|
+
waitForSessionId() {
|
|
3532
|
+
return this.sessionId !== void 0 ? Promise.resolve(this.sessionId) : new Promise((t) => {
|
|
3533
|
+
const e = setTimeout(() => {
|
|
3534
|
+
this.pendingTimers.delete(e), t(void 0);
|
|
3535
|
+
}, Wi);
|
|
3536
|
+
this.pendingTimers.add(e), this.waiters.push((i) => {
|
|
3537
|
+
this.pendingTimers.delete(e), clearTimeout(e), t(i);
|
|
3538
|
+
});
|
|
3539
|
+
});
|
|
3354
3540
|
}
|
|
3355
3541
|
}
|
|
3356
|
-
class
|
|
3542
|
+
class Yi {
|
|
3543
|
+
callbacks = [];
|
|
3544
|
+
lastKnown;
|
|
3545
|
+
handleSync(t) {
|
|
3546
|
+
this.lastKnown = t;
|
|
3547
|
+
for (const e of this.callbacks)
|
|
3548
|
+
e(t);
|
|
3549
|
+
}
|
|
3550
|
+
onChange(t) {
|
|
3551
|
+
this.callbacks.push(t), this.lastKnown !== void 0 && t(this.lastKnown);
|
|
3552
|
+
}
|
|
3553
|
+
}
|
|
3554
|
+
class Ji extends qi {
|
|
3555
|
+
syncStatusTracker;
|
|
3556
|
+
constructor(t) {
|
|
3557
|
+
const e = new Yi();
|
|
3558
|
+
super(t, {
|
|
3559
|
+
createArActivation: (i) => new Qi({
|
|
3560
|
+
license: t.license,
|
|
3561
|
+
model: t.model,
|
|
3562
|
+
send: i
|
|
3563
|
+
}),
|
|
3564
|
+
createSyncTracker: () => e
|
|
3565
|
+
}), this.syncStatusTracker = e;
|
|
3566
|
+
}
|
|
3567
|
+
/** Subscribe to the live sync channel's connection state (ar-session-handoff). Latest-wins, no buffering. */
|
|
3568
|
+
onSyncChange(t) {
|
|
3569
|
+
this.syncStatusTracker.onChange(t);
|
|
3570
|
+
}
|
|
3357
3571
|
}
|
|
3358
3572
|
export {
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
|
|
3365
|
-
|
|
3366
|
-
|
|
3367
|
-
|
|
3573
|
+
Bt as Annotations,
|
|
3574
|
+
Vt as Attribute,
|
|
3575
|
+
Ut as AttributeValue,
|
|
3576
|
+
ie as Camera,
|
|
3577
|
+
ae as Configuration,
|
|
3578
|
+
A as ERROR_CODES,
|
|
3579
|
+
le as Focus,
|
|
3580
|
+
ce as Photo,
|
|
3581
|
+
de as Snapshot,
|
|
3368
3582
|
I as VD_EVENTS,
|
|
3369
|
-
|
|
3583
|
+
Ji as VirtualdisplayClient,
|
|
3370
3584
|
f as VirtualdisplayError,
|
|
3371
|
-
|
|
3372
|
-
|
|
3373
|
-
|
|
3585
|
+
ee as enableDebugMode,
|
|
3586
|
+
Ki as isDebugMode,
|
|
3587
|
+
_ as logger
|
|
3374
3588
|
};
|