@domternal/extension-details 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/isNodeVisible.ts","../src/helpers/findClosestVisibleNode.ts","../src/helpers/setGapCursor.ts","../src/DetailsSummary.ts","../src/DetailsContent.ts","../src/Details.ts"],"names":["findParentNode","findChildren","GapCursor","Node","state","node","defaultBlockAt","Selection","PluginKey","TextSelection","pos","tr","Plugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Check if a node at a given position is visible in the DOM.\n * Uses offsetParent to detect hidden elements (e.g., collapsed details content).\n */\ninterface EditorLike {\n readonly view: {\n domAtPos(pos: number): { node: Node; offset: number };\n };\n}\n\nexport const isNodeVisible = (position: number, editor: EditorLike): boolean => {\n let node: Node | null = editor.view.domAtPos(position).node;\n // Walk up from text nodes to the nearest HTMLElement (text nodes lack offsetParent)\n while (node && !(node instanceof HTMLElement)) {\n node = node.parentNode;\n }\n if (!node) return false;\n return node.offsetParent !== null;\n};\n","/**\n * Find the closest visible ancestor node matching a predicate.\n * Walks up from $pos, checking both the predicate and DOM visibility.\n */\nimport type { Node as PMNode, ResolvedPos } from '@domternal/pm/model';\nimport { isNodeVisible } from './isNodeVisible.js';\n\ninterface EditorLike {\n readonly view: {\n domAtPos(pos: number): { node: Node; offset: number };\n };\n}\n\nexport const findClosestVisibleNode = (\n $pos: ResolvedPos,\n predicate: (node: PMNode) => boolean,\n editor: EditorLike,\n):\n | {\n pos: number;\n start: number;\n depth: number;\n node: PMNode;\n }\n | undefined => {\n for (let i = $pos.depth; i > 0; i--) {\n const node = $pos.node(i);\n const match = predicate(node);\n const visible = isNodeVisible($pos.start(i), editor);\n\n if (match && visible) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node,\n };\n }\n }\n\n return undefined;\n};\n","/**\n * Handle ArrowRight/ArrowDown when cursor is at the end of a details summary\n * and the content is collapsed. Sets a GapCursor after the details node.\n */\nimport { findParentNode, findChildren } from '@domternal/core';\nimport { GapCursor } from '@domternal/pm/gapcursor';\nimport type { EditorState } from '@domternal/pm/state';\nimport type { EditorView } from '@domternal/pm/view';\nimport { isNodeVisible } from './isNodeVisible.js';\n\ninterface EditorLike {\n readonly state: EditorState;\n readonly view: EditorView;\n readonly extensionManager?: {\n readonly extensions: readonly { readonly name: string }[];\n };\n}\n\nexport const setGapCursor = (editor: EditorLike, direction: 'down' | 'right'): boolean => {\n const { state, view } = editor;\n const { schema, selection } = state;\n const { empty, $anchor } = selection;\n const summaryType = schema.nodes['detailsSummary'];\n const detailsType = schema.nodes['details'];\n const contentType = schema.nodes['detailsContent'];\n\n // Check if GapCursor extension is available\n const hasGapCursor = editor.extensionManager?.extensions.some(\n (ext) => ext.name === 'gapcursor' || ext.name === 'gapCursor',\n );\n\n if (!empty || $anchor.parent.type !== summaryType || !hasGapCursor) {\n return false;\n }\n\n // For ArrowRight, only activate at end of summary\n if (direction === 'right' && $anchor.parentOffset !== $anchor.parent.nodeSize - 2) {\n return false;\n }\n\n const details = findParentNode((node) => node.type === detailsType)(selection);\n if (!details) return false;\n\n const detailsContent = findChildren(details.node, (node) => node.type === contentType);\n if (!detailsContent.length) return false;\n\n const firstContent = detailsContent[0];\n if (!firstContent) return false;\n\n const isOpen = isNodeVisible(details.start + firstContent.pos + 1, editor);\n if (isOpen) return false;\n\n const $position = state.doc.resolve(details.pos + details.node.nodeSize);\n const found = GapCursor.findFrom($position, 1, false);\n\n if (!found) return false;\n\n const { tr } = state;\n // GapCursor.findFrom returns Selection; use its $from for GapCursor constructor\n const gapCursorSelection = new GapCursor(found.$from);\n\n tr.setSelection(gapCursorSelection);\n tr.scrollIntoView();\n view.dispatch(tr);\n\n return true;\n};\n","/**\n * DetailsSummary Node\n *\n * The clickable summary/header part of a <details> accordion.\n * Contains inline content only (text, marks).\n */\n\nimport { Node } from '@domternal/core';\n\nexport interface DetailsSummaryOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const DetailsSummary = Node.create<DetailsSummaryOptions>({\n name: 'detailsSummary',\n content: 'inline*',\n defining: true,\n selectable: false,\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'summary' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['summary', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n});\n","/**\n * DetailsContent Node\n *\n * Wrapper for the collapsible content inside a <details> accordion.\n * Renders as <div data-details-content> since HTML <details> has no\n * native wrapper for non-summary content.\n *\n * Features:\n * - Hidden by default via NodeView (toggleable via event)\n * - Double-Enter at end escapes out of details\n */\n\nimport { Node, findParentNode, defaultBlockAt } from '@domternal/core';\nimport { Selection } from '@domternal/pm/state';\nimport type { ViewMutationRecord } from '@domternal/pm/view';\n\nexport interface DetailsContentOptions {\n HTMLAttributes: Record<string, unknown>;\n}\n\nexport const DetailsContent = Node.create<DetailsContentOptions>({\n name: 'detailsContent',\n content: 'block+',\n defining: true,\n selectable: false,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [\n { tag: 'div[data-details-content]' },\n { tag: 'div[data-type=\"detailsContent\"]' },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n 'div',\n { ...this.options.HTMLAttributes, ...HTMLAttributes, 'data-details-content': '' },\n 0,\n ];\n },\n\n addNodeView() {\n const options = this.options;\n return () => {\n const dom = document.createElement('div');\n\n dom.setAttribute('data-details-content', '');\n dom.setAttribute('hidden', 'hidden');\n\n for (const [key, value] of Object.entries(options.HTMLAttributes)) {\n if (value !== null && value !== undefined) {\n dom.setAttribute(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\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 return !dom.contains(mutation.target) || dom === mutation.target;\n },\n update: (updatedNode) => {\n if (updatedNode.type.name !== 'detailsContent') {\n return false;\n }\n return true;\n },\n };\n };\n },\n\n addKeyboardShortcuts() {\n return {\n // Double-Enter escape: when pressing Enter on the last empty block\n // inside details content, escape out and create a new block after details\n Enter: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { state, view } = editor;\n const { selection } = state;\n const { $from, empty } = selection;\n const detailsContent = findParentNode(\n (node) => node.type === state.schema.nodes['detailsContent'],\n )(selection);\n\n if (!empty || !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 // 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","/**\n * Details Node\n *\n * Block-level accordion/collapsible container using HTML <details>/<summary>.\n * Contains exactly one DetailsSummary followed by one DetailsContent.\n *\n * Commands:\n * - setDetails: Wraps selected content in a details structure\n * - unsetDetails: Lifts content out of details (preserves summary as paragraph)\n * - toggleDetails: Toggles between wrapped/unwrapped\n * - openDetails / closeDetails: Programmatic open/close control\n *\n * Renders semantic <details>/<summary> HTML.\n * Parses both native <details> and <div data-type=\"details\"> for compatibility.\n * Summary supports inline marks (bold, italic) via inline* content spec.\n */\n\nimport { Node, findParentNode, findChildren, defaultBlockAt } from '@domternal/core';\nimport type { CommandSpec, ToolbarItem } from '@domternal/core';\nimport { Plugin, PluginKey, Selection, TextSelection } from '@domternal/pm/state';\nimport type { ViewMutationRecord } from '@domternal/pm/view';\nimport { isNodeVisible } from './helpers/isNodeVisible.js';\nimport { findClosestVisibleNode } from './helpers/findClosestVisibleNode.js';\nimport { setGapCursor } from './helpers/setGapCursor.js';\nimport { DetailsSummary } from './DetailsSummary.js';\nimport { DetailsContent } from './DetailsContent.js';\n\ndeclare module '@domternal/core' {\n interface RawCommands {\n setDetails: CommandSpec;\n unsetDetails: CommandSpec;\n toggleDetails: CommandSpec;\n openDetails: CommandSpec;\n closeDetails: CommandSpec;\n setDetailsOpen: CommandSpec<[open: boolean]>;\n }\n}\n\nexport interface DetailsOptions {\n /**\n * Whether the open/closed state should be persisted in the document.\n * When true, the `open` attribute is saved and restored.\n * @default false\n */\n persist: boolean;\n\n /**\n * CSS class name applied when the details is open.\n * @default 'is-open'\n */\n openClassName: string;\n\n /**\n * Custom HTML attributes for the rendered element.\n */\n HTMLAttributes: Record<string, unknown>;\n}\n\nconst detailsSelectionPluginKey = new PluginKey('detailsSelection');\n\nexport const Details = Node.create<DetailsOptions>({\n name: 'details',\n group: 'block',\n content: 'detailsSummary detailsContent',\n defining: true,\n isolating: true,\n allowGapCursor: false,\n\n addOptions() {\n return {\n persist: false,\n openClassName: 'is-open',\n HTMLAttributes: {},\n };\n },\n\n addAttributes() {\n if (!this.options.persist) {\n return {};\n }\n\n return {\n open: {\n default: false,\n parseHTML: (element: HTMLElement) => element.hasAttribute('open'),\n renderHTML: (attrs: Record<string, unknown>) => {\n if (!attrs['open']) {\n return {};\n }\n return { open: '' };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n { tag: 'details' },\n { tag: 'div[data-type=\"details\"]' },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['details', { ...this.options.HTMLAttributes, ...HTMLAttributes }, 0];\n },\n\n addNodeView() {\n const options = this.options;\n const editor = this.editor;\n const nodeType = this.nodeType;\n\n return (node, _view, getPos) => {\n const dom = document.createElement('div');\n dom.setAttribute('data-type', 'details');\n\n for (const [key, value] of Object.entries(options.HTMLAttributes)) {\n if (value !== null && value !== undefined) {\n dom.setAttribute(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n }\n\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.addEventListener('mousedown', (e) => { e.preventDefault(); });\n dom.append(toggle);\n\n const content = document.createElement('div');\n dom.append(content);\n\n const toggleDetailsContent = (setToValue?: boolean): void => {\n const isOpen = dom.classList.contains(options.openClassName);\n if (setToValue !== undefined && setToValue === isOpen) return;\n\n dom.classList.toggle(options.openClassName, setToValue);\n content\n .querySelector(':scope > div[data-details-content]')\n ?.dispatchEvent(new Event('toggleDetailsContent'));\n };\n\n if (node.attrs['open']) {\n setTimeout(() => { toggleDetailsContent(); });\n }\n\n toggle.addEventListener('click', () => {\n toggleDetailsContent();\n\n if (!options.persist) {\n if (editor) {\n editor.commands['focus']?.();\n }\n return;\n }\n\n if (editor && typeof getPos === 'function') {\n const pos = getPos();\n if (pos === undefined) return;\n\n const { state, view } = editor;\n const { from, to } = state.selection;\n const currentNode = state.doc.nodeAt(pos);\n\n if (currentNode?.type !== nodeType) return;\n\n const tr = state.tr.setNodeMarkup(pos, undefined, {\n open: !currentNode.attrs['open'],\n });\n tr.setSelection(TextSelection.create(tr.doc, from, to));\n view.dispatch(tr);\n editor.commands['focus']?.();\n }\n });\n\n return {\n dom,\n contentDOM: content,\n ignoreMutation(mutation: ViewMutationRecord) {\n if (mutation.type === 'selection') {\n return false;\n }\n return !dom.contains(mutation.target) || dom === mutation.target;\n },\n update: (updatedNode) => {\n if (updatedNode.type !== nodeType) {\n return false;\n }\n if (updatedNode.attrs['open'] !== undefined) {\n toggleDetailsContent(updatedNode.attrs['open'] as boolean);\n }\n return true;\n },\n };\n };\n },\n\n addToolbarItems(): ToolbarItem[] {\n return [\n {\n type: 'button',\n name: 'details',\n command: 'toggleDetails',\n isActive: 'details',\n icon: 'caretCircleRight',\n label: 'Toggle Details',\n group: 'insert',\n priority: 100,\n },\n ];\n },\n\n addExtensions() {\n return [DetailsSummary, DetailsContent];\n },\n\n addCommands() {\n return {\n setDetails:\n () =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const { $from, $to } = tr.selection;\n const range = $from.blockRange($to);\n\n if (!range) return false;\n\n const detailsType = schema.nodes['details'];\n const summaryType = schema.nodes['detailsSummary'];\n const contentType = schema.nodes['detailsContent'];\n if (!detailsType || !summaryType || !contentType) return false;\n\n // Check if already inside a details node\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === detailsType) return false;\n }\n\n if (!dispatch) return true;\n\n // Collect selected blocks\n const selectedContent = [];\n for (let i = range.startIndex; i < range.endIndex; i++) {\n selectedContent.push(range.parent.child(i));\n }\n if (selectedContent.length === 0) return false;\n\n const summary = summaryType.create(null);\n const content = contentType.create(null, selectedContent);\n const details = detailsType.create(null, [summary, content]);\n\n tr.replaceWith(range.start, range.end, details);\n // Place cursor in the summary (range.start + 1 = inside details, + 1 = inside summary)\n tr.setSelection(TextSelection.create(tr.doc, range.start + 2));\n dispatch(tr.scrollIntoView());\n return true;\n },\n\n unsetDetails:\n () =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const detailsType = schema.nodes['details'];\n if (!detailsType) return false;\n\n const details = findParentNode(\n (node) => node.type === detailsType,\n )(tr.selection);\n\n if (!details) return false;\n if (!dispatch) return true;\n\n const summaries = findChildren(\n details.node,\n (node) => node.type === schema.nodes['detailsSummary'],\n );\n const contents = findChildren(\n details.node,\n (node) => node.type === schema.nodes['detailsContent'],\n );\n\n if (!summaries.length || !contents.length) return false;\n\n const detailsSummary = summaries[0];\n const detailsContent = contents[0];\n if (!detailsSummary || !detailsContent) return false;\n const from = details.pos;\n const $from = state.doc.resolve(from);\n const to = from + details.node.nodeSize;\n\n // Convert summary content to a paragraph (or default block type)\n const defaultType = $from.parent.type.contentMatch.defaultType;\n const blocks = [];\n\n if (defaultType && detailsSummary.node.content.size > 0) {\n blocks.push(defaultType.create(null, detailsSummary.node.content));\n }\n\n // Extract all content blocks\n detailsContent.node.forEach((child) => blocks.push(child));\n\n tr.replaceWith(from, to, blocks);\n tr.setSelection(TextSelection.create(tr.doc, from + 1));\n dispatch(tr.scrollIntoView());\n return true;\n },\n\n toggleDetails:\n () =>\n ({ state, tr, dispatch }) => {\n const { schema } = state;\n const detailsType = schema.nodes['details'];\n const summaryType = schema.nodes['detailsSummary'];\n const contentType = schema.nodes['detailsContent'];\n if (!detailsType || !summaryType || !contentType) return false;\n\n /** Wrap blocks in $from.blockRange($to) with a details node. Returns start pos or -1. */\n const wrapInDetails = (\n t: typeof tr,\n $from: ReturnType<typeof tr.doc.resolve>,\n $to: ReturnType<typeof tr.doc.resolve>,\n ): number => {\n const range = $from.blockRange($to);\n if (!range) return -1;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === detailsType) return -1;\n }\n const blocks = [];\n for (let i = range.startIndex; i < range.endIndex; i++) {\n blocks.push(range.parent.child(i));\n }\n if (blocks.length === 0) return -1;\n const summary = summaryType.create(null);\n const content = contentType.create(null, blocks);\n t.replaceWith(range.start, range.end, detailsType.create(null, [summary, content]));\n return range.start;\n };\n\n /** Unwrap a details node found by findParentNode. Returns start pos or -1. */\n const unwrapDetails = (\n t: typeof tr,\n details: { pos: number; node: typeof tr.doc },\n ): number => {\n const sums = findChildren(details.node, (n) => n.type === summaryType);\n const conts = findChildren(details.node, (n) => n.type === contentType);\n if (!sums.length || !conts.length) return -1;\n const detailsSummary = sums[0];\n const detailsContent = conts[0];\n if (!detailsSummary || !detailsContent) return -1;\n const from = details.pos;\n const $f = t.doc.resolve(from);\n const to = from + details.node.nodeSize;\n const defaultType = $f.parent.type.contentMatch.defaultType;\n const result = [];\n if (defaultType && detailsSummary.node.content.size > 0) {\n result.push(defaultType.create(null, detailsSummary.node.content));\n }\n detailsContent.node.forEach((child) => result.push(child));\n t.replaceWith(from, to, result);\n return from;\n };\n\n const { ranges } = state.selection;\n\n // ── Single range (normal TextSelection) ──\n if (ranges.length <= 1) {\n const { $from } = state.selection;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === detailsType) {\n if (!dispatch) return true;\n const details = findParentNode((n) => n.type === detailsType)(tr.selection);\n if (!details) return false;\n const pos = unwrapDetails(tr, details);\n if (pos < 0) return false;\n tr.setSelection(TextSelection.create(tr.doc, pos + 1));\n dispatch(tr.scrollIntoView());\n return true;\n }\n }\n if (!dispatch) return true;\n const pos = wrapInDetails(tr, tr.selection.$from, tr.selection.$to);\n if (pos < 0) return false;\n // pos + 1 = inside details, + 1 = inside summary\n tr.setSelection(TextSelection.create(tr.doc, pos + 2));\n dispatch(tr.scrollIntoView());\n return true;\n }\n\n // ── Multi range (CellSelection) ──\n // CellSelection range.$from is at the cell content start (before children),\n // NOT inside a details node. Check the cell's first child instead.\n const cellHasDetails = (doc: typeof state.doc, from: number): boolean => {\n const $f = doc.resolve(from);\n const cell = $f.parent;\n return cell.childCount === 1 && cell.firstChild?.type === detailsType;\n };\n\n // Snapshot positions and sort descending to process bottom-first\n const cells = ranges\n .map((r) => ({ from: r.$from.pos, to: r.$to.pos }))\n .sort((a, b) => b.from - a.from);\n\n // Determine global toggle direction on unmodified doc\n const allInDetails = cells.every((c) => cellHasDetails(state.doc, c.from));\n\n if (!dispatch) return true;\n\n for (const cell of cells) {\n const from = tr.mapping.map(cell.from);\n const to = tr.mapping.map(cell.to);\n\n if (allInDetails) {\n // The details node is the first (only) child of the cell, right at `from`\n const detailsNode = tr.doc.nodeAt(from);\n if (detailsNode?.type === detailsType) {\n unwrapDetails(tr, { pos: from, node: detailsNode });\n }\n } else {\n if (cellHasDetails(tr.doc, from)) continue;\n const $f = tr.doc.resolve(from);\n const $to2 = tr.doc.resolve(to);\n wrapInDetails(tr, $f, $to2);\n }\n }\n\n dispatch(tr.scrollIntoView());\n return true;\n },\n\n openDetails: () => ({ commands }) => commands.setDetailsOpen(true),\n closeDetails: () => ({ commands }) => commands.setDetailsOpen(false),\n\n setDetailsOpen:\n (open: boolean) =>\n ({ state, tr, dispatch }) => {\n if (!this.options.persist) return false;\n\n const detailsType = state.schema.nodes['details'];\n if (!detailsType) return false;\n\n const details = findParentNode(\n (node) => node.type === detailsType,\n )(state.selection);\n\n if (!details) return false;\n if (!!details.node.attrs['open'] === open) return false;\n\n if (dispatch) {\n tr.setNodeMarkup(details.pos, undefined, {\n ...details.node.attrs,\n open,\n });\n dispatch(tr);\n }\n return true;\n },\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { schema, selection } = editor.state;\n const { empty, $anchor } = selection;\n const summaryType = schema.nodes['detailsSummary'];\n\n if (!empty || !summaryType || $anchor.parent.type !== summaryType) {\n return false;\n }\n\n // Safari bug: backspace removes all text in <summary>\n // Handle manually by deleting one char\n if ($anchor.parentOffset !== 0) {\n const { tr } = editor.state;\n tr.delete($anchor.pos - 1, $anchor.pos);\n editor.view.dispatch(tr);\n return true;\n }\n\n // At start of summary — unset details\n return editor.commands['unsetDetails']?.() ?? false;\n },\n\n Enter: () => {\n const editor = this.editor;\n if (!editor) return false;\n\n const { state, view } = editor;\n const { schema, selection } = state;\n const { $head } = selection;\n const summaryType = schema.nodes['detailsSummary'];\n\n if (!summaryType || $head.parent.type !== summaryType) {\n return false;\n }\n\n const isVisible = isNodeVisible($head.after() + 1, editor);\n\n // If content is hidden, open it first, then fall through to visible logic\n if (!isVisible) {\n const detailsPos = $head.before(-1);\n const detailsDom = view.nodeDOM(detailsPos);\n\n if (detailsDom instanceof HTMLElement) {\n detailsDom.classList.add(this.options.openClassName);\n const contentEl = detailsDom.querySelector('[data-details-content]');\n if (contentEl) {\n contentEl.dispatchEvent(new Event('toggleDetailsContent'));\n }\n }\n\n if (this.options.persist) {\n const detailsNode = state.doc.nodeAt(detailsPos);\n if (detailsNode) {\n const { tr } = state;\n tr.setNodeMarkup(detailsPos, undefined, {\n ...detailsNode.attrs,\n open: true,\n });\n const contentStartPos = $head.after() + 1;\n tr.setSelection(Selection.near(tr.doc.resolve(contentStartPos), 1));\n tr.scrollIntoView();\n view.dispatch(tr);\n return true;\n }\n }\n }\n\n // Content is (now) visible — create new block at start of detailsContent\n const above = state.doc.nodeAt($head.after());\n\n if (!above) return false;\n\n const type = defaultBlockAt(above.contentMatchAt(0));\n\n if (!type || !above.canReplaceWith(0, 0, type)) {\n return false;\n }\n\n const node = type.createAndFill();\n if (!node) return false;\n\n const pos = $head.after() + 1;\n const tr = state.tr.replaceWith(pos, pos, node);\n const $pos = tr.doc.resolve(pos);\n const newSelection = Selection.near($pos, 1);\n\n tr.setSelection(newSelection);\n tr.setMeta('detailsEnterOpen', true);\n tr.scrollIntoView();\n view.dispatch(tr);\n\n return true;\n },\n\n ArrowRight: () => {\n const editor = this.editor;\n if (!editor) return false;\n return setGapCursor(editor, 'right');\n },\n\n ArrowDown: () => {\n const editor = this.editor;\n if (!editor) return false;\n return setGapCursor(editor, 'down');\n },\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const nodeType = this.nodeType;\n\n return [\n // Prevent text selections within hidden content\n new Plugin({\n key: detailsSelectionPluginKey,\n appendTransaction: (transactions, oldState, newState) => {\n if (!editor) return;\n\n const isComposing = editor.view.composing;\n if (isComposing) return;\n\n const selectionSet = transactions.some((t) => t.selectionSet);\n if (!selectionSet || !oldState.selection.empty || !newState.selection.empty) {\n return;\n }\n\n // Skip when Enter handler intentionally placed cursor into just-opened content\n if (transactions.some((t) => t.getMeta('detailsEnterOpen'))) {\n return;\n }\n\n if (!nodeType) return;\n\n // Check if cursor is inside a details node\n const { $from } = newState.selection;\n let inDetails = false;\n for (let d = $from.depth; d > 0; d--) {\n if ($from.node(d).type === nodeType) {\n inDetails = true;\n break;\n }\n }\n if (!inDetails) return;\n\n const visible = isNodeVisible($from.pos, editor);\n if (visible) return;\n\n const details = findClosestVisibleNode(\n $from,\n (node) => node.type === nodeType,\n editor,\n );\n\n if (!details) return;\n\n const detailsSummaries = findChildren(\n details.node,\n (node) => node.type === newState.schema.nodes['detailsSummary'],\n );\n\n if (!detailsSummaries.length) return;\n\n const detailsSummary = detailsSummaries[0];\n if (!detailsSummary) return;\n\n const selectionDirection =\n oldState.selection.from < newState.selection.from ? 'forward' : 'backward';\n const correctedPosition =\n selectionDirection === 'forward'\n ? details.start + detailsSummary.pos\n : details.pos + detailsSummary.pos + detailsSummary.node.nodeSize;\n const correctedSelection = TextSelection.create(newState.doc, correctedPosition);\n\n return newState.tr.setSelection(correctedSelection);\n },\n }),\n ];\n },\n});\n"]}
@@ -0,0 +1,78 @@
1
+ import { CommandSpec, Node } from '@domternal/core';
2
+
3
+ /**
4
+ * Details Node
5
+ *
6
+ * Block-level accordion/collapsible container using HTML <details>/<summary>.
7
+ * Contains exactly one DetailsSummary followed by one DetailsContent.
8
+ *
9
+ * Commands:
10
+ * - setDetails: Wraps selected content in a details structure
11
+ * - unsetDetails: Lifts content out of details (preserves summary as paragraph)
12
+ * - toggleDetails: Toggles between wrapped/unwrapped
13
+ * - openDetails / closeDetails: Programmatic open/close control
14
+ *
15
+ * Renders semantic <details>/<summary> HTML.
16
+ * Parses both native <details> and <div data-type="details"> for compatibility.
17
+ * Summary supports inline marks (bold, italic) via inline* content spec.
18
+ */
19
+
20
+ declare module '@domternal/core' {
21
+ interface RawCommands {
22
+ setDetails: CommandSpec;
23
+ unsetDetails: CommandSpec;
24
+ toggleDetails: CommandSpec;
25
+ openDetails: CommandSpec;
26
+ closeDetails: CommandSpec;
27
+ setDetailsOpen: CommandSpec<[open: boolean]>;
28
+ }
29
+ }
30
+ interface DetailsOptions {
31
+ /**
32
+ * Whether the open/closed state should be persisted in the document.
33
+ * When true, the `open` attribute is saved and restored.
34
+ * @default false
35
+ */
36
+ persist: boolean;
37
+ /**
38
+ * CSS class name applied when the details is open.
39
+ * @default 'is-open'
40
+ */
41
+ openClassName: string;
42
+ /**
43
+ * Custom HTML attributes for the rendered element.
44
+ */
45
+ HTMLAttributes: Record<string, unknown>;
46
+ }
47
+ declare const Details: Node<DetailsOptions, unknown>;
48
+
49
+ /**
50
+ * DetailsSummary Node
51
+ *
52
+ * The clickable summary/header part of a <details> accordion.
53
+ * Contains inline content only (text, marks).
54
+ */
55
+
56
+ interface DetailsSummaryOptions {
57
+ HTMLAttributes: Record<string, unknown>;
58
+ }
59
+ declare const DetailsSummary: Node<DetailsSummaryOptions, unknown>;
60
+
61
+ /**
62
+ * DetailsContent Node
63
+ *
64
+ * Wrapper for the collapsible content inside a <details> accordion.
65
+ * Renders as <div data-details-content> since HTML <details> has no
66
+ * native wrapper for non-summary content.
67
+ *
68
+ * Features:
69
+ * - Hidden by default via NodeView (toggleable via event)
70
+ * - Double-Enter at end escapes out of details
71
+ */
72
+
73
+ interface DetailsContentOptions {
74
+ HTMLAttributes: Record<string, unknown>;
75
+ }
76
+ declare const DetailsContent: Node<DetailsContentOptions, unknown>;
77
+
78
+ export { Details, DetailsContent, type DetailsContentOptions, type DetailsOptions, DetailsSummary, type DetailsSummaryOptions };
@@ -0,0 +1,78 @@
1
+ import { CommandSpec, Node } from '@domternal/core';
2
+
3
+ /**
4
+ * Details Node
5
+ *
6
+ * Block-level accordion/collapsible container using HTML <details>/<summary>.
7
+ * Contains exactly one DetailsSummary followed by one DetailsContent.
8
+ *
9
+ * Commands:
10
+ * - setDetails: Wraps selected content in a details structure
11
+ * - unsetDetails: Lifts content out of details (preserves summary as paragraph)
12
+ * - toggleDetails: Toggles between wrapped/unwrapped
13
+ * - openDetails / closeDetails: Programmatic open/close control
14
+ *
15
+ * Renders semantic <details>/<summary> HTML.
16
+ * Parses both native <details> and <div data-type="details"> for compatibility.
17
+ * Summary supports inline marks (bold, italic) via inline* content spec.
18
+ */
19
+
20
+ declare module '@domternal/core' {
21
+ interface RawCommands {
22
+ setDetails: CommandSpec;
23
+ unsetDetails: CommandSpec;
24
+ toggleDetails: CommandSpec;
25
+ openDetails: CommandSpec;
26
+ closeDetails: CommandSpec;
27
+ setDetailsOpen: CommandSpec<[open: boolean]>;
28
+ }
29
+ }
30
+ interface DetailsOptions {
31
+ /**
32
+ * Whether the open/closed state should be persisted in the document.
33
+ * When true, the `open` attribute is saved and restored.
34
+ * @default false
35
+ */
36
+ persist: boolean;
37
+ /**
38
+ * CSS class name applied when the details is open.
39
+ * @default 'is-open'
40
+ */
41
+ openClassName: string;
42
+ /**
43
+ * Custom HTML attributes for the rendered element.
44
+ */
45
+ HTMLAttributes: Record<string, unknown>;
46
+ }
47
+ declare const Details: Node<DetailsOptions, unknown>;
48
+
49
+ /**
50
+ * DetailsSummary Node
51
+ *
52
+ * The clickable summary/header part of a <details> accordion.
53
+ * Contains inline content only (text, marks).
54
+ */
55
+
56
+ interface DetailsSummaryOptions {
57
+ HTMLAttributes: Record<string, unknown>;
58
+ }
59
+ declare const DetailsSummary: Node<DetailsSummaryOptions, unknown>;
60
+
61
+ /**
62
+ * DetailsContent Node
63
+ *
64
+ * Wrapper for the collapsible content inside a <details> accordion.
65
+ * Renders as <div data-details-content> since HTML <details> has no
66
+ * native wrapper for non-summary content.
67
+ *
68
+ * Features:
69
+ * - Hidden by default via NodeView (toggleable via event)
70
+ * - Double-Enter at end escapes out of details
71
+ */
72
+
73
+ interface DetailsContentOptions {
74
+ HTMLAttributes: Record<string, unknown>;
75
+ }
76
+ declare const DetailsContent: Node<DetailsContentOptions, unknown>;
77
+
78
+ export { Details, DetailsContent, type DetailsContentOptions, type DetailsOptions, DetailsSummary, type DetailsSummaryOptions };