@virtualdisplay.io/client 4.0.0-alpha.28 → 4.0.0-alpha.29

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.
@@ -33,58 +33,58 @@ function Mt(n) {
33
33
  return typeof t.target == "string" ? !1 : typeof t.type == "string" && Lt.has(t.type);
34
34
  }
35
35
  function Nt(n) {
36
- const t = S(n);
36
+ const t = w(n);
37
37
  return t !== null && t.type === c.HANDSHAKE;
38
38
  }
39
39
  function zt(n) {
40
- const t = S(n);
40
+ const t = w(n);
41
41
  return t !== null && t.type === c.SESSION && typeof t.sessionId == "string";
42
42
  }
43
43
  function Pt(n) {
44
- const t = S(n);
44
+ const t = w(n);
45
45
  return t !== null && t.type === c.APP_RESOLVED && typeof t.appType == "string" && t.appType !== "" && typeof t.name == "string";
46
46
  }
47
47
  function Ft(n) {
48
- const t = S(n);
48
+ const t = w(n);
49
49
  return t !== null && t.type === c.MUTATION && typeof t.instance == "string" && t.instance !== "" && Array.isArray(t.results);
50
50
  }
51
51
  function Dt(n) {
52
- const t = S(n);
52
+ const t = w(n);
53
53
  return t !== null && t.type === c.SNAPSHOT && ("data" in t || "error" in t);
54
54
  }
55
55
  function $t(n) {
56
- const t = S(n);
56
+ const t = w(n);
57
57
  return t !== null && t.type === c.CAMERA && Array.isArray(t.transforms);
58
58
  }
59
59
  function Bt(n) {
60
- const t = S(n);
60
+ const t = w(n);
61
61
  return t !== null && t.type === c.MAPPING && typeof t.instance == "string" && t.instance !== "" && Array.isArray(t.attributes);
62
62
  }
63
63
  function Ut(n) {
64
- const t = S(n);
64
+ const t = w(n);
65
65
  return t !== null && t.type === c.LOADING_INDICATOR && typeof t.progress == "number";
66
66
  }
67
67
  function Vt(n) {
68
- const t = S(n);
68
+ const t = w(n);
69
69
  return t !== null && t.type === c.SYNC && typeof t.connected == "boolean";
70
70
  }
71
71
  function jt(n) {
72
- const t = S(n);
72
+ const t = w(n);
73
73
  return t !== null && t.type === c.SELECTABLE && typeof t.instance == "string" && t.instance !== "" && Array.isArray(t.attributes);
74
74
  }
75
75
  function Ht(n) {
76
- const t = S(n);
76
+ const t = w(n);
77
77
  return t !== null && t.type === c.CONFIG && typeof t.viewerSettings == "object";
78
78
  }
79
79
  function qt(n) {
80
- const t = S(n);
80
+ const t = w(n);
81
81
  return t !== null && t.type === c.FOCUS && typeof t.instance == "string" && t.instance !== "" && typeof t.state == "string";
82
82
  }
83
83
  function Gt(n) {
84
- const t = S(n);
84
+ const t = w(n);
85
85
  return t !== null && t.type === c.PRICING && typeof t.instance == "string" && t.instance !== "" && typeof t.pricing == "object" && t.pricing !== null;
86
86
  }
