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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.0.0-alpha.24
4
+
5
+ ### Patch Changes
6
+
7
+ Accept `undefined` for the optional `ClientOptions` fields `language`, `debug` and `traceparent`. Projects that enable `exactOptionalPropertyTypes` can now pass a possibly-undefined value straight through without a type error.
8
+
3
9
  ## 4.0.0-alpha.23
4
10
 
5
11
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -311,18 +311,6 @@ interface MessengerOptions {
311
311
  * When false (default), incoming messages are processed immediately.
312
312
  */
313
313
  bufferIncoming?: boolean;
314
- /**
315
- * When buffering, messages where this returns false bypass the buffer
316
- * and are routed to handlers immediately. Used for urgent messages
317
- * like CONFIG that must be handled before the model loads.
318
- */
319
- shouldBuffer?: (message: Message) => boolean;
320
- /**
321
- * Restrict postMessage to a specific origin (e.g. 'https://example.com').
322
- * Defaults to '*' when not set. Set this when the target origin is known
323
- * to prevent messages from being intercepted by unintended recipients.
324
- */
325
- targetOrigin?: string;
326
314
  /**
327
315
  * Which protocol to validate incoming messages against — not whether to validate.
328
316
  * Both sides always reject browser-extension noise and unknown message types. The
@@ -357,11 +345,11 @@ interface MessengerOptions {
357
345
  * messenger.send({ type: 'mutation', mutations, isInitial: true });
358
346
  * ```
359
347
  *
360
- * @example Server (inside iframe — both queues, CONFIG bypasses consumer)
348
+ * @example Server (inside iframe — both queues)
361
349
  * ```ts
362
350
  * const messenger = new IframeMessenger(
363
351
  * () => window.parent !== window ? window.parent : null,
364
- * { bufferIncoming: true, shouldBuffer: (msg) => msg.type !== 'config' },
352
+ * { bufferIncoming: true },
365
353
  * );
366
354
  * messenger.on('mutation', processMutation);
367
355
  * messenger.on('config', applyConfig);
@@ -376,7 +364,6 @@ declare class IframeMessenger {
376
364
  private readonly handlers;
377
365
  private readonly publisher;
378
366
  private readonly consumer;
379
- private readonly shouldBuffer;
380
367
  private listener;
381
368
  private readonly sourceId;
382
369
  private targetOrigin;
@@ -386,10 +373,6 @@ declare class IframeMessenger {
386
373
  * Register a handler for a specific message type
387
374
  */
388
375
  on(type: string, handler: MessageCallback): void;
389
- /**
390
- * Remove a handler for a specific message type
391
- */
392
- off(type: string): void;
393
376
  /**
394
377
  * Update the target origin for outgoing postMessage calls.
395
378
  * Use when the target origin is discovered at runtime (e.g. from the first incoming message).
@@ -403,8 +386,8 @@ declare class IframeMessenger {
403
386
  /**
404
387
  * Feed a message through the same routing path as one that just arrived via
405
388
  * postMessage, without an actual postMessage round-trip: still validated
406
- * against `isValid`, and still respects the consumer queue's buffering and
407
- * the `shouldBuffer` bypass. For a transport that delivers messages some
389
+ * against `isValid`, and still respects the consumer queue's buffering. For
390
+ * a transport that delivers messages some
408
391
  * other way than the iframe channel this messenger already listens on (the
409
392
  * viewer engine's SSE-sourced live sync channel, ar-session-handoff) and
410
393
  * needs them to land exactly where a postMessage would.
@@ -866,17 +849,17 @@ interface ClientOptions {
866
849
  readonly parent: string | HTMLElement;
867
850
  readonly model: string;
868
851
  readonly license: string;
869
- readonly debug?: boolean;
870
- readonly language?: string;
852
+ readonly debug?: boolean | undefined;
853
+ readonly language?: string | undefined;
871
854
  /** W3C traceparent string to propagate to the viewer iframe for end-to-end tracing. */
872
- readonly traceparent?: string;
855
+ readonly traceparent?: string | undefined;
873
856
  /**
874
857
  * A source viewer session id to restore into this mount (ar-session-handoff): the
875
858
  * iframe's metadata fetch merges that session's latest configuration into the
876
859
  * attribute defaults, so the viewer boots straight into it. Internal option, used
877
860
  * by the AR landing, not a customer-facing setting.
878
861
  */
879
- readonly session?: string;
862
+ readonly session?: string | undefined;
880
863
  /**
881
864
  * Override viewer settings from metadata. Omitted fields use the metadata value.
882
865
  * A warning is logged when an override differs from the metadata value.
@@ -966,6 +949,12 @@ interface BaseClientExtensions {
966
949
  * so the host cannot be a single build-time env shared by both.
967
950
  */
968
951
  readonly serverHost?: string;
952
+ /**
953
+ * Extra query parameters for the viewer iframe URL. An extension seam like
954
+ * `serverHost`: a client type's fixed capability flags (the studio client's
955
+ * metadata-override boot mode), never a per-instance public option.
956
+ */
957
+ readonly iframeParams?: Readonly<Record<string, string>>;
969
958
  /**
970
959
  * The AR flow behind the standard interface's AR button. The public client
971
960
  * composes its `ArActivation` here; the studio composes nothing (the editor
@@ -999,6 +988,7 @@ declare class BaseClient {
999
988
  private readonly ui;
1000
989
  private readonly options;
1001
990
  private readonly serverHost;
991
+ private readonly iframeParams;
1002
992
  /** The composed AR flow, or undefined in builds without one (the studio). */
1003
993
  private readonly arActivation;
1004
994
  /** The composed sync tracker, or undefined in builds without one (the studio). */
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={HANDSHAKE:"handshake",SESSION:"session",MUTATION:"mutation",STATE:"state",LOADING_INDICATOR:"loading_indicator",CAMERA:"camera",SNAPSHOT:"snapshot",MAPPING:"mapping",AR_ACTIVATE:"ar_activate",FULLSCREEN:"fullscreen",CONFIG:"config",ANNOTATION_TOGGLE:"annotation_toggle",FOCUS:"focus",PRICING:"pricing",QR_SHOWN:"qr_shown",SYNC:"sync"},W={FOCUS:"focus",UNFOCUS:"unfocus"},Nt={FOCUSED:"focused"},Mt={HIDDEN:"hidden"},Lt=new Set(Object.values(c));function zt(n){if(typeof n!="object"||n===null)return!1;const t=n;return typeof t.target=="string"?!1:typeof t.type=="string"&&Lt.has(t.type)}function Pt(n){const t=_(n);return t!==null&&t.type===c.HANDSHAKE}function Ft(n){const t=_(n);return t!==null&&t.type===c.SESSION&&typeof t.sessionId=="string"}function $t(n){const t=_(n);return t!==null&&t.type===c.MUTATION&&Array.isArray(t.results)}function Dt(n){const t=_(n);return t!==null&&t.type===c.SNAPSHOT&&("data"in t||"error"in t)}function Bt(n){const t=_(n);return t!==null&&t.type===c.CAMERA&&Array.isArray(t.transforms)}function Ut(n){const t=_(n);return t!==null&&t.type===c.MAPPING&&Array.isArray(t.attributes)}function Vt(n){const t=_(n);return t!==null&&t.type===c.LOADING_INDICATOR&&typeof t.progress=="number"}function jt(n){const t=_(n);return t!==null&&t.type===c.SYNC&&typeof t.connected=="boolean"}function Ht(n){const t=_(n);return t!==null&&t.type===c.CONFIG&&typeof t.viewerSettings=="object"}function qt(n){const t=_(n);return t!==null&&t.type===c.FOCUS&&typeof t.state=="string"}function Gt(n){const t=_(n);return t!==null&&t.type===c.PRICING&&typeof t.pricing=="object"&&t.pricing!==null}function _(n){return typeof n!="object"||n===null?null:n}class Q{constructor(t){this.processor=t}processor;pending=[];isReady=!1;enqueue(t){if(this.isReady){this.processor(t);return}this.pending.push(t)}markReady(){if(this.isReady||(this.isReady=!0,this.pending.length===0))return;const t=[...this.pending];this.pending.length=0;for(const e of t)this.processor(e)}get ready(){return this.isReady}get pendingCount(){return this.pending.length}hasPending(t){return this.pending.some(e=>e.type===t)}clear(){this.pending.length=0}}class Zt{constructor(t,e){this.getTarget=t,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.targetOrigin=e?.targetOrigin??"*",this.isValid=e?.isValid??zt,this.publisher=new Q(i=>this.post(i)),this.consumer=new Q(i=>this.routeToHandler(i)),this.shouldBuffer=e?.shouldBuffer??null,e?.bufferIncoming!==!0&&this.consumer.markReady()}getTarget;handlers=new Map;publisher;consumer;shouldBuffer;listener=null;sourceId;targetOrigin;isValid;on(t,e){this.handlers.set(t,e)}off(t){this.handlers.delete(t)}setTargetOrigin(t){this.targetOrigin=t}send(t){this.publisher.enqueue(t)}receive(t){if(this.isValid(t)){if(this.shouldBuffer!==null&&!this.shouldBuffer(t)){this.routeToHandler(t);return}this.consumer.enqueue(t)}}markReady(){this.publisher.markReady()}markConsumerReady(){this.consumer.markReady()}consumerHasPending(t){return this.consumer.hasPending(t)}start(){this.listener===null&&(this.listener=t=>{const{data:e}=t;if(!this.isValid(e)||e._source===this.sourceId)return;const i=this.getTarget();if(i!==null&&t.source!==null&&t.source!==i)return;const o=e;if(this.shouldBuffer!==null&&!this.shouldBuffer(o)){this.routeToHandler(o);return}this.consumer.enqueue(o)},window.addEventListener("message",this.listener))}destroy(){this.listener!==null&&(window.removeEventListener("message",this.listener),this.listener=null),this.publisher.clear(),this.consumer.clear(),this.handlers.clear()}get ready(){return this.publisher.ready}get pendingCount(){return this.publisher.pendingCount}post(t){const e=this.getTarget();e!==null&&e.postMessage({...t,_source:this.sourceId},this.targetOrigin)}routeToHandler(t){const e=this.handlers.get(t.type);if(e===void 0)return;const i=e(t);i instanceof Promise&&i.catch(o=>{const s=o instanceof Error?o.message:String(o);console.error(`Virtualdisplay: error handling ${t.type}: ${s}`)})}}class at{constructor(t){this.send=t}send;setEnabled(t){this.send({type:c.ANNOTATION_TOGGLE,enabled:t})}}class lt{constructor(t,e){this.value=t,this.attribute=e}value;attribute;isSelectedValue=!1;get isSelected(){return this.isSelectedValue}setSelected(t){this.isSelectedValue=t}}const C={NO_MAPPING:"NO_MAPPING",ATTRIBUTE_NOT_FOUND:"ATTRIBUTE_NOT_FOUND",VALUE_NOT_FOUND:"VALUE_NOT_FOUND",PARENT_NOT_FOUND:"PARENT_NOT_FOUND",INVALID_PARAMETER:"INVALID_PARAMETER",SNAPSHOT_FAILED:"SNAPSHOT_FAILED"};class f extends Error{code;constructor(t,e){super(t),this.name="VirtualdisplayError",this.code=e}static valueNotFound(t,e){return new f(`Value "${e}" not found for attribute "${t}"`,C.VALUE_NOT_FOUND)}static parentNotFound(t){return new f(`Parent element not found: ${t}`,C.PARENT_NOT_FOUND)}static invalidParameter(t){return new f(t,C.INVALID_PARAMETER)}}class ct{name;defaultValue;values;onSelect;onChangeCallback;constructor(t){this.name=t.name,this.defaultValue=t.defaultValue,this.onSelect=t.onSelect,this.values=this.createValues(t.values)}select(t){if(!this.values.has(t))throw f.valueNotFound(this.name,t);this.onSelect(this.name,t)}getValues(){return Array.from(this.values.values())}getValue(t){return this.values.get(t)}get selected(){for(const t of this.values.values())if(t.isSelected)return t.value}onChange(t){this.onChangeCallback=t}handleResult(t){let e;for(const i of this.values.values()){const o=i.value===t;i.setSelected(o),o&&(e=i)}e!==void 0&&this.onChangeCallback!==void 0&&this.onChangeCallback(e)}createValues(t){const e=new Map;for(const i of t){const o=new lt(i,this.name);i===this.defaultValue&&o.setSelected(!0),e.set(i,o)}return e}}class Wt{attributes=new Map;constructor(t,e,i){for(const o of t){const s=this.buildOptions(o,e);this.attributes.set(o.name,new ct(s))}this.onMutationFailed=i}onMutationFailed;get(t){return this.attributes.get(t)}getSelection(){const t={};for(const[e,i]of this.attributes){const o=i.selected;o!==void 0&&(t[e]=o)}return t}handleResults(t){for(const e of t){if(!e.success){this.onMutationFailed?.(e.name,e.value);continue}this.get(e.name)?.handleResult(e.value)}}buildOptions(t,e){const i={name:t.name,values:t.values,onSelect:(o,s)=>{e([{name:o,value:s}],!1)}};return t.defaultValue!==void 0?{...i,defaultValue:t.defaultValue}:i}}function Qt(n){const t=new Date(n.timestamp).toLocaleTimeString("en-GB",{hour12:!1}),e=n.level.toUpperCase().padEnd(5),i=n.trace_id?.slice(0,8)??"--------",o=n.msg,s=["timestamp","level","msg","service","trace_id","span_id"],r=Object.entries(n).filter(([l])=>!s.includes(l)).map(([l,d])=>`${l}=${JSON.stringify(d)}`).join(" ");return`${t} ${e} [${i}] ${o}${r?" "+r:""}`}function Yt(n){return JSON.stringify(n)}function Kt(n,t){const e=t?Qt(n):Yt(n);n.level==="error"?console.error(e):n.level==="warn"?console.warn(e):console.log(e)}function ut(n,t=0){const e={name:n.name,message:n.message};n.stack!==void 0&&(e.stack=n.stack);for(const i of Object.getOwnPropertyNames(n)){if(i==="name"||i==="message"||i==="stack"||i==="cause")continue;const o=n[i];o!==void 0&&(e[i]=o)}return n.cause!==void 0&&n.cause!==null&&(e.cause=n.cause instanceof Error&&t<5?ut(n.cause,t+1):String(n.cause)),e}function Xt(n){const t={};for(const[e,i]of Object.entries(n))t[e]=i instanceof Error?ut(i):i;return t}function Jt(){return new Date}function te(n){return n.toISOString()}function dt(){return typeof navigator>"u"?"":navigator.userAgent}function ee(){return typeof navigator>"u"?!1:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function ne(){return/iPhone|iPad|iPod/i.test(dt())||ee()}function ie(){return/Android/i.test(dt())}function oe(){return ne()||ie()}class se{constructor(t){this.config=t}config;log(t,e,i={}){const o=this.config.traceProvider?.()??{},s={timestamp:te(Jt()),level:t,msg:e,service:this.config.service,...o,...Xt(i)};Kt(s,this.config.isDev)}debug(t,e){this.config.isDev&&this.log("debug",t,e)}info(t,e){this.log("info",t,e)}warn(t,e){this.log("warn",t,e)}error(t,e){this.log("error",t,e)}}function ht(n,t){const e=t?.isDev!==void 0?t.isDev:typeof process<"u"?process.env.NODE_ENV!=="production":!0;return new se({service:n,isDev:e,traceProvider:t?.traceProvider})}function I(n){if(n!==void 0)return typeof n=="object"&&n!==null&&!Array.isArray(n)&&!(n instanceof Error)?n:n instanceof Error?{error:n.message}:{value:n}}function mt(n){return{debug:(t,e)=>n.debug(t,I(e)),info:(t,e)=>n.info(t,I(e)),warn:(t,e)=>n.warn(t,I(e)),error:(t,e)=>n.error(t,I(e))}}let pt=!1;exports.logger=mt(ht("client",{isDev:!1}));function ft(){pt=!0,exports.logger=mt(ht("client",{isDev:!0}))}function re(){return pt}class ae{constructor(t,e){this.send=t,this.onMutationFailed=e}send;onMutationFailed;registry;pendingCallbacks=[];handleMappingReceived(t){exports.logger.debug("Initializing from server mapping",{attributeCount:t.attributes.length}),this.registry=new Wt(t.attributes,(e,i)=>this.sendMutation(e,i),this.onMutationFailed),this.replayPendingCallbacks()}handleMutationResult(t){this.registry?.handleResults(t.results)}select(t,e){this.sendMutation([{name:t,value:e}],!1)}getValues(t){return this.registry?.get(t)?.getValues()??[]}getValue(t,e){return this.registry?.get(t)?.getValue(e)}onChange(t,e){if(this.registry===void 0){this.pendingCallbacks.push({name:t,callback:e});return}const i=this.registry.get(t);if(i===void 0){exports.logger.warn(`onChange: attribute "${t}" not found — callback will not fire`);return}i.onChange(e)}getAttribute(t){return this.registry?.get(t)}getSelection(){return this.registry?.getSelection()??{}}get hasMapping(){return this.registry!==void 0}sendMutation(t,e){const i={type:c.MUTATION,mutations:t,isInitial:e};this.send(i)}replayPendingCallbacks(){for(const{name:t,callback:e}of this.pendingCallbacks){const i=this.registry?.get(t);i===void 0&&exports.logger.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`),i?.onChange(e)}this.pendingCallbacks.length=0}}let gt=class{constructor(t){this.send=t}send;commands=[];rotate(t){return this.validateFiniteNumber(t,"rotate"),this.commands.push({action:"rotate",value:t}),this}tilt(t){return this.validateFiniteNumber(t,"tilt"),this.commands.push({action:"tilt",value:t}),this}zoom(t){return this.validateFiniteNumber(t,"zoom"),this.commands.push({action:"zoom",value:t}),this}set(){if(this.commands.length===0)throw f.invalidParameter("No camera commands to execute. Call rotate(), tilt(), or zoom() before set().");const t={type:c.CAMERA,commands:this.commands};this.send(t),this.commands=[]}validateFiniteNumber(t,e){if(!Number.isFinite(t))throw f.invalidParameter(`${e}() requires a finite number, got ${String(t)}`)}reset(){const t={type:c.CAMERA,commands:[{action:"reset"}]};this.send(t)}};class le{state;limitsState;changeCallbacks=[];constructor(){this.state={rotation:0,tilt:0,zoom:100}}get rotation(){return this.state.rotation}get tilt(){return this.state.tilt}get zoom(){return this.state.zoom}onChange(t){this.changeCallbacks.push(t)}get limits(){return this.limitsState}applyLimits(t){this.limitsState=t;const e={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const i of this.changeCallbacks)i(e)}handlePositionUpdate(t){this.update(t.transforms)}update(t){let e=!1;for(const i of t)switch(i.type){case"rotation":this.state.rotation=i.value,e=!0;break;case"tilt":this.state.tilt=i.value,e=!0;break;case"zoom":this.state.zoom=i.value,e=!0;break}if(e){const i={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const o of this.changeCallbacks)o(i)}}}function ce(n,t){const e=n.filter(s=>ue(s,t));if(e.length===0)return;const i=Math.max(...e.map(Y)),o=e.filter(s=>Y(s)===i);return o.length===1?o[0]:void 0}function ue(n,t){return Object.entries(n.attributes).every(([e,i])=>t[e]===i)}function Y(n){return Object.keys(n.attributes).length}class bt{constructor(t,e){this.dispatchChange=t,this.dispatchSubmit=e}dispatchChange;dispatchSubmit;pricing;selection={};resolved;changeCallbacks=[];renderCallbacks=[];submitCallback;submitDefaultLabel;get current(){return this.resolved}get vatDisplay(){return this.pricing?.vatDisplay}get buttonLabel(){const t=this.pricing?.buttonLabel;if(t!=null&&t!=="")return t;if(this.submitDefaultLabel!==void 0&&this.submitDefaultLabel!=="")return this.submitDefaultLabel}get submittable(){return this.submitCallback===void 0?!1:this.pricing===void 0?!0:this.resolved?.availability==="available"}get submitEnabled(){return this.submittable&&this.buttonLabel!==void 0}onChange(t){this.changeCallbacks.push(t)}onSubmit(t,e){this.submitCallback=t,this.submitDefaultLabel=e?.defaultLabel,this.notifyRender()}onRender(t){return this.renderCallbacks.push(t),()=>{const e=this.renderCallbacks.indexOf(t);e!==-1&&this.renderCallbacks.splice(e,1)}}async submit(){if(!this.submittable)return;const t=this.resolved!==void 0?{attributes:this.resolved.attributes,reference:this.resolved.reference}:{attributes:{...this.selection},reference:""};this.dispatchSubmit(t),await this.submitCallback?.(t)}handlePricingReceived(t){this.pricing=t,this.recompute()}handleSelectionChanged(t){this.selection=t,this.recompute()}recompute(){this.resolved=this.resolve();for(const t of this.changeCallbacks)t(this.resolved);this.dispatchChange(this.resolved),this.notifyRender()}notifyRender(){for(const t of this.renderCallbacks)t()}resolve(){if(this.pricing===void 0)return;const t=ce(this.pricing.rules,this.selection);if(!(t===void 0||t.availability===Mt.HIDDEN))return{attributes:{...this.selection},reference:t.reference,price:t.priceCents,currency:this.pricing.currency,availability:t.availability}}}class vt{constructor(t,e){this.send=t,this.dispatch=e}send;dispatch;focused=null;attributes=[];changeCallbacks=[];get current(){return this.focused}set(t){if(typeof t!="string"||t.length===0)throw f.invalidParameter(`set() requires a non-empty component name, got ${String(t)}`);this.send({type:c.FOCUS,action:W.FOCUS,component:t})}clear(){this.send({type:c.FOCUS,action:W.UNFOCUS})}onChange(t){this.changeCallbacks.push(t)}handleStateReceived(t){t.state===Nt.FOCUSED&&t.component!==void 0?(this.focused=t.component,this.attributes=t.attributes??[]):(this.focused=null,this.attributes=[]);const e=this.focused!==null?{component:this.focused,attributes:this.attributes}:null;for(const i of this.changeCallbacks)i(e);this.dispatch(e)}}class yt{constructor(t){this.filename=t}filename;developedCallbacks=new Set;errorCallbacks=new Set;developed=!1;failed=!1;photoData=null;onDeveloped(t){return this.developed&&this.photoData!==null?(t(this.photoData),this):(this.developedCallbacks.add(t),this)}onError(t){return this.errorCallbacks.add(t),this}getFilename(){return this.filename}develop(t){this.developed||this.failed||(this.photoData=t,this.developed=!0,this.developedCallbacks.forEach(e=>{e(this.photoData)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}fail(t){this.developed||this.failed||(this.failed=!0,this.errorCallbacks.forEach(e=>{e(t)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}}const K=3e4;class wt{constructor(t){this.send=t}send;validExtensions=[".png"];pendingPhotos=new Map;take(t){this.validateFilename(t),exports.logger.debug("Taking snapshot",{filename:t});const e=new yt(t),i=setTimeout(()=>{this.pendingPhotos.delete(t),exports.logger.warn("Snapshot timed out",{filename:t}),e.fail(new f(`Snapshot timed out: the viewer did not respond within ${K}ms`,C.SNAPSHOT_FAILED))},K);return this.pendingPhotos.set(t,{photo:e,timeout:i}),this.send({type:c.SNAPSHOT,filename:t}),e}handleSnapshotResult(t){const e=this.pendingPhotos.get(t.filename);if(e===void 0){exports.logger.warn("No pending photo found for filename",{filename:t.filename,pendingFilenames:Array.from(this.pendingPhotos.keys())});return}clearTimeout(e.timeout),this.pendingPhotos.delete(t.filename);const{photo:i}=e;if(t.error!==void 0){i.fail(new f(t.error,C.SNAPSHOT_FAILED));return}t.data!==void 0&&i.develop({filename:t.filename,data:t.data})}clear(){if(this.pendingPhotos.size===0)return;const t=new f("Client destroyed before snapshot completed",C.SNAPSHOT_FAILED);for(const{photo:e,timeout:i}of this.pendingPhotos.values())clearTimeout(i),e.fail(t);this.pendingPhotos.clear()}validateFilename(t){if(t===""||typeof t!="string")throw new f("Filename must be a non-empty string",C.INVALID_PARAMETER);if(!this.validExtensions.some(i=>t.toLowerCase().endsWith(i)))throw new f(`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,C.INVALID_PARAMETER);if(t.includes("..")||t.includes("/")||t.includes("\\"))throw new f('Filename cannot contain path separators or ".."',C.INVALID_PARAMETER)}}class de{container=null;attach(t){this.container=t}dispatch(t,e,i=!1){const o=new CustomEvent(t,{detail:e,cancelable:i});return this.container?.dispatchEvent(o),o}on(t,e){const i=o=>{const s=o,r={...s.detail,preventDefault:()=>{s.preventDefault()}};e(r)};return this.container?.addEventListener(t,i),()=>{this.container?.removeEventListener(t,i)}}}const he={},me="en",_t=["en","nl","de"],G=["baseLocale"],X=[];let J,tt;function pe(n){if(X.length===0)return;const t=typeof n=="string"?n:n.href;if(J===t)return tt;const e=new URL(t,"http://dummy.com");let i;for(const o of X)if(new he(o.match,e.href).exec(e.href)){i=o;break}return J=t,tt=i,i}function St(n){const t=pe(n);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:G}const q=typeof window>"u";globalThis.__paraglide=globalThis.__paraglide??{};globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};let et=!1,h=()=>{let n=G;!q&&typeof window<"u"&&window.location?.href&&(n=St(window.location.href));const t=fe(n);if(t)return et||(et=!0,Ct(t,{reload:!1})),t;throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found")};function fe(n,t){let e;for(const i of n){if(i==="baseLocale")e=me;else if(At(i)&&O.has(i)){const s=O.get(i);if(s){const r=s.getLocale();if(r instanceof Promise)continue;if(r!==void 0)return be(r)}}const o=kt(e);if(o)return o}}const ge=n=>{window.location.reload()};let Ct=(n,t)=>{const e={reload:!0,...t};let i;try{i=h()}catch{}const o=[];let s=G;!q&&typeof window<"u"&&window.location?.href&&(s=St(window.location.href));for(const l of s)if(l!=="baseLocale"&&At(l)&&O.has(l)){const d=O.get(l);if(d){let u=d.setLocale(n);u instanceof Promise&&(u=u.catch(p=>{throw new Error(`Custom strategy "${l}" setLocale failed.`,{cause:p})}),o.push(u))}}const r=()=>{!q&&e.reload&&window.location&&n!==i&&ge()};if(o.length)return Promise.all(o).then(()=>{r()});r()};function kt(n){if(typeof n!="string")return;const t=n.toLowerCase();for(const e of _t)if(e.toLowerCase()===t)return e}function be(n){const t=kt(n);if(t)return t;throw new Error(`Invalid locale: ${n}. Expected one of: ${_t.join(", ")}`)}const O=new Map;function At(n){return typeof n=="string"&&/^custom-[A-Za-z0-9_-]+$/.test(n)}const ve=()=>"Activate AR",ye=()=>"AR activeren",we=()=>"AR aktivieren",_e=((n={},t={})=>{const e=t.locale??h();return e==="en"?ve():e==="nl"?ye():we()}),Se=()=>"Scan to view in AR",Ce=()=>"Scan om in AR te bekijken",ke=()=>"Scannen für AR-Ansicht",Ae=((n={},t={})=>{const e=t.locale??h();return e==="en"?Se():e==="nl"?Ce():ke()}),Ee=()=>"Use your smartphone camera to scan this QR code",xe=()=>"Gebruik de camera van je smartphone om deze QR-code te scannen",Te=()=>"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen",Re=((n={},t={})=>{const e=t.locale??h();return e==="en"?Ee():e==="nl"?xe():Te()}),Ie=()=>"Your phone will open the 3D model in AR mode.",Oe=()=>"Je telefoon opent het 3D-model in AR-modus.",Ne=()=>"Dein Telefon öffnet das 3D-Modell im AR-Modus.",Me=((n={},t={})=>{const e=t.locale??h();return e==="en"?Ie():e==="nl"?Oe():Ne()}),Le=()=>"Close",ze=()=>"Sluiten",Pe=()=>"Schließen",Fe=((n={},t={})=>{const e=t.locale??h();return e==="en"?Le():e==="nl"?ze():Pe()}),$e=()=>"Fullscreen",De=()=>"Volledig scherm",Be=()=>"Vollbild",Ue=((n={},t={})=>{const e=t.locale??h();return e==="en"?$e():e==="nl"?De():Be()}),Ve=()=>"Downloading",je=()=>"Downloaden",He=()=>"Herunterladen",Et=((n={},t={})=>{const e=t.locale??h();return e==="en"?Ve():e==="nl"?je():He()}),qe=()=>"Rendering",Ge=()=>"Renderen",Ze=()=>"Rendern",We=((n={},t={})=>{const e=t.locale??h();return e==="en"?qe():e==="nl"?Ge():Ze()}),Qe=()=>"Screenshot",Ye=()=>"Screenshot",Ke=()=>"Screenshot",Xe=((n={},t={})=>{const e=t.locale??h();return e==="en"?Qe():e==="nl"?Ye():Ke()}),Je=()=>"Configure",tn=()=>"Configureren",en=()=>"Konfigurieren",nn=((n={},t={})=>{const e=t.locale??h();return e==="en"?Je():e==="nl"?tn():en()}),on=()=>"Close",sn=()=>"Sluiten",rn=()=>"Schließen",an=((n={},t={})=>{const e=t.locale??h();return e==="en"?on():e==="nl"?sn():rn()}),ln=()=>"Reset camera",cn=()=>"Camera resetten",un=()=>"Kamera zurücksetzen",dn=((n={},t={})=>{const e=t.locale??h();return e==="en"?ln():e==="nl"?cn():un()}),hn=()=>"Zoom in",mn=()=>"Inzoomen",pn=()=>"Hineinzoomen",fn=((n={},t={})=>{const e=t.locale??h();return e==="en"?hn():e==="nl"?mn():pn()}),gn=()=>"Zoom out",bn=()=>"Uitzoomen",vn=()=>"Herauszoomen",yn=((n={},t={})=>{const e=t.locale??h();return e==="en"?gn():e==="nl"?bn():vn()}),wn=()=>"Rotate left",_n=()=>"Naar links draaien",Sn=()=>"Nach links drehen",Cn=((n={},t={})=>{const e=t.locale??h();return e==="en"?wn():e==="nl"?_n():Sn()}),kn=()=>"Rotate right",An=()=>"Naar rechts draaien",En=()=>"Nach rechts drehen",xn=((n={},t={})=>{const e=t.locale??h();return e==="en"?kn():e==="nl"?An():En()}),Tn=()=>"Tilt up",Rn=()=>"Omhoog kantelen",In=()=>"Nach oben kippen",On=((n={},t={})=>{const e=t.locale??h();return e==="en"?Tn():e==="nl"?Rn():In()}),Nn=()=>"Tilt down",Mn=()=>"Omlaag kantelen",Ln=()=>"Nach unten kippen",zn=((n={},t={})=>{const e=t.locale??h();return e==="en"?Nn():e==="nl"?Mn():Ln()}),Pn=()=>"Working…",Fn=()=>"Bezig…",$n=()=>"Läuft…",Dn=((n={},t={})=>{const e=t.locale??h();return e==="en"?Pn():e==="nl"?Fn():$n()}),Bn=()=>"Done",Un=()=>"Gelukt",Vn=()=>"Fertig",jn=((n={},t={})=>{const e=t.locale??h();return e==="en"?Bn():e==="nl"?Un():Vn()}),Hn=()=>"Failed",qn=()=>"Mislukt",Gn=()=>"Fehlgeschlagen",Zn=((n={},t={})=>{const e=t.locale??h();return e==="en"?Hn():e==="nl"?qn():Gn()});const Wn={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const xt=([n,t,e])=>{const i=document.createElementNS("http://www.w3.org/2000/svg",n);return Object.keys(t).forEach(o=>{i.setAttribute(o,String(t[o]))}),e?.length&&e.forEach(o=>{const s=xt(o);i.appendChild(s)}),i},Tt=(n,t={})=>{const i={...Wn,...t};return xt(["svg",i,n])};const Qn=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"}],["path",{d:"m3.3 7 8.7 5 8.7-5"}],["path",{d:"M12 22V12"}]];const Yn=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];const Rt=[["path",{d:"m6 9 6 6 6-6"}]];const Kn=[["path",{d:"m15 18-6-6 6-6"}]];const Xn=[["path",{d:"m9 18 6-6-6-6"}]];const Jn=[["path",{d:"m18 15-6-6-6 6"}]];const ti=[["path",{d:"M15 3h6v6"}],["path",{d:"m21 3-7 7"}],["path",{d:"m3 21 7-7"}],["path",{d:"M9 21H3v-6"}]];const ei=[["path",{d:"m14 10 7-7"}],["path",{d:"M20 10h-6V4"}],["path",{d:"m3 21 7-7"}],["path",{d:"M4 14h6v6"}]];const ni=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];const ii=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];const oi=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];const si=[["circle",{cx:"11",cy:"11",r:"8"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11"}]];const ri=[["circle",{cx:"11",cy:"11",r:"8"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11"}]];function y(n,{size:t=20,strokeWidth:e=1.75}={}){return Tt(n,{width:t,height:t,"stroke-width":e})}const g={ar:n=>y(Qn,n),fullscreen:n=>y(ti,n),exitFullscreen:n=>y(ei,n),screenshot:n=>y(Yn,n),tiltUp:n=>y(Jn,n),tiltDown:n=>y(Rt,n),rotateLeft:n=>y(Kn,n),rotateRight:n=>y(Xn,n),zoomIn:n=>y(si,n),zoomOut:n=>y(ri,n),reset:n=>y(ni,n),configurator:n=>y(ii,n),close:n=>y(oi,n)};class b{element;constructor({variant:t="default",size:e="default",label:i,icon:o,onClick:s,disabled:r=!1}={}){this.element=document.createElement("button"),this.element.className=`ui-btn ui-btn--${t} ui-btn--size-${e}`,i!==void 0&&(this.element.setAttribute("aria-label",i),this.element.title=i),o!==void 0?this.element.appendChild(o):i!==void 0&&(this.element.textContent=i),s&&this.element.addEventListener("click",s),this.element.disabled=r}setIcon(t){const e=this.element.querySelector("svg");e!==null?e.replaceWith(t):this.element.appendChild(t)}}const m={semantic:{error:"#dc2626"},neutral:{500:"#737373",600:"#525252",900:"#171717"},white:"#ffffff",black:"#000000"},a={0:"0",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",3:"0.75rem",4:"1rem",5:"1.25rem",6:"1.5rem",8:"2rem",9:"2.25rem"};class ai{element;constructor(){this.element=document.createElement("div"),Object.assign(this.element.style,{background:m.white,borderRadius:a[3],padding:a[6],boxShadow:`0 ${a[2]} ${a[8]} oklch(0% 0 0 / 20%)`,maxWidth:"20rem",width:"100%"})}}class li{constructor(t={}){this.options=t,this.card=new ai,this.backdrop=this.createBackdrop(),this.backdrop.appendChild(this.card.element)}options;card;backdrop;keyHandler=null;open(){document.body.appendChild(this.backdrop),this.keyHandler=t=>{t.key==="Escape"&&this.close()},document.addEventListener("keydown",this.keyHandler)}close(){this.backdrop.remove(),this.keyHandler!==null&&(document.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.options.onClose?.()}createBackdrop(){const t=document.createElement("div");return Object.assign(t.style,{position:"fixed",inset:a[0],background:"oklch(0% 0 0 / 50%)",zIndex:"9999",display:"flex",alignItems:"center",justifyContent:"center"}),t.addEventListener("click",e=>{e.target===t&&this.close()}),t}}class ci{element;selectCallback=null;constructor(t,e,i){this.element=document.createElement("div"),this.element.className="ui-toggle-group";for(let o=0;o<t.length;o++){const s=t[o],r=document.createElement("button");r.className="ui-toggle-group-item",r.dataset.value=s,r.textContent=i?.[o]??s,r.dataset.state=s===e?"on":"off",r.setAttribute("aria-pressed",s===e?"true":"false"),r.addEventListener("click",()=>{this.selectCallback?.(s)}),this.element.appendChild(r)}}setSelected(t){for(const e of this.element.querySelectorAll(".ui-toggle-group-item")){const i=e.dataset.value===t;e.dataset.state=i?"on":"off",e.setAttribute("aria-pressed",i?"true":"false")}}onSelect(t){this.selectCallback=t}}class ui{element;select;constructor(t,e,i,o,s){this.select=document.createElement("select"),this.select.className="ui-native-select",this.select.dataset.name=t,this.select.setAttribute("aria-label",i);const r=document.createElement("option");r.value="",r.disabled=!0,r.textContent=i,this.select.appendChild(r);let l=!1;for(let u=0;u<e.length;u++){const p=e[u],v=document.createElement("option");v.value=p,v.textContent=s?.[u]??p,p===o&&(v.selected=!0,l=!0),this.select.appendChild(v)}l||(r.selected=!0);const d=Tt(Rt,{width:16,height:16,"stroke-width":2});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)}setSelected(t){this.select.value=t}onSelect(t){this.select.addEventListener("change",()=>{t(this.select.value)})}}const w={fontFamily:{sans:["Mona Sans","ui-sans-serif","system-ui","sans-serif","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"]},fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem"},fontWeight:{medium:"500",semibold:"600"}},E=w.fontFamily.sans.join(", "),di=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c={HANDSHAKE:"handshake",SESSION:"session",MUTATION:"mutation",STATE:"state",LOADING_INDICATOR:"loading_indicator",CAMERA:"camera",SNAPSHOT:"snapshot",MAPPING:"mapping",AR_ACTIVATE:"ar_activate",FULLSCREEN:"fullscreen",CONFIG:"config",ANNOTATION_TOGGLE:"annotation_toggle",FOCUS:"focus",PRICING:"pricing",QR_SHOWN:"qr_shown",SYNC:"sync"},J={FOCUS:"focus",UNFOCUS:"unfocus"},Pt={FOCUSED:"focused"},Ft={HIDDEN:"hidden"},$t=new Set(Object.values(c));function Dt(n){if(typeof n!="object"||n===null)return!1;const t=n;return typeof t.target=="string"?!1:typeof t.type=="string"&&$t.has(t.type)}function Bt(n){const t=_(n);return t!==null&&t.type===c.HANDSHAKE}function Ut(n){const t=_(n);return t!==null&&t.type===c.SESSION&&typeof t.sessionId=="string"}function Vt(n){const t=_(n);return t!==null&&t.type===c.MUTATION&&Array.isArray(t.results)}function jt(n){const t=_(n);return t!==null&&t.type===c.SNAPSHOT&&("data"in t||"error"in t)}function Ht(n){const t=_(n);return t!==null&&t.type===c.CAMERA&&Array.isArray(t.transforms)}function qt(n){const t=_(n);return t!==null&&t.type===c.MAPPING&&Array.isArray(t.attributes)}function Gt(n){const t=_(n);return t!==null&&t.type===c.LOADING_INDICATOR&&typeof t.progress=="number"}function Zt(n){const t=_(n);return t!==null&&t.type===c.SYNC&&typeof t.connected=="boolean"}function Wt(n){const t=_(n);return t!==null&&t.type===c.CONFIG&&typeof t.viewerSettings=="object"}function Yt(n){const t=_(n);return t!==null&&t.type===c.FOCUS&&typeof t.state=="string"}function Qt(n){const t=_(n);return t!==null&&t.type===c.PRICING&&typeof t.pricing=="object"&&t.pricing!==null}function _(n){return typeof n!="object"||n===null?null:n}class tt{constructor(t){this.processor=t}processor;pending=[];isReady=!1;enqueue(t){if(this.isReady){this.processor(t);return}this.pending.push(t)}markReady(){if(this.isReady||(this.isReady=!0,this.pending.length===0))return;const t=[...this.pending];this.pending.length=0;for(const e of t)this.processor(e)}get ready(){return this.isReady}get pendingCount(){return this.pending.length}hasPending(t){return this.pending.some(e=>e.type===t)}clear(){this.pending.length=0}}class Kt{constructor(t,e){this.getTarget=t,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.targetOrigin="*",this.isValid=e?.isValid??Dt,this.publisher=new tt(i=>this.post(i)),this.consumer=new tt(i=>this.routeToHandler(i)),e?.bufferIncoming!==!0&&this.consumer.markReady()}getTarget;handlers=new Map;publisher;consumer;listener=null;sourceId;targetOrigin;isValid;on(t,e){this.handlers.set(t,e)}setTargetOrigin(t){this.targetOrigin=t}send(t){this.publisher.enqueue(t)}receive(t){this.isValid(t)&&this.consumer.enqueue(t)}markReady(){this.publisher.markReady()}markConsumerReady(){this.consumer.markReady()}consumerHasPending(t){return this.consumer.hasPending(t)}start(){this.listener===null&&(this.listener=t=>{const{data:e}=t;if(!this.isValid(e)||e._source===this.sourceId)return;const i=this.getTarget();if(i!==null&&t.source!==null&&t.source!==i)return;const o=e;this.consumer.enqueue(o)},window.addEventListener("message",this.listener))}destroy(){this.listener!==null&&(window.removeEventListener("message",this.listener),this.listener=null),this.publisher.clear(),this.consumer.clear(),this.handlers.clear()}get ready(){return this.publisher.ready}get pendingCount(){return this.publisher.pendingCount}post(t){const e=this.getTarget();e!==null&&e.postMessage({...t,_source:this.sourceId},this.targetOrigin)}routeToHandler(t){const e=this.handlers.get(t.type);if(e===void 0)return;const i=e(t);i instanceof Promise&&i.catch(o=>{const s=o instanceof Error?o.message:String(o);console.error(`Virtualdisplay: error handling ${t.type}: ${s}`)})}}class ht{constructor(t){this.send=t}send;setEnabled(t){this.send({type:c.ANNOTATION_TOGGLE,enabled:t})}}class mt{constructor(t,e){this.value=t,this.attribute=e}value;attribute;isSelectedValue=!1;get isSelected(){return this.isSelectedValue}setSelected(t){this.isSelectedValue=t}}const C={NO_MAPPING:"NO_MAPPING",ATTRIBUTE_NOT_FOUND:"ATTRIBUTE_NOT_FOUND",VALUE_NOT_FOUND:"VALUE_NOT_FOUND",PARENT_NOT_FOUND:"PARENT_NOT_FOUND",INVALID_PARAMETER:"INVALID_PARAMETER",SNAPSHOT_FAILED:"SNAPSHOT_FAILED"};class f extends Error{code;constructor(t,e){super(t),this.name="VirtualdisplayError",this.code=e}static valueNotFound(t,e){return new f(`Value "${e}" not found for attribute "${t}"`,C.VALUE_NOT_FOUND)}static parentNotFound(t){return new f(`Parent element not found: ${t}`,C.PARENT_NOT_FOUND)}static invalidParameter(t){return new f(t,C.INVALID_PARAMETER)}}class pt{name;defaultValue;values;onSelect;onChangeCallback;constructor(t){this.name=t.name,this.defaultValue=t.defaultValue,this.onSelect=t.onSelect,this.values=this.createValues(t.values)}select(t){if(!this.values.has(t))throw f.valueNotFound(this.name,t);this.onSelect(this.name,t)}getValues(){return Array.from(this.values.values())}getValue(t){return this.values.get(t)}get selected(){for(const t of this.values.values())if(t.isSelected)return t.value}onChange(t){this.onChangeCallback=t}handleResult(t){let e;for(const i of this.values.values()){const o=i.value===t;i.setSelected(o),o&&(e=i)}e!==void 0&&this.onChangeCallback!==void 0&&this.onChangeCallback(e)}createValues(t){const e=new Map;for(const i of t){const o=new mt(i,this.name);i===this.defaultValue&&o.setSelected(!0),e.set(i,o)}return e}}class Xt{attributes=new Map;constructor(t,e,i){for(const o of t){const s=this.buildOptions(o,e);this.attributes.set(o.name,new pt(s))}this.onMutationFailed=i}onMutationFailed;get(t){return this.attributes.get(t)}getSelection(){const t={};for(const[e,i]of this.attributes){const o=i.selected;o!==void 0&&(t[e]=o)}return t}handleResults(t){for(const e of t){if(!e.success){this.onMutationFailed?.(e.name,e.value);continue}this.get(e.name)?.handleResult(e.value)}}buildOptions(t,e){const i={name:t.name,values:t.values,onSelect:(o,s)=>{e([{name:o,value:s}],!1)}};return t.defaultValue!==void 0?{...i,defaultValue:t.defaultValue}:i}}const N=4096,P=16384,Jt=[1024,256,64],te=20,W=["timestamp","level","msg","service","trace_id","span_id"];function ee(n){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])=>!W.includes(r)).map(([r,a])=>`${r}=${I(a,N).line}`).join(" ");return`${t} ${e} [${i}] ${o}${s?" "+s:""}`}function ne(n){for(const o of[N,...Jt]){const{line:s,truncated:r}=I(n,o);if(!r){if(s.length<=P)return s;continue}const{line:a}=I({...n,log_truncated:!0},o);if(a.length<=P)return a}const t=Object.keys(n).filter(o=>!W.includes(o)),e={...oe(n,W),log_truncated:!0,log_dropped_count:t.length},i=I({...e,log_dropped_attrs:t.slice(0,te)},N);return i.line.length<=P?i.line:I(e,N).line}function I(n,t){const e=[];let i=!1;return{line:JSON.stringify(n,function(r,a){if(typeof a=="string")return a.length>t&&(i=!0),ie(a,t);if(typeof a=="bigint")return a.toString();if(typeof a!="object"||a===null)return a;for(;e.length>0&&e.at(-1)!==this;)e.pop();return e.includes(a)?"[Circular]":(e.push(a),a)}),truncated:i}}function ie(n,t){return n.length<=t?n:`${n.slice(0,t)}...[truncated ${n.length-t} chars]`}function oe(n,t){const e={};for(const i of t)n[i]!==void 0&&(e[i]=n[i]);return e}function se(n,t){const e=t?ee(n):ne(n);n.level==="error"?console.error(e):n.level==="warn"?console.warn(e):console.log(e)}function ft(n,t=0){const e={name:n.name,message:n.message};n.stack!==void 0&&(e.stack=n.stack);for(const i of Object.getOwnPropertyNames(n)){if(i==="name"||i==="message"||i==="stack"||i==="cause")continue;const o=n[i];o!==void 0&&(e[i]=o)}return n.cause!==void 0&&n.cause!==null&&(e.cause=n.cause instanceof Error&&t<5?ft(n.cause,t+1):String(n.cause)),e}function re(n){const t={};for(const[e,i]of Object.entries(n))t[e]=i instanceof Error?ft(i):i;return t}function ae(){return new Date}function le(n){return n.toISOString()}function gt(){return typeof navigator>"u"?"":navigator.userAgent}function ce(){return typeof navigator>"u"?!1:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function de(){return/iPhone|iPad|iPod/i.test(gt())||ce()}function ue(){return/Android/i.test(gt())}function he(){return de()||ue()}class me{constructor(t){this.config=t}config;log(t,e,i={}){const o=this.config.traceProvider?.()??{},s={timestamp:le(ae()),level:t,msg:e,service:this.config.service,...o,...re(i)};se(s,this.config.isDev)}debug(t,e){this.config.isDev&&this.log("debug",t,e)}info(t,e){this.log("info",t,e)}warn(t,e){this.log("warn",t,e)}error(t,e){this.log("error",t,e)}}function bt(n,t){const e=t?.isDev!==void 0?t.isDev:typeof process<"u"?process.env.NODE_ENV!=="production":!0;return new me({service:n,isDev:e,traceProvider:t?.traceProvider})}function O(n){if(n!==void 0)return typeof n=="object"&&n!==null&&!Array.isArray(n)&&!(n instanceof Error)?n:n instanceof Error?{error:n.message}:{value:n}}function vt(n){return{debug:(t,e)=>n.debug(t,O(e)),info:(t,e)=>n.info(t,O(e)),warn:(t,e)=>n.warn(t,O(e)),error:(t,e)=>n.error(t,O(e))}}let yt=!1;exports.logger=vt(bt("client",{isDev:!1}));function wt(){yt=!0,exports.logger=vt(bt("client",{isDev:!0}))}function pe(){return yt}class fe{constructor(t,e){this.send=t,this.onMutationFailed=e}send;onMutationFailed;registry;pendingCallbacks=[];handleMappingReceived(t){exports.logger.debug("Initializing from server mapping",{attributeCount:t.attributes.length}),this.registry=new Xt(t.attributes,(e,i)=>this.sendMutation(e,i),this.onMutationFailed),this.replayPendingCallbacks()}handleMutationResult(t){this.registry?.handleResults(t.results)}select(t,e){this.sendMutation([{name:t,value:e}],!1)}getValues(t){return this.registry?.get(t)?.getValues()??[]}getValue(t,e){return this.registry?.get(t)?.getValue(e)}onChange(t,e){if(this.registry===void 0){this.pendingCallbacks.push({name:t,callback:e});return}const i=this.registry.get(t);if(i===void 0){exports.logger.warn(`onChange: attribute "${t}" not found — callback will not fire`);return}i.onChange(e)}getAttribute(t){return this.registry?.get(t)}getSelection(){return this.registry?.getSelection()??{}}get hasMapping(){return this.registry!==void 0}sendMutation(t,e){const i={type:c.MUTATION,mutations:t,isInitial:e};this.send(i)}replayPendingCallbacks(){for(const{name:t,callback:e}of this.pendingCallbacks){const i=this.registry?.get(t);i===void 0&&exports.logger.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`),i?.onChange(e)}this.pendingCallbacks.length=0}}let _t=class{constructor(t){this.send=t}send;commands=[];rotate(t){return this.validateFiniteNumber(t,"rotate"),this.commands.push({action:"rotate",value:t}),this}tilt(t){return this.validateFiniteNumber(t,"tilt"),this.commands.push({action:"tilt",value:t}),this}zoom(t){return this.validateFiniteNumber(t,"zoom"),this.commands.push({action:"zoom",value:t}),this}set(){if(this.commands.length===0)throw f.invalidParameter("No camera commands to execute. Call rotate(), tilt(), or zoom() before set().");const t={type:c.CAMERA,commands:this.commands};this.send(t),this.commands=[]}validateFiniteNumber(t,e){if(!Number.isFinite(t))throw f.invalidParameter(`${e}() requires a finite number, got ${String(t)}`)}reset(){const t={type:c.CAMERA,commands:[{action:"reset"}]};this.send(t)}};class ge{state;limitsState;changeCallbacks=[];constructor(){this.state={rotation:0,tilt:0,zoom:100}}get rotation(){return this.state.rotation}get tilt(){return this.state.tilt}get zoom(){return this.state.zoom}onChange(t){this.changeCallbacks.push(t)}get limits(){return this.limitsState}applyLimits(t){this.limitsState=t;const e={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const i of this.changeCallbacks)i(e)}handlePositionUpdate(t){this.update(t.transforms)}update(t){let e=!1;for(const i of t)switch(i.type){case"rotation":this.state.rotation=i.value,e=!0;break;case"tilt":this.state.tilt=i.value,e=!0;break;case"zoom":this.state.zoom=i.value,e=!0;break}if(e){const i={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const o of this.changeCallbacks)o(i)}}}function be(n,t){const e=n.filter(s=>ve(s,t));if(e.length===0)return;const i=Math.max(...e.map(et)),o=e.filter(s=>et(s)===i);return o.length===1?o[0]:void 0}function ve(n,t){return Object.entries(n.attributes).every(([e,i])=>t[e]===i)}function et(n){return Object.keys(n.attributes).length}class St{constructor(t,e){this.dispatchChange=t,this.dispatchSubmit=e}dispatchChange;dispatchSubmit;pricing;selection={};resolved;changeCallbacks=[];renderCallbacks=[];submitCallback;submitDefaultLabel;get current(){return this.resolved}get vatDisplay(){return this.pricing?.vatDisplay}get buttonLabel(){const t=this.pricing?.buttonLabel;if(t!=null&&t!=="")return t;if(this.submitDefaultLabel!==void 0&&this.submitDefaultLabel!=="")return this.submitDefaultLabel}get submittable(){return this.submitCallback===void 0?!1:this.pricing===void 0?!0:this.resolved?.availability==="available"}get submitEnabled(){return this.submittable&&this.buttonLabel!==void 0}onChange(t){this.changeCallbacks.push(t)}onSubmit(t,e){this.submitCallback=t,this.submitDefaultLabel=e?.defaultLabel,this.notifyRender()}onRender(t){return this.renderCallbacks.push(t),()=>{const e=this.renderCallbacks.indexOf(t);e!==-1&&this.renderCallbacks.splice(e,1)}}async submit(){if(!this.submittable)return;const t=this.resolved!==void 0?{attributes:this.resolved.attributes,reference:this.resolved.reference}:{attributes:{...this.selection},reference:""};this.dispatchSubmit(t),await this.submitCallback?.(t)}handlePricingReceived(t){this.pricing=t,this.recompute()}handleSelectionChanged(t){this.selection=t,this.recompute()}recompute(){this.resolved=this.resolve();for(const t of this.changeCallbacks)t(this.resolved);this.dispatchChange(this.resolved),this.notifyRender()}notifyRender(){for(const t of this.renderCallbacks)t()}resolve(){if(this.pricing===void 0)return;const t=be(this.pricing.rules,this.selection);if(!(t===void 0||t.availability===Ft.HIDDEN))return{attributes:{...this.selection},reference:t.reference,price:t.priceCents,currency:this.pricing.currency,availability:t.availability}}}class Ct{constructor(t,e){this.send=t,this.dispatch=e}send;dispatch;focused=null;attributes=[];changeCallbacks=[];get current(){return this.focused}set(t){if(typeof t!="string"||t.length===0)throw f.invalidParameter(`set() requires a non-empty component name, got ${String(t)}`);this.send({type:c.FOCUS,action:J.FOCUS,component:t})}clear(){this.send({type:c.FOCUS,action:J.UNFOCUS})}onChange(t){this.changeCallbacks.push(t)}handleStateReceived(t){t.state===Pt.FOCUSED&&t.component!==void 0?(this.focused=t.component,this.attributes=t.attributes??[]):(this.focused=null,this.attributes=[]);const e=this.focused!==null?{component:this.focused,attributes:this.attributes}:null;for(const i of this.changeCallbacks)i(e);this.dispatch(e)}}class kt{constructor(t){this.filename=t}filename;developedCallbacks=new Set;errorCallbacks=new Set;developed=!1;failed=!1;photoData=null;onDeveloped(t){return this.developed&&this.photoData!==null?(t(this.photoData),this):(this.developedCallbacks.add(t),this)}onError(t){return this.errorCallbacks.add(t),this}getFilename(){return this.filename}develop(t){this.developed||this.failed||(this.photoData=t,this.developed=!0,this.developedCallbacks.forEach(e=>{e(this.photoData)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}fail(t){this.developed||this.failed||(this.failed=!0,this.errorCallbacks.forEach(e=>{e(t)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}}const nt=3e4;class At{constructor(t){this.send=t}send;validExtensions=[".png"];pendingPhotos=new Map;take(t){this.validateFilename(t),exports.logger.debug("Taking snapshot",{filename:t});const e=new kt(t),i=setTimeout(()=>{this.pendingPhotos.delete(t),exports.logger.warn("Snapshot timed out",{filename:t}),e.fail(new f(`Snapshot timed out: the viewer did not respond within ${nt}ms`,C.SNAPSHOT_FAILED))},nt);return this.pendingPhotos.set(t,{photo:e,timeout:i}),this.send({type:c.SNAPSHOT,filename:t}),e}handleSnapshotResult(t){const e=this.pendingPhotos.get(t.filename);if(e===void 0){exports.logger.warn("No pending photo found for filename",{filename:t.filename,pendingFilenames:Array.from(this.pendingPhotos.keys())});return}clearTimeout(e.timeout),this.pendingPhotos.delete(t.filename);const{photo:i}=e;if(t.error!==void 0){i.fail(new f(t.error,C.SNAPSHOT_FAILED));return}t.data!==void 0&&i.develop({filename:t.filename,data:t.data})}clear(){if(this.pendingPhotos.size===0)return;const t=new f("Client destroyed before snapshot completed",C.SNAPSHOT_FAILED);for(const{photo:e,timeout:i}of this.pendingPhotos.values())clearTimeout(i),e.fail(t);this.pendingPhotos.clear()}validateFilename(t){if(t===""||typeof t!="string")throw new f("Filename must be a non-empty string",C.INVALID_PARAMETER);if(!this.validExtensions.some(i=>t.toLowerCase().endsWith(i)))throw new f(`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,C.INVALID_PARAMETER);if(t.includes("..")||t.includes("/")||t.includes("\\"))throw new f('Filename cannot contain path separators or ".."',C.INVALID_PARAMETER)}}class ye{container=null;attach(t){this.container=t}dispatch(t,e,i=!1){const o=new CustomEvent(t,{detail:e,cancelable:i});return this.container?.dispatchEvent(o),o}on(t,e){const i=o=>{const s=o,r={...s.detail,preventDefault:()=>{s.preventDefault()}};e(r)};return this.container?.addEventListener(t,i),()=>{this.container?.removeEventListener(t,i)}}}const we={},_e="en",Et=["en","nl","de"],Q=["baseLocale"],it=[],Y=typeof window>"u";globalThis.__paraglide=globalThis.__paraglide??{};globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};let ot=!1,u=()=>{let n=Q;!Y&&typeof window<"u"&&window.location?.href&&(n=Tt(window.location.href));const t=Se(n);if(t)return ot||(ot=!0,xt(t,{reload:!1})),t;throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found")};function Se(n,t){let e;for(const i of n){if(i==="baseLocale")e=_e;else if(Rt(i)&&L.has(i)){const s=L.get(i);if(s){const r=s.getLocale();if(r instanceof Promise)continue;if(r!==void 0)return Ae(r)}}const o=K(e);if(o)return o}}const Ce=n=>{window.location.reload()};let xt=(n,t)=>{const e={reload:!0,...t};let i;try{i=u()}catch{}const o=[];let s=Q;!Y&&typeof window<"u"&&window.location?.href&&(s=Tt(window.location.href));for(const a of s)if(a!=="baseLocale"&&Rt(a)&&L.has(a)){const h=L.get(a);if(h){let d=h.setLocale(n);d instanceof Promise&&(d=d.catch(p=>{throw new Error(`Custom strategy "${a}" setLocale failed.`,{cause:p})}),o.push(d))}}const r=()=>{!Y&&e.reload&&window.location&&n!==i&&Ce()};if(o.length)return Promise.all(o).then(()=>{r()});r()},ke=()=>typeof window<"u"?window.location.origin:"http://fallback.com";function K(n){if(typeof n!="string")return;const t=n.toLowerCase();for(const e of Et)if(e.toLowerCase()===t)return e}function Ae(n){const t=K(n);if(t)return t;throw new Error(`Invalid locale: ${n}. Expected one of: ${Et.join(", ")}`)}function Ee(n){return xe(n)}function xe(n){const t=typeof n=="string"?new URL(n,ke()):new URL(n),e=t.pathname.split("/").filter(Boolean);return e.length>0&&K(e[0])&&(t.pathname="/"+e.slice(1).join("/")),t}let st,rt;function Te(n){if(it.length===0)return;const t=typeof n=="string"?n:n.href;if(st===t)return rt;const e=new URL(t,"http://example.com"),i=Ee(e),o=i.href===e.href?[e]:[e,i];let s;for(const r of o){for(const a of it)if(new we(a.match,r.href).exec(r.href)){s=a;break}if(s)break}return st=t,rt=s,s}function Tt(n){const t=Te(n);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:Q}const L=new Map;function Rt(n){return typeof n=="string"&&/^custom-[A-Za-z0-9_-]+$/.test(n)}const Re=()=>"Activate AR",Ie=()=>"AR activeren",Oe=()=>"AR aktivieren",Ne=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Ie():e==="de"?Oe():Re()}),Le=()=>"Scan to view in AR",Me=()=>"Scan om in AR te bekijken",ze=()=>"Scannen für AR-Ansicht",Pe=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Me():e==="de"?ze():Le()}),Fe=()=>"Use your smartphone camera to scan this QR code",$e=()=>"Gebruik de camera van je smartphone om deze QR-code te scannen",De=()=>"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen",Be=((n={},t={})=>{const e=t.locale??u();return e==="nl"?$e():e==="de"?De():Fe()}),Ue=()=>"Your phone will open the 3D model in AR mode.",Ve=()=>"Je telefoon opent het 3D-model in AR-modus.",je=()=>"Dein Telefon öffnet das 3D-Modell im AR-Modus.",He=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Ve():e==="de"?je():Ue()}),qe=()=>"Close",Ge=()=>"Sluiten",Ze=()=>"Schließen",We=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Ge():e==="de"?Ze():qe()}),Ye=()=>"Fullscreen",Qe=()=>"Volledig scherm",Ke=()=>"Vollbild",Xe=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Qe():e==="de"?Ke():Ye()}),Je=()=>"Downloading",tn=()=>"Downloaden",en=()=>"Herunterladen",It=((n={},t={})=>{const e=t.locale??u();return e==="nl"?tn():e==="de"?en():Je()}),nn=()=>"Rendering",on=()=>"Renderen",sn=()=>"Rendern",rn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?on():e==="de"?sn():nn()}),an=()=>"Screenshot",ln=()=>"Screenshot",cn=()=>"Screenshot",dn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?ln():e==="de"?cn():an()}),un=()=>"Configure",hn=()=>"Configureren",mn=()=>"Konfigurieren",pn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?hn():e==="de"?mn():un()}),fn=()=>"Close",gn=()=>"Sluiten",bn=()=>"Schließen",vn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?gn():e==="de"?bn():fn()}),yn=()=>"Reset camera",wn=()=>"Camera resetten",_n=()=>"Kamera zurücksetzen",Sn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?wn():e==="de"?_n():yn()}),Cn=()=>"Zoom in",kn=()=>"Inzoomen",An=()=>"Hineinzoomen",En=((n={},t={})=>{const e=t.locale??u();return e==="nl"?kn():e==="de"?An():Cn()}),xn=()=>"Zoom out",Tn=()=>"Uitzoomen",Rn=()=>"Herauszoomen",In=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Tn():e==="de"?Rn():xn()}),On=()=>"Rotate left",Nn=()=>"Naar links draaien",Ln=()=>"Nach links drehen",Mn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Nn():e==="de"?Ln():On()}),zn=()=>"Rotate right",Pn=()=>"Naar rechts draaien",Fn=()=>"Nach rechts drehen",$n=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Pn():e==="de"?Fn():zn()}),Dn=()=>"Tilt up",Bn=()=>"Omhoog kantelen",Un=()=>"Nach oben kippen",Vn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Bn():e==="de"?Un():Dn()}),jn=()=>"Tilt down",Hn=()=>"Omlaag kantelen",qn=()=>"Nach unten kippen",Gn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Hn():e==="de"?qn():jn()}),Zn=()=>"Working…",Wn=()=>"Bezig…",Yn=()=>"Läuft…",Qn=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Wn():e==="de"?Yn():Zn()}),Kn=()=>"Done",Xn=()=>"Gelukt",Jn=()=>"Fertig",ti=((n={},t={})=>{const e=t.locale??u();return e==="nl"?Xn():e==="de"?Jn():Kn()}),ei=()=>"Failed",ni=()=>"Mislukt",ii=()=>"Fehlgeschlagen",oi=((n={},t={})=>{const e=t.locale??u();return e==="nl"?ni():e==="de"?ii():ei()});const si={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const Ot=([n,t,e])=>{const i=document.createElementNS("http://www.w3.org/2000/svg",n);return Object.keys(t).forEach(o=>{i.setAttribute(o,String(t[o]))}),e?.length&&e.forEach(o=>{const s=Ot(o);i.appendChild(s)}),i},Nt=(n,t={})=>{const i={...si,...t};return Ot(["svg",i,n])};const ri=[["path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"}],["path",{d:"m3.3 7 8.7 5 8.7-5"}],["path",{d:"M12 22V12"}]];const ai=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z"}],["circle",{cx:"12",cy:"13",r:"3"}]];const Lt=[["path",{d:"m6 9 6 6 6-6"}]];const li=[["path",{d:"m15 18-6-6 6-6"}]];const ci=[["path",{d:"m9 18 6-6-6-6"}]];const di=[["path",{d:"m18 15-6-6-6 6"}]];const ui=[["path",{d:"M15 3h6v6"}],["path",{d:"m21 3-7 7"}],["path",{d:"m3 21 7-7"}],["path",{d:"M9 21H3v-6"}]];const hi=[["path",{d:"m14 10 7-7"}],["path",{d:"M20 10h-6V4"}],["path",{d:"m3 21 7-7"}],["path",{d:"M4 14h6v6"}]];const mi=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"}],["path",{d:"M3 3v5h5"}]];const pi=[["path",{d:"M10 5H3"}],["path",{d:"M12 19H3"}],["path",{d:"M14 3v4"}],["path",{d:"M16 17v4"}],["path",{d:"M21 12h-9"}],["path",{d:"M21 19h-5"}],["path",{d:"M21 5h-7"}],["path",{d:"M8 10v4"}],["path",{d:"M8 12H3"}]];const fi=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];const gi=[["circle",{cx:"11",cy:"11",r:"8"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11"}]];const bi=[["circle",{cx:"11",cy:"11",r:"8"}],["line",{x1:"21",x2:"16.65",y1:"21",y2:"16.65"}],["line",{x1:"11",x2:"11",y1:"8",y2:"14"}],["line",{x1:"8",x2:"14",y1:"11",y2:"11"}]];function y(n,{size:t=20,strokeWidth:e=1.75}={}){return Nt(n,{width:t,height:t,"stroke-width":e})}const g={ar:n=>y(ri,n),fullscreen:n=>y(ui,n),exitFullscreen:n=>y(hi,n),screenshot:n=>y(ai,n),tiltUp:n=>y(di,n),tiltDown:n=>y(Lt,n),rotateLeft:n=>y(li,n),rotateRight:n=>y(ci,n),zoomIn:n=>y(bi,n),zoomOut:n=>y(gi,n),reset:n=>y(mi,n),configurator:n=>y(pi,n),close:n=>y(fi,n)};class b{element;constructor({variant:t="default",size:e="default",label:i,icon:o,onClick:s,disabled:r=!1}={}){this.element=document.createElement("button"),this.element.className=`ui-btn ui-btn--${t} ui-btn--size-${e}`,i!==void 0&&(this.element.setAttribute("aria-label",i),this.element.title=i),o!==void 0?this.element.appendChild(o):i!==void 0&&(this.element.textContent=i),s&&this.element.addEventListener("click",s),this.element.disabled=r}setIcon(t){const e=this.element.querySelector("svg");e!==null?e.replaceWith(t):this.element.appendChild(t)}}const m={semantic:{error:"#dc2626"},neutral:{500:"#737373",600:"#525252",900:"#171717"},white:"#ffffff",black:"#000000"},l={0:"0",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",3:"0.75rem",4:"1rem",5:"1.25rem",6:"1.5rem",8:"2rem",9:"2.25rem"};class vi{element;constructor(){this.element=document.createElement("div"),Object.assign(this.element.style,{background:m.white,borderRadius:l[3],padding:l[6],boxShadow:`0 ${l[2]} ${l[8]} oklch(0% 0 0 / 20%)`,maxWidth:"20rem",width:"100%"})}}class yi{constructor(t={}){this.options=t,this.card=new vi,this.backdrop=this.createBackdrop(),this.backdrop.appendChild(this.card.element)}options;card;backdrop;keyHandler=null;open(){document.body.appendChild(this.backdrop),this.keyHandler=t=>{t.key==="Escape"&&this.close()},document.addEventListener("keydown",this.keyHandler)}close(){this.backdrop.remove(),this.keyHandler!==null&&(document.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.options.onClose?.()}createBackdrop(){const t=document.createElement("div");return Object.assign(t.style,{position:"fixed",inset:l[0],background:"oklch(0% 0 0 / 50%)",zIndex:"9999",display:"flex",alignItems:"center",justifyContent:"center"}),t.addEventListener("click",e=>{e.target===t&&this.close()}),t}}class wi{element;selectCallback=null;constructor(t,e,i){this.element=document.createElement("div"),this.element.className="ui-toggle-group";for(let o=0;o<t.length;o++){const s=t[o],r=document.createElement("button");r.className="ui-toggle-group-item",r.dataset.value=s,r.textContent=i?.[o]??s,r.dataset.state=s===e?"on":"off",r.setAttribute("aria-pressed",s===e?"true":"false"),r.addEventListener("click",()=>{this.selectCallback?.(s)}),this.element.appendChild(r)}}setSelected(t){for(const e of this.element.querySelectorAll(".ui-toggle-group-item")){const i=e.dataset.value===t;e.dataset.state=i?"on":"off",e.setAttribute("aria-pressed",i?"true":"false")}}onSelect(t){this.selectCallback=t}}class _i{element;select;constructor(t,e,i,o,s){this.select=document.createElement("select"),this.select.className="ui-native-select",this.select.dataset.name=t,this.select.setAttribute("aria-label",i);const r=document.createElement("option");r.value="",r.disabled=!0,r.textContent=i,this.select.appendChild(r);let a=!1;for(let d=0;d<e.length;d++){const p=e[d],v=document.createElement("option");v.value=p,v.textContent=s?.[d]??p,p===o&&(v.selected=!0,a=!0),this.select.appendChild(v)}a||(r.selected=!0);const h=Nt(Lt,{width:16,height:16,"stroke-width":2});h.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(h)}setSelected(t){this.select.value=t}onSelect(t){this.select.addEventListener("change",()=>{t(this.select.value)})}}const w={fontFamily:{sans:["Mona Sans","ui-sans-serif","system-ui","sans-serif","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"]},fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem"},fontWeight:{medium:"500",semibold:"600"}},E=w.fontFamily.sans.join(", "),Si=`
2
2
  --primary: oklch(5% 0 0);
3
3
  --primary-foreground: oklch(100% 0 0);
4
4
  --secondary: oklch(92% 0 0);
@@ -11,8 +11,8 @@
11
11
  --accent: oklch(92% 0 0);
12
12
  --accent-foreground: oklch(5% 0 0);
13
13
  --muted-foreground: oklch(44% 0 0);
14
- `,hi=`
15
- :root { ${di} }
14
+ `,Ci=`
15
+ :root { ${Si} }
16
16
 
17
17
  /* ── Button ──────────────────────────────────────────────── */
18
18
  .ui-btn {
@@ -288,12 +288,12 @@
288
288
  0%, 100% { opacity: 1; }
289
289
  50% { opacity: 0.55; }
290
290
  }
291
- `;let nt=!1;function It(){if(nt||typeof document>"u")return;nt=!0;const n=document.createElement("style");n.id="vd-ui-vanilla",n.textContent=hi,document.head.appendChild(n)}const mi=w.fontFamily.sans.join(", ");class pi{qrLib=null;dialog=null;qrSlot=null;show(){this.hide(),It(),this.dialog=new li({onClose:()=>{this.dialog=null,this.qrSlot=null}}),Object.assign(this.dialog.card.element.style,{display:"flex",flexDirection:"column",alignItems:"center",gap:a[3],fontFamily:mi}),this.dialog.card.element.appendChild(this.createText(Ae(),{fontSize:w.fontSize.base,fontWeight:w.fontWeight.semibold,color:m.neutral[900]})),this.dialog.card.element.appendChild(this.createText(Re(),{fontSize:w.fontSize.sm,color:m.neutral[600]})),this.qrSlot=this.createQrSlot(),this.dialog.card.element.appendChild(this.qrSlot),this.dialog.card.element.appendChild(this.createText(Me(),{fontSize:w.fontSize.xs,color:m.neutral[500]}));const t=new b({variant:"outline",label:Fe(),onClick:()=>{this.hide()}});this.dialog.card.element.appendChild(t.element),this.dialog.open()}async update(t){this.qrLib??=await Promise.resolve().then(()=>require("./browser-DfB_An57.cjs")).then(i=>i.browser);const e=await this.qrLib.toDataURL(t,{width:256,margin:4,errorCorrectionLevel:"M",color:{dark:m.black,light:m.white}});return this.qrSlot===null?!1:(this.qrSlot.classList.remove("ui-qr-slot--loading"),this.qrSlot.replaceChildren(this.createQrImage(e)),!0)}hide(){this.dialog?.close(),this.dialog=null,this.qrSlot=null}createText(t,e){const i=document.createElement("p");return i.textContent=t,Object.assign(i.style,{margin:"0",textAlign:"center",...e}),i}createQrSlot(){const t=document.createElement("div");return t.className="ui-qr-slot ui-qr-slot--loading",t}createQrImage(t){const e=document.createElement("img");return e.src=t,e.alt="QR code",e}}function it(n){const t=Math.max(0,Math.min(1,n));return t*t*(3-2*t)}function fi(n,t,e,i,o,s){const[r,l,d]=n,u=Math.cos(t),p=Math.sin(t),v=u*r+p*d,A=-p*r+u*d,k=Math.cos(e),S=Math.sin(e),R=k*l-S*A,M=S*l+k*A,Z=.55;return[i+v*s*Z,o-R*s*Z,M]}function gi(n,t,e){n.beginPath(),n.moveTo(t[0],t[1]),n.lineTo(e[0],e[1]),n.strokeStyle="#000",n.lineWidth=2,n.stroke()}function bi(n,t,e,i,o){const s=t(e),r=t(i),l=[s[0]+(r[0]-s[0])*o,s[1]+(r[1]-s[1])*o,s[2]];gi(n,s,l)}const L=[-1,-1,1],z=[1,-1,1],P=[1,-1,-1],F=[-1,-1,-1],$=[-1,1,1],D=[1,1,1],B=[1,1,-1],U=[-1,1,-1],ot=[[L,z],[z,P],[P,F],[F,L],[L,$],[z,D],[P,B],[F,U],[$,D],[D,B],[B,U],[U,$]],vi=400,st='-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';function yi(){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",inset:"0",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",background:"#fff",zIndex:"20",opacity:"0",transition:"opacity 0.3s ease-in-out"});const t=document.createElement("canvas");Object.assign(t.style,{width:"100%",height:"100%",position:"absolute",inset:"0"});const e=document.createElement("div");Object.assign(e.style,{position:"absolute",top:"56%",left:"0",right:"0",textAlign:"center",pointerEvents:"none"});const i=document.createElement("span");Object.assign(i.style,{fontSize:"13px",fontWeight:"400",color:"#000",fontVariantNumeric:"tabular-nums",fontFamily:st});const o=document.createElement("span");return Object.assign(o.style,{fontSize:"13px",color:"#000",fontFamily:st}),o.textContent=Et(),e.appendChild(i),e.appendChild(o),n.appendChild(t),n.appendChild(e),{overlay:n,canvas:t,pctEl:i,phaseEl:o}}class wi{overlay;canvas;ctx;pctEl;phaseEl;animationId=null;showTimerId=null;startTime;hidden=!1;visible=!1;constructor(t,e={}){this.startTime=performance.now();const i=yi();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());const o=e.showDelay??vi;this.showTimerId=setTimeout(()=>{this.reveal()},o)}get loadingTexts(){return{downloading:Et(),rendering:We()}}updateProgress(t,e){this.hidden||(this.pctEl.textContent=`${Math.round(t)}%`,this.phaseEl.textContent=e!==""?` · ${e}`:"")}showError(t){if(this.hidden=!1,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.ctx!==null){const e=Math.min(devicePixelRatio,2),i=this.canvas.width/e,o=this.canvas.height/e;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,i*e,o*e)}this.pctEl.textContent="",this.phaseEl.textContent=t,this.phaseEl.style.color="#b91c1c",this.reveal()}hide(){if(!this.hidden){if(this.hidden=!0,this.cancelShowTimer(),!this.visible){this.destroy();return}this.overlay.style.opacity="0",this.overlay.addEventListener("transitionend",()=>{this.destroy()},{once:!0}),setTimeout(()=>{this.destroy()},500)}}destroy(){this.cancelShowTimer(),this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.overlay.remove()}reveal(){this.hidden||this.visible||(this.visible=!0,this.overlay.style.opacity="1")}cancelShowTimer(){this.showTimerId!==null&&(clearTimeout(this.showTimerId),this.showTimerId=null)}sizeCanvas(){if(this.ctx===null)return;const t=Math.min(devicePixelRatio,2),e=this.overlay.clientWidth||440,i=this.overlay.clientHeight||360;this.canvas.width=e*t,this.canvas.height=i*t,this.ctx.scale(t,t),this.ctx.lineCap="round",this.ctx.lineJoin="round"}tick=()=>{this.hidden||(this.drawFrame(),this.animationId=requestAnimationFrame(this.tick))};drawFrame(){if(this.ctx===null)return;const t=this.canvas.width/Math.min(devicePixelRatio,2),e=this.canvas.height/Math.min(devicePixelRatio,2),i=(performance.now()-this.startTime)/1e3;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,t,e);const o=t/2,s=e*.44,r=Math.min(t,e)*.08,l=.785,d=.615,u=S=>fi(S,l,d,o,s,r),p=6,v=i%p/p,A=ot.length;let k;v<.35?k=it(v/.35)*A:v<.55?k=A:v<.9?k=(1-it((v-.55)/.35))*A:k=0,this.ctx.shadowBlur=5,this.ctx.shadowColor="rgba(30,30,30,0.08)";for(let S=0;S<A&&!(S>=k);S++){const R=ot[S];if(R===void 0)continue;const M=Math.min(1,k-S);bi(this.ctx,u,R[0],R[1],M)}this.ctx.shadowBlur=0}}class _i{constructor(t){this.options=t,this.element=document.createElement("div"),Object.assign(this.element.style,{display:"flex",gap:"0.375rem"}),this.onFullscreenChange=()=>{this.setFullscreenIcon(document.fullscreenElement!==null)},document.addEventListener("fullscreenchange",this.onFullscreenChange)}options;element;arBtn=null;fullscreenBtn=null;onFullscreenChange;setFullscreenIcon(t){this.fullscreenBtn!==null&&this.fullscreenBtn.setIcon(t?g.exitFullscreen():g.fullscreen())}syncButton(t,e,i){if(e&&t===null){const o=i();return this.element.appendChild(o.element),o}return!e&&t!==null?(t.element.remove(),null):t}applySettings(t){this.arBtn=this.syncButton(this.arBtn,t.ar!==!1&&this.options.onAr!==void 0,()=>new b({variant:"outline",size:"icon",label:_e(),icon:g.ar(),onClick:()=>{this.options.onAr?.()}})),this.fullscreenBtn=this.syncButton(this.fullscreenBtn,t.fullscreen!==!1&&this.options.onFullscreen!==void 0,()=>new b({variant:"outline",size:"icon",label:Ue(),icon:g.fullscreen(),onClick:()=>{this.options.onFullscreen?.()}}))}destroy(){document.removeEventListener("fullscreenchange",this.onFullscreenChange)}}const x=.5;class N{element;constructor(t,e){this.element=Object.assign(document.createElement("div"),{className:"vd-camera-controls"});const i={targetRotation:e.rotation,targetTilt:e.tilt,targetZoom:e.zoom,thetaOffset:0},o=Si(t,e,i);e.onChange(s=>{i.targetRotation=s.rotation-i.thetaOffset,i.targetTilt=s.tilt,i.targetZoom=s.zoom,Ci(o,e,s)}),this.element.appendChild(N.buildZoom(o.zoomOut,o.zoomIn)),this.element.appendChild(N.buildDpad(o.tiltUp,o.rotateLeft,o.reset,o.rotateRight,o.tiltDown))}static buildZoom(t,e){const i=document.createElement("div");return i.className="vd-zoom",i.appendChild(t.element),i.appendChild(e.element),i}static buildDpad(t,e,i,o,s){const r=document.createElement("div");r.className="vd-dpad";for(const[l,d]of[[t,"up"],[e,"left"],[i,"center"],[o,"right"],[s,"down"]])l.element.classList.add(`vd-dpad-${d}`),r.appendChild(l.element);return r}}function Si(n,t,e){const i=r=>Math.max(t.limits?.minZoom??1,Math.min(t.limits?.maxZoom??1/0,r)),o=r=>{const l=t.limits?.minRotate,d=t.limits?.maxRotate;return l!==void 0||d!==void 0?Math.max(l??-1/0,Math.min(d??1/0,r)):r},s=r=>{const l=t.limits?.minTilt,d=t.limits?.maxTilt;if(l!==void 0||d!==void 0){e.targetTilt=Math.max(l??0,Math.min(d??180,e.targetTilt+r)),n.tilt(e.targetTilt).set();return}const u=e.targetTilt+r;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())};return{zoomOut:new b({variant:"outline",size:"icon",label:yn(),icon:g.zoomOut(),onClick:()=>{e.targetZoom=i(e.targetZoom-10),n.zoom(e.targetZoom).set()}}),zoomIn:new b({variant:"outline",size:"icon",label:fn(),icon:g.zoomIn(),onClick:()=>{e.targetZoom=i(e.targetZoom+10),n.zoom(e.targetZoom).set()}}),tiltUp:new b({variant:"outline",size:"icon",label:On(),icon:g.tiltUp(),onClick:()=>{s(-15)}}),rotateLeft:new b({variant:"outline",size:"icon",label:Cn(),icon:g.rotateLeft(),onClick:()=>{e.targetRotation=o(e.targetRotation-15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),reset:new b({variant:"outline",size:"icon",label:dn(),icon:g.reset(),onClick:()=>{e.thetaOffset=0,n.reset()}}),rotateRight:new b({variant:"outline",size:"icon",label:xn(),icon:g.rotateRight(),onClick:()=>{e.targetRotation=o(e.targetRotation+15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),tiltDown:new b({variant:"outline",size:"icon",label:zn(),icon:g.tiltDown(),onClick:()=>{s(15)}})}}function Ci(n,t,e){const i=t.limits;i!==void 0&&(n.zoomOut.element.disabled=i.minZoom!==void 0&&e.zoom<=i.minZoom+x,n.zoomIn.element.disabled=i.maxZoom!==void 0&&e.zoom>=i.maxZoom-x,n.tiltUp.element.disabled=i.minTilt!==void 0&&e.tilt<=i.minTilt+x,n.tiltDown.element.disabled=i.maxTilt!==void 0&&e.tilt>=i.maxTilt-x,n.rotateLeft.element.disabled=i.minRotate!==void 0&&e.rotation<=i.minRotate+x,n.rotateRight.element.disabled=i.maxRotate!==void 0&&e.rotation>=i.maxRotate-x)}const T={SELECT:"ui:select",SELECTED:"ui:selected",FOCUS_CHANGE:"vd:focus-change",CONFIGURATION_CHANGE:"vd:configuration-change",CONFIGURATION_SUBMIT:"vd:configuration-submit"},ki=5;let Ai=0;function V(n){const t=n.replace(/([A-Z])/g," $1").trim();return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Ei(n,t,e,i,o){const s=document.createElement("div");s.className="vd-attribute",s.dataset.name=n.name;const r=document.createElement("span");r.className="vd-attribute-label",r.textContent=V(n.name),r.id=`vd-attribute-label-${Ai++}`,s.appendChild(r),s.setAttribute("role","group"),s.setAttribute("aria-labelledby",r.id);const l=n.values.find(p=>t.getValue(n.name,p)?.isSelected===!0),d=n.values.map(V),u=n.values.length<=ki?new ci(n.values,l,d):new ui(n.name,n.values,V(n.name),l,d);return u.onSelect(p=>{e.dispatch(T.SELECT,{attribute:n.name,value:p},!0).defaultPrevented||i(n.name,p)}),o(n.name,p=>{u.setSelected(p.value),e.dispatch(T.SELECTED,{attribute:n.name,value:p.value})}),s.appendChild(u.element),s}const xi=80,Ti=2500;class Ri{constructor(t,e=Ti){this.configuration=t,this.resetMs=e,this.element=document.createElement("div"),this.element.className="vd-commerce vd-hidden";const i=document.createElement("div");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:()=>{this.handleSubmit()}}),this.button.element.classList.add("vd-cta","vd-hidden"),this.element.append(i,this.button.element),this.unsubscribe=this.configuration.onRender(()=>{this.update()}),this.update()}configuration;resetMs;element;priceEl;vatEl;button;unsubscribe;state="idle";resetTimer;update(){this.renderPrice(this.configuration.current),this.renderButton();const t=this.configuration.current!==void 0||this.configuration.submitEnabled;this.element.classList.toggle("vd-hidden",!t)}destroy(){this.unsubscribe(),this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.element.remove()}renderPrice(t){if(t===void 0){this.priceEl.textContent="",this.vatEl.textContent="";return}this.priceEl.textContent=Ii(t.price,t.currency),this.vatEl.textContent=rt(this.configuration.vatDisplay)}renderButton(){const t=this.configuration.submitEnabled;this.button.element.classList.toggle("vd-hidden",!t),t&&this.state==="idle"&&this.setButtonText(rt(this.configuration.buttonLabel))}async handleSubmit(){if(this.state!=="busy"){this.setState("busy",Dn());try{await this.configuration.submit(),this.setState("success",jn())}catch{this.setState("failed",Zn())}this.scheduleReset()}}scheduleReset(){this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.state="idle",this.update()},this.resetMs)}setState(t,e){this.state=t,this.element.dataset.submit=t,this.button.element.disabled=t==="busy",this.setButtonText(e)}setButtonText(t){this.button.element.textContent=t,this.button.element.setAttribute("aria-label",t)}}function rt(n){return(n??"").slice(0,xi)}function Ii(n,t){try{const e=new Intl.NumberFormat(h(),{style:"currency",currency:t}),i=e.resolvedOptions().maximumFractionDigits??2;return e.format(n/10**i)}catch{return`${t} ${(n/100).toFixed(2)}`}}class Ot{slot=null;panel=null;attach(t,e){this.panel=e,e.style.display="none",this.slot=document.createElement("div"),this.slot.className="vd-slot-bottom-left",this.slot.appendChild(e),t.appendChild(this.slot)}setVisible(t){this.panel!==null&&(this.panel.style.display=t?"flex":"none")}destroy(){this.slot?.remove(),this.slot=null,this.panel=null}}const Oi=572;class Ni{constructor(t){this.actionBarSlot=t}actionBarSlot;element=null;body=null;openButton=null;closeButton=null;container=null;observer=null;collapsible=!1;expanded=!0;visible=!1;attach(t,e){this.container=t,e.classList.add("vd-attributes-sidebar"),this.closeButton=new b({variant:"ghost",size:"icon-sm",label:an(),icon:g.close({size:18}),onClick:()=>{this.expanded=!1,this.render()}});const i=document.createElement("div");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({variant:"outline",size:"icon",label:nn(),icon:g.configurator({size:18}),onClick:()=>{this.expanded=!0,this.render()}}),this.openButton.element.classList.add("vd-configurator-toggle","vd-hidden"),this.actionBarSlot.appendChild(this.openButton.element),this.observe()}setVisible(t){this.visible=t,this.render()}destroy(){this.observer?.disconnect(),this.observer=null,this.openButton?.element.remove(),this.element?.remove(),this.container?.classList.remove("vd-layout-sidebar-right","vd-layout-sidebar-permanent"),this.container=null}observe(){typeof ResizeObserver>"u"||this.container===null||(this.observer=new ResizeObserver(t=>{const e=t[0]?.contentRect.width??0;this.setCollapsible(e>0&&e<Oi)}),this.observer.observe(this.container))}setCollapsible(t){t!==this.collapsible&&(this.collapsible=t,this.expanded=!t,this.render())}render(){if(this.element===null||this.openButton===null||this.closeButton===null||this.container===null)return;const t=this.visible&&this.expanded,e=this.visible&&!this.expanded;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)}}class Mi{attach(t,e){}setVisible(t){}destroy(){}}const Li={"inframe-bottom-left":()=>new Ot,"sidebar-right":n=>new Ni(n),hidden:()=>new Mi};function zi(n,t){return(Li[n??""]??(()=>new Ot))(t)}const j=w.fontFamily.sans.join(", "),H=`
291
+ `;let at=!1;function Mt(){if(at||typeof document>"u")return;at=!0;const n=document.createElement("style");n.id="vd-ui-vanilla",n.textContent=Ci,document.head.appendChild(n)}const ki=w.fontFamily.sans.join(", ");class Ai{qrLib=null;dialog=null;qrSlot=null;show(){this.hide(),Mt(),this.dialog=new yi({onClose:()=>{this.dialog=null,this.qrSlot=null}}),Object.assign(this.dialog.card.element.style,{display:"flex",flexDirection:"column",alignItems:"center",gap:l[3],fontFamily:ki}),this.dialog.card.element.appendChild(this.createText(Pe(),{fontSize:w.fontSize.base,fontWeight:w.fontWeight.semibold,color:m.neutral[900]})),this.dialog.card.element.appendChild(this.createText(Be(),{fontSize:w.fontSize.sm,color:m.neutral[600]})),this.qrSlot=this.createQrSlot(),this.dialog.card.element.appendChild(this.qrSlot),this.dialog.card.element.appendChild(this.createText(He(),{fontSize:w.fontSize.xs,color:m.neutral[500]}));const t=new b({variant:"outline",label:We(),onClick:()=>{this.hide()}});this.dialog.card.element.appendChild(t.element),this.dialog.open()}async update(t){this.qrLib??=await Promise.resolve().then(()=>require("./browser-DfB_An57.cjs")).then(i=>i.browser);const e=await this.qrLib.toDataURL(t,{width:256,margin:4,errorCorrectionLevel:"M",color:{dark:m.black,light:m.white}});return this.qrSlot===null?!1:(this.qrSlot.classList.remove("ui-qr-slot--loading"),this.qrSlot.replaceChildren(this.createQrImage(e)),!0)}hide(){this.dialog?.close(),this.dialog=null,this.qrSlot=null}createText(t,e){const i=document.createElement("p");return i.textContent=t,Object.assign(i.style,{margin:"0",textAlign:"center",...e}),i}createQrSlot(){const t=document.createElement("div");return t.className="ui-qr-slot ui-qr-slot--loading",t}createQrImage(t){const e=document.createElement("img");return e.src=t,e.alt="QR code",e}}function lt(n){const t=Math.max(0,Math.min(1,n));return t*t*(3-2*t)}function Ei(n,t,e,i,o,s){const[r,a,h]=n,d=Math.cos(t),p=Math.sin(t),v=d*r+p*h,A=-p*r+d*h,k=Math.cos(e),S=Math.sin(e),R=k*a-S*A,z=S*a+k*A,X=.55;return[i+v*s*X,o-R*s*X,z]}function xi(n,t,e){n.beginPath(),n.moveTo(t[0],t[1]),n.lineTo(e[0],e[1]),n.strokeStyle="#000",n.lineWidth=2,n.stroke()}function Ti(n,t,e,i,o){const s=t(e),r=t(i),a=[s[0]+(r[0]-s[0])*o,s[1]+(r[1]-s[1])*o,s[2]];xi(n,s,a)}const F=[-1,-1,1],$=[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],ct=[[F,$],[$,D],[D,B],[B,F],[F,U],[$,V],[D,j],[B,H],[U,V],[V,j],[j,H],[H,U]],Ri=400,dt='-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';function Ii(){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",inset:"0",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",background:"#fff",zIndex:"20",opacity:"0",transition:"opacity 0.3s ease-in-out"});const t=document.createElement("canvas");Object.assign(t.style,{width:"100%",height:"100%",position:"absolute",inset:"0"});const e=document.createElement("div");Object.assign(e.style,{position:"absolute",top:"56%",left:"0",right:"0",textAlign:"center",pointerEvents:"none"});const i=document.createElement("span");Object.assign(i.style,{fontSize:"13px",fontWeight:"400",color:"#000",fontVariantNumeric:"tabular-nums",fontFamily:dt});const o=document.createElement("span");return Object.assign(o.style,{fontSize:"13px",color:"#000",fontFamily:dt}),o.textContent=It(),e.appendChild(i),e.appendChild(o),n.appendChild(t),n.appendChild(e),{overlay:n,canvas:t,pctEl:i,phaseEl:o}}class Oi{overlay;canvas;ctx;pctEl;phaseEl;animationId=null;showTimerId=null;startTime;hidden=!1;visible=!1;constructor(t,e={}){this.startTime=performance.now();const i=Ii();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());const o=e.showDelay??Ri;this.showTimerId=setTimeout(()=>{this.reveal()},o)}get loadingTexts(){return{downloading:It(),rendering:rn()}}updateProgress(t,e){this.hidden||(this.pctEl.textContent=`${Math.round(t)}%`,this.phaseEl.textContent=e!==""?` · ${e}`:"")}showError(t){if(this.hidden=!1,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.ctx!==null){const e=Math.min(devicePixelRatio,2),i=this.canvas.width/e,o=this.canvas.height/e;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,i*e,o*e)}this.pctEl.textContent="",this.phaseEl.textContent=t,this.phaseEl.style.color="#b91c1c",this.reveal()}hide(){if(!this.hidden){if(this.hidden=!0,this.cancelShowTimer(),!this.visible){this.destroy();return}this.overlay.style.opacity="0",this.overlay.addEventListener("transitionend",()=>{this.destroy()},{once:!0}),setTimeout(()=>{this.destroy()},500)}}destroy(){this.cancelShowTimer(),this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.overlay.remove()}reveal(){this.hidden||this.visible||(this.visible=!0,this.overlay.style.opacity="1")}cancelShowTimer(){this.showTimerId!==null&&(clearTimeout(this.showTimerId),this.showTimerId=null)}sizeCanvas(){if(this.ctx===null)return;const t=Math.min(devicePixelRatio,2),e=this.overlay.clientWidth||440,i=this.overlay.clientHeight||360;this.canvas.width=e*t,this.canvas.height=i*t,this.ctx.scale(t,t),this.ctx.lineCap="round",this.ctx.lineJoin="round"}tick=()=>{this.hidden||(this.drawFrame(),this.animationId=requestAnimationFrame(this.tick))};drawFrame(){if(this.ctx===null)return;const t=this.canvas.width/Math.min(devicePixelRatio,2),e=this.canvas.height/Math.min(devicePixelRatio,2),i=(performance.now()-this.startTime)/1e3;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,t,e);const o=t/2,s=e*.44,r=Math.min(t,e)*.08,a=.785,h=.615,d=S=>Ei(S,a,h,o,s,r),p=6,v=i%p/p,A=ct.length;let k;v<.35?k=lt(v/.35)*A:v<.55?k=A:v<.9?k=(1-lt((v-.55)/.35))*A:k=0,this.ctx.shadowBlur=5,this.ctx.shadowColor="rgba(30,30,30,0.08)";for(let S=0;S<A&&!(S>=k);S++){const R=ct[S];if(R===void 0)continue;const z=Math.min(1,k-S);Ti(this.ctx,d,R[0],R[1],z)}this.ctx.shadowBlur=0}}class Ni{constructor(t){this.options=t,this.element=document.createElement("div"),Object.assign(this.element.style,{display:"flex",gap:"0.375rem"}),this.onFullscreenChange=()=>{this.setFullscreenIcon(document.fullscreenElement!==null)},document.addEventListener("fullscreenchange",this.onFullscreenChange)}options;element;arBtn=null;fullscreenBtn=null;onFullscreenChange;setFullscreenIcon(t){this.fullscreenBtn!==null&&this.fullscreenBtn.setIcon(t?g.exitFullscreen():g.fullscreen())}syncButton(t,e,i){if(e&&t===null){const o=i();return this.element.appendChild(o.element),o}return!e&&t!==null?(t.element.remove(),null):t}applySettings(t){this.arBtn=this.syncButton(this.arBtn,t.ar!==!1&&this.options.onAr!==void 0,()=>new b({variant:"outline",size:"icon",label:Ne(),icon:g.ar(),onClick:()=>{this.options.onAr?.()}})),this.fullscreenBtn=this.syncButton(this.fullscreenBtn,t.fullscreen!==!1&&this.options.onFullscreen!==void 0,()=>new b({variant:"outline",size:"icon",label:Xe(),icon:g.fullscreen(),onClick:()=>{this.options.onFullscreen?.()}}))}destroy(){document.removeEventListener("fullscreenchange",this.onFullscreenChange)}}const x=.5;class M{element;constructor(t,e){this.element=Object.assign(document.createElement("div"),{className:"vd-camera-controls"});const i={targetRotation:e.rotation,targetTilt:e.tilt,targetZoom:e.zoom,thetaOffset:0},o=Li(t,e,i);e.onChange(s=>{i.targetRotation=s.rotation-i.thetaOffset,i.targetTilt=s.tilt,i.targetZoom=s.zoom,Mi(o,e,s)}),this.element.appendChild(M.buildZoom(o.zoomOut,o.zoomIn)),this.element.appendChild(M.buildDpad(o.tiltUp,o.rotateLeft,o.reset,o.rotateRight,o.tiltDown))}static buildZoom(t,e){const i=document.createElement("div");return i.className="vd-zoom",i.appendChild(t.element),i.appendChild(e.element),i}static buildDpad(t,e,i,o,s){const r=document.createElement("div");r.className="vd-dpad";for(const[a,h]of[[t,"up"],[e,"left"],[i,"center"],[o,"right"],[s,"down"]])a.element.classList.add(`vd-dpad-${h}`),r.appendChild(a.element);return r}}function Li(n,t,e){const i=r=>Math.max(t.limits?.minZoom??1,Math.min(t.limits?.maxZoom??1/0,r)),o=r=>{const a=t.limits?.minRotate,h=t.limits?.maxRotate;return a!==void 0||h!==void 0?Math.max(a??-1/0,Math.min(h??1/0,r)):r},s=r=>{const a=t.limits?.minTilt,h=t.limits?.maxTilt;if(a!==void 0||h!==void 0){e.targetTilt=Math.max(a??0,Math.min(h??180,e.targetTilt+r)),n.tilt(e.targetTilt).set();return}const d=e.targetTilt+r;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())};return{zoomOut:new b({variant:"outline",size:"icon",label:In(),icon:g.zoomOut(),onClick:()=>{e.targetZoom=i(e.targetZoom-10),n.zoom(e.targetZoom).set()}}),zoomIn:new b({variant:"outline",size:"icon",label:En(),icon:g.zoomIn(),onClick:()=>{e.targetZoom=i(e.targetZoom+10),n.zoom(e.targetZoom).set()}}),tiltUp:new b({variant:"outline",size:"icon",label:Vn(),icon:g.tiltUp(),onClick:()=>{s(-15)}}),rotateLeft:new b({variant:"outline",size:"icon",label:Mn(),icon:g.rotateLeft(),onClick:()=>{e.targetRotation=o(e.targetRotation-15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),reset:new b({variant:"outline",size:"icon",label:Sn(),icon:g.reset(),onClick:()=>{e.thetaOffset=0,n.reset()}}),rotateRight:new b({variant:"outline",size:"icon",label:$n(),icon:g.rotateRight(),onClick:()=>{e.targetRotation=o(e.targetRotation+15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),tiltDown:new b({variant:"outline",size:"icon",label:Gn(),icon:g.tiltDown(),onClick:()=>{s(15)}})}}function Mi(n,t,e){const i=t.limits;i!==void 0&&(n.zoomOut.element.disabled=i.minZoom!==void 0&&e.zoom<=i.minZoom+x,n.zoomIn.element.disabled=i.maxZoom!==void 0&&e.zoom>=i.maxZoom-x,n.tiltUp.element.disabled=i.minTilt!==void 0&&e.tilt<=i.minTilt+x,n.tiltDown.element.disabled=i.maxTilt!==void 0&&e.tilt>=i.maxTilt-x,n.rotateLeft.element.disabled=i.minRotate!==void 0&&e.rotation<=i.minRotate+x,n.rotateRight.element.disabled=i.maxRotate!==void 0&&e.rotation>=i.maxRotate-x)}const T={SELECT:"ui:select",SELECTED:"ui:selected",FOCUS_CHANGE:"vd:focus-change",CONFIGURATION_CHANGE:"vd:configuration-change",CONFIGURATION_SUBMIT:"vd:configuration-submit"},zi=5;let Pi=0;function q(n){const t=n.replace(/([A-Z])/g," $1").trim();return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Fi(n,t,e,i,o){const s=document.createElement("div");s.className="vd-attribute",s.dataset.name=n.name;const r=document.createElement("span");r.className="vd-attribute-label",r.textContent=q(n.name),r.id=`vd-attribute-label-${Pi++}`,s.appendChild(r),s.setAttribute("role","group"),s.setAttribute("aria-labelledby",r.id);const a=n.values.find(p=>t.getValue(n.name,p)?.isSelected===!0),h=n.values.map(q),d=n.values.length<=zi?new wi(n.values,a,h):new _i(n.name,n.values,q(n.name),a,h);return d.onSelect(p=>{e.dispatch(T.SELECT,{attribute:n.name,value:p},!0).defaultPrevented||i(n.name,p)}),o(n.name,p=>{d.setSelected(p.value),e.dispatch(T.SELECTED,{attribute:n.name,value:p.value})}),s.appendChild(d.element),s}const $i=80,Di=2500;class Bi{constructor(t,e=Di){this.configuration=t,this.resetMs=e,this.element=document.createElement("div"),this.element.className="vd-commerce vd-hidden";const i=document.createElement("div");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:()=>{this.handleSubmit()}}),this.button.element.classList.add("vd-cta","vd-hidden"),this.element.append(i,this.button.element),this.unsubscribe=this.configuration.onRender(()=>{this.update()}),this.update()}configuration;resetMs;element;priceEl;vatEl;button;unsubscribe;state="idle";resetTimer;update(){this.renderPrice(this.configuration.current),this.renderButton();const t=this.configuration.current!==void 0||this.configuration.submitEnabled;this.element.classList.toggle("vd-hidden",!t)}destroy(){this.unsubscribe(),this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.element.remove()}renderPrice(t){if(t===void 0){this.priceEl.textContent="",this.vatEl.textContent="";return}this.priceEl.textContent=Ui(t.price,t.currency),this.vatEl.textContent=ut(this.configuration.vatDisplay)}renderButton(){const t=this.configuration.submitEnabled;this.button.element.classList.toggle("vd-hidden",!t),t&&this.state==="idle"&&this.setButtonText(ut(this.configuration.buttonLabel))}async handleSubmit(){if(this.state!=="busy"){this.setState("busy",Qn());try{await this.configuration.submit(),this.setState("success",ti())}catch{this.setState("failed",oi())}this.scheduleReset()}}scheduleReset(){this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.state="idle",this.update()},this.resetMs)}setState(t,e){this.state=t,this.element.dataset.submit=t,this.button.element.disabled=t==="busy",this.setButtonText(e)}setButtonText(t){this.button.element.textContent=t,this.button.element.setAttribute("aria-label",t)}}function ut(n){return(n??"").slice(0,$i)}function Ui(n,t){try{const e=new Intl.NumberFormat(u(),{style:"currency",currency:t}),i=e.resolvedOptions().maximumFractionDigits??2;return e.format(n/10**i)}catch{return`${t} ${(n/100).toFixed(2)}`}}class zt{slot=null;panel=null;attach(t,e){this.panel=e,e.style.display="none",this.slot=document.createElement("div"),this.slot.className="vd-slot-bottom-left",this.slot.appendChild(e),t.appendChild(this.slot)}setVisible(t){this.panel!==null&&(this.panel.style.display=t?"flex":"none")}destroy(){this.slot?.remove(),this.slot=null,this.panel=null}}const Vi=572;class ji{constructor(t){this.actionBarSlot=t}actionBarSlot;element=null;body=null;openButton=null;closeButton=null;container=null;observer=null;collapsible=!1;expanded=!0;visible=!1;attach(t,e){this.container=t,e.classList.add("vd-attributes-sidebar"),this.closeButton=new b({variant:"ghost",size:"icon-sm",label:vn(),icon:g.close({size:18}),onClick:()=>{this.expanded=!1,this.render()}});const i=document.createElement("div");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({variant:"outline",size:"icon",label:pn(),icon:g.configurator({size:18}),onClick:()=>{this.expanded=!0,this.render()}}),this.openButton.element.classList.add("vd-configurator-toggle","vd-hidden"),this.actionBarSlot.appendChild(this.openButton.element),this.observe()}setVisible(t){this.visible=t,this.render()}destroy(){this.observer?.disconnect(),this.observer=null,this.openButton?.element.remove(),this.element?.remove(),this.container?.classList.remove("vd-layout-sidebar-right","vd-layout-sidebar-permanent"),this.container=null}observe(){typeof ResizeObserver>"u"||this.container===null||(this.observer=new ResizeObserver(t=>{const e=t[0]?.contentRect.width??0;this.setCollapsible(e>0&&e<Vi)}),this.observer.observe(this.container))}setCollapsible(t){t!==this.collapsible&&(this.collapsible=t,this.expanded=!t,this.render())}render(){if(this.element===null||this.openButton===null||this.closeButton===null||this.container===null)return;const t=this.visible&&this.expanded,e=this.visible&&!this.expanded;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)}}class Hi{attach(t,e){}setVisible(t){}destroy(){}}const qi={"inframe-bottom-left":()=>new zt,"sidebar-right":n=>new ji(n),hidden:()=>new Hi};function Gi(n,t){return(qi[n??""]??(()=>new zt))(t)}const G=w.fontFamily.sans.join(", "),Z=`
292
292
  position: absolute;
293
293
  display: flex;
294
294
  z-index: 10;
295
295
  transition: inset-inline-end 0.18s ease;
296
- `,Pi=`
296
+ `,Zi=`
297
297
  /* Override browser's default black fullscreen backdrop */
298
298
  .vd-container:fullscreen {
299
299
  background: oklch(100% 0 0);
@@ -301,52 +301,52 @@
301
301
 
302
302
  /* Layout slots — four corners */
303
303
  .vd-slot-top-right {
304
- ${H}
305
- inset-block-start: ${a[3]};
306
- inset-inline-end: ${a[3]};
304
+ ${Z}
305
+ inset-block-start: ${l[3]};
306
+ inset-inline-end: ${l[3]};
307
307
  flex-direction: column;
308
308
  align-items: flex-end;
309
- gap: ${a[1.5]};
309
+ gap: ${l[1.5]};
310
310
  }
311
311
 
312
312
  .vd-slot-bottom-left {
313
- ${H}
314
- inset-block-end: ${a[3]};
315
- inset-inline-start: ${a[3]};
313
+ ${Z}
314
+ inset-block-end: ${l[3]};
315
+ inset-inline-start: ${l[3]};
316
316
  flex-direction: column;
317
317
  align-items: flex-start;
318
- gap: ${a[1.5]};
318
+ gap: ${l[1.5]};
319
319
  }
320
320
 
321
321
  .vd-slot-bottom-right {
322
- ${H}
323
- inset-block-end: ${a[3]};
324
- inset-inline-end: ${a[3]};
322
+ ${Z}
323
+ inset-block-end: ${l[3]};
324
+ inset-inline-end: ${l[3]};
325
325
  flex-direction: row;
326
- gap: ${a[1.5]};
326
+ gap: ${l[1.5]};
327
327
  }
328
328
 
329
329
  /* Component styles — no positioning */
330
330
  .vd-camera-controls {
331
331
  display: flex;
332
332
  flex-direction: column;
333
- gap: ${a[1]};
333
+ gap: ${l[1]};
334
334
  background: color-mix(in oklch, ${m.white} 85%, transparent);
335
335
  backdrop-filter: blur(8px);
336
- border-radius: ${a[2]};
337
- padding: ${a[2]};
336
+ border-radius: ${l[2]};
337
+ padding: ${l[2]};
338
338
  }
339
339
 
340
340
  .vd-zoom {
341
341
  display: flex;
342
- gap: ${a[.5]};
342
+ gap: ${l[.5]};
343
343
  }
344
344
 
345
345
  .vd-dpad {
346
346
  display: grid;
347
- grid-template-columns: repeat(3, ${a[9]});
348
- grid-template-rows: repeat(3, ${a[9]});
349
- gap: ${a[.5]};
347
+ grid-template-columns: repeat(3, ${l[9]});
348
+ grid-template-rows: repeat(3, ${l[9]});
349
+ gap: ${l[.5]};
350
350
  }
351
351
 
352
352
  .vd-dpad-up { grid-column: 2; grid-row: 1; }
@@ -358,20 +358,20 @@
358
358
  .vd-attributes {
359
359
  display: flex;
360
360
  flex-direction: column;
361
- gap: ${a[3]};
361
+ gap: ${l[3]};
362
362
  background: color-mix(in oklch, ${m.white} 85%, transparent);
363
363
  backdrop-filter: blur(8px);
364
364
  border: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
365
- border-radius: ${a[3]};
366
- padding: ${a[3]};
367
- box-shadow: 0 ${a[1]} ${a[4]} color-mix(in oklch, ${m.neutral[900]} 6%, transparent);
368
- font-family: ${j};
365
+ border-radius: ${l[3]};
366
+ padding: ${l[3]};
367
+ box-shadow: 0 ${l[1]} ${l[4]} color-mix(in oklch, ${m.neutral[900]} 6%, transparent);
368
+ font-family: ${G};
369
369
  }
370
370
 
371
371
  .vd-attribute {
372
372
  display: flex;
373
373
  flex-direction: column;
374
- gap: ${a[1.5]};
374
+ gap: ${l[1.5]};
375
375
  }
376
376
 
377
377
  /* Micro-label: recedes so the controls lead. */
@@ -381,7 +381,7 @@
381
381
  color: ${m.neutral[500]};
382
382
  text-transform: uppercase;
383
383
  letter-spacing: 0.05em;
384
- font-family: ${j};
384
+ font-family: ${G};
385
385
  }
386
386
 
387
387
  /* sidebar-right layout — a docked, full-height right panel */
@@ -420,7 +420,7 @@
420
420
  background: color-mix(in oklch, ${m.white} 90%, transparent);
421
421
  backdrop-filter: blur(10px);
422
422
  border-inline-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
423
- box-shadow: -${a[1]} 0 ${a[4]} color-mix(in oklch, ${m.neutral[900]} 5%, transparent);
423
+ box-shadow: -${l[1]} 0 ${l[4]} color-mix(in oklch, ${m.neutral[900]} 5%, transparent);
424
424
  }
425
425
 
426
426
  @media (prefers-reduced-motion: no-preference) {
@@ -432,13 +432,13 @@
432
432
  .vd-sidebar-header {
433
433
  display: flex;
434
434
  justify-content: flex-end;
435
- padding: ${a[1.5]} ${a[1.5]} 0;
435
+ padding: ${l[1.5]} ${l[1.5]} 0;
436
436
  }
437
437
 
438
438
  .vd-sidebar-body {
439
439
  flex: 1;
440
440
  overflow-y: auto;
441
- padding: ${a[4]};
441
+ padding: ${l[4]};
442
442
  }
443
443
 
444
444
  /* attributes inside the sidebar: flat and full-width — the panel provides the frosting */
@@ -449,27 +449,27 @@
449
449
  border-radius: 0;
450
450
  padding: 0;
451
451
  box-shadow: none;
452
- gap: ${a[5]};
452
+ gap: ${l[5]};
453
453
  }
454
454
 
455
455
  /* while the panel is open, keep the corner controls clear of it */
456
- .vd-layout-sidebar-right .vd-slot-top-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${a[3]}); }
457
- .vd-layout-sidebar-right .vd-slot-bottom-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${a[3]}); }
456
+ .vd-layout-sidebar-right .vd-slot-top-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${l[3]}); }
457
+ .vd-layout-sidebar-right .vd-slot-bottom-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${l[3]}); }
458
458
 
