snice 3.8.0 → 3.9.0
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/bin/snice.js +8 -0
- package/dist/components/file-gallery/snice-file-gallery.d.ts +87 -0
- package/dist/components/file-gallery/snice-file-gallery.js +892 -0
- package/dist/components/file-gallery/snice-file-gallery.js.map +1 -0
- package/dist/components/file-gallery/snice-file-gallery.types.d.ts +72 -0
- package/dist/components/qr-reader/qr-decoder.d.ts +20 -0
- package/dist/components/qr-reader/qr-decoder.js +49 -0
- package/dist/components/qr-reader/qr-decoder.js.map +1 -0
- package/dist/components/qr-reader/qr-worker.d.ts +6 -0
- package/dist/components/qr-reader/qr-worker.js +64 -0
- package/dist/components/qr-reader/qr-worker.js.map +1 -0
- package/dist/components/qr-reader/snice-qr-reader.d.ts +39 -0
- package/dist/components/qr-reader/snice-qr-reader.js +436 -0
- package/dist/components/qr-reader/snice-qr-reader.js.map +1 -0
- package/dist/components/qr-reader/snice-qr-reader.types.d.ts +17 -0
- package/dist/components/qr-reader/zxing-reader.mjs +1582 -0
- package/dist/components/qr-reader/zxing-share.mjs +305 -0
- package/dist/components/qr-reader/zxing_reader.wasm +0 -0
- package/dist/components/zxing-reader-B3Rfebg9.js +1771 -0
- package/dist/components/zxing-reader-B3Rfebg9.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.iife.js +1 -1
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/README.md +1 -1
- package/docs/ai/components/file-gallery.md +206 -0
- package/docs/ai/components/qr-reader.md +80 -0
- package/docs/components/file-gallery.md +692 -0
- package/docs/components/qr-reader.md +327 -0
- package/package.json +1 -1
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# QR Reader Component
|
|
2
|
+
|
|
3
|
+
`<snice-qr-reader>` provides QR code scanning functionality using device cameras with WebAssembly-based QR detection.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Camera Access**: Use front or back camera for QR code scanning
|
|
8
|
+
- **Real-time Detection**: Continuous scanning with ZXing WASM decoder
|
|
9
|
+
- **Auto-start**: Optional automatic camera activation on mount
|
|
10
|
+
- **Event-based**: Emits events for successful scans, errors, and camera status
|
|
11
|
+
- **Responsive**: Adapts to container size with proper aspect ratio
|
|
12
|
+
- **Configurable Speed**: Adjust scan speed for performance vs detection speed trade-off
|
|
13
|
+
|
|
14
|
+
## Basic Usage
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<snice-qr-reader auto-start></snice-qr-reader>
|
|
18
|
+
|
|
19
|
+
<script>
|
|
20
|
+
const reader = document.querySelector('snice-qr-reader');
|
|
21
|
+
|
|
22
|
+
reader.addEventListener('@snice/qr-scan', (event) => {
|
|
23
|
+
console.log('QR Code:', event.detail.data);
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Properties
|
|
29
|
+
|
|
30
|
+
### `auto-start`
|
|
31
|
+
- **Type**: `boolean`
|
|
32
|
+
- **Default**: `false`
|
|
33
|
+
- **Description**: Automatically start scanning when component is mounted
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<snice-qr-reader auto-start></snice-qr-reader>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### `camera`
|
|
40
|
+
- **Type**: `'front' | 'back'`
|
|
41
|
+
- **Default**: `'back'`
|
|
42
|
+
- **Description**: Which camera to use for scanning
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<snice-qr-reader camera="front"></snice-qr-reader>
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### `pick-first`
|
|
49
|
+
- **Type**: `boolean`
|
|
50
|
+
- **Default**: `false`
|
|
51
|
+
- **Description**: Scan continuously at maximum speed until first successful QR code detection, then stop and shut down camera. Ignores `scan-speed` setting.
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<!-- Scan at max speed until first QR hit, then stop -->
|
|
55
|
+
<snice-qr-reader pick-first></snice-qr-reader>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### `manual-snap`
|
|
59
|
+
- **Type**: `boolean`
|
|
60
|
+
- **Default**: `false`
|
|
61
|
+
- **Description**: Photo snapshot mode. Opens camera as a live viewfinder, and you manually trigger snapshot attempts by clicking the snap button.
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<!-- Manual photo snapshot mode -->
|
|
65
|
+
<snice-qr-reader manual-snap></snice-qr-reader>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `scan-speed`
|
|
69
|
+
- **Type**: `number`
|
|
70
|
+
- **Default**: `3`
|
|
71
|
+
- **Description**: Scan speed from 1-10. Higher values = faster QR detection but more CPU usage. Lower values = slower detection but better performance. **Note**: Ignored when `pick-first` is enabled (always scans at max speed).
|
|
72
|
+
|
|
73
|
+
```html
|
|
74
|
+
<!-- Slow scan (better performance) -->
|
|
75
|
+
<snice-qr-reader scan-speed="1"></snice-qr-reader>
|
|
76
|
+
|
|
77
|
+
<!-- Medium scan (balanced, default) -->
|
|
78
|
+
<snice-qr-reader scan-speed="3"></snice-qr-reader>
|
|
79
|
+
|
|
80
|
+
<!-- Fast scan (faster detection) -->
|
|
81
|
+
<snice-qr-reader scan-speed="10"></snice-qr-reader>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Methods
|
|
85
|
+
|
|
86
|
+
### `start()`
|
|
87
|
+
Start the camera and begin scanning for QR codes (or open camera for manual-snap mode).
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
const reader = document.querySelector('snice-qr-reader');
|
|
91
|
+
reader.start();
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### `stop()`
|
|
95
|
+
Stop scanning and release the camera.
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
reader.stop();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### `snap()`
|
|
102
|
+
Take a snapshot and check for QR codes (manual-snap mode only).
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
const result = await reader.snap(); // Returns QR data or null
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Events
|
|
109
|
+
|
|
110
|
+
### `@snice/qr-scan`
|
|
111
|
+
Fired when a QR code is successfully detected.
|
|
112
|
+
|
|
113
|
+
**Detail Properties:**
|
|
114
|
+
- `data` (string): The decoded QR code content
|
|
115
|
+
- `timestamp` (number): Unix timestamp of the scan
|
|
116
|
+
- `reader` (SniceQRReader): Reference to the component
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
reader.addEventListener('@snice/qr-scan', (event) => {
|
|
120
|
+
console.log('Data:', event.detail.data);
|
|
121
|
+
console.log('Time:', new Date(event.detail.timestamp));
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### `@snice/qr-error`
|
|
126
|
+
Fired when an error occurs during scanning.
|
|
127
|
+
|
|
128
|
+
**Detail Properties:**
|
|
129
|
+
- `error` (any): Error object or message
|
|
130
|
+
- `reader` (SniceQRReader): Reference to the component
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
reader.addEventListener('@snice/qr-error', (event) => {
|
|
134
|
+
console.error('Error:', event.detail.error);
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### `@snice/camera-ready`
|
|
139
|
+
Fired when the camera has been successfully initialized and is ready to scan.
|
|
140
|
+
|
|
141
|
+
**Detail Properties:**
|
|
142
|
+
- `reader` (SniceQRReader): Reference to the component
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
reader.addEventListener('@snice/camera-ready', (event) => {
|
|
146
|
+
console.log('Camera is ready');
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### `@snice/camera-error`
|
|
151
|
+
Fired when camera initialization fails.
|
|
152
|
+
|
|
153
|
+
**Detail Properties:**
|
|
154
|
+
- `error` (any): Error object or message
|
|
155
|
+
- `reader` (SniceQRReader): Reference to the component
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
reader.addEventListener('@snice/camera-error', (event) => {
|
|
159
|
+
console.error('Camera error:', event.detail.error);
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Examples
|
|
164
|
+
|
|
165
|
+
### Manual Control
|
|
166
|
+
|
|
167
|
+
```html
|
|
168
|
+
<snice-qr-reader id="reader"></snice-qr-reader>
|
|
169
|
+
<button onclick="startReading()">Start</button>
|
|
170
|
+
<button onclick="stopReading()">Stop</button>
|
|
171
|
+
<div id="result"></div>
|
|
172
|
+
|
|
173
|
+
<script>
|
|
174
|
+
const reader = document.getElementById('reader');
|
|
175
|
+
const result = document.getElementById('result');
|
|
176
|
+
|
|
177
|
+
function startReading() {
|
|
178
|
+
reader.start();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function stopReading() {
|
|
182
|
+
reader.stop();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
reader.addEventListener('@snice/qr-scan', (e) => {
|
|
186
|
+
result.textContent = `Scanned: ${e.detail.data}`;
|
|
187
|
+
});
|
|
188
|
+
</script>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Pick-First (One-Shot)
|
|
192
|
+
|
|
193
|
+
```html
|
|
194
|
+
<snice-qr-reader id="scanner" pick-first></snice-qr-reader>
|
|
195
|
+
|
|
196
|
+
<script>
|
|
197
|
+
const scanner = document.getElementById('scanner');
|
|
198
|
+
|
|
199
|
+
scanner.addEventListener('@snice/qr-scan', (e) => {
|
|
200
|
+
// Process the scan
|
|
201
|
+
processQRCode(e.detail.data);
|
|
202
|
+
|
|
203
|
+
// Scanner automatically stops and shuts down camera
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Start scanning at max speed
|
|
207
|
+
scanner.start();
|
|
208
|
+
</script>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Manual Snapshot
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<snice-qr-reader id="snapReader" manual-snap></snice-qr-reader>
|
|
215
|
+
<button id="snapBtn">Take Photo</button>
|
|
216
|
+
|
|
217
|
+
<script>
|
|
218
|
+
const reader = document.getElementById('snapReader');
|
|
219
|
+
const btn = document.getElementById('snapBtn');
|
|
220
|
+
|
|
221
|
+
// Open camera
|
|
222
|
+
reader.start();
|
|
223
|
+
|
|
224
|
+
// Manually trigger snapshot
|
|
225
|
+
btn.addEventListener('click', async () => {
|
|
226
|
+
const result = await reader.snap();
|
|
227
|
+
if (result) {
|
|
228
|
+
console.log('QR Code:', result);
|
|
229
|
+
} else {
|
|
230
|
+
console.log('No QR code found');
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
</script>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Front Camera
|
|
237
|
+
|
|
238
|
+
```html
|
|
239
|
+
<snice-qr-reader camera="front" auto-start></snice-qr-reader>
|
|
240
|
+
|
|
241
|
+
<script>
|
|
242
|
+
// Useful for self-scanning scenarios
|
|
243
|
+
document.querySelector('snice-qr-reader')
|
|
244
|
+
.addEventListener('@snice/qr-scan', (e) => {
|
|
245
|
+
validateTicket(e.detail.data);
|
|
246
|
+
});
|
|
247
|
+
</script>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Error Handling
|
|
251
|
+
|
|
252
|
+
```html
|
|
253
|
+
<snice-qr-reader id="reader" auto-start></snice-qr-reader>
|
|
254
|
+
<div id="status"></div>
|
|
255
|
+
|
|
256
|
+
<script>
|
|
257
|
+
const reader = document.getElementById('reader');
|
|
258
|
+
const status = document.getElementById('status');
|
|
259
|
+
|
|
260
|
+
reader.addEventListener('@snice/qr-scan', (e) => {
|
|
261
|
+
status.textContent = `✓ Scanned: ${e.detail.data}`;
|
|
262
|
+
status.style.color = 'green';
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
reader.addEventListener('@snice/qr-error', (e) => {
|
|
266
|
+
status.textContent = `✗ Error: ${e.detail.error}`;
|
|
267
|
+
status.style.color = 'red';
|
|
268
|
+
|
|
269
|
+
// Retry after error
|
|
270
|
+
setTimeout(() => reader.start(), 2000);
|
|
271
|
+
});
|
|
272
|
+
</script>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Styling
|
|
276
|
+
|
|
277
|
+
The component uses CSS custom properties for theming:
|
|
278
|
+
|
|
279
|
+
```css
|
|
280
|
+
snice-qr-reader {
|
|
281
|
+
--qr-reader-border: var(--snice-color-border, #e5e7eb);
|
|
282
|
+
--qr-reader-bg: var(--snice-color-bg, #ffffff);
|
|
283
|
+
--qr-reader-text: var(--snice-color-text, #1f2937);
|
|
284
|
+
|
|
285
|
+
/* Size */
|
|
286
|
+
width: 100%;
|
|
287
|
+
max-width: 600px;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Browser Support
|
|
292
|
+
|
|
293
|
+
- Requires `getUserMedia` API support
|
|
294
|
+
- Uses WebAssembly for QR detection (ZXing)
|
|
295
|
+
- Works on modern browsers (Chrome, Firefox, Safari, Edge)
|
|
296
|
+
- Mobile browser camera access requires HTTPS
|
|
297
|
+
|
|
298
|
+
## Implementation Details
|
|
299
|
+
|
|
300
|
+
### QR Detection
|
|
301
|
+
Uses ZXing-C++ WebAssembly build for fast, accurate QR code detection:
|
|
302
|
+
- **License**: Apache 2.0 (ZXing-C++) + MIT (zxing-wasm)
|
|
303
|
+
- **Format Support**: QR Code, Micro QR Code
|
|
304
|
+
- **Performance**: ~60fps scanning on modern devices
|
|
305
|
+
|
|
306
|
+
### Camera Management
|
|
307
|
+
- Requests user permission for camera access
|
|
308
|
+
- Automatically releases camera when component is destroyed
|
|
309
|
+
- Handles camera errors gracefully with fallback messages
|
|
310
|
+
|
|
311
|
+
### Privacy
|
|
312
|
+
- Camera feed stays in the browser (no uploads)
|
|
313
|
+
- QR data is only emitted via events
|
|
314
|
+
- Camera is released when scanning stops
|
|
315
|
+
|
|
316
|
+
## Related Components
|
|
317
|
+
|
|
318
|
+
- `<snice-qr-code>` - Generate QR codes
|
|
319
|
+
- `<snice-camera>` - General camera capture component
|
|
320
|
+
|
|
321
|
+
## License
|
|
322
|
+
|
|
323
|
+
QR detection powered by:
|
|
324
|
+
- **ZXing-C++**: Apache License 2.0
|
|
325
|
+
- **zxing-wasm**: MIT License
|
|
326
|
+
|
|
327
|
+
See `components/qr-reader/ZXING-LICENSE` for full license text.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "snice",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Imperative TypeScript framework for building vanilla web components with decorators, differential rendering, routing, and controllers. No virtual DOM, no build complexity.",
|
|
6
6
|
"main": "dist/index.cjs",
|