Vize

Signature Pad

Headless signature pad: pointer-captured, pressure-aware strokes rendered as SVG.

Package @vizejs/ui/signature-pad
Maturity stable
Own the source vize lib pull signature-pad
Requires context, controllable-state, id
Aliases signature pad, signature, e-signature, drawing pad, sign here
Covers signature_pad, perfect-freehand, Pointer Events getCoalescedEvents, Mantine Signature examples

Usage

import { SignaturePadCanvas, SignaturePadClear, SignaturePadGuide, SignaturePadRedo, SignaturePad, SignaturePadRoot, SignaturePadUndo } from "@vizejs/ui/signature-pad";

Or copy the source into your project with vize lib pull signature-pad (see Source Distribution).

API

SignaturePadCanvas

Source: src/families/media/signature-pad/signature-pad-canvas.vue

Props

Prop Type Default Description
ariaLabel string "Signature" Accessible name of the drawing surface. Localize by passing your own text.
ariaDescribedby string undefined Ids of instructions, e.g. a note offering a typed-name alternative.

Slots

Slot Slot props Description
default SignaturePadSlotState Extra SVG content drawn above the strokes, e.g. a baseline. Receives the pad state.

Exposed

Member Type Description
element SVGSVGElement | null Rendered drawing surface.
drawing boolean Whether a stroke is in progress.

SignaturePadClear

Source: src/families/media/signature-pad/signature-pad-clear.vue

Events

Event Payload Description
click [nativeEvent: MouseEvent] Fired before clearing. Call preventDefault() to keep the strokes.

Slots

Slot Slot props Description
default SignaturePadSlotState Button label. Receives the pad state.

Exposed

Member Type Description
disabled —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.

SignaturePadGuide

Source: src/families/media/signature-pad/signature-pad-guide.vue

Slots

Slot Slot props Description
default SignaturePadSlotState Decorative guide content such as a baseline or "Sign here" hint.

Exposed

Member Type Description
element HTMLDivElement | null Rendered guide element.

SignaturePadRedo

Source: src/families/media/signature-pad/signature-pad-redo.vue

Events

Event Payload Description
click [nativeEvent: MouseEvent] Fired before redoing. Call preventDefault() to keep the strokes.

Slots

Slot Slot props Description
default SignaturePadSlotState Button label. Receives the pad state.

Exposed

Member Type Description
disabled —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.

SignaturePad

Source: src/families/media/signature-pad/signature-pad-root.vue

Props

Prop Type Default Description
id string | null undefined Consumer-owned base id. null and undefined select a deterministic fallback.
modelValue SignatureValue undefined Controlled strokes. undefined selects uncontrolled behavior.
defaultValue SignatureValue [] Initial strokes for uncontrolled use.
disabled boolean false Suppress drawing and every editing control.
readOnly boolean false Show the signature while suppressing drawing and editing.
name string undefined Form field name. When set, a hidden input submits the serialized signature.
form string undefined Id of the form that owns the hidden input.
valueFormat SignaturePadValueFormat "json" Serialization written to the hidden input.
width number 400 Drawing-surface width in viewBox units; stroke coordinates use this space.
height number 200 Drawing-surface height in viewBox units.
size number 3 Stroke diameter at full pressure, in viewBox units.
thinning number 0.6 How strongly pressure thins the stroke, from 0 to 1.
smoothing number 0.5 Curve smoothing between samples, from 0 (polyline) to 1.
pressure SignaturePadPressureMode "auto" Pressure source: pen pressure with simulated pressure for mouse and touch (auto), raw pointer pressure, or always simulated from velocity.
historyLimit number 100 Maximum undo steps kept.

Events

Event Payload Description
update:modelValue [value: SignatureValue] Fired when the strokes request a new controlled value.
change [value: SignatureValue, previous: SignatureValue, reason: SignaturePadChangeReason] Fired after every distinct value request, with its cause.
strokeStart [point: SignaturePoint] Fired when a pointer starts a stroke.
strokeEnd [stroke: SignatureStroke] Fired when a stroke is committed.

