pi-kiosk-shared 2.2.88 → 2.2.91
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/dist/barcode-scanner.d.ts +2 -1
- package/dist/barcode-scanner.d.ts.map +1 -1
- package/dist/barcode-scanner.js +1 -1
- package/dist/barcode-scanner.js.map +1 -1
- package/dist/hooks/scannerCameraConstraints.d.ts +52 -0
- package/dist/hooks/scannerCameraConstraints.d.ts.map +1 -0
- package/dist/hooks/scannerCameraConstraints.js +188 -0
- package/dist/hooks/scannerCameraConstraints.js.map +1 -0
- package/dist/hooks/scannerScanPasses.d.ts +21 -0
- package/dist/hooks/scannerScanPasses.d.ts.map +1 -0
- package/dist/hooks/scannerScanPasses.js +59 -0
- package/dist/hooks/scannerScanPasses.js.map +1 -0
- package/dist/hooks/selectEngine.d.ts +9 -4
- package/dist/hooks/selectEngine.d.ts.map +1 -1
- package/dist/hooks/selectEngine.js +1 -16
- package/dist/hooks/selectEngine.js.map +1 -1
- package/dist/hooks/useBarcodeScanner.d.ts +26 -2
- package/dist/hooks/useBarcodeScanner.d.ts.map +1 -1
- package/dist/hooks/useBarcodeScanner.js +171 -65
- package/dist/hooks/useBarcodeScanner.js.map +1 -1
- package/dist/hooks/zxingJsSensitiveDecode.d.ts +13 -0
- package/dist/hooks/zxingJsSensitiveDecode.d.ts.map +1 -0
- package/dist/hooks/zxingJsSensitiveDecode.js +54 -0
- package/dist/hooks/zxingJsSensitiveDecode.js.map +1 -0
- package/dist/ui/Switch/Switch.d.ts.map +1 -1
- package/dist/ui/Switch/Switch.js +10 -3
- package/dist/ui/Switch/Switch.js.map +1 -1
- package/package.json +397 -394
|
@@ -2,14 +2,39 @@ import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
2
2
|
import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
3
3
|
import { DecodeHintType } from '@zxing/library';
|
|
4
4
|
import './scannerNativeTypes.js';
|
|
5
|
-
import { selectBarcodeScannerEngine } from './selectEngine.js';
|
|
6
5
|
import { resolveScannerFormatConfig, } from './scannerFormats.js';
|
|
6
|
+
import { applyScannerTrackEnhancements, openScannerMediaStream, } from './scannerCameraConstraints.js';
|
|
7
|
+
import { createSensitiveZxingReader, decodeVideoFrameWithZxingJs, } from './zxingJsSensitiveDecode.js';
|
|
8
|
+
function isInsecureCameraContext() {
|
|
9
|
+
return typeof window !== 'undefined' && window.isSecureContext === false;
|
|
10
|
+
}
|
|
11
|
+
function isPermissionDeniedError(err) {
|
|
12
|
+
return (err instanceof DOMException &&
|
|
13
|
+
(err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError'));
|
|
14
|
+
}
|
|
15
|
+
function isSecurityPolicyError(err) {
|
|
16
|
+
return err instanceof DOMException && err.name === 'SecurityError';
|
|
17
|
+
}
|
|
18
|
+
function isCameraInUseError(err) {
|
|
19
|
+
return (err instanceof DOMException &&
|
|
20
|
+
(err.name === 'NotReadableError' || err.name === 'AbortError'));
|
|
21
|
+
}
|
|
22
|
+
/** Multi-pass @zxing decode budget (~20–25 attempts/s). */
|
|
23
|
+
const ZXING_MIN_FRAME_INTERVAL_MS = 40;
|
|
24
|
+
/**
|
|
25
|
+
* Live camera barcode/QR decode.
|
|
26
|
+
*
|
|
27
|
+
* Primary: pure-JS @zxing/browser `decodeFromStream` (former working engine)
|
|
28
|
+
* plus parallel multi-pass digital zoom + TRY_HARDER for distant / small codes.
|
|
29
|
+
* If stream fails but a canvas exists, multi-pass alone is the sensitive path.
|
|
30
|
+
* G5: never start native BarcodeDetector alone (no TRY_HARDER / distance assist) —
|
|
31
|
+
* hard-fail with recovery copy when neither @zxing path can start.
|
|
32
|
+
*/
|
|
7
33
|
export function useBarcodeScanner(options) {
|
|
8
34
|
const { enabled, videoRef, onDecode, messages, formatProfile = 'retail', onBackgroundStop, } = options;
|
|
9
35
|
const [status, setStatus] = useState('idle');
|
|
10
36
|
const [engine, setEngine] = useState(null);
|
|
11
37
|
const [errorMessage, setErrorMessage] = useState(null);
|
|
12
|
-
/** Latches after background release until parent sets `enabled` false (G7 / G10). */
|
|
13
38
|
const [heldOffByBackground, setHeldOffByBackground] = useState(false);
|
|
14
39
|
const onDecodeRef = useRef(onDecode);
|
|
15
40
|
useEffect(() => {
|
|
@@ -45,7 +70,6 @@ export function useBarcodeScanner(options) {
|
|
|
45
70
|
stopRef.current = null;
|
|
46
71
|
}
|
|
47
72
|
}, []);
|
|
48
|
-
// G7 — release camera on background; do not auto-restart on visible.
|
|
49
73
|
useEffect(() => {
|
|
50
74
|
if (typeof document === 'undefined') {
|
|
51
75
|
return;
|
|
@@ -84,8 +108,20 @@ export function useBarcodeScanner(options) {
|
|
|
84
108
|
let cancelled = false;
|
|
85
109
|
let stream = null;
|
|
86
110
|
let zxingControls = null;
|
|
87
|
-
let
|
|
111
|
+
let zxingFrameHandle = null;
|
|
88
112
|
const formatConfig = resolveScannerFormatConfig(formatProfile);
|
|
113
|
+
// G5: multi-pass needs a canvas; if creation fails, hard-fail later (never native-only).
|
|
114
|
+
const decodeCanvas = (() => {
|
|
115
|
+
if (typeof document === 'undefined') {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
return document.createElement('canvas');
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
})();
|
|
89
125
|
const cleanup = () => {
|
|
90
126
|
if (zxingControls !== null) {
|
|
91
127
|
try {
|
|
@@ -96,9 +132,9 @@ export function useBarcodeScanner(options) {
|
|
|
96
132
|
}
|
|
97
133
|
zxingControls = null;
|
|
98
134
|
}
|
|
99
|
-
if (
|
|
100
|
-
cancelAnimationFrame(
|
|
101
|
-
|
|
135
|
+
if (zxingFrameHandle !== null) {
|
|
136
|
+
cancelAnimationFrame(zxingFrameHandle);
|
|
137
|
+
zxingFrameHandle = null;
|
|
102
138
|
}
|
|
103
139
|
if (stream !== null) {
|
|
104
140
|
for (const track of stream.getTracks()) {
|
|
@@ -120,33 +156,47 @@ export function useBarcodeScanner(options) {
|
|
|
120
156
|
void (async () => {
|
|
121
157
|
setStatus('starting');
|
|
122
158
|
setErrorMessage(null);
|
|
123
|
-
if (
|
|
159
|
+
if (isInsecureCameraContext()) {
|
|
124
160
|
if (!cancelled) {
|
|
125
161
|
setStatus('error');
|
|
126
|
-
setErrorMessage(messagesRef.current.noCamera);
|
|
162
|
+
setErrorMessage(messagesRef.current.insecureContext ?? messagesRef.current.noCamera);
|
|
127
163
|
}
|
|
128
164
|
return;
|
|
129
165
|
}
|
|
130
|
-
|
|
131
|
-
if (
|
|
166
|
+
// Missing MediaDevices (secure context prep for G3): prefer noCamera only.
|
|
167
|
+
if (typeof navigator === 'undefined' || navigator.mediaDevices === undefined) {
|
|
168
|
+
if (!cancelled) {
|
|
169
|
+
setStatus('error');
|
|
170
|
+
setErrorMessage(messagesRef.current.noCamera);
|
|
171
|
+
}
|
|
132
172
|
return;
|
|
133
173
|
}
|
|
134
|
-
setEngine(chosenEngine);
|
|
135
174
|
try {
|
|
136
|
-
stream = await navigator.mediaDevices.getUserMedia(
|
|
137
|
-
video: { facingMode: { ideal: 'environment' } },
|
|
138
|
-
audio: false,
|
|
139
|
-
});
|
|
175
|
+
stream = await openScannerMediaStream(navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices));
|
|
140
176
|
}
|
|
141
177
|
catch (err) {
|
|
142
178
|
if (cancelled) {
|
|
143
179
|
return;
|
|
144
180
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
181
|
+
if (isPermissionDeniedError(err)) {
|
|
182
|
+
// Android Chrome often throws NotAllowedError on plain HTTP LAN URLs;
|
|
183
|
+
// prefer the HTTPS recovery copy when the context is still insecure.
|
|
184
|
+
if (isInsecureCameraContext()) {
|
|
185
|
+
setStatus('error');
|
|
186
|
+
setErrorMessage(messagesRef.current.insecureContext ?? messagesRef.current.noCamera);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
setStatus('denied');
|
|
190
|
+
setErrorMessage(messagesRef.current.permissionDenied);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (isSecurityPolicyError(err)) {
|
|
194
|
+
setStatus('error');
|
|
195
|
+
setErrorMessage(messagesRef.current.policyBlocked ?? messagesRef.current.error);
|
|
196
|
+
}
|
|
197
|
+
else if (isCameraInUseError(err)) {
|
|
198
|
+
setStatus('error');
|
|
199
|
+
setErrorMessage(messagesRef.current.cameraInUse ?? messagesRef.current.error);
|
|
150
200
|
}
|
|
151
201
|
else {
|
|
152
202
|
setStatus('error');
|
|
@@ -155,14 +205,33 @@ export function useBarcodeScanner(options) {
|
|
|
155
205
|
cleanup();
|
|
156
206
|
return;
|
|
157
207
|
}
|
|
208
|
+
// G5: cancel/unmount after GUM — release before enhance/play.
|
|
209
|
+
if (cancelled) {
|
|
210
|
+
cleanup();
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const activeStream = stream;
|
|
214
|
+
const [primaryTrack] = activeStream.getVideoTracks();
|
|
215
|
+
if (primaryTrack !== undefined) {
|
|
216
|
+
await applyScannerTrackEnhancements(primaryTrack);
|
|
217
|
+
}
|
|
218
|
+
if (cancelled) {
|
|
219
|
+
cleanup();
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
158
222
|
const video = videoRef.current;
|
|
159
223
|
if (video === null) {
|
|
224
|
+
// G4: successful GUM but video element gone — surface error, release tracks.
|
|
160
225
|
cleanup();
|
|
226
|
+
if (!cancelled) {
|
|
227
|
+
setStatus('error');
|
|
228
|
+
setErrorMessage(messagesRef.current.error);
|
|
229
|
+
}
|
|
161
230
|
return;
|
|
162
231
|
}
|
|
163
232
|
video.setAttribute('playsinline', 'true');
|
|
164
233
|
video.muted = true;
|
|
165
|
-
video.srcObject =
|
|
234
|
+
video.srcObject = activeStream;
|
|
166
235
|
try {
|
|
167
236
|
await video.play();
|
|
168
237
|
}
|
|
@@ -173,64 +242,101 @@ export function useBarcodeScanner(options) {
|
|
|
173
242
|
cleanup();
|
|
174
243
|
return;
|
|
175
244
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
245
|
+
const startZxingStreamFallback = async () => {
|
|
246
|
+
const hints = new Map();
|
|
247
|
+
hints.set(DecodeHintType.POSSIBLE_FORMATS, [...formatConfig.zxingFormats]);
|
|
248
|
+
hints.set(DecodeHintType.TRY_HARDER, true);
|
|
249
|
+
const reader = new BrowserMultiFormatReader(hints);
|
|
250
|
+
try {
|
|
251
|
+
zxingControls = await reader.decodeFromStream(activeStream, video, (result, _err, controls) => {
|
|
252
|
+
if (cancelled) {
|
|
253
|
+
controls.stop();
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (result !== undefined && result !== null) {
|
|
257
|
+
onDecodeRef.current(result.getText());
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const startZxingMultiPassLoop = () => {
|
|
267
|
+
if (decodeCanvas === null) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
let reader;
|
|
271
|
+
try {
|
|
272
|
+
reader = createSensitiveZxingReader(formatConfig.zxingFormats);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// Reader/bootstrap failure — do not pretend multi-pass started.
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
let lastAttemptMs = 0;
|
|
279
|
+
let busy = false;
|
|
280
|
+
const tick = () => {
|
|
281
|
+
if (cancelled) {
|
|
186
282
|
return;
|
|
187
283
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
284
|
+
const now = performance.now();
|
|
285
|
+
if (!busy &&
|
|
286
|
+
video.readyState >= 2 &&
|
|
287
|
+
now - lastAttemptMs >= ZXING_MIN_FRAME_INTERVAL_MS) {
|
|
288
|
+
lastAttemptMs = now;
|
|
289
|
+
busy = true;
|
|
290
|
+
try {
|
|
291
|
+
const text = decodeVideoFrameWithZxingJs(video, decodeCanvas, reader);
|
|
292
|
+
if (!cancelled && text !== null) {
|
|
293
|
+
onDecodeRef.current(text);
|
|
194
294
|
}
|
|
195
295
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
296
|
+
catch {
|
|
297
|
+
// keep scanning
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
busy = false;
|
|
301
|
+
}
|
|
199
302
|
}
|
|
200
303
|
if (!cancelled) {
|
|
201
|
-
|
|
202
|
-
void tick();
|
|
203
|
-
});
|
|
304
|
+
zxingFrameHandle = requestAnimationFrame(tick);
|
|
204
305
|
}
|
|
205
306
|
};
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
307
|
+
zxingFrameHandle = requestAnimationFrame(tick);
|
|
308
|
+
return true;
|
|
309
|
+
};
|
|
310
|
+
// G5 engine order (max sensitivity — never native-only):
|
|
311
|
+
// 1) @zxing decodeFromStream (+ TRY_HARDER); if OK also start multi-pass
|
|
312
|
+
// 2) Else multi-pass canvas alone (when canvas exists)
|
|
313
|
+
// 3) Else hard-fail — do not start weak native BarcodeDetector alone
|
|
314
|
+
const streamOk = await startZxingStreamFallback();
|
|
315
|
+
// G5: if cancelled after controls assigned, stop them + release stream.
|
|
316
|
+
if (cancelled) {
|
|
317
|
+
cleanup();
|
|
209
318
|
return;
|
|
210
319
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
controls.stop();
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
if (result !== undefined && result !== null) {
|
|
222
|
-
onDecodeRef.current(result.getText());
|
|
223
|
-
}
|
|
224
|
-
});
|
|
320
|
+
if (streamOk) {
|
|
321
|
+
startZxingMultiPassLoop();
|
|
322
|
+
if (!cancelled) {
|
|
323
|
+
setEngine('zxing');
|
|
324
|
+
setStatus('running');
|
|
325
|
+
}
|
|
326
|
+
return;
|
|
225
327
|
}
|
|
226
|
-
|
|
227
|
-
if (cancelled) {
|
|
228
|
-
|
|
328
|
+
if (startZxingMultiPassLoop()) {
|
|
329
|
+
if (!cancelled) {
|
|
330
|
+
setEngine('zxing');
|
|
331
|
+
setStatus('running');
|
|
229
332
|
}
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (!cancelled) {
|
|
230
336
|
setStatus('error');
|
|
231
337
|
setErrorMessage(messagesRef.current.error);
|
|
232
|
-
cleanup();
|
|
233
338
|
}
|
|
339
|
+
cleanup();
|
|
234
340
|
})();
|
|
235
341
|
return () => {
|
|
236
342
|
cancelled = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBarcodeScanner.js","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useBarcodeScanner.js","sourceRoot":"","sources":["../../src/hooks/useBarcodeScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-sensitivity pure-JS @zxing decode (the library that previously worked).
|
|
3
|
+
* Multi-pass digital zoom + TRY_HARDER for distant / small codes.
|
|
4
|
+
*/
|
|
5
|
+
import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
6
|
+
import { BarcodeFormat } from '@zxing/library';
|
|
7
|
+
export declare function createSensitiveZxingReader(formats: readonly BarcodeFormat[]): BrowserMultiFormatReader;
|
|
8
|
+
/**
|
|
9
|
+
* Decode one video frame via multi-pass canvas crops → @zxing decodeFromCanvas.
|
|
10
|
+
* Returns the first payload or null when nothing is found.
|
|
11
|
+
*/
|
|
12
|
+
export declare function decodeVideoFrameWithZxingJs(video: HTMLVideoElement, canvas: HTMLCanvasElement, reader: BrowserMultiFormatReader): string | null;
|
|
13
|
+
//# sourceMappingURL=zxingJsSensitiveDecode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zxingJsSensitiveDecode.d.ts","sourceRoot":"","sources":["../../src/hooks/zxingJsSensitiveDecode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AAG/D,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,wBAAwB,CAK1B;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,wBAAwB,GAC/B,MAAM,GAAG,IAAI,CAwCf"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-sensitivity pure-JS @zxing decode (the library that previously worked).
|
|
3
|
+
* Multi-pass digital zoom + TRY_HARDER for distant / small codes.
|
|
4
|
+
*/
|
|
5
|
+
import { BrowserMultiFormatReader } from '@zxing/browser';
|
|
6
|
+
import { DecodeHintType } from '@zxing/library';
|
|
7
|
+
import { buildMaxSensitivityScanPasses } from './scannerScanPasses.js';
|
|
8
|
+
export function createSensitiveZxingReader(formats) {
|
|
9
|
+
const hints = new Map();
|
|
10
|
+
hints.set(DecodeHintType.POSSIBLE_FORMATS, [...formats]);
|
|
11
|
+
hints.set(DecodeHintType.TRY_HARDER, true);
|
|
12
|
+
return new BrowserMultiFormatReader(hints);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Decode one video frame via multi-pass canvas crops → @zxing decodeFromCanvas.
|
|
16
|
+
* Returns the first payload or null when nothing is found.
|
|
17
|
+
*/
|
|
18
|
+
export function decodeVideoFrameWithZxingJs(video, canvas, reader) {
|
|
19
|
+
const width = video.videoWidth;
|
|
20
|
+
const height = video.videoHeight;
|
|
21
|
+
if (width < 2 || height < 2) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const ctx = canvas.getContext('2d', { willReadFrequently: true });
|
|
25
|
+
if (ctx === null) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
ctx.imageSmoothingEnabled = false;
|
|
29
|
+
const passes = buildMaxSensitivityScanPasses(width, height);
|
|
30
|
+
for (const pass of passes) {
|
|
31
|
+
const outW = Math.max(2, Math.floor(pass.sw * pass.scale));
|
|
32
|
+
const outH = Math.max(2, Math.floor(pass.sh * pass.scale));
|
|
33
|
+
if (canvas.width !== outW) {
|
|
34
|
+
canvas.width = outW;
|
|
35
|
+
}
|
|
36
|
+
if (canvas.height !== outH) {
|
|
37
|
+
canvas.height = outH;
|
|
38
|
+
}
|
|
39
|
+
ctx.clearRect(0, 0, outW, outH);
|
|
40
|
+
ctx.drawImage(video, pass.sx, pass.sy, pass.sw, pass.sh, 0, 0, outW, outH);
|
|
41
|
+
try {
|
|
42
|
+
const result = reader.decodeFromCanvas(canvas);
|
|
43
|
+
const text = result.getText();
|
|
44
|
+
if (text.length > 0) {
|
|
45
|
+
return text;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// NotFoundException / checksum — try next pass
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=zxingJsSensitiveDecode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zxingJsSensitiveDecode.js","sourceRoot":"","sources":["../../src/hooks/zxingJsSensitiveDecode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAiB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,UAAU,0BAA0B,CACxC,OAAiC;IAEjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IACxB,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAuB,EACvB,MAAyB,EACzB,MAAgC;IAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAC;IAElC,MAAM,MAAM,GAAG,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;QACjD,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/ui/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/ui/Switch/Switch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAyC9D,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,GAAG;IACpF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM;sBATC,OAAO;+BACE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI;qDAuBtD,CAAC"}
|
package/dist/ui/Switch/Switch.js
CHANGED
|
@@ -4,14 +4,21 @@ import { tv } from '../tvShim.js';
|
|
|
4
4
|
const switchTrack = tv({
|
|
5
5
|
base: [
|
|
6
6
|
'relative inline-flex h-[1.55rem] w-[2.85rem] shrink-0 cursor-pointer rounded-full',
|
|
7
|
-
|
|
7
|
+
/* OFF: muted inactive — avoid bright slate that reads as "on" on dark surfaces. */
|
|
8
|
+
'bg-[color-mix(in_srgb,var(--color-an-text-muted,var(--color-text-secondary,#71717a))_42%,var(--color-an-surface,var(--color-surface,#fff)))]',
|
|
9
|
+
'shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--color-an-border,var(--color-border,#cbd5e1))_70%,transparent)]',
|
|
10
|
+
'transition-[background-color,box-shadow] duration-150',
|
|
8
11
|
'focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2',
|
|
9
12
|
'focus-visible:outline-[var(--color-focus-ring,var(--color-an-primary))]',
|
|
10
13
|
'disabled:cursor-not-allowed disabled:opacity-55',
|
|
11
14
|
].join(' '),
|
|
12
15
|
variants: {
|
|
13
16
|
checked: {
|
|
14
|
-
true:
|
|
17
|
+
true: [
|
|
18
|
+
/* ON: success green — clear true/false when brand primary is monochrome. */
|
|
19
|
+
'bg-[var(--color-an-success,var(--color-success,#16a34a))]',
|
|
20
|
+
'shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--color-an-success,var(--color-success,#16a34a))_55%,transparent)]',
|
|
21
|
+
].join(' '),
|
|
15
22
|
false: '',
|
|
16
23
|
},
|
|
17
24
|
},
|
|
@@ -20,7 +27,7 @@ const switchTrack = tv({
|
|
|
20
27
|
const switchKnob = tv({
|
|
21
28
|
base: [
|
|
22
29
|
'pointer-events-none absolute left-[2px] top-[2px] h-5 w-5 rounded-full bg-white',
|
|
23
|
-
'shadow-[0_1px_3px_rgba(15,23,42,0.
|
|
30
|
+
'shadow-[0_1px_3px_rgba(15,23,42,0.45)] transition-transform duration-150',
|
|
24
31
|
].join(' '),
|
|
25
32
|
variants: {
|
|
26
33
|
checked: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/ui/Switch/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,EAAE;QACJ,mFAAmF;QACnF,
|
|
1
|
+
{"version":3,"file":"Switch.js","sourceRoot":"","sources":["../../../src/ui/Switch/Switch.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,EAAE;QACJ,mFAAmF;QACnF,mFAAmF;QACnF,8IAA8I;QAC9I,gHAAgH;QAChH,uDAAuD;QACvD,8EAA8E;QAC9E,yEAAyE;QACzE,iDAAiD;KAClD,CAAC,IAAI,CAAC,GAAG,CAAC;IACX,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE;gBACJ,4EAA4E;gBAC5E,2DAA2D;gBAC3D,kHAAkH;aACnH,CAAC,IAAI,CAAC,GAAG,CAAC;YACX,KAAK,EAAE,EAAE;SACV;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,EAAE;QACJ,iFAAiF;QACjF,0EAA0E;KAC3E,CAAC,IAAI,CAAC,GAAG,CAAC;IACX,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,EAAE;SACV;KACF;IACD,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;CACpC,CAAC,CAAC;AAOH;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAC9B,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACnE,iBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,kBACC,OAAO,EACrB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAC9C,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,KACtC,IAAI,YAER,eAAM,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,iBAAc,MAAM,GAAG,GACxD,CACV,CACF,CAAC;AACF,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC"}
|