@qr-styled/node 1.0.0

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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +691 -0
  3. package/dist/cli/index.d.ts +29 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +126 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/index.d.ts +15 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +14 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/QRGenerator.d.ts +53 -0
  12. package/dist/lib/QRGenerator.d.ts.map +1 -0
  13. package/dist/lib/QRGenerator.js +150 -0
  14. package/dist/lib/QRGenerator.js.map +1 -0
  15. package/dist/lib/QRGenerator.new-features.test.d.ts +2 -0
  16. package/dist/lib/QRGenerator.new-features.test.d.ts.map +1 -0
  17. package/dist/lib/QRGenerator.new-features.test.js +235 -0
  18. package/dist/lib/QRGenerator.new-features.test.js.map +1 -0
  19. package/dist/lib/QRGenerator.test.d.ts +2 -0
  20. package/dist/lib/QRGenerator.test.d.ts.map +1 -0
  21. package/dist/lib/QRGenerator.test.js +39 -0
  22. package/dist/lib/QRGenerator.test.js.map +1 -0
  23. package/dist/lib/renderers/BackgroundRenderer.d.ts +23 -0
  24. package/dist/lib/renderers/BackgroundRenderer.d.ts.map +1 -0
  25. package/dist/lib/renderers/BackgroundRenderer.js +48 -0
  26. package/dist/lib/renderers/BackgroundRenderer.js.map +1 -0
  27. package/dist/lib/renderers/GradientRenderer.d.ts +19 -0
  28. package/dist/lib/renderers/GradientRenderer.d.ts.map +1 -0
  29. package/dist/lib/renderers/GradientRenderer.js +44 -0
  30. package/dist/lib/renderers/GradientRenderer.js.map +1 -0
  31. package/dist/lib/renderers/LogoRenderer.d.ts +23 -0
  32. package/dist/lib/renderers/LogoRenderer.d.ts.map +1 -0
  33. package/dist/lib/renderers/LogoRenderer.js +72 -0
  34. package/dist/lib/renderers/LogoRenderer.js.map +1 -0
  35. package/dist/lib/renderers/ModuleRenderer.d.ts +45 -0
  36. package/dist/lib/renderers/ModuleRenderer.d.ts.map +1 -0
  37. package/dist/lib/renderers/ModuleRenderer.js +162 -0
  38. package/dist/lib/renderers/ModuleRenderer.js.map +1 -0
  39. package/dist/lib/renderers/SVGRenderer.d.ts +23 -0
  40. package/dist/lib/renderers/SVGRenderer.d.ts.map +1 -0
  41. package/dist/lib/renderers/SVGRenderer.js +74 -0
  42. package/dist/lib/renderers/SVGRenderer.js.map +1 -0
  43. package/dist/lib/utils/formatters.d.ts +26 -0
  44. package/dist/lib/utils/formatters.d.ts.map +1 -0
  45. package/dist/lib/utils/formatters.js +107 -0
  46. package/dist/lib/utils/formatters.js.map +1 -0
  47. package/dist/lib/utils/formatters.test.d.ts +2 -0
  48. package/dist/lib/utils/formatters.test.d.ts.map +1 -0
  49. package/dist/lib/utils/formatters.test.js +190 -0
  50. package/dist/lib/utils/formatters.test.js.map +1 -0
  51. package/dist/lib/utils/types.d.ts +120 -0
  52. package/dist/lib/utils/types.d.ts.map +1 -0
  53. package/dist/lib/utils/types.js +35 -0
  54. package/dist/lib/utils/types.js.map +1 -0
  55. package/dist/lib/utils/validators.d.ts +11 -0
  56. package/dist/lib/utils/validators.d.ts.map +1 -0
  57. package/dist/lib/utils/validators.js +127 -0
  58. package/dist/lib/utils/validators.js.map +1 -0
  59. package/dist/lib/utils/validators.test.d.ts +2 -0
  60. package/dist/lib/utils/validators.test.d.ts.map +1 -0
  61. package/dist/lib/utils/validators.test.js +62 -0
  62. package/dist/lib/utils/validators.test.js.map +1 -0
  63. package/package.json +87 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Renderer for SVG output
