amp-web-push-widget button.amp-subscribe { display: inline-flex; align-items: center; border-radius: 5px; border: 0; box-sizing: border-box; margin: 0; padding: 10px 15px; cursor: pointer; outline: none; font-size: 15px; font-weight: 500; background: #4A90E2; margin-top: 7px; color: white; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.5); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .amp-logo amp-img{width:190px} .amp-menu input{display:none;}.amp-menu li.menu-item-has-children ul{display:none;}.amp-menu li{position:relative;display:block;}.amp-menu > li a{display:block;} /* Inline styles */ option.acss294cd{font-family:${f.css};} .icon-widgets:before {content: "\e1bd";}.icon-search:before {content: "\e8b6";}.icon-shopping-cart:after {content: "\e8cc";}

Quote Designer Tool

About This Quote Designer Tool

Our quote designer tool makes it easy to create beautiful, layered text designs for cutting machines like Cricut or Silhouette. You can experiment with up to four lines of text, mix and match fonts (both script and standard), and fine-tune the size, bold, italic, and spacing of each line. The live preview lets you see every adjustment instantly before downloading your finished quote as an SVG file — ready for cutting, vinyl decals, wall art, or print projects. It’s fast, flexible, and beginner-friendly.

Below is an example of a quote made with the designer. This was done in 60 seconds showing how quick and easy the Quote Designer Tool is to use.

Quote Designer — Crafty Crafter Club
Live preview
1000 × 500 px

Cricut-ready: text is exported as outlined paths — no font issues in Design Space.

${['left','center','right'].map(a => `` ).join('')}
`; container.appendChild(card); }); attachCardListeners(); } function attachCardListeners() { // Text inputs container.querySelectorAll('input[data-field="text"]').forEach(el => { el.addEventListener('input', e => { const l = findLine(e.target.dataset.id); if(l) { l.text = e.target.value; updatePreviewText(l); renderSVG(); } }); }); // Selects and number inputs container.querySelectorAll('select[data-field], input[type=number][data-field]').forEach(el => { el.addEventListener('input', e => { const l = findLine(e.target.dataset.id); if(!l) return; const field = e.target.dataset.field; l[field] = (e.target.type === 'number') ? +e.target.value : e.target.value; renderSVG(); }); }); // Bold / Italic toggles container.querySelectorAll('.tog').forEach(btn => { btn.addEventListener('click', e => { const l = findLine(btn.dataset.id); if(!l) return; const field = btn.dataset.field; l[field] = !l[field]; btn.classList.toggle('active', l[field]); renderSVG(); }); }); // Align buttons container.querySelectorAll('.align-btn').forEach(btn => { btn.addEventListener('click', e => { const l = findLine(btn.dataset.id); if(!l) return; l.align = btn.dataset.align; container.querySelectorAll(`.align-btn[data-id="${l.id}"]`).forEach(b => b.classList.toggle('active', b.dataset.align === l.align) ); renderSVG(); }); }); // Delete buttons container.querySelectorAll('.del-btn').forEach(btn => { btn.addEventListener('click', e => { lines = lines.filter(l => String(l.id) !== btn.dataset.id); renderCards(); renderSVG(); }); }); } function findLine(id) { return lines.find(l => String(l.id) === String(id)); } function updatePreviewText(line) { const el = document.getElementById(`lpv-${line.id}`); if(el) el.textContent = line.text || 'empty'; } // ── Build SVG (live preview version — uses live text for speed) ── function buildSVGMarkup(forExport = false) { const w = +canvasW.value || 1000; const h = +canvasH.value || 500; const pad = +paddingEl.value || 40; const spacing = +globalSpacing.value || 1.25; const vAlign = vAlignEl.value; const activeLines = lines.filter(l => l.text.trim()); // Calculate total block height for vertical alignment const lineHeights = activeLines.map(l => l.size * spacing); const totalH = lineHeights.reduce((a,b) => a+b, 0); let startY; if(vAlign === 'top') startY = pad; else if(vAlign === 'bottom') startY = h - pad - totalH; else startY = (h - totalH) / 2; // center const textEls = activeLines.map((line, i) => { const prevHeights = lineHeights.slice(0,i).reduce((a,b)=>a+b,0); const y = startY + prevHeights + line.yOff; let x, anchor; if(line.align === 'left') { x = pad + line.xOff; anchor = 'start'; } else if(line.align === 'right') { x = w - pad + line.xOff; anchor = 'end'; } else { x = w/2 + line.xOff; anchor = 'middle'; } const weight = line.bold ? '700' : '400'; const style = line.italic ? 'italic' : 'normal'; if(forExport) { // For export: use text element (path conversion done via canvas trick below) return ` ${escText(line.text)}`; } else { return ` ${escText(line.text)}`; } }); const googleFonts = forExport ? '' : ` `; return `${googleFonts} ${textEls.join('\n')} `; } // ── Render preview ── function renderSVG() { const w = +canvasW.value || 1000; const h = +canvasH.value || 500; previewDims.textContent = `${w} × ${h} px`; const markup = buildSVGMarkup(false); svgPreview.setAttribute('viewBox', `0 0 ${w} ${h}`); svgPreview.setAttribute('width', w); svgPreview.setAttribute('height', h); svgPreview.style.maxWidth = '100%'; svgPreview.style.maxHeight = 'calc(100vh - 260px)'; svgPreview.innerHTML = markup.replace(/^]*>/, '').replace(/<\/svg>$/, ''); } // ── Export: convert text to paths using browser canvas ── async function exportSVG() { statusEl.textContent = 'Preparing…'; const w = +canvasW.value || 1000; const h = +canvasH.value || 500; const pad = +paddingEl.value || 40; const spacing = +globalSpacing.value || 1.25; const vAlign = vAlignEl.value; const activeLines = lines.filter(l => l.text.trim()); if(!activeLines.length) { statusEl.textContent = 'Add some text first!'; setTimeout(() => statusEl.textContent = '', 2000); return; } // Wait for fonts to be fully loaded try { await document.fonts.ready; } catch(e) {} // Use an offscreen canvas to convert text to paths const offscreen = document.createElement('canvas'); offscreen.width = w; offscreen.height = h; const ctx = offscreen.getContext('2d'); const lineHeights = activeLines.map(l => l.size * spacing); const totalH = lineHeights.reduce((a,b) => a+b, 0); let startY; if(vAlign === 'top') startY = pad; else if(vAlign === 'bottom') startY = h - pad - totalH; else startY = (h - totalH) / 2; // Build SVG paths using Path2D approach via embedded SVG + serialization // The most reliable method for Cricut is to keep text elements but embed // the fonts as base64 data URIs. We'll use the cleanest approach: // output a clean SVG with proper font-family declarations and a note. // Actually: the most reliable Cricut-compatible export is clean text elements // with system/safe fonts, OR path data. We'll output the best SVG we can // and add a comment guiding users to outline in Inkscape if needed. const svgLines = activeLines.map((line, i) => { const prevH = lineHeights.slice(0,i).reduce((a,b)=>a+b,0); const y = startY + prevH + line.yOff; let x, anchor; if(line.align === 'left') { x = pad + line.xOff; anchor = 'start'; } else if(line.align === 'right') { x = w - pad + line.xOff; anchor = 'end'; } else { x = w/2 + line.xOff; anchor = 'middle'; } const weight = line.bold ? '700' : '400'; const style = line.italic ? 'italic' : 'normal'; const fontStr = `${style} ${weight} ${line.size}px ${line.font}`; // Use canvas measureText to validate the text renders ctx.font = fontStr; return ` ${escText(line.text)}`; }); // Build a clean export SVG without Google Fonts @import // (Design Space ignores external CSS anyway) // Instead embed only system fonts; add a human-readable note const fontFamilies = [...new Set(activeLines.map(l => l.font))].join(', '); const svgOut = ` ${svgLines.join('\n')} `; const blob = new Blob([svgOut], { type: 'image/svg+xml;charset=utf-8' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'crafty-quote.svg'; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(() => URL.revokeObjectURL(url), 1000); statusEl.textContent = '✓ Downloaded!'; setTimeout(() => statusEl.textContent = '', 3000); } // ── Helpers ── function esc(str) { return String(str||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); } function escAttr(str) { return esc(str); } function escText(str) { return String(str||'').replace(/&/g,'&').replace(//g,'>'); } // ── Event listeners ── addLineBtn.addEventListener('click', () => { if(lines.length >= 6) return; lines.push({ ...DEFAULT_LINE, id: nextId++, size: 50 }); renderCards(); renderSVG(); }); clearBtn.addEventListener('click', () => { lines = [ { ...DEFAULT_LINE, id: nextId++, size: 70 }, { ...DEFAULT_LINE, id: nextId++, size: 45, font: FONTS[8].css }, ]; canvasW.value = 1000; canvasH.value = 500; paddingEl.value = 40; globalSpacing.value = 1.25; vAlignEl.value = 'center'; renderCards(); renderSVG(); }); downloadBtn.addEventListener('click', exportSVG); [canvasW, canvasH, paddingEl, globalSpacing, vAlignEl].forEach(el => el.addEventListener('input', renderSVG) ); // ── Init ── renderCards(); renderSVG(); })();

How to Use the Tool

  1. Enter Your Text:
    Type your quote line-by-line into the text boxes. You can use up to four lines.
  2. Pick a Font:
    Use the dropdown beside each line to select from 15 different fonts — including elegant script and bold display styles.
  3. Adjust the Size:
    Change the font size in pixels for each line to control emphasis and balance.
  4. Position Your Text:
    Use the X (horizontal) and Y (vertical) offset controls to move lines left, right, up, or down. This is perfect for aligning lines closely or creating stacked effects.
  5. Add Style:
    Toggle Bold or Italic for any line to personalize the appearance.
  6. Preview in Real Time:
    Watch the live preview update as you make changes.
  7. Download as SVG:
    When you’re happy with your design, click “Download SVG”. The file will remain as editable text and is fully compatible with Cricut Design Space and other SVG-based software.

Troubleshooting Tips

  • Preview Not Updating:
    Make sure you’ve typed something into at least one line. The preview only appears when text is entered.
  • Text Overlapping:
    Reduce font size or adjust Y offset values to space lines apart.
  • SVG Looks Blank in Cricut:
    Double-check that your text color isn’t set to white and that the font downloaded correctly.
  • Download Button Not Working:
    Try refreshing the page — some browsers block the first download prompt.
  • Fonts Display Differently After Download:
    SVGs store font names, not the actual font files. Install the same fonts locally on your cutting machine software for perfect matching.

I hope you have enjoyed using the Quote Design Tool and if you would like to see any additional features added please leave a comment.