@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.
- package/README.md +21 -0
- package/dist/chunk-4KUPYKHV.mjs +34 -0
- package/dist/chunk-4KUPYKHV.mjs.map +1 -0
- package/dist/chunk-57Q3DEDF.mjs +23 -0
- package/dist/chunk-57Q3DEDF.mjs.map +1 -0
- package/dist/chunk-DUT25D7Z.mjs +20 -0
- package/dist/chunk-DUT25D7Z.mjs.map +1 -0
- package/dist/chunk-EM5TLDPY.mjs +17 -0
- package/dist/chunk-EM5TLDPY.mjs.map +1 -0
- package/dist/chunk-GIHTGDIW.mjs +23 -0
- package/dist/chunk-GIHTGDIW.mjs.map +1 -0
- package/dist/chunk-HNSTT2Z4.mjs +87 -0
- package/dist/chunk-HNSTT2Z4.mjs.map +1 -0
- package/dist/chunk-JYUNKG2P.mjs +88 -0
- package/dist/chunk-JYUNKG2P.mjs.map +1 -0
- package/dist/chunk-OFWQRNO2.mjs +56 -0
- package/dist/chunk-OFWQRNO2.mjs.map +1 -0
- package/dist/chunk-OZG2BL6F.mjs +61 -0
- package/dist/chunk-OZG2BL6F.mjs.map +1 -0
- package/dist/chunk-S24TRRWW.mjs +3126 -0
- package/dist/chunk-S24TRRWW.mjs.map +1 -0
- package/dist/chunk-TKSGCO5Z.mjs +2813 -0
- package/dist/chunk-TKSGCO5Z.mjs.map +1 -0
- package/dist/chunk-XGAKMQH4.mjs +627 -0
- package/dist/chunk-XGAKMQH4.mjs.map +1 -0
- package/dist/components/BlockEditor/BlockEditor.d.ts +36 -0
- package/dist/components/BlockEditor/BlockEditor.mjs +19 -0
- package/dist/components/BlockEditor/BlockEditor.mjs.map +1 -0
- package/dist/components/BlockEditor/index.d.ts +1 -0
- package/dist/components/BlockEditor/types.d.ts +10 -0
- package/dist/components/menus/ContentItemMenu/ContentItemMenu.d.ts +10 -0
- package/dist/components/menus/ContentItemMenu/components/BlockMenus.d.ts +8 -0
- package/dist/components/menus/ContentItemMenu/components/IdEditor.d.ts +5 -0
- package/dist/components/menus/ContentItemMenu/hooks/useContentItemActions.d.ts +17 -0
- package/dist/components/menus/ContentItemMenu/hooks/useData.d.ts +13 -0
- package/dist/components/menus/ContentItemMenu/index.d.ts +1 -0
- package/dist/components/menus/LinkMenu/LinkMenu.d.ts +4 -0
- package/dist/components/menus/LinkMenu/index.d.ts +1 -0
- package/dist/components/menus/TextMenu/TextMenu.d.ts +6 -0
- package/dist/components/menus/TextMenu/components/ContentTypePicker.d.ts +8 -0
- package/dist/components/menus/TextMenu/components/CustomClassPicker.d.ts +6 -0
- package/dist/components/menus/TextMenu/components/EditLinkPopover.d.ts +8 -0
- package/dist/components/menus/TextMenu/components/FontFamilyPicker.d.ts +5 -0
- package/dist/components/menus/TextMenu/components/FontSizePicker.d.ts +5 -0
- package/dist/components/menus/TextMenu/hooks/useTextmenuCommands.d.ts +25 -0
- package/dist/components/menus/TextMenu/hooks/useTextmenuStates.d.ts +22 -0
- package/dist/components/menus/TextMenu/index.d.ts +1 -0
- package/dist/components/menus/index.d.ts +3 -0
- package/dist/components/menus/types.d.ts +18 -0
- package/dist/components/panels/AlignPicker/AlignPicker.d.ts +5 -0
- package/dist/components/panels/AlignPicker/AlignPicker.mjs +12 -0
- package/dist/components/panels/AlignPicker/AlignPicker.mjs.map +1 -0
- package/dist/components/panels/AlignPicker/index.d.ts +1 -0
- package/dist/components/panels/Colorpicker/ColorButton.d.ts +6 -0
- package/dist/components/panels/Colorpicker/ColorButton.mjs +10 -0
- package/dist/components/panels/Colorpicker/ColorButton.mjs.map +1 -0
- package/dist/components/panels/Colorpicker/Colorpicker.d.ts +6 -0
- package/dist/components/panels/Colorpicker/index.d.ts +1 -0
- package/dist/components/panels/LinkEditorPanel/LinkEditorPanel.d.ts +17 -0
- package/dist/components/panels/LinkEditorPanel/index.d.ts +1 -0
- package/dist/components/panels/LinkPreviewPanel/LinkPreviewPanel.d.ts +6 -0
- package/dist/components/panels/LinkPreviewPanel/index.d.ts +1 -0
- package/dist/components/panels/index.d.ts +4 -0
- package/dist/components/ui/Icon.d.ts +5 -0
- package/dist/components/ui/Icon.mjs +7 -0
- package/dist/components/ui/Icon.mjs.map +1 -0
- package/dist/components/ui/Surface.d.ts +6 -0
- package/dist/components/ui/Surface.mjs +10 -0
- package/dist/components/ui/Surface.mjs.map +1 -0
- package/dist/components/ui/Toolbar.d.ts +45 -0
- package/dist/components/ui/Toolbar.mjs +11 -0
- package/dist/components/ui/Toolbar.mjs.map +1 -0
- package/dist/config/blockMenuCategories.d.ts +22 -0
- package/dist/config/blockMenuCategories.mjs +19 -0
- package/dist/config/blockMenuCategories.mjs.map +1 -0
- package/dist/config/blocks/__tests__/createMockEditor.d.ts +29 -0
- package/dist/config/blocks/blockquote.d.ts +3 -0
- package/dist/config/blocks/bulletList.d.ts +3 -0
- package/dist/config/blocks/codeBlock.d.ts +3 -0
- package/dist/config/blocks/columns1.d.ts +3 -0
- package/dist/config/blocks/columns2.d.ts +3 -0
- package/dist/config/blocks/columns3.d.ts +3 -0
- package/dist/config/blocks/createHeadingActions.d.ts +7 -0
- package/dist/config/blocks/file.d.ts +3 -0
- package/dist/config/blocks/heading1.d.ts +3 -0
- package/dist/config/blocks/heading2.d.ts +3 -0
- package/dist/config/blocks/heading3.d.ts +3 -0
- package/dist/config/blocks/heading4.d.ts +3 -0
- package/dist/config/blocks/heading5.d.ts +3 -0
- package/dist/config/blocks/heading6.d.ts +3 -0
- package/dist/config/blocks/horizontalRule.d.ts +3 -0
- package/dist/config/blocks/image.d.ts +3 -0
- package/dist/config/blocks/index.d.ts +13 -0
- package/dist/config/blocks/linkButton.d.ts +3 -0
- package/dist/config/blocks/numberedList.d.ts +3 -0
- package/dist/config/blocks/paragraph.d.ts +3 -0
- package/dist/config/blocks/table.d.ts +3 -0
- package/dist/context/EditorExtensions.d.ts +12 -0
- package/dist/context/EditorExtensions.mjs +18 -0
- package/dist/context/EditorExtensions.mjs.map +1 -0
- package/dist/context/EditorSettings.d.ts +7 -0
- package/dist/context/EditorSettings.mjs +12 -0
- package/dist/context/EditorSettings.mjs.map +1 -0
- package/dist/dataview/column-type.d.ts +11 -0
- package/dist/dataview/column-type.mjs +14 -0
- package/dist/dataview/column-type.mjs.map +1 -0
- package/dist/extensions/BaseBlock/BaseBlock.d.ts +12 -0
- package/dist/extensions/BaseBlock/index.d.ts +1 -0
- package/dist/extensions/BlockquoteFigure/BlockquoteFigure.d.ts +11 -0
- package/dist/extensions/BlockquoteFigure/Quote/Quote.d.ts +3 -0
- package/dist/extensions/BlockquoteFigure/Quote/index.d.ts +1 -0
- package/dist/extensions/BlockquoteFigure/QuoteCaption/QuoteCaption.d.ts +3 -0
- package/dist/extensions/BlockquoteFigure/QuoteCaption/index.d.ts +1 -0
- package/dist/extensions/BlockquoteFigure/index.d.ts +1 -0
- package/dist/extensions/CustomConvertBlock/CustomConvertBlock.d.ts +14 -0
- package/dist/extensions/CustomConvertBlock/index.d.ts +1 -0
- package/dist/extensions/CustomMark/CustomMark.d.ts +3 -0
- package/dist/extensions/CustomMark/index.d.ts +1 -0
- package/dist/extensions/Document/Document.d.ts +2 -0
- package/dist/extensions/Document/index.d.ts +1 -0
- package/dist/extensions/Figcaption/Figcaption.d.ts +5 -0
- package/dist/extensions/Figcaption/index.d.ts +1 -0
- package/dist/extensions/Figure/Figure.d.ts +5 -0
- package/dist/extensions/Figure/index.d.ts +1 -0
- package/dist/extensions/FileBlock/FileBlock.d.ts +25 -0
- package/dist/extensions/FileBlock/components/FileBlockCaption.d.ts +6 -0
- package/dist/extensions/FileBlock/components/FileBlockMenu.d.ts +4 -0
- package/dist/extensions/FileBlock/components/FileBlockView.d.ts +9 -0
- package/dist/extensions/FileBlock/index.d.ts +1 -0
- package/dist/extensions/FileBlock/mediaUpdateHooks.d.ts +10 -0
- package/dist/extensions/FontStyle/FontStyle.d.ts +20 -0
- package/dist/extensions/FontStyle/index.d.ts +1 -0
- package/dist/extensions/Heading/Heading.d.ts +2 -0
- package/dist/extensions/Heading/index.d.ts +1 -0
- package/dist/extensions/HorizontalRule/HorizontalRule.d.ts +2 -0
- package/dist/extensions/HorizontalRule/index.d.ts +1 -0
- package/dist/extensions/Image/Image.d.ts +2 -0
- package/dist/extensions/Image/index.d.ts +1 -0
- package/dist/extensions/ImageBlock/ImageBlock.d.ts +34 -0
- package/dist/extensions/ImageBlock/components/ImageBlockCaption.d.ts +6 -0
- package/dist/extensions/ImageBlock/components/ImageBlockLink.d.ts +6 -0
- package/dist/extensions/ImageBlock/components/ImageBlockMenu.d.ts +4 -0
- package/dist/extensions/ImageBlock/components/ImageBlockView.d.ts +9 -0
- package/dist/extensions/ImageBlock/components/ImageBlockWidth.d.ts +5 -0
- package/dist/extensions/ImageBlock/index.d.ts +1 -0
- package/dist/extensions/ImageBlock/mediaUpdateHooks.d.ts +10 -0
- package/dist/extensions/Link/Link.d.ts +4 -0
- package/dist/extensions/Link/index.d.ts +1 -0
- package/dist/extensions/LinkButton/LinkButton.d.ts +15 -0
- package/dist/extensions/LinkButton/components/LinkButtonMenu.d.ts +4 -0
- package/dist/extensions/LinkButton/components/LinkButtonView.d.ts +7 -0
- package/dist/extensions/LinkButton/index.d.ts +1 -0
- package/dist/extensions/MediaUpload/MediaUpload.d.ts +12 -0
- package/dist/extensions/MediaUpload/index.d.ts +1 -0
- package/dist/extensions/MediaUpload/view/Dropzone.d.ts +7 -0
- package/dist/extensions/MediaUpload/view/filterFilesByMediaType.d.ts +10 -0
- package/dist/extensions/MediaUpload/view/hooks.d.ts +26 -0
- package/dist/extensions/MediaUpload/view/index.d.ts +1 -0
- package/dist/extensions/MediaUpload/view/insertMediaBlocks.d.ts +22 -0
- package/dist/extensions/MultiColumn/Column.d.ts +3 -0
- package/dist/extensions/MultiColumn/Columns.d.ts +16 -0
- package/dist/extensions/MultiColumn/index.d.ts +2 -0
- package/dist/extensions/PasteHandler/PasteHandler.d.ts +4 -0
- package/dist/extensions/PasteHandler/index.d.ts +1 -0
- package/dist/extensions/Selection/Selection.d.ts +3 -0
- package/dist/extensions/Selection/index.d.ts +1 -0
- package/dist/extensions/SlashCommand/BlockMenu.d.ts +9 -0
- package/dist/extensions/SlashCommand/SlashCommand.d.ts +18 -0
- package/dist/extensions/SlashCommand/index.d.ts +1 -0
- package/dist/extensions/Table/Cell.d.ts +12 -0
- package/dist/extensions/Table/Header.d.ts +9 -0
- package/dist/extensions/Table/Row.d.ts +2 -0
- package/dist/extensions/Table/Table.d.ts +9 -0
- package/dist/extensions/Table/index.d.ts +4 -0
- package/dist/extensions/Table/menus/ColorPicker.d.ts +4 -0
- package/dist/extensions/Table/menus/TableColumn/index.d.ts +4 -0
- package/dist/extensions/Table/menus/TableColumn/utils.d.ts +8 -0
- package/dist/extensions/Table/menus/TableMenu/index.d.ts +4 -0
- package/dist/extensions/Table/menus/TableRow/index.d.ts +4 -0
- package/dist/extensions/Table/menus/TableRow/utils.d.ts +8 -0
- package/dist/extensions/Table/menus/hooks.d.ts +5 -0
- package/dist/extensions/Table/menus/index.d.ts +3 -0
- package/dist/extensions/Table/utils.d.ts +44 -0
- package/dist/extensions/TrailingNode/index.d.ts +1 -0
- package/dist/extensions/TrailingNode/trailing-node.d.ts +11 -0
- package/dist/extensions/extension-kit.d.ts +10 -0
- package/dist/extensions/index.d.ts +34 -0
- package/dist/extensions/mediaBlockContent.d.ts +41 -0
- package/dist/hooks/resolveCommands.d.ts +10 -0
- package/dist/hooks/useBlockEditor.d.ts +27 -0
- package/dist/hooks/useBlockMenus.d.ts +17 -0
- package/dist/hooks/useEditorViewDom.d.ts +15 -0
- package/dist/hooks/useFrequentlyUsed.d.ts +6 -0
- package/dist/hooks/useSettings.d.ts +10 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.mjs +33 -0
- package/dist/index.mjs.map +1 -0
- package/dist/lib/utils/commandUsageStorage.d.ts +14 -0
- package/dist/lib/utils/index.d.ts +5 -0
- package/dist/lib/utils/isCustomNodeSelected.d.ts +4 -0
- package/dist/lib/utils/isTextSelected.d.ts +5 -0
- package/dist/tiptap/core.d.ts +1 -0
- package/dist/tiptap/core.mjs +3 -0
- package/dist/tiptap/core.mjs.map +1 -0
- package/dist/tiptap/pm/changeset.d.ts +1 -0
- package/dist/tiptap/pm/changeset.mjs +3 -0
- package/dist/tiptap/pm/changeset.mjs.map +1 -0
- package/dist/tiptap/pm/commands.d.ts +1 -0
- package/dist/tiptap/pm/commands.mjs +3 -0
- package/dist/tiptap/pm/commands.mjs.map +1 -0
- package/dist/tiptap/pm/dropcursor.d.ts +1 -0
- package/dist/tiptap/pm/dropcursor.mjs +3 -0
- package/dist/tiptap/pm/dropcursor.mjs.map +1 -0
- package/dist/tiptap/pm/gapcursor.d.ts +1 -0
- package/dist/tiptap/pm/gapcursor.mjs +3 -0
- package/dist/tiptap/pm/gapcursor.mjs.map +1 -0
- package/dist/tiptap/pm/history.d.ts +1 -0
- package/dist/tiptap/pm/history.mjs +3 -0
- package/dist/tiptap/pm/history.mjs.map +1 -0
- package/dist/tiptap/pm/inputrules.d.ts +1 -0
- package/dist/tiptap/pm/inputrules.mjs +3 -0
- package/dist/tiptap/pm/inputrules.mjs.map +1 -0
- package/dist/tiptap/pm/keymap.d.ts +1 -0
- package/dist/tiptap/pm/keymap.mjs +3 -0
- package/dist/tiptap/pm/keymap.mjs.map +1 -0
- package/dist/tiptap/pm/model.d.ts +1 -0
- package/dist/tiptap/pm/model.mjs +3 -0
- package/dist/tiptap/pm/model.mjs.map +1 -0
- package/dist/tiptap/pm/schema-list.d.ts +1 -0
- package/dist/tiptap/pm/schema-list.mjs +3 -0
- package/dist/tiptap/pm/schema-list.mjs.map +1 -0
- package/dist/tiptap/pm/state.d.ts +1 -0
- package/dist/tiptap/pm/state.mjs +3 -0
- package/dist/tiptap/pm/state.mjs.map +1 -0
- package/dist/tiptap/pm/tables.d.ts +1 -0
- package/dist/tiptap/pm/tables.mjs +3 -0
- package/dist/tiptap/pm/tables.mjs.map +1 -0
- package/dist/tiptap/pm/transform.d.ts +1 -0
- package/dist/tiptap/pm/transform.mjs +3 -0
- package/dist/tiptap/pm/transform.mjs.map +1 -0
- package/dist/tiptap/pm/view.d.ts +1 -0
- package/dist/tiptap/pm/view.mjs +3 -0
- package/dist/tiptap/pm/view.mjs.map +1 -0
- package/dist/tiptap/react.d.ts +1 -0
- package/dist/tiptap/react.mjs +3 -0
- package/dist/tiptap/react.mjs.map +1 -0
- package/dist/tiptap/suggestion.d.ts +3 -0
- package/dist/tiptap/suggestion.mjs +8 -0
- package/dist/tiptap/suggestion.mjs.map +1 -0
- package/dist/tiptap/tiptap.d.ts +48 -0
- package/dist/tiptap/tiptap.mjs +41 -0
- package/dist/tiptap/tiptap.mjs.map +1 -0
- package/dist/types/index.d.ts +149 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utils/createBlockMenu.d.ts +30 -0
- package/dist/utils/createProps.d.ts +7 -0
- package/dist/utils/createProps.mjs +7 -0
- package/dist/utils/createProps.mjs.map +1 -0
- package/dist/utils/mergeBlockDefinitions.d.ts +10 -0
- package/dist/utils/mergeBlockDefinitions.mjs +8 -0
- package/dist/utils/mergeBlockDefinitions.mjs.map +1 -0
- package/dist/utils/mergeSettings.d.ts +11 -0
- package/dist/utils/normalizeSettings.d.ts +28 -0
- package/dist/utils/normalizeSettings.mjs +13 -0
- package/dist/utils/normalizeSettings.mjs.map +1 -0
- package/package.json +243 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/BlockEditor/BlockEditor.tsx","../src/components/menus/LinkMenu/LinkMenu.tsx","../src/components/panels/LinkPreviewPanel/LinkPreviewPanel.tsx","../src/components/panels/Colorpicker/Colorpicker.tsx","../src/components/panels/LinkEditorPanel/LinkEditorPanel.tsx","../src/components/menus/TextMenu/TextMenu.tsx","../src/hooks/useBlockMenus.ts","../src/hooks/useFrequentlyUsed.ts","../src/lib/utils/commandUsageStorage.ts","../src/hooks/resolveCommands.ts","../src/hooks/useEditorViewDom.ts","../src/components/menus/TextMenu/hooks/useTextmenuCommands.ts","../src/components/menus/TextMenu/hooks/useTextmenuStates.ts","../src/components/menus/TextMenu/components/ContentTypePicker.tsx","../src/components/menus/TextMenu/components/FontFamilyPicker.tsx","../src/components/menus/TextMenu/components/FontSizePicker.tsx","../src/components/menus/TextMenu/components/CustomClassPicker.tsx","../src/components/menus/TextMenu/components/EditLinkPopover.tsx","../src/components/menus/ContentItemMenu/ContentItemMenu.tsx","../src/components/menus/ContentItemMenu/hooks/useContentItemActions.tsx","../src/components/menus/ContentItemMenu/components/IdEditor.tsx","../src/components/menus/ContentItemMenu/components/BlockMenus.tsx","../src/components/menus/ContentItemMenu/hooks/useData.tsx","../src/hooks/useBlockEditor.ts","../src/extensions/BaseBlock/BaseBlock.ts","../src/extensions/extension-kit.ts","../src/extensions/Table/menus/TableMenu/index.tsx","../src/extensions/Table/menus/TableColumn/utils.ts","../src/extensions/Table/menus/TableRow/utils.ts","../src/extensions/Table/menus/hooks.ts","../src/extensions/Table/menus/TableColumn/index.tsx","../src/extensions/Table/menus/ColorPicker.tsx","../src/extensions/Table/menus/TableRow/index.tsx","../src/extensions/ImageBlock/components/ImageBlockMenu.tsx","../src/extensions/ImageBlock/components/ImageBlockWidth.tsx","../src/extensions/ImageBlock/components/ImageBlockCaption.tsx","../src/extensions/ImageBlock/components/ImageBlockLink.tsx","../src/extensions/ImageBlock/mediaUpdateHooks.ts","../src/extensions/FileBlock/components/FileBlockMenu.tsx","../src/extensions/FileBlock/components/FileBlockCaption.tsx","../src/extensions/LinkButton/components/LinkButtonMenu.tsx","../src/hooks/useSettings.ts","../src/utils/mergeSettings.ts"],"sourcesContent":["import { EditorContent, type Editor } from '@tiptap/react';\nimport { useRef, type RefObject } from 'react';\nimport { Slot } from '@ablogcms/components/slot-fill';\nimport { Tooltip } from '@ablogcms/components/tooltip';\nimport { LinkMenu } from '../menus';\nimport { SettingsProvider } from '../../context/EditorSettings';\nimport { useBlockEditor, UseBlockEditorOptions } from '../../hooks/useBlockEditor';\nimport { TableMenu, TableColumnMenu, TableRowMenu } from '../../extensions/Table/menus';\nimport { TextMenu } from '../menus/TextMenu';\nimport { ContentItemMenu } from '../menus/ContentItemMenu';\nimport ImageBlockMenu from '../../extensions/ImageBlock/components/ImageBlockMenu';\nimport FileBlockMenu from '../../extensions/FileBlock/components/FileBlockMenu';\nimport LinkButtonMenu from '../../extensions/LinkButton/components/LinkButtonMenu';\nimport { useSettings } from '../../hooks/useSettings';\nimport type { EditorSettings, EditorSettingsOverride } from '../../types';\n\n/**\n * Slot `block-editor.menus` の `fillProps`(render-prop 形式)の型。\n * `<Fill name=\"block-editor.menus\">{({ editor, appendTo }) => ...}</Fill>` を直接 JSX で書く場合に\n * render-prop の引数として受け取れる。\n *\n * プラグインの `ctx.ui.fill(slotName, entry)`(`@ablogcms/plugins`)経由で `editor`/`appendTo` を\n * 受け取りたい場合は、コンポーネントを `withFillProps` でラップして渡す\n * (`ctx.ui.fill('block-editor.menus', withFillProps<BlockEditorMenusSlotFillProps>(({ editor, appendTo }) => ...))`)。\n * 詳細は `packages/frontend/plugins/HOOKS.md`「ctx.ui.fill で fillProps を受け取る(withFillProps)」参照。\n */\nexport interface BlockEditorMenusSlotFillProps {\n editor: Editor;\n /** 既存メニューと同じフローティング基準要素(appendTo に渡す) */\n appendTo: RefObject<HTMLElement | null>;\n}\n\ninterface BlockEditorProps extends UseBlockEditorOptions {\n /**\n * 呼び出し側が取得・正規化 (`normalizeSettings`) 済みの EditorSettings を注入する。\n * このパッケージ自体はデータを取得しないため、省略時は既定値 (`DEFAULT_EDITOR_SETTINGS`) を使う。\n */\n editorSettings?: EditorSettings;\n /**\n * エディター個別の宣言的な上書き設定。`<acms-block-editor>` 自身の `settings` 属性\n * (`createProps`、`<acms-unit-editor>` 等と同じ data-* ではない独自属性)経由で渡される。\n * 旧 `.js-block-editor` の公開仕様(`data-settings`、\n * https://developer.a-blogcms.jp/document/block-editor/)は `upgradeLegacyBlockEditors`\n * がこの `settings` 属性へ変換したうえで合流するため、プロパティ名は維持する。\n */\n settings?: EditorSettingsOverride;\n}\n\nexport function BlockEditor({ settings: settingsOverride, editorSettings, ...props }: BlockEditorProps) {\n const menuContainerRef = useRef(null);\n const settings = useSettings(editorSettings, settingsOverride);\n const { editor, getFilteredBlockMenus } = useBlockEditor({\n ...props,\n blockMenus: settings.blockMenus,\n imageDefaultLightbox: settings.features.imageDefaultLightbox,\n });\n\n if (!editor) {\n return null;\n }\n\n return (\n <SettingsProvider settings={settings}>\n <div className=\"acms-admin-block-editor-container\">\n <div className=\"acms-admin-block-editor\" ref={menuContainerRef}>\n <EditorContent editor={editor} className=\"acms-admin-block-editor-content\" />\n <ContentItemMenu editor={editor} getFilteredBlockMenus={getFilteredBlockMenus} />\n <LinkMenu editor={editor} appendTo={menuContainerRef} />\n <TextMenu editor={editor} appendTo={menuContainerRef} />\n <TableMenu editor={editor} appendTo={menuContainerRef} />\n <TableRowMenu editor={editor} appendTo={menuContainerRef} />\n <TableColumnMenu editor={editor} appendTo={menuContainerRef} />\n <ImageBlockMenu editor={editor} appendTo={menuContainerRef} />\n <FileBlockMenu editor={editor} appendTo={menuContainerRef} />\n <LinkButtonMenu editor={editor} appendTo={menuContainerRef} />\n <Slot<BlockEditorMenusSlotFillProps>\n name=\"block-editor.menus\"\n fillProps={{ editor, appendTo: menuContainerRef }}\n />\n </div>\n </div>\n <Tooltip id=\"block-editor-shared-tooltip\" delayShow={150} />\n </SettingsProvider>\n );\n}\n\nexport default BlockEditor;\n","import { BubbleMenu as BaseBubbleMenu, BubbleMenuProps } from '@tiptap/react/menus';\nimport { useCallback, useMemo, useState, type JSX } from 'react';\n\nimport { Popover, PopoverContent } from '@ablogcms/components/popover';\n\nimport { isTextSelected } from '../../../lib/utils';\nimport { MenuProps } from '../types';\nimport { LinkPreviewPanel } from '../../panels/LinkPreviewPanel';\nimport { LinkEditorPanel } from '../../panels';\n\nexport function LinkMenu({ editor, appendTo }: MenuProps): JSX.Element {\n const [showEdit, setShowEdit] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n\n const shouldShow = useCallback<NonNullable<BubbleMenuProps['shouldShow']>>(({ editor }) => {\n const isActive = editor.isActive('link');\n const isShow = isActive && !isTextSelected({ editor });\n setIsOpen(isShow);\n return isShow;\n }, []);\n\n const { href: link, target } = editor.getAttributes('link');\n\n const handleEdit = useCallback(() => {\n setShowEdit(true);\n }, []);\n\n const onSetLink = useCallback(\n (url: string, openInNewTab?: boolean) => {\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({\n href: url,\n target: openInNewTab ? '_blank' : null,\n rel: openInNewTab ? 'noopener noreferrer' : null,\n })\n .run();\n setShowEdit(false);\n },\n [editor]\n );\n\n const onUnsetLink = useCallback(() => {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n setShowEdit(false);\n return null;\n }, [editor]);\n\n const getAnchorRect = useCallback(() => {\n const { view } = editor;\n const { state } = editor;\n const { $from } = state.selection;\n const pos = $from.before($from.depth);\n const dom = view.nodeDOM(pos);\n if (dom instanceof HTMLElement) {\n return dom.getBoundingClientRect();\n }\n return null;\n }, [editor]);\n\n const handleHide = useCallback(() => {\n setShowEdit(false);\n }, []);\n\n // BubbleMenu(@tiptap/react/menus)は options/appendTo を useEffect の依存配列に持ち、参照が\n // 変わるたびに editor へ updateOptions トランザクションを dispatch する。ここで毎レンダー新しい\n // オブジェクト/関数を渡すと、useBlockEditor の shouldRerenderOnTransaction: true と相まって\n // 「トランザクション→再レンダー→新しい options/appendTo→トランザクション」の無限ループになり\n // Maximum update depth exceeded で落ちるため、参照を安定させる。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current, [appendTo]);\n\n const bubbleMenuOptions = useMemo<NonNullable<BubbleMenuProps['options']>>(\n () => ({\n placement: 'bottom-start',\n onHide: handleHide,\n }),\n [handleHide]\n );\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey=\"linkMenu\"\n shouldShow={shouldShow}\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n options={bubbleMenuOptions}\n >\n <Popover modal isOpen={isOpen} getAnchorRect={getAnchorRect}>\n <PopoverContent data-elevation=\"2\" size={showEdit ? 'default' : 'small'}>\n {showEdit ? (\n <LinkEditorPanel\n initialUrl={link}\n initialOpenInNewTab={target === '_blank'}\n onSetLink={onSetLink}\n onClear={onUnsetLink}\n />\n ) : (\n <LinkPreviewPanel url={link} onClear={onUnsetLink} onEdit={handleEdit} />\n )}\n </PopoverContent>\n </Popover>\n </BaseBubbleMenu>\n );\n}\n\nexport default LinkMenu;\n","import { Icon } from '../../ui/Icon';\nimport { Toolbar } from '../../ui/Toolbar';\n\nexport type LinkPreviewPanelProps = {\n url: string;\n onEdit: () => void;\n onClear: () => void;\n};\n\nexport function LinkPreviewPanel({ onClear, onEdit, url }: LinkPreviewPanelProps) {\n return (\n <div className=\"acms-admin-block-editor-link-preview\">\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"acms-admin-block-editor-link-preview-url\">\n {url}\n </a>\n <Toolbar.Divider />\n <Toolbar.Button type=\"button\" onClick={onEdit} aria-label=\"リンクを編集\">\n <Icon name=\"edit\" />\n </Toolbar.Button>\n <Toolbar.Button type=\"button\" onClick={onClear} aria-label=\"リンクを削除\">\n <Icon name=\"delete\" />\n </Toolbar.Button>\n </div>\n );\n}\n","import { useCallback, useState, useEffect, useRef, useMemo } from 'react';\nimport { HexColorPicker } from 'react-colorful';\nimport { useSettingsContext } from '../../../context/EditorSettings';\nimport { ColorButton } from './ColorButton';\nimport { Toolbar } from '../../ui/Toolbar';\nimport { Icon } from '../../ui/Icon';\n\nexport type ColorPickerProps = {\n color?: string;\n onChange?: (color: string) => void;\n onClear?: () => void;\n};\n\nconst isHex = (v: string) => /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(v);\n\nexport function ColorPicker({ color, onChange, onClear }: ColorPickerProps) {\n const { colorPalette } = useSettingsContext();\n // 入力欄の表示値(不正でも保持)\n const [colorInputValue, setColorInputValue] = useState(color ?? '');\n // 直近の「有効だった色」(ピッカーの表示に使う)\n const lastValidColorRef = useRef<string>(isHex(color ?? '') ? (color as string) : '#000000');\n\n // 外部から color が変わったら同期\n useEffect(() => {\n if (typeof color === 'string') {\n setColorInputValue(color);\n if (isHex(color)) lastValidColorRef.current = color;\n }\n }, [color]);\n\n // 入力中:表示は更新、値が有効になったら即 onChange\n const handleInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = e.target.value.trim();\n setColorInputValue(next);\n if (isHex(next)) {\n lastValidColorRef.current = next;\n onChange?.(next);\n }\n },\n [onChange]\n );\n\n // フォーカスアウト:有効でなければ元に戻す\n const handleInputBlur = useCallback(() => {\n if (!isHex(colorInputValue)) {\n // 無効 → 表示だけ直近有効色へ戻す\n setColorInputValue(lastValidColorRef.current);\n return;\n }\n // 有効 → 念のため同期\n onChange?.(colorInputValue);\n }, [colorInputValue, onChange]);\n\n // ピッカー変更:常に有効な16進で渡してくれるので即時反映\n const handlePickerChange = useCallback(\n (hex: string) => {\n lastValidColorRef.current = hex;\n setColorInputValue(hex);\n onChange?.(hex);\n },\n [onChange]\n );\n\n // パレット選択\n const handlePalettePick = useCallback(\n (hex: string) => {\n lastValidColorRef.current = hex;\n setColorInputValue(hex);\n onChange?.(hex);\n },\n [onChange]\n );\n\n // リセット\n const handleClear = useCallback(() => {\n setColorInputValue('');\n onClear?.();\n }, [onClear]);\n\n // ピッカーに渡す色(常に有効な値)\n const pickerColor = useMemo(() => {\n return isHex(colorInputValue) ? colorInputValue : lastValidColorRef.current;\n }, [colorInputValue]);\n\n return (\n <div className=\"acms-admin-block-editor-text-menu-color-picker-container\">\n <HexColorPicker\n className=\"acms-admin-block-editor-text-menu-color-picker-input\"\n color={pickerColor}\n onChange={handlePickerChange}\n />\n <input\n type=\"text\"\n className=\"acms-admin-block-editor-text-menu-color-picker-text-input\"\n placeholder=\"#000000\"\n value={colorInputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n aria-label=\"カラーコード(#RRGGBB または #RGB)\"\n />\n <div className=\"acms-admin-block-editor-text-menu-color-picker-palette\">\n {colorPalette?.map((currentColor) => (\n <ColorButton\n active={currentColor === color}\n color={currentColor}\n key={currentColor}\n onColorChange={handlePalettePick}\n />\n ))}\n <Toolbar.Button type=\"button\" tooltip=\"Reset color to default\" onClick={handleClear} aria-label=\"色をリセット\">\n <Icon name=\"undo\" />\n </Toolbar.Button>\n </div>\n </div>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { ButtonV2 } from '@ablogcms/components/button-v2';\nimport { isValidUrl } from '@ablogcms/utils';\nimport { Icon } from '../../ui/Icon';\n// import { Toggle } from '../../ui/Toggle';\n\nexport type LinkEditorPanelProps = {\n initialUrl?: string;\n initialOpenInNewTab?: boolean;\n onSetLink: (url: string, openInNewTab?: boolean) => void;\n onClear?: () => void;\n};\n\nexport const useLinkEditorState = ({ initialUrl, initialOpenInNewTab, onSetLink }: LinkEditorPanelProps) => {\n const [url, setUrl] = useState(initialUrl || '');\n const [openInNewTab, setOpenInNewTab] = useState(initialOpenInNewTab || false);\n\n const onChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setUrl(event.target.value);\n }, []);\n\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (isValidUrl(url)) {\n onSetLink(url, openInNewTab);\n } else {\n alert('有効なURLを入力してください。'); // エラーメッセージの表示\n }\n },\n [url, openInNewTab, onSetLink]\n );\n\n return {\n url,\n setUrl,\n openInNewTab,\n setOpenInNewTab,\n onChange,\n handleSubmit,\n isValidUrl,\n };\n};\n\nexport function LinkEditorPanel({ onSetLink, onClear, initialOpenInNewTab, initialUrl }: LinkEditorPanelProps) {\n const state = useLinkEditorState({ onSetLink, initialOpenInNewTab, initialUrl });\n\n const handleClear = useCallback(() => {\n onClear?.();\n state.setUrl('');\n state.setOpenInNewTab(false);\n }, [onClear, state]);\n\n return (\n <div className=\"acms-admin-form acms-admin-block-editor-link-editor acms-admin-block-editor-popover-form\">\n <form onSubmit={state.handleSubmit}>\n {}\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <label className=\"acms-admin-form-block\">\n <span className=\"acms-admin-block-editor-popover-form-item-label\">リンク先URL</span>\n <input\n type=\"text\"\n className=\"acms-admin-form-width-full\"\n placeholder=\"URLを入力\"\n value={state.url}\n onChange={state.onChange}\n />\n </label>\n </div>\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <div className=\"acms-admin-form-checkbox\">\n <input\n type=\"checkbox\"\n id=\"openInNewTab\"\n value=\"true\"\n checked={state.openInNewTab}\n onChange={(prev) => {\n state.setOpenInNewTab(prev.target.checked);\n }}\n />\n <label htmlFor=\"openInNewTab\">\n <i className=\"acms-admin-ico-checkbox\" />\n リンク先を別タブで開く\n </label>\n </div>\n </div>\n\n <div className=\"acms-admin-block-editor-popover-form-button-group\">\n {initialUrl ? (\n <>\n <ButtonV2 variant=\"outlined\" size=\"small\" type=\"submit\">\n <Icon name=\"sync\" />\n 変更\n </ButtonV2>\n <ButtonV2 variant=\"filled\" size=\"small\" type=\"button\" onClick={handleClear}>\n <Icon name=\"delete\" />\n 解除\n </ButtonV2>\n </>\n ) : (\n <ButtonV2 variant=\"filled\" size=\"small\" type=\"submit\">\n 追加\n </ButtonV2>\n )}\n </div>\n </form>\n </div>\n );\n}\n","import { BubbleMenu } from '@tiptap/react/menus';\nimport { Editor } from '@tiptap/react';\nimport { memo, useEffect, useState, useRef, useMemo, useCallback } from 'react';\nimport { Popover, PopoverTrigger, PopoverContent } from '@ablogcms/components/popover';\nimport { useSettingsContext } from '../../../context/EditorSettings';\nimport { ColorPicker, AlignPicker } from '../../panels';\nimport { Icon } from '../../ui/Icon';\nimport { Toolbar } from '../../ui/Toolbar';\nimport { useBlockMenus } from '../../../hooks/useBlockMenus';\nimport { useEditorViewDom } from '../../../hooks/useEditorViewDom';\nimport { useTextmenuCommands } from './hooks/useTextmenuCommands';\nimport { useTextmenuStates } from './hooks/useTextmenuStates';\nimport { ContentTypePicker } from './components/ContentTypePicker';\nimport { FontFamilyPicker } from './components/FontFamilyPicker';\nimport { FontSizePicker } from './components/FontSizePicker';\nimport { CustomClassPicker } from './components/CustomClassPicker';\nimport { EditLinkPopover } from './components/EditLinkPopover';\n\nconst MemoButton = memo(Toolbar.Button);\nconst MemoContentTypePicker = memo(ContentTypePicker);\nconst MemoColorPicker = memo(ColorPicker);\nconst MemoFontFamilyPicker = memo(FontFamilyPicker);\nconst MemoFontSizePicker = memo(FontSizePicker);\nconst MemoCustomClassPicker = memo(CustomClassPicker);\n\nconst SHORTCUT_BOLD = ['Mod', 'B'];\nconst SHORTCUT_ITALIC = ['Mod', 'I'];\nconst SHORTCUT_UNDERLINE = ['Mod', 'U'];\nconst SHORTCUT_STRIKE = ['Mod', 'Shift', 'S'];\nconst SHORTCUT_CODE = ['Mod', 'E'];\nconst SHORTCUT_SUBSCRIPT = ['Mod', ','];\nconst SHORTCUT_SUPERSCRIPT = ['Mod', '.'];\n\nexport type TextMenuProps = {\n editor: Editor;\n appendTo?: React.RefObject<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n};\n\nexport function TextMenu({ editor, appendTo }: TextMenuProps) {\n const viewDom = useEditorViewDom(editor);\n const commands = useTextmenuCommands(editor);\n const states = useTextmenuStates(editor);\n const { features, blockMenus } = useSettingsContext();\n const { getFilteredBlockMenus } = useBlockMenus({ blockMenus });\n const menuRef = useRef<HTMLDivElement>(null);\n const [showLeft, setShowLeft] = useState(false);\n const [showRight, setShowRight] = useState(false);\n\n // BubbleMenu の options に渡すため参照を安定させる(下記 bubbleMenuOptions 参照)。\n const updateScrollButtons = useCallback(() => {\n const el = menuRef.current;\n if (!el) return;\n\n setShowLeft(el.scrollLeft > 0);\n setShowRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);\n }, []);\n\n const scrollLeft = () => {\n menuRef.current?.scrollBy({ left: -150, behavior: 'smooth' });\n };\n\n const scrollRight = () => {\n menuRef.current?.scrollBy({ left: 150, behavior: 'smooth' });\n };\n\n const align = useMemo(() => {\n if (states.isAlignLeft) {\n return 'left';\n }\n if (states.isAlignCenter) {\n return 'center';\n }\n if (states.isAlignRight) {\n return 'right';\n }\n return 'left';\n }, [states.isAlignLeft, states.isAlignCenter, states.isAlignRight]);\n\n const handleAlign = (newAlign: 'left' | 'center' | 'right') => {\n if (newAlign === 'left') {\n commands.onAlignLeft();\n } else if (newAlign === 'center') {\n commands.onAlignCenter();\n } else if (newAlign === 'right') {\n commands.onAlignRight();\n }\n };\n\n useEffect(() => {\n const el = menuRef.current;\n if (!el) return;\n\n el.addEventListener('scroll', updateScrollButtons, { passive: true });\n document.addEventListener('resize', updateScrollButtons);\n return () => {\n el.removeEventListener('scroll', updateScrollButtons);\n document.removeEventListener('resize', updateScrollButtons);\n };\n }, [editor, updateScrollButtons]);\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n // フォーカストラップ\n const toolbar = menuRef.current;\n if (toolbar) {\n // ツールバーが存在する場合、ツールバーにフォーカスを移動\n toolbar.focus();\n }\n }\n };\n\n if (viewDom === null) {\n return undefined;\n }\n\n // useToolbar のkeydown よりも先に実行するために capture を true にしている\n viewDom.addEventListener('keydown', handleKeyDown, { capture: true });\n return () => {\n viewDom.removeEventListener('keydown', handleKeyDown, { capture: true });\n };\n }, [viewDom]);\n\n const handleToolbarKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Tab') {\n editor.commands.focus(); // エディタにフォーカスを戻す\n }\n };\n\n // BubbleMenu(@tiptap/react/menus)は options/appendTo を useEffect の依存配列に持ち、\n // 参照が変わるたびに editor へ updateOptions トランザクションを dispatch する。ここで毎レンダー\n // 新しいオブジェクト/関数を渡すと、shouldRerenderOnTransaction: true(useBlockEditor 参照)と\n // 相まって「トランザクション→再レンダー→新しい options/appendTo→トランザクション」の無限ループに\n // なり Maximum update depth exceeded で落ちるため、参照を安定させる。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current ?? document.body, [appendTo]);\n\n const bubbleMenuOptions = useMemo<NonNullable<React.ComponentProps<typeof BubbleMenu>['options']>>(\n () => ({\n placement: 'top-start',\n shift: {\n boundary: appendTo?.current ?? undefined,\n padding: 8,\n },\n flip: {\n fallbackPlacements: ['bottom-start', 'top'],\n },\n onShow: () => {\n // メニュー表示時にスクロールボタンの表示を更新\n requestAnimationFrame(() => {\n updateScrollButtons();\n });\n },\n }),\n [appendTo, updateScrollButtons]\n );\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"textMenu\"\n shouldShow={states.shouldShow}\n updateDelay={100}\n appendTo={bubbleMenuAppendTo}\n data-theme=\"text-menu\"\n style={{ zIndex: 100018 }}\n options={bubbleMenuOptions}\n >\n <Toolbar\n ref={menuRef}\n className=\"acms-admin-block-editor-toolbar-scrollable\"\n // useToolbar のkeydown よりも先に実行するために Capture で実行\n onKeyDownCapture={handleToolbarKeyDown}\n >\n <MemoContentTypePicker\n menus={getFilteredBlockMenus({ query: '', editor })}\n editor={editor}\n currentPos={editor.state.selection.$from.before(1)}\n />\n <MemoButton\n type=\"button\"\n tooltip=\"太字\"\n tooltipShortcut={SHORTCUT_BOLD}\n onClick={commands.onBold}\n active={states.isBold}\n aria-label=\"太字\"\n >\n <Icon name=\"format_bold\" />\n </MemoButton>\n {features?.textItalic && (\n <MemoButton\n type=\"button\"\n tooltip=\"斜体\"\n tooltipShortcut={SHORTCUT_ITALIC}\n onClick={commands.onItalic}\n active={states.isItalic}\n aria-label=\"斜体\"\n >\n <Icon name=\"format_italic\" />\n </MemoButton>\n )}\n {features?.textUnderline && (\n <MemoButton\n type=\"button\"\n tooltip=\"下線\"\n tooltipShortcut={SHORTCUT_UNDERLINE}\n onClick={commands.onUnderline}\n active={states.isUnderline}\n aria-label=\"下線\"\n >\n <Icon name=\"format_underlined\" />\n </MemoButton>\n )}\n {features?.textStrike && (\n <MemoButton\n type=\"button\"\n tooltip=\"打ち消し線\"\n tooltipShortcut={SHORTCUT_STRIKE}\n onClick={commands.onStrike}\n active={states.isStrike}\n aria-label=\"打ち消し線\"\n >\n <Icon name=\"format_strikethrough\" />\n </MemoButton>\n )}\n {features?.textCode && (\n <MemoButton\n type=\"button\"\n tooltip=\"コード\"\n tooltipShortcut={SHORTCUT_CODE}\n onClick={commands.onCode}\n active={states.isCode}\n aria-label=\"コード\"\n >\n <Icon name=\"code\" />\n </MemoButton>\n )}\n <EditLinkPopover\n editor={editor}\n onSetLink={commands.onLink}\n onClearLink={commands.onUnsetLink}\n isActive={states.isLink}\n />\n <AlignPicker align={align} onChange={handleAlign} />\n {features?.textMarker && (\n <Popover modal placement=\"top-start\">\n <PopoverTrigger asChild>\n <MemoButton type=\"button\" tooltip=\"マーカー\" active={!!states.currentHighlight} aria-label=\"マーカー\">\n <Icon name=\"format_ink_highlighter\" />\n </MemoButton>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <MemoColorPicker\n color={states.currentHighlight}\n onChange={commands.onChangeHighlight}\n onClear={commands.onClearHighlight}\n />\n </PopoverContent>\n </Popover>\n )}\n {features?.textColor && (\n <Popover modal placement=\"top-start\">\n <PopoverTrigger asChild>\n <MemoButton type=\"button\" active={!!states.currentColor} tooltip=\"文字色\" aria-label=\"文字色\">\n <Icon name=\"format_color_text\" />\n </MemoButton>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <MemoColorPicker\n color={states.currentColor}\n onChange={commands.onChangeColor}\n onClear={commands.onClearColor}\n />\n </PopoverContent>\n </Popover>\n )}\n {features?.textSubscript && (\n <MemoButton\n type=\"button\"\n tooltip=\"下付き文字\"\n tooltipShortcut={SHORTCUT_SUBSCRIPT}\n onClick={commands.onSubscript}\n active={states.isSubscript}\n aria-label=\"下付き文字\"\n >\n <Icon name=\"subscript\" />\n </MemoButton>\n )}\n {features?.textSuperscript && (\n <MemoButton\n type=\"button\"\n tooltip=\"上付き文字\"\n tooltipShortcut={SHORTCUT_SUPERSCRIPT}\n onClick={commands.onSuperscript}\n active={states.isSuperscript}\n aria-label=\"上付き文字\"\n >\n <Icon name=\"superscript\" />\n </MemoButton>\n )}\n {features?.fontSize && (\n <>\n <Toolbar.Divider />\n <MemoFontSizePicker onChange={commands.onSetFontSize} value={states.currentSize || ''} />\n </>\n )}\n {features?.fontFamily && (\n <>\n <Toolbar.Divider />\n <MemoFontFamilyPicker onChange={commands.onSetFont} value={states.currentFont || ''} />\n </>\n )}\n {features?.customClass && (\n <>\n <Toolbar.Divider />\n <MemoCustomClassPicker\n onChange={commands.onCustomClass}\n onRemove={commands.removeCustomClass}\n value={states.currentCustomClass || ''}\n />\n </>\n )}\n {showLeft && (\n <button\n type=\"button\"\n onClick={scrollLeft}\n aria-label=\"左にスクロール\"\n className=\"acms-admin-block-editor-toolbar-arrow acms-admin-block-editor-toolbar-arrow-left\"\n >\n <Icon name=\"chevron_left\" />\n </button>\n )}\n {showRight && (\n <button\n type=\"button\"\n onClick={scrollRight}\n aria-label=\"右にスクロール\"\n className=\"acms-admin-block-editor-toolbar-arrow acms-admin-block-editor-toolbar-arrow-right\"\n >\n <Icon name=\"chevron_right\" />\n </button>\n )}\n </Toolbar>\n </BubbleMenu>\n );\n}\n","import { Editor } from '@tiptap/core';\nimport { useCallback, useEffect, useRef, useMemo } from 'react';\nimport type { BlockDefinition, BlockMenuItem, CommandItem } from '../types';\nimport { useFrequentlyUsed } from './useFrequentlyUsed';\nimport resolveCommands from './resolveCommands';\n\ninterface UseBlockMenusOptions {\n blockMenus: BlockMenuItem[];\n /** コアの `BLOCK_DEFINITIONS` に加えてマージする追加マスター。`resolveCommands` へそのまま渡す。 */\n blockDefinitions?: Record<string, BlockDefinition>;\n}\n\nexport interface UseBlockMenusResult {\n groups: BlockMenuItem[];\n getFilteredBlockMenus: ({ query, editor }: { query: string; editor: Editor }) => BlockMenuItem[];\n}\n\nexport function useBlockMenus({ blockMenus, blockDefinitions }: UseBlockMenusOptions): UseBlockMenusResult {\n const { frequentlyUsed, recordUsage } = useFrequentlyUsed();\n const itemsRef = useRef<BlockMenuItem[]>([]);\n\n useEffect(() => {\n itemsRef.current = blockMenus ?? [];\n }, [blockMenus]);\n\n const getFilteredBlockMenus = useCallback(\n ({ query, editor }: { query: string; editor: Editor }): BlockMenuItem[] => {\n const currentItems = itemsRef.current;\n if (!currentItems || currentItems.length === 0) {\n return [];\n }\n const withFilteredCommands = currentItems.map((group: BlockMenuItem) => ({\n ...group,\n commands: group.commands\n .filter((item) => {\n const labelNormalized = item.label.toLowerCase().trim();\n const queryNormalized = query.toLowerCase().trim();\n if (item.aliases) {\n const aliases = item.aliases.map((alias) => alias.toLowerCase().trim());\n return (\n labelNormalized.includes(queryNormalized) || aliases.some((alias) => alias.includes(queryNormalized))\n );\n }\n return labelNormalized.includes(queryNormalized);\n })\n .filter((command) => {\n if (!command.shouldBeHidden) {\n return true;\n }\n return !command.shouldBeHidden(editor);\n }),\n }));\n const withoutEmptyGroups = withFilteredCommands.filter((group) => {\n if (group.commands.length > 0) {\n return true;\n }\n return false;\n });\n const withEnabledSettings = withoutEmptyGroups.map((group) => ({\n ...group,\n commands: group.commands.map((command) => ({\n ...command,\n isEnabled: true,\n })),\n }));\n\n const resolvedGroups = withEnabledSettings.map((group) => ({\n ...group,\n commands: resolveCommands(group.commands, recordUsage, blockDefinitions),\n }));\n\n // よく使うコマンドグループ\n if (frequentlyUsed.length > 0) {\n // ルックアップマップを作成(O(n))\n const frequentlyUsedMap = new Map<string, number>();\n frequentlyUsed.forEach((f, index) => {\n const key = `${f.name}:${f.class ?? ''}`;\n frequentlyUsedMap.set(key, index);\n });\n\n const frequentlyUsedCommands: CommandItem[] = resolvedGroups\n .flatMap((group) => group.commands)\n .filter((cmd, index, self) => {\n // name と class の両方が一致するかチェック\n const key = `${cmd.name}:${cmd.class ?? ''}`;\n const isFrequentlyUsed = frequentlyUsedMap.has(key);\n // 重複除去(name と class の両方が一致するもの)\n const firstIndex = self.findIndex((c) => c.name === cmd.name && (c.class ?? '') === (cmd.class ?? ''));\n return isFrequentlyUsed && firstIndex === index;\n })\n .toSorted((a, b) => {\n const aKey = `${a.name}:${a.class ?? ''}`;\n const bKey = `${b.name}:${b.class ?? ''}`;\n const aIndex = frequentlyUsedMap.get(aKey) ?? Infinity;\n const bIndex = frequentlyUsedMap.get(bKey) ?? Infinity;\n return aIndex - bIndex;\n });\n\n if (frequentlyUsedCommands.length > 0) {\n const frequentlyUsedGroup: BlockMenuItem = {\n title: 'よく使うブロック',\n name: 'frequently-used',\n commands: frequentlyUsedCommands,\n };\n return [frequentlyUsedGroup, ...resolvedGroups];\n }\n }\n return resolvedGroups;\n },\n [recordUsage, frequentlyUsed, blockDefinitions]\n );\n return {\n groups: blockMenus ?? [],\n getFilteredBlockMenus,\n };\n}\n\nexport function useFilteredCommands(menus: BlockMenuItem[], editor: Editor, currentPos: number): BlockMenuItem[] {\n return useMemo(() => {\n return menus\n .map((item) => {\n const filteredCommands = item.commands.filter((cmd: CommandItem) => !cmd.isDisabled(editor, currentPos));\n return {\n ...item,\n commands: filteredCommands,\n };\n })\n .filter((item) => item.commands.length > 0 && item.name !== 'frequently-used');\n }, [menus, editor, currentPos]);\n}\n","import { useState } from 'react';\nimport type { CommandItem } from '../types';\nimport {\n type CommandIdentifier,\n getFrequentlyUsedCommands,\n recordCommandUsage,\n} from '../lib/utils/commandUsageStorage';\n\nconst maxItem = 5; // 最大件数\n\nexport const useFrequentlyUsed = () => {\n const [frequentlyUsed, setFrequentlyUsed] = useState<CommandIdentifier[]>(() => getFrequentlyUsedCommands(maxItem));\n\n const recordUsage = (command: CommandItem): void => {\n recordCommandUsage(command);\n // 頻度順で再取得(カウント更新後の正しい順序を反映)\n setFrequentlyUsed(getFrequentlyUsedCommands(maxItem));\n };\n\n return { frequentlyUsed, recordUsage };\n};\n","import type { CommandItem } from '../../types';\n\nconst STORAGE_KEY_PREFIX = 'acms-frequently-used-commands';\n\nexport type CommandIdentifier = Pick<CommandItem, 'name' | 'class'>;\n\ninterface UsageRecord {\n count: number;\n lastUsed: number;\n score?: number;\n}\n\ntype UsageData = Record<string, UsageRecord>;\n\nconst FREQUENT_BLOCKS_MAX_ITEMS = 30; // localStorageに保存する最大件数\nconst FREQUENCY_WEIGHT = 0.3;\nconst RECENCY_WEIGHT = 0.5;\nconst RECENCY_HALFLIFE_DAYS = 7; // 直近使用の半減期(日数)\n\n/**\n * localStorageのキーを生成する\n */\nexport const getKey = (): string => {\n return `${STORAGE_KEY_PREFIX}-setid-${ACMS.Config.editorSetId}-root-${ACMS.Config.root}-suid-${ACMS.Config.suid}`;\n};\n\n/**\n * コマンドを一意に識別するキーを生成\n */\nconst getCommandKey = (command: CommandIdentifier): string => {\n return command.class ? `${command.name}:${command.class}` : command.name;\n};\n\n/**\n * localStorageからUsageDataを読み込む\n */\nconst loadUsageData = (): UsageData => {\n const key = getKey();\n const raw = localStorage.getItem(key);\n if (!raw) return {};\n try {\n const parsed: unknown = JSON.parse(raw);\n // 簡易的な型チェック\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return parsed as UsageData;\n }\n } catch (e) {\n console.error('Error parsing usage data from localStorage:', e);\n }\n return {};\n};\n\n/**\n * UsageDataをlocalStorageに保存する\n */\nconst saveUsageData = (data: UsageData): void => {\n const key = getKey();\n localStorage.setItem(key, JSON.stringify(data));\n};\n\n/**\n * コマンドの使用を記録する\n */\nexport const recordCommandUsage = (command: CommandItem) => {\n const data = loadUsageData();\n const commandKey = getCommandKey({ name: command.name, class: command.class });\n const now = Date.now();\n\n const existing = data[commandKey];\n data[commandKey] = {\n count: (existing?.count ?? 0) + 1,\n lastUsed: now,\n };\n\n // 保存件数をMAX_STOREDに制限(ソートは取得時に行う)\n const trimmedEntries = Object.entries(data)\n .toSorted((a, b) => (b[1].lastUsed ?? 0) - (a[1].lastUsed ?? 0)) // 最新使用順でソート\n .slice(0, FREQUENT_BLOCKS_MAX_ITEMS);\n const trimmedData: UsageData = Object.fromEntries(trimmedEntries);\n\n saveUsageData(trimmedData);\n};\n\n/**\n * 個々のUsageRecordに対してスコアを計算する\n */\nconst calculateScore = (record: UsageRecord, now: number): number => {\n const useCount = record.count;\n const { lastUsed } = record;\n\n // ① 使用回数(Frequency)スコア\n const frequencyScore = Math.log(useCount + 1);\n\n // ② 直近使用(Recency)スコア\n const daysSinceLastUse = (now - lastUsed) / (1000 * 60 * 60 * 24);\n const recencyScore = Math.exp(-daysSinceLastUse / RECENCY_HALFLIFE_DAYS); // 半減期\n\n // 最終スコア\n return frequencyScore * FREQUENCY_WEIGHT + recencyScore * RECENCY_WEIGHT;\n};\n\n/**\n * UsageDataをスコアに基づいてソートし、指定された件数にトリミングする\n */\nconst getSortedCommandEntries = (data: UsageData, limit: number, now: number): Array<[string, UsageRecord]> => {\n const entriesWithScore = Object.entries(data).map(([id, record]) => {\n const score = calculateScore(record, now);\n return [id, { ...record, score }] as [string, UsageRecord];\n });\n\n // スコアでソート\n return entriesWithScore\n .toSorted((a, b) => {\n const scoreA = a[1].score ?? 0;\n const scoreB = b[1].score ?? 0;\n return scoreB - scoreA; // スコアが高い順\n })\n .slice(0, limit);\n};\n\n/**\n * よく使うコマンドのリストを取得する(頻度順、同率なら最新使用順)\n */\nexport const getFrequentlyUsedCommands = (limit = 5): CommandIdentifier[] => {\n const data = loadUsageData();\n const now = Date.now();\n\n const sortedEntries = getSortedCommandEntries(data, FREQUENT_BLOCKS_MAX_ITEMS, now); // まずFREQUENT_BLOCKS_MAX_ITEMS件でソート&トリミング\n\n // 必要な件数にスライスしてCommandIdentifierに変換\n return sortedEntries.slice(0, limit).map(([commandKey]) => {\n // commandKey を name と class に分解\n const colonIndex = commandKey.indexOf(':');\n if (colonIndex !== -1) {\n return {\n name: commandKey.substring(0, colonIndex),\n class: commandKey.substring(colonIndex + 1),\n };\n }\n return { name: commandKey };\n });\n};\n","import type { BlockDefinition, CommandItem } from '../types';\nimport { mergeBlockDefinitions } from '../utils/mergeBlockDefinitions';\n\n/**\n * CommandItem に、その type に対応する action / convert / isDisabled / isActive を差し込む。\n * 実体はすべて `config/blocks/{type}.ts` 側に置かれている。\n * コアの `BLOCK_DEFINITIONS` に無い type でも `additionalDefinitions`(プラグインが\n * `registerBlockDefinition` で登録した分)にあれば解決する。定義のない type は黙って捨てる。\n * マスター合成(コア + additionalDefinitions、キー衝突時は additionalDefinitions 側優先 +\n * console.warn)は `mergeBlockDefinitions` に一元化してあり、`normalizeSettings` と同じ規約を使う。\n */\nexport default function resolveCommands(\n commands: CommandItem[],\n recordUsage: (command: CommandItem) => void,\n additionalDefinitions?: Record<string, BlockDefinition>\n): CommandItem[] {\n const masters = mergeBlockDefinitions(additionalDefinitions);\n return commands.flatMap((cmd) => {\n const def = masters[cmd.name];\n if (!def) {\n return [];\n }\n return [\n {\n ...cmd,\n ...def.createActions(cmd, { recordUsage }),\n },\n ];\n });\n}\n","import type { Editor } from '@tiptap/react';\nimport { useEffect, useState } from 'react';\n\n/**\n * エディタの ProseMirror ビューの DOM 要素を、利用できるようになってから返す。\n *\n * Tiptap v3 は `editor.view` を Proxy にしており、ビューがまだ作られていない状態で\n * プロパティへアクセスすると例外を投げる(v2 では undefined が返るだけだった)。\n * そのためレンダー中に `editor.view.dom` を読むコード(useEffect の依存配列に\n * 直接書くなど)は初回レンダーで必ず落ちる。\n *\n * `editor.isInitialized` の確認だけでは足りない。ビューは `EditorContent` の副作用で\n * 作られるため、兄弟コンポーネントの副作用が先に走るとまだ未初期化のことがある。\n * そこで `create` イベントを購読して、初期化後に state 更新で再レンダーさせる。\n */\nexport function useEditorViewDom(editor: Editor): HTMLElement | null {\n const [dom, setDom] = useState<HTMLElement | null>(() =>\n editor.isInitialized ? (editor.view.dom as HTMLElement) : null\n );\n\n useEffect(() => {\n if (editor.isInitialized) {\n setDom(editor.view.dom as HTMLElement);\n return undefined;\n }\n\n const handleCreate = () => setDom(editor.view.dom as HTMLElement);\n editor.on('create', handleCreate);\n\n return () => {\n editor.off('create', handleCreate);\n };\n }, [editor]);\n\n return dom;\n}\n\nexport default useEditorViewDom;\n","import { Editor } from '@tiptap/react';\nimport { useCallback } from 'react';\n\nexport const useTextmenuCommands = (editor: Editor) => {\n const onBold = useCallback(() => editor.chain().focus().toggleBold().run(), [editor]);\n const onItalic = useCallback(() => editor.chain().focus().toggleItalic().run(), [editor]);\n const onStrike = useCallback(() => editor.chain().focus().toggleStrike().run(), [editor]);\n const onUnderline = useCallback(() => editor.chain().focus().toggleUnderline().run(), [editor]);\n const onCode = useCallback(() => editor.chain().focus().toggleCode().run(), [editor]);\n const onCodeBlock = useCallback(() => editor.chain().focus().toggleCodeBlock().run(), [editor]);\n\n const onSubscript = useCallback(() => editor.chain().focus().toggleSubscript().run(), [editor]);\n const onSuperscript = useCallback(() => editor.chain().focus().toggleSuperscript().run(), [editor]);\n const onAlignLeft = useCallback(() => editor.chain().focus().setTextAlign('left').run(), [editor]);\n const onAlignCenter = useCallback(() => editor.chain().focus().setTextAlign('center').run(), [editor]);\n const onAlignRight = useCallback(() => editor.chain().focus().setTextAlign('right').run(), [editor]);\n const onAlignJustify = useCallback(() => editor.chain().focus().setTextAlign('justify').run(), [editor]);\n\n const onChangeColor = useCallback((color: string) => editor.chain().setFontColor(color).run(), [editor]);\n const onClearColor = useCallback(() => editor.chain().focus().unsetFontColor().run(), [editor]);\n\n const onChangeHighlight = useCallback((color: string) => editor.chain().setHighlight({ color }).run(), [editor]);\n const onClearHighlight = useCallback(() => editor.chain().focus().unsetHighlight().run(), [editor]);\n const onLink = useCallback(\n (url: string, inNewTab?: boolean) =>\n editor\n .chain()\n .focus()\n .setLink({ href: url, target: inNewTab ? '_blank' : '' })\n .run(),\n [editor]\n );\n\n const onUnsetLink = useCallback(() => {\n editor.chain().focus().unsetLink().run();\n }, [editor]);\n\n const onSetFont = useCallback(\n (font: string) => {\n if (!font || font.length === 0) {\n return editor.chain().focus().unsetFontFamily().run();\n }\n return editor.chain().focus().setFontFamily(font).run();\n },\n [editor]\n );\n\n const onSetFontSize = useCallback(\n (fontSize: string) => {\n if (!fontSize || fontSize.length === 0) {\n return editor.chain().focus().unsetFontSize().run();\n }\n return editor.chain().focus().setFontSize(fontSize).run();\n },\n [editor]\n );\n\n const onCustomClass = useCallback(\n (className: string) => {\n editor.commands.setMark('customMark', { class: className });\n },\n [editor]\n );\n\n const removeCustomClass = useCallback(() => {\n editor.commands.unsetMark('customMark');\n }, [editor]);\n\n return {\n onBold,\n onItalic,\n onStrike,\n onUnderline,\n onCode,\n onCodeBlock,\n onSubscript,\n onSuperscript,\n onAlignLeft,\n onAlignCenter,\n onAlignRight,\n onAlignJustify,\n onChangeColor,\n onClearColor,\n onChangeHighlight,\n onClearHighlight,\n onSetFont,\n onSetFontSize,\n onLink,\n onUnsetLink,\n onCustomClass,\n removeCustomClass,\n };\n};\n","import { Editor } from '@tiptap/react';\nimport { useCallback } from 'react';\nimport { isCellSelection } from '../../../../extensions/Table/utils';\nimport { ShouldShowProps } from '../../types';\nimport { isCustomNodeSelected, isTextSelected } from '../../../../lib/utils';\n\nexport const useTextmenuStates = (editor: Editor) => {\n const shouldShow = useCallback(\n ({ view, state, from }: ShouldShowProps) => {\n if (!view || !state) {\n return false;\n }\n\n // セル選択の場合は、テーブルメニューを優先するため非表示にする\n if (isCellSelection(state.selection)) {\n return false;\n }\n\n const domAtPos = view.domAtPos(from || 0).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from || 0) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (isCustomNodeSelected(editor, node)) {\n return false;\n }\n\n return isTextSelected({ editor });\n },\n [editor]\n );\n\n return {\n isLink: editor.isActive('link'),\n isBold: editor.isActive('bold'),\n isItalic: editor.isActive('italic'),\n isStrike: editor.isActive('strike'),\n isUnderline: editor.isActive('underline'),\n isCode: editor.isActive('code'),\n isSubscript: editor.isActive('subscript'),\n isSuperscript: editor.isActive('superscript'),\n isAlignLeft: editor.isActive({ textAlign: 'left' }),\n isAlignCenter: editor.isActive({ textAlign: 'center' }),\n isAlignRight: editor.isActive({ textAlign: 'right' }),\n isAlignJustify: editor.isActive({ textAlign: 'justify' }),\n currentColor: editor.getAttributes('textStyle')?.color || undefined,\n currentHighlight: editor.getAttributes('highlight')?.color || undefined,\n currentFont: editor.getAttributes('textStyle')?.fontFamily || undefined,\n currentSize: editor.getAttributes('textStyle')?.fontSize || undefined,\n currentCustomClass: editor.getAttributes('customMark')?.class || undefined,\n shouldShow,\n };\n};\n","import { useMemo } from 'react';\nimport { Editor } from '@tiptap/react';\nimport { Menu, MenuTrigger, MenuList, MenuItem, MenuGroup, MenuPopover } from '@ablogcms/components/dropdown-menu';\nimport type { BlockMenuItem, CommandItem } from '../../../../types';\nimport { Toolbar } from '../../../ui/Toolbar';\nimport { Icon } from '../../../ui/Icon';\nimport { useFilteredCommands } from '../../../../hooks/useBlockMenus';\n\nexport type ContentPickerProps = {\n menus: BlockMenuItem[];\n editor: Editor;\n currentPos: number;\n};\n\nexport function ContentTypePicker({ menus, editor, currentPos }: ContentPickerProps) {\n const activeItem = useMemo(() => {\n return menus\n .flatMap((item) => item.commands)\n .find((cmd) => (cmd.isActive?.(editor) ?? false) && cmd.isTextMenu === true);\n }, [menus, editor]);\n\n const filteredCommands = useFilteredCommands(menus, editor, currentPos);\n\n return (\n <Menu>\n {activeItem && (\n <>\n <MenuTrigger asChild>\n <Toolbar.Button type=\"button\" tooltip=\"ブロックタイプ\" aria-label=\"ブロックタイプを選択\">\n <Icon name={activeItem.iconName} />\n {activeItem.label}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <Toolbar.Divider />\n </>\n )}\n <MenuPopover scrollable data-elevation=\"3\">\n <MenuList>\n {filteredCommands.map((group) => (\n <MenuGroup title={group.title} key={group.title}>\n {group.commands.map((command: CommandItem) => (\n <MenuItem\n key={`${command.name}_${command.label}`}\n icon={<Icon name={command.iconName} />}\n onSelect={command.convert ? () => command.convert!(editor, currentPos) : () => {}}\n >\n {command.label}\n </MenuItem>\n ))}\n </MenuGroup>\n ))}\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport {\n Menu,\n MenuTrigger,\n MenuList,\n MenuGroup,\n MenuItemRadio,\n MenuItemRadioGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { Icon } from '../../../ui/Icon';\nimport { Toolbar } from '../../../ui/Toolbar';\n\nexport type FontFamilyPickerProps = {\n onChange: (value: string) => void;\n value: string;\n};\n\nexport function FontFamilyPicker({ onChange, value }: FontFamilyPickerProps) {\n const { fontFamily } = useSettingsContext();\n const currentValue = useMemo(() => fontFamily?.find((family) => family.value === value), [fontFamily, value]);\n const currentFontLabel = useMemo(() => currentValue?.label || 'デフォルト', [currentValue]);\n const selectFont = useCallback((font: string) => onChange(font), [onChange]);\n\n return (\n <Menu closeOnSelect>\n <MenuTrigger asChild>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"フォントファミリー\"\n active={!!currentValue?.value}\n aria-label=\"フォントファミリーを設定\"\n >\n <Icon name=\"slab_serif\" />\n {currentFontLabel}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <MenuPopover data-elevation=\"3\">\n <MenuList>\n {fontFamily?.length > 0 && (\n <MenuGroup title=\"フォントファミリー\">\n <MenuItemRadioGroup defaultValue={currentValue?.value} onValueChange={selectFont}>\n {fontFamily.map((item) => (\n <MenuItemRadio key={`${item.label}_${item.value}`} value={item.value}>\n <span style={{ fontFamily: item.value }}>{item.label}</span>\n </MenuItemRadio>\n ))}\n </MenuItemRadioGroup>\n </MenuGroup>\n )}\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport {\n Menu,\n MenuTrigger,\n MenuList,\n MenuGroup,\n MenuItemRadio,\n MenuItemRadioGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { Icon } from '../../../ui/Icon';\nimport { Toolbar } from '../../../ui/Toolbar';\n\nexport type FontSizePickerProps = {\n onChange: (value: string) => void;\n value: string;\n};\n\nexport function FontSizePicker({ onChange, value }: FontSizePickerProps) {\n const { fontSize } = useSettingsContext();\n const currentValue = useMemo(() => fontSize?.find((size) => size.value === value), [fontSize, value]);\n const currentSizeLabel = useMemo(() => currentValue?.label.split(' ')[0] || '標準', [currentValue]);\n const selectSize = useCallback((size: string) => onChange(size), [onChange]);\n\n return (\n <Menu closeOnSelect>\n <MenuTrigger asChild>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"フォントサイズ\"\n active={!!currentValue?.value}\n aria-label=\"フォントサイズを設定\"\n >\n <Icon name=\"format_size\" />\n {currentSizeLabel}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <MenuPopover data-elevation=\"3\">\n <MenuList>\n {fontSize?.length > 0 && (\n <MenuGroup title=\"フォントサイズ\">\n <MenuItemRadioGroup defaultValue={currentValue?.value} onValueChange={selectSize}>\n {fontSize.map((item) => (\n <MenuItemRadio key={`${item.label}_${item.value}`} value={item.value}>\n <span style={{ fontSize: item.value }}>{item.label}</span>\n </MenuItemRadio>\n ))}\n </MenuItemRadioGroup>\n </MenuGroup>\n )}\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport {\n Menu,\n MenuItem,\n MenuTrigger,\n MenuList,\n MenuGroup,\n MenuItemRadio,\n MenuItemRadioGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport type { CustomClassItem } from '../../../../types';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { Icon } from '../../../ui/Icon';\nimport { Toolbar } from '../../../ui/Toolbar';\n\nexport type CustomClassPickerProps = {\n onChange: (value: string) => void;\n onRemove: () => void;\n value: string;\n};\n\nexport function CustomClassPicker({ onChange, onRemove, value }: CustomClassPickerProps) {\n const { customClass } = useSettingsContext();\n const [currentValue, setCurrentValue] = useState<CustomClassItem | null>(null);\n\n useEffect(() => {\n const currentValue = customClass.find((item) => item.value === value.replace('custom-mark ', ''));\n setCurrentValue(currentValue || null);\n }, [customClass, value]);\n\n const selectClass = useCallback(\n (className: string) => {\n onChange(`custom-mark ${className}`);\n },\n [onChange]\n );\n\n return (\n <Menu closeOnSelect>\n <MenuTrigger asChild>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"カスタムクラス\"\n active={!!currentValue?.value}\n aria-label=\"カスタムクラスを設定\"\n >\n <Icon name=\"build\" />\n {currentValue?.label || 'カスタムクラス'}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <MenuPopover data-elevation=\"3\">\n <MenuList>\n <MenuGroup title=\"カスタムクラス\">\n <MenuItemRadioGroup defaultValue={currentValue?.value} onValueChange={selectClass}>\n {customClass?.map((item) => (\n <MenuItemRadio key={`${item.label}_${item.value}`} value={item.value} icon={<Icon name=\"build\" />}>\n {item.label}\n </MenuItemRadio>\n ))}\n <MenuItem variant=\"danger\" icon={<Icon name=\"delete\" />} onSelect={onRemove}>\n カスタムクラスを解除\n </MenuItem>\n </MenuItemRadioGroup>\n </MenuGroup>\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n}\n","import { type Editor } from '@tiptap/core';\nimport { Popover, PopoverTrigger, PopoverContent, type PopoverRef } from '@ablogcms/components/popover';\nimport { useCallback, useRef } from 'react';\nimport { LinkEditorPanel } from '../../../panels';\nimport { Toolbar } from '../../../ui/Toolbar';\nimport { Icon } from '../../../ui/Icon';\n\nexport type EditLinkPopoverProps = {\n editor: Editor;\n onSetLink: (link: string, openInNewTab?: boolean) => void;\n onClearLink: () => void;\n isActive: boolean;\n};\n\nexport function EditLinkPopover({ editor, onSetLink, onClearLink, isActive }: EditLinkPopoverProps) {\n const popoverRef = useRef<PopoverRef>(null);\n const { href: link, target } = editor.getAttributes('link');\n const handleSetLink = useCallback(\n (link: string, openInNewTab?: boolean) => {\n onSetLink(link, openInNewTab);\n popoverRef.current?.closePopover();\n },\n [onSetLink]\n );\n\n const handleClearLink = useCallback(() => {\n onClearLink();\n popoverRef.current?.closePopover();\n }, [onClearLink]);\n\n return (\n <Popover modal ref={popoverRef}>\n <PopoverTrigger asChild>\n <Toolbar.Button type=\"button\" tooltip=\"リンク\" aria-label=\"リンクを設定\" active={isActive}>\n <Icon name=\"link\" />\n </Toolbar.Button>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"2\">\n <LinkEditorPanel\n initialUrl={link}\n initialOpenInNewTab={target === '_blank'}\n onSetLink={handleSetLink}\n onClear={handleClearLink}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import { useEffect, useRef, useState, memo, useCallback } from 'react';\nimport { DragHandle } from '@tiptap/extension-drag-handle-react';\nimport { Editor } from '@tiptap/react';\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state';\nimport { Menu, MenuList, MenuItem, MenuDivider, MenuPopover } from '@ablogcms/components/dropdown-menu';\nimport type { BlockMenuItem } from '../../../types';\nimport { Toolbar } from '../../ui/Toolbar';\nimport { Icon } from '../../ui/Icon';\nimport useContentItemActions from './hooks/useContentItemActions';\nimport { IdEditor } from './components/IdEditor';\nimport { BlockMenus } from './components/BlockMenus';\nimport { useData } from './hooks/useData';\nimport { useEditorViewDom } from '../../../hooks/useEditorViewDom';\n\nexport type ContentItemMenuProps = {\n editor: Editor;\n getFilteredBlockMenus: ({ query, editor }: { query: string; editor: Editor }) => BlockMenuItem[];\n};\n\nexport function ContentItemMenu({ editor, getFilteredBlockMenus }: ContentItemMenuProps) {\n const menuAnchorRef = useRef<HTMLButtonElement>(null);\n const [menuOpen, setMenuOpen] = useState(false);\n const viewDom = useEditorViewDom(editor);\n const { currentNode, currentNodePos, handleNodeChange } = useData();\n const actions = useContentItemActions(editor, currentNode, currentNodePos);\n const MemoIdEditor = memo(IdEditor);\n const MemoBlockMenus = memo(BlockMenus);\n\n // useMenu / usePopover の依存に入るため毎レンダー作り直さない\n const getAnchorRect = useCallback(() => menuAnchorRef.current!.getBoundingClientRect(), []);\n\n // ショートカット\n useEffect(() => {\n const dom = viewDom;\n if (dom === null) {\n return undefined;\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n\n // 上に移動\n if (isMod && e.altKey && e.key === 'ArrowUp') {\n e.preventDefault();\n e.stopPropagation();\n actions.moveBlockUp();\n }\n\n // 下に移動\n if (isMod && e.altKey && e.key === 'ArrowDown') {\n e.preventDefault();\n e.stopPropagation();\n actions.moveBlockDown();\n }\n\n // 複製\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'd') {\n e.preventDefault();\n e.stopPropagation();\n actions.duplicateNode();\n }\n\n // 書式をクリア\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'x') {\n e.preventDefault();\n e.stopPropagation();\n actions.resetTextFormatting();\n }\n\n // 削除\n if (isMod && e.shiftKey && e.key.toLowerCase() === 'backspace') {\n e.preventDefault();\n e.stopPropagation();\n actions.deleteNode();\n }\n };\n\n dom.addEventListener('keydown', handleKeyDown);\n return () => dom.removeEventListener('keydown', handleKeyDown);\n }, [viewDom, actions]);\n\n const onChangeId = useCallback(\n (id: string) => {\n actions.setHeadingId(id);\n },\n [actions]\n );\n\n return (\n <DragHandle pluginKey=\"ContentItemMenu\" editor={editor} onNodeChange={handleNodeChange}>\n <div className=\"acms-admin-block-editor-content-item-menu\">\n <Toolbar.Button\n type=\"button\"\n size=\"small\"\n variant=\"secondary\"\n onClick={actions.handleAdd}\n aria-label=\"新規ブロックを追加\"\n >\n <Icon name=\"add\" />\n </Toolbar.Button>\n <Menu\n isOpen={menuOpen}\n onOpenChange={(open) => {\n setMenuOpen(open);\n editor.commands.setMeta('lockDragHandle', open);\n }}\n getAnchorRect={getAnchorRect}\n >\n <Toolbar.Button\n type=\"button\"\n size=\"small\"\n variant=\"secondary\"\n ref={menuAnchorRef}\n aria-label=\"ブロックメニューを開く\"\n onClick={() => {\n const { state } = editor;\n const { tr } = state;\n const node = editor.state.doc.nodeAt(currentNodePos);\n\n if (!node) return;\n\n if (node.isTextblock) {\n // テキストブロックなら中にカーソルを入れる\n const textSelection = TextSelection.create(state.doc, currentNodePos + 1);\n editor.view.dispatch(tr.setSelection(textSelection).scrollIntoView());\n } else {\n // 非テキストブロック(imageBlockなど)はノード選択にする\n const nodeSelection = NodeSelection.create(state.doc, currentNodePos);\n editor.view.dispatch(tr.setSelection(nodeSelection).scrollIntoView());\n }\n\n const newOpen = !menuOpen;\n setMenuOpen(newOpen);\n editor.commands.setMeta('lockDragHandle', newOpen);\n }}\n >\n <Icon name=\"drag_indicator\" />\n </Toolbar.Button>\n <MenuPopover size=\"large\" data-elevation=\"3\">\n <MenuList>\n <MemoBlockMenus\n menus={getFilteredBlockMenus({ query: '', editor })}\n editor={editor}\n currentPos={currentNodePos}\n />\n <MenuItem\n icon={<Icon name=\"keyboard_arrow_up\" />}\n shortcut={['Mod', 'Alt', 'ArrowUp']}\n onSelect={() => actions.moveBlockUp(currentNode, currentNodePos)}\n >\n 上に移動\n </MenuItem>\n <MenuItem\n icon={<Icon name=\"keyboard_arrow_down\" />}\n shortcut={['Mod', 'Alt', 'ArrowDown']}\n onSelect={() => actions.moveBlockDown(currentNode, currentNodePos)}\n >\n 下に移動\n </MenuItem>\n <MenuItem\n icon={<Icon name=\"library_add\" />}\n shortcut={['Mod', 'Shift', 'D']}\n onSelect={() => actions.duplicateNode(currentNode, currentNodePos)}\n >\n 複製\n </MenuItem>\n <MenuItem icon={<Icon name=\"content_copy\" />} onSelect={actions.copyNodeToClipboard}>\n コピー\n </MenuItem>\n <MenuItem\n icon={<Icon name=\"format_clear\" />}\n shortcut={['Mod', 'Shift', 'X']}\n onSelect={() => actions.resetTextFormatting(currentNode, currentNodePos)}\n >\n 書式をクリア\n </MenuItem>\n <MenuItem\n variant=\"danger\"\n icon={<Icon name=\"delete\" />}\n shortcut={['Mod', 'Shift', 'Backspace']}\n onSelect={() => actions.deleteNode(currentNode, currentNodePos)}\n >\n 削除\n </MenuItem>\n <MenuDivider />\n <MemoIdEditor onChange={onChangeId} value={currentNode?.attrs.id} />\n </MenuList>\n </MenuPopover>\n </Menu>\n </div>\n </DragHandle>\n );\n}\n","import { Node } from '@tiptap/pm/model';\nimport { Editor } from '@tiptap/react';\nimport { NodeSelection } from '@tiptap/pm/state';\nimport { useCallback } from 'react';\n\nconst useContentItemActions = (editor: Editor, currentNode: Node | null, currentNodePos: number) => {\n const getCurrentNode = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { state } = editor;\n const { selection } = state;\n const { $from } = selection;\n\n let curNode = curNodeProp ?? null;\n let curPos = curNodePosProp ?? null;\n\n if (!curNode || !curPos) {\n if (selection instanceof NodeSelection) {\n curNode = selection.node;\n curPos = selection.from;\n } else {\n const depth = $from.depth >= 1 ? 1 : $from.depth;\n curNode = $from.node(depth);\n if (depth > 0) {\n curPos = $from.before(depth);\n } else {\n return {\n curNode: null,\n curPos: -1,\n };\n }\n }\n }\n return {\n curNode,\n curPos,\n };\n },\n [editor]\n );\n\n const resetTextFormatting = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { curNode, curPos } = getCurrentNode(curNodeProp, curNodePosProp);\n if (!curNode || curPos === -1) return;\n\n const chain = editor.chain();\n chain.setBlockAttrs(curPos, { id: null, class: null });\n chain.setNodeSelection(curPos).unsetAllMarks();\n if (curNode?.type.name !== 'paragraph') {\n chain.focus().setParagraph();\n }\n chain.run();\n },\n [editor, getCurrentNode]\n );\n\n const duplicateNode = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { curNode, curPos } = getCurrentNode(curNodeProp, curNodePosProp);\n if (!curNode || curPos === -1) return;\n\n const nodeJSON = curNode.toJSON();\n\n editor\n .chain()\n .setMeta('hideDragHandle', true)\n .insertContentAt(curPos + (curNode?.nodeSize || 0), {\n type: nodeJSON.type,\n attrs: { ...nodeJSON.attrs, id: null }, // ID属性を削除\n content: nodeJSON.content || [],\n })\n // .setTextSelection(curPos + (curNode?.nodeSize || 0) + 1)\n .run();\n },\n [editor, getCurrentNode]\n );\n\n const copyNodeToClipboard = useCallback(() => {\n const nodeText = currentNode?.textContent || '';\n\n navigator.clipboard.writeText(nodeText).catch((err) => {\n console.error('Clipboard copy failed:', err);\n });\n }, [currentNode]);\n\n const deleteNode = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { curNode, curPos } = getCurrentNode(curNodeProp, curNodePosProp);\n if (!curNode || curPos === -1) return;\n\n editor.chain().setMeta('hideDragHandle', true).setNodeSelection(curPos).deleteSelection().run();\n },\n [editor, getCurrentNode]\n );\n\n const handleAdd = useCallback(() => {\n if (currentNodePos !== -1) {\n const currentNodeSize = currentNode?.nodeSize || 0;\n const insertPos = currentNodePos + currentNodeSize;\n const currentNodeIsEmptyParagraph = currentNode?.type.name === 'paragraph' && currentNode?.content?.size === 0;\n const focusPos = currentNodeIsEmptyParagraph ? currentNodePos + 2 : insertPos + 2;\n\n editor\n .chain()\n .command(({ dispatch, tr, state }) => {\n if (dispatch) {\n if (currentNodeIsEmptyParagraph) {\n tr.insertText('/', currentNodePos, currentNodePos + 1);\n } else {\n tr.insert(insertPos, state.schema.nodes.paragraph.create(null, [state.schema.text('/')]));\n }\n\n return dispatch(tr);\n }\n\n return true;\n })\n .focus(focusPos)\n .run();\n }\n }, [currentNode, currentNodePos, editor]);\n\n const setHeadingId = useCallback(\n (id: string) => {\n editor.chain().setBlockAttrs(currentNodePos, { id }).run();\n },\n [currentNodePos, editor]\n );\n\n const setBlockAttrs = useCallback(\n (attrs: { id: string; class: string }) => {\n editor.chain().setBlockAttrs(currentNodePos, attrs).run();\n },\n [currentNodePos, editor]\n );\n\n const moveBlockUp = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { state } = editor;\n const { $from } = state.selection;\n const { curNode, curPos } = getCurrentNode(curNodeProp, curNodePosProp);\n if (!curNode || curPos === -1) return;\n\n const { nodeSize } = curNode;\n const index = $from.index(0);\n if (index === 0) return;\n\n const prevNode = state.doc.child(index - 1);\n if (!prevNode) return;\n\n const nodeJSON = curNode.toJSON();\n\n editor\n .chain()\n .deleteRange({ from: curPos, to: curPos + nodeSize })\n .insertContentAt(curPos - prevNode.nodeSize, nodeJSON)\n .run();\n },\n [editor, getCurrentNode]\n );\n\n const moveBlockDown = useCallback(\n (curNodeProp?: Node | null, curNodePosProp?: number) => {\n const { state } = editor;\n const { curNode, curPos } = getCurrentNode(curNodeProp, curNodePosProp);\n if (!curNode || curPos === -1) return;\n\n const { nodeSize } = curNode;\n const nextPos = curPos + nodeSize;\n const nextNode = state.doc.resolve(nextPos).nodeAfter;\n if (!nextNode) return;\n\n const nextNodeSize = nextNode.nodeSize;\n const nodeJSON = curNode.toJSON();\n\n editor\n .chain()\n .deleteRange({ from: curPos, to: curPos + nodeSize })\n .insertContentAt(curPos + nextNodeSize, nodeJSON)\n .run();\n },\n [editor, getCurrentNode]\n );\n\n return {\n resetTextFormatting,\n duplicateNode,\n copyNodeToClipboard,\n deleteNode,\n handleAdd,\n setHeadingId,\n setBlockAttrs,\n moveBlockUp,\n moveBlockDown,\n };\n};\n\nexport default useContentItemActions;\n","import { useState } from 'react';\nimport { ButtonV2 } from '@ablogcms/components/button-v2';\nimport { Popover, PopoverContent, PopoverTrigger } from '@ablogcms/components/popover';\nimport { MenuItem } from '@ablogcms/components/dropdown-menu';\nimport { VStack } from '@ablogcms/components/stack';\nimport { Icon } from '../../../ui/Icon';\n\nexport type IdEditorProps = {\n onChange: (value: string) => void;\n value: string;\n};\n\nexport function IdEditor({ onChange, value }: IdEditorProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!(e.target instanceof HTMLFormElement)) {\n return;\n }\n const formData = new FormData(e.target);\n const id = formData.get('id') as string;\n setIsOpen(false);\n onChange(id);\n };\n\n return (\n <Popover isOpen={isOpen} onOpenChange={setIsOpen} modal placement=\"right\">\n <PopoverTrigger asChild>\n <MenuItem icon={<Icon name=\"grid_3x3\" />} onSelect={() => setIsOpen((prev) => !prev)} closeOnSelect={false}>\n {value || 'IDを設定'}\n {value && (\n <span style={{ marginLeft: 'auto' }}>\n <Icon name=\"edit\" />\n </span>\n )}\n </MenuItem>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\" className=\"acms-admin-block-editor-id-editor\">\n <div>\n <form onSubmit={handleSubmit} className=\"acms-admin-form\">\n <VStack spacing=\"0.5rem\" align=\"start\">\n <VStack align=\"start\" className=\"acms-admin-width-max\">\n <label htmlFor=\"input-text-id-editor\">IDを設定</label>\n <input\n id=\"input-text-id-editor\"\n name=\"id\"\n pattern=\"^[a-zA-Z0-9_\\-]+$\"\n type=\"text\"\n className=\"acms-admin-form-width-full\"\n defaultValue={value}\n onKeyDown={(e) => e.stopPropagation()}\n />\n </VStack>\n <ButtonV2 variant=\"filled\" size=\"small\" type=\"submit\">\n 適用\n </ButtonV2>\n </VStack>\n </form>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import { Editor } from '@tiptap/react';\nimport {\n Menu,\n SubmenuTriggerItem,\n MenuList,\n MenuItem,\n MenuGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport type { BlockMenuItem, CommandItem } from '../../../../types';\nimport { Icon } from '../../../ui/Icon';\nimport { useFilteredCommands } from '../../../../hooks/useBlockMenus';\n\nexport type BlockMenusProps = {\n menus: BlockMenuItem[];\n editor: Editor;\n currentPos: number;\n};\n\nexport function BlockMenus({ menus, editor, currentPos }: BlockMenusProps) {\n const filteredCommands = useFilteredCommands(menus, editor, currentPos);\n\n return filteredCommands.length > 0 ? (\n <Menu>\n <SubmenuTriggerItem icon={<Icon name=\"sync\" />}>ブロックタイプ変換</SubmenuTriggerItem>\n <MenuPopover data-elevation=\"3\">\n <MenuList>\n {filteredCommands.map((group) => (\n <MenuGroup title={group.title} key={group.title}>\n {group.commands.map((command: CommandItem) => (\n <MenuItem\n key={`${command.name}_${command.label}`}\n icon={<Icon name={command.iconName} />}\n onSelect={command.convert ? () => command.convert!(editor, currentPos) : () => {}}\n >\n {command.label}\n </MenuItem>\n ))}\n </MenuGroup>\n ))}\n </MenuList>\n </MenuPopover>\n </Menu>\n ) : null;\n}\n","import { Node } from '@tiptap/pm/model';\nimport { Editor } from '@tiptap/core';\nimport { useCallback, useState } from 'react';\n\nexport const useData = () => {\n const [currentNode, setCurrentNode] = useState<Node | null>(null);\n const [currentNodePos, setCurrentNodePos] = useState<number>(-1);\n\n const handleNodeChange = useCallback(\n (data: { node: Node | null; editor: Editor; pos: number }) => {\n if (data.node) {\n setCurrentNode(data.node);\n }\n setCurrentNodePos(data.pos);\n },\n [setCurrentNodePos, setCurrentNode]\n );\n\n return {\n currentNode,\n currentNodePos,\n setCurrentNode,\n setCurrentNodePos,\n handleNodeChange,\n };\n};\n","import { type AnyExtension, type Editor, type EditorOptions, useEditor } from '@tiptap/react';\nimport { useMemo, useRef } from 'react';\nimport { useBlockMenus } from './useBlockMenus';\nimport { BlockAttributes } from '../extensions/BaseBlock';\nimport { SlashCommand } from '../extensions';\nimport { ExtensionKit } from '../extensions/extension-kit';\nimport type { BlockDefinition, BlockMenuItem } from '../types';\n\nexport interface UseBlockEditorOptions\n extends Partial<\n Pick<\n EditorOptions,\n | 'autofocus'\n | 'editorProps'\n | 'enableContentCheck'\n | 'emitContentError'\n | 'onCreate'\n | 'onContentError'\n | 'onSelectionUpdate'\n | 'onTransaction'\n | 'onFocus'\n | 'onBlur'\n | 'onDestroy'\n | 'onPaste'\n | 'onDrop'\n >\n > {\n defaultValue?: string;\n onUpdate: (value: string) => void;\n blockMenus?: BlockMenuItem[];\n /** 画像の新規挿入時に拡大表示(Lightbox)をデフォルト有効にするか。未指定時は現行動作(オン)。 */\n imageDefaultLightbox?: boolean;\n /**\n * ExtensionKit の後段に追加登録する Tiptap 拡張(`ctx.blockEditor.registerExtension` 経由)。\n * Tiptap は動的な拡張の付け外しに対応しないため、初回マウント時にのみ確定する\n * (`useMemo` の依存配列が空。マウント後の変更は無視される)。\n */\n extensions?: AnyExtension[];\n /**\n * コアの `BLOCK_DEFINITIONS` に加えてマージする追加マスター(`ctx.blockEditor.registerBlockDefinition`\n * 経由)。`resolveCommands` へそのまま渡す。\n */\n blockDefinitions?: Record<string, BlockDefinition>;\n}\n\nexport const useBlockEditor = ({\n defaultValue = '',\n onUpdate = () => {},\n blockMenus = [],\n imageDefaultLightbox = true,\n extensions: extraExtensions,\n blockDefinitions,\n ...editorOptions\n}: UseBlockEditorOptions) => {\n const { getFilteredBlockMenus } = useBlockMenus({ blockMenus, blockDefinitions });\n const getItemsRef = useRef(getFilteredBlockMenus);\n getItemsRef.current = getFilteredBlockMenus;\n\n // 設定は SWR で遅れて届くため、固定値ではなく ref 経由で都度参照する\n const imageDefaultLightboxRef = useRef(imageDefaultLightbox);\n imageDefaultLightboxRef.current = imageDefaultLightbox;\n\n const extensions = useMemo(\n () => [\n ...ExtensionKit({ getImageDefaultLightbox: () => imageDefaultLightboxRef.current }),\n BlockAttributes,\n SlashCommand.configure({\n getItems: ({ query, editor }: { query: string; editor: Editor }) => getItemsRef.current({ query, editor }),\n }),\n ...(extraExtensions ?? []),\n ],\n // Tiptap は動的な拡張変更をサポートしないため、初回マウント時に確定する既存設計を踏襲する(extraExtensions も同様)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const editor = useEditor(\n {\n autofocus: false,\n // v3 は既定で false(トランザクション毎の再描画を行わない)。\n // TextMenu/ContentItemMenu 等が editor.isActive()/getAttributes() を再描画のたびに\n // 直接参照する v2 由来の設計のため、これまで通り毎トランザクション再描画する挙動を維持する。\n shouldRerenderOnTransaction: true,\n onCreate: ({ editor }) => {\n if (editor.isEmpty) {\n editor.commands.setContent(defaultValue || '');\n }\n },\n onUpdate: ({ editor }) => {\n const html = editor.getHTML();\n // send the content to an API here\n onUpdate(html);\n },\n extensions,\n ...editorOptions,\n editorProps: {\n ...editorOptions.editorProps,\n attributes: (...args) => {\n const attributes = {\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n };\n\n const overrideAttributes =\n typeof editorOptions.editorProps?.attributes === 'function'\n ? editorOptions.editorProps.attributes(...args)\n : editorOptions.editorProps?.attributes;\n\n return {\n ...attributes,\n ...overrideAttributes,\n };\n },\n },\n },\n []\n );\n\n return { editor, getFilteredBlockMenus };\n};\n","import { Extension } from '@tiptap/core';\nimport { Plugin, TextSelection } from '@tiptap/pm/state';\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n blockAttributes: {\n setBlockAttrs: (pos: number, attrs: { id?: string | null; class?: string | null }) => ReturnType;\n };\n }\n}\n\nexport const BlockAttributes = Extension.create({\n name: 'blockAttributes',\n\n addGlobalAttributes() {\n return [\n {\n types: [\n 'heading',\n 'paragraph',\n 'bulletList',\n 'orderedList',\n 'MediaUpload',\n 'imageBlock',\n 'fileBlock',\n 'linkButton',\n 'table',\n 'blockquote',\n 'codeBlock',\n 'bulletList',\n 'orderedList',\n 'horizontalRule',\n 'columns',\n ],\n attributes: {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute('id'),\n renderHTML: (attributes) => (attributes.id ? { id: attributes.id } : {}),\n keepOnSplit: false, // コピー&ペースト時に属性を保持しない\n },\n class: {\n default: null,\n parseHTML: (element) => element.getAttribute('class'),\n renderHTML: (attributes) => (attributes.class ? { class: attributes.class } : {}),\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n // ノードの属性を設定する\n setBlockAttrs:\n (pos, attrs) =>\n ({ state, dispatch }) => {\n const { tr, selection } = state;\n const { $from } = selection;\n let targetPos;\n if (typeof pos === 'number') {\n targetPos = pos;\n } else if ($from.depth > 0) {\n targetPos = $from.before(1);\n } else {\n targetPos = null;\n }\n if (targetPos === null) return false;\n const node = state.doc.nodeAt(targetPos);\n if (!node || !dispatch) return false;\n if (node && dispatch) {\n dispatch(tr.setNodeMarkup(targetPos, undefined, { ...node.attrs, ...attrs }));\n return true;\n }\n return false;\n },\n };\n },\n\n addProseMirrorPlugins() {\n const isMac = typeof navigator !== 'undefined' && /Mac/.test(navigator.platform);\n\n return [\n new Plugin({\n props: {\n handlePaste(view, event) {\n const { state, dispatch } = view;\n const { selection } = state;\n const { parent } = selection.$from;\n\n // codeBlock 内であれば、HTML をそのままテキストで貼り付ける\n if (parent.type.name === 'codeBlock') {\n const text = event.clipboardData?.getData('text/plain');\n if (text) {\n dispatch(state.tr.insertText(text, selection.from, selection.to));\n return true;\n }\n }\n\n return false;\n },\n\n handleKeyDown(view, event) {\n const { state, dispatch } = view;\n const { selection } = state;\n const { $from } = selection;\n\n if ($from.parent.type.name !== 'codeBlock') return false;\n\n // ⌘A (Mac) or Ctrl+A (Windows) → 全選択\n if ((event.metaKey && event.key === 'a') || (!isMac && event.ctrlKey && event.key === 'a')) {\n event.preventDefault();\n const start = $from.start();\n const end = $from.end();\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, start, end)));\n return true;\n }\n\n // Ctrl+A → 行頭移動(Mac のみ)\n if (isMac && event.ctrlKey && event.key === 'a') {\n event.preventDefault();\n const pos = selection.from;\n const textBefore = $from.parent.textContent.slice(0, $from.parentOffset);\n const offsetToLineStart = textBefore.lastIndexOf('\\n') + 1; // 行頭なら 0、改行直後なら n+1\n const newPos = pos - ($from.parentOffset - offsetToLineStart);\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, newPos)));\n return true;\n }\n\n // Ctrl+E → 行末移動(Mac のみ)\n if (isMac && event.ctrlKey && event.key === 'e') {\n event.preventDefault();\n const pos = selection.from;\n const parentText = $from.parent.textContent;\n const offsetToLineEnd = parentText.indexOf('\\n', $from.parentOffset);\n const lineEndOffset = offsetToLineEnd === -1 ? parentText.length : offsetToLineEnd;\n const lineEndPos = pos + (lineEndOffset - $from.parentOffset);\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, lineEndPos)));\n return true;\n }\n\n return false;\n },\n },\n }),\n ];\n },\n});\n","import { UndoRedo } from '@tiptap/extensions';\nimport {\n Document,\n Dropcursor,\n Figcaption,\n Focus,\n FontStyle,\n Heading,\n Highlight,\n HorizontalRule,\n Link,\n Placeholder,\n Selection,\n StarterKit,\n Subscript,\n Superscript,\n Table,\n TableCell,\n TableHeader,\n TableRow,\n TextAlign,\n TextStyle,\n TrailingNode,\n Typography,\n Underline,\n Columns,\n Column,\n ImageBlock,\n FileBlock,\n PasteHandler,\n LinkButton,\n MediaUpload,\n isAllowedBlockEditorLinkUri,\n CustomMark,\n CustomConvertBlock,\n} from '.';\n\nexport interface ExtensionKitOptions {\n /** 画像の新規挿入時に拡大表示(Lightbox)をデフォルト有効にするかを返す getter */\n getImageDefaultLightbox?: () => boolean;\n}\n\nexport const ExtensionKit = ({ getImageDefaultLightbox }: ExtensionKitOptions = {}) => {\n return [\n StarterKit.configure({\n document: false,\n dropcursor: false,\n heading: false,\n horizontalRule: false,\n undoRedo: false,\n // v3 の StarterKit は Link / Underline / ListKeymap / TrailingNode を新たに同梱するため、\n // 下記で個別登録している独自拡張・独自設定と二重登録にならないよう無効化する\n link: false,\n underline: false,\n trailingNode: false,\n listKeymap: false,\n }),\n UndoRedo,\n Document,\n Columns,\n Column,\n Selection,\n Heading.configure({\n levels: [1, 2, 3, 4, 5, 6],\n }),\n HorizontalRule,\n TextStyle,\n FontStyle,\n TrailingNode,\n Link.configure({\n openOnClick: false,\n isAllowedUri: (url, { protocols }) => !!isAllowedBlockEditorLinkUri(url, protocols),\n HTMLAttributes: {\n // Change rel to different value\n // Allow search engines to follow links(remove nofollow)\n rel: 'noopener noreferrer',\n // Remove target entirely so links open in current tab\n target: null,\n },\n }),\n Highlight.configure({ multicolor: true }),\n Underline,\n MediaUpload,\n CustomMark,\n CustomConvertBlock,\n ImageBlock.configure({\n getImageDefaultLightbox: getImageDefaultLightbox ?? (() => true),\n }),\n FileBlock,\n PasteHandler,\n LinkButton,\n TextAlign.extend({\n addKeyboardShortcuts() {\n return {};\n },\n }).configure({\n types: ['heading', 'paragraph'],\n }),\n Subscript,\n Superscript,\n Table,\n TableCell,\n TableHeader,\n TableRow,\n Typography,\n Placeholder.configure({\n includeChildren: true,\n showOnlyCurrent: false,\n placeholder: () => '',\n }),\n Focus,\n Figcaption,\n Dropcursor.configure({\n width: 4,\n color: '#a3c0ef',\n class: 'acms-admin-dropcursor',\n }),\n ];\n};\n\nexport default ExtensionKit;\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport { useCallback, useMemo, useRef, useState, type JSX } from 'react';\nimport { v4 as uuid } from 'uuid';\n\nimport { Popover, PopoverTrigger, PopoverContent } from '@ablogcms/components/popover';\nimport { Toolbar } from '../../../../components/ui/Toolbar';\nimport { Icon } from '../../../../components/ui/Icon';\nimport { MenuProps, ShouldShowProps } from '../../../../components/menus/types';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { ColorPicker } from '../../../../components/panels';\nimport { isColumnGripSelected } from '../TableColumn/utils';\nimport { isRowGripSelected } from '../TableRow/utils';\nimport { useTableStyle } from '../hooks';\nimport { isCellSelection } from '../../utils';\n\nexport function TableMenu({ editor, appendTo }: MenuProps): JSX.Element {\n const menuRef = useRef<HTMLDivElement>(null);\n // pluginKey は BubbleMenu プラグインのインスタンス識別子。毎レンダー uuid() し直すとレンダーの\n // たびに新しい BubbleMenu プラグインとして扱われてしまうため、初回生成した値を使い続ける。\n const pluginKeyRef = useRef(`table-menu-${uuid()}`);\n const [isOpen, setIsOpen] = useState(false);\n const { handleSetBgColor, handleClearBgColor } = useTableStyle(editor);\n const { features } = useSettingsContext();\n const shouldShow = useCallback(\n ({ view, state, from }: ShouldShowProps) => {\n if (!state || !from) {\n return false;\n }\n // テーブル内にいて、セル選択か、またはテキスト選択がない場合に表示\n const hasTextSelection = !state.selection.empty && !isCellSelection(state.selection);\n return (\n editor.isActive('table') &&\n !hasTextSelection &&\n !isColumnGripSelected({ editor, view, from: from || 0 }) &&\n !isRowGripSelected({ editor, view, from })\n );\n },\n [editor]\n );\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/style/getReferencedVirtualElement/options を\n // useEffect の依存配列に持ち、参照が変わるたびに editor へ updateOptions トランザクションを\n // dispatch する。毎レンダー新しいオブジェクト/関数を渡すと shouldRerenderOnTransaction と\n // 相まって無限レンダーになるため、参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current, [appendTo]);\n const getReferencedVirtualElement = useCallback(() => {\n const { view } = editor;\n const { state } = editor;\n const { $from } = state.selection;\n // 親ノードを遡って table の dom を取得\n for (let { depth } = $from; depth > 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === 'table') {\n const pos = $from.before(depth);\n const dom = view.nodeDOM(pos);\n if (dom instanceof HTMLElement) {\n return { getBoundingClientRect: () => dom.getBoundingClientRect() };\n }\n }\n }\n const rect = editor.view.dom.getBoundingClientRect(); // fallback\n return { getBoundingClientRect: () => rect };\n }, [editor]);\n const bubbleMenuStyle = useMemo(() => ({ zIndex: 100019 }), []); // TextMenu (100018) より高いz-indexを設定\n const bubbleMenuOptions = useMemo(() => ({ offset: 15, flip: true }), []);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey={pluginKeyRef.current}\n shouldShow={shouldShow}\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n style={bubbleMenuStyle}\n getReferencedVirtualElement={getReferencedVirtualElement}\n options={bubbleMenuOptions}\n >\n <Toolbar ref={menuRef}>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"セルを結合\"\n aria-label=\"セルを結合\"\n onClick={() => editor.chain().focus().mergeCells().run()}\n >\n <Icon name=\"cell_merge\" />\n </Toolbar.Button>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"セルを分離\"\n aria-label=\"セルを分離\"\n onClick={() => editor.chain().focus().splitCell().run()}\n >\n <Icon name=\"arrows_outward\" />\n </Toolbar.Button>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"スクロールさせる\"\n aria-label=\"テーブルをスクロールさせる\"\n active={editor.getAttributes('table').scrollable}\n onClick={() => editor.chain().focus().toggleTableScrollable().run()}\n >\n <Icon name=\"swipe\" />\n </Toolbar.Button>\n {features?.tableBgColor && (\n <Popover modal isOpen={isOpen} onOpenChange={setIsOpen} placement=\"top\">\n <Toolbar.Divider />\n <PopoverTrigger asChild>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"セルの背景色\"\n active={false}\n aria-label=\"セルの背景色を設定\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <Icon name=\"format_color_fill\" />\n </Toolbar.Button>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <ColorPicker\n onChange={(color) => {\n if (/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {\n handleSetBgColor(color);\n }\n }}\n onClear={() => {\n handleClearBgColor();\n setIsOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n )}\n </Toolbar>\n </BaseBubbleMenu>\n );\n}\n\nexport default TableMenu;\n","import { Editor } from '@tiptap/react';\nimport { EditorView } from '@tiptap/pm/view';\nimport { Table } from '../..';\n\nexport const isColumnGripSelected = ({ editor, view, from }: { editor: Editor; view: EditorView; from: number }) => {\n const domAtPos = view.domAtPos(from).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (!editor.isActive(Table.name) || !node) {\n return false;\n }\n\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\n return !!gripColumn;\n};\n\nexport default isColumnGripSelected;\n","import { Editor } from '@tiptap/react';\nimport { EditorView } from '@tiptap/pm/view';\nimport { Table } from '../..';\n\nexport const isRowGripSelected = ({ editor, view, from }: { editor: Editor; view: EditorView; from: number }) => {\n const domAtPos = view.domAtPos(from).node as HTMLElement;\n const nodeDOM = view.nodeDOM(from) as HTMLElement;\n const node = nodeDOM || domAtPos;\n\n if (!editor.isActive(Table.name) || !node) {\n return false;\n }\n\n let container = node;\n\n while (container && !['TD', 'TH'].includes(container.tagName)) {\n container = container.parentElement!;\n }\n\n const gripRow = container && container.querySelector && container.querySelector('button.grip-row.selected');\n\n return !!gripRow;\n};\n\nexport default isRowGripSelected;\n","import { useCallback } from 'react';\nimport { Editor } from '@tiptap/react';\n\nexport const useTableStyle = (editor: Editor) => {\n const handleSetBgColor = useCallback(\n (color: string) => {\n editor.chain().setCellBackgroundColor(color).run();\n editor.chain().setHeaderBackgroundColor(color).run();\n },\n [editor]\n );\n\n const handleClearBgColor = useCallback(() => {\n editor.chain().setCellBackgroundColor('').run();\n editor.chain().setHeaderBackgroundColor('').run();\n }, [editor]);\n\n return {\n handleSetBgColor,\n handleClearBgColor,\n };\n};\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport React, { useCallback, useMemo, useState, type JSX } from 'react';\nimport { Menu, MenuList, MenuItem, MenuPopover, MenuDivider } from '@ablogcms/components/dropdown-menu';\nimport { Icon } from '../../../../components/ui/Icon';\nimport { MenuProps, ShouldShowProps } from '../../../../components/menus/types';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { isColumnGripSelected } from './utils';\nimport { TableColorPicker } from '../ColorPicker';\n\nexport const TableColumnMenu = React.memo(({ editor, appendTo }: MenuProps): JSX.Element => {\n const { features } = useSettingsContext();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [menuRect, setMenuRect] = useState<DOMRect | null>(null);\n const shouldShow = useCallback(\n ({ view, state, from }: ShouldShowProps) => {\n if (!state) {\n setIsOpen(false);\n return false;\n }\n const show = isColumnGripSelected({ editor, view, from: from || 0 });\n setIsOpen(show);\n return show;\n },\n [editor]\n );\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/style/getReferencedVirtualElement/options を\n // useEffect の依存配列に持ち、参照が変わるたびに editor へ updateOptions トランザクションを\n // dispatch する。毎レンダー新しいオブジェクト/関数を渡すと shouldRerenderOnTransaction と\n // 相まって無限レンダーになるため、参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current, [appendTo]);\n const getReferencedVirtualElement = useCallback(() => {\n const { view } = editor;\n const { state } = editor;\n const { $from } = state.selection;\n const pos = $from.before($from.depth);\n const dom = view.nodeDOM(pos);\n if (dom instanceof HTMLElement) {\n const rect = dom.getBoundingClientRect();\n setMenuRect(rect);\n return { getBoundingClientRect: () => rect };\n }\n // fallback\n const rect = editor.view.dom.getBoundingClientRect();\n setMenuRect(rect);\n return { getBoundingClientRect: () => rect };\n }, [editor]);\n const bubbleMenuStyle = useMemo(() => ({ zIndex: 100019 }), []); // TextMenu (100018) より高いz-indexを設定\n const bubbleMenuOptions = useMemo(() => ({ placement: 'bottom-end' as const, offset: 15, flip: false }), []);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey=\"tableColumnMenu\"\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n style={bubbleMenuStyle}\n getReferencedVirtualElement={getReferencedVirtualElement}\n options={bubbleMenuOptions}\n shouldShow={shouldShow}\n >\n <Menu isOpen={isOpen} getAnchorRect={() => menuRect}>\n <MenuPopover size=\"small\" data-elevation=\"3\">\n <MenuList>\n <MenuItem\n icon={<Icon name=\"splitscreen_left\" />}\n onSelect={() => editor.chain().focus().toggleHeaderCell().run()}\n >\n 列見出し\n </MenuItem>\n <MenuDivider />\n <MenuItem icon={<Icon name=\"arrow_back\" />} onSelect={() => editor.chain().focus().addColumnBefore().run()}>\n 左に挿入\n </MenuItem>\n <MenuItem\n icon={<Icon name=\"arrow_forward\" />}\n onSelect={() => editor.chain().focus().addColumnAfter().run()}\n >\n 右に挿入\n </MenuItem>\n <MenuItem icon={<Icon name=\"cell_merge\" />} onSelect={() => editor.chain().focus().mergeCells().run()}>\n セルを結合\n </MenuItem>\n <MenuItem icon={<Icon name=\"arrows_outward\" />} onSelect={() => editor.chain().focus().splitCell().run()}>\n セルを分離\n </MenuItem>\n {features?.tableBgColor && <TableColorPicker editor={editor} />}\n <MenuItem\n variant=\"danger\"\n icon={<Icon name=\"delete\" />}\n onSelect={() => editor.chain().focus().deleteColumn().run()}\n >\n 削除\n </MenuItem>\n </MenuList>\n </MenuPopover>\n </Menu>\n </BaseBubbleMenu>\n );\n});\n\nTableColumnMenu.displayName = 'TableColumnMenu';\n\nexport default TableColumnMenu;\n","import { memo, useRef } from 'react';\nimport { Editor } from '@tiptap/core';\nimport { MenuItem } from '@ablogcms/components/dropdown-menu';\nimport { Popover, PopoverTrigger, PopoverContent, type PopoverRef } from '@ablogcms/components/popover';\nimport { ColorPicker } from '../../../components/panels';\nimport { Icon } from '../../../components/ui/Icon';\nimport { useTableStyle } from './hooks';\n\nexport const TableColorPicker = memo(({ editor }: { editor: Editor }) => {\n const popoverRef = useRef<PopoverRef>(null);\n const { handleSetBgColor, handleClearBgColor } = useTableStyle(editor);\n\n return (\n <Popover ref={popoverRef} modal placement=\"bottom-start\">\n <PopoverTrigger asChild>\n <MenuItem icon={<Icon name=\"format_color_fill\" />} onSelect={() => popoverRef.current?.togglePopover()}>\n 背景色\n </MenuItem>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <ColorPicker\n onChange={(color) => {\n if (/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) {\n handleSetBgColor(color);\n }\n }}\n onClear={() => {\n handleClearBgColor();\n }}\n />\n </PopoverContent>\n </Popover>\n );\n});\nTableColorPicker.displayName = 'TableColorPicker';\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport React, { useCallback, useMemo, useState, type JSX } from 'react';\nimport { Menu, MenuList, MenuItem, MenuPopover, MenuDivider } from '@ablogcms/components/dropdown-menu';\nimport { Icon } from '../../../../components/ui/Icon';\nimport { MenuProps, ShouldShowProps } from '../../../../components/menus/types';\nimport { useSettingsContext } from '../../../../context/EditorSettings';\nimport { isRowGripSelected } from './utils';\nimport { TableColorPicker } from '../ColorPicker';\n\nexport const TableRowMenu = React.memo(({ editor, appendTo }: MenuProps): JSX.Element => {\n const { features } = useSettingsContext();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [menuRect, setMenuRect] = useState<DOMRect | null>(null);\n const shouldShow = useCallback(\n ({ view, state, from }: ShouldShowProps) => {\n if (!state || !from) {\n setIsOpen(false);\n return false;\n }\n const show = isRowGripSelected({ editor, view, from });\n setIsOpen(show);\n return show;\n },\n [editor]\n );\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/style/getReferencedVirtualElement/options を\n // useEffect の依存配列に持ち、参照が変わるたびに editor へ updateOptions トランザクションを\n // dispatch する。毎レンダー新しいオブジェクト/関数を渡すと shouldRerenderOnTransaction と\n // 相まって無限レンダーになるため、参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current, [appendTo]);\n const getReferencedVirtualElement = useCallback(() => {\n const { view } = editor;\n const { state } = editor;\n const { $from } = state.selection;\n const pos = $from.before($from.depth);\n const dom = view.nodeDOM(pos);\n if (dom instanceof HTMLElement) {\n const rect = dom.getBoundingClientRect();\n setMenuRect(rect);\n return { getBoundingClientRect: () => rect };\n }\n // fallback\n const rect = editor.view.dom.getBoundingClientRect();\n setMenuRect(rect);\n return { getBoundingClientRect: () => rect };\n }, [editor]);\n const bubbleMenuStyle = useMemo(() => ({ zIndex: 100019 }), []); // TextMenu (100018) より高いz-indexを設定\n const bubbleMenuOptions = useMemo(() => ({ placement: 'bottom-end' as const, offset: 15, flip: false }), []);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey=\"tableRowMenu\"\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n style={bubbleMenuStyle}\n getReferencedVirtualElement={getReferencedVirtualElement}\n options={bubbleMenuOptions}\n shouldShow={shouldShow}\n >\n <Menu isOpen={isOpen} getAnchorRect={() => menuRect}>\n <MenuPopover size=\"small\" data-elevation=\"3\">\n <MenuList>\n <MenuItem\n icon={<Icon name=\"splitscreen_top\" />}\n onSelect={() => editor.chain().focus().toggleHeaderCell().run()}\n >\n 行見出し\n </MenuItem>\n <MenuDivider />\n <MenuItem icon={<Icon name=\"arrow_upward\" />} onSelect={() => editor.chain().focus().addRowBefore().run()}>\n 上に挿入\n </MenuItem>\n <MenuItem icon={<Icon name=\"arrow_downward\" />} onSelect={() => editor.chain().focus().addRowAfter().run()}>\n 下に挿入\n </MenuItem>\n <MenuItem icon={<Icon name=\"cell_merge\" />} onSelect={() => editor.chain().focus().mergeCells().run()}>\n セルを結合\n </MenuItem>\n <MenuItem icon={<Icon name=\"arrows_outward\" />} onSelect={() => editor.chain().focus().splitCell().run()}>\n セルを分離\n </MenuItem>\n {features?.tableBgColor && <TableColorPicker editor={editor} />}\n <MenuItem\n variant=\"danger\"\n icon={<Icon name=\"delete\" />}\n onSelect={() => editor.chain().focus().deleteRow().run()}\n >\n 削除\n </MenuItem>\n </MenuList>\n </MenuPopover>\n </Menu>\n </BaseBubbleMenu>\n );\n});\n\nTableRowMenu.displayName = 'TableRowMenu';\n\nexport default TableRowMenu;\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport { NodeSelection } from '@tiptap/pm/state';\nimport { useCallback, useMemo, useRef, useState, useEffect, type JSX } from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { emit } from '@ablogcms/events';\n\nimport MediaInsert from '@ablogcms/media/components/media-insert/media-insert';\nimport MediaUpdate from '@ablogcms/media/components/media-update/media-update';\nimport { MediaItem } from '@ablogcms/media/types';\nimport { useMediaSelect } from '@ablogcms/react-hooks/use-media';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\nimport { MenuProps } from '../../../components/menus/types';\nimport { ImageBlockWidth } from './ImageBlockWidth';\nimport { ImageBlockCaption } from './ImageBlockCaption';\nimport { ImageBlockLink } from './ImageBlockLink';\nimport { useMediaUpdate } from '../mediaUpdateHooks';\nimport { AlignPicker } from '../../../components/panels';\n\nexport function ImageBlockMenu({ editor, appendTo }: MenuProps): JSX.Element {\n const menuRef = useRef<HTMLDivElement>(null);\n // pluginKey は BubbleMenu プラグインのインスタンス識別子。毎レンダー uuid() し直すとレンダーの\n // たびに新しい BubbleMenu プラグインとして扱われてしまうため、初回生成した値を使い続ける。\n const pluginKeyRef = useRef(`imageBlockMenu-${uuid()}`);\n const [hasMainImageField, setHasMainImageField] = useState(false);\n const [isMainImageActive, setIsMainImageActive] = useState(false);\n const inspectMedia = useCallback(() => {\n const { selection } = editor.state;\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node; // 選択されているノードを取得\n if (selectedNode.type.name === 'imageBlock') {\n return selectedNode;\n }\n }\n }, [editor]);\n const { isInsertModalOpen, tab, files, handleModalClose, handleSelectClick, uploadFile } = useMediaSelect();\n const { targetMediaId, selfImgSrc, isUpdateModalOpen, handleUpdateModalClose, handleUpdateClick } = useMediaUpdate({\n inspectMedia,\n });\n\n const handleInsertMedia = useCallback(\n (items: MediaItem[]) => {\n const [item] = items;\n\n if (item.media_thumbnail) {\n editor.chain().focus(undefined, { scrollIntoView: false }).updateMediaImageBlock(item).run();\n }\n handleModalClose();\n },\n [editor, handleModalClose]\n );\n\n const handleUpdateMedia = useCallback(\n (item: MediaItem) => {\n if (item.media_thumbnail) {\n editor.chain().focus(undefined, { scrollIntoView: false }).updateMediaImageBlock(item).run();\n }\n handleUpdateModalClose();\n },\n [editor, handleUpdateModalClose]\n );\n\n const shouldShow = useCallback(() => {\n const isActive = editor.isActive('imageBlock');\n return isActive;\n }, [editor]);\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/options を useEffect の依存配列に持ち、参照が\n // 変わるたびに editor へ updateOptions トランザクションを dispatch する。毎レンダー新しい\n // オブジェクト/関数を渡すと shouldRerenderOnTransaction と相まって無限レンダーになるため、\n // 参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current ?? document.body, [appendTo]);\n const bubbleMenuOptions = useMemo(() => ({ offset: 8 }), []);\n\n const onWidthChange = useCallback(\n (value: string) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setImageBlockWidth(value).run();\n },\n [editor]\n );\n\n /**\n * 画像URLから画像をメディアにアップロードする\n * 自前ホストの画像のみ\n */\n const handleUploadClick = useCallback(async () => {\n const res = await fetch(selfImgSrc);\n const blob = await res.blob();\n const filename = selfImgSrc.split('/').pop() || '';\n const ext = blob.type.split('/')[1] || 'jpg';\n const name = filename.includes('.') ? filename : `${filename}.${ext}`;\n const file = new File([blob], name, { type: blob.type });\n\n uploadFile([file]);\n }, [uploadFile, selfImgSrc]);\n\n /**\n * メイン画像に設定する\n */\n const handleSetMainImage = useCallback(() => {\n const mainImageValues = document.querySelectorAll(\n ACMS.Config.blockEditorConfig.setMainImageMark || '.js-block-editor-set-main-image'\n ) as NodeListOf<HTMLInputElement>;\n if (mainImageValues && mainImageValues.length > 0) {\n [].forEach.call(mainImageValues, (mainImageValue: HTMLInputElement) => {\n setIsMainImageActive(true);\n mainImageValue.dispatchEvent(new Event('change', { bubbles: true }));\n void emit('entry.main-image.change', {\n target: mainImageValue,\n mediaId: editor.getAttributes('imageBlock').mediaId,\n thumbnail: editor.getAttributes('imageBlock').src,\n });\n mainImageValue?.dispatchEvent(\n new CustomEvent('acms.set-main-image', {\n detail: {\n media_id: editor.getAttributes('imageBlock').mediaId,\n media_thumbnail: editor.getAttributes('imageBlock').src,\n media_type: 'image',\n },\n })\n );\n });\n }\n }, [editor]);\n\n /**\n * メイン画像に設定されているかどうか\n */\n useEffect(() => {\n const mainImageValues = document.querySelectorAll(\n ACMS.Config.blockEditorConfig.setMainImageMark || '.js-block-editor-set-main-image'\n ) as NodeListOf<HTMLInputElement>;\n if (mainImageValues && mainImageValues.length > 0) {\n const mainImageMids = Array.from(mainImageValues).map((mainImageValue: HTMLInputElement) => mainImageValue.value);\n setHasMainImageField(true);\n setIsMainImageActive(mainImageMids.includes(String(editor.getAttributes('imageBlock').mediaId)));\n }\n }, [editor, editor.state]);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey={pluginKeyRef.current}\n shouldShow={shouldShow}\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n options={bubbleMenuOptions}\n >\n <Toolbar shouldShowContent={shouldShow()} ref={menuRef}>\n <Toolbar.Button type=\"button\" tooltip=\"メディア選択\" onClick={handleSelectClick} aria-label=\"メディアを選択\">\n <Icon name=\"perm_media\" />\n </Toolbar.Button>\n {targetMediaId != null && targetMediaId > 0 && (\n <Toolbar.Button\n type=\"button\"\n tooltip=\"メディアを編集\"\n onClick={handleUpdateClick}\n aria-label=\"メディアを編集\"\n >\n <Icon name=\"edit\" />\n </Toolbar.Button>\n )}\n {targetMediaId == null && selfImgSrc && (\n <Toolbar.Button\n type=\"button\"\n tooltip=\"アップロード\"\n onClick={handleUploadClick}\n aria-label=\"画像をアップロード\"\n >\n <Icon name=\"upload\" />\n </Toolbar.Button>\n )}\n <Toolbar.Divider />\n <ImageBlockLink\n initialUrl={editor.getAttributes('imageBlock').link}\n initialOpenInNewTab={editor.getAttributes('imageBlock').target === '_blank'}\n onChange={(link, openInNewTab) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setImageBlockLink(link, openInNewTab).run();\n }}\n />\n <ImageBlockCaption\n caption={editor.getAttributes('imageBlock').caption}\n alt={editor.getAttributes('imageBlock').alt}\n onChange={(caption, alt) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setImageBlockCaption(caption)\n .setImageBlockAlt(alt)\n .run();\n }}\n />\n <AlignPicker\n align={editor.getAttributes('imageBlock').align}\n onChange={(align) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setImageBlockAlign(align).run();\n }}\n />\n <Toolbar.Button\n type=\"button\"\n tooltip=\"拡大表示しない\"\n aria-label=\"画像を拡大表示しない\"\n onClick={() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).toggleImageBlockLightbox().run();\n }}\n active={editor.getAttributes('imageBlock').noLightbox === 'true'}\n >\n <Icon name=\"search_off\" />\n </Toolbar.Button>\n {hasMainImageField && targetMediaId && (\n <Toolbar.Button\n type=\"button\"\n tooltip=\"メイン画像に設定\"\n onClick={handleSetMainImage}\n active={isMainImageActive}\n aria-label=\"メイン画像に設定\"\n >\n <Icon name=\"imagesmode\" />\n </Toolbar.Button>\n )}\n <Toolbar.Divider />\n <ImageBlockWidth onChange={onWidthChange} value={editor.getAttributes('imageBlock').displayWidth} />\n </Toolbar>\n <MediaInsert\n isOpen={isInsertModalOpen}\n onInsert={handleInsertMedia}\n onClose={handleModalClose}\n tab={tab}\n files={files}\n filetype=\"image\"\n />\n {targetMediaId != null && targetMediaId > 0 && (\n <MediaUpdate\n isOpen={isUpdateModalOpen}\n mid={targetMediaId}\n onClose={handleUpdateModalClose}\n onUpdate={handleUpdateMedia}\n />\n )}\n </BaseBubbleMenu>\n );\n}\n\nexport default ImageBlockMenu;\n","import { memo, useCallback, useEffect, useState } from 'react';\nimport {\n Menu,\n MenuTrigger,\n MenuList,\n MenuGroup,\n MenuItemRadio,\n MenuItemRadioGroup,\n MenuPopover,\n} from '@ablogcms/components/dropdown-menu';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\nimport type { ImageSizesItem } from '../../../types';\nimport { useSettingsContext } from '../../../context/EditorSettings';\n\nexport type ImageBlockWidthProps = {\n onChange: (value: string) => void;\n value: string;\n};\n\nexport const ImageBlockWidth = memo(({ onChange, value }: ImageBlockWidthProps) => {\n const { imageSizes } = useSettingsContext();\n const [currentValue, setCurrentValue] = useState<ImageSizesItem | null>(null);\n\n useEffect(() => {\n const sizeItem = imageSizes.find((item) => item.value === value) || imageSizes[0];\n setCurrentValue(sizeItem);\n }, [imageSizes, value]);\n\n const handleChange = useCallback(\n (value: string) => {\n onChange(value);\n },\n [onChange]\n );\n\n return (\n <Menu closeOnSelect>\n <MenuTrigger asChild>\n <Toolbar.Button type=\"button\" tooltip=\"画像サイズ\" aria-label=\"画像サイズを設定\">\n <Icon name=\"crop_free\" />\n {currentValue?.label || '1/1 (100%)'}\n <Icon name=\"keyboard_arrow_down\" />\n </Toolbar.Button>\n </MenuTrigger>\n <MenuPopover size=\"medium\" data-elevation=\"3\">\n <MenuList>\n <MenuGroup title=\"画像サイズ\">\n <MenuItemRadioGroup defaultValue={value} onValueChange={handleChange}>\n {imageSizes?.map((item) => (\n <MenuItemRadio key={`${item.label}_${item.value}`} value={item.value}>\n {item.label}\n </MenuItemRadio>\n ))}\n </MenuItemRadioGroup>\n </MenuGroup>\n </MenuList>\n </MenuPopover>\n </Menu>\n );\n});\n\nImageBlockWidth.displayName = 'ImageBlockWidth';\n","import { memo, useRef } from 'react';\nimport { Popover, PopoverTrigger, PopoverContent, PopoverClose } from '@ablogcms/components/popover';\nimport { ButtonV2 } from '@ablogcms/components/button-v2';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\n\nexport type ImageBlockCaptionProps = {\n caption: string;\n alt: string;\n onChange: (caption: string, alt: string) => void;\n};\n\nexport const ImageBlockCaption = memo(({ caption, alt, onChange }: ImageBlockCaptionProps) => {\n const captionRef = useRef<HTMLInputElement>(null);\n const altRef = useRef<HTMLTextAreaElement>(null);\n\n return (\n <Popover modal>\n <PopoverTrigger asChild>\n <Toolbar.Button\n tooltip=\"キャプションを編集\"\n type=\"button\"\n active={!!caption || !!alt}\n aria-label=\"キャプションを編集\"\n >\n <Icon name=\"closed_caption\" />\n </Toolbar.Button>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <form\n className=\"acms-admin-form acms-admin-block-editor-popover-form\"\n onSubmit={() => onChange(captionRef.current?.value ?? '', altRef.current?.value ?? '')}\n >\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <label htmlFor=\"captionText\" className=\"acms-admin-block-editor-popover-form-item-label\">\n キャプション\n </label>\n <input\n type=\"text\"\n id=\"captionText\"\n className=\"acms-admin-form-width-full\"\n defaultValue={caption}\n ref={captionRef}\n placeholder=\"\"\n />\n </div>\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <label htmlFor=\"altText\" className=\"acms-admin-block-editor-popover-form-item-label\">\n Alt(代替テキスト)\n </label>\n <textarea\n id=\"altText\"\n defaultValue={alt}\n ref={altRef}\n className=\"acms-admin-form-width-full\"\n placeholder=\"\"\n />\n </div>\n <div className=\"acms-admin-block-editor-popover-form-button-group\">\n <PopoverClose asChild>\n <ButtonV2\n variant=\"filled\"\n size=\"small\"\n type=\"submit\"\n aria-label=\"キャプションを適用\"\n onClick={() => {\n onChange(captionRef.current?.value ?? '', altRef.current?.value ?? '');\n }}\n >\n 適用\n </ButtonV2>\n </PopoverClose>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n});\n\nImageBlockCaption.displayName = 'ImageBlockCaption';\n","import { memo, useState } from 'react';\nimport { Popover, PopoverTrigger, PopoverContent } from '@ablogcms/components/popover';\nimport { LinkEditorPanel } from '../../../components/panels';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\n\nexport type ImageBlockLinkProps = {\n initialUrl: string;\n initialOpenInNewTab: boolean;\n onChange: (url: string, openInNewTab?: boolean) => void;\n};\n\nexport const ImageBlockLink = memo(({ initialUrl, initialOpenInNewTab, onChange }: ImageBlockLinkProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <Popover modal isOpen={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <Toolbar.Button\n tooltip=\"リンクを設定\"\n type=\"button\"\n active={!!initialUrl}\n onClick={() => setIsOpen((prev) => !prev)}\n alia-label=\"リンクを設定\"\n >\n <Icon name=\"link\" />\n </Toolbar.Button>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <LinkEditorPanel\n initialUrl={initialUrl}\n initialOpenInNewTab={initialOpenInNewTab}\n onSetLink={(link, openInNewTab) => {\n onChange(link, openInNewTab);\n setIsOpen(false);\n }}\n onClear={() => {\n onChange('', false);\n setIsOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n});\n\nImageBlockLink.displayName = 'ImageBlockLink';\n","import { useState, useCallback } from 'react';\nimport { Node as TiptapNode } from '@tiptap/pm/model';\n\nexport const useMediaUpdate = ({ inspectMedia }: { inspectMedia: () => TiptapNode | undefined }) => {\n const [isUpdateModalOpen, setIsUpdateModalOpen] = useState(false);\n const targetMediaId = (inspectMedia()?.attrs?.mediaId || null) as number | null;\n const imageSrc = inspectMedia()?.attrs?.src || null;\n let selfImgSrc = null;\n\n if (imageSrc && !/^(?:[a-z]+:)?\\/\\//i.test(imageSrc)) {\n selfImgSrc = imageSrc;\n }\n const handleUpdateModalClose = useCallback(() => {\n setIsUpdateModalOpen(false);\n }, []);\n\n const handleUpdateClick = useCallback(() => {\n setIsUpdateModalOpen(true);\n }, []);\n\n return {\n targetMediaId,\n selfImgSrc,\n isUpdateModalOpen,\n handleUpdateModalClose,\n handleUpdateClick,\n };\n};\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport { NodeSelection } from '@tiptap/pm/state';\nimport { useCallback, useMemo, useRef, type JSX } from 'react';\nimport { v4 as uuid } from 'uuid';\n\nimport MediaInsert from '@ablogcms/media/components/media-insert/media-insert';\nimport MediaUpdate from '@ablogcms/media/components/media-update/media-update';\nimport { MediaItem } from '@ablogcms/media/types';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\nimport { MenuProps } from '../../../components/menus/types';\nimport { FileBlockCaption } from './FileBlockCaption';\nimport { useMediaSelect } from '../../MediaUpload/view/hooks';\nimport { useMediaUpdate } from '../../ImageBlock/mediaUpdateHooks';\nimport { AlignPicker } from '../../../components/panels';\n\nexport function FileBlockMenu({ editor, appendTo }: MenuProps): JSX.Element {\n const menuRef = useRef<HTMLDivElement>(null);\n // pluginKey は BubbleMenu プラグインのインスタンス識別子。毎レンダー uuid() し直すとレンダーの\n // たびに新しい BubbleMenu プラグインとして扱われてしまうため、初回生成した値を使い続ける。\n const pluginKeyRef = useRef(`fileBlockMenu-${uuid()}`);\n const inspectMedia = useCallback(() => {\n const { selection } = editor.state;\n if (selection instanceof NodeSelection) {\n const selectedNode = selection.node; // 選択されているノードを取得\n if (selectedNode.type.name === 'fileBlock') {\n return selectedNode;\n }\n }\n }, [editor]);\n const { isInsertModalOpen, tab, files, handleModalClose, handleSelectClick } = useMediaSelect();\n const { targetMediaId, isUpdateModalOpen, handleUpdateModalClose, handleUpdateClick } = useMediaUpdate({\n inspectMedia,\n });\n\n const handleInsertMedia = useCallback(\n (items: MediaItem[]) => {\n const [item] = items;\n\n if (item.media_permalink) {\n editor.chain().focus(undefined, { scrollIntoView: false }).updateMediaFileBlock(item).run();\n }\n handleModalClose();\n },\n [editor, handleModalClose]\n );\n\n const handleUpdateMedia = useCallback(\n (item: MediaItem) => {\n if (item.media_permalink) {\n editor.chain().focus(undefined, { scrollIntoView: false }).updateMediaFileBlock(item).run();\n }\n handleUpdateModalClose();\n },\n [editor, handleUpdateModalClose]\n );\n\n const shouldShow = useCallback(() => {\n const isActive = editor.isActive('fileBlock');\n return isActive;\n }, [editor]);\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/options を useEffect の依存配列に持ち、参照が\n // 変わるたびに editor へ updateOptions トランザクションを dispatch する。毎レンダー新しい\n // オブジェクト/関数を渡すと shouldRerenderOnTransaction と相まって無限レンダーになるため、\n // 参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current ?? document.body, [appendTo]);\n const bubbleMenuOptions = useMemo(() => ({ offset: 8 }), []);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey={pluginKeyRef.current}\n shouldShow={shouldShow}\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n options={bubbleMenuOptions}\n >\n <Toolbar shouldShowContent={shouldShow()} ref={menuRef}>\n <Toolbar.Button type=\"button\" tooltip=\"メディア選択\" onClick={handleSelectClick} aria-label=\"メディアを選択\">\n <Icon name=\"perm_media\" />\n </Toolbar.Button>\n {targetMediaId != null && targetMediaId > 0 && (\n <Toolbar.Button\n type=\"button\"\n tooltip=\"メディアを編集\"\n onClick={handleUpdateClick}\n aria-label=\"メディアを編集\"\n >\n <Icon name=\"edit\" />\n </Toolbar.Button>\n )}\n <Toolbar.Divider />\n <FileBlockCaption\n caption={editor.getAttributes('fileBlock').caption ?? ''}\n alt={editor.getAttributes('fileBlock').alt ?? ''}\n onChange={(caption: string, alt: string) => {\n editor\n .chain()\n .focus(undefined, { scrollIntoView: false })\n .setFileBlockCaption(caption)\n .setFileBlockAlt(alt)\n .run();\n }}\n />\n <AlignPicker\n align={editor.getAttributes('fileBlock').align}\n onChange={(align) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setFileBlockAlign(align).run();\n }}\n />\n <Toolbar.Button\n type=\"button\"\n tooltip=\"ボタンで表示\"\n aria-label=\"ボタンで表示\"\n onClick={() => {\n const newDisplayType = editor.getAttributes('fileBlock').displayType === 'button' ? 'icon' : 'button';\n editor.chain().focus(undefined, { scrollIntoView: false }).setFileBlockDisplayType(newDisplayType).run();\n }}\n disabled={!editor.getAttributes('fileBlock').caption}\n active={editor.getAttributes('fileBlock').displayType === 'button'}\n >\n <Icon name=\"variable_insert\" />\n </Toolbar.Button>\n <Toolbar.Button\n tooltip=\"リンクを確認\"\n onClick={() => {\n window.open(editor.getAttributes('fileBlock').href, '_blank', 'noopener,noreferrer');\n }}\n aria-label=\"リンクを確認\"\n disabled={!editor.getAttributes('fileBlock').href}\n >\n <Icon name=\"visibility\" />\n </Toolbar.Button>\n <Toolbar.Button\n type=\"button\"\n tooltip=\"別タブで開く\"\n aria-label=\"別タブで開く\"\n onClick={() => {\n editor.chain().focus(undefined, { scrollIntoView: false }).toggleFileBlockTarget().run();\n }}\n active={editor.getAttributes('fileBlock').target === '_blank'}\n >\n <Icon name=\"open_in_new\" />\n </Toolbar.Button>\n </Toolbar>\n <MediaInsert\n isOpen={isInsertModalOpen}\n onInsert={handleInsertMedia}\n onClose={handleModalClose}\n tab={tab}\n files={files}\n filetype=\"file\"\n radioMode\n />\n {targetMediaId != null && targetMediaId > 0 && (\n <MediaUpdate\n isOpen={isUpdateModalOpen}\n mid={targetMediaId}\n onClose={handleUpdateModalClose}\n onUpdate={handleUpdateMedia}\n />\n )}\n </BaseBubbleMenu>\n );\n}\n\nexport default FileBlockMenu;\n","import { memo, useRef } from 'react';\nimport { Popover, PopoverTrigger, PopoverContent, PopoverClose } from '@ablogcms/components/popover';\nimport { ButtonV2 } from '@ablogcms/components/button-v2';\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { Icon } from '../../../components/ui/Icon';\n\nexport type FileBlockCaptionProps = {\n caption: string;\n alt: string;\n onChange: (caption: string, alt: string) => void;\n};\n\nexport const FileBlockCaption = memo(({ caption, alt, onChange }: FileBlockCaptionProps) => {\n const captionRef = useRef<HTMLInputElement>(null);\n const altRef = useRef<HTMLTextAreaElement>(null);\n\n return (\n <Popover modal>\n <PopoverTrigger asChild>\n <Toolbar.Button\n tooltip=\"キャプションを編集\"\n type=\"button\"\n active={!!caption || !!alt}\n aria-label=\"キャプションを編集\"\n >\n <Icon name=\"closed_caption\" />\n </Toolbar.Button>\n </PopoverTrigger>\n <PopoverContent data-elevation=\"3\">\n <form\n className=\"acms-admin-form acms-admin-block-editor-popover-form\"\n onSubmit={() => onChange(captionRef.current?.value ?? '', altRef.current?.value ?? '')}\n >\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <label htmlFor=\"captionText\" className=\"acms-admin-block-editor-popover-form-item-label\">\n キャプション\n </label>\n <input\n type=\"text\"\n id=\"captionText\"\n className=\"acms-admin-form-width-full\"\n defaultValue={caption}\n ref={captionRef}\n placeholder=\"\"\n />\n </div>\n <div className=\"acms-admin-block-editor-popover-form-item\">\n <label htmlFor=\"altText\" className=\"acms-admin-block-editor-popover-form-item-label\">\n Alt(代替テキスト)\n </label>\n <textarea\n id=\"altText\"\n defaultValue={alt}\n ref={altRef}\n className=\"acms-admin-form-width-full\"\n placeholder=\"\"\n />\n </div>\n <div className=\"acms-admin-block-editor-popover-form-button-group\">\n <PopoverClose asChild>\n <ButtonV2\n variant=\"filled\"\n size=\"small\"\n type=\"submit\"\n aria-label=\"キャプションを適用\"\n onClick={() => {\n onChange(captionRef.current?.value ?? '', altRef.current?.value ?? '');\n }}\n >\n 適用\n </ButtonV2>\n </PopoverClose>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n});\n\nFileBlockCaption.displayName = 'FileBlockCaption';\n","import { BubbleMenu as BaseBubbleMenu } from '@tiptap/react/menus';\nimport { useCallback, useMemo, useRef, type JSX } from 'react';\nimport { v4 as uuid } from 'uuid';\n\nimport { Toolbar } from '../../../components/ui/Toolbar';\nimport { MenuProps } from '../../../components/menus/types';\nimport { AlignPicker } from '../../../components/panels';\nimport { ImageBlockLink } from '../../ImageBlock/components/ImageBlockLink';\nimport { Icon } from '../../../components/ui/Icon';\n\nexport function LinkButtonMenu({ editor, appendTo }: MenuProps): JSX.Element {\n const menuRef = useRef<HTMLDivElement>(null);\n // pluginKey は BubbleMenu プラグインのインスタンス識別子。毎レンダー uuid() し直すとレンダーの\n // たびに新しい BubbleMenu プラグインとして扱われてしまうため、初回生成した値を使い続ける。\n const pluginKeyRef = useRef(`linkButtonMenu-${uuid()}`);\n const linkButtonBlock = useCallback(() => {\n const { selection } = editor.state;\n const { $from } = selection;\n // 深い階層から親を遡って linkButton を探す\n for (let { depth } = $from; depth >= 0; depth--) {\n const node = $from.node(depth);\n if (node.type.name === 'linkButton') {\n return {\n node,\n pos: $from.before(depth), // ノードの先頭位置も一緒に返すと便利\n };\n }\n }\n return null;\n }, [editor]);\n\n const shouldShow = useCallback(() => {\n const isActive = editor.isActive('linkButton');\n return isActive;\n }, [editor]);\n\n // BubbleMenu(@tiptap/react/menus)は appendTo/getReferencedVirtualElement/options を\n // useEffect の依存配列に持ち、参照が変わるたびに editor へ updateOptions トランザクションを\n // dispatch する。毎レンダー新しいオブジェクト/関数を渡すと shouldRerenderOnTransaction と\n // 相まって無限レンダーになるため、参照を安定させる(TextMenu/LinkMenu と同種の修正)。\n const bubbleMenuAppendTo = useCallback(() => appendTo?.current ?? document.body, [appendTo]);\n const getReferencedVirtualElement = useCallback(() => {\n const result = linkButtonBlock();\n if (!result) return null;\n\n const { pos } = result;\n const dom = editor.view.nodeDOM(pos) as HTMLElement;\n if (!dom || !dom.getBoundingClientRect) return null;\n\n return { getBoundingClientRect: () => dom.getBoundingClientRect() };\n }, [editor, linkButtonBlock]);\n const bubbleMenuOptions = useMemo(() => ({ offset: 18 }), []);\n\n return (\n <BaseBubbleMenu\n editor={editor}\n pluginKey={pluginKeyRef.current}\n shouldShow={shouldShow}\n updateDelay={0}\n appendTo={bubbleMenuAppendTo}\n getReferencedVirtualElement={getReferencedVirtualElement}\n options={bubbleMenuOptions}\n >\n <Toolbar shouldShowContent={shouldShow()} ref={menuRef}>\n <ImageBlockLink\n initialUrl={editor.getAttributes('linkButton').href}\n initialOpenInNewTab={editor.getAttributes('linkButton').target === '_blank'}\n onChange={(link, openInNewTab) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setLinkButtonBlockLink(link, openInNewTab).run();\n }}\n />\n <Toolbar.Button\n tooltip=\"リンクを確認\"\n onClick={() => {\n window.open(editor.getAttributes('linkButton').href, '_blank', 'noopener,noreferrer');\n }}\n aria-label=\"リンクを確認\"\n disabled={!editor.getAttributes('linkButton').href}\n >\n <Icon name=\"visibility\" />\n </Toolbar.Button>\n <AlignPicker\n align={editor.getAttributes('linkButton').align}\n onChange={(align) => {\n editor.chain().focus(undefined, { scrollIntoView: false }).setLinkButtonBlockAlign(align).run();\n }}\n />\n </Toolbar>\n </BaseBubbleMenu>\n );\n}\n\nexport default LinkButtonMenu;\n","import { useMemo } from 'react';\nimport type { EditorSettings, EditorSettingsOverride } from '../types';\nimport { DEFAULT_EDITOR_SETTINGS } from '../utils/normalizeSettings';\nimport mergeSettings from '../utils/mergeSettings';\n\n/**\n * このパッケージ自体はデータを取得しない(設定値の出所は呼び出し側の責務)。\n * `editorSettings` は呼び出し側(コア側の `useBlockEditorSettings` 等)が取得・正規化\n * (`normalizeSettings`) 済みの EditorSettings を注入する引数で、省略時は既定値\n * (`DEFAULT_EDITOR_SETTINGS`) を基点にする。`override` はエディター個別の宣言的な上書き設定\n * (`<acms-block-editor>` の `settings` 属性経由で渡される EditorSettingsOverride。旧\n * `.js-block-editor` の公開仕様である `data-settings` もこの経路に変換されて合流する)。\n */\nexport function useSettings(editorSettings?: EditorSettings, override?: EditorSettingsOverride): EditorSettings {\n return useMemo<EditorSettings>(\n () => mergeSettings(editorSettings ?? DEFAULT_EDITOR_SETTINGS, override),\n [editorSettings, override]\n );\n}\n","import BLOCK_DEFINITIONS from '../config/blocks';\nimport { buildIdentifier } from './createBlockMenu';\nimport type {\n BlockMenuEntry,\n BlockMenuItem,\n BlockMenuOverride,\n CommandItem,\n EditorSettings,\n EditorSettingsOverride,\n} from '../types';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\n/** CommandItem の識別子。`identifier` が無ければ `name` (type 名) で代用。 */\nconst identifierOf = (cmd: CommandItem): string => cmd.identifier ?? cmd.name;\n\ninterface FlatCommand {\n group: string;\n command: CommandItem;\n}\n\ninterface GroupMeta {\n name: string;\n title: string;\n}\n\ninterface FlattenedBlockMenus {\n commands: Map<string, FlatCommand>;\n groupMetaByTitle: Map<string, GroupMeta>;\n baseGroupOrder: string[];\n}\n\nconst FALLBACK_GROUP_TITLE = 'その他';\n\n/**\n * BlockMenuItem[] (グループ入れ子) を識別子をキーにしたフラットマップに展開。\n * 同 type の class 違いも独立したエントリとして扱える。\n */\nconst flattenBlockMenus = (blockMenus: BlockMenuItem[]): FlattenedBlockMenus => {\n const commands = new Map<string, FlatCommand>();\n const groupMetaByTitle = new Map<string, GroupMeta>();\n const baseGroupOrder: string[] = [];\n\n for (const group of blockMenus) {\n if (!groupMetaByTitle.has(group.title)) {\n groupMetaByTitle.set(group.title, { name: group.name, title: group.title });\n baseGroupOrder.push(group.title);\n }\n for (const command of group.commands) {\n commands.set(identifierOf(command), { group: group.title, command });\n }\n }\n\n return { commands, groupMetaByTitle, baseGroupOrder };\n};\n\n/**\n * allow / deny で base からフィルタする。識別子で厳密マッチ。\n */\nconst applyAllowDenyFilter = (\n baseCommands: Map<string, FlatCommand>,\n override: BlockMenuOverride\n): Map<string, FlatCommand> => {\n let working = new Map(baseCommands);\n\n if (Array.isArray(override.allow)) {\n const allowed = new Set(override.allow);\n working = new Map(Array.from(working).filter(([identifier]) => allowed.has(identifier)));\n }\n\n if (Array.isArray(override.deny)) {\n const denied = new Set(override.deny);\n for (const identifier of Array.from(working.keys())) {\n if (denied.has(identifier)) {\n working.delete(identifier);\n }\n }\n }\n\n return working;\n};\n\nconst regroupCommands = (\n filtered: Map<string, FlatCommand>,\n groupMetaByTitle: Map<string, GroupMeta>,\n baseGroupOrder: string[]\n): BlockMenuItem[] => {\n const groupCommands = new Map<string, CommandItem[]>();\n const appearanceOrder: string[] = [];\n\n for (const entry of filtered.values()) {\n if (!groupCommands.has(entry.group)) {\n groupCommands.set(entry.group, []);\n appearanceOrder.push(entry.group);\n }\n groupCommands.get(entry.group)!.push(entry.command);\n }\n\n const orderedTitles = [\n ...baseGroupOrder.filter((title) => groupCommands.has(title)),\n ...appearanceOrder.filter((title) => !baseGroupOrder.includes(title)),\n ];\n\n return orderedTitles.map((title) => {\n const meta = groupMetaByTitle.get(title) ?? { name: title, title };\n return {\n name: meta.name,\n title: meta.title,\n commands: groupCommands.get(title) ?? [],\n };\n });\n};\n\n/**\n * `blocks` (BlockMenuEntry[]) を base 無視で「完全置換」のメニューに組み立てる。\n * 各 entry の type は TS マスター (BLOCK_DEFINITIONS) に存在する必要があり、無ければ除外。\n * group は明示指定された値を使い、未指定 (or 空文字) なら直前 entry の group を引き継ぐ。\n * 同 identifier (type + class) が複数あれば後勝ち(最後の entry の位置・内容で上書き)。\n */\nconst buildFromBlocksOverride = (entries: BlockMenuEntry[]): BlockMenuItem[] => {\n const byIdentifier = new Map<string, { group: string; command: CommandItem }>();\n let currentGroup = FALLBACK_GROUP_TITLE;\n\n for (const entry of entries) {\n if (!isPlainObject(entry) || typeof entry.type !== 'string' || entry.type === '') {\n continue;\n }\n const master = BLOCK_DEFINITIONS[entry.type];\n if (!master) {\n continue;\n }\n\n if (typeof entry.group === 'string' && entry.group !== '' && entry.group !== currentGroup) {\n currentGroup = entry.group;\n }\n\n const className = entry.class || undefined;\n const identifier = buildIdentifier(entry.type, className);\n const command: CommandItem = {\n name: entry.type,\n identifier,\n label: entry.label || master.label,\n description: master.description,\n iconName: entry.icon ?? master.icon,\n aliases: master.aliases,\n isTextMenu: master.isTextMenu,\n class: className,\n isDisabled: () => false,\n };\n\n // 後勝ち: 既存エントリを消してから入れ直すと、Map の挿入順も最後の位置に揃う\n byIdentifier.delete(identifier);\n byIdentifier.set(identifier, { group: currentGroup, command });\n }\n\n const commandsByGroup = new Map<string, CommandItem[]>();\n const groupOrder: string[] = [];\n\n for (const { group, command } of byIdentifier.values()) {\n if (!commandsByGroup.has(group)) {\n commandsByGroup.set(group, []);\n groupOrder.push(group);\n }\n commandsByGroup.get(group)!.push(command);\n }\n\n return groupOrder.map((title, index) => ({\n name: `group-${index + 1}`,\n title,\n commands: commandsByGroup.get(title) ?? [],\n }));\n};\n\nconst mergeBlockMenus = (base: BlockMenuItem[], override: BlockMenuOverride): BlockMenuItem[] => {\n // `blocks` が配列で指定されたら base / allow / deny を一切無視して完全置換。\n if (Array.isArray(override.blocks)) {\n return buildFromBlocksOverride(override.blocks);\n }\n\n const flattened = flattenBlockMenus(base);\n const filtered = applyAllowDenyFilter(flattened.commands, override);\n return regroupCommands(filtered, flattened.groupMetaByTitle, flattened.baseGroupOrder);\n};\n\n/**\n * API 由来の EditorSettings に、エディター個別の上書き設定をマージする。\n *\n * - features は浅いマージで個別フラグだけを上書きする。\n * - blockMenus は宣言的スキーマ (allow / deny / blocks) を解釈する。\n * allow / deny は識別子 (`type` または `type.class`) で base をフィルタする。\n * blocks (配列) を指定した場合は base / allow / deny を無視して完全置換となる。\n * - その他のリスト系プロパティは配列ごと差し替える。\n */\nexport default function mergeSettings(base: EditorSettings, override?: EditorSettingsOverride): EditorSettings {\n if (!isPlainObject(override)) {\n return base;\n }\n\n return {\n features: { ...base.features, ...(isPlainObject(override.features) ? override.features : {}) },\n blockMenus: isPlainObject(override.blockMenus)\n ? mergeBlockMenus(base.blockMenus, override.blockMenus)\n : base.blockMenus,\n fontSize: Array.isArray(override.fontSize) ? override.fontSize : base.fontSize,\n fontFamily: Array.isArray(override.fontFamily) ? override.fontFamily : base.fontFamily,\n customClass: Array.isArray(override.customClass) ? override.customClass : base.customClass,\n imageSizes: Array.isArray(override.imageSizes) ? override.imageSizes : base.imageSizes,\n colorPalette: Array.isArray(override.colorPalette) ? override.colorPalette : base.colorPalette,\n };\n}\n"],"mappings":"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","names":["useRef","useCallback","useMemo","useState","jsx","jsxs","useState","useCallback","jsx","jsxs","useState","useCallback","jsx","useState","useCallback","editor","useMemo","useEffect","useState","useRef","useMemo","useCallback","Popover","PopoverTrigger","PopoverContent","useCallback","useEffect","useRef","useMemo","useState","useState","useRef","useEffect","useCallback","useMemo","useEffect","useState","useCallback","useCallback","useCallback","useMemo","Fragment","jsx","jsxs","useMemo","useCallback","useMemo","Menu","MenuTrigger","MenuList","MenuGroup","MenuPopover","jsx","jsxs","useMemo","useCallback","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","useCallback","useMemo","Menu","MenuTrigger","MenuList","MenuGroup","MenuItemRadio","MenuItemRadioGroup","MenuPopover","jsx","jsxs","useMemo","useCallback","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuItemRadioGroup","MenuItemRadio","useCallback","useEffect","useState","Menu","MenuItem","MenuTrigger","MenuList","MenuGroup","MenuItemRadio","MenuItemRadioGroup","MenuPopover","jsx","jsxs","useState","useEffect","currentValue","useCallback","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuItemRadioGroup","MenuItemRadio","MenuItem","Popover","PopoverContent","useCallback","useRef","jsx","jsxs","useRef","useCallback","link","Popover","PopoverContent","Fragment","jsx","jsxs","useRef","useState","useCallback","useMemo","useEffect","Popover","PopoverTrigger","PopoverContent","useEffect","useRef","useState","memo","useCallback","NodeSelection","Menu","MenuList","MenuItem","MenuPopover","useCallback","useState","ButtonV2","Popover","PopoverContent","PopoverTrigger","MenuItem","jsx","jsxs","useState","Popover","PopoverTrigger","MenuItem","PopoverContent","ButtonV2","Menu","MenuList","MenuItem","MenuGroup","MenuPopover","jsx","jsxs","Menu","MenuPopover","MenuList","MenuGroup","MenuItem","useCallback","useState","jsx","jsxs","useRef","useState","memo","useCallback","useEffect","Menu","NodeSelection","MenuPopover","MenuList","MenuItem","useMemo","useRef","TextSelection","useRef","useMemo","editor","BaseBubbleMenu","useCallback","useMemo","useRef","useState","Popover","PopoverTrigger","PopoverContent","useCallback","jsx","jsxs","useRef","useState","useCallback","useMemo","BaseBubbleMenu","Popover","PopoverTrigger","PopoverContent","BaseBubbleMenu","useCallback","useMemo","useState","Menu","MenuList","MenuItem","MenuPopover","MenuDivider","memo","useRef","MenuItem","Popover","PopoverTrigger","PopoverContent","jsx","jsxs","memo","useRef","Popover","PopoverTrigger","MenuItem","PopoverContent","jsx","jsxs","useState","useCallback","rect","useMemo","BaseBubbleMenu","Menu","MenuPopover","MenuList","MenuItem","MenuDivider","BaseBubbleMenu","React","useCallback","useMemo","useState","Menu","MenuList","MenuItem","MenuPopover","MenuDivider","jsx","jsxs","React","useState","useCallback","rect","useMemo","BaseBubbleMenu","Menu","MenuPopover","MenuList","MenuItem","MenuDivider","BaseBubbleMenu","NodeSelection","useCallback","useMemo","useRef","useState","useEffect","uuid","useMediaSelect","memo","useCallback","useEffect","useState","Menu","MenuTrigger","MenuList","MenuGroup","MenuItemRadio","MenuItemRadioGroup","MenuPopover","jsx","jsxs","memo","useState","useEffect","useCallback","value","Menu","MenuTrigger","MenuPopover","MenuList","MenuGroup","MenuItemRadioGroup","MenuItemRadio","memo","useRef","Popover","PopoverTrigger","PopoverContent","ButtonV2","jsx","jsxs","memo","useRef","Popover","PopoverTrigger","PopoverContent","ButtonV2","memo","useState","Popover","PopoverTrigger","PopoverContent","jsx","jsxs","memo","useState","Popover","PopoverTrigger","PopoverContent","useState","useCallback","jsx","jsxs","useRef","uuid","useState","useCallback","NodeSelection","useMediaSelect","useMemo","useEffect","BaseBubbleMenu","BaseBubbleMenu","NodeSelection","useCallback","useMemo","useRef","uuid","MediaInsert","MediaUpdate","memo","useRef","Popover","PopoverTrigger","PopoverContent","PopoverClose","ButtonV2","jsx","jsxs","memo","useRef","Popover","PopoverTrigger","PopoverContent","PopoverClose","ButtonV2","jsx","jsxs","useRef","uuid","useCallback","NodeSelection","useMemo","BaseBubbleMenu","MediaInsert","MediaUpdate","BaseBubbleMenu","useCallback","useMemo","useRef","uuid","jsx","jsxs","useRef","uuid","useCallback","useMemo","BaseBubbleMenu","useMemo","useMemo","jsx","jsxs","useRef"]}
|