@virtualdisplay.io/client 4.0.0-alpha.1 → 4.0.0-alpha.10
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 +68 -0
- package/README.md +105 -157
- package/dist/browser-CDLfpTNV.cjs +8 -0
- package/dist/browser-DxtIwHNu.js +1227 -0
- package/dist/chunk-BcutgqC9.cjs +1 -0
- package/dist/chunk-C_CI6nMA.js +13 -0
- package/dist/src/annotations/annotations.d.ts +20 -0
- package/dist/src/annotations/annotations.d.ts.map +1 -0
- package/dist/src/annotations/index.d.ts +2 -0
- package/dist/src/annotations/index.d.ts.map +1 -0
- package/dist/src/attributes/attribute.d.ts +38 -0
- package/dist/src/attributes/attribute.d.ts.map +1 -0
- package/dist/src/attributes/attributes.d.ts +43 -0
- package/dist/src/attributes/attributes.d.ts.map +1 -0
- package/dist/src/attributes/selections.d.ts +16 -0
- package/dist/src/attributes/selections.d.ts.map +1 -0
- package/dist/src/attributes/value.d.ts +13 -0
- package/dist/src/attributes/value.d.ts.map +1 -0
- package/dist/src/camera/camera.d.ts +40 -0
- package/dist/src/camera/camera.d.ts.map +1 -0
- package/dist/src/camera/index.d.ts +4 -0
- package/dist/src/camera/index.d.ts.map +1 -0
- package/dist/src/camera/position.d.ts +56 -0
- package/dist/src/camera/position.d.ts.map +1 -0
- package/dist/src/client/client.d.ts +51 -0
- package/dist/src/client/client.d.ts.map +1 -0
- package/dist/src/client/error.d.ts +26 -0
- package/dist/src/client/error.d.ts.map +1 -0
- package/dist/src/client/iframe-builder.d.ts +27 -0
- package/dist/src/client/iframe-builder.d.ts.map +1 -0
- package/dist/src/client/options.d.ts +19 -0
- package/dist/src/client/options.d.ts.map +1 -0
- package/dist/src/client/ready-state-tracker.d.ts +13 -0
- package/dist/src/client/ready-state-tracker.d.ts.map +1 -0
- package/dist/src/client/types.d.ts +19 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/snapshot/index.d.ts +3 -0
- package/dist/src/snapshot/index.d.ts.map +1 -0
- package/dist/src/snapshot/photo.d.ts +47 -0
- package/dist/src/snapshot/photo.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot.d.ts +30 -0
- package/dist/src/snapshot/snapshot.d.ts.map +1 -0
- package/dist/src/ui/action-bar.d.ts +18 -0
- package/dist/src/ui/action-bar.d.ts.map +1 -0
- package/dist/src/ui/camera-controls.d.ts +8 -0
- package/dist/src/ui/camera-controls.d.ts.map +1 -0
- package/dist/src/ui/controls/attribute-group.d.ts +6 -0
- package/dist/src/ui/controls/attribute-group.d.ts.map +1 -0
- package/dist/src/ui/event-bus.d.ts +12 -0
- package/dist/src/ui/event-bus.d.ts.map +1 -0
- package/dist/src/ui/loading.d.ts +43 -0
- package/dist/src/ui/loading.d.ts.map +1 -0
- package/dist/src/ui/standard-interface.d.ts +42 -0
- package/dist/src/ui/standard-interface.d.ts.map +1 -0
- package/dist/src/ui/styles.d.ts +3 -0
- package/dist/src/ui/styles.d.ts.map +1 -0
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/virtualdisplay.client.cjs.js +311 -2
- package/dist/virtualdisplay.client.es.js +2226 -2
- package/dist/virtualdisplay.client.umd.js +318 -2
- package/package.json +3 -3
- package/dist/index.d.ts +0 -415
- package/dist/virtualdisplay.client.cjs.js.map +0 -1
- package/dist/virtualdisplay.client.es.js.map +0 -1
- package/dist/virtualdisplay.client.umd.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.0.0-alpha.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
Fix AR button on mobile to launch native AR (Quick Look on iOS, Scene Viewer on Android) instead of the QR modal. Fix fullscreen button on iPhone Safari.
|
|
8
|
+
|
|
9
|
+
## 4.0.0-alpha.9
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
Fix state mix-up when multiple `VirtualdisplayClient` instances are mounted on the same page. Each client now correctly receives only its own server replies, so loading state, mapping, and mutation results no longer cross between viewers.
|
|
14
|
+
|
|
15
|
+
## 4.0.0-alpha.8
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
Add `viewerSettings` option to `ClientOptions`. Pass a partial `ViewerSettings` to override fields like `ar`, `fullscreen`, `cameraControls`, `attributeControls`, or `annotations` without changing the model's metadata.
|
|
20
|
+
|
|
21
|
+
Add annotations API: `client.annotations.setEnabled(enabled)` toggles annotation markers, and `startPlacing()` / `stopPlacing()` / `onPlaced(callback)` enable click-to-place flows for custom annotation editors. New `AnnotationPosition` type is exported.
|
|
22
|
+
|
|
23
|
+
Add `attributeControls` field to `ViewerSettings`. Set to `false` to hide the built-in attribute selector while keeping `client.select()` and `client.onChange()` available.
|
|
24
|
+
|
|
25
|
+
Fix toolbar buttons appearing briefly before the loading indicator clears.
|
|
26
|
+
|
|
27
|
+
Fix annotation markers ignoring `annotations: false` when set via the `viewerSettings` override.
|
|
28
|
+
|
|
29
|
+
Fix loading indicator hanging when model metadata is unavailable.
|
|
30
|
+
|
|
31
|
+
Internal code quality improvements.
|
|
32
|
+
|
|
33
|
+
## 4.0.0-alpha.7
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
Restructure standard interface layout to use corner slots. Camera controls and screenshot button now share a single card when both are enabled.
|
|
38
|
+
|
|
39
|
+
## 4.0.0-alpha.6
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
Fix camera control buttons accumulating clicks correctly.
|
|
44
|
+
|
|
45
|
+
## 4.0.0-alpha.5
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
Internal code quality improvements.
|
|
50
|
+
|
|
51
|
+
Ship complete TypeScript type definitions for all exports.
|
|
52
|
+
|
|
53
|
+
## 4.0.0-alpha.4
|
|
54
|
+
|
|
55
|
+
### Minor Changes
|
|
56
|
+
|
|
57
|
+
Add `language` option to `ClientOptions`. Pass a BCP 47 language tag (e.g. `"nl"`, `"de"`) to override the viewer language at initialisation time. Useful when embedding the same model on multiple pages with different languages.
|
|
58
|
+
|
|
59
|
+
Add built-in standard interface: loading indicator, toolbar (screenshot, AR, fullscreen), camera controls, and attribute controls are now rendered automatically inside the viewer container. UI is driven by `viewerSettings` received from the server and requires no manual setup.
|
|
60
|
+
|
|
61
|
+
### Patch Changes
|
|
62
|
+
|
|
63
|
+
Fix build target: use ESNext in tsconfig to resolve rolldown bundling issues with ES2022 class fields.
|
|
64
|
+
|
|
65
|
+
## 4.0.0-alpha.2
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
Build optimisations.
|
|
70
|
+
|
|
3
71
|
## 4.0.0-alpha.1
|
|
4
72
|
|
|
5
73
|
### Major Changes
|
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
TypeScript library for embedding interactive 3D product models in web
|
|
4
4
|
applications.
|
|
5
5
|
|
|
6
|
+
- Built-in viewer UI with loading indicator, product controls, and action bar
|
|
6
7
|
- Simple attribute-based API for product configurators
|
|
7
8
|
- Server-driven configuration, no client-side mapping needed
|
|
8
9
|
- Fire-and-forget messaging with automatic state synchronisation
|
|
@@ -60,43 +61,19 @@ The 3D server hosts the viewer in an iframe, keeping WebGL complexity isolated
|
|
|
60
61
|
from your application. The client library handles all communication via
|
|
61
62
|
postMessage.
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
graph LR
|
|
65
|
-
A[Your application] -->|API calls| B[VirtualdisplayClient]
|
|
66
|
-
B -->|postMessage| C[3D server iframe]
|
|
67
|
-
C -->|Events| B
|
|
68
|
-
B -->|State updates| A
|
|
69
|
-
```
|
|
64
|
+

|
|
70
65
|
|
|
71
|
-
On startup, the server
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
sequenceDiagram
|
|
77
|
-
participant UI as Your UI
|
|
78
|
-
participant Client as VirtualdisplayClient
|
|
79
|
-
participant Server as 3D server
|
|
80
|
-
|
|
81
|
-
UI ->> Client: new VirtualdisplayClient(options)
|
|
82
|
-
Client ->> Client: Create iframe
|
|
83
|
-
Note right of Client: Outgoing messages queued
|
|
84
|
-
Server ->> Client: READY
|
|
85
|
-
Note right of Client: Queue flushed
|
|
86
|
-
opt UI or camera options configured
|
|
87
|
-
Client ->> Server: CONFIG
|
|
88
|
-
end
|
|
89
|
-
Server ->> Client: MAPPING (attributes + values + defaults)
|
|
90
|
-
Client ->> Client: Store attribute definitions
|
|
91
|
-
Server ->> Client: MUTATION result (defaults, isInitial: true)
|
|
92
|
-
Client ->> UI: onReady + onChange callbacks fire
|
|
93
|
-
```
|
|
66
|
+
On startup, the server sends the client its configuration (viewer settings,
|
|
67
|
+
camera limits) and available product attributes. The loading indicator shows
|
|
68
|
+
progress while the model downloads.
|
|
69
|
+
|
|
70
|
+

