@zentauri-ui/zentauri-components 2.3.0 → 2.3.2
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/README.md +9 -5
- package/cli/props.json +2508 -1458
- package/cli/registry.json +20 -0
- package/dist/chunk-2RBBXVFA.js +19 -0
- package/dist/{chunk-ENKXB2BA.js.map → chunk-2RBBXVFA.js.map} +1 -1
- package/dist/{chunk-BFHJF4MV.mjs → chunk-425DAZTS.mjs} +4 -4
- package/dist/{chunk-BFHJF4MV.mjs.map → chunk-425DAZTS.mjs.map} +1 -1
- package/dist/chunk-4U6PVVST.mjs +15 -0
- package/dist/chunk-4U6PVVST.mjs.map +1 -0
- package/dist/{chunk-AARJLZXP.js → chunk-6GP74P4F.js} +6 -6
- package/dist/{chunk-AARJLZXP.js.map → chunk-6GP74P4F.js.map} +1 -1
- package/dist/{chunk-DIAA5VH4.mjs → chunk-CIZQQ32L.mjs} +3 -3
- package/dist/chunk-CIZQQ32L.mjs.map +1 -0
- package/dist/chunk-DUKHIN2W.js +44 -0
- package/dist/chunk-DUKHIN2W.js.map +1 -0
- package/dist/{chunk-PQ2XTY3M.js → chunk-G36ZV446.js} +13 -13
- package/dist/{chunk-PQ2XTY3M.js.map → chunk-G36ZV446.js.map} +1 -1
- package/dist/chunk-HJ7EFBED.js +86 -0
- package/dist/chunk-HJ7EFBED.js.map +1 -0
- package/dist/{chunk-H3BJOK22.js → chunk-HNAUUCR5.js} +3 -3
- package/dist/chunk-HNAUUCR5.js.map +1 -0
- package/dist/chunk-K2VCZK4I.mjs +75 -0
- package/dist/chunk-K2VCZK4I.mjs.map +1 -0
- package/dist/{chunk-DSX6RUYI.js → chunk-KVBFWRPF.js} +12 -12
- package/dist/{chunk-DSX6RUYI.js.map → chunk-KVBFWRPF.js.map} +1 -1
- package/dist/chunk-N4MLFU2Q.mjs +69 -0
- package/dist/chunk-N4MLFU2Q.mjs.map +1 -0
- package/dist/{chunk-ATE5SCTR.mjs → chunk-N6Q4ZLQR.mjs} +3 -3
- package/dist/{chunk-ATE5SCTR.mjs.map → chunk-N6Q4ZLQR.mjs.map} +1 -1
- package/dist/{chunk-YY7G4NV3.js → chunk-NZQA4M35.js} +49 -17
- package/dist/chunk-NZQA4M35.js.map +1 -0
- package/dist/chunk-OME7XOPN.js +78 -0
- package/dist/chunk-OME7XOPN.js.map +1 -0
- package/dist/chunk-PVDWJUMF.mjs +34 -0
- package/dist/chunk-PVDWJUMF.mjs.map +1 -0
- package/dist/chunk-PVVYOIU2.js +38 -0
- package/dist/chunk-PVVYOIU2.js.map +1 -0
- package/dist/chunk-PWEZB53R.js +90 -0
- package/dist/chunk-PWEZB53R.js.map +1 -0
- package/dist/chunk-PWYEC3KY.mjs +30 -0
- package/dist/chunk-PWYEC3KY.mjs.map +1 -0
- package/dist/{chunk-JKKF5DCF.mjs → chunk-R2JXARKB.mjs} +3 -3
- package/dist/{chunk-JKKF5DCF.mjs.map → chunk-R2JXARKB.mjs.map} +1 -1
- package/dist/chunk-SD7YXMNV.js +40 -0
- package/dist/chunk-SD7YXMNV.js.map +1 -0
- package/dist/{chunk-ZB6C6CJQ.mjs → chunk-TZTUL6C4.mjs} +40 -8
- package/dist/chunk-TZTUL6C4.mjs.map +1 -0
- package/dist/chunk-UBQY572I.mjs +81 -0
- package/dist/chunk-UBQY572I.mjs.map +1 -0
- package/dist/chunk-V5EE5ATH.mjs +36 -0
- package/dist/chunk-V5EE5ATH.mjs.map +1 -0
- package/dist/chunk-XUK5P37Y.js +19 -0
- package/dist/chunk-XUK5P37Y.js.map +1 -0
- package/dist/{chunk-WZY32L6K.mjs → chunk-YDD5HQGX.mjs} +3 -3
- package/dist/{chunk-WZY32L6K.mjs.map → chunk-YDD5HQGX.mjs.map} +1 -1
- package/dist/design-system/facade.js +12 -8
- package/dist/design-system/facade.js.map +1 -1
- package/dist/design-system/facade.mjs +11 -7
- package/dist/design-system/facade.mjs.map +1 -1
- package/dist/design-system/index.d.ts +4 -0
- package/dist/design-system/index.d.ts.map +1 -1
- package/dist/design-system/qr-code.d.ts +4 -0
- package/dist/design-system/qr-code.d.ts.map +1 -0
- package/dist/design-system/qr-scanner.d.ts +11 -0
- package/dist/design-system/qr-scanner.d.ts.map +1 -0
- package/dist/design-system/secret-reveal.d.ts +1 -1
- package/dist/design-system/secret-reveal.d.ts.map +1 -1
- package/dist/design-system/speech-recognition.d.ts +39 -0
- package/dist/design-system/speech-recognition.d.ts.map +1 -0
- package/dist/design-system/speech-synthesizer.d.ts +41 -0
- package/dist/design-system/speech-synthesizer.d.ts.map +1 -0
- package/dist/ui/buttons/animated.js +14 -10
- package/dist/ui/buttons/animated.js.map +1 -1
- package/dist/ui/buttons/animated.mjs +12 -8
- package/dist/ui/buttons/animated.mjs.map +1 -1
- package/dist/ui/buttons.js +15 -11
- package/dist/ui/buttons.mjs +13 -9
- package/dist/ui/data-table.js +25 -21
- package/dist/ui/data-table.js.map +1 -1
- package/dist/ui/data-table.mjs +15 -11
- package/dist/ui/data-table.mjs.map +1 -1
- package/dist/ui/dynamic-stepper.js +24 -20
- package/dist/ui/dynamic-stepper.js.map +1 -1
- package/dist/ui/dynamic-stepper.mjs +13 -9
- package/dist/ui/dynamic-stepper.mjs.map +1 -1
- package/dist/ui/pagination.js +16 -12
- package/dist/ui/pagination.mjs +13 -9
- package/dist/ui/qr-code/animated/animations.d.ts +8 -0
- package/dist/ui/qr-code/animated/animations.d.ts.map +1 -0
- package/dist/ui/qr-code/animated/index.d.ts +4 -0
- package/dist/ui/qr-code/animated/index.d.ts.map +1 -0
- package/dist/ui/qr-code/animated/qr-code-animated.d.ts +6 -0
- package/dist/ui/qr-code/animated/qr-code-animated.d.ts.map +1 -0
- package/dist/ui/qr-code/animated/types.d.ts +9 -0
- package/dist/ui/qr-code/animated/types.d.ts.map +1 -0
- package/dist/ui/qr-code/animated.js +156 -0
- package/dist/ui/qr-code/animated.js.map +1 -0
- package/dist/ui/qr-code/animated.mjs +149 -0
- package/dist/ui/qr-code/animated.mjs.map +1 -0
- package/dist/ui/qr-code/index.d.ts +5 -0
- package/dist/ui/qr-code/index.d.ts.map +1 -0
- package/dist/ui/qr-code/qr-code-base.d.ts +47 -0
- package/dist/ui/qr-code/qr-code-base.d.ts.map +1 -0
- package/dist/ui/qr-code/qr-code.d.ts +2 -0
- package/dist/ui/qr-code/qr-code.d.ts.map +1 -0
- package/dist/ui/qr-code/types.d.ts +14 -0
- package/dist/ui/qr-code/types.d.ts.map +1 -0
- package/dist/ui/qr-code/variants.d.ts +4 -0
- package/dist/ui/qr-code/variants.d.ts.map +1 -0
- package/dist/ui/qr-code.js +35 -0
- package/dist/ui/qr-code.js.map +1 -0
- package/dist/ui/qr-code.mjs +17 -0
- package/dist/ui/qr-code.mjs.map +1 -0
- package/dist/ui/qr-scanner/index.d.ts +4 -0
- package/dist/ui/qr-scanner/index.d.ts.map +1 -0
- package/dist/ui/qr-scanner/qr-scanner-base.d.ts +62 -0
- package/dist/ui/qr-scanner/qr-scanner-base.d.ts.map +1 -0
- package/dist/ui/qr-scanner/qr-scanner.d.ts +2 -0
- package/dist/ui/qr-scanner/qr-scanner.d.ts.map +1 -0
- package/dist/ui/qr-scanner/types.d.ts +28 -0
- package/dist/ui/qr-scanner/types.d.ts.map +1 -0
- package/dist/ui/qr-scanner/variants.d.ts +9 -0
- package/dist/ui/qr-scanner/variants.d.ts.map +1 -0
- package/dist/ui/qr-scanner.js +316 -0
- package/dist/ui/qr-scanner.js.map +1 -0
- package/dist/ui/qr-scanner.mjs +308 -0
- package/dist/ui/qr-scanner.mjs.map +1 -0
- package/dist/ui/secret-reveal/animated/secret-reveal-animated.d.ts.map +1 -1
- package/dist/ui/secret-reveal/animated.js +10 -7
- package/dist/ui/secret-reveal/animated.js.map +1 -1
- package/dist/ui/secret-reveal/animated.mjs +6 -3
- package/dist/ui/secret-reveal/animated.mjs.map +1 -1
- package/dist/ui/secret-reveal/secret-reveal-base.d.ts.map +1 -1
- package/dist/ui/secret-reveal.js +14 -11
- package/dist/ui/secret-reveal.js.map +1 -1
- package/dist/ui/secret-reveal.mjs +7 -4
- package/dist/ui/secret-reveal.mjs.map +1 -1
- package/dist/ui/speech-recognition/animated/animations.d.ts +8 -0
- package/dist/ui/speech-recognition/animated/animations.d.ts.map +1 -0
- package/dist/ui/speech-recognition/animated/index.d.ts +4 -0
- package/dist/ui/speech-recognition/animated/index.d.ts.map +1 -0
- package/dist/ui/speech-recognition/animated/speech-recognition-animated.d.ts +6 -0
- package/dist/ui/speech-recognition/animated/speech-recognition-animated.d.ts.map +1 -0
- package/dist/ui/speech-recognition/animated/types.d.ts +9 -0
- package/dist/ui/speech-recognition/animated/types.d.ts.map +1 -0
- package/dist/ui/speech-recognition/animated.js +288 -0
- package/dist/ui/speech-recognition/animated.js.map +1 -0
- package/dist/ui/speech-recognition/animated.mjs +285 -0
- package/dist/ui/speech-recognition/animated.mjs.map +1 -0
- package/dist/ui/speech-recognition/index.d.ts +4 -0
- package/dist/ui/speech-recognition/index.d.ts.map +1 -0
- package/dist/ui/speech-recognition/speech-recognition-base.d.ts +6 -0
- package/dist/ui/speech-recognition/speech-recognition-base.d.ts.map +1 -0
- package/dist/ui/speech-recognition/speech-recognition.d.ts +2 -0
- package/dist/ui/speech-recognition/speech-recognition.d.ts.map +1 -0
- package/dist/ui/speech-recognition/types.d.ts +31 -0
- package/dist/ui/speech-recognition/types.d.ts.map +1 -0
- package/dist/ui/speech-recognition/variants.d.ts +11 -0
- package/dist/ui/speech-recognition/variants.d.ts.map +1 -0
- package/dist/ui/speech-recognition.js +242 -0
- package/dist/ui/speech-recognition.js.map +1 -0
- package/dist/ui/speech-recognition.mjs +233 -0
- package/dist/ui/speech-recognition.mjs.map +1 -0
- package/dist/ui/speech-synthesizer/animated/animations.d.ts +8 -0
- package/dist/ui/speech-synthesizer/animated/animations.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/animated/index.d.ts +4 -0
- package/dist/ui/speech-synthesizer/animated/index.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/animated/speech-synthesizer-animated.d.ts +6 -0
- package/dist/ui/speech-synthesizer/animated/speech-synthesizer-animated.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/animated/types.d.ts +9 -0
- package/dist/ui/speech-synthesizer/animated/types.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/animated.js +269 -0
- package/dist/ui/speech-synthesizer/animated.js.map +1 -0
- package/dist/ui/speech-synthesizer/animated.mjs +266 -0
- package/dist/ui/speech-synthesizer/animated.mjs.map +1 -0
- package/dist/ui/speech-synthesizer/index.d.ts +4 -0
- package/dist/ui/speech-synthesizer/index.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/speech-synthesizer-base.d.ts +6 -0
- package/dist/ui/speech-synthesizer/speech-synthesizer-base.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/speech-synthesizer.d.ts +2 -0
- package/dist/ui/speech-synthesizer/speech-synthesizer.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/types.d.ts +43 -0
- package/dist/ui/speech-synthesizer/types.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer/variants.d.ts +13 -0
- package/dist/ui/speech-synthesizer/variants.d.ts.map +1 -0
- package/dist/ui/speech-synthesizer.js +220 -0
- package/dist/ui/speech-synthesizer.js.map +1 -0
- package/dist/ui/speech-synthesizer.mjs +211 -0
- package/dist/ui/speech-synthesizer.mjs.map +1 -0
- package/dist/ui/split-button.js +26 -22
- package/dist/ui/split-button.js.map +1 -1
- package/dist/ui/split-button.mjs +13 -9
- package/dist/ui/split-button.mjs.map +1 -1
- package/package.json +5 -2
- package/src/design-system/index.ts +4 -0
- package/src/design-system/qr-code.ts +13 -0
- package/src/design-system/qr-scanner.ts +32 -0
- package/src/design-system/secret-reveal.ts +1 -1
- package/src/design-system/speech-recognition.ts +82 -0
- package/src/design-system/speech-synthesizer.ts +90 -0
- package/src/ui/qr-code/animated/animations.ts +51 -0
- package/src/ui/qr-code/animated/index.ts +5 -0
- package/src/ui/qr-code/animated/qr-code-animated.tsx +111 -0
- package/src/ui/qr-code/animated/types.ts +10 -0
- package/src/ui/qr-code/index.ts +10 -0
- package/src/ui/qr-code/qr-code-base.tsx +149 -0
- package/src/ui/qr-code/qr-code.test.tsx +58 -0
- package/src/ui/qr-code/qr-code.tsx +2 -0
- package/src/ui/qr-code/types.ts +22 -0
- package/src/ui/qr-code/variants.ts +11 -0
- package/src/ui/qr-scanner/index.ts +17 -0
- package/src/ui/qr-scanner/qr-scanner-base.tsx +568 -0
- package/src/ui/qr-scanner/qr-scanner.test.tsx +61 -0
- package/src/ui/qr-scanner/qr-scanner.tsx +2 -0
- package/src/ui/qr-scanner/types.ts +32 -0
- package/src/ui/qr-scanner/variants.ts +26 -0
- package/src/ui/secret-reveal/animated/secret-reveal-animated.tsx +4 -1
- package/src/ui/secret-reveal/secret-reveal-base.tsx +4 -1
- package/src/ui/speech-recognition/animated/animations.ts +62 -0
- package/src/ui/speech-recognition/animated/index.ts +8 -0
- package/src/ui/speech-recognition/animated/speech-recognition-animated.tsx +276 -0
- package/src/ui/speech-recognition/animated/types.ts +11 -0
- package/src/ui/speech-recognition/index.ts +15 -0
- package/src/ui/speech-recognition/speech-recognition-base.tsx +276 -0
- package/src/ui/speech-recognition/speech-recognition.test.tsx +74 -0
- package/src/ui/speech-recognition/speech-recognition.tsx +1 -0
- package/src/ui/speech-recognition/types.ts +50 -0
- package/src/ui/speech-recognition/variants.ts +47 -0
- package/src/ui/speech-synthesizer/animated/animations.ts +62 -0
- package/src/ui/speech-synthesizer/animated/index.ts +8 -0
- package/src/ui/speech-synthesizer/animated/speech-synthesizer-animated.tsx +260 -0
- package/src/ui/speech-synthesizer/animated/types.ts +11 -0
- package/src/ui/speech-synthesizer/index.ts +14 -0
- package/src/ui/speech-synthesizer/speech-synthesizer-base.tsx +255 -0
- package/src/ui/speech-synthesizer/speech-synthesizer.test.tsx +87 -0
- package/src/ui/speech-synthesizer/speech-synthesizer.tsx +1 -0
- package/src/ui/speech-synthesizer/types.ts +57 -0
- package/src/ui/speech-synthesizer/variants.ts +55 -0
- package/dist/chunk-DIAA5VH4.mjs.map +0 -1
- package/dist/chunk-ENKXB2BA.js +0 -19
- package/dist/chunk-H3BJOK22.js.map +0 -1
- package/dist/chunk-YY7G4NV3.js.map +0 -1
- package/dist/chunk-ZB6C6CJQ.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/qr-code/animated/animations.ts","../../../src/ui/qr-code/animated/qr-code-animated.tsx"],"names":[],"mappings":"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","file":"animated.mjs","sourcesContent":["import type { Transition, Variants } from \"framer-motion\";\n\nexport type QrCodeAnimation =\n | \"none\"\n | \"fade-in\"\n | \"zoom-in\"\n | \"slide-up\"\n | \"rotate-in\";\n\nexport type QrCodeAnimationPresets = Record<\n QrCodeAnimation,\n { transition: Transition; variants: Variants }\n>;\n\nexport const qrCodeAnimationPresets: QrCodeAnimationPresets = {\n none: {\n transition: { duration: 0 },\n variants: {\n initial: { opacity: 1 },\n animate: { opacity: 1 },\n },\n },\n \"fade-in\": {\n transition: { duration: 0.3, ease: \"easeOut\" },\n variants: {\n initial: { opacity: 0 },\n animate: { opacity: 1 },\n },\n },\n \"zoom-in\": {\n transition: { type: \"spring\", stiffness: 300, damping: 24 },\n variants: {\n initial: { opacity: 0, scale: 0.85 },\n animate: { opacity: 1, scale: 1 },\n },\n },\n \"slide-up\": {\n transition: { type: \"spring\", stiffness: 280, damping: 22 },\n variants: {\n initial: { opacity: 0, y: 20 },\n animate: { opacity: 1, y: 0 },\n },\n },\n \"rotate-in\": {\n transition: { type: \"spring\", stiffness: 200, damping: 18 },\n variants: {\n initial: { opacity: 0, rotate: -90, scale: 0.8 },\n animate: { opacity: 1, rotate: 0, scale: 1 },\n },\n },\n};\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { motion } from \"framer-motion\";\nimport QRCode from \"qrcode\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { qrCodeAnimationPresets } from \"./animations\";\nimport type { QrCodeAnimatedProps } from \"./types\";\nimport { QrCodeBase } from \"../qr-code-base\";\n\nexport function QrCodeAnimated({\n animation = \"none\",\n value,\n canvasSize = 200,\n level = \"M\",\n bgColor = \"#ffffff\",\n fgColor = \"#000000\",\n margin = 2,\n caption,\n className,\n ...props\n}: QrCodeAnimatedProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || animation === \"none\") return;\n\n if (!value) {\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n return;\n }\n\n QRCode.toCanvas(\n canvas,\n value,\n {\n width: canvasSize,\n margin,\n color: {\n dark: fgColor,\n light: bgColor,\n },\n errorCorrectionLevel: level,\n },\n (error) => {\n if (error) {\n console.error(\"QR Code generation error:\", error);\n }\n },\n );\n }, [value, canvasSize, level, bgColor, fgColor, margin, animation]);\n\n if (animation === \"none\") {\n return (\n <QrCodeBase\n value={value}\n canvasSize={canvasSize}\n level={level}\n bgColor={bgColor}\n fgColor={fgColor}\n margin={margin}\n caption={caption}\n className={className}\n {...props}\n />\n );\n }\n\n const preset = qrCodeAnimationPresets[animation];\n\n return (\n <motion.div\n data-slot=\"qr-code\"\n className={cn(\n \"inline-flex flex-col items-center gap-3 rounded-2xl border p-6 border-[color:var(--zui-qr-code-border,var(--zui-border,#0000001a))] dark:border-[color:var(--zui-qr-code-border-dark,var(--zui-border-dark,#ffffff1a))] bg-[var(--zui-qr-code-bg,var(--zui-surface,oklch(98.4%_0.003_247.858)))] dark:bg-[var(--zui-qr-code-bg-dark,var(--zui-surface-dark,oklch(12.9%_0.042_264.695)))]\",\n className,\n )}\n variants={preset.variants}\n initial=\"initial\"\n animate=\"animate\"\n transition={preset.transition}\n {...(props as Record<string, unknown>)}\n >\n <div className=\"overflow-hidden rounded-xl bg-[var(--zui-qr-code-canvas-bg,var(--zui-surface-muted,oklch(92.9%_0.013_255.508)))] dark:bg-[var(--zui-qr-code-canvas-bg-dark,var(--zui-surface-muted-dark,oklch(27.9%_0.041_260.031)))]\">\n <canvas\n ref={canvasRef}\n width={canvasSize}\n height={canvasSize}\n data-slot=\"qr-code-canvas\"\n className=\"block h-auto max-w-full\"\n aria-label={`QR code for ${value}`}\n />\n </div>\n {caption ? (\n <span\n data-slot=\"qr-code-caption\"\n className=\"text-xs text-center text-[color:var(--zui-qr-code-caption-fg,var(--zui-fg-muted,oklch(55.2%_0.046_257.417)))] dark:text-[color:var(--zui-qr-code-caption-fg-dark,var(--zui-fg-muted-dark,oklch(70.8%_0.015_256.243)))] max-w-full truncate px-2\"\n >\n {caption}\n </span>\n ) : null}\n </motion.div>\n );\n}\n\nQrCodeAnimated.displayName = \"QrCodeAnimated\";\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { QrCode } from "./qr-code";
|
|
2
|
+
export type { QrCodeBaseProps, QrCodeLevel, QrCodeProps } from "./types";
|
|
3
|
+
export { QR_CODE_LEVEL_LABELS } from "./types";
|
|
4
|
+
export { qrCodeCanvasWrapperVariants, qrCodeCaptionVariants, qrCodeVariants, } from "./variants";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-code/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { QrCodeBaseProps } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* QrCodeBase renders a QR code onto a `<canvas>` element using the `qrcode`
|
|
4
|
+
* npm package. It is the static (non-animated) implementation of the public
|
|
5
|
+
* `QrCode` component.
|
|
6
|
+
*
|
|
7
|
+
* --- Props ---
|
|
8
|
+
*
|
|
9
|
+
* - `value` — The string to encode. When empty/falsy the canvas is cleared.
|
|
10
|
+
* - `canvasSize` — Pixel dimensions of the canvas (default: 200). Both width
|
|
11
|
+
* and height are set to this value, producing a square QR code.
|
|
12
|
+
* - `level` — Error correction level (`"L"` | `"M"` | `"Q"` | `"H"`). Higher
|
|
13
|
+
* levels survive more visual damage but hold less data.
|
|
14
|
+
* - `bgColor` / `fgColor` — Background and foreground colours passed to the
|
|
15
|
+
* underlying `QRCode.toCanvas` options.
|
|
16
|
+
* - `margin` — Quiet-zone width in QR modules (default: 2). Passed directly
|
|
17
|
+
* to the `qrcode` library.
|
|
18
|
+
* - `caption` — Optional label rendered below the QR code.
|
|
19
|
+
* - `ref` — React 19 ref forwarded to the root `<div>` element.
|
|
20
|
+
* - `className` / `...rest` — Spread onto the root `<div>` for layout or
|
|
21
|
+
* style overrides.
|
|
22
|
+
*
|
|
23
|
+
* --- Rendering lifecycle ---
|
|
24
|
+
*
|
|
25
|
+
* A `useEffect` watches `[value, canvasSize, level, bgColor, fgColor, margin]`.
|
|
26
|
+
* On every change it:
|
|
27
|
+
* 1. Grabs the canvas element from the ref.
|
|
28
|
+
* 2. If `value` is empty, clears the canvas with `ctx.clearRect` so a stale
|
|
29
|
+
* QR code doesn't persist.
|
|
30
|
+
* 3. Otherwise calls `QRCode.toCanvas()` which draws the QR pattern
|
|
31
|
+
* asynchronously (via callback) onto the canvas element.
|
|
32
|
+
*
|
|
33
|
+
* The outer `<div>` uses design-system variants (`qrCodeVariants`) for
|
|
34
|
+
* consistent theming and carries `data-slot="qr-code"` for scoped styling and
|
|
35
|
+
* testing.
|
|
36
|
+
*
|
|
37
|
+
* --- Accessibility ---
|
|
38
|
+
*
|
|
39
|
+
* The `<canvas>` has an `aria-label` describing it as a "QR code for {value}".
|
|
40
|
+
* Screen readers will announce the purpose, though the raw value is exposed
|
|
41
|
+
* (consider truncating for secrets).
|
|
42
|
+
*/
|
|
43
|
+
export declare function QrCodeBase({ value, canvasSize, level, bgColor, fgColor, margin, caption, className, ref, ...rest }: QrCodeBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export declare namespace QrCodeBase {
|
|
45
|
+
var displayName: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=qr-code-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-code-base.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-code/qr-code-base.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAO/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,UAAgB,EAChB,KAAW,EACX,OAAmB,EACnB,OAAmB,EACnB,MAAU,EACV,OAAO,EACP,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,eAAe,2CAgFjB;yBA3Fe,UAAU"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-code.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-code/qr-code.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ComponentPropsWithRef, ReactNode } from "react";
|
|
2
|
+
export type QrCodeLevel = "L" | "M" | "Q" | "H";
|
|
3
|
+
export interface QrCodeBaseProps extends ComponentPropsWithRef<"div"> {
|
|
4
|
+
value: string;
|
|
5
|
+
canvasSize?: number;
|
|
6
|
+
level?: QrCodeLevel;
|
|
7
|
+
bgColor?: string;
|
|
8
|
+
fgColor?: string;
|
|
9
|
+
margin?: number;
|
|
10
|
+
caption?: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
export type QrCodeProps = QrCodeBaseProps;
|
|
13
|
+
export declare const QR_CODE_LEVEL_LABELS: Record<QrCodeLevel, string>;
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-code/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,WAAW,eAAgB,SAAQ,qBAAqB,CAAC,KAAK,CAAC;IACnE,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKnD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const qrCodeVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
2
|
+
export declare const qrCodeCanvasWrapperVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
3
|
+
export declare const qrCodeCaptionVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
4
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-code/variants.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,oFAAqB,CAAC;AACjD,eAAO,MAAM,2BAA2B,oFAA8B,CAAC;AACvE,eAAO,MAAM,qBAAqB,oFAA4B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkPWEZB53R_js = require('../chunk-PWEZB53R.js');
|
|
5
|
+
require('../chunk-XUK5P37Y.js');
|
|
6
|
+
require('../chunk-ZS5756ZC.js');
|
|
7
|
+
require('../chunk-PZ5AY32C.js');
|
|
8
|
+
|
|
9
|
+
// src/ui/qr-code/types.ts
|
|
10
|
+
var QR_CODE_LEVEL_LABELS = {
|
|
11
|
+
L: "Low (7%)",
|
|
12
|
+
M: "Medium (15%)",
|
|
13
|
+
Q: "Quartile (25%)",
|
|
14
|
+
H: "High (30%)"
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
Object.defineProperty(exports, "QrCode", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return chunkPWEZB53R_js.QrCodeBase; }
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(exports, "qrCodeCanvasWrapperVariants", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return chunkPWEZB53R_js.qrCodeCanvasWrapperVariants; }
|
|
24
|
+
});
|
|
25
|
+
Object.defineProperty(exports, "qrCodeCaptionVariants", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () { return chunkPWEZB53R_js.qrCodeCaptionVariants; }
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(exports, "qrCodeVariants", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
get: function () { return chunkPWEZB53R_js.qrCodeVariants; }
|
|
32
|
+
});
|
|
33
|
+
exports.QR_CODE_LEVEL_LABELS = QR_CODE_LEVEL_LABELS;
|
|
34
|
+
//# sourceMappingURL=qr-code.js.map
|
|
35
|
+
//# sourceMappingURL=qr-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/qr-code/types.ts"],"names":[],"mappings":";;;;;;;;AAgBO,IAAM,oBAAA,GAAoD;AAAA,EAC/D,CAAA,EAAG,UAAA;AAAA,EACH,CAAA,EAAG,cAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL","file":"qr-code.js","sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from \"react\";\n\nexport type QrCodeLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QrCodeBaseProps extends ComponentPropsWithRef<\"div\"> {\n value: string;\n canvasSize?: number;\n level?: QrCodeLevel;\n bgColor?: string;\n fgColor?: string;\n margin?: number;\n caption?: ReactNode;\n}\n\nexport type QrCodeProps = QrCodeBaseProps;\n\nexport const QR_CODE_LEVEL_LABELS: Record<QrCodeLevel, string> = {\n L: \"Low (7%)\",\n M: \"Medium (15%)\",\n Q: \"Quartile (25%)\",\n H: \"High (30%)\",\n} as const;\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
export { QrCodeBase as QrCode, qrCodeCanvasWrapperVariants, qrCodeCaptionVariants, qrCodeVariants } from '../chunk-UBQY572I.mjs';
|
|
3
|
+
import '../chunk-4U6PVVST.mjs';
|
|
4
|
+
import '../chunk-4D54YOL6.mjs';
|
|
5
|
+
import '../chunk-J5LGTIGS.mjs';
|
|
6
|
+
|
|
7
|
+
// src/ui/qr-code/types.ts
|
|
8
|
+
var QR_CODE_LEVEL_LABELS = {
|
|
9
|
+
L: "Low (7%)",
|
|
10
|
+
M: "Medium (15%)",
|
|
11
|
+
Q: "Quartile (25%)",
|
|
12
|
+
H: "High (30%)"
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { QR_CODE_LEVEL_LABELS };
|
|
16
|
+
//# sourceMappingURL=qr-code.mjs.map
|
|
17
|
+
//# sourceMappingURL=qr-code.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/qr-code/types.ts"],"names":[],"mappings":";;;;;;AAgBO,IAAM,oBAAA,GAAoD;AAAA,EAC/D,CAAA,EAAG,UAAA;AAAA,EACH,CAAA,EAAG,cAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACL","file":"qr-code.mjs","sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from \"react\";\n\nexport type QrCodeLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QrCodeBaseProps extends ComponentPropsWithRef<\"div\"> {\n value: string;\n canvasSize?: number;\n level?: QrCodeLevel;\n bgColor?: string;\n fgColor?: string;\n margin?: number;\n caption?: ReactNode;\n}\n\nexport type QrCodeProps = QrCodeBaseProps;\n\nexport const QR_CODE_LEVEL_LABELS: Record<QrCodeLevel, string> = {\n L: \"Low (7%)\",\n M: \"Medium (15%)\",\n Q: \"Quartile (25%)\",\n H: \"High (30%)\",\n} as const;\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { QrScanner } from "./qr-scanner";
|
|
2
|
+
export type { QrScannerBaseProps, QrScannerProps, QrScannerRef, QrScannerVariantProps, } from "./types";
|
|
3
|
+
export { qrScannerFallbackVariants, qrScannerOverlayVariants, qrScannerStatusVariants, qrScannerVariants, qrScannerVideoVariants, qrScannerViewfinderVariants, } from "./variants";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-scanner/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,qBAAqB,GACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { QrScannerBaseProps } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* QrScannerBase uses the device camera (via `getUserMedia`) to decode QR
|
|
4
|
+
* codes in real time. It provides an imperative handle (`ref`) so parents
|
|
5
|
+
* can control the camera lifecycle and scan images without camera access.
|
|
6
|
+
*
|
|
7
|
+
* --- Architecture overview ---
|
|
8
|
+
*
|
|
9
|
+
* The component has three main async loops:
|
|
10
|
+
*
|
|
11
|
+
* 1. **Camera startup** (`startCamera`) — calls `getUserMedia`, attaches
|
|
12
|
+
* the stream to a `<video>` element, calls `video.play()`, then
|
|
13
|
+
* kicks off the scan loop via `requestAnimationFrame`.
|
|
14
|
+
*
|
|
15
|
+
* 2. **Scan loop** (`scanFrame`) — scheduled with `requestAnimationFrame`.
|
|
16
|
+
* Each frame draws the current video frame to an off-screen `<canvas>`,
|
|
17
|
+
* calls `jsQR` on the pixel data, and fires `onResult` when a QR code
|
|
18
|
+
* is detected. Respects `scanDelay` to avoid thrashing.
|
|
19
|
+
*
|
|
20
|
+
* 3. **Image scanning** (`scanImage` on the imperative handle) — decodes a
|
|
21
|
+
* QR code from a static `File` (e.g. an uploaded screenshot) without
|
|
22
|
+
* involving the camera at all.
|
|
23
|
+
*
|
|
24
|
+
* --- Race-condition guards ---
|
|
25
|
+
*
|
|
26
|
+
* Camera start/stop is inherently racy because `video.play()` returns a
|
|
27
|
+
* Promise that resolves asynchronously. If `stopCamera()` (or the
|
|
28
|
+
* `useEffect` cleanup) runs while `play()` is still pending, we must not
|
|
29
|
+
* operate on the new stream that may have been set up in the meantime.
|
|
30
|
+
*
|
|
31
|
+
* Both `stopCamera` and the effect cleanup capture `streamRef.current` into
|
|
32
|
+
* a local `streamToStop` variable at the time they are called. The actual
|
|
33
|
+
* stop/cleanup logic (which may run later via `playPromise.then(...)`)
|
|
34
|
+
* checks `video.srcObject === streamToStop` before pausing, ensuring it
|
|
35
|
+
* only affects the stream that was active at the time of the request.
|
|
36
|
+
*
|
|
37
|
+
* --- Callback ref pattern ---
|
|
38
|
+
*
|
|
39
|
+
* `onResult`, `onError`, `onStart`, `onStop` are stored in refs and kept
|
|
40
|
+
* current in the render body. The `useCallback` hooks for `scanFrame`,
|
|
41
|
+
* `startCamera`, and `stopCamera` read from these refs instead of listing
|
|
42
|
+
* the callbacks in their dependency arrays. This prevents the camera from
|
|
43
|
+
* restarting every time the parent passes a new inline function reference.
|
|
44
|
+
*
|
|
45
|
+
* --- Error classification ---
|
|
46
|
+
*
|
|
47
|
+
* `getUserMedia` throws `DOMException` with specific names:
|
|
48
|
+
* - `NotFoundError` → no camera hardware detected
|
|
49
|
+
* - `NotAllowedError` → user denied permission
|
|
50
|
+
* - `NotReadableError` → camera is busy (another app)
|
|
51
|
+
* - `AbortError` → `play()` was interrupted by unmount
|
|
52
|
+
*
|
|
53
|
+
* The first three set `status` to `"no-camera"` and render a fallback UI.
|
|
54
|
+
* `AbortError` is silently swallowed because it's a normal consequence of
|
|
55
|
+
* unmounting during startup. All other errors set `status` to `"error"` and
|
|
56
|
+
* display the error message.
|
|
57
|
+
*/
|
|
58
|
+
export declare function QrScannerBase({ onResult, onError, onStart, onStop, facingMode, constraints, scanDelay, continuous, fallbackText, loadingText, noCameraText, appearance, autoStart, className, ref, ...rest }: QrScannerBaseProps): import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
export declare namespace QrScannerBase {
|
|
60
|
+
var displayName: string;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=qr-scanner-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-scanner-base.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-scanner/qr-scanner-base.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAkClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAA0B,EAC1B,WAAW,EACX,SAAe,EACf,UAAkB,EAClB,YAAqC,EACrC,WAAkC,EAClC,YAAmC,EACnC,UAAU,EACV,SAAgB,EAChB,SAAS,EACT,GAAG,EACH,GAAG,IAAI,EACR,EAAE,kBAAkB,2CA8bpB;yBA/ce,aAAa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-scanner.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-scanner/qr-scanner.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
|
|
3
|
+
import type { qrScannerVariants } from "./variants";
|
|
4
|
+
export type QrScannerVariantProps = VariantProps<typeof qrScannerVariants>;
|
|
5
|
+
export interface QrScannerBaseProps extends ComponentPropsWithoutRef<"div"> {
|
|
6
|
+
ref?: Ref<QrScannerRef>;
|
|
7
|
+
onResult: (data: string) => void;
|
|
8
|
+
onError?: (error: unknown) => void;
|
|
9
|
+
onStart?: () => void;
|
|
10
|
+
onStop?: () => void;
|
|
11
|
+
facingMode?: "user" | "environment";
|
|
12
|
+
constraints?: MediaTrackConstraints;
|
|
13
|
+
scanDelay?: number;
|
|
14
|
+
continuous?: boolean;
|
|
15
|
+
fallbackText?: ReactNode;
|
|
16
|
+
loadingText?: ReactNode;
|
|
17
|
+
noCameraText?: ReactNode;
|
|
18
|
+
appearance?: QrScannerVariantProps["appearance"];
|
|
19
|
+
autoStart?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type QrScannerProps = QrScannerBaseProps;
|
|
22
|
+
export interface QrScannerRef {
|
|
23
|
+
start: () => Promise<void>;
|
|
24
|
+
stop: () => void;
|
|
25
|
+
scanImage: (file: File) => Promise<string | null>;
|
|
26
|
+
isScanning: boolean;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-scanner/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,qBAAqB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE3E,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB,CAAC,KAAK,CAAC;IACzE,GAAG,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACpC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,UAAU,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD,UAAU,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const qrScannerVariants: (props?: ({
|
|
2
|
+
appearance?: "default" | "muted" | null | undefined;
|
|
3
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
4
|
+
export declare const qrScannerVideoVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
5
|
+
export declare const qrScannerOverlayVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
6
|
+
export declare const qrScannerViewfinderVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
7
|
+
export declare const qrScannerStatusVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
8
|
+
export declare const qrScannerFallbackVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
|
|
9
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../src/ui/qr-scanner/variants.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,iBAAiB;;8EAO5B,CAAC;AAEH,eAAO,MAAM,sBAAsB,oFAAyB,CAAC;AAC7D,eAAO,MAAM,wBAAwB,oFAA2B,CAAC;AACjE,eAAO,MAAM,2BAA2B,oFAA8B,CAAC;AACvE,eAAO,MAAM,uBAAuB,oFAA8B,CAAC;AACnE,eAAO,MAAM,yBAAyB,oFAAgC,CAAC"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkPVVYOIU2_js = require('../chunk-PVVYOIU2.js');
|
|
5
|
+
var chunkZS5756ZC_js = require('../chunk-ZS5756ZC.js');
|
|
6
|
+
require('../chunk-PZ5AY32C.js');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
9
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
+
|
|
11
|
+
var qrScannerVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerBase, {
|
|
12
|
+
variants: {
|
|
13
|
+
appearance: chunkPVVYOIU2_js.zuiQrScannerAppearances
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: {
|
|
16
|
+
appearance: "default"
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var qrScannerVideoVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerVideo);
|
|
20
|
+
var qrScannerOverlayVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerOverlay);
|
|
21
|
+
var qrScannerViewfinderVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerViewfinder);
|
|
22
|
+
var qrScannerStatusVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerStatusBase);
|
|
23
|
+
var qrScannerFallbackVariants = classVarianceAuthority.cva(chunkPVVYOIU2_js.zuiQrScannerFallbackBase);
|
|
24
|
+
var cachedJsQR = null;
|
|
25
|
+
async function getJsqr() {
|
|
26
|
+
if (!cachedJsQR) {
|
|
27
|
+
const { default: m } = await import('jsqr');
|
|
28
|
+
cachedJsQR = m;
|
|
29
|
+
}
|
|
30
|
+
return cachedJsQR;
|
|
31
|
+
}
|
|
32
|
+
function QrScannerBase({
|
|
33
|
+
onResult,
|
|
34
|
+
onError,
|
|
35
|
+
onStart,
|
|
36
|
+
onStop,
|
|
37
|
+
facingMode = "environment",
|
|
38
|
+
constraints,
|
|
39
|
+
scanDelay = 500,
|
|
40
|
+
continuous = false,
|
|
41
|
+
fallbackText = "Camera not available",
|
|
42
|
+
loadingText = "Starting camera...",
|
|
43
|
+
noCameraText = "No camera detected",
|
|
44
|
+
appearance,
|
|
45
|
+
autoStart = true,
|
|
46
|
+
className,
|
|
47
|
+
ref,
|
|
48
|
+
...rest
|
|
49
|
+
}) {
|
|
50
|
+
const videoRef = react.useRef(null);
|
|
51
|
+
const canvasRef = react.useRef(null);
|
|
52
|
+
const streamRef = react.useRef(null);
|
|
53
|
+
const scanningRef = react.useRef(false);
|
|
54
|
+
const lastScanRef = react.useRef(0);
|
|
55
|
+
const rafRef = react.useRef(0);
|
|
56
|
+
const mountedRef = react.useRef(true);
|
|
57
|
+
const playPromiseRef = react.useRef(null);
|
|
58
|
+
const onResultRef = react.useRef(onResult);
|
|
59
|
+
const onErrorRef = react.useRef(onError);
|
|
60
|
+
const onStartRef = react.useRef(onStart);
|
|
61
|
+
const onStopRef = react.useRef(onStop);
|
|
62
|
+
onResultRef.current = onResult;
|
|
63
|
+
onErrorRef.current = onError;
|
|
64
|
+
onStartRef.current = onStart;
|
|
65
|
+
onStopRef.current = onStop;
|
|
66
|
+
const [scanning, setScanning] = react.useState(false);
|
|
67
|
+
const [status, setStatus] = react.useState("idle");
|
|
68
|
+
const [error, setError] = react.useState(null);
|
|
69
|
+
react.useEffect(() => {
|
|
70
|
+
mountedRef.current = true;
|
|
71
|
+
return () => {
|
|
72
|
+
mountedRef.current = false;
|
|
73
|
+
};
|
|
74
|
+
}, []);
|
|
75
|
+
const stopCamera = react.useCallback(() => {
|
|
76
|
+
scanningRef.current = false;
|
|
77
|
+
setScanning(false);
|
|
78
|
+
setStatus("idle");
|
|
79
|
+
cancelAnimationFrame(rafRef.current);
|
|
80
|
+
const streamToStop = streamRef.current;
|
|
81
|
+
const doStop = () => {
|
|
82
|
+
if (videoRef.current && videoRef.current.srcObject === streamToStop) {
|
|
83
|
+
videoRef.current.pause();
|
|
84
|
+
videoRef.current.srcObject = null;
|
|
85
|
+
}
|
|
86
|
+
if (streamToStop) {
|
|
87
|
+
streamToStop.getTracks().forEach((track) => track.stop());
|
|
88
|
+
}
|
|
89
|
+
if (streamRef.current === streamToStop) {
|
|
90
|
+
streamRef.current = null;
|
|
91
|
+
}
|
|
92
|
+
onStopRef.current?.();
|
|
93
|
+
};
|
|
94
|
+
if (playPromiseRef.current) {
|
|
95
|
+
playPromiseRef.current.then(doStop, doStop);
|
|
96
|
+
playPromiseRef.current = null;
|
|
97
|
+
} else {
|
|
98
|
+
doStop();
|
|
99
|
+
}
|
|
100
|
+
}, []);
|
|
101
|
+
const scanFrame = react.useCallback(async () => {
|
|
102
|
+
if (!scanningRef.current || !mountedRef.current) return;
|
|
103
|
+
const video = videoRef.current;
|
|
104
|
+
const canvas = canvasRef.current;
|
|
105
|
+
if (!video || !canvas || video.readyState < video.HAVE_ENOUGH_DATA) {
|
|
106
|
+
rafRef.current = requestAnimationFrame(scanFrame);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
if (now - lastScanRef.current < scanDelay) {
|
|
111
|
+
rafRef.current = requestAnimationFrame(scanFrame);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
lastScanRef.current = now;
|
|
115
|
+
const ctx = canvas.getContext("2d");
|
|
116
|
+
if (!ctx) {
|
|
117
|
+
rafRef.current = requestAnimationFrame(scanFrame);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
canvas.width = video.videoWidth;
|
|
121
|
+
canvas.height = video.videoHeight;
|
|
122
|
+
ctx.drawImage(video, 0, 0);
|
|
123
|
+
try {
|
|
124
|
+
const jsqr = await getJsqr();
|
|
125
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
126
|
+
const code = jsqr(imageData.data, imageData.width, imageData.height);
|
|
127
|
+
if (code) {
|
|
128
|
+
onResultRef.current(code.data);
|
|
129
|
+
if (!continuous) {
|
|
130
|
+
scanningRef.current = false;
|
|
131
|
+
setScanning(false);
|
|
132
|
+
stopCamera();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
} catch {
|
|
137
|
+
}
|
|
138
|
+
if (mountedRef.current) {
|
|
139
|
+
rafRef.current = requestAnimationFrame(scanFrame);
|
|
140
|
+
}
|
|
141
|
+
}, [scanDelay, continuous, stopCamera]);
|
|
142
|
+
const startCamera = react.useCallback(async () => {
|
|
143
|
+
if (!mountedRef.current) return;
|
|
144
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
145
|
+
setStatus("no-camera");
|
|
146
|
+
setError("Camera API not available in this context");
|
|
147
|
+
onErrorRef.current?.(new Error("getUserMedia is not available"));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
setStatus("starting");
|
|
151
|
+
setError(null);
|
|
152
|
+
try {
|
|
153
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
154
|
+
video: {
|
|
155
|
+
facingMode,
|
|
156
|
+
...constraints
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (!mountedRef.current) {
|
|
160
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
streamRef.current = stream;
|
|
164
|
+
if (videoRef.current) {
|
|
165
|
+
videoRef.current.srcObject = stream;
|
|
166
|
+
playPromiseRef.current = videoRef.current.play();
|
|
167
|
+
await playPromiseRef.current;
|
|
168
|
+
playPromiseRef.current = null;
|
|
169
|
+
}
|
|
170
|
+
if (!mountedRef.current) {
|
|
171
|
+
stopCamera();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
scanningRef.current = true;
|
|
175
|
+
setScanning(true);
|
|
176
|
+
setStatus("scanning");
|
|
177
|
+
onStartRef.current?.();
|
|
178
|
+
rafRef.current = requestAnimationFrame(scanFrame);
|
|
179
|
+
} catch (err) {
|
|
180
|
+
if (!mountedRef.current) return;
|
|
181
|
+
if (err instanceof DOMException && err.name === "AbortError") return;
|
|
182
|
+
const isNoCamera = err instanceof DOMException && (err.name === "NotFoundError" || err.name === "NotAllowedError" || err.name === "NotReadableError");
|
|
183
|
+
setStatus(isNoCamera ? "no-camera" : "error");
|
|
184
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
185
|
+
onErrorRef.current?.(err);
|
|
186
|
+
}
|
|
187
|
+
}, [facingMode, constraints, scanFrame, stopCamera]);
|
|
188
|
+
react.useEffect(() => {
|
|
189
|
+
const video = videoRef.current;
|
|
190
|
+
if (autoStart) {
|
|
191
|
+
startCamera();
|
|
192
|
+
}
|
|
193
|
+
return () => {
|
|
194
|
+
scanningRef.current = false;
|
|
195
|
+
cancelAnimationFrame(rafRef.current);
|
|
196
|
+
const streamToStop = streamRef.current;
|
|
197
|
+
const doCleanup = () => {
|
|
198
|
+
if (video && video.srcObject === streamToStop) {
|
|
199
|
+
video.pause();
|
|
200
|
+
video.srcObject = null;
|
|
201
|
+
}
|
|
202
|
+
if (streamToStop) {
|
|
203
|
+
streamToStop.getTracks().forEach((track) => track.stop());
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
if (playPromiseRef.current) {
|
|
207
|
+
playPromiseRef.current.then(doCleanup, doCleanup);
|
|
208
|
+
playPromiseRef.current = null;
|
|
209
|
+
} else {
|
|
210
|
+
doCleanup();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
}, [autoStart, startCamera]);
|
|
214
|
+
react.useImperativeHandle(
|
|
215
|
+
ref,
|
|
216
|
+
() => ({
|
|
217
|
+
start: startCamera,
|
|
218
|
+
stop: stopCamera,
|
|
219
|
+
scanImage: async (file) => {
|
|
220
|
+
let bitmap = null;
|
|
221
|
+
try {
|
|
222
|
+
bitmap = await createImageBitmap(file);
|
|
223
|
+
const tempCanvas = document.createElement("canvas");
|
|
224
|
+
tempCanvas.width = bitmap.width;
|
|
225
|
+
tempCanvas.height = bitmap.height;
|
|
226
|
+
const ctx = tempCanvas.getContext("2d");
|
|
227
|
+
if (!ctx) return null;
|
|
228
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
229
|
+
const imageData = ctx.getImageData(
|
|
230
|
+
0,
|
|
231
|
+
0,
|
|
232
|
+
tempCanvas.width,
|
|
233
|
+
tempCanvas.height
|
|
234
|
+
);
|
|
235
|
+
const jsqr = await getJsqr();
|
|
236
|
+
const code = jsqr(imageData.data, imageData.width, imageData.height);
|
|
237
|
+
return code?.data ?? null;
|
|
238
|
+
} catch {
|
|
239
|
+
return null;
|
|
240
|
+
} finally {
|
|
241
|
+
bitmap?.close();
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
isScanning: scanning
|
|
245
|
+
}),
|
|
246
|
+
[startCamera, stopCamera, scanning]
|
|
247
|
+
);
|
|
248
|
+
const renderStatus = () => {
|
|
249
|
+
if (status === "starting") {
|
|
250
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: qrScannerStatusVariants(), children: loadingText });
|
|
251
|
+
}
|
|
252
|
+
if (status === "error" && error) {
|
|
253
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: qrScannerStatusVariants(), children: error });
|
|
254
|
+
}
|
|
255
|
+
if (status === "no-camera") {
|
|
256
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: qrScannerStatusVariants(), children: noCameraText });
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
};
|
|
260
|
+
if (status === "no-camera" || status === "error") {
|
|
261
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
262
|
+
"div",
|
|
263
|
+
{
|
|
264
|
+
"data-slot": "qr-scanner",
|
|
265
|
+
className: chunkZS5756ZC_js.cn(qrScannerVariants({ appearance }), className),
|
|
266
|
+
...rest,
|
|
267
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: qrScannerFallbackVariants(), children: [
|
|
268
|
+
fallbackText,
|
|
269
|
+
renderStatus()
|
|
270
|
+
] })
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
275
|
+
"div",
|
|
276
|
+
{
|
|
277
|
+
"data-slot": "qr-scanner",
|
|
278
|
+
className: chunkZS5756ZC_js.cn(qrScannerVariants({ appearance }), className),
|
|
279
|
+
...rest,
|
|
280
|
+
children: [
|
|
281
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
282
|
+
"video",
|
|
283
|
+
{
|
|
284
|
+
ref: videoRef,
|
|
285
|
+
"data-slot": "qr-scanner-video",
|
|
286
|
+
className: qrScannerVideoVariants(),
|
|
287
|
+
playsInline: true,
|
|
288
|
+
muted: true,
|
|
289
|
+
autoPlay: true
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
293
|
+
"canvas",
|
|
294
|
+
{
|
|
295
|
+
ref: canvasRef,
|
|
296
|
+
className: "hidden",
|
|
297
|
+
"data-slot": "qr-scanner-canvas"
|
|
298
|
+
}
|
|
299
|
+
),
|
|
300
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: qrScannerOverlayVariants(), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: qrScannerViewfinderVariants() }) }),
|
|
301
|
+
renderStatus()
|
|
302
|
+
]
|
|
303
|
+
}
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
QrScannerBase.displayName = "QrScanner";
|
|
307
|
+
|
|
308
|
+
exports.QrScanner = QrScannerBase;
|
|
309
|
+
exports.qrScannerFallbackVariants = qrScannerFallbackVariants;
|
|
310
|
+
exports.qrScannerOverlayVariants = qrScannerOverlayVariants;
|
|
311
|
+
exports.qrScannerStatusVariants = qrScannerStatusVariants;
|
|
312
|
+
exports.qrScannerVariants = qrScannerVariants;
|
|
313
|
+
exports.qrScannerVideoVariants = qrScannerVideoVariants;
|
|
314
|
+
exports.qrScannerViewfinderVariants = qrScannerViewfinderVariants;
|
|
315
|
+
//# sourceMappingURL=qr-scanner.js.map
|
|
316
|
+
//# sourceMappingURL=qr-scanner.js.map
|