Code Craft Studio
๐ Documentation
๐ Features
Core Features
- ๐ท QR Code Scanner: Native camera-based scanning with web fallback
- ๐ Barcode Scanner: Scan 14+ barcode formats (EAN, UPC, Code 128, etc.)
- ๐จ QR Code Generator: Generate QR codes with full customization options
- ๐ Barcode Generator: Generate 1D and 2D barcodes with text overlay
- ๐ Analytics & History: Track scans, locations, and user engagement
- ๐พ Multiple Export Formats: PNG, JPG, SVG, JSON, WebP (PDF, GIF, EPS, WMF coming soon)
- โ๏ธ React Components: Ready-to-use components for quick integration
- ๐ฑ Cross-Platform: Works on Web, iOS, and Android
- ๐ Plugin Architecture: Easy to extend and customize
22+ Supported QR Code Types & 14+ Barcode Formats
QR Code Types
- ๐ Web & Links: Website, PDF, Images Gallery, Video, Links List
- ๐ฑ Social Media: Facebook, Instagram, WhatsApp, Social Media Hub
- ๐ผ Business: vCard, Business Info, Menu, Coupon
- ๐ง Utilities: WiFi, MP3, Apps, Text, Email, SMS, Phone, Location, Event
- ๐ฏ Custom: Any custom data format
Barcode Formats
- ๐ 1D Barcodes:
- EAN-13, EAN-8 (European Article Number)
- UPC-A, UPC-E (Universal Product Code)
- Code 128 (High-density alphanumeric)
- Code 39, Code 93 (Alphanumeric with special characters)
- ITF/ITF-14 (Interleaved 2 of 5)
- Codabar (Numeric with special start/stop characters)
- ๐ฒ 2D Barcodes:
- QR Code (Quick Response)
- Data Matrix (Compact 2D barcode)
- PDF417 (Stacked linear barcode)
- Aztec (Compact 2D barcode)
Advanced Options
- ๐จ Design Customization:
- Custom colors (foreground/background)
- Logo embedding
- Frame styles
- Margin control
- Error correction levels (L, M, Q, H)
- โ๏ธ Generation Options:
- QR version control (1-40)
- Mask pattern selection (0-7)
- Scale and size control
- Kanji character support
- ๐ธ Scanner Options:
- Front/back camera switching
- Torch/flashlight control
- Custom scan regions
- Video styling options
- Scan delay configuration
๐ฆ Installation
For React Apps (No Capacitor Required)
npm install code-craft-studio
yarn add code-craft-studio
That's it! The package works out of the box in any React app.
For Capacitor Apps
npm install code-craft-studio
npx code-craft-studio-setup
The setup script will:
- Install optional Capacitor dependencies
- Configure iOS and Android permissions
- Sync Capacitor
- Create example files
Manual Setup
npm install code-craft-studio
npm install @capacitor/core @capacitor/cli
npx cap add ios
npx cap add android
npx cap sync
iOS Configuration
Add to your Info.plist
:
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
Android Configuration
Add to your AndroidManifest.xml
:
<uses-permission android:name="android.permission.CAMERA" />
๐ฏ Quick Start
Import Styles
Add to your main CSS file:
@import 'code-craft-studio/src/styles/qrcode-studio.css';
Basic Usage
Provider-less Hook API (Recommended)
import { useCodeCraftStudio } from 'code-craft-studio';
import { QRType } from 'code-craft-studio';
function MyComponent() {
const {
scanQRCode,
generateQRCode,
generateBarcode,
isReady,
error
} = useCodeCraftStudio();
const handleScan = async () => {
try {
const result = await scanQRCode();
console.log('Scanned:', result.content);
} catch (err) {
console.error('Scan failed:', err);
}
};
const handleGenerate = async () => {
const result = await generateQRCode({
type: QRType.WEBSITE,
url: 'https://example.com'
});
console.log('Generated:', result.dataUrl);
};
if (!isReady) return <div>Loading...</div>;
return (
<div>
<button onClick={handleScan}>Scan QR Code</button>
<button onClick={handleGenerate}>Generate QR Code</button>
</div>
);
}
React Components
import {
QRScanner,
QRGenerator,
QRStudio,
BarcodeScanner,
} from 'code-craft-studio';
function Scanner() {
return (
<QRScanner
onScan={(result) => {
console.log('Scanned:', result.content);
}}
/>
);
}
function Generator() {
return (
<QRGenerator
type='website'
data={{ url: 'https://example.com' }}
size={300}
/>
);
}
function Studio() {
return (
<QRStudio
features={{
scanner: true,
generator: true,
barcodeScanner: true,
barcodeGenerator: true,
history: true,
}}
/>
);
}
๐ง API Reference
Plugin API
Check Permissions
import { QRCodeStudio } from 'code-craft-studio';
const permissions = await QRCodeStudio.checkPermissions();
console.log(permissions.camera);
Request Permissions
const permissions = await QRCodeStudio.requestPermissions();
Generate QR Code
const qrCode = await QRCodeStudio.generate({
type: 'website',
data: { url: 'https://example.com' },
design: {
colors: {
dark: '#000000',
light: '#FFFFFF',
},
},
size: 300,
});
console.log(qrCode.dataUrl);
console.log(qrCode.svg);
Start Scanning
const listener = await QRCodeStudio.addListener('scanResult', (result) => {
console.log('Scanned:', result.content);
console.log('Type:', result.type);
console.log('Data:', result.parsedData);
});
await QRCodeStudio.startScan({
camera: 'back',
showTorchButton: true,
});
await QRCodeStudio.stopScan();
listener.remove();
Generate Barcode
const barcode = await QRCodeStudio.generateBarcode({
format: 'EAN_13',
data: '5901234123457',
width: 300,
height: 100,
displayText: true,
});
console.log(barcode.dataUrl);
Read Barcodes from Image
const result = await QRCodeStudio.readBarcodesFromImage({
path: '/path/to/image.jpg',
formats: ['EAN_13', 'CODE_128', 'QR_CODE'],
});
result.barcodes.forEach((barcode) => {
console.log(`Format: ${barcode.format}, Data: ${barcode.rawValue}`);
});
๐จ React Components
QRScanner Component
<QRScanner
onScan={(result) => {
console.log('Scanned:', result);
}}
onError={(error) => {
console.error('Error:', error);
}}
options={{
camera: 'back',
scanDelay: 1000,
showTorchButton: true,
showFlipCameraButton: true,
}}
showOverlay={true}
className='my-scanner'
/>
QRGenerator Component
<QRGenerator
type='wifi'
data={{
ssid: 'MyNetwork',
password: 'MyPassword',
security: 'WPA2',
}}
design={{
colors: {
dark: '#2C3E50',
light: '#FFFFFF',
},
logo: {
src: 'https://example.com/logo.png',
size: 60,
},
dotsStyle: 'rounded',
cornersSquareStyle: 'extra-rounded',
}}
size={400}
showDownload={true}
showShare={true}
onGenerate={(result) => {
console.log('Generated:', result);
}}
/>
BarcodeScanner Component
<BarcodeScanner
formats={['EAN_13', 'UPC_A', 'CODE_128', 'CODE_39']}
onScan={(result) => {
console.log(`Scanned ${result.format}: ${result.rawValue}`);
if (validateBarcodeData(result.format, result.rawValue)) {
}
}}
onError={(error) => {
console.error('Scan error:', error);
}}
continuous={false}
torch={false}
showOverlay={true}
/>
QRStudio Component
<QRStudio
config={{
allowedTypes: ['website', 'wifi', 'vcard', 'text'],
defaultType: 'website',
defaultDesign: {
colors: {
dark: '#000000',
light: '#FFFFFF',
},
},
}}
theme={{
primary: '#007AFF',
secondary: '#5856D6',
mode: 'light',
}}
features={{
scanner: true,
generator: true,
landingPages: true,
analytics: true,
export: true,
sharing: true,
history: true,
favorites: true,
templates: true,
}}
onSave={(result) => {
console.log('Saved:', result);
}}
onScan={(result) => {
console.log('Scanned:', result);
}}
/>
๐ Supported QR Code Types
website | Link to any website | url , title? , description? |
pdf | Share PDF documents | url , title? , description? |
images | Multiple images gallery | images[] , title? , description? |
video | Video content | url , title? , thumbnail? |
wifi | WiFi credentials | ssid , password? , security |
menu | Restaurant menu | restaurantName , categories[] |
business | Business information | name , phone? , email? , website? |
vcard | Digital business card | firstName? , lastName? , phone? , email? |
mp3 | Audio files | url , title? , artist? |
apps | App store links | appStoreUrl? , playStoreUrl? |
links_list | Multiple links | title? , links[] |
coupon | Discount coupons | code , description? , validUntil? |
facebook | Facebook page | pageUrl , pageName? |
instagram | Instagram profile | profileUrl , username? |
social_media | All social links | facebook? , instagram? , twitter? , etc. |
whatsapp | WhatsApp chat | phoneNumber , message? |
text | Plain text | text |
email | Email composition | to , subject? , body? |
sms | SMS message | phoneNumber , message? |
phone | Phone call | phoneNumber |
location | Geographic location | latitude , longitude , address? |
event | Calendar event | title , startDate , endDate? , location? |
๐จ Customization Options
Design Options
interface QRDesignOptions {
colors?: {
dark?: string;
light?: string;
};
logo?: {
src: string;
size?: number;
margin?: number;
borderRadius?: number;
};
frame?: {
style: 'square' | 'rounded' | 'circle' | 'banner';
text?: string;
color?: string;
textColor?: string;
};
dotsStyle?: 'square' | 'rounded' | 'dots' | 'classy' | 'extra-rounded';
cornersSquareStyle?: 'square' | 'dot' | 'extra-rounded';
cornersDotStyle?: 'square' | 'dot' | 'extra-rounded';
backgroundImage?: string;
imageSize?: number;
margin?: number;
}
๐ Analytics
Track QR code performance:
const analytics = await QRCodeStudio.getAnalytics({
qrCodeId: 'qr_123',
dateRange: {
start: new Date('2024-01-01'),
end: new Date(),
},
metrics: ['scans', 'unique_scans', 'locations', 'devices'],
});
console.log('Total scans:', analytics.totalScans);
console.log('Unique scans:', analytics.uniqueScans);
console.log('Top locations:', analytics.locations);
console.log('Device types:', analytics.devices);
๐พ Export Formats
- PNG - Raster image format
- JPG - Compressed image format
- SVG - Vector format (scalable)
- PDF - Document format
- GIF - Animated format support
- JSON - Raw QR data
- WebP - Modern image format
- EPS - Vector format for print
- WMF - Windows metafile
๐ Permissions
iOS
- Camera permission for scanning
- Photo library permission for saving (optional)
Android
- Camera permission for scanning
- Storage permission for saving (optional)
Web
- Camera/getUserMedia permission for scanning
โ๏ธ Advanced Configuration
Generation Options
All options are exposed to give you full control over QR code generation:
await QRCodeStudio.generate({
type: 'website',
data: { url: 'https://example.com' },
size: 300,
errorCorrectionLevel: 'M',
version: undefined,
maskPattern: undefined,
margin: 4,
scale: 4,
width: undefined,
toSJISFunc: undefined,
design: {
colors: { dark: '#000000', light: '#FFFFFF' },
logo: { src: 'logo.png', size: 60 },
},
});
Scanner Options
Configure the scanner with extensive options:
await QRCodeStudio.startScan({
camera: 'back',
showTorchButton: true,
showFlipCameraButton: true,
scanDelay: 200,
maxScansPerSecond: 5,
videoStyle: {
position: 'fixed',
width: '100%',
height: '100%',
objectFit: 'cover',
},
highlightCodeOutline: true,
highlightScanRegion: true,
calculateScanRegion: (video) => ({
x: video.videoWidth * 0.25,
y: video.videoHeight * 0.25,
width: video.videoWidth * 0.5,
height: video.videoHeight * 0.5,
}),
formats: [BarcodeFormat.QR_CODE],
});
๐งช Testing
Run the test suite:
npm test
๐ Barcode Examples
Product Inventory Management
import { QRCodeStudio, validateBarcodeData } from 'code-craft-studio';
async function createProductLabel(productId: string, sku: string) {
const barcode = await QRCodeStudio.generateBarcode({
format: 'EAN_13',
data: '5901234123457',
width: 300,
height: 100,
displayText: true,
outputFormat: 'png',
});
const qrCode = await QRCodeStudio.generate({
type: 'text',
data: { text: JSON.stringify({ id: productId, sku, warehouse: 'A1' }) },
size: 200,
});
return { barcode, qrCode };
}
async function scanProduct() {
const listener = await QRCodeStudio.addListener('scanResult', (result) => {
if (result.format === 'EAN_13') {
if (validateBarcodeData('EAN_13', result.content)) {
console.log('Valid product barcode:', result.content);
}
}
});
await QRCodeStudio.startScan({
formats: ['EAN_13', 'UPC_A', 'QR_CODE'],
});
}
Ticket System with PDF417
import React from 'react';
import { QRCodeStudio } from 'code-craft-studio';
function TicketGenerator({ eventId, userId, seatNumber }) {
const generateTicket = async () => {
const ticketBarcode = await QRCodeStudio.generateBarcode({
format: 'PDF_417',
data: JSON.stringify({
event: eventId,
user: userId,
seat: seatNumber,
timestamp: Date.now(),
}),
width: 400,
height: 150,
});
return ticketBarcode;
};
return <button onClick={generateTicket}>Generate Ticket</button>;
}
Multi-Format Scanner Component
import React, { useState } from 'react';
import { BarcodeScanner, getBarcodeConstraints } from 'code-craft-studio';
function UniversalScanner() {
const [lastScan, setLastScan] = useState(null);
const handleScan = (result) => {
const constraints = getBarcodeConstraints(result.format);
setLastScan({
format: result.format,
data: result.rawValue,
constraints: constraints.description,
});
switch (result.format) {
case 'QR_CODE':
break;
case 'EAN_13':
case 'UPC_A':
break;
case 'CODE_128':
break;
case 'PDF_417':
break;
}
};
return (
<div>
<BarcodeScanner
formats={[
'QR_CODE',
'EAN_13',
'EAN_8',
'UPC_A',
'UPC_E',
'CODE_128',
'CODE_39',
'ITF',
'PDF_417',
'AZTEC',
]}
onScan={handleScan}
continuous={true}
/>
{lastScan && (
<div className='scan-result'>
<h3>Last Scan</h3>
<p>Format: {lastScan.format}</p>
<p>Data: {lastScan.data}</p>
<p>Type: {lastScan.constraints}</p>
</div>
)}
</div>
);
}
๐ค Contributing
Contributions are welcome! Please read our Contributing Guide for details.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
)
- Commit your changes (
git commit -m 'Add amazing feature'
)
- Push to the branch (
git push origin feature/amazing-feature
)
- Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐จโ๐ป Author
Ahsan Mahmood
๐ Acknowledgments
๐ Roadmap
๐ก Support
Note
This package takes over and continues development from the original qrcode-studio package.