@virtualdisplay.io/client 4.0.0-alpha.24 → 4.0.0-alpha.25

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.
@@ -14,7 +14,8 @@ const c = {
14
14
  FOCUS: "focus",
15
15
  PRICING: "pricing",
16
16
  QR_SHOWN: "qr_shown",
17
- SYNC: "sync"
17
+ SYNC: "sync",
18
+ SELECTABLE: "selectable"
18
19
  }, tt = {
19
20
  FOCUS: "focus",
20
21
  UNFOCUS: "unfocus"
@@ -24,17 +25,17 @@ const c = {
24
25
  /** Behaves exactly like an unpriced combination: no price, no button. */
25
26
  HIDDEN: "hidden"
26
27
  }, It = new Set(Object.values(c));
27
- function Ot(n) {
28
+ function Lt(n) {
28
29
  if (typeof n != "object" || n === null)
29
30
  return !1;
30
31
  const t = n;
31
32
  return typeof t.target == "string" ? !1 : typeof t.type == "string" && It.has(t.type);
32
33
  }
33
- function Nt(n) {
34
+ function Ot(n) {
34
35
  const t = S(n);
35
36
  return t !== null && t.type === c.HANDSHAKE;
36
37
  }
37
- function Lt(n) {
38
+ function Nt(n) {
38
39
  const t = S(n);
39
40
  return t !== null && t.type === c.SESSION && typeof t.sessionId == "string";
40
41
  }
@@ -64,13 +65,17 @@ function Dt(n) {
64
65
  }
65
66
  function Bt(n) {
66
67
  const t = S(n);
67
- return t !== null && t.type === c.CONFIG && typeof t.viewerSettings == "object";
68
+ return t !== null && t.type === c.SELECTABLE && Array.isArray(t.attributes);
68
69
  }
69
70
  function Ut(n) {
70
71
  const t = S(n);
71
- return t !== null && t.type === c.FOCUS && typeof t.state == "string";
72
+ return t !== null && t.type === c.CONFIG && typeof t.viewerSettings == "object";
72
73
  }
73
74
  function Vt(n) {
75
+ const t = S(n);
76
+ return t !== null && t.type === c.FOCUS && typeof t.state == "string";
77
+ }
78
+ function jt(n) {
74
79
  const t = S(n);
75
80
  return t !== null && t.type === c.PRICING && typeof t.pricing == "object" && t.pricing !== null;
76
81
  }
@@ -124,9 +129,9 @@ class et {
124
129
  this.pending.length = 0;
125
130
  }
126
131
  }
127
- class jt {
132
+ class Ht {
128
133
  constructor(t, e) {
129
- this.getTarget = t, this.sourceId = `vd-${Math.random().toString(36).slice(2, 8)}`, this.targetOrigin = "*", this.isValid = e?.isValid ?? Ot, this.publisher = new et((i) => this.post(i)), this.consumer = new et((i) => this.routeToHandler(i)), e?.bufferIncoming !== !0 && this.consumer.markReady();
134
+ this.getTarget = t, this.sourceId = `vd-${Math.random().toString(36).slice(2, 8)}`, this.targetOrigin = "*", this.isValid = e?.isValid ?? Lt, this.publisher = new et((i) => this.post(i)), this.consumer = new et((i) => this.routeToHandler(i)), e?.bufferIncoming !== !0 && this.consumer.markReady();
130
135
  }
131
136
  getTarget;
132
137
  handlers = /* @__PURE__ */ new Map();
@@ -235,7 +240,7 @@ class jt {
235
240
  });
236
241
  }
237
242
  }
238
- class Ht {
243
+ class qt {
239
244
  constructor(t) {
240
245
  this.send = t;
241
246
  }
@@ -247,7 +252,7 @@ class Ht {
247
252
  });
248
253
  }
249
254
  }
250
- class qt {
255
+ class Gt {
251
256
  constructor(t, e) {
252
257
  this.value = t, this.attribute = e;
253
258
  }
@@ -290,7 +295,7 @@ class f extends Error {
290
295
  return new f(t, A.INVALID_PARAMETER);
291
296
  }
292
297
  }
293
- class Gt {
298
+ class Zt {
294
299
  name;
295
300
  defaultValue;
296
301
  values;
@@ -342,18 +347,18 @@ class Gt {
342
347
  createValues(t) {
343
348
  const e = /* @__PURE__ */ new Map();
344
349
  for (const i of t) {
345
- const o = new qt(i, this.name);
350
+ const o = new Gt(i, this.name);
346
351
  i === this.defaultValue && o.setSelected(!0), e.set(i, o);
347
352
  }
348
353
  return e;
349
354
  }
350
355
  }
351
- class Zt {
356
+ class Wt {
352
357
  attributes = /* @__PURE__ */ new Map();
353
358
  constructor(t, e, i) {
354
359
  for (const o of t) {
355
360
  const s = this.buildOptions(o, e);
356
- this.attributes.set(o.name, new Gt(s));
361
+ this.attributes.set(o.name, new Zt(s));
357
362
  }
358
363
  this.onMutationFailed = i;
359
364
  }
@@ -390,13 +395,13 @@ class Zt {
390
395
  return t.defaultValue !== void 0 ? { ...i, defaultValue: t.defaultValue } : i;
391
396
  }
392
397
  }
393
- const L = 4096, F = 16384, Wt = [1024, 256, 64], Yt = 20, Y = ["timestamp", "level", "msg", "service", "trace_id", "span_id"];
394
- function Qt(n) {
395
- 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 = Object.entries(n).filter(([r]) => !Y.includes(r)).map(([r, a]) => `${r}=${I(a, L).line}`).join(" ");
398
+ const N = 4096, F = 16384, Yt = [1024, 256, 64], Qt = 20, Y = ["timestamp", "level", "msg", "service", "trace_id", "span_id"];
399
+ function Kt(n) {
400
+ 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 = Object.entries(n).filter(([r]) => !Y.includes(r)).map(([r, a]) => `${r}=${I(a, N).line}`).join(" ");
396
401
  return `${t} ${e} [${i}] ${o}${s ? " " + s : ""}`;
397
402
  }
398
- function Kt(n) {
399
- for (const o of [L, ...Wt]) {
403
+ function Xt(n) {
404
+ for (const o of [N, ...Yt]) {
400
405
  const { line: s, truncated: r } = I(n, o);
401
406
  if (!r) {
402
407
  if (s.length <= F)
@@ -407,15 +412,15 @@ function Kt(n) {
407
412
  if (a.length <= F)
408
413
  return a;
409
414
  }
410
- const t = Object.keys(n).filter((o) => !Y.includes(o)), e = { ...Jt(n, Y), log_truncated: !0, log_dropped_count: t.length }, i = I({ ...e, log_dropped_attrs: t.slice(0, Yt) }, L);
411
- return i.line.length <= F ? i.line : I(e, L).line;
415
+ const t = Object.keys(n).filter((o) => !Y.includes(o)), e = { ...te(n, Y), log_truncated: !0, log_dropped_count: t.length }, i = I({ ...e, log_dropped_attrs: t.slice(0, Qt) }, N);
416
+ return i.line.length <= F ? i.line : I(e, N).line;
412
417
  }
413
418
  function I(n, t) {
414
419
  const e = [];
415
420
  let i = !1;
416
421
  return { line: JSON.stringify(n, function(r, a) {
417
422
  if (typeof a == "string")
418
- return a.length > t && (i = !0), Xt(a, t);
423
+ return a.length > t && (i = !0), Jt(a, t);
419
424
  if (typeof a == "bigint")
420
425
  return a.toString();
421
426
  if (typeof a != "object" || a === null)
@@ -425,17 +430,17 @@ function I(n, t) {
425
430
  return e.includes(a) ? "[Circular]" : (e.push(a), a);
426
431
  }), truncated: i };
427
432
  }
428
- function Xt(n, t) {
433
+ function Jt(n, t) {
429
434
  return n.length <= t ? n : `${n.slice(0, t)}...[truncated ${n.length - t} chars]`;
430
435
  }
431
- function Jt(n, t) {
436
+ function te(n, t) {
432
437
  const e = {};
433
438
  for (const i of t)
434
439
  n[i] !== void 0 && (e[i] = n[i]);
435
440
  return e;
436
441
  }
437
- function te(n, t) {
438
- const e = t ? Qt(n) : Kt(n);
442
+ function ee(n, t) {
443
+ const e = t ? Kt(n) : Xt(n);
439
444
  n.level === "error" ? console.error(e) : n.level === "warn" ? console.warn(e) : console.log(e);
440
445
  }
441
446
  function mt(n, t = 0) {
@@ -452,34 +457,34 @@ function mt(n, t = 0) {
452
457
  }
453
458
  return n.cause !== void 0 && n.cause !== null && (e.cause = n.cause instanceof Error && t < 5 ? mt(n.cause, t + 1) : String(n.cause)), e;
454
459
  }
455
- function ee(n) {
460
+ function ne(n) {
456
461
  const t = {};
457
462
  for (const [e, i] of Object.entries(n))
458
463
  t[e] = i instanceof Error ? mt(i) : i;
459
464
  return t;
460
465
  }
461
- function ne() {
466
+ function ie() {
462
467
  return /* @__PURE__ */ new Date();
463
468
  }
464
- function ie(n) {
469
+ function oe(n) {
465
470
  return n.toISOString();
466
471
  }
467
472
  function pt() {
468
473
  return typeof navigator > "u" ? "" : navigator.userAgent;
469
474
  }
470
- function oe() {
471
- return typeof navigator > "u" ? !1 : navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
472
- }
473
475
  function se() {
474
- return /iPhone|iPad|iPod/i.test(pt()) || oe();
476
+ return typeof navigator > "u" ? !1 : navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1;
475
477
  }
476
478
  function re() {
477
- return /Android/i.test(pt());
479
+ return /iPhone|iPad|iPod/i.test(pt()) || se();
478
480
  }
479
481
  function ae() {
480
- return se() || re();
482
+ return /Android/i.test(pt());
481
483
  }
482
- class le {
484
+ function le() {
485
+ return re() || ae();
486
+ }
487
+ class ce {
483
488
  constructor(t) {
484
489
  this.config = t;
485
490
  }
@@ -489,14 +494,14 @@ class le {
489
494
  */
490
495
  log(t, e, i = {}) {
491
496
  const o = this.config.traceProvider?.() ?? {}, s = {
492
- timestamp: ie(ne()),
497
+ timestamp: oe(ie()),
493
498
  level: t,
494
499
  msg: e,
495
500
  service: this.config.service,
496
501
  ...o,
497
- ...ee(i)
502
+ ...ne(i)
498
503
  };
499
- te(s, this.config.isDev);
504
+ ee(s, this.config.isDev);
500
505
  }
501
506
  /**
502
507
  * Log at DEBUG level (development only).
@@ -525,28 +530,28 @@ class le {
525
530
  }
526
531
  function ft(n, t) {
527
532
  const e = t?.isDev !== void 0 ? t.isDev : typeof process < "u" ? process.env.NODE_ENV !== "production" : !0;
528
- return new le({ service: n, isDev: e, traceProvider: t?.traceProvider });
533
+ return new ce({ service: n, isDev: e, traceProvider: t?.traceProvider });
529
534
  }
530
- function N(n) {
535
+ function O(n) {
531
536
  if (n !== void 0)
532
537
  return typeof n == "object" && n !== null && !Array.isArray(n) && !(n instanceof Error) ? n : n instanceof Error ? { error: n.message } : { value: n };
533
538
  }
534
539
  function gt(n) {
535
540
  return {
536
- debug: (t, e) => n.debug(t, N(e)),
537
- info: (t, e) => n.info(t, N(e)),
538
- warn: (t, e) => n.warn(t, N(e)),
539
- error: (t, e) => n.error(t, N(e))
541
+ debug: (t, e) => n.debug(t, O(e)),
542
+ info: (t, e) => n.info(t, O(e)),
543
+ warn: (t, e) => n.warn(t, O(e)),
544
+ error: (t, e) => n.error(t, O(e))
540
545
  };
541
546
  }
542
547
  let bt = !1, _ = gt(ft("client", { isDev: !1 }));
543
- function ce() {
548
+ function de() {
544
549
  bt = !0, _ = gt(ft("client", { isDev: !0 }));
545
550
  }
546
- function lo() {
551
+ function uo() {
547
552
  return bt;
548
553
  }
549
- class de {
554
+ class ue {
550
555
  constructor(t, e) {
551
556
  this.send = t, this.onMutationFailed = e;
552
557
  }
@@ -560,7 +565,7 @@ class de {
560
565
  handleMappingReceived(t) {
561
566
  _.debug("Initializing from server mapping", {
562
567
  attributeCount: t.attributes.length
563
- }), this.registry = new Zt(
568
+ }), this.registry = new Wt(
564
569
  t.attributes,
565
570
  (e, i) => this.sendMutation(e, i),
566
571
  this.onMutationFailed
@@ -625,7 +630,27 @@ class de {
625
630
  this.pendingCallbacks.length = 0;
626
631
  }
627
632
  }
628
- let ue = class {
633
+ class he {
634
+ snapshot;
635
+ callbacks = [];
636
+ handleSnapshot(t) {
637
+ this.snapshot = t.attributes;
638
+ for (const e of this.callbacks)
639
+ e(t.attributes);
640
+ }
641
+ onChange(t) {
642
+ this.callbacks.push(t), this.snapshot !== void 0 && t(this.snapshot);
643
+ }
644
+ /** The selectable values for one attribute, or null when unrestricted. */
645
+ selectableFor(t) {
646
+ return this.snapshot?.find((i) => i.name === t)?.selectable ?? null;
647
+ }
648
+ /** The latest snapshot; empty before the viewer has reported anything. */
649
+ get current() {
650
+ return this.snapshot ?? [];
651
+ }
652
+ }
653
+ let me = class {
629
654
  constructor(t) {
630
655
  this.send = t;
631
656
  }
@@ -688,7 +713,7 @@ let ue = class {
688
713
  this.send(t);
689
714
  }
690
715
  };
691
- class he {
716
+ class pe {
692
717
  state;
693
718
  limitsState;
694
719
  changeCallbacks = [];
@@ -776,20 +801,20 @@ class he {
776
801
  }
777
802
  }
778
803
  }
779
- function me(n, t) {
780
- const e = n.filter((s) => pe(s, t));
804
+ function fe(n, t) {
805
+ const e = n.filter((s) => ge(s, t));
781
806
  if (e.length === 0)
782
807
  return;
783
808
  const i = Math.max(...e.map(nt)), o = e.filter((s) => nt(s) === i);
784
809
  return o.length === 1 ? o[0] : void 0;
785
810
  }
786
- function pe(n, t) {
811
+ function ge(n, t) {
787
812
  return Object.entries(n.attributes).every(([e, i]) => t[e] === i);
788
813
  }
789
814
  function nt(n) {
790
815
  return Object.keys(n.attributes).length;
791
816
  }
792
- class fe {
817
+ class be {
793
818
  constructor(t, e) {
794
819
  this.dispatchChange = t, this.dispatchSubmit = e;
795
820
  }
@@ -899,7 +924,7 @@ class fe {
899
924
  resolve() {
900
925
  if (this.pricing === void 0)
901
926
  return;
902
- const t = me(this.pricing.rules, this.selection);
927
+ const t = fe(this.pricing.rules, this.selection);
903
928
  if (!(t === void 0 || t.availability === Rt.HIDDEN))
904
929
  return {
905
930
  attributes: { ...this.selection },
@@ -910,7 +935,7 @@ class fe {
910
935
  };
911
936
  }
912
937
  }
913
- class ge {
938
+ class ve {
914
939
  constructor(t, e) {
915
940
  this.send = t, this.dispatch = e;
916
941
  }
@@ -954,7 +979,7 @@ class ge {
954
979
  this.dispatch(e);
955
980
  }
956
981
  }
957
- class be {
982
+ class ye {
958
983
  constructor(t) {
959
984
  this.filename = t;
960
985
  }
@@ -1008,7 +1033,7 @@ class be {
1008
1033
  }
1009
1034
  }
1010
1035
  const it = 3e4;
1011
- class ve {
1036
+ class we {
1012
1037
  constructor(t) {
1013
1038
  this.send = t;
1014
1039
  }
@@ -1024,7 +1049,7 @@ class ve {
1024
1049
  */
1025
1050
  take(t) {
1026
1051
  this.validateFilename(t), _.debug("Taking snapshot", { filename: t });
1027
- const e = new be(t), i = setTimeout(() => {
1052
+ const e = new ye(t), i = setTimeout(() => {
1028
1053
  this.pendingPhotos.delete(t), _.warn("Snapshot timed out", { filename: t }), e.fail(new f(
1029
1054
  `Snapshot timed out: the viewer did not respond within ${it}ms`,
1030
1055
  A.SNAPSHOT_FAILED
@@ -1095,7 +1120,7 @@ class ve {
1095
1120
  );
1096
1121
  }
1097
1122
  }
1098
- class ye {
1123
+ class Se {
1099
1124
  container = null;
1100
1125
  attach(t) {
1101
1126
  this.container = t;
@@ -1116,7 +1141,7 @@ class ye {
1116
1141
  };
1117
1142
  }
1118
1143
  }
1119
- const we = {}, _e = "en", vt = (
1144
+ const _e = {}, Ce = "en", vt = (
1120
1145
  /** @type {const} */
1121
1146
  ["en", "nl", "de"]
1122
1147
  ), K = [
@@ -1129,24 +1154,24 @@ globalThis.__paraglide.ssr ?? {};
1129
1154
  let st = !1, u = () => {
1130
1155
  let n = K;
1131
1156
  !Q && typeof window < "u" && window.location?.href && (n = wt(window.location.href));
1132
- const t = Se(n);
1157
+ const t = ke(n);
1133
1158
  if (t)
1134
1159
  return st || (st = !0, yt(t, { reload: !1 })), t;
1135
1160
  throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found");
1136
1161
  };
1137
- function Se(n, t) {
1162
+ function ke(n, t) {
1138
1163
  let e;
1139
1164
  for (const i of n) {
1140
1165
  if (i === "baseLocale")
1141
- e = _e;
1142
- else if (_t(i) && M.has(i)) {
1166
+ e = Ce;
1167
+ else if (St(i) && M.has(i)) {
1143
1168
  const s = M.get(i);
1144
1169
  if (s) {
1145
1170
  const r = s.getLocale();
1146
1171
  if (r instanceof Promise)
1147
1172
  continue;
1148
1173
  if (r !== void 0)
1149
- return Ae(r);
1174
+ return xe(r);
1150
1175
  }
1151
1176
  }
1152
1177
  const o = X(e);
@@ -1154,7 +1179,7 @@ function Se(n, t) {
1154
1179
  return o;
1155
1180
  }
1156
1181
  }
1157
- const Ce = (n) => {
1182
+ const Ae = (n) => {
1158
1183
  window.location.reload();
1159
1184
  };
1160
1185
  let yt = (n, t) => {
@@ -1171,26 +1196,26 @@ let yt = (n, t) => {
1171
1196
  let s = K;
1172
1197
  !Q && typeof window < "u" && window.location?.href && (s = wt(window.location.href));
1173
1198
  for (const a of s)
1174
- if (a !== "baseLocale" && _t(a) && M.has(a)) {
1199
+ if (a !== "baseLocale" && St(a) && M.has(a)) {
1175
1200
  const h = M.get(a);
1176
1201
  if (h) {
1177
1202
  let d = h.setLocale(n);
1178
- d instanceof Promise && (d = d.catch((p) => {
1203
+ d instanceof Promise && (d = d.catch((m) => {
1179
1204
  throw new Error(`Custom strategy "${a}" setLocale failed.`, {
1180
- cause: p
1205
+ cause: m
1181
1206
  });
1182
1207
  }), o.push(d));
1183
1208
  }
1184
1209
  }
1185
1210
  const r = () => {
1186
- !Q && e.reload && window.location && n !== i && Ce();
1211
+ !Q && e.reload && window.location && n !== i && Ae();
1187
1212
  };
1188
1213
  if (o.length)
1189
1214
  return Promise.all(o).then(() => {
1190
1215
  r();
1191
1216
  });
1192
1217
  r();
1193
- }, ke = () => typeof window < "u" ? window.location.origin : "http://fallback.com";
1218
+ }, Ee = () => typeof window < "u" ? window.location.origin : "http://fallback.com";
1194
1219
  function X(n) {
1195
1220
  if (typeof n != "string")
1196
1221
  return;
@@ -1199,31 +1224,31 @@ function X(n) {
1199
1224
  if (e.toLowerCase() === t)
1200
1225
  return e;
1201
1226
  }
1202
- function Ae(n) {
1227
+ function xe(n) {
1203
1228
  const t = X(n);
1204
1229
  if (t)
1205
1230
  return t;
1206
1231
  throw new Error(`Invalid locale: ${n}. Expected one of: ${vt.join(", ")}`);
1207
1232
  }
1208
- function Ee(n) {
1209
- return xe(n);
1233
+ function Te(n) {
1234
+ return Re(n);
1210
1235
  }
1211
- function xe(n) {
1212
- const t = typeof n == "string" ? new URL(n, ke()) : new URL(n), e = t.pathname.split("/").filter(Boolean);
1236
+ function Re(n) {
1237
+ const t = typeof n == "string" ? new URL(n, Ee()) : new URL(n), e = t.pathname.split("/").filter(Boolean);
1213
1238
  return e.length > 0 && X(e[0]) && (t.pathname = "/" + e.slice(1).join("/")), t;
1214
1239
  }
1215
1240
  let rt, at;
1216
- function Te(n) {
1241
+ function Ie(n) {
1217
1242
  if (ot.length === 0)
1218
1243
  return;
1219
1244
  const t = typeof n == "string" ? n : n.href;
1220
1245
  if (rt === t)
1221
1246
  return at;
1222
- const e = new URL(t, "http://example.com"), i = Ee(e), o = i.href === e.href ? [e] : [e, i];
1247
+ const e = new URL(t, "http://example.com"), i = Te(e), o = i.href === e.href ? [e] : [e, i];
1223
1248
  let s;
1224
1249
  for (const r of o) {
1225
1250
  for (const a of ot)
1226
- if (new we(a.match, r.href).exec(r.href)) {
1251
+ if (new _e(a.match, r.href).exec(r.href)) {
1227
1252
  s = a;
1228
1253
  break;
1229
1254
  }
@@ -1233,519 +1258,519 @@ function Te(n) {
1233
1258
  return rt = t, at = s, s;
1234
1259
  }
1235
1260
  function wt(n) {
1236
- const t = Te(n);
1261
+ const t = Ie(n);
1237
1262
  return t && t.exclude !== !0 && Array.isArray(t.strategy) ? t.strategy : K;
1238
1263
  }
1239
1264
  const M = /* @__PURE__ */ new Map();
1240
- function _t(n) {
1265
+ function St(n) {
1241
1266
  return typeof n == "string" && /^custom-[A-Za-z0-9_-]+$/.test(n);
1242
1267
  }
1243
- const Re = (
1268
+ const Le = (
1244
1269
  /** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
1245
1270
  () => (
1246
1271
  /** @type {LocalizedString} */
1247
1272
  "Activate AR"
1248
1273
  )
1249
- ), Ie = (
1274
+ ), Oe = (
1250
1275
  /** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
1251
1276
  () => (
1252
1277
  /** @type {LocalizedString} */
1253
1278
  "AR activeren"
1254
1279
  )
1255
- ), Oe = (
1280
+ ), Ne = (
1256
1281
  /** @type {(inputs: Controls_Ar_Buttonlabel1Inputs) => LocalizedString} */
1257
1282
  () => (
1258
1283
  /** @type {LocalizedString} */
1259
1284
  "AR aktivieren"
1260
1285
  )
1261
- ), Ne = (
1286
+ ), Me = (
1262
1287
  /** @type {((inputs?: Controls_Ar_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Ar_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1263
1288
  ((n = {}, t = {}) => {
1264
1289
  const e = t.locale ?? u();
1265
- return e === "nl" ? Ie() : e === "de" ? Oe() : Re();
1290
+ return e === "nl" ? Oe() : e === "de" ? Ne() : Le();
1266
1291
  })
1267
- ), Le = (
1292
+ ), ze = (
1268
1293
  /** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
1269
1294
  () => (
1270
1295
  /** @type {LocalizedString} */
1271
1296
  "Scan to view in AR"
1272
1297
  )
1273
- ), Me = (
1298
+ ), Pe = (
1274
1299
  /** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
1275
1300
  () => (
1276
1301
  /** @type {LocalizedString} */
1277
1302
  "Scan om in AR te bekijken"
1278
1303
  )
1279
- ), ze = (
1304
+ ), Fe = (
1280
1305
  /** @type {(inputs: Controls_Qr_Modaltitle1Inputs) => LocalizedString} */
1281
1306
  () => (
1282
1307
  /** @type {LocalizedString} */
1283
1308
  "Scannen für AR-Ansicht"
1284
1309
  )
1285
- ), Pe = (
1310
+ ), $e = (
1286
1311
  /** @type {((inputs?: Controls_Qr_Modaltitle1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaltitle1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1287
1312
  ((n = {}, t = {}) => {
1288
1313
  const e = t.locale ?? u();
1289
- return e === "nl" ? Me() : e === "de" ? ze() : Le();
1314
+ return e === "nl" ? Pe() : e === "de" ? Fe() : ze();
1290
1315
  })
1291
- ), Fe = (
1316
+ ), De = (
1292
1317
  /** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
1293
1318
  () => (
1294
1319
  /** @type {LocalizedString} */
1295
1320
  "Use your smartphone camera to scan this QR code"
1296
1321
  )
1297
- ), $e = (
1322
+ ), Be = (
1298
1323
  /** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
1299
1324
  () => (
1300
1325
  /** @type {LocalizedString} */
1301
1326
  "Gebruik de camera van je smartphone om deze QR-code te scannen"
1302
1327
  )
1303
- ), De = (
1328
+ ), Ue = (
1304
1329
  /** @type {(inputs: Controls_Qr_Modaldescription1Inputs) => LocalizedString} */
1305
1330
  () => (
1306
1331
  /** @type {LocalizedString} */
1307
1332
  "Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen"
1308
1333
  )
1309
- ), Be = (
1334
+ ), Ve = (
1310
1335
  /** @type {((inputs?: Controls_Qr_Modaldescription1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modaldescription1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1311
1336
  ((n = {}, t = {}) => {
1312
1337
  const e = t.locale ?? u();
1313
- return e === "nl" ? $e() : e === "de" ? De() : Fe();
1338
+ return e === "nl" ? Be() : e === "de" ? Ue() : De();
1314
1339
  })
1315
- ), Ue = (
1340
+ ), je = (
1316
1341
  /** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
1317
1342
  () => (
1318
1343
  /** @type {LocalizedString} */
1319
1344
  "Your phone will open the 3D model in AR mode."
1320
1345
  )
1321
- ), Ve = (
1346
+ ), He = (
1322
1347
  /** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
1323
1348
  () => (
1324
1349
  /** @type {LocalizedString} */
1325
1350
  "Je telefoon opent het 3D-model in AR-modus."
1326
1351
  )
1327
- ), je = (
1352
+ ), qe = (
1328
1353
  /** @type {(inputs: Controls_Qr_Modalinstructions1Inputs) => LocalizedString} */
1329
1354
  () => (
1330
1355
  /** @type {LocalizedString} */
1331
1356
  "Dein Telefon öffnet das 3D-Modell im AR-Modus."
1332
1357
  )
1333
- ), He = (
1358
+ ), Ge = (
1334
1359
  /** @type {((inputs?: Controls_Qr_Modalinstructions1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modalinstructions1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1335
1360
  ((n = {}, t = {}) => {
1336
1361
  const e = t.locale ?? u();
1337
- return e === "nl" ? Ve() : e === "de" ? je() : Ue();
1362
+ return e === "nl" ? He() : e === "de" ? qe() : je();
1338
1363
  })
1339
- ), qe = (
1364
+ ), Ze = (
1340
1365
  /** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
1341
1366
  () => (
1342
1367
  /** @type {LocalizedString} */
1343
1368
  "Close"
1344
1369
  )
1345
- ), Ge = (
1370
+ ), We = (
1346
1371
  /** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
1347
1372
  () => (
1348
1373
  /** @type {LocalizedString} */
1349
1374
  "Sluiten"
1350
1375
  )
1351
- ), Ze = (
1376
+ ), Ye = (
1352
1377
  /** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
1353
1378
  () => (
1354
1379
  /** @type {LocalizedString} */
1355
1380
  "Schließen"
1356
1381
  )
1357
- ), We = (
1382
+ ), Qe = (
1358
1383
  /** @type {((inputs?: Controls_Qr_Closebutton1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Closebutton1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1359
1384
  ((n = {}, t = {}) => {
1360
1385
  const e = t.locale ?? u();
1361
- return e === "nl" ? Ge() : e === "de" ? Ze() : qe();
1386
+ return e === "nl" ? We() : e === "de" ? Ye() : Ze();
1362
1387
  })
1363
- ), Ye = (
1388
+ ), Ke = (
1364
1389
  /** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
1365
1390
  () => (
1366
1391
  /** @type {LocalizedString} */
1367
1392
  "Fullscreen"
1368
1393
  )
1369
- ), Qe = (
1394
+ ), Xe = (
1370
1395
  /** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
1371
1396
  () => (
1372
1397
  /** @type {LocalizedString} */
1373
1398
  "Volledig scherm"
1374
1399
  )
1375
- ), Ke = (
1400
+ ), Je = (
1376
1401
  /** @type {(inputs: Controls_Fullscreen_Buttonlabel1Inputs) => LocalizedString} */
1377
1402
  () => (
1378
1403
  /** @type {LocalizedString} */
1379
1404
  "Vollbild"
1380
1405
  )
1381
- ), Xe = (
1406
+ ), tn = (
1382
1407
  /** @type {((inputs?: Controls_Fullscreen_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Fullscreen_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1383
1408
  ((n = {}, t = {}) => {
1384
1409
  const e = t.locale ?? u();
1385
- return e === "nl" ? Qe() : e === "de" ? Ke() : Ye();
1410
+ return e === "nl" ? Xe() : e === "de" ? Je() : Ke();
1386
1411
  })
1387
- ), Je = (
1412
+ ), en = (
1388
1413
  /** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
1389
1414
  () => (
1390
1415
  /** @type {LocalizedString} */
1391
1416
  "Downloading"
1392
1417
  )
1393
- ), tn = (
1418
+ ), nn = (
1394
1419
  /** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
1395
1420
  () => (
1396
1421
  /** @type {LocalizedString} */
1397
1422
  "Downloaden"
1398
1423
  )
1399
- ), en = (
1424
+ ), on = (
1400
1425
  /** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
1401
1426
  () => (
1402
1427
  /** @type {LocalizedString} */
1403
1428
  "Herunterladen"
1404
1429
  )
1405
- ), St = (
1430
+ ), _t = (
1406
1431
  /** @type {((inputs?: Loading_Downloadingshort1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_Downloadingshort1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1407
1432
  ((n = {}, t = {}) => {
1408
1433
  const e = t.locale ?? u();
1409
- return e === "nl" ? tn() : e === "de" ? en() : Je();
1434
+ return e === "nl" ? nn() : e === "de" ? on() : en();
1410
1435
  })
1411
- ), nn = (
1436
+ ), sn = (
1412
1437
  /** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
1413
1438
  () => (
1414
1439
  /** @type {LocalizedString} */
1415
1440
  "Rendering"
1416
1441
  )
1417
- ), on = (
1442
+ ), rn = (
1418
1443
  /** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
1419
1444
  () => (
1420
1445
  /** @type {LocalizedString} */
1421
1446
  "Renderen"
1422
1447
  )
1423
- ), sn = (
1448
+ ), an = (
1424
1449
  /** @type {(inputs: Loading_RenderingInputs) => LocalizedString} */
1425
1450
  () => (
1426
1451
  /** @type {LocalizedString} */
1427
1452
  "Rendern"
1428
1453
  )
1429
- ), rn = (
1454
+ ), ln = (
1430
1455
  /** @type {((inputs?: Loading_RenderingInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_RenderingInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1431
1456
  ((n = {}, t = {}) => {
1432
1457
  const e = t.locale ?? u();
1433
- return e === "nl" ? on() : e === "de" ? sn() : nn();
1458
+ return e === "nl" ? rn() : e === "de" ? an() : sn();
1434
1459
  })
1435
- ), an = (
1460
+ ), cn = (
1436
1461
  /** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
1437
1462
  () => (
1438
1463
  /** @type {LocalizedString} */
1439
1464
  "Screenshot"
1440
1465
  )
1441
- ), ln = (
1466
+ ), dn = (
1442
1467
  /** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
1443
1468
  () => (
1444
1469
  /** @type {LocalizedString} */
1445
1470
  "Screenshot"
1446
1471
  )
1447
- ), cn = (
1472
+ ), un = (
1448
1473
  /** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
1449
1474
  () => (
1450
1475
  /** @type {LocalizedString} */
1451
1476
  "Screenshot"
1452
1477
  )
1453
- ), dn = (
1478
+ ), hn = (
1454
1479
  /** @type {((inputs?: Controls_Screenshot_Buttonlabel1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Screenshot_Buttonlabel1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1455
1480
  ((n = {}, t = {}) => {
1456
1481
  const e = t.locale ?? u();
1457
- return e === "nl" ? ln() : e === "de" ? cn() : an();
1482
+ return e === "nl" ? dn() : e === "de" ? un() : cn();
1458
1483
  })
1459
- ), un = (
1484
+ ), mn = (
1460
1485
  /** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
1461
1486
  () => (
1462
1487
  /** @type {LocalizedString} */
1463
1488
  "Configure"
1464
1489
  )
1465
- ), hn = (
1490
+ ), pn = (
1466
1491
  /** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
1467
1492
  () => (
1468
1493
  /** @type {LocalizedString} */
1469
1494
  "Configureren"
1470
1495
  )
1471
- ), mn = (
1496
+ ), fn = (
1472
1497
  /** @type {(inputs: Controls_Configurator_OpenInputs) => LocalizedString} */
1473
1498
  () => (
1474
1499
  /** @type {LocalizedString} */
1475
1500
  "Konfigurieren"
1476
1501
  )
1477
- ), pn = (
1502
+ ), gn = (
1478
1503
  /** @type {((inputs?: Controls_Configurator_OpenInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_OpenInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1479
1504
  ((n = {}, t = {}) => {
1480
1505
  const e = t.locale ?? u();
1481
- return e === "nl" ? hn() : e === "de" ? mn() : un();
1506
+ return e === "nl" ? pn() : e === "de" ? fn() : mn();
1482
1507
  })
1483
- ), fn = (
1508
+ ), bn = (
1484
1509
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1485
1510
  () => (
1486
1511
  /** @type {LocalizedString} */
1487
1512
  "Close"
1488
1513
  )
1489
- ), gn = (
1514
+ ), vn = (
1490
1515
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1491
1516
  () => (
1492
1517
  /** @type {LocalizedString} */
1493
1518
  "Sluiten"
1494
1519
  )
1495
- ), bn = (
1520
+ ), yn = (
1496
1521
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1497
1522
  () => (
1498
1523
  /** @type {LocalizedString} */
1499
1524
  "Schließen"
1500
1525
  )
1501
- ), vn = (
1526
+ ), wn = (
1502
1527
  /** @type {((inputs?: Controls_Configurator_CloseInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_CloseInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1503
1528
  ((n = {}, t = {}) => {
1504
1529
  const e = t.locale ?? u();
1505
- return e === "nl" ? gn() : e === "de" ? bn() : fn();
1530
+ return e === "nl" ? vn() : e === "de" ? yn() : bn();
1506
1531
  })
1507
- ), yn = (
1532
+ ), Sn = (
1508
1533
  /** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
1509
1534
  () => (
1510
1535
  /** @type {LocalizedString} */
1511
1536
  "Reset camera"
1512
1537
  )
1513
- ), wn = (
1538
+ ), _n = (
1514
1539
  /** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
1515
1540
  () => (
1516
1541
  /** @type {LocalizedString} */
1517
1542
  "Camera resetten"
1518
1543
  )
1519
- ), _n = (
1544
+ ), Cn = (
1520
1545
  /** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
1521
1546
  () => (
1522
1547
  /** @type {LocalizedString} */
1523
1548
  "Kamera zurücksetzen"
1524
1549
  )
1525
- ), Sn = (
1550
+ ), kn = (
1526
1551
  /** @type {((inputs?: Controls_Camera_ResetInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_ResetInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1527
1552
  ((n = {}, t = {}) => {
1528
1553
  const e = t.locale ?? u();
1529
- return e === "nl" ? wn() : e === "de" ? _n() : yn();
1554
+ return e === "nl" ? _n() : e === "de" ? Cn() : Sn();
1530
1555
  })
1531
- ), Cn = (
1556
+ ), An = (
1532
1557
  /** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
1533
1558
  () => (
1534
1559
  /** @type {LocalizedString} */
1535
1560
  "Zoom in"
1536
1561
  )
1537
- ), kn = (
1562
+ ), En = (
1538
1563
  /** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
1539
1564
  () => (
1540
1565
  /** @type {LocalizedString} */
1541
1566
  "Inzoomen"
1542
1567
  )
1543
- ), An = (
1568
+ ), xn = (
1544
1569
  /** @type {(inputs: Controls_Camera_Zoomin1Inputs) => LocalizedString} */
1545
1570
  () => (
1546
1571
  /** @type {LocalizedString} */
1547
1572
  "Hineinzoomen"
1548
1573
  )
1549
- ), En = (
1574
+ ), Tn = (
1550
1575
  /** @type {((inputs?: Controls_Camera_Zoomin1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomin1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1551
1576
  ((n = {}, t = {}) => {
1552
1577
  const e = t.locale ?? u();
1553
- return e === "nl" ? kn() : e === "de" ? An() : Cn();
1578
+ return e === "nl" ? En() : e === "de" ? xn() : An();
1554
1579
  })
1555
- ), xn = (
1580
+ ), Rn = (
1556
1581
  /** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
1557
1582
  () => (
1558
1583
  /** @type {LocalizedString} */
1559
1584
  "Zoom out"
1560
1585
  )
1561
- ), Tn = (
1586
+ ), In = (
1562
1587
  /** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
1563
1588
  () => (
1564
1589
  /** @type {LocalizedString} */
1565
1590
  "Uitzoomen"
1566
1591
  )
1567
- ), Rn = (
1592
+ ), Ln = (
1568
1593
  /** @type {(inputs: Controls_Camera_Zoomout1Inputs) => LocalizedString} */
1569
1594
  () => (
1570
1595
  /** @type {LocalizedString} */
1571
1596
  "Herauszoomen"
1572
1597
  )
1573
- ), In = (
1598
+ ), On = (
1574
1599
  /** @type {((inputs?: Controls_Camera_Zoomout1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Zoomout1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1575
1600
  ((n = {}, t = {}) => {
1576
1601
  const e = t.locale ?? u();
1577
- return e === "nl" ? Tn() : e === "de" ? Rn() : xn();
1602
+ return e === "nl" ? In() : e === "de" ? Ln() : Rn();
1578
1603
  })
1579
- ), On = (
1604
+ ), Nn = (
1580
1605
  /** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
1581
1606
  () => (
1582
1607
  /** @type {LocalizedString} */
1583
1608
  "Rotate left"
1584
1609
  )
1585
- ), Nn = (
1610
+ ), Mn = (
1586
1611
  /** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
1587
1612
  () => (
1588
1613
  /** @type {LocalizedString} */
1589
1614
  "Naar links draaien"
1590
1615
  )
1591
- ), Ln = (
1616
+ ), zn = (
1592
1617
  /** @type {(inputs: Controls_Camera_Rotateleft1Inputs) => LocalizedString} */
1593
1618
  () => (
1594
1619
  /** @type {LocalizedString} */
1595
1620
  "Nach links drehen"
1596
1621
  )
1597
- ), Mn = (
1622
+ ), Pn = (
1598
1623
  /** @type {((inputs?: Controls_Camera_Rotateleft1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateleft1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1599
1624
  ((n = {}, t = {}) => {
1600
1625
  const e = t.locale ?? u();
1601
- return e === "nl" ? Nn() : e === "de" ? Ln() : On();
1626
+ return e === "nl" ? Mn() : e === "de" ? zn() : Nn();
1602
1627
  })
1603
- ), zn = (
1628
+ ), Fn = (
1604
1629
  /** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
1605
1630
  () => (
1606
1631
  /** @type {LocalizedString} */
1607
1632
  "Rotate right"
1608
1633
  )
1609
- ), Pn = (
1634
+ ), $n = (
1610
1635
  /** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
1611
1636
  () => (
1612
1637
  /** @type {LocalizedString} */
1613
1638
  "Naar rechts draaien"
1614
1639
  )
1615
- ), Fn = (
1640
+ ), Dn = (
1616
1641
  /** @type {(inputs: Controls_Camera_Rotateright1Inputs) => LocalizedString} */
1617
1642
  () => (
1618
1643
  /** @type {LocalizedString} */
1619
1644
  "Nach rechts drehen"
1620
1645
  )
1621
- ), $n = (
1646
+ ), Bn = (
1622
1647
  /** @type {((inputs?: Controls_Camera_Rotateright1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Rotateright1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1623
1648
  ((n = {}, t = {}) => {
1624
1649
  const e = t.locale ?? u();
1625
- return e === "nl" ? Pn() : e === "de" ? Fn() : zn();
1650
+ return e === "nl" ? $n() : e === "de" ? Dn() : Fn();
1626
1651
  })
1627
- ), Dn = (
1652
+ ), Un = (
1628
1653
  /** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
1629
1654
  () => (
1630
1655
  /** @type {LocalizedString} */
1631
1656
  "Tilt up"
1632
1657
  )
1633
- ), Bn = (
1658
+ ), Vn = (
1634
1659
  /** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
1635
1660
  () => (
1636
1661
  /** @type {LocalizedString} */
1637
1662
  "Omhoog kantelen"
1638
1663
  )
1639
- ), Un = (
1664
+ ), jn = (
1640
1665
  /** @type {(inputs: Controls_Camera_Tiltup1Inputs) => LocalizedString} */
1641
1666
  () => (
1642
1667
  /** @type {LocalizedString} */
1643
1668
  "Nach oben kippen"
1644
1669
  )
1645
- ), Vn = (
1670
+ ), Hn = (
1646
1671
  /** @type {((inputs?: Controls_Camera_Tiltup1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltup1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1647
1672
  ((n = {}, t = {}) => {
1648
1673
  const e = t.locale ?? u();
1649
- return e === "nl" ? Bn() : e === "de" ? Un() : Dn();
1674
+ return e === "nl" ? Vn() : e === "de" ? jn() : Un();
1650
1675
  })
1651
- ), jn = (
1676
+ ), qn = (
1652
1677
  /** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
1653
1678
  () => (
1654
1679
  /** @type {LocalizedString} */
1655
1680
  "Tilt down"
1656
1681
  )
1657
- ), Hn = (
1682
+ ), Gn = (
1658
1683
  /** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
1659
1684
  () => (
1660
1685
  /** @type {LocalizedString} */
1661
1686
  "Omlaag kantelen"
1662
1687
  )
1663
- ), qn = (
1688
+ ), Zn = (
1664
1689
  /** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
1665
1690
  () => (
1666
1691
  /** @type {LocalizedString} */
1667
1692
  "Nach unten kippen"
1668
1693
  )
1669
- ), Gn = (
1694
+ ), Wn = (
1670
1695
  /** @type {((inputs?: Controls_Camera_Tiltdown1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltdown1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1671
1696
  ((n = {}, t = {}) => {
1672
1697
  const e = t.locale ?? u();
1673
- return e === "nl" ? Hn() : e === "de" ? qn() : jn();
1698
+ return e === "nl" ? Gn() : e === "de" ? Zn() : qn();
1674
1699
  })
1675
- ), Zn = (
1700
+ ), Yn = (
1676
1701
  /** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
1677
1702
  () => (
1678
1703
  /** @type {LocalizedString} */
1679
1704
  "Working…"
1680
1705
  )
1681
- ), Wn = (
1706
+ ), Qn = (
1682
1707
  /** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
1683
1708
  () => (
1684
1709
  /** @type {LocalizedString} */
1685
1710
  "Bezig…"
1686
1711
  )
1687
- ), Yn = (
1712
+ ), Kn = (
1688
1713
  /** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
1689
1714
  () => (
1690
1715
  /** @type {LocalizedString} */
1691
1716
  "Läuft…"
1692
1717
  )
1693
- ), Qn = (
1718
+ ), Xn = (
1694
1719
  /** @type {((inputs?: Commerce_Submit_BusyInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_BusyInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1695
1720
  ((n = {}, t = {}) => {
1696
1721
  const e = t.locale ?? u();
1697
- return e === "nl" ? Wn() : e === "de" ? Yn() : Zn();
1722
+ return e === "nl" ? Qn() : e === "de" ? Kn() : Yn();
1698
1723
  })
1699
- ), Kn = (
1724
+ ), Jn = (
1700
1725
  /** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
1701
1726
  () => (
1702
1727
  /** @type {LocalizedString} */
1703
1728
  "Done"
1704
1729
  )
1705
- ), Xn = (
1730
+ ), ti = (
1706
1731
  /** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
1707
1732
  () => (
1708
1733
  /** @type {LocalizedString} */
1709
1734
  "Gelukt"
1710
1735
  )
1711
- ), Jn = (
1736
+ ), ei = (
1712
1737
  /** @type {(inputs: Commerce_Submit_SuccessInputs) => LocalizedString} */
1713
1738
  () => (
1714
1739
  /** @type {LocalizedString} */
1715
1740
  "Fertig"
1716
1741
  )
1717
- ), ti = (
1742
+ ), ni = (
1718
1743
  /** @type {((inputs?: Commerce_Submit_SuccessInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_SuccessInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1719
1744
  ((n = {}, t = {}) => {
1720
1745
  const e = t.locale ?? u();
1721
- return e === "nl" ? Xn() : e === "de" ? Jn() : Kn();
1746
+ return e === "nl" ? ti() : e === "de" ? ei() : Jn();
1722
1747
  })
1723
- ), ei = (
1748
+ ), ii = (
1724
1749
  /** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
1725
1750
  () => (
1726
1751
  /** @type {LocalizedString} */
1727
1752
  "Failed"
1728
1753
  )
1729
- ), ni = (
1754
+ ), oi = (
1730
1755
  /** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
1731
1756
  () => (
1732
1757
  /** @type {LocalizedString} */
1733
1758
  "Mislukt"
1734
1759
  )
1735
- ), ii = (
1760
+ ), si = (
1736
1761
  /** @type {(inputs: Commerce_Submit_FailedInputs) => LocalizedString} */
1737
1762
  () => (
1738
1763
  /** @type {LocalizedString} */
1739
1764
  "Fehlgeschlagen"
1740
1765
  )
1741
- ), oi = (
1766
+ ), ri = (
1742
1767
  /** @type {((inputs?: Commerce_Submit_FailedInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_FailedInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1743
1768
  ((n = {}, t = {}) => {
1744
1769
  const e = t.locale ?? u();
1745
- return e === "nl" ? ni() : e === "de" ? ii() : ei();
1770
+ return e === "nl" ? oi() : e === "de" ? si() : ii();
1746
1771
  })
1747
1772
  );
1748
- const si = {
1773
+ const ai = {
1749
1774
  xmlns: "http://www.w3.org/2000/svg",
1750
1775
  width: 24,
1751
1776
  height: 24,
@@ -1766,12 +1791,12 @@ const Ct = ([n, t, e]) => {
1766
1791
  }), i;
1767
1792
  }, kt = (n, t = {}) => {
1768
1793
  const i = {
1769
- ...si,
1794
+ ...ai,
1770
1795
  ...t
1771
1796
  };
1772
1797
  return Ct(["svg", i, n]);
1773
1798
  };
1774
- const ri = [
1799
+ const li = [
1775
1800
  [
1776
1801
  "path",
1777
1802
  {
@@ -1781,7 +1806,7 @@ const ri = [
1781
1806
  ["path", { d: "m3.3 7 8.7 5 8.7-5" }],
1782
1807
  ["path", { d: "M12 22V12" }]
1783
1808
  ];
1784
- const ai = [
1809
+ const ci = [
1785
1810
  [
1786
1811
  "path",
1787
1812
  {
@@ -1791,26 +1816,26 @@ const ai = [
1791
1816
  ["circle", { cx: "12", cy: "13", r: "3" }]
1792
1817
  ];
1793
1818
  const At = [["path", { d: "m6 9 6 6 6-6" }]];
1794
- const li = [["path", { d: "m15 18-6-6 6-6" }]];
1795
- const ci = [["path", { d: "m9 18 6-6-6-6" }]];
1796
- const di = [["path", { d: "m18 15-6-6-6 6" }]];
1797
- const ui = [
1819
+ const di = [["path", { d: "m15 18-6-6 6-6" }]];
1820
+ const ui = [["path", { d: "m9 18 6-6-6-6" }]];
1821
+ const hi = [["path", { d: "m18 15-6-6-6 6" }]];
1822
+ const mi = [
1798
1823
  ["path", { d: "M15 3h6v6" }],
1799
1824
  ["path", { d: "m21 3-7 7" }],
1800
1825
  ["path", { d: "m3 21 7-7" }],
1801
1826
  ["path", { d: "M9 21H3v-6" }]
1802
1827
  ];
1803
- const hi = [
1828
+ const pi = [
1804
1829
  ["path", { d: "m14 10 7-7" }],
1805
1830
  ["path", { d: "M20 10h-6V4" }],
1806
1831
  ["path", { d: "m3 21 7-7" }],
1807
1832
  ["path", { d: "M4 14h6v6" }]
1808
1833
  ];
1809
- const mi = [
1834
+ const fi = [
1810
1835
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }],
1811
1836
  ["path", { d: "M3 3v5h5" }]
1812
1837
  ];
1813
- const pi = [
1838
+ const gi = [
1814
1839
  ["path", { d: "M10 5H3" }],
1815
1840
  ["path", { d: "M12 19H3" }],
1816
1841
  ["path", { d: "M14 3v4" }],
@@ -1821,16 +1846,16 @@ const pi = [
1821
1846
  ["path", { d: "M8 10v4" }],
1822
1847
  ["path", { d: "M8 12H3" }]
1823
1848
  ];
1824
- const fi = [
1849
+ const bi = [
1825
1850
  ["path", { d: "M18 6 6 18" }],
1826
1851
  ["path", { d: "m6 6 12 12" }]
1827
1852
  ];
1828
- const gi = [
1853
+ const vi = [
1829
1854
  ["circle", { cx: "11", cy: "11", r: "8" }],
1830
1855
  ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
1831
1856
  ["line", { x1: "8", x2: "14", y1: "11", y2: "11" }]
1832
1857
  ];
1833
- const bi = [
1858
+ const yi = [
1834
1859
  ["circle", { cx: "11", cy: "11", r: "8" }],
1835
1860
  ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
1836
1861
  ["line", { x1: "11", x2: "11", y1: "8", y2: "14" }],
@@ -1840,19 +1865,19 @@ function y(n, { size: t = 20, strokeWidth: e = 1.75 } = {}) {
1840
1865
  return kt(n, { width: t, height: t, "stroke-width": e });
1841
1866
  }
1842
1867
  const g = {
1843
- ar: (n) => y(ri, n),
1844
- fullscreen: (n) => y(ui, n),
1845
- exitFullscreen: (n) => y(hi, n),
1846
- screenshot: (n) => y(ai, n),
1847
- tiltUp: (n) => y(di, n),
1868
+ ar: (n) => y(li, n),
1869
+ fullscreen: (n) => y(mi, n),
1870
+ exitFullscreen: (n) => y(pi, n),
1871
+ screenshot: (n) => y(ci, n),
1872
+ tiltUp: (n) => y(hi, n),
1848
1873
  tiltDown: (n) => y(At, n),
1849
- rotateLeft: (n) => y(li, n),
1850
- rotateRight: (n) => y(ci, n),
1851
- zoomIn: (n) => y(bi, n),
1852
- zoomOut: (n) => y(gi, n),
1853
- reset: (n) => y(mi, n),
1854
- configurator: (n) => y(pi, n),
1855
- close: (n) => y(fi, n)
1874
+ rotateLeft: (n) => y(di, n),
1875
+ rotateRight: (n) => y(ui, n),
1876
+ zoomIn: (n) => y(yi, n),
1877
+ zoomOut: (n) => y(vi, n),
1878
+ reset: (n) => y(fi, n),
1879
+ configurator: (n) => y(gi, n),
1880
+ close: (n) => y(bi, n)
1856
1881
  };
1857
1882
  class b {
1858
1883
  element;
@@ -1864,7 +1889,7 @@ class b {
1864
1889
  e !== null ? e.replaceWith(t) : this.element.appendChild(t);
1865
1890
  }
1866
1891
  }
1867
- const m = {
1892
+ const p = {
1868
1893
  semantic: {
1869
1894
  // eslint-disable-next-line vd-custom/enforce-error-codes -- This is a hex color, not an error code
1870
1895
  error: "#dc2626"
@@ -1898,11 +1923,11 @@ const m = {
1898
1923
  // 32px
1899
1924
  9: "2.25rem"
1900
1925
  };
1901
- class vi {
1926
+ class wi {
1902
1927
  element;
1903
1928
  constructor() {
1904
1929
  this.element = document.createElement("div"), Object.assign(this.element.style, {
1905
- background: m.white,
1930
+ background: p.white,
1906
1931
  borderRadius: l[3],
1907
1932
  padding: l[6],
1908
1933
  boxShadow: `0 ${l[2]} ${l[8]} oklch(0% 0 0 / 20%)`,
@@ -1911,9 +1936,9 @@ class vi {
1911
1936
  });
1912
1937
  }
1913
1938
  }
1914
- class yi {
1939
+ class Si {
1915
1940
  constructor(t = {}) {
1916
- this.options = t, this.card = new vi(), this.backdrop = this.createBackdrop(), this.backdrop.appendChild(this.card.element);
1941
+ this.options = t, this.card = new wi(), this.backdrop = this.createBackdrop(), this.backdrop.appendChild(this.card.element);
1917
1942
  }
1918
1943
  options;
1919
1944
  card;
@@ -1942,7 +1967,7 @@ class yi {
1942
1967
  }), t;
1943
1968
  }
1944
1969
  }
1945
- class wi {
1970
+ class _i {
1946
1971
  element;
1947
1972
  selectCallback = null;
1948
1973
  constructor(t, e, i) {
@@ -1963,8 +1988,19 @@ class wi {
1963
1988
  onSelect(t) {
1964
1989
  this.selectCallback = t;
1965
1990
  }
1991
+ /**
1992
+ * Enable only the given values; null lifts every restriction. A disabled
1993
+ * value stays visible (the buyer sees the option exists) but cannot be
1994
+ * picked: the selectable snapshot's "not in the list = grey".
1995
+ */
1996
+ setEnabled(t) {
1997
+ for (const e of this.element.querySelectorAll(".ui-toggle-group-item")) {
1998
+ const i = t === null || t.includes(e.dataset.value ?? "");
1999
+ e.disabled = !i, e.setAttribute("aria-disabled", i ? "false" : "true");
2000
+ }
2001
+ }
1966
2002
  }
1967
- class _i {
2003
+ class Ci {
1968
2004
  element;
1969
2005
  select;
1970
2006
  constructor(t, e, i, o, s) {
@@ -1973,8 +2009,8 @@ class _i {
1973
2009
  r.value = "", r.disabled = !0, r.textContent = i, this.select.appendChild(r);
1974
2010
  let a = !1;
1975
2011
  for (let d = 0; d < e.length; d++) {
1976
- const p = e[d], v = document.createElement("option");
1977
- v.value = p, v.textContent = s?.[d] ?? p, p === o && (v.selected = !0, a = !0), this.select.appendChild(v);
2012
+ const m = e[d], v = document.createElement("option");
2013
+ v.value = m, v.textContent = s?.[d] ?? m, m === o && (v.selected = !0, a = !0), this.select.appendChild(v);
1978
2014
  }
1979
2015
  a || (r.selected = !0);
1980
2016
  const h = kt(At, { width: 16, height: 16, "stroke-width": 2 });
@@ -1988,6 +2024,11 @@ class _i {
1988
2024
  t(this.select.value);
1989
2025
  });
1990
2026
  }
2027
+ /** Enable only the given values; null lifts every restriction (see ToggleGroup.setEnabled). */
2028
+ setEnabled(t) {
2029
+ for (const e of this.select.options)
2030
+ e.value !== "" && (e.disabled = t !== null && !t.includes(e.value));
2031
+ }
1991
2032
  }
1992
2033
  const w = {
1993
2034
  fontFamily: {
@@ -2006,7 +2047,7 @@ const w = {
2006
2047
  medium: "500",
2007
2048
  semibold: "600"
2008
2049
  }
2009
- }, x = w.fontFamily.sans.join(", "), Si = `
2050
+ }, x = w.fontFamily.sans.join(", "), ki = `
2010
2051
  --primary: oklch(5% 0 0);
2011
2052
  --primary-foreground: oklch(100% 0 0);
2012
2053
  --secondary: oklch(92% 0 0);
@@ -2019,8 +2060,8 @@ const w = {
2019
2060
  --accent: oklch(92% 0 0);
2020
2061
  --accent-foreground: oklch(5% 0 0);
2021
2062
  --muted-foreground: oklch(44% 0 0);
2022
- `, Ci = `
2023
- :root { ${Si} }
2063
+ `, Ai = `
2064
+ :root { ${ki} }
2024
2065
 
2025
2066
  /* ── Button ──────────────────────────────────────────────── */
2026
2067
  .ui-btn {
@@ -2096,6 +2137,8 @@ const w = {
2096
2137
  box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
2097
2138
  }
2098
2139
  .ui-toggle-group-item:hover { background: var(--accent); border-color: oklch(85% 0 0); }
2140
+ .ui-toggle-group-item:disabled { opacity: 0.4; cursor: not-allowed; }
2141
+ .ui-toggle-group-item:disabled:hover { background: var(--background); border-color: var(--border); }
2099
2142
  .ui-toggle-group-item:active { transform: scale(0.98); }
2100
2143
  .ui-toggle-group-item:focus-visible {
2101
2144
  outline: none;
@@ -2303,37 +2346,37 @@ function Et() {
2303
2346
  return;
2304
2347
  lt = !0;
2305
2348
  const n = document.createElement("style");
2306
- n.id = "vd-ui-vanilla", n.textContent = Ci, document.head.appendChild(n);
2349
+ n.id = "vd-ui-vanilla", n.textContent = Ai, document.head.appendChild(n);
2307
2350
  }
2308
- const ki = w.fontFamily.sans.join(", ");
2309
- class Ai {
2351
+ const Ei = w.fontFamily.sans.join(", ");
2352
+ class xi {
2310
2353
  qrLib = null;
2311
2354
  dialog = null;
2312
2355
  qrSlot = null;
2313
2356
  /** Open the modal immediately, with a loading placeholder in the QR slot. */
2314
2357
  show() {
2315
- this.hide(), Et(), this.dialog = new yi({ onClose: () => {
2358
+ this.hide(), Et(), this.dialog = new Si({ onClose: () => {
2316
2359
  this.dialog = null, this.qrSlot = null;
2317
2360
  } }), Object.assign(this.dialog.card.element.style, {
2318
2361
  display: "flex",
2319
2362
  flexDirection: "column",
2320
2363
  alignItems: "center",
2321
2364
  gap: l[3],
2322
- fontFamily: ki
2323
- }), this.dialog.card.element.appendChild(this.createText(Pe(), {
2365
+ fontFamily: Ei
2366
+ }), this.dialog.card.element.appendChild(this.createText($e(), {
2324
2367
  fontSize: w.fontSize.base,
2325
2368
  fontWeight: w.fontWeight.semibold,
2326
- color: m.neutral[900]
2327
- })), this.dialog.card.element.appendChild(this.createText(Be(), {
2369
+ color: p.neutral[900]
2370
+ })), this.dialog.card.element.appendChild(this.createText(Ve(), {
2328
2371
  fontSize: w.fontSize.sm,
2329
- color: m.neutral[600]
2330
- })), this.qrSlot = this.createQrSlot(), this.dialog.card.element.appendChild(this.qrSlot), this.dialog.card.element.appendChild(this.createText(He(), {
2372
+ color: p.neutral[600]
2373
+ })), this.qrSlot = this.createQrSlot(), this.dialog.card.element.appendChild(this.qrSlot), this.dialog.card.element.appendChild(this.createText(Ge(), {
2331
2374
  fontSize: w.fontSize.xs,
2332
- color: m.neutral[500]
2375
+ color: p.neutral[500]
2333
2376
  }));
2334
2377
  const t = new b({
2335
2378
  variant: "outline",
2336
- label: We(),
2379
+ label: Qe(),
2337
2380
  onClick: () => {
2338
2381
  this.hide();
2339
2382
  }
@@ -2351,7 +2394,7 @@ class Ai {
2351
2394
  width: 256,
2352
2395
  margin: 4,
2353
2396
  errorCorrectionLevel: "M",
2354
- color: { dark: m.black, light: m.white }
2397
+ color: { dark: p.black, light: p.white }
2355
2398
  });
2356
2399
  return this.qrSlot === null ? !1 : (this.qrSlot.classList.remove("ui-qr-slot--loading"), this.qrSlot.replaceChildren(this.createQrImage(e)), !0);
2357
2400
  }
@@ -2375,20 +2418,20 @@ function ct(n) {
2375
2418
  const t = Math.max(0, Math.min(1, n));
2376
2419
  return t * t * (3 - 2 * t);
2377
2420
  }
2378
- function Ei(n, t, e, i, o, s) {
2379
- const [r, a, h] = n, d = Math.cos(t), p = Math.sin(t), v = d * r + p * h, E = -p * r + d * h, k = Math.cos(e), C = Math.sin(e), R = k * a - C * E, P = C * a + k * E, J = 0.55;
2421
+ function Ti(n, t, e, i, o, s) {
2422
+ const [r, a, h] = n, d = Math.cos(t), m = Math.sin(t), v = d * r + m * h, E = -m * r + d * h, k = Math.cos(e), C = Math.sin(e), R = k * a - C * E, P = C * a + k * E, J = 0.55;
2380
2423
  return [i + v * s * J, o - R * s * J, P];
2381
2424
  }
2382
- function xi(n, t, e) {
2425
+ function Ri(n, t, e) {
2383
2426
  n.beginPath(), n.moveTo(t[0], t[1]), n.lineTo(e[0], e[1]), n.strokeStyle = "#000", n.lineWidth = 2, n.stroke();
2384
2427
  }
2385
- function Ti(n, t, e, i, o) {
2428
+ function Ii(n, t, e, i, o) {
2386
2429
  const s = t(e), r = t(i), a = [
2387
2430
  s[0] + (r[0] - s[0]) * o,
2388
2431
  s[1] + (r[1] - s[1]) * o,
2389
2432
  s[2]
2390
2433
  ];
2391
- xi(n, s, a);
2434
+ Ri(n, s, a);
2392
2435
  }
2393
2436
  const $ = [-1, -1, 1], D = [1, -1, 1], B = [1, -1, -1], U = [-1, -1, -1], V = [-1, 1, 1], j = [1, 1, 1], H = [1, 1, -1], q = [-1, 1, -1], dt = [
2394
2437
  [$, D],
@@ -2403,8 +2446,8 @@ const $ = [-1, -1, 1], D = [1, -1, 1], B = [1, -1, -1], U = [-1, -1, -1], V = [-
2403
2446
  [j, H],
2404
2447
  [H, q],
2405
2448
  [q, V]
2406
- ], Ri = 400, ut = '-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';
2407
- function Ii() {
2449
+ ], Li = 400, ut = '-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';
2450
+ function Oi() {
2408
2451
  const n = document.createElement("div");
2409
2452
  Object.assign(n.style, {
2410
2453
  position: "absolute",
@@ -2447,9 +2490,9 @@ function Ii() {
2447
2490
  fontSize: "13px",
2448
2491
  color: "#000",
2449
2492
  fontFamily: ut
2450
- }), o.textContent = St(), e.appendChild(i), e.appendChild(o), n.appendChild(t), n.appendChild(e), { overlay: n, canvas: t, pctEl: i, phaseEl: o };
2493
+ }), o.textContent = _t(), e.appendChild(i), e.appendChild(o), n.appendChild(t), n.appendChild(e), { overlay: n, canvas: t, pctEl: i, phaseEl: o };
2451
2494
  }
2452
- class Oi {
2495
+ class Ni {
2453
2496
  overlay;
2454
2497
  canvas;
2455
2498
  ctx;
@@ -2462,17 +2505,17 @@ class Oi {
2462
2505
  visible = !1;
2463
2506
  constructor(t, e = {}) {
2464
2507
  this.startTime = performance.now();
2465
- const i = Ii();
2508
+ const i = Oi();
2466
2509
  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());
2467
- const o = e.showDelay ?? Ri;
2510
+ const o = e.showDelay ?? Li;
2468
2511
  this.showTimerId = setTimeout(() => {
2469
2512
  this.reveal();
2470
2513
  }, o);
2471
2514
  }
2472
2515
  get loadingTexts() {
2473
2516
  return {
2474
- downloading: St(),
2475
- rendering: rn()
2517
+ downloading: _t(),
2518
+ rendering: ln()
2476
2519
  };
2477
2520
  }
2478
2521
  updateProgress(t, e) {
@@ -2525,7 +2568,7 @@ class Oi {
2525
2568
  return;
2526
2569
  const t = this.canvas.width / Math.min(devicePixelRatio, 2), e = this.canvas.height / Math.min(devicePixelRatio, 2), i = (performance.now() - this.startTime) / 1e3;
2527
2570
  this.ctx.fillStyle = "#fff", this.ctx.fillRect(0, 0, t, e);
2528
- const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, a = 0.785, h = 0.615, d = (C) => Ei(C, a, h, o, s, r), p = 6, v = i % p / p, E = dt.length;
2571
+ const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, a = 0.785, h = 0.615, d = (C) => Ti(C, a, h, o, s, r), m = 6, v = i % m / m, E = dt.length;
2529
2572
  let k;
2530
2573
  v < 0.35 ? k = ct(v / 0.35) * E : v < 0.55 ? k = E : v < 0.9 ? k = (1 - ct((v - 0.55) / 0.35)) * E : k = 0, this.ctx.shadowBlur = 5, this.ctx.shadowColor = "rgba(30,30,30,0.08)";
2531
2574
  for (let C = 0; C < E && !(C >= k); C++) {
@@ -2533,12 +2576,12 @@ class Oi {
2533
2576
  if (R === void 0)
2534
2577
  continue;
2535
2578
  const P = Math.min(1, k - C);
2536
- Ti(this.ctx, d, R[0], R[1], P);
2579
+ Ii(this.ctx, d, R[0], R[1], P);
2537
2580
  }
2538
2581
  this.ctx.shadowBlur = 0;
2539
2582
  }
2540
2583
  }
2541
- class Ni {
2584
+ class Mi {
2542
2585
  constructor(t) {
2543
2586
  this.options = t, this.element = document.createElement("div"), Object.assign(this.element.style, { display: "flex", gap: "0.375rem" }), this.onFullscreenChange = () => {
2544
2587
  this.setFullscreenIcon(document.fullscreenElement !== null);
@@ -2563,7 +2606,7 @@ class Ni {
2563
2606
  this.arBtn = this.syncButton(this.arBtn, t.ar !== !1 && this.options.onAr !== void 0, () => new b({
2564
2607
  variant: "outline",
2565
2608
  size: "icon",
2566
- label: Ne(),
2609
+ label: Me(),
2567
2610
  icon: g.ar(),
2568
2611
  onClick: () => {
2569
2612
  this.options.onAr?.();
@@ -2571,7 +2614,7 @@ class Ni {
2571
2614
  })), this.fullscreenBtn = this.syncButton(this.fullscreenBtn, t.fullscreen !== !1 && this.options.onFullscreen !== void 0, () => new b({
2572
2615
  variant: "outline",
2573
2616
  size: "icon",
2574
- label: Xe(),
2617
+ label: tn(),
2575
2618
  icon: g.fullscreen(),
2576
2619
  onClick: () => {
2577
2620
  this.options.onFullscreen?.();
@@ -2592,9 +2635,9 @@ class z {
2592
2635
  targetTilt: e.tilt,
2593
2636
  targetZoom: e.zoom,
2594
2637
  thetaOffset: 0
2595
- }, o = Li(t, e, i);
2638
+ }, o = zi(t, e, i);
2596
2639
  e.onChange((s) => {
2597
- i.targetRotation = s.rotation - i.thetaOffset, i.targetTilt = s.tilt, i.targetZoom = s.zoom, Mi(o, e, s);
2640
+ i.targetRotation = s.rotation - i.thetaOffset, i.targetTilt = s.tilt, i.targetZoom = s.zoom, Pi(o, e, s);
2598
2641
  }), this.element.appendChild(z.buildZoom(o.zoomOut, o.zoomIn)), this.element.appendChild(z.buildDpad(o.tiltUp, o.rotateLeft, o.reset, o.rotateRight, o.tiltDown));
2599
2642
  }
2600
2643
  static buildZoom(t, e) {
@@ -2615,7 +2658,7 @@ class z {
2615
2658
  return r;
2616
2659
  }
2617
2660
  }
2618
- function Li(n, t, e) {
2661
+ function zi(n, t, e) {
2619
2662
  const i = (r) => Math.max(t.limits?.minZoom ?? 1, Math.min(t.limits?.maxZoom ?? 1 / 0, r)), o = (r) => {
2620
2663
  const a = t.limits?.minRotate, h = t.limits?.maxRotate;
2621
2664
  return a !== void 0 || h !== void 0 ? Math.max(a ?? -1 / 0, Math.min(h ?? 1 / 0, r)) : r;
@@ -2629,34 +2672,34 @@ function Li(n, t, e) {
2629
2672
  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());
2630
2673
  };
2631
2674
  return {
2632
- zoomOut: new b({ variant: "outline", size: "icon", label: In(), icon: g.zoomOut(), onClick: () => {
2675
+ zoomOut: new b({ variant: "outline", size: "icon", label: On(), icon: g.zoomOut(), onClick: () => {
2633
2676
  e.targetZoom = i(e.targetZoom - 10), n.zoom(e.targetZoom).set();
2634
2677
  } }),
2635
- zoomIn: new b({ variant: "outline", size: "icon", label: En(), icon: g.zoomIn(), onClick: () => {
2678
+ zoomIn: new b({ variant: "outline", size: "icon", label: Tn(), icon: g.zoomIn(), onClick: () => {
2636
2679
  e.targetZoom = i(e.targetZoom + 10), n.zoom(e.targetZoom).set();
2637
2680
  } }),
2638
- tiltUp: new b({ variant: "outline", size: "icon", label: Vn(), icon: g.tiltUp(), onClick: () => {
2681
+ tiltUp: new b({ variant: "outline", size: "icon", label: Hn(), icon: g.tiltUp(), onClick: () => {
2639
2682
  s(-15);
2640
2683
  } }),
2641
- rotateLeft: new b({ variant: "outline", size: "icon", label: Mn(), icon: g.rotateLeft(), onClick: () => {
2684
+ rotateLeft: new b({ variant: "outline", size: "icon", label: Pn(), icon: g.rotateLeft(), onClick: () => {
2642
2685
  e.targetRotation = o(e.targetRotation - 15), n.rotate(e.targetRotation + e.thetaOffset).set();
2643
2686
  } }),
2644
- reset: new b({ variant: "outline", size: "icon", label: Sn(), icon: g.reset(), onClick: () => {
2687
+ reset: new b({ variant: "outline", size: "icon", label: kn(), icon: g.reset(), onClick: () => {
2645
2688
  e.thetaOffset = 0, n.reset();
2646
2689
  } }),
2647
- rotateRight: new b({ variant: "outline", size: "icon", label: $n(), icon: g.rotateRight(), onClick: () => {
2690
+ rotateRight: new b({ variant: "outline", size: "icon", label: Bn(), icon: g.rotateRight(), onClick: () => {
2648
2691
  e.targetRotation = o(e.targetRotation + 15), n.rotate(e.targetRotation + e.thetaOffset).set();
2649
2692
  } }),
2650
- tiltDown: new b({ variant: "outline", size: "icon", label: Gn(), icon: g.tiltDown(), onClick: () => {
2693
+ tiltDown: new b({ variant: "outline", size: "icon", label: Wn(), icon: g.tiltDown(), onClick: () => {
2651
2694
  s(15);
2652
2695
  } })
2653
2696
  };
2654
2697
  }
2655
- function Mi(n, t, e) {
2698
+ function Pi(n, t, e) {
2656
2699
  const i = t.limits;
2657
2700
  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);
2658
2701
  }
2659
- const O = {
2702
+ const L = {
2660
2703
  /** Attribute selection requested (cancelable). `detail`: `{ attribute, value }`. */
2661
2704
  SELECT: "ui:select",
2662
2705
  /** Attribute selection applied. `detail`: `{ attribute, value }`. */
@@ -2667,27 +2710,29 @@ const O = {
2667
2710
  CONFIGURATION_CHANGE: "vd:configuration-change",
2668
2711
  /** Configuration submitted (bubbles). `detail`: the resolved configuration handed to the host. */
2669
2712
  CONFIGURATION_SUBMIT: "vd:configuration-submit"
2670
- }, zi = 5;
2671
- let Pi = 0;
2713
+ }, Fi = 5;
2714
+ let $i = 0;
2672
2715
  function G(n) {
2673
2716
  const t = n.replace(/([A-Z])/g, " $1").trim();
2674
2717
  return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
2675
2718
  }
2676
- function Fi(n, t, e, i, o) {
2719
+ function Di(n, t, e, i, o) {
2677
2720
  const s = document.createElement("div");
2678
2721
  s.className = "vd-attribute", s.dataset.name = n.name;
2679
2722
  const r = document.createElement("span");
2680
- r.className = "vd-attribute-label", r.textContent = G(n.name), r.id = `vd-attribute-label-${Pi++}`, s.appendChild(r), s.setAttribute("role", "group"), s.setAttribute("aria-labelledby", r.id);
2681
- const a = n.values.find((p) => t.getValue(n.name, p)?.isSelected === !0), h = n.values.map(G), d = n.values.length <= zi ? new wi(n.values, a, h) : new _i(n.name, n.values, G(n.name), a, h);
2682
- return d.onSelect((p) => {
2683
- e.dispatch(O.SELECT, { attribute: n.name, value: p }, !0).defaultPrevented || i(n.name, p);
2684
- }), o(n.name, (p) => {
2685
- d.setSelected(p.value), e.dispatch(O.SELECTED, { attribute: n.name, value: p.value });
2686
- }), s.appendChild(d.element), s;
2687
- }
2688
- const $i = 80, Di = 2500;
2689
- class Bi {
2690
- constructor(t, e = Di) {
2723
+ r.className = "vd-attribute-label", r.textContent = G(n.name), r.id = `vd-attribute-label-${$i++}`, s.appendChild(r), s.setAttribute("role", "group"), s.setAttribute("aria-labelledby", r.id);
2724
+ const a = n.values.find((m) => t.getValue(n.name, m)?.isSelected === !0), h = n.values.map(G), d = n.values.length <= Fi ? new _i(n.values, a, h) : new Ci(n.name, n.values, G(n.name), a, h);
2725
+ return d.onSelect((m) => {
2726
+ e.dispatch(L.SELECT, { attribute: n.name, value: m }, !0).defaultPrevented || i(n.name, m);
2727
+ }), o(n.name, (m) => {
2728
+ d.setSelected(m.value), e.dispatch(L.SELECTED, { attribute: n.name, value: m.value });
2729
+ }), s.appendChild(d.element), { element: s, setSelectable: (m) => {
2730
+ d.setEnabled(m);
2731
+ } };
2732
+ }
2733
+ const Bi = 80, Ui = 2500;
2734
+ class Vi {
2735
+ constructor(t, e = Ui) {
2691
2736
  this.configuration = t, this.resetMs = e, this.element = document.createElement("div"), this.element.className = "vd-commerce vd-hidden";
2692
2737
  const i = document.createElement("div");
2693
2738
  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: () => {
@@ -2719,7 +2764,7 @@ class Bi {
2719
2764
  this.priceEl.textContent = "", this.vatEl.textContent = "";
2720
2765
  return;
2721
2766
  }
2722
- this.priceEl.textContent = Ui(t.price, t.currency), this.vatEl.textContent = ht(this.configuration.vatDisplay);
2767
+ this.priceEl.textContent = ji(t.price, t.currency), this.vatEl.textContent = ht(this.configuration.vatDisplay);
2723
2768
  }
2724
2769
  renderButton() {
2725
2770
  const t = this.configuration.submitEnabled;
@@ -2727,11 +2772,11 @@ class Bi {
2727
2772
  }
2728
2773
  async handleSubmit() {
2729
2774
  if (this.state !== "busy") {
2730
- this.setState("busy", Qn());
2775
+ this.setState("busy", Xn());
2731
2776
  try {
2732
- await this.configuration.submit(), this.setState("success", ti());
2777
+ await this.configuration.submit(), this.setState("success", ni());
2733
2778
  } catch {
2734
- this.setState("failed", oi());
2779
+ this.setState("failed", ri());
2735
2780
  }
2736
2781
  this.scheduleReset();
2737
2782
  }
@@ -2749,9 +2794,9 @@ class Bi {
2749
2794
  }
2750
2795
  }
2751
2796
  function ht(n) {
2752
- return (n ?? "").slice(0, $i);
2797
+ return (n ?? "").slice(0, Bi);
2753
2798
  }
2754
- function Ui(n, t) {
2799
+ function ji(n, t) {
2755
2800
  try {
2756
2801
  const e = new Intl.NumberFormat(u(), { style: "currency", currency: t }), i = e.resolvedOptions().maximumFractionDigits ?? 2;
2757
2802
  return e.format(n / 10 ** i);
@@ -2772,8 +2817,8 @@ class xt {
2772
2817
  this.slot?.remove(), this.slot = null, this.panel = null;
2773
2818
  }
2774
2819
  }
2775
- const Vi = 572;
2776
- class ji {
2820
+ const Hi = 572;
2821
+ class qi {
2777
2822
  /** @param actionBarSlot The shared corner slot the AR/fullscreen buttons live in — the
2778
2823
  * "open configurator" toggle joins them there instead of floating as its own overlay. */
2779
2824
  constructor(t) {
@@ -2793,7 +2838,7 @@ class ji {
2793
2838
  this.container = t, e.classList.add("vd-attributes-sidebar"), this.closeButton = new b({
2794
2839
  variant: "ghost",
2795
2840
  size: "icon-sm",
2796
- label: vn(),
2841
+ label: wn(),
2797
2842
  icon: g.close({ size: 18 }),
2798
2843
  onClick: () => {
2799
2844
  this.expanded = !1, this.render();
@@ -2803,7 +2848,7 @@ class ji {
2803
2848
  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({
2804
2849
  variant: "outline",
2805
2850
  size: "icon",
2806
- label: pn(),
2851
+ label: gn(),
2807
2852
  icon: g.configurator({ size: 18 }),
2808
2853
  onClick: () => {
2809
2854
  this.expanded = !0, this.render();
@@ -2819,7 +2864,7 @@ class ji {
2819
2864
  observe() {
2820
2865
  typeof ResizeObserver > "u" || this.container === null || (this.observer = new ResizeObserver((t) => {
2821
2866
  const e = t[0]?.contentRect.width ?? 0;
2822
- this.setCollapsible(e > 0 && e < Vi);
2867
+ this.setCollapsible(e > 0 && e < Hi);
2823
2868
  }), this.observer.observe(this.container));
2824
2869
  }
2825
2870
  setCollapsible(t) {
@@ -2832,7 +2877,7 @@ class ji {
2832
2877
  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-permanent", t && !this.collapsible);
2833
2878
  }
2834
2879
  }
2835
- class Hi {
2880
+ class Gi {
2836
2881
  attach(t, e) {
2837
2882
  }
2838
2883
  setVisible(t) {
@@ -2840,20 +2885,20 @@ class Hi {
2840
2885
  destroy() {
2841
2886
  }
2842
2887
  }
2843
- const qi = {
2888
+ const Zi = {
2844
2889
  "inframe-bottom-left": () => new xt(),
2845
- "sidebar-right": (n) => new ji(n),
2846
- hidden: () => new Hi()
2890
+ "sidebar-right": (n) => new qi(n),
2891
+ hidden: () => new Gi()
2847
2892
  };
2848
- function Gi(n, t) {
2849
- return (qi[n ?? ""] ?? (() => new xt()))(t);
2893
+ function Wi(n, t) {
2894
+ return (Zi[n ?? ""] ?? (() => new xt()))(t);
2850
2895
  }
2851
2896
  const Z = w.fontFamily.sans.join(", "), W = `
2852
2897
  position: absolute;
2853
2898
  display: flex;
2854
2899
  z-index: 10;
2855
2900
  transition: inset-inline-end 0.18s ease;
2856
- `, Zi = `
2901
+ `, Yi = `
2857
2902
  /* Override browser's default black fullscreen backdrop */
2858
2903
  .vd-container:fullscreen {
2859
2904
  background: oklch(100% 0 0);
@@ -2891,7 +2936,7 @@ const Z = w.fontFamily.sans.join(", "), W = `
2891
2936
  display: flex;
2892
2937
  flex-direction: column;
2893
2938
  gap: ${l[1]};
2894
- background: color-mix(in oklch, ${m.white} 85%, transparent);
2939
+ background: color-mix(in oklch, ${p.white} 85%, transparent);
2895
2940
  backdrop-filter: blur(8px);
2896
2941
  border-radius: ${l[2]};
2897
2942
  padding: ${l[2]};
@@ -2919,12 +2964,12 @@ const Z = w.fontFamily.sans.join(", "), W = `
2919
2964
  display: flex;
2920
2965
  flex-direction: column;
2921
2966
  gap: ${l[3]};
2922
- background: color-mix(in oklch, ${m.white} 85%, transparent);
2967
+ background: color-mix(in oklch, ${p.white} 85%, transparent);
2923
2968
  backdrop-filter: blur(8px);
2924
- border: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
2969
+ border: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
2925
2970
  border-radius: ${l[3]};
2926
2971
  padding: ${l[3]};
2927
- box-shadow: 0 ${l[1]} ${l[4]} color-mix(in oklch, ${m.neutral[900]} 6%, transparent);
2972
+ box-shadow: 0 ${l[1]} ${l[4]} color-mix(in oklch, ${p.neutral[900]} 6%, transparent);
2928
2973
  font-family: ${Z};
2929
2974
  }
2930
2975
 
@@ -2938,7 +2983,7 @@ const Z = w.fontFamily.sans.join(", "), W = `
2938
2983
  .vd-attribute-label {
2939
2984
  font-size: ${w.fontSize.xs};
2940
2985
  font-weight: ${w.fontWeight.medium};
2941
- color: ${m.neutral[500]};
2986
+ color: ${p.neutral[500]};
2942
2987
  text-transform: uppercase;
2943
2988
  letter-spacing: 0.05em;
2944
2989
  font-family: ${Z};
@@ -2977,10 +3022,10 @@ const Z = w.fontFamily.sans.join(", "), W = `
2977
3022
  z-index: 11;
2978
3023
  display: flex;
2979
3024
  flex-direction: column;
2980
- background: color-mix(in oklch, ${m.white} 90%, transparent);
3025
+ background: color-mix(in oklch, ${p.white} 90%, transparent);
2981
3026
  backdrop-filter: blur(10px);
2982
- border-inline-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
2983
- box-shadow: -${l[1]} 0 ${l[4]} color-mix(in oklch, ${m.neutral[900]} 5%, transparent);
3027
+ border-inline-start: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
3028
+ box-shadow: -${l[1]} 0 ${l[4]} color-mix(in oklch, ${p.neutral[900]} 5%, transparent);
2984
3029
  }
2985
3030
 
2986
3031
  @media (prefers-reduced-motion: no-preference) {
@@ -3022,7 +3067,7 @@ const Z = w.fontFamily.sans.join(", "), W = `
3022
3067
  flex-direction: column;
3023
3068
  gap: ${l[2]};
3024
3069
  padding-block-start: ${l[3]};
3025
- border-block-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
3070
+ border-block-start: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
3026
3071
  font-family: ${Z};
3027
3072
  }
3028
3073
 
@@ -3035,12 +3080,12 @@ const Z = w.fontFamily.sans.join(", "), W = `
3035
3080
  .vd-price {
3036
3081
  font-size: ${w.fontSize.lg};
3037
3082
  font-weight: ${w.fontWeight.semibold};
3038
- color: ${m.neutral[900]};
3083
+ color: ${p.neutral[900]};
3039
3084
  }
3040
3085
 
3041
3086
  .vd-vat {
3042
3087
  font-size: ${w.fontSize.xs};
3043
- color: ${m.neutral[500]};
3088
+ color: ${p.neutral[500]};
3044
3089
  }
3045
3090
 
3046
3091
  .vd-cta {
@@ -3050,23 +3095,23 @@ const Z = w.fontFamily.sans.join(", "), W = `
3050
3095
 
3051
3096
  /* Failed submit is the one place red belongs: a clear, recoverable error state. */
3052
3097
  .vd-commerce[data-submit="failed"] .vd-cta {
3053
- background: ${m.semantic.error};
3054
- border-color: ${m.semantic.error};
3055
- color: ${m.white};
3098
+ background: ${p.semantic.error};
3099
+ border-color: ${p.semantic.error};
3100
+ color: ${p.white};
3056
3101
  }
3057
3102
 
3058
3103
  `;
3059
- function Wi() {
3104
+ function Qi() {
3060
3105
  if (Et(), document.getElementById("vd-styles") !== null)
3061
3106
  return;
3062
3107
  const n = document.createElement("style");
3063
- n.id = "vd-styles", n.textContent = Zi, document.head.appendChild(n);
3108
+ n.id = "vd-styles", n.textContent = Yi, document.head.appendChild(n);
3064
3109
  }
3065
- function Yi(n, t) {
3110
+ function Ki(n, t) {
3066
3111
  const e = document.createElement("a");
3067
3112
  e.href = `data:image/png;base64,${n}`, e.download = t, e.click();
3068
3113
  }
3069
- class Qi {
3114
+ class Xi {
3070
3115
  options;
3071
3116
  settings = {};
3072
3117
  container = null;
@@ -3076,13 +3121,17 @@ class Qi {
3076
3121
  actionBar = null;
3077
3122
  cameraControls = null;
3078
3123
  attributes = null;
3124
+ /** Rendered attribute groups by name, so a selectable snapshot can reach their controls. */
3125
+ groupHandles = /* @__PURE__ */ new Map();
3126
+ /** The latest selectable snapshot, re-applied when the controls re-render. */
3127
+ lastSelectable = null;
3079
3128
  layout = null;
3080
3129
  commerce = null;
3081
3130
  constructor(t) {
3082
3131
  this.options = t;
3083
3132
  }
3084
3133
  attach(t) {
3085
- Wi(), this.container = t, this.loading = new Oi(t), this.slots.topRight = this.createSlot(t, "vd-slot-top-right"), this.slots.bottomRight = this.createSlot(t, "vd-slot-bottom-right");
3134
+ Qi(), this.container = t, this.loading = new Ni(t), this.slots.topRight = this.createSlot(t, "vd-slot-top-right"), this.slots.bottomRight = this.createSlot(t, "vd-slot-bottom-right");
3086
3135
  }
3087
3136
  onReady() {
3088
3137
  this.loading?.hide(), this.loading = null, this.mountToolbar(), this.cameraControls !== null && (this.cameraControls.element.style.display = "flex"), this.layout?.setVisible(!0);
@@ -3091,7 +3140,7 @@ class Qi {
3091
3140
  if (this.actionBar !== null || this.slots.bottomRight === null || this.container === null)
3092
3141
  return;
3093
3142
  const t = typeof this.container.requestFullscreen == "function";
3094
- this.actionBar = new Ni({
3143
+ this.actionBar = new Mi({
3095
3144
  onAr: this.options.onAr,
3096
3145
  onFullscreen: t ? () => {
3097
3146
  this.toggleFullscreen();
@@ -3112,16 +3161,31 @@ class Qi {
3112
3161
  }
3113
3162
  renderAttributeControls(t, e) {
3114
3163
  if (!(this.container === null || this.slots.topRight === null || this.slots.bottomRight === null) && (this.cameraControls?.element.remove(), this.cameraControls = null, this.teardownConfigurator(), this.settings.cameraControls === !0 && (this.cameraControls = new z(this.options.cameraApi, this.options.cameraPositionApi), this.cameraControls.element.style.display = "none", this.slots.topRight.appendChild(this.cameraControls.element)), this.placeScreenshotButton(), e.length !== 0)) {
3115
- this.attributes = document.createElement("div"), this.attributes.className = "vd-attributes";
3116
- for (const i of e)
3117
- this.attributes.appendChild(Fi(
3164
+ this.attributes = document.createElement("div"), this.attributes.className = "vd-attributes", this.groupHandles = /* @__PURE__ */ new Map();
3165
+ for (const i of e) {
3166
+ const o = Di(
3118
3167
  i,
3119
3168
  t,
3120
3169
  this.options.eventBus,
3121
3170
  this.options.onSelect,
3122
3171
  this.options.onSubscribe
3123
- ));
3124
- this.commerce = new Bi(this.options.configuration), this.attributes.appendChild(this.commerce.element), this.layout = Gi(this.settings.configuratorLayout, this.slots.bottomRight), this.layout.attach(this.container, this.attributes);
3172
+ );
3173
+ this.groupHandles.set(i.name, o), this.attributes.appendChild(o.element);
3174
+ }
3175
+ this.commerce = new Vi(this.options.configuration), this.attributes.appendChild(this.commerce.element), this.layout = Wi(this.settings.configuratorLayout, this.slots.bottomRight), this.layout.attach(this.container, this.attributes), this.lastSelectable !== null && this.applySelectable(this.lastSelectable);
3176
+ }
3177
+ }
3178
+ /**
3179
+ * Grey out what the viewer reports as not pickable: per attribute in the
3180
+ * snapshot only the listed values stay enabled; attributes the snapshot
3181
+ * does not name are unrestricted. The interface renders, it never knows
3182
+ * the exclusion rules (kiesbaarheid live, binding-studio task 17).
3183
+ */
3184
+ applySelectable(t) {
3185
+ this.lastSelectable = t;
3186
+ for (const [e, i] of this.groupHandles) {
3187
+ const o = t.find((s) => s.name === e);
3188
+ i.setSelectable(o?.selectable ?? null);
3125
3189
  }
3126
3190
  }
3127
3191
  get viewerSettings() {
@@ -3129,7 +3193,7 @@ class Qi {
3129
3193
  }
3130
3194
  /** Tear down the configurator panel: price + CTA, attribute controls, layout. */
3131
3195
  teardownConfigurator() {
3132
- this.commerce?.destroy(), this.commerce = null, this.attributes?.remove(), this.attributes = null, this.layout?.destroy(), this.layout = null;
3196
+ this.commerce?.destroy(), this.commerce = null, this.attributes?.remove(), this.attributes = null, this.groupHandles = /* @__PURE__ */ new Map(), this.layout?.destroy(), this.layout = null;
3133
3197
  }
3134
3198
  destroy() {
3135
3199
  this.loading?.destroy(), this.screenshotBtn?.element.remove(), this.actionBar?.destroy(), this.actionBar?.element.remove(), this.cameraControls?.element.remove(), this.teardownConfigurator();
@@ -3146,11 +3210,11 @@ class Qi {
3146
3210
  t && this.screenshotBtn === null && (this.screenshotBtn = new b({
3147
3211
  variant: "outline",
3148
3212
  size: "icon",
3149
- label: dn(),
3213
+ label: hn(),
3150
3214
  icon: g.screenshot(),
3151
3215
  onClick: () => {
3152
3216
  this.options.snapshotApi.take("snapshot.png").onDeveloped(({ data: e, filename: i }) => {
3153
- Yi(e, i);
3217
+ Ki(e, i);
3154
3218
  });
3155
3219
  }
3156
3220
  })), !t && this.screenshotBtn !== null && (this.screenshotBtn.element.remove(), this.screenshotBtn = null);
@@ -3159,8 +3223,8 @@ class Qi {
3159
3223
  this.screenshotBtn === null || this.slots.topRight === null || (this.cameraControls !== null ? this.cameraControls.element.appendChild(this.screenshotBtn.element) : this.slots.topRight.appendChild(this.screenshotBtn.element));
3160
3224
  }
3161
3225
  }
3162
- const Ki = {};
3163
- class Xi {
3226
+ const Ji = {};
3227
+ class to {
3164
3228
  defaultServer = "https://server.virtualdisplay.io";
3165
3229
  options;
3166
3230
  serverHost;
@@ -3201,7 +3265,7 @@ class Xi {
3201
3265
  getServerUrl() {
3202
3266
  if (this.serverHost !== void 0)
3203
3267
  return this.serverHost;
3204
- if (Ki?.VITE_VIRTUALDISPLAY_SERVER_HOST === void 0)
3268
+ if (Ji?.VITE_VIRTUALDISPLAY_SERVER_HOST === void 0)
3205
3269
  return this.defaultServer;
3206
3270
  }
3207
3271
  getParentElement() {
@@ -3213,12 +3277,12 @@ class Xi {
3213
3277
  return t;
3214
3278
  }
3215
3279
  }
3216
- function Ji(n) {
3280
+ function eo(n) {
3217
3281
  const { messenger: t } = n;
3218
3282
  t.on(c.HANDSHAKE, (e) => {
3219
- Nt(e) && (_.info("Server handshake received, flushing publisher queue"), t.markReady());
3283
+ Ot(e) && (_.info("Server handshake received, flushing publisher queue"), t.markReady());
3220
3284
  }), t.on(c.SESSION, (e) => {
3221
- Lt(e) && n.onSession(e.sessionId);
3285
+ Nt(e) && n.onSession(e.sessionId);
3222
3286
  }), t.on(c.MUTATION, (e) => {
3223
3287
  Mt(e) && (n.attributes.handleMutationResult(e), n.configuration.handleSelectionChanged(n.attributes.getSelection()));
3224
3288
  }), t.on(c.SNAPSHOT, (e) => {
@@ -3228,22 +3292,24 @@ function Ji(n) {
3228
3292
  }), t.on(c.LOADING_INDICATOR, (e) => {
3229
3293
  $t(e) && (e.error !== void 0 ? n.ui.showError(e.error) : n.ui.updateProgress(e.progress, e.phase));
3230
3294
  }), t.on(c.CONFIG, (e) => {
3231
- Bt(e) && n.applyConfig(e);
3295
+ Ut(e) && n.applyConfig(e);
3232
3296
  }), t.on(c.MAPPING, (e) => {
3233
3297
  Ft(e) && (n.attributes.handleMappingReceived(e), n.configuration.handleSelectionChanged(n.attributes.getSelection()), n.ui.renderAttributeControls(n.attributes, e.attributes), n.readyStateTracker.handleMappingReceived());
3234
- }), to(n);
3298
+ }), no(n);
3235
3299
  }
3236
- function to(n) {
3300
+ function no(n) {
3237
3301
  const { messenger: t } = n;
3238
3302
  t.on(c.FOCUS, (e) => {
3239
- Ut(e) && n.focus.handleStateReceived(e);
3303
+ Vt(e) && n.focus.handleStateReceived(e);
3240
3304
  }), t.on(c.PRICING, (e) => {
3241
- Vt(e) && n.configuration.handlePricingReceived(e.pricing);
3305
+ jt(e) && n.configuration.handlePricingReceived(e.pricing);
3242
3306
  }), t.on(c.SYNC, (e) => {
3243
3307
  Dt(e) && n.onSync(e.connected);
3308
+ }), t.on(c.SELECTABLE, (e) => {
3309
+ Bt(e) && (n.selectable.handleSnapshot(e), n.ui.applySelectable(e.attributes));
3244
3310
  });
3245
3311
  }
3246
- class eo {
3312
+ class io {
3247
3313
  ready = !1;
3248
3314
  onReady;
3249
3315
  constructor(t) {
@@ -3259,8 +3325,9 @@ class eo {
3259
3325
  this.ready = !1;
3260
3326
  }
3261
3327
  }
3262
- class no {
3328
+ class oo {
3263
3329
  attributes;
3330
+ selectableState;
3264
3331
  readyStateTracker;
3265
3332
  messenger;
3266
3333
  cameraApi;
@@ -3287,29 +3354,29 @@ class no {
3287
3354
  constructor(t, e) {
3288
3355
  this.options = t;
3289
3356
  const i = e ?? {};
3290
- this.serverHost = i.serverHost, this.iframeParams = i.iframeParams, this.initializeLogging(), this.messenger = new jt(
3357
+ this.serverHost = i.serverHost, this.iframeParams = i.iframeParams, this.initializeLogging(), this.messenger = new Ht(
3291
3358
  () => this.iframe?.contentWindow ?? null,
3292
3359
  i.messengerOptions
3293
3360
  );
3294
3361
  const o = (r) => {
3295
3362
  this.messenger.send(r);
3296
3363
  };
3297
- this.attributes = new de(o, (r, a) => {
3364
+ this.attributes = new ue(o, (r, a) => {
3298
3365
  this.notifyMutationFailed(r, a);
3299
- }), this.snapshotApi = new ve(o), this.annotationsApi = new Ht(o), this.cameraApi = new ue(o), this.cameraPositionApi = new he(), this.focusApi = new ge(o, (r) => {
3366
+ }), this.selectableState = new he(), this.snapshotApi = new we(o), this.annotationsApi = new qt(o), this.cameraApi = new me(o), this.cameraPositionApi = new pe(), this.focusApi = new ve(o, (r) => {
3300
3367
  this.dispatchFocusChange(r);
3301
- }), this.configurationApi = new fe(
3368
+ }), this.configurationApi = new be(
3302
3369
  (r) => {
3303
3370
  this.dispatchConfigurationChange(r);
3304
3371
  },
3305
3372
  (r) => {
3306
3373
  this.dispatchConfigurationSubmit(r);
3307
3374
  }
3308
- ), this.eventBus = new ye(), this.arActivation = i.createArActivation?.(o), this.syncTracker = i.createSyncTracker?.(), this.readyStateTracker = new eo(() => {
3375
+ ), this.eventBus = new Se(), this.arActivation = i.createArActivation?.(o), this.syncTracker = i.createSyncTracker?.(), this.readyStateTracker = new io(() => {
3309
3376
  this.notifyReady();
3310
3377
  });
3311
3378
  const s = this.arActivation;
3312
- this.ui = new Qi({
3379
+ this.ui = new Xi({
3313
3380
  snapshotApi: this.snapshotApi,
3314
3381
  cameraApi: this.cameraApi,
3315
3382
  cameraPositionApi: this.cameraPositionApi,
@@ -3327,9 +3394,10 @@ class no {
3327
3394
  }
3328
3395
  /** Wire the inbound viewer protocol to the facades. */
3329
3396
  wireIncomingMessages() {
3330
- Ji({
3397
+ eo({
3331
3398
  messenger: this.messenger,
3332
3399
  attributes: this.attributes,
3400
+ selectable: this.selectableState,
3333
3401
  configuration: this.configurationApi,
3334
3402
  snapshot: this.snapshotApi,
3335
3403
  cameraPosition: this.cameraPositionApi,
@@ -3370,7 +3438,7 @@ class no {
3370
3438
  */
3371
3439
  dispatchFocusChange(t) {
3372
3440
  this.container?.dispatchEvent(
3373
- new CustomEvent(O.FOCUS_CHANGE, { detail: t, bubbles: !0 })
3441
+ new CustomEvent(L.FOCUS_CHANGE, { detail: t, bubbles: !0 })
3374
3442
  );
3375
3443
  }
3376
3444
  /**
@@ -3379,13 +3447,13 @@ class no {
3379
3447
  */
3380
3448
  dispatchConfigurationChange(t) {
3381
3449
  this.container?.dispatchEvent(
3382
- new CustomEvent(O.CONFIGURATION_CHANGE, { detail: t ?? null, bubbles: !0 })
3450
+ new CustomEvent(L.CONFIGURATION_CHANGE, { detail: t ?? null, bubbles: !0 })
3383
3451
  );
3384
3452
  }
3385
3453
  /** Dispatch a bubbling `vd:configuration-submit` event when the CTA is used. */
3386
3454
  dispatchConfigurationSubmit(t) {
3387
3455
  this.container?.dispatchEvent(
3388
- new CustomEvent(O.CONFIGURATION_SUBMIT, { detail: t, bubbles: !0 })
3456
+ new CustomEvent(L.CONFIGURATION_SUBMIT, { detail: t, bubbles: !0 })
3389
3457
  );
3390
3458
  }
3391
3459
  handleConfig(t) {
@@ -3405,10 +3473,10 @@ class no {
3405
3473
  this.messenger.send({ type: c.FULLSCREEN });
3406
3474
  }
3407
3475
  initializeLogging() {
3408
- this.options.debug === !0 && ce(), _.info("Initializing Virtualdisplay client", { model: this.options.model });
3476
+ this.options.debug === !0 && de(), _.info("Initializing Virtualdisplay client", { model: this.options.model });
3409
3477
  }
3410
3478
  createAndConnectIframe() {
3411
- const e = new Xi(this.options, this.serverHost, this.iframeParams).create();
3479
+ const e = new to(this.options, this.serverHost, this.iframeParams).create();
3412
3480
  this.container = e.container, this.iframe = e.iframe, this.eventBus.attach(this.container), this.ui.attach(this.container);
3413
3481
  try {
3414
3482
  const i = new URL(this.iframe.src).origin;
@@ -3444,6 +3512,20 @@ class no {
3444
3512
  onMutationFailed(t) {
3445
3513
  this.mutationFailedCallbacks.push(t);
3446
3514
  }
3515
+ /**
3516
+ * Subscribe to the viewer's selectability snapshots (kiesbaarheid live):
3517
+ * per attribute, which values the buyer can pick right now. Fires with the
3518
+ * current snapshot immediately when one already arrived. A model without
3519
+ * exclusions never sends one: everything stays selectable and this never
3520
+ * fires.
3521
+ */
3522
+ onSelectableChange(t) {
3523
+ this.selectableState.onChange(t);
3524
+ }
3525
+ /** The selectable values for one attribute right now, or null when unrestricted. */
3526
+ getSelectable(t) {
3527
+ return this.selectableState.selectableFor(t);
3528
+ }
3447
3529
  /**
3448
3530
  * Trigger the composed AR flow directly (ar-session-handoff task 035): a host
3449
3531
  * page that hides the built-in corner button (`viewerSettings.ar = false`,
@@ -3486,15 +3568,15 @@ class no {
3486
3568
  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;
3487
3569
  }
3488
3570
  }
3489
- const io = "ar.virtualdisplay.io";
3490
- function oo(n) {
3491
- const t = new URL(`https://${io}/go`);
3571
+ const so = "ar.virtualdisplay.io";
3572
+ function ro(n) {
3573
+ const t = new URL(`https://${so}/go`);
3492
3574
  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();
3493
3575
  }
3494
- const so = 1500;
3495
- class ro {
3576
+ const ao = 1500;
3577
+ class lo {
3496
3578
  options;
3497
- qrModal = new Ai();
3579
+ qrModal = new xi();
3498
3580
  /** The viewer's tracking session id, once the engine announces it (SESSION). */
3499
3581
  sessionId;
3500
3582
  /** Callbacks waiting on the SESSION message, resolved (or timed out) exactly once each. */
@@ -3516,7 +3598,7 @@ class ro {
3516
3598
  }
3517
3599
  /** The AR button handler: mobile activates AR in the engine, desktop shows the hand-off QR. */
3518
3600
  activate() {
3519
- if (ae()) {
3601
+ if (le()) {
3520
3602
  this.options.send({ type: c.AR_ACTIVATE });
3521
3603
  return;
3522
3604
  }
@@ -3540,7 +3622,7 @@ class ro {
3540
3622
  const t = await this.waitForSessionId();
3541
3623
  if (this.destroyed)
3542
3624
  return;
3543
- const e = oo({
3625
+ const e = ro({
3544
3626
  sessionId: t,
3545
3627
  license: this.options.license,
3546
3628
  model: this.options.model
@@ -3561,14 +3643,14 @@ class ro {
3561
3643
  return this.sessionId !== void 0 ? Promise.resolve(this.sessionId) : new Promise((t) => {
3562
3644
  const e = setTimeout(() => {
3563
3645
  this.pendingTimers.delete(e), t(void 0);
3564
- }, so);
3646
+ }, ao);
3565
3647
  this.pendingTimers.add(e), this.waiters.push((i) => {
3566
3648
  this.pendingTimers.delete(e), clearTimeout(e), t(i);
3567
3649
  });
3568
3650
  });
3569
3651
  }
3570
3652
  }
3571
- class ao {
3653
+ class co {
3572
3654
  callbacks = [];
3573
3655
  lastKnown;
3574
3656
  handleSync(t) {
@@ -3580,12 +3662,12 @@ class ao {
3580
3662
  this.callbacks.push(t), this.lastKnown !== void 0 && t(this.lastKnown);
3581
3663
  }
3582
3664
  }
3583
- class uo extends no {
3665
+ class mo extends oo {
3584
3666
  syncStatusTracker;
3585
3667
  constructor(t) {
3586
- const e = new ao();
3668
+ const e = new co();
3587
3669
  super(t, {
3588
- createArActivation: (i) => new ro({
3670
+ createArActivation: (i) => new lo({
3589
3671
  license: t.license,
3590
3672
  model: t.model,
3591
3673
  send: i
@@ -3599,19 +3681,19 @@ class uo extends no {
3599
3681
  }
3600
3682
  }
3601
3683
  export {
3602
- Ht as Annotations,
3603
- Gt as Attribute,
3604
- qt as AttributeValue,
3605
- ue as Camera,
3606
- fe as Configuration,
3684
+ qt as Annotations,
3685
+ Zt as Attribute,
3686
+ Gt as AttributeValue,
3687
+ me as Camera,
3688
+ be as Configuration,
3607
3689
  A as ERROR_CODES,
3608
- ge as Focus,
3609
- be as Photo,
3610
- ve as Snapshot,
3611
- O as VD_EVENTS,
3612
- uo as VirtualdisplayClient,
3690
+ ve as Focus,
3691
+ ye as Photo,
3692
+ we as Snapshot,
3693
+ L as VD_EVENTS,
3694
+ mo as VirtualdisplayClient,
3613
3695
  f as VirtualdisplayError,
3614
- ce as enableDebugMode,
3615
- lo as isDebugMode,
3696
+ de as enableDebugMode,
3697
+ uo as isDebugMode,
3616
3698
  _ as logger
3617
3699
  };