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.
Files changed (33) hide show
  1. package/bin/snice.js +8 -0
  2. package/dist/components/file-gallery/snice-file-gallery.d.ts +87 -0
  3. package/dist/components/file-gallery/snice-file-gallery.js +892 -0
  4. package/dist/components/file-gallery/snice-file-gallery.js.map +1 -0
  5. package/dist/components/file-gallery/snice-file-gallery.types.d.ts +72 -0
  6. package/dist/components/qr-reader/qr-decoder.d.ts +20 -0
  7. package/dist/components/qr-reader/qr-decoder.js +49 -0
  8. package/dist/components/qr-reader/qr-decoder.js.map +1 -0
  9. package/dist/components/qr-reader/qr-worker.d.ts +6 -0
  10. package/dist/components/qr-reader/qr-worker.js +64 -0
  11. package/dist/components/qr-reader/qr-worker.js.map +1 -0
  12. package/dist/components/qr-reader/snice-qr-reader.d.ts +39 -0
  13. package/dist/components/qr-reader/snice-qr-reader.js +436 -0
  14. package/dist/components/qr-reader/snice-qr-reader.js.map +1 -0
  15. package/dist/components/qr-reader/snice-qr-reader.types.d.ts +17 -0
  16. package/dist/components/qr-reader/zxing-reader.mjs +1582 -0
  17. package/dist/components/qr-reader/zxing-share.mjs +305 -0
  18. package/dist/components/qr-reader/zxing_reader.wasm +0 -0
  19. package/dist/components/zxing-reader-B3Rfebg9.js +1771 -0
  20. package/dist/components/zxing-reader-B3Rfebg9.js.map +1 -0
  21. package/dist/index.cjs +1 -1
  22. package/dist/index.esm.js +1 -1
  23. package/dist/index.iife.js +1 -1
  24. package/dist/symbols.cjs +1 -1
  25. package/dist/symbols.esm.js +1 -1
  26. package/dist/transitions.cjs +1 -1
  27. package/dist/transitions.esm.js +1 -1
  28. package/docs/ai/README.md +1 -1
  29. package/docs/ai/components/file-gallery.md +206 -0
  30. package/docs/ai/components/qr-reader.md +80 -0
  31. package/docs/components/file-gallery.md +692 -0
  32. package/docs/components/qr-reader.md +327 -0
  33. 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.8.0",
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",