feat(klz-2026): use external URL and static .vcf files for ultra-minimalist QR codes
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 13s
Build & Deploy / 🧪 QA (push) Successful in 1m25s
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
Build & Deploy / 🏗️ Build (push) Has been cancelled
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 13s
Build & Deploy / 🧪 QA (push) Successful in 1m25s
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
Build & Deploy / 🏗️ Build (push) Has been cancelled
This commit is contained in:
10
public/v/johannesgleich.vcf
Normal file
10
public/v/johannesgleich.vcf
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
BEGIN:VCARD
|
||||||
|
VERSION:3.0
|
||||||
|
N:Gleich;Johannes;;;
|
||||||
|
FN:Johannes Gleich
|
||||||
|
ORG:KLZ Vertriebs GmbH
|
||||||
|
TITLE:Senior Key Account Manager
|
||||||
|
TEL;TYPE=WORK,VOICE:+49 172 739 1109
|
||||||
|
EMAIL;TYPE=PREF,INTERNET:johannes.gleich@klz-cables.com
|
||||||
|
URL:https://klz-cables.com
|
||||||
|
END:VCARD
|
||||||
10
public/v/klausmintel.vcf
Normal file
10
public/v/klausmintel.vcf
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
BEGIN:VCARD
|
||||||
|
VERSION:3.0
|
||||||
|
N:Mintel;Klaus;;;
|
||||||
|
FN:Klaus Mintel
|
||||||
|
ORG:KLZ Vertriebs GmbH
|
||||||
|
TITLE:Managing Director
|
||||||
|
TEL;TYPE=WORK,VOICE:+49 151 1775 2873
|
||||||
|
EMAIL;TYPE=PREF,INTERNET:klaus.mintel@klz-cables.com
|
||||||
|
URL:https://klz-cables.com
|
||||||
|
END:VCARD
|
||||||
10
public/v/michaelbodemer.vcf
Normal file
10
public/v/michaelbodemer.vcf
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
BEGIN:VCARD
|
||||||
|
VERSION:3.0
|
||||||
|
N:Bodemer;Michael;;;
|
||||||
|
FN:Michael Bodemer
|
||||||
|
ORG:KLZ Vertriebs GmbH
|
||||||
|
TITLE:Owner & Managing Director
|
||||||
|
TEL;TYPE=WORK,VOICE:+49 151 462 467 98
|
||||||
|
EMAIL;TYPE=PREF,INTERNET:michael.bodemer@klz-cables.com
|
||||||
|
URL:https://klz-cables.com
|
||||||
|
END:VCARD
|
||||||
@@ -54,13 +54,23 @@ async function generateBusinessCards() {
|
|||||||
|
|
||||||
const lastName = person.name.split(' ').slice(1).join(' ');
|
const lastName = person.name.split(' ').slice(1).join(' ');
|
||||||
const firstName = person.name.split(' ')[0];
|
const firstName = person.name.split(' ')[0];
|
||||||
// Generate MECARD QR Code (much shorter than VCARD, leading to a less dense QR code that can be printed smaller)
|
|
||||||
const mecard = `MECARD:N:${lastName},${firstName};ORG:KLZ Vertriebs GmbH;TEL:${person.phone};EMAIL:${person.email};URL:https://klz-cables.com;;`;
|
|
||||||
|
|
||||||
const qrCodeDataUrl = await QRCode.toDataURL(mecard, {
|
// To make the QR code extremely coarse (minimalist), we cannot encode all contact details into it directly.
|
||||||
|
// Instead, we create a physical .vcf file and encode ONLY its URL into the QR Code (e.g. 35 chars vs 140 chars).
|
||||||
|
const shortId = person.name.toLowerCase().replace(/[^a-z0-9]/g, ''); // "michaelbodemer"
|
||||||
|
const vcfUrl = `https://klz-cables.com/v/${shortId}.vcf`;
|
||||||
|
|
||||||
|
const vcardFull = `BEGIN:VCARD\r\nVERSION:3.0\r\nN:${lastName};${firstName};;;\r\nFN:${person.name}\r\nORG:KLZ Vertriebs GmbH\r\nTITLE:${person.role}\r\nTEL;TYPE=WORK,VOICE:${person.phone}\r\nEMAIL;TYPE=PREF,INTERNET:${person.email}\r\nURL:https://klz-cables.com\r\nEND:VCARD`;
|
||||||
|
|
||||||
|
// Save the physical .vcf file so it can be served by Next.js from /public/v/
|
||||||
|
const vcardDir = path.join(process.cwd(), 'public/v');
|
||||||
|
if (!fs.existsSync(vcardDir)) fs.mkdirSync(vcardDir, { recursive: true });
|
||||||
|
fs.writeFileSync(path.join(vcardDir, `${shortId}.vcf`), vcardFull);
|
||||||
|
|
||||||
|
const qrCodeDataUrl = await QRCode.toDataURL(vcfUrl, {
|
||||||
width: 400,
|
width: 400,
|
||||||
margin: 0,
|
margin: 0,
|
||||||
errorCorrectionLevel: 'L', // Low error correction = less dots = easier to scan when small
|
errorCorrectionLevel: 'L', // Low error correction = less dots
|
||||||
color: { dark: '#000000', light: '#ffffff' },
|
color: { dark: '#000000', light: '#ffffff' },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user