Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

QR Code Generator TS

npm versionLicenseGitHubTypeScriptCoverage

A lightweight, dependency‑free QR code generator written in TypeScript.
It creates QR codes in PNG, SVG, or HTML (CSS Grid) formats, with full control over encoding mode, error correction, version, mask, module size, and quiet zone.

👉 Live Demo


Features

  • 🔢 Supports numeric, alphanumeric, and octet (UTF‑8) modes.
  • 🛡️ All four error correction levels (L, M, Q, H) – automatically chooses the best if not specified.
  • 📦 Works with any version from 1 to 40 – picks the smallest possible version automatically.
  • 🎭 Mask pattern selection (0‑7) with automatic best‑mask evaluation.
  • 🖼️ Output formats: PNG (Canvas), SVG, HTML (responsive CSS Grid), or NONE (only matrix).
  • 📏 Customizable module size (modsize) and margin (quiet zone).
  • 📥 Built‑in download() method to save the generated QR code as a file.
  • 🌐 Full TypeScript support with clear types.
  • 🔧 No external dependencies – pure JavaScript/TypeScript.

Installation

Using npm

npm install @alekstar79/qr-code-generator

Then import it in your project:

import{makeQRCode}from'@alekstar79/qr-code'

Usage

Basic Example

import{makeQRCode}from'@alekstar79/qr-code'constqr=makeQRCode('https://example.com')document.body.appendChild(qr.result)// result is an HTMLCanvasElement

With Options

import{makeQRCode,QROptions}from'@alekstar79/qr-code'constoptions: QROptions={mode: -1,// auto (numeric, alphanumeric, or octet)eccl: 2,// High error correctionversion: -1,// auto versionmask: -1,// auto maskimage: 'SVG',// output format: 'PNG', 'SVG', 'HTML', 'NONE'modsize: 8,// module size in pixels (only for PNG/SVG)margin: 4// quiet zone in modules}constqr=makeQRCode('Hello, World!',options)document.getElementById('qr-container')!.appendChild(qr.result)

Using the Returned Object

import{makeQRCode,QRCode}from'@alekstar79/qr-code'constqr: QRCode=makeQRCode('My data')// Access generated matrix (0/1/null)console.log(qr.matrix)// Change output format after generationqr.image='HTML'// updates qr.result accordingly// Download as fileqr.download('my-qr.png')// uses current formatqr.download('my-qr.svg','SVG')// specify format

API Reference

makeQRCode(text: string, options?: QROptions): QRCode

makeQRCode(options: QROptions): QRCode

Generates a QR code and returns an object with the following properties and methods.

QROptions

PropertyTypeDefaultDescription
textstring''The data to encode.
modeMode (-1 | 1 | 2 | 4)-1Encoding mode: 1 = numeric, 2 = alphanumeric, 4 = octet (UTF‑8), -1 = auto.
ecclEccl (-1 | 0 | 1 | 2 | 3)-1Error correction level: 0 = M, 1 = L, 2 = H, 3 = Q, -1 = auto (tries H first).
versionnumber (-1 | 1–40)-1QR code version (size). -1 selects the smallest possible version.
maskMask (-1 | 0–7)-1Mask pattern. -1 selects the best mask automatically.
imageImageFormat ('PNG' | 'SVG' | 'HTML' | 'NONE')'PNG'Output format. 'NONE' skips image generation (only matrix is available).
modsizenumber4Module size in pixels (for PNG/SVG). Ignored for 'HTML'.
marginnumber4Quiet zone width in modules.

Returned QRCode object

PropertyTypeDescription
textstringThe original input text.
modeModeThe encoding mode used.
ecclEcclError correction level used.
versionnumberQR code version.
maskMaskMask pattern applied.
matrix(number | null)[][]The QR matrix (0 = white, 1 = black, null = reserved areas).
modsizenumberModule size actually used (may differ from input if auto).
marginnumberMargin size actually used.
resultHTMLElement | HTMLCanvasElement | SVGElement | nullThe generated image element. null if an error occurred or format is 'NONE'.
errorstringError code (empty if no error).
errorSubcodestringAdditional error details.
download(filename?, format?)voidTriggers download of the QR code image. If no filename given, default is qrcode.png, qrcode.svg, or qrcode.html based on format. If format is provided, it temporarily changes the image format for the download.

Changing image property

You can change the output format after generation by assigning a new value to qr.image. This will update qr.result accordingly.

qr.image='SVG'// qr.result becomes an SVGElementqr.image='HTML'// qr.result becomes a HTMLDivElement with CSS Grid

Error Handling

If an error occurs, qr.error contains the name of the property that caused the issue (e.g., 'text', 'version'), and qr.errorSubcode gives more details.

Common error codes:

errorerrorSubcodeMeaning
'text''1'Invalid text format.
'text''2'Empty text.
'text''3'Text contains invalid characters for the chosen mode.
'mode''1'Unsupported encoding mode.
'version''1'Text too long for any version.
'version''2'Invalid version number.
'version''3'Text too long for the specified version.
'eccl''1'Invalid error correction level.
'mask''1'Invalid mask pattern.
'image''1'Unsupported image format.
'modsize''1'Invalid module size.
'margin''1'Invalid margin size.

Additionally, library‑specific error codes:

errorMeaning
'ERR_TEXT_EMPTY'Text is empty.
'ERR_INVALID_CHAR'Text contains unsupported characters for the selected mode.
'ERR_VERSION_OUT_OF_RANGE'Invalid version number.

Browser Support

ChromeFirefoxEdgeSafariOpera
≥ 106≥ 105≥ 106≥ 15≥ 92

Works in all modern browsers that support Canvas, SVG, and CSS Grid (for the HTML output). The library itself is pure ECMAScript and does not rely on any polyfills.


Development

Project Structure

qr-code/
├── src/
│ ├── constants.ts # QR code tables and constants
│ ├── qr-code-generator.ts # Core QR encoding logic
│ ├── image-renderer.ts # Converts matrix to PNG/SVG/HTML
│ ├── types.ts # TypeScript definitions
│ ├── index.ts # Public API (makeQRCode)
│ ├── main.ts # Demo app (Vite)
│ └── css/ # Demo styles
├── test/ # Unit tests (Vitest + JSDOM)
├── lib/ # Build output (library)
├── dist/ # Build output (demo)
├── package.json
├── tsconfig.json
├── vite.config.ts # Demo build config
└── vite.config.lib.ts # Library build config

Build Commands

# Build library (output to lib/)
yarn build:lib
# Build demo (output to dist/)
yarn build:demo
# Run development server (demo)
yarn dev
# Run tests
yarn test# Run tests with coverage
yarn test:coverage

Testing

The test suite uses Vitest with JSDOM. Run yarn test to execute all tests.


License

MIT © alekstar79


Useful Links

About

A lightweight, dependency‑free QR code generator written in TypeScript.

Topics

Resources

Stars

1 star

Watchers

2 watching

Forks

Contributors

Languages