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

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.28
4
+
5
+ ### Minor Changes
6
+
7
+ Add a marker toggle button to the viewer action bar for apps set to the `toggle-shown` or `toggle-hidden` annotation mode: the visitor shows or hides the annotation markers themselves, with the starting state you configured. The button only appears when the model has annotations and a toggle mode is active.
8
+
3
9
  ## 4.0.0-alpha.27
4
10
 
5
11
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -356,6 +356,13 @@ interface AnnotationToggleMessage {
356
356
  */
357
357
  readonly instance: string;
358
358
  readonly enabled: boolean;
359
+ /**
360
+ * Who sent it: `control` marks the client's own visible toggle button, the
361
+ * only sender that counts as Shopper use in the viewer statistics. Absent
362
+ * means programmatic (the boot-time config echo, an integrator's
363
+ * `client.annotations` call), which must never be measured as interest.
364
+ */
365
+ readonly origin?: 'control';
359
366
  }
360
367
  /** Focus actions (client → server). */
361
368
  declare const FOCUS_ACTIONS: {
@@ -1213,6 +1220,14 @@ declare class BaseClient {
1213
1220
  constructor(options: ClientOptions, extensions?: BaseClientExtensions);
1214
1221
  /** The configurator UI, every callback bridging it to the facade that owns the action. */
1215
1222
  private createStandardInterface;
1223
+ /**
1224
+ * The visible toggle composes its message here, on the internal transport,
1225
+ * because it is the one sender allowed to stamp `origin: 'control'`: the
1226
+ * viewer only counts control-originated flips as Shopper use. The public
1227
+ * `client.annotations` facade stays origin-less on purpose. One send per
1228
+ * member instance once composition lands; today the host is the only one.
1229
+ */
1230
+ private sendControlAnnotationToggle;
1216
1231
  /** Wire the inbound viewer protocol to the facades. */
1217
1232
  private wireIncomingMessages;
1218
1233
  /** Store the resolved app and notify every registered `onAppResolved` callback. */
@@ -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",SELECTABLE:"selectable",APP_RESOLVED:"app_resolved"},P="main",ee={FOCUS:"focus",UNFOCUS:"unfocus"},De={FOCUSED:"focused"},$e={HIDDEN:"hidden"},Ue=new Set(Object.values(c));function Be(n){if(typeof n!="object"||n===null)return!1;const e=n;return typeof e.target=="string"?!1:typeof e.type=="string"&&Ue.has(e.type)}function Ve(n){const e=S(n);return e!==null&&e.type===c.HANDSHAKE}function je(n){const e=S(n);return e!==null&&e.type===c.SESSION&&typeof e.sessionId=="string"}function He(n){const e=S(n);return e!==null&&e.type===c.APP_RESOLVED&&typeof e.appType=="string"&&e.appType!==""&&typeof e.name=="string"}function qe(n){const e=S(n);return e!==null&&e.type===c.MUTATION&&typeof e.instance=="string"&&e.instance!==""&&Array.isArray(e.results)}function Ge(n){const e=S(n);return e!==null&&e.type===c.SNAPSHOT&&("data"in e||"error"in e)}function Ze(n){const e=S(n);return e!==null&&e.type===c.CAMERA&&Array.isArray(e.transforms)}function We(n){const e=S(n);return e!==null&&e.type===c.MAPPING&&typeof e.instance=="string"&&e.instance!==""&&Array.isArray(e.attributes)}function Ye(n){const e=S(n);return e!==null&&e.type===c.LOADING_INDICATOR&&typeof e.progress=="number"}function Qe(n){const e=S(n);return e!==null&&e.type===c.SYNC&&typeof e.connected=="boolean"}function Ke(n){const e=S(n);return e!==null&&e.type===c.SELECTABLE&&typeof e.instance=="string"&&e.instance!==""&&Array.isArray(e.attributes)}function Xe(n){const e=S(n);return e!==null&&e.type===c.CONFIG&&typeof e.viewerSettings=="object"}function Je(n){const e=S(n);return e!==null&&e.type===c.FOCUS&&typeof e.instance=="string"&&e.instance!==""&&typeof e.state=="string"}function et(n){const e=S(n);return e!==null&&e.type===c.PRICING&&typeof e.instance=="string"&&e.instance!==""&&typeof e.pricing=="object"&&e.pricing!==null}function S(n){return typeof n!="object"||n===null?null:n}class te{constructor(e){this.processor=e}processor;pending=[];isReady=!1;enqueue(e){if(this.isReady){this.processor(e);return}this.pending.push(e)}markReady(){if(this.isReady||(this.isReady=!0,this.pending.length===0))return;const e=[...this.pending];this.pending.length=0;for(const t of e)this.processor(t)}get ready(){return this.isReady}get pendingCount(){return this.pending.length}hasPending(e){return this.pending.some(t=>t.type===e)}clear(){this.pending.length=0}}class tt{constructor(e,t){this.getTarget=e,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.targetOrigin="*",this.isValid=t?.isValid??Be,this.publisher=new te(i=>this.post(i)),this.consumer=new te(i=>this.routeToHandler(i)),t?.bufferIncoming!==!0&&this.consumer.markReady()}getTarget;handlers=new Map;publisher;consumer;listener=null;sourceId;targetOrigin;isValid;on(e,t){this.handlers.set(e,t)}setTargetOrigin(e){this.targetOrigin=e}send(e){this.publisher.enqueue(e)}receive(e){this.isValid(e)&&this.consumer.enqueue(e)}markReady(){this.publisher.markReady()}markConsumerReady(){this.consumer.markReady()}consumerHasPending(e){return this.consumer.hasPending(e)}start(){this.listener===null&&(this.listener=e=>{const{data:t}=e;if(!this.isValid(t)||t._source===this.sourceId)return;const i=this.getTarget();if(i!==null&&e.source!==null&&e.source!==i)return;const s=t;this.consumer.enqueue(s)},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()}post(e){const t=this.getTarget();t!==null&&t.postMessage({...e,_source:this.sourceId},this.targetOrigin)}routeToHandler(e){const t=this.handlers.get(e.type);if(t===void 0)return;const i=t(e);i instanceof Promise&&i.catch(s=>{const o=s instanceof Error?s.message:String(s);console.error(`Virtualdisplay: error handling ${e.type}: ${o}`)})}}class pe{constructor(e,t){this.send=e,this.instance=t}send;instance;setEnabled(e){this.send({type:c.ANNOTATION_TOGGLE,instance:this.instance,enabled:e})}}class fe{constructor(e,t){this.value=e,this.attribute=t}value;attribute;isSelectedValue=!1;get isSelected(){return this.isSelectedValue}setSelected(e){this.isSelectedValue=e}}const k={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 g extends Error{code;constructor(e,t){super(e),this.name="VirtualdisplayError",this.code=t}static valueNotFound(e,t){return new g(`Value "${t}" not found for attribute "${e}"`,k.VALUE_NOT_FOUND)}static parentNotFound(e){return new g(`Parent element not found: ${e}`,k.PARENT_NOT_FOUND)}static invalidParameter(e){return new g(e,k.INVALID_PARAMETER)}}class ge{name;defaultValue;values;onSelect;onChangeCallback;constructor(e){this.name=e.name,this.defaultValue=e.defaultValue,this.onSelect=e.onSelect,this.values=this.createValues(e.values)}select(e){if(!this.values.has(e))throw g.valueNotFound(this.name,e);this.onSelect(this.name,e)}getValues(){return Array.from(this.values.values())}getValue(e){return this.values.get(e)}get selected(){for(const e of this.values.values())if(e.isSelected)return e.value}onChange(e){this.onChangeCallback=e}handleResult(e){let t;for(const i of this.values.values()){const s=i.value===e;i.setSelected(s),s&&(t=i)}t!==void 0&&this.onChangeCallback!==void 0&&this.onChangeCallback(t)}createValues(e){const t=new Map;for(const i of e){const s=new fe(i,this.name);i===this.defaultValue&&s.setSelected(!0),t.set(i,s)}return t}}class nt{attributes=new Map;constructor(e,t,i){for(const s of e){const o=this.buildOptions(s,t);this.attributes.set(s.name,new ge(o))}this.onMutationFailed=i}onMutationFailed;get(e){return this.attributes.get(e)}getSelection(){const e={};for(const[t,i]of this.attributes){const s=i.selected;s!==void 0&&(e[t]=s)}return e}handleResults(e){for(const t of e){if(!t.success){this.onMutationFailed?.(t.name,t.value);continue}this.get(t.name)?.handleResult(t.value)}}buildOptions(e,t){const i={name:e.name,values:e.values,onSelect:(s,o)=>{t([{name:s,value:o}],!1)}};return e.defaultValue!==void 0?{...i,defaultValue:e.defaultValue}:i}}const L=4096,F=16384,it=[1024,256,64],st=20,W=["timestamp","level","msg","service","trace_id","span_id"];function ot(n){const e=new Date(n.timestamp).toLocaleTimeString("en-GB",{hour12:!1}),t=n.level.toUpperCase().padEnd(5),i=n.trace_id?.slice(0,8)??"--------",s=n.msg,o=Object.entries(n).filter(([r])=>!W.includes(r)).map(([r,a])=>`${r}=${I(a,L).line}`).join(" ");return`${e} ${t} [${i}] ${s}${o?" "+o:""}`}function rt(n){for(const s of[L,...it]){const{line:o,truncated:r}=I(n,s);if(!r){if(o.length<=F)return o;continue}const{line:a}=I({...n,log_truncated:!0},s);if(a.length<=F)return a}const e=Object.keys(n).filter(s=>!W.includes(s)),t={...lt(n,W),log_truncated:!0,log_dropped_count:e.length},i=I({...t,log_dropped_attrs:e.slice(0,st)},L);return i.line.length<=F?i.line:I(t,L).line}function I(n,e){const t=[];let i=!1;return{line:JSON.stringify(n,function(r,a){if(typeof a=="string")return a.length>e&&(i=!0),at(a,e);if(typeof a=="bigint")return a.toString();if(typeof a!="object"||a===null)return a;for(;t.length>0&&t.at(-1)!==this;)t.pop();return t.includes(a)?"[Circular]":(t.push(a),a)}),truncated:i}}function at(n,e){return n.length<=e?n:`${n.slice(0,e)}...[truncated ${n.length-e} chars]`}function lt(n,e){const t={};for(const i of e)n[i]!==void 0&&(t[i]=n[i]);return t}function ct(n,e){const t=e?ot(n):rt(n);n.level==="error"?console.error(t):n.level==="warn"?console.warn(t):console.log(t)}function be(n,e=0){const t={name:n.name,message:n.message};n.stack!==void 0&&(t.stack=n.stack);for(const i of Object.getOwnPropertyNames(n)){if(i==="name"||i==="message"||i==="stack"||i==="cause")continue;const s=n[i];s!==void 0&&(t[i]=s)}return n.cause!==void 0&&n.cause!==null&&(t.cause=n.cause instanceof Error&&e<5?be(n.cause,e+1):String(n.cause)),t}function ut(n){const e={};for(const[t,i]of Object.entries(n))e[t]=i instanceof Error?be(i):i;return e}function dt(){return new Date}function ht(n){return n.toISOString()}function ve(){return typeof navigator>"u"?"":navigator.userAgent}function mt(){return typeof navigator>"u"?!1:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function pt(){return/iPhone|iPad|iPod/i.test(ve())||mt()}function ft(){return/Android/i.test(ve())}function gt(){return pt()||ft()}class bt{constructor(e){this.config=e}config;log(e,t,i={}){const s=this.config.traceProvider?.()??{},o={timestamp:ht(dt()),level:e,msg:t,service:this.config.service,...s,...ut(i)};ct(o,this.config.isDev)}debug(e,t){this.config.isDev&&this.log("debug",e,t)}info(e,t){this.log("info",e,t)}warn(e,t){this.log("warn",e,t)}error(e,t){this.log("error",e,t)}}function ye(n,e){const t=e?.isDev!==void 0?e.isDev:typeof process<"u"?process.env.NODE_ENV!=="production":!0;return new bt({service:n,isDev:t,traceProvider:e?.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 Se(n){return{debug:(e,t)=>n.debug(e,O(t)),info:(e,t)=>n.info(e,O(t)),warn:(e,t)=>n.warn(e,O(t)),error:(e,t)=>n.error(e,O(t))}}let we=!1;exports.logger=Se(ye("client",{isDev:!1}));function Ce(){we=!0,exports.logger=Se(ye("client",{isDev:!0}))}function vt(){return we}class yt{constructor(e,t,i){this.send=e,this.instance=t,this.onMutationFailed=i}send;instance;onMutationFailed;registry;pendingCallbacks=[];handleMappingReceived(e){exports.logger.debug("Initializing from server mapping",{attributeCount:e.attributes.length}),this.registry=new nt(e.attributes,(t,i)=>this.sendMutation(t,i),this.onMutationFailed),this.replayPendingCallbacks()}handleMutationResult(e){this.registry?.handleResults(e.results)}select(e,t){this.sendMutation([{name:e,value:t}],!1)}selectTransient(e,t){this.sendMutation([{name:e,value:t}],!1,!0)}getValues(e){return this.registry?.get(e)?.getValues()??[]}getValue(e,t){return this.registry?.get(e)?.getValue(t)}onChange(e,t){if(this.registry===void 0){this.pendingCallbacks.push({name:e,callback:t});return}const i=this.registry.get(e);if(i===void 0){exports.logger.warn(`onChange: attribute "${e}" not found — callback will not fire`);return}i.onChange(t)}getAttribute(e){return this.registry?.get(e)}getSelection(){return this.registry?.getSelection()??{}}sendMutation(e,t,i=!1){const s={type:c.MUTATION,instance:this.instance,mutations:e,isInitial:t,...i&&{transient:!0}};this.send(s)}replayPendingCallbacks(){for(const{name:e,callback:t}of this.pendingCallbacks){const i=this.registry?.get(e);i===void 0&&exports.logger.warn(`onChange: attribute "${e}" not found — buffered callback will not fire`),i?.onChange(t)}this.pendingCallbacks.length=0}}class St{snapshot;callbacks=[];handleSnapshot(e){this.snapshot=e.attributes;for(const t of this.callbacks)t(e.attributes)}onChange(e){this.callbacks.push(e),this.snapshot!==void 0&&e(this.snapshot)}selectableFor(e){return this.snapshot?.find(i=>i.name===e)?.selectable??null}get current(){return this.snapshot??[]}}let ke=class{constructor(e){this.send=e}send;commands=[];rotate(e){return this.validateFiniteNumber(e,"rotate"),this.commands.push({action:"rotate",value:e}),this}tilt(e){return this.validateFiniteNumber(e,"tilt"),this.commands.push({action:"tilt",value:e}),this}zoom(e){return this.validateFiniteNumber(e,"zoom"),this.commands.push({action:"zoom",value:e}),this}set(){if(this.commands.length===0)throw g.invalidParameter("No camera commands to execute. Call rotate(), tilt(), or zoom() before set().");const e={type:c.CAMERA,commands:this.commands};this.send(e),this.commands=[]}validateFiniteNumber(e,t){if(!Number.isFinite(e))throw g.invalidParameter(`${t}() requires a finite number, got ${String(e)}`)}reset(){const e={type:c.CAMERA,commands:[{action:"reset"}]};this.send(e)}};class wt{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(e){this.changeCallbacks.push(e)}get limits(){return this.limitsState}applyLimits(e){this.limitsState=e;const t={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const i of this.changeCallbacks)i(t)}handlePositionUpdate(e){this.update(e.transforms)}update(e){let t=!1;for(const i of e)switch(i.type){case"rotation":this.state.rotation=i.value,t=!0;break;case"tilt":this.state.tilt=i.value,t=!0;break;case"zoom":this.state.zoom=i.value,t=!0;break}if(t){const i={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(const s of this.changeCallbacks)s(i)}}}function Ct(n,e){const t=n.filter(o=>kt(o,e));if(t.length===0)return;const i=Math.max(...t.map(ne)),s=t.filter(o=>ne(o)===i);return s.length===1?s[0]:void 0}function kt(n,e){return Object.entries(n.attributes).every(([t,i])=>e[t]===i)}function ne(n){return Object.keys(n.attributes).length}class _e{constructor(e,t){this.dispatchChange=e,this.dispatchSubmit=t}dispatchChange;dispatchSubmit;pricing;selection={};resolved;changeCallbacks=[];renderCallbacks=[];submitCallback;submitDefaultLabel;get current(){return this.resolved}get vatDisplay(){return this.pricing?.vatDisplay}get buttonLabel(){const e=this.pricing?.buttonLabel;if(e!=null&&e!=="")return e;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(e){this.changeCallbacks.push(e)}onSubmit(e,t){this.submitCallback=e,this.submitDefaultLabel=t?.defaultLabel,this.notifyRender()}onRender(e){return this.renderCallbacks.push(e),()=>{const t=this.renderCallbacks.indexOf(e);t!==-1&&this.renderCallbacks.splice(t,1)}}async submit(){if(!this.submittable)return;const e=this.resolved!==void 0?{attributes:this.resolved.attributes,reference:this.resolved.reference}:{attributes:{...this.selection},reference:""};this.dispatchSubmit(e),await this.submitCallback?.(e)}handlePricingReceived(e){this.pricing=e,this.recompute()}handleSelectionChanged(e){this.selection=e,this.recompute()}recompute(){this.resolved=this.resolve();for(const e of this.changeCallbacks)e(this.resolved);this.dispatchChange(this.resolved),this.notifyRender()}notifyRender(){for(const e of this.renderCallbacks)e()}resolve(){if(this.pricing===void 0)return;const e=Ct(this.pricing.rules,this.selection);if(!(e===void 0||e.availability===$e.HIDDEN))return{attributes:{...this.selection},reference:e.reference,price:e.priceCents,currency:this.pricing.currency,availability:e.availability}}}class Ae{constructor(e,t,i){this.send=e,this.dispatch=t,this.instance=i}send;dispatch;instance;focused=null;attributes=[];changeCallbacks=[];get current(){return this.focused}set(e){if(typeof e!="string"||e.length===0)throw g.invalidParameter(`set() requires a non-empty component name, got ${String(e)}`);this.send({type:c.FOCUS,instance:this.instance,action:ee.FOCUS,component:e})}clear(){this.send({type:c.FOCUS,instance:this.instance,action:ee.UNFOCUS})}onChange(e){this.changeCallbacks.push(e)}handleStateReceived(e){e.state===De.FOCUSED&&e.component!==void 0?(this.focused=e.component,this.attributes=e.attributes??[]):(this.focused=null,this.attributes=[]);const t=this.focused!==null?{component:this.focused,attributes:this.attributes}:null;for(const i of this.changeCallbacks)i(t);this.dispatch(t)}}class Ee{constructor(e){this.filename=e}filename;developedCallbacks=new Set;errorCallbacks=new Set;developed=!1;failed=!1;photoData=null;onDeveloped(e){return this.developed&&this.photoData!==null?(e(this.photoData),this):(this.developedCallbacks.add(e),this)}onError(e){return this.errorCallbacks.add(e),this}getFilename(){return this.filename}develop(e){this.developed||this.failed||(this.photoData=e,this.developed=!0,this.developedCallbacks.forEach(t=>{t(this.photoData)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}fail(e){this.developed||this.failed||(this.failed=!0,this.errorCallbacks.forEach(t=>{t(e)}),this.developedCallbacks.clear(),this.errorCallbacks.clear())}}const ie=3e4;class xe{constructor(e){this.send=e}send;validExtensions=[".png"];pendingPhotos=new Map;take(e){this.validateFilename(e),exports.logger.debug("Taking snapshot",{filename:e});const t=new Ee(e),i=setTimeout(()=>{this.pendingPhotos.delete(e),exports.logger.warn("Snapshot timed out",{filename:e}),t.fail(new g(`Snapshot timed out: the viewer did not respond within ${ie}ms`,k.SNAPSHOT_FAILED))},ie);return this.pendingPhotos.set(e,{photo:t,timeout:i}),this.send({type:c.SNAPSHOT,filename:e}),t}handleSnapshotResult(e){const t=this.pendingPhotos.get(e.filename);if(t===void 0){exports.logger.warn("No pending photo found for filename",{filename:e.filename,pendingFilenames:Array.from(this.pendingPhotos.keys())});return}clearTimeout(t.timeout),this.pendingPhotos.delete(e.filename);const{photo:i}=t;if(e.error!==void 0){i.fail(new g(e.error,k.SNAPSHOT_FAILED));return}e.data!==void 0&&i.develop({filename:e.filename,data:e.data})}clear(){if(this.pendingPhotos.size===0)return;const e=new g("Client destroyed before snapshot completed",k.SNAPSHOT_FAILED);for(const{photo:t,timeout:i}of this.pendingPhotos.values())clearTimeout(i),t.fail(e);this.pendingPhotos.clear()}validateFilename(e){if(e===""||typeof e!="string")throw new g("Filename must be a non-empty string",k.INVALID_PARAMETER);if(!this.validExtensions.some(i=>e.toLowerCase().endsWith(i)))throw new g(`Invalid filename: "${e}". Filename must end with one of: ${this.validExtensions.join(", ")}`,k.INVALID_PARAMETER);if(e.includes("..")||e.includes("/")||e.includes("\\"))throw new g('Filename cannot contain path separators or ".."',k.INVALID_PARAMETER)}}class _t{container=null;attach(e){this.container=e}dispatch(e,t,i=!1){const s=new CustomEvent(e,{detail:t,cancelable:i});return this.container?.dispatchEvent(s),s}on(e,t){const i=s=>{const o=s,r={...o.detail,preventDefault:()=>{o.preventDefault()}};t(r)};return this.container?.addEventListener(e,i),()=>{this.container?.removeEventListener(e,i)}}}const At={},Et="en",Te=["en","nl","de"],K=["baseLocale"],se=[],Y=typeof window>"u";globalThis.__paraglide=globalThis.__paraglide??{};globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};let oe=!1,m=()=>{let n=K;!Y&&typeof window<"u"&&window.location?.href&&(n=Ie(window.location.href));const e=xt(n);if(e)return oe||(oe=!0,Re(e,{reload:!1})),e;throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found")};function xt(n,e){let t;for(const i of n){if(i==="baseLocale")t=Et;else if(Oe(i)&&N.has(i)){const o=N.get(i);if(o){const r=o.getLocale();if(r instanceof Promise)continue;if(r!==void 0)return It(r)}}const s=X(t);if(s)return s}}const Tt=n=>{window.location.reload()};let Re=(n,e)=>{const t={reload:!0,...e};let i;try{i=m()}catch{}const s=[];let o=K;!Y&&typeof window<"u"&&window.location?.href&&(o=Ie(window.location.href));for(const a of o)if(a!=="baseLocale"&&Oe(a)&&N.has(a)){const u=N.get(a);if(u){let d=u.setLocale(n);d instanceof Promise&&(d=d.catch(f=>{throw new Error(`Custom strategy "${a}" setLocale failed.`,{cause:f})}),s.push(d))}}const r=()=>{!Y&&t.reload&&window.location&&n!==i&&Tt()};if(s.length)return Promise.all(s).then(()=>{r()});r()},Rt=()=>typeof window<"u"?window.location.origin:"http://fallback.com";function X(n){if(typeof n!="string")return;const e=n.toLowerCase();for(const t of Te)if(t.toLowerCase()===e)return t}function It(n){const e=X(n);if(e)return e;throw new Error(`Invalid locale: ${n}. Expected one of: ${Te.join(", ")}`)}function Ot(n){return Lt(n)}function Lt(n){const e=typeof n=="string"?new URL(n,Rt()):new URL(n),t=e.pathname.split("/").filter(Boolean);return t.length>0&&X(t[0])&&(e.pathname="/"+t.slice(1).join("/")),e}let re,ae;function Nt(n){if(se.length===0)return;const e=typeof n=="string"?n:n.href;if(re===e)return ae;const t=new URL(e,"http://example.com"),i=Ot(t),s=i.href===t.href?[t]:[t,i];let o;for(const r of s){for(const a of se)if(new At(a.match,r.href).exec(r.href)){o=a;break}if(o)break}return re=e,ae=o,o}function Ie(n){const e=Nt(n);return e&&e.exclude!==!0&&Array.isArray(e.strategy)?e.strategy:K}const N=new Map;function Oe(n){return typeof n=="string"&&/^custom-[A-Za-z0-9_-]+$/.test(n)}const Mt=()=>"Activate AR",zt=()=>"AR activeren",Pt=()=>"AR aktivieren",Ft=((n={},e={})=>{const t=e.locale??m();return t==="nl"?zt():t==="de"?Pt():Mt()}),Dt=()=>"Scan to view in AR",$t=()=>"Scan om in AR te bekijken",Ut=()=>"Scannen für AR-Ansicht",Bt=((n={},e={})=>{const t=e.locale??m();return t==="nl"?$t():t==="de"?Ut():Dt()}),Vt=()=>"Use your smartphone camera to scan this QR code",jt=()=>"Gebruik de camera van je smartphone om deze QR-code te scannen",Ht=()=>"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen",qt=((n={},e={})=>{const t=e.locale??m();return t==="nl"?jt():t==="de"?Ht():Vt()}),Gt=()=>"Your phone will open the 3D model in AR mode.",Zt=()=>"Je telefoon opent het 3D-model in AR-modus.",Wt=()=>"Dein Telefon öffnet das 3D-Modell im AR-Modus.",Yt=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Zt():t==="de"?Wt():Gt()}),Qt=()=>"Close",Kt=()=>"Sluiten",Xt=()=>"Schließen",Jt=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Kt():t==="de"?Xt():Qt()}),en=()=>"Fullscreen",tn=()=>"Volledig scherm",nn=()=>"Vollbild",sn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?tn():t==="de"?nn():en()}),on=()=>"Downloading",rn=()=>"Downloaden",an=()=>"Herunterladen",ln=((n={},e={})=>{const t=e.locale??m();return t==="nl"?rn():t==="de"?an():on()}),cn=()=>"Screenshot",un=()=>"Screenshot",dn=()=>"Screenshot",hn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?un():t==="de"?dn():cn()}),mn=()=>"Configure",pn=()=>"Configureren",fn=()=>"Konfigurieren",gn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?pn():t==="de"?fn():mn()}),bn=()=>"Close",vn=()=>"Sluiten",yn=()=>"Schließen",Sn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?vn():t==="de"?yn():bn()}),wn=()=>"Reset camera",Cn=()=>"Camera resetten",kn=()=>"Kamera zurücksetzen",_n=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Cn():t==="de"?kn():wn()}),An=()=>"Zoom in",En=()=>"Inzoomen",xn=()=>"Hineinzoomen",Tn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?En():t==="de"?xn():An()}),Rn=()=>"Zoom out",In=()=>"Uitzoomen",On=()=>"Herauszoomen",Ln=((n={},e={})=>{const t=e.locale??m();return t==="nl"?In():t==="de"?On():Rn()}),Nn=()=>"Rotate left",Mn=()=>"Naar links draaien",zn=()=>"Nach links drehen",Pn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Mn():t==="de"?zn():Nn()}),Fn=()=>"Rotate right",Dn=()=>"Naar rechts draaien",$n=()=>"Nach rechts drehen",Un=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Dn():t==="de"?$n():Fn()}),Bn=()=>"Tilt up",Vn=()=>"Omhoog kantelen",jn=()=>"Nach oben kippen",Hn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Vn():t==="de"?jn():Bn()}),qn=()=>"Tilt down",Gn=()=>"Omlaag kantelen",Zn=()=>"Nach unten kippen",Wn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Gn():t==="de"?Zn():qn()}),Yn=()=>"Working…",Qn=()=>"Bezig…",Kn=()=>"Läuft…",Xn=((n={},e={})=>{const t=e.locale??m();return t==="nl"?Qn():t==="de"?Kn():Yn()}),Jn=()=>"Done",ei=()=>"Gelukt",ti=()=>"Fertig",ni=((n={},e={})=>{const t=e.locale??m();return t==="nl"?ei():t==="de"?ti():Jn()}),ii=()=>"Failed",si=()=>"Mislukt",oi=()=>"Fehlgeschlagen",ri=((n={},e={})=>{const t=e.locale??m();return t==="nl"?si():t==="de"?oi():ii()});const ai={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 Le=([n,e,t])=>{const i=document.createElementNS("http://www.w3.org/2000/svg",n);return Object.keys(e).forEach(s=>{i.setAttribute(s,String(e[s]))}),t?.length&&t.forEach(s=>{const o=Le(s);i.appendChild(o)}),i},Ne=(n,e={})=>{const i={...ai,...e};return Le(["svg",i,n])};const li=[["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 ci=[["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 Me=[["path",{d:"m6 9 6 6 6-6"}]];const ui=[["path",{d:"m15 18-6-6 6-6"}]];const di=[["path",{d:"m9 18 6-6-6-6"}]];const hi=[["path",{d:"m18 15-6-6-6 6"}]];const mi=[["path",{d:"M15 3h6v6"}],["path",{d:"m21 3-7 7"}],["path",{d:"m3 21 7-7"}],["path",{d:"M9 21H3v-6"}]];const pi=[["path",{d:"m14 10 7-7"}],["path",{d:"M20 10h-6V4"}],["path",{d:"m3 21 7-7"}],["path",{d:"M4 14h6v6"}]];const fi=[["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 gi=[["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 bi=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];const vi=[["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 yi=[["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:e=20,strokeWidth:t=1.75}={}){return Ne(n,{width:e,height:e,"stroke-width":t})}const b={ar:n=>y(li,n),fullscreen:n=>y(mi,n),exitFullscreen:n=>y(pi,n),screenshot:n=>y(ci,n),tiltUp:n=>y(hi,n),tiltDown:n=>y(Me,n),rotateLeft:n=>y(ui,n),rotateRight:n=>y(di,n),zoomIn:n=>y(vi,n),zoomOut:n=>y(yi,n),reset:n=>y(fi,n),configurator:n=>y(gi,n),close:n=>y(bi,n)};class v{element;constructor({variant:e="default",size:t="default",label:i,icon:s,onClick:o,disabled:r=!1}={}){this.element=document.createElement("button"),this.element.className=`ui-btn ui-btn--${e} ui-btn--size-${t}`,i!==void 0&&(this.element.setAttribute("aria-label",i),this.element.title=i),s!==void 0?this.element.appendChild(s):i!==void 0&&(this.element.textContent=i),o&&this.element.addEventListener("click",o),this.element.disabled=r}setIcon(e){const t=this.element.querySelector("svg");t!==null?t.replaceWith(e):this.element.appendChild(e)}}const p={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 Si{element;constructor(){this.element=document.createElement("div"),Object.assign(this.element.style,{background:p.white,borderRadius:l[3],padding:l[6],boxShadow:`0 ${l[2]} ${l[8]} oklch(0% 0 0 / 20%)`,maxWidth:"20rem",width:"100%"})}}class wi{constructor(e={}){this.options=e,this.card=new Si,this.backdrop=this.createBackdrop(),this.backdrop.appendChild(this.card.element)}options;card;backdrop;keyHandler=null;open(){document.body.appendChild(this.backdrop),this.keyHandler=e=>{e.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 e=document.createElement("div");return Object.assign(e.style,{position:"fixed",inset:l[0],background:"oklch(0% 0 0 / 50%)",zIndex:"9999",display:"flex",alignItems:"center",justifyContent:"center"}),e.addEventListener("click",t=>{t.target===e&&this.close()}),e}}class Ci{element;selectCallback=null;constructor(e,t,i){this.element=document.createElement("div"),this.element.className="ui-toggle-group";for(let s=0;s<e.length;s++){const o=e[s],r=document.createElement("button");r.className="ui-toggle-group-item",r.dataset.value=o,r.textContent=i?.[s]??o,r.dataset.state=o===t?"on":"off",r.setAttribute("aria-pressed",o===t?"true":"false"),r.addEventListener("click",()=>{this.selectCallback?.(o)}),this.element.appendChild(r)}}setSelected(e){for(const t of this.element.querySelectorAll(".ui-toggle-group-item")){const i=t.dataset.value===e;t.dataset.state=i?"on":"off",t.setAttribute("aria-pressed",i?"true":"false")}}onSelect(e){this.selectCallback=e}setEnabled(e){for(const t of this.element.querySelectorAll(".ui-toggle-group-item")){const i=e===null||e.includes(t.dataset.value??"");t.disabled=!i,t.setAttribute("aria-disabled",i?"false":"true")}}}class ki{element;select;constructor(e,t,i,s,o){this.select=document.createElement("select"),this.select.className="ui-native-select",this.select.dataset.name=e,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<t.length;d++){const f=t[d],h=document.createElement("option");h.value=f,h.textContent=o?.[d]??f,f===s&&(h.selected=!0,a=!0),this.select.appendChild(h)}a||(r.selected=!0);const u=Ne(Me,{width:16,height:16,"stroke-width":2});u.classList.add("ui-native-select-icon"),this.element=document.createElement("div"),this.element.className="ui-native-select-wrap",this.element.appendChild(this.select),this.element.appendChild(u)}setSelected(e){this.select.value=e}onSelect(e){this.select.addEventListener("change",()=>{e(this.select.value)})}setEnabled(e){for(const t of this.select.options)t.value!==""&&(t.disabled=e!==null&&!e.includes(t.value))}}class _i{element;input;valueText;values;options;selectCallback=null;settleCallback=null;constructor(e,t){if(e.length===0)throw new Error("Virtualdisplay: Slider needs at least one value");this.values=e,this.options=t,this.input=document.createElement("input"),this.input.type="range",this.input.className="ui-slider-input",this.input.min="0",this.input.max=String(e.length-1),this.input.step="1",this.input.setAttribute("aria-label",t.label),this.valueText=document.createElement("span"),this.valueText.className="ui-slider-value",this.valueText.setAttribute("aria-hidden","true");const i=document.createElement("div");i.className="ui-slider-track",i.appendChild(this.input),i.appendChild(this.buildEnds()),this.element=document.createElement("div"),this.element.className="ui-slider",this.element.appendChild(i),this.element.appendChild(this.valueText);const s=t.initialSelected===void 0?0:e.indexOf(t.initialSelected);this.applyIndex(s===-1?0:s),this.listen()}setSelected(e){const t=this.values.indexOf(e);t!==-1&&this.applyIndex(t)}onSelect(e){this.selectCallback=e}onSettle(e){this.settleCallback=e}listen(){this.input.addEventListener("input",()=>{const e=this.values[this.currentIndex];e!==void 0&&(this.applyIndex(this.currentIndex),this.selectCallback?.(e))}),this.input.addEventListener("change",()=>{const e=this.values[this.currentIndex];e!==void 0&&this.settleCallback?.(e)})}get currentIndex(){return Number(this.input.value)}applyIndex(e){this.input.value=String(e);const t=this.displayAt(e);this.valueText.textContent=t,this.input.setAttribute("aria-valuetext",t);const i=this.values.length===1?100:e/(this.values.length-1)*100;this.element.style.setProperty("--ui-slider-pct",`${i}%`)}buildEnds(){const e=document.createElement("div");e.className="ui-slider-ends",e.setAttribute("aria-hidden","true");for(const t of[0,this.values.length-1]){const i=document.createElement("span");i.textContent=this.labelAt(t),e.appendChild(i)}return e}labelAt(e){return this.options.labels?.[e]??this.values[e]??""}displayAt(e){const t=this.labelAt(e);return this.options.unit===void 0?t:`${t} ${this.options.unit}`}}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(", "),Ai=`
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",SELECTABLE:"selectable",APP_RESOLVED:"app_resolved"},O="main",tt={FOCUS:"focus",UNFOCUS:"unfocus"},Dt={FOCUSED:"focused"},$t={HIDDEN:"hidden"},Bt=new Set(Object.values(c));function Ut(n){if(typeof n!="object"||n===null)return!1;const t=n;return typeof t.target=="string"?!1:typeof t.type=="string"&&Bt.has(t.type)}function Vt(n){const t=S(n);return t!==null&&t.type===c.HANDSHAKE}function jt(n){const t=S(n);return t!==null&&t.type===c.SESSION&&typeof t.sessionId=="string"}function Ht(n){const t=S(n);return t!==null&&t.type===c.APP_RESOLVED&&typeof t.appType=="string"&&t.appType!==""&&typeof t.name=="string"}function qt(n){const t=S(n);return t!==null&&t.type===c.MUTATION&&typeof t.instance=="string"&&t.instance!==""&&Array.isArray(t.results)}function Gt(n){const t=S(n);return t!==null&&t.type===c.SNAPSHOT&&("data"in t||"error"in t)}function Zt(n){const t=S(n);return t!==null&&t.type===c.CAMERA&&Array.isArray(t.transforms)}function Wt(n){const t=S(n);return t!==null&&t.type===c.MAPPING&&typeof t.instance=="string"&&t.instance!==""&&Array.isArray(t.attributes)}function Yt(n){const t=S(n);return t!==null&&t.type===c.LOADING_INDICATOR&&typeof t.progress=="number"}function Qt(n){const t=S(n);return t!==null&&t.type===c.SYNC&&typeof t.connected=="boolean"}function Kt(n){const t=S(n);return t!==null&&t.type===c.SELECTABLE&&typeof t.instance=="string"&&t.instance!==""&&Array.isArray(t.attributes)}function Xt(n){const t=S(n);return t!==null&&t.type===c.CONFIG&&typeof t.viewerSettings=="object"}function Jt(n){const t=S(n);return t!==null&&t.type===c.FOCUS&&typeof t.instance=="string"&&t.instance!==""&&typeof t.state=="string"}function te(n){const t=S(n);return t!==null&&t.type===c.PRICING&&typeof t.instance=="string"&&t.instance!==""&&typeof t.pricing=="object"&&t.pricing!==null}function S(n){return typeof n!="object"||n===null?null:n}class et{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 ee{constructor(t,e){this.getTarget=t,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.targetOrigin="*",this.isValid=e?.isValid??Ut,this.publisher=new et(i=>this.post(i)),this.consumer=new et(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()}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 mt{constructor(t,e){this.send=t,this.instance=e}send;instance;setEnabled(t){this.send({type:c.ANNOTATION_TOGGLE,instance:this.instance,enabled:t})}}class ft{constructor(t,e){this.value=t,this.attribute=e}value;attribute;isSelectedValue=!1;get isSelected(){return this.isSelectedValue}setSelected(t){this.isSelectedValue=t}}const _={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 b extends Error{code;constructor(t,e){super(t),this.name="VirtualdisplayError",this.code=e}static valueNotFound(t,e){return new b(`Value "${e}" not found for attribute "${t}"`,_.VALUE_NOT_FOUND)}static parentNotFound(t){return new b(`Parent element not found: ${t}`,_.PARENT_NOT_FOUND)}static invalidParameter(t){return new b(t,_.INVALID_PARAMETER)}}class gt{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 b.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 ft(i,this.name);i===this.defaultValue&&o.setSelected(!0),e.set(i,o)}return e}}class ne{attributes=new Map;constructor(t,e,i){for(const o of t){const s=this.buildOptions(o,e);this.attributes.set(o.name,new gt(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 L=4096,F=16384,ie=[1024,256,64],oe=20,W=["timestamp","level","msg","service","trace_id","span_id"];function se(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,L).line}`).join(" ");return`${t} ${e} [${i}] ${o}${s?" "+s:""}`}function re(n){for(const o of[L,...ie]){const{line:s,truncated:r}=I(n,o);if(!r){if(s.length<=F)return s;continue}const{line:a}=I({...n,log_truncated:!0},o);if(a.length<=F)return a}const t=Object.keys(n).filter(o=>!W.includes(o)),e={...le(n,W),log_truncated:!0,log_dropped_count:t.length},i=I({...e,log_dropped_attrs:t.slice(0,oe)},L);return i.line.length<=F?i.line:I(e,L).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),ae(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 ae(n,t){return n.length<=t?n:`${n.slice(0,t)}...[truncated ${n.length-t} chars]`}function le(n,t){const e={};for(const i of t)n[i]!==void 0&&(e[i]=n[i]);return e}function ce(n,t){const e=t?se(n):re(n);n.level==="error"?console.error(e):n.level==="warn"?console.warn(e):console.log(e)}function bt(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?bt(n.cause,t+1):String(n.cause)),e}function ue(n){const t={};for(const[e,i]of Object.entries(n))t[e]=i instanceof Error?bt(i):i;return t}function de(){return new Date}function he(n){return n.toISOString()}function vt(){return typeof navigator>"u"?"":navigator.userAgent}function pe(){return typeof navigator>"u"?!1:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function me(){return/iPhone|iPad|iPod/i.test(vt())||pe()}function fe(){return/Android/i.test(vt())}function ge(){return me()||fe()}class be{constructor(t){this.config=t}config;log(t,e,i={}){const o=this.config.traceProvider?.()??{},s={timestamp:he(de()),level:t,msg:e,service:this.config.service,...o,...ue(i)};ce(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 yt(n,t){const e=t?.isDev!==void 0?t.isDev:typeof process<"u"?process.env.NODE_ENV!=="production":!0;return new be({service:n,isDev:e,traceProvider:t?.traceProvider})}function M(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 St(n){return{debug:(t,e)=>n.debug(t,M(e)),info:(t,e)=>n.info(t,M(e)),warn:(t,e)=>n.warn(t,M(e)),error:(t,e)=>n.error(t,M(e))}}let wt=!1;exports.logger=St(yt("client",{isDev:!1}));function Ct(){wt=!0,exports.logger=St(yt("client",{isDev:!0}))}function ve(){return wt}class ye{constructor(t,e,i){this.send=t,this.instance=e,this.onMutationFailed=i}send;instance;onMutationFailed;registry;pendingCallbacks=[];handleMappingReceived(t){exports.logger.debug("Initializing from server mapping",{attributeCount:t.attributes.length}),this.registry=new ne(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)}selectTransient(t,e){this.sendMutation([{name:t,value:e}],!1,!0)}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()??{}}sendMutation(t,e,i=!1){const o={type:c.MUTATION,instance:this.instance,mutations:t,isInitial:e,...i&&{transient:!0}};this.send(o)}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}}class Se{snapshot;callbacks=[];handleSnapshot(t){this.snapshot=t.attributes;for(const e of this.callbacks)e(t.attributes)}onChange(t){this.callbacks.push(t),this.snapshot!==void 0&&t(this.snapshot)}selectableFor(t){return this.snapshot?.find(i=>i.name===t)?.selectable??null}get current(){return this.snapshot??[]}}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 b.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 b.invalidParameter(`${e}() requires a finite number, got ${String(t)}`)}reset(){const t={type:c.CAMERA,commands:[{action:"reset"}]};this.send(t)}};class we{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=>_e(s,t));if(e.length===0)return;const i=Math.max(...e.map(nt)),o=e.filter(s=>nt(s)===i);return o.length===1?o[0]:void 0}function _e(n,t){return Object.entries(n.attributes).every(([e,i])=>t[e]===i)}function nt(n){return Object.keys(n.attributes).length}class kt{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===$t.HIDDEN))return{attributes:{...this.selection},reference:t.reference,price:t.priceCents,currency:this.pricing.currency,availability:t.availability}}}class At{constructor(t,e,i){this.send=t,this.dispatch=e,this.instance=i}send;dispatch;instance;focused=null;attributes=[];changeCallbacks=[];get current(){return this.focused}set(t){if(typeof t!="string"||t.length===0)throw b.invalidParameter(`set() requires a non-empty component name, got ${String(t)}`);this.send({type:c.FOCUS,instance:this.instance,action:tt.FOCUS,component:t})}clear(){this.send({type:c.FOCUS,instance:this.instance,action:tt.UNFOCUS})}onChange(t){this.changeCallbacks.push(t)}handleStateReceived(t){t.state===Dt.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 Et{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 it=3e4;class xt{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 Et(t),i=setTimeout(()=>{this.pendingPhotos.delete(t),exports.logger.warn("Snapshot timed out",{filename:t}),e.fail(new b(`Snapshot timed out: the viewer did not respond within ${it}ms`,_.SNAPSHOT_FAILED))},it);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 b(t.error,_.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 b("Client destroyed before snapshot completed",_.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 b("Filename must be a non-empty string",_.INVALID_PARAMETER);if(!this.validExtensions.some(i=>t.toLowerCase().endsWith(i)))throw new b(`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,_.INVALID_PARAMETER);if(t.includes("..")||t.includes("/")||t.includes("\\"))throw new b('Filename cannot contain path separators or ".."',_.INVALID_PARAMETER)}}class ke{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 Ae={},Ee="en",Tt=["en","nl","de"],K=["baseLocale"],ot=[],Y=typeof window>"u";globalThis.__paraglide=globalThis.__paraglide??{};globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};let st=!1,p=()=>{let n=K;!Y&&typeof window<"u"&&window.location?.href&&(n=It(window.location.href));const t=xe(n);if(t)return st||(st=!0,Rt(t,{reload:!1})),t;throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found")};function xe(n,t){let e;for(const i of n){if(i==="baseLocale")e=Ee;else if(Ot(i)&&N.has(i)){const s=N.get(i);if(s){const r=s.getLocale();if(r instanceof Promise)continue;if(r!==void 0)return Ie(r)}}const o=X(e);if(o)return o}}const Te=n=>{window.location.reload()};let Rt=(n,t)=>{const e={reload:!0,...t};let i;try{i=p()}catch{}const o=[];let s=K;!Y&&typeof window<"u"&&window.location?.href&&(s=It(window.location.href));for(const a of s)if(a!=="baseLocale"&&Ot(a)&&N.has(a)){const u=N.get(a);if(u){let d=u.setLocale(n);d instanceof Promise&&(d=d.catch(f=>{throw new Error(`Custom strategy "${a}" setLocale failed.`,{cause:f})}),o.push(d))}}const r=()=>{!Y&&e.reload&&window.location&&n!==i&&Te()};if(o.length)return Promise.all(o).then(()=>{r()});r()},Re=()=>typeof window<"u"?window.location.origin:"http://fallback.com";function X(n){if(typeof n!="string")return;const t=n.toLowerCase();for(const e of Tt)if(e.toLowerCase()===t)return e}function Ie(n){const t=X(n);if(t)return t;throw new Error(`Invalid locale: ${n}. Expected one of: ${Tt.join(", ")}`)}function Oe(n){return Me(n)}function Me(n){const t=typeof n=="string"?new URL(n,Re()):new URL(n),e=t.pathname.split("/").filter(Boolean);return e.length>0&&X(e[0])&&(t.pathname="/"+e.slice(1).join("/")),t}let rt,at;function Le(n){if(ot.length===0)return;const t=typeof n=="string"?n:n.href;if(rt===t)return at;const e=new URL(t,"http://example.com"),i=Oe(e),o=i.href===e.href?[e]:[e,i];let s;for(const r of o){for(const a of ot)if(new Ae(a.match,r.href).exec(r.href)){s=a;break}if(s)break}return rt=t,at=s,s}function It(n){const t=Le(n);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:K}const N=new Map;function Ot(n){return typeof n=="string"&&/^custom-[A-Za-z0-9_-]+$/.test(n)}const Ne=()=>"Activate AR",ze=()=>"AR activeren",Pe=()=>"AR aktivieren",Fe=((n={},t={})=>{const e=t.locale??p();return e==="nl"?ze():e==="de"?Pe():Ne()}),De=()=>"Scan to view in AR",$e=()=>"Scan om in AR te bekijken",Be=()=>"Scannen für AR-Ansicht",Ue=((n={},t={})=>{const e=t.locale??p();return e==="nl"?$e():e==="de"?Be():De()}),Ve=()=>"Use your smartphone camera to scan this QR code",je=()=>"Gebruik de camera van je smartphone om deze QR-code te scannen",He=()=>"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen",qe=((n={},t={})=>{const e=t.locale??p();return e==="nl"?je():e==="de"?He():Ve()}),Ge=()=>"Your phone will open the 3D model in AR mode.",Ze=()=>"Je telefoon opent het 3D-model in AR-modus.",We=()=>"Dein Telefon öffnet das 3D-Modell im AR-Modus.",Ye=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Ze():e==="de"?We():Ge()}),Qe=()=>"Close",Ke=()=>"Sluiten",Xe=()=>"Schließen",Je=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Ke():e==="de"?Xe():Qe()}),tn=()=>"Annotations",en=()=>"Annotaties",nn=()=>"Anmerkungen",on=((n={},t={})=>{const e=t.locale??p();return e==="nl"?en():e==="de"?nn():tn()}),sn=()=>"Fullscreen",rn=()=>"Volledig scherm",an=()=>"Vollbild",ln=((n={},t={})=>{const e=t.locale??p();return e==="nl"?rn():e==="de"?an():sn()}),cn=()=>"Downloading",un=()=>"Downloaden",dn=()=>"Herunterladen",hn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?un():e==="de"?dn():cn()}),pn=()=>"Screenshot",mn=()=>"Screenshot",fn=()=>"Screenshot",gn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?mn():e==="de"?fn():pn()}),bn=()=>"Configure",vn=()=>"Configureren",yn=()=>"Konfigurieren",Sn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?vn():e==="de"?yn():bn()}),wn=()=>"Close",Cn=()=>"Sluiten",_n=()=>"Schließen",kn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Cn():e==="de"?_n():wn()}),An=()=>"Reset camera",En=()=>"Camera resetten",xn=()=>"Kamera zurücksetzen",Tn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?En():e==="de"?xn():An()}),Rn=()=>"Zoom in",In=()=>"Inzoomen",On=()=>"Hineinzoomen",Mn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?In():e==="de"?On():Rn()}),Ln=()=>"Zoom out",Nn=()=>"Uitzoomen",zn=()=>"Herauszoomen",Pn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Nn():e==="de"?zn():Ln()}),Fn=()=>"Rotate left",Dn=()=>"Naar links draaien",$n=()=>"Nach links drehen",Bn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Dn():e==="de"?$n():Fn()}),Un=()=>"Rotate right",Vn=()=>"Naar rechts draaien",jn=()=>"Nach rechts drehen",Hn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Vn():e==="de"?jn():Un()}),qn=()=>"Tilt up",Gn=()=>"Omhoog kantelen",Zn=()=>"Nach oben kippen",Wn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Gn():e==="de"?Zn():qn()}),Yn=()=>"Tilt down",Qn=()=>"Omlaag kantelen",Kn=()=>"Nach unten kippen",Xn=((n={},t={})=>{const e=t.locale??p();return e==="nl"?Qn():e==="de"?Kn():Yn()}),Jn=()=>"Working…",ti=()=>"Bezig…",ei=()=>"Läuft…",ni=((n={},t={})=>{const e=t.locale??p();return e==="nl"?ti():e==="de"?ei():Jn()}),ii=()=>"Done",oi=()=>"Gelukt",si=()=>"Fertig",ri=((n={},t={})=>{const e=t.locale??p();return e==="nl"?oi():e==="de"?si():ii()}),ai=()=>"Failed",li=()=>"Mislukt",ci=()=>"Fehlgeschlagen",ui=((n={},t={})=>{const e=t.locale??p();return e==="nl"?li():e==="de"?ci():ai()});const di={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 Mt=([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=Mt(o);i.appendChild(s)}),i},Lt=(n,t={})=>{const i={...di,...t};return Mt(["svg",i,n])};const hi=[["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 pi=[["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 Nt=[["path",{d:"m6 9 6 6 6-6"}]];const mi=[["path",{d:"m15 18-6-6 6-6"}]];const fi=[["path",{d:"m9 18 6-6-6-6"}]];const gi=[["path",{d:"m18 15-6-6-6 6"}]];const bi=[["path",{d:"M12.75 7.09a3 3 0 0 1 2.16 2.16"}],["path",{d:"M17.072 17.072c-1.634 2.17-3.527 3.912-4.471 4.727a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 1.432-4.568"}],["path",{d:"m2 2 20 20"}],["path",{d:"M8.475 2.818A8 8 0 0 1 20 10c0 1.183-.31 2.377-.81 3.533"}],["path",{d:"M9.13 9.13a3 3 0 0 0 3.74 3.74"}]];const vi=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"}],["circle",{cx:"12",cy:"10",r:"3"}]];const yi=[["path",{d:"M15 3h6v6"}],["path",{d:"m21 3-7 7"}],["path",{d:"m3 21 7-7"}],["path",{d:"M9 21H3v-6"}]];const Si=[["path",{d:"m14 10 7-7"}],["path",{d:"M20 10h-6V4"}],["path",{d:"m3 21 7-7"}],["path",{d:"M4 14h6v6"}]];const wi=[["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 Ci=[["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 _i=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];const ki=[["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 Ai=[["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 v(n,{size:t=20,strokeWidth:e=1.75}={}){return Lt(n,{width:t,height:t,"stroke-width":e})}const g={ar:n=>v(hi,n),annotations:n=>v(vi,n),annotationsOff:n=>v(bi,n),fullscreen:n=>v(yi,n),exitFullscreen:n=>v(Si,n),screenshot:n=>v(pi,n),tiltUp:n=>v(gi,n),tiltDown:n=>v(Nt,n),rotateLeft:n=>v(mi,n),rotateRight:n=>v(fi,n),zoomIn:n=>v(ki,n),zoomOut:n=>v(Ai,n),reset:n=>v(wi,n),configurator:n=>v(Ci,n),close:n=>v(_i,n)};class y{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 Ei{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 xi{constructor(t={}){this.options=t,this.card=new Ei,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 Ti{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}setEnabled(t){for(const e of this.element.querySelectorAll(".ui-toggle-group-item")){const i=t===null||t.includes(e.dataset.value??"");e.disabled=!i,e.setAttribute("aria-disabled",i?"false":"true")}}}class Ri{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 f=e[d],h=document.createElement("option");h.value=f,h.textContent=s?.[d]??f,f===o&&(h.selected=!0,a=!0),this.select.appendChild(h)}a||(r.selected=!0);const u=Lt(Nt,{width:16,height:16,"stroke-width":2});u.classList.add("ui-native-select-icon"),this.element=document.createElement("div"),this.element.className="ui-native-select-wrap",this.element.appendChild(this.select),this.element.appendChild(u)}setSelected(t){this.select.value=t}onSelect(t){this.select.addEventListener("change",()=>{t(this.select.value)})}setEnabled(t){for(const e of this.select.options)e.value!==""&&(e.disabled=t!==null&&!t.includes(e.value))}}class Ii{element;input;valueText;values;options;selectCallback=null;settleCallback=null;constructor(t,e){if(t.length===0)throw new Error("Virtualdisplay: Slider needs at least one value");this.values=t,this.options=e,this.input=document.createElement("input"),this.input.type="range",this.input.className="ui-slider-input",this.input.min="0",this.input.max=String(t.length-1),this.input.step="1",this.input.setAttribute("aria-label",e.label),this.valueText=document.createElement("span"),this.valueText.className="ui-slider-value",this.valueText.setAttribute("aria-hidden","true");const i=document.createElement("div");i.className="ui-slider-track",i.appendChild(this.input),i.appendChild(this.buildEnds()),this.element=document.createElement("div"),this.element.className="ui-slider",this.element.appendChild(i),this.element.appendChild(this.valueText);const o=e.initialSelected===void 0?0:t.indexOf(e.initialSelected);this.applyIndex(o===-1?0:o),this.listen()}setSelected(t){const e=this.values.indexOf(t);e!==-1&&this.applyIndex(e)}onSelect(t){this.selectCallback=t}onSettle(t){this.settleCallback=t}listen(){this.input.addEventListener("input",()=>{const t=this.values[this.currentIndex];t!==void 0&&(this.applyIndex(this.currentIndex),this.selectCallback?.(t))}),this.input.addEventListener("change",()=>{const t=this.values[this.currentIndex];t!==void 0&&this.settleCallback?.(t)})}get currentIndex(){return Number(this.input.value)}applyIndex(t){this.input.value=String(t);const e=this.displayAt(t);this.valueText.textContent=e,this.input.setAttribute("aria-valuetext",e);const i=this.values.length===1?100:t/(this.values.length-1)*100;this.element.style.setProperty("--ui-slider-pct",`${i}%`)}buildEnds(){const t=document.createElement("div");t.className="ui-slider-ends",t.setAttribute("aria-hidden","true");for(const e of[0,this.values.length-1]){const i=document.createElement("span");i.textContent=this.labelAt(e),t.appendChild(i)}return t}labelAt(t){return this.options.labels?.[t]??this.values[t]??""}displayAt(t){const e=this.labelAt(t);return this.options.unit===void 0?e:`${e} ${this.options.unit}`}}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(", "),Oi=`
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
- `,Ei=`
15
- :root { ${Ai} }
14
+ `,Mi=`
15
+ :root { ${Oi} }
16
16
 
17
17
  /* ── Button ──────────────────────────────────────────────── */
18
18
  .ui-btn {
@@ -381,12 +381,12 @@
381
381
  0%, 100% { opacity: 1; }
382
382
  50% { opacity: 0.55; }
383
383
  }
384
- `;let le=!1;function ze(){if(le||typeof document>"u")return;le=!0;const n=document.createElement("style");n.id="vd-ui-vanilla",n.textContent=Ei,document.head.appendChild(n)}const xi=w.fontFamily.sans.join(", ");class Ti{qrLib=null;dialog=null;qrSlot=null;show(){this.hide(),ze(),this.dialog=new wi({onClose:()=>{this.dialog=null,this.qrSlot=null}}),Object.assign(this.dialog.card.element.style,{display:"flex",flexDirection:"column",alignItems:"center",gap:l[3],fontFamily:xi}),this.dialog.card.element.appendChild(this.createText(Bt(),{fontSize:w.fontSize.base,fontWeight:w.fontWeight.semibold,color:p.neutral[900]})),this.dialog.card.element.appendChild(this.createText(qt(),{fontSize:w.fontSize.sm,color:p.neutral[600]})),this.qrSlot=this.createQrSlot(),this.dialog.card.element.appendChild(this.qrSlot),this.dialog.card.element.appendChild(this.createText(Yt(),{fontSize:w.fontSize.xs,color:p.neutral[500]}));const e=new v({variant:"outline",label:Jt(),onClick:()=>{this.hide()}});this.dialog.card.element.appendChild(e.element),this.dialog.open()}async update(e){this.qrLib??=await Promise.resolve().then(()=>require("./browser-DfB_An57.cjs")).then(i=>i.browser);const t=await this.qrLib.toDataURL(e,{width:256,margin:4,errorCorrectionLevel:"M",color:{dark:p.black,light:p.white}});return this.qrSlot===null?!1:(this.qrSlot.classList.remove("ui-qr-slot--loading"),this.qrSlot.replaceChildren(this.createQrImage(t)),!0)}hide(){this.dialog?.close(),this.dialog=null,this.qrSlot=null}createText(e,t){const i=document.createElement("p");return i.textContent=e,Object.assign(i.style,{margin:"0",textAlign:"center",...t}),i}createQrSlot(){const e=document.createElement("div");return e.className="ui-qr-slot ui-qr-slot--loading",e}createQrImage(e){const t=document.createElement("img");return t.src=e,t.alt="QR code",t}}function ce(n){const e=Math.max(0,Math.min(1,n));return e*e*(3-2*e)}function Ri(n,e,t,i,s,o){const[r,a,u]=n,d=Math.cos(e),f=Math.sin(e),h=d*r+f*u,A=-f*r+d*u,_=Math.cos(t),C=Math.sin(t),R=_*a-C*A,z=C*a+_*A,J=.55;return[i+h*o*J,s-R*o*J,z]}function Ii(n,e,t){n.beginPath(),n.moveTo(e[0],e[1]),n.lineTo(t[0],t[1]),n.strokeStyle="#000",n.lineWidth=2,n.stroke()}function Oi(n,e,t,i,s){const o=e(t),r=e(i),a=[o[0]+(r[0]-o[0])*s,o[1]+(r[1]-o[1])*s,o[2]];Ii(n,o,a)}const D=[-1,-1,1],$=[1,-1,1],U=[1,-1,-1],B=[-1,-1,-1],V=[-1,1,1],j=[1,1,1],H=[1,1,-1],q=[-1,1,-1],ue=[[D,$],[$,U],[U,B],[B,D],[D,V],[$,j],[U,H],[B,q],[V,j],[j,H],[H,q],[q,V]],Li=400,de='-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';function Ni(){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 e=document.createElement("canvas");Object.assign(e.style,{width:"100%",height:"100%",position:"absolute",inset:"0"});const t=document.createElement("div");Object.assign(t.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:de});const s=document.createElement("span");return Object.assign(s.style,{fontSize:"13px",color:"#000",fontFamily:de}),s.textContent=ln(),t.appendChild(i),t.appendChild(s),n.appendChild(e),n.appendChild(t),{overlay:n,canvas:e,pctEl:i,phaseEl:s}}class Mi{overlay;canvas;ctx;pctEl;phaseEl;animationId=null;showTimerId=null;startTime;hidden=!1;visible=!1;constructor(e,t={}){this.startTime=performance.now();const i=Ni();this.overlay=i.overlay,this.canvas=i.canvas,this.pctEl=i.pctEl,this.phaseEl=i.phaseEl,e.appendChild(this.overlay),this.ctx=this.canvas.getContext("2d"),this.ctx!==null&&(this.sizeCanvas(),this.tick());const s=t.showDelay??Li;this.showTimerId=setTimeout(()=>{this.reveal()},s)}updateProgress(e,t){this.hidden||(this.pctEl.textContent=`${Math.round(e)}%`,this.phaseEl.textContent=t!==""?` · ${t}`:"")}showError(e){if(this.hidden=!1,this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.ctx!==null){const t=Math.min(devicePixelRatio,2),i=this.canvas.width/t,s=this.canvas.height/t;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,i*t,s*t)}this.pctEl.textContent="",this.phaseEl.textContent=e,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 e=Math.min(devicePixelRatio,2),t=this.overlay.clientWidth||440,i=this.overlay.clientHeight||360;this.canvas.width=t*e,this.canvas.height=i*e,this.ctx.scale(e,e),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 e=this.canvas.width/Math.min(devicePixelRatio,2),t=this.canvas.height/Math.min(devicePixelRatio,2),i=(performance.now()-this.startTime)/1e3;this.ctx.fillStyle="#fff",this.ctx.fillRect(0,0,e,t);const s=e/2,o=t*.44,r=Math.min(e,t)*.08,a=.785,u=.615,d=C=>Ri(C,a,u,s,o,r),f=6,h=i%f/f,A=ue.length;let _;h<.35?_=ce(h/.35)*A:h<.55?_=A:h<.9?_=(1-ce((h-.55)/.35))*A:_=0,this.ctx.shadowBlur=5,this.ctx.shadowColor="rgba(30,30,30,0.08)";for(let C=0;C<A&&!(C>=_);C++){const R=ue[C];if(R===void 0)continue;const z=Math.min(1,_-C);Oi(this.ctx,d,R[0],R[1],z)}this.ctx.shadowBlur=0}}class zi{constructor(e){this.options=e,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(e){this.fullscreenBtn!==null&&this.fullscreenBtn.setIcon(e?b.exitFullscreen():b.fullscreen())}syncButton(e,t,i){if(t&&e===null){const s=i();return this.element.appendChild(s.element),s}return!t&&e!==null?(e.element.remove(),null):e}applySettings(e){this.arBtn=this.syncButton(this.arBtn,e.ar!==!1&&this.options.onAr!==void 0,()=>new v({variant:"outline",size:"icon",label:Ft(),icon:b.ar(),onClick:()=>{this.options.onAr?.()}})),this.fullscreenBtn=this.syncButton(this.fullscreenBtn,e.fullscreen!==!1&&this.options.onFullscreen!==void 0,()=>new v({variant:"outline",size:"icon",label:sn(),icon:b.fullscreen(),onClick:()=>{this.options.onFullscreen?.()}}))}destroy(){document.removeEventListener("fullscreenchange",this.onFullscreenChange)}}const T=.5;class M{element;constructor(e,t){this.element=Object.assign(document.createElement("div"),{className:"vd-camera-controls"});const i={targetRotation:t.rotation,targetTilt:t.tilt,targetZoom:t.zoom,thetaOffset:0},s=Pi(e,t,i);t.onChange(o=>{i.targetRotation=o.rotation-i.thetaOffset,i.targetTilt=o.tilt,i.targetZoom=o.zoom,Fi(s,t,o)}),this.element.appendChild(M.buildZoom(s.zoomOut,s.zoomIn)),this.element.appendChild(M.buildDpad(s.tiltUp,s.rotateLeft,s.reset,s.rotateRight,s.tiltDown))}static buildZoom(e,t){const i=document.createElement("div");return i.className="vd-zoom",i.appendChild(e.element),i.appendChild(t.element),i}static buildDpad(e,t,i,s,o){const r=document.createElement("div");r.className="vd-dpad";for(const[a,u]of[[e,"up"],[t,"left"],[i,"center"],[s,"right"],[o,"down"]])a.element.classList.add(`vd-dpad-${u}`),r.appendChild(a.element);return r}}function Pi(n,e,t){const i=r=>Math.max(e.limits?.minZoom??1,Math.min(e.limits?.maxZoom??1/0,r)),s=r=>{const a=e.limits?.minRotate,u=e.limits?.maxRotate;return a!==void 0||u!==void 0?Math.max(a??-1/0,Math.min(u??1/0,r)):r},o=r=>{const a=e.limits?.minTilt,u=e.limits?.maxTilt;if(a!==void 0||u!==void 0){t.targetTilt=Math.max(a??0,Math.min(u??180,t.targetTilt+r)),n.tilt(t.targetTilt).set();return}const d=t.targetTilt+r;d>180||d<0?(t.targetTilt=d>180?360-d:-d,t.thetaOffset=(t.thetaOffset+180)%360,n.tilt(t.targetTilt).rotate(t.targetRotation+t.thetaOffset).set()):(t.targetTilt=d,n.tilt(t.targetTilt).set())};return{zoomOut:new v({variant:"outline",size:"icon",label:Ln(),icon:b.zoomOut(),onClick:()=>{t.targetZoom=i(t.targetZoom-10),n.zoom(t.targetZoom).set()}}),zoomIn:new v({variant:"outline",size:"icon",label:Tn(),icon:b.zoomIn(),onClick:()=>{t.targetZoom=i(t.targetZoom+10),n.zoom(t.targetZoom).set()}}),tiltUp:new v({variant:"outline",size:"icon",label:Hn(),icon:b.tiltUp(),onClick:()=>{o(-15)}}),rotateLeft:new v({variant:"outline",size:"icon",label:Pn(),icon:b.rotateLeft(),onClick:()=>{t.targetRotation=s(t.targetRotation-15),n.rotate(t.targetRotation+t.thetaOffset).set()}}),reset:new v({variant:"outline",size:"icon",label:_n(),icon:b.reset(),onClick:()=>{t.thetaOffset=0,n.reset()}}),rotateRight:new v({variant:"outline",size:"icon",label:Un(),icon:b.rotateRight(),onClick:()=>{t.targetRotation=s(t.targetRotation+15),n.rotate(t.targetRotation+t.thetaOffset).set()}}),tiltDown:new v({variant:"outline",size:"icon",label:Wn(),icon:b.tiltDown(),onClick:()=>{o(15)}})}}function Fi(n,e,t){const i=e.limits;i!==void 0&&(n.zoomOut.element.disabled=i.minZoom!==void 0&&t.zoom<=i.minZoom+T,n.zoomIn.element.disabled=i.maxZoom!==void 0&&t.zoom>=i.maxZoom-T,n.tiltUp.element.disabled=i.minTilt!==void 0&&t.tilt<=i.minTilt+T,n.tiltDown.element.disabled=i.maxTilt!==void 0&&t.tilt>=i.maxTilt-T,n.rotateLeft.element.disabled=i.minRotate!==void 0&&t.rotation<=i.minRotate+T,n.rotateRight.element.disabled=i.maxRotate!==void 0&&t.rotation>=i.maxRotate-T)}const x={SELECT:"ui:select",SELECTED:"ui:selected",FOCUS_CHANGE:"vd:focus-change",CONFIGURATION_CHANGE:"vd:configuration-change",CONFIGURATION_SUBMIT:"vd:configuration-submit"},Pe={mm:1,cm:10,m:1e3,in:25.4},he=3;function Di(n){const e=n.stepMm/Pe[n.displayUnit];for(let t=0;t<=he;t++){const i=e*10**t;if(Math.abs(i-Math.round(i))<1e-9)return t}return he}function $i(n,e,t){const i=Di(e),s=n/Pe[e.displayUnit];return new Intl.NumberFormat(t,{minimumFractionDigits:i,maximumFractionDigits:i}).format(s)}function Ui(n,e,t,i,s,o,r){const a=m(),u=n.values.map(h=>$i(Number(h),e,a)),d=n.values.find(h=>t.getValue(n.name,h)?.isSelected===!0)??n.defaultValue,f=new _i(n.values,{label:n.name,labels:u,unit:e.displayUnit,...d!==void 0&&{initialSelected:d}});return f.onSelect(h=>{s(n.name,h)}),f.onSettle(h=>{i.dispatch(x.SELECT,{attribute:n.name,value:h},!0).defaultPrevented||o(n.name,h)}),r(n.name,h=>{f.setSelected(h.value),i.dispatch(x.SELECTED,{attribute:n.name,value:h.value})}),{element:f.element,setSelectable:()=>{}}}const Bi=5;let Vi=0;function Q(n){const e=n.replace(/([A-Z])/g," $1").trim();return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}function ji(n,e,t,i,s,o){const r=document.createElement("div");r.className="vd-attribute",r.dataset.name=n.name;const a=document.createElement("span");a.className="vd-attribute-label",a.textContent=Q(n.name),a.id=`vd-attribute-label-${Vi++}`,r.appendChild(a),r.setAttribute("role","group"),r.setAttribute("aria-labelledby",a.id);const u=f=>{r.style.display=f?"none":""},d=n.dimension!==void 0?Ui(n,n.dimension,e,t,s,i,o):Hi(n,e,t,i,o);return r.appendChild(d.element),{element:r,setSelectable:d.setSelectable,setHidden:u}}function Hi(n,e,t,i,s){const o=n.values.find(u=>e.getValue(n.name,u)?.isSelected===!0),r=n.values.map(Q),a=n.values.length<=Bi?new Ci(n.values,o,r):new ki(n.name,n.values,Q(n.name),o,r);return a.onSelect(u=>{t.dispatch(x.SELECT,{attribute:n.name,value:u},!0).defaultPrevented||i(n.name,u)}),s(n.name,u=>{a.setSelected(u.value),t.dispatch(x.SELECTED,{attribute:n.name,value:u.value})}),{element:a.element,setSelectable:u=>{a.setEnabled(u)}}}const qi=80,Gi=2500;class Zi{constructor(e,t=Gi){this.configuration=e,this.resetMs=t,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 v({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 e=this.configuration.current!==void 0||this.configuration.submitEnabled;this.element.classList.toggle("vd-hidden",!e)}destroy(){this.unsubscribe(),this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.element.remove()}renderPrice(e){if(e===void 0){this.priceEl.textContent="",this.vatEl.textContent="";return}this.priceEl.textContent=Wi(e.price,e.currency),this.vatEl.textContent=me(this.configuration.vatDisplay)}renderButton(){const e=this.configuration.submitEnabled;this.button.element.classList.toggle("vd-hidden",!e),e&&this.state==="idle"&&this.setButtonText(me(this.configuration.buttonLabel))}async handleSubmit(){if(this.state!=="busy"){this.setState("busy",Xn());try{await this.configuration.submit(),this.setState("success",ni())}catch{this.setState("failed",ri())}this.scheduleReset()}}scheduleReset(){this.resetTimer!==void 0&&clearTimeout(this.resetTimer),this.resetTimer=setTimeout(()=>{this.state="idle",this.update()},this.resetMs)}setState(e,t){this.state=e,this.element.dataset.submit=e,this.button.element.disabled=e==="busy",this.setButtonText(t)}setButtonText(e){this.button.element.textContent=e,this.button.element.setAttribute("aria-label",e)}}function me(n){return(n??"").slice(0,qi)}function Wi(n,e){try{const t=new Intl.NumberFormat(m(),{style:"currency",currency:e}),i=t.resolvedOptions().maximumFractionDigits??2;return t.format(n/10**i)}catch{return`${e} ${(n/100).toFixed(2)}`}}class Fe{slot=null;panel=null;attach(e,t){this.panel=t,t.style.display="none",this.slot=document.createElement("div"),this.slot.className="vd-slot-bottom-left",this.slot.appendChild(t),e.appendChild(this.slot)}setVisible(e){this.panel!==null&&(this.panel.style.display=e?"flex":"none")}destroy(){this.slot?.remove(),this.slot=null,this.panel=null}}const Yi=572;class Qi{constructor(e){this.actionBarSlot=e}actionBarSlot;element=null;body=null;openButton=null;closeButton=null;container=null;observer=null;collapsible=!1;expanded=!0;visible=!1;attach(e,t){this.container=e,t.classList.add("vd-attributes-sidebar"),this.closeButton=new v({variant:"ghost",size:"icon-sm",label:Sn(),icon:b.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(t),this.element=document.createElement("div"),this.element.className="vd-sidebar vd-hidden",this.element.append(i,this.body),e.appendChild(this.element),this.openButton=new v({variant:"outline",size:"icon",label:gn(),icon:b.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(e){this.visible=e,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(e=>{const t=e[0]?.contentRect.width??0;this.setCollapsible(t>0&&t<Yi)}),this.observer.observe(this.container))}setCollapsible(e){e!==this.collapsible&&(this.collapsible=e,this.expanded=!e,this.render())}render(){if(this.element===null||this.openButton===null||this.closeButton===null||this.container===null)return;const e=this.visible&&this.expanded,t=this.visible&&!this.expanded;this.element.classList.toggle("vd-hidden",!this.visible),this.element.classList.toggle("vd-sidebar-collapsed",t),this.openButton.element.classList.toggle("vd-hidden",!t),this.closeButton.element.style.display=this.collapsible?"":"none",this.container.classList.toggle("vd-layout-sidebar-right",e),this.container.classList.toggle("vd-layout-sidebar-permanent",e&&!this.collapsible)}}class Ki{attach(e,t){}setVisible(e){}destroy(){}}const Xi={"inframe-bottom-left":()=>new Fe,"sidebar-right":n=>new Qi(n),hidden:()=>new Ki};function Ji(n,e){return(Xi[n??""]??(()=>new Fe))(e)}const G=w.fontFamily.sans.join(", "),Z=`
384
+ `;let lt=!1;function zt(){if(lt||typeof document>"u")return;lt=!0;const n=document.createElement("style");n.id="vd-ui-vanilla",n.textContent=Mi,document.head.appendChild(n)}const Li=w.fontFamily.sans.join(", ");class Ni{qrLib=null;dialog=null;qrSlot=null;show(){this.hide(),zt(),this.dialog=new xi({onClose:()=>{this.dialog=null,this.qrSlot=null}}),Object.assign(this.dialog.card.element.style,{display:"flex",flexDirection:"column",alignItems:"center",gap:l[3],fontFamily:Li}),this.dialog.card.element.appendChild(this.createText(Ue(),{fontSize:w.fontSize.base,fontWeight:w.fontWeight.semibold,color:m.neutral[900]})),this.dialog.card.element.appendChild(this.createText(qe(),{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(Ye(),{fontSize:w.fontSize.xs,color:m.neutral[500]}));const t=new y({variant:"outline",label:Je(),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 ct(n){const t=Math.max(0,Math.min(1,n));return t*t*(3-2*t)}function zi(n,t,e,i,o,s){const[r,a,u]=n,d=Math.cos(t),f=Math.sin(t),h=d*r+f*u,A=-f*r+d*u,k=Math.cos(e),C=Math.sin(e),R=k*a-C*A,P=C*a+k*A,J=.55;return[i+h*s*J,o-R*s*J,P]}function Pi(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 Fi(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]];Pi(n,s,a)}const D=[-1,-1,1],$=[1,-1,1],B=[1,-1,-1],U=[-1,-1,-1],V=[-1,1,1],j=[1,1,1],H=[1,1,-1],q=[-1,1,-1],ut=[[D,$],[$,B],[B,U],[U,D],[D,V],[$,j],[B,H],[U,q],[V,j],[j,H],[H,q],[q,V]],Di=400,dt='-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';function $i(){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=hn(),e.appendChild(i),e.appendChild(o),n.appendChild(t),n.appendChild(e),{overlay:n,canvas:t,pctEl:i,phaseEl:o}}class Bi{overlay;canvas;ctx;pctEl;phaseEl;animationId=null;showTimerId=null;startTime;hidden=!1;visible=!1;constructor(t,e={}){this.startTime=performance.now();const i=$i();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??Di;this.showTimerId=setTimeout(()=>{this.reveal()},o)}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,u=.615,d=C=>zi(C,a,u,o,s,r),f=6,h=i%f/f,A=ut.length;let k;h<.35?k=ct(h/.35)*A:h<.55?k=A:h<.9?k=(1-ct((h-.55)/.35))*A:k=0,this.ctx.shadowBlur=5,this.ctx.shadowColor="rgba(30,30,30,0.08)";for(let C=0;C<A&&!(C>=k);C++){const R=ut[C];if(R===void 0)continue;const P=Math.min(1,k-C);Fi(this.ctx,d,R[0],R[1],P)}this.ctx.shadowBlur=0}}class Ui{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;annotationsBtn=null;annotationsShown=!1;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 y({variant:"outline",size:"icon",label:Fe(),icon:g.ar(),onClick:()=>{this.options.onAr?.()}})),this.fullscreenBtn=this.syncButton(this.fullscreenBtn,t.fullscreen!==!1&&this.options.onFullscreen!==void 0,()=>new y({variant:"outline",size:"icon",label:ln(),icon:g.fullscreen(),onClick:()=>{this.options.onFullscreen?.()}}));const e=t.annotations==="toggle-shown"||t.annotations==="toggle-hidden";this.annotationsBtn=this.syncButton(this.annotationsBtn,e&&this.options.onAnnotationsToggle!==void 0,()=>{this.annotationsShown=t.annotations==="toggle-shown";const i=new y({variant:"outline",size:"icon",label:on(),icon:this.annotationsShown?g.annotations():g.annotationsOff(),onClick:()=>{this.flipAnnotations()}});return i.element.setAttribute("aria-pressed",String(this.annotationsShown)),i})}flipAnnotations(){this.annotationsShown=!this.annotationsShown,this.annotationsBtn?.element.setAttribute("aria-pressed",String(this.annotationsShown)),this.annotationsBtn?.setIcon(this.annotationsShown?g.annotations():g.annotationsOff()),this.options.onAnnotationsToggle?.(this.annotationsShown)}destroy(){document.removeEventListener("fullscreenchange",this.onFullscreenChange)}}const T=.5;class z{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=Vi(t,e,i);e.onChange(s=>{i.targetRotation=s.rotation-i.thetaOffset,i.targetTilt=s.tilt,i.targetZoom=s.zoom,ji(o,e,s)}),this.element.appendChild(z.buildZoom(o.zoomOut,o.zoomIn)),this.element.appendChild(z.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,u]of[[t,"up"],[e,"left"],[i,"center"],[o,"right"],[s,"down"]])a.element.classList.add(`vd-dpad-${u}`),r.appendChild(a.element);return r}}function Vi(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,u=t.limits?.maxRotate;return a!==void 0||u!==void 0?Math.max(a??-1/0,Math.min(u??1/0,r)):r},s=r=>{const a=t.limits?.minTilt,u=t.limits?.maxTilt;if(a!==void 0||u!==void 0){e.targetTilt=Math.max(a??0,Math.min(u??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 y({variant:"outline",size:"icon",label:Pn(),icon:g.zoomOut(),onClick:()=>{e.targetZoom=i(e.targetZoom-10),n.zoom(e.targetZoom).set()}}),zoomIn:new y({variant:"outline",size:"icon",label:Mn(),icon:g.zoomIn(),onClick:()=>{e.targetZoom=i(e.targetZoom+10),n.zoom(e.targetZoom).set()}}),tiltUp:new y({variant:"outline",size:"icon",label:Wn(),icon:g.tiltUp(),onClick:()=>{s(-15)}}),rotateLeft:new y({variant:"outline",size:"icon",label:Bn(),icon:g.rotateLeft(),onClick:()=>{e.targetRotation=o(e.targetRotation-15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),reset:new y({variant:"outline",size:"icon",label:Tn(),icon:g.reset(),onClick:()=>{e.thetaOffset=0,n.reset()}}),rotateRight:new y({variant:"outline",size:"icon",label:Hn(),icon:g.rotateRight(),onClick:()=>{e.targetRotation=o(e.targetRotation+15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),tiltDown:new y({variant:"outline",size:"icon",label:Xn(),icon:g.tiltDown(),onClick:()=>{s(15)}})}}function ji(n,t,e){const i=t.limits;i!==void 0&&(n.zoomOut.element.disabled=i.minZoom!==void 0&&e.zoom<=i.minZoom+T,n.zoomIn.element.disabled=i.maxZoom!==void 0&&e.zoom>=i.maxZoom-T,n.tiltUp.element.disabled=i.minTilt!==void 0&&e.tilt<=i.minTilt+T,n.tiltDown.element.disabled=i.maxTilt!==void 0&&e.tilt>=i.maxTilt-T,n.rotateLeft.element.disabled=i.minRotate!==void 0&&e.rotation<=i.minRotate+T,n.rotateRight.element.disabled=i.maxRotate!==void 0&&e.rotation>=i.maxRotate-T)}const x={SELECT:"ui:select",SELECTED:"ui:selected",FOCUS_CHANGE:"vd:focus-change",CONFIGURATION_CHANGE:"vd:configuration-change",CONFIGURATION_SUBMIT:"vd:configuration-submit"},Pt={mm:1,cm:10,m:1e3,in:25.4},ht=3;function Hi(n){const t=n.stepMm/Pt[n.displayUnit];for(let e=0;e<=ht;e++){const i=t*10**e;if(Math.abs(i-Math.round(i))<1e-9)return e}return ht}function qi(n,t,e){const i=Hi(t),o=n/Pt[t.displayUnit];return new Intl.NumberFormat(e,{minimumFractionDigits:i,maximumFractionDigits:i}).format(o)}function Gi(n,t,e,i,o,s,r){const a=p(),u=n.values.map(h=>qi(Number(h),t,a)),d=n.values.find(h=>e.getValue(n.name,h)?.isSelected===!0)??n.defaultValue,f=new Ii(n.values,{label:n.name,labels:u,unit:t.displayUnit,...d!==void 0&&{initialSelected:d}});return f.onSelect(h=>{o(n.name,h)}),f.onSettle(h=>{i.dispatch(x.SELECT,{attribute:n.name,value:h},!0).defaultPrevented||s(n.name,h)}),r(n.name,h=>{f.setSelected(h.value),i.dispatch(x.SELECTED,{attribute:n.name,value:h.value})}),{element:f.element,setSelectable:()=>{}}}const Zi=5;let Wi=0;function Q(n){const t=n.replace(/([A-Z])/g," $1").trim();return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function Yi(n,t,e,i,o,s){const r=document.createElement("div");r.className="vd-attribute",r.dataset.name=n.name;const a=document.createElement("span");a.className="vd-attribute-label",a.textContent=Q(n.name),a.id=`vd-attribute-label-${Wi++}`,r.appendChild(a),r.setAttribute("role","group"),r.setAttribute("aria-labelledby",a.id);const u=f=>{r.style.display=f?"none":""},d=n.dimension!==void 0?Gi(n,n.dimension,t,e,o,i,s):Qi(n,t,e,i,s);return r.appendChild(d.element),{element:r,setSelectable:d.setSelectable,setHidden:u}}function Qi(n,t,e,i,o){const s=n.values.find(u=>t.getValue(n.name,u)?.isSelected===!0),r=n.values.map(Q),a=n.values.length<=Zi?new Ti(n.values,s,r):new Ri(n.name,n.values,Q(n.name),s,r);return a.onSelect(u=>{e.dispatch(x.SELECT,{attribute:n.name,value:u},!0).defaultPrevented||i(n.name,u)}),o(n.name,u=>{a.setSelected(u.value),e.dispatch(x.SELECTED,{attribute:n.name,value:u.value})}),{element:a.element,setSelectable:u=>{a.setEnabled(u)}}}const Ki=80,Xi=2500;class Ji{constructor(t,e=Xi){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 y({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=to(t.price,t.currency),this.vatEl.textContent=pt(this.configuration.vatDisplay)}renderButton(){const t=this.configuration.submitEnabled;this.button.element.classList.toggle("vd-hidden",!t),t&&this.state==="idle"&&this.setButtonText(pt(this.configuration.buttonLabel))}async handleSubmit(){if(this.state!=="busy"){this.setState("busy",ni());try{await this.configuration.submit(),this.setState("success",ri())}catch{this.setState("failed",ui())}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 pt(n){return(n??"").slice(0,Ki)}function to(n,t){try{const e=new Intl.NumberFormat(p(),{style:"currency",currency:t}),i=e.resolvedOptions().maximumFractionDigits??2;return e.format(n/10**i)}catch{return`${t} ${(n/100).toFixed(2)}`}}class Ft{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 eo=572;class no{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 y({variant:"ghost",size:"icon-sm",label:kn(),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 y({variant:"outline",size:"icon",label:Sn(),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<eo)}),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 io{attach(t,e){}setVisible(t){}destroy(){}}const oo={"inframe-bottom-left":()=>new Ft,"sidebar-right":n=>new no(n),hidden:()=>new io};function so(n,t){return(oo[n??""]??(()=>new Ft))(t)}const G=w.fontFamily.sans.join(", "),Z=`
385
385
  position: absolute;
386
386
  display: flex;
387
387
  z-index: 10;
388
388
  transition: inset-inline-end 0.18s ease;
389
- `,es=`
389
+ `,ro=`
390
390
  /* Override browser's default black fullscreen backdrop */
391
391
  .vd-container:fullscreen {
392
392
  background: oklch(100% 0 0);
@@ -424,7 +424,7 @@
424
424
  display: flex;
425
425
  flex-direction: column;
426
426
  gap: ${l[1]};
427
- background: color-mix(in oklch, ${p.white} 85%, transparent);
427
+ background: color-mix(in oklch, ${m.white} 85%, transparent);
428
428
  backdrop-filter: blur(8px);
429
429
  border-radius: ${l[2]};
430
430
  padding: ${l[2]};
@@ -452,12 +452,12 @@
452
452
  display: flex;
453
453
  flex-direction: column;
454
454
  gap: ${l[3]};
455
- background: color-mix(in oklch, ${p.white} 85%, transparent);
455
+ background: color-mix(in oklch, ${m.white} 85%, transparent);
456
456
  backdrop-filter: blur(8px);
457
- border: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
457
+ border: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
458
458
  border-radius: ${l[3]};
459
459
  padding: ${l[3]};
460
- box-shadow: 0 ${l[1]} ${l[4]} color-mix(in oklch, ${p.neutral[900]} 6%, transparent);
460
+ box-shadow: 0 ${l[1]} ${l[4]} color-mix(in oklch, ${m.neutral[900]} 6%, transparent);
461
461
  font-family: ${G};
462
462
  }
463
463
 
@@ -471,7 +471,7 @@
471
471
  .vd-attribute-label {
472
472
  font-size: ${w.fontSize.xs};
473
473
  font-weight: ${w.fontWeight.medium};
474
- color: ${p.neutral[500]};
474
+ color: ${m.neutral[500]};
475
475
  text-transform: uppercase;
476
476
  letter-spacing: 0.05em;
477
477
  font-family: ${G};
@@ -510,10 +510,10 @@
510
510
  z-index: 11;
511
511
  display: flex;
512
512
  flex-direction: column;
513
- background: color-mix(in oklch, ${p.white} 90%, transparent);
513
+ background: color-mix(in oklch, ${m.white} 90%, transparent);
514
514
  backdrop-filter: blur(10px);
515
- border-inline-start: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
516
- box-shadow: -${l[1]} 0 ${l[4]} color-mix(in oklch, ${p.neutral[900]} 5%, transparent);
515
+ border-inline-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
516
+ box-shadow: -${l[1]} 0 ${l[4]} color-mix(in oklch, ${m.neutral[900]} 5%, transparent);
517
517
  }
518
518
 
519
519
  @media (prefers-reduced-motion: no-preference) {
@@ -555,7 +555,7 @@
555
555
  flex-direction: column;
556
556
  gap: ${l[2]};
557
557
  padding-block-start: ${l[3]};
558
- border-block-start: 1px solid color-mix(in oklch, ${p.neutral[900]} 8%, transparent);
558
+ border-block-start: 1px solid color-mix(in oklch, ${m.neutral[900]} 8%, transparent);
559
559
  font-family: ${G};
560
560
  }
561
561
 
@@ -568,12 +568,12 @@
568
568
  .vd-price {
569
569
  font-size: ${w.fontSize.lg};
570
570
  font-weight: ${w.fontWeight.semibold};
571
- color: ${p.neutral[900]};
571
+ color: ${m.neutral[900]};
572
572
  }
573
573
 
574
574
  .vd-vat {
575
575
  font-size: ${w.fontSize.xs};
576
- color: ${p.neutral[500]};
576
+ color: ${m.neutral[500]};
577
577
  }
578
578
 
579
579
  .vd-cta {
@@ -583,9 +583,9 @@
583
583
 
584
584
  /* Failed submit is the one place red belongs: a clear, recoverable error state. */
585
585
  .vd-commerce[data-submit="failed"] .vd-cta {
586
- background: ${p.semantic.error};
587
- border-color: ${p.semantic.error};
588
- color: ${p.white};
586
+ background: ${m.semantic.error};
587
+ border-color: ${m.semantic.error};
588
+ color: ${m.white};
589
589
  }
590
590
 
591
- `;function ts(){if(ze(),document.getElementById("vd-styles")!==null)return;const n=document.createElement("style");n.id="vd-styles",n.textContent=es,document.head.appendChild(n)}function ns(n,e){const t=document.createElement("a");t.href=`data:image/png;base64,${n}`,t.download=e,t.click()}class is{options;settings={};container=null;loading=null;slots={topRight:null,bottomRight:null};screenshotBtn=null;actionBar=null;cameraControls=null;attributes=null;groupHandles=new Map;lastSelectable=null;layout=null;commerce=null;constructor(e){this.options=e}attach(e){ts(),this.container=e,this.loading=new Mi(e),this.slots.topRight=this.createSlot(e,"vd-slot-top-right"),this.slots.bottomRight=this.createSlot(e,"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 e=typeof this.container.requestFullscreen=="function";this.actionBar=new zi({onAr:this.options.onAr,onFullscreen:e?()=>{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(e,t){this.loading?.updateProgress(e,t)}showError(e){this.loading?.showError(e)}applyViewerSettings(e){this.settings=e,e.language!==void 0&&Re(e.language,{reload:!1}),this.syncScreenshotButton(),this.actionBar?.applySettings(e),this.cameraControls!==null&&(this.cameraControls.element.style.display=e.cameraControls===!0?"flex":"none"),this.placeScreenshotButton()}renderAttributeControls(e,t){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(),t.length!==0)){this.attributes=document.createElement("div"),this.attributes.className="vd-attributes",this.groupHandles=new Map;for(const i of t){const s=ji(i,e,this.options.eventBus,this.options.onSelect,this.options.onSelectTransient,this.options.onSubscribe);this.groupHandles.set(i.name,s),this.attributes.appendChild(s.element)}this.commerce=new Zi(this.options.configuration),this.attributes.appendChild(this.commerce.element),this.layout=Ji(this.settings.configuratorLayout,this.slots.bottomRight),this.layout.attach(this.container,this.attributes),this.lastSelectable!==null&&this.applySelectable(this.lastSelectable)}}applySelectable(e){this.lastSelectable=e;for(const[t,i]of this.groupHandles){const s=e.find(o=>o.name===t);i.setSelectable(s?.selectable??null),i.setHidden(s?.hidden===!0)}}get viewerSettings(){return this.settings}teardownConfigurator(){this.commerce?.destroy(),this.commerce=null,this.attributes?.remove(),this.attributes=null,this.groupHandles=new Map,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 e of Object.values(this.slots))e?.remove();this.container=null}createSlot(e,t){const i=document.createElement("div");return i.className=t,e.appendChild(i),i}syncScreenshotButton(){const e=this.settings.screenshot===!0;e&&this.screenshotBtn===null&&(this.screenshotBtn=new v({variant:"outline",size:"icon",label:hn(),icon:b.screenshot(),onClick:()=>{this.options.snapshotApi.take("snapshot.png").onDeveloped(({data:t,filename:i})=>{ns(t,i)})}})),!e&&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 ss={};class os{defaultServer="https://server.virtualdisplay.io";options;serverHost;extraParams;constructor(e,t,i){this.options=e,this.serverHost=t,this.extraParams=i}create(){const e=this.createContainer(),t=this.createIframe();return e.appendChild(t),this.attachToParent(e),{container:e,iframe:t}}createContainer(){const e=document.createElement("div");return e.className="vd-container",Object.assign(e.style,{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),e}createIframe(){const e=document.createElement("iframe");return e.src=this.buildUrl(),e.setAttribute("allow","xr-spatial-tracking; fullscreen"),e}attachToParent(e){this.getParentElement().appendChild(e)}buildUrl(){const e=this.getServerUrl(),t=new URL(e);this.setAddressParams(t),this.options.language!==void 0&&t.searchParams.set("language",this.options.language),this.options.session!==void 0&&t.searchParams.set("session",this.options.session),this.options.debug===!0&&t.searchParams.set("debug","true"),this.options.traceparent!==void 0&&t.searchParams.set("traceparent",this.options.traceparent);for(const[i,s]of Object.entries(this.extraParams??{}))t.searchParams.set(i,s);return t.toString()}setAddressParams(e){if(this.options.app===void 0){e.searchParams.set("license",this.options.license),e.searchParams.set("model",this.options.model);return}e.searchParams.set("app",this.options.app),(this.options.license!==void 0||this.options.model!==void 0)&&exports.logger.warn("Both `app` and `license`/`model` were supplied: `app` wins, the pair was ignored")}getServerUrl(){if(this.serverHost!==void 0)return this.serverHost;if(ss?.VITE_VIRTUALDISPLAY_SERVER_HOST===void 0)return this.defaultServer}getParentElement(){if(typeof this.options.parent!="string")return this.options.parent;const e=document.querySelector(this.options.parent);if(e===null)throw g.parentNotFound(this.options.parent);return e}}function rs(n){const{messenger:e}=n;e.on(c.HANDSHAKE,t=>{Ve(t)&&(exports.logger.info("Server handshake received, flushing publisher queue"),e.markReady())}),e.on(c.SESSION,t=>{je(t)&&n.onSession(t.sessionId)}),e.on(c.MUTATION,t=>{qe(t)&&(n.attributes.handleMutationResult(t),n.configuration.handleSelectionChanged(n.attributes.getSelection()))}),e.on(c.SNAPSHOT,t=>{Ge(t)&&n.snapshot.handleSnapshotResult(t)}),e.on(c.CAMERA,t=>{Ze(t)&&n.cameraPosition.handlePositionUpdate(t)}),e.on(c.LOADING_INDICATOR,t=>{Ye(t)&&(t.error!==void 0?n.ui.showError(t.error):n.ui.updateProgress(t.progress,t.phase))}),e.on(c.CONFIG,t=>{Xe(t)&&n.applyConfig(t)}),e.on(c.MAPPING,t=>{We(t)&&(n.attributes.handleMappingReceived(t),n.configuration.handleSelectionChanged(n.attributes.getSelection()),n.ui.renderAttributeControls(n.attributes,t.attributes),n.readyStateTracker.handleMappingReceived())}),as(n)}function as(n){const{messenger:e}=n;e.on(c.FOCUS,t=>{Je(t)&&n.focus.handleStateReceived(t)}),e.on(c.PRICING,t=>{et(t)&&n.configuration.handlePricingReceived(t.pricing)}),e.on(c.SYNC,t=>{Qe(t)&&n.onSync(t.connected)}),e.on(c.SELECTABLE,t=>{Ke(t)&&(n.selectable.handleSnapshot(t),n.ui.applySelectable(t.attributes))}),e.on(c.APP_RESOLVED,t=>{He(t)&&n.onAppResolved(t)})}class ls{ready=!1;onReady;constructor(e){this.onReady=e}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}}function cs(n){if(n===void 0)return;const{annotations:e,...t}=n;return e===void 0?t:e===!0?{...t,annotations:"show"}:e===!1?{...t,annotations:"hide"}:{...t,annotations:e}}class us{attributes;selectableState;readyStateTracker;messenger;cameraApi;cameraPositionApi;focusApi;configurationApi;snapshotApi;annotationsApi;eventBus;ui;options;serverHost;iframeParams;arActivation;syncTracker;iframe;container;readyCallbacks=[];mutationFailedCallbacks=[];viewerSessionId;resolvedApp;appResolvedCallbacks=[];constructor(e,t){this.options=e;const i=t??{};this.serverHost=i.serverHost,this.iframeParams=i.iframeParams,this.initializeLogging(),this.messenger=new tt(()=>this.iframe?.contentWindow??null,i.messengerOptions);const s=o=>{this.messenger.send(o)};this.attributes=new yt(s,P,(o,r)=>{this.notifyMutationFailed(o,r)}),this.selectableState=new St,this.snapshotApi=new xe(s),this.annotationsApi=new pe(s,P),this.cameraApi=new ke(s),this.cameraPositionApi=new wt,this.focusApi=new Ae(s,o=>{this.dispatchFocusChange(o)},P),this.configurationApi=new _e(o=>{this.dispatchConfigurationChange(o)},o=>{this.dispatchConfigurationSubmit(o)}),this.eventBus=new _t,this.arActivation=i.createArActivation?.(s),this.syncTracker=i.createSyncTracker?.(),this.readyStateTracker=new ls(()=>{this.notifyReady()}),this.ui=this.createStandardInterface(),this.wireIncomingMessages(),i.registerHandlers?.(this.messenger,s),this.messenger.start(),this.createAndConnectIframe()}createStandardInterface(){const e=this.arActivation;return new is({snapshotApi:this.snapshotApi,cameraApi:this.cameraApi,cameraPositionApi:this.cameraPositionApi,eventBus:this.eventBus,configuration:this.configurationApi,onSelect:(t,i)=>this.attributes.select(t,i),onSelectTransient:(t,i)=>this.attributes.selectTransient(t,i),onSubscribe:(t,i)=>this.attributes.onChange(t,i),...e!==void 0&&{onAr:()=>{e.activate()}},onFullscreenEnter:()=>{this.trackFullscreen()}})}wireIncomingMessages(){rs({messenger:this.messenger,attributes:this.attributes,selectable:this.selectableState,configuration:this.configurationApi,snapshot:this.snapshotApi,cameraPosition:this.cameraPositionApi,focus:this.focusApi,ui:this.ui,readyStateTracker:this.readyStateTracker,applyConfig:e=>{this.handleConfig(e)},onSession:e=>{this.handleSession(e)},onSync:e=>{this.syncTracker?.handleSync(e)},onAppResolved:e=>{this.handleAppResolved({appType:e.appType,name:e.name,...e.slug!==void 0&&{slug:e.slug},...e.submit!==void 0&&{submit:e.submit}})}})}handleAppResolved(e){this.resolvedApp=e;for(const t of this.appResolvedCallbacks)t(e)}handleSession(e){this.viewerSessionId=e,this.arActivation?.onSession(e)}notifyMutationFailed(e,t){for(const i of this.mutationFailedCallbacks)i({attribute:e,value:t})}notifyReady(){const e=this.readyCallbacks;this.readyCallbacks=[];for(const t of e)t(this);this.ui.onReady()}dispatchFocusChange(e){this.container?.dispatchEvent(new CustomEvent(x.FOCUS_CHANGE,{detail:e,bubbles:!0}))}dispatchConfigurationChange(e){this.container?.dispatchEvent(new CustomEvent(x.CONFIGURATION_CHANGE,{detail:e??null,bubbles:!0}))}dispatchConfigurationSubmit(e){this.container?.dispatchEvent(new CustomEvent(x.CONFIGURATION_SUBMIT,{detail:e,bubbles:!0}))}handleConfig(e){const t=e.viewerSettings,i=cs(this.options.viewerSettings);if(t!==void 0||i!==void 0){const s=i!==void 0?{...t??{},...i}:t;if(i!==void 0&&t!==void 0){const o=Object.entries(i).filter(([r,a])=>t[r]!==a).map(([r,a])=>`${r} (metadata: ${t[r]??"undefined"}, override: ${a})`);o.length>0&&exports.logger.warn(`Viewer settings override active: ${o.join(", ")}`)}this.ui.applyViewerSettings(s),this.echoAnnotationsDifference(t?.annotations,s.annotations)}this.cameraPositionApi.applyLimits(e.cameraLimits)}echoAnnotationsDifference(e,t){t===void 0||t===e||this.annotationsApi.setEnabled(t==="show"||t==="toggle-shown")}trackFullscreen(){this.messenger.send({type:c.FULLSCREEN})}initializeLogging(){this.options.debug===!0&&Ce(),exports.logger.info("Initializing Virtualdisplay client",{...this.options.app===void 0?{model:this.options.model}:{app:this.options.app}})}createAndConnectIframe(){const t=new os(this.options,this.serverHost,this.iframeParams).create();this.container=t.container,this.iframe=t.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(e,t){this.attributes.select(e,t)}getValues(e){return this.attributes.getValues(e)}getValue(e,t){return this.attributes.getValue(e,t)}onChange(e,t){this.attributes.onChange(e,t)}getAttribute(e){return this.attributes.getAttribute(e)}get isReady(){return this.readyStateTracker.isReady}onReady(e){if(this.readyStateTracker.isReady){e(this);return}this.readyCallbacks.push(e)}onMutationFailed(e){this.mutationFailedCallbacks.push(e)}onSelectableChange(e){this.selectableState.onChange(e)}onAppResolved(e){this.appResolvedCallbacks.push(e),this.resolvedApp!==void 0&&e(this.resolvedApp)}getSelectable(e){return this.selectableState.selectableFor(e)}activateAr(){this.arActivation?.activate()}on(e,t){this.eventBus.on(e,t)}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 ds="ar.virtualdisplay.io";function hs(n){const e=new URL(`https://${ds}/go`);return n.sessionId!==void 0?e.searchParams.set("session",n.sessionId):n.app!==void 0?e.searchParams.set("app",n.app):n.license!==void 0&&n.model!==void 0&&(e.searchParams.set("license",n.license),e.searchParams.set("model",n.model)),e.toString()}const ms=1500;class ps{options;qrModal=new Ti;sessionId;waiters=[];pendingTimers=new Set;destroyed=!1;constructor(e){this.options=e}onSession(e){this.sessionId=e;const t=this.waiters;this.waiters=[];for(const i of t)i(e)}activate(){if(gt()){this.options.send({type:c.AR_ACTIVATE});return}this.showQrCode()}destroy(){this.destroyed=!0;for(const e of this.pendingTimers)clearTimeout(e);this.pendingTimers.clear(),this.waiters=[],this.qrModal.hide()}async showQrCode(){this.qrModal.show();const e=await this.waitForSessionId();if(this.destroyed)return;const t=hs({sessionId:e,app:this.options.app,license:this.options.license,model:this.options.model}),i=await this.qrModal.update(t);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(e=>{const t=setTimeout(()=>{this.pendingTimers.delete(t),e(void 0)},ms);this.pendingTimers.add(t),this.waiters.push(i=>{this.pendingTimers.delete(t),clearTimeout(t),e(i)})})}}class fs{callbacks=[];lastKnown;handleSync(e){this.lastKnown=e;for(const t of this.callbacks)t(e)}onChange(e){this.callbacks.push(e),this.lastKnown!==void 0&&e(this.lastKnown)}}class gs extends us{syncStatusTracker;constructor(e){const t=new fs;super(e,{createArActivation:i=>new ps({app:e.app,license:e.license,model:e.model,send:i}),createSyncTracker:()=>t}),this.syncStatusTracker=t}onSyncChange(e){this.syncStatusTracker.onChange(e)}}exports.Annotations=pe;exports.Attribute=ge;exports.AttributeValue=fe;exports.Camera=ke;exports.Configuration=_e;exports.ERROR_CODES=k;exports.Focus=Ae;exports.Photo=Ee;exports.Snapshot=xe;exports.VD_EVENTS=x;exports.VirtualdisplayClient=gs;exports.VirtualdisplayError=g;exports.enableDebugMode=Ce;exports.isDebugMode=vt;
591
+ `;function ao(){if(zt(),document.getElementById("vd-styles")!==null)return;const n=document.createElement("style");n.id="vd-styles",n.textContent=ro,document.head.appendChild(n)}function lo(n,t){const e=document.createElement("a");e.href=`data:image/png;base64,${n}`,e.download=t,e.click()}class co{options;settings={};container=null;loading=null;slots={topRight:null,bottomRight:null};screenshotBtn=null;actionBar=null;cameraControls=null;attributes=null;groupHandles=new Map;lastSelectable=null;layout=null;commerce=null;constructor(t){this.options=t}attach(t){ao(),this.container=t,this.loading=new Bi(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 Ui({onAr:this.options.onAr,onFullscreen:t?()=>{this.toggleFullscreen()}:void 0,onAnnotationsToggle:this.options.onAnnotationsToggle}),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&&Rt(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 z(this.options.cameraApi,this.options.cameraPositionApi),this.cameraControls.element.style.display="none",this.slots.topRight.appendChild(this.cameraControls.element)),this.placeScreenshotButton(),e.length!==0)){this.attributes=document.createElement("div"),this.attributes.className="vd-attributes",this.groupHandles=new Map;for(const i of e){const o=Yi(i,t,this.options.eventBus,this.options.onSelect,this.options.onSelectTransient,this.options.onSubscribe);this.groupHandles.set(i.name,o),this.attributes.appendChild(o.element)}this.commerce=new Ji(this.options.configuration),this.attributes.appendChild(this.commerce.element),this.layout=so(this.settings.configuratorLayout,this.slots.bottomRight),this.layout.attach(this.container,this.attributes),this.lastSelectable!==null&&this.applySelectable(this.lastSelectable)}}applySelectable(t){this.lastSelectable=t;for(const[e,i]of this.groupHandles){const o=t.find(s=>s.name===e);i.setSelectable(o?.selectable??null),i.setHidden(o?.hidden===!0)}}get viewerSettings(){return this.settings}teardownConfigurator(){this.commerce?.destroy(),this.commerce=null,this.attributes?.remove(),this.attributes=null,this.groupHandles=new Map,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 y({variant:"outline",size:"icon",label:gn(),icon:g.screenshot(),onClick:()=>{this.options.snapshotApi.take("snapshot.png").onDeveloped(({data:e,filename:i})=>{lo(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 uo={};class ho{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);this.setAddressParams(e),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()}setAddressParams(t){if(this.options.app===void 0){t.searchParams.set("license",this.options.license),t.searchParams.set("model",this.options.model);return}t.searchParams.set("app",this.options.app),(this.options.license!==void 0||this.options.model!==void 0)&&exports.logger.warn("Both `app` and `license`/`model` were supplied: `app` wins, the pair was ignored")}getServerUrl(){if(this.serverHost!==void 0)return this.serverHost;if(uo?.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 b.parentNotFound(this.options.parent);return t}}function po(n){const{messenger:t}=n;t.on(c.HANDSHAKE,e=>{Vt(e)&&(exports.logger.info("Server handshake received, flushing publisher queue"),t.markReady())}),t.on(c.SESSION,e=>{jt(e)&&n.onSession(e.sessionId)}),t.on(c.MUTATION,e=>{qt(e)&&(n.attributes.handleMutationResult(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()))}),t.on(c.SNAPSHOT,e=>{Gt(e)&&n.snapshot.handleSnapshotResult(e)}),t.on(c.CAMERA,e=>{Zt(e)&&n.cameraPosition.handlePositionUpdate(e)}),t.on(c.LOADING_INDICATOR,e=>{Yt(e)&&(e.error!==void 0?n.ui.showError(e.error):n.ui.updateProgress(e.progress,e.phase))}),t.on(c.CONFIG,e=>{Xt(e)&&n.applyConfig(e)}),t.on(c.MAPPING,e=>{Wt(e)&&(n.attributes.handleMappingReceived(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()),n.ui.renderAttributeControls(n.attributes,e.attributes),n.readyStateTracker.handleMappingReceived())}),mo(n)}function mo(n){const{messenger:t}=n;t.on(c.FOCUS,e=>{Jt(e)&&n.focus.handleStateReceived(e)}),t.on(c.PRICING,e=>{te(e)&&n.configuration.handlePricingReceived(e.pricing)}),t.on(c.SYNC,e=>{Qt(e)&&n.onSync(e.connected)}),t.on(c.SELECTABLE,e=>{Kt(e)&&(n.selectable.handleSnapshot(e),n.ui.applySelectable(e.attributes))}),t.on(c.APP_RESOLVED,e=>{Ht(e)&&n.onAppResolved(e)})}class fo{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}}function go(n){if(n===void 0)return;const{annotations:t,...e}=n;return t===void 0?e:t===!0?{...e,annotations:"show"}:t===!1?{...e,annotations:"hide"}:{...e,annotations:t}}class bo{attributes;selectableState;readyStateTracker;messenger;cameraApi;cameraPositionApi;focusApi;configurationApi;snapshotApi;annotationsApi;eventBus;ui;options;serverHost;iframeParams;arActivation;syncTracker;iframe;container;readyCallbacks=[];mutationFailedCallbacks=[];viewerSessionId;resolvedApp;appResolvedCallbacks=[];constructor(t,e){this.options=t;const i=e??{};this.serverHost=i.serverHost,this.iframeParams=i.iframeParams,this.initializeLogging(),this.messenger=new ee(()=>this.iframe?.contentWindow??null,i.messengerOptions);const o=s=>{this.messenger.send(s)};this.attributes=new ye(o,O,(s,r)=>{this.notifyMutationFailed(s,r)}),this.selectableState=new Se,this.snapshotApi=new xt(o),this.annotationsApi=new mt(o,O),this.cameraApi=new _t(o),this.cameraPositionApi=new we,this.focusApi=new At(o,s=>{this.dispatchFocusChange(s)},O),this.configurationApi=new kt(s=>{this.dispatchConfigurationChange(s)},s=>{this.dispatchConfigurationSubmit(s)}),this.eventBus=new ke,this.arActivation=i.createArActivation?.(o),this.syncTracker=i.createSyncTracker?.(),this.readyStateTracker=new fo(()=>{this.notifyReady()}),this.ui=this.createStandardInterface(),this.wireIncomingMessages(),i.registerHandlers?.(this.messenger,o),this.messenger.start(),this.createAndConnectIframe()}createStandardInterface(){const t=this.arActivation;return new co({snapshotApi:this.snapshotApi,cameraApi:this.cameraApi,cameraPositionApi:this.cameraPositionApi,eventBus:this.eventBus,configuration:this.configurationApi,onSelect:(e,i)=>this.attributes.select(e,i),onSelectTransient:(e,i)=>this.attributes.selectTransient(e,i),onSubscribe:(e,i)=>this.attributes.onChange(e,i),...t!==void 0&&{onAr:()=>{t.activate()}},onFullscreenEnter:()=>{this.trackFullscreen()},onAnnotationsToggle:e=>{this.sendControlAnnotationToggle(e)}})}sendControlAnnotationToggle(t){this.messenger.send({type:c.ANNOTATION_TOGGLE,instance:O,enabled:t,origin:"control"})}wireIncomingMessages(){po({messenger:this.messenger,attributes:this.attributes,selectable:this.selectableState,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)},onAppResolved:t=>{this.handleAppResolved({appType:t.appType,name:t.name,...t.slug!==void 0&&{slug:t.slug},...t.submit!==void 0&&{submit:t.submit}})}})}handleAppResolved(t){this.resolvedApp=t;for(const e of this.appResolvedCallbacks)e(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(x.FOCUS_CHANGE,{detail:t,bubbles:!0}))}dispatchConfigurationChange(t){this.container?.dispatchEvent(new CustomEvent(x.CONFIGURATION_CHANGE,{detail:t??null,bubbles:!0}))}dispatchConfigurationSubmit(t){this.container?.dispatchEvent(new CustomEvent(x.CONFIGURATION_SUBMIT,{detail:t,bubbles:!0}))}handleConfig(t){const e=t.viewerSettings,i=go(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.echoAnnotationsDifference(e?.annotations,o.annotations)}this.cameraPositionApi.applyLimits(t.cameraLimits)}echoAnnotationsDifference(t,e){e===void 0||e===t||this.annotationsApi.setEnabled(e==="show"||e==="toggle-shown")}trackFullscreen(){this.messenger.send({type:c.FULLSCREEN})}initializeLogging(){this.options.debug===!0&&Ct(),exports.logger.info("Initializing Virtualdisplay client",{...this.options.app===void 0?{model:this.options.model}:{app:this.options.app}})}createAndConnectIframe(){const e=new ho(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)}onSelectableChange(t){this.selectableState.onChange(t)}onAppResolved(t){this.appResolvedCallbacks.push(t),this.resolvedApp!==void 0&&t(this.resolvedApp)}getSelectable(t){return this.selectableState.selectableFor(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 vo="ar.virtualdisplay.io";function yo(n){const t=new URL(`https://${vo}/go`);return n.sessionId!==void 0?t.searchParams.set("session",n.sessionId):n.app!==void 0?t.searchParams.set("app",n.app):n.license!==void 0&&n.model!==void 0&&(t.searchParams.set("license",n.license),t.searchParams.set("model",n.model)),t.toString()}const So=1500;class wo{options;qrModal=new Ni;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(ge()){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=yo({sessionId:t,app:this.options.app,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 Co{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 _o extends bo{syncStatusTracker;constructor(t){const e=new Co;super(t,{createArActivation:i=>new wo({app:t.app,license:t.license,model:t.model,send:i}),createSyncTracker:()=>e}),this.syncStatusTracker=e}onSyncChange(t){this.syncStatusTracker.onChange(t)}}exports.Annotations=mt;exports.Attribute=gt;exports.AttributeValue=ft;exports.Camera=_t;exports.Configuration=kt;exports.ERROR_CODES=_;exports.Focus=At;exports.Photo=Et;exports.Snapshot=xt;exports.VD_EVENTS=x;exports.VirtualdisplayClient=_o;exports.VirtualdisplayError=b;exports.enableDebugMode=Ct;exports.isDebugMode=ve;