Slots

Slot Slot props Description
default SignaturePadSlotState Canvas, guide, and controls. Receives the signature state.

Exposed

Member Type Description
canRedo —
canUndo —
clear —
disabled —
drawing —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.
empty —
readOnly —
redo —
setValue —
state —
toDataUrl —
toSvg —
undo —
value —

SignaturePadRoot

Source: src/families/media/signature-pad/signature-pad-root.vue

Props

Prop Type Default Description
id string | null undefined Consumer-owned base id. null and undefined select a deterministic fallback.
modelValue SignatureValue undefined Controlled strokes. undefined selects uncontrolled behavior.
defaultValue SignatureValue [] Initial strokes for uncontrolled use.
disabled boolean false Suppress drawing and every editing control.
readOnly boolean false Show the signature while suppressing drawing and editing.
name string undefined Form field name. When set, a hidden input submits the serialized signature.
form string undefined Id of the form that owns the hidden input.
valueFormat SignaturePadValueFormat "json" Serialization written to the hidden input.
width number 400 Drawing-surface width in viewBox units; stroke coordinates use this space.
height number 200 Drawing-surface height in viewBox units.
size number 3 Stroke diameter at full pressure, in viewBox units.
thinning number 0.6 How strongly pressure thins the stroke, from 0 to 1.
smoothing number 0.5 Curve smoothing between samples, from 0 (polyline) to 1.
pressure SignaturePadPressureMode "auto" Pressure source: pen pressure with simulated pressure for mouse and touch (auto), raw pointer pressure, or always simulated from velocity.
historyLimit number 100 Maximum undo steps kept.

Events

Event Payload Description
update:modelValue [value: SignatureValue] Fired when the strokes request a new controlled value.
change [value: SignatureValue, previous: SignatureValue, reason: SignaturePadChangeReason] Fired after every distinct value request, with its cause.
strokeStart [point: SignaturePoint] Fired when a pointer starts a stroke.
strokeEnd [stroke: SignatureStroke] Fired when a stroke is committed.

Slots

Slot Slot props Description
default SignaturePadSlotState Canvas, guide, and controls. Receives the signature state.

Exposed

Member Type Description
value SignatureValue Current strokes.
empty boolean Whether no stroke has been drawn.
drawing boolean Whether a stroke is in progress.
disabled boolean Whether drawing and editing are suppressed.
readOnly boolean Whether the value is shown but cannot change.
canUndo boolean Whether an undo step is available.
canRedo boolean Whether a redo step is available.
state SignaturePadState Stable state token for styling and tests.
element HTMLDivElement | null Rendered root element.
clear () => boolean Remove every stroke. Reports whether the value changed.
undo () => boolean Restore the previous value. Reports whether a step was undone.
redo () => boolean Re-apply the last undone value. Reports whether a step was redone.
setValue (value: SignatureValue) => boolean Replace the value. Reports whether it changed.
toSvg (options?: Partial<SignatureSvgOptions>) => string Serialize the current value as standalone SVG markup.
toDataUrl (options?: Partial<SignatureDataUrlOptions>) => Promise<string> Export the current value as a data URL (client-only for raster types).

SignaturePadUndo

Source: src/families/media/signature-pad/signature-pad-undo.vue

Events

Event Payload Description
click [nativeEvent: MouseEvent] Fired before undoing. Call preventDefault() to keep the strokes.

Slots

Slot Slot props Description
default SignaturePadSlotState Button label. Receives the pad state.

Exposed

Member Type Description
disabled —
element Readonly<ShallowRef<HTMLElement | null>> Template ref to the rendered root element.

Behavior

Normative state x input -> outcome table for signature-pad-root.vue, signature-pad-canvas.vue, signature-pad-guide.vue, signature-pad-undo.vue, signature-pad-redo.vue, and signature-pad-clear.vue (@vizejs/ui/signature-pad). Every row is proven by the named test.

