> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lightspark.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Card design guidelines

> Design the front of your card, choose the back's options, and submit artwork for physical cards and digital wallets

export const TemplateDownloads = ({id}) => {
  const base = '/images/cards/card-design/card-template-';
  const items = [{
    face: 'front',
    title: 'Front template'
  }, {
    face: 'back',
    title: 'Back template'
  }];
  return <div id={id} className="ls-template-downloads not-prose">
      {items.map(it => <a key={it.face} className="ls-template-download" href={base + it.face + '-1536x969.svg'} download={'grid-card-template-' + it.face + '.svg'} aria-label={'Download the ' + it.title.toLowerCase() + ' as SVG'}>
          <span className="ls-template-download-preview">
            <img src={base + it.face + '-1536x969.svg'} alt="" noZoom />
          </span>
          <span className="ls-template-download-row">
            <span className="ls-template-download-title">{it.title}</span>
            <span className="ls-template-download-button">Download SVG</span>
          </span>
        </a>)}
    </div>;
};

export const CardSamples = () => {
  const W = 1536;
  const H = 969;
  const R = 57;
  const squircle = (w, h, r, smoothing, ox, oy) => {
    const exp = 2 + smoothing * 4;
    const p = 2 / exp;
    const k = 22;
    const pts = [];
    const arc = (cx, cy, sx, sy, swap) => {
      for (let i = 0; i <= k; i++) {
        const t = i / k * (Math.PI / 2);
        const u = swap ? Math.pow(Math.sin(t), p) : Math.pow(Math.cos(t), p);
        const v = swap ? Math.pow(Math.cos(t), p) : Math.pow(Math.sin(t), p);
        pts.push([ox + cx + sx * r * u, oy + cy + sy * r * v]);
      }
    };
    arc(w - r, r, 1, -1, true);
    arc(w - r, h - r, 1, 1, false);
    arc(r, h - r, -1, 1, true);
    arc(r, r, -1, -1, false);
    let d = 'M ' + (ox + r).toFixed(2) + ' ' + oy.toFixed(2);
    for (const [x, y] of pts) d += ' L ' + x.toFixed(2) + ' ' + y.toFixed(2);
    return d + ' Z';
  };
  const cardPath = squircle(W, H, R, 0.12, 0, 0);
  const mix = (a, b, t) => {
    const c = (h, i) => parseInt(h.slice(1 + i * 2, 3 + i * 2), 16);
    const v = i => Math.round(c(a, i) * (1 - t) + c(b, i) * t);
    return 'rgb(' + v(0) + ',' + v(1) + ',' + v(2) + ')';
  };
  const chip = (id, face) => {
    const x = 152;
    const y = 324;
    const w = 236;
    const h = 164;
    const r = w * 19.5 / 151;
    const gap = 2.7;
    return <g>
        <defs>
          <linearGradient id={'pocket-' + id} x1={x} y1={y} x2={x + w} y2={y + h} gradientUnits="userSpaceOnUse">
            <stop offset="0" stopColor={mix(face, '#000000', 0.5)} />
            <stop offset="1" stopColor={mix(face, '#000000', 0.28)} />
          </linearGradient>
          <linearGradient id={'plate-' + id} x1={x} y1={y} x2={x + w} y2={y + h} gradientUnits="userSpaceOnUse">
            <stop offset="0" stopColor="#d9dade" />
            <stop offset="0.5" stopColor="#f4f5f8" />
            <stop offset="1" stopColor="#cbcdd3" />
          </linearGradient>
        </defs>
        <path d={squircle(w + gap * 2, h + gap * 2, r + gap, 0, x - gap, y - gap)} fill={'url(#pocket-' + id + ')'} />
        <path d={squircle(w, h, r, 0, x, y)} fill={'url(#plate-' + id + ')'} />
        <g fill="none" stroke="rgba(70,74,82,0.4)" strokeWidth={1.4}>
          {[338, 385, 432].map(py => <g key={py}>
              <rect x={166} y={py} width={92} height={42} rx={21} />
              <rect x={282} y={py} width={92} height={42} rx={21} />
            </g>)}
        </g>
      </g>;
  };
  const contactless = ink => {
    const h = 90;
    const cy = 470 + h / 2;
    const cx = 1482 - h * 0.72;
    const a = Math.PI / 180 * 38;
    const arc = r => 'M ' + (cx + r * Math.cos(-a)) + ' ' + (cy + r * Math.sin(-a)) + ' A ' + r + ' ' + r + ' 0 0 1 ' + (cx + r * Math.cos(a)) + ' ' + (cy + r * Math.sin(a));
    return <g fill="none" stroke={ink} strokeWidth={h * 0.055} strokeLinecap="round">
        {[0.14, 0.33, 0.52, 0.71].map(k => <path key={k} d={arc(h * k)} />)}
      </g>;
  };
  const lockup = id => <g>
      <defs>
        <linearGradient id={'foil-' + id} x1={0} y1={0} x2={339} y2={211} gradientUnits="userSpaceOnUse">
          <stop offset="0" stopColor="#ffffff" />
          <stop offset="0.28" stopColor="#b9bdc5" />
          <stop offset="0.5" stopColor="#f4f5f7" />
          <stop offset="0.72" stopColor="#959aa3" />
          <stop offset="1" stopColor="#e6e7ea" />
        </linearGradient>
      </defs>
      <g transform="translate(1143 704)" fill={'url(#foil-' + id + ')'}>
        <g opacity={0.85}>
          <path d="M187.303 0.5C195.977 0.5 201.982 2.51156 205.974 6.19727L205.976 6.19922C210.105 9.95807 212.53 15.2033 212.53 22.6846C212.53 29.9492 210.303 35.9923 206.293 40.1777L205.899 40.5771C201.592 44.8233 194.454 47.2139 185.403 47.2139C181.236 47.2139 177.839 47.097 174.814 46.7051V1.38281C178.438 0.851697 182.695 0.500023 187.303 0.5ZM187.621 4.25195C184.431 4.25195 182.043 4.50667 180.407 4.89941L180.024 4.99219V42.3096L179.42 42.9141L180.379 43.0742C181.95 43.336 184.216 43.333 186.604 43.333V43.334L186.605 43.333L186.607 43.334V43.333C193.193 43.3646 198.343 41.5333 201.844 38.0068C205.236 34.5911 207.017 29.6525 207.125 23.4766L207.13 22.875C207.161 17.2387 205.582 12.5648 202.302 9.30078C199.021 6.03669 194.11 4.25197 187.621 4.25195Z" />
          <path d="M245.733 0.817132V4.88647H226.407V20.7136H244.593V24.783H226.407V42.7009H246.747V46.7703H221.261V0.817132H245.733Z" />
          <path d="M266.193 0.5C272.223 0.50001 275.952 1.56878 278.675 3.80762L278.684 3.81543L278.694 3.82324C281.035 5.56455 282.485 8.20237 282.485 11.7227C282.484 16.1029 279.609 19.866 274.893 21.5811L274.564 21.7002V22.6338L274.945 22.7266C279.248 23.7716 284.258 27.3064 284.258 33.9629C284.258 37.8679 282.74 40.7825 280.359 43.042C277.268 45.8861 272.171 47.2764 264.545 47.2764C260.662 47.2764 257.615 47.0547 255.604 46.7725V1.47656C258.233 0.901112 262.234 0.5 266.193 0.5ZM260.623 43.208H261.156C262.457 43.3989 264.122 43.4609 266.256 43.4609C269.44 43.4609 272.559 42.8841 274.898 41.3857C277.269 39.8669 278.795 37.4264 278.795 33.8369C278.795 30.4979 277.33 28.0776 274.985 26.5137C272.664 24.9665 269.513 24.2754 266.129 24.2754H260.623V43.208ZM266.572 4.18945C263.768 4.18946 262.137 4.3796 261.066 4.64746L260.687 4.74219V20.3398H261.187V20.7764H266.699C269.954 20.7764 272.609 19.8977 274.46 18.3916C276.318 16.8798 277.338 14.7575 277.338 12.3564C277.338 9.48625 276.242 7.40658 274.293 6.06738C272.376 4.74972 269.692 4.18945 266.572 4.18945Z" />
          <path d="M298.447 0.817132V46.8337H293.301V0.817132H298.447Z" />
          <path d="M338.436 0.817132V4.94994H324.053V46.7703H318.906V5.51342H318.47V5.01342H304.649V0.817132H338.436Z" />
        </g>
        <path d="M128.693 103.538L84.3381 209.42H55.3806L33.5198 124.955C32.1892 119.759 31.0486 117.858 26.9933 115.64C20.4034 112.092 9.56804 108.734 0 106.643L0.633645 103.538H47.2699C53.2262 103.538 58.5488 107.466 59.8794 114.31L71.4118 175.583L99.9258 103.538H128.693ZM242.179 174.823C242.306 146.879 203.527 145.358 203.78 132.876C203.844 129.074 207.455 125.018 215.376 124.005C219.304 123.498 230.14 123.117 242.369 128.757L247.185 106.326C240.595 103.918 232.104 101.637 221.586 101.637C194.529 101.637 175.456 116.021 175.266 136.614C175.076 151.885 188.89 160.376 199.281 165.445C209.927 170.641 213.538 173.936 213.475 178.625C213.412 185.722 204.984 188.89 197.064 189.017C183.313 189.207 175.33 185.278 168.93 182.3L163.987 205.491C170.387 208.406 182.173 211.004 194.466 211.131C223.233 211.131 242.052 196.937 242.179 174.886M313.654 209.42H339L316.886 103.538H293.504C288.245 103.538 283.81 106.579 281.845 111.332L240.722 209.42H269.489L275.192 193.579H310.296L313.591 209.42H313.654ZM283.049 171.908L297.496 132.179L305.797 171.908H283.113H283.049ZM167.853 103.538L145.231 209.42H117.858L140.479 103.538H167.853Z" />
      </g>
    </g>;
  const front = (id, color, ink, title) => <svg viewBox={'0 0 ' + W + ' ' + H} role="img" aria-label={title}>
      <path d={cardPath} fill={color} />
      {chip(id, color)}
      <text x={1384} y={434} fontSize={80} fontFamily="'Suisse Intl', sans-serif" fontWeight={500} textAnchor="end" fill={ink}>
        Your logo
      </text>
      <path className="ls-card-sample-edge" d={cardPath} fill="none" />
    </svg>;
  const back = (id, color, stripe, ink, title) => <svg viewBox={'0 0 ' + W + ' ' + H} role="img" aria-label={title}>
      <defs>
        <clipPath id={'card-' + id}>
          <path d={cardPath} />
        </clipPath>
      </defs>
      <g clipPath={'url(#card-' + id + ')'}>
        <rect x={0} y={0} width={W} height={H} fill={color} />
        <rect x={0} y={0} width={W} height={300} fill={stripe} />
      </g>
      <g fontFamily="'Suisse Intl', sans-serif" fontSize={57} fill={ink}>
        <text x={56} y={517}>
          Ana Hernandes
        </text>
        <text x={56} y={590}>
          4000 1234 5678 9010
        </text>
        <text x={56} y={663}>
          EXP 11/27
        </text>
        <text x={371} y={663}>
          CVV 123
        </text>
      </g>
      {contactless(ink)}
      {lockup(id)}
      <g fontFamily="'Suisse Intl', sans-serif" fontSize={22} fill={ink}>
        <text x={56} y={892}>
          {'1-800-000-0000\u00A0\u00A0\u00A0yourbrand.com/help'}
        </text>
        <text x={56} y={918}>
          Issued by Lead Bank
        </text>
      </g>
      <path className="ls-card-sample-edge" d={cardPath} fill="none" />
    </svg>;
  return <div className="ls-card-samples not-prose">
      <figure className="ls-card-sample">
        {front('color', '#0b3d91', '#ffffff', 'Full-color card, front: a printed blue body with a white logo right of the chip')}
        <figcaption>White card stock, front. Any color or artwork, printed edge to edge.</figcaption>
      </figure>
      <figure className="ls-card-sample">
        {back('color', '#0b3d91', '#1a1a1a', '#ffffff', 'Full-color card, back: the color continues, the stripe band runs to the top edge, silver foil lockup')}
        <figcaption>White card stock, back. Your color continues; stripe band to the top edge; silver foil lockup.</figcaption>
      </figure>
      <figure className="ls-card-sample">
        {front('mono', '#111111', '#ffffff', 'Black-core card, front: black body with a white logo right of the chip')}
        <figcaption>Black core, front. Logo in white ink or one spot color.</figcaption>
      </figure>
      <figure className="ls-card-sample">
        {back('mono', '#111111', '#242426', '#ffffff', 'Black-core card, back: white personalization and a silver foil Visa DEBIT lockup')}
        <figcaption>Black core, back. White personalization, silver foil lockup.</figcaption>
      </figure>
    </div>;
};