87
- function S(n) {
87
+ function w(n) {
88
88
  return typeof n != "object" || n === null ? null : n;
89
89
  }
90
90
  class nt {
@@ -166,14 +166,12 @@ class Zt {
166
166
  send(t) {
167
167
  this.publisher.enqueue(t);
168
168
  }
169
+ // For a transport that delivers messages some way other than the iframe
170
+ // channel this messenger listens on, such as the viewer's live sync channel,
171
+ // and needs them to land exactly where a postMessage would.
169
172
  /**
170
- * Feed a message through the same routing path as one that just arrived via
171
- * postMessage, without an actual postMessage round-trip: still validated
172
- * against `isValid`, and still respects the consumer queue's buffering. For
173
- * a transport that delivers messages some
174
- * other way than the iframe channel this messenger already listens on (the
175
- * viewer engine's SSE-sourced live sync channel, ar-session-handoff) and
176
- * needs them to land exactly where a postMessage would.
173
+ * Route a message as if it had arrived by postMessage, without the round trip.
174
+ * Still validated against `isValid` and still subject to the consumer queue.
177
175
  */
178
176
  receive(t) {
179
177
  this.isValid(t) && this.consumer.enqueue(t);
@@ -247,7 +245,7 @@ class Wt {
247
245
  });
248
246
  }
249
247
  }
250
- class Yt {
248
+ class Qt {
251
249
  constructor(t, e) {
252
250
  this.value = t, this.attribute = e;
253
251
  }
@@ -290,7 +288,7 @@ class y extends Error {
290
288
  return new y(t, A.INVALID_PARAMETER);
291
289
  }
292
290
  }
293
- class Qt {
291
+ class Yt {
294
292
  name;
295
293
  defaultValue;
296
294
  values;
@@ -342,7 +340,7 @@ class Qt {
342
340
  createValues(t) {
343
341
  const e = /* @__PURE__ */ new Map();
344
342
  for (const i of t) {
345
- const o = new Yt(i, this.name);
343
+ const o = new Qt(i, this.name);
346
344
  i === this.defaultValue && o.setSelected(!0), e.set(i, o);
347
345
  }
348
346
  return e;
@@ -353,7 +351,7 @@ class Kt {
353
351
  constructor(t, e, i) {
354
352
  for (const o of t) {
355
353
  const s = this.buildOptions(o, e);
356
- this.attributes.set(o.name, new Qt(s));
354
+ this.attributes.set(o.name, new Yt(s));
357
355
  }
358
356
  this.onMutationFailed = i;
359
357
  }
@@ -390,9 +388,9 @@ class Kt {
390
388
  return t.defaultValue !== void 0 ? { ...i, defaultValue: t.defaultValue } : i;
391
389
  }
392
390
  }
393
- const N = 4096, D = 16384, Xt = [1024, 256, 64], Jt = 20, Y = ["timestamp", "level", "msg", "service", "trace_id", "span_id"];
391
+ const N = 4096, D = 16384, Xt = [1024, 256, 64], Jt = 20, Q = ["timestamp", "level", "msg", "service", "trace_id", "span_id"];
394
392
  function te(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}=${O(a, N).line}`).join(" ");
393
+ 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]) => !Q.includes(r)).map(([r, a]) => `${r}=${O(a, N).line}`).join(" ");
396
394
  return `${t} ${e} [${i}] ${o}${s ? " " + s : ""}`;
397
395
  }
398
396
  function ee(n) {
@@ -407,7 +405,7 @@ function ee(n) {
407
405
  if (a.length <= D)
408
406
  return a;
409
407
  }
410
- const t = Object.keys(n).filter((o) => !Y.includes(o)), e = { ...ie(n, Y), log_truncated: !0, log_dropped_count: t.length }, i = O({ ...e, log_dropped_attrs: t.slice(0, Jt) }, N);
408
+ const t = Object.keys(n).filter((o) => !Q.includes(o)), e = { ...ie(n, Q), log_truncated: !0, log_dropped_count: t.length }, i = O({ ...e, log_dropped_attrs: t.slice(0, Jt) }, N);
411
409
  return i.line.length <= D ? i.line : O(e, N).line;
412
410
  }
413
411
  function O(n, t) {
@@ -473,11 +471,11 @@ function le() {
473
471
  function ce() {
474
472
  return /iPhone|iPad|iPod/i.test(gt()) || le();
475
473
  }
476
- function ue() {
474
+ function de() {
477
475
  return /Android/i.test(gt());
478
476
  }
479
- function de() {
480
- return ce() || ue();
477
+ function ue() {
478
+ return ce() || de();
481
479
  }
482
480
  class he {
483
481
  constructor(t) {
@@ -539,11 +537,11 @@ function vt(n) {
539
537
  error: (t, e) => n.error(t, M(e))
540
538
  };
541
539
  }
542
- let yt = !1, C = vt(bt("client", { isDev: !1 }));
540
+ let yt = !1, k = vt(bt("client", { isDev: !1 }));
543
541
  function pe() {
544
- yt = !0, C = vt(bt("client", { isDev: !0 }));
542
+ yt = !0, k = vt(bt("client", { isDev: !0 }));
545
543
  }
546
- function _o() {
544
+ function Co() {
547
545
  return yt;
548
546
  }
549
547
  class me {
@@ -559,7 +557,7 @@ class me {
559
557
  * Handle incoming MAPPING message from server
560
558
  */
561
559
  handleMappingReceived(t) {
562
- C.debug("Initializing from server mapping", {
560
+ k.debug("Initializing from server mapping", {
563
561
  attributeCount: t.attributes.length
564
562
  }), this.registry = new Kt(
565
563
  t.attributes,
@@ -606,7 +604,7 @@ class me {
606
604
  }
607
605
  const i = this.registry.get(t);
608
606
  if (i === void 0) {
609
- C.warn(`onChange: attribute "${t}" not found — callback will not fire`);
607
+ k.warn(`onChange: attribute "${t}" not found — callback will not fire`);
610
608
  return;
611
609
  }
612
610
  i.onChange(e);
@@ -631,7 +629,7 @@ class me {
631
629
  replayPendingCallbacks() {
632
630
  for (const { name: t, callback: e } of this.pendingCallbacks) {
633
631
  const i = this.registry?.get(t);
634
- i === void 0 && C.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`), i?.onChange(e);
632
+ i === void 0 && k.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`), i?.onChange(e);
635
633
  }
636
634
  this.pendingCallbacks.length = 0;
637
635
  }
@@ -820,7 +818,7 @@ function ye(n, t) {
820
818
  function it(n) {
821
819
  return Object.keys(n.attributes).length;
822
820
  }
823
- class Se {
821
+ class we {
824
822
  constructor(t, e) {
825
823
  this.dispatchChange = t, this.dispatchSubmit = e;
826
824
  }
@@ -941,7 +939,7 @@ class Se {
941
939
  };
942
940
  }
943
941
  }
944
- class we {
942
+ class Se {
945
943
  constructor(t, e, i) {
946
944
  this.send = t, this.dispatch = e, this.instance = i;
947
945
  }
@@ -991,7 +989,7 @@ class we {
991
989
  this.dispatch(e);
992
990
  }
993
991
  }
994
- class Ce {
992
+ class ke {
995
993
  constructor(t) {
996
994
  this.filename = t;
997
995
  }
@@ -1045,7 +1043,7 @@ class Ce {
1045
1043
  }
1046
1044
  }
1047
1045
  const ot = 3e4;
1048
- class _e {
1046
+ class Ce {
1049
1047
  constructor(t) {
1050
1048
  this.send = t;
1051
1049
  }
@@ -1060,9 +1058,9 @@ class _e {
1060
1058
  * @throws VirtualdisplayError if filename is invalid
1061
1059
  */
1062
1060
  take(t) {
1063
- this.validateFilename(t), C.debug("Taking snapshot", { filename: t });
1064
- const e = new Ce(t), i = setTimeout(() => {
1065
- this.pendingPhotos.delete(t), C.warn("Snapshot timed out", { filename: t }), e.fail(new y(
1061
+ this.validateFilename(t), k.debug("Taking snapshot", { filename: t });
1062
+ const e = new ke(t), i = setTimeout(() => {
1063
+ this.pendingPhotos.delete(t), k.warn("Snapshot timed out", { filename: t }), e.fail(new y(
1066
1064
  `Snapshot timed out: the viewer did not respond within ${ot}ms`,
1067
1065
  A.SNAPSHOT_FAILED
1068
1066
  ));
@@ -1079,7 +1077,7 @@ class _e {
1079
1077
  handleSnapshotResult(t) {
1080
1078
  const e = this.pendingPhotos.get(t.filename);
1081
1079
  if (e === void 0) {
1082
- C.warn("No pending photo found for filename", {
1080
+ k.warn("No pending photo found for filename", {
1083
1081
  filename: t.filename,
1084
1082
  pendingFilenames: Array.from(this.pendingPhotos.keys())
1085
1083
  });
@@ -1132,7 +1130,7 @@ class _e {
1132
1130
  );
1133
1131
  }
1134
1132
  }
1135
- class ke {
1133
+ class _e {
1136
1134
  container = null;
1137
1135
  attach(t) {
1138
1136
  this.container = t;
@@ -1153,22 +1151,22 @@ class ke {
1153
1151
  };
1154
1152
  }
1155
1153
  }
1156
- const Ae = {}, Ee = "en", St = (
1154
+ const Ae = {}, Ee = "en", wt = (
1157
1155
  /** @type {const} */
1158
1156
  ["en", "nl", "de"]
1159
1157
  ), X = [
1160
1158
  "baseLocale"
1161
- ], st = [], Q = typeof window > "u";
1159
+ ], st = [], Y = typeof window > "u";
1162
1160
  globalThis.__paraglide = /** @type {any} */
1163
1161
  globalThis.__paraglide ?? {};
1164
1162
  globalThis.__paraglide.ssr = /** @type {any} */
1165
1163
  globalThis.__paraglide.ssr ?? {};
1166
1164
  let rt = !1, p = () => {
1167
1165
  let n = X;
1168
- !Q && typeof window < "u" && window.location?.href && (n = Ct(window.location.href));
1166
+ !Y && typeof window < "u" && window.location?.href && (n = kt(window.location.href));
1169
1167
  const t = xe(n);
1170
1168
  if (t)
1171
- return rt || (rt = !0, wt(t, { reload: !1 })), t;
1169
+ return rt || (rt = !0, St(t, { reload: !1 })), t;
1172
1170
  throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found");
1173
1171
  };
1174
1172
  function xe(n, t) {
@@ -1176,7 +1174,7 @@ function xe(n, t) {
1176
1174
  for (const i of n) {
1177
1175
  if (i === "baseLocale")
1178
1176
  e = Ee;
1179
- else if (_t(i) && z.has(i)) {
1177
+ else if (Ct(i) && z.has(i)) {
1180
1178
  const s = z.get(i);
1181
1179
  if (s) {
1182
1180
  const r = s.getLocale();
@@ -1194,7 +1192,7 @@ function xe(n, t) {
1194
1192
  const Te = (n) => {
1195
1193
  window.location.reload();
1196
1194
  };
1197
- let wt = (n, t) => {
1195
+ let St = (n, t) => {
1198
1196
  const e = {
1199
1197
  reload: !0,
1200
1198
  ...t
@@ -1206,21 +1204,21 @@ let wt = (n, t) => {
1206
1204
  }
1207
1205
  const o = [];
1208
1206
  let s = X;
1209
- !Q && typeof window < "u" && window.location?.href && (s = Ct(window.location.href));
1207
+ !Y && typeof window < "u" && window.location?.href && (s = kt(window.location.href));
1210
1208
  for (const a of s)
1211
- if (a !== "baseLocale" && _t(a) && z.has(a)) {
1212
- const u = z.get(a);
1213
- if (u) {
1214
- let d = u.setLocale(n);
1215
- d instanceof Promise && (d = d.catch((f) => {
1209
+ if (a !== "baseLocale" && Ct(a) && z.has(a)) {
1210
+ const d = z.get(a);
1211
+ if (d) {
1212
+ let u = d.setLocale(n);
1213
+ u instanceof Promise && (u = u.catch((f) => {
1216
1214
  throw new Error(`Custom strategy "${a}" setLocale failed.`, {
1217
1215
  cause: f
1218
1216
  });
1219
- }), o.push(d));
1217
+ }), o.push(u));
1220
1218
  }
1221
1219
  }
1222
1220
  const r = () => {
1223
- !Q && e.reload && window.location && n !== i && Te();
1221
+ !Y && e.reload && window.location && n !== i && Te();
1224
1222
  };
1225
1223
  if (o.length)
1226
1224
  return Promise.all(o).then(() => {
@@ -1232,7 +1230,7 @@ function J(n) {
1232
1230
  if (typeof n != "string")
1233
1231
  return;
1234
1232
  const t = n.toLowerCase();
1235
- for (const e of St)
1233
+ for (const e of wt)
1236
1234
  if (e.toLowerCase() === t)
1237
1235
  return e;
1238
1236
  }
@@ -1240,7 +1238,7 @@ function Ie(n) {
1240
1238
  const t = J(n);
1241
1239
  if (t)
1242
1240
  return t;
1243
- throw new Error(`Invalid locale: ${n}. Expected one of: ${St.join(", ")}`);
1241
+ throw new Error(`Invalid locale: ${n}. Expected one of: ${wt.join(", ")}`);
1244
1242
  }
1245
1243
  function Oe(n) {
1246
1244
  return Le(n);
@@ -1269,12 +1267,12 @@ function Me(n) {
1269
1267
  }
1270
1268
  return at = t, lt = s, s;
1271
1269
  }
1272
- function Ct(n) {
1270
+ function kt(n) {
1273
1271
  const t = Me(n);
1274
1272
  return t && t.exclude !== !0 && Array.isArray(t.strategy) ? t.strategy : X;
1275
1273
  }
1276
1274
  const z = /* @__PURE__ */ new Map();
1277
- function _t(n) {
1275
+ function Ct(n) {
1278
1276
  return typeof n == "string" && /^custom-[A-Za-z0-9_-]+$/.test(n);
1279
1277
  }
1280
1278
  const Ne = (
@@ -1367,13 +1365,13 @@ const Ne = (
1367
1365
  /** @type {LocalizedString} */
1368
1366
  "Dein Telefon öffnet das 3D-Modell im AR-Modus."
1369
1367
  )
1370
- ), Ye = (
1368
+ ), Qe = (
1371
1369
  /** @type {((inputs?: Controls_Qr_Modalinstructions1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Modalinstructions1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1372
1370
  ((n = {}, t = {}) => {
1373
1371
  const e = t.locale ?? p();
1374
1372
  return e === "nl" ? Ze() : e === "de" ? We() : Ge();
1375
1373
  })
1376
- ), Qe = (
1374
+ ), Ye = (
1377
1375
  /** @type {(inputs: Controls_Qr_Closebutton1Inputs) => LocalizedString} */
1378
1376
  () => (
1379
1377
  /** @type {LocalizedString} */
@@ -1395,7 +1393,7 @@ const Ne = (
1395
1393
  /** @type {((inputs?: Controls_Qr_Closebutton1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Qr_Closebutton1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1396
1394
  ((n = {}, t = {}) => {
1397
1395
  const e = t.locale ?? p();
1398
- return e === "nl" ? Ke() : e === "de" ? Xe() : Qe();
1396
+ return e === "nl" ? Ke() : e === "de" ? Xe() : Ye();
1399
1397
  })
1400
1398
  ), tn = (
1401
1399
  /** @type {(inputs: Controls_Annotations_Buttonlabel1Inputs) => LocalizedString} */
@@ -1451,13 +1449,13 @@ const Ne = (
1451
1449
  /** @type {LocalizedString} */
1452
1450
  "Downloading"
1453
1451
  )
1454
- ), un = (
1452
+ ), dn = (
1455
1453
  /** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
1456
1454
  () => (
1457
1455
  /** @type {LocalizedString} */
1458
1456
  "Downloaden"
1459
1457
  )
1460
- ), dn = (
1458
+ ), un = (
1461
1459
  /** @type {(inputs: Loading_Downloadingshort1Inputs) => LocalizedString} */
1462
1460
  () => (
1463
1461
  /** @type {LocalizedString} */
@@ -1467,7 +1465,7 @@ const Ne = (
1467
1465
  /** @type {((inputs?: Loading_Downloadingshort1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Loading_Downloadingshort1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1468
1466
  ((n = {}, t = {}) => {
1469
1467
  const e = t.locale ?? p();
1470
- return e === "nl" ? un() : e === "de" ? dn() : cn();
1468
+ return e === "nl" ? dn() : e === "de" ? un() : cn();
1471
1469
  })
1472
1470
  ), pn = (
1473
1471
  /** @type {(inputs: Controls_Screenshot_Buttonlabel1Inputs) => LocalizedString} */
@@ -1511,35 +1509,35 @@ const Ne = (
1511
1509
  /** @type {LocalizedString} */
1512
1510
  "Konfigurieren"
1513
1511
  )
1514
- ), Sn = (
1512
+ ), wn = (
1515
1513
  /** @type {((inputs?: Controls_Configurator_OpenInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_OpenInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1516
1514
  ((n = {}, t = {}) => {
1517
1515
  const e = t.locale ?? p();
1518
1516
  return e === "nl" ? vn() : e === "de" ? yn() : bn();
1519
1517
  })
1520
- ), wn = (
1518
+ ), Sn = (
1521
1519
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1522
1520
  () => (
1523
1521
  /** @type {LocalizedString} */
1524
1522
  "Close"
1525
1523
  )
1526
- ), Cn = (
1524
+ ), kn = (
1527
1525
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1528
1526
  () => (
1529
1527
  /** @type {LocalizedString} */
1530
1528
  "Sluiten"
1531
1529
  )
1532
- ), _n = (
1530
+ ), Cn = (
1533
1531
  /** @type {(inputs: Controls_Configurator_CloseInputs) => LocalizedString} */
1534
1532
  () => (
1535
1533
  /** @type {LocalizedString} */
1536
1534
  "Schließen"
1537
1535
  )
1538
- ), kn = (
1536
+ ), _n = (
1539
1537
  /** @type {((inputs?: Controls_Configurator_CloseInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Configurator_CloseInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1540
1538
  ((n = {}, t = {}) => {
1541
1539
  const e = t.locale ?? p();
1542
- return e === "nl" ? Cn() : e === "de" ? _n() : wn();
1540
+ return e === "nl" ? kn() : e === "de" ? Cn() : Sn();
1543
1541
  })
1544
1542
  ), An = (
1545
1543
  /** @type {(inputs: Controls_Camera_ResetInputs) => LocalizedString} */
@@ -1685,13 +1683,13 @@ const Ne = (
1685
1683
  const e = t.locale ?? p();
1686
1684
  return e === "nl" ? Gn() : e === "de" ? Zn() : qn();
1687
1685
  })
1688
- ), Yn = (
1686
+ ), Qn = (
1689
1687
  /** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
1690
1688
  () => (
1691
1689
  /** @type {LocalizedString} */
1692
1690
  "Tilt down"
1693
1691
  )
1694
- ), Qn = (
1692
+ ), Yn = (
1695
1693
  /** @type {(inputs: Controls_Camera_Tiltdown1Inputs) => LocalizedString} */
1696
1694
  () => (
1697
1695
  /** @type {LocalizedString} */
@@ -1707,7 +1705,7 @@ const Ne = (
1707
1705
  /** @type {((inputs?: Controls_Camera_Tiltdown1Inputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Controls_Camera_Tiltdown1Inputs, { locale?: "en" | "nl" | "de" }, {}>} */
1708
1706
  ((n = {}, t = {}) => {
1709
1707
  const e = t.locale ?? p();
1710
- return e === "nl" ? Qn() : e === "de" ? Kn() : Yn();
1708
+ return e === "nl" ? Yn() : e === "de" ? Kn() : Qn();
1711
1709
  })
1712
1710
  ), Jn = (
1713
1711
  /** @type {(inputs: Commerce_Submit_BusyInputs) => LocalizedString} */
@@ -1775,14 +1773,14 @@ const Ne = (
1775
1773
  /** @type {LocalizedString} */
1776
1774
  "Fehlgeschlagen"
1777
1775
  )
1778
- ), ui = (
1776
+ ), di = (
1779
1777
  /** @type {((inputs?: Commerce_Submit_FailedInputs, options?: { locale?: "en" | "nl" | "de" }) => LocalizedString) & import('../runtime.js').MessageMetadata<Commerce_Submit_FailedInputs, { locale?: "en" | "nl" | "de" }, {}>} */
1780
1778
  ((n = {}, t = {}) => {
1781
1779
  const e = t.locale ?? p();
1782
1780
  return e === "nl" ? li() : e === "de" ? ci() : ai();
1783
1781
  })
1784
1782
  );
1785
- const di = {
1783
+ const ui = {
1786
1784
  xmlns: "http://www.w3.org/2000/svg",
1787
1785
  width: 24,
1788
1786
  height: 24,
@@ -1793,20 +1791,20 @@ const di = {
1793
1791
  "stroke-linecap": "round",
1794
1792
  "stroke-linejoin": "round"
1795
1793
  };
1796
- const kt = ([n, t, e]) => {
1794
+ const _t = ([n, t, e]) => {
1797
1795
  const i = document.createElementNS("http://www.w3.org/2000/svg", n);
1798
1796
  return Object.keys(t).forEach((o) => {
1799
1797
  i.setAttribute(o, String(t[o]));
1800
1798
  }), e?.length && e.forEach((o) => {
1801
- const s = kt(o);
1799
+ const s = _t(o);
1802
1800
  i.appendChild(s);
1803
1801
  }), i;
1804
1802
  }, At = (n, t = {}) => {
1805
1803
  const i = {
1806
- ...di,
1804
+ ...ui,
1807
1805
  ...t
1808
1806
  };
1809
- return kt(["svg", i, n]);
1807
+ return _t(["svg", i, n]);
1810
1808
  };
1811
1809
  const hi = [
1812
1810
  [
@@ -1858,17 +1856,17 @@ const yi = [
1858
1856
  ["path", { d: "m3 21 7-7" }],
1859
1857
  ["path", { d: "M9 21H3v-6" }]
1860
1858
  ];
1861
- const Si = [
1859
+ const wi = [
1862
1860
  ["path", { d: "m14 10 7-7" }],
1863
1861
  ["path", { d: "M20 10h-6V4" }],
1864
1862
  ["path", { d: "m3 21 7-7" }],
1865
1863
  ["path", { d: "M4 14h6v6" }]
1866
1864
  ];
1867
- const wi = [
1865
+ const Si = [
1868
1866
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }],
1869
1867
  ["path", { d: "M3 3v5h5" }]
1870
1868
  ];
1871
- const Ci = [
1869
+ const ki = [
1872
1870
  ["path", { d: "M10 5H3" }],
1873
1871
  ["path", { d: "M12 19H3" }],
1874
1872
  ["path", { d: "M14 3v4" }],
@@ -1879,11 +1877,11 @@ const Ci = [
1879
1877
  ["path", { d: "M8 10v4" }],
1880
1878
  ["path", { d: "M8 12H3" }]
1881
1879
  ];
1882
- const _i = [
1880
+ const Ci = [
1883
1881
  ["path", { d: "M18 6 6 18" }],
1884
1882
  ["path", { d: "m6 6 12 12" }]
1885
1883
  ];
1886
- const ki = [
1884
+ const _i = [
1887
1885
  ["circle", { cx: "11", cy: "11", r: "8" }],
1888
1886
  ["line", { x1: "21", x2: "16.65", y1: "21", y2: "16.65" }],
1889
1887
  ["line", { x1: "11", x2: "11", y1: "8", y2: "14" }],
@@ -1902,17 +1900,17 @@ const g = {
1902
1900
  annotations: (n) => b(vi, n),
1903
1901
  annotationsOff: (n) => b(bi, n),
1904
1902
  fullscreen: (n) => b(yi, n),
1905
- exitFullscreen: (n) => b(Si, n),
1903
+ exitFullscreen: (n) => b(wi, n),
1906
1904
  screenshot: (n) => b(pi, n),
1907
1905
  tiltUp: (n) => b(gi, n),
1908
1906
  tiltDown: (n) => b(Et, n),
1909
1907
  rotateLeft: (n) => b(mi, n),
1910
1908
  rotateRight: (n) => b(fi, n),
1911
- zoomIn: (n) => b(ki, n),
1909
+ zoomIn: (n) => b(_i, n),
1912
1910
  zoomOut: (n) => b(Ai, n),
1913
- reset: (n) => b(wi, n),
1914
- configurator: (n) => b(Ci, n),
1915
- close: (n) => b(_i, n)
1911
+ reset: (n) => b(Si, n),
1912
+ configurator: (n) => b(ki, n),
1913
+ close: (n) => b(Ci, n)
1916
1914
  };
1917
1915
  class v {
1918
1916
  element;
@@ -2043,13 +2041,13 @@ class Ri {
2043
2041
  const r = document.createElement("option");
2044
2042
  r.value = "", r.disabled = !0, r.textContent = i, this.select.appendChild(r);
2045
2043
  let a = !1;
2046
- for (let d = 0; d < e.length; d++) {
2047
- const f = e[d], h = document.createElement("option");
2048
- h.value = f, h.textContent = s?.[d] ?? f, f === o && (h.selected = !0, a = !0), this.select.appendChild(h);
2044
+ for (let u = 0; u < e.length; u++) {
2045
+ const f = e[u], h = document.createElement("option");
2046
+ h.value = f, h.textContent = s?.[u] ?? f, f === o && (h.selected = !0, a = !0), this.select.appendChild(h);
2049
2047
  }
2050
2048
  a || (r.selected = !0);
2051
- const u = At(Et, { width: 16, height: 16, "stroke-width": 2 });
2052
- u.classList.add("ui-native-select-icon"), this.element = document.createElement("div"), this.element.className = "ui-native-select-wrap", this.element.appendChild(this.select), this.element.appendChild(u);
2049
+ const d = At(Et, { width: 16, height: 16, "stroke-width": 2 });
2050
+ d.classList.add("ui-native-select-icon"), this.element = document.createElement("div"), this.element.className = "ui-native-select-wrap", this.element.appendChild(this.select), this.element.appendChild(d);
2053
2051
  }
2054
2052
  setSelected(t) {
2055
2053
  this.select.value = t;
@@ -2130,7 +2128,7 @@ class Ii {
2130
2128
  return this.options.unit === void 0 ? e : `${e} ${this.options.unit}`;
2131
2129
  }
2132
2130
  }
2133
- const w = {
2131
+ const S = {
2134
2132
  fontFamily: {
2135
2133
  sans: ["Mona Sans", "ui-sans-serif", "system-ui", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"]
2136
2134
  },
@@ -2147,7 +2145,7 @@ const w = {
2147
2145
  medium: "500",
2148
2146
  semibold: "600"
2149
2147
  }
2150
- }, x = w.fontFamily.sans.join(", "), Oi = `
2148
+ }, x = S.fontFamily.sans.join(", "), Oi = `
2151
2149
  --primary: oklch(5% 0 0);
2152
2150
  --primary-foreground: oklch(100% 0 0);
2153
2151
  --secondary: oklch(92% 0 0);
@@ -2433,6 +2431,11 @@ const w = {
2433
2431
  border: 1px solid var(--border);
2434
2432
  border-radius: var(--radius);
2435
2433
  padding: 0.75rem 1rem;
2434
+ /* The popup is absolutely positioned inside the ~28px marker anchor, so
2435
+ without an explicit width it shrink-to-fits against that anchor and
2436
+ collapses to one word per line. max-content sizes it by its own text,
2437
+ capped below. */
2438
+ inline-size: max-content;
2436
2439
  max-inline-size: 15rem;
2437
2440
  box-shadow: 0 4px 6px oklch(5% 0 0 / 8%), 0 2px 4px oklch(5% 0 0 / 6%);
2438
2441
  pointer-events: auto;
@@ -2440,6 +2443,13 @@ const w = {
2440
2443
  }
2441
2444
  .vd-annotation-popup:focus { outline: none; }
2442
2445
 
2446
+ /* Flipped below the marker when the popup would clip the container's top
2447
+ edge; the layer positions it at open time and on the render cadence. */
2448
+ .vd-annotation-popup--below {
2449
+ inset-block-end: auto;
2450
+ inset-block-start: calc(100% + 0.5rem);
2451
+ }
2452
+
2443
2453
  .vd-annotation-popup-close {
2444
2454
  position: absolute;
2445
2455
  inset-block-start: 0.375rem;
@@ -2476,9 +2486,12 @@ const w = {
2476
2486
  }
2477
2487
  }
2478
2488
 
2489
+ /* Opacity only: the layer sets the popup's transform inline to clamp it
2490
+ inside the container, and a keyframe animating transform would override
2491
+ that for its duration and make the popup jump at the end. */
2479
2492
  @keyframes vd-popup-in {
2480
- from { opacity: 0; transform: translateX(-50%) translateY(4px); }
2481
- to { opacity: 1; transform: translateX(-50%) translateY(0); }
2493
+ from { opacity: 0; }
2494
+ to { opacity: 1; }
2482
2495
  }
2483
2496
 
2484
2497
  .vd-annotation-popup-title {
@@ -2539,7 +2552,7 @@ function xt() {
2539
2552
  const n = document.createElement("style");
2540
2553
  n.id = "vd-ui-vanilla", n.textContent = Li, document.head.appendChild(n);
2541
2554
  }
2542
- const Mi = w.fontFamily.sans.join(", ");
2555
+ const Mi = S.fontFamily.sans.join(", ");
2543
2556
  class Ni {
2544
2557
  qrLib = null;
2545
2558
  dialog = null;
@@ -2555,14 +2568,14 @@ class Ni {
2555
2568
  gap: l[3],
2556
2569
  fontFamily: Mi
2557
2570
  }), this.dialog.card.element.appendChild(this.createText(Ue(), {
2558
- fontSize: w.fontSize.base,
2559
- fontWeight: w.fontWeight.semibold,
2571
+ fontSize: S.fontSize.base,
2572
+ fontWeight: S.fontWeight.semibold,
2560
2573
  color: m.neutral[900]
2561
2574
  })), this.dialog.card.element.appendChild(this.createText(qe(), {
2562
- fontSize: w.fontSize.sm,
2575
+ fontSize: S.fontSize.sm,
2563
2576
  color: m.neutral[600]
2564
- })), this.qrSlot = this.createQrSlot(), this.dialog.card.element.appendChild(this.qrSlot), this.dialog.card.element.appendChild(this.createText(Ye(), {
2565
- fontSize: w.fontSize.xs,
2577
+ })), this.qrSlot = this.createQrSlot(), this.dialog.card.element.appendChild(this.qrSlot), this.dialog.card.element.appendChild(this.createText(Qe(), {
2578
+ fontSize: S.fontSize.xs,
2566
2579
  color: m.neutral[500]
2567
2580
  }));
2568
2581
  const t = new v({
@@ -2605,12 +2618,12 @@ class Ni {
2605
2618
  return e.src = t, e.alt = "QR code", e;
2606
2619
  }
2607
2620
  }
2608
- function ut(n) {
2621
+ function dt(n) {
2609
2622
  const t = Math.max(0, Math.min(1, n));
2610
2623
  return t * t * (3 - 2 * t);
2611
2624
  }
2612
2625
  function zi(n, t, e, i, o, s) {
2613
- const [r, a, u] = n, d = Math.cos(t), f = Math.sin(t), h = d * r + f * u, E = -f * r + d * u, k = Math.cos(e), _ = Math.sin(e), I = k * a - _ * E, F = _ * a + k * E, tt = 0.55;
2626
+ const [r, a, d] = n, u = Math.cos(t), f = Math.sin(t), h = u * r + f * d, E = -f * r + u * d, _ = Math.cos(e), C = Math.sin(e), I = _ * a - C * E, F = C * a + _ * E, tt = 0.55;
2614
2627
  return [i + h * s * tt, o - I * s * tt, F];
2615
2628
  }
2616
2629
  function Pi(n, t, e) {
@@ -2624,7 +2637,7 @@ function Fi(n, t, e, i, o) {
2624
2637
  ];
2625
2638
  Pi(n, s, a);
2626
2639
  }
2627
- const $ = [-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], G = [-1, 1, -1], dt = [
2640
+ const $ = [-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], G = [-1, 1, -1], ut = [
2628
2641
  [$, B],
2629
2642
  [B, U],
2630
2643
  [U, V],
@@ -2753,15 +2766,15 @@ class Bi {
2753
2766
  return;
2754
2767
  const t = this.canvas.width / Math.min(devicePixelRatio, 2), e = this.canvas.height / Math.min(devicePixelRatio, 2), i = (performance.now() - this.startTime) / 1e3;
2755
2768
  this.ctx.fillStyle = "#fff", this.ctx.fillRect(0, 0, t, e);
2756
- const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, a = 0.785, u = 0.615, d = (_) => zi(_, a, u, o, s, r), f = 6, h = i % f / f, E = dt.length;
2757
- let k;
2758
- h < 0.35 ? k = ut(h / 0.35) * E : h < 0.55 ? k = E : h < 0.9 ? k = (1 - ut((h - 0.55) / 0.35)) * E : k = 0, this.ctx.shadowBlur = 5, this.ctx.shadowColor = "rgba(30,30,30,0.08)";
2759
- for (let _ = 0; _ < E && !(_ >= k); _++) {
2760
- const I = dt[_];
2769
+ const o = t / 2, s = e * 0.44, r = Math.min(t, e) * 0.08, a = 0.785, d = 0.615, u = (C) => zi(C, a, d, o, s, r), f = 6, h = i % f / f, E = ut.length;
2770
+ let _;
2771
+ h < 0.35 ? _ = dt(h / 0.35) * E : h < 0.55 ? _ = E : h < 0.9 ? _ = (1 - dt((h - 0.55) / 0.35)) * E : _ = 0, this.ctx.shadowBlur = 5, this.ctx.shadowColor = "rgba(30,30,30,0.08)";
2772
+ for (let C = 0; C < E && !(C >= _); C++) {
2773
+ const I = ut[C];
2761
2774
  if (I === void 0)
2762
2775
  continue;
2763
- const F = Math.min(1, k - _);
2764
- Fi(this.ctx, d, I[0], I[1], F);
2776
+ const F = Math.min(1, _ - C);
2777
+ Fi(this.ctx, u, I[0], I[1], F);
2765
2778
  }
2766
2779
  this.ctx.shadowBlur = 0;
2767
2780
  }
@@ -2856,29 +2869,29 @@ class P {
2856
2869
  static buildDpad(t, e, i, o, s) {
2857
2870
  const r = document.createElement("div");
2858
2871
  r.className = "vd-dpad";
2859
- for (const [a, u] of [
2872
+ for (const [a, d] of [
2860
2873
  [t, "up"],
2861
2874
  [e, "left"],
2862
2875
  [i, "center"],
2863
2876
  [o, "right"],
2864
2877
  [s, "down"]
2865
2878
  ])
2866
- a.element.classList.add(`vd-dpad-${u}`), r.appendChild(a.element);
2879
+ a.element.classList.add(`vd-dpad-${d}`), r.appendChild(a.element);
2867
2880
  return r;
2868
2881
  }
2869
2882
  }
2870
2883
  function Vi(n, t, e) {
2871
2884
  const i = (r) => Math.max(t.limits?.minZoom ?? 1, Math.min(t.limits?.maxZoom ?? 1 / 0, r)), o = (r) => {
2872
- const a = t.limits?.minRotate, u = t.limits?.maxRotate;
2873
- return a !== void 0 || u !== void 0 ? Math.max(a ?? -1 / 0, Math.min(u ?? 1 / 0, r)) : r;
2885
+ const a = t.limits?.minRotate, d = t.limits?.maxRotate;
2886
+ return a !== void 0 || d !== void 0 ? Math.max(a ?? -1 / 0, Math.min(d ?? 1 / 0, r)) : r;
2874
2887
  }, s = (r) => {
2875
- const a = t.limits?.minTilt, u = t.limits?.maxTilt;
2876
- if (a !== void 0 || u !== void 0) {
2877
- e.targetTilt = Math.max(a ?? 0, Math.min(u ?? 180, e.targetTilt + r)), n.tilt(e.targetTilt).set();
2888
+ const a = t.limits?.minTilt, d = t.limits?.maxTilt;
2889
+ if (a !== void 0 || d !== void 0) {
2890
+ e.targetTilt = Math.max(a ?? 0, Math.min(d ?? 180, e.targetTilt + r)), n.tilt(e.targetTilt).set();
2878
2891
  return;
2879
2892
  }
2880
- const d = e.targetTilt + r;
2881
- 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());
2893
+ const u = e.targetTilt + r;
2894
+ u > 180 || u < 0 ? (e.targetTilt = u > 180 ? 360 - u : -u, e.thetaOffset = (e.thetaOffset + 180) % 360, n.tilt(e.targetTilt).rotate(e.targetRotation + e.thetaOffset).set()) : (e.targetTilt = u, n.tilt(e.targetTilt).set());
2882
2895
  };
2883
2896
  return {
2884
2897
  zoomOut: new v({ variant: "outline", size: "icon", label: Pn(), icon: g.zoomOut(), onClick: () => {
@@ -2909,10 +2922,10 @@ function ji(n, t, e) {
2909
2922
  i !== void 0 && (n.zoomOut.element.disabled = i.minZoom !== void 0 && e.zoom <= i.minZoom + R, n.zoomIn.element.disabled = i.maxZoom !== void 0 && e.zoom >= i.maxZoom - R, n.tiltUp.element.disabled = i.minTilt !== void 0 && e.tilt <= i.minTilt + R, n.tiltDown.element.disabled = i.maxTilt !== void 0 && e.tilt >= i.maxTilt - R, n.rotateLeft.element.disabled = i.minRotate !== void 0 && e.rotation <= i.minRotate + R, n.rotateRight.element.disabled = i.maxRotate !== void 0 && e.rotation >= i.maxRotate - R);
2910
2923
  }
2911
2924
  const T = {
2912
- /** Attribute selection requested (cancelable). `detail`: `{ attribute, value }`. */
2913
- SELECT: "ui:select",
2914
- /** Attribute selection applied. `detail`: `{ attribute, value }`. */
2915
- SELECTED: "ui:selected",
2925
+ /** Attribute selection requested (cancelable, does not bubble). `detail`: `{ attribute, value }`. */
2926
+ SELECT: "vd:select",
2927
+ /** Attribute selection applied (does not bubble). `detail`: `{ attribute, value }`. */
2928
+ SELECTED: "vd:selected",
2916
2929
  /** Focus changed (bubbles). `detail`: `{ component, attributes }`, or `null` for the overview. */
2917
2930
  FOCUS_CHANGE: "vd:focus-change",
2918
2931
  /** Resolved configuration changed (bubbles). `detail`: the resolved configuration, or `null` when nothing matches. */
@@ -2942,11 +2955,11 @@ function qi(n, t, e) {
2942
2955
  }).format(o);
2943
2956
  }
2944
2957
  function Gi(n, t, e, i, o, s, r) {
2945
- const a = p(), u = n.values.map((h) => qi(Number(h), t, a)), d = n.values.find((h) => e.getValue(n.name, h)?.isSelected === !0) ?? n.defaultValue, f = new Ii(n.values, {
2958
+ const a = p(), d = n.values.map((h) => qi(Number(h), t, a)), u = n.values.find((h) => e.getValue(n.name, h)?.isSelected === !0) ?? n.defaultValue, f = new Ii(n.values, {
2946
2959
  label: n.name,
2947
- labels: u,
2960
+ labels: d,
2948
2961
  unit: t.displayUnit,
2949
- ...d !== void 0 && { initialSelected: d }
2962
+ ...u !== void 0 && { initialSelected: u }
2950
2963
  });
2951
2964
  return f.onSelect((h) => {
2952
2965
  o(n.name, h);
@@ -2971,14 +2984,14 @@ function K(n) {
2971
2984
  const t = n.replace(/([A-Z])/g, " $1").trim();
2972
2985
  return t.charAt(0).toUpperCase() + t.slice(1).toLowerCase();
2973
2986
  }
2974
- function Yi(n, t, e, i, o, s) {
2987
+ function Qi(n, t, e, i, o, s) {
2975
2988
  const r = document.createElement("div");
2976
2989
  r.className = "vd-attribute", r.dataset.name = n.name;
2977
2990
  const a = document.createElement("span");
2978
2991
  a.className = "vd-attribute-label", a.textContent = K(n.name), a.id = `vd-attribute-label-${Wi++}`, r.appendChild(a), r.setAttribute("role", "group"), r.setAttribute("aria-labelledby", a.id);
2979
- const u = (f) => {
2992
+ const d = (f) => {
2980
2993
  r.style.display = f ? "none" : "";
2981
- }, d = n.dimension !== void 0 ? Gi(
2994
+ }, u = n.dimension !== void 0 ? Gi(
2982
2995
  n,
2983
2996
  n.dimension,
2984
2997
  t,
@@ -2986,21 +2999,21 @@ function Yi(n, t, e, i, o, s) {
2986
2999
  o,
2987
3000
  i,
2988
3001
  s
2989
- ) : Qi(n, t, e, i, s);
2990
- return r.appendChild(d.element), { element: r, setSelectable: d.setSelectable, setHidden: u };
3002
+ ) : Yi(n, t, e, i, s);
3003
+ return r.appendChild(u.element), { element: r, setSelectable: u.setSelectable, setHidden: d };
2991
3004
  }
2992
- function Qi(n, t, e, i, o) {
3005
+ function Yi(n, t, e, i, o) {
2993
3006
  const s = n.values.find(
2994
- (u) => t.getValue(n.name, u)?.isSelected === !0
3007
+ (d) => t.getValue(n.name, d)?.isSelected === !0
2995
3008
  ), r = n.values.map(K), a = n.values.length <= Zi ? new Ti(n.values, s, r) : new Ri(n.name, n.values, K(n.name), s, r);
2996
- return a.onSelect((u) => {
2997
- e.dispatch(T.SELECT, { attribute: n.name, value: u }, !0).defaultPrevented || i(n.name, u);
2998
- }), o(n.name, (u) => {
2999
- a.setSelected(u.value), e.dispatch(T.SELECTED, { attribute: n.name, value: u.value });
3009
+ return a.onSelect((d) => {
3010
+ e.dispatch(T.SELECT, { attribute: n.name, value: d }, !0).defaultPrevented || i(n.name, d);
3011
+ }), o(n.name, (d) => {
3012
+ a.setSelected(d.value), e.dispatch(T.SELECTED, { attribute: n.name, value: d.value });
3000
3013
  }), {
3001
3014
  element: a.element,
3002
- setSelectable: (u) => {
3003
- a.setEnabled(u);
3015
+ setSelectable: (d) => {
3016
+ a.setEnabled(d);
3004
3017
  }
3005
3018
  };
3006
3019
  }
@@ -3050,7 +3063,7 @@ class Ji {
3050
3063
  try {
3051
3064
  await this.configuration.submit(), this.setState("success", ri());
3052
3065
  } catch {
3053
- this.setState("failed", ui());
3066
+ this.setState("failed", di());
3054
3067
  }
3055
3068
  this.scheduleReset();
3056
3069
  }
@@ -3112,7 +3125,7 @@ class no {
3112
3125
  this.container = t, e.classList.add("vd-attributes-sidebar"), this.closeButton = new v({
3113
3126
  variant: "ghost",
3114
3127
  size: "icon-sm",
3115
- label: kn(),
3128
+ label: _n(),
3116
3129
  icon: g.close({ size: 18 }),
3117
3130
  onClick: () => {
3118
3131
  this.expanded = !1, this.render();
@@ -3122,7 +3135,7 @@ class no {
3122
3135
  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 v({
3123
3136
  variant: "outline",
3124
3137
  size: "icon",
3125
- label: Sn(),
3138
+ label: wn(),
3126
3139
  icon: g.configurator({ size: 18 }),
3127
3140
  onClick: () => {
3128
3141
  this.expanded = !0, this.render();
@@ -3167,7 +3180,7 @@ const oo = {
3167
3180
  function so(n, t) {
3168
3181
  return (oo[n ?? ""] ?? (() => new Rt()))(t);
3169
3182
  }
3170
- const Z = w.fontFamily.sans.join(", "), W = `
3183
+ const Z = S.fontFamily.sans.join(", "), W = `
3171
3184
  position: absolute;
3172
3185
  display: flex;
3173
3186
  z-index: 10;
@@ -3255,8 +3268,8 @@ const Z = w.fontFamily.sans.join(", "), W = `
3255
3268
 
3256
3269
  /* Micro-label: recedes so the controls lead. */
3257
3270
  .vd-attribute-label {
3258
- font-size: ${w.fontSize.xs};
3259
- font-weight: ${w.fontWeight.medium};
3271
+ font-size: ${S.fontSize.xs};
3272
+ font-weight: ${S.fontWeight.medium};
3260
3273
  color: ${m.neutral[500]};
3261
3274
  text-transform: uppercase;
3262
3275
  letter-spacing: 0.05em;
@@ -3352,13 +3365,13 @@ const Z = w.fontFamily.sans.join(", "), W = `
3352
3365
  }
3353
3366
 
3354
3367
  .vd-price {
3355
- font-size: ${w.fontSize.lg};
3356
- font-weight: ${w.fontWeight.semibold};
3368
+ font-size: ${S.fontSize.lg};
3369
+ font-weight: ${S.fontWeight.semibold};
3357
3370
  color: ${m.neutral[900]};
3358
3371
  }
3359
3372
 
3360
3373
  .vd-vat {
3361
- font-size: ${w.fontSize.xs};
3374
+ font-size: ${S.fontSize.xs};
3362
3375
  color: ${m.neutral[500]};
3363
3376
  }
3364
3377
 
@@ -3432,7 +3445,7 @@ class co {
3432
3445
  this.loading?.showError(t);
3433
3446
  }
3434
3447
  applyViewerSettings(t) {
3435
- this.settings = t, t.language !== void 0 && wt(t.language, { reload: !1 }), this.syncScreenshotButton(), this.actionBar?.applySettings(t), this.cameraControls !== null && (this.cameraControls.element.style.display = t.cameraControls === !0 ? "flex" : "none"), this.placeScreenshotButton();
3448
+ this.settings = t, t.language !== void 0 && St(t.language, { reload: !1 }), this.syncScreenshotButton(), this.actionBar?.applySettings(t), this.cameraControls !== null && (this.cameraControls.element.style.display = t.cameraControls === !0 ? "flex" : "none"), this.placeScreenshotButton();
3436
3449
  }
3437
3450
  renderAttributeControls(t, e) {
3438
3451
  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 P(
@@ -3441,7 +3454,7 @@ class co {
3441
3454
  ), this.cameraControls.element.style.display = "none", this.slots.topRight.appendChild(this.cameraControls.element)), this.placeScreenshotButton(), e.length !== 0)) {
3442
3455
  this.attributes = document.createElement("div"), this.attributes.className = "vd-attributes", this.groupHandles = /* @__PURE__ */ new Map();
3443
3456
  for (const i of e) {
3444
- const o = Yi(
3457
+ const o = Qi(
3445
3458
  i,
3446
3459
  t,
3447
3460
  this.options.eventBus,
@@ -3555,7 +3568,7 @@ class ho {
3555
3568
  t.searchParams.set("license", this.options.license), t.searchParams.set("model", this.options.model);
3556
3569
  return;
3557
3570
  }
3558
- t.searchParams.set("app", this.options.app), (this.options.license !== void 0 || this.options.model !== void 0) && C.warn("Both `app` and `license`/`model` were supplied: `app` wins, the pair was ignored");
3571
+ t.searchParams.set("app", this.options.app), (this.options.license !== void 0 || this.options.model !== void 0) && k.warn("Both `app` and `license`/`model` were supplied: `app` wins, the pair was ignored");
3559
3572
  }
3560
3573
  getServerUrl() {
3561
3574
  if (this.serverHost !== void 0)
@@ -3575,7 +3588,7 @@ class ho {
3575
3588
  function po(n) {
3576
3589
  const { messenger: t } = n;
3577
3590
  t.on(c.HANDSHAKE, (e) => {
3578
- Nt(e) && (C.info("Server handshake received, flushing publisher queue"), t.markReady());
3591
+ Nt(e) && (k.info("Server handshake received, flushing publisher queue"), t.markReady());
3579
3592
  }), t.on(c.SESSION, (e) => {
3580
3593
  zt(e) && n.onSession(e.sessionId);
3581
3594
  }), t.on(c.MUTATION, (e) => {
@@ -3613,7 +3626,7 @@ class fo {
3613
3626
  this.onReady = t;
3614
3627
  }
3615
3628
  handleMappingReceived() {
3616
- this.ready || (this.ready = !0, C.info("Mapping received from server, client is now ready"), this.onReady?.());
3629
+ this.ready || (this.ready = !0, k.info("Mapping received from server, client is now ready"), this.onReady?.());
3617
3630
  }
3618
3631
  get isReady() {
3619
3632
  return this.ready;
@@ -3644,9 +3657,9 @@ class bo {
3644
3657
  options;
3645
3658
  serverHost;
3646
3659
  iframeParams;
3647
- /** The composed AR flow, or undefined in builds without one (the studio). */
3660
+ /** The composed AR flow, or undefined in a build that composes none. */
3648
3661
  arActivation;
3649
- /** The composed sync tracker, or undefined in builds without one (the studio). */
3662
+ /** The composed sync tracker, or undefined in a build that composes none. */
3650
3663
  syncTracker;
3651
3664
  iframe;
3652
3665
  container;
@@ -3669,16 +3682,16 @@ class bo {
3669
3682
  };
3670
3683
  this.attributes = new me(o, L, (s, r) => {
3671
3684
  this.notifyMutationFailed(s, r);
3672
- }), this.selectableState = new fe(), this.snapshotApi = new _e(o), this.annotationsApi = new Wt(o, L), this.cameraApi = new ge(o), this.cameraPositionApi = new be(), this.focusApi = new we(o, (s) => {
3685
+ }), this.selectableState = new fe(), this.snapshotApi = new Ce(o), this.annotationsApi = new Wt(o, L), this.cameraApi = new ge(o), this.cameraPositionApi = new be(), this.focusApi = new Se(o, (s) => {
3673
3686
  this.dispatchFocusChange(s);
3674
- }, L), this.configurationApi = new Se(
3687
+ }, L), this.configurationApi = new we(
3675
3688
  (s) => {
3676
3689
  this.dispatchConfigurationChange(s);
3677
3690
  },
3678
3691
  (s) => {
3679
3692
  this.dispatchConfigurationSubmit(s);
3680
3693
  }
3681
- ), this.eventBus = new ke(), this.arActivation = i.createArActivation?.(o), this.syncTracker = i.createSyncTracker?.(), this.readyStateTracker = new fo(() => {
3694
+ ), this.eventBus = new _e(), this.arActivation = i.createArActivation?.(o), this.syncTracker = i.createSyncTracker?.(), this.readyStateTracker = new fo(() => {
3682
3695
  this.notifyReady();
3683
3696
  }), this.ui = this.createStandardInterface(), this.wireIncomingMessages(), i.registerHandlers?.(this.messenger, o), this.messenger.start(), this.createAndConnectIframe();
3684
3697
  }
@@ -3707,13 +3720,11 @@ class bo {
3707
3720
  }
3708
3721
  });
3709
3722
  }
3710
- /**
3711
- * The visible toggle composes its message here, on the internal transport,
3712
- * because it is the one sender allowed to stamp `origin: 'control'`: the
3713
- * viewer only counts control-originated flips as Shopper use. The public
3714
- * `client.annotations` facade stays origin-less on purpose. One send per
3715
- * member instance once composition lands; today the host is the only one.
3716
- */
3723
+ // The visible toggle composes its message here because it is the one sender
3724
+ // allowed to stamp `origin: 'control'`: the viewer only counts
3725
+ // control-originated flips as Shopper use. The public `client.annotations`
3726
+ // facade stays origin-less on purpose. One send per member instance once
3727
+ // composition lands; today the host is the only one.
3717
3728
  sendControlAnnotationToggle(t) {
3718
3729
  this.messenger.send({
3719
3730
  type: c.ANNOTATION_TOGGLE,
@@ -3808,18 +3819,18 @@ class bo {
3808
3819
  const s = Object.entries(i).filter(([r, a]) => e[r] !== a).map(
3809
3820
  ([r, a]) => `${r} (metadata: ${e[r] ?? "undefined"}, override: ${a})`
3810
3821
  );
3811
- s.length > 0 && C.warn(`Viewer settings override active: ${s.join(", ")}`);
3822
+ s.length > 0 && k.warn(`Viewer settings override active: ${s.join(", ")}`);
3812
3823
  }
3813
3824
  this.ui.applyViewerSettings(o), this.echoAnnotationsDifference(e?.annotations, o.annotations);
3814
3825
  }
3815
3826
  this.cameraPositionApi.applyLimits(t.cameraLimits);
3816
3827
  }
3828
+ // The viewer already applied the announced mode itself, so speaking up when
3829
+ // the merged mode matches would toggle it back and forth for nothing. A boot
3830
+ // without overrides therefore sends no toggle at all.
3817
3831
  /**
3818
- * The difference echo: the viewer already applied the app-config mode
3819
- * itself, so the client only speaks up when the merged mode (config plus
3820
- * integrator override) differs from what CONFIG announced, in either
3821
- * direction. Equal modes echo nothing, so a boot without overrides sends
3822
- * no toggle at all.
3832
+ * Tell the viewer about the annotation mode only when the merged mode differs
3833
+ * from the one it announced.
3823
3834
  */
3824
3835
  echoAnnotationsDifference(t, e) {
3825
3836
  e === void 0 || e === t || this.annotationsApi.setEnabled(e === "show" || e === "toggle-shown");
@@ -3829,7 +3840,7 @@ class bo {
3829
3840
  this.messenger.send({ type: c.FULLSCREEN });
3830
3841
  }
3831
3842
  initializeLogging() {
3832
- this.options.debug === !0 && pe(), C.info("Initializing Virtualdisplay client", {
3843
+ this.options.debug === !0 && pe(), k.info("Initializing Virtualdisplay client", {
3833
3844
  ...this.options.app === void 0 ? { model: this.options.model } : { app: this.options.app }
3834
3845
  });
3835
3846
  }
@@ -3871,11 +3882,9 @@ class bo {
3871
3882
  this.mutationFailedCallbacks.push(t);
3872
3883
  }
3873
3884
  /**
3874
- * Subscribe to the viewer's selectability snapshots (kiesbaarheid live):
3875
- * per attribute, which values the buyer can pick right now. Fires with the
3876
- * current snapshot immediately when one already arrived. A model without
3877
- * exclusions never sends one: everything stays selectable and this never
3878
- * fires.
3885
+ * Subscribe to which values can be picked right now, per attribute. Fires
3886
+ * immediately when a snapshot already arrived. A model with no exclusions
3887
+ * never sends one, so this never fires and everything stays selectable.
3879
3888
  */
3880
3889
  onSelectableChange(t) {
3881
3890
  this.selectableState.onChange(t);
@@ -3892,12 +3901,11 @@ class bo {
3892
3901
  getSelectable(t) {
3893
3902
  return this.selectableState.selectableFor(t);
3894
3903
  }
3904
+ // Exists for a host page that hides the built-in button and owns its own AR
3905
+ // affordance: without this it would have no way into the same flow.
3895
3906
  /**
3896
- * Trigger the composed AR flow directly (ar-session-handoff task 035): a host
3897
- * page that hides the built-in corner button (`viewerSettings.ar = false`,
3898
- * e.g. the AR landing, which owns a single custom AR affordance) still needs
3899
- * an entry point to the same flow that button would have called. A no-op
3900
- * where no AR flow is composed (the studio client has none).
3907
+ * Start the AR flow directly, as the built-in AR button would. Does nothing
3908
+ * when `viewerSettings.ar` is off or the build composes no AR flow.
3901
3909
  */
3902
3910
  activateAr() {
3903
3911
  this.arActivation?.activate();
@@ -3939,8 +3947,8 @@ function yo(n) {
3939
3947
  const t = new URL(`https://${vo}/go`);
3940
3948
  return n.sessionId !== void 0 ? t.searchParams.set("session", n.sessionId) : n.app !== void 0 ? t.searchParams.set("app", n.app) : n.license !== void 0 && n.model !== void 0 && (t.searchParams.set("license", n.license), t.searchParams.set("model", n.model)), t.toString();
3941
3949
  }
3942
- const So = 1500;
3943
- class wo {
3950
+ const wo = 1500;
3951
+ class So {
3944
3952
  options;
3945
3953
  qrModal = new Ni();
3946
3954
  /** The viewer's tracking session id, once the engine announces it (SESSION). */
@@ -3964,7 +3972,7 @@ class wo {
3964
3972
  }
3965
3973
  /** The AR button handler: mobile activates AR in the engine, desktop shows the hand-off QR. */
3966
3974
  activate() {
3967
- if (de()) {
3975
+ if (ue()) {
3968
3976
  this.options.send({ type: c.AR_ACTIVATE });
3969
3977
  return;
3970
3978
  }
@@ -4010,14 +4018,14 @@ class wo {
4010
4018
  return this.sessionId !== void 0 ? Promise.resolve(this.sessionId) : new Promise((t) => {
4011
4019
  const e = setTimeout(() => {
4012
4020
  this.pendingTimers.delete(e), t(void 0);
4013
- }, So);
4021
+ }, wo);
4014
4022
  this.pendingTimers.add(e), this.waiters.push((i) => {
4015
4023
  this.pendingTimers.delete(e), clearTimeout(e), t(i);
4016
4024
  });
4017
4025
  });
4018
4026
  }
4019
4027
  }
4020
- class Co {
4028
+ class ko {
4021
4029
  callbacks = [];
4022
4030
  lastKnown;
4023
4031
  handleSync(t) {
@@ -4032,9 +4040,9 @@ class Co {
4032
4040
  class Ao extends bo {
4033
4041
  syncStatusTracker;
4034
4042
  constructor(t) {
4035
- const e = new Co();
4043
+ const e = new ko();
4036
4044
  super(t, {
4037
- createArActivation: (i) => new wo({
4045
+ createArActivation: (i) => new So({
4038
4046
  app: t.app,
4039
4047
  license: t.license,
4040
4048
  model: t.model,
@@ -4050,18 +4058,18 @@ class Ao extends bo {
4050
4058
  }
4051
4059
  export {
4052
4060
  Wt as Annotations,
4053
- Qt as Attribute,
4054
- Yt as AttributeValue,
4061
+ Yt as Attribute,
4062
+ Qt as AttributeValue,
4055
4063
  ge as Camera,
4056
- Se as Configuration,
4064
+ we as Configuration,
4057
4065
  A as ERROR_CODES,
4058
- we as Focus,
4059
- Ce as Photo,
4060
- _e as Snapshot,
4066
+ Se as Focus,
4067
+ ke as Photo,
4068
+ Ce as Snapshot,
4061
4069
  T as VD_EVENTS,
4062
4070
  Ao as VirtualdisplayClient,
4063
4071
  y as VirtualdisplayError,
4064
4072
  pe as enableDebugMode,
4065
- _o as isDebugMode,
4066
- C as logger
4073
+ Co as isDebugMode,
4074
+ k as logger
4067
4075
  };