Strokes are typed data ({ points: { x, y, pressure, time }[] }[]) in the drawing surface's viewBox coordinates, rendered as filled SVG outlines whose width follows pressure. The surface is not keyboard drawable; name it with ariaLabel, describe it with ariaDescribedby, and offer a typed-name field as the accessible alternative when a signature is required.

ID State Input Outcome Evidence
SP1 empty render root carries data-state="empty"; the <svg role="img"> has a label, description, viewBox, and client-side touch-action: none; controls are disabled renders an accessible SVG surface with empty state hooks
SP2 idle pointerdown / move / up client coordinates map to viewBox units, a live stroke renders while drawing, and pointerup commits with strokeStart, strokeEnd, change pointer strokes map to viewBox coordinates and commit on pointerup
SP3 drawing pen / coalesced events / pressure modes auto keeps pen pressure and simulates mouse/touch pressure; coalesced samples are appended; pointer and simulate force a source pen pressure, coalesced samples, and pressure modes shape the points
SP4 drawing secondary button / other pointer / cancel secondary buttons and foreign pointers are ignored; pointercancel discards the live stroke without a change ignores secondary buttons, foreign pointers, and cancelled strokes
SP5 filled Undo / Redo / Clear history restores and re-applies values, clear is undoable, new strokes drop the redo branch, and preventDefault() keeps state undo, redo, and clear walk history and honor preventDefault
SP6 history historyLimit only the configured number of undo steps is kept; 0 disables history history honors the configured limit
SP7 disabled/read-only draw / edit no stroke starts and every edit action reports false; state hooks reflect the mode disabled and read-only pads never draw or edit
SP8 controlled draw the request is emitted while the controlled value renders until the parent accepts it controlled strokes win until the parent accepts the request
SP9 name change / format / disabled a hidden input submits compact JSON or SVG (valueFormat), "" when empty, and is disabled with the pad submits the serialized value through a hidden input
SP10 exposed instance read / setValue / export exposes state, history, setValue, toSvg, and toDataUrl exposes typed state, history controls, and exports
SP11 missing provider setup compound parts fail closed with the shared context diagnostic compound parts require a matching root provider
SP12 pure helpers empty check isSignatureEmpty ignores strokes without points detects empty signatures
SP13 pure helpers velocity simulated pressure thickens slow and thins fast movement with easing simulates pressure from velocity with easing
SP14 pure helpers one sample / none single samples render dots; empty strokes and zero size render nothing; near-duplicates collapse renders single samples as dots and empty strokes as nothing
SP15 pure helpers outline half-width follows size, thinning, and pressure; edges smooth with smoothing; ends use round caps outlines strokes with pressure-dependent width, smoothing, and round caps
SP16 pure helpers SVG export standalone markup escapes attributes and adds an optional background serializes standalone SVG with escaped attributes and optional background
SP17 pure helpers data URL without canvas SVG data URLs need no canvas; raster export rejects with VIZE_UI_SIGNATURE_PAD_CANVAS_UNAVAILABLE exports SVG data URLs without a canvas and rejects raster export without one
SP18 pure helpers raster export raster output scales the canvas, fills the background, and fills each stroke through Path2D draws raster exports through Path2D on a scaled canvas
SP19 pure helpers JSON serialization rounds samples; parsing round-trips, clamps pressure, freezes, and rejects malformed input with a typed error round-trips compact JSON and serializes SVG for forms
SP20 SSR isolated requests markup, including stroke paths and the hidden input, is byte-identical and carries no inline style renders byte-identical signature markup across isolated SSR requests
SP21 SSR / hydration hydrate server markup hydrates without warnings or node replacement, then enables touch drawing hydrates signature markup without warnings or node replacement
SP22 types compile points, values, states, formats, reasons, and exposes are closed and read-only signature-pad.types.test-d.ts

Undo and redo history record requests; in controlled mode the parent decides whether each request is applied.