459
459
  /* Price + CTA — sit under the attribute controls, separated by a hairline */
460
460
  .vd-commerce {
461
461
  display: flex;
462
462
  flex-direction: column;
463
- gap: ${a[2]};
464
- padding-block-start: ${a[3]};
463
+ gap: ${l[2]};
464
+ padding-block-start: ${l[3]};
465
465
  border-block-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
466
- font-family: ${j};
466
+ font-family: ${G};
467
467
  }
468
468
 
469
469
  .vd-commerce-price {
470
470
  display: flex;
471
471
  align-items: baseline;
472
- gap: ${a[1.5]};
472
+ gap: ${l[1.5]};
473
473
  }
474
474
 
475
475
  .vd-price {
@@ -495,4 +495,4 @@
495
495
  color: ${m.white};
496
496
  }
497
497
 
498
- `;function Fi(){if(It(),document.getElementById("vd-styles")!==null)return;const n=document.createElement("style");n.id="vd-styles",n.textContent=Pi,document.head.appendChild(n)}function $i(n,t){const e=document.createElement("a");e.href=`data:image/png;base64,${n}`,e.download=t,e.click()}class Di{options;settings={};container=null;loading=null;slots={topRight:null,bottomRight:null};screenshotBtn=null;actionBar=null;cameraControls=null;attributes=null;layout=null;commerce=null;constructor(t){this.options=t}attach(t){Fi(),this.container=t,this.loading=new wi(t),this.slots.topRight=this.createSlot(t,"vd-slot-top-right"),this.slots.bottomRight=this.createSlot(t,"vd-slot-bottom-right")}onReady(){this.loading?.hide(),this.loading=null,this.mountToolbar(),this.cameraControls!==null&&(this.cameraControls.element.style.display="flex"),this.layout?.setVisible(!0)}mountToolbar(){if(this.actionBar!==null||this.slots.bottomRight===null||this.container===null)return;const t=typeof this.container.requestFullscreen=="function";this.actionBar=new _i({onAr:this.options.onAr,onFullscreen:t?()=>{this.toggleFullscreen()}:void 0}),this.actionBar.applySettings(this.settings),this.slots.bottomRight.appendChild(this.actionBar.element),this.syncScreenshotButton(),this.placeScreenshotButton()}toggleFullscreen(){this.container!==null&&(document.fullscreenElement!==null?document.exitFullscreen():(this.options.onFullscreenEnter?.(),this.container.requestFullscreen()))}updateProgress(t,e){this.loading?.updateProgress(t,e)}showError(t){this.loading?.showError(t)}applyViewerSettings(t){this.settings=t,t.language!==void 0&&Ct(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()}renderAttributeControls(t,e){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 N(this.options.cameraApi,this.options.cameraPositionApi),this.cameraControls.element.style.display="none",this.slots.topRight.appendChild(this.cameraControls.element)),this.placeScreenshotButton(),e.length!==0)){this.attributes=document.createElement("div"),this.attributes.className="vd-attributes";for(const i of e)this.attributes.appendChild(Ei(i,t,this.options.eventBus,this.options.onSelect,this.options.onSubscribe));this.commerce=new Ri(this.options.configuration),this.attributes.appendChild(this.commerce.element),this.layout=zi(this.settings.configuratorLayout,this.slots.bottomRight),this.layout.attach(this.container,this.attributes)}}get viewerSettings(){return this.settings}teardownConfigurator(){this.commerce?.destroy(),this.commerce=null,this.attributes?.remove(),this.attributes=null,this.layout?.destroy(),this.layout=null}destroy(){this.loading?.destroy(),this.screenshotBtn?.element.remove(),this.actionBar?.destroy(),this.actionBar?.element.remove(),this.cameraControls?.element.remove(),this.teardownConfigurator();for(const t of Object.values(this.slots))t?.remove();this.container=null}createSlot(t,e){const i=document.createElement("div");return i.className=e,t.appendChild(i),i}syncScreenshotButton(){const t=this.settings.screenshot===!0;t&&this.screenshotBtn===null&&(this.screenshotBtn=new b({variant:"outline",size:"icon",label:Xe(),icon:g.screenshot(),onClick:()=>{this.options.snapshotApi.take("snapshot.png").onDeveloped(({data:e,filename:i})=>{$i(e,i)})}})),!t&&this.screenshotBtn!==null&&(this.screenshotBtn.element.remove(),this.screenshotBtn=null)}placeScreenshotButton(){this.screenshotBtn===null||this.slots.topRight===null||(this.cameraControls!==null?this.cameraControls.element.appendChild(this.screenshotBtn.element):this.slots.topRight.appendChild(this.screenshotBtn.element))}}const Bi={};class Ui{defaultServer="https://server.virtualdisplay.io";options;serverHost;constructor(t,e){this.options=t,this.serverHost=e}create(){const t=this.createContainer(),e=this.createIframe();return t.appendChild(e),this.attachToParent(t),{container:t,iframe:e}}createContainer(){const t=document.createElement("div");return t.className="vd-container",Object.assign(t.style,{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),t}createIframe(){const t=document.createElement("iframe");return t.src=this.buildUrl(),t.setAttribute("allow","xr-spatial-tracking; fullscreen"),t}attachToParent(t){this.getParentElement().appendChild(t)}buildUrl(){const t=this.getServerUrl(),e=new URL(t);return e.searchParams.set("license",this.options.license),e.searchParams.set("model",this.options.model),this.options.language!==void 0&&e.searchParams.set("language",this.options.language),this.options.session!==void 0&&e.searchParams.set("session",this.options.session),this.options.debug===!0&&e.searchParams.set("debug","true"),this.options.traceparent!==void 0&&e.searchParams.set("traceparent",this.options.traceparent),e.toString()}getServerUrl(){if(this.serverHost!==void 0)return this.serverHost;if(Bi?.VITE_VIRTUALDISPLAY_SERVER_HOST===void 0)return this.defaultServer}getParentElement(){if(typeof this.options.parent!="string")return this.options.parent;const t=document.querySelector(this.options.parent);if(t===null)throw f.parentNotFound(this.options.parent);return t}}function Vi(n){const{messenger:t}=n;t.on(c.HANDSHAKE,e=>{Pt(e)&&(exports.logger.info("Server handshake received, flushing publisher queue"),t.markReady())}),t.on(c.SESSION,e=>{Ft(e)&&n.onSession(e.sessionId)}),t.on(c.MUTATION,e=>{$t(e)&&(n.attributes.handleMutationResult(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()))}),t.on(c.SNAPSHOT,e=>{Dt(e)&&n.snapshot.handleSnapshotResult(e)}),t.on(c.CAMERA,e=>{Bt(e)&&n.cameraPosition.handlePositionUpdate(e)}),t.on(c.LOADING_INDICATOR,e=>{Vt(e)&&(e.error!==void 0?n.ui.showError(e.error):n.ui.updateProgress(e.progress,e.phase))}),t.on(c.CONFIG,e=>{Ht(e)&&n.applyConfig(e)}),t.on(c.MAPPING,e=>{Ut(e)&&(n.attributes.handleMappingReceived(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()),n.ui.renderAttributeControls(n.attributes,e.attributes),n.readyStateTracker.handleMappingReceived())}),ji(n)}function ji(n){const{messenger:t}=n;t.on(c.FOCUS,e=>{qt(e)&&n.focus.handleStateReceived(e)}),t.on(c.PRICING,e=>{Gt(e)&&n.configuration.handlePricingReceived(e.pricing)}),t.on(c.SYNC,e=>{jt(e)&&n.onSync(e.connected)})}class Hi{ready=!1;onReady;constructor(t){this.onReady=t}handleMappingReceived(){this.ready||(this.ready=!0,exports.logger.info("Mapping received from server, client is now ready"),this.onReady?.())}get isReady(){return this.ready}clear(){this.ready=!1}}class qi{attributes;readyStateTracker;messenger;cameraApi;cameraPositionApi;focusApi;configurationApi;snapshotApi;annotationsApi;eventBus;ui;options;serverHost;arActivation;syncTracker;iframe;container;readyCallbacks=[];mutationFailedCallbacks=[];viewerSessionId;constructor(t,e){this.options=t,this.serverHost=e?.serverHost,this.initializeLogging(),this.messenger=new Zt(()=>this.iframe?.contentWindow??null,e?.messengerOptions);const i=s=>{this.messenger.send(s)};this.attributes=new ae(i,(s,r)=>{this.notifyMutationFailed(s,r)}),this.snapshotApi=new wt(i),this.annotationsApi=new at(i),this.cameraApi=new gt(i),this.cameraPositionApi=new le,this.focusApi=new vt(i,s=>{this.dispatchFocusChange(s)}),this.configurationApi=new bt(s=>{this.dispatchConfigurationChange(s)},s=>{this.dispatchConfigurationSubmit(s)}),this.eventBus=new de,this.arActivation=e?.createArActivation?.(i),this.syncTracker=e?.createSyncTracker?.(),this.readyStateTracker=new Hi(()=>{this.notifyReady()});const o=this.arActivation;this.ui=new Di({snapshotApi:this.snapshotApi,cameraApi:this.cameraApi,cameraPositionApi:this.cameraPositionApi,eventBus:this.eventBus,configuration:this.configurationApi,onSelect:(s,r)=>this.attributes.select(s,r),onSubscribe:(s,r)=>this.attributes.onChange(s,r),...o!==void 0&&{onAr:()=>{o.activate()}},onFullscreenEnter:()=>{this.trackFullscreen()}}),this.wireIncomingMessages(),e?.registerHandlers?.(this.messenger,i),this.messenger.start(),this.createAndConnectIframe()}wireIncomingMessages(){Vi({messenger:this.messenger,attributes:this.attributes,configuration:this.configurationApi,snapshot:this.snapshotApi,cameraPosition:this.cameraPositionApi,focus:this.focusApi,ui:this.ui,readyStateTracker:this.readyStateTracker,applyConfig:t=>{this.handleConfig(t)},onSession:t=>{this.handleSession(t)},onSync:t=>{this.syncTracker?.handleSync(t)}})}handleSession(t){this.viewerSessionId=t,this.arActivation?.onSession(t)}notifyMutationFailed(t,e){for(const i of this.mutationFailedCallbacks)i({attribute:t,value:e})}notifyReady(){const t=this.readyCallbacks;this.readyCallbacks=[];for(const e of t)e(this);this.ui.onReady()}dispatchFocusChange(t){this.container?.dispatchEvent(new CustomEvent(T.FOCUS_CHANGE,{detail:t,bubbles:!0}))}dispatchConfigurationChange(t){this.container?.dispatchEvent(new CustomEvent(T.CONFIGURATION_CHANGE,{detail:t??null,bubbles:!0}))}dispatchConfigurationSubmit(t){this.container?.dispatchEvent(new CustomEvent(T.CONFIGURATION_SUBMIT,{detail:t,bubbles:!0}))}handleConfig(t){const e=t.viewerSettings,i=this.options.viewerSettings;if(e!==void 0||i!==void 0){const o=i!==void 0?{...e??{},...i}:e;if(i!==void 0&&e!==void 0){const s=Object.entries(i).filter(([r,l])=>e[r]!==l).map(([r,l])=>`${r} (metadata: ${e[r]??"undefined"}, override: ${l})`);s.length>0&&exports.logger.warn(`Viewer settings override active: ${s.join(", ")}`)}this.ui.applyViewerSettings(o),this.annotationsApi.setEnabled(o.annotations!==!1)}this.cameraPositionApi.applyLimits(t.cameraLimits)}trackFullscreen(){this.messenger.send({type:c.FULLSCREEN})}initializeLogging(){this.options.debug===!0&&ft(),exports.logger.info("Initializing Virtualdisplay client",{model:this.options.model})}createAndConnectIframe(){const e=new Ui(this.options,this.serverHost).create();this.container=e.container,this.iframe=e.iframe,this.eventBus.attach(this.container),this.ui.attach(this.container);try{const i=new URL(this.iframe.src).origin;this.messenger.setTargetOrigin(i)}catch{}}select(t,e){this.attributes.select(t,e)}getValues(t){return this.attributes.getValues(t)}getValue(t,e){return this.attributes.getValue(t,e)}onChange(t,e){this.attributes.onChange(t,e)}getAttribute(t){return this.attributes.getAttribute(t)}get isReady(){return this.readyStateTracker.isReady}onReady(t){if(this.readyStateTracker.isReady){t(this);return}this.readyCallbacks.push(t)}onMutationFailed(t){this.mutationFailedCallbacks.push(t)}activateAr(){this.arActivation?.activate()}on(t,e){this.eventBus.on(t,e)}get annotations(){return this.annotationsApi}get camera(){return this.cameraApi}get focus(){return this.focusApi}get configuration(){return this.configurationApi}get cameraPosition(){return this.cameraPositionApi}get snapshot(){return this.snapshotApi}get sessionId(){return this.viewerSessionId}get viewerSettings(){return this.ui.viewerSettings}destroy(){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}}const Gi="ar.virtualdisplay.io";function Zi(n){const t=new URL(`https://${Gi}/go`);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()}const Wi=1500;class Qi{options;qrModal=new pi;sessionId;waiters=[];pendingTimers=new Set;destroyed=!1;constructor(t){this.options=t}onSession(t){this.sessionId=t;const e=this.waiters;this.waiters=[];for(const i of e)i(t)}activate(){if(oe()){this.options.send({type:c.AR_ACTIVATE});return}this.showQrCode()}destroy(){this.destroyed=!0;for(const t of this.pendingTimers)clearTimeout(t);this.pendingTimers.clear(),this.waiters=[],this.qrModal.hide()}async showQrCode(){this.qrModal.show();const t=await this.waitForSessionId();if(this.destroyed)return;const e=Zi({sessionId:t,license:this.options.license,model:this.options.model}),i=await this.qrModal.update(e);if(this.destroyed){this.qrModal.hide();return}i&&this.options.send({type:c.QR_SHOWN})}waitForSessionId(){return this.sessionId!==void 0?Promise.resolve(this.sessionId):new Promise(t=>{const e=setTimeout(()=>{this.pendingTimers.delete(e),t(void 0)},Wi);this.pendingTimers.add(e),this.waiters.push(i=>{this.pendingTimers.delete(e),clearTimeout(e),t(i)})})}}class Yi{callbacks=[];lastKnown;handleSync(t){this.lastKnown=t;for(const e of this.callbacks)e(t)}onChange(t){this.callbacks.push(t),this.lastKnown!==void 0&&t(this.lastKnown)}}class Ki extends qi{syncStatusTracker;constructor(t){const e=new Yi;super(t,{createArActivation:i=>new Qi({license:t.license,model:t.model,send:i}),createSyncTracker:()=>e}),this.syncStatusTracker=e}onSyncChange(t){this.syncStatusTracker.onChange(t)}}exports.Annotations=at;exports.Attribute=ct;exports.AttributeValue=lt;exports.Camera=gt;exports.Configuration=bt;exports.ERROR_CODES=C;exports.Focus=vt;exports.Photo=yt;exports.Snapshot=wt;exports.VD_EVENTS=T;exports.VirtualdisplayClient=Ki;exports.VirtualdisplayError=f;exports.enableDebugMode=ft;exports.isDebugMode=re;
498
+ `;function Wi(){if(Mt(),document.getElementById("vd-styles")!==null)return;const n=document.createElement("style");n.id="vd-styles",n.textContent=Zi,document.head.appendChild(n)}function Yi(n,t){const e=document.createElement("a");e.href=`data:image/png;base64,${n}`,e.download=t,e.click()}class Qi{options;settings={};container=null;loading=null;slots={topRight:null,bottomRight:null};screenshotBtn=null;actionBar=null;cameraControls=null;attributes=null;layout=null;commerce=null;constructor(t){this.options=t}attach(t){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")}onReady(){this.loading?.hide(),this.loading=null,this.mountToolbar(),this.cameraControls!==null&&(this.cameraControls.element.style.display="flex"),this.layout?.setVisible(!0)}mountToolbar(){if(this.actionBar!==null||this.slots.bottomRight===null||this.container===null)return;const t=typeof this.container.requestFullscreen=="function";this.actionBar=new Ni({onAr:this.options.onAr,onFullscreen:t?()=>{this.toggleFullscreen()}:void 0}),this.actionBar.applySettings(this.settings),this.slots.bottomRight.appendChild(this.actionBar.element),this.syncScreenshotButton(),this.placeScreenshotButton()}toggleFullscreen(){this.container!==null&&(document.fullscreenElement!==null?document.exitFullscreen():(this.options.onFullscreenEnter?.(),this.container.requestFullscreen()))}updateProgress(t,e){this.loading?.updateProgress(t,e)}showError(t){this.loading?.showError(t)}applyViewerSettings(t){this.settings=t,t.language!==void 0&&xt(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()}renderAttributeControls(t,e){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 M(this.options.cameraApi,this.options.cameraPositionApi),this.cameraControls.element.style.display="none",this.slots.topRight.appendChild(this.cameraControls.element)),this.placeScreenshotButton(),e.length!==0)){this.attributes=document.createElement("div"),this.attributes.className="vd-attributes";for(const i of e)this.attributes.appendChild(Fi(i,t,this.options.eventBus,this.options.onSelect,this.options.onSubscribe));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)}}get viewerSettings(){return this.settings}teardownConfigurator(){this.commerce?.destroy(),this.commerce=null,this.attributes?.remove(),this.attributes=null,this.layout?.destroy(),this.layout=null}destroy(){this.loading?.destroy(),this.screenshotBtn?.element.remove(),this.actionBar?.destroy(),this.actionBar?.element.remove(),this.cameraControls?.element.remove(),this.teardownConfigurator();for(const t of Object.values(this.slots))t?.remove();this.container=null}createSlot(t,e){const i=document.createElement("div");return i.className=e,t.appendChild(i),i}syncScreenshotButton(){const t=this.settings.screenshot===!0;t&&this.screenshotBtn===null&&(this.screenshotBtn=new b({variant:"outline",size:"icon",label:dn(),icon:g.screenshot(),onClick:()=>{this.options.snapshotApi.take("snapshot.png").onDeveloped(({data:e,filename:i})=>{Yi(e,i)})}})),!t&&this.screenshotBtn!==null&&(this.screenshotBtn.element.remove(),this.screenshotBtn=null)}placeScreenshotButton(){this.screenshotBtn===null||this.slots.topRight===null||(this.cameraControls!==null?this.cameraControls.element.appendChild(this.screenshotBtn.element):this.slots.topRight.appendChild(this.screenshotBtn.element))}}const Ki={};class Xi{defaultServer="https://server.virtualdisplay.io";options;serverHost;extraParams;constructor(t,e,i){this.options=t,this.serverHost=e,this.extraParams=i}create(){const t=this.createContainer(),e=this.createIframe();return t.appendChild(e),this.attachToParent(t),{container:t,iframe:e}}createContainer(){const t=document.createElement("div");return t.className="vd-container",Object.assign(t.style,{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),t}createIframe(){const t=document.createElement("iframe");return t.src=this.buildUrl(),t.setAttribute("allow","xr-spatial-tracking; fullscreen"),t}attachToParent(t){this.getParentElement().appendChild(t)}buildUrl(){const t=this.getServerUrl(),e=new URL(t);e.searchParams.set("license",this.options.license),e.searchParams.set("model",this.options.model),this.options.language!==void 0&&e.searchParams.set("language",this.options.language),this.options.session!==void 0&&e.searchParams.set("session",this.options.session),this.options.debug===!0&&e.searchParams.set("debug","true"),this.options.traceparent!==void 0&&e.searchParams.set("traceparent",this.options.traceparent);for(const[i,o]of Object.entries(this.extraParams??{}))e.searchParams.set(i,o);return e.toString()}getServerUrl(){if(this.serverHost!==void 0)return this.serverHost;if(Ki?.VITE_VIRTUALDISPLAY_SERVER_HOST===void 0)return this.defaultServer}getParentElement(){if(typeof this.options.parent!="string")return this.options.parent;const t=document.querySelector(this.options.parent);if(t===null)throw f.parentNotFound(this.options.parent);return t}}function Ji(n){const{messenger:t}=n;t.on(c.HANDSHAKE,e=>{Bt(e)&&(exports.logger.info("Server handshake received, flushing publisher queue"),t.markReady())}),t.on(c.SESSION,e=>{Ut(e)&&n.onSession(e.sessionId)}),t.on(c.MUTATION,e=>{Vt(e)&&(n.attributes.handleMutationResult(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()))}),t.on(c.SNAPSHOT,e=>{jt(e)&&n.snapshot.handleSnapshotResult(e)}),t.on(c.CAMERA,e=>{Ht(e)&&n.cameraPosition.handlePositionUpdate(e)}),t.on(c.LOADING_INDICATOR,e=>{Gt(e)&&(e.error!==void 0?n.ui.showError(e.error):n.ui.updateProgress(e.progress,e.phase))}),t.on(c.CONFIG,e=>{Wt(e)&&n.applyConfig(e)}),t.on(c.MAPPING,e=>{qt(e)&&(n.attributes.handleMappingReceived(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()),n.ui.renderAttributeControls(n.attributes,e.attributes),n.readyStateTracker.handleMappingReceived())}),to(n)}function to(n){const{messenger:t}=n;t.on(c.FOCUS,e=>{Yt(e)&&n.focus.handleStateReceived(e)}),t.on(c.PRICING,e=>{Qt(e)&&n.configuration.handlePricingReceived(e.pricing)}),t.on(c.SYNC,e=>{Zt(e)&&n.onSync(e.connected)})}class eo{ready=!1;onReady;constructor(t){this.onReady=t}handleMappingReceived(){this.ready||(this.ready=!0,exports.logger.info("Mapping received from server, client is now ready"),this.onReady?.())}get isReady(){return this.ready}clear(){this.ready=!1}}class no{attributes;readyStateTracker;messenger;cameraApi;cameraPositionApi;focusApi;configurationApi;snapshotApi;annotationsApi;eventBus;ui;options;serverHost;iframeParams;arActivation;syncTracker;iframe;container;readyCallbacks=[];mutationFailedCallbacks=[];viewerSessionId;constructor(t,e){this.options=t;const i=e??{};this.serverHost=i.serverHost,this.iframeParams=i.iframeParams,this.initializeLogging(),this.messenger=new Kt(()=>this.iframe?.contentWindow??null,i.messengerOptions);const o=r=>{this.messenger.send(r)};this.attributes=new fe(o,(r,a)=>{this.notifyMutationFailed(r,a)}),this.snapshotApi=new At(o),this.annotationsApi=new ht(o),this.cameraApi=new _t(o),this.cameraPositionApi=new ge,this.focusApi=new Ct(o,r=>{this.dispatchFocusChange(r)}),this.configurationApi=new St(r=>{this.dispatchConfigurationChange(r)},r=>{this.dispatchConfigurationSubmit(r)}),this.eventBus=new ye,this.arActivation=i.createArActivation?.(o),this.syncTracker=i.createSyncTracker?.(),this.readyStateTracker=new eo(()=>{this.notifyReady()});const s=this.arActivation;this.ui=new Qi({snapshotApi:this.snapshotApi,cameraApi:this.cameraApi,cameraPositionApi:this.cameraPositionApi,eventBus:this.eventBus,configuration:this.configurationApi,onSelect:(r,a)=>this.attributes.select(r,a),onSubscribe:(r,a)=>this.attributes.onChange(r,a),...s!==void 0&&{onAr:()=>{s.activate()}},onFullscreenEnter:()=>{this.trackFullscreen()}}),this.wireIncomingMessages(),i.registerHandlers?.(this.messenger,o),this.messenger.start(),this.createAndConnectIframe()}wireIncomingMessages(){Ji({messenger:this.messenger,attributes:this.attributes,configuration:this.configurationApi,snapshot:this.snapshotApi,cameraPosition:this.cameraPositionApi,focus:this.focusApi,ui:this.ui,readyStateTracker:this.readyStateTracker,applyConfig:t=>{this.handleConfig(t)},onSession:t=>{this.handleSession(t)},onSync:t=>{this.syncTracker?.handleSync(t)}})}handleSession(t){this.viewerSessionId=t,this.arActivation?.onSession(t)}notifyMutationFailed(t,e){for(const i of this.mutationFailedCallbacks)i({attribute:t,value:e})}notifyReady(){const t=this.readyCallbacks;this.readyCallbacks=[];for(const e of t)e(this);this.ui.onReady()}dispatchFocusChange(t){this.container?.dispatchEvent(new CustomEvent(T.FOCUS_CHANGE,{detail:t,bubbles:!0}))}dispatchConfigurationChange(t){this.container?.dispatchEvent(new CustomEvent(T.CONFIGURATION_CHANGE,{detail:t??null,bubbles:!0}))}dispatchConfigurationSubmit(t){this.container?.dispatchEvent(new CustomEvent(T.CONFIGURATION_SUBMIT,{detail:t,bubbles:!0}))}handleConfig(t){const e=t.viewerSettings,i=this.options.viewerSettings;if(e!==void 0||i!==void 0){const o=i!==void 0?{...e??{},...i}:e;if(i!==void 0&&e!==void 0){const s=Object.entries(i).filter(([r,a])=>e[r]!==a).map(([r,a])=>`${r} (metadata: ${e[r]??"undefined"}, override: ${a})`);s.length>0&&exports.logger.warn(`Viewer settings override active: ${s.join(", ")}`)}this.ui.applyViewerSettings(o),this.annotationsApi.setEnabled(o.annotations!==!1)}this.cameraPositionApi.applyLimits(t.cameraLimits)}trackFullscreen(){this.messenger.send({type:c.FULLSCREEN})}initializeLogging(){this.options.debug===!0&&wt(),exports.logger.info("Initializing Virtualdisplay client",{model:this.options.model})}createAndConnectIframe(){const e=new Xi(this.options,this.serverHost,this.iframeParams).create();this.container=e.container,this.iframe=e.iframe,this.eventBus.attach(this.container),this.ui.attach(this.container);try{const i=new URL(this.iframe.src).origin;this.messenger.setTargetOrigin(i)}catch{}}select(t,e){this.attributes.select(t,e)}getValues(t){return this.attributes.getValues(t)}getValue(t,e){return this.attributes.getValue(t,e)}onChange(t,e){this.attributes.onChange(t,e)}getAttribute(t){return this.attributes.getAttribute(t)}get isReady(){return this.readyStateTracker.isReady}onReady(t){if(this.readyStateTracker.isReady){t(this);return}this.readyCallbacks.push(t)}onMutationFailed(t){this.mutationFailedCallbacks.push(t)}activateAr(){this.arActivation?.activate()}on(t,e){this.eventBus.on(t,e)}get annotations(){return this.annotationsApi}get camera(){return this.cameraApi}get focus(){return this.focusApi}get configuration(){return this.configurationApi}get cameraPosition(){return this.cameraPositionApi}get snapshot(){return this.snapshotApi}get sessionId(){return this.viewerSessionId}get viewerSettings(){return this.ui.viewerSettings}destroy(){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}}const io="ar.virtualdisplay.io";function oo(n){const t=new URL(`https://${io}/go`);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()}const so=1500;class ro{options;qrModal=new Ai;sessionId;waiters=[];pendingTimers=new Set;destroyed=!1;constructor(t){this.options=t}onSession(t){this.sessionId=t;const e=this.waiters;this.waiters=[];for(const i of e)i(t)}activate(){if(he()){this.options.send({type:c.AR_ACTIVATE});return}this.showQrCode()}destroy(){this.destroyed=!0;for(const t of this.pendingTimers)clearTimeout(t);this.pendingTimers.clear(),this.waiters=[],this.qrModal.hide()}async showQrCode(){this.qrModal.show();const t=await this.waitForSessionId();if(this.destroyed)return;const e=oo({sessionId:t,license:this.options.license,model:this.options.model}),i=await this.qrModal.update(e);if(this.destroyed){this.qrModal.hide();return}i&&this.options.send({type:c.QR_SHOWN})}waitForSessionId(){return this.sessionId!==void 0?Promise.resolve(this.sessionId):new Promise(t=>{const e=setTimeout(()=>{this.pendingTimers.delete(e),t(void 0)},so);this.pendingTimers.add(e),this.waiters.push(i=>{this.pendingTimers.delete(e),clearTimeout(e),t(i)})})}}class ao{callbacks=[];lastKnown;handleSync(t){this.lastKnown=t;for(const e of this.callbacks)e(t)}onChange(t){this.callbacks.push(t),this.lastKnown!==void 0&&t(this.lastKnown)}}class lo extends no{syncStatusTracker;constructor(t){const e=new ao;super(t,{createArActivation:i=>new ro({license:t.license,model:t.model,send:i}),createSyncTracker:()=>e}),this.syncStatusTracker=e}onSyncChange(t){this.syncStatusTracker.onChange(t)}}exports.Annotations=ht;exports.Attribute=pt;exports.AttributeValue=mt;exports.Camera=_t;exports.Configuration=St;exports.ERROR_CODES=C;exports.Focus=Ct;exports.Photo=kt;exports.Snapshot=At;exports.VD_EVENTS=T;exports.VirtualdisplayClient=lo;exports.VirtualdisplayError=f;exports.enableDebugMode=wt;exports.isDebugMode=pe;