{"version":3,"file":"index.cjs","sources":["../src/details-content.ts"],"sourcesContent":["import {\n  defaultBlockAt,\n  findParentNode,\n  mergeAttributes,\n  Node,\n} from '@tiptap/core'\nimport { Selection } from '@tiptap/pm/state'\nimport type { ViewMutationRecord } from '@tiptap/pm/view'\n\nexport interface DetailsContentOptions {\n  /**\n   * Custom HTML attributes that should be added to the rendered HTML tag.\n   */\n  HTMLAttributes: {\n    [key: string]: any\n  },\n}\n\nexport const DetailsContent = Node.create<DetailsContentOptions>({\n  name: 'detailsContent',\n\n  content: 'block+',\n\n  defining: true,\n\n  selectable: false,\n\n  addOptions() {\n    return {\n      HTMLAttributes: {},\n    }\n  },\n\n  parseHTML() {\n    return [\n      {\n        tag: `div[data-type=\"${this.name}\"]`,\n      },\n    ]\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    return [\n      'div',\n      mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { 'data-type': this.name }),\n      0,\n    ]\n  },\n\n  addNodeView() {\n    return ({ HTMLAttributes }) => {\n      const dom = document.createElement('div')\n      const attributes = mergeAttributes(\n        this.options.HTMLAttributes,\n        HTMLAttributes,\n        {\n          'data-type': this.name,\n          hidden: 'hidden',\n        },\n      )\n\n      Object.entries(attributes).forEach(([key, value]) => dom.setAttribute(key, value))\n\n      dom.addEventListener('toggleDetailsContent', () => {\n        dom.toggleAttribute('hidden')\n      })\n\n      return {\n        dom,\n        contentDOM: dom,\n        ignoreMutation(mutation: ViewMutationRecord) {\n          if (mutation.type === 'selection') {\n            return false\n          }\n\n          return !dom.contains(mutation.target) || dom === mutation.target\n        },\n        update: updatedNode => {\n          if (updatedNode.type !== this.type) {\n            return false\n          }\n\n          return true\n        },\n      }\n    }\n  },\n\n  addKeyboardShortcuts() {\n    return {\n      // Escape node on double enter\n      Enter: ({ editor }) => {\n        const { state, view } = editor\n        const { selection } = state\n        const { $from, empty } = selection\n        const detailsContent = findParentNode(node => node.type === this.type)(selection)\n\n        if (!empty || !detailsContent || !detailsContent.node.childCount) {\n          return false\n        }\n\n        const fromIndex = $from.index(detailsContent.depth)\n        const { childCount } = detailsContent.node\n        const isAtEnd = childCount === fromIndex + 1\n\n        if (!isAtEnd) {\n          return false\n        }\n\n        const defaultChildType = detailsContent.node.type.contentMatch.defaultType\n        const defaultChildNode = defaultChildType?.createAndFill()\n\n        if (!defaultChildNode) {\n          return false\n        }\n\n        const $childPos = state.doc.resolve(detailsContent.pos + 1)\n        const lastChildIndex = childCount - 1\n        const lastChildNode = detailsContent.node.child(lastChildIndex)\n        const lastChildPos = $childPos.posAtIndex(lastChildIndex, detailsContent.depth)\n        const lastChildNodeIsEmpty = lastChildNode.eq(defaultChildNode)\n\n        if (!lastChildNodeIsEmpty) {\n          return false\n        }\n\n        // get parent of details node\n        const above = $from.node(-3)\n\n        if (!above) {\n          return false\n        }\n\n        // get default node type after details node\n        const after = $from.indexAfter(-3)\n        const type = defaultBlockAt(above.contentMatchAt(after))\n\n        if (!type || !above.canReplaceWith(after, after, type)) {\n          return false\n        }\n\n        const node = type.createAndFill()\n\n        if (!node) {\n          return false\n        }\n\n        const { tr } = state\n        const pos = $from.after(-2)\n\n        tr.replaceWith(pos, pos, node)\n\n        const $pos = tr.doc.resolve(pos)\n        const newSelection = Selection.near($pos, 1)\n\n        tr.setSelection(newSelection)\n\n        const deleteFrom = lastChildPos\n        const deleteTo = lastChildPos + lastChildNode.nodeSize\n\n        tr.delete(deleteFrom, deleteTo)\n        tr.scrollIntoView()\n        view.dispatch(tr)\n\n        return true\n      },\n    }\n  },\n})\n"],"names":["Node","mergeAttributes","state","findParentNode","defaultBlockAt","Selection"],"mappings":";;;;;;;AAkBa,MAAA,cAAc,GAAGA,SAAI,CAAC,MAAM,CAAwB;AAC/D,IAAA,IAAI,EAAE,gBAAgB;AAEtB,IAAA,OAAO,EAAE,QAAQ;AAEjB,IAAA,QAAQ,EAAE,IAAI;AAEd,IAAA,UAAU,EAAE,KAAK;IAEjB,UAAU,GAAA;QACR,OAAO;AACL,YAAA,cAAc,EAAE,EAAE;SACnB;KACF;IAED,SAAS,GAAA;QACP,OAAO;AACL,YAAA;AACE,gBAAA,GAAG,EAAE,CAAA,eAAA,EAAkB,IAAI,CAAC,IAAI,CAAI,EAAA,CAAA;AACrC,aAAA;SACF;KACF;IAED,UAAU,CAAC,EAAE,cAAc,EAAE,EAAA;QAC3B,OAAO;YACL,KAAK;AACL,YAAAC,oBAAe,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACxF,CAAC;SACF;KACF;IAED,WAAW,GAAA;AACT,QAAA,OAAO,CAAC,EAAE,cAAc,EAAE,KAAI;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;YACzC,MAAM,UAAU,GAAGA,oBAAe,CAChC,IAAI,CAAC,OAAO,CAAC,cAAc,EAC3B,cAAc,EACd;gBACE,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,gBAAA,MAAM,EAAE,QAAQ;AACjB,aAAA,CACF;YAED,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAElF,YAAA,GAAG,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,MAAK;AAChD,gBAAA,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC;AAC/B,aAAC,CAAC;YAEF,OAAO;gBACL,GAAG;AACH,gBAAA,UAAU,EAAE,GAAG;AACf,gBAAA,cAAc,CAAC,QAA4B,EAAA;AACzC,oBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE;AACjC,wBAAA,OAAO,KAAK;;AAGd,oBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,MAAM;iBACjE;gBACD,MAAM,EAAE,WAAW,IAAG;oBACpB,IAAI,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AAClC,wBAAA,OAAO,KAAK;;AAGd,oBAAA,OAAO,IAAI;iBACZ;aACF;AACH,SAAC;KACF;IAED,oBAAoB,GAAA;QAClB,OAAO;;AAEL,YAAA,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AACpB,gBAAA,MAAM,SAAEC,OAAK,EAAE,IAAI,EAAE,GAAG,MAAM;AAC9B,gBAAA,MAAM,EAAE,SAAS,EAAE,GAAGA,OAAK;AAC3B,gBAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS;AAClC,gBAAA,MAAM,cAAc,GAAGC,mBAAc,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AAEjF,gBAAA,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE;AAChE,oBAAA,OAAO,KAAK;;gBAGd,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;AACnD,gBAAA,MAAM,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,IAAI;AAC1C,gBAAA,MAAM,OAAO,GAAG,UAAU,KAAK,SAAS,GAAG,CAAC;gBAE5C,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,OAAO,KAAK;;gBAGd,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW;gBAC1E,MAAM,gBAAgB,GAAG,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,uBAAhB,gBAAgB,CAAE,aAAa,EAAE;gBAE1D,IAAI,CAAC,gBAAgB,EAAE;AACrB,oBAAA,OAAO,KAAK;;AAGd,gBAAA,MAAM,SAAS,GAAGD,OAAK,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;AAC3D,gBAAA,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC;gBACrC,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC/D,gBAAA,MAAM,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,KAAK,CAAC;gBAC/E,MAAM,oBAAoB,GAAG,aAAa,CAAC,EAAE,CAAC,gBAAgB,CAAC;gBAE/D,IAAI,CAAC,oBAAoB,EAAE;AACzB,oBAAA,OAAO,KAAK;;;gBAId,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE5B,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,OAAO,KAAK;;;gBAId,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAGE,mBAAc,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAExD,gBAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE;AACtD,oBAAA,OAAO,KAAK;;AAGd,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;gBAEjC,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,OAAO,KAAK;;AAGd,gBAAA,MAAM,EAAE,EAAE,EAAE,GAAGF,OAAK;gBACpB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE3B,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;gBAE9B,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;gBAChC,MAAM,YAAY,GAAGG,eAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAE5C,gBAAA,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;gBAE7B,MAAM,UAAU,GAAG,YAAY;AAC/B,gBAAA,MAAM,QAAQ,GAAG,YAAY,GAAG,aAAa,CAAC,QAAQ;AAEtD,gBAAA,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC;gBAC/B,EAAE,CAAC,cAAc,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AAEjB,gBAAA,OAAO,IAAI;aACZ;SACF;KACF;AACF,CAAA;;;;;"}