|
|
94
71
|
|
|
95
72
|
1. Client creates iframe; outgoing messages are queued until the server is ready.
|
|
96
|
-
2. Server sends `
|
|
97
|
-
3.
|
|
98
|
-
4. Server sends `
|
|
99
|
-
5. `
|
|
73
|
+
2. Server sends `HANDSHAKE` when its message listener is active; client flushes queue.
|
|
74
|
+
3. Server sends progress updates while the model downloads. The client displays these in the loading indicator.
|
|
75
|
+
4. Server sends `CONFIG` with viewer settings and camera limits from model metadata.
|
|
76
|
+
5. Server sends `MAPPING` with attribute definitions, values, and defaults. `onReady` fires.
|
|
100
77
|
|
|
101
78
|
## Product configuration
|
|
102
79
|
|
|
@@ -104,23 +81,7 @@ Configure product options by selecting attribute values. The server defines
|
|
|
104
81
|
which attributes exist (e.g. "Color", "Size") and which values each has
|
|
105
82
|
(e.g. "red", "blue"). You select values; the 3D model updates automatically.
|
|
106
83
|
|
|
107
|
-
|
|
108
|
-
sequenceDiagram
|
|
109
|
-
participant UI as Your UI
|
|
110
|
-
participant Client as VirtualdisplayClient
|
|
111
|
-
participant Server as 3D server
|
|
112
|
-
|
|
113
|
-
UI ->> Client: client.select('Color', 'blue')
|
|
114
|
-
Client ->> Server: MUTATION
|
|
115
|
-
Note right of Client: Fire-and-forget
|
|
116
|
-
Server ->> Server: Apply 3D changes
|
|
117
|
-
Server ->> Client: MUTATION result
|
|
118
|
-
alt All succeeded
|
|
119
|
-
Client ->> UI: onChange callbacks fire
|
|
120
|
-
else Some failed
|
|
121
|
-
Client ->> UI: onMutationFailed callbacks fire
|
|
122
|
-
end
|
|
123
|
-
```
|
|
84
|
+

|
|
124
85
|
|
|
125
86
|
- `select()` returns immediately; the result arrives asynchronously.
|
|
126
87
|
- Each attribute in the result has its own `success` flag and optional `error`.
|
|
@@ -134,8 +95,8 @@ client.select('Color', 'blue');
|
|
|
134
95
|
client.select('Size', 'large');
|
|
135
96
|
```
|
|
136
97
|
|
|
137
|
-
Can be called
|
|
138
|
-
|
|
98
|
+
Can be called immediately after construction. Selections are buffered until the
|
|
99
|
+
server handshake completes.
|
|
139
100
|
|
|
140
101
|
### Tracking changes
|
|
141
102
|
|
|
@@ -192,22 +153,7 @@ client.onMutationFailed(({ attribute, value }) => {
|
|
|
192
153
|
Capture the current 3D view as an image. Useful for product shots, social
|
|
193
154
|
sharing, or saving configurations.
|
|
194
155
|
|
|
195
|
-
|
|
196
|
-
sequenceDiagram
|
|
197
|
-
participant UI as Your UI
|
|
198
|
-
participant Client as VirtualdisplayClient
|
|
199
|
-
participant Server as 3D server
|
|
200
|
-
|
|
201
|
-
UI ->> Client: client.snapshot.take('photo.png')
|
|
202
|
-
Client ->> Server: SNAPSHOT request
|
|
203
|
-
alt Success
|
|
204
|
-
Server ->> Client: SNAPSHOT data (base64)
|
|
205
|
-
Client ->> UI: onDeveloped callback fires
|
|
206
|
-
else Failure (e.g. no canvas)
|
|
207
|
-
Server ->> Client: SNAPSHOT error
|
|
208
|
-
Client ->> UI: onError callback fires
|
|
209
|
-
end
|
|
210
|
-
```
|
|
156
|
+

