'; var blob = new Blob([doc], { type: 'text/html;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'email-signature.html'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } function buildPublishUrl(baseUrl, draft) { if (window.TagifyPublicDraft && window.TagifyPublicDraft.buildPublishUrl) { return window.TagifyPublicDraft.buildPublishUrl(baseUrl, draft); } return String(baseUrl || 'https://id.nfctagify.com/portal/signup').split('#')[0]; } function socialIconsConfig() { var cfg = window.__TAGIFY_PUBLIC_ESIG__ || {}; return cfg.socialIcons || null; } function layoutMini(kind) { if (kind === 'side') { return '
'; } if (kind === 'compact') { return '
'; } return '
'; } function field(name, label, optional, type) { if (studio()) return studio().field(name, label, { optional: optional, type: type }); return ( '' ); } function mountForm(root, cfg, initialDraft) { var signupUrl = cfg.signupUrl || 'https://id.nfctagify.com/portal/signup'; var qrPageUrl = cfg.qrPageUrl || '/pages/qr-code-generator'; var cardPageUrl = cfg.cardPageUrl || '/pages/digital-business-card-maker'; var enrichApiUrl = String(cfg.enrichApiUrl || '').trim(); var draft = Object.assign(emptyDraft(), initialDraft || readDraft()); var lastHtml = ''; var enrichSlot = (window.TagifyPublicEnrich && window.TagifyPublicEnrich.slotHtml) ? window.TagifyPublicEnrich.slotHtml() : ''; var st = studio(); var detailsBody = field('fullName', 'Full name') + '
' + field('jobTitle', 'Job title', true) + field('company', 'Company', true) + '
' + '
' + field('email', 'Work email', true, 'email') + field('phone', 'Phone', true, 'tel') + '
' + field('website', 'Website', true, 'url') + enrichSlot; var styleBody = '
' + LAYOUTS.map(function (l) { return ( '' ); }).join('') + '
' + '' + (st ? st.colorField('brandColor', 'Colour', '#0f172a') : '') + field('photoUrl', 'Photo URL', true, 'url') + field('logoUrl', 'Logo URL', true, 'url'); var moreBody = (st ? st.socialFieldsHost(draft) : field('linkedin', 'LinkedIn', true, 'url')) + field('address', 'Address', true) + ''; var convertHtml = st ? st.convertCard({ signupUrl: signupUrl, cta: 'Create my free digital card' }) : ''; var kitHtml = st ? st.kitSection([ { name: 'Contact QR', url: qrPageUrl, icon: '▣' }, { name: 'Digital business card', url: cardPageUrl, icon: '◈' } ]) : ''; var previewBody = (st ? st.previewLabel(true) : '
Live preview
') + '
' + '' + '
' + '
' + '
' + '
' + '
' + '' + '' + '
' + '

' + convertHtml; root.innerHTML = '
' + (st ? st.editorShell({ detailsHtml: detailsBody, styleHtml: styleBody, moreHtml: moreBody, previewHtml: previewBody, formClass: 'tpt-editor tpe__form', previewClass: 'tpt-preview tpe__result' }) : '') + kitHtml + '

Details stay in your browser until you create an account.

' + '
'; if (st) st.bindTabs(root); var form = root.querySelector('form'); var previewEl = root.querySelector('[data-preview]'); var statusEl = root.querySelector('[data-status]'); var convertEl = root.querySelector('[data-convert]'); function fillForm() { if (window.TagifyPublicDraft && window.TagifyPublicDraft.fillForm) { window.TagifyPublicDraft.fillForm(form, draft); Array.prototype.forEach.call(form.elements, function (el) { if (!el.name) return; if (el.type === 'radio') el.checked = el.value === (draft.layout || 'stacked'); if (el.type === 'checkbox' && el.name === 'includeQr') el.checked = draft.includeQr !== false; }); return; } Array.prototype.forEach.call(form.elements, function (el) { if (!el.name) return; if (el.type === 'radio') { el.checked = el.value === (draft.layout || 'stacked'); } else if (el.type === 'checkbox') { el.checked = draft.includeQr !== false; } else if (draft[el.name] != null) { el.value = draft[el.name]; } }); if (st) st.writeSocialFields(form, draft); } function collect() { var data; if (window.TagifyPublicDraft) data = window.TagifyPublicDraft.collectFromForm(form); else { data = emptyDraft(); Array.prototype.forEach.call(form.elements, function (el) { if (!el.name) return; if (el.type === 'radio') { if (el.checked) data.layout = el.value; } else if (el.type === 'checkbox') { data.includeQr = el.checked; } else if (Object.prototype.hasOwnProperty.call(data, el.name)) { data[el.name] = el.value; } }); if (st) { var socials = st.readSocialFields(form); data.linkedin = socials.linkedin; data.socialLinks = socials.socialLinks; } } var layoutEl = form.querySelector('[name="layout"]:checked'); if (layoutEl) data.layout = layoutEl.value; var qrEl = form.querySelector('[name="includeQr"]'); if (qrEl) data.includeQr = qrEl.checked; return data; } function paintErrors(errors) { Array.prototype.forEach.call(root.querySelectorAll('[data-error]'), function (el) { el.textContent = (errors && errors[el.getAttribute('data-error')]) || ''; }); } function setStatus(msg) { statusEl.textContent = msg || ''; } function refreshSignupCta() { var signupCta = root.querySelector('[data-signup-cta]'); if (signupCta) signupCta.href = buildPublishUrl(signupUrl, draft); } function effectivePreview(result) { if (result.canPreview) { return { draft: result.previewDraft, isExample: false }; } var ex = studio() ? studio().EXAMPLE : { fullName: 'Alex Morgan', jobTitle: 'Marketing Director', company: 'Northstar Studio', phone: '+44 20 1234 5678', email: 'alex@northstar.studio', website: 'https://northstar.studio', brandColor: '#455241', layout: draft.layout || 'stacked', includeQr: draft.includeQr !== false }; return { draft: Object.assign({}, emptyDraft(), ex, { layout: draft.layout || 'stacked', includeQr: draft.includeQr !== false, brandColor: draft.brandColor || ex.brandColor }), isExample: true }; } function refresh() { var result = validate(collect()); draft = result.draft; saveOwned(draft, form); // Soft validation: hide "required" noise until the visitor has started typing. paintErrors(studio() && studio().hasUserInput(draft) ? result.errors : {}); refreshSignupCta(); var eff = effectivePreview(result); if (studio()) studio().setPreviewMode(root, eff.isExample); var qrPromise = eff.draft.includeQr ? qrDataUrl(buildVCard(eff.draft)) : Promise.resolve(''); return qrPromise.then(function (qrUrl) { lastHtml = buildSignatureHtml(eff.draft, qrUrl); previewEl.innerHTML = lastHtml; if (eff.isExample) setStatus(''); else setStatus(result.ok ? '' : 'Fix the highlighted fields before copying.'); }).catch(function () { lastHtml = buildSignatureHtml(eff.draft, ''); previewEl.innerHTML = lastHtml; setStatus('Signature ready (QR unavailable).'); }); } form.addEventListener('input', refresh); form.addEventListener('change', refresh); form.addEventListener('submit', function (e) { e.preventDefault(); refresh(); }); root.querySelector('[data-action="clear"]').addEventListener('click', function () { if (window.TagifyPublicDraft) { window.TagifyPublicDraft.clearContact(); window.TagifyPublicDraft.patch({ layout: 'stacked', includeQr: true }, { allowClear: true }); } mount(root); }); root.querySelector('[data-action="copy"]').addEventListener('click', function () { refresh().then(function () { var check = validate(collect()); paintErrors(check.errors); if (!check.ok || !check.canPreview || !lastHtml) { setStatus('Fix the highlighted fields before copying.'); return; } copyRichHtml(lastHtml).then(function (ok) { setStatus(ok ? 'Signature copied. Paste into your email client.' : 'Copy failed. Try Download HTML.'); if (ok) { if (convertEl) convertEl.hidden = false; refreshSignupCta(); } }); }); }); root.querySelector('[data-action="download"]').addEventListener('click', function () { refresh().then(function () { var check = validate(collect()); paintErrors(check.errors); if (!check.ok || !check.canPreview || !lastHtml) { setStatus('Fix the highlighted fields before downloading.'); return; } downloadHtml(lastHtml); setStatus('HTML downloaded.'); if (convertEl) convertEl.hidden = false; refreshSignupCta(); }); }); function applyEnrichDraft(next) { if (window.TagifyPublicDraft) { window.TagifyPublicDraft.patch(next || {}, { allowClear: true }); draft = Object.assign(emptyDraft(), window.TagifyPublicDraft.read()); } else { draft = Object.assign(emptyDraft(), next || {}); saveOwned(draft, form); } if (st) st.refreshSocialFields(form, draft); fillForm(); refresh(); } if (enrichApiUrl && window.TagifyPublicEnrich) { window.TagifyPublicEnrich.bind({ root: root, form: form, enrichApiUrl: enrichApiUrl, signupUrl: signupUrl, defaultBrandColor: DEFAULT_BRAND, iconMap: socialIconsConfig(), getDraft: function () { return window.TagifyPublicDraft ? window.TagifyPublicDraft.read() : Object.assign(emptyDraft(), collect()); }, applyDraft: applyEnrichDraft }); } fillForm(); refresh(); } function mount(root) { mountForm(root, window.__TAGIFY_PUBLIC_ESIG__ || {}, readDraft()); } function boot() { var root = document.getElementById(ROOT_ID); if (!root) return; mount(root); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();