@domternal/extension-details 0.6.1 → 0.7.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.
package/README.md CHANGED
@@ -3,29 +3,31 @@
3
3
  [![Version](https://img.shields.io/npm/v/@domternal/extension-details.svg)](https://www.npmjs.com/package/@domternal/extension-details)
4
4
  [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/domternal/domternal/blob/main/LICENSE)
5
5
 
6
- A lightweight, extensible rich text editor toolkit built on <u>[ProseMirror](https://prosemirror.net/)</u>. Framework-agnostic headless core with first-class Angular, React, and Vue support.
6
+ A lightweight, extensible rich text editor toolkit built on <u>[ProseMirror](https://prosemirror.net/)</u>. Framework-agnostic headless core with first-class Angular, React, Vue, and Vanilla wrappers.
7
7
  Use it headless with vanilla JS/TS, add the built-in toolbar and theme, or drop in ready-made framework components. Fully tree-shakeable, import only what you use, unused extensions are stripped from your bundle.
8
8
 
9
9
  ## Links
10
10
 
11
- <u>[Website](https://domternal.dev)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[Documentation](https://domternal.dev/v1/introduction)</u>
12
- <u>[StackBlitz (Angular)](https://stackblitz.com/edit/domternal-angular-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (React)](https://stackblitz.com/edit/domternal-react-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (Vue)](https://stackblitz.com/edit/domternal-vue-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (Vanilla TS)](https://stackblitz.com/edit/domternal-vanilla-full-example)</u>
11
+ <u>[Website](https://domternal.dev)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[Documentation](https://domternal.dev/v1/introduction)</u>
12
+ <u>[StackBlitz (Angular)](https://stackblitz.com/edit/domternal-angular-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (React)](https://stackblitz.com/edit/domternal-react-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (Vue)](https://stackblitz.com/edit/domternal-vue-full-example)</u> &nbsp;&nbsp;&nbsp;•&nbsp;&nbsp;&nbsp; <u>[StackBlitz (Vanilla TS)](https://stackblitz.com/edit/domternal-vanilla-full-example)</u>
13
13
 
14
14
  ## Features
15
15
 
16
16
  See <u>[Packages & Bundle Size](https://domternal.dev/v1/packages)</u> for a full breakdown of all packages and what each one includes.
17
17
 
18
18
  - **Headless core** - use with any framework or vanilla JS/TS
19
- - **Angular components** - editor, toolbar, bubble menu, floating menu, emoji picker (signals, OnPush, zoneless-ready)
20
- - **React components** - composable `Domternal` component, toolbar, bubble menu, floating menu, emoji picker, custom node views (React 18+)
21
- - **Vue components** - composable `Domternal` component, `useEditor`/`useEditorState` composables, toolbar, bubble menu, floating menu, emoji picker, custom node views (Vue 3.3+)
22
- - **57 extensions across 12 packages** - 23 nodes, 9 marks, and 25 behavior extensions
23
- - **140+ chainable commands** - `editor.chain().focus().toggleBold().run()`
19
+ - **Angular components** - editor, toolbar, bubble menu, floating menu, emoji picker, notion color picker (signals, OnPush, zoneless-ready)
20
+ - **React components** - composable `Domternal` component, toolbar, bubble menu, floating menu, emoji picker, notion color picker, custom node views (React 18+)
21
+ - **Vue components** - composable `Domternal` component, `useEditor`/`useEditorState` composables, toolbar, bubble menu, floating menu, emoji picker, notion color picker, custom node views (Vue 3.3+)
22
+ - **Vanilla wrapper** - framework-free class-based API for Astro, Svelte, Solid, plain HTML, and Web Components - editor, toolbar, bubble menu, floating menu, emoji picker, notion color picker
23
+ - **Notion-style block UX** - drag-to-reorder, block context menu, slash command, smart paste, keyboard reorder, floating Table of Contents
24
+ - **65+ extensions across 15 packages** - nodes, marks, and behavior extensions
25
+ - **120+ chainable commands** - `editor.chain().focus().toggleBold().run()`
24
26
  - **Full table support** - cell merging, column resize, row/column controls, cell toolbar, all free and MIT licensed
25
27
  - **Tree-shakeable** - import only what you use, your bundler strips the rest
26
- - **~38 KB gzipped** (own code), <u>[~108 KB total](https://domternal.dev/v1/packages)</u> with ProseMirror
28
+ - **~44 KB gzipped** (own code), <u>[see Packages](https://domternal.dev/v1/packages)</u> for full bundle breakdown with ProseMirror
27
29
  - **TypeScript first** - 100% typed, zero `any`
28
- - **8,500+ tests** - 2,677 unit tests and 5,800+ E2E tests across 120+ Playwright specs
30
+ - **15,000+ tests** - 4,000+ unit and 11,000+ E2E across 230+ Playwright specs and 4 demo apps
29
31
  - **Light and dark theme** - 70+ CSS custom properties for full visual control
30
32
  - **Inline styles export** - `getHTML({ styled: true })` produces inline CSS ready for email clients, CMS, and Google Docs
31
33
  - **SSR helpers** - `generateHTML`, `generateJSON`, `generateText` for server-side rendering
package/dist/index.cjs CHANGED
@@ -334,6 +334,20 @@ var Details = core.Node.create({
334
334
  }
335
335
  ];
336
336
  },
337
+ addFloatingMenuItems() {
338
+ return [
339
+ {
340
+ name: "details",
341
+ label: "Toggle block",
342
+ description: "Collapsible content area",
343
+ icon: "caretCircleRight",
344
+ group: "Advanced",
345
+ priority: 100,
346
+ keywords: ["toggle", "collapse", "details", "accordion"],
347
+ command: "toggleDetails"
348
+ }
349
+ ];
350
+ },
337
351
  addExtensions() {
338
352
  return [DetailsSummary, DetailsContent];
339
353
  },
@@ -456,7 +470,12 @@ var Details = core.Node.create({
456
470
  return true;
457
471
  }
458
472
  }
473
+ const cursorInListItemLabel = tr.selection.empty && core.isInListItemLabel(tr.selection.$from);
459
474
  if (!dispatch) return true;
475
+ if (cursorInListItemLabel) {
476
+ const liftOk = core.liftCurrentListItem(state$1, tr);
477
+ if (!liftOk) return false;
478
+ }
460
479
  const pos = wrapInDetails(tr, tr.selection.$from, tr.selection.$to);
461
480
  if (pos < 0) return false;
462
481
  tr.setSelection(state.TextSelection.create(tr.doc, pos + 2));
@@ -1 +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.setAttribute('aria-label', 'Toggle details');\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"]}
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","isInListItemLabel","liftCurrentListItem","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 * Block-level accordion using native <details>/<summary>. Contains exactly\n * one DetailsSummary followed by one DetailsContent. Parses both native\n * <details> and `<div data-type=\"details\">` for compatibility.\n */\n\nimport { Node, findParentNode, findChildren, defaultBlockAt, liftCurrentListItem, isInListItemLabel } from '@domternal/core';\nimport type { CommandSpec, ToolbarItem, FloatingMenuItem } 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.setAttribute('aria-label', 'Toggle details');\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 addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'details',\n label: 'Toggle block',\n description: 'Collapsible content area',\n icon: 'caretCircleRight',\n group: 'Advanced',\n priority: 100,\n keywords: ['toggle', 'collapse', 'details', 'accordion'],\n command: 'toggleDetails',\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 // Notion-style PROACTIVE lift: when the cursor sits in the\n // LABEL paragraph of a list/task item, `wrapInDetails`'s\n // raw `tr.replaceWith` lets PM auto-fit details *inside*\n // the list item (producing an empty label + nested details\n // - schema-valid but visually wrong). Lift the item out\n // first so the wrap happens at top level.\n //\n // The lift itself only runs during dispatch (it mutates tr);\n // dry-run (`!dispatch`) follows the ProseMirror command\n // convention and reports `true` based on cursor position alone.\n // If a consumer needs strict can-it-actually-succeed semantics,\n // they should probe with the full chain.\n const cursorInListItemLabel =\n tr.selection.empty && isInListItemLabel(tr.selection.$from);\n\n if (!dispatch) return true;\n if (cursorInListItemLabel) {\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n }\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"]}
package/dist/index.d.cts CHANGED
@@ -1,20 +1,9 @@
1
1
  import { CommandSpec, Node } from '@domternal/core';
2
2
 
3
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.
4
+ * Block-level accordion using native <details>/<summary>. Contains exactly
5
+ * one DetailsSummary followed by one DetailsContent. Parses both native
6
+ * <details> and `<div data-type="details">` for compatibility.
18
7
  */
19
8
 
20
9
  declare module '@domternal/core' {
package/dist/index.d.ts CHANGED
@@ -1,20 +1,9 @@
1
1
  import { CommandSpec, Node } from '@domternal/core';
2
2
 
3
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.
4
+ * Block-level accordion using native <details>/<summary>. Contains exactly
5
+ * one DetailsSummary followed by one DetailsContent. Parses both native
6
+ * <details> and `<div data-type="details">` for compatibility.
18
7
  */
19
8
 
20
9
  declare module '@domternal/core' {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Node, findParentNode, defaultBlockAt, findChildren } from '@domternal/core';
1
+ import { Node, findParentNode, defaultBlockAt, findChildren, isInListItemLabel, liftCurrentListItem } from '@domternal/core';
2
2
  import { Selection, PluginKey, Plugin, TextSelection } from '@domternal/pm/state';
3
3
  import { GapCursor } from '@domternal/pm/gapcursor';
4
4
 
@@ -332,6 +332,20 @@ var Details = Node.create({
332
332
  }
333
333
  ];
334
334
  },
335
+ addFloatingMenuItems() {
336
+ return [
337
+ {
338
+ name: "details",
339
+ label: "Toggle block",
340
+ description: "Collapsible content area",
341
+ icon: "caretCircleRight",
342
+ group: "Advanced",
343
+ priority: 100,
344
+ keywords: ["toggle", "collapse", "details", "accordion"],
345
+ command: "toggleDetails"
346
+ }
347
+ ];
348
+ },
335
349
  addExtensions() {
336
350
  return [DetailsSummary, DetailsContent];
337
351
  },
@@ -454,7 +468,12 @@ var Details = Node.create({
454
468
  return true;
455
469
  }
456
470
  }
471
+ const cursorInListItemLabel = tr.selection.empty && isInListItemLabel(tr.selection.$from);
457
472
  if (!dispatch) return true;
473
+ if (cursorInListItemLabel) {
474
+ const liftOk = liftCurrentListItem(state, tr);
475
+ if (!liftOk) return false;
476
+ }
458
477
  const pos = wrapInDetails(tr, tr.selection.$from, tr.selection.$to);
459
478
  if (pos < 0) return false;
460
479
  tr.setSelection(TextSelection.create(tr.doc, pos + 2));
package/dist/index.js.map CHANGED
@@ -1 +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":["Node","findParentNode","node","findChildren","pos","tr","Selection","defaultBlockAt"],"mappings":"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","file":"index.js","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.setAttribute('aria-label', 'Toggle details');\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"]}
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":["Node","findParentNode","node","findChildren","pos","tr","Selection","defaultBlockAt"],"mappings":"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","file":"index.js","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 * Block-level accordion using native <details>/<summary>. Contains exactly\n * one DetailsSummary followed by one DetailsContent. Parses both native\n * <details> and `<div data-type=\"details\">` for compatibility.\n */\n\nimport { Node, findParentNode, findChildren, defaultBlockAt, liftCurrentListItem, isInListItemLabel } from '@domternal/core';\nimport type { CommandSpec, ToolbarItem, FloatingMenuItem } 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.setAttribute('aria-label', 'Toggle details');\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 addFloatingMenuItems(): FloatingMenuItem[] {\n return [\n {\n name: 'details',\n label: 'Toggle block',\n description: 'Collapsible content area',\n icon: 'caretCircleRight',\n group: 'Advanced',\n priority: 100,\n keywords: ['toggle', 'collapse', 'details', 'accordion'],\n command: 'toggleDetails',\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 // Notion-style PROACTIVE lift: when the cursor sits in the\n // LABEL paragraph of a list/task item, `wrapInDetails`'s\n // raw `tr.replaceWith` lets PM auto-fit details *inside*\n // the list item (producing an empty label + nested details\n // - schema-valid but visually wrong). Lift the item out\n // first so the wrap happens at top level.\n //\n // The lift itself only runs during dispatch (it mutates tr);\n // dry-run (`!dispatch`) follows the ProseMirror command\n // convention and reports `true` based on cursor position alone.\n // If a consumer needs strict can-it-actually-succeed semantics,\n // they should probe with the full chain.\n const cursorInListItemLabel =\n tr.selection.empty && isInListItemLabel(tr.selection.$from);\n\n if (!dispatch) return true;\n if (cursorInListItemLabel) {\n const liftOk = liftCurrentListItem(state, tr);\n if (!liftOk) return false;\n }\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domternal/extension-details",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "Details/accordion extension for Domternal editor",
5
5
  "author": "https://github.com/ThomasNowHere",
6
6
  "license": "MIT",
@@ -28,8 +28,8 @@
28
28
  "dist"
29
29
  ],
30
30
  "peerDependencies": {
31
- "@domternal/core": ">=0.6.1",
32
- "@domternal/pm": ">=0.6.1"
31
+ "@domternal/core": ">=0.7.0",
32
+ "@domternal/pm": ">=0.7.0"
33
33
  },
34
34
  "keywords": [
35
35
  "prosemirror",