3
+ */
4
+ export class SVGRenderer {
5
+ constructor(qrData, options, size) {
6
+ this.qrData = qrData;
7
+ this.options = options;
8
+ this.size = size;
9
+ }
10
+ /**
11
+ * Generates SVG string
12
+ */
13
+ generate() {
14
+ const { size, backgroundColor, foregroundColor, moduleRadius, eyeColor, eyeRadius } = this.options;
15
+ const modules = this.qrData.modules;
16
+ const moduleCount = modules.size;
17
+ const moduleSize = size / moduleCount;
18
+ let svg = `<?xml version="1.0" encoding="UTF-8"?>`;
19
+ svg += `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}">`;
20
+ // Background
21
+ svg += `<rect width="${size}" height="${size}" fill="${backgroundColor}"/>`;
22
+ // QR modules
23
+ svg += `<g fill="${foregroundColor}">`;
24
+ for (let row = 0; row < moduleCount; row++) {
25
+ for (let col = 0; col < moduleCount; col++) {
26
+ if (this.hasModule(col, row)) {
27
+ const x = col * moduleSize;
28
+ const y = row * moduleSize;
29
+ // Check if this is part of an eye (finder pattern)
30
+ const isEye = this.isPartOfEye(col, row, moduleCount);
31
+ const color = isEye && eyeColor ? eyeColor : foregroundColor;
32
+ const radius = isEye && eyeRadius
33
+ ? eyeRadius * moduleSize
34
+ : moduleRadius * moduleSize;
35
+ if (radius > 0) {
36
+ svg += `<rect x="${x}" y="${y}" width="${moduleSize}" height="${moduleSize}" rx="${radius}" fill="${color}"/>`;
37
+ }
38
+ else {
39
+ svg += `<rect x="${x}" y="${y}" width="${moduleSize}" height="${moduleSize}" fill="${color}"/>`;
40
+ }
41
+ }
42
+ }
43
+ }
44
+ svg += `</g>`;
45
+ svg += `</svg>`;
46
+ return svg;
47
+ }
48
+ /**
49
+ * Checks if module exists at position
50
+ */
51
+ hasModule(x, y) {
52
+ const modules = this.qrData.modules;
53
+ if (x < 0 || x >= modules.size || y < 0 || y >= modules.size) {
54
+ return false;
55
+ }
56
+ return modules.data[y * modules.size + x] === 1;
57
+ }
58
+ /**
59
+ * Checks if position is part of finder pattern (eye)
60
+ */
61
+ isPartOfEye(x, y, size) {
62
+ // Top-left eye
63
+ if (x < 7 && y < 7)
64
+ return true;
65
+ // Top-right eye
66
+ if (x >= size - 7 && y < 7)
67
+ return true;
68
+ // Bottom-left eye
69
+ if (x < 7 && y >= size - 7)
70
+ return true;
71
+ return false;
72
+ }
73
+ }
74
+ //# sourceMappingURL=SVGRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SVGRenderer.js","sourceRoot":"","sources":["../../../src/lib/renderers/SVGRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { VCardData, WiFiData, EmailData, SMSData, GeoData, QRDataType } from './types.js';
2
+ /**
3
+ * Formats vCard contact data to vCard 3.0 format
4
+ */
5
+ export declare function formatVCard(data: VCardData): string;
6
+ /**
7
+ * Formats WiFi configuration to WiFi QR format
8
+ */
9
+ export declare function formatWiFi(data: WiFiData): string;
10
+ /**
11
+ * Formats email data to mailto URI
12
+ */
13
+ export declare function formatEmail(data: EmailData): string;
14
+ /**
15
+ * Formats SMS data to SMS URI
16
+ */
17
+ export declare function formatSMS(data: SMSData): string;
18
+ /**
19
+ * Formats geolocation data to geo URI
20
+ */
21
+ export declare function formatGeo(data: GeoData): string;
22
+ /**
23
+ * Formats QR data based on type
24
+ */
25
+ export declare function formatQRData(type: QRDataType, url?: string, data?: VCardData | WiFiData | EmailData | SMSData | GeoData): string;
26
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAsCnD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAmBjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAiBnD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAQ/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAC1D,MAAM,CA0BR"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Formats vCard contact data to vCard 3.0 format
3
+ */
4
+ export function formatVCard(data) {
5
+ const lines = ['BEGIN:VCARD', 'VERSION:3.0'];
6
+ if (data.firstName || data.lastName) {
7
+ const name = `${data.lastName || ''};${data.firstName || ''};;;`;
8
+ lines.push(`N:${name}`);
9
+ lines.push(`FN:${[data.firstName, data.lastName].filter(Boolean).join(' ')}`);
10
+ }
11
+ if (data.organization) {
12
+ lines.push(`ORG:${data.organization}`);
13
+ }
14
+ if (data.title) {
15
+ lines.push(`TITLE:${data.title}`);
16
+ }
17
+ if (data.phone) {
18
+ lines.push(`TEL:${data.phone}`);
19
+ }
20
+ if (data.email) {
21
+ lines.push(`EMAIL:${data.email}`);
22
+ }
23
+ if (data.url) {
24
+ lines.push(`URL:${data.url}`);
25
+ }
26
+ if (data.address || data.city || data.state || data.zip || data.country) {
27
+ const adr = `;;${data.address || ''};${data.city || ''};${data.state || ''};${data.zip || ''};${data.country || ''}`;
28
+ lines.push(`ADR:${adr}`);
29
+ }
30
+ lines.push('END:VCARD');
31
+ return lines.join('\n');
32
+ }
33
+ /**
34
+ * Formats WiFi configuration to WiFi QR format
35
+ */
36
+ export function formatWiFi(data) {
37
+ const { ssid, password = '', encryption = 'WPA', hidden = false } = data;
38
+ const escape = (str) => str.replace(/([\\;,:])/g, '\\$1');
39
+ let result = 'WIFI:';
40
+ result += `T:${encryption};`;
41
+ result += `S:${escape(ssid)};`;
42
+ if (password) {
43
+ result += `P:${escape(password)};`;
44
+ }
45
+ if (hidden) {
46
+ result += 'H:true;';
47
+ }
48
+ result += ';';
49
+ return result;
50
+ }
51
+ /**
52
+ * Formats email data to mailto URI
53
+ */
54
+ export function formatEmail(data) {
55
+ let result = `mailto:${data.email}`;
56
+ const params = [];
57
+ if (data.subject) {
58
+ params.push(`subject=${encodeURIComponent(data.subject)}`);
59
+ }
60
+ if (data.body) {
61
+ params.push(`body=${encodeURIComponent(data.body)}`);
62
+ }
63
+ if (params.length > 0) {
64
+ result += '?' + params.join('&');
65
+ }
66
+ return result;
67
+ }
68
+ /**
69
+ * Formats SMS data to SMS URI
70
+ */
71
+ export function formatSMS(data) {
72
+ let result = `sms:${data.phone}`;
73
+ if (data.message) {
74
+ result += `?body=${encodeURIComponent(data.message)}`;
75
+ }
76
+ return result;
77
+ }
78
+ /**
79
+ * Formats geolocation data to geo URI
80
+ */
81
+ export function formatGeo(data) {
82
+ return `geo:${data.latitude},${data.longitude}`;
83
+ }
84
+ /**
85
+ * Formats QR data based on type
86
+ */
87
+ export function formatQRData(type, url, data) {
88
+ switch (type) {
89
+ case 'url':
90
+ return url || '';
91
+ case 'text':
92
+ return url || '';
93
+ case 'vcard':
94
+ return data ? formatVCard(data) : '';
95
+ case 'wifi':
96
+ return data ? formatWiFi(data) : '';
97
+ case 'email':
98
+ return data ? formatEmail(data) : '';
99
+ case 'sms':
100
+ return data ? formatSMS(data) : '';
101
+ case 'geo':
102
+ return data ? formatGeo(data) : '';
103
+ default:
104
+ return url || '';
105
+ }
106
+ }
107
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../../src/lib/utils/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formatters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.test.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/formatters.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,190 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { formatVCard, formatWiFi, formatEmail, formatSMS, formatGeo, formatQRData } from './formatters.js';
3
+ describe('Data Formatters', () => {
4
+ describe('formatVCard', () => {
5
+ it('should format basic vCard with name', () => {
6
+ const result = formatVCard({
7
+ firstName: 'John',
8
+ lastName: 'Doe'
9
+ });
10
+ expect(result).toContain('BEGIN:VCARD');
11
+ expect(result).toContain('VERSION:3.0');
12
+ expect(result).toContain('N:Doe;John;;;');
13
+ expect(result).toContain('FN:John Doe');
14
+ expect(result).toContain('END:VCARD');
15
+ });
16
+ it('should format complete vCard with all fields', () => {
17
+ const result = formatVCard({
18
+ firstName: 'Jane',
19
+ lastName: 'Smith',
20
+ organization: 'Acme Corp',
21
+ title: 'CEO',
22
+ phone: '+1234567890',
23
+ email: 'jane@acme.com',
24
+ url: 'https://acme.com',
25
+ address: '123 Main St',
26
+ city: 'New York',
27
+ state: 'NY',
28
+ zip: '10001',
29
+ country: 'USA'
30
+ });
31
+ expect(result).toContain('ORG:Acme Corp');
32
+ expect(result).toContain('TITLE:CEO');
33
+ expect(result).toContain('TEL:+1234567890');
34
+ expect(result).toContain('EMAIL:jane@acme.com');
35
+ expect(result).toContain('URL:https://acme.com');
36
+ expect(result).toContain('ADR:;;123 Main St;New York;NY;10001;USA');
37
+ });
38
+ it('should handle missing optional fields', () => {
39
+ const result = formatVCard({
40
+ firstName: 'Bob'
41
+ });
42
+ expect(result).toContain('N:;Bob;;;');
43
+ expect(result).toContain('FN:Bob');
44
+ expect(result).not.toContain('ORG:');
45
+ expect(result).not.toContain('TEL:');
46
+ });
47
+ });
48
+ describe('formatWiFi', () => {
49
+ it('should format WiFi with WPA encryption', () => {
50
+ const result = formatWiFi({
51
+ ssid: 'MyNetwork',
52
+ password: 'SecurePassword123',
53
+ encryption: 'WPA'
54
+ });
55
+ expect(result).toBe('WIFI:T:WPA;S:MyNetwork;P:SecurePassword123;;');
56
+ });
57
+ it('should format WiFi without password (open network)', () => {
58
+ const result = formatWiFi({
59
+ ssid: 'OpenWiFi',
60
+ encryption: 'nopass'
61
+ });
62
+ expect(result).toBe('WIFI:T:nopass;S:OpenWiFi;;');
63
+ });
64
+ it('should escape special characters', () => {
65
+ const result = formatWiFi({
66
+ ssid: 'Network;Name',
67
+ password: 'Pass:word',
68
+ encryption: 'WPA'
69
+ });
70
+ expect(result).toContain('S:Network\\;Name');
71
+ expect(result).toContain('P:Pass\\:word');
72
+ });
73
+ it('should mark hidden network', () => {
74
+ const result = formatWiFi({
75
+ ssid: 'HiddenNet',
76
+ password: 'secret',
77
+ encryption: 'WPA',
78
+ hidden: true
79
+ });
80
+ expect(result).toContain('H:true;');
81
+ });
82
+ });
83
+ describe('formatEmail', () => {
84
+ it('should format email with address only', () => {
85
+ const result = formatEmail({
86
+ email: 'test@example.com'
87
+ });
88
+ expect(result).toBe('mailto:test@example.com');
89
+ });
90
+ it('should format email with subject', () => {
91
+ const result = formatEmail({
92
+ email: 'contact@company.com',
93
+ subject: 'Hello World'
94
+ });
95
+ expect(result).toBe('mailto:contact@company.com?subject=Hello%20World');
96
+ });
97
+ it('should format email with subject and body', () => {
98
+ const result = formatEmail({
99
+ email: 'support@app.com',
100
+ subject: 'Bug Report',
101
+ body: 'I found a bug in the app'
102
+ });
103
+ expect(result).toContain('mailto:support@app.com');
104
+ expect(result).toContain('subject=Bug%20Report');
105
+ expect(result).toContain('body=I%20found%20a%20bug%20in%20the%20app');
106
+ });
107
+ });
108
+ describe('formatSMS', () => {
109
+ it('should format SMS with phone number only', () => {
110
+ const result = formatSMS({
111
+ phone: '+1234567890'
112
+ });
113
+ expect(result).toBe('sms:+1234567890');
114
+ });
115
+ it('should format SMS with message', () => {
116
+ const result = formatSMS({
117
+ phone: '+9876543210',
118
+ message: 'Hello there!'
119
+ });
120
+ expect(result).toBe('sms:+9876543210?body=Hello%20there!');
121
+ });
122
+ });
123
+ describe('formatGeo', () => {
124
+ it('should format geographic coordinates', () => {
125
+ const result = formatGeo({
126
+ latitude: 40.7128,
127
+ longitude: -74.006
128
+ });
129
+ expect(result).toBe('geo:40.7128,-74.006');
130
+ });
131
+ it('should handle negative coordinates', () => {
132
+ const result = formatGeo({
133
+ latitude: -33.8688,
134
+ longitude: 151.2093
135
+ });
136
+ expect(result).toBe('geo:-33.8688,151.2093');
137
+ });
138
+ });
139
+ describe('formatQRData', () => {
140
+ it('should format URL type', () => {
141
+ const result = formatQRData('url', 'https://example.com');
142
+ expect(result).toBe('https://example.com');
143
+ });
144
+ it('should format text type', () => {
145
+ const result = formatQRData('text', 'Hello World');
146
+ expect(result).toBe('Hello World');
147
+ });
148
+ it('should format vCard type', () => {
149
+ const result = formatQRData('vcard', undefined, {
150
+ firstName: 'John',
151
+ lastName: 'Doe'
152
+ });
153
+ expect(result).toContain('BEGIN:VCARD');
154
+ expect(result).toContain('FN:John Doe');
155
+ });
156
+ it('should format WiFi type', () => {
157
+ const result = formatQRData('wifi', undefined, {
158
+ ssid: 'TestNet',
159
+ password: 'pass123',
160
+ encryption: 'WPA'
161
+ });
162
+ expect(result).toContain('WIFI:');
163
+ expect(result).toContain('S:TestNet');
164
+ });
165
+ it('should format email type', () => {
166
+ const result = formatQRData('email', undefined, {
167
+ email: 'test@test.com'
168
+ });
169
+ expect(result).toBe('mailto:test@test.com');
170
+ });
171
+ it('should format SMS type', () => {
172
+ const result = formatQRData('sms', undefined, {
173
+ phone: '+123456'
174
+ });
175
+ expect(result).toBe('sms:+123456');
176
+ });
177
+ it('should format geo type', () => {
178
+ const result = formatQRData('geo', undefined, {
179
+ latitude: 10.5,
180
+ longitude: 20.3
181
+ });
182
+ expect(result).toBe('geo:10.5,20.3');
183
+ });
184
+ it('should return empty string when data is missing', () => {
185
+ const result = formatQRData('vcard', undefined, undefined);
186
+ expect(result).toBe('');
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=formatters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.test.js","sourceRoot":"","sources":["../../../src/lib/utils/formatters.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * QR code data types for specialized content
3
+ */
4
+ export type QRDataType = 'url' | 'text' | 'vcard' | 'wifi' | 'email' | 'sms' | 'geo';
5
+ /**
6
+ * vCard contact data
7
+ */
8
+ export interface VCardData {
9
+ firstName?: string;
10
+ lastName?: string;
11
+ organization?: string;
12
+ title?: string;
13
+ phone?: string;
14
+ email?: string;
15
+ url?: string;
16
+ address?: string;
17
+ city?: string;
18
+ state?: string;
19
+ zip?: string;
20
+ country?: string;
21
+ }
22
+ /**
23
+ * WiFi configuration data
24
+ */
25
+ export interface WiFiData {
26
+ ssid: string;
27
+ password?: string;
28
+ encryption?: 'WPA' | 'WEP' | 'nopass';
29
+ hidden?: boolean;
30
+ }
31
+ /**
32
+ * Email data
33
+ */
34
+ export interface EmailData {
35
+ email: string;
36
+ subject?: string;
37
+ body?: string;
38
+ }
39
+ /**
40
+ * SMS data
41
+ */
42
+ export interface SMSData {
43
+ phone: string;
44
+ message?: string;
45
+ }
46
+ /**
47
+ * Geolocation data
48
+ */
49
+ export interface GeoData {
50
+ latitude: number;
51
+ longitude: number;
52
+ }
53
+ /**
54
+ * QR generation options interface
55
+ */
56
+ export interface QROptions {
57
+ /** URL or text content for the QR code */
58
+ url?: string;
59
+ /** Type of QR code data */
60
+ type?: QRDataType;
61
+ /** Structured data for specialized QR types */
62
+ data?: VCardData | WiFiData | EmailData | SMSData | GeoData;
63
+ /** Canvas size in pixels */
64
+ size?: number;
65
+ /** QR code quiet zone margin (in modules, typically 4) */
66
+ margin?: number;
67
+ /** Canvas padding in pixels */
68
+ padding?: number;
69
+ /** QR code foreground color (hex format) */
70
+ foregroundColor?: string;
71
+ /** @deprecated Use foregroundColor instead */
72
+ color?: string;
73
+ /** Path or URL to logo image */
74
+ logo?: string;
75
+ /** Logo size in pixels */
76
+ logoSize?: number;
77
+ /** Use rounded module corners */
78
+ rounded?: boolean;
79
+ /** Module corner radius (0.0-0.5) */
80
+ moduleRadius?: number;
81
+ /** Padding around logo */
82
+ logoPadding?: number;
83
+ /** Logo background shape */
84
+ logoShape?: 'circle' | 'square';
85
+ /** Logo background color */
86
+ logoBackgroundColor?: string;
87
+ /** Corner radius for square logo background */
88
+ logoRadius?: number;
89
+ /** Use gradient colors */
90
+ gradient?: boolean;
91
+ /** Comma-separated gradient colors */
92
+ gradientColors?: string;
93
+ /** Gradient angle in degrees (0-360) */
94
+ gradientAngle?: number;
95
+ /** Background corner radius */
96
+ cornerRadius?: number;
97
+ /** Background color */
98
+ backgroundColor?: string;
99
+ /** QR error correction level */
100
+ errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';
101
+ /** Custom eye (finder pattern) color */
102
+ eyeColor?: string;
103
+ /** Custom eye radius (0.0-0.5) */
104
+ eyeRadius?: number;
105
+ }
106
+ /**
107
+ * Default configuration options for QR code generation
108
+ */
109
+ export declare const DEFAULT_OPTIONS: Required<Omit<QROptions, 'url' | 'data' | 'color'>>;
110
+ /**
111
+ * Valid logo shapes
112
+ */
113
+ export declare const VALID_LOGO_SHAPES: readonly ["circle", "square"];
114
+ /**
115
+ * Valid error correction levels
116
+ */
117
+ export declare const VALID_ERROR_CORRECTION_LEVELS: readonly ["L", "M", "Q", "H"];
118
+ export type LogoShape = (typeof VALID_LOGO_SHAPES)[number];
119
+ export type ErrorCorrectionLevel = (typeof VALID_ERROR_CORRECTION_LEVELS)[number];
120
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Default configuration options for QR code generation
3
+ */
4
+ export const DEFAULT_OPTIONS = {
5
+ type: 'text',
6
+ size: 600,
7
+ margin: 4,
8
+ padding: 40,
9
+ foregroundColor: '#000000',
10
+ logo: '',
11
+ logoSize: 120,
12
+ rounded: true,
13
+ moduleRadius: 0.35,
14
+ logoPadding: 10,
15
+ logoShape: 'circle',
16
+ logoBackgroundColor: '#ffffff',
17
+ logoRadius: 20,
18
+ gradient: false,
19
+ gradientColors: '#FEDA75,#FA7E1E,#D62976,#962FBF,#4F5BD5',
20
+ gradientAngle: 45,
21
+ cornerRadius: 60,
22
+ backgroundColor: '#ffffff',
23
+ errorCorrectionLevel: 'H',
24
+ eyeColor: '',
25
+ eyeRadius: 0
26
+ };
27
+ /**
28
+ * Valid logo shapes
29
+ */
30
+ export const VALID_LOGO_SHAPES = ['circle', 'square'];
31
+ /**
32
+ * Valid error correction levels
33
+ */
34
+ export const VALID_ERROR_CORRECTION_LEVELS = ['L', 'M', 'Q', 'H'];
35
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/utils/types.ts"],"names":[],"mappings":"AAuHA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAExB;IACF,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,SAAS;IAC1B,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,IAAI;IACb,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,EAAE;IACf,SAAS,EAAE,QAAQ;IACnB,mBAAmB,EAAE,SAAS;IAC9B,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,KAAK;IACf,cAAc,EAAE,yCAAyC;IACzD,aAAa,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,SAAS;IAC1B,oBAAoB,EAAE,GAAG;IACzB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,CAAC;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { QROptions } from './types.js';
2
+ /**
3
+ * Validates QR generation options
4
+ * @throws {Error} If options are invalid
5
+ */
6
+ export declare function validateOptions(options: QROptions): void;
7
+ /**
8
+ * Normalizes and merges options with defaults
9
+ */
10
+ export declare function normalizeOptions<T extends Partial<QROptions>>(options: T, defaults: Partial<QROptions>): T & Partial<QROptions>;
11
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAGV,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CA0JxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,CAAC,SAAS,CAAC,EAC3D,OAAO,EAAE,CAAC,EACV,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAC3B,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAKxB"}