"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; 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 __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/task-item/index.ts var index_exports = {}; __export(index_exports, { TaskItem: () => TaskItem, inputRegex: () => inputRegex }); module.exports = __toCommonJS(index_exports); // src/task-item/task-item.ts var import_core = require("@tiptap/core"); var inputRegex = /^\s*(\[([( |x])?\])\s$/; var TaskItem = import_core.Node.create({ name: "taskItem", addOptions() { return { nested: false, HTMLAttributes: {}, taskListTypeName: "taskList", a11y: void 0 }; }, content() { return this.options.nested ? "paragraph block*" : "paragraph+"; }, defining: true, addAttributes() { return { checked: { default: false, keepOnSplit: false, parseHTML: (element) => { const dataChecked = element.getAttribute("data-checked"); return dataChecked === "" || dataChecked === "true"; }, renderHTML: (attributes) => ({ "data-checked": attributes.checked }) } }; }, parseHTML() { return [ { tag: `li[data-type="${this.name}"]`, priority: 51 } ]; }, renderHTML({ node, HTMLAttributes }) { return [ "li", (0, import_core.mergeAttributes)(this.options.HTMLAttributes, HTMLAttributes, { "data-type": this.name }), [ "label", [ "input", { type: "checkbox", checked: node.attrs.checked ? "checked" : null } ], ["span"] ], ["div", 0] ]; }, parseMarkdown: (token, h) => { const content = []; if (token.tokens && token.tokens.length > 0) { content.push(h.createNode("paragraph", {}, h.parseInline(token.tokens))); } else if (token.text) { content.push(h.createNode("paragraph", {}, [h.createNode("text", { text: token.text })])); } else { content.push(h.createNode("paragraph", {}, [])); } if (token.nestedTokens && token.nestedTokens.length > 0) { const nestedContent = h.parseChildren(token.nestedTokens); content.push(...nestedContent); } return h.createNode("taskItem", { checked: token.checked || false }, content); }, renderMarkdown: (node, h) => { var _a; const checkedChar = ((_a = node.attrs) == null ? void 0 : _a.checked) ? "x" : " "; const prefix = `- [${checkedChar}] `; return (0, import_core.renderNestedMarkdownContent)(node, h, prefix); }, addKeyboardShortcuts() { const shortcuts = { Enter: () => this.editor.commands.splitListItem(this.name), "Shift-Tab": () => this.editor.commands.liftListItem(this.name) }; if (!this.options.nested) { return shortcuts; } return { ...shortcuts, Tab: () => this.editor.commands.sinkListItem(this.name) }; }, addNodeView() { return ({ node, HTMLAttributes, getPos, editor }) => { const listItem = document.createElement("li"); const checkboxWrapper = document.createElement("label"); const checkboxStyler = document.createElement("span"); const checkbox = document.createElement("input"); const content = document.createElement("div"); const updateA11Y = (currentNode) => { var _a, _b; checkbox.ariaLabel = ((_b = (_a = this.options.a11y) == null ? void 0 : _a.checkboxLabel) == null ? void 0 : _b.call(_a, currentNode, checkbox.checked)) || `Task item checkbox for ${currentNode.textContent || "empty task item"}`; }; updateA11Y(node); checkboxWrapper.contentEditable = "false"; checkbox.type = "checkbox"; checkbox.addEventListener("mousedown", (event) => event.preventDefault()); checkbox.addEventListener("change", (event) => { if (!editor.isEditable && !this.options.onReadOnlyChecked) { checkbox.checked = !checkbox.checked; return; } const { checked } = event.target; if (editor.isEditable && typeof getPos === "function") { editor.chain().focus(void 0, { scrollIntoView: false }).command(({ tr }) => { const position = getPos(); if (typeof position !== "number") { return false; } const currentNode = tr.doc.nodeAt(position); tr.setNodeMarkup(position, void 0, { ...currentNode == null ? void 0 : currentNode.attrs, checked }); return true; }).run(); } if (!editor.isEditable && this.options.onReadOnlyChecked) { if (!this.options.onReadOnlyChecked(node, checked)) { checkbox.checked = !checkbox.checked; } } }); Object.entries(this.options.HTMLAttributes).forEach(([key, value]) => { listItem.setAttribute(key, value); }); listItem.dataset.checked = node.attrs.checked; checkbox.checked = node.attrs.checked; checkboxWrapper.append(checkbox, checkboxStyler); listItem.append(checkboxWrapper, content); Object.entries(HTMLAttributes).forEach(([key, value]) => { listItem.setAttribute(key, value); }); let prevRenderedAttributeKeys = new Set(Object.keys(HTMLAttributes)); return { dom: listItem, contentDOM: content, update: (updatedNode) => { if (updatedNode.type !== this.type) { return false; } listItem.dataset.checked = updatedNode.attrs.checked; checkbox.checked = updatedNode.attrs.checked; updateA11Y(updatedNode); const extensionAttributes = editor.extensionManager.attributes; const newHTMLAttributes = (0, import_core.getRenderedAttributes)(updatedNode, extensionAttributes); const newKeys = new Set(Object.keys(newHTMLAttributes)); const staticAttrs = this.options.HTMLAttributes; prevRenderedAttributeKeys.forEach((key) => { if (!newKeys.has(key)) { if (key in staticAttrs) { listItem.setAttribute(key, staticAttrs[key]); } else { listItem.removeAttribute(key); } } }); Object.entries(newHTMLAttributes).forEach(([key, value]) => { if (value === null || value === void 0) { if (key in staticAttrs) { listItem.setAttribute(key, staticAttrs[key]); } else { listItem.removeAttribute(key); } } else { listItem.setAttribute(key, value); } }); prevRenderedAttributeKeys = newKeys; return true; } }; }; }, addInputRules() { return [ (0, import_core.wrappingInputRule)({ find: inputRegex, type: this.type, getAttributes: (match) => ({ checked: match[match.length - 1] === "x" }) }) ]; } }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { TaskItem, inputRegex }); //# sourceMappingURL=index.cjs.map