{"version":3,"file":"taiga-ui-editor-extensions-details.mjs","sources":["../../../projects/editor/extensions/details/index.ts","../../../projects/editor/extensions/details/taiga-ui-editor-extensions-details.ts"],"sourcesContent":["import {TUI_EDITOR_RESIZE_EVENT} from '@taiga-ui/editor/common';\nimport {tuiDeleteNode} from '@taiga-ui/editor/utils';\nimport {mergeAttributes, type RawCommands} from '@tiptap/core';\nimport {Details, type DetailsOptions} from '@tiptap/extension-details';\nimport {\n    DetailsContent,\n    type DetailsContentOptions,\n} from '@tiptap/extension-details-content';\nimport {\n    DetailsSummary,\n    type DetailsSummaryOptions,\n} from '@tiptap/extension-details-summary';\n\n/**\n * @deprecated use {@link DetailsOptions}\n */\nexport type TuiDetailsOptions = DetailsOptions;\n\n/**\n * @deprecated use {@link DetailsContentOptions}\n */\nexport type TuiDetailContentOptions = DetailsContentOptions;\n\nexport interface TuiDetailsExtensionOptions extends DetailsOptions {\n    inheritOpen?: boolean;\n}\n\n/**\n * @deprecated use {@link DetailsSummaryOptions}\n */\nexport type TuiSummaryOptions = DetailsSummaryOptions;\n\ninterface ServerSideGlobal extends NodeJS.Global {\n    document: Document | undefined;\n}\n\ndeclare const globalThis: ServerSideGlobal;\n\n// TODO: rename to TuiDetails in v5\nexport const TuiDetailsExtension = Details.extend<TuiDetailsExtensionOptions>({\n    addOptions() {\n        return {\n            // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n            ...this.parent?.(),\n            inheritOpen: false,\n        };\n    },\n\n    addAttributes() {\n        return {\n            open: {\n                default: 'open',\n                keepOnSplit: false,\n                parseHTML: (element) =>\n                    element.getAttribute('open') === 'open' ||\n                    element.getAttribute('open') === 'true' ||\n                    element.hasAttribute('open') ||\n                    element.getAttribute('data-opened'), // legacy\n                renderHTML: (attributes) => ({\n                    open:\n                        attributes.open && this.options.inheritOpen ? 'open' : undefined,\n                }),\n            },\n        };\n    },\n\n    renderHTML({HTMLAttributes}) {\n        return [\n            'details',\n            mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n            0,\n        ];\n    },\n\n    addNodeView() {\n        return ({node, getPos, editor}): any => {\n            if (globalThis.document) {\n                const wrapper = document.createElement('div');\n                const details = document.createElement('details');\n                const collapseButton = document.createElement('button');\n                const deleteButton = document.createElement('button');\n\n                wrapper.className = 't-details-wrapper';\n                collapseButton.className = 't-details-arrow';\n                collapseButton.type = 'button';\n                deleteButton.className = 't-details-delete';\n                deleteButton.type = 'button';\n                details.open = node.attrs.open;\n\n                const openHandler = (event: Event): void => {\n                    const pos = (getPos as any)?.() ?? 0;\n\n                    details.open = !details.open;\n                    (node.attrs as unknown as Record<string, unknown>).open =\n                        details.open;\n\n                    event.target?.dispatchEvent(\n                        new CustomEvent(TUI_EDITOR_RESIZE_EVENT, {bubbles: true}),\n                    );\n\n                    editor.chain().focus().setTextSelection(pos).run();\n                };\n\n                collapseButton.addEventListener('click', openHandler);\n\n                deleteButton.addEventListener(\n                    'click',\n                    (e) => {\n                        collapseButton.removeEventListener('click', openHandler);\n                        editor.commands.unsetDetails();\n                        e.preventDefault();\n                    },\n                    {capture: true, once: true},\n                );\n\n                wrapper.append(details, collapseButton, deleteButton);\n\n                return {\n                    dom: wrapper,\n                    contentDOM: details,\n                };\n            }\n        };\n    },\n    addCommands(): Partial<RawCommands> {\n        return {\n            ...this.parent?.(),\n            setDetails: () => {\n                return ({commands, editor, state}) => {\n                    if (editor.isActive('detailsSummary')) {\n                        return false;\n                    }\n\n                    const {schema, selection} = state;\n                    const {$from, $to} = selection;\n                    const range = $from.blockRange($to);\n\n                    if (!range) {\n                        return false;\n                    }\n\n                    const slice = state.doc.slice(range.start, range.end);\n                    const match = schema.nodes.detailsContent?.contentMatch.matchFragment(\n                        slice.content,\n                    );\n\n                    if (!match) {\n                        return false;\n                    }\n\n                    commands.insertContentAt(\n                        {from: range.start, to: range.end},\n                        {\n                            type: this.name,\n                            content: [\n                                {\n                                    type: 'detailsSummary',\n                                    content: [\n                                        {\n                                            type: 'paragraph',\n                                            content: [],\n                                        },\n                                    ],\n                                },\n                                {\n                                    type: 'detailsContent',\n                                    content: slice.toJSON()?.content ?? [],\n                                },\n                            ],\n                        },\n                    );\n\n                    commands.focus();\n                    commands.setTextSelection(range.start + 2);\n\n                    return true;\n                };\n            },\n            unsetDetails:\n                () =>\n                ({state, dispatch}) =>\n                    tuiDeleteNode(state, dispatch, this.name),\n        };\n    },\n});\n\nexport const TuiDetailsSummary = DetailsSummary.extend<DetailsSummaryOptions>({\n    content: 'block+',\n    group: 'block',\n});\n\n/**\n * @deprecated use {@link TuiDetailsSummary}\n */\nexport const TuiSummary = TuiDetailsSummary;\n\nexport const TuiDetailsContent = DetailsContent.extend<DetailsContentOptions>({\n    addNodeView: null,\n    parseHTML() {\n        return [{tag: 'div[data-type=\"details-content\"]'}];\n    },\n    renderHTML({HTMLAttributes}) {\n        return [\n            'div',\n            mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n                'data-type': 'details-content',\n            }),\n            0,\n        ];\n    },\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}