@ablogcms/block-editor 3.2.28-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/README.md +21 -0
  2. package/dist/chunk-4KUPYKHV.mjs +34 -0
  3. package/dist/chunk-4KUPYKHV.mjs.map +1 -0
  4. package/dist/chunk-57Q3DEDF.mjs +23 -0
  5. package/dist/chunk-57Q3DEDF.mjs.map +1 -0
  6. package/dist/chunk-DUT25D7Z.mjs +20 -0
  7. package/dist/chunk-DUT25D7Z.mjs.map +1 -0
  8. package/dist/chunk-EM5TLDPY.mjs +17 -0
  9. package/dist/chunk-EM5TLDPY.mjs.map +1 -0
  10. package/dist/chunk-GIHTGDIW.mjs +23 -0
  11. package/dist/chunk-GIHTGDIW.mjs.map +1 -0
  12. package/dist/chunk-HNSTT2Z4.mjs +87 -0
  13. package/dist/chunk-HNSTT2Z4.mjs.map +1 -0
  14. package/dist/chunk-JYUNKG2P.mjs +88 -0
  15. package/dist/chunk-JYUNKG2P.mjs.map +1 -0
  16. package/dist/chunk-OFWQRNO2.mjs +56 -0
  17. package/dist/chunk-OFWQRNO2.mjs.map +1 -0
  18. package/dist/chunk-OZG2BL6F.mjs +61 -0
  19. package/dist/chunk-OZG2BL6F.mjs.map +1 -0
  20. package/dist/chunk-S24TRRWW.mjs +3126 -0
  21. package/dist/chunk-S24TRRWW.mjs.map +1 -0
  22. package/dist/chunk-TKSGCO5Z.mjs +2813 -0
  23. package/dist/chunk-TKSGCO5Z.mjs.map +1 -0
  24. package/dist/chunk-XGAKMQH4.mjs +627 -0
  25. package/dist/chunk-XGAKMQH4.mjs.map +1 -0
  26. package/dist/components/BlockEditor/BlockEditor.d.ts +36 -0
  27. package/dist/components/BlockEditor/BlockEditor.mjs +19 -0
  28. package/dist/components/BlockEditor/BlockEditor.mjs.map +1 -0
  29. package/dist/components/BlockEditor/index.d.ts +1 -0
  30. package/dist/components/BlockEditor/types.d.ts +10 -0
  31. package/dist/components/menus/ContentItemMenu/ContentItemMenu.d.ts +10 -0
  32. package/dist/components/menus/ContentItemMenu/components/BlockMenus.d.ts +8 -0
  33. package/dist/components/menus/ContentItemMenu/components/IdEditor.d.ts +5 -0
  34. package/dist/components/menus/ContentItemMenu/hooks/useContentItemActions.d.ts +17 -0
  35. package/dist/components/menus/ContentItemMenu/hooks/useData.d.ts +13 -0
  36. package/dist/components/menus/ContentItemMenu/index.d.ts +1 -0
  37. package/dist/components/menus/LinkMenu/LinkMenu.d.ts +4 -0
  38. package/dist/components/menus/LinkMenu/index.d.ts +1 -0
  39. package/dist/components/menus/TextMenu/TextMenu.d.ts +6 -0
  40. package/dist/components/menus/TextMenu/components/ContentTypePicker.d.ts +8 -0
  41. package/dist/components/menus/TextMenu/components/CustomClassPicker.d.ts +6 -0
  42. package/dist/components/menus/TextMenu/components/EditLinkPopover.d.ts +8 -0
  43. package/dist/components/menus/TextMenu/components/FontFamilyPicker.d.ts +5 -0
  44. package/dist/components/menus/TextMenu/components/FontSizePicker.d.ts +5 -0
  45. package/dist/components/menus/TextMenu/hooks/useTextmenuCommands.d.ts +25 -0
  46. package/dist/components/menus/TextMenu/hooks/useTextmenuStates.d.ts +22 -0
  47. package/dist/components/menus/TextMenu/index.d.ts +1 -0
  48. package/dist/components/menus/index.d.ts +3 -0
  49. package/dist/components/menus/types.d.ts +18 -0
  50. package/dist/components/panels/AlignPicker/AlignPicker.d.ts +5 -0
  51. package/dist/components/panels/AlignPicker/AlignPicker.mjs +12 -0
  52. package/dist/components/panels/AlignPicker/AlignPicker.mjs.map +1 -0
  53. package/dist/components/panels/AlignPicker/index.d.ts +1 -0
  54. package/dist/components/panels/Colorpicker/ColorButton.d.ts +6 -0
  55. package/dist/components/panels/Colorpicker/ColorButton.mjs +10 -0
  56. package/dist/components/panels/Colorpicker/ColorButton.mjs.map +1 -0
  57. package/dist/components/panels/Colorpicker/Colorpicker.d.ts +6 -0
  58. package/dist/components/panels/Colorpicker/index.d.ts +1 -0
  59. package/dist/components/panels/LinkEditorPanel/LinkEditorPanel.d.ts +17 -0
  60. package/dist/components/panels/LinkEditorPanel/index.d.ts +1 -0
  61. package/dist/components/panels/LinkPreviewPanel/LinkPreviewPanel.d.ts +6 -0
  62. package/dist/components/panels/LinkPreviewPanel/index.d.ts +1 -0
  63. package/dist/components/panels/index.d.ts +4 -0
  64. package/dist/components/ui/Icon.d.ts +5 -0
  65. package/dist/components/ui/Icon.mjs +7 -0
  66. package/dist/components/ui/Icon.mjs.map +1 -0
  67. package/dist/components/ui/Surface.d.ts +6 -0
  68. package/dist/components/ui/Surface.mjs +10 -0
  69. package/dist/components/ui/Surface.mjs.map +1 -0
  70. package/dist/components/ui/Toolbar.d.ts +45 -0
  71. package/dist/components/ui/Toolbar.mjs +11 -0
  72. package/dist/components/ui/Toolbar.mjs.map +1 -0
  73. package/dist/config/blockMenuCategories.d.ts +22 -0
  74. package/dist/config/blockMenuCategories.mjs +19 -0
  75. package/dist/config/blockMenuCategories.mjs.map +1 -0
  76. package/dist/config/blocks/__tests__/createMockEditor.d.ts +29 -0
  77. package/dist/config/blocks/blockquote.d.ts +3 -0
  78. package/dist/config/blocks/bulletList.d.ts +3 -0
  79. package/dist/config/blocks/codeBlock.d.ts +3 -0
  80. package/dist/config/blocks/columns1.d.ts +3 -0
  81. package/dist/config/blocks/columns2.d.ts +3 -0
  82. package/dist/config/blocks/columns3.d.ts +3 -0
  83. package/dist/config/blocks/createHeadingActions.d.ts +7 -0
  84. package/dist/config/blocks/file.d.ts +3 -0
  85. package/dist/config/blocks/heading1.d.ts +3 -0
  86. package/dist/config/blocks/heading2.d.ts +3 -0
  87. package/dist/config/blocks/heading3.d.ts +3 -0
  88. package/dist/config/blocks/heading4.d.ts +3 -0
  89. package/dist/config/blocks/heading5.d.ts +3 -0
  90. package/dist/config/blocks/heading6.d.ts +3 -0
  91. package/dist/config/blocks/horizontalRule.d.ts +3 -0
  92. package/dist/config/blocks/image.d.ts +3 -0
  93. package/dist/config/blocks/index.d.ts +13 -0
  94. package/dist/config/blocks/linkButton.d.ts +3 -0
  95. package/dist/config/blocks/numberedList.d.ts +3 -0
  96. package/dist/config/blocks/paragraph.d.ts +3 -0
  97. package/dist/config/blocks/table.d.ts +3 -0
  98. package/dist/context/EditorExtensions.d.ts +12 -0
  99. package/dist/context/EditorExtensions.mjs +18 -0
  100. package/dist/context/EditorExtensions.mjs.map +1 -0
  101. package/dist/context/EditorSettings.d.ts +7 -0
  102. package/dist/context/EditorSettings.mjs +12 -0
  103. package/dist/context/EditorSettings.mjs.map +1 -0
  104. package/dist/dataview/column-type.d.ts +11 -0
  105. package/dist/dataview/column-type.mjs +14 -0
  106. package/dist/dataview/column-type.mjs.map +1 -0
  107. package/dist/extensions/BaseBlock/BaseBlock.d.ts +12 -0
  108. package/dist/extensions/BaseBlock/index.d.ts +1 -0
  109. package/dist/extensions/BlockquoteFigure/BlockquoteFigure.d.ts +11 -0
  110. package/dist/extensions/BlockquoteFigure/Quote/Quote.d.ts +3 -0
  111. package/dist/extensions/BlockquoteFigure/Quote/index.d.ts +1 -0
  112. package/dist/extensions/BlockquoteFigure/QuoteCaption/QuoteCaption.d.ts +3 -0
  113. package/dist/extensions/BlockquoteFigure/QuoteCaption/index.d.ts +1 -0
  114. package/dist/extensions/BlockquoteFigure/index.d.ts +1 -0
  115. package/dist/extensions/CustomConvertBlock/CustomConvertBlock.d.ts +14 -0
  116. package/dist/extensions/CustomConvertBlock/index.d.ts +1 -0
  117. package/dist/extensions/CustomMark/CustomMark.d.ts +3 -0
  118. package/dist/extensions/CustomMark/index.d.ts +1 -0
  119. package/dist/extensions/Document/Document.d.ts +2 -0
  120. package/dist/extensions/Document/index.d.ts +1 -0
  121. package/dist/extensions/Figcaption/Figcaption.d.ts +5 -0
  122. package/dist/extensions/Figcaption/index.d.ts +1 -0
  123. package/dist/extensions/Figure/Figure.d.ts +5 -0
  124. package/dist/extensions/Figure/index.d.ts +1 -0
  125. package/dist/extensions/FileBlock/FileBlock.d.ts +25 -0
  126. package/dist/extensions/FileBlock/components/FileBlockCaption.d.ts +6 -0
  127. package/dist/extensions/FileBlock/components/FileBlockMenu.d.ts +4 -0
  128. package/dist/extensions/FileBlock/components/FileBlockView.d.ts +9 -0
  129. package/dist/extensions/FileBlock/index.d.ts +1 -0
  130. package/dist/extensions/FileBlock/mediaUpdateHooks.d.ts +10 -0
  131. package/dist/extensions/FontStyle/FontStyle.d.ts +20 -0
  132. package/dist/extensions/FontStyle/index.d.ts +1 -0
  133. package/dist/extensions/Heading/Heading.d.ts +2 -0
  134. package/dist/extensions/Heading/index.d.ts +1 -0
  135. package/dist/extensions/HorizontalRule/HorizontalRule.d.ts +2 -0
  136. package/dist/extensions/HorizontalRule/index.d.ts +1 -0
  137. package/dist/extensions/Image/Image.d.ts +2 -0
  138. package/dist/extensions/Image/index.d.ts +1 -0
  139. package/dist/extensions/ImageBlock/ImageBlock.d.ts +34 -0
  140. package/dist/extensions/ImageBlock/components/ImageBlockCaption.d.ts +6 -0
  141. package/dist/extensions/ImageBlock/components/ImageBlockLink.d.ts +6 -0
  142. package/dist/extensions/ImageBlock/components/ImageBlockMenu.d.ts +4 -0
  143. package/dist/extensions/ImageBlock/components/ImageBlockView.d.ts +9 -0
  144. package/dist/extensions/ImageBlock/components/ImageBlockWidth.d.ts +5 -0
  145. package/dist/extensions/ImageBlock/index.d.ts +1 -0
  146. package/dist/extensions/ImageBlock/mediaUpdateHooks.d.ts +10 -0
  147. package/dist/extensions/Link/Link.d.ts +4 -0
  148. package/dist/extensions/Link/index.d.ts +1 -0
  149. package/dist/extensions/LinkButton/LinkButton.d.ts +15 -0
  150. package/dist/extensions/LinkButton/components/LinkButtonMenu.d.ts +4 -0
  151. package/dist/extensions/LinkButton/components/LinkButtonView.d.ts +7 -0
  152. package/dist/extensions/LinkButton/index.d.ts +1 -0
  153. package/dist/extensions/MediaUpload/MediaUpload.d.ts +12 -0
  154. package/dist/extensions/MediaUpload/index.d.ts +1 -0
  155. package/dist/extensions/MediaUpload/view/Dropzone.d.ts +7 -0
  156. package/dist/extensions/MediaUpload/view/filterFilesByMediaType.d.ts +10 -0
  157. package/dist/extensions/MediaUpload/view/hooks.d.ts +26 -0
  158. package/dist/extensions/MediaUpload/view/index.d.ts +1 -0
  159. package/dist/extensions/MediaUpload/view/insertMediaBlocks.d.ts +22 -0
  160. package/dist/extensions/MultiColumn/Column.d.ts +3 -0
  161. package/dist/extensions/MultiColumn/Columns.d.ts +16 -0
  162. package/dist/extensions/MultiColumn/index.d.ts +2 -0
  163. package/dist/extensions/PasteHandler/PasteHandler.d.ts +4 -0
  164. package/dist/extensions/PasteHandler/index.d.ts +1 -0
  165. package/dist/extensions/Selection/Selection.d.ts +3 -0
  166. package/dist/extensions/Selection/index.d.ts +1 -0
  167. package/dist/extensions/SlashCommand/BlockMenu.d.ts +9 -0
  168. package/dist/extensions/SlashCommand/SlashCommand.d.ts +18 -0
  169. package/dist/extensions/SlashCommand/index.d.ts +1 -0
  170. package/dist/extensions/Table/Cell.d.ts +12 -0
  171. package/dist/extensions/Table/Header.d.ts +9 -0
  172. package/dist/extensions/Table/Row.d.ts +2 -0
  173. package/dist/extensions/Table/Table.d.ts +9 -0
  174. package/dist/extensions/Table/index.d.ts +4 -0
  175. package/dist/extensions/Table/menus/ColorPicker.d.ts +4 -0
  176. package/dist/extensions/Table/menus/TableColumn/index.d.ts +4 -0
  177. package/dist/extensions/Table/menus/TableColumn/utils.d.ts +8 -0
  178. package/dist/extensions/Table/menus/TableMenu/index.d.ts +4 -0
  179. package/dist/extensions/Table/menus/TableRow/index.d.ts +4 -0
  180. package/dist/extensions/Table/menus/TableRow/utils.d.ts +8 -0
  181. package/dist/extensions/Table/menus/hooks.d.ts +5 -0
  182. package/dist/extensions/Table/menus/index.d.ts +3 -0
  183. package/dist/extensions/Table/utils.d.ts +44 -0
  184. package/dist/extensions/TrailingNode/index.d.ts +1 -0
  185. package/dist/extensions/TrailingNode/trailing-node.d.ts +11 -0
  186. package/dist/extensions/extension-kit.d.ts +10 -0
  187. package/dist/extensions/index.d.ts +34 -0
  188. package/dist/extensions/mediaBlockContent.d.ts +41 -0
  189. package/dist/hooks/resolveCommands.d.ts +10 -0
  190. package/dist/hooks/useBlockEditor.d.ts +27 -0
  191. package/dist/hooks/useBlockMenus.d.ts +17 -0
  192. package/dist/hooks/useEditorViewDom.d.ts +15 -0
  193. package/dist/hooks/useFrequentlyUsed.d.ts +6 -0
  194. package/dist/hooks/useSettings.d.ts +10 -0
  195. package/dist/index.d.ts +5 -0
  196. package/dist/index.mjs +33 -0
  197. package/dist/index.mjs.map +1 -0
  198. package/dist/lib/utils/commandUsageStorage.d.ts +14 -0
  199. package/dist/lib/utils/index.d.ts +5 -0
  200. package/dist/lib/utils/isCustomNodeSelected.d.ts +4 -0
  201. package/dist/lib/utils/isTextSelected.d.ts +5 -0
  202. package/dist/tiptap/core.d.ts +1 -0
  203. package/dist/tiptap/core.mjs +3 -0
  204. package/dist/tiptap/core.mjs.map +1 -0
  205. package/dist/tiptap/pm/changeset.d.ts +1 -0
  206. package/dist/tiptap/pm/changeset.mjs +3 -0
  207. package/dist/tiptap/pm/changeset.mjs.map +1 -0
  208. package/dist/tiptap/pm/commands.d.ts +1 -0
  209. package/dist/tiptap/pm/commands.mjs +3 -0
  210. package/dist/tiptap/pm/commands.mjs.map +1 -0
  211. package/dist/tiptap/pm/dropcursor.d.ts +1 -0
  212. package/dist/tiptap/pm/dropcursor.mjs +3 -0
  213. package/dist/tiptap/pm/dropcursor.mjs.map +1 -0
  214. package/dist/tiptap/pm/gapcursor.d.ts +1 -0
  215. package/dist/tiptap/pm/gapcursor.mjs +3 -0
  216. package/dist/tiptap/pm/gapcursor.mjs.map +1 -0
  217. package/dist/tiptap/pm/history.d.ts +1 -0
  218. package/dist/tiptap/pm/history.mjs +3 -0
  219. package/dist/tiptap/pm/history.mjs.map +1 -0
  220. package/dist/tiptap/pm/inputrules.d.ts +1 -0
  221. package/dist/tiptap/pm/inputrules.mjs +3 -0
  222. package/dist/tiptap/pm/inputrules.mjs.map +1 -0
  223. package/dist/tiptap/pm/keymap.d.ts +1 -0
  224. package/dist/tiptap/pm/keymap.mjs +3 -0
  225. package/dist/tiptap/pm/keymap.mjs.map +1 -0
  226. package/dist/tiptap/pm/model.d.ts +1 -0
  227. package/dist/tiptap/pm/model.mjs +3 -0
  228. package/dist/tiptap/pm/model.mjs.map +1 -0
  229. package/dist/tiptap/pm/schema-list.d.ts +1 -0
  230. package/dist/tiptap/pm/schema-list.mjs +3 -0
  231. package/dist/tiptap/pm/schema-list.mjs.map +1 -0
  232. package/dist/tiptap/pm/state.d.ts +1 -0
  233. package/dist/tiptap/pm/state.mjs +3 -0
  234. package/dist/tiptap/pm/state.mjs.map +1 -0
  235. package/dist/tiptap/pm/tables.d.ts +1 -0
  236. package/dist/tiptap/pm/tables.mjs +3 -0
  237. package/dist/tiptap/pm/tables.mjs.map +1 -0
  238. package/dist/tiptap/pm/transform.d.ts +1 -0
  239. package/dist/tiptap/pm/transform.mjs +3 -0
  240. package/dist/tiptap/pm/transform.mjs.map +1 -0
  241. package/dist/tiptap/pm/view.d.ts +1 -0
  242. package/dist/tiptap/pm/view.mjs +3 -0
  243. package/dist/tiptap/pm/view.mjs.map +1 -0
  244. package/dist/tiptap/react.d.ts +1 -0
  245. package/dist/tiptap/react.mjs +3 -0
  246. package/dist/tiptap/react.mjs.map +1 -0
  247. package/dist/tiptap/suggestion.d.ts +3 -0
  248. package/dist/tiptap/suggestion.mjs +8 -0
  249. package/dist/tiptap/suggestion.mjs.map +1 -0
  250. package/dist/tiptap/tiptap.d.ts +48 -0
  251. package/dist/tiptap/tiptap.mjs +41 -0
  252. package/dist/tiptap/tiptap.mjs.map +1 -0
  253. package/dist/types/index.d.ts +149 -0
  254. package/dist/types/index.mjs +1 -0
  255. package/dist/types/index.mjs.map +1 -0
  256. package/dist/utils/createBlockMenu.d.ts +30 -0
  257. package/dist/utils/createProps.d.ts +7 -0
  258. package/dist/utils/createProps.mjs +7 -0
  259. package/dist/utils/createProps.mjs.map +1 -0
  260. package/dist/utils/mergeBlockDefinitions.d.ts +10 -0
  261. package/dist/utils/mergeBlockDefinitions.mjs +8 -0
  262. package/dist/utils/mergeBlockDefinitions.mjs.map +1 -0
  263. package/dist/utils/mergeSettings.d.ts +11 -0
  264. package/dist/utils/normalizeSettings.d.ts +28 -0
  265. package/dist/utils/normalizeSettings.mjs +13 -0
  266. package/dist/utils/normalizeSettings.mjs.map +1 -0
  267. package/package.json +243 -0
@@ -0,0 +1 @@
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"]}