|
|
211
157
|
|
|
212
158
|
- Filename is validated client-side (extension, no path traversal).
|
|
213
159
|
- Server always responds, either with image data or an error reason.
|
|
@@ -236,21 +182,11 @@ Filename must end with `.png`. The server always returns PNG data.
|
|
|
236
182
|
|
|
237
183
|
## Camera
|
|
238
184
|
|
|
239
|
-
|
|
240
|
-
|
|
185
|
+
The standard interface includes built-in camera controls when they are
|
|
186
|
+
enabled in the Virtualdisplay portal. The camera can also be controlled
|
|
187
|
+
programmatically.
|
|
241
188
|
|
|
242
|
-
|
|
243
|
-
sequenceDiagram
|
|
244
|
-
participant UI as Your UI
|
|
245
|
-
participant Client as VirtualdisplayClient
|
|
246
|
-
participant Server as 3D server
|
|
247
|
-
|
|
248
|
-
UI ->> Client: client.camera.rotate(45).tilt(30).set()
|
|
249
|
-
Client ->> Server: CAMERA commands
|
|
250
|
-
Server ->> Client: CAMERA position
|
|
251
|
-
Client ->> UI: camera.onChange callbacks fire
|
|
252
|
-
Note right of Server: Position updates also fire on user<br/>interaction with the 3D viewport
|
|
253
|
-
```
|
|
189
|
+

|
|
254
190
|
|
|
255
191
|
- Commands accumulate via chaining; `.set()` sends them all at once.
|
|
256
192
|
- `.reset()` sends immediately without chaining.
|
|
@@ -263,7 +199,7 @@ sequenceDiagram
|
|
|
263
199
|
client.camera.rotate(45).set();
|
|
264
200
|
client.camera.rotate(90).tilt(45).zoom(150).set();
|
|
265
201
|
|
|
266
|
-
// Reset to
|
|
202
|
+
// Reset to the default position configured in the portal (sends immediately)
|
|
267
203
|
client.camera.reset();
|
|
268
204
|
```
|
|
269
205
|
|
|
@@ -283,49 +219,99 @@ console.log(client.cameraPosition.tilt);
|
|
|
283
219
|
console.log(client.cameraPosition.zoom);
|
|
284
220
|
```
|
|
285
221
|
|
|
286
|
-
##
|
|
222
|
+
## Annotations
|
|
287
223
|
|
|
288
|
-
|
|
289
|
-
|
|
224
|
+
Annotations are interactive markers placed on the 3D model. They are
|
|
225
|
+
configured and saved in the Virtualdisplay portal. The client library
|
|
226
|
+
exposes APIs to toggle their visibility and to build custom annotation
|
|
227
|
+
editors.
|
|
290
228
|
|
|
291
|
-
###
|
|
229
|
+
### Toggling annotations
|
|
292
230
|
|
|
293
231
|
```typescript
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
232
|
+
client.annotations.setEnabled(false); // Hide all markers
|
|
233
|
+
client.annotations.setEnabled(true); // Show them again
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Visibility can also be controlled via `viewerSettings.annotations` (see below).
|
|
237
|
+
|
|
238
|
+
### Placing annotations
|
|
239
|
+
|
|
240
|
+
For building a custom annotation editor, the client supports click-to-place
|
|
241
|
+
mode. Enter the mode, listen for the placed position, then exit.
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
client.annotations.onPlaced((position) => {
|
|
245
|
+
// position has x, y, z coordinates on the model surface
|
|
246
|
+
console.log(position);
|
|
302
247
|
});
|
|
248
|
+
|
|
249
|
+
// Enter placement mode. The next click on the model fires onPlaced.
|
|
250
|
+
client.annotations.startPlacing();
|
|
251
|
+
|
|
252
|
+
// Cancel placement mode without recording a click.
|
|
253
|
+
client.annotations.stopPlacing();
|
|
303
254
|
```
|
|
304
255
|
|
|
305
|
-
|
|
256
|
+
The position type is `AnnotationPosition`, exported from the package.
|
|
257
|
+
|
|
258
|
+
## Standard interface
|
|
259
|
+
|
|
260
|
+
The client renders a complete viewer UI automatically: loading indicator,
|
|
261
|
+
attribute controls, camera controls, and an action bar with AR, fullscreen,
|
|
262
|
+
and screenshot buttons. Each element is shown or hidden based on viewer
|
|
263
|
+
settings configured in the Virtualdisplay portal.
|
|
264
|
+
|
|
265
|
+
### Available settings
|
|
266
|
+
|
|
267
|
+
| Field | Type | Effect when `false` |
|
|
268
|
+
| ------------------- | --------- | ---------------------------------------------------------------------------------------------- |
|
|
269
|
+
| `ar` | `boolean` | Hides the AR button |
|
|
270
|
+
| `fullscreen` | `boolean` | Hides the fullscreen button |
|
|
271
|
+
| `screenshot` | `boolean` | Hides the screenshot button |
|
|
272
|
+
| `cameraControls` | `boolean` | Hides the camera control buttons |
|
|
273
|
+
| `attributeControls` | `boolean` | Hides the built-in attribute selector. `client.select()` and `client.onChange()` keep working. |
|
|
274
|
+
| `annotations` | `boolean` | Hides all annotation markers |
|
|
275
|
+
| `language` | `string` | Sets the viewer UI language (BCP 47, e.g. `'nl'`, `'en'`, `'de'`) |
|
|
276
|
+
|
|
277
|
+
### Overriding settings
|
|
278
|
+
|
|
279
|
+
The portal is the recommended place to change these settings: one source of
|
|
280
|
+
truth, and the viewer behaves the same wherever it is embedded.
|
|
281
|
+
|
|
282
|
+
We know there are situations where the portal alone cannot cover the case at
|
|
283
|
+
hand. For those, `ClientOptions.viewerSettings` accepts a partial override of
|
|
284
|
+
the same fields. Use it sparingly: every override is one more place where
|
|
285
|
+
the embedded viewer disagrees with the portal. Omitted fields fall back to
|
|
286
|
+
the metadata value.
|
|
287
|
+
|
|
288
|
+
Any override that differs from the metadata is logged with `console.warn`.
|
|
289
|
+
The warning is always emitted, so the deviation stays traceable when
|
|
290
|
+
something needs explaining.
|
|
306
291
|
|
|
307
292
|
```typescript
|
|
308
|
-
client
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
293
|
+
const client = new VirtualdisplayClient({
|
|
294
|
+
parent: '#product-container',
|
|
295
|
+
license: 'your-license-key',
|
|
296
|
+
model: 'sneaker',
|
|
297
|
+
viewerSettings: {
|
|
298
|
+
cameraControls: false,
|
|
299
|
+
},
|
|
300
|
+
});
|
|
316
301
|
```
|
|
317
302
|
|
|
318
303
|
## Lifecycle
|
|
319
304
|
|
|
320
305
|
### Ready state
|
|
321
306
|
|
|
322
|
-
Use `onReady` to know when the
|
|
323
|
-
|
|
324
|
-
|
|
307
|
+
Use `onReady` to know when the model and attribute definitions are available.
|
|
308
|
+
Not required before calling `select()` or `onChange()`, those are buffered
|
|
309
|
+
automatically.
|
|
325
310
|
|
|
326
311
|
```typescript
|
|
327
312
|
client.onReady(() => {
|
|
328
|
-
|
|
313
|
+
const values = client.getValues('Color');
|
|
314
|
+
console.log('Available colours:', values.map(v => v.value));
|
|
329
315
|
});
|
|
330
316
|
```
|
|
331
317
|
|
|
@@ -338,30 +324,15 @@ client.destroy();
|
|
|
338
324
|
## Constructor options
|
|
339
325
|
|
|
340
326
|
```typescript
|
|
327
|
+
import type { ViewerSettings } from '@virtualdisplay.io/client';
|
|
328
|
+
|
|
341
329
|
interface ClientOptions {
|
|
342
|
-
parent: string | HTMLElement;
|
|
343
|
-
license: string;
|
|
344
|
-
model: string;
|
|
345
|
-
debug?: boolean;
|
|
346
|
-
language?: string;
|
|
347
|
-
|
|
348
|
-
// UI elements (all visible by default)
|
|
349
|
-
ui?: {
|
|
350
|
-
arEnabled?: boolean;
|
|
351
|
-
fullscreenEnabled?: boolean;
|
|
352
|
-
loadingIndicatorEnabled?: boolean;
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
// Camera behaviour
|
|
356
|
-
camera?: {
|
|
357
|
-
initialRotate?: number; // Starting view angle (-180 to 180, 0 = front)
|
|
358
|
-
initialTilt?: number; // Starting elevation (0 = top view, 90 = side view)
|
|
359
|
-
initialZoom?: number; // Starting distance (100 = default, may need adjustment)
|
|
360
|
-
minZoom?: number; // Minimum zoom level constraint
|
|
361
|
-
maxZoom?: number; // Maximum zoom level constraint
|
|
362
|
-
minTilt?: number; // Minimum tilt angle constraint
|
|
363
|
-
maxTilt?: number; // Maximum tilt angle constraint
|
|
364
|
-
};
|
|
330
|
+
parent: string | HTMLElement; // Where to embed the 3D viewer
|
|
331
|
+
license: string; // License key from your Virtualdisplay account
|
|
332
|
+
model: string; // Which 3D model to load
|
|
333
|
+
debug?: boolean; // Shows console logs for troubleshooting
|
|
334
|
+
language?: string; // Viewer language: 'nl', 'en', or 'de'
|
|
335
|
+
viewerSettings?: Partial<ViewerSettings>; // Override fields from model metadata (see Standard interface)
|
|
365
336
|
}
|
|
366
337
|
```
|
|
367
338
|
|
|
@@ -370,37 +341,14 @@ interface ClientOptions {
|
|
|
370
341
|
The client throws `VirtualdisplayError` for known error conditions:
|
|
371
342
|
|
|
372
343
|
| Code | Meaning |
|
|
373
|
-
|
|
344
|
+
| --------------------- | ------------------------------------------------ |
|
|
345
|
+
| `NO_MAPPING` | Attribute data not yet available from the server |
|
|
374
346
|
| `ATTRIBUTE_NOT_FOUND` | Requested attribute doesn't exist in the mapping |
|
|
375
347
|
| `VALUE_NOT_FOUND` | Requested value doesn't exist for attribute |
|
|
376
348
|
| `PARENT_NOT_FOUND` | Parent element for iframe not found |
|
|
377
349
|
| `INVALID_PARAMETER` | Invalid parameter (e.g. snapshot filename) |
|
|
378
350
|
| `SNAPSHOT_FAILED` | Server could not capture the snapshot |
|
|
379
351
|
|
|
380
|
-
## Real-world example
|
|
381
|
-
|
|
382
|
-
```typescript
|
|
383
|
-
const client = new VirtualdisplayClient({
|
|
384
|
-
parent: '#product-viewer',
|
|
385
|
-
license: 'your-license',
|
|
386
|
-
model: 'dining-table',
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
// Wire up your product option buttons. Selections are buffered until ready.
|
|
390
|
-
document.querySelectorAll('.color-option').forEach((button) => {
|
|
391
|
-
button.addEventListener('click', () => {
|
|
392
|
-
client.select('topMaterial', button.dataset.value);
|
|
393
|
-
});
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
// Keep buttons in sync with 3D state
|
|
397
|
-
client.onChange('topMaterial', (selectedValue) => {
|
|
398
|
-
document.querySelectorAll('.color-option').forEach((btn) => {
|
|
399
|
-
btn.classList.toggle('active', btn.dataset.value === selectedValue.value);
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
```
|
|
403
|
-
|
|
404
352
|
## Troubleshooting
|
|
405
353
|
|
|
406
354
|
**Iframe not loading:**
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const e=require(`./chunk-BcutgqC9.cjs`);var t=e.t(((e,t)=>{t.exports=function(){return typeof Promise==`function`&&Promise.prototype&&Promise.prototype.then}})),n=e.t((e=>{var t,n=[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];e.getSymbolSize=function(e){if(!e)throw Error(`"version" cannot be null or undefined`);if(e<1||e>40)throw Error(`"version" should be in range from 1 to 40`);return e*4+17},e.getSymbolTotalCodewords=function(e){return n[e]},e.getBCHDigit=function(e){let t=0;for(;e!==0;)t++,e>>>=1;return t},e.setToSJISFunction=function(e){if(typeof e!=`function`)throw Error(`"toSJISFunc" is not a valid function.`);t=e},e.isKanjiModeEnabled=function(){return t!==void 0},e.toSJIS=function(e){return t(e)}})),r=e.t((e=>{e.L={bit:1},e.M={bit:0},e.Q={bit:3},e.H={bit:2};function t(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`l`:case`low`:return e.L;case`m`:case`medium`:return e.M;case`q`:case`quartile`:return e.Q;case`h`:case`high`:return e.H;default:throw Error(`Unknown EC Level: `+t)}}e.isValid=function(e){return e&&e.bit!==void 0&&e.bit>=0&&e.bit<4},e.from=function(n,r){if(e.isValid(n))return n;try{return t(n)}catch{return r}}})),i=e.t(((e,t)=>{function n(){this.buffer=[],this.length=0}n.prototype={get:function(e){let t=Math.floor(e/8);return(this.buffer[t]>>>7-e%8&1)==1},put:function(e,t){for(let n=0;n<t;n++)this.putBit((e>>>t-n-1&1)==1)},getLengthInBits:function(){return this.length},putBit:function(e){let t=Math.floor(this.length/8);this.buffer.length<=t&&this.buffer.push(0),e&&(this.buffer[t]|=128>>>this.length%8),this.length++}},t.exports=n})),a=e.t(((e,t)=>{function n(e){if(!e||e<1)throw Error(`BitMatrix size must be defined and greater than 0`);this.size=e,this.data=new Uint8Array(e*e),this.reservedBit=new Uint8Array(e*e)}n.prototype.set=function(e,t,n,r){let i=e*this.size+t;this.data[i]=n,r&&(this.reservedBit[i]=!0)},n.prototype.get=function(e,t){return this.data[e*this.size+t]},n.prototype.xor=function(e,t,n){this.data[e*this.size+t]^=n},n.prototype.isReserved=function(e,t){return this.reservedBit[e*this.size+t]},t.exports=n})),o=e.t((e=>{var t=n().getSymbolSize;e.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=t(e),i=r===145?26:Math.ceil((r-13)/(2*n-2))*2,a=[r-7];for(let e=1;e<n-1;e++)a[e]=a[e-1]-i;return a.push(6),a.reverse()},e.getPositions=function(t){let n=[],r=e.getRowColCoords(t),i=r.length;for(let e=0;e<i;e++)for(let t=0;t<i;t++)e===0&&t===0||e===0&&t===i-1||e===i-1&&t===0||n.push([r[e],r[t]]);return n}})),s=e.t((e=>{var t=n().getSymbolSize,r=7;e.getPositions=function(e){let n=t(e);return[[0,0],[n-r,0],[0,n-r]]}})),c=e.t((e=>{e.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var t={N1:3,N2:3,N3:40,N4:10};e.isValid=function(e){return e!=null&&e!==``&&!isNaN(e)&&e>=0&&e<=7},e.from=function(t){return e.isValid(t)?parseInt(t,10):void 0},e.getPenaltyN1=function(e){let n=e.size,r=0,i=0,a=0,o=null,s=null;for(let c=0;c<n;c++){i=a=0,o=s=null;for(let l=0;l<n;l++){let n=e.get(c,l);n===o?i++:(i>=5&&(r+=t.N1+(i-5)),o=n,i=1),n=e.get(l,c),n===s?a++:(a>=5&&(r+=t.N1+(a-5)),s=n,a=1)}i>=5&&(r+=t.N1+(i-5)),a>=5&&(r+=t.N1+(a-5))}return r},e.getPenaltyN2=function(e){let n=e.size,r=0;for(let t=0;t<n-1;t++)for(let i=0;i<n-1;i++){let n=e.get(t,i)+e.get(t,i+1)+e.get(t+1,i)+e.get(t+1,i+1);(n===4||n===0)&&r++}return r*t.N2},e.getPenaltyN3=function(e){let n=e.size,r=0,i=0,a=0;for(let t=0;t<n;t++){i=a=0;for(let o=0;o<n;o++)i=i<<1&2047|e.get(t,o),o>=10&&(i===1488||i===93)&&r++,a=a<<1&2047|e.get(o,t),o>=10&&(a===1488||a===93)&&r++}return r*t.N3},e.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let t=0;t<r;t++)n+=e.data[t];return Math.abs(Math.ceil(n*100/r/5)-10)*t.N4};function n(t,n,r){switch(t){case e.Patterns.PATTERN000:return(n+r)%2==0;case e.Patterns.PATTERN001:return n%2==0;case e.Patterns.PATTERN010:return r%3==0;case e.Patterns.PATTERN011:return(n+r)%3==0;case e.Patterns.PATTERN100:return(Math.floor(n/2)+Math.floor(r/3))%2==0;case e.Patterns.PATTERN101:return n*r%2+n*r%3==0;case e.Patterns.PATTERN110:return(n*r%2+n*r%3)%2==0;case e.Patterns.PATTERN111:return(n*r%3+(n+r)%2)%2==0;default:throw Error(`bad maskPattern:`+t)}}e.applyMask=function(e,t){let r=t.size;for(let i=0;i<r;i++)for(let a=0;a<r;a++)t.isReserved(a,i)||t.xor(a,i,n(e,a,i))},e.getBestMask=function(t,n){let r=Object.keys(e.Patterns).length,i=0,a=1/0;for(let o=0;o<r;o++){n(o),e.applyMask(o,t);let r=e.getPenaltyN1(t)+e.getPenaltyN2(t)+e.getPenaltyN3(t)+e.getPenaltyN4(t);e.applyMask(o,t),r<a&&(a=r,i=o)}return i}})),l=e.t((e=>{var t=r(),n=[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],i=[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];e.getBlocksCount=function(e,r){switch(r){case t.L:return n[(e-1)*4+0];case t.M:return n[(e-1)*4+1];case t.Q:return n[(e-1)*4+2];case t.H:return n[(e-1)*4+3];default:return}},e.getTotalCodewordsCount=function(e,n){switch(n){case t.L:return i[(e-1)*4+0];case t.M:return i[(e-1)*4+1];case t.Q:return i[(e-1)*4+2];case t.H:return i[(e-1)*4+3];default:return}}})),u=e.t((e=>{var t=new Uint8Array(512),n=new Uint8Array(256);(function(){let e=1;for(let r=0;r<255;r++)t[r]=e,n[e]=r,e<<=1,e&256&&(e^=285);for(let e=255;e<512;e++)t[e]=t[e-255]})(),e.log=function(e){if(e<1)throw Error(`log(`+e+`)`);return n[e]},e.exp=function(e){return t[e]},e.mul=function(e,r){return e===0||r===0?0:t[n[e]+n[r]]}})),d=e.t((e=>{var t=u();e.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let i=0;i<e.length;i++)for(let a=0;a<n.length;a++)r[i+a]^=t.mul(e[i],n[a]);return r},e.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let e=r[0];for(let i=0;i<n.length;i++)r[i]^=t.mul(n[i],e);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r},e.generateECPolynomial=function(n){let r=new Uint8Array([1]);for(let i=0;i<n;i++)r=e.mul(r,new Uint8Array([1,t.exp(i)]));return r}})),f=e.t(((e,t)=>{var n=d();function r(e){this.genPoly=void 0,this.degree=e,this.degree&&this.initialize(this.degree)}r.prototype.initialize=function(e){this.degree=e,this.genPoly=n.generateECPolynomial(this.degree)},r.prototype.encode=function(e){if(!this.genPoly)throw Error(`Encoder not initialized`);let t=new Uint8Array(e.length+this.degree);t.set(e);let r=n.mod(t,this.genPoly),i=this.degree-r.length;if(i>0){let e=new Uint8Array(this.degree);return e.set(r,i),e}return r},t.exports=r})),p=e.t((e=>{e.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}})),m=e.t((e=>{var t=`[0-9]+`,n=`[A-Z $%*+\\-./:]+`,r=`(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+`;r=r.replace(/u/g,`\\u`);var i=`(?:(?![A-Z0-9 $%*+\\-./:]|`+r+`)(?:.|[\r
|
|
2
|
+
]))+`;e.KANJI=new RegExp(r,`g`),e.BYTE_KANJI=RegExp(`[^A-Z0-9 $%*+\\-./:]+`,`g`),e.BYTE=new RegExp(i,`g`),e.NUMERIC=new RegExp(t,`g`),e.ALPHANUMERIC=new RegExp(n,`g`);var a=RegExp(`^`+r+`$`),o=RegExp(`^`+t+`$`),s=RegExp(`^[A-Z0-9 $%*+\\-./:]+$`);e.testKanji=function(e){return a.test(e)},e.testNumeric=function(e){return o.test(e)},e.testAlphanumeric=function(e){return s.test(e)}})),h=e.t((e=>{var t=p(),n=m();e.NUMERIC={id:`Numeric`,bit:1,ccBits:[10,12,14]},e.ALPHANUMERIC={id:`Alphanumeric`,bit:2,ccBits:[9,11,13]},e.BYTE={id:`Byte`,bit:4,ccBits:[8,16,16]},e.KANJI={id:`Kanji`,bit:8,ccBits:[8,10,12]},e.MIXED={bit:-1},e.getCharCountIndicator=function(e,n){if(!e.ccBits)throw Error(`Invalid mode: `+e);if(!t.isValid(n))throw Error(`Invalid version: `+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]},e.getBestModeForData=function(t){return n.testNumeric(t)?e.NUMERIC:n.testAlphanumeric(t)?e.ALPHANUMERIC:n.testKanji(t)?e.KANJI:e.BYTE},e.toString=function(e){if(e&&e.id)return e.id;throw Error(`Invalid mode`)},e.isValid=function(e){return e&&e.bit&&e.ccBits};function r(t){if(typeof t!=`string`)throw Error(`Param is not a string`);switch(t.toLowerCase()){case`numeric`:return e.NUMERIC;case`alphanumeric`:return e.ALPHANUMERIC;case`kanji`:return e.KANJI;case`byte`:return e.BYTE;default:throw Error(`Unknown mode: `+t)}}e.from=function(t,n){if(e.isValid(t))return t;try{return r(t)}catch{return n}}})),g=e.t((e=>{var t=n(),i=l(),a=r(),o=h(),s=p(),c=7973,u=t.getBCHDigit(c);function d(t,n,r){for(let i=1;i<=40;i++)if(n<=e.getCapacity(i,r,t))return i}function f(e,t){return o.getCharCountIndicator(e,t)+4}function m(e,t){let n=0;return e.forEach(function(e){let r=f(e.mode,t);n+=r+e.getBitsLength()}),n}function g(t,n){for(let r=1;r<=40;r++)if(m(t,r)<=e.getCapacity(r,n,o.MIXED))return r}e.from=function(e,t){return s.isValid(e)?parseInt(e,10):t},e.getCapacity=function(e,n,r){if(!s.isValid(e))throw Error(`Invalid QR Code version`);r===void 0&&(r=o.BYTE);let a=(t.getSymbolTotalCodewords(e)-i.getTotalCodewordsCount(e,n))*8;if(r===o.MIXED)return a;let c=a-f(r,e);switch(r){case o.NUMERIC:return Math.floor(c/10*3);case o.ALPHANUMERIC:return Math.floor(c/11*2);case o.KANJI:return Math.floor(c/13);case o.BYTE:default:return Math.floor(c/8)}},e.getBestVersionForData=function(e,t){let n,r=a.from(t,a.M);if(Array.isArray(e)){if(e.length>1)return g(e,r);if(e.length===0)return 1;n=e[0]}else n=e;return d(n.mode,n.getLength(),r)},e.getEncodedBits=function(e){if(!s.isValid(e)||e<7)throw Error(`Invalid QR Code version`);let n=e<<12;for(;t.getBCHDigit(n)-u>=0;)n^=c<<t.getBCHDigit(n)-u;return e<<12|n}})),_=e.t((e=>{var t=n(),r=1335,i=21522,a=t.getBCHDigit(r);e.getEncodedBits=function(e,n){let o=e.bit<<3|n,s=o<<10;for(;t.getBCHDigit(s)-a>=0;)s^=r<<t.getBCHDigit(s)-a;return(o<<10|s)^i}})),v=e.t(((e,t)=>{var n=h();function r(e){this.mode=n.NUMERIC,this.data=e.toString()}r.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){let t,n,r;for(t=0;t+3<=this.data.length;t+=3)n=this.data.substr(t,3),r=parseInt(n,10),e.put(r,10);let i=this.data.length-t;i>0&&(n=this.data.substr(t),r=parseInt(n,10),e.put(r,i*3+1))},t.exports=r})),y=e.t(((e,t)=>{var n=h(),r=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:`.split(``);function i(e){this.mode=n.ALPHANUMERIC,this.data=e}i.getBitsLength=function(e){return 11*Math.floor(e/2)+e%2*6},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t+2<=this.data.length;t+=2){let n=r.indexOf(this.data[t])*45;n+=r.indexOf(this.data[t+1]),e.put(n,11)}this.data.length%2&&e.put(r.indexOf(this.data[t]),6)},t.exports=i})),b=e.t(((e,t)=>{var n=h();function r(e){this.mode=n.BYTE,typeof e==`string`?this.data=new TextEncoder().encode(e):this.data=new Uint8Array(e)}r.getBitsLength=function(e){return e*8},r.prototype.getLength=function(){return this.data.length},r.prototype.getBitsLength=function(){return r.getBitsLength(this.data.length)},r.prototype.write=function(e){for(let t=0,n=this.data.length;t<n;t++)e.put(this.data[t],8)},t.exports=r})),x=e.t(((e,t)=>{var r=h(),i=n();function a(e){this.mode=r.KANJI,this.data=e}a.getBitsLength=function(e){return e*13},a.prototype.getLength=function(){return this.data.length},a.prototype.getBitsLength=function(){return a.getBitsLength(this.data.length)},a.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=i.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw Error(`Invalid SJIS character: `+this.data[t]+`
|
|
3
|
+
Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},t.exports=a})),S=e.t(((e,t)=>{var n={single_source_shortest_paths:function(e,t,r){var i={},a={};a[t]=0;var o=n.PriorityQueue.make();o.push(t,0);for(var s,c,l,u,d,f,p,m,h;!o.empty();)for(l in s=o.pop(),c=s.value,u=s.cost,d=e[c]||{},d)d.hasOwnProperty(l)&&(f=d[l],p=u+f,m=a[l],h=a[l]===void 0,(h||m>p)&&(a[l]=p,o.push(l,p),i[l]=c));if(r!==void 0&&a[r]===void 0){var g=[`Could not find a path from `,t,` to `,r,`.`].join(``);throw Error(g)}return i},extract_shortest_path_from_predecessor_list:function(e,t){for(var n=[],r=t;r;)n.push(r),e[r],r=e[r];return n.reverse(),n},find_path:function(e,t,r){var i=n.single_source_shortest_paths(e,t,r);return n.extract_shortest_path_from_predecessor_list(i,r)},PriorityQueue:{make:function(e){var t=n.PriorityQueue,r={},i;for(i in e||={},t)t.hasOwnProperty(i)&&(r[i]=t[i]);return r.queue=[],r.sorter=e.sorter||t.default_sorter,r},default_sorter:function(e,t){return e.cost-t.cost},push:function(e,t){var n={value:e,cost:t};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};t!==void 0&&(t.exports=n)})),C=e.t((e=>{var t=h(),r=v(),i=y(),a=b(),o=x(),s=m(),c=n(),l=S();function u(e){return unescape(encodeURIComponent(e)).length}function d(e,t,n){let r=[],i;for(;(i=e.exec(n))!==null;)r.push({data:i[0],index:i.index,mode:t,length:i[0].length});return r}function f(e){let n=d(s.NUMERIC,t.NUMERIC,e),r=d(s.ALPHANUMERIC,t.ALPHANUMERIC,e),i,a;return c.isKanjiModeEnabled()?(i=d(s.BYTE,t.BYTE,e),a=d(s.KANJI,t.KANJI,e)):(i=d(s.BYTE_KANJI,t.BYTE,e),a=[]),n.concat(r,i,a).sort(function(e,t){return e.index-t.index}).map(function(e){return{data:e.data,mode:e.mode,length:e.length}})}function p(e,n){switch(n){case t.NUMERIC:return r.getBitsLength(e);case t.ALPHANUMERIC:return i.getBitsLength(e);case t.KANJI:return o.getBitsLength(e);case t.BYTE:return a.getBitsLength(e)}}function g(e){return e.reduce(function(e,t){let n=e.length-1>=0?e[e.length-1]:null;return n&&n.mode===t.mode?(e[e.length-1].data+=t.data,e):(e.push(t),e)},[])}function _(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r];switch(i.mode){case t.NUMERIC:n.push([i,{data:i.data,mode:t.ALPHANUMERIC,length:i.length},{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.ALPHANUMERIC:n.push([i,{data:i.data,mode:t.BYTE,length:i.length}]);break;case t.KANJI:n.push([i,{data:i.data,mode:t.BYTE,length:u(i.data)}]);break;case t.BYTE:n.push([{data:i.data,mode:t.BYTE,length:u(i.data)}])}}return n}function C(e,n){let r={},i={start:{}},a=[`start`];for(let o=0;o<e.length;o++){let s=e[o],c=[];for(let e=0;e<s.length;e++){let l=s[e],u=``+o+e;c.push(u),r[u]={node:l,lastCount:0},i[u]={};for(let e=0;e<a.length;e++){let o=a[e];r[o]&&r[o].node.mode===l.mode?(i[o][u]=p(r[o].lastCount+l.length,l.mode)-p(r[o].lastCount,l.mode),r[o].lastCount+=l.length):(r[o]&&(r[o].lastCount=l.length),i[o][u]=p(l.length,l.mode)+4+t.getCharCountIndicator(l.mode,n))}}a=c}for(let e=0;e<a.length;e++)i[a[e]].end=0;return{map:i,table:r}}function w(e,n){let s,l=t.getBestModeForData(e);if(s=t.from(n,l),s!==t.BYTE&&s.bit<l.bit)throw Error(`"`+e+`" cannot be encoded with mode `+t.toString(s)+`.
|
|
4
|
+
Suggested mode is: `+t.toString(l));switch(s===t.KANJI&&!c.isKanjiModeEnabled()&&(s=t.BYTE),s){case t.NUMERIC:return new r(e);case t.ALPHANUMERIC:return new i(e);case t.KANJI:return new o(e);case t.BYTE:return new a(e)}}e.fromArray=function(e){return e.reduce(function(e,t){return typeof t==`string`?e.push(w(t,null)):t.data&&e.push(w(t.data,t.mode)),e},[])},e.fromString=function(t,n){let r=C(_(f(t,c.isKanjiModeEnabled())),n),i=l.find_path(r.map,`start`,`end`),a=[];for(let e=1;e<i.length-1;e++)a.push(r.table[i[e]].node);return e.fromArray(g(a))},e.rawSplit=function(t){return e.fromArray(f(t,c.isKanjiModeEnabled()))}})),w=e.t((e=>{var t=n(),u=r(),d=i(),p=a(),m=o(),v=s(),y=c(),b=l(),x=f(),S=g(),w=_(),T=h(),E=C();function D(e,t){let n=e.size,r=v.getPositions(t);for(let t=0;t<r.length;t++){let i=r[t][0],a=r[t][1];for(let t=-1;t<=7;t++)if(!(i+t<=-1||n<=i+t))for(let r=-1;r<=7;r++)a+r<=-1||n<=a+r||(t>=0&&t<=6&&(r===0||r===6)||r>=0&&r<=6&&(t===0||t===6)||t>=2&&t<=4&&r>=2&&r<=4?e.set(i+t,a+r,!0,!0):e.set(i+t,a+r,!1,!0))}}function O(e){let t=e.size;for(let n=8;n<t-8;n++){let t=n%2==0;e.set(n,6,t,!0),e.set(6,n,t,!0)}}function k(e,t){let n=m.getPositions(t);for(let t=0;t<n.length;t++){let r=n[t][0],i=n[t][1];for(let t=-2;t<=2;t++)for(let n=-2;n<=2;n++)t===-2||t===2||n===-2||n===2||t===0&&n===0?e.set(r+t,i+n,!0,!0):e.set(r+t,i+n,!1,!0)}}function A(e,t){let n=e.size,r=S.getEncodedBits(t),i,a,o;for(let t=0;t<18;t++)i=Math.floor(t/3),a=t%3+n-8-3,o=(r>>t&1)==1,e.set(i,a,o,!0),e.set(a,i,o,!0)}function j(e,t,n){let r=e.size,i=w.getEncodedBits(t,n),a,o;for(a=0;a<15;a++)o=(i>>a&1)==1,a<6?e.set(a,8,o,!0):a<8?e.set(a+1,8,o,!0):e.set(r-15+a,8,o,!0),a<8?e.set(8,r-a-1,o,!0):a<9?e.set(8,15-a-1+1,o,!0):e.set(8,15-a-1,o,!0);e.set(r-8,8,1,!0)}function M(e,t){let n=e.size,r=-1,i=n-1,a=7,o=0;for(let s=n-1;s>0;s-=2)for(s===6&&s--;;){for(let n=0;n<2;n++)if(!e.isReserved(i,s-n)){let r=!1;o<t.length&&(r=(t[o]>>>a&1)==1),e.set(i,s-n,r),a--,a===-1&&(o++,a=7)}if(i+=r,i<0||n<=i){i-=r,r=-r;break}}}function N(e,n,r){let i=new d;r.forEach(function(t){i.put(t.mode.bit,4),i.put(t.getLength(),T.getCharCountIndicator(t.mode,e)),t.write(i)});let a=(t.getSymbolTotalCodewords(e)-b.getTotalCodewordsCount(e,n))*8;for(i.getLengthInBits()+4<=a&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(0);let o=(a-i.getLengthInBits())/8;for(let e=0;e<o;e++)i.put(e%2?17:236,8);return P(i,e,n)}function P(e,n,r){let i=t.getSymbolTotalCodewords(n),a=i-b.getTotalCodewordsCount(n,r),o=b.getBlocksCount(n,r),s=o-i%o,c=Math.floor(i/o),l=Math.floor(a/o),u=l+1,d=c-l,f=new x(d),p=0,m=Array(o),h=Array(o),g=0,_=new Uint8Array(e.buffer);for(let e=0;e<o;e++){let t=e<s?l:u;m[e]=_.slice(p,p+t),h[e]=f.encode(m[e]),p+=t,g=Math.max(g,t)}let v=new Uint8Array(i),y=0,S,C;for(S=0;S<g;S++)for(C=0;C<o;C++)S<m[C].length&&(v[y++]=m[C][S]);for(S=0;S<d;S++)for(C=0;C<o;C++)v[y++]=h[C][S];return v}function F(e,n,r,i){let a;if(Array.isArray(e))a=E.fromArray(e);else if(typeof e==`string`){let t=n;if(!t){let n=E.rawSplit(e);t=S.getBestVersionForData(n,r)}a=E.fromString(e,t||40)}else throw Error(`Invalid data`);let o=S.getBestVersionForData(a,r);if(!o)throw Error(`The amount of data is too big to be stored in a QR Code`);if(!n)n=o;else if(n<o)throw Error(`
|
|
5
|
+
The chosen QR Code version cannot contain this amount of data.
|
|
6
|
+
Minimum version required to store current data is: `+o+`.
|
|
7
|
+
`);let s=N(n,r,a),c=new p(t.getSymbolSize(n));return D(c,n),O(c),k(c,n),j(c,r,0),n>=7&&A(c,n),M(c,s),isNaN(i)&&(i=y.getBestMask(c,j.bind(null,c,r))),y.applyMask(i,c),j(c,r,i),{modules:c,version:n,errorCorrectionLevel:r,maskPattern:i,segments:a}}e.create=function(e,n){if(e===void 0||e===``)throw Error(`No input text`);let r=u.M,i,a;return n!==void 0&&(r=u.from(n.errorCorrectionLevel,u.M),i=S.from(n.version),a=y.from(n.maskPattern),n.toSJISFunc&&t.setToSJISFunction(n.toSJISFunc)),F(e,i,r,a)}})),T=e.t((e=>{function t(e){if(typeof e==`number`&&(e=e.toString()),typeof e!=`string`)throw Error(`Color should be defined as hex string`);let t=e.slice().replace(`#`,``).split(``);if(t.length<3||t.length===5||t.length>8)throw Error(`Invalid hex color: `+e);(t.length===3||t.length===4)&&(t=Array.prototype.concat.apply([],t.map(function(e){return[e,e]}))),t.length===6&&t.push(`F`,`F`);let n=parseInt(t.join(``),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:n&255,hex:`#`+t.slice(0,6).join(``)}}e.getOptions=function(e){e||={},e.color||={};let n=e.margin===void 0||e.margin===null||e.margin<0?4:e.margin,r=e.width&&e.width>=21?e.width:void 0,i=e.scale||4;return{width:r,scale:r?4:i,margin:n,color:{dark:t(e.color.dark||`#000000ff`),light:t(e.color.light||`#ffffffff`)},type:e.type,rendererOpts:e.rendererOpts||{}}},e.getScale=function(e,t){return t.width&&t.width>=e+t.margin*2?t.width/(e+t.margin*2):t.scale},e.getImageWidth=function(t,n){let r=e.getScale(t,n);return Math.floor((t+n.margin*2)*r)},e.qrToImageData=function(t,n,r){let i=n.modules.size,a=n.modules.data,o=e.getScale(i,r),s=Math.floor((i+r.margin*2)*o),c=r.margin*o,l=[r.color.light,r.color.dark];for(let e=0;e<s;e++)for(let n=0;n<s;n++){let u=(e*s+n)*4,d=r.color.light;if(e>=c&&n>=c&&e<s-c&&n<s-c){let t=Math.floor((e-c)/o),r=Math.floor((n-c)/o);d=l[+!!a[t*i+r]]}t[u++]=d.r,t[u++]=d.g,t[u++]=d.b,t[u]=d.a}}})),E=e.t((e=>{var t=T();function n(e,t,n){e.clearRect(0,0,t.width,t.height),t.style||={},t.height=n,t.width=n,t.style.height=n+`px`,t.style.width=n+`px`}function r(){try{return document.createElement(`canvas`)}catch{throw Error(`You need to specify a canvas element`)}}e.render=function(e,i,a){let o=a,s=i;o===void 0&&(!i||!i.getContext)&&(o=i,i=void 0),i||(s=r()),o=t.getOptions(o);let c=t.getImageWidth(e.modules.size,o),l=s.getContext(`2d`),u=l.createImageData(c,c);return t.qrToImageData(u.data,e,o),n(l,s,c),l.putImageData(u,0,0),s},e.renderToDataURL=function(t,n,r){let i=r;i===void 0&&(!n||!n.getContext)&&(i=n,n=void 0),i||={};let a=e.render(t,n,i),o=i.type||`image/png`,s=i.rendererOpts||{};return a.toDataURL(o,s.quality)}})),D=e.t((e=>{var t=T();function n(e,t){let n=e.a/255,r=t+`="`+e.hex+`"`;return n<1?r+` `+t+`-opacity="`+n.toFixed(2).slice(1)+`"`:r}function r(e,t,n){let r=e+t;return n!==void 0&&(r+=` `+n),r}function i(e,t,n){let i=``,a=0,o=!1,s=0;for(let c=0;c<e.length;c++){let l=Math.floor(c%t),u=Math.floor(c/t);!l&&!o&&(o=!0),e[c]?(s++,c>0&&l>0&&e[c-1]||(i+=o?r(`M`,l+n,.5+u+n):r(`m`,a,0),a=0,o=!1),l+1<t&&e[c+1]||(i+=r(`h`,s),s=0)):a++}return i}e.render=function(e,r,a){let o=t.getOptions(r),s=e.modules.size,c=e.modules.data,l=s+o.margin*2,u=o.color.light.a?`<path `+n(o.color.light,`fill`)+` d="M0 0h`+l+`v`+l+`H0z"/>`:``,d=`<path `+n(o.color.dark,`stroke`)+` d="`+i(c,s,o.margin)+`"/>`,f=`viewBox="0 0 `+l+` `+l+`"`,p=`<svg xmlns="http://www.w3.org/2000/svg" `+(o.width?`width="`+o.width+`" height="`+o.width+`" `:``)+f+` shape-rendering="crispEdges">`+u+d+`</svg>
|
|
8
|
+
`;return typeof a==`function`&&a(null,p),p}})),O=e.t((e=>{var n=t(),r=w(),i=E(),a=D();function o(e,t,i,a,o){let s=[].slice.call(arguments,1),c=s.length,l=typeof s[c-1]==`function`;if(!l&&!n())throw Error(`Callback required as last argument`);if(l){if(c<2)throw Error(`Too few arguments provided`);c===2?(o=i,i=t,t=a=void 0):c===3&&(t.getContext&&o===void 0?(o=a,a=void 0):(o=a,a=i,i=t,t=void 0))}else{if(c<1)throw Error(`Too few arguments provided`);return c===1?(i=t,t=a=void 0):c===2&&!t.getContext&&(a=i,i=t,t=void 0),new Promise(function(n,o){try{n(e(r.create(i,a),t,a))}catch(e){o(e)}})}try{let n=r.create(i,a);o(null,e(n,t,a))}catch(e){o(e)}}e.create=r.create,e.toCanvas=o.bind(null,i.render),e.toDataURL=o.bind(null,i.renderToDataURL),e.toString=o.bind(null,function(e,t,n){return a.render(e,n)})}));Object.defineProperty(exports,`default`,{enumerable:!0,get:function(){return O()}});
|