{"id":11248,"date":"2026-06-26T15:57:33","date_gmt":"2026-06-26T07:57:33","guid":{"rendered":"https:\/\/eber.co\/?page_id=11248"},"modified":"2026-06-26T16:02:04","modified_gmt":"2026-06-26T08:02:04","slug":"qr-creator-pro","status":"publish","type":"page","link":"https:\/\/eber.co\/tools\/qr-creator-pro\/","title":{"rendered":"QR Creator Pro \u2014 Free QR Code Generator for Marketers | Eber"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"11248\" class=\"elementor elementor-11248\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-194db59 e-con-full e-flex e-con e-parent\" data-id=\"194db59\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6123cf0 elementor-widget elementor-widget-html\" data-id=\"6123cf0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;500;600;700;800&display=swap\" rel=\"stylesheet\" \/>\n\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}\n\n.qrw {\n  font-family:'Montserrat',sans-serif;\n  color:#0294A5;\n  min-height:100vh;\n  background:\n    radial-gradient(ellipse at top, rgba(0,196,179,0.13) 0%, transparent 65%),\n    linear-gradient(rgba(0,196,179,0.07) 1px, transparent 1px),\n    linear-gradient(90deg, rgba(0,196,179,0.07) 1px, transparent 1px);\n  background-size: 100% 100%, 60px 60px, 60px 60px;\n  padding-bottom:100px;\n}\n\n\/* \u2500\u2500 HERO \u2500\u2500 *\/\n.qrw-hero {\n  text-align:center;\n  padding:100px 24px 60px;\n  max-width:800px;\n  margin:0 auto;\n}\n.qrw-badge {\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  background:#E6FAF8;\n  border:1px solid rgba(0,196,179,0.3);\n  border-radius:100px;\n  padding:6px 16px;\n  font-size:13px;\n  font-weight:600;\n  color:#0294A5;\n  margin-bottom:24px;\n}\n.qrw-badge .dot {\n  width:7px;height:7px;\n  background:#00C4B3;\n  border-radius:50%;\n  animation:qr-blink 2s infinite;\n}\n@keyframes qr-blink{0%,100%{opacity:1}50%{opacity:0.3}}\n.qrw-hero h1 {\n  font-size:clamp(2rem,5vw,3rem);\n  font-weight:800;\n  color:#0294A5;\n  line-height:1.15;\n  margin-bottom:14px;\n}\n.qrw-hero h1 em {color:#00C4B3;font-style:normal;}\n.qrw-hero p {\n  font-size:14px;\n  color:#5A8A84;\n  max-width:520px;\n  margin:0 auto;\n  line-height:1.6;\n}\n\n\/* \u2500\u2500 GATE \u2500\u2500 *\/\n.qrw-gate {\n  max-width:800px;\n  margin:0 auto;\n  padding:0 24px;\n}\n.qrw-gate-card {\n  background:#ffffff;\n  border:1px solid rgba(0,196,179,0.25);\n  border-radius:16px;\n  padding:36px 32px 32px;\n}\n.qrw-gate-card h2 {\n  font-size:1rem;\n  font-weight:700;\n  color:#0294A5;\n  margin-bottom:6px;\n}\n.qrw-gate-card .qrw-sub {\n  font-size:14px;\n  color:#5A8A84;\n  margin-bottom:24px;\n}\n.qrw-gate-row {\n  display:grid;\n  grid-template-columns:1fr 1fr 1fr auto;\n  gap:10px;\n  align-items:start;\n}\n.qrw-field-wrap {display:flex;flex-direction:column;gap:4px;}\n.qrw-field-wrap input {\n  width:100%;\n  padding:11px 14px;\n  border:1.5px solid rgba(0,196,179,0.6);\n  border-radius:8px;\n  font-family:'Montserrat',sans-serif;\n  font-size:14px;\n  color:#3D6B67;\n  background:#fff;\n  outline:none;\n  transition:border-color .2s, box-shadow .2s;\n}\n.qrw-field-wrap input::placeholder{color:#aac9c6;}\n.qrw-field-wrap input:focus {\n  border-color:#00C4B3;\n  box-shadow:0 0 0 3px rgba(0,196,179,0.15);\n}\n.qrw-field-err {\n  font-size:12px;\n  color:#e05c5c;\n  min-height:16px;\n}\n.qrw-btn-access {\n  background:#0294A5;\n  color:#fff;\n  font-family:'Montserrat',sans-serif;\n  font-weight:700;\n  font-size:14px;\n  border:none;\n  border-radius:8px;\n  padding:11px 22px;\n  cursor:pointer;\n  white-space:nowrap;\n  transition:background .2s;\n  margin-top:0;\n  align-self:flex-start;\n}\n.qrw-btn-access:hover{background:#027a8a;}\n.qrw-privacy {\n  font-size:12px;\n  color:#5A8A84;\n  margin-top:14px;\n}\n\n\/* \u2500\u2500 TOOL \u2500\u2500 *\/\n.qrw-tool {\n  display:none;\n  max-width:1000px;\n  margin:0 auto;\n  padding:0 24px;\n}\n.qrw-welcome {\n  text-align:center;\n  padding:80px 0 32px;\n}\n.qrw-welcome p {\n  font-size:clamp(1.6rem,3vw,2rem);\n  font-weight:800;\n  color:#0294A5;\n  line-height:1.2;\n  margin-bottom:6px;\n}\n.qrw-welcome .qrw-tip {\n  font-size:14px;\n  color:#5A8A84;\n  font-weight:400;\n  margin-top:0;\n}\n\n\/* Two-col layout *\/\n.qrw-builder {\n  display:grid;\n  grid-template-columns:1fr 260px;\n  gap:20px;\n  align-items:start;\n}\n\n\/* LEFT panel *\/\n.qrw-left {\n  background:#ffffff;\n  border:1px solid rgba(0,196,179,0.25);\n  border-radius:16px;\n  overflow:hidden;\n}\n\n\/* Section rows inside left panel *\/\n.qrw-section {\n  border-bottom:1px solid rgba(0,196,179,0.12);\n}\n.qrw-section:last-child{ border-bottom:none; }\n.qrw-section-head {\n  display:flex;\n  align-items:center;\n  gap:10px;\n  padding:14px 20px;\n  cursor:default;\n}\n.qrw-section-icon {\n  width:32px;height:32px;\n  background:#0294A5;\n  border-radius:7px;\n  display:flex;align-items:center;justify-content:center;\n  flex-shrink:0;\n}\n.qrw-section-icon svg{ display:block; }\n.qrw-section-title {\n  font-size:14px;\n  font-weight:700;\n  color:#0294A5;\n  letter-spacing:0.06em;\n  text-transform:uppercase;\n  flex:1;\n}\n.qrw-section-body {\n  padding:0 20px 18px;\n}\n\n\/* Type tabs *\/\n.qrw-tabs {\n  display:flex;\n  gap:2px;\n  flex-wrap:wrap;\n  margin-bottom:18px;\n  border-bottom:1.5px solid rgba(0,196,179,0.2);\n  padding-bottom:0;\n}\n.qrw-tab {\n  font-family:'Montserrat',sans-serif;\n  font-size:12px;\n  font-weight:600;\n  color:#5A8A84;\n  background:none;\n  border:none;\n  border-bottom:2.5px solid transparent;\n  padding:7px 10px;\n  cursor:pointer;\n  letter-spacing:0.04em;\n  transition:color .15s, border-color .15s;\n  margin-bottom:-1.5px;\n}\n.qrw-tab:hover{color:#0294A5;}\n.qrw-tab.active {\n  color:#0294A5;\n  border-bottom-color:#00C4B3;\n}\n\n\/* Panels *\/\n.qrw-panel {display:none;}\n.qrw-panel.active{display:block;}\n\n.qrw-form-grid {\n  display:grid;\n  grid-template-columns:1fr 1fr;\n  gap:12px;\n  margin-bottom:12px;\n}\n.qrw-form-grid.cols-1{grid-template-columns:1fr;}\n.qrw-label {\n  font-size:12px;\n  font-weight:600;\n  color:#0294A5;\n  margin-bottom:5px;\n  display:block;\n}\n.qrw-input {\n  width:100%;\n  padding:9px 12px;\n  border:1.5px solid rgba(0,196,179,0.6);\n  border-radius:8px;\n  font-family:'Montserrat',sans-serif;\n  font-size:14px;\n  color:#3D6B67;\n  background:#fff;\n  outline:none;\n  transition:border-color .2s, box-shadow .2s;\n}\n.qrw-input::placeholder{color:#aac9c6;}\n.qrw-input:focus{border-color:#00C4B3;box-shadow:0 0 0 3px rgba(0,196,179,0.15);}\ntextarea.qrw-input{resize:vertical;min-height:80px;}\n\n\/* Color inputs: swatch + hex field side by side *\/\n.qrw-color-field {\n  display:flex;\n  flex-direction:column;\n  gap:6px;\n  margin-bottom:14px;\n}\n.qrw-color-field:last-child{ margin-bottom:0; }\n.qrw-color-field-lbl {\n  font-size:12px;\n  font-weight:600;\n  color:#0294A5;\n}\n.qrw-color-input-row {\n  display:flex;\n  align-items:center;\n  gap:0;\n  border:1.5px solid rgba(0,196,179,0.6);\n  border-radius:8px;\n  overflow:hidden;\n  background:#fff;\n}\n.qrw-color-swatch-wrap {\n  position:relative;\n  width:40px;\n  height:38px;\n  flex-shrink:0;\n  border-right:1.5px solid rgba(0,196,179,0.4);\n}\n.qrw-color-swatch-wrap input[type=color]{\n  position:absolute;inset:0;\n  width:100%;height:100%;\n  opacity:0;cursor:pointer;\n  border:none;padding:0;\n}\n.qrw-color-swatch {\n  width:100%;height:100%;\n  pointer-events:none;\n}\n.qrw-hex-input {\n  flex:1;\n  border:none;\n  outline:none;\n  font-family:'Montserrat',sans-serif;\n  font-size:14px;\n  color:#3D6B67;\n  font-weight:600;\n  padding:0 10px;\n  background:transparent;\n  text-transform:uppercase;\n}\n\n\/* Logo upload *\/\n.qrw-logo-row {display:flex;align-items:center;gap:10px;flex-wrap:wrap;}\n.qrw-logo-upload-btn {\n  display:inline-block;\n  background:#E9F8F7;\n  border:1.5px solid rgba(0,196,179,0.5);\n  color:#0294A5;\n  font-family:'Montserrat',sans-serif;\n  font-weight:700;\n  font-size:12px;\n  padding:7px 14px;\n  border-radius:7px;\n  cursor:pointer;\n  transition:background .15s;\n}\n.qrw-logo-upload-btn:hover{background:#CCF5F1;}\n.qrw-logo-preview-wrap {\n  position:relative;\n  display:inline-flex;\n  align-items:center;\n}\n.qrw-logo-preview-wrap img {\n  width:36px;height:36px;\n  object-fit:contain;\n  border-radius:6px;\n  border:1.5px solid rgba(0,196,179,0.3);\n  background:#fff;\n}\n.qrw-logo-remove {\n  position:absolute;top:-6px;right:-6px;\n  width:16px;height:16px;\n  background:#e05c5c;color:#fff;\n  border:none;border-radius:50%;\n  font-size:11px;line-height:16px;text-align:center;\n  cursor:pointer;padding:0;font-weight:700;\n}\n.qrw-logo-hint {font-size:12px;color:#aac9c6;font-weight:500;}\n\n\/* Generate button *\/\n.qrw-generate-btn {\n  width:100%;\n  padding:12px;\n  background:#0294A5;\n  color:#fff;\n  font-family:'Montserrat',sans-serif;\n  font-weight:700;\n  font-size:14px;\n  border:none;\n  border-radius:0 0 14px 14px;\n  cursor:pointer;\n  transition:background .2s;\n}\n.qrw-generate-btn:hover{background:#027a8a;}\n\n\/* RIGHT panel *\/\n.qrw-right {\n  position:sticky;\n  top:20px;\n}\n.qrw-qr-card {\n  background:#ffffff;\n  border:1px solid rgba(0,196,179,0.25);\n  border-radius:16px;\n  padding:20px;\n  text-align:center;\n}\n.qrw-qr-placeholder {\n  width:200px;height:200px;\n  background:rgba(0,196,179,0.06);\n  border:1.5px dashed rgba(0,196,179,0.35);\n  border-radius:10px;\n  margin:0 auto 16px;\n  display:flex;\n  flex-direction:column;\n  align-items:center;\n  justify-content:center;\n  gap:8px;\n}\n.qrw-qr-placeholder svg{opacity:0.3;}\n.qrw-qr-placeholder span{font-size:12px;color:#aac9c6;font-weight:500;}\n#qrw-qr-canvas{display:none;}\n#qrw-final-canvas{display:none;border-radius:8px;margin:0 auto 16px;}\n.qrw-error-msg{font-size:12px;color:#e05c5c;margin-bottom:8px;min-height:16px;}\n\n\/* Download buttons *\/\n.qrw-dl-btns {\n  display:none;\n  flex-direction:column;\n  gap:6px;\n  margin-top:4px;\n}\n.qrw-dl-btn-primary {\n  width:100%;\n  padding:10px;\n  background:#00C4B3;\n  color:#fff;\n  font-family:'Montserrat',sans-serif;\n  font-weight:700;\n  font-size:14px;\n  border:none;\n  border-radius:8px;\n  cursor:pointer;\n  transition:background .2s;\n}\n.qrw-dl-btn-primary:hover{background:#00a89a;}\n.qrw-dl-row {\n  display:grid;\n  grid-template-columns:1fr 1fr 1fr;\n  gap:5px;\n}\n.qrw-dl-btn {\n  background:#fff;\n  border:1.5px solid rgba(0,196,179,0.5);\n  color:#0294A5;\n  font-family:'Montserrat',sans-serif;\n  font-weight:700;\n  font-size:12px;\n  padding:7px 4px;\n  border-radius:6px;\n  cursor:pointer;\n  transition:background .15s;\n  text-align:center;\n}\n.qrw-dl-btn:hover{background:#E9F8F7;}\n\n\/* \u2500\u2500 SUMMARY \u2500\u2500 *\/\n.qrw-summary {\n  max-width:1000px;\n  margin:60px auto 0;\n  padding:0 24px;\n}\n.qrw-summary-inner {\n  background:#ffffff;\n  border:1px solid rgba(0,196,179,0.2);\n  border-radius:16px;\n  padding:48px 40px;\n}\n.qrw-summary-hero {\n  text-align:center;\n  margin-bottom:40px;\n}\n.qrw-summary-hero h2 {\n  font-size:1.4rem;\n  font-weight:800;\n  color:#0294A5;\n  margin-bottom:12px;\n}\n.qrw-summary-hero p {\n  font-size:14px;\n  color:#5A8A84;\n  max-width:600px;\n  margin:0 auto;\n  line-height:1.7;\n}\n\/* Steps *\/\n.qrw-steps {\n  display:flex;\n  flex-direction:column;\n  gap:20px;\n  margin-bottom:40px;\n  padding-bottom:40px;\n  border-bottom:1px solid rgba(0,196,179,0.15);\n}\n.qrw-step {\n  display:flex;\n  gap:16px;\n  align-items:flex-start;\n}\n.qrw-step-num {\n  width:32px;height:32px;\n  background:#0294A5;\n  color:#fff;\n  font-weight:800;\n  font-size:14px;\n  border-radius:50%;\n  display:flex;align-items:center;justify-content:center;\n  flex-shrink:0;\n  margin-top:2px;\n}\n.qrw-step-title {\n  font-size:14px;\n  font-weight:700;\n  color:#0294A5;\n  margin-bottom:4px;\n}\n.qrw-step-body {\n  font-size:14px;\n  color:#5A8A84;\n  line-height:1.6;\n}\n\/* Reasons *\/\n.qrw-reasons {\n  display:grid;\n  grid-template-columns:1fr 1fr 1fr;\n  gap:20px;\n}\n.qrw-reason {\n  text-align:center;\n}\n.qrw-reason-icon {\n  font-size:1.4rem;\n  color:#00C4B3;\n  margin-bottom:8px;\n  line-height:1;\n}\n.qrw-reason-title {\n  font-size:14px;\n  font-weight:700;\n  color:#0294A5;\n  margin-bottom:6px;\n}\n.qrw-reason-body {\n  font-size:12px;\n  color:#5A8A84;\n  line-height:1.6;\n}\n@media(max-width:720px){\n  .qrw-reasons{grid-template-columns:1fr 1fr;}\n  .qrw-summary-inner{padding:32px 24px;}\n}\n\n\/* \u2500\u2500 FOOTER \u2500\u2500 *\/\n.qrw-footer {\n  text-align:center;\n  padding:40px 24px 0;\n  font-size:13px;\n  color:#5A8A84;\n}\n.qrw-footer a{color:#00C4B3;text-decoration:none;font-weight:600;}\n\n@media(max-width:720px){\n  .qrw-gate-row{grid-template-columns:1fr;}\n  .qrw-form-grid{grid-template-columns:1fr!important;}\n  .qrw-builder{grid-template-columns:1fr;}\n  .qrw-right{position:static;}\n}\n<\/style>\n\n<div class=\"qrw\">\n\n  <!-- HERO -->\n  <div class=\"qrw-hero\" id=\"qrw-hero\">\n    <div class=\"qrw-badge\"><span class=\"dot\"><\/span> Free tool<\/div>\n    <h1>QR Creator <em>Pro<\/em><\/h1>\n    <p>The free QR code generator built for marketers.<\/p>\n  <\/div>\n\n  <!-- GATE -->\n  <div class=\"qrw-gate\" id=\"qrw-gate\">\n    <div class=\"qrw-gate-card\">\n      <h2>Get free access<\/h2>\n      <p class=\"qrw-sub\">One-time sign-up \u2014 your tool stays unlocked every time you return.<\/p>\n      <div class=\"qrw-gate-row\">\n        <div class=\"qrw-field-wrap\">\n          <input type=\"text\" id=\"qrw-name\" placeholder=\"Full name\" autocomplete=\"name\" \/>\n          <span class=\"qrw-field-err\" id=\"qrw-err-name\"><\/span>\n        <\/div>\n        <div class=\"qrw-field-wrap\">\n          <input type=\"email\" id=\"qrw-email\" placeholder=\"Work email\" autocomplete=\"email\" \/>\n          <span class=\"qrw-field-err\" id=\"qrw-err-email\"><\/span>\n        <\/div>\n        <div class=\"qrw-field-wrap\">\n          <input type=\"text\" id=\"qrw-company\" placeholder=\"Company\" autocomplete=\"organization\" \/>\n          <span class=\"qrw-field-err\" id=\"qrw-err-company\"><\/span>\n        <\/div>\n        <button class=\"qrw-btn-access\" onclick=\"qrwSubmitGate()\">Get access<\/button>\n      <\/div>\n      <p class=\"qrw-privacy\">\ud83d\udd12 No spam, ever. Your details are only used to unlock access.<\/p>\n    <\/div>\n  <\/div>\n\n  <!-- TOOL -->\n  <div class=\"qrw-tool\" id=\"qrw-tool\">\n    <div class=\"qrw-welcome\">\n      <p id=\"qrw-welcome-msg\">Welcome back!<\/p>\n      <p class=\"qrw-tip\">Tip: Press Ctrl+D (Windows) or \u2318+D (Mac) to bookmark this page for quick access next time.<\/p>\n    <\/div>\n\n    <div class=\"qrw-builder\">\n      <!-- LEFT -->\n      <div class=\"qrw-left\">\n\n        <!-- Section 1: Content -->\n        <div class=\"qrw-section\">\n          <div class=\"qrw-section-head\">\n            <div class=\"qrw-section-icon\">\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"\/><path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"\/><\/svg>\n            <\/div>\n            <span class=\"qrw-section-title\">Enter content<\/span>\n          <\/div>\n          <div class=\"qrw-section-body\">\n            <!-- Tabs -->\n            <div class=\"qrw-tabs\">\n              <button class=\"qrw-tab active\" onclick=\"qrwTab('url',this)\">URL<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('text',this)\">TEXT<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('email',this)\">EMAIL<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('phone',this)\">PHONE<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('sms',this)\">SMS<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('whatsapp',this)\">WHATSAPP<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('vcard',this)\">VCARD<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('mecard',this)\">MECARD<\/button>\n              <button class=\"qrw-tab\" onclick=\"qrwTab('location',this)\">LOCATION<\/button>\n            <\/div>\n\n      <!-- URL -->\n      <div class=\"qrw-panel active\" id=\"qrw-panel-url\">\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Website URL<\/label>\n            <input class=\"qrw-input\" type=\"url\" id=\"qrw-url\" placeholder=\"https:\/\/yourwebsite.com\/page\" \/>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- TEXT -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-text\">\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Text<\/label>\n            <textarea class=\"qrw-input\" id=\"qrw-text\" placeholder=\"Enter any text to encode\u2026\"><\/textarea>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- EMAIL -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-email\">\n        <div class=\"qrw-form-grid\">\n          <div>\n            <label class=\"qrw-label\">To (email address)<\/label>\n            <input class=\"qrw-input\" type=\"email\" id=\"qrw-em-to\" placeholder=\"hello@company.com\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Subject<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-em-subject\" placeholder=\"Enquiry about\u2026\" \/>\n          <\/div>\n        <\/div>\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Body (optional)<\/label>\n            <textarea class=\"qrw-input\" id=\"qrw-em-body\" placeholder=\"Hi, I'd like to\u2026\"><\/textarea>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- PHONE -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-phone\">\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Phone number<\/label>\n            <input class=\"qrw-input\" type=\"tel\" id=\"qrw-phone\" placeholder=\"+60 12 345 6789\" \/>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- SMS -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-sms\">\n        <div class=\"qrw-form-grid\">\n          <div>\n            <label class=\"qrw-label\">Phone number<\/label>\n            <input class=\"qrw-input\" type=\"tel\" id=\"qrw-sms-phone\" placeholder=\"+60 12 345 6789\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Message (optional)<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-sms-msg\" placeholder=\"Hi, I'm interested in\u2026\" \/>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- WHATSAPP -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-whatsapp\">\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Phone number <span style=\"font-weight:400;color:#5A8A84;\">(with country code)<\/span><\/label>\n            <input class=\"qrw-input\" type=\"tel\" id=\"qrw-wa-phone\" placeholder=\"+60 12 345 6789\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Pre-filled message (optional)<\/label>\n            <textarea class=\"qrw-input\" id=\"qrw-wa-msg\" placeholder=\"Hi, I'd like to find out more\u2026\"><\/textarea>\n          <\/div>\n        <\/div>\n        <p style=\"font-size:12px;color:#5A8A84;margin-top:-4px;\">When scanned, this opens WhatsApp with your number and message pre-filled \u2014 no need to type.<\/p>\n      <\/div>\n\n      <!-- VCARD -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-vcard\">\n        <div class=\"qrw-form-grid\">\n          <div>\n            <label class=\"qrw-label\">First name<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-vc-first\" placeholder=\"Jane\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Last name<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-vc-last\" placeholder=\"Smith\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Phone<\/label>\n            <input class=\"qrw-input\" type=\"tel\" id=\"qrw-vc-phone\" placeholder=\"+60 12 345 6789\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Email<\/label>\n            <input class=\"qrw-input\" type=\"email\" id=\"qrw-vc-email\" placeholder=\"jane@company.com\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Company<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-vc-company\" placeholder=\"Acme Sdn Bhd\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Job title<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-vc-title\" placeholder=\"Marketing Manager\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Website<\/label>\n            <input class=\"qrw-input\" type=\"url\" id=\"qrw-vc-url\" placeholder=\"https:\/\/company.com\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Address<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-vc-address\" placeholder=\"123 Jalan Example, KL\" \/>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- MECARD -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-mecard\">\n        <div class=\"qrw-form-grid\">\n          <div>\n            <label class=\"qrw-label\">Name<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-mc-name\" placeholder=\"Jane Smith\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Phone<\/label>\n            <input class=\"qrw-input\" type=\"tel\" id=\"qrw-mc-phone\" placeholder=\"+60 12 345 6789\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Email<\/label>\n            <input class=\"qrw-input\" type=\"email\" id=\"qrw-mc-email\" placeholder=\"jane@company.com\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Website<\/label>\n            <input class=\"qrw-input\" type=\"url\" id=\"qrw-mc-url\" placeholder=\"https:\/\/company.com\" \/>\n          <\/div>\n        <\/div>\n        <div class=\"qrw-form-grid cols-1\">\n          <div>\n            <label class=\"qrw-label\">Note (optional)<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-mc-note\" placeholder=\"Marketing Manager at Acme\" \/>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- LOCATION -->\n      <div class=\"qrw-panel\" id=\"qrw-panel-location\">\n        <div class=\"qrw-form-grid\">\n          <div>\n            <label class=\"qrw-label\">Latitude<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-lat\" placeholder=\"3.1390\" \/>\n          <\/div>\n          <div>\n            <label class=\"qrw-label\">Longitude<\/label>\n            <input class=\"qrw-input\" type=\"text\" id=\"qrw-lng\" placeholder=\"101.6869\" \/>\n          <\/div>\n        <\/div>\n        <p style=\"font-size:12px;color:#5A8A84;margin-top:-4px;margin-bottom:12px;\">Find your coordinates at <a href=\"https:\/\/maps.google.com\" target=\"_blank\" style=\"color:#00C4B3;font-weight:600;\" rel=\"noopener\">maps.google.com<\/a> \u2014 right-click any point and copy the coordinates.<\/p>\n      <\/div>\n\n          <\/div><!-- \/section-body content -->\n        <\/div><!-- \/section content -->\n\n        <!-- Section 2: Set Colors -->\n        <div class=\"qrw-section\">\n          <div class=\"qrw-section-head\">\n            <div class=\"qrw-section-icon\">\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2a10 10 0 1 0 10 10c0-2.76-2.24-5-5-5h-1a1 1 0 0 1 0-2V4\"\/><circle cx=\"8\" cy=\"14\" r=\"1\"\/><circle cx=\"12\" cy=\"8\" r=\"1\"\/><circle cx=\"16\" cy=\"14\" r=\"1\"\/><\/svg>\n            <\/div>\n            <span class=\"qrw-section-title\">Set colours<\/span>\n          <\/div>\n          <div class=\"qrw-section-body\">\n            <div class=\"qrw-color-field\">\n              <span class=\"qrw-color-field-lbl\">Foreground colour<\/span>\n              <div class=\"qrw-color-input-row\">\n                <div class=\"qrw-color-swatch-wrap\">\n                  <input type=\"color\" id=\"qrw-color-dark\" value=\"#0294A5\" oninput=\"qrwSyncColor('dark',this.value)\" \/>\n                  <div class=\"qrw-color-swatch\" id=\"qrw-swatch-dark\" style=\"background:#0294A5;\"><\/div>\n                <\/div>\n                <input type=\"text\" class=\"qrw-hex-input\" id=\"qrw-hex-dark\" value=\"#0294A5\" maxlength=\"7\" oninput=\"qrwHexInput('dark',this.value)\" \/>\n              <\/div>\n            <\/div>\n            <div class=\"qrw-color-field\">\n              <span class=\"qrw-color-field-lbl\">Background colour<\/span>\n              <div class=\"qrw-color-input-row\">\n                <div class=\"qrw-color-swatch-wrap\">\n                  <input type=\"color\" id=\"qrw-color-light\" value=\"#ffffff\" oninput=\"qrwSyncColor('light',this.value)\" \/>\n                  <div class=\"qrw-color-swatch\" id=\"qrw-swatch-light\" style=\"background:#ffffff;\"><\/div>\n                <\/div>\n                <input type=\"text\" class=\"qrw-hex-input\" id=\"qrw-hex-light\" value=\"#FFFFFF\" maxlength=\"7\" oninput=\"qrwHexInput('light',this.value)\" \/>\n              <\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Section 3: Add Logo -->\n        <div class=\"qrw-section\">\n          <div class=\"qrw-section-head\">\n            <div class=\"qrw-section-icon\">\n              <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"\/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"\/><path d=\"M21 15l-5-5L5 21\"\/><\/svg>\n            <\/div>\n            <span class=\"qrw-section-title\">Add logo image<\/span>\n          <\/div>\n          <div class=\"qrw-section-body\">\n            <div class=\"qrw-logo-row\">\n              <label class=\"qrw-logo-upload-btn\" for=\"qrw-logo-input\">\n                Upload image\n                <input type=\"file\" id=\"qrw-logo-input\" accept=\"image\/*\" onchange=\"qrwLogoChange(this)\" style=\"display:none;\" \/>\n              <\/label>\n              <div class=\"qrw-logo-preview-wrap\" id=\"qrw-logo-preview-wrap\" style=\"display:none;\">\n                <img decoding=\"async\" id=\"qrw-logo-preview\" src=\"\" alt=\"logo\" \/>\n                <button class=\"qrw-logo-remove\" onclick=\"qrwLogoRemove()\" title=\"Remove\">\u2715<\/button>\n              <\/div>\n              <span class=\"qrw-logo-hint\" id=\"qrw-logo-hint\">PNG or SVG with transparent background works best<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Generate button -->\n        <button class=\"qrw-generate-btn\" onclick=\"qrwGenerate()\">Generate QR code<\/button>\n\n      <\/div><!-- \/left -->\n\n      <!-- RIGHT: QR preview + downloads -->\n      <div class=\"qrw-right\">\n        <div class=\"qrw-qr-card\">\n          <div class=\"qrw-qr-placeholder\" id=\"qrw-placeholder\">\n            <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00C4B3\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"\/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"\/><rect x=\"5\" y=\"5\" width=\"3\" height=\"3\" fill=\"#00C4B3\" stroke=\"none\"\/><rect x=\"16\" y=\"5\" width=\"3\" height=\"3\" fill=\"#00C4B3\" stroke=\"none\"\/><rect x=\"5\" y=\"16\" width=\"3\" height=\"3\" fill=\"#00C4B3\" stroke=\"none\"\/><line x1=\"14\" y1=\"14\" x2=\"14\" y2=\"14\"\/><rect x=\"14\" y=\"14\" width=\"3\" height=\"3\"\/><rect x=\"18\" y=\"18\" width=\"3\" height=\"3\"\/><rect x=\"14\" y=\"18\" width=\"3\" height=\"3\"\/><rect x=\"18\" y=\"14\" width=\"3\" height=\"3\"\/><\/svg>\n            <span>QR preview<\/span>\n          <\/div>\n          <canvas id=\"qrw-final-canvas\" width=\"200\" height=\"200\" style=\"display:none;border-radius:8px;margin:0 auto 16px;\"><\/canvas>\n          <div id=\"qrw-qr-canvas\" style=\"display:none;\"><\/div>\n          <div class=\"qrw-error-msg\" id=\"qrw-error\"><\/div>\n          <div class=\"qrw-dl-btns\" id=\"qrw-dl-btns\">\n            <button class=\"qrw-dl-btn-primary\" onclick=\"qrwDownload('png')\">\u2193 Download PNG<\/button>\n            <div class=\"qrw-dl-row\">\n              <button class=\"qrw-dl-btn\" onclick=\"qrwDownload('svg')\">.SVG<\/button>\n              <button class=\"qrw-dl-btn\" onclick=\"qrwDownload('pdf')\">.PDF<\/button>\n              <button class=\"qrw-dl-btn\" onclick=\"qrwDownload('eps')\">.EPS<\/button>\n            <\/div>\n          <\/div>\n        <\/div>\n      <\/div><!-- \/right -->\n\n    <\/div><!-- \/builder -->\n  <\/div><!-- \/tool -->\n\n  <!-- SUMMARY -->\n  <div class=\"qrw-summary\" id=\"qrw-summary\" style=\"display:none;\">\n    <div class=\"qrw-summary-inner\">\n\n      <div class=\"qrw-summary-hero\">\n        <h2>Create Professional QR Codes in Minutes<\/h2>\n        <p>Generate custom QR codes for websites, contact cards, WhatsApp, email, SMS, locations, and more. Add your logo, customize colors, and download high-quality files ready for digital or print use.<\/p>\n      <\/div>\n\n      <div class=\"qrw-steps\">\n        <div class=\"qrw-step\">\n          <div class=\"qrw-step-num\">1<\/div>\n          <div>\n            <div class=\"qrw-step-title\">Choose your QR code content<\/div>\n            <p class=\"qrw-step-body\">Select the type of QR code you want to create \u2014 website URL, text, email, phone, SMS, WhatsApp, contact card, or location. Fill in the details and you're ready to go.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"qrw-step\">\n          <div class=\"qrw-step-num\">2<\/div>\n          <div>\n            <div class=\"qrw-step-title\">Customise your design<\/div>\n            <p class=\"qrw-step-body\">Change foreground and background colors, upload your company logo, and create branded QR codes for campaigns, packaging, events, menus, and marketing materials.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"qrw-step\">\n          <div class=\"qrw-step-num\">3<\/div>\n          <div>\n            <div class=\"qrw-step-title\">Generate and preview<\/div>\n            <p class=\"qrw-step-body\">Click Generate QR Code to instantly create your design. Test it with your smartphone camera before downloading. Every QR code uses high error correction so logos don't affect scannability.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"qrw-step\">\n          <div class=\"qrw-step-num\">4<\/div>\n          <div>\n            <div class=\"qrw-step-title\">Download and use anywhere<\/div>\n            <p class=\"qrw-step-body\">Export as PNG (digital), SVG (design editing), PDF (documents), or EPS (large-scale print). All files are high resolution \u2014 sharp across both digital and print.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"qrw-reasons\">\n        <div class=\"qrw-reason\">\n          <div class=\"qrw-reason-icon\">\u25c8<\/div>\n          <div class=\"qrw-reason-title\">Logo-ready<\/div>\n          <p class=\"qrw-reason-body\">Add your logo without compromising scannability. Advanced error correction keeps it reliable.<\/p>\n        <\/div>\n        <div class=\"qrw-reason\">\n          <div class=\"qrw-reason-icon\">\u2b21<\/div>\n          <div class=\"qrw-reason-title\">High-resolution downloads<\/div>\n          <p class=\"qrw-reason-body\">Print-ready files for business cards, packaging, posters, brochures, menus, and signage.<\/p>\n        <\/div>\n        <div class=\"qrw-reason\">\n          <div class=\"qrw-reason-icon\">\u2726<\/div>\n          <div class=\"qrw-reason-title\">Free to use<\/div>\n          <p class=\"qrw-reason-body\">Unlimited QR codes at no cost. No subscriptions, no watermarks, no hidden fees.<\/p>\n        <\/div>\n      <\/div>\n\n    <\/div>\n  <\/div>\n\n  <!-- FOOTER -->\n  <div class=\"qrw-footer\">\n    QR Creator Pro powered by <a href=\"https:\/\/eber.co\" target=\"_blank\">eber<\/a>\n  <\/div>\n\n<\/div>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/qrcodejs@1.0.0\/qrcode.min.js\"><\/script>\n<script>\n(function(){\n\n  var BREVO_KEY = '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';\n  var BREVO_LIST = 32;\n  var activeTab = 'url';\n  var qrObj = null;\n  var lastQrStr = '';\n  var logoDataUrl = null;\n\n  \/* \u2500\u2500 INIT \u2500\u2500 *\/\n  window.addEventListener('DOMContentLoaded', function(){\n    var saved = null;\n    try{ saved = JSON.parse(localStorage.getItem('qrUser')); } catch(e){}\n    if(saved && saved.email){ showTool(saved.firstname || 'there'); }\n  });\n\n  \/* \u2500\u2500 COLOR SYNC \u2500\u2500 *\/\n  window.qrwSyncColor = function(which, val){\n    document.getElementById('qrw-swatch-' + which).style.background = val;\n    document.getElementById('qrw-hex-' + which).value = val.toUpperCase();\n  };\n  window.qrwHexInput = function(which, val){\n    var clean = val.startsWith('#') ? val : '#' + val;\n    if(\/^#[0-9A-Fa-f]{6}$\/.test(clean)){\n      document.getElementById('qrw-color-' + which).value = clean;\n      document.getElementById('qrw-swatch-' + which).style.background = clean;\n    }\n  };\n  \/\/ Keep old name as alias for safety\n  window.qrwUpdateSwatch = window.qrwSyncColor;\n\n  \/* \u2500\u2500 LOGO UPLOAD \u2500\u2500 *\/\n  window.qrwLogoChange = function(input){\n    if(!input.files || !input.files[0]) return;\n    var reader = new FileReader();\n    reader.onload = function(e){\n      logoDataUrl = e.target.result;\n      var prev = document.getElementById('qrw-logo-preview');\n      prev.src = logoDataUrl;\n      document.getElementById('qrw-logo-preview-wrap').style.display = 'inline-flex';\n      document.getElementById('qrw-logo-hint').style.display = 'none';\n    };\n    reader.readAsDataURL(input.files[0]);\n  };\n\n  window.qrwLogoRemove = function(){\n    logoDataUrl = null;\n    document.getElementById('qrw-logo-input').value = '';\n    document.getElementById('qrw-logo-preview-wrap').style.display = 'none';\n    document.getElementById('qrw-logo-hint').style.display = 'inline';\n  };\n\n  \/* \u2500\u2500 GATE \u2500\u2500 *\/\n  window.qrwSubmitGate = function(){\n    var nameVal  = document.getElementById('qrw-name').value.trim();\n    var emailVal = document.getElementById('qrw-email').value.trim();\n    var company  = document.getElementById('qrw-company').value.trim();\n    var ok = true;\n    function setErr(id,msg){ document.getElementById(id).textContent = msg; }\n    setErr('qrw-err-name',''); setErr('qrw-err-email',''); setErr('qrw-err-company','');\n    if(!nameVal){ setErr('qrw-err-name','Please enter your name.'); ok=false; }\n    if(!emailVal||!emailVal.includes('@')){ setErr('qrw-err-email','Please enter a valid work email.'); ok=false; }\n    if(!company){ setErr('qrw-err-company','Please enter your company.'); ok=false; }\n    if(!ok) return;\n    var parts = nameVal.split(' ');\n    var firstname = parts[0]; var lastname = parts.slice(1).join(' ')||'';\n    try{ localStorage.setItem('qrUser', JSON.stringify({firstname:firstname,lastname:lastname,company:company,email:emailVal})); } catch(e){}\n    fetch('https:\/\/api.brevo.com\/v3\/contacts',{\n      method:'POST',\n      headers:{'api-key':BREVO_KEY,'Content-Type':'application\/json'},\n      body:JSON.stringify({email:emailVal,attributes:{FIRSTNAME:firstname,LASTNAME:lastname,COMPANY:company},listIds:[BREVO_LIST],updateEnabled:true})\n    }).catch(function(){});\n    showTool(firstname);\n  };\n\n  function showTool(name){\n    document.getElementById('qrw-hero').style.display = 'none';\n    document.getElementById('qrw-gate').style.display = 'none';\n    document.getElementById('qrw-tool').style.display = 'block';\n    document.getElementById('qrw-summary').style.display = 'block';\n    document.getElementById('qrw-welcome-msg').textContent = 'Welcome back, ' + name + ' \ud83d\udc4b';\n  }\n\n  \/* \u2500\u2500 TABS \u2500\u2500 *\/\n  window.qrwTab = function(tab, btn){\n    activeTab = tab;\n    document.querySelectorAll('.qrw-tab').forEach(function(b){ b.classList.remove('active'); });\n    btn.classList.add('active');\n    document.querySelectorAll('.qrw-panel').forEach(function(p){ p.classList.remove('active'); });\n    document.getElementById('qrw-panel-' + tab).classList.add('active');\n    qrwReset();\n  };\n\n  \/* \u2500\u2500 BUILD QR STRING \u2500\u2500 *\/\n  function buildStr(){\n    var e = document.getElementById.bind(document);\n    function v(id){ return (e(id) ? e(id).value.trim() : ''); }\n    if(activeTab==='url'){\n      var url=v('qrw-url'); if(!url) return {err:'Please enter a URL.'};\n      if(!url.startsWith('http')) return {err:'URL must start with http:\/\/ or https:\/\/'};\n      return {str:url};\n    }\n    if(activeTab==='text'){ var t=v('qrw-text'); if(!t) return {err:'Please enter some text.'}; return {str:t}; }\n    if(activeTab==='email'){\n      var to=v('qrw-em-to'); if(!to||!to.includes('@')) return {err:'Please enter a valid email address.'};\n      var subj=v('qrw-em-subject'); var body=v('qrw-em-body');\n      var s='mailto:'+to; var ps=[];\n      if(subj) ps.push('subject='+encodeURIComponent(subj));\n      if(body)  ps.push('body='+encodeURIComponent(body));\n      if(ps.length) s+='?'+ps.join('&');\n      return {str:s};\n    }\n    if(activeTab==='phone'){ var ph=v('qrw-phone').replace(\/\\s\/g,''); if(!ph) return {err:'Please enter a phone number.'}; return {str:'tel:'+ph}; }\n    if(activeTab==='sms'){\n      var sph=v('qrw-sms-phone').replace(\/\\s\/g,''); if(!sph) return {err:'Please enter a phone number.'};\n      var smsg=v('qrw-sms-msg'); var s2='smsto:'+sph; if(smsg) s2+=':'+smsg; return {str:s2};\n    }\n    if(activeTab==='whatsapp'){\n      var waph=v('qrw-wa-phone').replace(\/[\\s\\-\\+\\(\\)]\/g,'');\n      if(!waph) return {err:'Please enter a phone number.'};\n      var wamsg=v('qrw-wa-msg');\n      var wa='https:\/\/wa.me\/'+waph;\n      if(wamsg) wa+='?text='+encodeURIComponent(wamsg);\n      return {str:wa};\n    }\n    if(activeTab==='vcard'){\n      var fn=v('qrw-vc-first'); var ln=v('qrw-vc-last');\n      if(!fn&&!ln) return {err:'Please enter at least a name.'};\n      var vc=['BEGIN:VCARD','VERSION:3.0','N:'+ln+';'+fn,'FN:'+(fn+' '+ln).trim()];\n      if(v('qrw-vc-phone'))   vc.push('TEL:'+v('qrw-vc-phone').replace(\/\\s\/g,''));\n      if(v('qrw-vc-email'))   vc.push('EMAIL:'+v('qrw-vc-email'));\n      if(v('qrw-vc-company')) vc.push('ORG:'+v('qrw-vc-company'));\n      if(v('qrw-vc-title'))   vc.push('TITLE:'+v('qrw-vc-title'));\n      if(v('qrw-vc-url'))     vc.push('URL:'+v('qrw-vc-url'));\n      if(v('qrw-vc-address')) vc.push('ADR:;;'+v('qrw-vc-address')+';;;;');\n      vc.push('END:VCARD'); return {str:vc.join('\\n')};\n    }\n    if(activeTab==='mecard'){\n      var mn=v('qrw-mc-name'); if(!mn) return {err:'Please enter a name.'};\n      var mc='MECARD:N:'+mn+';';\n      if(v('qrw-mc-phone')) mc+='TEL:'+v('qrw-mc-phone').replace(\/\\s\/g,'')+';';\n      if(v('qrw-mc-email')) mc+='EMAIL:'+v('qrw-mc-email')+';';\n      if(v('qrw-mc-url'))   mc+='URL:'+v('qrw-mc-url')+';';\n      if(v('qrw-mc-note'))  mc+='NOTE:'+v('qrw-mc-note')+';';\n      mc+=';'; return {str:mc};\n    }\n    if(activeTab==='location'){\n      var lat=v('qrw-lat'); var lng=v('qrw-lng');\n      if(!lat||!lng) return {err:'Please enter both latitude and longitude.'};\n      return {str:'geo:'+lat+','+lng};\n    }\n    return {err:'Unknown type.'};\n  }\n\n  \/* \u2500\u2500 COMPOSITE: draw QR + optional logo onto a canvas of given size \u2500\u2500 *\/\n  function compositeQR(size, srcCanvas, callback){\n    var out = document.createElement('canvas');\n    out.width = size; out.height = size;\n    var ctx = out.getContext('2d');\n    ctx.imageSmoothingEnabled = true;\n    ctx.imageSmoothingQuality = 'high';\n\n    \/\/ Fill background colour\n    var bgCol = document.getElementById('qrw-color-light').value || '#ffffff';\n    ctx.fillStyle = bgCol;\n    ctx.fillRect(0, 0, size, size);\n\n    \/\/ Draw QR\n    ctx.drawImage(srcCanvas, 0, 0, size, size);\n\n    if(logoDataUrl){\n      var img = new Image();\n      img.onload = function(){\n        var logoSize = size * 0.22;\n        var lx = (size - logoSize) \/ 2;\n        var ly = (size - logoSize) \/ 2;\n        var pad = logoSize * 0.18;\n        \/\/ White backing behind logo\n        ctx.fillStyle = bgCol;\n        ctx.beginPath();\n        if(ctx.roundRect){\n          ctx.roundRect(lx - pad, ly - pad, logoSize + pad*2, logoSize + pad*2, 6);\n        } else {\n          ctx.rect(lx - pad, ly - pad, logoSize + pad*2, logoSize + pad*2);\n        }\n        ctx.fill();\n        \/\/ Draw logo at logoSize using high-quality smoothing\n        ctx.imageSmoothingEnabled = true;\n        ctx.imageSmoothingQuality = 'high';\n        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, lx, ly, logoSize, logoSize);\n        callback(out);\n      };\n      img.onerror = function(){ callback(out); };\n      img.src = logoDataUrl;\n    } else {\n      callback(out);\n    }\n  }\n\n  \/* \u2500\u2500 GENERATE \u2500\u2500 *\/\n  window.qrwGenerate = function(){\n    var result = buildStr();\n    var errEl = document.getElementById('qrw-error');\n    if(result.err){ errEl.textContent = result.err; return; }\n    errEl.textContent = '';\n    lastQrStr = result.str;\n\n    \/\/ Track generate count in Brevo\n    var saved = null;\n    try{ saved = JSON.parse(localStorage.getItem('qrUser')); } catch(e){}\n    if(saved && saved.email){\n      var currentCount = (saved.generateCount || 0) + 1;\n      saved.generateCount = currentCount;\n      try{ localStorage.setItem('qrUser', JSON.stringify(saved)); } catch(e){}\n      fetch('https:\/\/api.brevo.com\/v3\/contacts\/' + encodeURIComponent(saved.email), {\n        method: 'PUT',\n        headers: {'api-key': BREVO_KEY, 'Content-Type': 'application\/json'},\n        body: JSON.stringify({\n          attributes: {\n            QR_GENERATE_COUNT: currentCount,\n            QR_LAST_TYPE: activeTab.toUpperCase(),\n            QR_LAST_GENERATED: new Date().toISOString().slice(0,10)\n          }\n        })\n      }).catch(function(){});\n    }\n\n    var darkCol  = document.getElementById('qrw-color-dark').value  || '#0294A5';\n    var lightCol = document.getElementById('qrw-color-light').value || '#ffffff';\n\n    \/\/ Render QR into hidden div at 120px\n    var hidden = document.getElementById('qrw-qr-canvas');\n    hidden.innerHTML = '';\n\n    var qrTmp = new QRCode(hidden, {\n      text: result.str,\n      width: 1000, height: 1000,\n      colorDark: darkCol,\n      colorLight: lightCol,\n      correctLevel: QRCode.CorrectLevel.H  \/\/ H = higher error correction, needed for logo\n    });\n\n    \/\/ After QR renders (slight delay for img fallback browsers)\n    setTimeout(function(){\n      var srcCanvas = hidden.querySelector('canvas');\n      if(!srcCanvas){ errEl.textContent = 'Could not render QR. Try a different browser.'; return; }\n\n      \/\/ Always composite at full 1000px, then draw down to preview\n      compositeQR(1000, srcCanvas, function(hiResCanvas){\n        var display = document.getElementById('qrw-final-canvas');\n        var dpr = window.devicePixelRatio || 1;\n        var displaySize = 200;\n        display.width = displaySize * dpr;\n        display.height = displaySize * dpr;\n        display.style.width = displaySize + 'px';\n        display.style.height = displaySize + 'px';\n        var dCtx = display.getContext('2d');\n        dCtx.imageSmoothingEnabled = true;\n        dCtx.imageSmoothingQuality = 'high';\n        dCtx.scale(dpr, dpr);\n        dCtx.drawImage(hiResCanvas, 0, 0, 1000, 1000, 0, 0, displaySize, displaySize);\n        document.getElementById('qrw-placeholder').style.display = 'none';\n        display.style.display = 'block';\n        document.getElementById('qrw-dl-btns').style.display = 'flex';\n      });\n    }, 100);\n  };\n\n  \/* \u2500\u2500 DOWNLOAD \u2500\u2500 *\/\n  window.qrwDownload = function(fmt){\n    var srcCanvas = document.getElementById('qrw-qr-canvas').querySelector('canvas');\n    if(!srcCanvas){ alert('Please generate a QR code first.'); return; }\n\n    var SIZE = 1000;\n    compositeQR(SIZE, srcCanvas, function(hiRes){\n      if(fmt === 'png'){\n        qrwTriggerDownload(hiRes.toDataURL('image\/png'), 'qr-code.png');\n        return;\n      }\n      if(fmt === 'svg'){\n        var dataUrl = hiRes.toDataURL('image\/png');\n        var svgStr = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' +\n          '<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" ' +\n          'width=\"1024\" height=\"1024\" viewBox=\"0 0 1024 1024\">\\n' +\n          '<rect width=\"1024\" height=\"1024\" fill=\"' + (document.getElementById('qrw-color-light').value||'#ffffff') + '\"\/>\\n' +\n          '<image x=\"0\" y=\"0\" width=\"1024\" height=\"1024\" xlink:href=\"' + dataUrl + '\"\/>\\n' +\n          '<\/svg>';\n        qrwTriggerDownload('data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(svgStr), 'qr-code.svg');\n        return;\n      }\n      if(fmt === 'pdf'){\n        var imgSrc = hiRes.toDataURL('image\/png');\n        var printWin = window.open('', '_blank');\n        if(printWin){\n          printWin.document.write('<html><head><title>QR Code<\/title><style>@page{margin:0}body{margin:0;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fff;}img{width:80vmin;height:80vmin;}<\/style><\/head><body><img decoding=\"async\" src=\"' + imgSrc + '\" \/><\/body><\/html>');\n          printWin.document.close();\n          printWin.focus();\n          setTimeout(function(){ printWin.print(); }, 400);\n        }\n        return;\n      }\n      if(fmt === 'eps'){\n        var ctx2 = hiRes.getContext('2d');\n        var imgData = ctx2.getImageData(0, 0, SIZE, SIZE);\n        var pixels = imgData.data;\n        var hexLines = [];\n        for(var row = 0; row < SIZE; row++){\n          var line = '';\n          for(var col = 0; col < SIZE; col++){\n            var idx = (row * SIZE + col) * 4;\n            line += ('0'+pixels[idx].toString(16)).slice(-2) +\n                    ('0'+pixels[idx+1].toString(16)).slice(-2) +\n                    ('0'+pixels[idx+2].toString(16)).slice(-2);\n          }\n          hexLines.push(line);\n        }\n        var epsStr = '%!PS-Adobe-3.0 EPSF-3.0\\n%%BoundingBox: 0 0 '+SIZE+' '+SIZE+'\\n%%EndComments\\n' +\n          SIZE+' '+SIZE+' 8 ['+SIZE+' 0 0 -'+SIZE+' 0 '+SIZE+']\\n' +\n          '{currentfile '+(SIZE*3)+' string readhexstring pop}\\nfalse 3\\ncolorimage\\n' +\n          hexLines.join('\\n')+'\\n%%EOF';\n        qrwTriggerDownload('data:application\/postscript;charset=utf-8,' + encodeURIComponent(epsStr), 'qr-code.eps');\n        return;\n      }\n    });\n  };\n\n  function qrwTriggerDownload(href, filename){\n    var a = document.createElement('a');\n    a.href = href; a.download = filename;\n    document.body.appendChild(a); a.click(); document.body.removeChild(a);\n  }\n\n  \/* \u2500\u2500 RESET \u2500\u2500 *\/\n  function qrwReset(){\n    document.getElementById('qrw-qr-canvas').innerHTML = '';\n    var fc = document.getElementById('qrw-final-canvas');\n    fc.style.display = 'none';\n    fc.getContext('2d').clearRect(0,0,fc.width,fc.height);\n    document.getElementById('qrw-placeholder').style.display = 'flex';\n    document.getElementById('qrw-dl-btns').style.display = 'none';\n    document.getElementById('qrw-error').textContent = '';\n    lastQrStr = '';\n    qrObj = null;\n  }\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Free tool QR Creator Pro The free QR code generator built for marketers. Get free access One-time sign-up \u2014 your tool stays unlocked every time you return. Get access \ud83d\udd12 No spam, ever. Your details are only used to unlock access. Welcome back! Tip: Press Ctrl+D (Windows) or \u2318+D (Mac) to bookmark this page for [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":11215,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11248","page","type-page","status-publish","hentry"],"blocksy_meta":[],"featured_image_src":null,"featured_image_src_square":null,"_links":{"self":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/comments?post=11248"}],"version-history":[{"count":0,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11248\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/pages\/11215"}],"wp:attachment":[{"href":"https:\/\/eber.co\/wp-json\/wp\/v2\/media?parent=11248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}