What is qr-code-styling?
The qr-code-styling npm package allows you to generate customizable QR codes with various styles and options. It provides a flexible way to create QR codes with different shapes, colors, and logos, making it suitable for branding and design purposes.
What are qr-code-styling's main functionalities?
Basic QR Code Generation
This feature allows you to generate a basic QR code with customizable dimensions, data, and dot styles. The code sample demonstrates how to create a QR code with rounded dots and a white background, append it to a canvas element, and download it as a PNG file.
const QRCodeStyling = require('qr-code-styling');
const qrCode = new QRCodeStyling({
width: 300,
height: 300,
data: 'https://example.com',
image: '',
dotsOptions: {
color: '#000000',
type: 'rounded'
},
backgroundOptions: {
color: '#ffffff'
}
});
qrCode.append(document.getElementById('canvas'));
qrCode.download({ name: 'qr', extension: 'png' });
Adding a Logo to QR Code
This feature allows you to add a logo to the center of the QR code. The code sample demonstrates how to include a logo image, set its cross-origin attribute, and define a margin around the logo.
const QRCodeStyling = require('qr-code-styling');
const qrCode = new QRCodeStyling({
width: 300,
height: 300,
data: 'https://example.com',
image: 'https://example.com/logo.png',
dotsOptions: {
color: '#000000',
type: 'rounded'
},
imageOptions: {
crossOrigin: 'anonymous',
margin: 20
}
});
qrCode.append(document.getElementById('canvas'));
qrCode.download({ name: 'qr_with_logo', extension: 'png' });
Customizing QR Code Colors
This feature allows you to customize the colors of the QR code dots and background. The code sample demonstrates how to create a QR code with red square dots and a green background.
const QRCodeStyling = require('qr-code-styling');
const qrCode = new QRCodeStyling({
width: 300,
height: 300,
data: 'https://example.com',
dotsOptions: {
color: '#ff0000',
type: 'square'
},
backgroundOptions: {
color: '#00ff00'
}
});
qrCode.append(document.getElementById('canvas'));
qrCode.download({ name: 'colored_qr', extension: 'png' });
Other packages similar to qr-code-styling
qrcode
The qrcode package is a simple and lightweight library for generating QR codes. It supports basic customization options such as size, error correction level, and color. However, it lacks the advanced styling options and logo integration features provided by qr-code-styling.
qr-image
The qr-image package allows you to create QR codes in various image formats such as PNG, SVG, and PDF. It offers basic customization options but does not provide the extensive styling capabilities of qr-code-styling, such as custom dot shapes and logo integration.
easyqrcodejs
The easyqrcodejs package is a versatile library for generating QR codes with a wide range of customization options, including logo integration, color customization, and various dot styles. It is similar to qr-code-styling in terms of features but may have a different API and usage patterns.
QR Code Styling

