@ablogcms/block-editor 3.2.28-beta.0 → 3.2.29

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/utils/index.ts","../src/extensions/index.ts","../src/extensions/Selection/Selection.ts","../src/extensions/Table/Table.ts","../src/extensions/Table/Cell.ts","../src/extensions/Table/utils.ts","../src/extensions/Table/Row.ts","../src/extensions/Table/Header.ts","../src/extensions/HorizontalRule/HorizontalRule.ts","../src/extensions/Heading/Heading.ts","../src/extensions/Document/Document.ts","../src/extensions/TrailingNode/trailing-node.ts","../src/extensions/SlashCommand/SlashCommand.ts","../src/extensions/SlashCommand/BlockMenu.tsx","../src/extensions/FontStyle/FontStyle.ts","../src/extensions/Figcaption/Figcaption.ts","../src/extensions/Image/Image.ts","../src/extensions/Link/Link.ts","../src/extensions/ImageBlock/ImageBlock.ts","../src/extensions/ImageBlock/components/ImageBlockView.tsx","../src/extensions/mediaBlockContent.ts","../src/extensions/FileBlock/FileBlock.ts","../src/extensions/FileBlock/components/FileBlockView.tsx","../src/extensions/PasteHandler/PasteHandler.ts","../src/extensions/LinkButton/LinkButton.ts","../src/extensions/LinkButton/components/LinkButtonView.tsx","../src/extensions/MultiColumn/Column.ts","../src/extensions/MediaUpload/MediaUpload.ts","../src/extensions/MediaUpload/view/Dropzone.tsx","../src/extensions/MediaUpload/view/hooks.ts","../src/extensions/MediaUpload/view/insertMediaBlocks.ts","../src/extensions/MediaUpload/view/filterFilesByMediaType.ts","../src/extensions/CustomMark/CustomMark.ts","../src/extensions/CustomConvertBlock/CustomConvertBlock.ts","../src/lib/utils/isCustomNodeSelected.ts","../src/lib/utils/isTextSelected.ts"],"sourcesContent":["import classnames, { ArgumentArray as ClassValues } from 'classnames';\n\nexport function cn(...inputs: ClassValues) {\n return classnames(...inputs);\n}\n\n// eslint-disable-next-line\nexport function randomElement(array: any[]) {\n return array[Math.floor(Math.random() * array.length)];\n}\n\nexport * from './isCustomNodeSelected';\nexport * from './isTextSelected';\n","export { StarterKit } from '@tiptap/starter-kit';\nexport { Highlight } from '@tiptap/extension-highlight';\nexport { Underline } from '@tiptap/extension-underline';\nexport { TextAlign } from '@tiptap/extension-text-align';\nexport { TextStyle } from '@tiptap/extension-text-style';\nexport { Typography } from '@tiptap/extension-typography';\nexport { Subscript } from '@tiptap/extension-subscript';\nexport { Superscript } from '@tiptap/extension-superscript';\nexport { Paragraph } from '@tiptap/extension-paragraph';\nexport { CodeBlock } from '@tiptap/extension-code-block';\nexport { BulletList, OrderedList } from '@tiptap/extension-list';\nexport { Placeholder, Focus, Dropcursor } from '@tiptap/extensions';\n\nexport { Selection } from './Selection';\nexport { Table, TableCell, TableHeader, TableRow } from './Table';\nexport { HorizontalRule } from './HorizontalRule';\nexport { Heading } from './Heading';\nexport { Document } from './Document';\nexport { TrailingNode } from './TrailingNode';\nexport { SlashCommand } from './SlashCommand';\nexport { FontStyle } from './FontStyle';\nexport { Figure } from './Figure';\nexport { Figcaption } from './Figcaption';\nexport { BlockquoteFigure } from './BlockquoteFigure';\nexport { Quote } from './BlockquoteFigure/Quote';\nexport { QuoteCaption } from './BlockquoteFigure/QuoteCaption';\nexport { Link, isAllowedBlockEditorLinkUri } from './Link';\nexport { ImageBlock } from './ImageBlock';\nexport { FileBlock } from './FileBlock';\nexport { PasteHandler } from './PasteHandler';\nexport { LinkButton } from './LinkButton';\nexport { Columns, Column } from './MultiColumn';\nexport { MediaUpload } from './MediaUpload';\nexport { CustomMark } from './CustomMark';\nexport { CustomConvertBlock } from './CustomConvertBlock';\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nexport const Selection = Extension.create({\n name: 'selection',\n\n addProseMirrorPlugins() {\n const { editor } = this;\n\n return [\n new Plugin({\n key: new PluginKey('selection'),\n props: {\n decorations(state) {\n if (state.selection.empty) {\n return null;\n }\n\n if (editor.isFocused === true) {\n return null;\n }\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(state.selection.from, state.selection.to, {\n class: 'selection',\n }),\n ]);\n },\n },\n }),\n ];\n },\n});\n\nexport default Selection;\n","import { Table as TiptapTable } from '@tiptap/extension-table';\nimport { mergeAttributes } from '@tiptap/core';\nimport type { DOMOutputSpec } from 'prosemirror-model';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableBlock: {\n toggleTableScrollable: () => ReturnType;\n };\n }\n}\n\nexport const Table = TiptapTable.extend({\n addAttributes() {\n return {\n scrollable: {\n default: true,\n parseHTML: (element) => {\n return !!element.getAttribute('data-scrollable');\n },\n renderHTML: (attributes) => {\n return {\n 'data-scrollable': attributes.scrollable ? true : null,\n };\n },\n },\n };\n },\n renderHTML({ HTMLAttributes }): DOMOutputSpec {\n const scrollable = HTMLAttributes['data-scrollable'];\n const scrollableWrapperClass = scrollable ? ACMS.Config.blockEditorConfig.tableScrollableWrapperClass : '';\n const scrollableTableClass = ACMS.Config.blockEditorConfig.tableScrollableClass || '';\n const tableAttrs = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes);\n // class属性から scrollHintClass を除外し、必要に応じて再追加\n const originalClass = tableAttrs.class || '';\n const classList = originalClass.split(/\\s+/).filter((cls: string) => cls && cls !== scrollableTableClass); // 対象のクラスを除去\n\n if (scrollable) {\n classList.push(scrollableTableClass);\n }\n tableAttrs.class = classList.join(' ');\n\n return ['div', { class: `tableWrapper ${scrollableWrapperClass}`.trim() }, ['table', tableAttrs, ['tbody', 0]]];\n },\n\n addCommands() {\n return {\n ...this.parent?.(),\n toggleTableScrollable:\n () =>\n ({ commands, editor }) => {\n const { state } = editor;\n const { from, to } = state.selection;\n\n let found = false;\n\n state.doc.nodesBetween(from, to, (node) => {\n if (node.type.name === 'table') {\n found = true;\n const { scrollable } = node.attrs;\n commands.updateAttributes('table', { scrollable: !scrollable });\n return false; // stop recursing\n }\n });\n return found;\n },\n };\n },\n}).configure({\n resizable: false,\n});\n\nexport default Table;\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { Plugin } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nimport { getCellsInColumn, isRowSelected, selectRow } from './utils';\n\nexport interface TableCellOptions {\n HTMLAttributes: Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableCell: {\n setCellBackgroundColor: (color: string) => ReturnType;\n };\n }\n}\n\nexport const TableCell = Node.create<TableCellOptions>({\n name: 'tableCell',\n\n content: 'block+', // TODO: Do not allow table in table\n\n tableRole: 'cell',\n\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n parseHTML() {\n return [{ tag: 'td' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['td', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n },\n\n addAttributes() {\n return {\n colspan: {\n default: 1,\n parseHTML: (element) => {\n const colspan = element.getAttribute('colspan');\n const value = colspan ? parseInt(colspan, 10) : 1;\n\n return value;\n },\n },\n rowspan: {\n default: 1,\n parseHTML: (element) => {\n const rowspan = element.getAttribute('rowspan');\n const value = rowspan ? parseInt(rowspan, 10) : 1;\n\n return value;\n },\n },\n colwidth: {\n default: null,\n parseHTML: (element) => {\n const colwidth = element.getAttribute('colwidth');\n const value = colwidth ? [parseInt(colwidth, 10)] : null;\n\n return value;\n },\n },\n backgroundColor: {\n default: null,\n parseHTML: (element) => {\n const style = element.getAttribute('style');\n if (!style) return null;\n\n const match = style.match(/background-color:\\s*([^;]+)/i);\n return match ? match[1] : null;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) return {};\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setCellBackgroundColor:\n (color: string | null) =>\n ({ commands }) => {\n return commands.updateAttributes('tableCell', {\n backgroundColor: color,\n });\n },\n };\n },\n\n addProseMirrorPlugins() {\n const { isEditable } = this.editor;\n\n return [\n new Plugin({\n props: {\n decorations: (state) => {\n if (!isEditable) {\n return DecorationSet.empty;\n }\n\n const { doc, selection } = state;\n const decorations: Decoration[] = [];\n const cells = getCellsInColumn(0)(selection);\n\n if (cells) {\n cells.forEach(({ pos }: { pos: number }, index: number) => {\n decorations.push(\n Decoration.widget(pos + 1, () => {\n const rowSelected = isRowSelected(index)(selection);\n let className = 'grip-row';\n\n if (rowSelected) {\n className += ' selected';\n }\n\n if (index === 0) {\n className += ' first';\n }\n\n if (index === cells.length - 1) {\n className += ' last';\n }\n\n const grip = document.createElement('button');\n const icon = document.createElement('span');\n icon.className = 'material-symbols-outlined acms-admin-block-editor-icon grip-icon';\n icon.textContent = 'more_vert';\n icon.setAttribute('aria-hidden', 'true');\n grip.appendChild(icon);\n\n grip.className = className;\n grip.type = 'button';\n grip.addEventListener('mousedown', (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n\n this.editor.view.dispatch(selectRow(index)(this.editor.state.tr));\n });\n\n return grip;\n })\n );\n });\n }\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n","import { findParentNode } from '@tiptap/core';\nimport { Selection, Transaction } from '@tiptap/pm/state';\nimport { CellSelection, Rect, TableMap } from '@tiptap/pm/tables';\nimport { Node, ResolvedPos } from '@tiptap/pm/model';\n\nexport const isRectSelected = (rect: Rect) => (selection: CellSelection) => {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n const start = selection.$anchorCell.start(-1);\n const cells = map.cellsInRect(rect);\n const selectedCells = map.cellsInRect(\n map.rectBetween(selection.$anchorCell.pos - start, selection.$headCell.pos - start)\n );\n\n for (let i = 0, count = cells.length; i < count; i += 1) {\n if (selectedCells.indexOf(cells[i]) === -1) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const findTable = (selection: Selection) =>\n findParentNode((node) => node.type.spec.tableRole && node.type.spec.tableRole === 'table')(selection);\n\nexport const isCellSelection = (selection: unknown): selection is CellSelection => selection instanceof CellSelection;\n\nexport const isColumnSelected = (columnIndex: number) => (selection: Selection) => {\n if (isCellSelection(selection)) {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n\n return isRectSelected({\n left: columnIndex,\n right: columnIndex + 1,\n top: 0,\n bottom: map.height,\n })(selection);\n }\n\n return false;\n};\n\nexport const isRowSelected = (rowIndex: number) => (selection: Selection) => {\n if (isCellSelection(selection)) {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n\n return isRectSelected({\n left: 0,\n right: map.width,\n top: rowIndex,\n bottom: rowIndex + 1,\n })(selection);\n }\n\n return false;\n};\n\nexport const isTableSelected = (selection: Selection) => {\n if (isCellSelection(selection)) {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n\n return isRectSelected({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n })(selection);\n }\n\n return false;\n};\n\nexport const getCellsInColumn = (columnIndex: number | number[]) => (selection: Selection) => {\n const table = findTable(selection);\n if (table) {\n const map = TableMap.get(table.node);\n const indexes = Array.isArray(columnIndex) ? columnIndex : Array.from([columnIndex]);\n\n return indexes.reduce(\n (acc, index) => {\n if (index >= 0 && index <= map.width - 1) {\n const cells = map.cellsInRect({\n left: index,\n right: index + 1,\n top: 0,\n bottom: map.height,\n });\n\n return acc.concat(\n cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos);\n const pos = nodePos + table.start;\n\n return { pos, start: pos + 1, node };\n })\n );\n }\n\n return acc;\n },\n [] as { pos: number; start: number; node: Node | null | undefined }[]\n );\n }\n return null;\n};\n\nexport const getCellsInRow = (rowIndex: number | number[]) => (selection: Selection) => {\n const table = findTable(selection);\n\n if (table) {\n const map = TableMap.get(table.node);\n const indexes = Array.isArray(rowIndex) ? rowIndex : Array.from([rowIndex]);\n\n return indexes.reduce(\n (acc, index) => {\n if (index >= 0 && index <= map.height - 1) {\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: index,\n bottom: index + 1,\n });\n\n return acc.concat(\n cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos);\n const pos = nodePos + table.start;\n return { pos, start: pos + 1, node };\n })\n );\n }\n\n return acc;\n },\n [] as { pos: number; start: number; node: Node | null | undefined }[]\n );\n }\n\n return null;\n};\n\nexport const getCellsInTable = (selection: Selection) => {\n const table = findTable(selection);\n\n if (table) {\n const map = TableMap.get(table.node);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n });\n\n return cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos);\n const pos = nodePos + table.start;\n\n return { pos, start: pos + 1, node };\n });\n }\n\n return null;\n};\n\nexport const findParentNodeClosestToPos = ($pos: ResolvedPos, predicate: (node: Node) => boolean) => {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\n if (predicate(node)) {\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 null;\n};\n\nexport const findCellClosestToPos = ($pos: ResolvedPos) => {\n const predicate = (node: Node) => node.type.spec.tableRole && /cell/i.test(node.type.spec.tableRole);\n\n return findParentNodeClosestToPos($pos, predicate);\n};\n\nconst select = (type: 'row' | 'column') => (index: number) => (tr: Transaction) => {\n const table = findTable(tr.selection);\n const isRowSelection = type === 'row';\n\n if (table) {\n const map = TableMap.get(table.node);\n\n // Check if the index is valid\n if (index >= 0 && index < (isRowSelection ? map.height : map.width)) {\n const left = isRowSelection ? 0 : index;\n const top = isRowSelection ? index : 0;\n const right = isRowSelection ? map.width : index + 1;\n const bottom = isRowSelection ? index + 1 : map.height;\n\n const cellsInFirstRow = map.cellsInRect({\n left,\n top,\n right: isRowSelection ? right : left + 1,\n bottom: isRowSelection ? top + 1 : bottom,\n });\n\n const cellsInLastRow =\n bottom - top === 1\n ? cellsInFirstRow\n : map.cellsInRect({\n left: isRowSelection ? left : right - 1,\n top: isRowSelection ? bottom - 1 : top,\n right,\n bottom,\n });\n\n const head = table.start + cellsInFirstRow[0];\n const anchor = table.start + cellsInLastRow[cellsInLastRow.length - 1];\n const $head = tr.doc.resolve(head);\n const $anchor = tr.doc.resolve(anchor);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return tr.setSelection(new CellSelection($anchor, $head));\n }\n }\n return tr;\n};\n\nexport const selectColumn = select('column');\n\nexport const selectRow = select('row');\n\nexport const selectTable = (tr: Transaction) => {\n const table = findTable(tr.selection);\n\n if (table) {\n const { map } = TableMap.get(table.node);\n\n if (map && map.length) {\n const head = table.start + map[0];\n const anchor = table.start + map[map.length - 1];\n const $head = tr.doc.resolve(head);\n const $anchor = tr.doc.resolve(anchor);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return tr.setSelection(new CellSelection($anchor, $head));\n }\n }\n\n return tr;\n};\n","import { TableRow as TiptapTableRow } from '@tiptap/extension-table';\n\nexport const TableRow = TiptapTableRow.extend({\n allowGapCursor: false,\n content: '(tableCell | tableHeader)*',\n});\n\nexport default TableRow;\n","import { TableHeader as TiptapTableHeader } from '@tiptap/extension-table';\nimport { Plugin } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nimport { getCellsInRow, isColumnSelected, selectColumn } from './utils';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableHeader: {\n setHeaderBackgroundColor: (color: string) => ReturnType;\n };\n }\n}\n\nexport const TableHeader = TiptapTableHeader.extend({\n addAttributes() {\n return {\n colspan: {\n default: 1,\n },\n rowspan: {\n default: 1,\n },\n colwidth: {\n default: null,\n parseHTML: (element) => {\n const colwidth = element.getAttribute('colwidth');\n const value = colwidth ? colwidth.split(',').map((item) => parseInt(item, 10)) : null;\n\n return value;\n },\n },\n backgroundColor: {\n default: null,\n parseHTML: (element) => {\n const style = element.getAttribute('style');\n if (!style) return null;\n\n const match = style.match(/background-color:\\s*([^;]+)/i);\n return match ? match[1] : null;\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor) return {};\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n };\n },\n },\n };\n },\n\n addCommands() {\n return {\n setHeaderBackgroundColor:\n (color: string | null) =>\n ({ commands }) => {\n return commands.updateAttributes('tableHeader', {\n backgroundColor: color,\n });\n },\n };\n },\n\n addProseMirrorPlugins() {\n const { isEditable } = this.editor;\n\n return [\n new Plugin({\n props: {\n decorations: (state) => {\n if (!isEditable) {\n return DecorationSet.empty;\n }\n\n const { doc, selection } = state;\n const decorations: Decoration[] = [];\n const cells = getCellsInRow(0)(selection);\n\n if (cells) {\n cells.forEach(({ pos }: { pos: number }, index: number) => {\n decorations.push(\n Decoration.widget(pos + 1, () => {\n const colSelected = isColumnSelected(index)(selection);\n let className = 'grip-column';\n\n if (colSelected) {\n className += ' selected';\n }\n\n if (index === 0) {\n className += ' first';\n }\n\n if (index === cells.length - 1) {\n className += ' last';\n }\n\n const grip = document.createElement('button');\n const icon = document.createElement('span');\n icon.className = 'material-symbols-outlined acms-admin-block-editor-icon grip-icon';\n icon.textContent = 'more_horiz';\n icon.setAttribute('aria-hidden', 'true');\n grip.appendChild(icon);\n\n grip.className = className;\n grip.type = 'button';\n grip.addEventListener('mousedown', (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n\n this.editor.view.dispatch(selectColumn(index)(this.editor.state.tr));\n });\n\n return grip;\n })\n );\n });\n }\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n\nexport default TableHeader;\n","import { mergeAttributes } from '@tiptap/core';\nimport { HorizontalRule as TiptapHorizontalRule } from '@tiptap/extension-horizontal-rule';\n\nexport const HorizontalRule = TiptapHorizontalRule.extend({\n renderHTML({ HTMLAttributes }) {\n const attrs = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes);\n return ['div', { 'data-type': this.name }, ['hr', attrs]];\n },\n});\n\nexport default HorizontalRule;\n","import { Heading as TiptapHeading } from '@tiptap/extension-heading';\n\nexport const Heading = TiptapHeading.extend({\n addAttributes() {\n return {\n ...this.parent?.(),\n };\n },\n});\n\nexport default Heading;\n","import { Document as TiptapDocument } from '@tiptap/extension-document';\n\nexport const Document = TiptapDocument.extend({\n content: '(block|columns)+',\n});\n\nexport default Document;\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nfunction nodeEqualsType({ types, node }) {\n return (Array.isArray(types) && types.includes(node.type)) || node.type === types;\n}\n\n/**\n * Extension based on:\n * - https://github.com/ueberdosis/tiptap/blob/v1/packages/tiptap-extensions/src/extensions/TrailingNode.js\n * - https://github.com/remirror/remirror/blob/e0f1bec4a1e8073ce8f5500d62193e52321155b9/packages/prosemirror-trailing-node/src/trailing-node-plugin.ts\n */\n\nexport interface TrailingNodeOptions {\n node: string;\n notAfter: string[];\n}\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n };\n },\n\n addProseMirrorPlugins() {\n const plugin = new PluginKey(this.name);\n const disabledNodes = Object.entries(this.editor.schema.nodes)\n .map(([, value]) => value)\n .filter((node) => this.options.notAfter.includes(node.name));\n\n return [\n new Plugin({\n key: plugin,\n appendTransaction: (_, __, state) => {\n const { doc, tr, schema } = state;\n const shouldInsertNodeAtEnd = plugin.getState(state);\n const endPosition = doc.content.size;\n const type = schema.nodes[this.options.node];\n\n if (!shouldInsertNodeAtEnd) {\n return;\n }\n\n return tr.insert(endPosition, type.create());\n },\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild;\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes });\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value;\n }\n\n const lastNode = tr.doc.lastChild;\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes });\n },\n },\n }),\n ];\n },\n});\n","import { Editor, Extension } from '@tiptap/core';\nimport { ReactRenderer } from '@tiptap/react';\nimport Suggestion, { SuggestionKeyDownProps, SuggestionProps } from '@tiptap/suggestion';\nimport { PluginKey } from '@tiptap/pm/state';\nimport type { BlockMenuItem } from '../../types';\nimport BlockMenu from './BlockMenu';\n\ntype BlockMenuProps = React.ComponentPropsWithoutRef<typeof BlockMenu>;\ntype BlockMenuRef = React.ComponentRef<typeof BlockMenu>;\n\nconst commonMenuProps: Partial<BlockMenuProps> = {\n isOpen: true,\n strategy: 'fixed',\n placement: 'bottom-start',\n focusManagerOptions: {\n initialFocus: -1,\n },\n};\n\nconst extensionName = 'slashCommand';\n\ndeclare module '@tiptap/core' {\n interface Storage {\n slashCommand: {\n rect: DOMRect;\n };\n }\n}\n\nconst SlashCommand = Extension.create({\n name: extensionName,\n\n priority: 200,\n\n addOptions() {\n return {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- configure() の getItems とシグネチャを一致させ options 型を正しく推論させるための引数\n getItems: (_props: { query: string; editor: Editor }): BlockMenuItem[] => [],\n };\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: '/',\n allowSpaces: true,\n startOfLine: true,\n pluginKey: new PluginKey(extensionName),\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from);\n const isRootDepth = $from.depth === 1;\n const isParagraph = $from.parent.type.name === 'paragraph';\n const isStartOfNode = $from.parent.textContent?.charAt(0) === '/';\n // TODO\n const isInColumn = this.editor.isActive('column');\n\n const afterContent = $from.parent.textContent?.substring($from.parent.textContent?.indexOf('/'));\n const isValidAfterContent = !afterContent?.endsWith(' ');\n\n return (\n ((isRootDepth && isParagraph && isStartOfNode) || (isInColumn && isParagraph && isStartOfNode)) &&\n isValidAfterContent\n );\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n command: ({ editor, props }: { editor: Editor; props: any }) => {\n const { view, state } = editor;\n const { $head, $from } = view.state.selection;\n\n const end = $from.pos;\n const from = $head?.nodeBefore\n ? end - ($head.nodeBefore.text?.substring($head.nodeBefore.text?.indexOf('/')).length ?? 0)\n : $from.start();\n\n const tr = state.tr.deleteRange(from, end);\n view.dispatch(tr);\n\n props.action(editor);\n view.focus();\n },\n items: ({ query, editor }) => {\n return this.options.getItems({ query, editor });\n },\n render: () => {\n let component: InstanceType<typeof ReactRenderer<BlockMenuRef, BlockMenuProps>> | null = null;\n\n let scrollHandler: (() => void) | null = null;\n\n return {\n onStart: (props: SuggestionProps) => {\n component = new ReactRenderer(BlockMenu, {\n props,\n editor: props.editor,\n });\n\n const { view } = props.editor;\n\n const getAnchorRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect;\n }\n\n const rect = props.clientRect();\n\n if (!rect) {\n return props.editor.storage[extensionName].rect;\n }\n\n if (component === null) {\n return props.editor.storage[extensionName].rect;\n }\n\n const { element } = component;\n\n if (!(element instanceof HTMLElement)) {\n return props.editor.storage[extensionName].rect;\n }\n\n let yPos = rect.y;\n\n if (rect.top + element.offsetHeight + 40 > window.innerHeight) {\n const diff = rect.top + element.offsetHeight - window.innerHeight + 40;\n yPos = rect.y - diff;\n }\n\n return new DOMRect(rect.x, yPos, rect.width, rect.height);\n };\n\n scrollHandler = () => {\n if (component === null) {\n return;\n }\n\n const newProps: Partial<BlockMenuProps> = {\n ...props,\n ...commonMenuProps,\n getAnchorRect,\n };\n\n component.updateProps(newProps);\n };\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler);\n\n component.updateProps({\n ...props,\n ...commonMenuProps,\n getAnchorRect,\n });\n },\n\n onUpdate(props: SuggestionProps) {\n if (component === null) {\n return;\n }\n\n component.updateProps(props);\n\n const { view } = props.editor;\n\n const getAnchorRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect;\n }\n\n const rect = props.clientRect();\n\n if (!rect) {\n return props.editor.storage[extensionName].rect;\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n return new DOMRect(rect.x, rect.y, rect.width, rect.height);\n };\n\n const scrollHandler = () => {\n if (component === null) {\n return;\n }\n\n component.updateProps({\n ...props,\n isOpen: true,\n getAnchorRect,\n });\n };\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler);\n\n props.editor.storage[extensionName].rect = props.clientRect\n ? getAnchorRect()\n : ({\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n } as DOMRect);\n\n const newProps: Partial<BlockMenuProps> = {\n ...props,\n ...commonMenuProps,\n getAnchorRect,\n };\n\n component.updateProps(newProps);\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (props.event.key === 'Escape') {\n const newProps: Partial<BlockMenuProps> = {\n isOpen: false,\n };\n component?.updateProps(newProps);\n return true;\n }\n\n return component?.ref?.onKeyDown(props) || false;\n },\n\n onExit(props) {\n if (scrollHandler) {\n const { view } = props.editor;\n view.dom.parentElement?.removeEventListener('scroll', scrollHandler);\n }\n if (component) {\n component.destroy();\n }\n },\n };\n },\n }),\n ];\n },\n\n addStorage() {\n return {\n rect: {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n } as DOMRect,\n };\n },\n});\n\nexport default SlashCommand;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Menu, MenuGroup, MenuItem, MenuList, MenuPopover } from '@ablogcms/components/dropdown-menu';\nimport type { CommandItem, BlockMenuProps } from '../../types';\nimport { Icon } from '../../components/ui/Icon';\n\ninterface BlockMenuRef {\n onKeyDown: (event: { event: KeyboardEvent }) => boolean;\n}\n\nconst BlockMenu = React.forwardRef<BlockMenuRef, BlockMenuProps>(({ items, command, ...menuProps }, ref) => {\n const scrollContainer = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Array<Array<HTMLDivElement | null>>>([]);\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0);\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0);\n\n // Anytime the groups change, i.e. the user types to narrow it down, we want to\n // reset the current selection to the first menu item\n useEffect(() => {\n itemRefs.current = items.map((group) => new Array(group.commands.length).fill(null));\n setSelectedGroupIndex(0);\n setSelectedCommandIndex(0);\n }, [items]);\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const selectedCommand = items[groupIndex].commands[commandIndex];\n command(selectedCommand);\n },\n [items, command]\n );\n\n React.useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === 'ArrowDown') {\n if (!items.length) {\n return false;\n }\n\n const { commands } = items[selectedGroupIndex];\n\n let newCommandIndex = selectedCommandIndex + 1;\n let newGroupIndex = selectedGroupIndex;\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0;\n newGroupIndex = selectedGroupIndex + 1;\n }\n\n if (items.length - 1 < newGroupIndex) {\n newGroupIndex = 0;\n }\n\n setSelectedCommandIndex(newCommandIndex);\n setSelectedGroupIndex(newGroupIndex);\n\n return true;\n }\n\n if (event.key === 'ArrowUp') {\n if (!items.length) {\n return false;\n }\n\n let newCommandIndex = selectedCommandIndex - 1;\n let newGroupIndex = selectedGroupIndex;\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1;\n const commandLength = items[newGroupIndex]?.commands?.length || 0;\n newCommandIndex = commandLength > 0 ? commandLength - 1 : 0;\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = items.length - 1;\n newCommandIndex = items[newGroupIndex].commands.length - 1;\n }\n\n setSelectedCommandIndex(newCommandIndex);\n setSelectedGroupIndex(newGroupIndex);\n\n return true;\n }\n\n if (event.key === 'Enter') {\n if (!items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false;\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex);\n\n return true;\n }\n\n return false;\n },\n }));\n\n useEffect(() => {\n const el = itemRefs.current[selectedGroupIndex]?.[selectedCommandIndex];\n if (el) {\n el.scrollIntoView({\n block: 'nearest',\n behavior: 'auto',\n });\n }\n }, [selectedCommandIndex, selectedGroupIndex]);\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => () => {\n selectItem(groupIndex, commandIndex);\n },\n [selectItem]\n );\n\n if (!items.length) {\n return null;\n }\n\n return (\n <Menu\n {...menuProps}\n // フォーカスはエディタ上においたままにしたいので、\n // メニューを開いたときに、フォーカスを最初のアイテムに設定する機能を無効にする\n focusManagerOptions={{ initialFocus: -1 }}\n // 独自でフォーカス管理を実装したいので、デフォルトのフォーカス管理を無効にする\n listNavigationOptions={{ enabled: false }}\n >\n <MenuPopover ref={scrollContainer} scrollable data-elevation=\"3\">\n <MenuList>\n {items.map((group, groupIndex: number) => (\n <MenuGroup key={`${group.title}-group`} title={group.title}>\n {group.commands.map((command: CommandItem, commandIndex: number) => (\n <MenuItem\n key={`${command.label}`}\n ref={(el) => {\n if (!itemRefs.current[groupIndex]) {\n itemRefs.current[groupIndex] = [];\n }\n itemRefs.current[groupIndex][commandIndex] = el;\n }}\n isActive={selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex}\n onSelect={createCommandClickHandler(groupIndex, commandIndex)}\n icon={<Icon name={command.iconName} />}\n >\n {command.label}\n </MenuItem>\n ))}\n </MenuGroup>\n ))}\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n});\n\nBlockMenu.displayName = 'BlockMenu';\n\nexport default BlockMenu;\n","import { Extension } from '@tiptap/core';\nimport '@tiptap/extension-text-style';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n // v3 の @tiptap/extension-text-style は同名 'fontSize' キーで組み込み FontSize 拡張の\n // コマンド型を宣言するため、型レベルでの衝突(宣言のマージ不可)を避けて拡張名 'fontStyle' にする。\n // 実行時のコマンド名 (setFontSize 等) は変わらず、グループキーは型上の名前空間に過ぎない。\n fontStyle: {\n setFontSize: (size: string) => ReturnType;\n unsetFontSize: () => ReturnType;\n setFontFamily: (family: string) => ReturnType;\n unsetFontFamily: () => ReturnType;\n setFontColor: (color: string) => ReturnType;\n unsetFontColor: () => ReturnType;\n setFontBgColor: (color: string) => ReturnType;\n unsetFontBgColor: () => ReturnType;\n };\n }\n}\n\nexport const FontStyle = Extension.create({\n name: 'fontStyle',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['paragraph'],\n attributes: {\n class: {},\n },\n },\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n parseHTML: (element) => {\n return element.getAttribute('data-font-size') || null;\n },\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {};\n }\n return {\n style: `font-size: ${attributes.fontSize}`, // 表示用\n 'data-font-size': attributes.fontSize, // 復元用\n };\n },\n },\n fontFamily: {\n parseHTML: (element) => element.getAttribute('data-font-family') || null,\n renderHTML: (attributes) => {\n if (!attributes.fontFamily) return {};\n return {\n style: `font-family: ${attributes.fontFamily.replace(/\"/g, \"'\")}`,\n 'data-font-family': attributes.fontFamily.replace(/\"/g, \"'\"),\n };\n },\n },\n fontColor: {\n parseHTML: (element) => element.getAttribute('data-font-color') || null,\n renderHTML: (attributes) => {\n if (!attributes.fontColor) return {};\n return {\n style: `color: ${attributes.fontColor}`,\n 'data-font-color': attributes.fontColor,\n };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize: string) =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontSize }).run(),\n unsetFontSize:\n () =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run(),\n setFontFamily:\n (family: string) =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontFamily: family }).run(),\n\n unsetFontFamily:\n () =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontFamily: null }).removeEmptyTextStyle().run(),\n\n setFontColor:\n (color: string) =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontColor: color }).run(),\n\n unsetFontColor:\n () =>\n ({ chain }) =>\n chain().setMark('textStyle', { fontColor: null }).removeEmptyTextStyle().run(),\n };\n },\n});\n\nexport default FontStyle;\n","import { mergeAttributes, Node } from '@tiptap/core';\n\nimport { Image } from '../Image';\n\nexport const Figcaption = Node.create({\n name: 'figcaption',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n };\n },\n\n content: 'inline*',\n\n selectable: false,\n\n draggable: false,\n\n marks: 'link',\n\n parseHTML() {\n return [\n {\n tag: 'figcaption',\n },\n ];\n },\n\n addKeyboardShortcuts() {\n return {\n // On Enter at the end of line, create new paragraph and focus\n Enter: ({ editor }) => {\n const {\n state: {\n selection: { $from, empty },\n },\n } = editor;\n\n if (!empty || $from.parent.type !== this.type) {\n return false;\n }\n\n const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\n\n if (!isAtEnd) {\n return false;\n }\n\n const pos = editor.state.selection.$from.end();\n\n return editor.chain().focus(pos).insertContentAt(pos, { type: 'paragraph' }).run();\n },\n\n // On Backspace at the beginning of line,\n // dont delete content of image before\n Backspace: ({ editor }) => {\n const {\n state: {\n selection: { $from, empty },\n },\n } = editor;\n\n if (!empty || $from.parent.type !== this.type) {\n return false;\n }\n\n const isAtStart = $from.parentOffset === 0;\n\n if (!isAtStart) {\n return false;\n }\n\n // if the node before is of type image, don't do anything\n const nodeBefore = editor.state.doc.nodeAt($from.pos - 2);\n if (nodeBefore?.type.name === Image.name) {\n return true;\n }\n\n return false;\n },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['figcaption', mergeAttributes(HTMLAttributes), 0];\n },\n});\n\nexport default Figcaption;\n","import { Image as BaseImage } from '@tiptap/extension-image';\n\nexport const Image = BaseImage.extend({\n group: 'block',\n});\n\nexport default Image;\n","import { mergeAttributes } from '@tiptap/core';\nimport { Link as TiptapLink } from '@tiptap/extension-link';\nimport type { LinkOptions } from '@tiptap/extension-link';\nimport { Plugin } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\n\n// eslint-disable-next-line no-control-regex\nconst ATTRIBUTE_WHITESPACE = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g;\n\nconst DEFAULT_ALLOWED_PROTOCOLS = ['http', 'https', 'ftp', 'ftps', 'mailto', 'tel', 'callto', 'sms', 'cid', 'xmpp'];\n\nconst escapeRegExp = (value: string) => value.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\nexport function isAllowedBlockEditorLinkUri(uri: string | undefined, protocols?: LinkOptions['protocols']) {\n const allowedProtocols = [...DEFAULT_ALLOWED_PROTOCOLS];\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol = typeof protocol === 'string' ? protocol : protocol.scheme;\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol);\n }\n });\n }\n\n return (\n !uri ||\n uri\n .replace(ATTRIBUTE_WHITESPACE, '')\n .match(\n new RegExp(\n `^(?:(?:${allowedProtocols.map(escapeRegExp).join('|')}):|[^a-z]|[a-z0-9+.\\\\-]+(?:[^a-z+.\\\\-:]|$))`,\n 'i'\n )\n )\n );\n}\n\nexport const Link = TiptapLink.extend({\n inclusive: false,\n\n parseHTML() {\n return [{ tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { class: 'link' });\n if (!attrs.target) {\n delete attrs.target;\n delete attrs.rel;\n }\n return ['a', attrs, 0];\n },\n\n addProseMirrorPlugins() {\n const { editor } = this;\n\n return [\n ...(this.parent?.() || []),\n new Plugin({\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n const { selection } = editor.state;\n\n if (event.key === 'Escape' && selection.empty !== true) {\n editor.commands.focus(selection.to, { scrollIntoView: false });\n }\n\n return false;\n },\n },\n }),\n ];\n },\n});\n\nexport default Link;\n","import { ReactNodeViewRenderer } from '@tiptap/react';\nimport { Range } from '@tiptap/core';\nimport type { MediaItem } from '@ablogcms/media/types';\nimport { ImageBlockView } from './components/ImageBlockView';\nimport { Image } from '../Image';\nimport { createImageBlockAttrs } from '../mediaBlockContent';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n imageBlock: {\n setImageBlock: (attributes: { src: string }) => ReturnType;\n setImageBlockAt: (attributes: { src: string; pos: number | Range }) => ReturnType;\n setImageBlockAlign: (align: 'left' | 'center' | 'right') => ReturnType;\n setImageBlockWidth: (width: string) => ReturnType;\n setImageBlockLink: (link: string, openInNewTab?: boolean) => ReturnType;\n setImageBlockCaption: (caption: string) => ReturnType;\n setImageBlockAlt: (alt: string) => ReturnType;\n setMediaImageBlock: (mediaItem: MediaItem, className?: string) => ReturnType;\n updateMediaImageBlock: (mediaItem: MediaItem) => ReturnType;\n updateAllMediaImageBlocks: (mediaItem: MediaItem) => ReturnType;\n toggleImageBlockLightbox: () => ReturnType;\n };\n }\n}\n\nexport interface ImageBlockOptions {\n /**\n * 画像を新規挿入したときに、拡大表示(Lightbox)をデフォルトで有効にするかを返す getter。\n * 設定値は SWR で遅延して届くため、固定値ではなく getter で都度参照する。\n * 未設定時は現行動作(拡大表示オン)を維持する。\n */\n getImageDefaultLightbox: () => boolean;\n}\n\nexport const ImageBlock = Image.extend<ImageBlockOptions>({\n name: 'imageBlock',\n group: 'block',\n atom: true,\n defining: true,\n isolating: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n getImageDefaultLightbox: () => true,\n };\n },\n\n addAttributes() {\n return {\n src: {\n default: '',\n renderHTML: (attributes) => ({\n src: attributes.src,\n }),\n },\n align: {\n default: 'center',\n renderHTML: (attributes) => ({\n 'data-align': attributes.align,\n }),\n },\n link: {\n default: null,\n renderHTML: (attributes) => ({\n 'data-link': attributes.link,\n }),\n },\n target: {\n default: null,\n renderHTML: (attributes) => ({\n 'data-target': attributes.target,\n }),\n },\n caption: {\n default: undefined,\n renderHTML: (attributes) => ({\n 'data-caption': attributes.caption,\n }),\n },\n alt: {\n default: undefined,\n renderHTML: (attributes) => ({\n alt: attributes.alt,\n }),\n },\n width: {\n default: null,\n renderHTML: (attributes) => ({\n width: attributes.width,\n }),\n },\n height: {\n default: null,\n renderHTML: (attributes) => ({\n height: attributes.height,\n }),\n },\n displayWidth: {\n default: '100%',\n renderHTML: (attributes) => ({\n 'data-width': attributes.displayWidth,\n }),\n },\n mediaId: {\n default: null,\n renderHTML: (attributes) => ({\n 'data-mid': attributes.mediaId || null,\n }),\n },\n entryId: {\n default: null,\n renderHTML: (attributes) => ({\n 'data-eid': attributes.entryId || ACMS.Config.eid,\n }),\n },\n noLightbox: {\n default: 'false',\n renderHTML: (attributes) => ({\n 'data-no-lightbox': attributes.noLightbox === 'true' ? 'true' : 'false',\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'figure',\n getAttrs: (element: HTMLElement) => {\n const img = element.querySelector('img');\n const figcaption = element.querySelector('figcaption');\n const parent = element.closest(`[data-type=\"${this.name}\"]`);\n const link = parent?.querySelector('a');\n\n return {\n src: img?.getAttribute('src'),\n align: parent?.getAttribute('data-align') || 'center',\n link: parent?.getAttribute('data-link'),\n target: link?.target || null,\n caption: figcaption?.textContent?.trim() || '',\n alt: img?.getAttribute('alt'),\n width: img?.getAttribute('width'),\n height: img?.getAttribute('height'),\n displayWidth: parent?.getAttribute('data-width'),\n mediaId: img?.getAttribute('data-mid'),\n entryId: parent?.getAttribute('data-eid'),\n noLightbox: parent?.getAttribute('data-no-lightbox') === 'true' ? 'true' : 'false',\n };\n },\n },\n {\n tag: 'img',\n getAttrs: (element: HTMLElement) => {\n if (element.closest('[data-type=\"fileBlock\"]')) {\n return false; // ファイルブロックのため無視\n }\n return {\n src: element.getAttribute('src'),\n align: 'center',\n link: '',\n target: null,\n caption: '',\n alt: element.getAttribute('alt'),\n width: element.getAttribute('width'),\n height: element.getAttribute('height'),\n displayWidth: '',\n mediaId: null,\n entryId: null,\n noLightbox: 'false',\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const id = HTMLAttributes.id || null;\n const className = HTMLAttributes.class || '';\n const src = HTMLAttributes.src || '';\n const align = HTMLAttributes['data-align'] || 'left';\n const link = HTMLAttributes['data-link'] || null;\n const target = HTMLAttributes['data-target'] || null;\n const caption = HTMLAttributes['data-caption'] || null;\n const alt = HTMLAttributes.alt || null;\n const width = HTMLAttributes.width || null;\n const height = HTMLAttributes.height || null;\n const displayWidth = HTMLAttributes['data-width'] || '100%';\n const mediaId = HTMLAttributes['data-mid'] || null;\n const eid = HTMLAttributes['data-eid'] || ACMS.Config.eid;\n const shouldUseLightbox = HTMLAttributes['data-no-lightbox'] !== 'true';\n\n const img = [\n 'img',\n {\n src,\n class: `unit-id-${eid}`,\n width,\n height,\n alt,\n loading: 'lazy',\n decoding: 'async',\n 'data-mid': mediaId || null,\n } as unknown,\n ];\n\n let anchor = img;\n if (link) {\n anchor = [\n 'a',\n {\n href: link,\n ...(target\n ? {\n target,\n rel: 'noopener noreferrer',\n }\n : {}),\n },\n img,\n ];\n } else if (shouldUseLightbox) {\n anchor = [\n 'a',\n {\n href: src,\n },\n img,\n ];\n }\n const figureChildren = [anchor];\n\n if (caption) {\n figureChildren.push([\n 'figcaption',\n {\n class: 'caption',\n },\n caption,\n ]);\n }\n\n return [\n 'div',\n {\n class: `media-image-block align-${align}`,\n 'data-type': this.name,\n 'data-align': align,\n 'data-link': link || null,\n 'data-width': displayWidth,\n 'data-eid': eid,\n 'data-no-lightbox': shouldUseLightbox ? 'false' : 'true',\n },\n [\n 'figure',\n {\n id,\n class: className,\n style: `max-width: ${displayWidth};`,\n },\n ...figureChildren,\n ],\n ];\n },\n\n addCommands() {\n // 新規挿入時のみ適用する拡大表示のデフォルト値。\n // 既存ノードの更新系コマンドには適用せず、保存済みの個別設定を維持する。\n const defaultNoLightbox = () => (this.options.getImageDefaultLightbox() ? 'false' : 'true');\n\n return {\n setImageBlock:\n (attrs) =>\n ({ commands }) =>\n commands.insertContent({ type: 'imageBlock', attrs: { src: attrs.src, noLightbox: defaultNoLightbox() } }),\n\n setImageBlockAt:\n (attrs) =>\n ({ commands }) =>\n commands.insertContentAt(attrs.pos, {\n type: 'imageBlock',\n attrs: { src: attrs.src, noLightbox: defaultNoLightbox() },\n }),\n\n setImageBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', { align }),\n\n setImageBlockWidth:\n (width) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', { displayWidth: width }),\n\n setImageBlockLink:\n (link, openInNewTab = false) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', { link, target: openInNewTab ? '_blank' : null }),\n\n setImageBlockCaption:\n (caption) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', { caption }),\n\n setImageBlockAlt:\n (alt) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', { alt }),\n\n setMediaImageBlock:\n (mediaItem, className) =>\n ({ commands }) =>\n commands.insertContent({\n type: 'imageBlock',\n attrs: { ...createImageBlockAttrs(mediaItem, className), noLightbox: defaultNoLightbox() },\n }),\n\n updateMediaImageBlock:\n (mediaItem) =>\n ({ commands }) =>\n commands.updateAttributes('imageBlock', createImageBlockAttrs(mediaItem)),\n\n updateAllMediaImageBlocks:\n (mediaItem) =>\n ({ state, dispatch }) => {\n if (!dispatch) return false;\n\n const newAttrs = createImageBlockAttrs(mediaItem);\n const targetMediaId = mediaItem.media_id;\n\n // エディター全体を走査して、同じmediaIdを持つすべてのimageBlockノードを見つける\n const positions: number[] = [];\n state.doc.descendants((node, pos) => {\n if (node.type.name === 'imageBlock') {\n // mediaIdは文字列として保存されている可能性があるため、数値に変換して比較\n const nodeMediaId =\n typeof node.attrs.mediaId === 'string' ? parseInt(node.attrs.mediaId, 10) : node.attrs.mediaId;\n if (nodeMediaId === targetMediaId) {\n positions.push(pos);\n }\n }\n });\n\n // 見つかったすべてのノードを更新\n if (positions.length > 0) {\n const { tr } = state;\n positions.forEach((pos) => {\n const node = state.doc.nodeAt(pos);\n if (node && node.type.name === 'imageBlock') {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...newAttrs });\n }\n });\n dispatch(tr);\n return true;\n }\n\n return false;\n },\n\n toggleImageBlockLightbox:\n () =>\n ({ editor, commands }) => {\n const { noLightbox } = editor.getAttributes('imageBlock');\n return commands.updateAttributes('imageBlock', {\n noLightbox: noLightbox === 'true' ? 'false' : 'true',\n });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageBlockView);\n },\n});\n\nexport default ImageBlock;\n","import { useCallback, useEffect, useRef } from 'react';\nimport { Editor, NodeViewWrapper } from '@tiptap/react';\nimport { Node } from '@tiptap/pm/model';\nimport { MediaItem } from '@ablogcms/media/types';\nimport { cn } from '../../../lib/utils';\n\ninterface ImageBlockViewProps {\n editor: Editor;\n getPos: () => number | undefined;\n node: Node;\n // updateAttributes: (attrs: Record<string, string>) => void\n}\n\nexport function ImageBlockView(props: ImageBlockViewProps) {\n const { editor, getPos, node } = props as ImageBlockViewProps & {\n node: Node & {\n attrs: {\n src: string;\n mediaId: string;\n class?: string;\n noLightbox: 'true' | 'false';\n entryId: string;\n width: string;\n height: string;\n displayWidth: string;\n align: 'left' | 'center' | 'right';\n link: string;\n target: string;\n caption: string;\n };\n };\n };\n const imageWrapperRef = useRef<HTMLDivElement>(null);\n const { src, alt, caption, width, height, displayWidth, mediaId, align, link, target, entryId } = node.attrs;\n\n const wrapperClassName = cn('media-image-block', `align-${align || 'left'}`);\n\n const figureClassName = cn(node.attrs.class);\n\n const onClick = useCallback(() => {\n const pos = getPos();\n if (pos === undefined) return;\n editor.commands.setNodeSelection(pos);\n }, [getPos, editor.commands]);\n\n useEffect(() => {\n const listener = (event: Event) => {\n if (!(event instanceof CustomEvent)) {\n return;\n }\n const media = event.detail.data as MediaItem;\n if (parseInt(mediaId, 10) === media.media_id) {\n if (media.media_thumbnail) {\n // 同一IDのメディア画像をすべて更新\n editor.chain().updateAllMediaImageBlocks(media).run();\n }\n }\n };\n document.addEventListener('acms.media-updated', listener);\n return () => {\n document.removeEventListener('acms.media-updated', listener);\n };\n }, [mediaId, editor]);\n\n return (\n <NodeViewWrapper\n contentEditable={false}\n className={wrapperClassName}\n data-type=\"imageBlock\"\n data-align={align || 'left'}\n data-link={link || null}\n data-width={displayWidth || '100%'}\n data-eid={entryId || (typeof ACMS !== 'undefined' ? ACMS.Config.eid : undefined)}\n data-no-lightbox={node.attrs.noLightbox === 'true' ? 'true' : 'false'}\n >\n <figure\n className={figureClassName}\n contentEditable={false}\n ref={imageWrapperRef}\n style={{ maxWidth: displayWidth }}\n >\n {}\n {link ? (\n <a\n href={link}\n target={target || undefined}\n rel={target ? 'noopener noreferrer' : undefined}\n onClick={onClick}\n >\n <img\n src={src}\n className={`unit-id-${entryId || (typeof ACMS !== 'undefined' ? ACMS.Config.eid : '')}`}\n width={width || undefined}\n height={height || undefined}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n data-mid={mediaId || undefined}\n draggable={false}\n />\n </a>\n ) : node.attrs.noLightbox !== 'true' ? (\n <a href={src} onClick={onClick}>\n <img\n src={src}\n className={`unit-id-${entryId || (typeof ACMS !== 'undefined' ? ACMS.Config.eid : '')}`}\n width={width || undefined}\n height={height || undefined}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n data-mid={mediaId || undefined}\n draggable={false}\n />\n </a>\n ) : (\n <img\n src={src}\n className={`unit-id-${entryId || (typeof ACMS !== 'undefined' ? ACMS.Config.eid : '')}`}\n width={width || undefined}\n height={height || undefined}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n data-mid={mediaId || undefined}\n draggable={false}\n role=\"button\" // eslint-disable-line jsx-a11y/no-noninteractive-element-to-interactive-role\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n onClick();\n }\n }}\n />\n )}\n {caption && <figcaption className=\"caption\">{caption}</figcaption>}\n </figure>\n </NodeViewWrapper>\n );\n}\n\nexport default ImageBlockView;\n","import type { MediaItem } from '@ablogcms/media/types';\n\n/**\n * メディアから画像ブロック (imageBlock) の属性を組み立てる。\n * media_size (\"幅x高さ\") から width/height を取り出す。\n */\nexport const createImageBlockAttrs = (mediaItem: MediaItem, className?: string) => {\n let width = null;\n let height = null;\n if (mediaItem.media_size.includes('x')) {\n const [tempX, tempY] = mediaItem.media_size.split('x');\n width = parseInt(tempX.trim(), 10);\n height = parseInt(tempY.trim(), 10);\n }\n return {\n src: mediaItem.media_root_path,\n class: className || null,\n mediaId: mediaItem.media_id,\n entryId: ACMS.Config.eid,\n width,\n height,\n link: mediaItem.media_link ?? null,\n caption: mediaItem.media_caption ?? null,\n alt: mediaItem.media_alt ?? null,\n };\n};\n\n/**\n * メディアからファイルブロック (fileBlock) の属性を組み立てる。\n */\nexport const createFileBlockAttrs = (mediaItem: MediaItem, className?: string) => ({\n href: mediaItem.media_permalink,\n icon: mediaItem.media_icon,\n iconWidth: mediaItem.media_icon_width || '100',\n iconHeight: mediaItem.media_icon_height || '100',\n class: className || null,\n mediaId: mediaItem.media_id,\n caption: mediaItem.media_caption || mediaItem.media_title || null,\n alt: mediaItem.media_alt || null,\n extension: mediaItem.media_ext || null,\n fileSize: mediaItem.media_filesize || null,\n});\n\nexport type MediaBlockContent = {\n type: 'imageBlock' | 'fileBlock';\n attrs: Record<string, unknown>;\n};\n\n/**\n * メディアの media_type に応じて、挿入する画像/ファイルブロックの JSONContent を組み立てる。\n * 画像 (image) と svg は imageBlock、それ以外 (file) は fileBlock として扱う。\n * これにより、画像とファイルが混在していても 1 回の挿入で適切なブロックへ振り分けられる。\n */\nexport const buildMediaBlockContent = (\n mediaItem: MediaItem,\n className: string,\n noLightbox: string\n): MediaBlockContent => {\n if (mediaItem.media_type === 'file') {\n return { type: 'fileBlock', attrs: createFileBlockAttrs(mediaItem, className) };\n }\n return { type: 'imageBlock', attrs: { ...createImageBlockAttrs(mediaItem, className), noLightbox } };\n};\n","import { ReactNodeViewRenderer } from '@tiptap/react';\nimport { Range } from '@tiptap/core';\nimport { MediaItem } from '@ablogcms/media/types';\nimport { FileBlockView } from './components/FileBlockView';\nimport { ImageBlock } from '../ImageBlock';\nimport { createFileBlockAttrs } from '../mediaBlockContent';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fileBlock: {\n setFileBlock: (attributes: { src: string }) => ReturnType;\n setFileBlockAt: (attributes: { src: string; pos: number | Range }) => ReturnType;\n setFileBlockDisplayType: (displayType: 'icon' | 'button') => ReturnType;\n setFileBlockAlign: (align: 'left' | 'center' | 'right') => ReturnType;\n setFileBlockCaption: (caption: string) => ReturnType;\n setFileBlockAlt: (alt: string) => ReturnType;\n setMediaFileBlock: (mediaItem: MediaItem, className?: string) => ReturnType;\n updateMediaFileBlock: (mediaItem: MediaItem) => ReturnType;\n updateAllMediaFileBlocks: (mediaItem: MediaItem) => ReturnType;\n toggleFileBlockTarget: () => ReturnType;\n };\n }\n}\n\nexport const FileBlock = ImageBlock.extend({\n name: 'fileBlock',\n group: 'block',\n atom: true,\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n displayType: {\n default: 'icon',\n renderHTML: (attrs) => ({\n 'data-display-type': attrs.displayType || 'icon',\n }),\n },\n href: {\n default: '',\n renderHTML: (attrs) => ({\n 'data-href': attrs.href || '',\n }),\n },\n icon: {\n default: '',\n renderHTML: (attrs) => ({\n 'data-icon': attrs.icon || '',\n }),\n },\n iconWidth: {\n default: '',\n renderHTML: (attrs) => ({\n 'data-icon-width': attrs.iconWidth || '',\n }),\n },\n iconHeight: {\n default: '',\n renderHTML: (attrs) => ({\n 'data-icon-height': attrs.iconHeight || '',\n }),\n },\n extension: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-extension': attrs.extension ?? null,\n }),\n },\n fileSize: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-file-size': attrs.fileSize ?? null,\n }),\n },\n align: {\n default: 'left',\n renderHTML: (attrs) => ({\n 'data-align': attrs.align ?? 'left',\n }),\n },\n target: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-target': attrs.target ?? null,\n }),\n },\n caption: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-caption': attrs.caption ?? '',\n }),\n },\n alt: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-alt': attrs.alt ?? '',\n }),\n },\n mediaId: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-mid': attrs.mediaId ?? null,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n getAttrs: (element: HTMLElement) => {\n const link = element.querySelector('a');\n return {\n displayType: element?.getAttribute('data-display-type') || 'icon',\n href: link?.getAttribute('href'),\n icon: element?.getAttribute('data-icon') || '',\n iconWidth: element?.getAttribute('data-icon-width') || '100',\n iconHeight: element?.getAttribute('data-icon-height') || '100',\n extension: element?.getAttribute('data-extension') ?? null,\n fileSize: element?.getAttribute('data-file-size') ?? null,\n align: element?.getAttribute('data-align') || 'center',\n target: link?.target || null,\n caption: element?.getAttribute('data-caption') || null,\n alt: element?.getAttribute('data-alt'),\n mediaId: element?.getAttribute('data-mid'),\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const id = HTMLAttributes.id || null;\n const className = HTMLAttributes.class || '';\n const displayType = HTMLAttributes['data-display-type'] || 'icon';\n const href = HTMLAttributes['data-href'] || '';\n const icon = HTMLAttributes['data-icon'] || '';\n const iconWidth = HTMLAttributes['data-icon-width'] || '100';\n const iconHeight = HTMLAttributes['data-icon-height'] || '100';\n const extension = HTMLAttributes['data-extension'] || null;\n const fileSize = HTMLAttributes['data-file-size'] || null;\n const align = HTMLAttributes['data-align'] || 'left';\n const target = HTMLAttributes['data-target'] || null;\n const caption = HTMLAttributes['data-caption'] || null;\n const alt = HTMLAttributes['data-alt'] || null;\n const mediaId = HTMLAttributes['data-mid'] || null;\n\n const iconLink = [\n [\n 'a',\n {\n href,\n ...(target\n ? {\n target,\n rel: 'noopener noreferrer',\n }\n : {}),\n },\n [\n 'img',\n {\n src: icon,\n width: iconWidth,\n height: iconHeight,\n alt: alt || '',\n loading: 'lazy',\n decoding: 'async',\n } as unknown,\n ],\n ],\n ];\n if (caption) {\n iconLink.push(['p', { class: 'caption' }, caption]);\n }\n\n const buttonLink = [\n [\n 'a',\n {\n href,\n ...(target\n ? {\n target,\n rel: 'noopener noreferrer',\n }\n : {}),\n },\n [\n 'img',\n {\n src: icon,\n width: iconWidth,\n height: iconHeight,\n alt: alt || '',\n loading: 'lazy',\n decoding: 'async',\n } as unknown,\n ],\n ['p', { class: 'caption' }, caption || ''],\n ],\n ];\n\n const cleanedClassNames = className\n .split(/\\s+/)\n .filter((cls: string) => !['align-left', 'align-center', 'align-right'].includes(cls));\n const classList = new Set(['media-file-block', `align-${align}`, ...cleanedClassNames]);\n const finalClass = Array.from(classList).join(' ');\n const html = displayType === 'button' ? buttonLink : iconLink;\n\n return [\n 'div',\n {\n id,\n class: finalClass,\n 'data-type': this.name,\n 'data-display-type': displayType,\n 'data-icon': icon,\n 'data-icon-width': iconWidth,\n 'data-icon-height': iconHeight,\n 'data-alt': alt,\n 'data-caption': caption,\n 'data-align': align,\n 'data-mid': mediaId,\n 'data-extension': extension,\n 'data-file-size': fileSize,\n },\n ['div', {}, ...html],\n ];\n },\n\n addCommands() {\n return {\n setFileBlock:\n (attrs) =>\n ({ commands }) =>\n commands.insertContent({ type: 'fileBlock', attrs: { src: attrs.src } }),\n\n setFileBlockAt:\n (attrs) =>\n ({ commands }) =>\n commands.insertContentAt(attrs.pos, { type: 'fileBlock', attrs: { src: attrs.src } }),\n\n setFileBlockDisplayType:\n (displayType) =>\n ({ commands }) =>\n commands.updateAttributes('fileBlock', { displayType }),\n\n setFileBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes('fileBlock', { align }),\n\n setFileBlockCaption:\n (caption) =>\n ({ commands }) =>\n commands.updateAttributes('fileBlock', { caption }),\n\n setFileBlockAlt:\n (alt) =>\n ({ commands }) =>\n commands.updateAttributes('fileBlock', { alt }),\n\n setMediaFileBlock:\n (mediaItem, className) =>\n ({ commands }) =>\n commands.insertContent({\n type: 'fileBlock',\n attrs: createFileBlockAttrs(mediaItem, className),\n }),\n\n updateMediaFileBlock:\n (mediaItem) =>\n ({ commands }) =>\n commands.updateAttributes('fileBlock', createFileBlockAttrs(mediaItem)),\n\n updateAllMediaFileBlocks:\n (mediaItem) =>\n ({ state, dispatch }) => {\n if (!dispatch) return false;\n\n const newAttrs = createFileBlockAttrs(mediaItem);\n const targetMediaId = mediaItem.media_id;\n\n // エディター全体を走査して、同じmediaIdを持つすべてのfileBlockノードを見つける\n const positions: number[] = [];\n state.doc.descendants((node, pos) => {\n if (node.type.name === 'fileBlock') {\n // mediaIdは文字列として保存されている可能性があるため、数値に変換して比較\n const nodeMediaId =\n typeof node.attrs.mediaId === 'string' ? parseInt(node.attrs.mediaId, 10) : node.attrs.mediaId;\n if (nodeMediaId === targetMediaId) {\n positions.push(pos);\n }\n }\n });\n\n // 見つかったすべてのノードを更新\n if (positions.length > 0) {\n const { tr } = state;\n positions.forEach((pos) => {\n const node = state.doc.nodeAt(pos);\n if (node && node.type.name === 'fileBlock') {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...newAttrs });\n }\n });\n dispatch(tr);\n return true;\n }\n\n return false;\n },\n\n toggleFileBlockTarget:\n () =>\n ({ commands }) => {\n const { target } = this.editor.getAttributes('fileBlock');\n const newTarget = target === '_blank' ? null : '_blank';\n return commands.updateAttributes('fileBlock', { target: newTarget });\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FileBlockView);\n },\n});\n\nexport default FileBlock;\n","import { useCallback, useEffect, useRef } from 'react';\nimport { Editor, NodeViewWrapper } from '@tiptap/react';\nimport { Node } from '@tiptap/pm/model';\nimport { MediaItem } from '@ablogcms/media/types';\nimport { cn } from '../../../lib/utils';\n\ninterface FileBlockViewProps {\n editor: Editor;\n getPos: () => number | undefined;\n node: Node;\n}\n\nexport function FileBlockView(props: FileBlockViewProps) {\n const { editor, getPos, node } = props as FileBlockViewProps & {\n node: Node & {\n attrs: {\n displayType: 'icon' | 'button';\n href: string;\n icon: string;\n mediaId: string;\n alt?: string;\n caption?: string;\n class?: string;\n };\n };\n };\n const fileWrapperRef = useRef<HTMLDivElement>(null);\n const {\n displayType,\n href,\n target,\n icon,\n iconWidth,\n iconHeight,\n extension,\n fileSize,\n mediaId,\n alt,\n caption,\n align,\n id,\n } = node.attrs as FileBlockViewProps['node']['attrs'];\n\n const cleanedClassNames = String(node.attrs.class ?? '')\n .split(/\\s+/)\n .filter((cls: string) => !['align-left', 'align-center', 'align-right'].includes(cls))\n .join(' ')\n .trim();\n\n const wrapperClassName = cn('media-file-block', `align-${align || 'left'}`, cleanedClassNames);\n\n const onClick = useCallback(\n (event: React.SyntheticEvent) => {\n event.preventDefault();\n const pos = getPos();\n if (pos === undefined) return;\n editor.commands.setNodeSelection(pos);\n },\n [getPos, editor.commands]\n );\n\n useEffect(() => {\n const listener = (event: Event) => {\n if (!(event instanceof CustomEvent)) {\n return;\n }\n const media = event.detail.data as MediaItem;\n if (parseInt(mediaId, 10) === media.media_id) {\n // 同一IDのメディアファイルをすべて更新\n editor.chain().updateAllMediaFileBlocks(media).run();\n }\n };\n document.addEventListener('acms.media-updated', listener);\n return () => {\n document.removeEventListener('acms.media-updated', listener);\n };\n }, [mediaId, editor]);\n\n return (\n <NodeViewWrapper\n contentEditable={false}\n data-type=\"fileBlock\"\n id={id}\n className={wrapperClassName}\n data-display-type={displayType || 'icon'}\n data-icon={icon || ''}\n data-icon-width={iconWidth || '100'}\n data-icon-height={iconHeight || '100'}\n data-alt={alt ?? undefined}\n data-caption={caption ?? undefined}\n data-align={align || 'left'}\n data-mid={mediaId ?? undefined}\n data-extension={extension ?? undefined}\n data-file-size={fileSize ?? undefined}\n >\n <div className=\"acms-admin-block-editor-file\" contentEditable={false} ref={fileWrapperRef}>\n {displayType === 'button' ? (\n <a\n href={href}\n target={target || undefined}\n rel={target ? 'noopener noreferrer' : undefined}\n onClick={onClick}\n >\n <img\n src={icon}\n width={iconWidth}\n height={iconHeight}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n <p className=\"caption\">{caption || ''}</p>\n </a>\n ) : (\n <>\n <a\n href={href}\n target={target || undefined}\n rel={target ? 'noopener noreferrer' : undefined}\n onClick={onClick}\n >\n <img\n src={icon}\n width={iconWidth}\n height={iconHeight}\n alt={alt || ''}\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n />\n </a>\n {caption && <p className=\"caption\">{caption}</p>}\n </>\n )}\n </div>\n </NodeViewWrapper>\n );\n}\n\nexport default FileBlockView;\n","import { Extension, Editor } from '@tiptap/core';\nimport { Plugin } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\nimport { DOMParser as PMDOMParser } from '@tiptap/pm/model';\nimport type { MediaItem } from '@ablogcms/media/types';\nimport { fetchClient } from '@ablogcms/fetch-client';\n\n// 絶対URL(http/https)の場合のみ、同一サーバー上の画像かHEADで確認して相対パスに変換する\nasync function convertImgSrcToRelative(img: HTMLImageElement): Promise<void> {\n const src = img.getAttribute('src');\n if (!src || !/^https?:\\/\\//i.test(src)) {\n return;\n }\n try {\n const root = ACMS.Config.root.replace(/\\/$/, '');\n const url = new URL(src);\n const relativePath = url.pathname;\n const checkUrl = `${location.origin}${root}${relativePath}`;\n const res = await fetch(checkUrl, { method: 'HEAD' });\n if (res.ok) {\n img.setAttribute('src', `${root}${relativePath}`);\n }\n } catch (e) {\n console.warn('ペースト画像のURL変換処理に失敗しました:', e);\n }\n}\n\n// media-edit.json API を呼び出してメディアアイテムを取得する\nasync function fetchMediaItem(mediaId: number): Promise<MediaItem | null> {\n const endpoint = ACMS.Library.acmsLink({\n tpl: 'ajax/edit/media-edit.json',\n bid: ACMS.Config.bid,\n searchParams: { _mid: mediaId },\n });\n try {\n const res = await fetchClient.get<{ status: 'failure'; message: string } | { status: 'success'; item: MediaItem }>(\n endpoint\n );\n return res.data.status === 'success' ? res.data.item : null;\n } catch {\n return null;\n }\n}\n\n// リサイズプレフィックス(mode{N}_[w{W}][_h{H}][_{color}]-)を除去してオリジナルパスを返す\nfunction stripResizePrefix(imgPath: string): string {\n const lastSlash = imgPath.lastIndexOf('/');\n const dir = lastSlash >= 0 ? imgPath.slice(0, lastSlash + 1) : '';\n const basename = lastSlash >= 0 ? imgPath.slice(lastSlash + 1) : imgPath;\n const match = basename.match(/^mode\\d+_[^-]*-(.+)$/);\n if (!match) return imgPath;\n return dir + match[1];\n}\n\n// img の data-mid がこのCMSのメディアか確認する。\n// media_root_path と img src を比較することで、IDが偶然一致するだけのケースを除外する。\n// リサイズ済み画像(mode{N}_...-{original})も同一メディアとして判定する。\n// 一致した場合は MediaItem を返し、不一致の場合は null を返す。\nasync function checkImgMediaExists(img: HTMLImageElement): Promise<MediaItem | null> {\n const mediaId = img.getAttribute('data-mid');\n if (!mediaId) {\n return null;\n }\n const item = await fetchMediaItem(parseInt(mediaId, 10));\n if (!item) {\n return null;\n }\n const mediaPath = item.media_root_path.split('?')[0];\n const imgPath = (img.getAttribute('src') ?? '').split('?')[0];\n if (mediaPath === imgPath || mediaPath === stripResizePrefix(imgPath)) {\n return item;\n }\n return null;\n}\n\n// fileBlock の data-mid がこのCMSのメディアか確認する。\n// media_permalink と data-href を比較することで、IDが偶然一致するだけのケースを除外する。\nasync function checkFileMediaExists(el: HTMLElement): Promise<boolean> {\n const mediaId = el.getAttribute('data-mid');\n if (!mediaId) {\n return false;\n }\n const item = await fetchMediaItem(parseInt(mediaId, 10));\n if (!item) {\n return false;\n }\n const permalink = item.media_permalink.split('?')[0]; // クエリを除去して比較する\n const link = el.querySelector('a');\n if (link === null) {\n return false;\n }\n const href = (link.getAttribute('href') ?? '').split('?')[0]; // クエリを除去して比較する\n\n if (permalink !== href) {\n return false;\n }\n return true;\n}\n\nexport const pastePlugin = (editor: Editor) =>\n new Plugin({\n props: {\n handlePaste(view: EditorView, event: ClipboardEvent): boolean {\n const html = event.clipboardData?.getData('text/html');\n if (!html) {\n return false;\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const fileBlocks = Array.from(doc.querySelectorAll<HTMLElement>('div[data-type=\"fileBlock\"]'));\n const imgs = Array.from(doc.querySelectorAll('img'));\n\n if (fileBlocks.length === 0 && imgs.length === 0) {\n return false;\n }\n\n const fileBlockChecks = fileBlocks.map(async (el) => {\n if (el.hasAttribute('data-mid')) {\n const mediaExists = await checkFileMediaExists(el);\n if (!mediaExists) {\n el.removeAttribute('data-mid');\n }\n }\n });\n\n // fileBlock 外の standalone img を処理する\n const standaloneImgs = imgs.filter((img) => !img.closest('div[data-type=\"fileBlock\"]'));\n const imgChecks = standaloneImgs.map(async (img) => {\n await convertImgSrcToRelative(img);\n if (img.hasAttribute('data-mid')) {\n const mediaItem = await checkImgMediaExists(img);\n if (mediaItem !== null) {\n img.setAttribute('src', mediaItem.media_root_path);\n } else {\n img.removeAttribute('data-mid');\n }\n }\n });\n\n Promise.all([...fileBlockChecks, ...imgChecks]).then(() => {\n const slice = PMDOMParser.fromSchema(editor.schema).parseSlice(doc.body);\n const transaction = view.state.tr.replaceSelection(slice);\n view.dispatch(transaction);\n });\n\n return true;\n },\n },\n });\n\nexport const PasteHandler = Extension.create({\n name: 'pasteHandler',\n\n addProseMirrorPlugins() {\n return [pastePlugin(this.editor)];\n },\n});\n","import { ReactNodeViewRenderer } from '@tiptap/react';\nimport { Range } from '@tiptap/core';\nimport { Selection } from '@tiptap/pm/state';\nimport { LinkButtonView } from './components/LinkButtonView';\nimport { ImageBlock } from '../ImageBlock';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n linkButton: {\n setLinkButtonBlock: () => ReturnType;\n setLinkButtonBlockAt: (attributes: { pos: number | Range }) => ReturnType;\n setLinkButtonBlockAlign: (align: 'left' | 'center' | 'right') => ReturnType;\n setLinkButtonBlockLink: (link: string, openInNewTab?: boolean) => ReturnType;\n };\n }\n}\n\nexport const LinkButton = ImageBlock.extend({\n name: 'linkButton',\n group: 'block',\n content: 'inline*',\n atom: false,\n selectable: true,\n defining: true,\n isolating: true,\n\n addAttributes() {\n return {\n href: {\n default: '',\n renderHTML: (attrs) => ({\n 'data-href': attrs.href || '',\n }),\n },\n align: {\n default: 'center',\n renderHTML: (attrs) => ({\n 'data-align': attrs.align ?? 'center',\n }),\n },\n target: {\n default: null,\n renderHTML: (attrs) => ({\n 'data-target': attrs.target ?? null,\n }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n getAttrs: (element: HTMLElement) => {\n const link = element.querySelector('a');\n return {\n href: link?.getAttribute('href'),\n align: element?.getAttribute('data-align') || 'center',\n target: link?.target || null,\n };\n },\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n const id = HTMLAttributes.id || null;\n const className = HTMLAttributes.class || '';\n const href = HTMLAttributes['data-href'] || '';\n const align = HTMLAttributes['data-align'] || 'center';\n const target = HTMLAttributes['data-target'] || null;\n\n const linkButton = [\n 'a',\n {\n href,\n class: 'link-button-block-link',\n 'data-type': 'button',\n ...(target\n ? {\n target,\n rel: 'noopener noreferrer',\n }\n : {}),\n },\n 0,\n ];\n\n const cleanedClassNames = className\n .split(/\\s+/)\n .filter((cls: string) => !['align-left', 'align-center', 'align-right'].includes(cls));\n const classList = new Set(['link-button-block', `align-${align}`, ...cleanedClassNames]);\n const finalClass = Array.from(classList).join(' ');\n\n return [\n 'div',\n {\n id,\n class: finalClass,\n 'data-type': this.name,\n 'data-align': align,\n },\n linkButton,\n ];\n },\n\n addCommands() {\n return {\n setLinkButtonBlock:\n () =>\n ({ commands }) =>\n commands.insertContent({ type: 'linkButton' }),\n\n setLinkButtonBlockAt:\n (attrs) =>\n ({ commands }) =>\n commands.insertContentAt(attrs.pos, { type: 'linkButton' }),\n\n setLinkButtonBlockAlign:\n (align) =>\n ({ commands }) =>\n commands.updateAttributes('linkButton', { align }),\n\n setLinkButtonBlockLink:\n (link, openInNewTab = false) =>\n ({ commands }) =>\n commands.updateAttributes('linkButton', { href: link, target: openInNewTab ? '_blank' : null }),\n };\n },\n\n addKeyboardShortcuts() {\n return {\n Enter: ({ editor }) => {\n const { state, dispatch } = editor.view;\n const { tr, selection } = state;\n const { $from } = selection;\n\n for (let { depth } = $from; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === 'linkButton') {\n const pos = $from.after(depth);\n\n const paragraph = editor.schema.nodes.paragraph.create();\n tr.insert(pos, paragraph);\n\n const resolvedPos = tr.doc.resolve(pos);\n const newSelection = Selection.near(resolvedPos);\n\n tr.setSelection(newSelection).scrollIntoView();\n dispatch(tr);\n return true;\n }\n }\n return false;\n },\n Backspace: ({ editor }) => {\n const { state, dispatch } = editor.view;\n const { selection } = state;\n\n const { $from } = selection;\n for (let { depth } = $from; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === 'linkButton') {\n const pos = $from.before(depth);\n\n // ノードが空かどうかを判定\n const isEmpty = node.content.size === 0;\n\n // キャレットがそのノードの先頭にいるかどうかを確認\n const isAtStart = $from.pos === pos + 1;\n\n if (isEmpty && isAtStart) {\n // ノード全体を削除\n const tr = state.tr.delete(pos, pos + node.nodeSize);\n dispatch(tr.scrollIntoView());\n return true;\n }\n }\n }\n return false;\n },\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(LinkButtonView);\n },\n});\n\nexport default LinkButton;\n","import React from 'react';\nimport { NodeViewWrapper, NodeViewContent, type NodeViewContentProps } from '@tiptap/react';\nimport { Node } from '@tiptap/pm/model';\nimport { cn } from '../../../lib/utils';\n\n// NodeViewContent は as の型引数を NoInfer で inference 対象外にしているため、\n// as=\"span\" だけでは既定の 'div' のまま解決されてしまう。span 用に型だけ絞り込む。\nconst SpanNodeViewContent = NodeViewContent as (props: NodeViewContentProps<'span'>) => React.JSX.Element;\n\ninterface LinkButtonBlockViewProps {\n node: Node;\n}\n\nexport function LinkButtonView(props: LinkButtonBlockViewProps) {\n const { node } = props as LinkButtonBlockViewProps & {\n node: Node & {\n attrs: {\n href: string;\n text: string;\n class?: string;\n align: 'left' | 'center' | 'right';\n target: '_blank' | null;\n };\n };\n };\n const { href, align, target } = node.attrs;\n\n const cleanedClassNames = String(node.attrs.class ?? '')\n .split(/\\s+/)\n .filter((cls: string) => !['align-left', 'align-center', 'align-right'].includes(cls))\n .join(' ')\n .trim();\n const wrapperClassName = cn(\n 'link-button-block',\n 'acms-admin-block-editor-link-button', // 3.2.0 ~ 3.2.7 互換性のために残しておく\n `align-${align || 'center'}`,\n cleanedClassNames\n );\n\n const showPlaceholder = node.content.size === 0;\n\n // editor.css の .align-left/.align-center/.align-right が読み込まれていない環境でも、\n // display: flex によりインライン要素の折りたたみを防ぎ、フォーカスを外した際の\n // ProseMirror の DOM 同期時に <a> タグが消える不具合を防ぐ\n const justifyContentMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n } as const;\n const wrapperStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: justifyContentMap[align || 'center'],\n };\n\n return (\n <NodeViewWrapper\n className={wrapperClassName}\n style={wrapperStyle}\n data-type=\"linkButton\"\n data-align={align || 'center'}\n >\n {}\n <a\n href={href || ''}\n className=\"link-button-block-link acms-admin-block-editor-link-button-link\" // acms-admin-block-editor-link-button-link は 3.2.0 ~ 3.2.7 互換性のために残しておく\n data-type=\"button\"\n target={target || undefined}\n rel={target ? 'noopener noreferrer' : undefined}\n >\n <SpanNodeViewContent\n as=\"span\"\n style={showPlaceholder ? { minWidth: '1px' } : undefined}\n className={showPlaceholder ? 'is-empty' : undefined}\n />\n </a>\n </NodeViewWrapper>\n );\n}\n\nexport default LinkButtonView;\n","import { Node, mergeAttributes } from '@tiptap/core';\n\nexport const Column = Node.create({\n name: 'column',\n\n content: 'block+',\n\n isolating: true,\n\n addAttributes() {\n return {\n position: {\n default: '',\n parseHTML: (element) => element.getAttribute('data-position'),\n renderHTML: (attributes) => ({ 'data-position': attributes.position }),\n },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'column' }), 0];\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ];\n },\n});\n\nexport default Column;\n","import { Node, ReactNodeViewRenderer } from '@tiptap/react';\nimport { Editor } from '@tiptap/core';\nimport { Plugin } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\nimport { Dropzone } from './view/Dropzone';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n mediaSelect: {\n uploadMediaImage: (file?: File[]) => ReturnType;\n uploadMediaFile: (file?: File[]) => ReturnType;\n uploadMedia: (file?: File[]) => ReturnType;\n };\n }\n}\n\n// 画像のコピーペースト対応\nconst imagePastePlugin = (editor: Editor) =>\n new Plugin({\n props: {\n handlePaste(view: EditorView, event: ClipboardEvent): boolean {\n const files = event.clipboardData?.files;\n // 通常の image file の貼り付け\n if (files && files.length > 0) {\n const images = Array.from(files).filter((file) => file.type.startsWith('image/'));\n if (images.length === 0) return false;\n\n event.preventDefault(); // 通常の貼り付け処理を止める\n editor.commands.uploadMediaImage(images);\n return true;\n }\n return false;\n },\n },\n });\n\n// エディタ本文への画像・ファイルのドラッグ&ドロップ対応(ブロックを選択していなくても画像/ファイルブロックを生成する)\nconst mediaDropPlugin = (editor: Editor) =>\n new Plugin({\n props: {\n handleDrop(view: EditorView, event: DragEvent): boolean {\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return false;\n }\n\n const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (!coordinates) {\n return false;\n }\n\n // 既存の MediaUpload プレースホルダ上へのドロップは、その NodeView (Dropzone) 側の処理に委ねる\n const $pos = view.state.doc.resolve(coordinates.pos);\n for (let { depth } = $pos; depth > 0; depth -= 1) {\n if ($pos.node(depth).type.name === 'MediaUpload') {\n return false;\n }\n }\n\n // 画像・ファイルを区別せず 1 つのプレースホルダに渡す。挿入時に各メディアの media_type で振り分けられる\n event.preventDefault(); // 通常のドロップ処理を止める\n editor.chain().focus().setTextSelection(coordinates.pos).uploadMedia(Array.from(files)).run();\n return true;\n },\n },\n });\n\nexport const MediaUpload = Node.create({\n name: 'MediaUpload',\n\n isolating: true,\n\n defining: true,\n\n group: 'block',\n\n draggable: false,\n\n selectable: true,\n\n inline: false,\n\n addAttributes() {\n return {\n __pastedFiles: {\n default: [],\n parseHTML: () => [],\n renderHTML: () => null,\n },\n __mediaType: {\n default: 'image', // 'image' or 'file'\n parseHTML: (element) => element.getAttribute('data-media-type') || 'image',\n renderHTML: (attrs) => ({ 'data-media-type': attrs.__mediaType }),\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n getAttrs: () => ({}),\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', { 'data-type': this.name, ...HTMLAttributes }];\n },\n\n addCommands() {\n return {\n uploadMediaImage:\n (files?: File[]) =>\n ({ commands }) =>\n commands.insertContent({\n type: this.name,\n attrs: {\n __pastedFiles: files ?? [],\n __mediaType: 'image',\n },\n }),\n\n uploadMediaFile:\n (files?: File[]) =>\n ({ commands }) =>\n commands.insertContent({\n type: this.name,\n attrs: {\n __pastedFiles: files ?? [],\n __mediaType: 'file',\n },\n }),\n\n uploadMedia:\n (files?: File[]) =>\n ({ commands }) =>\n commands.insertContent({\n type: this.name,\n attrs: {\n __pastedFiles: files ?? [],\n __mediaType: 'all',\n },\n }),\n };\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Dropzone);\n },\n\n addProseMirrorPlugins() {\n return [imagePastePlugin(this.editor), mediaDropPlugin(this.editor)];\n },\n});\n\nexport default MediaUpload;\n","import { useCallback, useEffect, useMemo } from 'react';\nimport { Editor, NodeViewWrapper, NodeViewProps } from '@tiptap/react';\nimport MediaInsert from '@ablogcms/media/components/media-insert/media-insert';\nimport { MediaItem, MediaViewFileType } from '@ablogcms/media/types';\nimport { ButtonV2 as Button } from '@ablogcms/components/button-v2';\nimport { DropZone } from '@ablogcms/components/drop-zone';\nimport { Icon } from '../../../components/ui/Icon';\nimport { useMediaSelect, useFileUpload, useDropZone } from './hooks';\nimport { insertMediaBlocks } from './insertMediaBlocks';\nimport { filterFilesByMediaType } from './filterFilesByMediaType';\n\nexport function Dropzone({\n getPos,\n editor,\n node,\n}: {\n getPos: () => number | undefined;\n editor: Editor;\n node: NodeViewProps['node'];\n}) {\n const className = node?.attrs?.class || '';\n const { isInsertModalOpen, files, tab, uploadFile, handleModalClose, handleSelectClick } = useMediaSelect();\n const pastedFiles = useMemo(() => {\n return node.attrs.__pastedFiles || [];\n }, [node.attrs.__pastedFiles]);\n const mediaType: MediaViewFileType = useMemo(() => {\n if (node.attrs.__mediaType === 'file') return 'file';\n if (node.attrs.__mediaType === 'all') return 'all';\n return 'image';\n }, [node.attrs.__mediaType]);\n\n // 枠の種別に合わないファイルはアップロード前に弾く(画像枠は画像のみ・ファイル枠は画像以外のみ)\n const acceptUpload = useCallback(\n (uploadingFiles: File[]) => {\n const accepted = filterFilesByMediaType(uploadingFiles, mediaType);\n if (accepted.length > 0) {\n uploadFile(accepted);\n }\n },\n [mediaType, uploadFile]\n );\n const { fileInputRef, handleUploadClick, handleUploadFile } = useFileUpload({ uploader: acceptUpload });\n const { onDrop } = useDropZone({ uploader: acceptUpload });\n\n useEffect(() => {\n if (pastedFiles.length > 0) {\n acceptUpload(pastedFiles);\n }\n }, [pastedFiles, acceptUpload]);\n\n const handleInsertMedia = useCallback(\n (items: MediaItem[]) => {\n const from = getPos();\n if (from === undefined) return;\n const to = from + node.nodeSize;\n insertMediaBlocks(editor, items, mediaType, className, { from, to });\n handleModalClose();\n },\n [editor, mediaType, getPos, node, handleModalClose, className]\n );\n\n return (\n <NodeViewWrapper>\n {/* D&D・ペースト経由 (__pastedFiles あり) は即モーダルへ進むため、ドロップ枠 UI は描画しない */}\n {pastedFiles.length === 0 && (\n <DropZone onComplete={onDrop}>\n <div className=\"acms-admin-block-editor-image-drop\" style={{ width: '100%' }}>\n <p className=\"acms-admin-block-editor-image-drop-text\">\n {mediaType === 'image' && (\n <span className=\"acms-admin-block-editor-image-drop-text-main\">ここに画像をドラッグ</span>\n )}\n {mediaType === 'file' && (\n <span className=\"acms-admin-block-editor-image-drop-text-main\">ここにファイルをドラッグ</span>\n )}\n <span className=\"acms-admin-block-editor-image-drop-text-sub\">または</span>\n </p>\n <div className=\"acms-admin-block-editor-button-group\">\n <Button onClick={handleSelectClick} variant=\"outlined\" size=\"default\" type=\"button\">\n <Icon name=\"perm_media\" />\n メディア選択\n </Button>\n <Button onClick={handleUploadClick} variant=\"filled\" size=\"default\" type=\"button\">\n <Icon name=\"upload\" />\n アップロード\n </Button>\n </div>\n <input\n id=\"media-upload-input\"\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={mediaType === 'image' ? 'image/*' : undefined}\n onChange={handleUploadFile}\n style={{ display: 'none' }}\n />\n </div>\n </DropZone>\n )}\n <MediaInsert\n isOpen={isInsertModalOpen}\n onInsert={handleInsertMedia}\n files={files}\n onClose={handleModalClose}\n tab={tab}\n filetype={mediaType}\n />\n </NodeViewWrapper>\n );\n}\n\nexport default Dropzone;\n","import { useState, useCallback, useRef } from 'react';\nimport type { ExtendedFile } from '@ablogcms/lib/read-files';\n\nexport type MediaDropAreaState = {\n isInsertModalOpen: boolean;\n files: File[];\n tab: 'upload' | 'select';\n};\n\nexport const useMediaSelect = () => {\n const [dropAreaState, setDropAreaState] = useState<MediaDropAreaState>({\n isInsertModalOpen: false,\n files: [],\n tab: 'upload',\n });\n\n const uploadFile = useCallback((files: File[]) => {\n setDropAreaState((prevState) => ({\n ...prevState,\n isInsertModalOpen: true,\n files,\n tab: 'upload',\n }));\n }, []);\n\n const handleModalClose = () => {\n setDropAreaState((prevState) => ({\n ...prevState,\n isInsertModalOpen: false,\n }));\n };\n\n const handleSelectClick = useCallback(() => {\n setDropAreaState((prevState) => ({\n ...prevState,\n isInsertModalOpen: true,\n files: [],\n tab: 'select',\n }));\n }, []);\n\n return {\n isInsertModalOpen: dropAreaState.isInsertModalOpen,\n files: dropAreaState.files,\n tab: dropAreaState.tab,\n uploadFile,\n handleModalClose,\n handleSelectClick,\n };\n};\n\nexport const useFileUpload = ({ uploader }: { uploader: (files: File[]) => void }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n const handleUploadFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = e.target;\n if (files && files instanceof FileList) {\n uploader(Array.from(files));\n }\n };\n\n return { fileInputRef, handleUploadClick, handleUploadFile };\n};\n\nexport const useDropZone = ({ uploader }: { uploader: (files: File[]) => void }) => {\n const onDrop = (files: ExtendedFile[]) => {\n uploader(files.map((item) => item.file));\n };\n return { onDrop };\n};\n","import type { Editor } from '@tiptap/core';\nimport type { MediaItem, MediaViewFileType } from '@ablogcms/media/types';\nimport { buildMediaBlockContent } from '../../mediaBlockContent';\n\nconst isImageMedia = (item: MediaItem): boolean => item.media_type === 'image' || item.media_type === 'svg';\n\n/**\n * 挿入対象を枠の種別 (accept) に従い、選択順を保って選別する。\n * - 'image' (画像ブロックの枠): 画像 (image/svg) かつ表示用サムネイル (media_thumbnail) を持つものだけ\n * - 'file' (ファイルブロックの枠): 画像以外のファイルだけ\n * - 'all' (エディタ本文への直接ドロップ): 画像はサムネイル必須・ファイルは全件 (混在可)\n *\n * これにより、画像枠にファイル・ファイル枠に画像が紛れても、枠の種別に合うものだけが挿入される。\n */\nexport const selectInsertableMedia = (items: MediaItem[], accept: MediaViewFileType): MediaItem[] =>\n items.filter((item) => {\n if (accept === 'image') {\n return isImageMedia(item) && Boolean(item.media_thumbnail);\n }\n if (accept === 'file') {\n return !isImageMedia(item);\n }\n return isImageMedia(item) ? Boolean(item.media_thumbnail) : true;\n });\n\n/**\n * imageBlock 新規挿入時の拡大表示デフォルト値を、ImageBlock 拡張の設定から取得する。\n * 設定が取れない場合は現行動作 (拡大表示オン = noLightbox 'true') を維持する。\n */\nconst getImageDefaultNoLightbox = (editor: Editor): string => {\n const extension = editor.extensionManager.extensions.find((ext) => ext.name === 'imageBlock');\n const getter = extension?.options?.getImageDefaultLightbox;\n return typeof getter === 'function' && getter() ? 'false' : 'true';\n};\n\n/**\n * 選択メディアを枠の種別 (accept) で絞り込み、media_type で画像/ファイルブロックに振り分けて、\n * プレースホルダ (MediaUpload ノード) の range を一括置換する。insertContentAt による一括置換のため、\n * 対象が複数あっても 1 回の挿入で選択順に生成され、プレースホルダも確実に消える。\n *\n * @returns 挿入したブロック数 (挿入対象が無ければ 0、このとき editor は操作しない)\n */\nexport const insertMediaBlocks = (\n editor: Editor,\n items: MediaItem[],\n accept: MediaViewFileType,\n className: string,\n range: { from: number; to: number }\n): number => {\n const targets = selectInsertableMedia(items, accept);\n if (targets.length === 0) {\n return 0;\n }\n const noLightbox = getImageDefaultNoLightbox(editor);\n const contents = targets.map((item) => buildMediaBlockContent(item, className, noLightbox));\n editor.chain().insertContentAt(range, contents).focus().run();\n return targets.length;\n};\n","import type { MediaViewFileType } from '@ablogcms/media/types';\nimport { isImageFile } from '@ablogcms/lib/read-files';\n\n/**\n * ドロップ/選択されたファイルを枠の種別 (accept) で絞り込む。\n * - 'image' (画像ブロックの枠): 画像 (image/svg/HEIC) のみ\n * - 'file' (ファイルブロックの枠): 画像以外のファイルのみ\n * - 'all' (エディタ本文への直接ドロップ): 全件 (混在可)\n *\n * アップロード前にこの関数で弾くことで、枠の種別に合わないファイルがそもそもアップロードされない。\n */\nexport const filterFilesByMediaType = (files: File[], accept: MediaViewFileType): File[] => {\n if (accept === 'image') {\n return files.filter((file) => isImageFile(file));\n }\n if (accept === 'file') {\n return files.filter((file) => !isImageFile(file));\n }\n return [...files];\n};\n","import { Mark } from '@tiptap/core';\n\nexport const CustomMark = Mark.create({\n name: 'customMark', // マークの名前\n\n // 属性の定義\n addAttributes() {\n return {\n class: {\n default: null, // デフォルトはnull\n parseHTML: (element) => element.getAttribute('class'), // HTMLからクラスを取得\n renderHTML: (attributes) => {\n if (!attributes.class) {\n return {};\n }\n return {\n class: attributes.class, // HTMLにクラスを追加\n };\n },\n },\n };\n },\n\n // HTMLのパース処理\n parseHTML() {\n return [\n {\n tag: 'span.custom-mark', // マークのHTMLタグを定義\n },\n ];\n },\n\n // HTMLのレンダリング処理\n renderHTML({ HTMLAttributes }) {\n return ['span', HTMLAttributes, 0]; // インライン要素として出力\n },\n});\n\nexport default CustomMark;\n","import { Extension } from '@tiptap/core';\nimport { Node as ProseMirrorNode, NodeType } from '@tiptap/pm/model';\nimport { TextSelection } from '@tiptap/pm/state';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unwrapList: {\n removeList: (pos: number) => ReturnType;\n removeListAsParagraphs: (pos: number) => ReturnType;\n unwrapList: () => ReturnType;\n removeBlockquote: (pos: number) => ReturnType;\n splitBulletList: (pos: number) => ReturnType;\n splitOrderedList: (pos: number) => ReturnType;\n };\n }\n}\n\nconst collectParagraphTexts = (node: ProseMirrorNode, paragraphType: NodeType): string[] => {\n const texts: string[] = [];\n\n if (node.type === paragraphType) {\n texts.push(node.textContent);\n }\n node.forEach((child) => {\n texts.push(...collectParagraphTexts(child, paragraphType));\n });\n return texts;\n};\n\nexport const CustomConvertBlock = Extension.create({\n name: 'CustomConvertBlock',\n\n addCommands() {\n return {\n removeList:\n (pos: number) =>\n ({ state, dispatch }) => {\n const { doc, schema } = state;\n const { bulletList, orderedList, paragraph, hardBreak } = schema.nodes;\n const newParagraphs: string[] = [];\n const listNode = doc.nodeAt(pos);\n if (!listNode || (listNode.type !== bulletList && listNode.type !== orderedList)) {\n return false;\n }\n listNode.forEach((listItemNode) => {\n newParagraphs.push(...collectParagraphTexts(listItemNode, paragraph));\n });\n const textNodes = newParagraphs.flatMap((line, index, arr) => {\n const nodes = [schema.text(line)];\n if (index < arr.length - 1) {\n nodes.push(hardBreak.create());\n }\n return nodes;\n });\n const paragraphNode = paragraph.create({}, textNodes);\n const tr = state.tr.replaceWith(pos, pos + listNode.nodeSize, paragraphNode);\n if (dispatch && tr.docChanged) {\n dispatch(tr);\n return true;\n }\n return false;\n },\n removeListAsParagraphs:\n (pos: number) =>\n ({ state, dispatch }) => {\n const { doc, schema } = state;\n const { bulletList, orderedList, paragraph } = schema.nodes;\n\n const listNode = doc.nodeAt(pos);\n if (!listNode || (listNode.type !== bulletList && listNode.type !== orderedList)) {\n return false;\n }\n\n const paragraphs: ProseMirrorNode[] = []; // @typescript-eslint/no-explicit-any\n\n listNode.forEach((listItemNode) => {\n // listItem 内の子ノード(通常は paragraph や他ブロック)\n listItemNode.forEach((child) => {\n if (child.type === paragraph) {\n const text = child.textContent;\n\n // 改行を含む場合は split して複数 paragraph にする\n const lines = text.split(/\\r?\\n/);\n lines.forEach((line) => {\n paragraphs.push(paragraph.create({}, schema.text(line)));\n });\n } else {\n // paragraph 以外(例: heading, image など)もそのまま展開\n paragraphs.push(child);\n }\n });\n });\n\n if (paragraphs.length === 0) {\n return false;\n }\n const tr = state.tr.replaceWith(pos, pos + listNode.nodeSize, paragraphs);\n\n if (dispatch && tr.docChanged) {\n dispatch(tr);\n return true;\n }\n return false;\n },\n unwrapList:\n () =>\n ({ state, dispatch }) => {\n const { selection, tr } = state;\n const { $from } = selection;\n let lifted = false;\n for (let { depth } = $from; depth > 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === 'listItem') {\n const pos = $from.before(depth);\n tr.setNodeMarkup(pos, state.schema.nodes.paragraph); // li -> p\n lifted = true;\n break;\n }\n }\n if (lifted && dispatch) {\n dispatch(tr);\n return true;\n }\n return false;\n },\n removeBlockquote:\n (pos: number) =>\n ({ state, dispatch }) => {\n const { doc, schema } = state;\n const { blockquote } = schema.nodes;\n\n // pos のノードを取得\n const node = doc.nodeAt(pos);\n if (!node || node.type !== blockquote) {\n return false;\n }\n // 子ノードをそのまま使う(paragraph 以外も含めて展開)\n const { content } = node;\n // blockquote を中身で置き換え\n const tr = state.tr.replaceWith(pos, pos + node.nodeSize, content);\n if (dispatch && tr.docChanged) {\n dispatch(tr);\n return true;\n }\n return false;\n },\n splitBulletList:\n (pos: number) =>\n ({ state, dispatch }) => {\n const { doc, schema } = state;\n const { bulletList, listItem, paragraph, hardBreak } = schema.nodes;\n const node = doc.nodeAt(pos);\n if (!node || node.type !== paragraph) {\n return false;\n }\n // paragraph 内を走査して <br> (= hardBreak) ごとに分割\n const items: ProseMirrorNode[][] = [[]];\n node.content.forEach((child) => {\n if (child.type === hardBreak) {\n // <br> が来たら新しい listItem の開始\n items.push([]);\n } else {\n // それ以外のノードを現在の listItem に追加\n items[items.length - 1].push(child);\n }\n });\n // listItem ノードを組み立て\n const listItems: ProseMirrorNode[] = items\n .filter((content) => content.length > 0) // 空行は無視\n .map((content) => listItem.create({}, paragraph.create({}, content)));\n if (listItems.length === 0) {\n return false;\n }\n const newList = bulletList.create({}, listItems);\n const tr = state.tr.replaceWith(pos, pos + node.nodeSize, newList);\n // bulletList の先頭に選択を置き直す\n const selection = TextSelection.near(tr.doc.resolve(pos + 1));\n\n if (dispatch && tr.docChanged) {\n dispatch(tr.setSelection(selection));\n return true;\n }\n return false;\n },\n splitOrderedList:\n (pos: number) =>\n ({ state, dispatch }) => {\n const { doc, schema } = state;\n const { orderedList, listItem, paragraph, hardBreak } = schema.nodes;\n const node = doc.nodeAt(pos);\n if (!node || node.type !== paragraph) {\n return false;\n }\n // paragraph 内を走査して <br> (= hardBreak) ごとに分割\n const items: ProseMirrorNode[][] = [[]];\n node.content.forEach((child) => {\n if (child.type === hardBreak) {\n // <br> が来たら新しい listItem の開始\n items.push([]);\n } else {\n // それ以外のノードを現在の listItem に追加\n items[items.length - 1].push(child);\n }\n });\n // listItem ノードを組み立て\n const listItems: ProseMirrorNode[] = items\n .filter((content) => content.length > 0) // 空行は無視\n .map((content) => listItem.create({}, paragraph.create({}, content)));\n if (listItems.length === 0) {\n return false;\n }\n const newList = orderedList.create({}, listItems);\n const tr = state.tr.replaceWith(pos, pos + node.nodeSize, newList);\n // orderedList の先頭に選択を置き直す\n const selection = TextSelection.near(tr.doc.resolve(pos + 1));\n\n if (dispatch && tr.docChanged) {\n dispatch(tr.setSelection(selection));\n return true;\n }\n return false;\n },\n };\n },\n});\n","import { Editor } from '@tiptap/react';\n\nimport {\n Figcaption,\n HorizontalRule,\n ImageBlock,\n FileBlock,\n LinkButton,\n MediaUpload,\n CodeBlock,\n} from '../../extensions';\n\nexport const isTableGripSelected = (node: HTMLElement) => {\n let container = node;\n\n while (container && !['TD', 'TH'].includes(container.tagName)) {\n container = container.parentElement!;\n }\n\n const gripColumn = container && container.querySelector && container.querySelector('button.grip-column.selected');\n const gripRow = container && container.querySelector && container.querySelector('button.grip-row.selected');\n\n if (gripColumn || gripRow) {\n return true;\n }\n\n return false;\n};\n\nexport const isCustomNodeSelected = (editor: Editor, node: HTMLElement) => {\n const customNodes = [\n HorizontalRule.name,\n ImageBlock.name,\n MediaUpload.name,\n CodeBlock.name,\n ImageBlock.name,\n FileBlock.name,\n LinkButton.name,\n // Link.name,\n Figcaption.name,\n ];\n\n return customNodes.some((type) => editor.isActive(type)) || isTableGripSelected(node);\n};\n\nexport default isCustomNodeSelected;\n","import { isTextSelection } from '@tiptap/core';\nimport { Editor } from '@tiptap/react';\n\nexport const isTextSelected = ({ editor }: { editor: Editor }) => {\n const {\n state: {\n doc,\n selection,\n selection: { empty, from, to },\n },\n } = editor;\n\n // Sometime check for `empty` is not enough.\n // Doubleclick an empty paragraph returns a node size of 2.\n // So we check also for an empty text size.\n const isEmptyTextBlock = !doc.textBetween(from, to).length && isTextSelection(selection);\n\n if (empty || isEmptyTextBlock || !editor.isEditable) {\n return false;\n }\n\n return true;\n};\n\nexport default isTextSelected;\n"],"mappings":"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","names":["mergeAttributes","Plugin","Decoration","DecorationSet","mergeAttributes","Plugin","DecorationSet","Decoration","Plugin","Decoration","DecorationSet","Plugin","DecorationSet","Decoration","mergeAttributes","Extension","Plugin","PluginKey","Extension","PluginKey","command","Extension","PluginKey","scrollHandler","Extension","mergeAttributes","Node","Node","mergeAttributes","mergeAttributes","Plugin","useCallback","useEffect","useRef","jsx","useRef","useCallback","useEffect","ReactNodeViewRenderer","useCallback","useEffect","useRef","NodeViewWrapper","jsx","jsxs","useRef","useCallback","useEffect","NodeViewWrapper","ReactNodeViewRenderer","Extension","Plugin","ReactNodeViewRenderer","Selection","NodeViewWrapper","jsx","NodeViewWrapper","Selection","ReactNodeViewRenderer","Node","mergeAttributes","Node","ReactNodeViewRenderer","Plugin","useCallback","useEffect","NodeViewWrapper","useState","useCallback","useRef","jsx","jsxs","useCallback","useEffect","NodeViewWrapper","Plugin","Node","ReactNodeViewRenderer","Extension"]}