v-perfect-signature — プレッシャー対応署名パッド(Vue 2/3)

Library

概要

v-perfect-signatureは、筆圧に応じた線幅を滑らかに描画する署名パッドコンポーネントです。内部でperfect-freehandを利用してストロークを補間・最適化し、結果をCanvas上に描画します。Vue 2とVue 3の両方で使えるコンポーネントとして提供され、TypeScriptで型が整備されているため、プロジェクトへの導入やIDEでの補完が容易です。オプションで線の太さやスムージング、ストリームライン(補正)などのパラメータを指定でき、保存や復元、クリアなど署名に必要な機能を備えています。

GitHub

リポジトリの統計情報

  • スター数: 16
  • フォーク数: 0
  • ウォッチャー数: 16
  • コミット数: 30
  • ファイル数: 15
  • メインの言語: TypeScript

主な特徴

  • perfect-freehandを利用した高品質なストローク生成(筆圧対応)
  • Vue 2 / Vue 3 双方から利用可能なコンポーネント実装
  • TypeScriptで型付けされ、設定オプション(size, thinning, smoothing, streamline 等)を細かく調整可能
  • デモページと簡単なインストール手順(pnpm add)を提供

技術的なポイント

v-perfect-signatureは、ストローク生成処理をperfect-freehandに委譲し、得られた点列をCanvas APIに変換してレンダリングする仕組みです。入力はPointer Events(pointerdown/pointermove/pointerup)を基本とし、PointerEvent.pressureプロパティを使って筆圧を取得します。筆圧が利用できない環境では、速度や移動距離を基に擬似的に太さを調整するフォールバックが用意されていることが多く、このライブラリも同様の考え方を取り入れています。

Vueコンポーネントはpropsで描画パラメータ(size, thinning, smoothing, streamlineなど)を受け取り、内部でリアクティブに反映します。イベントとしては描画開始/終了やデータ取得(画像化やSVG/path取得)用のAPIを提供し、外部からクリアや読み込みを行えるリファレンス(ref)操作が可能です。TypeScriptによりpropsや返却値の型安全が確保され、エディタ補完も効きます。

ビルドや配布面では、pnpmを想定したパッケージングで軽量にまとめられており、デモはGitHub Pagesでホストされています。依存のperfect-freehandは計算量のある補間処理を行うため、フレーム毎の計算をrequestAnimationFrameやデバウンスで制御すると描画がスムーズになります。Canvasレンダリングはドロー命令が多くなるため、ストロークをポリゴン化して一度に描画する手法でパフォーマンスを向上させています。

注意点としては、サーバーサイドレンダリング(SSR)環境ではwindowやCanvasが存在しないため、クライアント側でのみ初期化する工夫が必要です。また、保存機能(toDataURLやSVG出力)はブラウザ依存な部分もあるため、用途に応じてエクスポート処理をカスタマイズすると良いでしょう。最後に、アクセシビリティとフォールバック入力(キーボードや簡易署名)を別途用意することで採用範囲が広がります。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • .npmrc: file
  • LICENSE.md: file
  • README.md: file
  • eslint.config.js: file

…他 10 ファイル

まとめ

Vueで筆圧対応の署名機能を手早く導入できる実用的なライブラリです。

リポジトリ情報:

READMEの抜粋:

v-perfect-signature

Pressure-sensitive signature drawing for Vue 2 and 3 built on top of perfect-freehand.

Demo: https://wobsoriano.github.io/v-perfect-signature

Install

pnpm add v-perfect-signature

Usage

<script setup>
import { ref } from 'vue'
import { VPerfectSignature } from 'v-perfect-signature'

const signaturePad = ref()
const strokeOptions = {
  size: 16,
  thinning: 0.75,
  smoothing: 0.5,
  streamline: ...