export const CardBlueprint = ({face}) => {
  const W = 1536;
  const H = 969;
  const R = 57;
  const SAFE = 54;
  const PX_PER_MM = 17.94;
  const [unit, setUnit] = React.useState('px');
  const f = px => unit === 'mm' ? (px / PX_PER_MM).toFixed(2) + ' mm' : px + ' px';
  const arrow = 'url(#bp-arrow-' + face + ')';
  const GAP = 10;
  const OVER = 14;
  const TXT = 30;
  const textLen = t => t.length * TXT * 0.62 + 24;
  const STEM = 50;
  const dimH = (x1, x2, y, edgeY, side, note) => {
    const out = y < edgeY ? -1 : 1;
    const label = f(x2 - x1) + (note || '');
    const gap = textLen(label);
    const span = x2 - x1;
    const mid = (x1 + x2) / 2;
    const mode = span >= gap + 60 ? 'inline' : span >= gap ? 'beside' : 'leader';
    const dir = side || (mid < W / 2 ? -1 : 1);
    const from = dir > 0 ? x2 : x1;
    const to = from + dir * STEM;
    return <g className="bp-thin" stroke="var(--bp-ink)">
        <line x1={x1} y1={edgeY + out * GAP} x2={x1} y2={y + out * OVER} />
        <line x1={x2} y1={edgeY + out * GAP} x2={x2} y2={y + out * OVER} />
        {mode === 'inline' ? <g>
            <line x1={x1} y1={y} x2={mid - gap / 2} y2={y} markerStart={arrow} />
            <line x1={mid + gap / 2} y1={y} x2={x2} y2={y} markerEnd={arrow} />
            <text className="ls-blueprint-label" x={mid} y={y + 10} fontSize={TXT} textAnchor="middle">
              {label}
            </text>
          </g> : mode === 'beside' ? <g>
            <line x1={x1} y1={y} x2={x2} y2={y} markerStart={arrow} markerEnd={arrow} />
            <text className="ls-blueprint-label" x={mid} y={out < 0 ? y - 14 : y + 36} fontSize={TXT} textAnchor="middle">
              {label}
            </text>
          </g> : <g>
            <line x1={x1} y1={y} x2={x2} y2={y} markerStart={arrow} markerEnd={arrow} />
            <line x1={from} y1={y} x2={to} y2={y} />
            <text className="ls-blueprint-label" x={to + dir * 8} y={y + 10} fontSize={TXT} textAnchor={dir > 0 ? 'start' : 'end'}>
              {label}
            </text>
          </g>}
      </g>;
  };
  const dimV = (y1, y2, x, edgeX, side, note) => {
    const out = x > edgeX ? 1 : -1;
    const label = f(y2 - y1) + (note || '');
    const gap = textLen(label);
    const span = y2 - y1;
    const mid = (y1 + y2) / 2;
    const mode = span >= gap + 60 ? 'inline' : span >= gap ? 'beside' : 'leader';
    const dir = side || (mid < H / 2 ? -1 : 1);
    const from = dir > 0 ? y2 : y1;
    const to = from + dir * STEM;
    const bx = x + out * 28;
    return <g className="bp-thin" stroke="var(--bp-ink)">
        <line x1={edgeX + out * GAP} y1={y1} x2={x + out * OVER} y2={y1} />
        <line x1={edgeX + out * GAP} y1={y2} x2={x + out * OVER} y2={y2} />
        {mode === 'inline' ? <g>
            <line x1={x} y1={y1} x2={x} y2={mid - gap / 2} markerStart={arrow} />
            <line x1={x} y1={mid + gap / 2} x2={x} y2={y2} markerEnd={arrow} />
            <text className="ls-blueprint-label" x={x} y={mid} fontSize={TXT} textAnchor="middle" dominantBaseline="middle" transform={'rotate(-90 ' + x + ' ' + mid + ')'}>
              {label}
            </text>
          </g> : mode === 'beside' ? <g>
            <line x1={x} y1={y1} x2={x} y2={y2} markerStart={arrow} markerEnd={arrow} />
            <text className="ls-blueprint-label" x={bx} y={mid} fontSize={TXT} textAnchor="middle" dominantBaseline="middle" transform={'rotate(-90 ' + bx + ' ' + mid + ')'}>
              {label}
            </text>
          </g> : <g>
            <line x1={x} y1={y1} x2={x} y2={y2} markerStart={arrow} markerEnd={arrow} />
            <line x1={x} y1={from} x2={x} y2={to} />
            <text className="ls-blueprint-label" x={x} y={to + dir * 8} fontSize={TXT} textAnchor={dir > 0 ? 'end' : 'start'} dominantBaseline="middle" transform={'rotate(-90 ' + x + ' ' + (to + dir * 8) + ')'}>
              {label}
            </text>
          </g>}
      </g>;
  };
  const balloon = (n, cx, cy, tx, ty) => {
    const dx = tx - cx;
    const dy = ty - cy;
    const len = Math.sqrt(dx * dx + dy * dy) || 1;
    const sx = cx + dx / len * 28;
    const sy = cy + dy / len * 28;
    return <g>
        <line className="bp-thin" stroke="var(--bp-ink)" x1={sx} y1={sy} x2={tx} y2={ty} />
        <circle className="bp-scaled" cx={tx} cy={ty} r={5} fill="var(--bp-ink)" stroke="none" />
        <circle className="bp-thin" stroke="var(--bp-ink)" cx={cx} cy={cy} r={28} fill="var(--bp-paper)" />
        <text className="ls-blueprint-label" x={cx} y={cy + 10} fontSize={28} textAnchor="middle">
          {n}
        </text>
      </g>;
  };
  const radius = rx => <g className="bp-thin" stroke="var(--bp-ink)">
      <line x1={rx - rx * 0.7071} y1={rx - rx * 0.7071} x2={-70} y2={-70} markerStart={arrow} />
      <text className="ls-blueprint-label" x={-80} y={-80} fontSize={TXT} textAnchor="end">
        {'R ' + f(rx)}
      </text>
    </g>;
  const contactless = (right, top, h) => {
    const cy = top + h / 2;
    const cx = right - h * 0.72;
    const a = Math.PI / 180 * 38;
    const arc = r => 'M ' + (cx + r * Math.cos(-a)) + ' ' + (cy + r * Math.sin(-a)) + ' A ' + r + ' ' + r + ' 0 0 1 ' + (cx + r * Math.cos(a)) + ' ' + (cy + r * Math.sin(a));
    return <g className="bp-scaled" fill="none" stroke="var(--bp-ink)" strokeWidth={h * 0.055} strokeLinecap="round">
        {[0.14, 0.33, 0.52, 0.71].map(k => <path key={k} d={arc(h * k)} />)}
      </g>;
  };
  const chip = <g className="bp-scaled" fill="none" stroke="var(--bp-ink)" strokeWidth={2.5}>
      <rect x={152} y={324} width={236} height={164} rx={30.5} />
      {[338, 385, 432].map(y => <g key={y}>
          <rect x={166} y={y} width={92} height={42} rx={21} />
          <rect x={282} y={y} width={92} height={42} rx={21} />
        </g>)}
    </g>;
  const lockup = <g transform="translate(1143 704)" fill="var(--bp-ink)">
      <path d="M187.303 0.5C195.977 0.5 201.982 2.51156 205.974 6.19727L205.976 6.19922C210.105 9.95807 212.53 15.2033 212.53 22.6846C212.53 29.9492 210.303 35.9923 206.293 40.1777L205.899 40.5771C201.592 44.8233 194.454 47.2139 185.403 47.2139C181.236 47.2139 177.839 47.097 174.814 46.7051V1.38281C178.438 0.851697 182.695 0.500023 187.303 0.5ZM187.621 4.25195C184.431 4.25195 182.043 4.50667 180.407 4.89941L180.024 4.99219V42.3096L179.42 42.9141L180.379 43.0742C181.95 43.336 184.216 43.333 186.604 43.333V43.334L186.605 43.333L186.607 43.334V43.333C193.193 43.3646 198.343 41.5333 201.844 38.0068C205.236 34.5911 207.017 29.6525 207.125 23.4766L207.13 22.875C207.161 17.2387 205.582 12.5648 202.302 9.30078C199.021 6.03669 194.11 4.25197 187.621 4.25195Z" />
      <path d="M245.733 0.817132V4.88647H226.407V20.7136H244.593V24.783H226.407V42.7009H246.747V46.7703H221.261V0.817132H245.733Z" />
      <path d="M266.193 0.5C272.223 0.50001 275.952 1.56878 278.675 3.80762L278.684 3.81543L278.694 3.82324C281.035 5.56455 282.485 8.20237 282.485 11.7227C282.484 16.1029 279.609 19.866 274.893 21.5811L274.564 21.7002V22.6338L274.945 22.7266C279.248 23.7716 284.258 27.3064 284.258 33.9629C284.258 37.8679 282.74 40.7825 280.359 43.042C277.268 45.8861 272.171 47.2764 264.545 47.2764C260.662 47.2764 257.615 47.0547 255.604 46.7725V1.47656C258.233 0.901112 262.234 0.5 266.193 0.5ZM260.623 43.208H261.156C262.457 43.3989 264.122 43.4609 266.256 43.4609C269.44 43.4609 272.559 42.8841 274.898 41.3857C277.269 39.8669 278.795 37.4264 278.795 33.8369C278.795 30.4979 277.33 28.0776 274.985 26.5137C272.664 24.9665 269.513 24.2754 266.129 24.2754H260.623V43.208ZM266.572 4.18945C263.768 4.18946 262.137 4.3796 261.066 4.64746L260.687 4.74219V20.3398H261.187V20.7764H266.699C269.954 20.7764 272.609 19.8977 274.46 18.3916C276.318 16.8798 277.338 14.7575 277.338 12.3564C277.338 9.48625 276.242 7.40658 274.293 6.06738C272.376 4.74972 269.692 4.18945 266.572 4.18945Z" />
      <path d="M298.447 0.817132V46.8337H293.301V0.817132H298.447Z" />
      <path d="M338.436 0.817132V4.94994H324.053V46.7703H318.906V5.51342H318.47V5.01342H304.649V0.817132H338.436Z" />
      <path d="M128.693 103.538L84.3381 209.42H55.3806L33.5198 124.955C32.1892 119.759 31.0486 117.858 26.9933 115.64C20.4034 112.092 9.56804 108.734 0 106.643L0.633645 103.538H47.2699C53.2262 103.538 58.5488 107.466 59.8794 114.31L71.4118 175.583L99.9258 103.538H128.693ZM242.179 174.823C242.306 146.879 203.527 145.358 203.78 132.876C203.844 129.074 207.455 125.018 215.376 124.005C219.304 123.498 230.14 123.117 242.369 128.757L247.185 106.326C240.595 103.918 232.104 101.637 221.586 101.637C194.529 101.637 175.456 116.021 175.266 136.614C175.076 151.885 188.89 160.376 199.281 165.445C209.927 170.641 213.538 173.936 213.475 178.625C213.412 185.722 204.984 188.89 197.064 189.017C183.313 189.207 175.33 185.278 168.93 182.3L163.987 205.491C170.387 208.406 182.173 211.004 194.466 211.131C223.233 211.131 242.052 196.937 242.179 174.886M313.654 209.42H339L316.886 103.538H293.504C288.245 103.538 283.81 106.579 281.845 111.332L240.722 209.42H269.489L275.192 193.579H310.296L313.591 209.42H313.654ZM283.049 171.908L297.496 132.179L305.797 171.908H283.113H283.049ZM167.853 103.538L145.231 209.42H117.858L140.479 103.538H167.853Z" />
    </g>;
  const body = rx => <rect className="bp-object" stroke="var(--bp-ink)" x={0} y={0} width={W} height={H} rx={rx} fill="var(--bp-face)" />;
  const hatch = <pattern id={'bp-hatch-' + face} width={24} height={24} patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
      <line x1={0} y1={0} x2={0} y2={24} stroke="var(--bp-keepout)" strokeWidth={3} opacity={0.35} />
    </pattern>;
  const zone = (x, y, w, h, kind, rx = 8) => kind === 'keepout' ? <rect className="bp-thin" x={x} y={y} width={w} height={h} rx={rx} fill={'url(#bp-hatch-' + face + ')'} stroke="var(--bp-keepout)" strokeDasharray="8 8" /> : <rect className="bp-thin" x={x} y={y} width={w} height={h} rx={rx} fill="var(--bp-yours)" fillOpacity={0.1} stroke="var(--bp-yours)" strokeDasharray="8 8" />;
  let title = '';
  let key = [];
  let drawing = null;
  if (face === 'front') {
    title = 'Front of card: overall dimensions, chip position and keep-clear zone, logo placement, and safe margin';
    key = [{
      n: 1,
      kind: 'fixed',
      label: 'Chip module, 236 × 164'
    }, {
      n: 2,
      kind: 'keepout',
      label: 'Keep-clear zone, 308 × 254'
    }, {
      n: 3,
      kind: 'yours',
      label: 'Logo, right of the chip on its mid-line'
    }, {
      n: 4,
      kind: 'none',
      label: 'Safe margin for text and logos'
    }];
    drawing = <g>
        {body(R)}
        <rect className="bp-thin" stroke="var(--bp-ink-soft)" x={SAFE} y={SAFE} width={W - 2 * SAFE} height={H - 2 * SAFE} rx={12} fill="none" strokeDasharray="14 10" />
        {zone(107, 279, 308, 254, 'keepout', 16)}
        {chip}
        <line className="bp-center" stroke="var(--bp-ink-soft)" x1={-40} y1={406} x2={W + 40} y2={406} />
        {zone(974, 361, 410, 90, 'yours')}
        <text x={1384} y={430} fontSize={64} fontFamily="'Suisse Intl', sans-serif" fontWeight={500} textAnchor="end" fill="var(--bp-yours)">
          Your logo
        </text>
        {dimH(0, W, -170, 0)}
        {dimH(0, 152, -80, 0, 1)}
        {dimH(1384, W, -80, 0)}
        {dimH(152, 388, H + 80, H)}
        {dimV(0, H, W + 170, W)}
        {dimV(H - SAFE, H, W + 80, W)}
        {dimV(0, 324, -80, 0)}
        {dimV(324, 488, -80, 0, 1)}
        {radius(R)}
        {balloon(1, 261, 640, 300, 488)}
        {balloon(2, 500, 250, 415, 290)}
        {balloon(3, 1179, 560, 1179, 451)}
        {balloon(4, 700, 800, 700, H - SAFE)}
      </g>;
  } else if (face === 'back') {
    title = 'Back of card: the fixed template with the magnetic stripe, account block, contactless indicator, Visa DEBIT lockup, support line, and issuer statement';
    key = [{
      n: 1,
      kind: 'fixed',
      label: 'Magnetic stripe, band to the top edge'
    }, {
      n: 2,
      kind: 'yours',
      label: 'Account block: your ink and typeface'
    }, {
      n: 3,
      kind: 'fixed',
      label: 'Contactless indicator'
    }, {
      n: 4,
      kind: 'fixed',
      label: 'Visa DEBIT lockup, silver foil'
    }, {
      n: 5,
      kind: 'yours',
      label: 'Support phone and URL'
    }, {
      n: 6,
      kind: 'fixed',
      label: 'Issuer statement'
    }];
    drawing = <g>
        {body(R)}
        <clipPath id={'bp-card-' + face}>
          <rect x={0} y={0} width={W} height={H} rx={R} />
        </clipPath>
        <g clipPath={'url(#bp-card-' + face + ')'}>
          <rect x={0} y={0} width={W} height={300} fill="var(--bp-fixed)" fillOpacity={0.55} />
          <rect x={0} y={72} width={W} height={228} fill="var(--bp-fixed)" />
        </g>
        <rect className="bp-object" stroke="var(--bp-ink)" x={0} y={0} width={W} height={H} rx={R} fill="none" />
        {zone(56, 476, 620, 187, 'yours')}
        <g fontFamily="'Suisse Intl', sans-serif" fontSize={57} fill="var(--bp-ink)">
          <text x={56} y={517}>
            Cardholder name
          </text>
          <text x={56} y={590}>
            4000 1234 5678 9010
          </text>
          <text x={56} y={663}>
            EXP 11/27
          </text>
          <text x={371} y={663}>
            CVV 123
          </text>
        </g>
        {contactless(1482, 470, 90)}
        <rect className="bp-thin" stroke="var(--bp-ink-soft)" x={1089} y={650} width={447} height={319} rx={8} fill="none" strokeDasharray="14 10" />
        {lockup}
        {zone(56, 876, 620, 55, 'yours')}
        <g fontFamily="'Suisse Intl', sans-serif" fontSize={22} fill="var(--bp-ink)">
          <text x={56} y={892}>
            {'1-800-000-0000\u00A0\u00A0\u00A0yourbrand.com/help'}
          </text>
          <text x={56} y={918}>
            Issued by Lead Bank
          </text>
        </g>
        {dimH(0, W, -170, 0)}
        {dimH(0, 56, -80, 0)}
        {dimH(1143, 1482, H + 80, H)}
        {dimH(1482, W, H + 80, H, 1, ' typ.')}
        {dimV(0, H, W + 170, W)}
        {dimV(0, 72, W + 80, W)}
        {dimV(72, 300, W + 80, W)}
        {dimV(704, 915, W + 80, W)}
        {dimV(0, 476, -80, 0)}
        {dimV(476, 663, -80, 0)}
        {balloon(1, 768, 400, 768, 300)}
        {balloon(2, 800, 570, 676, 570)}
        {balloon(3, 1300, 515, 1417, 515)}
        {balloon(4, 980, 810, 1143, 810)}
        {balloon(5, 720, 780, 460, 876)}
        {balloon(6, 720, 940, 320, 923)}
      </g>;
  } else {
    title = 'Wallet card art: squared corners, the lower-left quadrant left empty for the wallet, and the Visa DEBIT lockup in the lower right';
    key = [{
      n: 1,
      kind: 'yours',
      label: 'Your front design'
    }, {
      n: 2,
      kind: 'keepout',
      label: 'Leave empty for the wallet\'s last 4 digits'
    }, {
      n: 3,
      kind: 'fixed',
      label: 'Visa DEBIT lockup, as on the back'
    }];
    drawing = <g>
        <rect className="bp-object" stroke="var(--bp-ink)" x={0} y={0} width={W} height={H} fill="var(--bp-yours)" fillOpacity={0.1} />
        <text x={SAFE} y={140} fontSize={64} fontFamily="'Suisse Intl', sans-serif" fontWeight={500} fill="var(--bp-yours)">
          Your front design
        </text>
        {zone(0, H / 2, W / 2, H / 2, 'keepout', 0)}
        {lockup}
        {dimH(0, W, -170, 0)}
        {dimH(0, W / 2, H + 80, H)}
        {dimV(0, H, W + 170, W)}
        {dimV(H / 2, H, -80, 0)}
        <g className="bp-thin" stroke="var(--bp-ink)">
          <line x1={0} y1={0} x2={-70} y2={-70} markerStart={arrow} />
          <text className="ls-blueprint-label" x={-80} y={-80} fontSize={TXT} textAnchor="end">
            R 0
          </text>
        </g>
        {balloon(1, 1100, 200, 900, 200)}
        {balloon(2, 384, 400, 384, H / 2)}
        {balloon(3, 980, 810, 1143, 810)}
      </g>;
  }
  return <figure className="ls-blueprint not-prose">
      <svg viewBox="-300 -260 2160 1460" role="img" aria-label={title}>
        <defs>
          <marker id={'bp-arrow-' + face} viewBox="0 0 10 10" refX={10} refY={5} markerWidth={20} markerHeight={20} markerUnits="userSpaceOnUse" orient="auto-start-reverse">
            <path d="M 0 1.5 L 10 5 L 0 8.5 z" fill="var(--bp-ink)" />
          </marker>
          {hatch}
        </defs>
        {drawing}
      </svg>
      <figcaption className="ls-blueprint-foot">
        <ol className="ls-blueprint-key">
          {key.map(k => <li key={k.n} className={'is-' + k.kind}>
              <span className="ls-blueprint-key-n">{k.n}</span>
              {k.label}
            </li>)}
        </ol>
        <div className="ls-blueprint-units" role="group" aria-label="Units" data-unit={unit}>
          <span className="ls-blueprint-units-thumb" aria-hidden="true" />
          <button type="button" aria-pressed={unit === 'px'} onClick={() => setUnit('px')}>
            px
          </button>
          <button type="button" aria-pressed={unit === 'mm'} onClick={() => setUnit('mm')}>
            mm
          </button>
        </div>
      </figcaption>
    </figure>;
};

