UNPKG

@zag-js/signature-pad

Version:

Core logic for the signature-pad widget implemented as a state machine

174 lines (172 loc) 6.22 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/signature-pad.connect.ts var signature_pad_connect_exports = {}; __export(signature_pad_connect_exports, { connect: () => connect }); module.exports = __toCommonJS(signature_pad_connect_exports); var import_dom_query = require("@zag-js/dom-query"); var import_signature_pad = require("./signature-pad.anatomy.js"); var dom = __toESM(require("./signature-pad.dom.js")); function connect(service, normalize) { const { state, send, prop, computed, context, scope } = service; const drawing = state.matches("drawing"); const empty = computed("isEmpty"); const interactive = computed("isInteractive"); const disabled = !!prop("disabled"); const required = !!prop("required"); const translations = prop("translations"); return { empty, drawing, currentPath: context.get("currentPath"), paths: context.get("paths"), clear() { send({ type: "CLEAR" }); }, getDataUrl(type, quality) { if (computed("isEmpty")) return Promise.resolve(""); return dom.getDataUrl(scope, { type, quality }); }, getLabelProps() { return normalize.label({ ...import_signature_pad.parts.label.attrs, id: dom.getLabelId(scope), "data-disabled": (0, import_dom_query.dataAttr)(disabled), "data-required": (0, import_dom_query.dataAttr)(required), htmlFor: dom.getHiddenInputId(scope), onClick(event) { if (!interactive) return; if (event.defaultPrevented) return; const controlEl = dom.getControlEl(scope); controlEl?.focus({ preventScroll: true }); } }); }, getRootProps() { return normalize.element({ ...import_signature_pad.parts.root.attrs, "data-disabled": (0, import_dom_query.dataAttr)(disabled), id: dom.getRootId(scope) }); }, getControlProps() { return normalize.element({ ...import_signature_pad.parts.control.attrs, tabIndex: disabled ? void 0 : 0, id: dom.getControlId(scope), role: "application", "aria-roledescription": "signature pad", "aria-label": translations.control, "aria-disabled": disabled, "data-disabled": (0, import_dom_query.dataAttr)(disabled), onPointerDown(event) { if (!(0, import_dom_query.isLeftClick)(event)) return; if ((0, import_dom_query.isModifierKey)(event)) return; if (!interactive) return; const target = (0, import_dom_query.getEventTarget)(event); if (target?.closest("[data-part=clear-trigger]")) return; event.currentTarget.setPointerCapture(event.pointerId); const point = { x: event.clientX, y: event.clientY }; const controlEl = dom.getControlEl(scope); if (!controlEl) return; const { offset } = (0, import_dom_query.getRelativePoint)(point, controlEl); send({ type: "POINTER_DOWN", point: offset, pressure: event.pressure }); }, onPointerUp(event) { if (!interactive) return; if (event.currentTarget.hasPointerCapture(event.pointerId)) { event.currentTarget.releasePointerCapture(event.pointerId); } }, style: { position: "relative", touchAction: "none", userSelect: "none", WebkitUserSelect: "none" } }); }, getSegmentProps() { return normalize.svg({ ...import_signature_pad.parts.segment.attrs, style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%", pointerEvents: "none", fill: prop("drawing").fill } }); }, getSegmentPathProps(props) { return normalize.path({ ...import_signature_pad.parts.segmentPath.attrs, d: props.path }); }, getGuideProps() { return normalize.element({ ...import_signature_pad.parts.guide.attrs, "data-disabled": (0, import_dom_query.dataAttr)(disabled) }); }, getClearTriggerProps() { return normalize.button({ ...import_signature_pad.parts.clearTrigger.attrs, type: "button", "aria-label": translations.clearTrigger, hidden: !context.get("paths").length || drawing, disabled, onClick() { send({ type: "CLEAR" }); } }); }, getHiddenInputProps(props) { return normalize.input({ id: dom.getHiddenInputId(scope), type: "text", hidden: true, disabled, required: prop("required"), readOnly: true, name: prop("name"), value: props.value }); } }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { connect });