@virtualdisplay.io/client 4.0.0-alpha.2 → 4.0.0-alpha.20
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 +138 -0
- package/README.md +85 -158
- package/dist/browser-DfB_An57.cjs +8 -0
- package/dist/browser-ey6Iih3j.js +1540 -0
- package/dist/index.d.ts +1026 -1
- package/dist/virtualdisplay.client.cjs.js +461 -1
- package/dist/virtualdisplay.client.es.js +3370 -794
- package/dist/virtualdisplay.client.umd.js +468 -1
- package/package.json +1 -1
|
@@ -1 +1,468 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.VirtualdisplayClient={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t={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`},n=class e extends Error{code;constructor(t,n){super(t),this.name=`VirtualdisplayError`,this.code=n,Error.captureStackTrace!==void 0&&Error.captureStackTrace(this,e)}static noMapping(){return new e(`No attributes available. Waiting for server metadata.`,t.NO_MAPPING)}static attributeNotFound(n){return new e(`Attribute "${n}" not found in mapping`,t.ATTRIBUTE_NOT_FOUND)}static valueNotFound(n,r){return new e(`Value "${r}" not found for attribute "${n}"`,t.VALUE_NOT_FOUND)}static parentNotFound(n){return new e(`Parent element not found: ${n}`,t.PARENT_NOT_FOUND)}static invalidParameter(n){return new e(n,t.INVALID_PARAMETER)}static snapshotFailed(n,r){return new e(`Snapshot failed for "${n}": ${r}`,t.SNAPSHOT_FAILED)}},r=class{defaultServer=`https://server.virtualdisplay.io`;options;constructor(e){this.options=e}create(){let e=this.createIframe();return this.attachToParent(e),e}createIframe(){let e=document.createElement(`iframe`);return e.src=this.buildUrl(),Object.assign(e.style,{width:`100%`,height:`100%`,border:`none`}),e.setAttribute(`allow`,`xr-spatial-tracking; fullscreen`),e}attachToParent(e){this.getParentElement().appendChild(e)}buildUrl(){let e=this.getServerUrl(),t=new URL(e);return t.searchParams.set(`license`,this.options.license),t.searchParams.set(`model`,this.options.model),this.options.debug===!0&&t.searchParams.set(`debug`,`true`),this.options.language!==void 0&&t.searchParams.set(`language`,this.options.language),t.toString()}getServerUrl(){return this.defaultServer}getParentElement(){if(typeof this.options.parent!=`string`)return this.options.parent;let e=document.querySelector(this.options.parent);if(e===null)throw n.parentNotFound(this.options.parent);return e}};function i(e){let t=new Date(e.timestamp).toLocaleTimeString(`en-GB`,{hour12:!1}),n=e.level.toUpperCase().padEnd(5),r=e.trace_id?.slice(0,8)??`--------`,i=e.msg,a=[`timestamp`,`level`,`msg`,`service`,`trace_id`,`span_id`],o=Object.entries(e).filter(([e])=>!a.includes(e)).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(` `);return`${t} ${n} [${r}] ${i}${o?` `+o:``}`}function a(e){return JSON.stringify(e)}function o(e,t){let n=t?i(e):a(e);e.level===`error`?console.error(n):e.level===`warn`?console.warn(n):console.log(n)}function s(){return new Date}function c(e){return e.toISOString()}var l=class e{constructor(e){this.config=e}log(e,t,n={}){let r=this.config.traceProvider?.()??{};o({timestamp:c(s()),level:e,msg:t,service:this.config.service,...r,...n},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)}with(t){let n=new e(this.config);return n.log=((e,n,r={})=>{this.log(e,n,{...t,...r})}).bind(this),n}};function u(e,t){return new l({service:e,isDev:t?.isDev===void 0?typeof process<`u`?process.env.NODE_ENV!==`production`:!0:t.isDev,traceProvider:t?.traceProvider})}function d(e){if(e!==void 0)return typeof e==`object`&&e&&!Array.isArray(e)&&!(e instanceof Error)?e:e instanceof Error?{error:e.message}:{value:e}}function f(e){return{debug:(t,n)=>e.debug(t,d(n)),info:(t,n)=>e.info(t,d(n)),warn:(t,n)=>e.warn(t,d(n)),error:(t,n)=>e.error(t,d(n))}}var p=!1,m=f(u(`client`,{isDev:!1}));function h(){p=!0,m=f(u(`client`,{isDev:!0}))}function g(){return p}var _=class{ready=!1;onReady;constructor(e){this.onReady=e}handleMappingReceived(){this.markReady(`Mapping received from server`)}handleMutationResult(e){e.isInitial&&this.markReady(`Initial mutations processed`)}get isReady(){return this.ready}clear(){this.ready=!1}markReady(e){this.ready||(this.ready=!0,m.info(`${e} - client is now ready`),this.onReady?.())}},v=class{isSelectedValue=!1;constructor(e,t){this.value=e,this.attribute=t}get isSelected(){return this.isSelectedValue}setSelected(e){this.isSelectedValue=e}},y=class{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 n.valueNotFound(this.name,e);this.onSelect(this.name,e)}getValues(){return Array.from(this.values.values())}getValue(e){return this.values.get(e)}onChange(e){this.onChangeCallback=e}handleResult(e){let t;for(let n of this.values.values()){let r=n.value===e;n.setSelected(r),r&&(t=n)}t!==void 0&&this.onChangeCallback!==void 0&&this.onChangeCallback(t)}createValues(e){let t=new Map;for(let n of e){let e=new v(n,this.name);n===this.defaultValue&&e.setSelected(!0),t.set(n,e)}return t}},b=class{attributes=new Map;constructor(e,t,n){for(let n of e){let e=this.buildOptions(n,t);this.attributes.set(n.name,new y(e))}this.onMutationFailed=n}onMutationFailed;get(e){return this.attributes.get(e)}defaults(){let e=[];for(let t of this.attributes.values())t.defaultValue!==void 0&&e.push({name:t.name,value:t.defaultValue});return e}handleResults(e){for(let t of e){if(!t.success){this.onMutationFailed?.(t.name,t.value);continue}this.get(t.name)?.handleResult(t.value)}}buildOptions(e,t){let n={name:e.name,values:e.values,onSelect:(e,n)=>{t([{name:e,value:n}],!1)}};return e.defaultValue===void 0?n:{...n,defaultValue:e.defaultValue}}},x={READY:`ready`,MUTATION:`mutation`,STATE:`state`,CONFIG:`config`,CAMERA:`camera`,SNAPSHOT:`snapshot`,MAPPING:`mapping`},S=new Set(Object.values(x));function C(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.target==`string`?!1:typeof t.type==`string`&&S.has(t.type)}function w(e){let t=k(e);return t!==null&&t.type===x.READY}function T(e){let t=k(e);return t!==null&&t.type===x.MUTATION&&Array.isArray(t.results)}function E(e){let t=k(e);return t!==null&&t.type===x.SNAPSHOT&&(`data`in t||`error`in t)}function D(e){let t=k(e);return t!==null&&t.type===x.CAMERA&&Array.isArray(t.transforms)}function O(e){let t=k(e);return t!==null&&t.type===x.MAPPING&&Array.isArray(t.attributes)}function k(e){return typeof e!=`object`||!e?null:e}var A=class{pending=[];isReady=!1;constructor(e){this.processor=e}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;let e=[...this.pending];this.pending.length=0;for(let 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}},j=class{handlers=new Map;publisher;consumer;shouldBuffer;listener=null;sourceId;constructor(e,t){this.getTarget=e,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.publisher=new A(e=>this.post(e)),this.consumer=new A(e=>this.routeToHandler(e)),this.shouldBuffer=t?.shouldBuffer??null,t?.bufferIncoming!==!0&&this.consumer.markReady()}on(e,t){this.handlers.set(e,t)}off(e){this.handlers.delete(e)}send(e){this.publisher.enqueue(e)}markReady(){this.publisher.markReady()}markConsumerReady(){this.consumer.markReady()}consumerHasPending(e){return this.consumer.hasPending(e)}start(){this.listener===null&&(this.listener=e=>{let{data:t}=e;if(!C(t)||t._source===this.sourceId)return;let n=t;if(this.shouldBuffer!==null&&!this.shouldBuffer(n)){this.routeToHandler(n);return}this.consumer.enqueue(n)},window.addEventListener(`message`,this.listener))}destroy(){this.listener!==null&&(window.removeEventListener(`message`,this.listener),this.listener=null),this.publisher.clear(),this.consumer.clear(),this.handlers.clear()}get ready(){return this.publisher.ready}get pendingCount(){return this.publisher.pendingCount}post(e){let t=this.getTarget();t!==null&&t.postMessage({...e,_source:this.sourceId},`*`)}routeToHandler(e){let t=this.handlers.get(e.type);if(t===void 0)return;let n=t(e);n instanceof Promise&&n.catch(t=>{let n=t instanceof Error?t.message:String(t);console.error(`Virtualdisplay: error handling ${e.type}: ${n}`)})}};new Set([x.CAMERA]);var M=class{registry;pendingCallbacks=[];constructor(e,t){this.send=e,this.onMutationFailed=t}handleMappingReceived(e){m.debug(`Initializing from server mapping`,{attributeCount:e.attributes.length}),this.registry=new b(e.attributes,(e,t)=>this.sendMutation(e,t),this.onMutationFailed);let t=this.registry.defaults();t.length>0&&this.sendMutation(t,!0),this.replayPendingCallbacks()}handleMutationResult(e){this.registry?.handleResults(e.results)}select(e,t){this.sendMutation([{name:e,value:t}],!1)}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}let n=this.registry.get(e);if(n===void 0){m.warn(`onChange: attribute "${e}" not found — callback will not fire`);return}n.onChange(t)}getAttribute(e){return this.registry?.get(e)}get hasMapping(){return this.registry!==void 0}sendMutation(e,t){let n={type:x.MUTATION,mutations:e,isInitial:t};this.send(n)}replayPendingCallbacks(){for(let{name:e,callback:t}of this.pendingCallbacks){let n=this.registry?.get(e);n===void 0&&m.warn(`onChange: attribute "${e}" not found — buffered callback will not fire`),n?.onChange(t)}this.pendingCallbacks.length=0}},N=class{commands=[];constructor(e){this.send=e}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 n.invalidParameter(`No camera commands to execute. Call rotate(), tilt(), or zoom() before set().`);let e={type:x.CAMERA,commands:this.commands};this.send(e),this.commands=[]}validateFiniteNumber(e,t){if(!Number.isFinite(e))throw n.invalidParameter(`${t}() requires a finite number, got ${String(e)}`)}reset(){let e={type:x.CAMERA,commands:[{action:`reset`}]};this.send(e)}},P=class{state;changeCallbacks=[];constructor(){this.state={rotation:0,tilt:0,zoom:0}}get rotation(){return this.state.rotation}get tilt(){return this.state.tilt}get zoom(){return this.state.zoom}onChange(e){this.changeCallbacks.push(e)}handlePositionUpdate(e){this.update(e.transforms)}update(e){let t=!1;for(let n of e)switch(n.type){case`rotation`:this.state.rotation=n.value,t=!0;break;case`tilt`:this.state.tilt=n.value,t=!0;break;case`zoom`:this.state.zoom=n.value,t=!0;break;default:break}if(t){let e={rotation:this.rotation,tilt:this.tilt,zoom:this.zoom};for(let t of this.changeCallbacks)t(e)}}},F=class{developedCallbacks=new Set;errorCallbacks=new Set;developed=!1;failed=!1;photoData=null;constructor(e){this.filename=e}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(e=>{e(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())}},I=class{validExtensions=[`.png`];pendingPhotos=new Map;constructor(e){this.send=e}take(e){this.validateFilename(e),m.debug(`Taking snapshot`,{filename:e});let t=new F(e);return this.pendingPhotos.set(t.getFilename(),t),this.send({type:x.SNAPSHOT,filename:e}),t}handleSnapshotResult(e){let r=this.pendingPhotos.get(e.filename);if(r===void 0){m.warn(`No pending photo found for filename`,{filename:e.filename,pendingFilenames:Array.from(this.pendingPhotos.keys())});return}if(this.pendingPhotos.delete(e.filename),e.error!==void 0){r.fail(new n(e.error,t.SNAPSHOT_FAILED));return}e.data!==void 0&&r.develop({filename:e.filename,data:e.data})}validateFilename(e){if(e===``||typeof e!=`string`)throw new n(`Filename must be a non-empty string`,t.INVALID_PARAMETER);if(!this.validExtensions.some(t=>e.toLowerCase().endsWith(t)))throw new n(`Invalid filename: "${e}". Filename must end with one of: ${this.validExtensions.join(`, `)}`,t.INVALID_PARAMETER);if(e.includes(`..`)||e.includes(`/`)||e.includes(`\\`))throw new n(`Filename cannot contain path separators or ".."`,t.INVALID_PARAMETER)}},L=class{send;constructor(e){this.send=e}sendInitialConfig(e){let t=this.buildUIConfig(e),n=this.buildViewerConfig(t,e.camera);n!==void 0&&this.sendConfig(n)}buildUIConfig(e){let t=this.extractUIValues(e);if(Object.values(t).some(e=>e!==void 0))return{...t.arEnabled!==void 0&&{arEnabled:t.arEnabled},...t.fullscreenEnabled!==void 0&&{fullscreenEnabled:t.fullscreenEnabled},...t.loadingIndicatorEnabled!==void 0&&{loadingIndicatorEnabled:t.loadingIndicatorEnabled}}}extractUIValues(e){return{arEnabled:e.arEnabled??e.ui?.arEnabled,fullscreenEnabled:e.fullscreenEnabled??e.ui?.fullscreenEnabled,loadingIndicatorEnabled:e.loadingIndicatorEnabled??e.ui?.loadingIndicatorEnabled}}buildViewerConfig(e,t){if(!(e===void 0&&t===void 0))return{...e!==void 0&&{ui:e},...t!==void 0&&{camera:t}}}setArEnabled(e){m.debug(`Setting AR button enabled: ${e}`),this.updateUIConfig({arEnabled:e})}setFullscreenEnabled(e){m.debug(`Setting fullscreen button enabled: ${e}`),this.updateUIConfig({fullscreenEnabled:e})}setLoadingIndicatorEnabled(e){m.debug(`Setting loading indicator enabled: ${e}`),this.updateUIConfig({loadingIndicatorEnabled:e})}updateUIConfig(e){m.debug(`Updating UI configuration`,e),Object.keys(e).length>0&&this.sendConfig({ui:e})}hideAllUI(){m.debug(`Hiding all UI elements`),this.sendUIConfig({arEnabled:!1,fullscreenEnabled:!1,loadingIndicatorEnabled:!1})}showAllUI(){m.debug(`Showing all UI elements`),this.sendUIConfig({arEnabled:!0,fullscreenEnabled:!0,loadingIndicatorEnabled:!0})}sendUIConfig(e){this.sendConfig({ui:e})}sendConfig(e){let t={type:x.CONFIG,config:e};m.debug(`Sending config`,t),this.send(t)}},R=class{attributes;readyStateTracker;messenger;viewerService;cameraApi;cameraPositionApi;snapshotApi;options;iframe;readyCallbacks=[];mutationFailedCallbacks=[];constructor(e){this.options=e,this.initializeLogging(),this.messenger=new j(()=>this.iframe?.contentWindow??null);let t=e=>{this.messenger.send(e)};this.attributes=new M(t,(e,t)=>{for(let n of this.mutationFailedCallbacks)n({attribute:e,value:t})}),this.readyStateTracker=new _(()=>{let e=this.readyCallbacks;this.readyCallbacks=[];for(let t of e)t(this)}),this.viewerService=new L(t),this.cameraApi=new N(t),this.cameraPositionApi=new P,this.snapshotApi=new I(t),this.registerHandlers(),this.messenger.start(),this.createAndConnectIframe()}registerHandlers(){this.messenger.on(x.READY,e=>{w(e)&&(m.info(`Server ready — flushing publisher queue`),this.messenger.markReady(),this.viewerService.sendInitialConfig(this.options))}),this.messenger.on(x.MUTATION,e=>{T(e)&&(this.attributes.handleMutationResult(e),this.readyStateTracker.handleMutationResult(e))}),this.messenger.on(x.SNAPSHOT,e=>{E(e)&&this.snapshotApi.handleSnapshotResult(e)}),this.messenger.on(x.CAMERA,e=>{D(e)&&this.cameraPositionApi.handlePositionUpdate(e)}),this.messenger.on(x.MAPPING,e=>{O(e)&&(this.attributes.handleMappingReceived(e),this.readyStateTracker.handleMappingReceived())})}initializeLogging(){this.options.debug===!0&&h(),m.info(`Initializing Virtualdisplay client`,{model:this.options.model,debug:this.options.debug,language:this.options.language})}createAndConnectIframe(){m.debug(`Creating iframe for Virtualdisplay viewer`),this.iframe=new r(this.options).create(),m.debug(`Iframe created, waiting for server READY`)}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)}get viewer(){return this.viewerService}get camera(){return this.cameraApi}get cameraPosition(){return this.cameraPositionApi}get snapshot(){return this.snapshotApi}destroy(){m.info(`Destroying Virtualdisplay client`),this.readyStateTracker.clear(),this.readyCallbacks=[],this.messenger.destroy(),this.iframe?.parentElement!==null&&this.iframe?.parentElement!==void 0&&this.iframe.parentElement.removeChild(this.iframe),this.iframe=void 0,m.debug(`Virtualdisplay client destroyed`)}};e.Attribute=y,e.AttributeValue=v,e.Camera=N,e.ERROR_CODES=t,e.Photo=F,e.Snapshot=I,e.VirtualdisplayClient=R,e.VirtualdisplayError=n,e.VirtualdisplayViewerService=L,e.enableDebugMode=h,e.isDebugMode=g,Object.defineProperty(e,`logger`,{enumerable:!0,get:function(){return m}})});
|
|
1
|
+
(function(N,et){typeof exports=="object"&&typeof module<"u"?et(exports):typeof define=="function"&&define.amd?define(["exports"],et):(N=typeof globalThis<"u"?globalThis:N||self,et(N.VirtualdisplayClient={}))})(this,(function(N){"use strict";function et(n,t){for(var e=0;e<t.length;e++){const i=t[e];if(typeof i!="string"&&!Array.isArray(i)){for(const o in i)if(o!=="default"&&!(o in n)){const r=Object.getOwnPropertyDescriptor(i,o);r&&Object.defineProperty(n,o,r.get?r:{enumerable:!0,get:()=>i[o]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}const M={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"},Zt={FOCUS:"focus",UNFOCUS:"unfocus"},pn={FOCUSED:"focused"},bn={HIDDEN:"hidden"},vn=new Set(Object.values(M));function yn(n){if(typeof n!="object"||n===null)return!1;const t=n;return typeof t.target=="string"?!1:typeof t.type=="string"&&vn.has(t.type)}function wn(n){const t=$(n);return t!==null&&t.type===M.HANDSHAKE}function Cn(n){const t=$(n);return t!==null&&t.type===M.SESSION&&typeof t.sessionId=="string"}function En(n){const t=$(n);return t!==null&&t.type===M.MUTATION&&Array.isArray(t.results)}function _n(n){const t=$(n);return t!==null&&t.type===M.SNAPSHOT&&("data"in t||"error"in t)}function Sn(n){const t=$(n);return t!==null&&t.type===M.CAMERA&&Array.isArray(t.transforms)}function An(n){const t=$(n);return t!==null&&t.type===M.MAPPING&&Array.isArray(t.attributes)}function kn(n){const t=$(n);return t!==null&&t.type===M.LOADING_INDICATOR&&typeof t.progress=="number"}function Tn(n){const t=$(n);return t!==null&&t.type===M.CONFIG&&typeof t.viewerSettings=="object"}function Rn(n){const t=$(n);return t!==null&&t.type===M.FOCUS&&typeof t.state=="string"}function In(n){const t=$(n);return t!==null&&t.type===M.PRICING&&typeof t.pricing=="object"&&t.pricing!==null}function $(n){return typeof n!="object"||n===null?null:n}class Wt{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 Nn{constructor(t,e){this.getTarget=t,this.sourceId=`vd-${Math.random().toString(36).slice(2,8)}`,this.targetOrigin=e?.targetOrigin??"*",this.isValid=e?.isValid??yn,this.publisher=new Wt(i=>this.post(i)),this.consumer=new Wt(i=>this.routeToHandler(i)),this.shouldBuffer=e?.shouldBuffer??null,e?.bufferIncoming!==!0&&this.consumer.markReady()}getTarget;handlers=new Map;publisher;consumer;shouldBuffer;listener=null;sourceId;targetOrigin;isValid;on(t,e){this.handlers.set(t,e)}off(t){this.handlers.delete(t)}setTargetOrigin(t){this.targetOrigin=t}send(t){this.publisher.enqueue(t)}markReady(){this.publisher.markReady()}markConsumerReady(){this.consumer.markReady()}consumerHasPending(t){return this.consumer.hasPending(t)}start(){this.listener===null&&(this.listener=t=>{const{data:e}=t;if(!this.isValid(e)||e._source===this.sourceId)return;const i=this.getTarget();if(i!==null&&t.source!==null&&t.source!==i)return;const o=e;if(this.shouldBuffer!==null&&!this.shouldBuffer(o)){this.routeToHandler(o);return}this.consumer.enqueue(o)},window.addEventListener("message",this.listener))}destroy(){this.listener!==null&&(window.removeEventListener("message",this.listener),this.listener=null),this.publisher.clear(),this.consumer.clear(),this.handlers.clear()}get ready(){return this.publisher.ready}get pendingCount(){return this.publisher.pendingCount}post(t){const e=this.getTarget();e!==null&&e.postMessage({...t,_source:this.sourceId},this.targetOrigin)}routeToHandler(t){const e=this.handlers.get(t.type);if(e===void 0)return;const i=e(t);i instanceof Promise&&i.catch(o=>{const r=o instanceof Error?o.message:String(o);console.error(`Virtualdisplay: error handling ${t.type}: ${r}`)})}}class z{element;constructor({variant:t="default",size:e="default",label:i,icon:o,onClick:r,disabled:s=!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),r&&this.element.addEventListener("click",r),this.element.disabled=s}setIcon(t){const e=this.element.querySelector("svg");e!==null?e.replaceWith(t):this.element.appendChild(t)}}const Mn={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 Qt=([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 r=Qt(o);i.appendChild(r)}),i},Xt=(n,t={})=>{const i={...Mn,...t};return Qt(["svg",i,n])};const Bn=[["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 Pn=[["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 te=[["path",{d:"m6 9 6 6 6-6"}]];const Ln=[["path",{d:"m15 18-6-6 6-6"}]];const On=[["path",{d:"m9 18 6-6-6-6"}]];const xn=[["path",{d:"m18 15-6-6-6 6"}]];const zn=[["path",{d:"M15 3h6v6"}],["path",{d:"m21 3-7 7"}],["path",{d:"m3 21 7-7"}],["path",{d:"M9 21H3v-6"}]];const Dn=[["path",{d:"m14 10 7-7"}],["path",{d:"M20 10h-6V4"}],["path",{d:"m3 21 7-7"}],["path",{d:"M4 14h6v6"}]];const Fn=[["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 Un=[["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 $n=[["path",{d:"M18 6 6 18"}],["path",{d:"m6 6 12 12"}]];const Vn=[["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 qn=[["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"}]],L={semantic:{error:"#dc2626"},neutral:{500:"#737373",600:"#525252",900:"#171717"},white:"#ffffff",black:"#000000"},w={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",24:"6rem"};class jn{element;constructor(){this.element=document.createElement("div"),Object.assign(this.element.style,{background:L.white,borderRadius:w[3],padding:w[6],boxShadow:`0 ${w[2]} ${w[8]} oklch(0% 0 0 / 20%)`,maxWidth:"20rem",width:"100%"})}}class Hn{constructor(t={}){this.options=t,this.card=new jn,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:w[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 Gn{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 r=t[o],s=document.createElement("button");s.className="ui-toggle-group-item",s.dataset.value=r,s.textContent=i?.[o]??r,s.dataset.state=r===e?"on":"off",s.setAttribute("aria-pressed",r===e?"true":"false"),s.addEventListener("click",()=>{this.selectCallback?.(r)}),this.element.appendChild(s)}}setSelected(t){for(const e of this.element.querySelectorAll(".ui-toggle-group-item")){const i=e.dataset.value===t;e.dataset.state=i?"on":"off",e.setAttribute("aria-pressed",i?"true":"false")}}onSelect(t){this.selectCallback=t}}class Kn{element;select;constructor(t,e,i,o,r){this.select=document.createElement("select"),this.select.className="ui-native-select",this.select.dataset.name=t,this.select.setAttribute("aria-label",i);const s=document.createElement("option");s.value="",s.disabled=!0,s.textContent=i,this.select.appendChild(s);let a=!1;for(let c=0;c<e.length;c++){const u=e[c],h=document.createElement("option");h.value=u,h.textContent=r?.[c]??u,u===o&&(h.selected=!0,a=!0),this.select.appendChild(h)}a||(s.selected=!0);const l=Xt(te,{width:16,height:16,"stroke-width":2});l.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(l)}setSelected(t){this.select.value=t}onSelect(t){this.select.addEventListener("change",()=>{t(this.select.value)})}}const Yn={},Jn="en",ee=["en","nl","de"],ct=["baseLocale"],ne=[];let ie,oe;function Zn(n){if(ne.length===0)return;const t=typeof n=="string"?n:n.href;if(ie===t)return oe;const e=new URL(t,"http://dummy.com");let i;for(const o of ne)if(new Yn(o.match,e.href).exec(e.href)){i=o;break}return ie=t,oe=i,i}function re(n){const t=Zn(n);return t&&t.exclude!==!0&&Array.isArray(t.strategy)?t.strategy:ct}const ut=typeof window>"u";globalThis.__paraglide=globalThis.__paraglide??{},globalThis.__paraglide.ssr=globalThis.__paraglide.ssr??{};let se=!1,B=()=>{let n=ct;!ut&&typeof window<"u"&&window.location?.href&&(n=re(window.location.href));const t=Wn(n);if(t)return se||(se=!0,ae(t,{reload:!1})),t;throw new Error("No locale found. Read the docs https://paraglidejs.com/errors#no-locale-found")};function Wn(n,t){let e;for(const i of n){if(i==="baseLocale")e=Jn;else if(ce(i)&&ot.has(i)){const r=ot.get(i);if(r){const s=r.getLocale();if(s instanceof Promise)continue;if(s!==void 0)return Xn(s)}}const o=le(e);if(o)return o}}const Qn=n=>{window.location.reload()};let ae=(n,t)=>{const e={reload:!0,...t};let i;try{i=B()}catch{}const o=[];let r=ct;!ut&&typeof window<"u"&&window.location?.href&&(r=re(window.location.href));for(const a of r)if(a!=="baseLocale"&&ce(a)&&ot.has(a)){const l=ot.get(a);if(l){let c=l.setLocale(n);c instanceof Promise&&(c=c.catch(u=>{throw new Error(`Custom strategy "${a}" setLocale failed.`,{cause:u})}),o.push(c))}}const s=()=>{!ut&&e.reload&&window.location&&n!==i&&Qn()};if(o.length)return Promise.all(o).then(()=>{s()});s()};function le(n){if(typeof n!="string")return;const t=n.toLowerCase();for(const e of ee)if(e.toLowerCase()===t)return e}function Xn(n){const t=le(n);if(t)return t;throw new Error(`Invalid locale: ${n}. Expected one of: ${ee.join(", ")}`)}const ot=new Map;function ce(n){return typeof n=="string"&&/^custom-[A-Za-z0-9_-]+$/.test(n)}const ti=()=>"Activate AR",ei=()=>"AR activeren",ni=()=>"AR aktivieren",ii=((n={},t={})=>{const e=t.locale??B();return e==="en"?ti():e==="nl"?ei():ni()}),oi=()=>"Scan to view in AR",ri=()=>"Scan om in AR te bekijken",si=()=>"Scannen für AR-Ansicht",ai=((n={},t={})=>{const e=t.locale??B();return e==="en"?oi():e==="nl"?ri():si()}),li=()=>"Use your smartphone camera to scan this QR code",ci=()=>"Gebruik de camera van je smartphone om deze QR-code te scannen",ui=()=>"Verwende die Kamera deines Smartphones, um diesen QR-Code zu scannen",di=((n={},t={})=>{const e=t.locale??B();return e==="en"?li():e==="nl"?ci():ui()}),hi=()=>"Your phone will open the 3D model in AR mode.",fi=()=>"Je telefoon opent het 3D-model in AR-modus.",gi=()=>"Dein Telefon öffnet das 3D-Modell im AR-Modus.",mi=((n={},t={})=>{const e=t.locale??B();return e==="en"?hi():e==="nl"?fi():gi()}),pi=()=>"Close",bi=()=>"Sluiten",vi=()=>"Schließen",yi=((n={},t={})=>{const e=t.locale??B();return e==="en"?pi():e==="nl"?bi():vi()}),wi=()=>"Fullscreen",Ci=()=>"Volledig scherm",Ei=()=>"Vollbild",_i=((n={},t={})=>{const e=t.locale??B();return e==="en"?wi():e==="nl"?Ci():Ei()}),Si=()=>"Downloading",Ai=()=>"Downloaden",ki=()=>"Herunterladen",ue=((n={},t={})=>{const e=t.locale??B();return e==="en"?Si():e==="nl"?Ai():ki()}),Ti=()=>"Rendering",Ri=()=>"Renderen",Ii=()=>"Rendern",Ni=((n={},t={})=>{const e=t.locale??B();return e==="en"?Ti():e==="nl"?Ri():Ii()}),Mi=()=>"Screenshot",Bi=()=>"Screenshot",Pi=()=>"Screenshot",Li=((n={},t={})=>{const e=t.locale??B();return e==="en"?Mi():e==="nl"?Bi():Pi()}),Oi=()=>"Configure",xi=()=>"Configureren",zi=()=>"Konfigurieren",Di=((n={},t={})=>{const e=t.locale??B();return e==="en"?Oi():e==="nl"?xi():zi()}),Fi=()=>"Close",Ui=()=>"Sluiten",$i=()=>"Schließen",Vi=((n={},t={})=>{const e=t.locale??B();return e==="en"?Fi():e==="nl"?Ui():$i()}),qi=()=>"Reset camera",ji=()=>"Camera resetten",Hi=()=>"Kamera zurücksetzen",Gi=((n={},t={})=>{const e=t.locale??B();return e==="en"?qi():e==="nl"?ji():Hi()}),Ki=()=>"Zoom in",Yi=()=>"Inzoomen",Ji=()=>"Hineinzoomen",Zi=((n={},t={})=>{const e=t.locale??B();return e==="en"?Ki():e==="nl"?Yi():Ji()}),Wi=()=>"Zoom out",Qi=()=>"Uitzoomen",Xi=()=>"Herauszoomen",to=((n={},t={})=>{const e=t.locale??B();return e==="en"?Wi():e==="nl"?Qi():Xi()}),eo=()=>"Rotate left",no=()=>"Naar links draaien",io=()=>"Nach links drehen",oo=((n={},t={})=>{const e=t.locale??B();return e==="en"?eo():e==="nl"?no():io()}),ro=()=>"Rotate right",so=()=>"Naar rechts draaien",ao=()=>"Nach rechts drehen",lo=((n={},t={})=>{const e=t.locale??B();return e==="en"?ro():e==="nl"?so():ao()}),co=()=>"Tilt up",uo=()=>"Omhoog kantelen",ho=()=>"Nach oben kippen",fo=((n={},t={})=>{const e=t.locale??B();return e==="en"?co():e==="nl"?uo():ho()}),go=()=>"Tilt down",mo=()=>"Omlaag kantelen",po=()=>"Nach unten kippen",bo=((n={},t={})=>{const e=t.locale??B();return e==="en"?go():e==="nl"?mo():po()}),vo=()=>"Working…",yo=()=>"Bezig…",wo=()=>"Läuft…",Co=((n={},t={})=>{const e=t.locale??B();return e==="en"?vo():e==="nl"?yo():wo()}),Eo=()=>"Done",_o=()=>"Gelukt",So=()=>"Fertig",Ao=((n={},t={})=>{const e=t.locale??B();return e==="en"?Eo():e==="nl"?_o():So()}),ko=()=>"Failed",To=()=>"Mislukt",Ro=()=>"Fehlgeschlagen",Io=((n={},t={})=>{const e=t.locale??B();return e==="en"?ko():e==="nl"?To():Ro()}),U={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"}},No=U.fontFamily.sans.join(", ");class Mo{qrLib=null;dialog=null;async show(t){this.hide(),this.qrLib??=await Promise.resolve().then(()=>Qr);const e=await this.qrLib.toDataURL(t,{width:256,margin:4,errorCorrectionLevel:"M",color:{dark:L.black,light:L.white}});this.dialog=new Hn({onClose:()=>{this.dialog=null}}),Object.assign(this.dialog.card.element.style,{display:"flex",flexDirection:"column",alignItems:"center",gap:w[3],fontFamily:No}),this.dialog.card.element.appendChild(this.createText(ai(),{fontSize:U.fontSize.base,fontWeight:U.fontWeight.semibold,color:L.neutral[900]})),this.dialog.card.element.appendChild(this.createText(di(),{fontSize:U.fontSize.sm,color:L.neutral[600]})),this.dialog.card.element.appendChild(this.createQrImage(e)),this.dialog.card.element.appendChild(this.createText(mi(),{fontSize:U.fontSize.xs,color:L.neutral[500]}));const i=new z({variant:"outline",label:yi(),onClick:()=>{this.hide()}});this.dialog.card.element.appendChild(i.element),this.dialog.open()}hide(){this.dialog?.close(),this.dialog=null}createText(t,e){const i=document.createElement("p");return i.textContent=t,Object.assign(i.style,{margin:"0",textAlign:"center",...e}),i}createQrImage(t){const e=document.createElement("img");return e.src=t,e.alt="QR code",Object.assign(e.style,{width:w[24],height:w[24],borderRadius:w[1]}),e}}const Z=U.fontFamily.sans.join(", "),Bo=`
|
|
2
|
+
:root {
|
|
3
|
+
--primary: oklch(5% 0 0);
|
|
4
|
+
--primary-foreground: oklch(100% 0 0);
|
|
5
|
+
--secondary: oklch(92% 0 0);
|
|
6
|
+
--secondary-foreground: oklch(5% 0 0);
|
|
7
|
+
--background: oklch(100% 0 0);
|
|
8
|
+
--foreground: oklch(5% 0 0);
|
|
9
|
+
--border: oklch(92% 0 0);
|
|
10
|
+
--ring: oklch(44% 0 0);
|
|
11
|
+
--radius: 0.625rem;
|
|
12
|
+
--accent: oklch(92% 0 0);
|
|
13
|
+
--accent-foreground: oklch(5% 0 0);
|
|
14
|
+
--muted-foreground: oklch(44% 0 0);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* ── Button ──────────────────────────────────────────────── */
|
|
18
|
+
.ui-btn {
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
gap: 0.5rem;
|
|
23
|
+
border: 1px solid transparent;
|
|
24
|
+
border-radius: var(--radius);
|
|
25
|
+
font-family: ${Z};
|
|
26
|
+
font-size: 0.875rem;
|
|
27
|
+
font-weight: 600;
|
|
28
|
+
white-space: nowrap;
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
transition: all 200ms;
|
|
31
|
+
flex-shrink: 0;
|
|
32
|
+
}
|
|
33
|
+
.ui-btn:active { transform: scale(0.98); }
|
|
34
|
+
.ui-btn:disabled { opacity: 0.5; pointer-events: none; }
|
|
35
|
+
.ui-btn svg { inline-size: 1rem; block-size: 1rem; pointer-events: none; flex-shrink: 0; }
|
|
36
|
+
|
|
37
|
+
.ui-btn--default {
|
|
38
|
+
background: var(--primary);
|
|
39
|
+
color: var(--primary-foreground);
|
|
40
|
+
box-shadow: 0 1px 3px oklch(5% 0 0 / 20%);
|
|
41
|
+
}
|
|
42
|
+
.ui-btn--default:hover { background: oklch(10% 0 0); }
|
|
43
|
+
|
|
44
|
+
.ui-btn--outline {
|
|
45
|
+
background: var(--background);
|
|
46
|
+
color: var(--foreground);
|
|
47
|
+
border-color: var(--border);
|
|
48
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
49
|
+
}
|
|
50
|
+
.ui-btn--outline:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
51
|
+
|
|
52
|
+
.ui-btn--secondary {
|
|
53
|
+
background: var(--secondary);
|
|
54
|
+
color: var(--secondary-foreground);
|
|
55
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
56
|
+
}
|
|
57
|
+
.ui-btn--secondary:hover { background: oklch(88% 0 0); }
|
|
58
|
+
|
|
59
|
+
.ui-btn--ghost { background: transparent; color: var(--foreground); }
|
|
60
|
+
.ui-btn--ghost:hover { background: var(--accent); }
|
|
61
|
+
|
|
62
|
+
.ui-btn--size-default { block-size: 2.25rem; padding: 0 1rem; }
|
|
63
|
+
.ui-btn--size-sm { block-size: 2rem; padding: 0 0.75rem; border-radius: calc(var(--radius) - 0.125rem); }
|
|
64
|
+
.ui-btn--size-lg { block-size: 2.5rem; padding: 0 1.5rem; }
|
|
65
|
+
.ui-btn--size-icon { inline-size: 2.25rem; block-size: 2.25rem; padding: 0; }
|
|
66
|
+
.ui-btn--size-icon-sm { inline-size: 2rem; block-size: 2rem; padding: 0; }
|
|
67
|
+
.ui-btn--size-icon-lg { inline-size: 2.5rem; block-size: 2.5rem; padding: 0; }
|
|
68
|
+
|
|
69
|
+
/* ── Toggle group ────────────────────────────────────────── */
|
|
70
|
+
.ui-toggle-group { display: inline-flex; flex-wrap: wrap; gap: 0.25rem; }
|
|
71
|
+
|
|
72
|
+
.ui-toggle-group-item {
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
block-size: 2rem;
|
|
77
|
+
padding: 0 0.75rem;
|
|
78
|
+
border: 1px solid var(--border);
|
|
79
|
+
border-radius: var(--radius);
|
|
80
|
+
background: var(--background);
|
|
81
|
+
color: var(--foreground);
|
|
82
|
+
font-family: ${Z};
|
|
83
|
+
font-size: 0.875rem;
|
|
84
|
+
font-weight: 600;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
white-space: nowrap;
|
|
87
|
+
transition: all 200ms;
|
|
88
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
89
|
+
}
|
|
90
|
+
.ui-toggle-group-item:hover { background: var(--accent); border-color: oklch(85% 0 0); }
|
|
91
|
+
.ui-toggle-group-item:active { transform: scale(0.98); }
|
|
92
|
+
.ui-toggle-group-item:focus-visible {
|
|
93
|
+
outline: none;
|
|
94
|
+
border-color: var(--ring);
|
|
95
|
+
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
96
|
+
}
|
|
97
|
+
.ui-toggle-group-item[data-state="on"] {
|
|
98
|
+
background: var(--primary);
|
|
99
|
+
color: var(--primary-foreground);
|
|
100
|
+
border-color: var(--primary);
|
|
101
|
+
}
|
|
102
|
+
.ui-toggle-group-item[data-state="on"]:hover { background: oklch(10% 0 0); }
|
|
103
|
+
|
|
104
|
+
/* ── Native select ───────────────────────────────────────── */
|
|
105
|
+
.ui-native-select-wrap {
|
|
106
|
+
position: relative;
|
|
107
|
+
display: inline-flex;
|
|
108
|
+
min-inline-size: 8rem;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.ui-native-select {
|
|
112
|
+
display: block;
|
|
113
|
+
inline-size: 100%;
|
|
114
|
+
block-size: 2.25rem;
|
|
115
|
+
padding: 0 2.25rem 0 0.75rem;
|
|
116
|
+
border: 1px solid var(--border);
|
|
117
|
+
border-radius: var(--radius);
|
|
118
|
+
background: var(--background);
|
|
119
|
+
appearance: none;
|
|
120
|
+
color: var(--foreground);
|
|
121
|
+
font-family: ${Z};
|
|
122
|
+
font-size: 0.875rem;
|
|
123
|
+
font-weight: 400;
|
|
124
|
+
cursor: pointer;
|
|
125
|
+
transition: color 200ms, box-shadow 200ms, border-color 200ms;
|
|
126
|
+
box-shadow: 0 1px 2px oklch(5% 0 0 / 8%);
|
|
127
|
+
}
|
|
128
|
+
.ui-native-select:hover { border-color: oklch(85% 0 0); }
|
|
129
|
+
.ui-native-select:focus-visible {
|
|
130
|
+
outline: none;
|
|
131
|
+
border-color: var(--ring);
|
|
132
|
+
box-shadow: 0 0 0 3px oklch(5% 0 0 / 12%);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.ui-native-select-icon {
|
|
136
|
+
position: absolute;
|
|
137
|
+
inset-block-start: 50%;
|
|
138
|
+
inset-inline-end: 0.625rem;
|
|
139
|
+
transform: translateY(-50%);
|
|
140
|
+
color: var(--muted-foreground);
|
|
141
|
+
pointer-events: none;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* ── Annotation layer ───────────────────────────────────── */
|
|
145
|
+
.vd-annotations-layer {
|
|
146
|
+
position: absolute;
|
|
147
|
+
inset-block-start: 0;
|
|
148
|
+
inset-inline-start: 0;
|
|
149
|
+
inline-size: 100%;
|
|
150
|
+
block-size: 100%;
|
|
151
|
+
pointer-events: none;
|
|
152
|
+
overflow: visible !important; /* override CSS2DRenderer inline style */
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.vd-annotation-anchor {
|
|
156
|
+
position: relative;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.vd-annotation-marker {
|
|
160
|
+
display: flex;
|
|
161
|
+
align-items: center;
|
|
162
|
+
justify-content: center;
|
|
163
|
+
inline-size: 1.75rem;
|
|
164
|
+
block-size: 1.75rem;
|
|
165
|
+
border-radius: 50%;
|
|
166
|
+
border: 2px solid oklch(100% 0 0);
|
|
167
|
+
background: var(--primary);
|
|
168
|
+
color: var(--primary-foreground);
|
|
169
|
+
font-family: ${Z};
|
|
170
|
+
font-size: 0.8125rem;
|
|
171
|
+
font-weight: 600;
|
|
172
|
+
cursor: pointer;
|
|
173
|
+
pointer-events: auto;
|
|
174
|
+
box-shadow: 0 2px 8px oklch(5% 0 0 / 20%);
|
|
175
|
+
transition: transform 100ms ease;
|
|
176
|
+
position: relative;
|
|
177
|
+
}
|
|
178
|
+
.vd-annotation-marker:hover { transform: scale(1.1); }
|
|
179
|
+
.vd-annotation-marker:focus-visible {
|
|
180
|
+
outline: 2px solid var(--ring);
|
|
181
|
+
outline-offset: 2px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.vd-annotation-popup {
|
|
185
|
+
position: absolute;
|
|
186
|
+
inset-block-end: calc(100% + 0.5rem);
|
|
187
|
+
inset-inline-start: 50%;
|
|
188
|
+
transform: translateX(-50%);
|
|
189
|
+
background: var(--background);
|
|
190
|
+
color: var(--foreground);
|
|
191
|
+
border: 1px solid var(--border);
|
|
192
|
+
border-radius: var(--radius);
|
|
193
|
+
padding: 0.75rem 1rem;
|
|
194
|
+
max-inline-size: 15rem;
|
|
195
|
+
box-shadow: 0 4px 6px oklch(5% 0 0 / 8%), 0 2px 4px oklch(5% 0 0 / 6%);
|
|
196
|
+
pointer-events: auto;
|
|
197
|
+
white-space: normal;
|
|
198
|
+
}
|
|
199
|
+
.vd-annotation-popup:focus { outline: none; }
|
|
200
|
+
|
|
201
|
+
.vd-annotation-popup-close {
|
|
202
|
+
position: absolute;
|
|
203
|
+
inset-block-start: 0.375rem;
|
|
204
|
+
inset-inline-end: 0.375rem;
|
|
205
|
+
display: flex;
|
|
206
|
+
align-items: center;
|
|
207
|
+
justify-content: center;
|
|
208
|
+
inline-size: 1.25rem;
|
|
209
|
+
block-size: 1.25rem;
|
|
210
|
+
padding: 0;
|
|
211
|
+
border: none;
|
|
212
|
+
border-radius: calc(var(--radius) - 4px);
|
|
213
|
+
background: transparent;
|
|
214
|
+
color: var(--muted-foreground);
|
|
215
|
+
cursor: pointer;
|
|
216
|
+
pointer-events: auto;
|
|
217
|
+
}
|
|
218
|
+
.vd-annotation-popup-close:hover {
|
|
219
|
+
color: var(--foreground);
|
|
220
|
+
background: var(--secondary);
|
|
221
|
+
}
|
|
222
|
+
.vd-annotation-popup-close:focus-visible {
|
|
223
|
+
outline: 2px solid var(--ring);
|
|
224
|
+
outline-offset: 1px;
|
|
225
|
+
}
|
|
226
|
+
.vd-annotation-popup-close svg {
|
|
227
|
+
inline-size: 0.875rem;
|
|
228
|
+
block-size: 0.875rem;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
232
|
+
.vd-annotation-popup {
|
|
233
|
+
animation: vd-popup-in 150ms ease;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
@keyframes vd-popup-in {
|
|
238
|
+
from { opacity: 0; transform: translateX(-50%) translateY(4px); }
|
|
239
|
+
to { opacity: 1; transform: translateX(-50%) translateY(0); }
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.vd-annotation-popup-title {
|
|
243
|
+
font-family: ${Z};
|
|
244
|
+
font-size: 0.875rem;
|
|
245
|
+
font-weight: 600;
|
|
246
|
+
line-height: 1.25rem;
|
|
247
|
+
/* Keep the title clear of the absolutely positioned close button. */
|
|
248
|
+
padding-inline-end: 1.5rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.vd-annotation-popup-description {
|
|
252
|
+
font-family: ${Z};
|
|
253
|
+
font-size: 0.8125rem;
|
|
254
|
+
font-weight: 400;
|
|
255
|
+
line-height: 1.125rem;
|
|
256
|
+
color: var(--muted-foreground);
|
|
257
|
+
margin-block-start: 0.25rem;
|
|
258
|
+
}
|
|
259
|
+
`;let de=!1;function Po(){if(de||typeof document>"u")return;de=!0;const n=document.createElement("style");n.id="vd-ui-vanilla",n.textContent=Bo,document.head.appendChild(n)}function Lo(){return new Date}function Oo(n){return n.toISOString()}function he(){return typeof navigator>"u"?"":navigator.userAgent}function xo(){return typeof navigator>"u"?!1:navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1}function zo(){return/iPhone|iPad|iPod/i.test(he())||xo()}function Do(){return/Android/i.test(he())}function Fo(){return zo()||Do()}class fe{constructor(t){this.send=t}send;setEnabled(t){this.send({type:M.ANNOTATION_TOGGLE,enabled:t})}}class ge{constructor(t,e){this.value=t,this.attribute=e}value;attribute;isSelectedValue=!1;get isSelected(){return this.isSelectedValue}setSelected(t){this.isSelectedValue=t}}const V={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 x extends Error{code;constructor(t,e){super(t),this.name="VirtualdisplayError",this.code=e}static valueNotFound(t,e){return new x(`Value "${e}" not found for attribute "${t}"`,V.VALUE_NOT_FOUND)}static parentNotFound(t){return new x(`Parent element not found: ${t}`,V.PARENT_NOT_FOUND)}static invalidParameter(t){return new x(t,V.INVALID_PARAMETER)}}class me{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 x.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 ge(i,this.name);i===this.defaultValue&&o.setSelected(!0),e.set(i,o)}return e}}class Uo{attributes=new Map;constructor(t,e,i){for(const o of t){const r=this.buildOptions(o,e);this.attributes.set(o.name,new me(r))}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,r)=>{e([{name:o,value:r}],!1)}};return t.defaultValue!==void 0?{...i,defaultValue:t.defaultValue}:i}}function $o(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,r=["timestamp","level","msg","service","trace_id","span_id"],s=Object.entries(n).filter(([a])=>!r.includes(a)).map(([a,l])=>`${a}=${JSON.stringify(l)}`).join(" ");return`${t} ${e} [${i}] ${o}${s?" "+s:""}`}function Vo(n){return JSON.stringify(n)}function qo(n,t){const e=t?$o(n):Vo(n);n.level==="error"?console.error(e):n.level==="warn"?console.warn(e):console.log(e)}function pe(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?pe(n.cause,t+1):String(n.cause)),e}function jo(n){const t={};for(const[e,i]of Object.entries(n))t[e]=i instanceof Error?pe(i):i;return t}class Ho{constructor(t){this.config=t}config;log(t,e,i={}){const o=this.config.traceProvider?.()??{},r={timestamp:Oo(Lo()),level:t,msg:e,service:this.config.service,...o,...jo(i)};qo(r,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 be(n,t){const e=t?.isDev!==void 0?t.isDev:typeof process<"u"?process.env.NODE_ENV!=="production":!0;return new Ho({service:n,isDev:e,traceProvider:t?.traceProvider})}function rt(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 ve(n){return{debug:(t,e)=>n.debug(t,rt(e)),info:(t,e)=>n.info(t,rt(e)),warn:(t,e)=>n.warn(t,rt(e)),error:(t,e)=>n.error(t,rt(e))}}let ye=!1;N.logger=ve(be("client",{isDev:!1}));function we(){ye=!0,N.logger=ve(be("client",{isDev:!0}))}function Go(){return ye}class Ko{constructor(t,e){this.send=t,this.onMutationFailed=e}send;onMutationFailed;registry;pendingCallbacks=[];handleMappingReceived(t){N.logger.debug("Initializing from server mapping",{attributeCount:t.attributes.length}),this.registry=new Uo(t.attributes,(e,i)=>this.sendMutation(e,i),this.onMutationFailed),this.replayPendingCallbacks()}handleMutationResult(t){this.registry?.handleResults(t.results)}select(t,e){this.sendMutation([{name:t,value:e}],!1)}getValues(t){return this.registry?.get(t)?.getValues()??[]}getValue(t,e){return this.registry?.get(t)?.getValue(e)}onChange(t,e){if(this.registry===void 0){this.pendingCallbacks.push({name:t,callback:e});return}const i=this.registry.get(t);if(i===void 0){N.logger.warn(`onChange: attribute "${t}" not found — callback will not fire`);return}i.onChange(e)}getAttribute(t){return this.registry?.get(t)}getSelection(){return this.registry?.getSelection()??{}}get hasMapping(){return this.registry!==void 0}sendMutation(t,e){const i={type:M.MUTATION,mutations:t,isInitial:e};this.send(i)}replayPendingCallbacks(){for(const{name:t,callback:e}of this.pendingCallbacks){const i=this.registry?.get(t);i===void 0&&N.logger.warn(`onChange: attribute "${t}" not found — buffered callback will not fire`),i?.onChange(e)}this.pendingCallbacks.length=0}}class Ce{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 x.invalidParameter("No camera commands to execute. Call rotate(), tilt(), or zoom() before set().");const t={type:M.CAMERA,commands:this.commands};this.send(t),this.commands=[]}validateFiniteNumber(t,e){if(!Number.isFinite(t))throw x.invalidParameter(`${e}() requires a finite number, got ${String(t)}`)}reset(){const t={type:M.CAMERA,commands:[{action:"reset"}]};this.send(t)}}class Yo{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 Jo(n,t){const e=n.filter(r=>Zo(r,t));if(e.length===0)return;const i=Math.max(...e.map(Ee)),o=e.filter(r=>Ee(r)===i);return o.length===1?o[0]:void 0}function Zo(n,t){return Object.entries(n.attributes).every(([e,i])=>t[e]===i)}function Ee(n){return Object.keys(n.attributes).length}class _e{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=Jo(this.pricing.rules,this.selection);if(!(t===void 0||t.availability===bn.HIDDEN))return{attributes:{...this.selection},reference:t.reference,price:t.priceCents,currency:this.pricing.currency,availability:t.availability}}}class Se{constructor(t,e){this.send=t,this.dispatch=e}send;dispatch;focused=null;attributes=[];changeCallbacks=[];get current(){return this.focused}set(t){if(typeof t!="string"||t.length===0)throw x.invalidParameter(`set() requires a non-empty component name, got ${String(t)}`);this.send({type:M.FOCUS,action:Zt.FOCUS,component:t})}clear(){this.send({type:M.FOCUS,action:Zt.UNFOCUS})}onChange(t){this.changeCallbacks.push(t)}handleStateReceived(t){t.state===pn.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 Ae{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 ke=3e4;class Te{constructor(t){this.send=t}send;validExtensions=[".png"];pendingPhotos=new Map;take(t){this.validateFilename(t),N.logger.debug("Taking snapshot",{filename:t});const e=new Ae(t),i=setTimeout(()=>{this.pendingPhotos.delete(t),N.logger.warn("Snapshot timed out",{filename:t}),e.fail(new x(`Snapshot timed out: the viewer did not respond within ${ke}ms`,V.SNAPSHOT_FAILED))},ke);return this.pendingPhotos.set(t,{photo:e,timeout:i}),this.send({type:M.SNAPSHOT,filename:t}),e}handleSnapshotResult(t){const e=this.pendingPhotos.get(t.filename);if(e===void 0){N.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 x(t.error,V.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 x("Client destroyed before snapshot completed",V.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 x("Filename must be a non-empty string",V.INVALID_PARAMETER);if(!this.validExtensions.some(i=>t.toLowerCase().endsWith(i)))throw new x(`Invalid filename: "${t}". Filename must end with one of: ${this.validExtensions.join(", ")}`,V.INVALID_PARAMETER);if(t.includes("..")||t.includes("/")||t.includes("\\"))throw new x('Filename cannot contain path separators or ".."',V.INVALID_PARAMETER)}}class Wo{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 r=o,s={...r.detail,preventDefault:()=>{r.preventDefault()}};e(s)};return this.container?.addEventListener(t,i),()=>{this.container?.removeEventListener(t,i)}}}function F(n,{size:t=20,strokeWidth:e=1.75}={}){return Xt(n,{width:t,height:t,"stroke-width":e})}const D={ar:n=>F(Bn,n),fullscreen:n=>F(zn,n),exitFullscreen:n=>F(Dn,n),screenshot:n=>F(Pn,n),tiltUp:n=>F(xn,n),tiltDown:n=>F(te,n),rotateLeft:n=>F(Ln,n),rotateRight:n=>F(On,n),zoomIn:n=>F(Vn,n),zoomOut:n=>F(qn,n),reset:n=>F(Fn,n),configurator:n=>F(Un,n),close:n=>F($n,n)};function Re(n){const t=Math.max(0,Math.min(1,n));return t*t*(3-2*t)}function Qo(n,t,e,i,o,r){const[s,a,l]=n,c=Math.cos(t),u=Math.sin(t),h=c*s+u*l,f=-u*s+c*l,d=Math.cos(e),p=Math.sin(e),k=d*a-p*f,P=p*a+d*f,_=.55;return[i+h*r*_,o-k*r*_,P]}function Xo(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 tr(n,t,e,i,o){const r=t(e),s=t(i),a=[r[0]+(s[0]-r[0])*o,r[1]+(s[1]-r[1])*o,r[2]];Xo(n,r,a)}const dt=[-1,-1,1],ht=[1,-1,1],ft=[1,-1,-1],gt=[-1,-1,-1],mt=[-1,1,1],pt=[1,1,1],bt=[1,1,-1],vt=[-1,1,-1],Ie=[[dt,ht],[ht,ft],[ft,gt],[gt,dt],[dt,mt],[ht,pt],[ft,bt],[gt,vt],[mt,pt],[pt,bt],[bt,vt],[vt,mt]],er=400,Ne='-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif';function nr(){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:Ne});const o=document.createElement("span");return Object.assign(o.style,{fontSize:"13px",color:"#000",fontFamily:Ne}),o.textContent=ue(),e.appendChild(i),e.appendChild(o),n.appendChild(t),n.appendChild(e),{overlay:n,canvas:t,pctEl:i,phaseEl:o}}class ir{overlay;canvas;ctx;pctEl;phaseEl;animationId=null;showTimerId=null;startTime;hidden=!1;visible=!1;constructor(t,e={}){this.startTime=performance.now();const i=nr();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??er;this.showTimerId=setTimeout(()=>{this.reveal()},o)}get loadingTexts(){return{downloading:ue(),rendering:Ni()}}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,r=e*.44,s=Math.min(t,e)*.08,a=.785,l=.615,c=p=>Qo(p,a,l,o,r,s),u=6,h=i%u/u,f=Ie.length;let d;h<.35?d=Re(h/.35)*f:h<.55?d=f:h<.9?d=(1-Re((h-.55)/.35))*f:d=0,this.ctx.shadowBlur=5,this.ctx.shadowColor="rgba(30,30,30,0.08)";for(let p=0;p<f&&!(p>=d);p++){const k=Ie[p];if(k===void 0)continue;const P=Math.min(1,d-p);tr(this.ctx,c,k[0],k[1],P)}this.ctx.shadowBlur=0}}class or{constructor(t){this.options=t,this.element=document.createElement("div"),Object.assign(this.element.style,{display:"flex",gap:"0.375rem"}),this.onFullscreenChange=()=>{this.setFullscreenIcon(document.fullscreenElement!==null)},document.addEventListener("fullscreenchange",this.onFullscreenChange)}options;element;arBtn=null;fullscreenBtn=null;onFullscreenChange;setFullscreenIcon(t){this.fullscreenBtn!==null&&this.fullscreenBtn.setIcon(t?D.exitFullscreen():D.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 z({variant:"outline",size:"icon",label:ii(),icon:D.ar(),onClick:()=>{this.options.onAr?.()}})),this.fullscreenBtn=this.syncButton(this.fullscreenBtn,t.fullscreen!==!1&&this.options.onFullscreen!==void 0,()=>new z({variant:"outline",size:"icon",label:_i(),icon:D.fullscreen(),onClick:()=>{this.options.onFullscreen?.()}}))}destroy(){document.removeEventListener("fullscreenchange",this.onFullscreenChange)}}const W=.5;class st{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=rr(t,e,i);e.onChange(r=>{i.targetRotation=r.rotation-i.thetaOffset,i.targetTilt=r.tilt,i.targetZoom=r.zoom,sr(o,e,r)}),this.element.appendChild(st.buildZoom(o.zoomOut,o.zoomIn)),this.element.appendChild(st.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,r){const s=document.createElement("div");s.className="vd-dpad";for(const[a,l]of[[t,"up"],[e,"left"],[i,"center"],[o,"right"],[r,"down"]])a.element.classList.add(`vd-dpad-${l}`),s.appendChild(a.element);return s}}function rr(n,t,e){const i=s=>Math.max(t.limits?.minZoom??1,Math.min(t.limits?.maxZoom??1/0,s)),o=s=>{const a=t.limits?.minRotate,l=t.limits?.maxRotate;return a!==void 0||l!==void 0?Math.max(a??-1/0,Math.min(l??1/0,s)):s},r=s=>{const a=t.limits?.minTilt,l=t.limits?.maxTilt;if(a!==void 0||l!==void 0){e.targetTilt=Math.max(a??0,Math.min(l??180,e.targetTilt+s)),n.tilt(e.targetTilt).set();return}const c=e.targetTilt+s;c>180||c<0?(e.targetTilt=c>180?360-c:-c,e.thetaOffset=(e.thetaOffset+180)%360,n.tilt(e.targetTilt).rotate(e.targetRotation+e.thetaOffset).set()):(e.targetTilt=c,n.tilt(e.targetTilt).set())};return{zoomOut:new z({variant:"outline",size:"icon",label:to(),icon:D.zoomOut(),onClick:()=>{e.targetZoom=i(e.targetZoom-10),n.zoom(e.targetZoom).set()}}),zoomIn:new z({variant:"outline",size:"icon",label:Zi(),icon:D.zoomIn(),onClick:()=>{e.targetZoom=i(e.targetZoom+10),n.zoom(e.targetZoom).set()}}),tiltUp:new z({variant:"outline",size:"icon",label:fo(),icon:D.tiltUp(),onClick:()=>{r(-15)}}),rotateLeft:new z({variant:"outline",size:"icon",label:oo(),icon:D.rotateLeft(),onClick:()=>{e.targetRotation=o(e.targetRotation-15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),reset:new z({variant:"outline",size:"icon",label:Gi(),icon:D.reset(),onClick:()=>{e.thetaOffset=0,n.reset()}}),rotateRight:new z({variant:"outline",size:"icon",label:lo(),icon:D.rotateRight(),onClick:()=>{e.targetRotation=o(e.targetRotation+15),n.rotate(e.targetRotation+e.thetaOffset).set()}}),tiltDown:new z({variant:"outline",size:"icon",label:bo(),icon:D.tiltDown(),onClick:()=>{r(15)}})}}function sr(n,t,e){const i=t.limits;i!==void 0&&(n.zoomOut.element.disabled=i.minZoom!==void 0&&e.zoom<=i.minZoom+W,n.zoomIn.element.disabled=i.maxZoom!==void 0&&e.zoom>=i.maxZoom-W,n.tiltUp.element.disabled=i.minTilt!==void 0&&e.tilt<=i.minTilt+W,n.tiltDown.element.disabled=i.maxTilt!==void 0&&e.tilt>=i.maxTilt-W,n.rotateLeft.element.disabled=i.minRotate!==void 0&&e.rotation<=i.minRotate+W,n.rotateRight.element.disabled=i.maxRotate!==void 0&&e.rotation>=i.maxRotate-W)}const Q={SELECT:"ui:select",SELECTED:"ui:selected",FOCUS_CHANGE:"vd:focus-change",CONFIGURATION_CHANGE:"vd:configuration-change",CONFIGURATION_SUBMIT:"vd:configuration-submit"},ar=5;let lr=0;function yt(n){const t=n.replace(/([A-Z])/g," $1").trim();return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function cr(n,t,e,i,o){const r=document.createElement("div");r.className="vd-attribute",r.dataset.name=n.name;const s=document.createElement("span");s.className="vd-attribute-label",s.textContent=yt(n.name),s.id=`vd-attribute-label-${lr++}`,r.appendChild(s),r.setAttribute("role","group"),r.setAttribute("aria-labelledby",s.id);const a=n.values.find(u=>t.getValue(n.name,u)?.isSelected===!0),l=n.values.map(yt),c=n.values.length<=ar?new Gn(n.values,a,l):new Kn(n.name,n.values,yt(n.name),a,l);return c.onSelect(u=>{e.dispatch(Q.SELECT,{attribute:n.name,value:u},!0).defaultPrevented||i(n.name,u)}),o(n.name,u=>{c.setSelected(u.value),e.dispatch(Q.SELECTED,{attribute:n.name,value:u.value})}),r.appendChild(c.element),r}const ur=80,dr=2500;class hr{constructor(t,e=dr){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 z({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=fr(t.price,t.currency),this.vatEl.textContent=Me(this.configuration.vatDisplay)}renderButton(){const t=this.configuration.submitEnabled;this.button.element.classList.toggle("vd-hidden",!t),t&&this.state==="idle"&&this.setButtonText(Me(this.configuration.buttonLabel))}async handleSubmit(){if(this.state!=="busy"){this.setState("busy",Co());try{await this.configuration.submit(),this.setState("success",Ao())}catch{this.setState("failed",Io())}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 Me(n){return(n??"").slice(0,ur)}function fr(n,t){try{const e=new Intl.NumberFormat(B(),{style:"currency",currency:t}),i=e.resolvedOptions().maximumFractionDigits??2;return e.format(n/10**i)}catch{return`${t} ${(n/100).toFixed(2)}`}}class Be{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 gr=572;class mr{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 z({variant:"ghost",size:"icon-sm",label:Vi(),icon:D.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 z({variant:"outline",size:"default",label:Di(),icon:D.configurator({size:18}),onClick:()=>{this.expanded=!0,this.render()}}),this.openButton.element.classList.add("vd-configurator-toggle","vd-hidden"),t.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-collapsed"),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<gr)}),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-collapsed",e)}}class pr{attach(t,e){}setVisible(t){}destroy(){}}const br={"inframe-bottom-left":()=>new Be,"sidebar-right":()=>new mr,hidden:()=>new pr};function vr(n){return(br[n??""]??(()=>new Be))()}const wt=U.fontFamily.sans.join(", "),Ct=`
|
|
260
|
+
position: absolute;
|
|
261
|
+
display: flex;
|
|
262
|
+
z-index: 10;
|
|
263
|
+
transition: inset-inline-end 0.18s ease;
|
|
264
|
+
`,yr=`
|
|
265
|
+
/* Override browser's default black fullscreen backdrop */
|
|
266
|
+
.vd-container:fullscreen {
|
|
267
|
+
background: oklch(100% 0 0);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* Layout slots — four corners */
|
|
271
|
+
.vd-slot-top-right {
|
|
272
|
+
${Ct}
|
|
273
|
+
inset-block-start: ${w[3]};
|
|
274
|
+
inset-inline-end: ${w[3]};
|
|
275
|
+
flex-direction: column;
|
|
276
|
+
align-items: flex-end;
|
|
277
|
+
gap: ${w[1.5]};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.vd-slot-bottom-left {
|
|
281
|
+
${Ct}
|
|
282
|
+
inset-block-end: ${w[3]};
|
|
283
|
+
inset-inline-start: ${w[3]};
|
|
284
|
+
flex-direction: column;
|
|
285
|
+
align-items: flex-start;
|
|
286
|
+
gap: ${w[1.5]};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.vd-slot-bottom-right {
|
|
290
|
+
${Ct}
|
|
291
|
+
inset-block-end: ${w[3]};
|
|
292
|
+
inset-inline-end: ${w[3]};
|
|
293
|
+
flex-direction: row;
|
|
294
|
+
gap: ${w[1.5]};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* Component styles — no positioning */
|
|
298
|
+
.vd-camera-controls {
|
|
299
|
+
display: flex;
|
|
300
|
+
flex-direction: column;
|
|
301
|
+
gap: ${w[1]};
|
|
302
|
+
background: color-mix(in oklch, ${L.white} 85%, transparent);
|
|
303
|
+
backdrop-filter: blur(8px);
|
|
304
|
+
border-radius: ${w[2]};
|
|
305
|
+
padding: ${w[2]};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.vd-zoom {
|
|
309
|
+
display: flex;
|
|
310
|
+
gap: ${w[.5]};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.vd-dpad {
|
|
314
|
+
display: grid;
|
|
315
|
+
grid-template-columns: repeat(3, ${w[9]});
|
|
316
|
+
grid-template-rows: repeat(3, ${w[9]});
|
|
317
|
+
gap: ${w[.5]};
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.vd-dpad-up { grid-column: 2; grid-row: 1; }
|
|
321
|
+
.vd-dpad-left { grid-column: 1; grid-row: 2; }
|
|
322
|
+
.vd-dpad-center { grid-column: 2; grid-row: 2; }
|
|
323
|
+
.vd-dpad-right { grid-column: 3; grid-row: 2; }
|
|
324
|
+
.vd-dpad-down { grid-column: 2; grid-row: 3; }
|
|
325
|
+
|
|
326
|
+
.vd-attributes {
|
|
327
|
+
display: flex;
|
|
328
|
+
flex-direction: column;
|
|
329
|
+
gap: ${w[3]};
|
|
330
|
+
background: color-mix(in oklch, ${L.white} 85%, transparent);
|
|
331
|
+
backdrop-filter: blur(8px);
|
|
332
|
+
border: 1px solid color-mix(in oklch, ${L.neutral[900]} 8%, transparent);
|
|
333
|
+
border-radius: ${w[3]};
|
|
334
|
+
padding: ${w[3]};
|
|
335
|
+
box-shadow: 0 ${w[1]} ${w[4]} color-mix(in oklch, ${L.neutral[900]} 6%, transparent);
|
|
336
|
+
font-family: ${wt};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.vd-attribute {
|
|
340
|
+
display: flex;
|
|
341
|
+
flex-direction: column;
|
|
342
|
+
gap: ${w[1.5]};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/* Micro-label: recedes so the controls lead. */
|
|
346
|
+
.vd-attribute-label {
|
|
347
|
+
font-size: ${U.fontSize.xs};
|
|
348
|
+
font-weight: ${U.fontWeight.medium};
|
|
349
|
+
color: ${L.neutral[500]};
|
|
350
|
+
text-transform: uppercase;
|
|
351
|
+
letter-spacing: 0.05em;
|
|
352
|
+
font-family: ${wt};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* sidebar-right layout — a docked, full-height right panel */
|
|
356
|
+
.vd-container { --vd-sidebar-width: 300px; }
|
|
357
|
+
|
|
358
|
+
.vd-hidden { display: none !important; }
|
|
359
|
+
|
|
360
|
+
.vd-sidebar {
|
|
361
|
+
position: absolute;
|
|
362
|
+
inset-block: 0;
|
|
363
|
+
inset-inline-end: 0;
|
|
364
|
+
inline-size: var(--vd-sidebar-width);
|
|
365
|
+
z-index: 11;
|
|
366
|
+
display: flex;
|
|
367
|
+
flex-direction: column;
|
|
368
|
+
background: color-mix(in oklch, ${L.white} 90%, transparent);
|
|
369
|
+
backdrop-filter: blur(10px);
|
|
370
|
+
border-inline-start: 1px solid color-mix(in oklch, ${L.neutral[900]} 8%, transparent);
|
|
371
|
+
box-shadow: -${w[1]} 0 ${w[4]} color-mix(in oklch, ${L.neutral[900]} 5%, transparent);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
375
|
+
.vd-sidebar { transition: transform 0.18s ease; }
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.vd-sidebar-collapsed { transform: translateX(100%); }
|
|
379
|
+
|
|
380
|
+
.vd-sidebar-header {
|
|
381
|
+
display: flex;
|
|
382
|
+
justify-content: flex-end;
|
|
383
|
+
padding: ${w[1.5]} ${w[1.5]} 0;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
.vd-sidebar-body {
|
|
387
|
+
flex: 1;
|
|
388
|
+
overflow-y: auto;
|
|
389
|
+
padding: ${w[4]};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/* attributes inside the sidebar: flat and full-width — the panel provides the frosting */
|
|
393
|
+
.vd-attributes.vd-attributes-sidebar {
|
|
394
|
+
background: transparent;
|
|
395
|
+
backdrop-filter: none;
|
|
396
|
+
border: none;
|
|
397
|
+
border-radius: 0;
|
|
398
|
+
padding: 0;
|
|
399
|
+
box-shadow: none;
|
|
400
|
+
gap: ${w[5]};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/* floating toggle, shown when the sidebar is collapsed on narrow embeds */
|
|
404
|
+
.vd-configurator-toggle {
|
|
405
|
+
position: absolute;
|
|
406
|
+
inset-block-end: ${w[3]};
|
|
407
|
+
inset-inline-end: ${w[3]};
|
|
408
|
+
z-index: 12;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/* while the panel is open, keep the corner controls clear of it */
|
|
412
|
+
.vd-layout-sidebar-right .vd-slot-top-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${w[3]}); }
|
|
413
|
+
.vd-layout-sidebar-right .vd-slot-bottom-right { inset-inline-end: calc(var(--vd-sidebar-width) + ${w[3]}); }
|
|
414
|
+
|
|
415
|
+
/* while collapsed on a narrow embed, lift the bottom-right controls above the
|
|
416
|
+
floating toggle so the AR/fullscreen buttons aren't hidden behind the
|
|
417
|
+
"open configurator" button (spacing[9] = the default toggle button height) */
|
|
418
|
+
.vd-layout-sidebar-collapsed .vd-slot-bottom-right {
|
|
419
|
+
inset-block-end: calc(${w[3]} + ${w[9]} + ${w[1.5]});
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/* Price + CTA — sit under the attribute controls, separated by a hairline */
|
|
423
|
+
.vd-commerce {
|
|
424
|
+
display: flex;
|
|
425
|
+
flex-direction: column;
|
|
426
|
+
gap: ${w[2]};
|
|
427
|
+
padding-block-start: ${w[3]};
|
|
428
|
+
border-block-start: 1px solid color-mix(in oklch, ${L.neutral[900]} 8%, transparent);
|
|
429
|
+
font-family: ${wt};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
.vd-commerce-price {
|
|
433
|
+
display: flex;
|
|
434
|
+
align-items: baseline;
|
|
435
|
+
gap: ${w[1.5]};
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.vd-price {
|
|
439
|
+
font-size: ${U.fontSize.lg};
|
|
440
|
+
font-weight: ${U.fontWeight.semibold};
|
|
441
|
+
color: ${L.neutral[900]};
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.vd-vat {
|
|
445
|
+
font-size: ${U.fontSize.xs};
|
|
446
|
+
color: ${L.neutral[500]};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.vd-cta {
|
|
450
|
+
inline-size: 100%;
|
|
451
|
+
justify-content: center;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* Failed submit is the one place red belongs: a clear, recoverable error state. */
|
|
455
|
+
.vd-commerce[data-submit="failed"] .vd-cta {
|
|
456
|
+
background: ${L.semantic.error};
|
|
457
|
+
border-color: ${L.semantic.error};
|
|
458
|
+
color: ${L.white};
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
`;function wr(){if(Po(),document.getElementById("vd-styles")!==null)return;const n=document.createElement("style");n.id="vd-styles",n.textContent=yr,document.head.appendChild(n)}function Cr(n,t){const e=document.createElement("a");e.href=`data:image/png;base64,${n}`,e.download=t,e.click()}class Er{options;settings={};container=null;loading=null;slots={topRight:null,bottomRight:null};screenshotBtn=null;actionBar=null;cameraControls=null;attributes=null;layout=null;commerce=null;constructor(t){this.options=t}attach(t){wr(),this.container=t,this.loading=new ir(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 or({onAr:this.options.onAr,onFullscreen:t?()=>{this.toggleFullscreen()}:void 0}),this.actionBar.applySettings(this.settings),this.slots.bottomRight.appendChild(this.actionBar.element),this.syncScreenshotButton(),this.placeScreenshotButton()}toggleFullscreen(){this.container!==null&&(document.fullscreenElement!==null?document.exitFullscreen():(this.options.onFullscreenEnter?.(),this.container.requestFullscreen()))}updateProgress(t,e){this.loading?.updateProgress(t,e)}showError(t){this.loading?.showError(t)}applyViewerSettings(t){this.settings=t,t.language!==void 0&&ae(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.cameraControls?.element.remove(),this.cameraControls=null,this.teardownConfigurator(),this.settings.cameraControls===!0&&(this.cameraControls=new st(this.options.cameraApi,this.options.cameraPositionApi),this.cameraControls.element.style.display="none",this.slots.topRight.appendChild(this.cameraControls.element)),this.placeScreenshotButton(),e.length!==0)){this.attributes=document.createElement("div"),this.attributes.className="vd-attributes";for(const i of e)this.attributes.appendChild(cr(i,t,this.options.eventBus,this.options.onSelect,this.options.onSubscribe));this.commerce=new hr(this.options.configuration),this.attributes.appendChild(this.commerce.element),this.layout=vr(this.settings.configuratorLayout),this.layout.attach(this.container,this.attributes)}}get viewerSettings(){return this.settings}teardownConfigurator(){this.commerce?.destroy(),this.commerce=null,this.attributes?.remove(),this.attributes=null,this.layout?.destroy(),this.layout=null}destroy(){this.loading?.destroy(),this.screenshotBtn?.element.remove(),this.actionBar?.destroy(),this.actionBar?.element.remove(),this.cameraControls?.element.remove(),this.teardownConfigurator();for(const t of Object.values(this.slots))t?.remove();this.container=null}createSlot(t,e){const i=document.createElement("div");return i.className=e,t.appendChild(i),i}syncScreenshotButton(){const t=this.settings.screenshot===!0;t&&this.screenshotBtn===null&&(this.screenshotBtn=new z({variant:"outline",size:"icon",label:Li(),icon:D.screenshot(),onClick:()=>{this.options.snapshotApi.take("snapshot.png").onDeveloped(({data:e,filename:i})=>{Cr(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 _r={};class Sr{defaultServer="https://server.virtualdisplay.io";options;serverHost;constructor(t,e){this.options=t,this.serverHost=e}create(){const t=this.createContainer(),e=this.createIframe();return t.appendChild(e),this.attachToParent(t),{container:t,iframe:e}}createContainer(){const t=document.createElement("div");return t.className="vd-container",Object.assign(t.style,{position:"relative",width:"100%",height:"100%",overflow:"hidden"}),t}createIframe(){const t=document.createElement("iframe");return t.src=this.buildUrl(),Object.assign(t.style,{width:"100%",height:"100%",border:"none",display:"block"}),t.setAttribute("allow","xr-spatial-tracking; fullscreen"),t}attachToParent(t){this.getParentElement().appendChild(t)}buildUrl(){const t=this.getServerUrl(),e=new URL(t);return e.searchParams.set("license",this.options.license),e.searchParams.set("model",this.options.model),this.options.language!==void 0&&e.searchParams.set("language",this.options.language),this.options.debug===!0&&e.searchParams.set("debug","true"),this.options.traceparent!==void 0&&e.searchParams.set("traceparent",this.options.traceparent),e.toString()}getServerUrl(){if(this.serverHost!==void 0)return this.serverHost;if(_r?.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 x.parentNotFound(this.options.parent);return t}}function Ar(n){const{messenger:t}=n;t.on(M.HANDSHAKE,e=>{wn(e)&&(N.logger.info("Server handshake received, flushing publisher queue"),t.markReady())}),t.on(M.SESSION,e=>{Cn(e)&&n.onSession(e.sessionId)}),t.on(M.MUTATION,e=>{En(e)&&(n.attributes.handleMutationResult(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()))}),t.on(M.SNAPSHOT,e=>{_n(e)&&n.snapshot.handleSnapshotResult(e)}),t.on(M.CAMERA,e=>{Sn(e)&&n.cameraPosition.handlePositionUpdate(e)}),t.on(M.LOADING_INDICATOR,e=>{kn(e)&&(e.error!==void 0?n.ui.showError(e.error):n.ui.updateProgress(e.progress,e.phase))}),t.on(M.CONFIG,e=>{Tn(e)&&n.applyConfig(e)}),t.on(M.MAPPING,e=>{An(e)&&(n.attributes.handleMappingReceived(e),n.configuration.handleSelectionChanged(n.attributes.getSelection()),n.ui.renderAttributeControls(n.attributes,e.attributes),n.readyStateTracker.handleMappingReceived())}),kr(n)}function kr(n){const{messenger:t}=n;t.on(M.FOCUS,e=>{Rn(e)&&n.focus.handleStateReceived(e)}),t.on(M.PRICING,e=>{In(e)&&n.configuration.handlePricingReceived(e.pricing)})}class Tr{ready=!1;onReady;constructor(t){this.onReady=t}handleMappingReceived(){this.ready||(this.ready=!0,N.logger.info("Mapping received from server, client is now ready"),this.onReady?.())}get isReady(){return this.ready}clear(){this.ready=!1}}class Rr{attributes;readyStateTracker;messenger;cameraApi;cameraPositionApi;focusApi;configurationApi;snapshotApi;annotationsApi;eventBus;ui;qrModal;options;serverHost;iframe;container;readyCallbacks=[];mutationFailedCallbacks=[];viewerSessionId;constructor(t,e){this.options=t,this.serverHost=e?.serverHost,this.initializeLogging(),this.messenger=new Nn(()=>this.iframe?.contentWindow??null,e?.messengerOptions);const i=o=>{this.messenger.send(o)};this.attributes=new Ko(i,(o,r)=>{for(const s of this.mutationFailedCallbacks)s({attribute:o,value:r})}),this.snapshotApi=new Te(i),this.annotationsApi=new fe(i),this.cameraApi=new Ce(i),this.cameraPositionApi=new Yo,this.focusApi=new Se(i,o=>{this.dispatchFocusChange(o)}),this.configurationApi=new _e(o=>{this.dispatchConfigurationChange(o)},o=>{this.dispatchConfigurationSubmit(o)}),this.eventBus=new Wo,this.qrModal=new Mo,this.readyStateTracker=new Tr(()=>{const o=this.readyCallbacks;this.readyCallbacks=[];for(const r of o)r(this);this.ui.onReady()}),this.ui=new Er({snapshotApi:this.snapshotApi,cameraApi:this.cameraApi,cameraPositionApi:this.cameraPositionApi,eventBus:this.eventBus,configuration:this.configurationApi,onSelect:(o,r)=>this.attributes.select(o,r),onSubscribe:(o,r)=>this.attributes.onChange(o,r),onAr:()=>{this.activateAr()},onFullscreenEnter:()=>{this.trackFullscreen()}}),this.wireIncomingMessages(),e?.registerHandlers?.(this.messenger,i),this.messenger.start(),this.createAndConnectIframe()}wireIncomingMessages(){Ar({messenger:this.messenger,attributes:this.attributes,configuration:this.configurationApi,snapshot:this.snapshotApi,cameraPosition:this.cameraPositionApi,focus:this.focusApi,ui:this.ui,readyStateTracker:this.readyStateTracker,applyConfig:t=>{this.handleConfig(t)},onSession:t=>{this.viewerSessionId=t}})}dispatchFocusChange(t){this.container?.dispatchEvent(new CustomEvent(Q.FOCUS_CHANGE,{detail:t,bubbles:!0}))}dispatchConfigurationChange(t){this.container?.dispatchEvent(new CustomEvent(Q.CONFIGURATION_CHANGE,{detail:t??null,bubbles:!0}))}dispatchConfigurationSubmit(t){this.container?.dispatchEvent(new CustomEvent(Q.CONFIGURATION_SUBMIT,{detail:t,bubbles:!0}))}handleConfig(t){const e=t.viewerSettings,i=this.options.viewerSettings;if(e!==void 0||i!==void 0){const o=i!==void 0?{...e??{},...i}:e;if(i!==void 0&&e!==void 0){const r=Object.entries(i).filter(([s,a])=>e[s]!==a).map(([s,a])=>`${s} (metadata: ${e[s]??"undefined"}, override: ${a})`);r.length>0&&N.logger.warn(`Viewer settings override active: ${r.join(", ")}`)}this.ui.applyViewerSettings(o),this.annotationsApi.setEnabled(o.annotations!==!1)}this.cameraPositionApi.applyLimits(t.cameraLimits)}activateAr(){if(Fo()){this.messenger.send({type:M.AR_ACTIVATE});return}this.qrModal.show(this.iframe?.src??"")}trackFullscreen(){this.messenger.send({type:M.FULLSCREEN})}initializeLogging(){this.options.debug===!0&&we(),N.logger.info("Initializing Virtualdisplay client",{model:this.options.model})}createAndConnectIframe(){const e=new Sr(this.options,this.serverHost).create();this.container=e.container,this.iframe=e.iframe,this.eventBus.attach(this.container),this.ui.attach(this.container);try{const i=new URL(this.iframe.src).origin;this.messenger.setTargetOrigin(i)}catch{}}select(t,e){this.attributes.select(t,e)}getValues(t){return this.attributes.getValues(t)}getValue(t,e){return this.attributes.getValue(t,e)}onChange(t,e){this.attributes.onChange(t,e)}getAttribute(t){return this.attributes.getAttribute(t)}get isReady(){return this.readyStateTracker.isReady}onReady(t){if(this.readyStateTracker.isReady){t(this);return}this.readyCallbacks.push(t)}onMutationFailed(t){this.mutationFailedCallbacks.push(t)}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.qrModal.hide(),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}}class Ir extends Rr{}function Nr(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var X={},Et,Pe;function Mr(){return Pe||(Pe=1,Et=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Et}var _t={},G={},Le;function Y(){if(Le)return G;Le=1;let n;const t=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return G.getSymbolSize=function(i){if(!i)throw new Error('"version" cannot be null or undefined');if(i<1||i>40)throw new Error('"version" should be in range from 1 to 40');return i*4+17},G.getSymbolTotalCodewords=function(i){return t[i]},G.getBCHDigit=function(e){let i=0;for(;e!==0;)i++,e>>>=1;return i},G.setToSJISFunction=function(i){if(typeof i!="function")throw new Error('"toSJISFunc" is not a valid function.');n=i},G.isKanjiModeEnabled=function(){return typeof n<"u"},G.toSJIS=function(i){return n(i)},G}var St={},Oe;function At(){return Oe||(Oe=1,(function(n){n.L={bit:1},n.M={bit:0},n.Q={bit:3},n.H={bit:2};function t(e){if(typeof e!="string")throw new Error("Param is not a string");switch(e.toLowerCase()){case"l":case"low":return n.L;case"m":case"medium":return n.M;case"q":case"quartile":return n.Q;case"h":case"high":return n.H;default:throw new Error("Unknown EC Level: "+e)}}n.isValid=function(i){return i&&typeof i.bit<"u"&&i.bit>=0&&i.bit<4},n.from=function(i,o){if(n.isValid(i))return i;try{return t(i)}catch{return o}}})(St)),St}var kt,xe;function Br(){if(xe)return kt;xe=1;function n(){this.buffer=[],this.length=0}return n.prototype={get:function(t){const e=Math.floor(t/8);return(this.buffer[e]>>>7-t%8&1)===1},put:function(t,e){for(let i=0;i<e;i++)this.putBit((t>>>e-i-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){const e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}},kt=n,kt}var Tt,ze;function Pr(){if(ze)return Tt;ze=1;function n(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}return n.prototype.set=function(t,e,i,o){const r=t*this.size+e;this.data[r]=i,o&&(this.reservedBit[r]=!0)},n.prototype.get=function(t,e){return this.data[t*this.size+e]},n.prototype.xor=function(t,e,i){this.data[t*this.size+e]^=i},n.prototype.isReserved=function(t,e){return this.reservedBit[t*this.size+e]},Tt=n,Tt}var Rt={},De;function Lr(){return De||(De=1,(function(n){const t=Y().getSymbolSize;n.getRowColCoords=function(i){if(i===1)return[];const o=Math.floor(i/7)+2,r=t(i),s=r===145?26:Math.ceil((r-13)/(2*o-2))*2,a=[r-7];for(let l=1;l<o-1;l++)a[l]=a[l-1]-s;return a.push(6),a.reverse()},n.getPositions=function(i){const o=[],r=n.getRowColCoords(i),s=r.length;for(let a=0;a<s;a++)for(let l=0;l<s;l++)a===0&&l===0||a===0&&l===s-1||a===s-1&&l===0||o.push([r[a],r[l]]);return o}})(Rt)),Rt}var It={},Fe;function Or(){if(Fe)return It;Fe=1;const n=Y().getSymbolSize,t=7;return It.getPositions=function(i){const o=n(i);return[[0,0],[o-t,0],[0,o-t]]},It}var Nt={},Ue;function xr(){return Ue||(Ue=1,(function(n){n.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const t={N1:3,N2:3,N3:40,N4:10};n.isValid=function(o){return o!=null&&o!==""&&!isNaN(o)&&o>=0&&o<=7},n.from=function(o){return n.isValid(o)?parseInt(o,10):void 0},n.getPenaltyN1=function(o){const r=o.size;let s=0,a=0,l=0,c=null,u=null;for(let h=0;h<r;h++){a=l=0,c=u=null;for(let f=0;f<r;f++){let d=o.get(h,f);d===c?a++:(a>=5&&(s+=t.N1+(a-5)),c=d,a=1),d=o.get(f,h),d===u?l++:(l>=5&&(s+=t.N1+(l-5)),u=d,l=1)}a>=5&&(s+=t.N1+(a-5)),l>=5&&(s+=t.N1+(l-5))}return s},n.getPenaltyN2=function(o){const r=o.size;let s=0;for(let a=0;a<r-1;a++)for(let l=0;l<r-1;l++){const c=o.get(a,l)+o.get(a,l+1)+o.get(a+1,l)+o.get(a+1,l+1);(c===4||c===0)&&s++}return s*t.N2},n.getPenaltyN3=function(o){const r=o.size;let s=0,a=0,l=0;for(let c=0;c<r;c++){a=l=0;for(let u=0;u<r;u++)a=a<<1&2047|o.get(c,u),u>=10&&(a===1488||a===93)&&s++,l=l<<1&2047|o.get(u,c),u>=10&&(l===1488||l===93)&&s++}return s*t.N3},n.getPenaltyN4=function(o){let r=0;const s=o.data.length;for(let l=0;l<s;l++)r+=o.data[l];return Math.abs(Math.ceil(r*100/s/5)-10)*t.N4};function e(i,o,r){switch(i){case n.Patterns.PATTERN000:return(o+r)%2===0;case n.Patterns.PATTERN001:return o%2===0;case n.Patterns.PATTERN010:return r%3===0;case n.Patterns.PATTERN011:return(o+r)%3===0;case n.Patterns.PATTERN100:return(Math.floor(o/2)+Math.floor(r/3))%2===0;case n.Patterns.PATTERN101:return o*r%2+o*r%3===0;case n.Patterns.PATTERN110:return(o*r%2+o*r%3)%2===0;case n.Patterns.PATTERN111:return(o*r%3+(o+r)%2)%2===0;default:throw new Error("bad maskPattern:"+i)}}n.applyMask=function(o,r){const s=r.size;for(let a=0;a<s;a++)for(let l=0;l<s;l++)r.isReserved(l,a)||r.xor(l,a,e(o,l,a))},n.getBestMask=function(o,r){const s=Object.keys(n.Patterns).length;let a=0,l=1/0;for(let c=0;c<s;c++){r(c),n.applyMask(c,o);const u=n.getPenaltyN1(o)+n.getPenaltyN2(o)+n.getPenaltyN3(o)+n.getPenaltyN4(o);n.applyMask(c,o),u<l&&(l=u,a=c)}return a}})(Nt)),Nt}var at={},$e;function Ve(){if($e)return at;$e=1;const n=At(),t=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],e=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return at.getBlocksCount=function(o,r){switch(r){case n.L:return t[(o-1)*4+0];case n.M:return t[(o-1)*4+1];case n.Q:return t[(o-1)*4+2];case n.H:return t[(o-1)*4+3];default:return}},at.getTotalCodewordsCount=function(o,r){switch(r){case n.L:return e[(o-1)*4+0];case n.M:return e[(o-1)*4+1];case n.Q:return e[(o-1)*4+2];case n.H:return e[(o-1)*4+3];default:return}},at}var Mt={},nt={},qe;function zr(){if(qe)return nt;qe=1;const n=new Uint8Array(512),t=new Uint8Array(256);return(function(){let i=1;for(let o=0;o<255;o++)n[o]=i,t[i]=o,i<<=1,i&256&&(i^=285);for(let o=255;o<512;o++)n[o]=n[o-255]})(),nt.log=function(i){if(i<1)throw new Error("log("+i+")");return t[i]},nt.exp=function(i){return n[i]},nt.mul=function(i,o){return i===0||o===0?0:n[t[i]+t[o]]},nt}var je;function Dr(){return je||(je=1,(function(n){const t=zr();n.mul=function(i,o){const r=new Uint8Array(i.length+o.length-1);for(let s=0;s<i.length;s++)for(let a=0;a<o.length;a++)r[s+a]^=t.mul(i[s],o[a]);return r},n.mod=function(i,o){let r=new Uint8Array(i);for(;r.length-o.length>=0;){const s=r[0];for(let l=0;l<o.length;l++)r[l]^=t.mul(o[l],s);let a=0;for(;a<r.length&&r[a]===0;)a++;r=r.slice(a)}return r},n.generateECPolynomial=function(i){let o=new Uint8Array([1]);for(let r=0;r<i;r++)o=n.mul(o,new Uint8Array([1,t.exp(r)]));return o}})(Mt)),Mt}var Bt,He;function Fr(){if(He)return Bt;He=1;const n=Dr();function t(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}return t.prototype.initialize=function(i){this.degree=i,this.genPoly=n.generateECPolynomial(this.degree)},t.prototype.encode=function(i){if(!this.genPoly)throw new Error("Encoder not initialized");const o=new Uint8Array(i.length+this.degree);o.set(i);const r=n.mod(o,this.genPoly),s=this.degree-r.length;if(s>0){const a=new Uint8Array(this.degree);return a.set(r,s),a}return r},Bt=t,Bt}var Pt={},Lt={},Ot={},Ge;function Ke(){return Ge||(Ge=1,Ot.isValid=function(t){return!isNaN(t)&&t>=1&&t<=40}),Ot}var q={},Ye;function Je(){if(Ye)return q;Ye=1;const n="[0-9]+",t="[A-Z $%*+\\-./:]+";let e="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";e=e.replace(/u/g,"\\u");const i="(?:(?![A-Z0-9 $%*+\\-./:]|"+e+`)(?:.|[\r
|
|
462
|
+
]))+`;q.KANJI=new RegExp(e,"g"),q.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),q.BYTE=new RegExp(i,"g"),q.NUMERIC=new RegExp(n,"g"),q.ALPHANUMERIC=new RegExp(t,"g");const o=new RegExp("^"+e+"$"),r=new RegExp("^"+n+"$"),s=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return q.testKanji=function(l){return o.test(l)},q.testNumeric=function(l){return r.test(l)},q.testAlphanumeric=function(l){return s.test(l)},q}var Ze;function J(){return Ze||(Ze=1,(function(n){const t=Ke(),e=Je();n.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},n.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},n.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},n.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},n.MIXED={bit:-1},n.getCharCountIndicator=function(r,s){if(!r.ccBits)throw new Error("Invalid mode: "+r);if(!t.isValid(s))throw new Error("Invalid version: "+s);return s>=1&&s<10?r.ccBits[0]:s<27?r.ccBits[1]:r.ccBits[2]},n.getBestModeForData=function(r){return e.testNumeric(r)?n.NUMERIC:e.testAlphanumeric(r)?n.ALPHANUMERIC:e.testKanji(r)?n.KANJI:n.BYTE},n.toString=function(r){if(r&&r.id)return r.id;throw new Error("Invalid mode")},n.isValid=function(r){return r&&r.bit&&r.ccBits};function i(o){if(typeof o!="string")throw new Error("Param is not a string");switch(o.toLowerCase()){case"numeric":return n.NUMERIC;case"alphanumeric":return n.ALPHANUMERIC;case"kanji":return n.KANJI;case"byte":return n.BYTE;default:throw new Error("Unknown mode: "+o)}}n.from=function(r,s){if(n.isValid(r))return r;try{return i(r)}catch{return s}}})(Lt)),Lt}var We;function Ur(){return We||(We=1,(function(n){const t=Y(),e=Ve(),i=At(),o=J(),r=Ke(),s=7973,a=t.getBCHDigit(s);function l(f,d,p){for(let k=1;k<=40;k++)if(d<=n.getCapacity(k,p,f))return k}function c(f,d){return o.getCharCountIndicator(f,d)+4}function u(f,d){let p=0;return f.forEach(function(k){const P=c(k.mode,d);p+=P+k.getBitsLength()}),p}function h(f,d){for(let p=1;p<=40;p++)if(u(f,p)<=n.getCapacity(p,d,o.MIXED))return p}n.from=function(d,p){return r.isValid(d)?parseInt(d,10):p},n.getCapacity=function(d,p,k){if(!r.isValid(d))throw new Error("Invalid QR Code version");typeof k>"u"&&(k=o.BYTE);const P=t.getSymbolTotalCodewords(d),_=e.getTotalCodewordsCount(d,p),I=(P-_)*8;if(k===o.MIXED)return I;const T=I-c(k,d);switch(k){case o.NUMERIC:return Math.floor(T/10*3);case o.ALPHANUMERIC:return Math.floor(T/11*2);case o.KANJI:return Math.floor(T/13);case o.BYTE:default:return Math.floor(T/8)}},n.getBestVersionForData=function(d,p){let k;const P=i.from(p,i.M);if(Array.isArray(d)){if(d.length>1)return h(d,P);if(d.length===0)return 1;k=d[0]}else k=d;return l(k.mode,k.getLength(),P)},n.getEncodedBits=function(d){if(!r.isValid(d)||d<7)throw new Error("Invalid QR Code version");let p=d<<12;for(;t.getBCHDigit(p)-a>=0;)p^=s<<t.getBCHDigit(p)-a;return d<<12|p}})(Pt)),Pt}var xt={},Qe;function $r(){if(Qe)return xt;Qe=1;const n=Y(),t=1335,e=21522,i=n.getBCHDigit(t);return xt.getEncodedBits=function(r,s){const a=r.bit<<3|s;let l=a<<10;for(;n.getBCHDigit(l)-i>=0;)l^=t<<n.getBCHDigit(l)-i;return(a<<10|l)^e},xt}var zt={},Dt,Xe;function Vr(){if(Xe)return Dt;Xe=1;const n=J();function t(e){this.mode=n.NUMERIC,this.data=e.toString()}return t.getBitsLength=function(i){return 10*Math.floor(i/3)+(i%3?i%3*3+1:0)},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(i){let o,r,s;for(o=0;o+3<=this.data.length;o+=3)r=this.data.substr(o,3),s=parseInt(r,10),i.put(s,10);const a=this.data.length-o;a>0&&(r=this.data.substr(o),s=parseInt(r,10),i.put(s,a*3+1))},Dt=t,Dt}var Ft,tn;function qr(){if(tn)return Ft;tn=1;const n=J(),t=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function e(i){this.mode=n.ALPHANUMERIC,this.data=i}return e.getBitsLength=function(o){return 11*Math.floor(o/2)+6*(o%2)},e.prototype.getLength=function(){return this.data.length},e.prototype.getBitsLength=function(){return e.getBitsLength(this.data.length)},e.prototype.write=function(o){let r;for(r=0;r+2<=this.data.length;r+=2){let s=t.indexOf(this.data[r])*45;s+=t.indexOf(this.data[r+1]),o.put(s,11)}this.data.length%2&&o.put(t.indexOf(this.data[r]),6)},Ft=e,Ft}var Ut,en;function jr(){if(en)return Ut;en=1;const n=J();function t(e){this.mode=n.BYTE,typeof e=="string"?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}return t.getBitsLength=function(i){return i*8},t.prototype.getLength=function(){return this.data.length},t.prototype.getBitsLength=function(){return t.getBitsLength(this.data.length)},t.prototype.write=function(e){for(let i=0,o=this.data.length;i<o;i++)e.put(this.data[i],8)},Ut=t,Ut}var $t,nn;function Hr(){if(nn)return $t;nn=1;const n=J(),t=Y();function e(i){this.mode=n.KANJI,this.data=i}return e.getBitsLength=function(o){return o*13},e.prototype.getLength=function(){return this.data.length},e.prototype.getBitsLength=function(){return e.getBitsLength(this.data.length)},e.prototype.write=function(i){let o;for(o=0;o<this.data.length;o++){let r=t.toSJIS(this.data[o]);if(r>=33088&&r<=40956)r-=33088;else if(r>=57408&&r<=60351)r-=49472;else throw new Error("Invalid SJIS character: "+this.data[o]+`
|
|
463
|
+
Make sure your charset is UTF-8`);r=(r>>>8&255)*192+(r&255),i.put(r,13)}},$t=e,$t}var Vt={exports:{}},on;function Gr(){return on||(on=1,(function(n){var t={single_source_shortest_paths:function(e,i,o){var r={},s={};s[i]=0;var a=t.PriorityQueue.make();a.push(i,0);for(var l,c,u,h,f,d,p,k,P;!a.empty();){l=a.pop(),c=l.value,h=l.cost,f=e[c]||{};for(u in f)f.hasOwnProperty(u)&&(d=f[u],p=h+d,k=s[u],P=typeof s[u]>"u",(P||k>p)&&(s[u]=p,a.push(u,p),r[u]=c))}if(typeof o<"u"&&typeof s[o]>"u"){var _=["Could not find a path from ",i," to ",o,"."].join("");throw new Error(_)}return r},extract_shortest_path_from_predecessor_list:function(e,i){for(var o=[],r=i;r;)o.push(r),e[r],r=e[r];return o.reverse(),o},find_path:function(e,i,o){var r=t.single_source_shortest_paths(e,i,o);return t.extract_shortest_path_from_predecessor_list(r,o)},PriorityQueue:{make:function(e){var i=t.PriorityQueue,o={},r;e=e||{};for(r in i)i.hasOwnProperty(r)&&(o[r]=i[r]);return o.queue=[],o.sorter=e.sorter||i.default_sorter,o},default_sorter:function(e,i){return e.cost-i.cost},push:function(e,i){var o={value:e,cost:i};this.queue.push(o),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};n.exports=t})(Vt)),Vt.exports}var rn;function Kr(){return rn||(rn=1,(function(n){const t=J(),e=Vr(),i=qr(),o=jr(),r=Hr(),s=Je(),a=Y(),l=Gr();function c(_){return unescape(encodeURIComponent(_)).length}function u(_,I,T){const S=[];let O;for(;(O=_.exec(T))!==null;)S.push({data:O[0],index:O.index,mode:I,length:O[0].length});return S}function h(_){const I=u(s.NUMERIC,t.NUMERIC,_),T=u(s.ALPHANUMERIC,t.ALPHANUMERIC,_);let S,O;return a.isKanjiModeEnabled()?(S=u(s.BYTE,t.BYTE,_),O=u(s.KANJI,t.KANJI,_)):(S=u(s.BYTE_KANJI,t.BYTE,_),O=[]),I.concat(T,S,O).sort(function(C,y){return C.index-y.index}).map(function(C){return{data:C.data,mode:C.mode,length:C.length}})}function f(_,I){switch(I){case t.NUMERIC:return e.getBitsLength(_);case t.ALPHANUMERIC:return i.getBitsLength(_);case t.KANJI:return r.getBitsLength(_);case t.BYTE:return o.getBitsLength(_)}}function d(_){return _.reduce(function(I,T){const S=I.length-1>=0?I[I.length-1]:null;return S&&S.mode===T.mode?(I[I.length-1].data+=T.data,I):(I.push(T),I)},[])}function p(_){const I=[];for(let T=0;T<_.length;T++){const S=_[T];switch(S.mode){case t.NUMERIC:I.push([S,{data:S.data,mode:t.ALPHANUMERIC,length:S.length},{data:S.data,mode:t.BYTE,length:S.length}]);break;case t.ALPHANUMERIC:I.push([S,{data:S.data,mode:t.BYTE,length:S.length}]);break;case t.KANJI:I.push([S,{data:S.data,mode:t.BYTE,length:c(S.data)}]);break;case t.BYTE:I.push([{data:S.data,mode:t.BYTE,length:c(S.data)}])}}return I}function k(_,I){const T={},S={start:{}};let O=["start"];for(let m=0;m<_.length;m++){const C=_[m],y=[];for(let g=0;g<C.length;g++){const A=C[g],b=""+m+g;y.push(b),T[b]={node:A,lastCount:0},S[b]={};for(let E=0;E<O.length;E++){const v=O[E];T[v]&&T[v].node.mode===A.mode?(S[v][b]=f(T[v].lastCount+A.length,A.mode)-f(T[v].lastCount,A.mode),T[v].lastCount+=A.length):(T[v]&&(T[v].lastCount=A.length),S[v][b]=f(A.length,A.mode)+4+t.getCharCountIndicator(A.mode,I))}}O=y}for(let m=0;m<O.length;m++)S[O[m]].end=0;return{map:S,table:T}}function P(_,I){let T;const S=t.getBestModeForData(_);if(T=t.from(I,S),T!==t.BYTE&&T.bit<S.bit)throw new Error('"'+_+'" cannot be encoded with mode '+t.toString(T)+`.
|
|
464
|
+
Suggested mode is: `+t.toString(S));switch(T===t.KANJI&&!a.isKanjiModeEnabled()&&(T=t.BYTE),T){case t.NUMERIC:return new e(_);case t.ALPHANUMERIC:return new i(_);case t.KANJI:return new r(_);case t.BYTE:return new o(_)}}n.fromArray=function(I){return I.reduce(function(T,S){return typeof S=="string"?T.push(P(S,null)):S.data&&T.push(P(S.data,S.mode)),T},[])},n.fromString=function(I,T){const S=h(I,a.isKanjiModeEnabled()),O=p(S),m=k(O,T),C=l.find_path(m.map,"start","end"),y=[];for(let g=1;g<C.length-1;g++)y.push(m.table[C[g]].node);return n.fromArray(d(y))},n.rawSplit=function(I){return n.fromArray(h(I,a.isKanjiModeEnabled()))}})(zt)),zt}var sn;function Yr(){if(sn)return _t;sn=1;const n=Y(),t=At(),e=Br(),i=Pr(),o=Lr(),r=Or(),s=xr(),a=Ve(),l=Fr(),c=Ur(),u=$r(),h=J(),f=Kr();function d(m,C){const y=m.size,g=r.getPositions(C);for(let A=0;A<g.length;A++){const b=g[A][0],E=g[A][1];for(let v=-1;v<=7;v++)if(!(b+v<=-1||y<=b+v))for(let R=-1;R<=7;R++)E+R<=-1||y<=E+R||(v>=0&&v<=6&&(R===0||R===6)||R>=0&&R<=6&&(v===0||v===6)||v>=2&&v<=4&&R>=2&&R<=4?m.set(b+v,E+R,!0,!0):m.set(b+v,E+R,!1,!0))}}function p(m){const C=m.size;for(let y=8;y<C-8;y++){const g=y%2===0;m.set(y,6,g,!0),m.set(6,y,g,!0)}}function k(m,C){const y=o.getPositions(C);for(let g=0;g<y.length;g++){const A=y[g][0],b=y[g][1];for(let E=-2;E<=2;E++)for(let v=-2;v<=2;v++)E===-2||E===2||v===-2||v===2||E===0&&v===0?m.set(A+E,b+v,!0,!0):m.set(A+E,b+v,!1,!0)}}function P(m,C){const y=m.size,g=c.getEncodedBits(C);let A,b,E;for(let v=0;v<18;v++)A=Math.floor(v/3),b=v%3+y-8-3,E=(g>>v&1)===1,m.set(A,b,E,!0),m.set(b,A,E,!0)}function _(m,C,y){const g=m.size,A=u.getEncodedBits(C,y);let b,E;for(b=0;b<15;b++)E=(A>>b&1)===1,b<6?m.set(b,8,E,!0):b<8?m.set(b+1,8,E,!0):m.set(g-15+b,8,E,!0),b<8?m.set(8,g-b-1,E,!0):b<9?m.set(8,15-b-1+1,E,!0):m.set(8,15-b-1,E,!0);m.set(g-8,8,1,!0)}function I(m,C){const y=m.size;let g=-1,A=y-1,b=7,E=0;for(let v=y-1;v>0;v-=2)for(v===6&&v--;;){for(let R=0;R<2;R++)if(!m.isReserved(A,v-R)){let K=!1;E<C.length&&(K=(C[E]>>>b&1)===1),m.set(A,v-R,K),b--,b===-1&&(E++,b=7)}if(A+=g,A<0||y<=A){A-=g,g=-g;break}}}function T(m,C,y){const g=new e;y.forEach(function(R){g.put(R.mode.bit,4),g.put(R.getLength(),h.getCharCountIndicator(R.mode,m)),R.write(g)});const A=n.getSymbolTotalCodewords(m),b=a.getTotalCodewordsCount(m,C),E=(A-b)*8;for(g.getLengthInBits()+4<=E&&g.put(0,4);g.getLengthInBits()%8!==0;)g.putBit(0);const v=(E-g.getLengthInBits())/8;for(let R=0;R<v;R++)g.put(R%2?17:236,8);return S(g,m,C)}function S(m,C,y){const g=n.getSymbolTotalCodewords(C),A=a.getTotalCodewordsCount(C,y),b=g-A,E=a.getBlocksCount(C,y),v=g%E,R=E-v,K=Math.floor(g/E),it=Math.floor(b/E),Xr=it+1,fn=K-it,ts=new l(fn);let Gt=0;const lt=new Array(E),gn=new Array(E);let Kt=0;const es=new Uint8Array(m.buffer);for(let tt=0;tt<E;tt++){const Jt=tt<R?it:Xr;lt[tt]=es.slice(Gt,Gt+Jt),gn[tt]=ts.encode(lt[tt]),Gt+=Jt,Kt=Math.max(Kt,Jt)}const Yt=new Uint8Array(g);let mn=0,j,H;for(j=0;j<Kt;j++)for(H=0;H<E;H++)j<lt[H].length&&(Yt[mn++]=lt[H][j]);for(j=0;j<fn;j++)for(H=0;H<E;H++)Yt[mn++]=gn[H][j];return Yt}function O(m,C,y,g){let A;if(Array.isArray(m))A=f.fromArray(m);else if(typeof m=="string"){let K=C;if(!K){const it=f.rawSplit(m);K=c.getBestVersionForData(it,y)}A=f.fromString(m,K||40)}else throw new Error("Invalid data");const b=c.getBestVersionForData(A,y);if(!b)throw new Error("The amount of data is too big to be stored in a QR Code");if(!C)C=b;else if(C<b)throw new Error(`
|
|
465
|
+
The chosen QR Code version cannot contain this amount of data.
|
|
466
|
+
Minimum version required to store current data is: `+b+`.
|
|
467
|
+
`);const E=T(C,y,A),v=n.getSymbolSize(C),R=new i(v);return d(R,C),p(R),k(R,C),_(R,y,0),C>=7&&P(R,C),I(R,E),isNaN(g)&&(g=s.getBestMask(R,_.bind(null,R,y))),s.applyMask(g,R),_(R,y,g),{modules:R,version:C,errorCorrectionLevel:y,maskPattern:g,segments:A}}return _t.create=function(C,y){if(typeof C>"u"||C==="")throw new Error("No input text");let g=t.M,A,b;return typeof y<"u"&&(g=t.from(y.errorCorrectionLevel,t.M),A=c.from(y.version),b=s.from(y.maskPattern),y.toSJISFunc&&n.setToSJISFunction(y.toSJISFunc)),O(C,A,g,b)},_t}var qt={},jt={},an;function ln(){return an||(an=1,(function(n){function t(e){if(typeof e=="number"&&(e=e.toString()),typeof e!="string")throw new Error("Color should be defined as hex string");let i=e.slice().replace("#","").split("");if(i.length<3||i.length===5||i.length>8)throw new Error("Invalid hex color: "+e);(i.length===3||i.length===4)&&(i=Array.prototype.concat.apply([],i.map(function(r){return[r,r]}))),i.length===6&&i.push("F","F");const o=parseInt(i.join(""),16);return{r:o>>24&255,g:o>>16&255,b:o>>8&255,a:o&255,hex:"#"+i.slice(0,6).join("")}}n.getOptions=function(i){i||(i={}),i.color||(i.color={});const o=typeof i.margin>"u"||i.margin===null||i.margin<0?4:i.margin,r=i.width&&i.width>=21?i.width:void 0,s=i.scale||4;return{width:r,scale:r?4:s,margin:o,color:{dark:t(i.color.dark||"#000000ff"),light:t(i.color.light||"#ffffffff")},type:i.type,rendererOpts:i.rendererOpts||{}}},n.getScale=function(i,o){return o.width&&o.width>=i+o.margin*2?o.width/(i+o.margin*2):o.scale},n.getImageWidth=function(i,o){const r=n.getScale(i,o);return Math.floor((i+o.margin*2)*r)},n.qrToImageData=function(i,o,r){const s=o.modules.size,a=o.modules.data,l=n.getScale(s,r),c=Math.floor((s+r.margin*2)*l),u=r.margin*l,h=[r.color.light,r.color.dark];for(let f=0;f<c;f++)for(let d=0;d<c;d++){let p=(f*c+d)*4,k=r.color.light;if(f>=u&&d>=u&&f<c-u&&d<c-u){const P=Math.floor((f-u)/l),_=Math.floor((d-u)/l);k=h[a[P*s+_]?1:0]}i[p++]=k.r,i[p++]=k.g,i[p++]=k.b,i[p]=k.a}}})(jt)),jt}var cn;function Jr(){return cn||(cn=1,(function(n){const t=ln();function e(o,r,s){o.clearRect(0,0,r.width,r.height),r.style||(r.style={}),r.height=s,r.width=s,r.style.height=s+"px",r.style.width=s+"px"}function i(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}n.render=function(r,s,a){let l=a,c=s;typeof l>"u"&&(!s||!s.getContext)&&(l=s,s=void 0),s||(c=i()),l=t.getOptions(l);const u=t.getImageWidth(r.modules.size,l),h=c.getContext("2d"),f=h.createImageData(u,u);return t.qrToImageData(f.data,r,l),e(h,c,u),h.putImageData(f,0,0),c},n.renderToDataURL=function(r,s,a){let l=a;typeof l>"u"&&(!s||!s.getContext)&&(l=s,s=void 0),l||(l={});const c=n.render(r,s,l),u=l.type||"image/png",h=l.rendererOpts||{};return c.toDataURL(u,h.quality)}})(qt)),qt}var Ht={},un;function Zr(){if(un)return Ht;un=1;const n=ln();function t(o,r){const s=o.a/255,a=r+'="'+o.hex+'"';return s<1?a+" "+r+'-opacity="'+s.toFixed(2).slice(1)+'"':a}function e(o,r,s){let a=o+r;return typeof s<"u"&&(a+=" "+s),a}function i(o,r,s){let a="",l=0,c=!1,u=0;for(let h=0;h<o.length;h++){const f=Math.floor(h%r),d=Math.floor(h/r);!f&&!c&&(c=!0),o[h]?(u++,h>0&&f>0&&o[h-1]||(a+=c?e("M",f+s,.5+d+s):e("m",l,0),l=0,c=!1),f+1<r&&o[h+1]||(a+=e("h",u),u=0)):l++}return a}return Ht.render=function(r,s,a){const l=n.getOptions(s),c=r.modules.size,u=r.modules.data,h=c+l.margin*2,f=l.color.light.a?"<path "+t(l.color.light,"fill")+' d="M0 0h'+h+"v"+h+'H0z"/>':"",d="<path "+t(l.color.dark,"stroke")+' d="'+i(u,c,l.margin)+'"/>',p='viewBox="0 0 '+h+" "+h+'"',P='<svg xmlns="http://www.w3.org/2000/svg" '+(l.width?'width="'+l.width+'" height="'+l.width+'" ':"")+p+' shape-rendering="crispEdges">'+f+d+`</svg>
|
|
468
|
+
`;return typeof a=="function"&&a(null,P),P},Ht}var dn;function Wr(){if(dn)return X;dn=1;const n=Mr(),t=Yr(),e=Jr(),i=Zr();function o(r,s,a,l,c){const u=[].slice.call(arguments,1),h=u.length,f=typeof u[h-1]=="function";if(!f&&!n())throw new Error("Callback required as last argument");if(f){if(h<2)throw new Error("Too few arguments provided");h===2?(c=a,a=s,s=l=void 0):h===3&&(s.getContext&&typeof c>"u"?(c=l,l=void 0):(c=l,l=a,a=s,s=void 0))}else{if(h<1)throw new Error("Too few arguments provided");return h===1?(a=s,s=l=void 0):h===2&&!s.getContext&&(l=a,a=s,s=void 0),new Promise(function(d,p){try{const k=t.create(a,l);d(r(k,s,l))}catch(k){p(k)}})}try{const d=t.create(a,l);c(null,r(d,s,l))}catch(d){c(d)}}return X.create=t.create,X.toCanvas=o.bind(null,e.render),X.toDataURL=o.bind(null,e.renderToDataURL),X.toString=o.bind(null,function(r,s,a){return i.render(r,a)}),X}var hn=Wr();const Qr=et({__proto__:null,default:Nr(hn)},[hn]);N.Annotations=fe,N.Attribute=me,N.AttributeValue=ge,N.Camera=Ce,N.Configuration=_e,N.ERROR_CODES=V,N.Focus=Se,N.Photo=Ae,N.Snapshot=Te,N.VD_EVENTS=Q,N.VirtualdisplayClient=Ir,N.VirtualdisplayError=x,N.enableDebugMode=we,N.isDebugMode=Go,Object.defineProperty(N,Symbol.toStringTag,{value:"Module"})}));
|