Your physical card and its digital wallet art share one design: the front
of the card. You design the front and choose a few options for the back. The
chip, the magnetic stripe, the Visa marks, and the issuer statement are fixed.
We prepare the production files and take the design through Visa's review.

<Note>
  Physical cards are set up with your Lightspark contact as part of card
  program onboarding. The Cards API issues virtual cards; see
  [Issuing cards](/cards/card-management/issuing-cards).
</Note>

Start from the templates. Each is a 1536 × 969 SVG overlay with the guides
on their own layers; it opens as editable vectors in Figma, Illustrator,
Sketch, and Affinity. Keep it on a hidden or non-printing layer while you
design.

<TemplateDownloads id="templates" />

## What you choose and what is fixed

| Surface                                    | You choose                                                                                                        | Fixed                                                                                                                           |
| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Front                                      | Background color or artwork, your logo and where it sits                                                          | Chip position                                                                                                                   |
| Back                                       | Background color (usually the front's), personalization ink color and typeface, your support phone number and URL | Magnetic stripe, account block layout, contactless indicator, Visa DEBIT lockup in silver foil, "Issued by Lead Bank" statement |
| Digital wallet art (Apple Pay, Google Pay) | The card image, derived from your front by default or supplied by you; your app icon and logo; two colors         | Visa DEBIT lockup placement; the image must be recognizably the same card as the physical one                                   |

## Card body

Cards print on white card stock. Any color, gradient, or artwork prints edge
to edge on both faces in CMYK, and the card edge is white. A black-core body
is also available for black cards.

<CardSamples />

* **White stock**: the standard body. Any color or artwork on the front; the same color continues on the back. The stripe band runs to the top edge of the back. Best for brand colors, gradients, and photographic or illustrated artwork.
* **Black core**: black plastic through the card, so the edge is black. Personalization prints in white, and the logo prints in white or in one spot color (give us the Pantone number). Finishes: matte, gloss, or satin. Best for a black or one-color brand.

Both bodies carry the Visa DEBIT lockup as the Premium Visa Brand Mark: silver
hot-stamped foil on the back. Because the card carries the premium mark, Visa
does not require the dove hologram, and the card has none.

## Canvas

Work on a 1536 × 969 px artboard. It has the proportions of an ISO/IEC 7810
ID-1 card, and it is also the size Visa requires for digital wallet art, so
one file serves both.

|               | Physical | On the artboard |
| ------------- | -------- | --------------- |
| Width         | 85.6 mm  | 1536 px         |
| Height        | 53.98 mm | 969 px          |
| Corner radius | 3.18 mm  | 57 px           |
| Scale         | 1 mm     | 17.94 px        |

Keep the artboard's corners square. The manufacturer cuts the corners;
preview them at 57 px if you want to see the result. Run backgrounds past the
card edge to give the cut bleed; the bleed amount depends on the
manufacturer's press, and we confirm it with your proof. Anything that must
stay legible (logos, text) stays inside a 54 px (3 mm) safe margin.

<CardBlueprint face="front" />

The [templates at the top of this page](#templates) carry every guide in
this figure as a layer.

## Front

The front carries your brand and the chip. Nothing else.

* **Chip**: the module sits at (152, 324) and measures 236 × 164 px. It is embedded after printing, so nothing prints over it. Keep the zone from x 107 to 415 and y 279 to 533 clear of logos and text; background color and artwork may run through it.
* **Logo**: the samples put it right of the chip, centered on the chip's mid-line (y 406), with its right edge 152 px from the card edge, 90 px tall. A larger mark, a centered mark, or a bleeding watermark all work if they stay out of the chip zone and legible parts stay inside the safe margin.
* **Artwork**: photographs, gradients, and patterns are fine on white stock. Supply vector artwork where you can. Raster artwork must be at least 1536 × 969 px at card size; larger is better.

Do not put on the front:

* Cardholder name, card number, expiry date, or security code. These print on the back.
* A drawn chip, hologram, or any imitation of a security feature.
* Visa marks. We place the Visa DEBIT lockup on the back from Visa's supplied artwork.
* Taglines, unless they are part of your trademarked logo.
* URLs or phone numbers. The back carries your support line.

Visa's rules also exclude, on either face:

* The name or mark of another card network, or of a company you do not own.
* Advertising or promotional language.
* Reproductions of banknotes, coins, or another payment card.
* Artwork, characters, or likenesses you do not hold the rights to.

## Back

The back is a fixed layout. Your background color or artwork continues onto
it, and you choose how the personalization prints. The blueprint carries the
positions; the back template has them as guides.

<CardBlueprint face="back" />

| Element               | What it is                                                                                                         | Who sets it                          |
| --------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------ |
| Magnetic stripe       | Standard black band. The band runs to the top edge of the card.                                                    | Fixed                                |
| Account block         | Three lines in 9 pt type: cardholder name, card number, then expiry and security code. Printed at personalization. | Layout fixed; ink and typeface yours |
| Contactless indicator | EMVCo artwork, 5 mm tall.                                                                                          | Fixed                                |
| Visa DEBIT lockup     | Premium Visa Brand Mark in silver foil, with 3 mm clear space on every side kept free of text and logos.           | Fixed                                |
| Support line          | Your support phone number and URL, in fine print.                                                                  | Yours                                |
| Issuer statement      | "Issued by Lead Bank".                                                                                             | Fixed                                |

Your choices on the back:

* **Background**: the front's color or artwork, or a solid color from your palette. Keep the area under the lockup calm enough for silver foil to read.
* **Personalization ink**: white or dark, whichever contrasts with the background. The black-core body prints white only.
* **Typeface**: a sans serif, which Visa requires for a printed cardholder name, at 9 to 12 pt. The default is Suisse Intl Regular at 9 pt (57 px on the artboard; 1 pt = 6.33 px). The card number, expiry, and security code have no mandated face, and use the same one as the name.
* **Support line**: the phone number and URL your cardholders should use.

Cardholder names print as they appear on the cardholder's customer record.
We shorten names that do not fit the line and confirm the result with you
at proof.

## Color

Cards are printed, so specify colors the way a printer uses them.

* Give brand colors as Pantone numbers, or as CMYK values if your brand guide has them. Hex and RGB values are for the digital wallet art only.
* CMYK reproduces a smaller range than a screen. Saturated screen colors, especially bright orange, lime green, cyan, magenta, and violet, print duller and darker. Look up your brand color's Pantone or CMYK equivalent before you commit to it; a color that looks right in Figma can disappoint on plastic.
* On white stock, everything prints as a four-color CMYK process. For a saturated brand color that CMYK cannot reach, the black-core body prints your logo as a Pantone spot color instead, which reproduces the exact ink.
* Metallic and fluorescent colors do not print in CMYK. A metallic look comes from foil (see [Beyond the standard card](#beyond-the-standard-card)).
* Everything printed must contrast with what is behind it. This is a Visa requirement for the cardholder name and a legibility requirement for everything else.
* The Visa DEBIT lockup is always silver foil. You do not choose its color.

Print differs from screen in a few other ways that affect card artwork:

* Set black as 100% K, not a CMYK build. Builds shift toward brown or blue on press.
* Ink coverage under 10% in any channel can drop out. Avoid very light tints for anything that must be visible.
* Avoid borders or frames that follow the card edge. The cut moves slightly from card to card, and a border makes that visible.
* Dark solid colors with a matte finish show surface scratches sooner than lighter or glossier cards.
* Keep type in your artwork at 6 pt or larger and lines at 0.08 mm (0.25 pt) or thicker.

The digital proof and the printed samples are the color check. Screen previews,
including the figures on this page, are not color-accurate.

## Digital wallet art

When a cardholder adds the card to Apple Pay or Google Pay, the wallet shows
a flat image of the card. By default we produce it from your front design.
You can supply your own version instead, within the rules below; Visa and the
wallets require it to be recognizably the same card as the physical one.

<CardBlueprint face="wallet" />

The image Visa and the wallets accept is a 1536 × 969 px PNG at 72 dpi, RGB,
under 4 MB, with square corners (the wallet rounds them). The rules for what
may appear on it:

* No cardholder name, card number, expiry date, chip, hologram, or embossing cues.
* No 3D or skeuomorphic effects that imitate a physical card. The wallet renders the rounding, stacking, shadows, and on iOS the tilt itself; a baked-in shadow or highlight fights that rendering.
* The lower-left quadrant stays empty. The wallet draws the last four digits there.
* The Visa DEBIT lockup sits in the lower right. We add it.

If your logo sits right of the chip on the physical card, it lands in the
upper right of the wallet art, which is allowed. A logo that depends on the
chip for balance, or one placed in the lower left, needs an alternate
placement for the wallet; that is the usual reason to supply your own
version.

The wallets also show your brand outside the card image, in notifications,
transaction lists, and the card details screen. Visa Token Service, which
provisions the card to Apple Pay and Google Pay, takes these assets with the
card image:

* An app icon, 100 × 100 px PNG.
* Your logo, 1372 × 283 px PNG, on a transparent background.
* An overlay text color for the last four digits, white or black, whichever reads on your art.
* A card background color as a hex value. The wallet shows it while the image loads.

## Carrier and envelope

Physical cards ship in a folded carrier letter with the card attached, inside
an unbranded envelope. Card networks require that nothing on the envelope
indicates a card is inside, so the envelope is not customized. The standard
carrier is used for all programs; to discuss a custom carrier, contact your
Lightspark contact.

## What to send

Send the following to your Lightspark contact:

* Brand colors as Pantone numbers or CMYK values for print, and as hex values for the digital wallet art.
* The front design on a 1536 × 969 artboard, as the layered source file (Figma, Illustrator, or Sketch) or a PDF with vectors preserved. Keep your logo as a vector on its own layer, and include the overlay template on a hidden layer.
* Your choices for the back: background color, personalization ink, typeface, support phone number and URL.
* The body: white stock or black core, and the finish for black core.
* For the digital wallets: the app icon, the logo PNG, the overlay text color, and the card background color listed under digital wallet art.

## Review and production

<Steps>
  <Step title="Design review">
    We check the design against the rules on this page and send back anything that needs to change.
  </Step>

  <Step title="Production files">
    We prepare the print files for both faces and the digital wallet art PNG, and place the Visa marks from Visa's supplied artwork.
  </Step>

  <Step title="Visa design approval">
    Visa reviews every card design before production. We submit and handle their feedback with you.
  </Step>

  <Step title="Proof and samples">
    The manufacturer returns a digital proof, then printed samples for you to approve.
  </Step>

  <Step title="Production">
    Approved designs go into production for your card program.
  </Step>
</Steps>

Plan for several weeks from submission to printed samples, and longer for
production stock. We give you a schedule at design review.

## Beyond the standard card

The two bodies on this page are what most programs print. Metal, custom cores
and edges, foil or spot-gloss logos, and other premium finishes are possible.
Each raises the cost of every card, adds a minimum order, and adds months of
lead time, and some change what the artwork can be. If you are considering
one, talk to your Lightspark contact before you design. The same applies to a vertical orientation or a
custom back layout.