JavaScript library for generating QR codes with a logo and styling.
Try it here https://qr-code-styling.com
If you have issues / suggestions / notes / questions, please open an issue or contact me. Let's create a cool library together.
Examples
Extensions
If you would like to use additional stiles, you can connect extensions.
Installation
npm install qr-code-styling
Usage
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>QR Code Styling</title>
<script type="text/javascript" src="https://unpkg.com/qr-code-styling@1.5.0/lib/qr-code-styling.js"></script>
</head>
<body>
<div id="canvas"></div>
<script type="text/javascript">
const qrCode = new QRCodeStyling({
width: 300,
height: 300,
type: "svg",
data: "https://www.facebook.com/",
image: "https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg",
dotsOptions: {
color: "#4267b2",
type: "rounded"
},
backgroundOptions: {
color: "#e9ebee",
},
imageOptions: {
crossOrigin: "anonymous",
margin: 20
}
});
qrCode.append(document.getElementById("canvas"));
qrCode.download({ name: "qr", extension: "svg" });
</script>
</body>
</html>
React example (Codesandbox)
Angular example (Codesandbox)
React example (source)
Angular example (source)
Vue example (source)
API Documentation
QRCodeStyling instance
new QRCodeStyling(options) => QRCodeStyling
options
structure
width | number | 300 | Size of canvas |
height | number | 300 | Size of canvas |
type | string ('canvas' 'svg' ) | canvas | The type of the element that will be rendered |
data | string | | The date will be encoded to the QR code |
image | string | | The image will be copied to the center of the QR code |
margin | number | 0 | Margin around canvas |
qrOptions | object | | Options will be passed to qrcode-generator lib |
imageOptions | object | | Specific image options, details see below |
dotsOptions | object | | Dots styling options |
cornersSquareOptions | object | | Square in the corners styling options |
cornersDotOptionsHelper | object | | Dots in the corners styling options |
backgroundOptions | object | | QR background styling options |
nodeCanvas | node-canvas | | Only specify when running on a node server for canvas type, please refer to node section below |
jsDom | jsdom | | Only specify when running on a node server for svg type, please refer to node section below |
options.qrOptions
structure
typeNumber | number (0 - 40 ) | 0 |
mode | string ('Numeric' 'Alphanumeric' 'Byte' 'Kanji' ) | |
errorCorrectionLevel | string ('L' 'M' 'Q' 'H' ) | 'Q' |
options.imageOptions
structure
hideBackgroundDots | boolean | true | Hide all dots covered by the image |
imageSize | number | 0.4 | Coefficient of the image size. Not recommended to use ove 0.5. Lower is better |
margin | number | 0 | Margin of the image in px |
crossOrigin | string('anonymous' 'use-credentials' ) | | Set "anonymous" if you want to download QR code from other origins. |
saveAsBlob | boolean | false | Saves image as base64 blob in svg type, see bellow |
When QR type is svg, the image may not load in certain applications as it is saved as a url, and some svg applications will not render url images for security reasons. Setting saveAsBlob
to true will instead save the image as a blob, allowing it to render correctly in more places, but will also increase the file size.
options.dotsOptions
structure
color | string | '#000' | Color of QR dots |
gradient | object | | Gradient of QR dots |
type | string ('rounded' 'dots' 'classy' 'classy-rounded' 'square' 'extra-rounded' ) | 'square' | Style of QR dots |
options.backgroundOptions
structure
color | string | '#fff' |
gradient | object | |
options.cornersSquareOptions
structure
color | string | | Color of Corners Square |
gradient | object | | Gradient of Corners Square |
type | string ('dot' 'square' 'extra-rounded' ) | | Style of Corners Square |
options.cornersDotOptions
structure
color | string | | Color of Corners Dot |
gradient | object | | Gradient of Corners Dot |
type | string ('dot' 'square' ) | | Style of Corners Dot |
Gradient structure
options.dotsOptions.gradient
options.backgroundOptions.gradient
options.cornersSquareOptions.gradient
options.cornersDotOptions.gradient
type | string ('linear' 'radial' ) | "linear" | Type of gradient spread |
rotation | number | 0 | Rotation of gradient in radians (Math.PI === 180 degrees) |
colorStops | array of objects | | Gradient colors. Example [{ offset: 0, color: 'blue' }, { offset: 1, color: 'red' }] |
Gradient colorStops structure
options.dotsOptions.gradient.colorStops[]
options.backgroundOptions.gradient.colorStops[]
options.cornersSquareOptions.gradient.colorStops[]
options.cornersDotOptions.gradient.colorStops[]
offset | number (0 - 1 ) | | Position of color in gradient range |
color | string | | Color of stop in gradient range |
QRCodeStyling methods
QRCodeStyling.append(container) => void
container | DOM element | This container will be used for appending of the QR code |
QRCodeStyling.getRawData(extension) => Promise<Blob>
extension | string ('png' 'jpeg' 'webp' 'svg' ) | 'png' | Blob type on browser, Buffer type on Node |
QRCodeStyling.update(options) => void
options | object | The same options as for initialization |
QRCodeStyling.applyExtension(extension) => void
extension | (svg, options) => void | Extension is a function that takes svg and previously applied options and modifies an svg |
applyExtension
example
const extension = (svg, options) => {
const { width, height } = options;
const size = Math.min(width, height);
const border = document.createElementNS("http://www.w3.org/2000/svg", "rect");
const borderAttributes = {
"fill": "none",
"x": (width - size + 40) / 2,
"y": (height - size + 40) / 2,
"width": size - 40,
"height": size - 40,
"stroke": 'black',
"stroke-width": 40,
"rx": 100,
};
Object.keys(borderAttributes).forEach(attribute => {
border.setAttribute(attribute, borderAttributes[attribute]);
});
svg.appendChild(border);
};
QRCodeStyling.deleteExtension() => void
QRCodeStyling.download(downloadOptions) => Promise<void>
downloadOptions | object | Options with extension and name of file (not required) |
Promise returned will resolve into the data URI of the QR code image.
downloadOptions
structure
name | string | 'qr' | Name of the downloaded file |
extension | string ('png' 'jpeg' 'webp' 'svg' ) | 'png' | File extension |
Node Support
You can use this on a node server by passing through the node-canvas or jsdom object depending if your creating a non-svg or svg respectively. You must pass both if using imageOptions.saveAsBlob
.
Calling getRawData
in node will return a Buffer instead of a Blob.
const { QRCodeStyling } = require("qr-code-styling/lib/qr-code-styling.common.js");
const nodeCanvas = require("canvas");
const { JSDOM } = require("jsdom");
const fs = require("fs");
const options = {
width: 300,
height: 300,
data: "https://www.facebook.com/",
image: "https://upload.wikimedia.org/wikipedia/commons/5/51/Facebook_f_logo_%282019%29.svg",
dotsOptions: {
color: "#4267b2",
type: "rounded"
},
backgroundOptions: {
color: "#e9ebee",
},
imageOptions: {
crossOrigin: "anonymous",
margin: 20
}
}
const qrCodeImage = new QRCodeStyling({
nodeCanvas,
...options
});
qrCodeImage.getRawData("png").then((buffer) => {
fs.writeFileSync("test.png", buffer);
});
const qrCodeSvg = new QRCodeStyling({
jsdom: JSDOM,
type: "svg",
...options
});
qrCodeSvg.getRawData("svg").then((buffer) => {
fs.writeFileSync("test.svg", buffer);
});
const qrCodeSvgWithBlobImage = new QRCodeStyling({
jsdom: JSDOM,
nodeCanvas,
type: "svg",
...options,
imageOptions: {
saveAsBlob: true,
crossOrigin: "anonymous",
margin: 20
}
});
qrCodeSvgWithBlobImage.getRawData("svg").then((buffer) => {
fs.writeFileSync("test_blob.svg", buffer);
});
License
MIT License. Copyright (c) 2021 Denys Kozak