shadcn.io is not affiliated with official shadcn/ui
Shadcn QR Code for React and Tailwind
Displays a QR code.
Installation
bunx --bun shadcn@latest add https://kit.dev/r/qr-code.jsonpnpm dlx shadcn@latest add https://kit.dev/r/qr-code.jsonnpx shadcn@latest add https://kit.dev/r/qr-code.jsonyarn shadcn@latest add https://kit.dev/r/qr-code.jsonInstall the following dependencies:
bun add @ark-ui/reactpnpm add @ark-ui/reactnpm install @ark-ui/reactyarn add @ark-ui/reactCopy and paste the following code into your project.
"use client";
import { QrCode as ArkQrCode, useQrCodeContext } from "@ark-ui/react/qr-code";
import type React from "react";
import { cn } from "@/lib/utils";
export const useQrCode = useQrCodeContext;
export const QrCode = (props: React.ComponentProps<typeof ArkQrCode.Root>) => {
const { className, ...rest } = props;
return (
<ArkQrCode.Root
className={cn(
"[--qr-code-overlay-size:calc(var(--qr-code-size)/4)] [--qr-code-size:--spacing(32)]",
"relative",
"w-fit",
"flex shrink-0 flex-col gap-4",
className
)}
data-slot="qr-code"
{...rest}
/>
);
};
export const QrCodeFrame = (
props: React.ComponentProps<typeof ArkQrCode.Frame>
) => {
const { className, ...rest } = props;
return (
<ArkQrCode.Frame
className={cn(
"size-(--qr-code-size)",
"bg-white",
"fill-black",
"rounded-md",
"overflow-hidden",
className
)}
data-slot="qr-code-frame"
{...rest}
>
<ArkQrCode.Pattern className="fill-inherit" data-slot="qr-code-pattern" />
</ArkQrCode.Frame>
);
};
export const QrCodeOverlay = (
props: React.ComponentProps<typeof ArkQrCode.Overlay>
) => {
const { className, ...rest } = props;
return (
<ArkQrCode.Overlay
className={cn(
"size-(--qr-code-overlay-size)",
"absolute inset-0",
"p-2",
"flex items-center justify-center",
"bg-black",
"text-white",
"rounded-full",
"[&_svg,img]:size-full [&_svg,img]:object-contain",
className
)}
data-slot="qr-code-overlay"
{...rest}
/>
);
};
export const QrCodeDownload = (
props: React.ComponentProps<typeof ArkQrCode.DownloadTrigger>
) => (
<ArkQrCode.DownloadTrigger data-slot="qr-code-download-trigger" {...props} />
);Update the import paths to match your project setup.
Anatomy
QrCode
├── QrCodeFrame
├── QrCodeOverlay
└── QrCodeDownloadUsage
import {
QrCode,
QrCodeFrame,
QrCodeOverlay,
QrCodeDownload,
} from "@/components/ui/qr-code";<QrCode>
<QrCodeFrame />
<QrCodeOverlay />
<QrCodeDownload />
</QrCode>Size
Override the size with the --qr-code-size CSS variable on QrCode
For example, --qr-code-size:6rem for small, --qr-code-size:10rem for large
Examples
With an overlay
Use QrCodeOverlay to add an overlay in the center.
Error correction
In cases where the link is too long or the logo overlay covers a significant area, the error correction level can be increased.
Use the encoding.ecc property to set the error correction level:
- L: Allows recovery of up to 7% data loss (default)
- M: Allows recovery of up to 15% data loss
- Q: Allows recovery of up to 25% data loss
- H: Allows recovery of up to 30% data loss
Download
Use QrCodeDownload with fileName and mimeType to let users download the QR code as an image.
API Reference
QrCode
Root wrapper for the QR code and optional overlay/actions.
| Prop | Type | Default |
|---|---|---|
value | string | - |
defaultValue | string | - |
onValueChange | (details: ValueChangeDetails) => void | - |
encoding | QrCodeGenerateOptions | - |
pixelSize | number | - |
className | string | - |
asChild | boolean | - |
| Attribute | Default |
|---|---|
--qr-code-size | --spacing(32) |
--qr-code-overlay-size | calc(var(--qr-code-size)/4) |
QrCodeFrame
SVG containing the QR pattern. Scales with size.
| Prop | Type | Default |
|---|---|---|
className | string | - |
asChild | boolean | - |
QrCodeOverlay
Optional center overlay on top of the QR pattern.
| Prop | Type | Default |
|---|---|---|
className | string | - |
asChild | boolean | - |
QrCodeDownload
Downloads the QR code as an image file.
| Prop | Type | Default |
|---|---|---|
fileName | string | - |
mimeType | DataUrlType | - |
quality | number | - |
className | string | - |
asChild | boolean | - |
For a complete list of props, see the Ark UI documentation.